DozeService: Seperate double tap and pickup

am: 7294c115fd

Change-Id: I47fd20b374a188d7e280d1c6867204ee06733d0e
This commit is contained in:
Adrian Roos
2016-09-27 19:17:09 +00:00
committed by android-build-merger
5 changed files with 116 additions and 32 deletions

View File

@@ -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>

View File

@@ -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);
} }
} }

View File

@@ -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.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(), mDozeParameters.getPulseOnSigMotion(),
DozeLog.PULSE_REASON_SENSOR_PICKUP); 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(),
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;

View File

@@ -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);
} }

View File

@@ -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);
} }
} }