diff --git a/api/system-current.txt b/api/system-current.txt index c54667820d2c9..263711e830e43 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -10194,7 +10194,8 @@ package android.content.pm { public final class EphemeralResolveInfo implements android.os.Parcelable { ctor public deprecated EphemeralResolveInfo(android.net.Uri, java.lang.String, java.util.List); - ctor public EphemeralResolveInfo(android.content.pm.EphemeralResolveInfo.EphemeralDigest, java.lang.String, java.util.List); + ctor public deprecated EphemeralResolveInfo(android.content.pm.EphemeralResolveInfo.EphemeralDigest, java.lang.String, java.util.List); + ctor public EphemeralResolveInfo(android.content.pm.EphemeralResolveInfo.EphemeralDigest, java.lang.String, java.util.List, int); ctor public EphemeralResolveInfo(java.lang.String, java.lang.String, java.util.List); method public int describeContents(); method public byte[] getDigestBytes(); @@ -10202,6 +10203,7 @@ package android.content.pm { method public deprecated java.util.List getFilters(); method public java.util.List getIntentFilters(); method public java.lang.String getPackageName(); + method public int getVersionCode(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; field public static final java.lang.String SHA_ALGORITHM = "SHA-256"; diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index c5500949b25fe..90f08cd8bc812 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -3965,6 +3965,12 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_EPHEMERAL_TOKEN = "android.intent.extra.EPHEMERAL_TOKEN"; + /** + * The version code of the app to install components from. + * @hide + */ + public static final String EXTRA_VERSION_CODE = "android.intent.extra.VERSION_CODE"; + /** * A Bundle forming a mapping of potential target package names to different extras Bundles * to add to the default intent extras in {@link #EXTRA_INTENT} when used with diff --git a/core/java/android/content/pm/EphemeralResolveInfo.java b/core/java/android/content/pm/EphemeralResolveInfo.java index f6200886cd71f..1d7b8f28453c3 100644 --- a/core/java/android/content/pm/EphemeralResolveInfo.java +++ b/core/java/android/content/pm/EphemeralResolveInfo.java @@ -43,9 +43,11 @@ public final class EphemeralResolveInfo implements Parcelable { private final String mPackageName; /** The filters used to match domain */ private final List mFilters; + /** The version code of the app that this class resolves to */ + private final int mVersionCode; /** Filters only for legacy clients */ @Deprecated - private List mLegacyFilters; + private final List mLegacyFilters; @Deprecated public EphemeralResolveInfo(@NonNull Uri uri, @NonNull String packageName, @@ -59,10 +61,17 @@ public final class EphemeralResolveInfo implements Parcelable { mFilters.add(new EphemeralIntentFilter(packageName, filters)); mLegacyFilters = new ArrayList(filters.size()); mLegacyFilters.addAll(filters); + mVersionCode = -1; + } + + @Deprecated + public EphemeralResolveInfo(@NonNull EphemeralDigest digest, @Nullable String packageName, + @Nullable List filters) { + this(digest, packageName, filters, -1 /*versionCode*/); } public EphemeralResolveInfo(@NonNull EphemeralDigest digest, @Nullable String packageName, - @Nullable List filters) { + @Nullable List filters, int versionConde) { // validate arguments if ((packageName == null && (filters != null && filters.size() != 0)) || (packageName != null && (filters == null || filters.size() == 0))) { @@ -75,7 +84,9 @@ public final class EphemeralResolveInfo implements Parcelable { } else { mFilters = null; } + mLegacyFilters = null; mPackageName = packageName; + mVersionCode = versionConde; } public EphemeralResolveInfo(@NonNull String hostName, @Nullable String packageName, @@ -88,6 +99,7 @@ public final class EphemeralResolveInfo implements Parcelable { mPackageName = in.readString(); mFilters = new ArrayList(); in.readList(mFilters, null /*loader*/); + mVersionCode = in.readInt(); mLegacyFilters = new ArrayList(); in.readList(mLegacyFilters, null /*loader*/); } @@ -104,15 +116,19 @@ public final class EphemeralResolveInfo implements Parcelable { return mPackageName; } + public List getIntentFilters() { + return mFilters; + } + + public int getVersionCode() { + return mVersionCode; + } + @Deprecated public List getFilters() { return mLegacyFilters; } - public List getIntentFilters() { - return mFilters; - } - @Override public int describeContents() { return 0; @@ -123,6 +139,7 @@ public final class EphemeralResolveInfo implements Parcelable { out.writeParcelable(mDigest, flags); out.writeString(mPackageName); out.writeList(mFilters); + out.writeInt(mVersionCode); out.writeList(mLegacyFilters); } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 26d2ee2e15471..873f2b7a04b65 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -460,6 +460,7 @@ class ActivityStarter { final String splitName = rInfo.ephemeralResponse.splitName; final boolean needsPhaseTwo = rInfo.ephemeralResponse.needsPhase2; final String token = rInfo.ephemeralResponse.token; + final int versionCode = rInfo.ephemeralResponse.resolveInfo.getVersionCode(); if (needsPhaseTwo) { // request phase two resolution mService.getPackageManagerInternalLocked().requestEphemeralResolutionPhaseTwo( @@ -467,8 +468,8 @@ class ActivityStarter { callingPackage, userId); } intent = EphemeralResolver.buildEphemeralInstallerIntent(intent, ephemeralIntent, - callingPackage, resolvedType, userId, packageName, splitName, token, - needsPhaseTwo); + callingPackage, resolvedType, userId, packageName, splitName, versionCode, + token, needsPhaseTwo); resolvedType = null; callingUid = realCallingUid; callingPid = realCallingPid; diff --git a/services/core/java/com/android/server/pm/EphemeralResolver.java b/services/core/java/com/android/server/pm/EphemeralResolver.java index d735e72868895..96a0d18bbc3e8 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolver.java +++ b/services/core/java/com/android/server/pm/EphemeralResolver.java @@ -78,6 +78,7 @@ public abstract class EphemeralResolver { int sequence) { final String packageName; final String splitName; + final int versionCode; if (ephemeralResolveInfo != null) { final ArrayList ephemeralResolveInfoList = new ArrayList(1); @@ -91,13 +92,16 @@ public abstract class EphemeralResolver { && ephemeralIntentInfo.resolveInfo != null) { packageName = ephemeralIntentInfo.resolveInfo.getPackageName(); splitName = ephemeralIntentInfo.splitName; + versionCode = ephemeralIntentInfo.resolveInfo.getVersionCode(); } else { packageName = null; splitName = null; + versionCode = -1; } } else { packageName = null; splitName = null; + versionCode = -1; } final Intent installerIntent = buildEphemeralInstallerIntent( requestObj.launchIntent, @@ -107,6 +111,7 @@ public abstract class EphemeralResolver { requestObj.userId, packageName, splitName, + versionCode, requestObj.responseObj.token, false /*needsPhaseTwo*/); installerIntent.setComponent(new ComponentName( @@ -123,7 +128,7 @@ public abstract class EphemeralResolver { */ public static Intent buildEphemeralInstallerIntent(Intent launchIntent, Intent origIntent, String callingPackage, String resolvedType, int userId, String ephemeralPackageName, - String ephemeralSplitName, String token, boolean needsPhaseTwo) { + String ephemeralSplitName, int versionCode, String token, boolean needsPhaseTwo) { // Construct the intent that launches the ephemeral installer int flags = launchIntent.getFlags(); final Intent intent = new Intent(); @@ -181,6 +186,7 @@ public abstract class EphemeralResolver { intent.putExtra(Intent.EXTRA_PACKAGE_NAME, ephemeralPackageName); intent.putExtra(Intent.EXTRA_SPLIT_NAME, ephemeralSplitName); + intent.putExtra(Intent.EXTRA_VERSION_CODE, versionCode); } return intent;