diff options
10 files changed, 206 insertions, 63 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 97e014329331..96853e0fa775 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1811,7 +1811,9 @@ public final class ViewRootImpl implements ViewParent, final boolean dragResizing = freeformResizing || dockedResizing; if (mDragResizing != dragResizing) { if (dragResizing) { - startDragResizing(mPendingBackDropFrame); + startDragResizing(mPendingBackDropFrame, + mWinFrame.equals(mPendingBackDropFrame), mPendingVisibleInsets, + mPendingStableInsets); mResizeMode = freeformResizing ? RESIZE_MODE_FREEFORM : RESIZE_MODE_DOCKED_DIVIDER; @@ -5845,9 +5847,11 @@ public final class ViewRootImpl implements ViewParent, // Tell all listeners that we are resizing the window so that the chrome can get // updated as fast as possible on a separate thread, if (mDragResizing) { + boolean fullscreen = frame.equals(backDropFrame); synchronized (mWindowCallbacks) { for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - mWindowCallbacks.get(i).onWindowSizeIsChanging(backDropFrame); + mWindowCallbacks.get(i).onWindowSizeIsChanging(backDropFrame, fullscreen, + visibleInsets, stableInsets); } } } @@ -7046,12 +7050,14 @@ public final class ViewRootImpl implements ViewParent, /** * Start a drag resizing which will inform all listeners that a window resize is taking place. */ - private void startDragResizing(Rect initialBounds) { + private void startDragResizing(Rect initialBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets) { if (!mDragResizing) { mDragResizing = true; synchronized (mWindowCallbacks) { for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) { - mWindowCallbacks.get(i).onWindowDragResizeStart(initialBounds); + mWindowCallbacks.get(i).onWindowDragResizeStart(initialBounds, fullscreen, + systemInsets, stableInsets); } } mFullRedrawNeeded = true; diff --git a/core/java/android/view/WindowCallbacks.java b/core/java/android/view/WindowCallbacks.java index def02365dfed..d2bfca7e1c30 100644 --- a/core/java/android/view/WindowCallbacks.java +++ b/core/java/android/view/WindowCallbacks.java @@ -28,20 +28,30 @@ import android.graphics.Rect; public interface WindowCallbacks { /** * Called by the system when the window got changed by the user, before the layouter got called. - * It can be used to perform a "quick and dirty" resize which should never take more then 4ms to - * complete. + * It also gets called when the insets changed, or when the window switched between a fullscreen + * layout or a non-fullscreen layout. It can be used to perform a "quick and dirty" resize which + * should never take more then 4ms to complete. * * <p>At the time the layouting has not happened yet. * * @param newBounds The new window frame bounds. + * @param fullscreen Whether the window is currently drawing in fullscreen. + * @param systemInsets The current visible system insets for the window. + * @param stableInsets The stable insets for the window. */ - void onWindowSizeIsChanging(Rect newBounds); + void onWindowSizeIsChanging(Rect newBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets); /** * Called when a drag resize starts. + * * @param initialBounds The initial bounds where the window will be. + * @param fullscreen Whether the window is currently drawing in fullscreen. + * @param systemInsets The current visible system insets for the window. + * @param stableInsets The stable insets for the window. */ - void onWindowDragResizeStart(Rect initialBounds); + void onWindowDragResizeStart(Rect initialBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets); /** * Called when a drag resize ends. diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index 89b1eb933025..c22d60d94818 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -268,4 +268,9 @@ public abstract class WindowManagerInternal { /** Returns true if the stack with the input Id is currently visible. */ public abstract boolean isStackVisible(int stackId); + + /** + * @return True if and only if the docked divider is currently in resize mode. + */ + public abstract boolean isDockedDividerResizing(); } diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index 5047c4c11889..69311938c5ad 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -24,7 +24,6 @@ import android.view.Choreographer; import android.view.DisplayListCanvas; import android.view.RenderNode; import android.view.ThreadedRenderer; -import android.view.View; /** * The thread which draws a fill in background while the app is resizing in areas where the app @@ -49,6 +48,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame private final Rect mOldTargetRect = new Rect(); private final Rect mNewTargetRect = new Rect(); + private Choreographer mChoreographer; // Cached size values from the last render for the case that the view hierarchy is gone @@ -66,15 +66,23 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame private Drawable mUserCaptionBackgroundDrawable; private Drawable mResizingBackgroundDrawable; private ColorDrawable mStatusBarColor; + private ColorDrawable mNavigationBarColor; + private boolean mOldFullscreen; + private boolean mFullscreen; + private final Rect mOldSystemInsets = new Rect(); + private final Rect mOldStableInsets = new Rect(); + private final Rect mSystemInsets = new Rect(); + private final Rect mStableInsets = new Rect(); public BackdropFrameRenderer(DecorView decorView, ThreadedRenderer renderer, Rect initialBounds, Drawable resizingBackgroundDrawable, Drawable captionBackgroundDrawable, - Drawable userCaptionBackgroundDrawable, int statusBarColor) { + Drawable userCaptionBackgroundDrawable, int statusBarColor, int navigationBarColor, + boolean fullscreen, Rect systemInsets, Rect stableInsets) { setName("ResizeFrame"); mRenderer = renderer; onResourcesLoaded(decorView, resizingBackgroundDrawable, captionBackgroundDrawable, - userCaptionBackgroundDrawable, statusBarColor); + userCaptionBackgroundDrawable, statusBarColor, navigationBarColor); // Create a render node for the content and frame backdrop // which can be resized independently from the content. @@ -84,8 +92,14 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame // Set the initial bounds and draw once so that we do not get a broken frame. mTargetRect.set(initialBounds); + mFullscreen = fullscreen; + mOldFullscreen = fullscreen; + mSystemInsets.set(systemInsets); + mStableInsets.set(stableInsets); + mOldSystemInsets.set(systemInsets); + mOldStableInsets.set(stableInsets); synchronized (this) { - changeWindowSizeLocked(initialBounds); + redrawLocked(initialBounds, fullscreen, mSystemInsets, mStableInsets); } // Kick off our draw thread. @@ -94,7 +108,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame void onResourcesLoaded(DecorView decorView, Drawable resizingBackgroundDrawable, Drawable captionBackgroundDrawableDrawable, Drawable userCaptionBackgroundDrawable, - int statusBarColor) { + int statusBarColor, int navigationBarColor) { mDecorView = decorView; mResizingBackgroundDrawable = resizingBackgroundDrawable; mCaptionBackgroundDrawable = captionBackgroundDrawableDrawable; @@ -108,6 +122,12 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame } else { mStatusBarColor = null; } + if (navigationBarColor != 0) { + mNavigationBarColor = new ColorDrawable(navigationBarColor); + addSystemBarNodeIfNeeded(); + } else { + mNavigationBarColor = null; + } } private void addSystemBarNodeIfNeeded() { @@ -119,13 +139,22 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame } /** - * Call this function asynchronously when the window size has been changed. The change will - * be picked up once per frame and the frame will be re-rendered accordingly. + * Call this function asynchronously when the window size has been changed or when the insets + * have changed or whether window switched between a fullscreen or non-fullscreen layout. + * The change will be picked up once per frame and the frame will be re-rendered accordingly. + * * @param newTargetBounds The new target bounds. + * @param fullscreen Whether the window is currently drawing in fullscreen. + * @param systemInsets The current visible system insets for the window. + * @param stableInsets The stable insets for the window. */ - public void setTargetRect(Rect newTargetBounds) { + public void setTargetRect(Rect newTargetBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets) { synchronized (this) { + mFullscreen = fullscreen; mTargetRect.set(newTargetBounds); + mSystemInsets.set(systemInsets); + mStableInsets.set(stableInsets); // Notify of a bounds change. pingRenderLocked(); } @@ -204,16 +233,23 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame return; } mNewTargetRect.set(mTargetRect); - if (!mNewTargetRect.equals(mOldTargetRect) || mReportNextDraw) { + if (!mNewTargetRect.equals(mOldTargetRect) + || mOldFullscreen != mFullscreen + || !mStableInsets.equals(mOldStableInsets) + || !mSystemInsets.equals(mOldSystemInsets) + || mReportNextDraw) { + mOldFullscreen = mFullscreen; mOldTargetRect.set(mNewTargetRect); - changeWindowSizeLocked(mNewTargetRect); + mOldSystemInsets.set(mSystemInsets); + mOldStableInsets.set(mStableInsets); + redrawLocked(mNewTargetRect, mFullscreen, mSystemInsets, mStableInsets); } } } /** * The content is about to be drawn and we got the location of where it will be shown. - * If a "changeWindowSizeLocked" call has already been processed, we will re-issue the call + * If a "redrawLocked" call has already been processed, we will re-issue the call * if the previous call was ignored since the size was unknown. * @param xOffset The x offset where the content is drawn to. * @param yOffset The y offset where the content is drawn to. @@ -235,8 +271,8 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame mLastYOffset, mLastXOffset + mLastContentWidth, mLastYOffset + mLastCaptionHeight + mLastContentHeight); - // If this was the first call and changeWindowSizeLocked got already called prior - // to us, we should re-issue a changeWindowSizeLocked now. + // If this was the first call and redrawLocked got already called prior + // to us, we should re-issue a redrawLocked now. return firstCall && (mLastCaptionHeight != 0 || !mDecorView.isShowingCaption()); } @@ -251,16 +287,20 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame } /** - * Resizing the frame to fit the new window size. + * Redraws the background, the caption and the system inset backgrounds if something changed. + * * @param newBounds The window bounds which needs to be drawn. + * @param fullscreen Whether the window is currently drawing in fullscreen. + * @param systemInsets The current visible system insets for the window. + * @param stableInsets The stable insets for the window. */ - private void changeWindowSizeLocked(Rect newBounds) { + private void redrawLocked(Rect newBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets) { // While a configuration change is taking place the view hierarchy might become // inaccessible. For that case we remember the previous metrics to avoid flashes. // Note that even when there is no visible caption, the caption child will exist. final int captionHeight = mDecorView.getCaptionHeight(); - final int statusBarHeight = mDecorView.getStatusBarHeight(); // The caption height will probably never dynamically change while we are resizing. // Once set to something other then 0 it should be kept that way. @@ -302,14 +342,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame } mFrameAndBackdropNode.end(canvas); - if (mSystemBarBackgroundNode != null && mStatusBarColor != null) { - canvas = mSystemBarBackgroundNode.start(width, height); - mSystemBarBackgroundNode.setLeftTopRightBottom(left, top, left + width, top + height); - mStatusBarColor.setBounds(0, 0, left + width, statusBarHeight); - mStatusBarColor.draw(canvas); - mSystemBarBackgroundNode.end(canvas); - mRenderer.drawRenderNode(mSystemBarBackgroundNode); - } + drawColorViews(left, top, width, height, fullscreen, systemInsets, stableInsets); // We need to render the node explicitly mRenderer.drawRenderNode(mFrameAndBackdropNode); @@ -317,6 +350,39 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame reportDrawIfNeeded(); } + private void drawColorViews(int left, int top, int width, int height, + boolean fullscreen, Rect systemInsets, Rect stableInsets) { + if (mSystemBarBackgroundNode == null) { + return; + } + DisplayListCanvas canvas = mSystemBarBackgroundNode.start(width, height); + mSystemBarBackgroundNode.setLeftTopRightBottom(left, top, left + width, top + height); + final int topInset = DecorView.getColorViewTopInset(mStableInsets.top, mSystemInsets.top); + final int bottomInset = DecorView.getColorViewBottomInset(stableInsets.bottom, + systemInsets.bottom); + final int rightInset = DecorView.getColorViewRightInset(stableInsets.right, + systemInsets.right); + if (mStatusBarColor != null) { + mStatusBarColor.setBounds(0, 0, left + width, topInset); + mStatusBarColor.draw(canvas); + } + + // We only want to draw the navigation bar if our window is currently fullscreen because we + // don't want the navigation bar background be moving around when resizing in docked mode. + // However, we need it for the transitions into/out of docked mode. + if (mNavigationBarColor != null && fullscreen) { + final int size = DecorView.getNavBarSize(bottomInset, rightInset); + if (DecorView.isNavBarToRightEdge(bottomInset, rightInset)) { + mNavigationBarColor.setBounds(width - size, 0, width, height); + } else { + mNavigationBarColor.setBounds(0, height - size, width, height); + } + mNavigationBarColor.draw(canvas); + } + mSystemBarBackgroundNode.end(canvas); + mRenderer.drawRenderNode(mSystemBarBackgroundNode); + } + /** Notify view root that a frame has been drawn by us, if it has requested so. */ private void reportDrawIfNeeded() { if (mReportNextDraw) { diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 1a20e5ce5793..d4ada957a14a 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -922,6 +922,26 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return false; } + static int getColorViewTopInset(int stableTop, int systemTop) { + return Math.min(stableTop, systemTop); + } + + static int getColorViewBottomInset(int stableBottom, int systemBottom) { + return Math.min(stableBottom, systemBottom); + } + + static int getColorViewRightInset(int stableRight, int systemRight) { + return Math.min(stableRight, systemRight); + } + + static boolean isNavBarToRightEdge(int bottomInset, int rightInset) { + return bottomInset == 0 && rightInset > 0; + } + + static int getNavBarSize(int bottomInset, int rightInset) { + return isNavBarToRightEdge(bottomInset, rightInset) ? rightInset : bottomInset; + } + WindowInsets updateColorViews(WindowInsets insets, boolean animate) { WindowManager.LayoutParams attrs = mWindow.getAttributes(); int sysUiVisibility = attrs.systemUiVisibility | getWindowSystemUiVisibility(); @@ -933,11 +953,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mLastWindowFlags = attrs.flags; if (insets != null) { - mLastTopInset = Math.min(insets.getStableInsetTop(), + mLastTopInset = getColorViewTopInset(insets.getStableInsetTop(), insets.getSystemWindowInsetTop()); - mLastBottomInset = Math.min(insets.getStableInsetBottom(), + mLastBottomInset = getColorViewBottomInset(insets.getStableInsetBottom(), insets.getSystemWindowInsetBottom()); - mLastRightInset = Math.min(insets.getStableInsetRight(), + mLastRightInset = getColorViewRightInset(insets.getStableInsetRight(), insets.getSystemWindowInsetRight()); // Don't animate if the presence of stable insets has changed, because that @@ -956,8 +976,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mLastHasRightStableInset = hasRightStableInset; } - boolean navBarToRightEdge = mLastBottomInset == 0 && mLastRightInset > 0; - int navBarSize = navBarToRightEdge ? mLastRightInset : mLastBottomInset; + boolean navBarToRightEdge = isNavBarToRightEdge(mLastBottomInset, mLastRightInset); + int navBarSize = getNavBarSize(mLastBottomInset, mLastRightInset); updateColorViewInt(mNavigationColorViewState, sysUiVisibility, mWindow.mNavigationBarColor, navBarSize, navBarToRightEdge, 0 /* rightInset */, animate && !disallowAnimate, false /* force */); @@ -1041,14 +1061,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind */ private void updateColorViewInt(final ColorViewState state, int sysUiVis, int color, int size, boolean verticalBar, int rightMargin, boolean animate, boolean force) { - state.present = size > 0 && (sysUiVis & state.systemUiHideFlag) == 0 + state.present = (sysUiVis & state.systemUiHideFlag) == 0 && (mWindow.getAttributes().flags & state.hideWindowFlag) == 0 && ((mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 || force); boolean show = state.present && (color & Color.BLACK) != 0 && ((mWindow.getAttributes().flags & state.translucentFlag) == 0 || force); - boolean showView = show && !isResizing(); + boolean showView = show && !isResizing() && size > 0; boolean visibilityChanged = false; View view = state.view; @@ -1672,7 +1692,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind loadBackgroundDrawablesIfNeeded(); mBackdropFrameRenderer.onResourcesLoaded( this, mResizingBackgroundDrawable, mCaptionBackgroundDrawable, - mUserCaptionBackgroundDrawable, getCurrentColor(mStatusColorViewState)); + mUserCaptionBackgroundDrawable, getCurrentColor(mStatusColorViewState), + getCurrentColor(mNavigationColorViewState)); } mDecorCaptionView = createDecorCaptionView(inflater); @@ -1854,14 +1875,16 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } @Override - public void onWindowSizeIsChanging(Rect newBounds) { + public void onWindowSizeIsChanging(Rect newBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets) { if (mBackdropFrameRenderer != null) { - mBackdropFrameRenderer.setTargetRect(newBounds); + mBackdropFrameRenderer.setTargetRect(newBounds, fullscreen, systemInsets, stableInsets); } } @Override - public void onWindowDragResizeStart(Rect initialBounds) { + public void onWindowDragResizeStart(Rect initialBounds, boolean fullscreen, Rect systemInsets, + Rect stableInsets) { if (mWindow.isDestroyed()) { // If the owner's window is gone, we should not be able to come here anymore. releaseThreadedRenderer(); @@ -1875,7 +1898,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind loadBackgroundDrawablesIfNeeded(); mBackdropFrameRenderer = new BackdropFrameRenderer(this, renderer, initialBounds, mResizingBackgroundDrawable, mCaptionBackgroundDrawable, - mUserCaptionBackgroundDrawable, getCurrentColor(mStatusColorViewState)); + mUserCaptionBackgroundDrawable, getCurrentColor(mStatusColorViewState), + getCurrentColor(mNavigationColorViewState), fullscreen, systemInsets, + stableInsets); // Get rid of the shadow while we are resizing. Shadow drawing takes considerable time. // If we want to get the shadow shown while resizing, we would need to elevate a new @@ -1971,10 +1996,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return isShowingCaption() ? mDecorCaptionView.getCaptionHeight() : 0; } - int getStatusBarHeight() { - return mStatusColorViewState.view != null ? mStatusColorViewState.view.getHeight() : 0; - } - /** * Converts a DIP measure into physical pixels. * @param dip The dip value. diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 1cceef4484fe..dead0dbbc6f9 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -551,11 +551,14 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public void dockTopTask(int topTaskId, int dragMode, int stackCreateMode, Rect initialBounds) { SystemServicesProxy ssp = Recents.getSystemServices(); + + // Make sure we inform DividerView before we actually start the activity so we can change + // the resize mode already. + EventBus.getDefault().send(new DockingTopTaskEvent(dragMode)); ssp.moveTaskToDockedStack(topTaskId, stackCreateMode, initialBounds); showRecents(false /* triggeredFromAltTab */, dragMode == NavigationBarGestureHelper.DRAG_MODE_RECENTS, false /* animate */, true /* reloadTasks*/); - EventBus.getDefault().send(new DockingTopTaskEvent(dragMode)); } /** diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 3095e17f5e90..40e2611abf3f 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -212,16 +212,12 @@ public class DividerView extends FrameLayout implements OnTouchListener, } mDockSide = mWindowManagerProxy.getDockSide(); initializeSnapAlgorithm(); - if (mDockSide != WindowManager.DOCKED_INVALID) { - mWindowManagerProxy.setResizing(true); - mWindowManager.setSlippery(false); - if (touching) { - liftBackground(); - } - return true; - } else { - return false; + mWindowManagerProxy.setResizing(true); + mWindowManager.setSlippery(false); + if (touching) { + liftBackground(); } + return mDockSide != WindowManager.DOCKED_INVALID; } public void stopDragging(int position, float velocity, boolean avoidDismissStart) { @@ -239,6 +235,16 @@ public class DividerView extends FrameLayout implements OnTouchListener, releaseBackground(); } + private void stopDragging() { + mHandle.setTouching(false, true /* animate */); + mWindowManager.setSlippery(true); + releaseBackground(); + } + + private void updateDockSide() { + mDockSide = mWindowManagerProxy.getDockSide(); + } + private void initializeSnapAlgorithm() { if (mSnapAlgorithm == null) { mSnapAlgorithm = new DividerSnapAlgorithm(getContext().getResources(), mDisplayWidth, @@ -271,6 +277,11 @@ public class DividerView extends FrameLayout implements OnTouchListener, mStartX = (int) event.getX(); mStartY = (int) event.getY(); boolean result = startDragging(true /* animate */, true /* touching */); + if (!result) { + + // Weren't able to start dragging successfully, so cancel it again. + stopDragging(); + } mStartPosition = getCurrentPosition(); mMoving = false; return result; @@ -730,11 +741,13 @@ public class DividerView extends FrameLayout implements OnTouchListener, public final void onBusEvent(RecentsDrawnEvent drawnEvent) { if (mAnimateAfterRecentsDrawn) { mAnimateAfterRecentsDrawn = false; + updateDockSide(); stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(), 250, TOUCH_RESPONSE_INTERPOLATOR); } if (mGrowAfterRecentsDrawn) { mGrowAfterRecentsDrawn = false; + updateDockSide(); stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(), 250, TOUCH_RESPONSE_INTERPOLATOR); } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 43b82e9fcd11..a92cc31659e6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6877,7 +6877,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean dockedStackVisible = mWindowManagerInternal.isStackVisible(DOCKED_STACK_ID); final boolean freeformStackVisible = mWindowManagerInternal.isStackVisible(FREEFORM_WORKSPACE_STACK_ID); - final boolean forceShowSystemBars = dockedStackVisible || freeformStackVisible; + final boolean resizing = mWindowManagerInternal.isDockedDividerResizing(); + + // We need to force system bars when the docked stack is visible, when the freeform stack + // is visible but also when we are resizing for the transitions when docked stack + // visibility changes. + final boolean forceShowSystemBars = dockedStackVisible || freeformStackVisible || resizing; final boolean forceOpaqueSystemBars = forceShowSystemBars && !mForceStatusBarFromKeyguard; // apply translucent bar vis flags diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a26430e773cc..fa3c0f9d46b9 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -10599,5 +10599,12 @@ public class WindowManagerService extends IWindowManager.Stub return WindowManagerService.this.isStackVisibleLocked(stackId); } } + + @Override + public boolean isDockedDividerResizing() { + synchronized (mWindowMap) { + return getDefaultDisplayContentLocked().getDockedDividerController().isResizing(); + } + } } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 465c7e0937b6..1f7b810b9f93 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -16,8 +16,6 @@ package com.android.server.wm; -import com.android.server.input.InputWindowHandle; - import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; @@ -53,6 +51,8 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerPolicy; +import com.android.server.input.InputWindowHandle; + import java.io.PrintWriter; import java.util.ArrayList; @@ -75,8 +75,8 @@ import static android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; -import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; @@ -2133,7 +2133,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { // background. return (mDisplayContent.mDividerControllerLocked.isResizing() || mAppToken != null && !mAppToken.mFrozenBounds.isEmpty()) && - !task.inFreeformWorkspace() && !task.isFullscreen(); + !task.inFreeformWorkspace(); + } void setDragResizing() { @@ -2327,6 +2328,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (mDrawLock != null) { pw.print(prefix); pw.println("mDrawLock=" + mDrawLock); } + if (isDragResizing()) { + pw.print(prefix); pw.println("isDragResizing=" + isDragResizing()); + } + if (computeDragResizing()) { + pw.print(prefix); pw.println("computeDragResizing=" + computeDragResizing()); + } } String makeInputChannelName() { |