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