diff options
4 files changed, 52 insertions, 29 deletions
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 36e8bbbf4638..6741aba35f3c 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -96,6 +96,7 @@ public class DockedStackDividerController implements DimLayerUser { private final Interpolator mMinimizedDockInterpolator; private float mMaximizeMeetFraction; private final Rect mTouchRegion = new Rect(); + private boolean mAdjustingForIme; DockedStackDividerController(WindowManagerService service, DisplayContent displayContent) { mService = service; @@ -173,6 +174,14 @@ public class DockedStackDividerController implements DimLayerUser { return mLastVisibility; } + void setAdjustingForIme(boolean adjusting) { + mAdjustingForIme = adjusting; + } + + boolean isAdjustingForIme() { + return mAdjustingForIme; + } + void positionDockedStackedDivider(Rect frame) { TaskStack stack = mDisplayContent.getDockedStackLocked(); if (stack == null) { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index c6677670190e..8d67771e0bff 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -200,10 +200,11 @@ public class TaskStack implements DimLayer.DimLayerUser, * @param bounds The adjusted bounds. * @param keepInsets Whether to keep the insets from the original bounds or to calculate new * ones depending on the adjusted bounds. + * @return true if the adjusted bounds has changed. */ - private void setAdjustedBounds(Rect bounds, boolean keepInsets) { + private boolean setAdjustedBounds(Rect bounds, boolean keepInsets) { if (mAdjustedBounds.equals(bounds)) { - return; + return false; } mAdjustedBounds.set(bounds); @@ -211,6 +212,7 @@ public class TaskStack implements DimLayer.DimLayerUser, alignTasksToAdjustedBounds(adjusted ? mAdjustedBounds : mBounds, adjusted && keepInsets ? mBounds : null); mDisplayContent.layoutNeeded = true; + return true; } private void alignTasksToAdjustedBounds(Rect adjustedBounds, Rect tempInsetBounds) { @@ -794,7 +796,9 @@ public class TaskStack implements DimLayer.DimLayerUser, void setAdjustedForIme(WindowState imeWin) { mAdjustedForIme = true; mImeWin = imeWin; - updateAdjustedBounds(); + if (updateAdjustedBounds()) { + getDisplayContent().mDividerControllerLocked.setAdjustingForIme(true); + } } /** @@ -803,7 +807,9 @@ public class TaskStack implements DimLayer.DimLayerUser, void resetAdjustedForIme() { mAdjustedForIme = false; mImeWin = null; - updateAdjustedBounds(); + if (updateAdjustedBounds()) { + getDisplayContent().mDividerControllerLocked.setAdjustingForIme(true); + } } /** @@ -920,7 +926,7 @@ public class TaskStack implements DimLayer.DimLayerUser, /** * Updates the adjustment depending on it's current state. */ - void updateAdjustedBounds() { + boolean updateAdjustedBounds() { boolean adjust = false; if (mMinimizeAmount != 0f) { adjust = adjustForMinimizedDockedStack(mMinimizeAmount); @@ -931,7 +937,7 @@ public class TaskStack implements DimLayer.DimLayerUser, mTmpAdjustedBounds.setEmpty(); mLastContentBounds.setEmpty(); } - setAdjustedBounds(mTmpAdjustedBounds, isAdjustedForMinimizedDockedStack()); + return setAdjustedBounds(mTmpAdjustedBounds, isAdjustedForMinimizedDockedStack()); } boolean isAdjustedForMinimizedDockedStack() { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 14291caa4072..d21f7754a27f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7352,6 +7352,30 @@ public class WindowManagerService extends IWindowManager.Stub } } + private void adjustForImeIfNeeded(final DisplayContent displayContent) { + final WindowState imeWin = mInputMethodWindow; + final TaskStack focusedStack = + mCurrentFocus != null ? mCurrentFocus.getStack() : null; + if (imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw() + && isStackVisibleLocked(DOCKED_STACK_ID) + && focusedStack != null + && focusedStack.getDockSide() == DOCKED_BOTTOM){ + final ArrayList<TaskStack> stacks = displayContent.getStacks(); + for (int i = stacks.size() - 1; i >= 0; --i) { + final TaskStack stack = stacks.get(i); + if (stack.isVisibleLocked()) { + stack.setAdjustedForIme(imeWin); + } + } + } else { + final ArrayList<TaskStack> stacks = displayContent.getStacks(); + for (int i = stacks.size() - 1; i >= 0; --i) { + final TaskStack stack = stacks.get(i); + stack.resetAdjustedForIme(); + } + } + } + // ------------------------------------------------------------- // Drag and drop // ------------------------------------------------------------- @@ -8209,30 +8233,8 @@ public class WindowManagerService extends IWindowManager.Stub case UPDATE_DOCKED_STACK_DIVIDER: { synchronized (mWindowMap) { final DisplayContent displayContent = getDefaultDisplayContentLocked(); - displayContent.getDockedDividerController().reevaluateVisibility(false); - - final WindowState imeWin = mInputMethodWindow; - final TaskStack focusedStack = - mCurrentFocus != null ? mCurrentFocus.getStack() : null; - if (imeWin != null && imeWin.isVisibleNow() - && isStackVisibleLocked(DOCKED_STACK_ID) - && focusedStack != null - && focusedStack.getDockSide() == DOCKED_BOTTOM){ - final ArrayList<TaskStack> stacks = displayContent.getStacks(); - for (int i = stacks.size() - 1; i >= 0; --i) { - final TaskStack stack = stacks.get(i); - if (stack.isVisibleLocked()) { - stack.setAdjustedForIme(imeWin); - } - } - } else { - final ArrayList<TaskStack> stacks = displayContent.getStacks(); - for (int i = stacks.size() - 1; i >= 0; --i) { - final TaskStack stack = stacks.get(i); - stack.resetAdjustedForIme(); - } - } + adjustForImeIfNeeded(displayContent); } } break; diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 5ad771fbcd04..909c5f2c72ab 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -9,6 +9,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_DREAM; import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; @@ -689,6 +690,9 @@ class WindowSurfacePlacer { && !w.isDragResizing() && !adjustedForMinimizedDockedStack && (task == null || !w.getTask().mStack.getFreezeMovementAnimations())) { winAnimator.setMoveAnimation(left, top); + } else if (w.mAttrs.type == TYPE_DOCK_DIVIDER && + displayContent.getDockedDividerController().isAdjustingForIme()) { + winAnimator.setMoveAnimation(left, top); } //TODO (multidisplay): Accessibility supported only for the default display. @@ -805,6 +809,8 @@ class WindowSurfacePlacer { mService.updateResizingWindows(w); } + displayContent.getDockedDividerController().setAdjustingForIme(false); + mService.mDisplayManagerInternal.setDisplayProperties(displayId, mDisplayHasContent, mPreferredRefreshRate, |