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();
mImeHideRequested = true;
}
} else {
setMinimizedDockedStack(false);
} else if (setMinimizedDockedStack(false)) {
mService.mWindowPlacerLocked.performSurfacePlacement();
}
}
@@ -542,31 +542,43 @@ public class DockedStackDividerController implements DimLayerUser {
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 @@ public class DockedStackDividerController implements DimLayerUser {
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 @@ public class DockedStackDividerController implements DimLayerUser {
}
}
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() {