Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b755a7c1 authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

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

parents 324cdd4a aca97636
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -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;
+24 −0
Original line number Diff line number Diff line
@@ -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() {