diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index bb627bc9db995..78d2d98576280 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -709,7 +709,7 @@ public class PipTaskOrganizer extends TaskOrganizer { * @return {@code true} if destinationBounds is altered for split screen */ private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut) { - if (mSplitDivider == null || !mSplitDivider.inSplitMode()) { + if (mSplitDivider == null || !mSplitDivider.isDividerVisible()) { // bail early if system is not in split screen mode return false; } diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java index 4f20492c60a39..f7f12239c6db0 100644 --- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java @@ -92,7 +92,7 @@ public class ShortcutKeyDispatcher extends SystemUI } private void handleDockKey(long shortcutCode) { - if (mDivider == null || !mDivider.inSplitMode()) { + if (mDivider == null || !mDivider.isDividerVisible()) { // Split the screen mRecents.splitPrimaryTask((shortcutCode == SC_DOCK_LEFT) ? SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index db33c79be773c..cdd1280dd86c4 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -16,6 +16,7 @@ package com.android.systemui.stackdivider; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED; import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED; @@ -123,14 +124,17 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, SplitDisplayLayout sdl = new SplitDisplayLayout(mContext, displayLayout, mSplits); sdl.rotateTo(toRotation); mRotateSplitLayout = sdl; - int position = mMinimized ? mView.mSnapTargetBeforeMinimized.position - : mView.getCurrentPosition(); + final int position = isDividerVisible() + ? (mMinimized ? mView.mSnapTargetBeforeMinimized.position + : mView.getCurrentPosition()) + // snap resets to middle target when not in split-mode + : sdl.getSnapAlgorithm().getMiddleTarget().position; DividerSnapAlgorithm snap = sdl.getSnapAlgorithm(); final DividerSnapAlgorithm.SnapTarget target = snap.calculateNonDismissingSnapTarget(position); sdl.resizeSplits(target.position, t); - if (inSplitMode()) { + if (isSplitActive()) { WindowManagerProxy.applyHomeTasksMinimized(sdl, mSplits.mSecondary.token, t); } }; @@ -199,7 +203,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onImeStartPositioning(int displayId, int hiddenTop, int shownTop, boolean imeShouldShow, SurfaceControl.Transaction t) { - if (!inSplitMode()) { + if (!isDividerVisible()) { return; } final boolean splitIsVisible = !mView.isHidden(); @@ -298,7 +302,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onImePositionChanged(int displayId, int imeTop, SurfaceControl.Transaction t) { - if (mAnimation != null || !inSplitMode() || mPaused) { + if (mAnimation != null || !isDividerVisible() || mPaused) { // Not synchronized with IME anymore, so return. return; } @@ -310,7 +314,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onImeEndPositioning(int displayId, boolean cancelled, SurfaceControl.Transaction t) { - if (mAnimation != null || !inSplitMode() || mPaused) { + if (mAnimation != null || !isDividerVisible() || mPaused) { // Not synchronized with IME anymore, so return. return; } @@ -479,7 +483,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, @Override public void onKeyguardShowingChanged() { - if (!inSplitMode() || mView == null) { + if (!isDividerVisible() || mView == null) { return; } mView.setHidden(mKeyguardStateController.isShowing()); @@ -559,10 +563,20 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } /** {@code true} if this is visible */ - public boolean inSplitMode() { + public boolean isDividerVisible() { return mView != null && mView.getVisibility() == View.VISIBLE; } + /** + * This indicates that at-least one of the splits has content. This differs from + * isDividerVisible because the divider is only visible once *everything* is in split mode + * while this only cares if some things are (eg. while entering/exiting as well). + */ + private boolean isSplitActive() { + return mSplits.mPrimary.topActivityType != ACTIVITY_TYPE_UNDEFINED + || mSplits.mSecondary.topActivityType != ACTIVITY_TYPE_UNDEFINED; + } + private void addDivider(Configuration configuration) { Context dctx = mDisplayController.getDisplayContext(mContext.getDisplayId()); mView = (DividerView) @@ -635,8 +649,8 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } void onSplitDismissed() { - mMinimized = false; updateVisibility(false /* visible */); + mMinimized = false; removeDivider(); } @@ -655,7 +669,8 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, private void setHomeMinimized(final boolean minimized, boolean homeStackResizable) { if (DEBUG) { Slog.d(TAG, "setHomeMinimized min:" + mMinimized + "->" + minimized + " hrsz:" - + mHomeStackResizable + "->" + homeStackResizable + " split:" + inSplitMode()); + + mHomeStackResizable + "->" + homeStackResizable + + " split:" + isDividerVisible()); } WindowContainerTransaction wct = new WindowContainerTransaction(); final boolean minimizedChanged = mMinimized != minimized; @@ -670,7 +685,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, final boolean homeResizableChanged = mHomeStackResizable != homeStackResizable; if (homeResizableChanged) { mHomeStackResizable = homeStackResizable; - if (inSplitMode()) { + if (isDividerVisible()) { WindowManagerProxy.applyHomeTasksMinimized( mSplitLayout, mSplits.mSecondary.token, wct); } @@ -780,7 +795,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, /** Register a listener that gets called whenever the existence of the divider changes */ public void registerInSplitScreenListener(Consumer listener) { - listener.accept(inSplitMode()); + listener.accept(isDividerVisible()); synchronized (mDockedStackExistsListeners) { mDockedStackExistsListeners.add(new WeakReference<>(listener)); } @@ -795,7 +810,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, void ensureMinimizedSplit() { setHomeMinimized(true /* minimized */, mSplits.mSecondary.isResizable()); - if (!inSplitMode()) { + if (!isDividerVisible()) { // Wasn't in split-mode yet, so enter now. if (DEBUG) { Slog.d(TAG, " entering split mode with minimized=true"); @@ -806,7 +821,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, void ensureNormalSplit() { setHomeMinimized(false /* minimized */, mHomeStackResizable); - if (!inSplitMode()) { + if (!isDividerVisible()) { // Wasn't in split-mode, so enter now. if (DEBUG) { Slog.d(TAG, " enter split mode unminimized "); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java index 2862c836942fe..c496d22802223 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java @@ -193,7 +193,7 @@ class SplitScreenTaskOrganizer extends TaskOrganizer { Log.d(TAG, " at-least one split empty " + mPrimary.topActivityType + " " + mSecondary.topActivityType); } - if (mDivider.inSplitMode()) { + if (mDivider.isDividerVisible()) { // Was in split-mode, which means we are leaving split, so continue that. // This happens when the stack in the primary-split is dismissed. if (DEBUG) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index bbf83bc2057a7..3fa530af77de0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1488,7 +1488,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mDividerOptional.isPresent()) { divider = mDividerOptional.get(); } - if (divider == null || !divider.inSplitMode()) { + if (divider == null || !divider.isDividerVisible()) { final int navbarPos = WindowManagerWrapper.getInstance().getNavBarPosition(mDisplayId); if (navbarPos == NAV_BAR_POS_INVALID) { return false;