summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-08-12 18:22:37 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-08-12 18:22:37 +0000
commit35f0119787662f8d742aac4eb17d0992f78a4254 (patch)
tree8ea249efd8ed7f905682c1c97e97b8574af0126d /java/src
parenteaa7d09b6075e8bbb00904f76bf0c81d655bab46 (diff)
parent51dcb3e094bad99d2f3e8d3e692a7dd0ebcf7d30 (diff)
Merge "Don't send target selection callbacks crossprofile" into main
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java8
-rw-r--r--java/src/com/android/intentresolver/ui/ShareResultSender.kt54
2 files changed, 43 insertions, 19 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index bc46ca22..8c6c7b7f 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -1093,7 +1093,7 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
if (cti.startAsCaller(this, options, user.getIdentifier())) {
// Prevent sending a second chooser result when starting the edit action intent.
if (!cti.getTargetIntent().hasExtra(EDIT_SOURCE)) {
- maybeSendShareResult(cti);
+ maybeSendShareResult(cti, user);
}
maybeLogCrossProfileTargetLaunch(cti, user);
}
@@ -1645,11 +1645,13 @@ public class ChooserActivity extends Hilt_ChooserActivity implements
return result;
}
- private void maybeSendShareResult(TargetInfo cti) {
+ private void maybeSendShareResult(TargetInfo cti, UserHandle launchedAsUser) {
if (mShareResultSender != null) {
final ComponentName target = cti.getResolvedComponentName();
if (target != null) {
- mShareResultSender.onComponentSelected(target, cti.isChooserTargetInfo());
+ boolean crossProfile = !UserHandle.of(UserHandle.myUserId()).equals(launchedAsUser);
+ mShareResultSender.onComponentSelected(
+ target, cti.isChooserTargetInfo(), crossProfile);
}
}
}
diff --git a/java/src/com/android/intentresolver/ui/ShareResultSender.kt b/java/src/com/android/intentresolver/ui/ShareResultSender.kt
index 7be2076e..dce477ec 100644
--- a/java/src/com/android/intentresolver/ui/ShareResultSender.kt
+++ b/java/src/com/android/intentresolver/ui/ShareResultSender.kt
@@ -47,7 +47,7 @@ private const val TAG = "ShareResultSender"
/** Reports the result of a share to another process across binder, via an [IntentSender] */
interface ShareResultSender {
/** Reports user selection of an activity to launch from the provided choices. */
- fun onComponentSelected(component: ComponentName, directShare: Boolean)
+ fun onComponentSelected(component: ComponentName, directShare: Boolean, crossProfile: Boolean)
/** Reports user invocation of a built-in system action. See [ShareAction]. */
fun onActionSelected(action: ShareAction)
@@ -88,11 +88,15 @@ class ShareResultSenderImpl(
IntentSenderDispatcher { sender, intent -> sender.dispatchIntent(context, intent) }
)
- override fun onComponentSelected(component: ComponentName, directShare: Boolean) {
- Log.i(TAG, "onComponentSelected: $component directShare=$directShare")
+ override fun onComponentSelected(
+ component: ComponentName,
+ directShare: Boolean,
+ crossProfile: Boolean
+ ) {
+ Log.i(TAG, "onComponentSelected: $component directShare=$directShare cross=$crossProfile")
scope.launch {
- val intent = createChosenComponentIntent(component, directShare)
- intentDispatcher.dispatchIntent(resultSender, intent)
+ val intent = createChosenComponentIntent(component, directShare, crossProfile)
+ intent?.let { intentDispatcher.dispatchIntent(resultSender, it) }
}
}
@@ -112,20 +116,38 @@ class ShareResultSenderImpl(
private suspend fun createChosenComponentIntent(
component: ComponentName,
direct: Boolean,
- ): Intent {
- // Add extra with component name for backwards compatibility.
- val intent: Intent = Intent().putExtra(Intent.EXTRA_CHOSEN_COMPONENT, component)
-
- // Add ChooserResult value for Android V+
+ crossProfile: Boolean,
+ ): Intent? {
if (flags.enableChooserResult() && chooserResultSupported(callerUid)) {
- intent.putExtra(
- Intent.EXTRA_CHOOSER_RESULT,
- ChooserResult(CHOOSER_RESULT_SELECTED_COMPONENT, component, direct)
- )
+ if (crossProfile) {
+ Log.i(TAG, "Redacting package from cross-profile ${Intent.EXTRA_CHOOSER_RESULT}")
+ return Intent()
+ .putExtra(
+ Intent.EXTRA_CHOOSER_RESULT,
+ ChooserResult(CHOOSER_RESULT_UNKNOWN, null, direct)
+ )
+ } else {
+ // Add extra with component name for backwards compatibility.
+ val intent: Intent = Intent().putExtra(Intent.EXTRA_CHOSEN_COMPONENT, component)
+
+ // Add ChooserResult value for Android V+
+ intent.putExtra(
+ Intent.EXTRA_CHOOSER_RESULT,
+ ChooserResult(CHOOSER_RESULT_SELECTED_COMPONENT, component, direct)
+ )
+ return intent
+ }
} else {
- Log.i(TAG, "Not including ${Intent.EXTRA_CHOOSER_RESULT}")
+ if (crossProfile) {
+ // We can only send cross-profile results in the new ChooserResult format.
+ Log.i(TAG, "Omitting selection callback for cross-profile target")
+ return null
+ } else {
+ val intent: Intent = Intent().putExtra(Intent.EXTRA_CHOSEN_COMPONENT, component)
+ Log.i(TAG, "Not including ${Intent.EXTRA_CHOOSER_RESULT}")
+ return intent
+ }
}
- return intent
}
@ResultType