Loading core/java/android/view/InsetsAnimationControlImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -269,7 +269,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll } mShownOnFinish = shown; mFinished = true; setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, 1f /* alpha */, 1f /* fraction */, setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, mPendingAlpha, 1f /* fraction */, true /* allowWhenFinished */); if (DEBUG) Log.d(TAG, "notify control request finished for types: " + mTypes); Loading core/java/android/view/InsetsController.java +53 −15 Original line number Diff line number Diff line Loading @@ -189,16 +189,34 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } private static final String TAG = "InsetsController"; private static final int ANIMATION_DURATION_SHOW_MS = 275; private static final int ANIMATION_DURATION_HIDE_MS = 340; private static final int ANIMATION_DURATION_MOVE_IN_MS = 275; private static final int ANIMATION_DURATION_MOVE_OUT_MS = 340; private static final int ANIMATION_DURATION_FADE_IN_MS = 500; private static final int ANIMATION_DURATION_FADE_OUT_MS = 1500; private static final int ANIMATION_DELAY_DIM_MS = 500; private static final int ANIMATION_DURATION_SYNC_IME_MS = 285; private static final int ANIMATION_DURATION_UNSYNC_IME_MS = 200; private static final int PENDING_CONTROL_TIMEOUT_MS = 2000; public static final Interpolator SYSTEM_BARS_INTERPOLATOR = private static final Interpolator SYSTEM_BARS_INSETS_INTERPOLATOR = new PathInterpolator(0.4f, 0f, 0.2f, 1f); private static final Interpolator SYSTEM_BARS_ALPHA_INTERPOLATOR = new PathInterpolator(0.3f, 0f, 1f, 1f); private static final Interpolator SYSTEM_BARS_DIM_INTERPOLATOR = alphaFraction -> { // While playing dim animation, alphaFraction is changed from 1f to 0f. Here changes it to // time-based fraction for computing delay and interpolation. float fraction = 1 - alphaFraction; final float fractionDelay = (float) ANIMATION_DELAY_DIM_MS / ANIMATION_DURATION_FADE_OUT_MS; if (fraction <= fractionDelay) { return 1f; } else { float innerFraction = (fraction - fractionDelay) / (1f - fractionDelay); return 1f - SYSTEM_BARS_ALPHA_INTERPOLATOR.getInterpolation(innerFraction); } }; private static final Interpolator SYNC_IME_INTERPOLATOR = new PathInterpolator(0.2f, 0f, 0f, 1f); private static final Interpolator LINEAR_OUT_SLOW_IN_INTERPOLATOR = Loading @@ -206,6 +224,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private static final Interpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = new PathInterpolator(0.4f, 0f, 1f, 1f); /** The amount IME will move up/down when animating in floating mode. */ private static final int FLOATING_IME_BOTTOM_INSET_DP = -80; static final boolean DEBUG = false; static final boolean WARN = false; Loading Loading @@ -278,14 +299,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation public static class InternalAnimationControlListener implements WindowInsetsAnimationControlListener { /** The amount IME will move up/down when animating in floating mode. */ protected static final int FLOATING_IME_BOTTOM_INSET = -80; private WindowInsetsAnimationController mController; private ValueAnimator mAnimator; private final boolean mShow; private final boolean mHasAnimationCallbacks; private final @InsetsType int mRequestedTypes; private final @Behavior int mBehavior; private final long mDurationMs; private final boolean mDisable; private final int mFloatingImeBottomInset; Loading @@ -301,10 +320,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation }; public InternalAnimationControlListener(boolean show, boolean hasAnimationCallbacks, int requestedTypes, boolean disable, int floatingImeBottomInset) { @InsetsType int requestedTypes, @Behavior int behavior, boolean disable, int floatingImeBottomInset) { mShow = show; mHasAnimationCallbacks = hasAnimationCallbacks; mRequestedTypes = requestedTypes; mBehavior = behavior; mDurationMs = calculateDurationMs(); mDisable = disable; mFloatingImeBottomInset = floatingImeBottomInset; Loading Loading @@ -335,7 +356,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation Insets end = mShow ? controller.getShownStateInsets() : hiddenInsets; Interpolator insetsInterpolator = getInterpolator(); Interpolator insetsInterpolator = getInsetsInterpolator(); Interpolator alphaInterpolator = getAlphaInterpolator(); mAnimator.addUpdateListener(animation -> { float rawFraction = animation.getAnimatedFraction(); Loading Loading @@ -379,7 +400,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation + mRequestedTypes); } Interpolator getInterpolator() { protected Interpolator getInsetsInterpolator() { if ((mRequestedTypes & ime()) != 0) { if (mHasAnimationCallbacks) { return SYNC_IME_INTERPOLATOR; Loading @@ -389,7 +410,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return FAST_OUT_LINEAR_IN_INTERPOLATOR; } } else { return SYSTEM_BARS_INTERPOLATOR; if (mBehavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) { return SYSTEM_BARS_INSETS_INTERPOLATOR; } else { // Makes insets stay at the shown position. return input -> mShow ? 1f : 0f; } } } Loading @@ -405,7 +431,15 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return FAST_OUT_LINEAR_IN_INTERPOLATOR; } } else { if (mBehavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) { return input -> 1f; } else { if (mShow) { return SYSTEM_BARS_ALPHA_INTERPOLATOR; } else { return SYSTEM_BARS_DIM_INTERPOLATOR; } } } } Loading @@ -429,7 +463,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return ANIMATION_DURATION_UNSYNC_IME_MS; } } else { return mShow ? ANIMATION_DURATION_SHOW_MS : ANIMATION_DURATION_HIDE_MS; if (mBehavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) { return mShow ? ANIMATION_DURATION_MOVE_IN_MS : ANIMATION_DURATION_MOVE_OUT_MS; } else { return mShow ? ANIMATION_DURATION_FADE_IN_MS : ANIMATION_DURATION_FADE_OUT_MS; } } } } Loading Loading @@ -1358,14 +1396,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean hasAnimationCallbacks = mHost.hasAnimationCallbacks(); final InternalAnimationControlListener listener = new InternalAnimationControlListener( show, hasAnimationCallbacks, types, skipAnim || mAnimationsDisabled, mHost.dipToPx(InternalAnimationControlListener.FLOATING_IME_BOTTOM_INSET)); show, hasAnimationCallbacks, types, mHost.getSystemBarsBehavior(), skipAnim || mAnimationsDisabled, mHost.dipToPx(FLOATING_IME_BOTTOM_INSET_DP)); // We are about to playing the default animation (show/hide). Passing a null frame indicates // the controlled types should be animated regardless of the frame. controlAnimationUnchecked( types, null /* cancellationSignal */, listener, null /* frame */, fromIme, listener.getDurationMs(), listener.getInterpolator(), listener.getDurationMs(), listener.getInsetsInterpolator(), show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, show ? LAYOUT_INSETS_DURING_ANIMATION_SHOWN : LAYOUT_INSETS_DURING_ANIMATION_HIDDEN, !hasAnimationCallbacks /* useInsetsAnimationThread */); Loading services/core/java/com/android/server/wm/InsetsPolicy.java +4 −5 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.view.InsetsController.ANIMATION_TYPE_SHOW; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.SyncRtSurfaceTransactionApplier.applyParams; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; Loading Loading @@ -458,10 +459,8 @@ class InsetsPolicy { InsetsPolicyAnimationControlCallbacks mControlCallbacks; InsetsPolicyAnimationControlListener(boolean show, Runnable finishCallback, int types) { super(show, false /* hasCallbacks */, types, false /* disable */, (int) (mDisplayContent.getDisplayMetrics().density * FLOATING_IME_BOTTOM_INSET + 0.5f)); super(show, false /* hasCallbacks */, types, BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, false /* disable */, 0 /* floatingImeBottomInsets */); mFinishCallback = finishCallback; mControlCallbacks = new InsetsPolicyAnimationControlCallbacks(this); } Loading Loading @@ -497,7 +496,7 @@ class InsetsPolicy { // the controlled types should be animated regardless of the frame. mAnimationControl = new InsetsAnimationControlImpl(controls, null /* frame */, state, mListener, typesReady, this, mListener.getDurationMs(), InsetsController.SYSTEM_BARS_INTERPOLATOR, mListener.getDurationMs(), getInsetsInterpolator(), show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, null /* translator */); SurfaceAnimationThread.getHandler().post( () -> mListener.onReady(mAnimationControl, typesReady)); Loading Loading
core/java/android/view/InsetsAnimationControlImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -269,7 +269,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll } mShownOnFinish = shown; mFinished = true; setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, 1f /* alpha */, 1f /* fraction */, setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, mPendingAlpha, 1f /* fraction */, true /* allowWhenFinished */); if (DEBUG) Log.d(TAG, "notify control request finished for types: " + mTypes); Loading
core/java/android/view/InsetsController.java +53 −15 Original line number Diff line number Diff line Loading @@ -189,16 +189,34 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } private static final String TAG = "InsetsController"; private static final int ANIMATION_DURATION_SHOW_MS = 275; private static final int ANIMATION_DURATION_HIDE_MS = 340; private static final int ANIMATION_DURATION_MOVE_IN_MS = 275; private static final int ANIMATION_DURATION_MOVE_OUT_MS = 340; private static final int ANIMATION_DURATION_FADE_IN_MS = 500; private static final int ANIMATION_DURATION_FADE_OUT_MS = 1500; private static final int ANIMATION_DELAY_DIM_MS = 500; private static final int ANIMATION_DURATION_SYNC_IME_MS = 285; private static final int ANIMATION_DURATION_UNSYNC_IME_MS = 200; private static final int PENDING_CONTROL_TIMEOUT_MS = 2000; public static final Interpolator SYSTEM_BARS_INTERPOLATOR = private static final Interpolator SYSTEM_BARS_INSETS_INTERPOLATOR = new PathInterpolator(0.4f, 0f, 0.2f, 1f); private static final Interpolator SYSTEM_BARS_ALPHA_INTERPOLATOR = new PathInterpolator(0.3f, 0f, 1f, 1f); private static final Interpolator SYSTEM_BARS_DIM_INTERPOLATOR = alphaFraction -> { // While playing dim animation, alphaFraction is changed from 1f to 0f. Here changes it to // time-based fraction for computing delay and interpolation. float fraction = 1 - alphaFraction; final float fractionDelay = (float) ANIMATION_DELAY_DIM_MS / ANIMATION_DURATION_FADE_OUT_MS; if (fraction <= fractionDelay) { return 1f; } else { float innerFraction = (fraction - fractionDelay) / (1f - fractionDelay); return 1f - SYSTEM_BARS_ALPHA_INTERPOLATOR.getInterpolation(innerFraction); } }; private static final Interpolator SYNC_IME_INTERPOLATOR = new PathInterpolator(0.2f, 0f, 0f, 1f); private static final Interpolator LINEAR_OUT_SLOW_IN_INTERPOLATOR = Loading @@ -206,6 +224,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private static final Interpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = new PathInterpolator(0.4f, 0f, 1f, 1f); /** The amount IME will move up/down when animating in floating mode. */ private static final int FLOATING_IME_BOTTOM_INSET_DP = -80; static final boolean DEBUG = false; static final boolean WARN = false; Loading Loading @@ -278,14 +299,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation public static class InternalAnimationControlListener implements WindowInsetsAnimationControlListener { /** The amount IME will move up/down when animating in floating mode. */ protected static final int FLOATING_IME_BOTTOM_INSET = -80; private WindowInsetsAnimationController mController; private ValueAnimator mAnimator; private final boolean mShow; private final boolean mHasAnimationCallbacks; private final @InsetsType int mRequestedTypes; private final @Behavior int mBehavior; private final long mDurationMs; private final boolean mDisable; private final int mFloatingImeBottomInset; Loading @@ -301,10 +320,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation }; public InternalAnimationControlListener(boolean show, boolean hasAnimationCallbacks, int requestedTypes, boolean disable, int floatingImeBottomInset) { @InsetsType int requestedTypes, @Behavior int behavior, boolean disable, int floatingImeBottomInset) { mShow = show; mHasAnimationCallbacks = hasAnimationCallbacks; mRequestedTypes = requestedTypes; mBehavior = behavior; mDurationMs = calculateDurationMs(); mDisable = disable; mFloatingImeBottomInset = floatingImeBottomInset; Loading Loading @@ -335,7 +356,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation Insets end = mShow ? controller.getShownStateInsets() : hiddenInsets; Interpolator insetsInterpolator = getInterpolator(); Interpolator insetsInterpolator = getInsetsInterpolator(); Interpolator alphaInterpolator = getAlphaInterpolator(); mAnimator.addUpdateListener(animation -> { float rawFraction = animation.getAnimatedFraction(); Loading Loading @@ -379,7 +400,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation + mRequestedTypes); } Interpolator getInterpolator() { protected Interpolator getInsetsInterpolator() { if ((mRequestedTypes & ime()) != 0) { if (mHasAnimationCallbacks) { return SYNC_IME_INTERPOLATOR; Loading @@ -389,7 +410,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return FAST_OUT_LINEAR_IN_INTERPOLATOR; } } else { return SYSTEM_BARS_INTERPOLATOR; if (mBehavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) { return SYSTEM_BARS_INSETS_INTERPOLATOR; } else { // Makes insets stay at the shown position. return input -> mShow ? 1f : 0f; } } } Loading @@ -405,7 +431,15 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return FAST_OUT_LINEAR_IN_INTERPOLATOR; } } else { if (mBehavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) { return input -> 1f; } else { if (mShow) { return SYSTEM_BARS_ALPHA_INTERPOLATOR; } else { return SYSTEM_BARS_DIM_INTERPOLATOR; } } } } Loading @@ -429,7 +463,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return ANIMATION_DURATION_UNSYNC_IME_MS; } } else { return mShow ? ANIMATION_DURATION_SHOW_MS : ANIMATION_DURATION_HIDE_MS; if (mBehavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) { return mShow ? ANIMATION_DURATION_MOVE_IN_MS : ANIMATION_DURATION_MOVE_OUT_MS; } else { return mShow ? ANIMATION_DURATION_FADE_IN_MS : ANIMATION_DURATION_FADE_OUT_MS; } } } } Loading Loading @@ -1358,14 +1396,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean hasAnimationCallbacks = mHost.hasAnimationCallbacks(); final InternalAnimationControlListener listener = new InternalAnimationControlListener( show, hasAnimationCallbacks, types, skipAnim || mAnimationsDisabled, mHost.dipToPx(InternalAnimationControlListener.FLOATING_IME_BOTTOM_INSET)); show, hasAnimationCallbacks, types, mHost.getSystemBarsBehavior(), skipAnim || mAnimationsDisabled, mHost.dipToPx(FLOATING_IME_BOTTOM_INSET_DP)); // We are about to playing the default animation (show/hide). Passing a null frame indicates // the controlled types should be animated regardless of the frame. controlAnimationUnchecked( types, null /* cancellationSignal */, listener, null /* frame */, fromIme, listener.getDurationMs(), listener.getInterpolator(), listener.getDurationMs(), listener.getInsetsInterpolator(), show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, show ? LAYOUT_INSETS_DURING_ANIMATION_SHOWN : LAYOUT_INSETS_DURING_ANIMATION_HIDDEN, !hasAnimationCallbacks /* useInsetsAnimationThread */); Loading
services/core/java/com/android/server/wm/InsetsPolicy.java +4 −5 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.view.InsetsController.ANIMATION_TYPE_SHOW; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.SyncRtSurfaceTransactionApplier.applyParams; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; Loading Loading @@ -458,10 +459,8 @@ class InsetsPolicy { InsetsPolicyAnimationControlCallbacks mControlCallbacks; InsetsPolicyAnimationControlListener(boolean show, Runnable finishCallback, int types) { super(show, false /* hasCallbacks */, types, false /* disable */, (int) (mDisplayContent.getDisplayMetrics().density * FLOATING_IME_BOTTOM_INSET + 0.5f)); super(show, false /* hasCallbacks */, types, BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, false /* disable */, 0 /* floatingImeBottomInsets */); mFinishCallback = finishCallback; mControlCallbacks = new InsetsPolicyAnimationControlCallbacks(this); } Loading Loading @@ -497,7 +496,7 @@ class InsetsPolicy { // the controlled types should be animated regardless of the frame. mAnimationControl = new InsetsAnimationControlImpl(controls, null /* frame */, state, mListener, typesReady, this, mListener.getDurationMs(), InsetsController.SYSTEM_BARS_INTERPOLATOR, mListener.getDurationMs(), getInsetsInterpolator(), show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, null /* translator */); SurfaceAnimationThread.getHandler().post( () -> mListener.onReady(mAnimationControl, typesReady)); Loading