Add ClipData to clipboard REMOTE_COPY intent

Propagate the clipData from the clipboard URI to the app receiving
the REMOTE_COPY intent (including URI permissions). Also limits
to a configurable component.

Bug: 217724692
Bug: 217739484
Test: manual, using test app implementing REMOTE_COPY
Change-Id: Ie9f700c2dc546960334c3a0f5051f75d08b897cb
This commit is contained in:
Miranda Kephart
2022-03-25 13:15:52 -04:00
parent 771ad1e7d1
commit daa7263f1f
2 changed files with 26 additions and 18 deletions

View File

@@ -446,6 +446,10 @@
This name is in the ComponentName flattened format (package/class) -->
<string name="config_screenshotEditor" translatable="false"></string>
<!-- Remote copy default activity. Must handle REMOTE_COPY_ACTION intents.
This name is in the ComponentName flattened format (package/class) -->
<string name="config_remoteCopyPackage" translatable="false"></string>
<!-- On debuggable builds, alert the user if SystemUI PSS goes over this number (in kb) -->
<integer name="watch_heap_limit">256000</integer>

View File

@@ -215,17 +215,6 @@ public class ClipboardOverlayController {
mRemoteCopyChip.setIcon(
Icon.createWithResource(mContext, R.drawable.ic_baseline_devices_24), true);
// Only show remote copy if it's available.
PackageManager packageManager = mContext.getPackageManager();
if (packageManager.resolveActivity(getRemoteCopyIntent(), 0) != null) {
mRemoteCopyChip.setOnClickListener((v) -> {
showNearby();
});
mRemoteCopyChip.setAlpha(1f);
} else {
mRemoteCopyChip.setVisibility(View.GONE);
}
attachWindow();
withWindowAttached(() -> {
mWindow.setContentView(mContainer);
@@ -286,6 +275,20 @@ public class ClipboardOverlayController {
showTextPreview(
mContext.getResources().getString(R.string.clipboard_overlay_text_copied));
}
Intent remoteCopyIntent = getRemoteCopyIntent(clipData);
// Only show remote copy if it's available.
PackageManager packageManager = mContext.getPackageManager();
if (remoteCopyIntent != null && packageManager.resolveActivity(
remoteCopyIntent, PackageManager.ResolveInfoFlags.of(0)) != null) {
mRemoteCopyChip.setOnClickListener((v) -> {
mUiEventLogger.log(CLIPBOARD_OVERLAY_REMOTE_COPY_TAPPED);
mContext.startActivity(remoteCopyIntent);
animateOut();
});
mRemoteCopyChip.setAlpha(1f);
} else {
mRemoteCopyChip.setVisibility(View.GONE);
}
mTimeoutHandler.resetTimeout();
}
@@ -389,12 +392,6 @@ public class ClipboardOverlayController {
animateOut();
}
private void showNearby() {
mUiEventLogger.log(CLIPBOARD_OVERLAY_REMOTE_COPY_TAPPED);
mContext.startActivity(getRemoteCopyIntent());
animateOut();
}
private void showTextPreview(CharSequence text) {
mTextPreview.setVisibility(View.VISIBLE);
mImagePreview.setVisibility(View.GONE);
@@ -434,8 +431,15 @@ public class ClipboardOverlayController {
mImagePreview.setOnClickListener(listener);
}
private Intent getRemoteCopyIntent() {
private Intent getRemoteCopyIntent(ClipData clipData) {
String remoteCopyPackage = mContext.getString(R.string.config_remoteCopyPackage);
if (TextUtils.isEmpty(remoteCopyPackage)) {
return null;
}
Intent nearbyIntent = new Intent(REMOTE_COPY_ACTION);
nearbyIntent.setComponent(ComponentName.unflattenFromString(remoteCopyPackage));
nearbyIntent.setClipData(clipData);
nearbyIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
return nearbyIntent;
}