Loading packages/SystemUI/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,9 @@ <!-- Doze: should the significant motion sensor be used as a pulse signal? --> <bool name="doze_pulse_on_significant_motion">false</bool> <!-- Doze: should the pickup sensor be used as a pulse signal? --> <bool name="doze_pulse_on_pick_up">false</bool> <!-- Doze: maximum brightness to use when pulsing --> <integer name="doze_pulse_brightness">40</integer> Loading packages/SystemUI/src/com/android/systemui/doze/DozeService.java +60 −36 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.hardware.Sensor; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; import android.media.AudioAttributes; import android.os.Handler; import android.os.PowerManager; import android.os.SystemProperties; Loading Loading @@ -61,15 +62,14 @@ public class DozeService extends DreamService { private Host mHost; private SensorManager mSensors; private Sensor mSigMotionSensor; private TriggerSensor mSigMotionSensor; private TriggerSensor mPickupSensor; private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private AlarmManager mAlarmManager; private int mMaxBrightness; private boolean mDreaming; private boolean mBroadcastReceiverRegistered; private boolean mSigMotionConfigured; private boolean mSigMotionEnabled; private boolean mDisplayStateSupported; private int mDisplayStateWhenOn; private boolean mNotificationLightOn; Loading @@ -88,8 +88,7 @@ public class DozeService extends DreamService { pw.print(" mDreaming: "); pw.println(mDreaming); pw.print(" mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered); pw.print(" mSigMotionSensor: "); pw.println(mSigMotionSensor); pw.print(" mSigMotionConfigured: "); pw.println(mSigMotionConfigured); pw.print(" mSigMotionEnabled: "); pw.println(mSigMotionEnabled); pw.print(" mPickupSensor:"); pw.println(mPickupSensor); pw.print(" mMaxBrightness: "); pw.println(mMaxBrightness); pw.print(" mDisplayStateSupported: "); pw.println(mDisplayStateSupported); pw.print(" mNotificationLightOn: "); pw.println(mNotificationLightOn); Loading @@ -110,13 +109,14 @@ public class DozeService extends DreamService { setWindowless(true); mSensors = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); mSigMotionSensor = mSensors.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); mSigMotionSensor = new TriggerSensor(Sensor.TYPE_SIGNIFICANT_MOTION, "doze.pulse.sigmotion", R.bool.doze_pulse_on_significant_motion); mPickupSensor = new TriggerSensor(Sensor.TYPE_PICK_UP_GESTURE, "doze.pulse.pickup", R.bool.doze_pulse_on_pick_up); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mTag); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); final Resources res = mContext.getResources(); mSigMotionConfigured = SystemProperties.getBoolean("doze.pulse.sigmotion", res.getBoolean(R.bool.doze_pulse_on_significant_motion)); mDisplayStateSupported = SystemProperties.getBoolean("doze.display.supported", res.getBoolean(R.bool.doze_display_state_supported)); mMaxBrightness = MathUtils.constrain(res.getInteger(R.integer.doze_pulse_brightness), Loading Loading @@ -217,8 +217,12 @@ public class DozeService extends DreamService { } private void requestPulse(int pulses) { requestPulse(pulses, true /*delayed*/); } private void requestPulse(int pulses, boolean delayed) { if (mHost != null) { mHost.requestPulse(pulses, this); mHost.requestPulse(pulses, delayed, this); } } Loading @@ -230,21 +234,12 @@ public class DozeService extends DreamService { private void listenForPulseSignals(boolean listen) { if (DEBUG) Log.d(mTag, "listenForPulseSignals: " + listen); listenForSignificantMotion(listen); mSigMotionSensor.setListening(listen); mPickupSensor.setListening(listen); listenForBroadcasts(listen); listenForNotifications(listen); } private void listenForSignificantMotion(boolean listen) { if (!mSigMotionConfigured || mSigMotionSensor == null) return; if (listen) { mSigMotionEnabled = mSensors.requestTriggerSensor(mSigMotionListener, mSigMotionSensor); } else if (mSigMotionEnabled) { mSensors.cancelTriggerSensor(mSigMotionListener, mSigMotionSensor); } } private void listenForBroadcasts(boolean listen) { if (listen) { final IntentFilter filter = new IntentFilter(PULSE_ACTION); Loading Loading @@ -299,21 +294,6 @@ public class DozeService extends DreamService { } }; private final TriggerEventListener mSigMotionListener = new TriggerEventListener() { @Override public void onTrigger(TriggerEvent event) { if (DEBUG) Log.d(mTag, "sigMotion.onTrigger: " + triggerEventToString(event)); if (DEBUG) { final Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(1000); } } requestPulse(); listenForSignificantMotion(true); // reregister, this sensor only fires once } }; private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading Loading @@ -355,7 +335,7 @@ public class DozeService extends DreamService { void addCallback(Callback callback); void removeCallback(Callback callback); void requestDoze(DozeService dozeService); void requestPulse(int pulses, DozeService dozeService); void requestPulse(int pulses, boolean delayed, DozeService dozeService); void dozingStopped(DozeService dozeService); public interface Callback { Loading @@ -364,4 +344,48 @@ public class DozeService extends DreamService { void onNotificationLight(boolean on); } } private class TriggerSensor extends TriggerEventListener { private final Sensor mSensor; private final boolean mConfigured; private boolean mEnabled; public TriggerSensor(int type, String sysPropConfig, int resConfig) { mSensor = mSensors.getDefaultSensor(type); mConfigured = SystemProperties.getBoolean(sysPropConfig, mContext.getResources().getBoolean(resConfig)); } public void setListening(boolean listen) { if (!mConfigured || mSensor == null) return; if (listen) { mEnabled = mSensors.requestTriggerSensor(this, mSensor); } else if (mEnabled) { mSensors.cancelTriggerSensor(this, mSensor); mEnabled = false; } } @Override public String toString() { return new StringBuilder("{mEnabled=").append(mEnabled).append(", mConfigured=") .append(mConfigured).append(", mSensor=").append(mSensor).append("}").toString(); } @Override public void onTrigger(TriggerEvent event) { if (DEBUG) Log.d(mTag, "onTrigger: " + triggerEventToString(event)); if (DEBUG) { final Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(1000, new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION).build()); } } requestPulse(1, false /*delayed*/); setListening(true); // reregister, this sensor only fires once } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +6 −5 Original line number Diff line number Diff line Loading @@ -3868,10 +3868,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } @Override public void requestPulse(int pulses, DozeService dozeService) { public void requestPulse(int pulses, boolean delayed, DozeService dozeService) { if (dozeService == null) return; dozeService.stayAwake(PROCESSING_TIME); mHandler.obtainMessage(H.REQUEST_PULSE, pulses, 0, dozeService).sendToTarget(); mHandler.obtainMessage(H.REQUEST_PULSE, pulses, delayed ? 1 : 0, dozeService) .sendToTarget(); } @Override Loading @@ -3890,9 +3891,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mCurrentDozeService.startDozing(); } private void handleRequestPulse(int pulses, DozeService dozeService) { private void handleRequestPulse(int pulses, boolean delayed, DozeService dozeService) { if (!dozeService.equals(mCurrentDozeService)) return; final long stayAwake = mScrimController.pulse(pulses); final long stayAwake = mScrimController.pulse(pulses, delayed); mCurrentDozeService.stayAwake(stayAwake); } Loading @@ -3916,7 +3917,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (msg.what == REQUEST_DOZE) { handleRequestDoze((DozeService) msg.obj); } else if (msg.what == REQUEST_PULSE) { handleRequestPulse(msg.arg1, (DozeService) msg.obj); handleRequestPulse(msg.arg1, msg.arg2 != 0, (DozeService) msg.obj); } else if (msg.what == DOZING_STOPPED) { handleDozingStopped((DozeService) msg.obj); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +5 −4 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { private static final int TAG_KEY_ANIM = R.id.scrim; private static final long PULSE_IN_ANIMATION_DURATION = 1000; private static final long PULSE_VISIBLE_DURATION = 2000; private static final long PULSE_VISIBLE_DURATION = 3000; private static final long PULSE_OUT_ANIMATION_DURATION = 1000; private static final long PULSE_INVISIBLE_DURATION = 1000; private static final long PULSE_DURATION = PULSE_IN_ANIMATION_DURATION Loading Loading @@ -131,11 +131,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { } /** When dozing, fade screen contents in and out a few times using the front scrim. */ public long pulse(int pulses) { public long pulse(int pulses, boolean delayed) { if (!mDozing) return 0; mPulsesRemaining = Math.max(pulses, mPulsesRemaining); mScrimInFront.postDelayed(mPulseIn, PRE_PULSE_DELAY); return PRE_PULSE_DELAY + mPulsesRemaining * PULSE_DURATION; final long delay = delayed ? PRE_PULSE_DELAY : 0; mScrimInFront.postDelayed(mPulseIn, delay); return delay + mPulsesRemaining * PULSE_DURATION; } private void cancelPulsing() { Loading Loading
packages/SystemUI/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,9 @@ <!-- Doze: should the significant motion sensor be used as a pulse signal? --> <bool name="doze_pulse_on_significant_motion">false</bool> <!-- Doze: should the pickup sensor be used as a pulse signal? --> <bool name="doze_pulse_on_pick_up">false</bool> <!-- Doze: maximum brightness to use when pulsing --> <integer name="doze_pulse_brightness">40</integer> Loading
packages/SystemUI/src/com/android/systemui/doze/DozeService.java +60 −36 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.hardware.Sensor; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; import android.media.AudioAttributes; import android.os.Handler; import android.os.PowerManager; import android.os.SystemProperties; Loading Loading @@ -61,15 +62,14 @@ public class DozeService extends DreamService { private Host mHost; private SensorManager mSensors; private Sensor mSigMotionSensor; private TriggerSensor mSigMotionSensor; private TriggerSensor mPickupSensor; private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private AlarmManager mAlarmManager; private int mMaxBrightness; private boolean mDreaming; private boolean mBroadcastReceiverRegistered; private boolean mSigMotionConfigured; private boolean mSigMotionEnabled; private boolean mDisplayStateSupported; private int mDisplayStateWhenOn; private boolean mNotificationLightOn; Loading @@ -88,8 +88,7 @@ public class DozeService extends DreamService { pw.print(" mDreaming: "); pw.println(mDreaming); pw.print(" mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered); pw.print(" mSigMotionSensor: "); pw.println(mSigMotionSensor); pw.print(" mSigMotionConfigured: "); pw.println(mSigMotionConfigured); pw.print(" mSigMotionEnabled: "); pw.println(mSigMotionEnabled); pw.print(" mPickupSensor:"); pw.println(mPickupSensor); pw.print(" mMaxBrightness: "); pw.println(mMaxBrightness); pw.print(" mDisplayStateSupported: "); pw.println(mDisplayStateSupported); pw.print(" mNotificationLightOn: "); pw.println(mNotificationLightOn); Loading @@ -110,13 +109,14 @@ public class DozeService extends DreamService { setWindowless(true); mSensors = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); mSigMotionSensor = mSensors.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); mSigMotionSensor = new TriggerSensor(Sensor.TYPE_SIGNIFICANT_MOTION, "doze.pulse.sigmotion", R.bool.doze_pulse_on_significant_motion); mPickupSensor = new TriggerSensor(Sensor.TYPE_PICK_UP_GESTURE, "doze.pulse.pickup", R.bool.doze_pulse_on_pick_up); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mTag); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); final Resources res = mContext.getResources(); mSigMotionConfigured = SystemProperties.getBoolean("doze.pulse.sigmotion", res.getBoolean(R.bool.doze_pulse_on_significant_motion)); mDisplayStateSupported = SystemProperties.getBoolean("doze.display.supported", res.getBoolean(R.bool.doze_display_state_supported)); mMaxBrightness = MathUtils.constrain(res.getInteger(R.integer.doze_pulse_brightness), Loading Loading @@ -217,8 +217,12 @@ public class DozeService extends DreamService { } private void requestPulse(int pulses) { requestPulse(pulses, true /*delayed*/); } private void requestPulse(int pulses, boolean delayed) { if (mHost != null) { mHost.requestPulse(pulses, this); mHost.requestPulse(pulses, delayed, this); } } Loading @@ -230,21 +234,12 @@ public class DozeService extends DreamService { private void listenForPulseSignals(boolean listen) { if (DEBUG) Log.d(mTag, "listenForPulseSignals: " + listen); listenForSignificantMotion(listen); mSigMotionSensor.setListening(listen); mPickupSensor.setListening(listen); listenForBroadcasts(listen); listenForNotifications(listen); } private void listenForSignificantMotion(boolean listen) { if (!mSigMotionConfigured || mSigMotionSensor == null) return; if (listen) { mSigMotionEnabled = mSensors.requestTriggerSensor(mSigMotionListener, mSigMotionSensor); } else if (mSigMotionEnabled) { mSensors.cancelTriggerSensor(mSigMotionListener, mSigMotionSensor); } } private void listenForBroadcasts(boolean listen) { if (listen) { final IntentFilter filter = new IntentFilter(PULSE_ACTION); Loading Loading @@ -299,21 +294,6 @@ public class DozeService extends DreamService { } }; private final TriggerEventListener mSigMotionListener = new TriggerEventListener() { @Override public void onTrigger(TriggerEvent event) { if (DEBUG) Log.d(mTag, "sigMotion.onTrigger: " + triggerEventToString(event)); if (DEBUG) { final Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(1000); } } requestPulse(); listenForSignificantMotion(true); // reregister, this sensor only fires once } }; private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading Loading @@ -355,7 +335,7 @@ public class DozeService extends DreamService { void addCallback(Callback callback); void removeCallback(Callback callback); void requestDoze(DozeService dozeService); void requestPulse(int pulses, DozeService dozeService); void requestPulse(int pulses, boolean delayed, DozeService dozeService); void dozingStopped(DozeService dozeService); public interface Callback { Loading @@ -364,4 +344,48 @@ public class DozeService extends DreamService { void onNotificationLight(boolean on); } } private class TriggerSensor extends TriggerEventListener { private final Sensor mSensor; private final boolean mConfigured; private boolean mEnabled; public TriggerSensor(int type, String sysPropConfig, int resConfig) { mSensor = mSensors.getDefaultSensor(type); mConfigured = SystemProperties.getBoolean(sysPropConfig, mContext.getResources().getBoolean(resConfig)); } public void setListening(boolean listen) { if (!mConfigured || mSensor == null) return; if (listen) { mEnabled = mSensors.requestTriggerSensor(this, mSensor); } else if (mEnabled) { mSensors.cancelTriggerSensor(this, mSensor); mEnabled = false; } } @Override public String toString() { return new StringBuilder("{mEnabled=").append(mEnabled).append(", mConfigured=") .append(mConfigured).append(", mSensor=").append(mSensor).append("}").toString(); } @Override public void onTrigger(TriggerEvent event) { if (DEBUG) Log.d(mTag, "onTrigger: " + triggerEventToString(event)); if (DEBUG) { final Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(1000, new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION).build()); } } requestPulse(1, false /*delayed*/); setListening(true); // reregister, this sensor only fires once } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +6 −5 Original line number Diff line number Diff line Loading @@ -3868,10 +3868,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } @Override public void requestPulse(int pulses, DozeService dozeService) { public void requestPulse(int pulses, boolean delayed, DozeService dozeService) { if (dozeService == null) return; dozeService.stayAwake(PROCESSING_TIME); mHandler.obtainMessage(H.REQUEST_PULSE, pulses, 0, dozeService).sendToTarget(); mHandler.obtainMessage(H.REQUEST_PULSE, pulses, delayed ? 1 : 0, dozeService) .sendToTarget(); } @Override Loading @@ -3890,9 +3891,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mCurrentDozeService.startDozing(); } private void handleRequestPulse(int pulses, DozeService dozeService) { private void handleRequestPulse(int pulses, boolean delayed, DozeService dozeService) { if (!dozeService.equals(mCurrentDozeService)) return; final long stayAwake = mScrimController.pulse(pulses); final long stayAwake = mScrimController.pulse(pulses, delayed); mCurrentDozeService.stayAwake(stayAwake); } Loading @@ -3916,7 +3917,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (msg.what == REQUEST_DOZE) { handleRequestDoze((DozeService) msg.obj); } else if (msg.what == REQUEST_PULSE) { handleRequestPulse(msg.arg1, (DozeService) msg.obj); handleRequestPulse(msg.arg1, msg.arg2 != 0, (DozeService) msg.obj); } else if (msg.what == DOZING_STOPPED) { handleDozingStopped((DozeService) msg.obj); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +5 −4 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { private static final int TAG_KEY_ANIM = R.id.scrim; private static final long PULSE_IN_ANIMATION_DURATION = 1000; private static final long PULSE_VISIBLE_DURATION = 2000; private static final long PULSE_VISIBLE_DURATION = 3000; private static final long PULSE_OUT_ANIMATION_DURATION = 1000; private static final long PULSE_INVISIBLE_DURATION = 1000; private static final long PULSE_DURATION = PULSE_IN_ANIMATION_DURATION Loading Loading @@ -131,11 +131,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { } /** When dozing, fade screen contents in and out a few times using the front scrim. */ public long pulse(int pulses) { public long pulse(int pulses, boolean delayed) { if (!mDozing) return 0; mPulsesRemaining = Math.max(pulses, mPulsesRemaining); mScrimInFront.postDelayed(mPulseIn, PRE_PULSE_DELAY); return PRE_PULSE_DELAY + mPulsesRemaining * PULSE_DURATION; final long delay = delayed ? PRE_PULSE_DELAY : 0; mScrimInFront.postDelayed(mPulseIn, delay); return delay + mPulsesRemaining * PULSE_DURATION; } private void cancelPulsing() { Loading