diff options
| author | 2020-05-28 17:12:26 -0700 | |
|---|---|---|
| committer | 2020-05-29 09:21:26 -0700 | |
| commit | 653a725aa636bf3163bc16f1aae53e0aaa12fbf6 (patch) | |
| tree | 329ea27eb9f93f9d50ba8abd3b8e0acc39770d7a | |
| parent | 4911db037b82a92a30c0bed2ce01b7516c4f414a (diff) | |
Post insets update to handler
Otherwise there is a potential race with accessors of
mInsetsState
Bug: 157581406
Test: TaplTestsQuickstep.testAllAppsFromHome
Change-Id: I15719dde23464e15edee6597e117a731419d9253
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java | 210 |
1 files changed, 105 insertions, 105 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java index 2968b92f51b7..32e3a7fc032e 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java +++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java @@ -187,19 +187,21 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged @Override public void insetsChanged(InsetsState insetsState) { - if (mInsetsState.equals(insetsState)) { - return; - } + mHandler.post(() -> { + if (mInsetsState.equals(insetsState)) { + return; + } - final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME); - final Rect newFrame = newSource.getFrame(); - final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame(); + final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME); + final Rect newFrame = newSource.getFrame(); + final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame(); - mInsetsState.set(insetsState, true /* copySources */); - if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) { - if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation"); - startAnimation(mImeShowing, true /* forceRestart */); - } + mInsetsState.set(insetsState, true /* copySources */); + if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) { + if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation"); + startAnimation(mImeShowing, true /* forceRestart */); + } + }); } @Override @@ -232,7 +234,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged return; } if (DEBUG) Slog.d(TAG, "Got showInsets for ime"); - startAnimation(true /* show */, false /* forceRestart */); + mHandler.post(() -> startAnimation(true /* show */, false /* forceRestart */)); } @Override @@ -241,7 +243,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged return; } if (DEBUG) Slog.d(TAG, "Got hideInsets for ime"); - startAnimation(false /* show */, false /* forceRestart */); + mHandler.post(() -> startAnimation(false /* show */, false /* forceRestart */)); } /** @@ -269,108 +271,106 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged if (newFrame.height() != 0) { mImeFrame.set(newFrame); } - mHandler.post(() -> { - if (DEBUG) { - Slog.d(TAG, "Run startAnim show:" + show + " was:" - + (mAnimationDirection == DIRECTION_SHOW ? "SHOW" - : (mAnimationDirection == DIRECTION_HIDE ? "HIDE" : "NONE"))); - } - if (!forceRestart && (mAnimationDirection == DIRECTION_SHOW && show) - || (mAnimationDirection == DIRECTION_HIDE && !show)) { - return; - } - boolean seek = false; - float seekValue = 0; - if (mAnimation != null) { - if (mAnimation.isRunning()) { - seekValue = (float) mAnimation.getAnimatedValue(); - seek = true; - } - mAnimation.cancel(); - } - final float defaultY = mImeSourceControl.getSurfacePosition().y; - final float x = mImeSourceControl.getSurfacePosition().x; - final float hiddenY = defaultY + mImeFrame.height(); - final float shownY = defaultY; - final float startY = show ? hiddenY : shownY; - final float endY = show ? shownY : hiddenY; - if (mAnimationDirection == DIRECTION_NONE && mImeShowing && show) { - // IME is already showing, so set seek to end - seekValue = shownY; + if (DEBUG) { + Slog.d(TAG, "Run startAnim show:" + show + " was:" + + (mAnimationDirection == DIRECTION_SHOW ? "SHOW" + : (mAnimationDirection == DIRECTION_HIDE ? "HIDE" : "NONE"))); + } + if (!forceRestart && (mAnimationDirection == DIRECTION_SHOW && show) + || (mAnimationDirection == DIRECTION_HIDE && !show)) { + return; + } + boolean seek = false; + float seekValue = 0; + if (mAnimation != null) { + if (mAnimation.isRunning()) { + seekValue = (float) mAnimation.getAnimatedValue(); seek = true; } - mAnimationDirection = show ? DIRECTION_SHOW : DIRECTION_HIDE; - mImeShowing = show; - mAnimation = ValueAnimator.ofFloat(startY, endY); - mAnimation.setDuration( - show ? ANIMATION_DURATION_SHOW_MS : ANIMATION_DURATION_HIDE_MS); - if (seek) { - mAnimation.setCurrentFraction((seekValue - startY) / (endY - startY)); - } + mAnimation.cancel(); + } + final float defaultY = mImeSourceControl.getSurfacePosition().y; + final float x = mImeSourceControl.getSurfacePosition().x; + final float hiddenY = defaultY + mImeFrame.height(); + final float shownY = defaultY; + final float startY = show ? hiddenY : shownY; + final float endY = show ? shownY : hiddenY; + if (mAnimationDirection == DIRECTION_NONE && mImeShowing && show) { + // IME is already showing, so set seek to end + seekValue = shownY; + seek = true; + } + mAnimationDirection = show ? DIRECTION_SHOW : DIRECTION_HIDE; + mImeShowing = show; + mAnimation = ValueAnimator.ofFloat(startY, endY); + mAnimation.setDuration( + show ? ANIMATION_DURATION_SHOW_MS : ANIMATION_DURATION_HIDE_MS); + if (seek) { + mAnimation.setCurrentFraction((seekValue - startY) / (endY - startY)); + } - mAnimation.addUpdateListener(animation -> { + mAnimation.addUpdateListener(animation -> { + SurfaceControl.Transaction t = mTransactionPool.acquire(); + float value = (float) animation.getAnimatedValue(); + t.setPosition(mImeSourceControl.getLeash(), x, value); + dispatchPositionChanged(mDisplayId, imeTop(value), t); + t.apply(); + mTransactionPool.release(t); + }); + mAnimation.setInterpolator(INTERPOLATOR); + mAnimation.addListener(new AnimatorListenerAdapter() { + private boolean mCancelled = false; + @Override + public void onAnimationStart(Animator animation) { SurfaceControl.Transaction t = mTransactionPool.acquire(); - float value = (float) animation.getAnimatedValue(); - t.setPosition(mImeSourceControl.getLeash(), x, value); - dispatchPositionChanged(mDisplayId, imeTop(value), t); + t.setPosition(mImeSourceControl.getLeash(), x, startY); + if (DEBUG) { + Slog.d(TAG, "onAnimationStart d:" + mDisplayId + " top:" + + imeTop(hiddenY) + "->" + imeTop(shownY) + + " showing:" + (mAnimationDirection == DIRECTION_SHOW)); + } + dispatchStartPositioning(mDisplayId, imeTop(hiddenY), + imeTop(shownY), mAnimationDirection == DIRECTION_SHOW, + t); + if (mAnimationDirection == DIRECTION_SHOW) { + t.show(mImeSourceControl.getLeash()); + } t.apply(); mTransactionPool.release(t); - }); - mAnimation.setInterpolator(INTERPOLATOR); - mAnimation.addListener(new AnimatorListenerAdapter() { - private boolean mCancelled = false; - @Override - public void onAnimationStart(Animator animation) { - SurfaceControl.Transaction t = mTransactionPool.acquire(); - t.setPosition(mImeSourceControl.getLeash(), x, startY); - if (DEBUG) { - Slog.d(TAG, "onAnimationStart d:" + mDisplayId + " top:" - + imeTop(hiddenY) + "->" + imeTop(shownY) - + " showing:" + (mAnimationDirection == DIRECTION_SHOW)); - } - dispatchStartPositioning(mDisplayId, imeTop(hiddenY), - imeTop(shownY), mAnimationDirection == DIRECTION_SHOW, - t); - if (mAnimationDirection == DIRECTION_SHOW) { - t.show(mImeSourceControl.getLeash()); - } - t.apply(); - mTransactionPool.release(t); - } - @Override - public void onAnimationCancel(Animator animation) { - mCancelled = true; + } + @Override + public void onAnimationCancel(Animator animation) { + mCancelled = true; + } + @Override + public void onAnimationEnd(Animator animation) { + if (DEBUG) Slog.d(TAG, "onAnimationEnd " + mCancelled); + SurfaceControl.Transaction t = mTransactionPool.acquire(); + if (!mCancelled) { + t.setPosition(mImeSourceControl.getLeash(), x, endY); } - @Override - public void onAnimationEnd(Animator animation) { - if (DEBUG) Slog.d(TAG, "onAnimationEnd " + mCancelled); - SurfaceControl.Transaction t = mTransactionPool.acquire(); - if (!mCancelled) { - t.setPosition(mImeSourceControl.getLeash(), x, endY); - } - dispatchEndPositioning(mDisplayId, mCancelled, t); - if (mAnimationDirection == DIRECTION_HIDE && !mCancelled) { - t.hide(mImeSourceControl.getLeash()); - } - t.apply(); - mTransactionPool.release(t); - - mAnimationDirection = DIRECTION_NONE; - mAnimation = null; + dispatchEndPositioning(mDisplayId, mCancelled, t); + if (mAnimationDirection == DIRECTION_HIDE && !mCancelled) { + t.hide(mImeSourceControl.getLeash()); } - }); - if (!show) { - // When going away, queue up insets change first, otherwise any bounds changes - // can have a "flicker" of ime-provided insets. - setVisibleDirectly(false /* visible */); - } - mAnimation.start(); - if (show) { - // When showing away, queue up insets change last, otherwise any bounds changes - // can have a "flicker" of ime-provided insets. - setVisibleDirectly(true /* visible */); + t.apply(); + mTransactionPool.release(t); + + mAnimationDirection = DIRECTION_NONE; + mAnimation = null; } }); + if (!show) { + // When going away, queue up insets change first, otherwise any bounds changes + // can have a "flicker" of ime-provided insets. + setVisibleDirectly(false /* visible */); + } + mAnimation.start(); + if (show) { + // When showing away, queue up insets change last, otherwise any bounds changes + // can have a "flicker" of ime-provided insets. + setVisibleDirectly(true /* visible */); + } } } |