Separate callbacks for dismiss start and end
Bug: 219790596
Test: manual
Change-Id: I1ab46134b994cebff606345af62bf70f79a92e3f
Merged-In: I1ab46134b994cebff606345af62bf70f79a92e3f
(cherry picked from commit 11db9a363b)
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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<Animator> 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<Animator> 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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user