From e84ef9ea6464b6267eca192e4de0bf7e6e52687b Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Thu, 9 Jan 2020 17:28:19 -0800 Subject: Use hierarchy focusability to pause the minimized tile When split-screen minimizes, it should pause whatever is in the minimized tile. Bug: 133381284 Test: updated focusability test and existing tests pass. Also manually open split minimized and check that the primary stack is PAUSED. Change-Id: I91cd6634f7078a3007d80bb924de508869b6a2d6 --- .../src/com/android/systemui/stackdivider/Divider.java | 5 +++++ .../systemui/stackdivider/WindowManagerProxy.java | 13 +++++++++++++ .../core/java/com/android/server/wm/ActivityStack.java | 4 ++-- .../android/server/wm/ActivityTaskManagerInternal.java | 6 ------ .../android/server/wm/ActivityTaskManagerService.java | 7 ------- .../com/android/server/wm/RootWindowContainer.java | 18 ------------------ .../core/java/com/android/server/wm/WindowState.java | 2 +- .../android/server/wm/RootActivityContainerTests.java | 7 +++---- 8 files changed, 24 insertions(+), 38 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index 56cdff43e255..27b799bc02a3 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -401,6 +401,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, return; } mMinimized = minimized; + WindowManagerProxy.applyPrimaryFocusable(mSplits, !mMinimized); mView.setMinimizedDockStack(minimized, getAnimDuration(), mHomeStackResizable); updateTouchable(); }); @@ -504,6 +505,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, final boolean wasMinimized = mMinimized; mMinimized = true; setHomeStackResizable(mSplits.mSecondary.isResizable()); + WindowManagerProxy.applyPrimaryFocusable(mSplits, false /* focusable */); if (!inSplitMode()) { // Wasn't in split-mode yet, so enter now. if (DEBUG) { @@ -521,6 +523,9 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } void ensureNormalSplit() { + if (mMinimized) { + WindowManagerProxy.applyPrimaryFocusable(mSplits, true /* focusable */); + } if (!inSplitMode()) { // Wasn't in split-mode, so enter now. if (DEBUG) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java index 76857337f73e..167c33abac6e 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java @@ -292,10 +292,23 @@ public class WindowManagerProxy { for (int i = freeHomeAndRecents.size() - 1; i >= 0; --i) { wct.setBounds(freeHomeAndRecents.get(i).token, null); } + // Reset focusable to true + wct.setFocusable(tiles.mPrimary.token, true /* focusable */); ActivityTaskManager.getTaskOrganizerController().applyContainerTransaction(wct, null /* organizer */); } catch (RemoteException e) { Log.w(TAG, "Failed to remove stack: " + e); } } + + static void applyPrimaryFocusable(SplitScreenTaskOrganizer splits, boolean focusable) { + try { + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.setFocusable(splits.mPrimary.token, focusable); + ActivityTaskManager.getTaskOrganizerController().applyContainerTransaction(wct, + null /* organizer */); + } catch (RemoteException e) { + Log.w(TAG, "Error setting focusability: " + e); + } + } } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index ff890ff13ee3..eb316f979c52 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -1202,8 +1202,8 @@ class ActivityStack extends Task { @Override boolean isFocusable() { - return super.isFocusable() && !(inSplitScreenPrimaryWindowingMode() - && mRootWindowContainer.mIsDockMinimized); + // Special check for tile which isn't really in the hierarchy + return mTile != null ? mTile.isFocusable() : super.isFocusable(); } boolean isTopActivityFocusable() { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 510072d3831b..ca856ca7c1e6 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -168,12 +168,6 @@ public abstract class ActivityTaskManagerInternal { */ public abstract List getTopVisibleActivities(); - /** - * Callback for window manager to let activity manager know that docked stack changes its - * minimized state. - */ - public abstract void notifyDockedStackMinimizedChanged(boolean minimized); - /** * Notify listeners that contents are drawn for the first time on a single task display. * diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 693a5e499552..d84ebf8c7dcc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6135,13 +6135,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } - @Override - public void notifyDockedStackMinimizedChanged(boolean minimized) { - synchronized (mGlobalLock) { - mRootWindowContainer.setDockedStackMinimized(minimized); - } - } - @Override public int startActivitiesAsPackage(String packageName, @Nullable String featureId, int userId, Intent[] intents, Bundle bOptions) { diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 64d7db26cd7e..8916b107b43f 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -258,9 +258,6 @@ class RootWindowContainer extends WindowContainer */ final ArrayList mSleepTokens = new ArrayList<>(); - /** Is dock currently minimized. */ - boolean mIsDockMinimized; - /** Set when a power hint has started, but not ended. */ private boolean mPowerHintSent; @@ -2167,21 +2164,6 @@ class RootWindowContainer extends WindowContainer } } - void setDockedStackMinimized(boolean minimized) { - // Get currently focused stack before setting mIsDockMinimized. We do this because if - // split-screen is active, primary stack will not be focusable (see #isFocusable) while - // still occluding other stacks. This will cause getTopDisplayFocusedStack() to return null. - final ActivityStack current = getTopDisplayFocusedStack(); - mIsDockMinimized = minimized; - if (mIsDockMinimized) { - if (current.inSplitScreenPrimaryWindowingMode()) { - // The primary split-screen stack can't be focused while it is minimize, so move - // focus to something else. - current.adjustFocusToNextFocusableStack("setDockedStackMinimized"); - } - } - } - ActivityRecord findTask(ActivityRecord r, int preferredDisplayId) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r); mTmpFindTaskResult.clear(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 37597fbc7c45..41909b33e937 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2250,7 +2250,7 @@ class WindowState extends WindowContainer implements WindowManagerP } final ActivityStack stack = getRootTask(); - if (stack != null && stack.shouldIgnoreInput()) { + if (stack != null && !stack.isFocusable()) { // Ignore when the stack shouldn't receive input event. // (i.e. the minimized stack in split screen mode.) return false; diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index ec2026255f8e..639d302ce426 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -251,13 +251,12 @@ public class RootActivityContainerTests extends ActivityTestsBase { final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true) .setStack(stack).build(); - // Under split screen primary we should be focusable when not minimized - mRootWindowContainer.setDockedStackMinimized(false); + // Created stacks are focusable by default. assertTrue(stack.isTopActivityFocusable()); assertTrue(activity.isFocusable()); - // Under split screen primary we should not be focusable when minimized - mRootWindowContainer.setDockedStackMinimized(true); + // If the stack is made unfocusable, its activities should inherit that. + stack.setFocusable(false); assertFalse(stack.isTopActivityFocusable()); assertFalse(activity.isFocusable()); -- cgit v1.2.3-59-g8ed1b