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

Commit 02bfefc6 authored by Dave Mankoff's avatar Dave Mankoff Committed by Android (Google) Code Review
Browse files

Merge "Prevent recursive calls to proximity sensor."

parents af59f192 ddc924af
Loading
Loading
Loading
Loading
+9 −5
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.statusbar.policy.BatteryController;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.wakelock.DelayedWakeLock;
@@ -56,6 +57,7 @@ public class DozeFactory {
    private final ProximitySensor mProximitySensor;
    private final DelayedWakeLock.Builder mDelayedWakeLockBuilder;
    private final Handler mHandler;
    private final DelayableExecutor mDelayableExecutor;
    private final BiometricUnlockController mBiometricUnlockController;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final DozeHost mDozeHost;
@@ -68,6 +70,7 @@ public class DozeFactory {
            DockManager dockManager, @Nullable IWallpaperManager wallpaperManager,
            ProximitySensor proximitySensor,
            DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler,
            DelayableExecutor delayableExecutor,
            BiometricUnlockController biometricUnlockController,
            BroadcastDispatcher broadcastDispatcher, DozeHost dozeHost) {
        mFalsingManager = falsingManager;
@@ -83,6 +86,7 @@ public class DozeFactory {
        mProximitySensor = proximitySensor;
        mDelayedWakeLockBuilder = delayedWakeLockBuilder;
        mHandler = handler;
        mDelayableExecutor = delayableExecutor;
        mBiometricUnlockController = biometricUnlockController;
        mBroadcastDispatcher = broadcastDispatcher;
        mDozeHost = dozeHost;
@@ -107,8 +111,8 @@ public class DozeFactory {
                new DozePauser(mHandler, machine, mAlarmManager, mDozeParameters.getPolicy()),
                new DozeFalsingManagerAdapter(mFalsingManager),
                createDozeTriggers(dozeService, mAsyncSensorManager, mDozeHost,
                        mAlarmManager, config, mDozeParameters, mHandler, wakeLock, machine,
                        mDockManager, mDozeLog),
                        mAlarmManager, config, mDozeParameters, mDelayableExecutor, wakeLock,
                        machine, mDockManager, mDozeLog),
                createDozeUi(dozeService, mDozeHost, wakeLock, machine, mHandler,
                        mAlarmManager, mDozeParameters, mDozeLog),
                new DozeScreenState(wrappedService, mHandler, mDozeHost, mDozeParameters,
@@ -135,11 +139,11 @@ public class DozeFactory {

    private DozeTriggers createDozeTriggers(Context context, AsyncSensorManager sensorManager,
            DozeHost host, AlarmManager alarmManager, AmbientDisplayConfiguration config,
            DozeParameters params, Handler handler, WakeLock wakeLock, DozeMachine machine,
            DockManager dockManager, DozeLog dozeLog) {
            DozeParameters params, DelayableExecutor delayableExecutor, WakeLock wakeLock,
            DozeMachine machine, DockManager dockManager, DozeLog dozeLog) {
        boolean allowPulseTriggers = true;
        return new DozeTriggers(context, machine, host, alarmManager, config, params,
                sensorManager, handler, wakeLock, allowPulseTriggers, dockManager,
                sensorManager, delayableExecutor, wakeLock, allowPulseTriggers, dockManager,
                mProximitySensor, dozeLog, mBroadcastDispatcher);

    }
+1 −1
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ public class DozeSensors {
        mProxCallback = proxCallback;
        mResolver = mContext.getContentResolver();
        mCallback = callback;
        mProximitySensor = proximitySensor;

        boolean alwaysOn = mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT);
        mSensors = new TriggerSensor[] {
@@ -174,7 +175,6 @@ public class DozeSensors {
                        dozeLog),
        };

        mProximitySensor = proximitySensor;
        setProxListening(false);  // Don't immediately start listening when we register.
        mProximitySensor.register(
                proximityEvent -> {
+7 −8
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.content.IntentFilter;
import android.content.res.Configuration;
import android.hardware.display.AmbientDisplayConfiguration;
import android.metrics.LogMaker;
import android.os.Handler;
import android.os.SystemClock;
import android.os.UserHandle;
import android.text.format.Formatter;
@@ -43,6 +42,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.wakelock.WakeLock;
@@ -152,10 +152,10 @@ 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,
            ProximitySensor proximitySensor, DozeLog dozeLog,
            BroadcastDispatcher broadcastDispatcher) {
            DozeParameters dozeParameters, AsyncSensorManager sensorManager,
            DelayableExecutor delayableExecutor, WakeLock wakeLock, boolean allowPulseTriggers,
            DockManager dockManager, ProximitySensor proximitySensor,
            DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher) {
        mContext = context;
        mMachine = machine;
        mDozeHost = dozeHost;
@@ -165,11 +165,10 @@ public class DozeTriggers implements DozeMachine.Part {
        mWakeLock = wakeLock;
        mAllowPulseTriggers = allowPulseTriggers;
        mDozeSensors = new DozeSensors(context, alarmManager, mSensorManager, dozeParameters,
                config, wakeLock, this::onSensor, this::onProximityFar, dozeLog,
                proximitySensor);
                config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor);
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
        mDockManager = dockManager;
        mProxCheck = new ProximitySensor.ProximityCheck(proximitySensor, handler);
        mProxCheck = new ProximitySensor.ProximityCheck(proximitySensor, delayableExecutor);
        mDozeLog = dozeLog;
        mBroadcastDispatcher = broadcastDispatcher;
    }
+14 −10
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.util.sensors;

import android.hardware.SensorManager;
import android.os.Handler;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
@@ -27,6 +26,7 @@ import com.android.systemui.util.concurrency.DelayableExecutor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

import javax.inject.Inject;
@@ -64,11 +64,12 @@ public class ProximitySensor implements ThresholdSensor {
    private final DelayableExecutor mDelayableExecutor;
    private final List<ThresholdSensor.Listener> mListeners = new ArrayList<>();
    private String mTag = null;
    @VisibleForTesting protected boolean mPaused;
    private ThresholdSensorEvent mLastPrimaryEvent;
    @VisibleForTesting
    ThresholdSensorEvent mLastEvent;
    private boolean mPaused;
    private boolean mRegistered;
    private final AtomicBoolean mAlerting = new AtomicBoolean();
    private Runnable mCancelSecondaryRunnable;
    private boolean mInitializedListeners = false;

@@ -235,15 +236,18 @@ public class ProximitySensor implements ThresholdSensor {
    /** Update all listeners with the last value this class received from the sensor. */
    public void alertListeners() {
        Assert.isMainThread();
        if (mLastEvent == null) {
        if (mAlerting.getAndSet(true)) {
            return;
        }

        if (mLastEvent != null) {
            List<ThresholdSensor.Listener> listeners = new ArrayList<>(mListeners);
            listeners.forEach(proximitySensorListener ->
                    proximitySensorListener.onThresholdCrossed(mLastEvent));
        }

        mAlerting.set(false);
    }

    private void onPrimarySensorEvent(ThresholdSensorEvent event) {
        Assert.isMainThread();
        if (mLastPrimaryEvent != null && event.getBelow() == mLastPrimaryEvent.getBelow()) {
@@ -291,14 +295,14 @@ public class ProximitySensor implements ThresholdSensor {
    public static class ProximityCheck implements Runnable {

        private final ProximitySensor mSensor;
        private final Handler mHandler;
        private final DelayableExecutor mDelayableExecutor;
        private List<Consumer<Boolean>> mCallbacks = new ArrayList<>();

        @Inject
        public ProximityCheck(ProximitySensor sensor, Handler handler) {
        public ProximityCheck(ProximitySensor sensor, DelayableExecutor delayableExecutor) {
            mSensor = sensor;
            mSensor.setTag("prox_check");
            mHandler = handler;
            mDelayableExecutor = delayableExecutor;
            mSensor.pause();
            ThresholdSensor.Listener listener = proximityEvent -> {
                mCallbacks.forEach(
@@ -332,7 +336,7 @@ public class ProximitySensor implements ThresholdSensor {
            mCallbacks.add(callback);
            if (!mSensor.isRegistered()) {
                mSensor.resume();
                mHandler.postDelayed(this, timeoutMs);
                mDelayableExecutor.executeDelayed(this, timeoutMs);
            }
        }
    }
+5 −9
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.doze;

import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_LOCK_SCREEN;

import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -83,10 +84,7 @@ public class DozeSensorsTest extends SysuiTestCase {
    @Mock
    private DozeLog mDozeLog;
    @Mock
    private Sensor mProximitySensor;
    @Mock
    private ProximitySensor mMockProxSensor;

    private ProximitySensor mProximitySensor;
    private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener;
    private TestableLooper mTestableLooper;
    private DozeSensors mDozeSensors;
@@ -97,7 +95,6 @@ public class DozeSensorsTest extends SysuiTestCase {
        mTestableLooper = TestableLooper.get(this);
        when(mAmbientDisplayConfiguration.getWakeLockScreenDebounce()).thenReturn(5000L);
        when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
        when(mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)).thenReturn(mProximitySensor);
        doAnswer(invocation -> {
            ((Runnable) invocation.getArgument(0)).run();
            return null;
@@ -107,10 +104,9 @@ public class DozeSensorsTest extends SysuiTestCase {

    @Test
    public void testRegisterProx() {
        // We should not register with the sensor manager initially.
        verify(mMockProxSensor).pause();
        assertFalse(mProximitySensor.isRegistered());
        mDozeSensors.setProxListening(true);
        verify(mMockProxSensor).resume();
        verify(mProximitySensor).resume();
    }

    @Test
@@ -174,7 +170,7 @@ public class DozeSensorsTest extends SysuiTestCase {
        TestableDozeSensors() {
            super(getContext(), mAlarmManager, mSensorManager, mDozeParameters,
                    mAmbientDisplayConfiguration, mWakeLock, mCallback, mProxCallback, mDozeLog,
                    mMockProxSensor);
                    mProximitySensor);
            for (TriggerSensor sensor : mSensors) {
                if (sensor instanceof PluginSensor
                        && ((PluginSensor) sensor).mPluginSensor.getType()
Loading