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

Commit 5c442350 authored by Adrian Roos's avatar Adrian Roos Committed by android-build-merger
Browse files

DozeService: Seperate double tap and pickup

am: 7294c115

Change-Id: Ic92245eb6fbf13c4aa129570764fcc7e538d9b3c
parents 237bf1f9 7294c115
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -240,6 +240,9 @@
    -->
    -->
    <string name="doze_pickup_subtype_performs_proximity_check"></string>
    <string name="doze_pickup_subtype_performs_proximity_check"></string>


    <!-- Type of the double tap sensor. Empty if double tap is not supported. -->
    <string name="doze_double_tap_sensor_type" translatable="false"></string>

    <!-- Doze: pulse parameter - how long does it take to fade in? -->
    <!-- Doze: pulse parameter - how long does it take to fade in? -->
    <integer name="doze_pulse_duration_in">900</integer>
    <integer name="doze_pulse_duration_in">900</integer>


+3 −1
Original line number Original line Diff line number Diff line
@@ -35,12 +35,13 @@ public class DozeLog {
    private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
    private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
    static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
    static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");


    private static final int PULSE_REASONS = 4;
    private static final int PULSE_REASONS = 5;


    public static final int PULSE_REASON_INTENT = 0;
    public static final int PULSE_REASON_INTENT = 0;
    public static final int PULSE_REASON_NOTIFICATION = 1;
    public static final int PULSE_REASON_NOTIFICATION = 1;
    public static final int PULSE_REASON_SENSOR_SIGMOTION = 2;
    public static final int PULSE_REASON_SENSOR_SIGMOTION = 2;
    public static final int PULSE_REASON_SENSOR_PICKUP = 3;
    public static final int PULSE_REASON_SENSOR_PICKUP = 3;
    public static final int PULSE_REASON_SENSOR_DOUBLE_TAP = 4;


    private static long[] sTimes;
    private static long[] sTimes;
    private static String[] sMessages;
    private static String[] sMessages;
@@ -167,6 +168,7 @@ public class DozeLog {
            case PULSE_REASON_NOTIFICATION: return "notification";
            case PULSE_REASON_NOTIFICATION: return "notification";
            case PULSE_REASON_SENSOR_SIGMOTION: return "sigmotion";
            case PULSE_REASON_SENSOR_SIGMOTION: return "sigmotion";
            case PULSE_REASON_SENSOR_PICKUP: return "pickup";
            case PULSE_REASON_SENSOR_PICKUP: return "pickup";
            case PULSE_REASON_SENSOR_DOUBLE_TAP: return "doubletap";
            default: throw new IllegalArgumentException("bad reason: " + pulseReason);
            default: throw new IllegalArgumentException("bad reason: " + pulseReason);
        }
        }
    }
    }
+100 −26
Original line number Original line Diff line number Diff line
@@ -16,12 +16,14 @@


package com.android.systemui.doze;
package com.android.systemui.doze;


import android.app.ActivityManager;
import android.app.UiModeManager;
import android.app.UiModeManager;
import android.content.BroadcastReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorEventListener;
@@ -29,11 +31,15 @@ import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
import android.hardware.TriggerEventListener;
import android.media.AudioAttributes;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Handler;
import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.Vibrator;
import android.os.Vibrator;
import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.DreamService;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;
import android.view.Display;
import android.view.Display;


@@ -45,6 +51,7 @@ import com.android.systemui.statusbar.phone.DozeParameters;
import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Date;
import java.util.List;


