diff options
| author | Hyunyoung Song <hyunyoungs@google.com> | 2022-08-03 18:39:23 +0000 |
|---|---|---|
| committer | Hyunyoung Song <hyunyoungs@google.com> | 2022-08-19 05:15:29 +0000 |
| commit | 03110e20d97848f47c886487a9108f2d085bd0f3 (patch) | |
| tree | 48aff43ab38becdd1d5ced19cdf3d40743234d31 /core/java/android | |
| parent | b3728bc52b7454192c5c1184b06f6ae1ecb8d93f (diff) | |
Add passive callback for system-run insets animation
This passive window inset animation control listener
is used to for logging purpose when hide, show
method is called.
Test: atest InsetsControllerTest
Bug: 240192346
Change-Id: I399268ead9d04b356f10cc3e9ac1da9e31306e86
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/InsetsController.java | 26 | ||||
| -rw-r--r-- | core/java/android/view/PendingInsetsController.java | 16 | ||||
| -rw-r--r-- | core/java/android/view/WindowInsetsController.java | 15 |
3 files changed, 54 insertions, 3 deletions
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index cce3e8c84451..b81c221ae08a 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -314,6 +314,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation (int) (startValue.right + fraction * (endValue.right - startValue.right)), (int) (startValue.bottom + fraction * (endValue.bottom - startValue.bottom))); + /** Logging listener. */ + private WindowInsetsAnimationControlListener mLoggingListener; + /** * The default implementation of listener, to be used by InsetsController and InsetsPolicy to * animate insets. @@ -330,6 +333,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private final long mDurationMs; private final boolean mDisable; private final int mFloatingImeBottomInset; + private final WindowInsetsAnimationControlListener mLoggingListener; private final ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal = new ThreadLocal<AnimationHandler>() { @@ -343,7 +347,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation public InternalAnimationControlListener(boolean show, boolean hasAnimationCallbacks, @InsetsType int requestedTypes, @Behavior int behavior, boolean disable, - int floatingImeBottomInset) { + int floatingImeBottomInset, WindowInsetsAnimationControlListener loggingListener) { mShow = show; mHasAnimationCallbacks = hasAnimationCallbacks; mRequestedTypes = requestedTypes; @@ -351,12 +355,16 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation mDurationMs = calculateDurationMs(); mDisable = disable; mFloatingImeBottomInset = floatingImeBottomInset; + mLoggingListener = loggingListener; } @Override public void onReady(WindowInsetsAnimationController controller, int types) { mController = controller; if (DEBUG) Log.d(TAG, "default animation onReady types: " + types); + if (mLoggingListener != null) { + mLoggingListener.onReady(controller, types); + } if (mDisable) { onAnimationFinish(); @@ -410,6 +418,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation public void onFinished(WindowInsetsAnimationController controller) { if (DEBUG) Log.d(TAG, "InternalAnimationControlListener onFinished types:" + Type.toString(mRequestedTypes)); + if (mLoggingListener != null) { + mLoggingListener.onFinished(controller); + } } @Override @@ -420,6 +431,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } if (DEBUG) Log.d(TAG, "InternalAnimationControlListener onCancelled types:" + mRequestedTypes); + if (mLoggingListener != null) { + mLoggingListener.onCancelled(controller); + } } protected Interpolator getInsetsInterpolator() { @@ -1147,6 +1161,13 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation updateRequestedVisibilities(); } + // TODO(b/242962223): Make this setter restrictive. + @Override + public void setSystemDrivenInsetsAnimationLoggingListener( + @Nullable WindowInsetsAnimationControlListener listener) { + mLoggingListener = listener; + } + /** * @return Pair of (types ready to animate, IME ready to animate). */ @@ -1460,7 +1481,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean hasAnimationCallbacks = mHost.hasAnimationCallbacks(); final InternalAnimationControlListener listener = new InternalAnimationControlListener( show, hasAnimationCallbacks, types, mHost.getSystemBarsBehavior(), - skipAnim || mAnimationsDisabled, mHost.dipToPx(FLOATING_IME_BOTTOM_INSET_DP)); + skipAnim || mAnimationsDisabled, mHost.dipToPx(FLOATING_IME_BOTTOM_INSET_DP), + mLoggingListener); // 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. diff --git a/core/java/android/view/PendingInsetsController.java b/core/java/android/view/PendingInsetsController.java index c61baf6fb40c..3fe9110283a6 100644 --- a/core/java/android/view/PendingInsetsController.java +++ b/core/java/android/view/PendingInsetsController.java @@ -44,6 +44,7 @@ public class PendingInsetsController implements WindowInsetsController { private ArrayList<OnControllableInsetsChangedListener> mControllableInsetsChangedListeners = new ArrayList<>(); private int mCaptionInsetsHeight = 0; + private WindowInsetsAnimationControlListener mLoggingListener; @Override public void show(int types) { @@ -176,6 +177,9 @@ public class PendingInsetsController implements WindowInsetsController { controller.addOnControllableInsetsChangedListener( mControllableInsetsChangedListeners.get(i)); } + if (mLoggingListener != null) { + controller.setSystemDrivenInsetsAnimationLoggingListener(mLoggingListener); + } // Reset all state so it doesn't get applied twice just in case mRequests.clear(); @@ -184,7 +188,7 @@ public class PendingInsetsController implements WindowInsetsController { mAppearance = 0; mAppearanceMask = 0; mAnimationsDisabled = false; - + mLoggingListener = null; // After replaying, we forward everything directly to the replayed instance. mReplayedInsetsController = controller; } @@ -198,6 +202,16 @@ public class PendingInsetsController implements WindowInsetsController { } @Override + public void setSystemDrivenInsetsAnimationLoggingListener( + @Nullable WindowInsetsAnimationControlListener listener) { + if (mReplayedInsetsController != null) { + mReplayedInsetsController.setSystemDrivenInsetsAnimationLoggingListener(listener); + } else { + mLoggingListener = listener; + } + } + + @Override public void controlWindowInsetsAnimation(@InsetsType int types, long durationMillis, @Nullable Interpolator interpolator, CancellationSignal cancellationSignal, diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java index 227b9f402bba..63f9e13214ff 100644 --- a/core/java/android/view/WindowInsetsController.java +++ b/core/java/android/view/WindowInsetsController.java @@ -201,6 +201,21 @@ public interface WindowInsetsController { @NonNull WindowInsetsAnimationControlListener listener); /** + * Lets the application add non-controllable listener object that can be called back + * when animation is invoked by the system by host calling methods such as {@link #show} or + * {@link #hide}. + * + * The listener is supposed to be used for logging only, using the control or + * relying on the timing of the callback in any other way is not supported. + * + * @param listener The {@link WindowInsetsAnimationControlListener} that gets called when + * the animation is driven by the system and not the host + * @hide + */ + void setSystemDrivenInsetsAnimationLoggingListener( + @Nullable WindowInsetsAnimationControlListener listener); + + /** * Controls the appearance of system bars. * <p> * For example, the following statement adds {@link #APPEARANCE_LIGHT_STATUS_BARS}: |
