Merge "Fix NPE in DozeTriggers and Add Tests"
This commit is contained in:
committed by
Android (Google) Code Review
commit
7ef9e2f949
@@ -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,
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user