diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java index a17ddc89818de..56e4d7ec18823 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java @@ -166,7 +166,7 @@ public class ClipboardOverlayController { mRemoteCopyChip = requireNonNull(mView.findViewById(R.id.remote_copy_chip)); mDismissButton = requireNonNull(mView.findViewById(R.id.dismiss_button)); - mView.setOnDismissCallback(this::hideImmediate); + mView.setOnDismissEndCallback(this::hideImmediate); mView.setOnInteractionCallback(mTimeoutHandler::resetTimeout); mDismissButton.setOnClickListener(view -> animateOut()); diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/DraggableConstraintLayout.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/DraggableConstraintLayout.java index 8843462413b51..a327809640db9 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/DraggableConstraintLayout.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/DraggableConstraintLayout.java @@ -16,6 +16,7 @@ package com.android.systemui.clipboardoverlay; +import android.animation.Animator; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; @@ -28,13 +29,16 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.android.systemui.R; import com.android.systemui.screenshot.SwipeDismissHandler; +import java.util.function.Consumer; + /** * ConstraintLayout that is draggable when touched in a specific region */ public class DraggableConstraintLayout extends ConstraintLayout { private final SwipeDismissHandler mSwipeDismissHandler; private final GestureDetector mSwipeDetector; - private Runnable mOnDismiss; + private Consumer mOnDismissInitiated; + private Runnable mOnDismissComplete; private Runnable mOnInteraction; public DraggableConstraintLayout(Context context) { @@ -58,9 +62,16 @@ public class DraggableConstraintLayout extends ConstraintLayout { } @Override - public void onDismiss() { - if (mOnDismiss != null) { - mOnDismiss.run(); + public void onSwipeDismissInitiated(Animator animator) { + if (mOnDismissInitiated != null) { + mOnDismissInitiated.accept(animator); + } + } + + @Override + public void onDismissComplete() { + if (mOnDismissComplete != null) { + mOnDismissComplete.run(); } } }); @@ -105,11 +116,19 @@ public class DraggableConstraintLayout extends ConstraintLayout { mSwipeDismissHandler.dismiss(); } + /** + * Set the callback to be run after view is dismissed (before animation; receives animator as + * input) + */ + public void setOnDismissStartCallback(Consumer callback) { + mOnDismissInitiated = callback; + } + /** * Set the callback to be run after view is dismissed */ - public void setOnDismissCallback(Runnable callback) { - mOnDismiss = callback; + public void setOnDismissEndCallback(Runnable callback) { + mOnDismissComplete = callback; } /** diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java index 4a9a1f1f055d5..1241e1de0ca47 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java @@ -403,12 +403,16 @@ public class ScreenshotView extends FrameLayout implements } @Override - public void onDismiss() { + public void onSwipeDismissInitiated(Animator animator) { if (DEBUG_DISMISS) { Log.d(ScreenshotView.TAG, "dismiss triggered via swipe gesture"); } mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SWIPE_DISMISSED, 0, mPackageName); + } + + @Override + public void onDismissComplete() { mCallbacks.onDismiss(); } }); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SwipeDismissHandler.java b/packages/SystemUI/src/com/android/systemui/screenshot/SwipeDismissHandler.java index 451fb1311ebb3..24b1249c3f98f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SwipeDismissHandler.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SwipeDismissHandler.java @@ -48,10 +48,15 @@ public class SwipeDismissHandler implements View.OnTouchListener { */ void onInteraction(); + /** + * Run when the view is dismissed (the distance threshold is met), pre-dismissal animation + */ + void onSwipeDismissInitiated(Animator animator); + /** * Run when the view is dismissed (the distance threshold is met), post-dismissal animation */ - void onDismiss(); + void onDismissComplete(); } private final View mView; @@ -89,7 +94,9 @@ public class SwipeDismissHandler implements View.OnTouchListener { return true; } if (isPastDismissThreshold()) { - dismiss(); + ValueAnimator dismissAnimator = createSwipeDismissAnimation(1); + mCallbacks.onSwipeDismissInitiated(dismissAnimator); + dismiss(dismissAnimator); } else { // if we've moved, but not past the threshold, start the return animation if (DEBUG_DISMISS) { @@ -117,7 +124,10 @@ public class SwipeDismissHandler implements View.OnTouchListener { float velocityY) { if (mView.getTranslationX() * velocityX > 0 && (mDismissAnimation == null || !mDismissAnimation.isRunning())) { - dismiss(velocityX / (float) 1000); + ValueAnimator dismissAnimator = + createSwipeDismissAnimation(velocityX / (float) 1000); + mCallbacks.onSwipeDismissInitiated(dismissAnimator); + dismiss(dismissAnimator); return true; } return false; @@ -160,11 +170,11 @@ public class SwipeDismissHandler implements View.OnTouchListener { * Start dismissal animation (will run onDismiss callback when animation complete) */ public void dismiss() { - dismiss(1); + dismiss(createSwipeDismissAnimation(1)); } - private void dismiss(float velocity) { - mDismissAnimation = createSwipeDismissAnimation(velocity); + private void dismiss(ValueAnimator animator) { + mDismissAnimation = animator; mDismissAnimation.addListener(new AnimatorListenerAdapter() { private boolean mCancelled; @@ -178,7 +188,7 @@ public class SwipeDismissHandler implements View.OnTouchListener { public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); if (!mCancelled) { - mCallbacks.onDismiss(); + mCallbacks.onDismissComplete(); } } });