DozeService: Seperate double tap and pickup
am: 7294c115fd
Change-Id: I47fd20b374a188d7e280d1c6867204ee06733d0e
This commit is contained in:
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(),
|
mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
|
||||||
DozeLog.PULSE_REASON_SENSOR_PICKUP);
|
DozeLog.PULSE_REASON_SENSOR_PICKUP),
|
||||||
|
new TriggerSensor(
|
||||||
|
findSensorWithType(mDozeParameters.getDoubleTapSensorType()),
|
||||||
|
Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
|
||||||
|
mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
|
||||||
|
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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user