summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dave Mankoff <mankoff@google.com> 2019-09-20 14:34:28 -0400
committer Dave Mankoff <mankoff@google.com> 2019-09-20 14:37:22 -0400
commitbf52f4bbfb045ee0ce018a325d14280552b78b22 (patch)
tree8d3f4c76747b4bbaa72f036bb1cab3e4bccb22a5
parent8468002ab753676f6746f1f3f5d86a19216500eb (diff)
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
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/sensors/FakeProximitySensor.java53
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java2
7 files changed, 87 insertions, 25 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index bb8c7f1dabf8..4d3dc70f651c 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -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,
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 67eefc5588e3..dfd83a552bf3 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -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()));
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 80d4b631314a..8eed71c21ce4 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -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;
diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
index c48bdde6adef..cce5bcadb509 100644
--- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java
@@ -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;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index f7cd69643fc6..b0e3969bf8a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -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();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/FakeProximitySensor.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/FakeProximitySensor.java
new file mode 100644
index 000000000000..d7df96dfdf24
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/FakeProximitySensor.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util.sensors;
+
+import android.content.Context;
+
+public class FakeProximitySensor extends ProximitySensor {
+ private boolean mAvailable;
+ private boolean mPaused;
+
+ public FakeProximitySensor(Context context, AsyncSensorManager sensorManager) {
+ super(context, sensorManager);
+
+ mAvailable = true;
+ }
+
+ public void setSensorAvailable(boolean available) {
+ mAvailable = available;
+ }
+
+ public void setLastEvent(ProximityEvent event) {
+ mLastEvent = event;
+ }
+
+ @Override
+ public boolean getSensorAvailable() {
+ return mAvailable;
+ }
+
+ @Override
+ protected void registerInternal() {
+ // no-op
+ }
+
+ @Override
+ protected void unregisterInternal() {
+ // no-op
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java
index 6d13408058cc..fa943e344977 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java
@@ -47,7 +47,7 @@ public class ProximitySensorTest extends SysuiTestCase {
AsyncSensorManager asyncSensorManager = new AsyncSensorManager(
sensorManager, null, new Handler());
mFakeProximitySensor = sensorManager.getFakeProximitySensor();
- mProximitySensor = new ProximitySensor(getContext(), asyncSensorManager, null);
+ mProximitySensor = new ProximitySensor(getContext(), asyncSensorManager);
}
@Test