From 583378df9c18e583dfc0abbb26be3194f24f5bfa Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Fri, 12 Jul 2019 06:50:30 -0700 Subject: [PATCH] Move providers to permission manager Bug: 135279435 Test: atest PermissionUpdateListenerTest Test: atest android.content.pm.cts.PackageManagerTest Test: atest android.permission2.cts.RestrictedPermissionsTest Test: atest TeleServiceTests Test: atest DataConnectionTest Change-Id: Ife563589929b2662c60e1a0ab0ec8f6a2d7e4c12 --- .../app/ApplicationPackageManager.java | 4 +- .../android/content/pm/IPackageManager.aidl | 12 - .../content/pm/PackageManagerInternal.java | 174 +-------- .../permission/IPermissionManager.aidl | 18 + .../server/LocationManagerService.java | 10 +- .../android/server/NetworkScoreService.java | 23 +- .../server/content/ContentService.java | 16 +- .../server/pm/PackageManagerService.java | 329 ++---------------- .../server/pm/PackageManagerServiceUtils.java | 11 + .../DefaultPermissionGrantPolicy.java | 4 +- .../permission/PermissionManagerService.java | 317 ++++++++++++++++- .../PermissionManagerServiceInternal.java | 247 ++++++++++++- .../policy/PermissionPolicyService.java | 8 +- .../server/role/RoleManagerService.java | 21 +- .../server/telecom/TelecomLoaderService.java | 36 +- .../server/NetworkScoreServiceTest.java | 13 +- .../VoiceInteractionManagerService.java | 10 +- .../internal/telephony/CarrierAppUtils.java | 19 +- 18 files changed, 701 insertions(+), 571 deletions(-) diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 416aaa37f0646..f28fa004c698f 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2049,7 +2049,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public String getDefaultBrowserPackageNameAsUser(int userId) { try { - return mPM.getDefaultBrowserPackageName(userId); + return mPermissionManager.getDefaultBrowser(userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2058,7 +2058,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) { try { - return mPM.setDefaultBrowserPackageName(packageName, userId); + return mPermissionManager.setDefaultBrowser(packageName, userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 904bd1682f9ab..29a7aa97ddf97 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -594,9 +594,6 @@ interface IPackageManager { ParceledListSlice getIntentFilterVerifications(String packageName); ParceledListSlice getAllIntentFilters(String packageName); - boolean setDefaultBrowserPackageName(String packageName, int userId); - String getDefaultBrowserPackageName(int userId); - VerifierDeviceIdentity getVerifierDeviceIdentity(); boolean isFirstBoot(); @@ -629,15 +626,6 @@ interface IPackageManager { boolean isPackageSignedByKeySet(String packageName, in KeySet ks); boolean isPackageSignedByKeySetExactly(String packageName, in KeySet ks); - void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); - void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId); - void grantDefaultPermissionsToEnabledTelephonyDataServices( - in String[] packageNames, int userId); - void revokeDefaultPermissionsFromDisabledTelephonyDataServices( - in String[] packageNames, int userId); - void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId); - void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId); - boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId); @UnsupportedAppUsage diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index e21d4c41811c3..633f2df609e4b 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -83,139 +83,6 @@ public abstract class PackageManagerInternal { void onPackageRemoved(@NonNull String packageName, int uid); } - /** - * Provider for package names. - */ - public interface PackagesProvider { - - /** - * Gets the packages for a given user. - * @param userId The user id. - * @return The package names. - */ - public String[] getPackages(int userId); - } - - /** - * Provider for package names. - */ - public interface SyncAdapterPackagesProvider { - - /** - * Gets the sync adapter packages for given authority and user. - * @param authority The authority. - * @param userId The user id. - * @return The package names. - */ - public String[] getPackages(String authority, int userId); - } - - /** - * Provider for default browser - */ - public interface DefaultBrowserProvider { - - /** - * Get the package name of the default browser. - * - * @param userId the user id - * - * @return the package name of the default browser, or {@code null} if none - */ - @Nullable - String getDefaultBrowser(@UserIdInt int userId); - - /** - * Set the package name of the default browser. - * - * @param packageName package name of the default browser, or {@code null} to remove - * @param userId the user id - * - * @return whether the default browser was successfully set. - */ - boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId); - - /** - * Set the package name of the default browser asynchronously. - * - * @param packageName package name of the default browser, or {@code null} to remove - * @param userId the user id - */ - void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId); - } - - /** - * Provider for default dialer - */ - public interface DefaultDialerProvider { - - /** - * Get the package name of the default dialer. - * - * @param userId the user id - * - * @return the package name of the default dialer, or {@code null} if none - */ - @Nullable - String getDefaultDialer(@UserIdInt int userId); - } - - /** - * Provider for default home - */ - public interface DefaultHomeProvider { - - /** - * Get the package name of the default home. - * - * @param userId the user id - * - * @return the package name of the default home, or {@code null} if none - */ - @Nullable - String getDefaultHome(@UserIdInt int userId); - - /** - * Set the package name of the default home. - * - * @param packageName package name of the default home, or {@code null} to remove - * @param userId the user id - * @param callback the callback made after the default home as been updated - */ - void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId, - @NonNull Consumer callback); - } - - /** - * Sets the location provider packages provider. - * @param provider The packages provider. - */ - public abstract void setLocationPackagesProvider(PackagesProvider provider); - - /** - * Set the location extra packages provider. - * @param provider The packages provider. - */ - public abstract void setLocationExtraPackagesProvider(PackagesProvider provider); - - /** - * Sets the voice interaction packages provider. - * @param provider The packages provider. - */ - public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider); - - /** - * Sets the Use Open Wifi packages provider. - * @param provider The packages provider. - */ - public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider); - - /** - * Sets the sync adapter packages provider. - * @param provider The provider. - */ - public abstract void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider); - /** * Called when the package for the default SMS handler changed * @@ -232,14 +99,6 @@ public abstract class PackageManagerInternal { */ public void onDefaultSimCallManagerAppChanged(String packageName, int userId) {} - /** - * Requests granting of the default permissions to the current default Use Open Wifi app. - * @param packageName The default use open wifi package name. - * @param userId The user for which to grant the permissions. - */ - public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, - int userId); - /** * Sets a list of apps to keep in PM's internal data structures and as APKs even if no user has * currently installed it. The apps are not preloaded. @@ -871,27 +730,6 @@ public abstract class PackageManagerInternal { @Nullable public abstract String removeLegacyDefaultBrowserPackageName(int userId); - /** - * Sets the default browser provider. - * - * @param provider the provider - */ - public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider); - - /** - * Sets the default dialer provider. - * - * @param provider the provider - */ - public abstract void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider); - - /** - * Sets the default home provider. - * - * @param provider the provider - */ - public abstract void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider); - /** * Returns {@code true} if given {@code packageName} is an apex package. */ @@ -909,15 +747,6 @@ public abstract class PackageManagerInternal { public abstract void uninstallApex(String packageName, long versionCode, int userId, IntentSender intentSender); - /** - * Whether default permission grants have been performed for a user - * since the device booted. - * - * @param userId The user id. - * @return true if default permissions - */ - public abstract boolean wereDefaultPermissionsGrantedSinceBoot(int userId); - /** * Get fingerprint of build that updated the runtime permissions for a user. * @@ -960,4 +789,7 @@ public abstract class PackageManagerInternal { */ public abstract boolean isCallerInstallerOfRecord( @NonNull PackageParser.Package pkg, int callingUid); + + /** Returns whether or not default runtime permissions are granted for the given user */ + public abstract boolean areDefaultRuntimePermissionsGranted(@UserIdInt int userId); } diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl index d31cee0a1dac6..39787f4541b97 100644 --- a/core/java/android/permission/IPermissionManager.aidl +++ b/core/java/android/permission/IPermissionManager.aidl @@ -70,4 +70,22 @@ interface IPermissionManager { void revokeRuntimePermission(String packageName, String permName, int userId); void resetRuntimePermissions(); + + boolean setDefaultBrowser(String packageName, int userId); + + String getDefaultBrowser(int userId); + + void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); + + void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId); + + void grantDefaultPermissionsToEnabledTelephonyDataServices( + in String[] packageNames, int userId); + + void revokeDefaultPermissionsFromDisabledTelephonyDataServices( + in String[] packageNames, int userId); + + void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId); + + void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId); } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index b36bbaa252c20..ac9148b19d274 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -42,7 +42,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.Signature; import android.content.res.Resources; @@ -121,6 +120,7 @@ import com.android.server.location.LocationRequestStatistics.PackageStatistics; import com.android.server.location.MockProvider; import com.android.server.location.PassiveProvider; import com.android.server.location.RemoteListenerHelper; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; @@ -282,12 +282,12 @@ public class LocationManagerService extends ILocationManager.Stub { // Let the package manager query which are the default location // providers as they get certain permissions granted by default. - PackageManagerInternal packageManagerInternal = LocalServices.getService( - PackageManagerInternal.class); - packageManagerInternal.setLocationPackagesProvider( + PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService( + PermissionManagerServiceInternal.class); + permissionManagerInternal.setLocationPackagesProvider( userId -> mContext.getResources().getStringArray( com.android.internal.R.array.config_locationProviderPackageNames)); - packageManagerInternal.setLocationExtraPackagesProvider( + permissionManagerInternal.setLocationExtraPackagesProvider( userId -> mContext.getResources().getStringArray( com.android.internal.R.array.config_locationExtraPackageNames)); diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java index 80d7ac9311119..df5005eed66be 100644 --- a/services/core/java/com/android/server/NetworkScoreService.java +++ b/services/core/java/com/android/server/NetworkScoreService.java @@ -26,7 +26,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.database.ContentObserver; import android.location.LocationManager; import android.net.INetworkRecommendationProvider; @@ -54,15 +53,14 @@ import android.provider.Settings.Global; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.IntArray; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.PackageMonitor; import com.android.internal.os.TransferPipe; -import com.android.internal.telephony.SmsApplication; import com.android.internal.util.DumpUtils; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import java.io.FileDescriptor; import java.io.IOException; @@ -294,7 +292,7 @@ public class NetworkScoreService extends INetworkScoreService.Stub { String useOpenWifiPackage = Global.getString(mContext.getContentResolver(), Global.USE_OPEN_WIFI_PACKAGE); if (!TextUtils.isEmpty(useOpenWifiPackage)) { - LocalServices.getService(PackageManagerInternal.class) + LocalServices.getService(PermissionManagerServiceInternal.class) .grantDefaultPermissionsToDefaultUseOpenWifiApp(useOpenWifiPackage, userId); } @@ -306,17 +304,14 @@ public class NetworkScoreService extends INetworkScoreService.Stub { false /*notifyForDescendants*/, mUseOpenWifiPackageObserver); // Set a callback for the package manager to query the use open wifi app. - LocalServices.getService(PackageManagerInternal.class).setUseOpenWifiAppPackagesProvider( - new PackageManagerInternal.PackagesProvider() { - @Override - public String[] getPackages(int userId) { - String useOpenWifiPackage = Global.getString(mContext.getContentResolver(), - Global.USE_OPEN_WIFI_PACKAGE); - if (!TextUtils.isEmpty(useOpenWifiPackage)) { - return new String[]{useOpenWifiPackage}; - } - return null; + LocalServices.getService(PermissionManagerServiceInternal.class) + .setUseOpenWifiAppPackagesProvider((userId) -> { + String useOpenWifiPackage = Global.getString(mContext.getContentResolver(), + Global.USE_OPEN_WIFI_PACKAGE); + if (!TextUtils.isEmpty(useOpenWifiPackage)) { + return new String[]{useOpenWifiPackage}; } + return null; }); } diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 7824a0ac31941..3e1817bd14ff0 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -40,7 +40,6 @@ import android.content.SyncInfo; import android.content.SyncRequest; import android.content.SyncStatusInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.pm.ProviderInfo; import android.database.IContentObserver; import android.database.sqlite.SQLiteException; @@ -71,6 +70,7 @@ import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -280,15 +280,11 @@ public final class ContentService extends IContentService.Stub { // Let the package manager query for the sync adapters for a given authority // as we grant default permissions to sync adapters for specific authorities. - PackageManagerInternal packageManagerInternal = LocalServices.getService( - PackageManagerInternal.class); - packageManagerInternal.setSyncAdapterPackagesprovider( - new PackageManagerInternal.SyncAdapterPackagesProvider() { - @Override - public String[] getPackages(String authority, int userId) { - return getSyncAdapterPackagesForAuthorityAsUser(authority, userId); - } - }); + final PermissionManagerServiceInternal permissionManagerInternal = + LocalServices.getService(PermissionManagerServiceInternal.class); + permissionManagerInternal.setSyncAdapterPackagesProvider((authority, userId) -> { + return getSyncAdapterPackagesForAuthorityAsUser(authority, userId); + }); final IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8660d191960ce..a231ee1971391 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -311,7 +311,6 @@ import com.android.server.pm.dex.DexoptOptions; import com.android.server.pm.dex.PackageDexUsage; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.permission.BasePermission; -import com.android.server.pm.permission.DefaultPermissionGrantPolicy; import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.permission.PermissionsState; @@ -948,8 +947,6 @@ public class PackageManagerService extends IPackageManager.Stub final SparseArray mIntentFilterVerificationStates = new SparseArray<>(); - // TODO remove this and go through mPermissonManager directly - final DefaultPermissionGrantPolicy mDefaultPermissionPolicy; // Internal interface for permission manager private final PermissionManagerServiceInternal mPermissionManager; // Public interface for permission manager @@ -992,15 +989,6 @@ public class PackageManagerService extends IPackageManager.Stub void receiveVerificationResponse(int verificationId); } - @GuardedBy("mPackages") - private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider; - - @GuardedBy("mPackages") - private PackageManagerInternal.DefaultDialerProvider mDefaultDialerProvider; - - @GuardedBy("mPackages") - private PackageManagerInternal.DefaultHomeProvider mDefaultHomeProvider; - private class IntentVerifierProxy implements IntentFilterVerifier { private Context mContext; private ComponentName mIntentFilterVerifierComponent; @@ -1966,7 +1954,7 @@ public class PackageManagerService extends IPackageManager.Stub final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting.getInstallReason(userId) != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { - setDefaultBrowserAsyncLPw(null, userId); + mPermissionManager.setDefaultBrowser(null, true, true, userId); } } } @@ -2348,7 +2336,6 @@ public class PackageManagerService extends IPackageManager.Stub mPackages /*externalLock*/); mPermissionManagerService = (IPermissionManager) ServiceManager.getService("permissionmgr"); - mDefaultPermissionPolicy = mPermissionManager.getDefaultPermissionGrantPolicy(); mSettings = new Settings(Environment.getDataDirectory(), mPermissionManager.getPermissionSettings(), mPackages); } @@ -7286,7 +7273,8 @@ public class PackageManagerService extends IPackageManager.Stub } else { // Browser/generic handling case. If there's a default browser, go straight // to that (but only if there is no other higher-priority match). - final String defaultBrowserPackageName = getDefaultBrowserPackageName(userId); + final String defaultBrowserPackageName = + mPermissionManager.getDefaultBrowser(userId); int maxMatchPrio = 0; ResolveInfo defaultBrowserMatch = null; final int numCandidates = matchAllList.size(); @@ -12826,7 +12814,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) { - enforceSystemOrPhoneCaller("setSystemAppHiddenUntilInstalled"); + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils + .enforceSystemOrPhoneCaller("setSystemAppHiddenUntilInstalled", callingUid); synchronized (mPackages) { final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting == null || !pkgSetting.isSystem()) { @@ -12849,7 +12839,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) { - enforceSystemOrPhoneCaller("setSystemAppInstallState"); + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils + .enforceSystemOrPhoneCaller("setSystemAppInstallState", callingUid); synchronized (mPackages) { final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); // The target app should always be in system @@ -13421,7 +13413,7 @@ public class PackageManagerService extends IPackageManager.Stub final long callingId = Binder.clearCallingIdentity(); try { final String activeLauncherPackageName = getActiveLauncherPackageName(userId); - final String dialerPackageName = getDefaultDialerPackageName(userId); + final String dialerPackageName = mPermissionManager.getDefaultDialer(userId); for (int i = 0; i < packageNames.length; i++) { canSuspend[i] = false; final String packageName = packageNames[i]; @@ -13503,19 +13495,6 @@ public class PackageManagerService extends IPackageManager.Stub return resolveInfo == null ? null : resolveInfo.activityInfo.packageName; } - @Nullable - private String getDefaultDialerPackageName(@UserIdInt int userId) { - PackageManagerInternal.DefaultDialerProvider provider; - synchronized (mPackages) { - provider = mDefaultDialerProvider; - } - if (provider == null) { - Slog.e(TAG, "mDefaultDialerProvider is null"); - return null; - } - return provider.getDefaultDialer(userId); - } - @Override public void verifyPendingInstall(int id, int verificationCode) throws RemoteException { mContext.enforceCallingOrSelfPermission( @@ -13874,75 +13853,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - @Override - public boolean setDefaultBrowserPackageName(String packageName, int userId) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); - if (UserHandle.getCallingUserId() != userId) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); - } - if (userId == UserHandle.USER_ALL) { - return false; - } - PackageManagerInternal.DefaultBrowserProvider provider; - synchronized (mPackages) { - provider = mDefaultBrowserProvider; - } - if (provider == null) { - Slog.e(TAG, "mDefaultBrowserProvider is null"); - return false; - } - boolean successful = provider.setDefaultBrowser(packageName, userId); - if (!successful) { - return false; - } - if (packageName != null) { - synchronized (mPackages) { - mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName, - userId); - } - } - return true; - } - - private void setDefaultBrowserAsyncLPw(@Nullable String packageName, @UserIdInt int userId) { - if (userId == UserHandle.USER_ALL) { - return; - } - if (mDefaultBrowserProvider == null) { - Slog.e(TAG, "mDefaultBrowserProvider is null"); - return; - } - mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId); - if (packageName != null) { - synchronized (mPackages) { - mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName, - userId); - } - } - } - - @Override - public String getDefaultBrowserPackageName(int userId) { - if (UserHandle.getCallingUserId() != userId) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); - } - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - PackageManagerInternal.DefaultBrowserProvider provider; - synchronized (mPackages) { - provider = mDefaultBrowserProvider; - } - if (provider == null) { - Slog.e(TAG, "mDefaultBrowserProvider is null"); - return null; - } - return provider.getDefaultBrowser(userId); - } - /** * Get the "allow unknown sources" setting. * @@ -19688,10 +19598,10 @@ public class PackageManagerService extends IPackageManager.Stub } private void clearDefaultBrowserIfNeededForUser(String packageName, int userId) { - final String defaultBrowserPackageName = getDefaultBrowserPackageName(userId); + final String defaultBrowserPackageName = mPermissionManager.getDefaultBrowser(userId); if (!TextUtils.isEmpty(defaultBrowserPackageName)) { if (packageName.equals(defaultBrowserPackageName)) { - setDefaultBrowserPackageName(null, userId); + mPermissionManager.setDefaultBrowser(null, true, true, userId); } } } @@ -19719,7 +19629,7 @@ public class PackageManagerService extends IPackageManager.Stub // significant refactoring to keep all default apps in the package // manager (cleaner but more work) or have the services provide // callbacks to the package manager to request a default app reset. - setDefaultBrowserPackageName(null, userId); + mPermissionManager.setDefaultBrowser(null, true, true, userId); resetNetworkPolicies(userId); synchronized (mPackages) { scheduleWritePackageRestrictionsLocked(userId); @@ -19972,17 +19882,14 @@ public class PackageManagerService extends IPackageManager.Stub parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name()); restoreFromXml(parser, userId, TAG_DEFAULT_APPS, (parser1, userId1) -> { - String defaultBrowser; + final String defaultBrowser; synchronized (mPackages) { mSettings.readDefaultAppsLPw(parser1, userId1); defaultBrowser = mSettings.removeDefaultBrowserPackageNameLPw(userId1); } if (defaultBrowser != null) { - PackageManagerInternal.DefaultBrowserProvider provider; - synchronized (mPackages) { - provider = mDefaultBrowserProvider; - } - provider.setDefaultBrowser(defaultBrowser, userId1); + mPermissionManager + .setDefaultBrowser(defaultBrowser, false, false, userId1); } }); } catch (Exception e) { @@ -20219,15 +20126,7 @@ public class PackageManagerService extends IPackageManager.Stub } allHomeCandidates.addAll(resolveInfos); - PackageManagerInternal.DefaultHomeProvider provider; - synchronized (mPackages) { - provider = mDefaultHomeProvider; - } - if (provider == null) { - Slog.e(TAG, "mDefaultHomeProvider is null"); - return null; - } - String packageName = provider.getDefaultHome(userId); + final String packageName = mPermissionManager.getDefaultHome(userId); if (packageName == null) { return null; } @@ -20280,15 +20179,7 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = preferredResolveInfo != null && preferredResolveInfo.activityInfo != null ? preferredResolveInfo.activityInfo.packageName : null; - final PackageManagerInternal.DefaultHomeProvider provider; - synchronized (mPackages) { - provider = mDefaultHomeProvider; - } - if (provider == null) { - Slog.e(TAG, "Default home provider has not been set"); - return false; - } - final String currentPackageName = provider.getDefaultHome(userId); + final String currentPackageName = mPermissionManager.getDefaultHome(userId); if (TextUtils.equals(currentPackageName, packageName)) { return false; } @@ -20298,7 +20189,7 @@ public class PackageManagerService extends IPackageManager.Stub // PermissionController manages default home directly. return false; } - provider.setDefaultHomeAsync(packageName, userId, (successful) -> { + mPermissionManager.setDefaultHome(currentPackageName, userId, (successful) -> { if (successful) { postPreferredActivityChangedBroadcast(userId); } @@ -20854,7 +20745,8 @@ public class PackageManagerService extends IPackageManager.Stub // Disable any carrier apps. We do this very early in boot to prevent the apps from being // disabled after already being started. CarrierAppUtils.disableCarrierAppsUntilPrivileged(mContext.getOpPackageName(), this, - mContext.getContentResolver(), UserHandle.USER_SYSTEM); + mPermissionManagerService, mContext.getContentResolver(), + UserHandle.USER_SYSTEM); disableSkuSpecificApps(); @@ -20868,8 +20760,6 @@ public class PackageManagerService extends IPackageManager.Stub Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); } - int[] grantPermissionsUserIds = EMPTY_INT_ARRAY; - synchronized (mPackages) { // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at @@ -20899,27 +20789,9 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.mPreferredActivities.keyAt(i)); } } - - for (int userId : UserManagerService.getInstance().getUserIds()) { - if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) { - grantPermissionsUserIds = ArrayUtils.appendInt( - grantPermissionsUserIds, userId); - } - } } sUserManager.systemReady(); - // If we upgraded grant all default permissions before kicking off. - for (int userId : grantPermissionsUserIds) { - mDefaultPermissionPolicy.grantDefaultPermissions(userId); - } - - if (grantPermissionsUserIds == EMPTY_INT_ARRAY) { - // If we did not grant default permissions, we preload from this the - // default permission exceptions lazily to ensure we don't hit the - // disk on a new user creation. - mDefaultPermissionPolicy.scheduleReadDefaultPermissionExceptions(); - } // Now that we've scanned all packages, and granted any default // permissions, ensure permissions are updated. Beware of dragons if you @@ -22943,11 +22815,7 @@ public class PackageManagerService extends IPackageManager.Stub } void onNewUserCreated(final int userId) { - mDefaultPermissionPolicy.grantDefaultPermissions(userId); - synchronized(mPackages) { - // NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG - mPermissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, true); - } + mPermissionManager.onNewUserCreated(userId); } @Override @@ -23531,7 +23399,7 @@ public class PackageManagerService extends IPackageManager.Stub public String getKnownPackageName(int knownPackage, int userId) { switch(knownPackage) { case PackageManagerInternal.PACKAGE_BROWSER: - return getDefaultBrowserPackageName(userId); + return mPermissionManager.getDefaultBrowser(userId); case PackageManagerInternal.PACKAGE_INSTALLER: return mRequiredInstallerPackage; case PackageManagerInternal.PACKAGE_SETUP_WIZARD: @@ -23564,37 +23432,6 @@ public class PackageManagerService extends IPackageManager.Stub && mResolveActivity.name.equals(component.name); } - @Override - public void setLocationPackagesProvider(PackagesProvider provider) { - mDefaultPermissionPolicy.setLocationPackagesProvider(provider); - } - - @Override - public void setLocationExtraPackagesProvider(PackagesProvider provider) { - mDefaultPermissionPolicy.setLocationExtraPackagesProvider(provider); - } - - @Override - public void setVoiceInteractionPackagesProvider(PackagesProvider provider) { - mDefaultPermissionPolicy.setVoiceInteractionPackagesProvider(provider); - } - - @Override - public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) { - mDefaultPermissionPolicy.setUseOpenWifiAppPackagesProvider(provider); - } - - @Override - public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) { - mDefaultPermissionPolicy.setSyncAdapterPackagesProvider(provider); - } - - @Override - public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) { - mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultUseOpenWifiApp( - packageName, userId); - } - @Override public void setKeepUninstalledPackages(final List packageList) { Preconditions.checkNotNull(packageList); @@ -24107,27 +23944,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - @Override - public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) { - synchronized (mPackages) { - mDefaultBrowserProvider = provider; - } - } - - @Override - public void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider) { - synchronized (mPackages) { - mDefaultDialerProvider = provider; - } - } - - @Override - public void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider) { - synchronized (mPackages) { - mDefaultHomeProvider = provider; - } - } - @Override public boolean isApexPackage(String packageName) { return PackageManagerService.this.mApexManager.isApexPackage(packageName); @@ -24173,13 +23989,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - @Override - public boolean wereDefaultPermissionsGrantedSinceBoot(int userId) { - synchronized (mPackages) { - return mDefaultPermissionPolicy.wereDefaultPermissionsGrantedSinceBoot(userId); - } - } - @Override public void setRuntimePermissionsFingerPrint(@NonNull String fingerPrint, @UserIdInt int userId) { @@ -24266,6 +24075,13 @@ public class PackageManagerService extends IPackageManager.Stub && UserHandle.isSameApp(installerPackageSetting.appId, callingUid); } } + + @Override + public boolean areDefaultRuntimePermissionsGranted(int userId) { + synchronized (mPackages) { + return mSettings.areDefaultRuntimePermissionsGrantedLPr(userId); + } + } } @GuardedBy("mPackages") @@ -24334,83 +24150,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - @Override - public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) { - enforceSystemOrPhoneCaller("grantPermissionsToEnabledCarrierApps"); - synchronized (mPackages) { - final long identity = Binder.clearCallingIdentity(); - try { - mDefaultPermissionPolicy.grantDefaultPermissionsToEnabledCarrierApps( - packageNames, userId); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - } - - @Override - public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) { - enforceSystemOrPhoneCaller("grantDefaultPermissionsToEnabledImsServices"); - synchronized (mPackages) { - final long identity = Binder.clearCallingIdentity(); - try { - mDefaultPermissionPolicy.grantDefaultPermissionsToEnabledImsServices( - packageNames, userId); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - } - - @Override - public void grantDefaultPermissionsToEnabledTelephonyDataServices( - String[] packageNames, int userId) { - enforceSystemOrPhoneCaller("grantDefaultPermissionsToEnabledTelephonyDataServices"); - synchronized (mPackages) { - Binder.withCleanCallingIdentity( () -> mDefaultPermissionPolicy. - grantDefaultPermissionsToEnabledTelephonyDataServices( - packageNames, userId)); - } - } - - @Override - public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( - String[] packageNames, int userId) { - enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromDisabledTelephonyDataServices"); - synchronized (mPackages) { - Binder.withCleanCallingIdentity( () -> mDefaultPermissionPolicy. - revokeDefaultPermissionsFromDisabledTelephonyDataServices( - packageNames, userId)); - } - } - - @Override - public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { - enforceSystemOrPhoneCaller("grantDefaultPermissionsToActiveLuiApp"); - synchronized (mPackages) { - final long identity = Binder.clearCallingIdentity(); - try { - mDefaultPermissionPolicy.grantDefaultPermissionsToActiveLuiApp( - packageName, userId); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - } - - @Override - public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) { - enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromLuiApps"); - synchronized (mPackages) { - final long identity = Binder.clearCallingIdentity(); - try { - mDefaultPermissionPolicy.revokeDefaultPermissionsFromLuiApps(packageNames, userId); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - } - void forEachPackage(Consumer actionLocked) { synchronized (mPackages) { int numPackages = mPackages.size(); @@ -24435,14 +24174,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - private static void enforceSystemOrPhoneCaller(String tag) { - int callingUid = Binder.getCallingUid(); - if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) { - throw new SecurityException( - "Cannot call " + tag + " from UID " + callingUid); - } - } - boolean isHistoricalPackageUsageAvailable() { return mPackageUsage.isHistoricalPackageUsageAvailable(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index f56e1ef0de09a..4c7db9afee0a2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -389,6 +389,17 @@ public class PackageManagerServiceUtils { } } + /** + * Enforces that the caller must be either the system process or the phone process. + * If not, throws a {@link SecurityException}. + */ + public static void enforceSystemOrPhoneCaller(String methodName, int callingUid) { + if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) { + throw new SecurityException( + "Cannot call " + methodName + " from UID " + callingUid); + } + } + /** * Derive the value of the {@code cpuAbiOverride} based on the provided * value and an optional stored value from the package settings. diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index db01d7754d06c..be7e8106fadd3 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -34,8 +34,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; -import android.content.pm.PackageManagerInternal.PackagesProvider; -import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider; import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; @@ -69,6 +67,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.LocalServices; +import com.android.server.pm.permission.PermissionManagerServiceInternal.PackagesProvider; +import com.android.server.pm.permission.PermissionManagerServiceInternal.SyncAdapterPackagesProvider; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 9d0b42716e7ab..00149fcdf7b36 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -118,6 +118,9 @@ import com.android.server.pm.PackageManagerServiceUtils; import com.android.server.pm.PackageSetting; import com.android.server.pm.SharedUserSetting; import com.android.server.pm.UserManagerService; +import com.android.server.pm.permission.PermissionManagerServiceInternal.DefaultBrowserProvider; +import com.android.server.pm.permission.PermissionManagerServiceInternal.DefaultDialerProvider; +import com.android.server.pm.permission.PermissionManagerServiceInternal.DefaultHomeProvider; import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback; import com.android.server.pm.permission.PermissionsState.PermissionState; import com.android.server.policy.SoftRestrictedPermissionPolicy; @@ -250,6 +253,15 @@ public class PermissionManagerService extends IPermissionManager.Stub { @GuardedBy("mLock") private final OnPermissionChangeListeners mOnPermissionChangeListeners; + @GuardedBy("mLock") + private DefaultBrowserProvider mDefaultBrowserProvider; + + @GuardedBy("mLock") + private DefaultDialerProvider mDefaultDialerProvider; + + @GuardedBy("mLock") + private DefaultHomeProvider mDefaultHomeProvider; + // TODO: Take a look at the methods defined in the callback. // The callback was initially created to support the split between permission // manager and the package manager. However, it's started to be used for other @@ -1609,6 +1621,127 @@ public class PermissionManagerService extends IPermissionManager.Stub { mPackageManagerInt.writePermissionSettings(asyncUpdatedUsers.toArray(), true); } + @Override + public String getDefaultBrowser(int userId) { + final int callingUid = Binder.getCallingUid(); + if (UserHandle.getUserId(callingUid) != userId) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); + } + if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) { + return null; + } + synchronized (mLock) { + return mDefaultBrowserProvider == null + ? null : mDefaultBrowserProvider.getDefaultBrowser(userId); + } + } + + @Override + public boolean setDefaultBrowser(String packageName, int userId) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); + if (UserHandle.getCallingUserId() != userId) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); + } + return setDefaultBrowserInternal(packageName, false, true, userId); + } + + private boolean setDefaultBrowserInternal(String packageName, boolean async, + boolean doGrant, int userId) { + synchronized (mLock) { + if (userId == UserHandle.USER_ALL) { + return false; + } + if (mDefaultBrowserProvider == null) { + return false; + } + if (async) { + mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId); + } else { + if (!mDefaultBrowserProvider.setDefaultBrowser(packageName, userId)) { + return false; + } + } + if (doGrant && packageName != null) { + mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToDefaultBrowser(packageName, userId); + } + } + return true; + } + + @Override + public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils + .enforceSystemOrPhoneCaller("grantPermissionsToEnabledCarrierApps", callingUid); + synchronized (mLock) { + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId)); + } + } + + @Override + public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "grantDefaultPermissionsToEnabledImsServices", callingUid); + synchronized (mLock) { + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToEnabledImsServices(packageNames, userId)); + } + } + + @Override + public void grantDefaultPermissionsToEnabledTelephonyDataServices( + String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "grantDefaultPermissionsToEnabledTelephonyDataServices", callingUid); + synchronized (mLock) { + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToEnabledTelephonyDataServices( + packageNames, userId)); + } + } + + @Override + public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( + String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "revokeDefaultPermissionsFromDisabledTelephonyDataServices", callingUid); + synchronized (mLock) { + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .revokeDefaultPermissionsFromDisabledTelephonyDataServices( + packageNames, userId)); + } + } + + @Override + public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils + .enforceSystemOrPhoneCaller("grantDefaultPermissionsToActiveLuiApp", callingUid); + synchronized (mLock) { + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToActiveLuiApp(packageName, userId)); + } + } + + @Override + public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils + .enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromLuiApps", callingUid); + synchronized (mLock) { + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .revokeDefaultPermissionsFromLuiApps(packageNames, userId)); + } + } + /** * Get the state of the runtime permissions as xml file. * @@ -3714,6 +3847,24 @@ public class PermissionManagerService extends IPermissionManager.Stub { } mPermissionControllerManager = mContext.getSystemService(PermissionControllerManager.class); + + int[] grantPermissionsUserIds = EMPTY_INT_ARRAY; + for (int userId : UserManagerService.getInstance().getUserIds()) { + if (!mPackageManagerInt.areDefaultRuntimePermissionsGranted(userId)) { + grantPermissionsUserIds = ArrayUtils.appendInt( + grantPermissionsUserIds, userId); + } + } + // If we upgraded grant all default permissions before kicking off. + for (int userId : grantPermissionsUserIds) { + mDefaultPermissionGrantPolicy.grantDefaultPermissions(userId); + } + if (grantPermissionsUserIds == EMPTY_INT_ARRAY) { + // If we did not grant default permissions, we preload from this the + // default permission exceptions lazily to ensure we don't hit the + // disk on a new user creation. + mDefaultPermissionGrantPolicy.scheduleReadDefaultPermissionExceptions(); + } } private static String getVolumeUuidForPackage(PackageParser.Package pkg) { @@ -3882,10 +4033,6 @@ public class PermissionManagerService extends IPermissionManager.Stub { return mSettings; } @Override - public DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy() { - return mDefaultPermissionGrantPolicy; - } - @Override public BasePermission getPermissionTEMP(String permName) { synchronized (PermissionManagerService.this.mLock) { return mSettings.getPermissionLocked(permName); @@ -3956,6 +4103,168 @@ public class PermissionManagerService extends IPermissionManager.Stub { mCheckPermissionDelegate = delegate; } } + + @Override + public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) { + synchronized (mLock) { + mDefaultBrowserProvider = provider; + } + } + + @Override + public void setDefaultBrowser(String packageName, boolean async, boolean doGrant, + int userId) { + setDefaultBrowserInternal(packageName, async, doGrant, userId); + } + + @Override + public void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider) { + synchronized (mLock) { + mDefaultDialerProvider = provider; + } + } + + @Override + public void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider) { + synchronized (mLock) { + mDefaultHomeProvider = provider; + } + } + + @Override + public void setDefaultHome(String packageName, int userId, Consumer callback) { + synchronized (mLock) { + if (userId == UserHandle.USER_ALL) { + return; + } + if (mDefaultHomeProvider == null) { + return; + } + mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId, callback); + } + } + + @Override + public void setDialerAppPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setDialerAppPackagesProvider(provider); + } + } + + @Override + public void setLocationExtraPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setLocationExtraPackagesProvider(provider); + } + } + + @Override + public void setLocationPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setLocationPackagesProvider(provider); + } + } + + @Override + public void setSimCallManagerPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setSimCallManagerPackagesProvider(provider); + } + } + + @Override + public void setSmsAppPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setSmsAppPackagesProvider(provider); + } + } + + @Override + public void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setSyncAdapterPackagesProvider(provider); + } + } + + @Override + public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setUseOpenWifiAppPackagesProvider(provider); + } + } + + @Override + public void setVoiceInteractionPackagesProvider(PackagesProvider provider) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.setVoiceInteractionPackagesProvider(provider); + } + } + + @Override + public String getDefaultBrowser(int userId) { + synchronized (mLock) { + return mDefaultBrowserProvider == null + ? null : mDefaultBrowserProvider.getDefaultBrowser(userId); + } + } + + @Override + public String getDefaultDialer(int userId) { + synchronized (mLock) { + return mDefaultDialerProvider == null + ? null : mDefaultDialerProvider.getDefaultDialer(userId); + } + } + + @Override + public String getDefaultHome(int userId) { + synchronized (mLock) { + return mDefaultHomeProvider == null + ? null : mDefaultHomeProvider.getDefaultHome(userId); + } + } + + @Override + public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToDefaultSimCallManager(packageName, userId); + } + } + + @Override + public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToDefaultUseOpenWifiApp(packageName, userId); + } + } + + @Override + public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToDefaultBrowser(packageName, userId); + } + } + + @Override + public boolean wereDefaultPermissionsGrantedSinceBoot(int userId) { + synchronized (mLock) { + return mDefaultPermissionGrantPolicy.wereDefaultPermissionsGrantedSinceBoot(userId); + } + } + + @Override + public void onNewUserCreated(int userId) { + synchronized (mLock) { + mDefaultPermissionGrantPolicy.grantDefaultPermissions(userId); + // NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG + PermissionManagerService.this.updateAllPermissions( + StorageManager.UUID_PRIVATE_INTERNAL, true, mDefaultPermissionCallback); + } + } + @Override public void notifyPermissionsChangedTEMP(int uid) { mOnPermissionChangeListeners.onPermissionsChanged(uid); diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 2fdab4d4d125e..68387e280b233 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -27,6 +27,7 @@ import android.permission.PermissionManagerInternal; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; /** * Internal interfaces services. @@ -34,6 +35,109 @@ import java.util.List; * TODO: Should be merged into PermissionManagerInternal, but currently uses internal classes. */ public abstract class PermissionManagerServiceInternal extends PermissionManagerInternal { + /** + * Provider for package names. + */ + public interface PackagesProvider { + + /** + * Gets the packages for a given user. + * @param userId The user id. + * @return The package names. + */ + String[] getPackages(int userId); + } + + /** + * Provider for package names. + */ + public interface SyncAdapterPackagesProvider { + + /** + * Gets the sync adapter packages for given authority and user. + * @param authority The authority. + * @param userId The user id. + * @return The package names. + */ + String[] getPackages(String authority, int userId); + } + + /** + * Provider for default browser + */ + public interface DefaultBrowserProvider { + + /** + * Get the package name of the default browser. + * + * @param userId the user id + * + * @return the package name of the default browser, or {@code null} if none + */ + @Nullable + String getDefaultBrowser(@UserIdInt int userId); + + /** + * Set the package name of the default browser. + * + * @param packageName package name of the default browser, or {@code null} to remove + * @param userId the user id + * + * @return whether the default browser was successfully set. + */ + boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId); + + /** + * Set the package name of the default browser asynchronously. + * + * @param packageName package name of the default browser, or {@code null} to remove + * @param userId the user id + */ + void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId); + } + + /** + * Provider for default dialer + */ + public interface DefaultDialerProvider { + + /** + * Get the package name of the default dialer. + * + * @param userId the user id + * + * @return the package name of the default dialer, or {@code null} if none + */ + @Nullable + String getDefaultDialer(@UserIdInt int userId); + } + + /** + * Provider for default home + */ + public interface DefaultHomeProvider { + + /** + * Get the package name of the default home. + * + * @param userId the user id + * + * @return the package name of the default home, or {@code null} if none + */ + @Nullable + String getDefaultHome(@UserIdInt int userId); + + /** + * Set the package name of the default home. + * + * @param packageName package name of the default home, or {@code null} to remove + * @param userId the user id + * @param callback the callback made after the default home as been updated + */ + void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId, + @NonNull Consumer callback); + } + /** * Callbacks invoked when interesting actions have been taken on a permission. *

@@ -189,7 +293,10 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager public abstract void enforceGrantRevokeRuntimePermissionPermissions(@NonNull String message); public abstract @NonNull PermissionSettings getPermissionSettings(); - public abstract @NonNull DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy(); + + /** Grants default browser permissions to the given package */ + public abstract void grantDefaultPermissionsToDefaultBrowser( + @NonNull String packageName, @UserIdInt int userId); /** HACK HACK methods to allow for partial migration of data to the PermissionManager class */ public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName); @@ -214,4 +321,142 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param delegate A delegate instance or {@code null} to clear. */ public abstract void setCheckPermissionDelegate(@Nullable CheckPermissionDelegate delegate); + + /** + * Sets the dialer application packages provider. + * @param provider The provider. + */ + public abstract void setDialerAppPackagesProvider(PackagesProvider provider); + + /** + * Set the location extra packages provider. + * @param provider The packages provider. + */ + public abstract void setLocationExtraPackagesProvider(PackagesProvider provider); + + /** + * Sets the location provider packages provider. + * @param provider The packages provider. + */ + public abstract void setLocationPackagesProvider(PackagesProvider provider); + + /** + * Sets the SIM call manager packages provider. + * @param provider The provider. + */ + public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider); + + /** + * Sets the SMS application packages provider. + * @param provider The provider. + */ + public abstract void setSmsAppPackagesProvider(PackagesProvider provider); + + /** + * Sets the sync adapter packages provider. + * @param provider The provider. + */ + public abstract void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider); + + /** + * Sets the Use Open Wifi packages provider. + * @param provider The packages provider. + */ + public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider); + + /** + * Sets the voice interaction packages provider. + * @param provider The packages provider. + */ + public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider); + + /** + * Sets the default browser provider. + * + * @param provider the provider + */ + public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider); + + /** + * Sets the package name of the default browser provider for the given user. + * + * @param packageName The package name of the default browser or {@code null} + * to clear the default browser + * @param async If {@code true}, set the default browser asynchronously, + * otherwise set it synchronously + * @param doGrant If {@code true} and if {@code packageName} is not {@code null}, + * perform default permission grants on the browser, otherwise skip the + * default permission grants. + * @param userId The user to set the default browser for. + */ + public abstract void setDefaultBrowser(@Nullable String packageName, boolean async, + boolean doGrant, @UserIdInt int userId); + + /** + * Sets the default dialer provider. + * + * @param provider the provider + */ + public abstract void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider); + + /** + * Sets the default home provider. + * + * @param provider the provider + */ + public abstract void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider); + + /** + * Asynchronously sets the package name of the default home provider for the given user. + * + * @param packageName The package name of the default home or {@code null} + * to clear the default browser + * @param userId The user to set the default browser for + * @param callback Invoked after the default home has been set + */ + public abstract void setDefaultHome(@Nullable String packageName, @UserIdInt int userId, + @NonNull Consumer callback); + + /** + * Returns the default browser package name for the given user. + */ + @Nullable + public abstract String getDefaultBrowser(@UserIdInt int userId); + + /** + * Returns the default dialer package name for the given user. + */ + @Nullable + public abstract String getDefaultDialer(@UserIdInt int userId); + + /** + * Returns the default home package name for the given user. + */ + @Nullable + public abstract String getDefaultHome(@UserIdInt int userId); + + /** + * Requests granting of the default permissions to the current default Use Open Wifi app. + * @param packageName The default use open wifi package name. + * @param userId The user for which to grant the permissions. + */ + public abstract void grantDefaultPermissionsToDefaultSimCallManager( + @NonNull String packageName, @UserIdInt int userId); + + /** + * Requests granting of the default permissions to the current default Use Open Wifi app. + * @param packageName The default use open wifi package name. + * @param userId The user for which to grant the permissions. + */ + public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp( + @NonNull String packageName, @UserIdInt int userId); + + /** + * Returns whether or not default permission grants have been performed for the given + * user since the device booted. + */ + public abstract boolean wereDefaultPermissionsGrantedSinceBoot(@UserIdInt int userId); + + /** Called when a new user has been created. */ + public abstract void onNewUserCreated(@UserIdInt int userId); } diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 037293f9536c2..969205db73972 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -260,9 +260,11 @@ public final class PermissionPolicyService extends SystemService { private void grantOrUpgradeDefaultRuntimePermissionsIfNeeded(@UserIdInt int userId) { if (DEBUG) Slog.i(LOG_TAG, "grantOrUpgradeDefaultPermsIfNeeded(" + userId + ")"); - final PackageManagerInternal packageManagerInternal = LocalServices.getService( - PackageManagerInternal.class); - if (packageManagerInternal.wereDefaultPermissionsGrantedSinceBoot(userId)) { + final PackageManagerInternal packageManagerInternal = + LocalServices.getService(PackageManagerInternal.class); + final PermissionManagerServiceInternal permissionManagerInternal = + LocalServices.getService(PermissionManagerServiceInternal.class); + if (permissionManagerInternal.wereDefaultPermissionsGrantedSinceBoot(userId)) { if (DEBUG) Slog.i(LOG_TAG, "defaultPermsWereGrantedSinceBoot(" + userId + ")"); // Now call into the permission controller to apply policy around permissions diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index c6a1867fa1e98..79505cb07a071 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -49,7 +49,6 @@ import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.UserHandle; import android.os.UserManagerInternal; -import android.provider.Telephony; import android.service.sms.FinancialSmsService; import android.telephony.IFinancialSmsCallback; import android.text.TextUtils; @@ -74,6 +73,7 @@ import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; @@ -155,11 +155,11 @@ public class RoleManagerService extends SystemService implements RoleUserState.C LocalServices.addService(RoleManagerInternal.class, new Internal()); - PackageManagerInternal packageManagerInternal = LocalServices.getService( - PackageManagerInternal.class); - packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider()); - packageManagerInternal.setDefaultDialerProvider(new DefaultDialerProvider()); - packageManagerInternal.setDefaultHomeProvider(new DefaultHomeProvider()); + PermissionManagerServiceInternal permissionManagerInternal = + LocalServices.getService(PermissionManagerServiceInternal.class); + permissionManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider()); + permissionManagerInternal.setDefaultDialerProvider(new DefaultDialerProvider()); + permissionManagerInternal.setDefaultHomeProvider(new DefaultHomeProvider()); registerUserRemovedReceiver(); } @@ -731,7 +731,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } - private class DefaultBrowserProvider implements PackageManagerInternal.DefaultBrowserProvider { + private class DefaultBrowserProvider implements + PermissionManagerServiceInternal.DefaultBrowserProvider { @Nullable @Override @@ -785,7 +786,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } - private class DefaultDialerProvider implements PackageManagerInternal.DefaultDialerProvider { + private class DefaultDialerProvider implements + PermissionManagerServiceInternal.DefaultDialerProvider { @Nullable @Override @@ -795,7 +797,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } - private class DefaultHomeProvider implements PackageManagerInternal.DefaultHomeProvider { + private class DefaultHomeProvider implements + PermissionManagerServiceInternal.DefaultHomeProvider { @Nullable @Override diff --git a/services/core/java/com/android/server/telecom/TelecomLoaderService.java b/services/core/java/com/android/server/telecom/TelecomLoaderService.java index 54369ca5c367e..a853529f49e43 100644 --- a/services/core/java/com/android/server/telecom/TelecomLoaderService.java +++ b/services/core/java/com/android/server/telecom/TelecomLoaderService.java @@ -39,7 +39,6 @@ import com.android.internal.telephony.SmsApplication; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.pm.UserManagerService; -import com.android.server.pm.permission.DefaultPermissionGrantPolicy; import com.android.server.pm.permission.PermissionManagerServiceInternal; /** @@ -66,9 +65,9 @@ public class TelecomLoaderService extends SystemService { ServiceManager.addService(Context.TELECOM_SERVICE, service); synchronized (mLock) { + final PermissionManagerServiceInternal permissionManager = + LocalServices.getService(PermissionManagerServiceInternal.class); if (mDefaultSimCallManagerRequests != null) { - final DefaultPermissionGrantPolicy permissionPolicy = - getDefaultPermissionGrantPolicy(); if (mDefaultSimCallManagerRequests != null) { TelecomManager telecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); @@ -80,7 +79,7 @@ public class TelecomLoaderService extends SystemService { for (int i = requestCount - 1; i >= 0; i--) { final int userId = mDefaultSimCallManagerRequests.get(i); mDefaultSimCallManagerRequests.remove(i); - permissionPolicy + permissionManager .grantDefaultPermissionsToDefaultSimCallManager( packageName, userId); } @@ -99,11 +98,6 @@ public class TelecomLoaderService extends SystemService { } } - private DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy() { - return LocalServices.getService(PermissionManagerServiceInternal.class) - .getDefaultPermissionGrantPolicy(); - } - private static final ComponentName SERVICE_COMPONENT = new ComponentName( "com.android.server.telecom", "com.android.server.telecom.components.TelecomService"); @@ -162,10 +156,11 @@ public class TelecomLoaderService extends SystemService { private void registerDefaultAppProviders() { - final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy(); + final PermissionManagerServiceInternal permissionManager = + LocalServices.getService(PermissionManagerServiceInternal.class); // Set a callback for the permission grant policy to query the default sms app. - permissionPolicy.setSmsAppPackagesProvider(userId -> { + permissionManager.setSmsAppPackagesProvider(userId -> { synchronized (mLock) { if (mServiceConnection == null) { return null; @@ -180,7 +175,7 @@ public class TelecomLoaderService extends SystemService { }); // Set a callback for the permission grant policy to query the default dialer app. - permissionPolicy.setDialerAppPackagesProvider(userId -> { + permissionManager.setDialerAppPackagesProvider(userId -> { synchronized (mLock) { if (mServiceConnection == null) { return null; @@ -194,7 +189,7 @@ public class TelecomLoaderService extends SystemService { }); // Set a callback for the permission grant policy to query the default sim call manager. - permissionPolicy.setSimCallManagerPackagesProvider(userId -> { + permissionManager.setSimCallManagerPackagesProvider(userId -> { synchronized (mLock) { if (mServiceConnection == null) { if (mDefaultSimCallManagerRequests == null) { @@ -215,12 +210,11 @@ public class TelecomLoaderService extends SystemService { } private void registerDefaultAppNotifier() { - final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy(); // Notify the package manager on default app changes final RoleManager roleManager = mContext.getSystemService(RoleManager.class); roleManager.addOnRoleHoldersChangedListenerAsUser(mContext.getMainExecutor(), - (roleName, user) -> updateSimCallManagerPermissions(permissionPolicy, - user.getIdentifier()), UserHandle.ALL); + (roleName, user) -> updateSimCallManagerPermissions(user.getIdentifier()), + UserHandle.ALL); } @@ -230,7 +224,7 @@ public class TelecomLoaderService extends SystemService { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { for (int userId : UserManagerService.getInstance().getUserIds()) { - updateSimCallManagerPermissions(getDefaultPermissionGrantPolicy(), userId); + updateSimCallManagerPermissions(userId); } } } @@ -240,16 +234,16 @@ public class TelecomLoaderService extends SystemService { new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null, null); } - private void updateSimCallManagerPermissions( - DefaultPermissionGrantPolicy permissionGrantPolicy, int userId) { + private void updateSimCallManagerPermissions(int userId) { + final PermissionManagerServiceInternal permissionManager = + LocalServices.getService(PermissionManagerServiceInternal.class); TelecomManager telecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId); if (phoneAccount != null) { Slog.i(TAG, "updating sim call manager permissions for userId:" + userId); String packageName = phoneAccount.getComponentName().getPackageName(); - permissionGrantPolicy.grantDefaultPermissionsToDefaultSimCallManager( - packageName, userId); + permissionManager.grantDefaultPermissionsToDefaultSimCallManager(packageName, userId); } } } diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java index e9e96c9c7efb8..1ad7b6e8d155a 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java @@ -72,6 +72,7 @@ import androidx.test.filters.MediumTest; import androidx.test.runner.AndroidJUnit4; import com.android.server.devicepolicy.MockUtils; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.google.android.collect.Lists; @@ -132,9 +133,10 @@ public class NetworkScoreServiceTest { @Mock private UnaryOperator> mScanResultsFilter; @Mock private WifiInfo mWifiInfo; @Mock private NetworkScoreService.ScoringServiceConnection mServiceConnection; - @Mock private PackageManagerInternal mPackageManagerInternal; + @Mock private PermissionManagerServiceInternal mPermissionManagerInternal; @Captor private ArgumentCaptor> mScoredNetworkCaptor; - @Captor private ArgumentCaptor mPackagesProviderCaptor; + @Captor private + ArgumentCaptor mPackagesProviderCaptor; private ContentResolver mContentResolver; private NetworkScoreService mNetworkScoreService; @@ -162,7 +164,8 @@ public class NetworkScoreServiceTest { when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER); mHandlerThread = new HandlerThread("NetworkScoreServiceTest"); mHandlerThread.start(); - LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); + LocalServices.addService( + PermissionManagerServiceInternal.class, mPermissionManagerInternal); mNetworkScoreService = new NetworkScoreService(mContext, mNetworkScorerAppManager, networkScorerAppData -> mServiceConnection, mHandlerThread.getLooper()); WifiConfiguration configuration = new WifiConfiguration(); @@ -196,7 +199,7 @@ public class NetworkScoreServiceTest { Settings.Global.putString(mContentResolver, Settings.Global.USE_OPEN_WIFI_PACKAGE, "com.some.app"); - verify(mPackageManagerInternal) + verify(mPermissionManagerInternal) .setUseOpenWifiAppPackagesProvider(mPackagesProviderCaptor.capture()); String[] packages = mPackagesProviderCaptor.getValue().getPackages(0); @@ -209,7 +212,7 @@ public class NetworkScoreServiceTest { Settings.Global.putString(mContentResolver, Settings.Global.USE_OPEN_WIFI_PACKAGE, "com.some.other.app"); - verify(mPackageManagerInternal, timeout(500)) + verify(mPermissionManagerInternal, timeout(500)) .grantDefaultPermissionsToDefaultUseOpenWifiApp("com.some.other.app", 0); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index e1ffb0f179f84..b2fde548e5060 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -33,7 +33,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.ShortcutServiceInternal; @@ -79,6 +78,7 @@ import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.UiThread; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.soundtrigger.SoundTriggerInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -120,10 +120,10 @@ public class VoiceInteractionManagerService extends SystemService { mUserManager = Preconditions.checkNotNull( context.getSystemService(UserManager.class)); - PackageManagerInternal packageManagerInternal = LocalServices.getService( - PackageManagerInternal.class); - packageManagerInternal.setVoiceInteractionPackagesProvider( - new PackageManagerInternal.PackagesProvider() { + PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService( + PermissionManagerServiceInternal.class); + permissionManagerInternal.setVoiceInteractionPackagesProvider( + new PermissionManagerServiceInternal.PackagesProvider() { @Override public String[] getPackages(int userId) { mServiceStub.initForUser(userId); diff --git a/telephony/java/com/android/internal/telephony/CarrierAppUtils.java b/telephony/java/com/android/internal/telephony/CarrierAppUtils.java index a1bea4d417f97..6498e498bfbe7 100644 --- a/telephony/java/com/android/internal/telephony/CarrierAppUtils.java +++ b/telephony/java/com/android/internal/telephony/CarrierAppUtils.java @@ -22,6 +22,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.os.RemoteException; +import android.permission.IPermissionManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.ArrayMap; @@ -71,8 +72,8 @@ public final class CarrierAppUtils { * privileged apps may have changed. */ public synchronized static void disableCarrierAppsUntilPrivileged(String callingPackage, - IPackageManager packageManager, TelephonyManager telephonyManager, - ContentResolver contentResolver, int userId) { + IPackageManager packageManager, IPermissionManager permissionManager, + TelephonyManager telephonyManager, ContentResolver contentResolver, int userId) { if (DEBUG) { Slog.d(TAG, "disableCarrierAppsUntilPrivileged"); } @@ -81,8 +82,8 @@ public final class CarrierAppUtils { config.getDisabledUntilUsedPreinstalledCarrierApps(); ArrayMap> systemCarrierAssociatedAppsDisabledUntilUsed = config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); - disableCarrierAppsUntilPrivileged(callingPackage, packageManager, telephonyManager, - contentResolver, userId, systemCarrierAppsDisabledUntilUsed, + disableCarrierAppsUntilPrivileged(callingPackage, packageManager, permissionManager, + telephonyManager, contentResolver, userId, systemCarrierAppsDisabledUntilUsed, systemCarrierAssociatedAppsDisabledUntilUsed); } @@ -98,7 +99,8 @@ public final class CarrierAppUtils { * Manager can kill it, and this can lead to crashes as the app is in an unexpected state. */ public synchronized static void disableCarrierAppsUntilPrivileged(String callingPackage, - IPackageManager packageManager, ContentResolver contentResolver, int userId) { + IPackageManager packageManager, IPermissionManager permissionManager, + ContentResolver contentResolver, int userId) { if (DEBUG) { Slog.d(TAG, "disableCarrierAppsUntilPrivileged"); } @@ -109,7 +111,7 @@ public final class CarrierAppUtils { ArrayMap> systemCarrierAssociatedAppsDisabledUntilUsed = config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); - disableCarrierAppsUntilPrivileged(callingPackage, packageManager, + disableCarrierAppsUntilPrivileged(callingPackage, packageManager, permissionManager, null /* telephonyManager */, contentResolver, userId, systemCarrierAppsDisabledUntilUsed, systemCarrierAssociatedAppsDisabledUntilUsed); } @@ -117,7 +119,8 @@ public final class CarrierAppUtils { // Must be public b/c framework unit tests can't access package-private methods. @VisibleForTesting public static void disableCarrierAppsUntilPrivileged(String callingPackage, - IPackageManager packageManager, @Nullable TelephonyManager telephonyManager, + IPackageManager packageManager, IPermissionManager permissionManager, + @Nullable TelephonyManager telephonyManager, ContentResolver contentResolver, int userId, ArraySet systemCarrierAppsDisabledUntilUsed, ArrayMap> systemCarrierAssociatedAppsDisabledUntilUsed) { @@ -256,7 +259,7 @@ public final class CarrierAppUtils { // apps. String[] packageNames = new String[enabledCarrierPackages.size()]; enabledCarrierPackages.toArray(packageNames); - packageManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId); + permissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId); } } catch (RemoteException e) { Slog.w(TAG, "Could not reach PackageManager", e);