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:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user