Handle KEYCODE_SOFT_SLEEP from Ungaze.

Needed for Ungaze to trigger "soft sleep" (respecting wake locks); operates by
sending new KEYCODE_SOFT_SLEEP to PhoneWindowManager, which calls
PowerManagerService's new method setUserInactiveOverride (thereby
causing immediate sleep, modulo wakelocks, upon next iteration of
PowerManagerService's main loop).

BUG: b/23589870
Change-Id: Iddafdde923605d119075e890eeda5d3fd3fd2bc7
This commit is contained in:
Nick Armstrong-Crews
2015-09-07 21:46:50 -07:00
parent 9b8f82a3a0
commit 56ecfcce6c
5 changed files with 54 additions and 1 deletions

View File

@@ -107,6 +107,12 @@ public abstract class PowerManagerInternal {
*/ */
public abstract void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis); public abstract void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis);
/**
* Used by the window manager to tell the power manager that the user is no longer actively
* using the device.
*/
public abstract void setUserInactiveOverrideFromWindowManager();
/** /**
* Used by device administration to set the maximum screen off timeout. * Used by device administration to set the maximum screen off timeout.
* *

View File

@@ -784,8 +784,11 @@ public class KeyEvent extends InputEvent implements Parcelable {
/** Key code constant: Step backward media key. /** Key code constant: Step backward media key.
* Steps media backward, one frame at a time. */ * Steps media backward, one frame at a time. */
public static final int KEYCODE_MEDIA_STEP_BACKWARD = 275; public static final int KEYCODE_MEDIA_STEP_BACKWARD = 275;
/** Key code constant: put device to sleep unless a wakelock is held.
* @hide */
public static final int KEYCODE_SOFT_SLEEP = 276;
private static final int LAST_KEYCODE = KEYCODE_MEDIA_STEP_BACKWARD; private static final int LAST_KEYCODE = KEYCODE_SOFT_SLEEP;
// NOTE: If you add a new keycode here you must also add it to: // NOTE: If you add a new keycode here you must also add it to:
// isSystem() // isSystem()

View File

@@ -1814,6 +1814,7 @@ i
<enum name="KEYCODE_MEDIA_SKIP_BACKWARD" value="273" /> <enum name="KEYCODE_MEDIA_SKIP_BACKWARD" value="273" />
<enum name="KEYCODE_MEDIA_STEP_FORWARD" value="274" /> <enum name="KEYCODE_MEDIA_STEP_FORWARD" value="274" />
<enum name="KEYCODE_MEDIA_STEP_BACKWARD" value="275" /> <enum name="KEYCODE_MEDIA_STEP_BACKWARD" value="275" />
<enum name="KEYCODE_SOFT_SLEEP" value="276" />
</attr> </attr>
<!-- ***************************************************************** --> <!-- ***************************************************************** -->

View File

@@ -65,6 +65,7 @@ import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
@@ -265,6 +266,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
WindowManagerFuncs mWindowManagerFuncs; WindowManagerFuncs mWindowManagerFuncs;
WindowManagerInternal mWindowManagerInternal; WindowManagerInternal mWindowManagerInternal;
PowerManager mPowerManager; PowerManager mPowerManager;
PowerManagerInternal mPowerManagerInternal;
ActivityManagerInternal mActivityManagerInternal; ActivityManagerInternal mActivityManagerInternal;
DreamManagerInternal mDreamManagerInternal; DreamManagerInternal mDreamManagerInternal;
IStatusBarService mStatusBarService; IStatusBarService mStatusBarService;
@@ -1324,6 +1326,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class); mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
// Init display burn-in protection // Init display burn-in protection
boolean burnInProtectionEnabled = context.getResources().getBoolean( boolean burnInProtectionEnabled = context.getResources().getBoolean(
@@ -5080,6 +5083,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
break; break;
} }
case KeyEvent.KEYCODE_SOFT_SLEEP: {
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false;
if (!down) {
mPowerManagerInternal.setUserInactiveOverrideFromWindowManager();
}
break;
}
case KeyEvent.KEYCODE_WAKEUP: { case KeyEvent.KEYCODE_WAKEUP: {
result &= ~ACTION_PASS_TO_USER; result &= ~ACTION_PASS_TO_USER;
isWakeKey = true; isWakeKey = true;

View File

@@ -393,6 +393,10 @@ public final class PowerManagerService extends SystemService
// Use -1 to disable. // Use -1 to disable.
private int mScreenBrightnessOverrideFromWindowManager = -1; private int mScreenBrightnessOverrideFromWindowManager = -1;
// The window manager has determined the user to be inactive via other means.
// Set this to false to disable.
private boolean mUserInactiveOverrideFromWindowManager;
// The user activity timeout override from the window manager // The user activity timeout override from the window manager
// to allow the current foreground activity to override the user activity timeout. // to allow the current foreground activity to override the user activity timeout.
// Use -1 to disable. // Use -1 to disable.
@@ -1028,6 +1032,10 @@ public final class PowerManagerService extends SystemService
mNotifier.onUserActivity(event, uid); mNotifier.onUserActivity(event, uid);
if (mUserInactiveOverrideFromWindowManager) {
mUserInactiveOverrideFromWindowManager = false;
}
if (mWakefulness == WAKEFULNESS_ASLEEP if (mWakefulness == WAKEFULNESS_ASLEEP
|| mWakefulness == WAKEFULNESS_DOZING || mWakefulness == WAKEFULNESS_DOZING
|| (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) { || (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) {
@@ -1525,6 +1533,7 @@ public final class PowerManagerService extends SystemService
final int sleepTimeout = getSleepTimeoutLocked(); final int sleepTimeout = getSleepTimeoutLocked();
final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout); final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout); final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;
mUserActivitySummary = 0; mUserActivitySummary = 0;
if (mLastUserActivityTime >= mLastWakeTime) { if (mLastUserActivityTime >= mLastWakeTime) {
@@ -1550,6 +1559,7 @@ public final class PowerManagerService extends SystemService
} }
} }
} }
if (mUserActivitySummary == 0) { if (mUserActivitySummary == 0) {
if (sleepTimeout >= 0) { if (sleepTimeout >= 0) {
final long anyUserActivity = Math.max(mLastUserActivityTime, final long anyUserActivity = Math.max(mLastUserActivityTime,
@@ -1565,6 +1575,12 @@ public final class PowerManagerService extends SystemService
nextTimeout = -1; nextTimeout = -1;
} }
} }
if (mUserActivitySummary != USER_ACTIVITY_SCREEN_DREAM && userInactiveOverride) {
mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
nextTimeout = -1;
}
if (mUserActivitySummary != 0 && nextTimeout >= 0) { if (mUserActivitySummary != 0 && nextTimeout >= 0) {
Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT); Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
msg.setAsynchronous(true); msg.setAsynchronous(true);
@@ -2494,6 +2510,14 @@ public final class PowerManagerService extends SystemService
} }
} }
private void setUserInactiveOverrideFromWindowManagerInternal() {
synchronized (mLock) {
mUserInactiveOverrideFromWindowManager = true;
mDirty |= DIRTY_USER_ACTIVITY;
updatePowerStateLocked();
}
}
private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) {
synchronized (mLock) { synchronized (mLock) {
if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) {
@@ -2683,6 +2707,8 @@ public final class PowerManagerService extends SystemService
+ mScreenBrightnessOverrideFromWindowManager); + mScreenBrightnessOverrideFromWindowManager);
pw.println(" mUserActivityTimeoutOverrideFromWindowManager=" pw.println(" mUserActivityTimeoutOverrideFromWindowManager="
+ mUserActivityTimeoutOverrideFromWindowManager); + mUserActivityTimeoutOverrideFromWindowManager);
pw.println(" mUserInactiveOverrideFromWindowManager="
+ mUserInactiveOverrideFromWindowManager);
pw.println(" mTemporaryScreenBrightnessSettingOverride=" pw.println(" mTemporaryScreenBrightnessSettingOverride="
+ mTemporaryScreenBrightnessSettingOverride); + mTemporaryScreenBrightnessSettingOverride);
pw.println(" mTemporaryScreenAutoBrightnessAdjustmentSettingOverride=" pw.println(" mTemporaryScreenAutoBrightnessAdjustmentSettingOverride="
@@ -3486,6 +3512,11 @@ public final class PowerManagerService extends SystemService
setDozeOverrideFromDreamManagerInternal(screenState, screenBrightness); setDozeOverrideFromDreamManagerInternal(screenState, screenBrightness);
} }
@Override
public void setUserInactiveOverrideFromWindowManager() {
setUserInactiveOverrideFromWindowManagerInternal();
}
@Override @Override
public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) { public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) {
setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis); setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis);