From fc38db5a0205149357ecc542c728bfe882ffe450 Mon Sep 17 00:00:00 2001 From: Wei Sheng Shih Date: Fri, 3 Dec 2021 01:13:46 +0000 Subject: [PATCH] Revert "Use display awake signal to replace screen-off signal for sleep token." This reverts commit 357fe2f190b37dc5a31a892761c6c74f081dc192. Reason for revert: stop activities by PW#isInteractive can break wear API (https://developer.android.com/training/wearables/overlays/always-on) Bug: 208693537 Change-Id: Ib076e417036140bf8f9b10d1c76741a27cddcec0 --- .../server/policy/PhoneWindowManager.java | 15 ++++++++++ .../wm/ActivityTaskManagerInternal.java | 29 +++++++++++++++++++ .../server/wm/ActivityTaskManagerService.java | 29 ++++++++----------- .../com/android/server/wm/DisplayContent.java | 14 ++------- .../com/android/server/wm/DisplayPolicy.java | 4 --- .../android/server/wm/KeyguardController.java | 8 ++--- .../server/wm/RootWindowContainer.java | 4 +-- 7 files changed, 65 insertions(+), 38 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 8a828bd61fb11..c6ff8a084d125 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -519,6 +519,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mPendingKeyguardOccluded; private boolean mKeyguardOccludedChanged; + private ActivityTaskManagerInternal.SleepTokenAcquirer mScreenOffSleepTokenAcquirer; Intent mHomeIntent; Intent mCarDockIntent; Intent mDeskDockIntent; @@ -1816,6 +1817,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { new AccessibilityShortcutController(mContext, new Handler(), mCurrentUserId); mLogger = new MetricsLogger(); + mScreenOffSleepTokenAcquirer = mActivityTaskManagerInternal + .createSleepTokenAcquirer("ScreenOff"); + Resources res = mContext.getResources(); mWakeOnDpadKeyPress = res.getBoolean(com.android.internal.R.bool.config_wakeOnDpadKeyPress); @@ -4481,6 +4485,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (DEBUG_WAKEUP) Slog.i(TAG, "Display" + displayId + " turned off..."); if (displayId == DEFAULT_DISPLAY) { + updateScreenOffSleepToken(true); mRequestedOrSleepingDefaultDisplay = false; mDefaultDisplayPolicy.screenTurnedOff(); synchronized (mLock) { @@ -4513,6 +4518,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (displayId == DEFAULT_DISPLAY) { Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */); + updateScreenOffSleepToken(false); mDefaultDisplayPolicy.screenTurnedOn(screenOnListener); mBootAnimationDismissable = false; @@ -5033,6 +5039,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // TODO (multidisplay): Support multiple displays in WindowManagerPolicy. + private void updateScreenOffSleepToken(boolean acquire) { + if (acquire) { + mScreenOffSleepTokenAcquirer.acquire(DEFAULT_DISPLAY); + } else { + mScreenOffSleepTokenAcquirer.release(DEFAULT_DISPLAY); + } + } + /** {@inheritDoc} */ @Override public void enableScreenAfterBoot() { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index e38e9c1a43576..7fa98618ecb91 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -125,6 +125,35 @@ public abstract class ActivityTaskManagerInternal { void onKeyguardStateChanged(boolean isShowing); } + /** + * Sleep tokens cause the activity manager to put the top activity to sleep. + * They are used by components such as dreams that may hide and block interaction + * with underlying activities. + * The Acquirer provides an interface that encapsulates the underlying work, so the user does + * not need to handle the token by him/herself. + */ + public interface SleepTokenAcquirer { + + /** + * Acquires a sleep token. + * @param displayId The display to apply to. + */ + void acquire(int displayId); + + /** + * Releases the sleep token. + * @param displayId The display to apply to. + */ + void release(int displayId); + } + + /** + * Creates a sleep token acquirer for the specified display with the specified tag. + * + * @param tag A string identifying the purpose (eg. "Dream"). + */ + public abstract SleepTokenAcquirer createSleepTokenAcquirer(@NonNull String tag); + /** * Returns home activity for the specified user. * diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index e4ed04de50f5f..0a85ba15fd409 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4544,25 +4544,17 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { reason); } - /** - * Sleep tokens cause the activity manager to put the top activity to sleep. - * They are used by components such as dreams that may hide and block interaction - * with underlying activities. - */ - final class SleepTokenAcquirer { + final class SleepTokenAcquirerImpl implements ActivityTaskManagerInternal.SleepTokenAcquirer { private final String mTag; private final SparseArray mSleepTokens = new SparseArray<>(); - SleepTokenAcquirer(@NonNull String tag) { + SleepTokenAcquirerImpl(@NonNull String tag) { mTag = tag; } - /** - * Acquires a sleep token. - * @param displayId The display to apply to. - */ - void acquire(int displayId) { + @Override + public void acquire(int displayId) { synchronized (mGlobalLock) { if (!mSleepTokens.contains(displayId)) { mSleepTokens.append(displayId, @@ -4572,11 +4564,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } - /** - * Releases the sleep token. - * @param displayId The display to apply to. - */ - void release(int displayId) { + @Override + public void release(int displayId) { synchronized (mGlobalLock) { final RootWindowContainer.SleepToken token = mSleepTokens.get(displayId); if (token != null) { @@ -5265,6 +5254,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } final class LocalService extends ActivityTaskManagerInternal { + @Override + public SleepTokenAcquirer createSleepTokenAcquirer(@NonNull String tag) { + Objects.requireNonNull(tag); + return new SleepTokenAcquirerImpl(tag); + } + @Override public ComponentName getHomeActivityForUser(int userId) { synchronized (mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ce8a4da29fb9c..4cb70fd011ed1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -662,7 +662,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp /** All tokens used to put activities on this root task to sleep (including mOffToken) */ final ArrayList mAllSleepTokens = new ArrayList<>(); /** The token acquirer to put root tasks on the display to sleep */ - private final ActivityTaskManagerService.SleepTokenAcquirer mOffTokenAcquirer; + private final ActivityTaskManagerInternal.SleepTokenAcquirer mOffTokenAcquirer; private boolean mSleeping; @@ -5424,14 +5424,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mMetricsLogger; } - void acquireScreenOffToken(boolean acquire) { - if (acquire) { - mOffTokenAcquirer.acquire(mDisplayId); - } else { - mOffTokenAcquirer.release(mDisplayId); - } - } - void onDisplayChanged() { mDisplay.getRealSize(mTmpDisplaySize); setBounds(0, 0, mTmpDisplaySize.x, mTmpDisplaySize.y); @@ -5442,9 +5434,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (displayId != DEFAULT_DISPLAY) { final int displayState = mDisplay.getState(); if (displayState == Display.STATE_OFF) { - acquireScreenOffToken(true /* acquire */); + mOffTokenAcquirer.acquire(mDisplayId); } else if (displayState == Display.STATE_ON) { - acquireScreenOffToken(false /* acquire */); + mOffTokenAcquirer.release(mDisplayId); } ProtoLog.v(WM_DEBUG_LAYER_MIRRORING, "Display %d state is now (%d), so update layer mirroring?", diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 970027c733f95..a492b7abacbc7 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -752,10 +752,6 @@ public class DisplayPolicy { public void setAwake(boolean awake) { mAwake = awake; - // The screen off token for non-default display is controlled by DisplayContent. - if (mDisplayContent.isDefaultDisplay) { - mDisplayContent.acquireScreenOffToken(!awake); - } } public boolean isAwake() { diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index a843909dd26ca..fee9884bf333f 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -75,14 +75,14 @@ class KeyguardController { private final SparseArray mDisplayStates = new SparseArray<>(); private final ActivityTaskManagerService mService; private RootWindowContainer mRootWindowContainer; - private final ActivityTaskManagerService.SleepTokenAcquirer mSleepTokenAcquirer; + private final ActivityTaskManagerInternal.SleepTokenAcquirer mSleepTokenAcquirer; KeyguardController(ActivityTaskManagerService service, ActivityTaskSupervisor taskSupervisor) { mService = service; mTaskSupervisor = taskSupervisor; - mSleepTokenAcquirer = mService.new SleepTokenAcquirer(KEYGUARD_SLEEP_TOKEN_TAG); + mSleepTokenAcquirer = mService.new SleepTokenAcquirerImpl(KEYGUARD_SLEEP_TOKEN_TAG); } void setWindowManager(WindowManagerService windowManager) { @@ -513,10 +513,10 @@ class KeyguardController { private boolean mRequestDismissKeyguard; private final ActivityTaskManagerService mService; - private final ActivityTaskManagerService.SleepTokenAcquirer mSleepTokenAcquirer; + private final ActivityTaskManagerInternal.SleepTokenAcquirer mSleepTokenAcquirer; KeyguardDisplayState(ActivityTaskManagerService service, int displayId, - ActivityTaskManagerService.SleepTokenAcquirer acquirer) { + ActivityTaskManagerInternal.SleepTokenAcquirer acquirer) { mService = service; mDisplayId = displayId; mSleepTokenAcquirer = acquirer; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 76dbd9c324cc9..ccee45800a00d 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -225,7 +225,7 @@ class RootWindowContainer extends WindowContainer private static final String DISPLAY_OFF_SLEEP_TOKEN_TAG = "Display-off"; /** The token acquirer to put root tasks on the displays to sleep */ - final ActivityTaskManagerService.SleepTokenAcquirer mDisplayOffTokenAcquirer; + final ActivityTaskManagerInternal.SleepTokenAcquirer mDisplayOffTokenAcquirer; /** * The modes which affect which tasks are returned when calling @@ -470,7 +470,7 @@ class RootWindowContainer extends WindowContainer mService = service.mAtmService; mTaskSupervisor = mService.mTaskSupervisor; mTaskSupervisor.mRootWindowContainer = this; - mDisplayOffTokenAcquirer = mService.new SleepTokenAcquirer(DISPLAY_OFF_SLEEP_TOKEN_TAG); + mDisplayOffTokenAcquirer = mService.new SleepTokenAcquirerImpl(DISPLAY_OFF_SLEEP_TOKEN_TAG); } boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {