diff options
| author | 2015-09-07 21:46:50 -0700 | |
|---|---|---|
| committer | 2015-09-07 21:46:50 -0700 | |
| commit | 56ecfcce6c88fc80cf509effcebb124bbe0c79f8 (patch) | |
| tree | 1bd9da19b554a4aa287707b9917a49076ba66271 | |
| parent | 9b8f82a3a073891965a962251f9e613ba8cc90bb (diff) | |
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
5 files changed, 54 insertions, 1 deletions
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java index e742f989c500..70cff00636ac 100644 --- a/core/java/android/os/PowerManagerInternal.java +++ b/core/java/android/os/PowerManagerInternal.java @@ -108,6 +108,12 @@ public abstract class PowerManagerInternal {      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.       *       * This method must only be called by the device administration policy manager. diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 52852e7b6e97..052ef7c73e77 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -784,8 +784,11 @@ public class KeyEvent extends InputEvent implements Parcelable {      /** Key code constant: Step backward media key.       * Steps media backward, one frame at a time. */      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:      //  isSystem() diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a0246560b6bd..cf8342211167 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1814,6 +1814,7 @@ i          <enum name="KEYCODE_MEDIA_SKIP_BACKWARD" value="273" />          <enum name="KEYCODE_MEDIA_STEP_FORWARD" value="274" />          <enum name="KEYCODE_MEDIA_STEP_BACKWARD" value="275" /> +        <enum name="KEYCODE_SOFT_SLEEP" value="276" />      </attr>      <!-- ***************************************************************** --> diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 34737c104497..c7c5afd4ef55 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -65,6 +65,7 @@ import android.os.Looper;  import android.os.Message;  import android.os.Messenger;  import android.os.PowerManager; +import android.os.PowerManagerInternal;  import android.os.Process;  import android.os.RemoteException;  import android.os.ServiceManager; @@ -265,6 +266,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {      WindowManagerFuncs mWindowManagerFuncs;      WindowManagerInternal mWindowManagerInternal;      PowerManager mPowerManager; +    PowerManagerInternal mPowerManagerInternal;      ActivityManagerInternal mActivityManagerInternal;      DreamManagerInternal mDreamManagerInternal;      IStatusBarService mStatusBarService; @@ -1324,6 +1326,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {          mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);          mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);          mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); +        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);          // Init display burn-in protection          boolean burnInProtectionEnabled = context.getResources().getBoolean( @@ -5080,6 +5083,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {                  break;              } +            case KeyEvent.KEYCODE_SOFT_SLEEP: { +                result &= ~ACTION_PASS_TO_USER; +                isWakeKey = false; +                if (!down) { +                    mPowerManagerInternal.setUserInactiveOverrideFromWindowManager(); +                } +                break; +            } +              case KeyEvent.KEYCODE_WAKEUP: {                  result &= ~ACTION_PASS_TO_USER;                  isWakeKey = true; diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index b920f97ac839..a06ea1f1f752 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -393,6 +393,10 @@ public final class PowerManagerService extends SystemService      // Use -1 to disable.      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      // to allow the current foreground activity to override the user activity timeout.      // Use -1 to disable. @@ -1028,6 +1032,10 @@ public final class PowerManagerService extends SystemService              mNotifier.onUserActivity(event, uid); +            if (mUserInactiveOverrideFromWindowManager) { +                mUserInactiveOverrideFromWindowManager = false; +            } +              if (mWakefulness == WAKEFULNESS_ASLEEP                      || mWakefulness == WAKEFULNESS_DOZING                      || (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) { @@ -1525,6 +1533,7 @@ public final class PowerManagerService extends SystemService                  final int sleepTimeout = getSleepTimeoutLocked();                  final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);                  final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout); +                final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;                  mUserActivitySummary = 0;                  if (mLastUserActivityTime >= mLastWakeTime) { @@ -1550,6 +1559,7 @@ public final class PowerManagerService extends SystemService                          }                      }                  } +                  if (mUserActivitySummary == 0) {                      if (sleepTimeout >= 0) {                          final long anyUserActivity = Math.max(mLastUserActivityTime, @@ -1565,6 +1575,12 @@ public final class PowerManagerService extends SystemService                          nextTimeout = -1;                      }                  } + +                if (mUserActivitySummary != USER_ACTIVITY_SCREEN_DREAM && userInactiveOverride) { +                    mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM; +                    nextTimeout = -1; +                } +                  if (mUserActivitySummary != 0 && nextTimeout >= 0) {                      Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);                      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) {          synchronized (mLock) {              if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { @@ -2683,6 +2707,8 @@ public final class PowerManagerService extends SystemService                      + mScreenBrightnessOverrideFromWindowManager);              pw.println("  mUserActivityTimeoutOverrideFromWindowManager="                      + mUserActivityTimeoutOverrideFromWindowManager); +            pw.println("  mUserInactiveOverrideFromWindowManager=" +                    + mUserInactiveOverrideFromWindowManager);              pw.println("  mTemporaryScreenBrightnessSettingOverride="                      + mTemporaryScreenBrightnessSettingOverride);              pw.println("  mTemporaryScreenAutoBrightnessAdjustmentSettingOverride=" @@ -3487,6 +3513,11 @@ public final class PowerManagerService extends SystemService          }          @Override +        public void setUserInactiveOverrideFromWindowManager() { +            setUserInactiveOverrideFromWindowManagerInternal(); +        } + +        @Override          public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) {              setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis);          }  |