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
This commit is contained in:
Chong Zhang
2016-07-01 14:48:11 -07:00
parent 60efbf2586
commit 22eff0a020

View File

@@ -388,8 +388,8 @@ public class DockedStackDividerController implements DimLayerUser {
inputMethodManagerInternal.hideCurrentInputMethod(); inputMethodManagerInternal.hideCurrentInputMethod();
mImeHideRequested = true; mImeHideRequested = true;
} }
} else { } else if (setMinimizedDockedStack(false)) {
setMinimizedDockedStack(false); mService.mWindowPlacerLocked.performSurfacePlacement();
} }
} }
@@ -542,31 +542,43 @@ public class DockedStackDividerController implements DimLayerUser {
return; return;
} }
clearImeAdjustAnimation(); final boolean imeChanged = clearImeAdjustAnimation();
boolean minimizedChange = false;
if (minimizedDock) { if (minimizedDock) {
if (animate) { if (animate) {
startAdjustAnimation(0f, 1f); startAdjustAnimation(0f, 1f);
} else { } else {
setMinimizedDockedStack(true); minimizedChange |= setMinimizedDockedStack(true);
} }
} else { } else {
if (animate) { if (animate) {
startAdjustAnimation(1f, 0f); startAdjustAnimation(1f, 0f);
} else { } 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(); final ArrayList<TaskStack> stacks = mDisplayContent.getStacks();
for (int i = stacks.size() - 1; i >= 0; --i) { for (int i = stacks.size() - 1; i >= 0; --i) {
final TaskStack stack = stacks.get(i); final TaskStack stack = stacks.get(i);
if (stack != null && stack.isAdjustedForIme()) { if (stack != null && stack.isAdjustedForIme()) {
stack.resetAdjustedForIme(true /* adjustBoundsNow */); stack.resetAdjustedForIme(true /* adjustBoundsNow */);
changed = true;
} }
} }
mAnimatingForIme = false; mAnimatingForIme = false;
return changed;
} }
private void startAdjustAnimation(float from, float to) { private void startAdjustAnimation(float from, float to) {
@@ -625,8 +637,21 @@ public class DockedStackDividerController implements DimLayerUser {
if (mDelayedImeWin != null) { if (mDelayedImeWin != null) {
mDelayedImeWin.mWinAnimator.endDelayingAnimationStart(); 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( notifyAdjustedForImeChanged(
adjustedForIme || adjustedForDivider, IME_ADJUST_ANIM_DURATION); mAdjustedForIme || mAdjustedForDivider, duration);
}; };
} else { } else {
notifyAdjustedForImeChanged( notifyAdjustedForImeChanged(
@@ -634,15 +659,10 @@ public class DockedStackDividerController implements DimLayerUser {
} }
} }
private void setMinimizedDockedStack(boolean minimized) { private boolean setMinimizedDockedStack(boolean minimized) {
final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked(); final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked();
notifyDockedStackMinimizedChanged(minimized, 0); notifyDockedStackMinimizedChanged(minimized, 0);
if (stack == null) { return stack != null && stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f);
return;
}
if (stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f)) {
mService.mWindowPlacerLocked.performSurfacePlacement();
}
} }
private boolean isAnimationMaximizing() { private boolean isAnimationMaximizing() {