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

Commit 16e767ab authored by John Spurlock's avatar John Spurlock Committed by Android (Google) Code Review
Browse files

Merge "Doze: Pulse once when a pickup gesture is received." into lmp-dev

parents 745ba004 559d959b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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>

+60 −36
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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),
@@ -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);
        }
    }

@@ -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);
@@ -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) {
@@ -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 {
@@ -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
        }
    }
}
+6 −5
Original line number Diff line number Diff line
@@ -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
@@ -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);
        }

@@ -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);
                }
+5 −4
Original line number Diff line number Diff line
@@ -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
@@ -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() {