Loading packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +2 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ public interface DozeHost { boolean isPulsingBlocked(); void startPendingIntentDismissingKeyguard(PendingIntent intent); void abortPulsing(); void extendPulse(); interface Callback { default void onNotificationHeadsUp() {} Loading packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +10 −1 Original line number Diff line number Diff line Loading @@ -58,12 +58,15 @@ public class DozeMachine { /** Pulse is done showing. Followed by transition to DOZE or DOZE_AOD. */ DOZE_PULSE_DONE, /** Doze is done. DozeService is finished. */ FINISH; FINISH, /** AOD, but the display is temporarily off. */ DOZE_AOD_PAUSED; boolean canPulse() { switch (this) { case DOZE: case DOZE_AOD: case DOZE_AOD_PAUSED: return true; default: return false; Loading @@ -85,6 +88,7 @@ public class DozeMachine { case UNINITIALIZED: case INITIALIZED: case DOZE: case DOZE_AOD_PAUSED: return Display.STATE_OFF; case DOZE_PULSING: case DOZE_AOD: Loading Loading @@ -241,6 +245,11 @@ public class DozeMachine { if (mState == State.FINISH) { return State.FINISH; } if ((mState == State.DOZE_AOD_PAUSED || mState == State.DOZE_AOD || mState == State.DOZE) && requestedState == State.DOZE_PULSE_DONE) { Log.i(TAG, "Dropping pulse done because current state is already done: " + mState); return mState; } if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) { Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState); return mState; Loading packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +51 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; Loading @@ -40,6 +42,7 @@ import com.android.systemui.util.wakelock.WakeLock; import java.io.PrintWriter; import java.util.List; import java.util.function.Consumer; public class DozeSensors { Loading @@ -55,18 +58,22 @@ public class DozeSensors { private final DozeParameters mDozeParameters; private final AmbientDisplayConfiguration mConfig; private final WakeLock mWakeLock; private final Consumer<Boolean> mProxCallback; private final Callback mCallback; private final Handler mHandler = new Handler(); private final ProxSensor mProxSensor; public DozeSensors(Context context, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback) { AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback, Consumer<Boolean> proxCallback) { mContext = context; mSensorManager = sensorManager; mDozeParameters = dozeParameters; mConfig = config; mWakeLock = wakeLock; mProxCallback = proxCallback; mResolver = mContext.getContentResolver(); mSensors = new TriggerSensor[] { Loading @@ -86,6 +93,8 @@ public class DozeSensors { true /* configured */, DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP) }; mProxSensor = new ProxSensor(); mCallback = callback; } Loading Loading @@ -129,6 +138,10 @@ public class DozeSensors { } } public void setProxListening(boolean listen) { mProxSensor.setRegistered(listen); } private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange, Uri uri, int userId) { Loading @@ -152,6 +165,43 @@ public class DozeSensors { } } private class ProxSensor implements SensorEventListener { boolean mRegistered; Boolean mCurrentlyFar; void setRegistered(boolean register) { if (mRegistered == register) { // Send an update even if we don't re-register. mHandler.post(() -> { if (mCurrentlyFar != null) { mProxCallback.accept(mCurrentlyFar); } }); return; } if (register) { mRegistered = mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL, mHandler); } else { mSensorManager.unregisterListener(this); mRegistered = false; mCurrentlyFar = null; } } @Override public void onSensorChanged(SensorEvent event) { mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange(); mProxCallback.accept(mCurrentlyFar); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } } private class TriggerSensor extends TriggerEventListener { final Sensor mSensor; final boolean mConfigured; Loading packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +35 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import java.io.PrintWriter; public class DozeTriggers implements DozeMachine.Part { private static final String TAG = "DozeTriggers"; private static final boolean DEBUG = DozeService.DEBUG; /** adb shell am broadcast -a com.android.systemui.doze.pulse com.android.systemui */ private static final String PULSE_ACTION = "com.android.systemui.doze.pulse"; Loading Loading @@ -81,7 +82,7 @@ public class DozeTriggers implements DozeMachine.Part { mWakeLock = wakeLock; mAllowPulseTriggers = allowPulseTriggers; mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters, config, wakeLock, this::onSensor); wakeLock, this::onSensor, this::onProximityFar); mUiModeManager = mContext.getSystemService(UiModeManager.class); } Loading Loading @@ -113,6 +114,22 @@ public class DozeTriggers implements DozeMachine.Part { } } private void onProximityFar(boolean far) { final boolean near = !far; DozeMachine.State state = mMachine.getState(); if (near && state == DozeMachine.State.DOZE_PULSING) { if (DEBUG) Log.i(TAG, "Prox NEAR, ending pulse"); mMachine.requestState(DozeMachine.State.DOZE_PULSE_DONE); } if (far && state == DozeMachine.State.DOZE_AOD_PAUSED) { if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD"); mMachine.requestState(DozeMachine.State.DOZE_AOD); } else if (near && state == DozeMachine.State.DOZE_AOD) { if (DEBUG) Log.i(TAG, "Prox NEAR, pausing AOD"); mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSED); } } private void onCarMode() { mMachine.requestState(DozeMachine.State.FINISH); } Loading @@ -131,15 +148,21 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE: case DOZE_AOD: case DOZE_AOD_PAUSED: mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); mDozeSensors.setListening(true); if (oldState != DozeMachine.State.INITIALIZED) { mDozeSensors.reregisterAllSensors(); } break; case DOZE_PULSING: mDozeSensors.setProxListening(true); break; case FINISH: mBroadcastReceiver.unregister(mContext); mDozeHost.removeCallback(mHostCallback); mDozeSensors.setListening(false); mDozeSensors.setProxListening(false); break; default: } Loading @@ -156,6 +179,7 @@ public class DozeTriggers implements DozeMachine.Part { private void requestPulse(final int reason, boolean performedProxCheck) { Assert.isMainThread(); mDozeHost.extendPulse(); if (mPulsePending || !mAllowPulseTriggers || !canPulse()) { return; } Loading Loading @@ -286,6 +310,8 @@ public class DozeTriggers implements DozeMachine.Part { } private class TriggerReceiver extends BroadcastReceiver { private boolean mRegistered; @Override public void onReceive(Context context, Intent intent) { if (PULSE_ACTION.equals(intent.getAction())) { Loading @@ -301,14 +327,22 @@ public class DozeTriggers implements DozeMachine.Part { } public void register(Context context) { if (mRegistered) { return; } IntentFilter filter = new IntentFilter(PULSE_ACTION); filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE); filter.addAction(Intent.ACTION_USER_SWITCHED); context.registerReceiver(this, filter); mRegistered = true; } public void unregister(Context context) { if (!mRegistered) { return; } context.unregisterReceiver(this); mRegistered = false; } } Loading packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +3 −0 Original line number Diff line number Diff line Loading @@ -75,11 +75,14 @@ public class DozeUi implements DozeMachine.Part { scheduleTimeTick(); break; case DOZE: case DOZE_AOD_PAUSED: unscheduleTimeTick(); break; case DOZE_REQUEST_PULSE: pulseWhileDozing(DozeLog.PULSE_REASON_NOTIFICATION /* TODO */); break; case DOZE_PULSE_DONE: mHost.abortPulsing(); case INITIALIZED: mHost.startDozing(); break; Loading Loading
packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +2 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ public interface DozeHost { boolean isPulsingBlocked(); void startPendingIntentDismissingKeyguard(PendingIntent intent); void abortPulsing(); void extendPulse(); interface Callback { default void onNotificationHeadsUp() {} Loading
packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +10 −1 Original line number Diff line number Diff line Loading @@ -58,12 +58,15 @@ public class DozeMachine { /** Pulse is done showing. Followed by transition to DOZE or DOZE_AOD. */ DOZE_PULSE_DONE, /** Doze is done. DozeService is finished. */ FINISH; FINISH, /** AOD, but the display is temporarily off. */ DOZE_AOD_PAUSED; boolean canPulse() { switch (this) { case DOZE: case DOZE_AOD: case DOZE_AOD_PAUSED: return true; default: return false; Loading @@ -85,6 +88,7 @@ public class DozeMachine { case UNINITIALIZED: case INITIALIZED: case DOZE: case DOZE_AOD_PAUSED: return Display.STATE_OFF; case DOZE_PULSING: case DOZE_AOD: Loading Loading @@ -241,6 +245,11 @@ public class DozeMachine { if (mState == State.FINISH) { return State.FINISH; } if ((mState == State.DOZE_AOD_PAUSED || mState == State.DOZE_AOD || mState == State.DOZE) && requestedState == State.DOZE_PULSE_DONE) { Log.i(TAG, "Dropping pulse done because current state is already done: " + mState); return mState; } if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) { Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState); return mState; Loading
packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +51 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; Loading @@ -40,6 +42,7 @@ import com.android.systemui.util.wakelock.WakeLock; import java.io.PrintWriter; import java.util.List; import java.util.function.Consumer; public class DozeSensors { Loading @@ -55,18 +58,22 @@ public class DozeSensors { private final DozeParameters mDozeParameters; private final AmbientDisplayConfiguration mConfig; private final WakeLock mWakeLock; private final Consumer<Boolean> mProxCallback; private final Callback mCallback; private final Handler mHandler = new Handler(); private final ProxSensor mProxSensor; public DozeSensors(Context context, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback) { AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback, Consumer<Boolean> proxCallback) { mContext = context; mSensorManager = sensorManager; mDozeParameters = dozeParameters; mConfig = config; mWakeLock = wakeLock; mProxCallback = proxCallback; mResolver = mContext.getContentResolver(); mSensors = new TriggerSensor[] { Loading @@ -86,6 +93,8 @@ public class DozeSensors { true /* configured */, DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP) }; mProxSensor = new ProxSensor(); mCallback = callback; } Loading Loading @@ -129,6 +138,10 @@ public class DozeSensors { } } public void setProxListening(boolean listen) { mProxSensor.setRegistered(listen); } private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange, Uri uri, int userId) { Loading @@ -152,6 +165,43 @@ public class DozeSensors { } } private class ProxSensor implements SensorEventListener { boolean mRegistered; Boolean mCurrentlyFar; void setRegistered(boolean register) { if (mRegistered == register) { // Send an update even if we don't re-register. mHandler.post(() -> { if (mCurrentlyFar != null) { mProxCallback.accept(mCurrentlyFar); } }); return; } if (register) { mRegistered = mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL, mHandler); } else { mSensorManager.unregisterListener(this); mRegistered = false; mCurrentlyFar = null; } } @Override public void onSensorChanged(SensorEvent event) { mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange(); mProxCallback.accept(mCurrentlyFar); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } } private class TriggerSensor extends TriggerEventListener { final Sensor mSensor; final boolean mConfigured; Loading
packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +35 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import java.io.PrintWriter; public class DozeTriggers implements DozeMachine.Part { private static final String TAG = "DozeTriggers"; private static final boolean DEBUG = DozeService.DEBUG; /** adb shell am broadcast -a com.android.systemui.doze.pulse com.android.systemui */ private static final String PULSE_ACTION = "com.android.systemui.doze.pulse"; Loading Loading @@ -81,7 +82,7 @@ public class DozeTriggers implements DozeMachine.Part { mWakeLock = wakeLock; mAllowPulseTriggers = allowPulseTriggers; mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters, config, wakeLock, this::onSensor); wakeLock, this::onSensor, this::onProximityFar); mUiModeManager = mContext.getSystemService(UiModeManager.class); } Loading Loading @@ -113,6 +114,22 @@ public class DozeTriggers implements DozeMachine.Part { } } private void onProximityFar(boolean far) { final boolean near = !far; DozeMachine.State state = mMachine.getState(); if (near && state == DozeMachine.State.DOZE_PULSING) { if (DEBUG) Log.i(TAG, "Prox NEAR, ending pulse"); mMachine.requestState(DozeMachine.State.DOZE_PULSE_DONE); } if (far && state == DozeMachine.State.DOZE_AOD_PAUSED) { if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD"); mMachine.requestState(DozeMachine.State.DOZE_AOD); } else if (near && state == DozeMachine.State.DOZE_AOD) { if (DEBUG) Log.i(TAG, "Prox NEAR, pausing AOD"); mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSED); } } private void onCarMode() { mMachine.requestState(DozeMachine.State.FINISH); } Loading @@ -131,15 +148,21 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE: case DOZE_AOD: case DOZE_AOD_PAUSED: mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); mDozeSensors.setListening(true); if (oldState != DozeMachine.State.INITIALIZED) { mDozeSensors.reregisterAllSensors(); } break; case DOZE_PULSING: mDozeSensors.setProxListening(true); break; case FINISH: mBroadcastReceiver.unregister(mContext); mDozeHost.removeCallback(mHostCallback); mDozeSensors.setListening(false); mDozeSensors.setProxListening(false); break; default: } Loading @@ -156,6 +179,7 @@ public class DozeTriggers implements DozeMachine.Part { private void requestPulse(final int reason, boolean performedProxCheck) { Assert.isMainThread(); mDozeHost.extendPulse(); if (mPulsePending || !mAllowPulseTriggers || !canPulse()) { return; } Loading Loading @@ -286,6 +310,8 @@ public class DozeTriggers implements DozeMachine.Part { } private class TriggerReceiver extends BroadcastReceiver { private boolean mRegistered; @Override public void onReceive(Context context, Intent intent) { if (PULSE_ACTION.equals(intent.getAction())) { Loading @@ -301,14 +327,22 @@ public class DozeTriggers implements DozeMachine.Part { } public void register(Context context) { if (mRegistered) { return; } IntentFilter filter = new IntentFilter(PULSE_ACTION); filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE); filter.addAction(Intent.ACTION_USER_SWITCHED); context.registerReceiver(this, filter); mRegistered = true; } public void unregister(Context context) { if (!mRegistered) { return; } context.unregisterReceiver(this); mRegistered = false; } } Loading
packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +3 −0 Original line number Diff line number Diff line Loading @@ -75,11 +75,14 @@ public class DozeUi implements DozeMachine.Part { scheduleTimeTick(); break; case DOZE: case DOZE_AOD_PAUSED: unscheduleTimeTick(); break; case DOZE_REQUEST_PULSE: pulseWhileDozing(DozeLog.PULSE_REASON_NOTIFICATION /* TODO */); break; case DOZE_PULSE_DONE: mHost.abortPulsing(); case INITIALIZED: mHost.startDozing(); break; Loading