summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nan Wu <wnan@google.com> 2024-11-26 14:48:09 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-11-26 14:48:09 +0000
commite6db910fd4a58729cecc25f693d46619e54b2ba1 (patch)
tree97fc8ba0235322f5989a0c464c530213fc3162f5
parent0e71d51aaef5de0a6200bd9f480a55f388b8554c (diff)
parent7cdcdaae7627e4708076b759800132435dbfcc6e (diff)
Merge "ChooserActivity refreshes creator token" into main
-rw-r--r--java/src/com/android/intentresolver/chooser/DisplayResolveInfo.java2
-rw-r--r--java/src/com/android/intentresolver/chooser/SelectableTargetInfo.java1
-rw-r--r--java/src/com/android/intentresolver/chooser/TargetInfo.java20
3 files changed, 23 insertions, 0 deletions
diff --git a/java/src/com/android/intentresolver/chooser/DisplayResolveInfo.java b/java/src/com/android/intentresolver/chooser/DisplayResolveInfo.java
index f0674a27..e641944e 100644
--- a/java/src/com/android/intentresolver/chooser/DisplayResolveInfo.java
+++ b/java/src/com/android/intentresolver/chooser/DisplayResolveInfo.java
@@ -205,6 +205,7 @@ public class DisplayResolveInfo implements TargetInfo {
@Override
public boolean startAsCaller(Activity activity, Bundle options, int userId) {
TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, userId);
+ TargetInfo.refreshIntentCreatorToken(mResolvedIntent);
activity.startActivityAsCaller(mResolvedIntent, options, false, userId);
return true;
}
@@ -212,6 +213,7 @@ public class DisplayResolveInfo implements TargetInfo {
@Override
public boolean startAsUser(Activity activity, Bundle options, UserHandle user) {
TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier());
+ TargetInfo.refreshIntentCreatorToken(mResolvedIntent);
// TODO: is this equivalent to `startActivityAsCaller` with `ignoreTargetSecurity=true`? If
// so, we can consolidate on the one API method to show that this flag is the only
// distinction between `startAsCaller` and `startAsUser`. We can even bake that flag into
diff --git a/java/src/com/android/intentresolver/chooser/SelectableTargetInfo.java b/java/src/com/android/intentresolver/chooser/SelectableTargetInfo.java
index c4aa9021..2658f3e5 100644
--- a/java/src/com/android/intentresolver/chooser/SelectableTargetInfo.java
+++ b/java/src/com/android/intentresolver/chooser/SelectableTargetInfo.java
@@ -229,6 +229,7 @@ public final class SelectableTargetInfo extends ChooserTargetInfo {
intent.setComponent(getChooserTargetComponentName());
intent.putExtras(mChooserTargetIntentExtras);
TargetInfo.prepareIntentForCrossProfileLaunch(intent, userId);
+ TargetInfo.refreshIntentCreatorToken(intent);
// Important: we will ignore the target security checks in ActivityManager if and
// only if the ChooserTarget's target package is the same package where we got the
diff --git a/java/src/com/android/intentresolver/chooser/TargetInfo.java b/java/src/com/android/intentresolver/chooser/TargetInfo.java
index e5f40001..0935c6e8 100644
--- a/java/src/com/android/intentresolver/chooser/TargetInfo.java
+++ b/java/src/com/android/intentresolver/chooser/TargetInfo.java
@@ -17,7 +17,10 @@
package com.android.intentresolver.chooser;
+import static android.security.Flags.preventIntentRedirect;
+
import android.app.Activity;
+import android.app.ActivityManager;
import android.app.prediction.AppTarget;
import android.content.ComponentName;
import android.content.Context;
@@ -28,6 +31,7 @@ import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.service.chooser.ChooserTarget;
import android.text.TextUtils;
@@ -463,6 +467,22 @@ public interface TargetInfo {
}
/**
+ * refreshes intent's creatorToken with its current intent key fields. This allows
+ * ChooserActivity to still keep original creatorToken's creator uid after making changes to
+ * the intent and still keep it valid.
+ * @param intent the intent's creatorToken needs to up refreshed.
+ */
+ static void refreshIntentCreatorToken(Intent intent) {
+ if (!preventIntentRedirect()) return;
+ try {
+ intent.setCreatorToken(ActivityManager.getService().refreshIntentCreatorToken(
+ intent.cloneForCreatorToken()));
+ } catch (RemoteException e) {
+ throw new RuntimeException("Failure from system", e);
+ }
+ }
+
+ /**
* Derive a "complete" intent from a proposed `refinement` intent by merging it into a matching
* `base` intent, without modifying the filter-equality properties of the `base` intent, while
* still allowing the `refinement` to replace Share "payload" fields.