Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0cd5dd1 authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Separate callbacks for dismiss start and end

Bug: 219790596
Test: manual
Change-Id: I1ab46134b994cebff606345af62bf70f79a92e3f
Merged-In: I1ab46134b994cebff606345af62bf70f79a92e3f
(cherry picked from commit 11db9a36)
parent efc2678c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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());
+25 −6
Original line number Diff line number Diff line
@@ -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;
    }

    /**
+5 −1
Original line number Diff line number Diff line
@@ -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();
                    }
                });
+17 −7
Original line number Diff line number Diff line
@@ -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();
                }
            }
        });