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

Commit bf52f4bb authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Fix NPE in DozeTriggers and Add Tests

I created a FakeProximitySensor object that made it easy to reproduce
this NPE in tests. Includes some small refactoring around the
ProximitySensor.

Bug: 141364041
Test: atest SystemUITests
Change-Id: I8a5977a56ab1a36a74fac9d0423769131c1b380b
parent 8468002a
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;

@@ -97,7 +98,8 @@ public class DozeFactory {
            DockManager dockManager) {
        boolean allowPulseTriggers = true;
        return new DozeTriggers(context, machine, host, alarmManager, config, params,
                sensorManager, handler, wakeLock, allowPulseTriggers, dockManager);
                sensorManager, handler, wakeLock, allowPulseTriggers, dockManager,
                new ProximitySensor(context, sensorManager));
    }

    private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
+1 −4
Original line number Diff line number Diff line
@@ -42,9 +42,7 @@ import androidx.annotation.VisibleForTesting;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
@@ -147,8 +145,7 @@ public class DozeSensors {
                        false /* touchscreen */, mConfig.getWakeLockScreenDebounce()),
        };

        mProximitySensor = new ProximitySensor(
                context, sensorManager, Dependency.get(PluginManager.class));
        mProximitySensor = new ProximitySensor(context, sensorManager);

        mProximitySensor.register(
                proximityEvent -> mProxCallback.accept(!proximityEvent.getNear()));
