summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DockedStackDividerController.java9
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java18
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java48
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java6
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,