Merge "Fix SysUI / AoD leaking content observers" into qt-dev

am: b755a7c16b

Change-Id: Ibcc4e2ec74730ed839d9970ccf5049cae77b06da
This commit is contained in:
Lucas Dupin
2019-06-12 12:09:24 -07:00
committed by android-build-merger
2 changed files with 38 additions and 7 deletions

View File

@@ -70,11 +70,12 @@ public class DozeSensors {
private final Consumer<Boolean> mProxCallback;
private final Callback mCallback;
@VisibleForTesting
protected final TriggerSensor[] mSensors;
protected TriggerSensor[] mSensors;
private final Handler mHandler = new Handler();
private final ProxSensor mProxSensor;
private long mDebounceFrom;
private boolean mSettingRegistered;
public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager,
DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock,
@@ -172,13 +173,8 @@ public class DozeSensors {
public void setListening(boolean listen) {
for (TriggerSensor s : mSensors) {
s.setListening(listen);
if (listen) {
s.registerSettingsObserver(mSettingsObserver);
}
}
if (!listen) {
mResolver.unregisterContentObserver(mSettingsObserver);
}
registerSettingsObserverIfNeeded(listen);
}
/** Set the listening state of only the sensors that require the touchscreen. */
@@ -240,6 +236,17 @@ public class DozeSensors {
return mProxSensor.mCurrentlyFar;
}
private void registerSettingsObserverIfNeeded(boolean register) {
if (!register) {
mResolver.unregisterContentObserver(mSettingsObserver);
} else if (!mSettingRegistered) {
for (TriggerSensor s : mSensors) {
s.registerSettingsObserver(mSettingsObserver);
}
}
mSettingRegistered = register;
}
private class ProxSensor implements SensorEventListener {
boolean mRequested;

View File

@@ -27,10 +27,12 @@ import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.database.ContentObserver;
import android.hardware.display.AmbientDisplayConfiguration;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -39,6 +41,7 @@ import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.doze.DozeSensors.TriggerSensor;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AsyncSensorManager;
@@ -73,6 +76,8 @@ public class DozeSensorsTest extends SysuiTestCase {
private Consumer<Boolean> mProxCallback;
@Mock
private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy;
@Mock
private TriggerSensor mMockTriggerSensor;
private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener;
private TestableLooper mTestableLooper;
private DozeSensors mDozeSensors;
@@ -107,6 +112,25 @@ public class DozeSensorsTest extends SysuiTestCase {
anyBoolean(), anyFloat(), anyFloat(), eq(null));
}
@Test
public void testSetListening_firstTrue_registerSettingsObserver() {
mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor};
mDozeSensors.setListening(true);
verify(mMockTriggerSensor).registerSettingsObserver(any(ContentObserver.class));
}
@Test
public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() {
mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor};
mDozeSensors.setListening(true);
mDozeSensors.setListening(true);
verify(mMockTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class));
}
private class TestableDozeSensors extends DozeSensors {
TestableDozeSensors() {