From 6e294efacf5bec9f28cdce305e7cabfb008599d7 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 31 Jan 2022 10:36:32 -0500 Subject: [PATCH] Don't show clipboard actions for the source app If the user copies a link from (say) chrome, we don't want to show an action to open the link back in chrome. This change suppresses actions where the target package is the same as the source package. Bug: 216658864 Test: manual Change-Id: I4f2ee7ac30b2e54c702e3c9149f77eb5dd5d6243 --- packages/SystemUI/AndroidManifest.xml | 1 + .../SystemUI/res/layout/clipboard_overlay.xml | 6 ++-- .../clipboardoverlay/ClipboardListener.java | 3 +- .../ClipboardOverlayController.java | 31 +++++++++++-------- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index f35f5dd0c3aed..2e6a58f7f5daa 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -301,6 +301,7 @@ + diff --git a/packages/SystemUI/res/layout/clipboard_overlay.xml b/packages/SystemUI/res/layout/clipboard_overlay.xml index 2a3761e4ca056..7e31909613ee8 100644 --- a/packages/SystemUI/res/layout/clipboard_overlay.xml +++ b/packages/SystemUI/res/layout/clipboard_overlay.xml @@ -17,6 +17,7 @@ @@ -50,7 +51,8 @@ + android:layout_height="wrap_content" + android:animateLayoutChanges="true"> { // Session is complete, free memory until it's needed again. mClipboardOverlayController = null; diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java index b6bcb871ff183..12759f489a267 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java @@ -182,6 +182,7 @@ public class ClipboardOverlayController { withWindowAttached(() -> { mWindow.setContentView(mView); updateInsets(mWindowManager.getCurrentWindowMetrics().getWindowInsets()); + mView.requestLayout(); mView.post(this::animateIn); }); @@ -213,7 +214,7 @@ public class ClipboardOverlayController { mContext.sendBroadcast(new Intent(COPY_OVERLAY_ACTION), SELF_PERMISSION); } - void setClipData(ClipData clipData) { + void setClipData(ClipData clipData, String clipSource) { reset(); if (clipData == null || clipData.getItemCount() == 0) { showTextPreview(mContext.getResources().getString( @@ -221,7 +222,7 @@ public class ClipboardOverlayController { } else if (!TextUtils.isEmpty(clipData.getItemAt(0).getText())) { ClipData.Item item = clipData.getItemAt(0); if (item.getTextLinks() != null) { - AsyncTask.execute(() -> classifyText(clipData.getItemAt(0))); + AsyncTask.execute(() -> classifyText(clipData.getItemAt(0), clipSource)); } showEditableText(item.getText()); } else if (clipData.getItemAt(0).getUri() != null) { @@ -238,7 +239,7 @@ public class ClipboardOverlayController { mOnSessionCompleteListener = runnable; } - private void classifyText(ClipData.Item item) { + private void classifyText(ClipData.Item item, String source) { ArrayList actions = new ArrayList<>(); for (TextLinks.TextLink link : item.getTextLinks().getLinks()) { TextClassification classification = mTextClassifier.classifyText( @@ -246,14 +247,14 @@ public class ClipboardOverlayController { actions.addAll(classification.getActions()); } mView.post(() -> { - for (ScreenshotActionChip chip : mActionChips) { - mActionContainer.removeView(chip); - } - mActionChips.clear(); + resetActionChips(); for (RemoteAction action : actions) { - ScreenshotActionChip chip = constructActionChip(action); - mActionContainer.addView(chip); - mActionChips.add(chip); + Intent targetIntent = action.getActionIntent().getIntent(); + if (!TextUtils.equals(source, targetIntent.getComponent().getPackageName())) { + ScreenshotActionChip chip = constructActionChip(action); + mActionContainer.addView(chip); + mActionChips.add(chip); + } } }); } @@ -451,13 +452,17 @@ public class ClipboardOverlayController { } } - private void reset() { - mView.setTranslationX(0); - mView.setAlpha(0); + private void resetActionChips() { for (ScreenshotActionChip chip : mActionChips) { mActionContainer.removeView(chip); } mActionChips.clear(); + } + + private void reset() { + mView.setTranslationX(0); + mView.setAlpha(0); + resetActionChips(); mTimeoutHandler.cancelTimeout(); }