Loading services/core/java/com/android/server/wm/ActivityStack.java +2 −2 Original line number Diff line number Diff line Loading @@ -1389,7 +1389,7 @@ class ActivityStack extends Task { boolean preserveWindows, boolean notifyClients) { mTopActivityOccludesKeyguard = false; mTopDismissingKeyguardActivity = null; mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); mStackSupervisor.beginActivityVisibilityUpdate(); try { mEnsureActivitiesVisibleHelper.process( starting, configChanges, preserveWindows, notifyClients); Loading @@ -1400,7 +1400,7 @@ class ActivityStack extends Task { notifyActivityDrawnLocked(null); } } finally { mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); mStackSupervisor.endActivityVisibilityUpdate(); } } Loading services/core/java/com/android/server/wm/ActivityStackSupervisor.java +22 −4 Original line number Diff line number Diff line Loading @@ -332,11 +332,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { PowerManager.WakeLock mGoingToSleepWakeLock; /** * Temporary rect used during docked stack resize calculation so we don't need to create a new * object each time. * Used to keep {@link RootWindowContainer#ensureActivitiesVisible} from being entered * recursively. And only update keyguard states once the nested updates are done. */ private final Rect tempRect = new Rect(); private final ActivityOptions mTmpOptions = ActivityOptions.makeBasic(); private int mVisibilityTransactionDepth; private ActivityMetricsLogger mActivityMetricsLogger; Loading Loading @@ -1925,6 +1924,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { pw.print(prefix); pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser); pw.println(prefix + "mUserStackInFront=" + mRootWindowContainer.mUserStackInFront); pw.println(prefix + "mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); if (!mWaitingForActivityVisible.isEmpty()) { pw.println(prefix + "mWaitingForActivityVisible="); for (int i = 0; i < mWaitingForActivityVisible.size(); ++i) { Loading Loading @@ -2313,6 +2313,24 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { "android.server.am:TURN_ON:" + reason); } /** Starts a batch of visibility updates. */ void beginActivityVisibilityUpdate() { mVisibilityTransactionDepth++; } /** Ends a batch of visibility updates. */ void endActivityVisibilityUpdate() { mVisibilityTransactionDepth--; if (mVisibilityTransactionDepth == 0) { getKeyguardController().visibilitiesUpdated(); } } /** Returns {@code true} if the caller is on the path to update visibility. */ boolean inActivityVisibilityUpdate() { return mVisibilityTransactionDepth > 0; } /** * Begin deferring resume to avoid duplicate resumes in one pass. */ Loading services/core/java/com/android/server/wm/KeyguardController.java +5 −21 Original line number Diff line number Diff line Loading @@ -70,7 +70,6 @@ class KeyguardController { private boolean mKeyguardGoingAway; private boolean mDismissalRequested; private int mBeforeUnoccludeTransit; private int mVisibilityTransactionDepth; private final SparseArray<KeyguardDisplayState> mDisplayStates = new SparseArray<>(); private final ActivityTaskManagerService mService; private RootWindowContainer mRootWindowContainer; Loading Loading @@ -251,24 +250,6 @@ class KeyguardController { return result; } /** * Starts a batch of visibility updates. */ void beginActivityVisibilityUpdate() { mVisibilityTransactionDepth++; } /** * Ends a batch of visibility updates. After all batches are done, this method makes sure to * update lockscreen occluded/dismiss state if needed. */ void endActivityVisibilityUpdate() { mVisibilityTransactionDepth--; if (mVisibilityTransactionDepth == 0) { visibilitiesUpdated(); } } /** * @return True if we may show an activity while Keyguard is showing because we are in the * process of dismissing it anyways, false otherwise. Loading @@ -292,7 +273,11 @@ class KeyguardController { && !mWindowManager.isKeyguardSecure(mService.getCurrentUserId()); } private void visibilitiesUpdated() { /** * Makes sure to update lockscreen occluded/dismiss state if needed after completing all * visibility updates ({@link ActivityStackSupervisor#endActivityVisibilityUpdate}). */ void visibilitiesUpdated() { boolean requestDismissKeyguard = false; for (int displayNdx = mRootWindowContainer.getChildCount() - 1; displayNdx >= 0; displayNdx--) { Loading Loading @@ -568,7 +553,6 @@ class KeyguardController { pw.println(prefix + " mKeyguardGoingAway=" + mKeyguardGoingAway); dumpDisplayStates(pw, prefix); pw.println(prefix + " mDismissalRequested=" + mDismissalRequested); pw.println(prefix + " mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); pw.println(); } Loading services/core/java/com/android/server/wm/RecentTasks.java +8 −2 Original line number Diff line number Diff line Loading @@ -1031,9 +1031,13 @@ class RecentTasks { void add(Task task) { if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "add: task=" + task); // Only allow trimming task if it is not updating visibility for activities, so the caller // doesn't need to handle unexpected size and index when looping task containers. final boolean canTrimTask = !mSupervisor.inActivityVisibilityUpdate(); // Clean up the hidden tasks when going to home because the user may not be unable to return // to the task from recents. if (!mHiddenTasks.isEmpty() && task.isActivityTypeHome()) { if (canTrimTask && !mHiddenTasks.isEmpty() && task.isActivityTypeHome()) { removeUnreachableHiddenTasks(task.getWindowingMode()); } Loading Loading @@ -1155,7 +1159,9 @@ class RecentTasks { } // Trim the set of tasks to the active set if (canTrimTask) { trimInactiveRecentTasks(); } notifyTaskPersisterLocked(task, false /* flush */); } Loading services/core/java/com/android/server/wm/RootWindowContainer.java +3 −8 Original line number Diff line number Diff line Loading @@ -262,9 +262,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** Set when a power hint has started, but not ended. */ private boolean mPowerHintSent; /** Used to keep ensureActivitiesVisible() from being entered recursively. */ private boolean mInEnsureActivitiesVisible = false; // The default minimal size that will be used if the activity doesn't specify its minimal size. // It will be calculated when the default display gets added. int mDefaultMinSizeOfResizeableTaskDp = -1; Loading Loading @@ -1993,14 +1990,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> */ void ensureActivitiesVisible(ActivityRecord starting, int configChanges, boolean preserveWindows, boolean notifyClients) { if (mInEnsureActivitiesVisible) { if (mStackSupervisor.inActivityVisibilityUpdate()) { // Don't do recursive work. return; } mInEnsureActivitiesVisible = true; try { mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); mStackSupervisor.beginActivityVisibilityUpdate(); // First the front stacks. In case any are not fullscreen and are in front of home. for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); Loading @@ -2008,8 +2004,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> notifyClients); } } finally { mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); mInEnsureActivitiesVisible = false; mStackSupervisor.endActivityVisibilityUpdate(); } } Loading Loading
services/core/java/com/android/server/wm/ActivityStack.java +2 −2 Original line number Diff line number Diff line Loading @@ -1389,7 +1389,7 @@ class ActivityStack extends Task { boolean preserveWindows, boolean notifyClients) { mTopActivityOccludesKeyguard = false; mTopDismissingKeyguardActivity = null; mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); mStackSupervisor.beginActivityVisibilityUpdate(); try { mEnsureActivitiesVisibleHelper.process( starting, configChanges, preserveWindows, notifyClients); Loading @@ -1400,7 +1400,7 @@ class ActivityStack extends Task { notifyActivityDrawnLocked(null); } } finally { mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); mStackSupervisor.endActivityVisibilityUpdate(); } } Loading
services/core/java/com/android/server/wm/ActivityStackSupervisor.java +22 −4 Original line number Diff line number Diff line Loading @@ -332,11 +332,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { PowerManager.WakeLock mGoingToSleepWakeLock; /** * Temporary rect used during docked stack resize calculation so we don't need to create a new * object each time. * Used to keep {@link RootWindowContainer#ensureActivitiesVisible} from being entered * recursively. And only update keyguard states once the nested updates are done. */ private final Rect tempRect = new Rect(); private final ActivityOptions mTmpOptions = ActivityOptions.makeBasic(); private int mVisibilityTransactionDepth; private ActivityMetricsLogger mActivityMetricsLogger; Loading Loading @@ -1925,6 +1924,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { pw.print(prefix); pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser); pw.println(prefix + "mUserStackInFront=" + mRootWindowContainer.mUserStackInFront); pw.println(prefix + "mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); if (!mWaitingForActivityVisible.isEmpty()) { pw.println(prefix + "mWaitingForActivityVisible="); for (int i = 0; i < mWaitingForActivityVisible.size(); ++i) { Loading Loading @@ -2313,6 +2313,24 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { "android.server.am:TURN_ON:" + reason); } /** Starts a batch of visibility updates. */ void beginActivityVisibilityUpdate() { mVisibilityTransactionDepth++; } /** Ends a batch of visibility updates. */ void endActivityVisibilityUpdate() { mVisibilityTransactionDepth--; if (mVisibilityTransactionDepth == 0) { getKeyguardController().visibilitiesUpdated(); } } /** Returns {@code true} if the caller is on the path to update visibility. */ boolean inActivityVisibilityUpdate() { return mVisibilityTransactionDepth > 0; } /** * Begin deferring resume to avoid duplicate resumes in one pass. */ Loading
services/core/java/com/android/server/wm/KeyguardController.java +5 −21 Original line number Diff line number Diff line Loading @@ -70,7 +70,6 @@ class KeyguardController { private boolean mKeyguardGoingAway; private boolean mDismissalRequested; private int mBeforeUnoccludeTransit; private int mVisibilityTransactionDepth; private final SparseArray<KeyguardDisplayState> mDisplayStates = new SparseArray<>(); private final ActivityTaskManagerService mService; private RootWindowContainer mRootWindowContainer; Loading Loading @@ -251,24 +250,6 @@ class KeyguardController { return result; } /** * Starts a batch of visibility updates. */ void beginActivityVisibilityUpdate() { mVisibilityTransactionDepth++; } /** * Ends a batch of visibility updates. After all batches are done, this method makes sure to * update lockscreen occluded/dismiss state if needed. */ void endActivityVisibilityUpdate() { mVisibilityTransactionDepth--; if (mVisibilityTransactionDepth == 0) { visibilitiesUpdated(); } } /** * @return True if we may show an activity while Keyguard is showing because we are in the * process of dismissing it anyways, false otherwise. Loading @@ -292,7 +273,11 @@ class KeyguardController { && !mWindowManager.isKeyguardSecure(mService.getCurrentUserId()); } private void visibilitiesUpdated() { /** * Makes sure to update lockscreen occluded/dismiss state if needed after completing all * visibility updates ({@link ActivityStackSupervisor#endActivityVisibilityUpdate}). */ void visibilitiesUpdated() { boolean requestDismissKeyguard = false; for (int displayNdx = mRootWindowContainer.getChildCount() - 1; displayNdx >= 0; displayNdx--) { Loading Loading @@ -568,7 +553,6 @@ class KeyguardController { pw.println(prefix + " mKeyguardGoingAway=" + mKeyguardGoingAway); dumpDisplayStates(pw, prefix); pw.println(prefix + " mDismissalRequested=" + mDismissalRequested); pw.println(prefix + " mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); pw.println(); } Loading
services/core/java/com/android/server/wm/RecentTasks.java +8 −2 Original line number Diff line number Diff line Loading @@ -1031,9 +1031,13 @@ class RecentTasks { void add(Task task) { if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "add: task=" + task); // Only allow trimming task if it is not updating visibility for activities, so the caller // doesn't need to handle unexpected size and index when looping task containers. final boolean canTrimTask = !mSupervisor.inActivityVisibilityUpdate(); // Clean up the hidden tasks when going to home because the user may not be unable to return // to the task from recents. if (!mHiddenTasks.isEmpty() && task.isActivityTypeHome()) { if (canTrimTask && !mHiddenTasks.isEmpty() && task.isActivityTypeHome()) { removeUnreachableHiddenTasks(task.getWindowingMode()); } Loading Loading @@ -1155,7 +1159,9 @@ class RecentTasks { } // Trim the set of tasks to the active set if (canTrimTask) { trimInactiveRecentTasks(); } notifyTaskPersisterLocked(task, false /* flush */); } Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +3 −8 Original line number Diff line number Diff line Loading @@ -262,9 +262,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** Set when a power hint has started, but not ended. */ private boolean mPowerHintSent; /** Used to keep ensureActivitiesVisible() from being entered recursively. */ private boolean mInEnsureActivitiesVisible = false; // The default minimal size that will be used if the activity doesn't specify its minimal size. // It will be calculated when the default display gets added. int mDefaultMinSizeOfResizeableTaskDp = -1; Loading Loading @@ -1993,14 +1990,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> */ void ensureActivitiesVisible(ActivityRecord starting, int configChanges, boolean preserveWindows, boolean notifyClients) { if (mInEnsureActivitiesVisible) { if (mStackSupervisor.inActivityVisibilityUpdate()) { // Don't do recursive work. return; } mInEnsureActivitiesVisible = true; try { mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); mStackSupervisor.beginActivityVisibilityUpdate(); // First the front stacks. In case any are not fullscreen and are in front of home. for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); Loading @@ -2008,8 +2004,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> notifyClients); } } finally { mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); mInEnsureActivitiesVisible = false; mStackSupervisor.endActivityVisibilityUpdate(); } } Loading