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:
@@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
<!-- ***************************************************************** -->
|
<!-- ***************************************************************** -->
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user