diff options
8 files changed, 88 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 48b878ec699f..d2329a92bf5f 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -11171,6 +11171,7 @@ package android.content.pm { method public abstract byte[] getInstantAppCookie(); method public abstract int getInstantAppCookieMaxSize(); method public abstract android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String); + method public abstract android.content.ComponentName getInstantAppResolverSettingsComponent(); method public abstract java.util.List<android.content.pm.InstantAppInfo> getInstantApps(); method public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String); @@ -44203,6 +44204,7 @@ package android.test.mock { method public byte[] getInstantAppCookie(); method public int getInstantAppCookieMaxSize(); method public android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String); + method public android.content.ComponentName getInstantAppResolverSettingsComponent(); method public java.util.List<android.content.pm.InstantAppInfo> getInstantApps(); method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; method public java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 286f8570f55c..461f9cc35125 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2630,4 +2630,13 @@ public class ApplicationPackageManager extends PackageManager { throw e.rethrowAsRuntimeException(); } } + + @Override + public ComponentName getInstantAppResolverSettingsComponent() { + try { + return mPM.getInstantAppResolverSettingsComponent(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index fb86791a509c..7890a9607932 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1532,6 +1532,19 @@ public class Intent implements Parcelable, Cloneable { = "android.intent.action.RESOLVE_EPHEMERAL_PACKAGE"; /** + * Activity Action: Launch ephemeral settings. + * + * <p class="note"> + * This is a protected intent that can only be sent by the system. + * </p> + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_EPHEMERAL_RESOLVER_SETTINGS + = "android.intent.action.EPHEMERAL_RESOLVER_SETTINGS"; + + /** * Used as a string extra field with {@link #ACTION_INSTALL_PACKAGE} to install a * package. Specifies the installer package name; this package will receive the * {@link #ACTION_APP_ERROR} intent. diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 59b022ded9bf..147df763fce2 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -630,4 +630,6 @@ interface IPackageManager { boolean canRequestPackageInstalls(String packageName, int userId); void deletePreloadsFileCache(); + + ComponentName getInstantAppResolverSettingsComponent(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 71db5d311bd6..2edcb0f8842b 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -6233,4 +6233,14 @@ public abstract class PackageManager { * @see {@link android.provider.Settings#ACTION_MANAGE_EXTERNAL_SOURCES} */ public abstract boolean canRequestPackageInstalls(); + + /** + * Return the {@link ComponentName} of the activity providing Settings for the Instant App + * resolver. + * + * @see {@link android.content.intent#ACTION_EPHEMERAL_RESOLVER_SETTINGS} + * @hide + */ + @SystemApi + public abstract ComponentName getInstantAppResolverSettingsComponent(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8cc937502592..600ceb8814c9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -842,6 +842,8 @@ public class PackageManagerService extends IPackageManager.Stub { /** Component used to install ephemeral applications */ ComponentName mInstantAppInstallerComponent; + /** Component used to show resolver settings for Instant Apps */ + ComponentName mInstantAppResolverSettingsComponent; ActivityInfo mInstantAppInstallerActivity; final ResolveInfo mInstantAppInstallerInfo = new ResolveInfo(); @@ -2890,6 +2892,7 @@ public class PackageManagerService extends IPackageManager.Stub { mInstantAppResolverConnection = null; } updateInstantAppInstallerLocked(); + mInstantAppResolverSettingsComponent = getEphemeralResolverSettingsLPr(); // Read and update the usage of dex files. // Do this at the end of PM init so that all the packages have their @@ -3196,6 +3199,37 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private @Nullable ComponentName getEphemeralResolverSettingsLPr() { + final Intent intent = new Intent(Intent.ACTION_EPHEMERAL_RESOLVER_SETTINGS); + intent.addCategory(Intent.CATEGORY_DEFAULT); + final int resolveFlags = + MATCH_DIRECT_BOOT_AWARE + | MATCH_DIRECT_BOOT_UNAWARE + | (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0); + final List<ResolveInfo> matches = queryIntentActivitiesInternal(intent, null, + resolveFlags, UserHandle.USER_SYSTEM); + Iterator<ResolveInfo> iter = matches.iterator(); + while (iter.hasNext()) { + final ResolveInfo rInfo = iter.next(); + final PackageSetting ps = mSettings.mPackages.get(rInfo.activityInfo.packageName); + if (ps != null) { + final PermissionsState permissionsState = ps.getPermissionsState(); + if (permissionsState.hasPermission(Manifest.permission.ACCESS_INSTANT_APPS, 0)) { + continue; + } + } + iter.remove(); + } + if (matches.size() == 0) { + return null; + } else if (matches.size() == 1) { + return matches.get(0).getComponentInfo().getComponentName(); + } else { + throw new RuntimeException( + "There must be at most one ephemeral resolver settings; found " + matches); + } + } + private void primeDomainVerificationsLPw(int userId) { if (DEBUG_DOMAIN_VERIFICATION) { Slog.d(TAG, "Priming domain verifications in user " + userId); @@ -23313,4 +23347,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } return checkUidPermission(appOpPermission, uid) == PERMISSION_GRANTED; } + + @Override + public ComponentName getInstantAppResolverSettingsComponent() { + return mInstantAppResolverSettingsComponent; + } } diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 506f406c333f..960a2d9fd726 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -1118,4 +1118,12 @@ public class MockPackageManager extends PackageManager { public int getInstallReason(String packageName, UserHandle user) { throw new UnsupportedOperationException(); } + + /** + * @hide + */ + @Override + public ComponentName getInstantAppResolverSettingsComponent() { + throw new UnsupportedOperationException(); + } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 906ebb1fe39e..53c3f90e0137 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -916,4 +916,9 @@ public class BridgePackageManager extends PackageManager { public boolean canRequestPackageInstalls() { return false; } + + @Override + public ComponentName getInstantAppResolverSettingsComponent() { + return null; + } } |