public class DozeService extends DreamService {
public class DozeService extends DreamService {
    private static final String TAG = "DozeService";
    private static final String TAG = "DozeService";
@@ -59,8 +66,8 @@ public class DozeService extends DreamService {
    private final Handler mHandler = new Handler();
    private final Handler mHandler = new Handler();


    private DozeHost mHost;
    private DozeHost mHost;
    private SensorManager mSensors;
    private SensorManager mSensorManager;
    private TriggerSensor mSigMotionSensor;
    private TriggerSensor[] mSensors;
    private TriggerSensor mPickupSensor;
    private TriggerSensor mPickupSensor;
    private PowerManager mPowerManager;
    private PowerManager mPowerManager;
    private PowerManager.WakeLock mWakeLock;
    private PowerManager.WakeLock mWakeLock;
@@ -86,8 +93,10 @@ public class DozeService extends DreamService {
        pw.print("  mWakeLock: held="); pw.println(mWakeLock.isHeld());
        pw.print("  mWakeLock: held="); pw.println(mWakeLock.isHeld());
        pw.print("  mHost: "); pw.println(mHost);
        pw.print("  mHost: "); pw.println(mHost);
        pw.print("  mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered);
        pw.print("  mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered);
        pw.print("  mSigMotionSensor: "); pw.println(mSigMotionSensor);
        for (TriggerSensor s : mSensors) {
        pw.print("  mPickupSensor:"); pw.println(mPickupSensor);
            pw.print("  sensor: ");
            pw.println(s);
        }
        pw.print("  mDisplayStateSupported: "); pw.println(mDisplayStateSupported);
        pw.print("  mDisplayStateSupported: "); pw.println(mDisplayStateSupported);
        pw.print("  mPowerSaveActive: "); pw.println(mPowerSaveActive);
        pw.print("  mPowerSaveActive: "); pw.println(mPowerSaveActive);
        pw.print("  mCarMode: "); pw.println(mCarMode);
        pw.print("  mCarMode: "); pw.println(mCarMode);
@@ -110,13 +119,25 @@ public class DozeService extends DreamService {


        setWindowless(true);
        setWindowless(true);


        mSensors = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
        mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
        mSigMotionSensor = new TriggerSensor(Sensor.TYPE_SIGNIFICANT_MOTION,
        mSensors = new TriggerSensor[] {
                mDozeParameters.getPulseOnSigMotion(), mDozeParameters.getVibrateOnSigMotion(),
                new TriggerSensor(
                DozeLog.PULSE_REASON_SENSOR_SIGMOTION);
                        mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION),
        mPickupSensor = new TriggerSensor(Sensor.TYPE_PICK_UP_GESTURE,
                        null /* setting */,
                        mDozeParameters.getPulseOnSigMotion(),
                        mDozeParameters.getVibrateOnSigMotion(),
                        DozeLog.PULSE_REASON_SENSOR_SIGMOTION),
                mPickupSensor = new TriggerSensor(
                        mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
                        Settings.Secure.DOZE_PULSE_ON_PICK_UP,
                        mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
                        DozeLog.PULSE_REASON_SENSOR_PICKUP),
                new TriggerSensor(
                        findSensorWithType(mDozeParameters.getDoubleTapSensorType()),
                        Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
                        mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
                        mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
                DozeLog.PULSE_REASON_SENSOR_PICKUP);
                        DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP)
        };
        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        mWakeLock.setReferenceCounted(true);
        mWakeLock.setReferenceCounted(true);
@@ -280,8 +301,9 @@ public class DozeService extends DreamService {


    private void listenForPulseSignals(boolean listen) {
    private void listenForPulseSignals(boolean listen) {
        if (DEBUG) Log.d(mTag, "listenForPulseSignals: " + listen);
        if (DEBUG) Log.d(mTag, "listenForPulseSignals: " + listen);
        mSigMotionSensor.setListening(listen);
        for (TriggerSensor s : mSensors) {
        mPickupSensor.setListening(listen);
            s.setListening(listen);
        }
        listenForBroadcasts(listen);
        listenForBroadcasts(listen);
        listenForNotifications(listen);
        listenForNotifications(listen);
    }
    }
@@ -290,11 +312,21 @@ public class DozeService extends DreamService {
        if (listen) {
        if (listen) {
            final IntentFilter filter = new IntentFilter(PULSE_ACTION);
            final IntentFilter filter = new IntentFilter(PULSE_ACTION);
            filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
            filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
            filter.addAction(Intent.ACTION_USER_SWITCHED);
            mContext.registerReceiver(mBroadcastReceiver, filter);
            mContext.registerReceiver(mBroadcastReceiver, filter);

            for (TriggerSensor s : mSensors) {
                if (s.mConfigured && !TextUtils.isEmpty(s.mSetting)) {
                    mContext.getContentResolver().registerContentObserver(
                            Settings.Secure.getUriFor(s.mSetting), false /* descendants */,
                            mSettingsObserver, UserHandle.USER_ALL);
                }
            }
            mBroadcastReceiverRegistered = true;
            mBroadcastReceiverRegistered = true;
        } else {
        } else {
            if (mBroadcastReceiverRegistered) {
            if (mBroadcastReceiverRegistered) {
                mContext.unregisterReceiver(mBroadcastReceiver);
                mContext.unregisterReceiver(mBroadcastReceiver);
                mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
            }
            }
            mBroadcastReceiverRegistered = false;
            mBroadcastReceiverRegistered = false;
        }
        }
@@ -341,6 +373,23 @@ public class DozeService extends DreamService {
                    finishForCarMode();
                    finishForCarMode();
                }
                }
            }
            }
            if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
                for (TriggerSensor s : mSensors) {
                    s.updateListener();
                }
            }
        }
    };

