diff --git a/XiaomiDoze/res/drawable/ic_raise.xml b/XiaomiDoze/res/drawable/ic_raise.xml
new file mode 100644
index 00000000..a7d5eb7a
--- /dev/null
+++ b/XiaomiDoze/res/drawable/ic_raise.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/XiaomiDoze/res/values/strings.xml b/XiaomiDoze/res/values/strings.xml
index 34c9debb..39c0cf5d 100644
--- a/XiaomiDoze/res/values/strings.xml
+++ b/XiaomiDoze/res/values/strings.xml
@@ -29,7 +29,7 @@
Ambient display
- Tilt sensor
+ Tilt Sensor Gestures
Proximity sensor
@@ -59,4 +59,8 @@
Ambient Display Gesture
+
+
+ Raise To Wake
+ Tilt Sensor events to raise your device.
diff --git a/XiaomiDoze/res/xml/doze_settings.xml b/XiaomiDoze/res/xml/doze_settings.xml
index 005c6ae8..6863e2be 100644
--- a/XiaomiDoze/res/xml/doze_settings.xml
+++ b/XiaomiDoze/res/xml/doze_settings.xml
@@ -25,6 +25,14 @@
android:defaultValue="false"
android:title="@string/pick_up_gesture_title"
android:summary="@string/pick_up_gesture_summary" />
+
+
diff --git a/XiaomiDoze/src/org/lineageos/settings/doze/DozeSettingsFragment.java b/XiaomiDoze/src/org/lineageos/settings/doze/DozeSettingsFragment.java
index 6040e38e..823182cf 100644
--- a/XiaomiDoze/src/org/lineageos/settings/doze/DozeSettingsFragment.java
+++ b/XiaomiDoze/src/org/lineageos/settings/doze/DozeSettingsFragment.java
@@ -45,6 +45,7 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
private View mSwitchBar;
private SwitchPreference mPickUpPreference;
+ private SwitchPreference mRaiseToWakePreference;
private SwitchPreference mHandwavePreference;
private SwitchPreference mPocketPreference;
@@ -64,10 +65,17 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
PreferenceCategory proximitySensorCategory =
(PreferenceCategory) getPreferenceScreen().findPreference(Utils.CATEG_PROX_SENSOR);
+
+ PreferenceCategory tiltSensorCategory =
+ (PreferenceCategory) getPreferenceScreen().findPreference(Utils.CATEG_TILT_SENSOR);
mPickUpPreference = (SwitchPreference) findPreference(Utils.GESTURE_PICK_UP_KEY);
mPickUpPreference.setEnabled(dozeEnabled);
mPickUpPreference.setOnPreferenceChangeListener(this);
+
+ mRaiseToWakePreference = (SwitchPreference) findPreference(Utils.GESTURE_RAISE_TO_WAKE_KEY);
+ mRaiseToWakePreference.setEnabled(dozeEnabled);
+ mRaiseToWakePreference.setOnPreferenceChangeListener(this);
mHandwavePreference = (SwitchPreference) findPreference(Utils.GESTURE_HAND_WAVE_KEY);
mHandwavePreference.setEnabled(dozeEnabled);
@@ -81,6 +89,11 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
if (!Utils.getProxCheckBeforePulse(getActivity())) {
getPreferenceScreen().removePreference(proximitySensorCategory);
}
+
+ // Hide proximity sensor related features if the device doesn't support them
+ if (!Utils.getProxCheckBeforePulse(getActivity())) {
+ getPreferenceScreen().removePreference(tiltSensorCategory);
+ }
}
@Override
@@ -116,6 +129,10 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
public boolean onPreferenceChange(Preference preference, Object newValue) {
Utils.enableGesture(getActivity(), preference.getKey(), (Boolean) newValue);
Utils.checkDozeService(getActivity());
+
+ if (Utils.GESTURE_RAISE_TO_WAKE_KEY.equals(preference.getKey())) {
+ Utils.setPickUp(getActivity(), (Boolean) newValue);
+ }
return true;
}
@@ -128,6 +145,7 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
mSwitchBar.setActivated(isChecked);
mPickUpPreference.setEnabled(isChecked);
+ mRaiseToWakePreference.setEnabled(isChecked);
mHandwavePreference.setEnabled(isChecked);
mPocketPreference.setEnabled(isChecked);
}
diff --git a/XiaomiDoze/src/org/lineageos/settings/doze/TiltSensor.java b/XiaomiDoze/src/org/lineageos/settings/doze/TiltSensor.java
index 6598127f..073d6ab8 100644
--- a/XiaomiDoze/src/org/lineageos/settings/doze/TiltSensor.java
+++ b/XiaomiDoze/src/org/lineageos/settings/doze/TiltSensor.java
@@ -22,6 +22,8 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
import android.util.Log;
@@ -36,11 +38,18 @@ public class TiltSensor implements SensorEventListener {
private static final int BATCH_LATENCY_IN_MS = 100;
private static final int MIN_PULSE_INTERVAL_MS = 2500;
+ private static final int MIN_WAKEUP_INTERVAL_MS = 1000;
+ private static final int WAKELOCK_TIMEOUT_MS = 300;
private SensorManager mSensorManager;
private Sensor mSensor;
private Context mContext;
private ExecutorService mExecutorService;
+ private PowerManager mPowerManager;
+ private Sensor mProximitySensor;
+ private WakeLock mWakeLock;
+
+ private boolean mInsidePocket = false;
private long mEntryTimestamp;
@@ -48,6 +57,9 @@ public class TiltSensor implements SensorEventListener {
mContext = context;
mSensorManager = mContext.getSystemService(SensorManager.class);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TILT_DETECTOR);
+ mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY, false);
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mExecutorService = Executors.newSingleThreadExecutor();
}
@@ -58,16 +70,28 @@ public class TiltSensor implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
if (DEBUG) Log.d(TAG, "Got sensor event: " + event.values[0]);
+ boolean isRaiseToWake = Utils.isRaiseToWakeEnabled(mContext);
long delta = SystemClock.elapsedRealtime() - mEntryTimestamp;
- if (delta < MIN_PULSE_INTERVAL_MS) {
+ if (delta < (isRaiseToWake ? MIN_WAKEUP_INTERVAL_MS : MIN_PULSE_INTERVAL_MS)) {
return;
} else {
mEntryTimestamp = SystemClock.elapsedRealtime();
}
- if (event.values[0] == 1) {
- Utils.launchDozePulse(mContext);
+ if (!isRaiseToWake && !Utils.isPocketGestureEnabled(mContext)) {
+ mInsidePocket = false;
+ }
+
+ if (event.values[0] == 1 && !mInsidePocket) {
+
+ if (isRaiseToWake) {
+ mWakeLock.acquire(WAKELOCK_TIMEOUT_MS);
+ mPowerManager.wakeUp(SystemClock.uptimeMillis(),
+ PowerManager.WAKE_REASON_GESTURE, TAG);
+ } else {
+ Utils.launchDozePulse(mContext);
+ }
}
}
@@ -75,6 +99,18 @@ public class TiltSensor implements SensorEventListener {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
/* Empty */
}
+
+ private SensorEventListener mProximityListener = new SensorEventListener() {
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ mInsidePocket = event.values[0] < mProximitySensor.getMaximumRange();
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // stub
+ }
+ };
protected void enable() {
if (DEBUG) Log.d(TAG, "Enabling");
@@ -82,6 +118,10 @@ public class TiltSensor implements SensorEventListener {
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL, BATCH_LATENCY_IN_MS * 1000);
mEntryTimestamp = SystemClock.elapsedRealtime();
+ if (Utils.isRaiseToWakeEnabled(mContext)) {
+ mSensorManager.registerListener(mProximityListener, mProximitySensor,
+ SensorManager.SENSOR_DELAY_NORMAL);
+ }
});
}
diff --git a/XiaomiDoze/src/org/lineageos/settings/doze/Utils.java b/XiaomiDoze/src/org/lineageos/settings/doze/Utils.java
index 910db0f1..dd75f0b3 100644
--- a/XiaomiDoze/src/org/lineageos/settings/doze/Utils.java
+++ b/XiaomiDoze/src/org/lineageos/settings/doze/Utils.java
@@ -19,6 +19,7 @@ package org.lineageos.settings.doze;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import androidx.preference.PreferenceManager;
@@ -35,8 +36,10 @@ public final class Utils {
private static final String DOZE_INTENT = "com.android.systemui.doze.pulse";
protected static final String CATEG_PROX_SENSOR = "proximity_sensor";
+ protected static final String CATEG_TILT_SENSOR = "tilt_sensor";
protected static final String GESTURE_PICK_UP_KEY = "gesture_pick_up";
+ protected static final String GESTURE_RAISE_TO_WAKE_KEY = "gesture_raise_to_wake";
protected static final String GESTURE_HAND_WAVE_KEY = "gesture_hand_wave";
protected static final String GESTURE_POCKET_KEY = "gesture_pocket";
@@ -100,6 +103,16 @@ public final class Utils {
protected static boolean isPickUpEnabled(Context context) {
return isGestureEnabled(context, GESTURE_PICK_UP_KEY);
}
+
+ protected static void setPickUp(Context context, boolean value) {
+ SharedPreferences.Editor e = PreferenceManager.getDefaultSharedPreferences(context).edit();
+ e.putBoolean(GESTURE_PICK_UP_KEY, value);
+ e.commit();
+ }
+
+ protected static boolean isRaiseToWakeEnabled(Context context) {
+ return isGestureEnabled(context, GESTURE_RAISE_TO_WAKE_KEY);
+ }
protected static boolean isHandwaveGestureEnabled(Context context) {
return isGestureEnabled(context, GESTURE_HAND_WAVE_KEY);
@@ -111,6 +124,7 @@ public final class Utils {
protected static boolean sensorsEnabled(Context context) {
return isPickUpEnabled(context) || isHandwaveGestureEnabled(context)
- || isPocketGestureEnabled(context);
+ || isPocketGestureEnabled(context) || isRaiseToWakeEnabled(context);
}
+
}