diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index 6f07dd7a24e82..f90044027b092 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -16,6 +16,7 @@ package android.content.pm; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; @@ -106,6 +107,14 @@ public class ResolveInfo implements Parcelable { */ public int match; + /** + * UserHandle of originating user for ResolveInfo. This will help caller distinguish cross + * profile results from intent resolution. + * @hide + */ + @Nullable + public UserHandle userHandle; + /** * Only set when returned by * {@link PackageManager#queryIntentActivityOptions}, this tells you @@ -418,6 +427,7 @@ public class ResolveInfo implements Parcelable { handleAllWebDataURI = orig.handleAllWebDataURI; mAutoResolutionAllowed = orig.mAutoResolutionAllowed; isInstantAppAvailable = orig.isInstantAppAvailable; + userHandle = orig.userHandle; } public String toString() { @@ -441,6 +451,10 @@ public class ResolveInfo implements Parcelable { sb.append(" targetUserId="); sb.append(targetUserId); } + + sb.append(" userHandle="); + sb.append(userHandle); + sb.append('}'); return sb.toString(); } @@ -483,6 +497,7 @@ public class ResolveInfo implements Parcelable { dest.writeInt(handleAllWebDataURI ? 1 : 0); dest.writeInt(mAutoResolutionAllowed ? 1 : 0); dest.writeInt(isInstantAppAvailable ? 1 : 0); + dest.writeInt(userHandle != null ? userHandle.getIdentifier() : UserHandle.USER_CURRENT); } public static final @android.annotation.NonNull Creator CREATOR @@ -532,6 +547,10 @@ public class ResolveInfo implements Parcelable { handleAllWebDataURI = source.readInt() != 0; mAutoResolutionAllowed = source.readInt() != 0; isInstantAppAvailable = source.readInt() != 0; + int userHandleId = source.readInt(); + if (userHandleId != UserHandle.USER_CURRENT) { + userHandle = UserHandle.of(userHandleId); + } } public static class DisplayNameComparator diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index c6700e62afa00..2752104371435 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -1755,6 +1755,7 @@ public class ComputerEngine implements Computer { forwardingResolveInfo.isDefault = true; forwardingResolveInfo.filter = new IntentFilter(filter.getIntentFilter()); forwardingResolveInfo.targetUserId = targetUserId; + forwardingResolveInfo.userHandle = UserHandle.of(sourceUserId); return forwardingResolveInfo; } diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java index 970f8ceabca58..a13c568f87a6d 100644 --- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java +++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java @@ -281,6 +281,7 @@ final class ResolveIntentHelper { ri.handleAllWebDataURI = browserCount == n; ri.activityInfo = new ActivityInfo(ri.activityInfo); ri.activityInfo.labelRes = ResolverActivity.getLabelRes(intent.getAction()); + if (ri.userHandle == null) ri.userHandle = UserHandle.of(userId); // If all of the options come from the same package, show the application's // label and icon instead of the generic resolver's. // Some calls like Intent.resolveActivityInfo query the ResolveInfo from here diff --git a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java index 842f685d482ed..35c42a310efd9 100644 --- a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java +++ b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java @@ -35,6 +35,7 @@ import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.DebugUtils; @@ -1197,6 +1198,7 @@ public class ComponentResolver extends ComponentResolverLocked implements res.iconResourceId = info.getIcon(); res.system = res.activityInfo.applicationInfo.isSystemApp(); res.isInstantAppAvailable = userState.isInstantApp(); + res.userHandle = UserHandle.of(userId); return res; }