+6 −9
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ public class DozeTriggers implements DozeMachine.Part {
    private final AmbientDisplayConfiguration mConfig;
    private final DozeParameters mDozeParameters;
    private final AsyncSensorManager mSensorManager;
    private final Handler mHandler;
    private final WakeLock mWakeLock;
    private final boolean mAllowPulseTriggers;
    private final UiModeManager mUiModeManager;
@@ -89,14 +88,14 @@ public class DozeTriggers implements DozeMachine.Part {
    public DozeTriggers(Context context, DozeMachine machine, DozeHost dozeHost,
            AlarmManager alarmManager, AmbientDisplayConfiguration config,
            DozeParameters dozeParameters, AsyncSensorManager sensorManager, Handler handler,
            WakeLock wakeLock, boolean allowPulseTriggers, DockManager dockManager) {
            WakeLock wakeLock, boolean allowPulseTriggers, DockManager dockManager,
            ProximitySensor proximitySensor) {
        mContext = context;
        mMachine = machine;
        mDozeHost = dozeHost;
        mConfig = config;
        mDozeParameters = dozeParameters;
        mSensorManager = sensorManager;
        mHandler = handler;
        mWakeLock = wakeLock;
        mAllowPulseTriggers = allowPulseTriggers;
        mDozeSensors = new DozeSensors(context, alarmManager, mSensorManager, dozeParameters,
@@ -104,9 +103,7 @@ public class DozeTriggers implements DozeMachine.Part {
                dozeParameters.getPolicy());
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
        mDockManager = dockManager;
        mProxCheck = new ProximitySensor.ProximityCheck(
                new ProximitySensor(mContext, mSensorManager, null),
                mHandler);
        mProxCheck = new ProximitySensor.ProximityCheck(proximitySensor, handler);
    }

    private void onNotification(Runnable onPulseSuppressedListener) {
@@ -182,7 +179,7 @@ public class DozeTriggers implements DozeMachine.Part {
            }
        } else {
            proximityCheckThenCall((result) -> {
                if (result) {
                if (result != null && result) {
                    // In pocket, drop event.
                    return;
                }
@@ -271,7 +268,7 @@ public class DozeTriggers implements DozeMachine.Part {

        if (wake) {
            proximityCheckThenCall((result) -> {
                if (result) {
                if (result !=  null && result) {
                    // In pocket, drop event.
                    return;
                }
@@ -380,7 +377,7 @@ public class DozeTriggers implements DozeMachine.Part {

        mPulsePending = true;
        proximityCheckThenCall((result) -> {
            if (result) {
            if (result != null && result) {
                // in pocket, abort pulse
                DozeLog.tracePulseDropped(mContext, "inPocket");
                mPulsePending = false;
+6 −7
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ import android.hardware.SensorManager;
import android.os.Handler;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
import com.android.systemui.shared.plugins.PluginManager;

import java.util.ArrayList;
import java.util.List;
@@ -47,7 +47,7 @@ public class ProximitySensor {
    private final float mMaxRange;
    private List<ProximitySensorListener> mListeners = new ArrayList<>();
    private String mTag = null;
    private ProximityEvent mLastEvent;
    @VisibleForTesting ProximityEvent mLastEvent;
    private int mSensorDelay = SensorManager.SENSOR_DELAY_NORMAL;
    private boolean mPaused;
    private boolean mRegistered;
@@ -64,8 +64,7 @@ public class ProximitySensor {
    };

    @Inject
    public ProximitySensor(
            Context context, AsyncSensorManager sensorManager, PluginManager pluginManager) {
    public ProximitySensor(Context context, AsyncSensorManager sensorManager) {
        mSensorManager = sensorManager;
        Sensor sensor = findBrightnessSensor(context);

@@ -146,17 +145,17 @@ public class ProximitySensor {
            return false;
        }

        logDebug("Using brightness sensor? " + mUsingBrightnessSensor);
        mListeners.add(listener);
        registerInternal();

        return true;
    }

    private void registerInternal() {
    protected void registerInternal() {
        if (mRegistered || mPaused || mListeners.isEmpty()) {
            return;
        }
        logDebug("Using brightness sensor? " + mUsingBrightnessSensor);
        logDebug("Registering sensor listener");
        mRegistered = true;
        mSensorManager.registerListener(mSensorEventListener, mSensor, mSensorDelay);
@@ -175,7 +174,7 @@ public class ProximitySensor {
        }
    }

    private void unregisterInternal() {
    protected void unregisterInternal() {
        if (!mRegistered) {
            return;
        }
+17 −3
Original line number Diff line number Diff line
@@ -41,7 +41,9 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.FakeProximitySensor;
import com.android.systemui.util.sensors.FakeSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLockFake;

@@ -60,6 +62,7 @@ public class DozeTriggersTest extends SysuiTestCase {
    private FakeSensorManager mSensors;
    private Sensor mTapSensor;
    private DockManager mDockManagerFake;
    private FakeProximitySensor mProximitySensor;

    @BeforeClass
    public static void setupSuite() {
@@ -80,10 +83,11 @@ public class DozeTriggersTest extends SysuiTestCase {
        mDockManagerFake = mock(DockManager.class);
        AsyncSensorManager asyncSensorManager =
                new AsyncSensorManager(mSensors, null, new Handler());
        mProximitySensor = new FakeProximitySensor(getContext(), asyncSensorManager);

        mTriggers = new DozeTriggers(mContext, mMachine, mHost, alarmManager, config, parameters,
                asyncSensorManager, Handler.createAsync(Looper.myLooper()), wakeLock, true,
                mDockManagerFake);
                mDockManagerFake, mProximitySensor);
        waitForSensorManager();
    }

@@ -95,15 +99,17 @@ public class DozeTriggersTest extends SysuiTestCase {
        mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE);
        clearInvocations(mMachine);

        mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(true, 1));
        mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */);
        mSensors.getFakeProximitySensor().sendProximityResult(false); /* Near */
        mProximitySensor.alertListeners();

        verify(mMachine, never()).requestState(any());
        verify(mMachine, never()).requestPulse(anyInt());

        mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */);
        waitForSensorManager();
        mSensors.getFakeProximitySensor().sendProximityResult(true); /* Far */
        mProximitySensor.setLastEvent(new ProximitySensor.ProximityEvent(false, 2));
        mProximitySensor.alertListeners();

        verify(mMachine).requestPulse(anyInt());
    }
@@ -139,6 +145,14 @@ public class DozeTriggersTest extends SysuiTestCase {
        verify(mDockManagerFake).removeListener(any());
    }

    @Test
    public void testProximitySensorNotAvailablel() {
        mProximitySensor.setSensorAvailable(false);
        mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_LONG_PRESS, 100, 100, null);
        mTriggers.onSensor(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, 100, 100, new float[]{1});
        mTriggers.onSensor(DozeLog.REASON_SENSOR_TAP, 100, 100, null);
    }

    private void waitForSensorManager() {
        TestableLooper.get(this).processAllMessages();
    }
Loading