From 709ee1551db935adb2026fae9dd799e60f784499 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Mon, 4 Dec 2017 16:12:52 -0800 Subject: [PATCH] Adds metadata to InstantAppResolveInfo This change introduces a metadata Bundle to the InstantAppResolveInfo type to be passed along to the Instant App installer in the case of resolution. This can be used by the resolver and installer to improve launch by avoiding IPC to fetch needed data that lives in the resolver. Change-Id: I0b9c168dd8803f5398d222384ebd436c787e1a48 Fixes: 68223794 Test: manual - modified resolver to populate data, verified in installer --- api/system-current.txt | 3 ++- core/java/android/content/Intent.java | 10 +++++++++ .../content/pm/InstantAppResolveInfo.java | 21 ++++++++++++++----- .../android/server/am/ActivityStarter.java | 5 ++--- .../android/server/pm/InstantAppResolver.java | 14 ++++++++----- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 1ce043cf10e54..af7d07bd97489 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -782,11 +782,12 @@ package android.content.pm { public final class InstantAppResolveInfo implements android.os.Parcelable { ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List, int); - ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List, long); + ctor public InstantAppResolveInfo(android.content.pm.InstantAppResolveInfo.InstantAppDigest, java.lang.String, java.util.List, long, android.os.Bundle); ctor public InstantAppResolveInfo(java.lang.String, java.lang.String, java.util.List); method public int describeContents(); method public byte[] getDigestBytes(); method public int getDigestPrefix(); + method public android.os.Bundle getExtras(); method public java.util.List getIntentFilters(); method public long getLongVersionCode(); method public java.lang.String getPackageName(); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 55ad5c5dd1b65..28bd928214ae8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4460,6 +4460,16 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_INSTANT_APP_ACTION = "android.intent.extra.INSTANT_APP_ACTION"; + /** + * A {@link Bundle} of metadata that describes the instanta application that needs to be + * installed. This data is populated from the response to + * {@link android.content.pm.InstantAppResolveInfo#getExtras()} as provided by the registered + * instant application resolver. + * @hide + */ + public static final String EXTRA_INSTANT_APP_EXTRAS = + "android.intent.extra.INSTANT_APP_EXTRAS"; + /** * The version code of the app to install components from. * @deprecated Use {@link #EXTRA_LONG_VERSION_CODE). diff --git a/core/java/android/content/pm/InstantAppResolveInfo.java b/core/java/android/content/pm/InstantAppResolveInfo.java index fb3094c709530..19cb9323ba935 100644 --- a/core/java/android/content/pm/InstantAppResolveInfo.java +++ b/core/java/android/content/pm/InstantAppResolveInfo.java @@ -19,8 +19,7 @@ package android.content.pm; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.content.IntentFilter; -import android.net.Uri; +import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -45,14 +44,17 @@ public final class InstantAppResolveInfo implements Parcelable { private final List mFilters; /** The version code of the app that this class resolves to */ private final long mVersionCode; + /** Data about the app that should be passed along to the Instant App installer on resolve */ + private final Bundle mExtras; public InstantAppResolveInfo(@NonNull InstantAppDigest digest, @Nullable String packageName, @Nullable List filters, int versionCode) { - this(digest, packageName, filters, (long)versionCode); + this(digest, packageName, filters, (long) versionCode, null /* extras */); } public InstantAppResolveInfo(@NonNull InstantAppDigest digest, @Nullable String packageName, - @Nullable List filters, long versionCode) { + @Nullable List filters, long versionCode, + @Nullable Bundle extras) { // validate arguments if ((packageName == null && (filters != null && filters.size() != 0)) || (packageName != null && (filters == null || filters.size() == 0))) { @@ -67,11 +69,13 @@ public final class InstantAppResolveInfo implements Parcelable { } mPackageName = packageName; mVersionCode = versionCode; + mExtras = extras; } public InstantAppResolveInfo(@NonNull String hostName, @Nullable String packageName, @Nullable List filters) { - this(new InstantAppDigest(hostName), packageName, filters, -1 /*versionCode*/); + this(new InstantAppDigest(hostName), packageName, filters, -1 /*versionCode*/, + null /* extras */); } InstantAppResolveInfo(Parcel in) { @@ -80,6 +84,7 @@ public final class InstantAppResolveInfo implements Parcelable { mFilters = new ArrayList(); in.readList(mFilters, null /*loader*/); mVersionCode = in.readLong(); + mExtras = in.readBundle(); } public byte[] getDigestBytes() { @@ -110,6 +115,11 @@ public final class InstantAppResolveInfo implements Parcelable { return mVersionCode; } + @Nullable + public Bundle getExtras() { + return mExtras; + } + @Override public int describeContents() { return 0; @@ -121,6 +131,7 @@ public final class InstantAppResolveInfo implements Parcelable { out.writeString(mPackageName); out.writeList(mFilters); out.writeLong(mVersionCode); + out.writeBundle(mExtras); } public static final Parcelable.Creator CREATOR diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 3bee4228d9fb7..5e9ab8d2a1a83 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -74,7 +74,6 @@ import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.am.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT; import android.annotation.NonNull; -import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.IApplicationThread; @@ -87,7 +86,6 @@ import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.AuxiliaryResolveInfo; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; @@ -569,7 +567,8 @@ class ActivityStarter { auxiliaryResponse.failureIntent, callingPackage, verificationBundle, resolvedType, userId, auxiliaryResponse.packageName, auxiliaryResponse.splitName, auxiliaryResponse.installFailureActivity, auxiliaryResponse.versionCode, - auxiliaryResponse.token, auxiliaryResponse.needsPhaseTwo); + auxiliaryResponse.token, auxiliaryResponse.resolveInfo.getExtras(), + auxiliaryResponse.needsPhaseTwo); } void postStartActivityProcessing(ActivityRecord r, int result, ActivityStack targetStack) { diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java index 88fc65e3f7d1e..30072d45ccabb 100644 --- a/services/core/java/com/android/server/pm/InstantAppResolver.java +++ b/services/core/java/com/android/server/pm/InstantAppResolver.java @@ -40,14 +40,11 @@ import android.content.pm.InstantAppIntentFilter; import android.content.pm.InstantAppResolveInfo; import android.content.pm.InstantAppResolveInfo.InstantAppDigest; import android.metrics.LogMaker; -import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.util.Log; -import android.util.Pair; -import android.util.Slog; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; @@ -56,11 +53,9 @@ import com.android.server.pm.EphemeralResolverConnection.PhaseTwoCallback; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; -import java.util.concurrent.TimeoutException; /** @hide */ public abstract class InstantAppResolver { @@ -161,6 +156,7 @@ public abstract class InstantAppResolver { final String splitName; final long versionCode; final Intent failureIntent; + final Bundle extras; if (instantAppResolveInfoList != null && instantAppResolveInfoList.size() > 0) { final AuxiliaryResolveInfo instantAppIntentInfo = InstantAppResolver.filterInstantAppIntent( @@ -172,17 +168,20 @@ public abstract class InstantAppResolver { splitName = instantAppIntentInfo.splitName; versionCode = instantAppIntentInfo.resolveInfo.getVersionCode(); failureIntent = instantAppIntentInfo.failureIntent; + extras = instantAppIntentInfo.resolveInfo.getExtras(); } else { packageName = null; splitName = null; versionCode = -1; failureIntent = null; + extras = null; } } else { packageName = null; splitName = null; versionCode = -1; failureIntent = null; + extras = null; } final Intent installerIntent = buildEphemeralInstallerIntent( Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE, @@ -197,6 +196,7 @@ public abstract class InstantAppResolver { requestObj.responseObj.installFailureActivity, versionCode, token, + extras, false /*needsPhaseTwo*/); installerIntent.setComponent(new ComponentName( instantAppInstaller.packageName, instantAppInstaller.name)); @@ -243,6 +243,7 @@ public abstract class InstantAppResolver { @Nullable ComponentName installFailureActivity, long versionCode, @Nullable String token, + @Nullable Bundle extras, boolean needsPhaseTwo) { // Construct the intent that launches the instant installer int flags = origIntent.getFlags(); @@ -259,6 +260,9 @@ public abstract class InstantAppResolver { intent.putExtra(Intent.EXTRA_EPHEMERAL_HOSTNAME, origIntent.getData().getHost()); } intent.putExtra(Intent.EXTRA_INSTANT_APP_ACTION, origIntent.getAction()); + if (extras != null) { + intent.putExtra(Intent.EXTRA_INSTANT_APP_EXTRAS, extras); + } // We have all of the data we need; just start the installer without a second phase if (!needsPhaseTwo) {