Flush the animation if it is canceled
The issue was that: if navigation bar is requested to show while a controller is playing an animation of hiding both status bar and navigation bar, the animation will be canceled and will stay in an intermediate state, and then, another controller will play an animation of showing navigation bar. At the end, status bar will stay visible but it should be invisible. This CL fast-forwards the insets animation to the end state if it is canceled. Fix: 185459811 Test: Steps in the bug. Change-Id: Id6ae321b6c153ed1d7155afd6111b193ac9c045c
This commit is contained in:
@@ -28,6 +28,8 @@ import static android.view.InsetsAnimationControlImplProto.TMP_MATRIX;
|
||||
import static android.view.InsetsController.ANIMATION_TYPE_SHOW;
|
||||
import static android.view.InsetsController.AnimationType;
|
||||
import static android.view.InsetsController.DEBUG;
|
||||
import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_SHOWN;
|
||||
import static android.view.InsetsController.LayoutInsetsDuringAnimation;
|
||||
import static android.view.InsetsState.ISIDE_BOTTOM;
|
||||
import static android.view.InsetsState.ISIDE_FLOATING;
|
||||
import static android.view.InsetsState.ISIDE_LEFT;
|
||||
@@ -85,6 +87,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
|
||||
private final Matrix mTmpMatrix = new Matrix();
|
||||
private final InsetsState mInitialInsetsState;
|
||||
private final @AnimationType int mAnimationType;
|
||||
private final @LayoutInsetsDuringAnimation int mLayoutInsetsDuringAnimation;
|
||||
private final @InsetsType int mTypes;
|
||||
private @InsetsType int mControllingTypes;
|
||||
private final InsetsAnimationControlCallbacks mController;
|
||||
@@ -107,9 +110,10 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
|
||||
@VisibleForTesting
|
||||
public InsetsAnimationControlImpl(SparseArray<InsetsSourceControl> controls,
|
||||
@Nullable Rect frame, InsetsState state, WindowInsetsAnimationControlListener listener,
|
||||
@InsetsType int types,
|
||||
InsetsAnimationControlCallbacks controller, long durationMs, Interpolator interpolator,
|
||||
@AnimationType int animationType, CompatibilityInfo.Translator translator) {
|
||||
@InsetsType int types, InsetsAnimationControlCallbacks controller, long durationMs,
|
||||
Interpolator interpolator, @AnimationType int animationType,
|
||||
@LayoutInsetsDuringAnimation int layoutInsetsDuringAnimation,
|
||||
CompatibilityInfo.Translator translator) {
|
||||
mControls = controls;
|
||||
mListener = listener;
|
||||
mTypes = types;
|
||||
@@ -145,6 +149,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
|
||||
durationMs);
|
||||
mAnimation.setAlpha(getCurrentAlpha());
|
||||
mAnimationType = animationType;
|
||||
mLayoutInsetsDuringAnimation = layoutInsetsDuringAnimation;
|
||||
mTranslator = translator;
|
||||
mController.startAnimation(this, listener, types, mAnimation,
|
||||
new Bounds(mHiddenInsets, mShownInsets));
|
||||
@@ -299,6 +304,10 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
|
||||
if (mFinished) {
|
||||
return;
|
||||
}
|
||||
mPendingInsets = mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN
|
||||
? mShownInsets : mHiddenInsets;
|
||||
mPendingAlpha = 1f;
|
||||
applyChangeInsets(null);
|
||||
mCancelled = true;
|
||||
mListener.onCancelled(mReadyDispatched ? this : null);
|
||||
if (DEBUG) Log.d(TAG, "notify Control request cancelled for types: " + mTypes);
|
||||
|
||||
@@ -29,6 +29,7 @@ import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
import android.view.InsetsController.AnimationType;
|
||||
import android.view.InsetsController.LayoutInsetsDuringAnimation;
|
||||
import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams;
|
||||
import android.view.WindowInsets.Type.InsetsType;
|
||||
import android.view.WindowInsetsAnimation.Bounds;
|
||||
@@ -103,14 +104,15 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro
|
||||
@UiThread
|
||||
public InsetsAnimationThreadControlRunner(SparseArray<InsetsSourceControl> controls,
|
||||
@Nullable Rect frame, InsetsState state, WindowInsetsAnimationControlListener listener,
|
||||
@InsetsType int types,
|
||||
InsetsAnimationControlCallbacks controller, long durationMs, Interpolator interpolator,
|
||||
@AnimationType int animationType, CompatibilityInfo.Translator translator,
|
||||
Handler mainThreadHandler) {
|
||||
@InsetsType int types, InsetsAnimationControlCallbacks controller, long durationMs,
|
||||
Interpolator interpolator, @AnimationType int animationType,
|
||||
@LayoutInsetsDuringAnimation int layoutInsetsDuringAnimation,
|
||||
CompatibilityInfo.Translator translator, Handler mainThreadHandler) {
|
||||
mMainThreadHandler = mainThreadHandler;
|
||||
mOuterCallbacks = controller;
|
||||
mControl = new InsetsAnimationControlImpl(controls, frame, state, listener,
|
||||
types, mCallbacks, durationMs, interpolator, animationType, translator);
|
||||
mControl = new InsetsAnimationControlImpl(controls, frame, state, listener, types,
|
||||
mCallbacks, durationMs, interpolator, animationType, layoutInsetsDuringAnimation,
|
||||
translator);
|
||||
InsetsAnimationThread.getHandler().post(() -> {
|
||||
if (mControl.isCancelled()) {
|
||||
return;
|
||||
|
||||
@@ -1052,10 +1052,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
||||
final InsetsAnimationControlRunner runner = useInsetsAnimationThread
|
||||
? new InsetsAnimationThreadControlRunner(controls,
|
||||
frame, mState, listener, typesReady, this, durationMs, interpolator,
|
||||
animationType, mHost.getTranslator(), mHost.getHandler())
|
||||
animationType, layoutInsetsDuringAnimation, mHost.getTranslator(),
|
||||
mHost.getHandler())
|
||||
: new InsetsAnimationControlImpl(controls,
|
||||
frame, mState, listener, typesReady, this, durationMs, interpolator,
|
||||
animationType, mHost.getTranslator());
|
||||
animationType, layoutInsetsDuringAnimation, mHost.getTranslator());
|
||||
if ((typesReady & WindowInsets.Type.ime()) != 0) {
|
||||
ImeTracing.getInstance().triggerClientDump("InsetsAnimationControlImpl",
|
||||
mHost.getInputMethodManager(), null /* icProto */);
|
||||
|
||||
@@ -110,7 +110,7 @@ public class InsetsAnimationControlImplTest {
|
||||
mController = new InsetsAnimationControlImpl(controls,
|
||||
new Rect(0, 0, 500, 500), mInsetsState, mMockListener, systemBars(),
|
||||
mMockController, 10 /* durationMs */, new LinearInterpolator(),
|
||||
0 /* animationType */, null /* translator */);
|
||||
0 /* animationType */, 0 /* layoutInsetsDuringAnimation */, null /* translator */);
|
||||
mController.mReadyDispatched = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
||||
import static android.view.InsetsController.ANIMATION_TYPE_HIDE;
|
||||
import static android.view.InsetsController.ANIMATION_TYPE_SHOW;
|
||||
import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_HIDDEN;
|
||||
import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_SHOWN;
|
||||
import static android.view.InsetsState.ITYPE_IME;
|
||||
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
|
||||
import static android.view.InsetsState.ITYPE_STATUS_BAR;
|
||||
@@ -522,7 +524,10 @@ class InsetsPolicy {
|
||||
mAnimationControl = new InsetsAnimationControlImpl(controls,
|
||||
null /* frame */, state, mListener, typesReady, this,
|
||||
mListener.getDurationMs(), getInsetsInterpolator(),
|
||||
show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, null /* translator */);
|
||||
show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, show
|
||||
? LAYOUT_INSETS_DURING_ANIMATION_SHOWN
|
||||
: LAYOUT_INSETS_DURING_ANIMATION_HIDDEN,
|
||||
null /* translator */);
|
||||
SurfaceAnimationThread.getHandler().post(
|
||||
() -> mListener.onReady(mAnimationControl, typesReady));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user