diff options
5 files changed, 30 insertions, 13 deletions
diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 3255dd65b193..b3caac07aa61 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -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); diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java index 436a17c0de0b..c6ebc9e52e84 100644 --- a/core/java/android/view/InsetsAnimationThreadControlRunner.java +++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java @@ -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; diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index de7cc18531a9..f7fe19423b9a 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -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 */); diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index 613232fe1dfa..8fd1af801094 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -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; } diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index c387d338a3b2..f2f192686ad5 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -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)); } |