    private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
        @Override
        public void onChange(boolean selfChange, Uri uri, int userId) {
            if (userId != ActivityManager.getCurrentUser()) {
                return;
            }
            for (TriggerSensor s : mSensors) {
                s.updateListener();
            }
        }
        }
    };
    };


@@ -372,18 +421,34 @@ public class DozeService extends DreamService {
        }
        }
    };
    };


    private Sensor findSensorWithType(String type) {
        if (TextUtils.isEmpty(type)) {
            return null;
        }
        List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
        for (Sensor s : sensorList) {
            if (type.equals(s.getStringType())) {
                return s;
            }
        }
        return null;
    }

    private class TriggerSensor extends TriggerEventListener {
    private class TriggerSensor extends TriggerEventListener {
        private final Sensor mSensor;
        final Sensor mSensor;
        private final boolean mConfigured;
        final boolean mConfigured;
        private final boolean mDebugVibrate;
        final boolean mDebugVibrate;
        private final int mPulseReason;
        final int mPulseReason;
        final String mSetting;


        private boolean mRequested;
        private boolean mRequested;
        private boolean mRegistered;
        private boolean mRegistered;
        private boolean mDisabled;
        private boolean mDisabled;


        public TriggerSensor(int type, boolean configured, boolean debugVibrate, int pulseReason) {
        public TriggerSensor(Sensor sensor, String setting, boolean configured,
            mSensor = mSensors.getDefaultSensor(type);
                boolean debugVibrate, int pulseReason) {
            mSensor = sensor;
            mSetting = setting;
            mConfigured = configured;
            mConfigured = configured;
            mDebugVibrate = debugVibrate;
            mDebugVibrate = debugVibrate;
            mPulseReason = pulseReason;
            mPulseReason = pulseReason;
@@ -401,18 +466,26 @@ public class DozeService extends DreamService {
            updateListener();
            updateListener();
        }
        }


        private void updateListener() {
        public void updateListener() {
            if (!mConfigured || mSensor == null) return;
            if (!mConfigured || mSensor == null) return;
            if (mRequested && !mDisabled && !mRegistered) {
            if (mRequested && !mDisabled && enabledBySetting() && !mRegistered) {
                mRegistered = mSensors.requestTriggerSensor(this, mSensor);
                mRegistered = mSensorManager.requestTriggerSensor(this, mSensor);
                if (DEBUG) Log.d(mTag, "requestTriggerSensor " + mRegistered);
                if (DEBUG) Log.d(mTag, "requestTriggerSensor " + mRegistered);
            } else if (mRegistered) {
            } else if (mRegistered) {
                final boolean rt = mSensors.cancelTriggerSensor(this, mSensor);
                final boolean rt = mSensorManager.cancelTriggerSensor(this, mSensor);
                if (DEBUG) Log.d(mTag, "cancelTriggerSensor " + rt);
                if (DEBUG) Log.d(mTag, "cancelTriggerSensor " + rt);
                mRegistered = false;
                mRegistered = false;
            }
            }
        }
        }


        private boolean enabledBySetting() {
            if (TextUtils.isEmpty(mSetting)) {
                return true;
            }
            return Settings.Secure.getIntForUser(mContext.getContentResolver(), mSetting, 1,
                    UserHandle.USER_CURRENT) != 0;
        }

        @Override
        @Override
        public String toString() {
        public String toString() {
            return new StringBuilder("{mRegistered=").append(mRegistered)
            return new StringBuilder("{mRegistered=").append(mRegistered)
@@ -481,7 +554,7 @@ public class DozeService extends DreamService {


        public void check() {
        public void check() {
            if (mFinished || mRegistered) return;
            if (mFinished || mRegistered) return;
            final Sensor sensor = mSensors.getDefaultSensor(Sensor.TYPE_PROXIMITY);
            final Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
            if (sensor == null) {
            if (sensor == null) {
                if (DEBUG) Log.d(mTag, "No sensor found");
                if (DEBUG) Log.d(mTag, "No sensor found");
                finishWithResult(RESULT_UNKNOWN);
                finishWithResult(RESULT_UNKNOWN);
@@ -491,7 +564,8 @@ public class DozeService extends DreamService {
            mPickupSensor.setDisabled(true);
            mPickupSensor.setDisabled(true);


            mMaxRange = sensor.getMaximumRange();
            mMaxRange = sensor.getMaximumRange();
            mSensors.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL, 0, mHandler);
            mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL, 0,
                    mHandler);
            mHandler.postDelayed(this, TIMEOUT_DELAY_MS);
            mHandler.postDelayed(this, TIMEOUT_DELAY_MS);
            mRegistered = true;
            mRegistered = true;
        }
        }
@@ -518,7 +592,7 @@ public class DozeService extends DreamService {
            if (mFinished) return;
            if (mFinished) return;
            if (mRegistered) {
            if (mRegistered) {
                mHandler.removeCallbacks(this);
                mHandler.removeCallbacks(this);
                mSensors.unregisterListener(this);
                mSensorManager.unregisterListener(this);
                // we're done - reenable the pickup sensor
                // we're done - reenable the pickup sensor
                mPickupSensor.setDisabled(false);
                mPickupSensor.setDisabled(false);
                mRegistered = false;
                mRegistered = false;
+6 −2
Original line number Original line Diff line number Diff line
@@ -84,8 +84,8 @@ public class DozeParameters {
        return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration();
        return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration();
    }
    }


    public int getPulseInDuration(boolean pickup) {
    public int getPulseInDuration(boolean pickupOrDoubleTap) {
        return pickup
        return pickupOrDoubleTap
                ? getInt("doze.pulse.duration.in.pickup", R.integer.doze_pulse_duration_in_pickup)
                ? getInt("doze.pulse.duration.in.pickup", R.integer.doze_pulse_duration_in_pickup)
                : getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in);
                : getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in);
    }
    }
@@ -114,6 +114,10 @@ public class DozeParameters {
        return SystemProperties.getBoolean("doze.vibrate.pickup", false);
        return SystemProperties.getBoolean("doze.vibrate.pickup", false);
    }
    }


    public String getDoubleTapSensorType() {
        return mContext.getString(R.string.doze_double_tap_sensor_type);
    }

    public boolean getProxCheckBeforePulse() {
    public boolean getProxCheckBeforePulse() {
        return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse);
        return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse);
    }
    }
+4 −3
Original line number Original line Diff line number Diff line
@@ -109,10 +109,11 @@ public class DozeScrimController {


    public void onScreenTurnedOn() {
    public void onScreenTurnedOn() {
        if (isPulsing()) {
        if (isPulsing()) {
            final boolean pickup = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
            final boolean pickupOrDoubleTap = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP
                    || mPulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP;
            startScrimAnimation(true /* inFront */, 0f,
            startScrimAnimation(true /* inFront */, 0f,
                    mDozeParameters.getPulseInDuration(pickup),
                    mDozeParameters.getPulseInDuration(pickupOrDoubleTap),
                    pickup ? Interpolators.LINEAR_OUT_SLOW_IN : Interpolators.ALPHA_OUT,
                    pickupOrDoubleTap ? Interpolators.LINEAR_OUT_SLOW_IN : Interpolators.ALPHA_OUT,
                    mPulseInFinished);
                    mPulseInFinished);
        }
        }
    }
    }