Fix potential loophole where ime adjust notification is not sent
- If IME adjust is cleared due to minimizing status change, make
do a performSurfacePlacement to get UPDATE_DOCKED_STACK_DIVIDER
- If IME adjust status is changed while waiting for drawn for the
resizing mode, only report the latest status not the stale status
- Add some verbose log to help debugging
bug: 29313747
Change-Id: I0c561d2ad294dba1a966ffa7205f1315b599a4bb
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index e73649d..f93e2ff 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -388,8 +388,8 @@
inputMethodManagerInternal.hideCurrentInputMethod();
mImeHideRequested = true;
}
- } else {
- setMinimizedDockedStack(false);
+ } else if (setMinimizedDockedStack(false)) {
+ mService.mWindowPlacerLocked.performSurfacePlacement();
}
}
@@ -542,31 +542,43 @@
return;
}
- clearImeAdjustAnimation();
+ final boolean imeChanged = clearImeAdjustAnimation();
+ boolean minimizedChange = false;
if (minimizedDock) {
if (animate) {
startAdjustAnimation(0f, 1f);
} else {
- setMinimizedDockedStack(true);
+ minimizedChange |= setMinimizedDockedStack(true);
}
} else {
if (animate) {
startAdjustAnimation(1f, 0f);
} else {
- setMinimizedDockedStack(false);
+ minimizedChange |= setMinimizedDockedStack(false);
}
}
+ if (imeChanged || minimizedChange) {
+ if (imeChanged && !minimizedChange) {
+ Slog.d(TAG, "setMinimizedDockedStack: IME adjust changed due to minimizing,"
+ + " minimizedDock=" + minimizedDock
+ + " minimizedChange=" + minimizedChange);
+ }
+ mService.mWindowPlacerLocked.performSurfacePlacement();
+ }
}
- private void clearImeAdjustAnimation() {
+ private boolean clearImeAdjustAnimation() {
+ boolean changed = false;
final ArrayList<TaskStack> stacks = mDisplayContent.getStacks();
for (int i = stacks.size() - 1; i >= 0; --i) {
final TaskStack stack = stacks.get(i);
if (stack != null && stack.isAdjustedForIme()) {
stack.resetAdjustedForIme(true /* adjustBoundsNow */);
+ changed = true;
}
}
mAnimatingForIme = false;
+ return changed;
}
private void startAdjustAnimation(float from, float to) {
@@ -625,8 +637,21 @@
if (mDelayedImeWin != null) {
mDelayedImeWin.mWinAnimator.endDelayingAnimationStart();
}
+ // If the adjust status changed since this was posted, only notify
+ // the new states and don't animate.
+ long duration = 0;
+ if (mAdjustedForIme == adjustedForIme
+ && mAdjustedForDivider == adjustedForDivider) {
+ duration = IME_ADJUST_ANIM_DURATION;
+ } else {
+ Slog.w(TAG, "IME adjust changed while waiting for drawn:"
+ + " adjustedForIme=" + adjustedForIme
+ + " adjustedForDivider=" + adjustedForDivider
+ + " mAdjustedForIme=" + mAdjustedForIme
+ + " mAdjustedForDivider=" + mAdjustedForDivider);
+ }
notifyAdjustedForImeChanged(
- adjustedForIme || adjustedForDivider, IME_ADJUST_ANIM_DURATION);
+ mAdjustedForIme || mAdjustedForDivider, duration);
};
} else {
notifyAdjustedForImeChanged(
@@ -634,15 +659,10 @@
}
}
- private void setMinimizedDockedStack(boolean minimized) {
+ private boolean setMinimizedDockedStack(boolean minimized) {
final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked();
notifyDockedStackMinimizedChanged(minimized, 0);
- if (stack == null) {
- return;
- }
- if (stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f)) {
- mService.mWindowPlacerLocked.performSurfacePlacement();
- }
+ return stack != null && stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f);
}
private boolean isAnimationMaximizing() {