From 58ba5bd62b3a80079b84eda475da0340189a9927 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Tue, 12 Apr 2022 15:13:29 -0400 Subject: [PATCH] Handle non-image URIs and quick copies Shows the "copied" UI if loading an image thumbnail fails. Also updates the clipboard overlay lifecycle to handle copies in quick succession better. Clips long text to 500 characters to speed loading of long text for the preview. Bug: 228618430 Bug: 228619169 Fix: 228618430 Fix: 228619169 Test: manual (using clipboard testing app) Change-Id: Iee63ef55be97acdb169e2f7f1c0fba828fc22f36 --- .../ClipboardOverlayController.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java index b7c4009a5aede..eef9d5bebd753 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java @@ -137,7 +137,6 @@ public class ClipboardOverlayController { private Runnable mOnSessionCompleteListener; - private InputMonitor mInputMonitor; private InputEventReceiver mInputEventReceiver; @@ -145,6 +144,7 @@ public class ClipboardOverlayController { private BroadcastReceiver mScreenshotReceiver; private boolean mBlockAttach = false; + private Animator mExitAnimator; public ClipboardOverlayController(Context context, BroadcastDispatcher broadcastDispatcher, @@ -200,6 +200,7 @@ public class ClipboardOverlayController { @Override public void onSwipeDismissInitiated(Animator animator) { mUiEventLogger.log(CLIPBOARD_OVERLAY_SWIPE_DISMISSED); + mExitAnimator = animator; animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { @@ -233,7 +234,6 @@ public class ClipboardOverlayController { mWindow.setContentView(mContainer); updateInsets(mWindowManager.getCurrentWindowMetrics().getWindowInsets()); mView.requestLayout(); - mView.post(this::animateIn); }); mTimeoutHandler.setOnTimeoutRunnable(() -> { @@ -273,6 +273,9 @@ public class ClipboardOverlayController { } void setClipData(ClipData clipData, String clipSource) { + if (mExitAnimator != null && mExitAnimator.isRunning()) { + mExitAnimator.cancel(); + } reset(); if (clipData == null || clipData.getItemCount() == 0) { showTextPreview(mContext.getResources().getString( @@ -305,6 +308,7 @@ public class ClipboardOverlayController { } else { mRemoteCopyChip.setVisibility(View.GONE); } + withWindowAttached(() -> mContainer.post(this::animateIn)); mTimeoutHandler.resetTimeout(); } @@ -411,7 +415,7 @@ public class ClipboardOverlayController { private void showTextPreview(CharSequence text) { mTextPreview.setVisibility(View.VISIBLE); mImagePreview.setVisibility(View.GONE); - mTextPreview.setText(text); + mTextPreview.setText(text.subSequence(0, Math.min(500, text.length()))); mEditChip.setVisibility(View.GONE); } @@ -428,10 +432,6 @@ public class ClipboardOverlayController { } private void showEditableImage(Uri uri) { - mTextPreview.setVisibility(View.GONE); - mImagePreview.setVisibility(View.VISIBLE); - mEditChip.setAlpha(1f); - mActionContainerBackground.setVisibility(View.VISIBLE); ContentResolver resolver = mContext.getContentResolver(); try { int size = mContext.getResources().getDimensionPixelSize(R.dimen.overlay_x_scale); @@ -441,7 +441,14 @@ public class ClipboardOverlayController { mImagePreview.setImageBitmap(thumbnail); } catch (IOException e) { Log.e(TAG, "Thumbnail loading failed", e); + showTextPreview( + mContext.getResources().getString(R.string.clipboard_overlay_text_copied)); + return; } + mTextPreview.setVisibility(View.GONE); + mImagePreview.setVisibility(View.VISIBLE); + mEditChip.setAlpha(1f); + mActionContainerBackground.setVisibility(View.VISIBLE); View.OnClickListener listener = v -> editImage(uri); mEditChip.setOnClickListener(listener); mEditChip.setContentDescription( @@ -472,12 +479,23 @@ public class ClipboardOverlayController { private void animateOut() { Animator anim = getExitAnimation(); anim.addListener(new AnimatorListenerAdapter() { + private boolean mCancelled; + + @Override + public void onAnimationCancel(Animator animation) { + super.onAnimationCancel(animation); + mCancelled = true; + } + @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - hideImmediate(); + if (!mCancelled) { + hideImmediate(); + } } }); + mExitAnimator = anim; anim.start(); } @@ -630,6 +648,7 @@ public class ClipboardOverlayController { private void reset() { mView.setTranslationX(0); mContainer.setAlpha(0); + mActionContainerBackground.setVisibility(View.GONE); resetActionChips(); mTimeoutHandler.cancelTimeout(); }