diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index e14d7e895f17c..5a69e6bdef301 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -173,6 +173,22 @@ public abstract class PackageManagerInternal { 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 */ @@ -229,14 +245,6 @@ public abstract class PackageManagerInternal { */ public abstract void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider); - /** - * Called when the package for the default dialer changed - * - * @param packageName the new dialer package - * @param userId user for which the change was made - */ - public void onDefaultDialerAppChanged(String packageName, int userId) {} - /** * Called when the package for the default SMS handler changed * @@ -931,6 +939,13 @@ public abstract class PackageManagerInternal { */ 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. * diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 56ec106d3fa76..733cc6941487d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1008,6 +1008,9 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mPackages") private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider; + @GuardedBy("mPackages") + private PackageManagerInternal.DefaultDialerProvider mDefaultDialerProvider; + @GuardedBy("mPackages") private PackageManagerInternal.DefaultHomeProvider mDefaultHomeProvider; @@ -13982,10 +13985,17 @@ public class PackageManagerService extends IPackageManager.Stub return resolveInfo == null ? null : resolveInfo.activityInfo.packageName; } - private String getDefaultDialerPackageName(int userId) { + @Nullable + private String getDefaultDialerPackageName(@UserIdInt int userId) { + PackageManagerInternal.DefaultDialerProvider provider; synchronized (mPackages) { - return mSettings.getDefaultDialerPackageNameLPw(userId); + provider = mDefaultDialerProvider; } + if (provider == null) { + Slog.e(TAG, "mDefaultDialerProvider is null"); + return null; + } + return provider.getDefaultDialer(userId); } @Override @@ -24215,13 +24225,6 @@ public class PackageManagerService extends IPackageManager.Stub mDefaultPermissionPolicy.setSyncAdapterPackagesProvider(provider); } - @Override - public void onDefaultDialerAppChanged(String packageName, int userId) { - synchronized (mPackages) { - mSettings.setDefaultDialerPackageNameLPw(packageName, userId); - } - } - @Override public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) { mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultUseOpenWifiApp( @@ -24767,6 +24770,13 @@ public class PackageManagerService extends IPackageManager.Stub } } + @Override + public void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider) { + synchronized (mPackages) { + mDefaultDialerProvider = provider; + } + } + @Override public void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider) { synchronized (mPackages) { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index a55876fd45610..4e897d2a5b64d 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -362,9 +362,6 @@ public final class Settings { // For every user, it is used to find the package name of the default Browser App. final SparseArray mDefaultBrowserApp = new SparseArray(); - // For every user, a record of the package name of the default Dialer App. - final SparseArray mDefaultDialerApp = new SparseArray(); - // App-link priority tracking, per-user final SparseIntArray mNextAppLinkGeneration = new SparseIntArray(); @@ -1270,19 +1267,6 @@ public final class Settings { return (userId == UserHandle.USER_ALL) ? null : mDefaultBrowserApp.removeReturnOld(userId); } - boolean setDefaultDialerPackageNameLPw(String packageName, int userId) { - if (userId == UserHandle.USER_ALL) { - return false; - } - mDefaultDialerApp.put(userId, packageName); - writePackageRestrictionsLPr(userId); - return true; - } - - String getDefaultDialerPackageNameLPw(int userId) { - return (userId == UserHandle.USER_ALL) ? null : mDefaultDialerApp.get(userId); - } - private File getUserPackagesStateFile(int userId) { // TODO: Implement a cleaner solution when adding tests. // This instead of Environment.getUserSystemDirectory(userId) to support testing. @@ -1482,8 +1466,7 @@ public final class Settings { String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); mDefaultBrowserApp.put(userId, packageName); } else if (tagName.equals(TAG_DEFAULT_DIALER)) { - String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); - mDefaultDialerApp.put(userId, packageName); + // Ignored. } else { String msg = "Unknown element under " + TAG_DEFAULT_APPS + ": " + parser.getName(); @@ -1938,12 +1921,6 @@ public final class Settings { serializer.attribute(null, ATTR_PACKAGE_NAME, defaultBrowser); serializer.endTag(null, TAG_DEFAULT_BROWSER); } - String defaultDialer = mDefaultDialerApp.get(userId); - if (!TextUtils.isEmpty(defaultDialer)) { - serializer.startTag(null, TAG_DEFAULT_DIALER); - serializer.attribute(null, ATTR_PACKAGE_NAME, defaultDialer); - serializer.endTag(null, TAG_DEFAULT_DIALER); - } serializer.endTag(null, TAG_DEFAULT_APPS); } 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 4fdf1bc58e050..82737521aa3ad 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -849,21 +849,6 @@ public final class DefaultPermissionGrantPolicy { grantPermissionsToSystemPackage(useOpenWifiPackage, userId, ALWAYS_LOCATION_PERMISSIONS); } - public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) { - Log.i(TAG, "Granting permissions to default sms app for user:" + userId); - grantIgnoringSystemPackage(packageName, userId, - PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS, STORAGE_PERMISSIONS, - MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS); - } - - public void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId) { - mServiceInternal.onDefaultDialerAppChanged(packageName, userId); - Log.i(TAG, "Granting permissions to default dialer app for user:" + userId); - grantIgnoringSystemPackage(packageName, userId, - PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS, - MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS); - } - public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) { Log.i(TAG, "Granting permissions to default Use Open WiFi app for user:" + userId); grantIgnoringSystemPackage(packageName, userId, ALWAYS_LOCATION_PERMISSIONS); diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index 0e20905db32aa..33803b7420421 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -156,6 +156,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider()); + packageManagerInternal.setDefaultDialerProvider(new DefaultDialerProvider()); packageManagerInternal.setDefaultHomeProvider(new DefaultHomeProvider()); registerUserRemovedReceiver(); @@ -772,6 +773,16 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } + private class DefaultDialerProvider implements PackageManagerInternal.DefaultDialerProvider { + + @Nullable + @Override + public String getDefaultDialer(@UserIdInt int userId) { + return CollectionUtils.firstOrNull(getOrCreateUserState(userId).getRoleHolders( + RoleManager.ROLE_DIALER)); + } + } + private class DefaultHomeProvider implements PackageManagerInternal.DefaultHomeProvider { @Nullable diff --git a/services/core/java/com/android/server/telecom/TelecomLoaderService.java b/services/core/java/com/android/server/telecom/TelecomLoaderService.java index f581bc0bca46b..e65eae0ab1565 100644 --- a/services/core/java/com/android/server/telecom/TelecomLoaderService.java +++ b/services/core/java/com/android/server/telecom/TelecomLoaderService.java @@ -70,38 +70,9 @@ public class TelecomLoaderService extends SystemService { ServiceManager.addService(Context.TELECOM_SERVICE, service); synchronized (mLock) { - if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null - || mDefaultSimCallManagerRequests != null) { + if (mDefaultSimCallManagerRequests != null) { final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy(); - - if (mDefaultSmsAppRequests != null) { - ComponentName smsComponent = SmsApplication.getDefaultSmsApplication( - mContext, true); - if (smsComponent != null) { - final int requestCount = mDefaultSmsAppRequests.size(); - for (int i = requestCount - 1; i >= 0; i--) { - final int userid = mDefaultSmsAppRequests.get(i); - mDefaultSmsAppRequests.remove(i); - permissionPolicy.grantDefaultPermissionsToDefaultSmsApp( - smsComponent.getPackageName(), userid); - } - } - } - - if (mDefaultDialerAppRequests != null) { - String packageName = DefaultDialerManager.getDefaultDialerApplication( - mContext); - if (packageName != null) { - final int requestCount = mDefaultDialerAppRequests.size(); - for (int i = requestCount - 1; i >= 0; i--) { - final int userId = mDefaultDialerAppRequests.get(i); - mDefaultDialerAppRequests.remove(i); - permissionPolicy.grantDefaultPermissionsToDefaultDialerApp( - packageName, userId); - } - } - } if (mDefaultSimCallManagerRequests != null) { TelecomManager telecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); @@ -145,12 +116,6 @@ public class TelecomLoaderService extends SystemService { private final Object mLock = new Object(); - @GuardedBy("mLock") - private IntArray mDefaultSmsAppRequests; - - @GuardedBy("mLock") - private IntArray mDefaultDialerAppRequests; - @GuardedBy("mLock") private IntArray mDefaultSimCallManagerRequests; @@ -207,10 +172,6 @@ public class TelecomLoaderService extends SystemService { permissionPolicy.setSmsAppPackagesProvider(userId -> { synchronized (mLock) { if (mServiceConnection == null) { - if (mDefaultSmsAppRequests == null) { - mDefaultSmsAppRequests = new IntArray(); - } - mDefaultSmsAppRequests.add(userId); return null; } } @@ -226,10 +187,6 @@ public class TelecomLoaderService extends SystemService { permissionPolicy.setDialerAppPackagesProvider(userId -> { synchronized (mLock) { if (mServiceConnection == null) { - if (mDefaultDialerAppRequests == null) { - mDefaultDialerAppRequests = new IntArray(); - } - mDefaultDialerAppRequests.add(userId); return null; } } @@ -263,38 +220,18 @@ public class TelecomLoaderService extends SystemService { private void registerDefaultAppNotifier() { final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy(); - // Notify the package manager on default app changes - final Uri defaultSmsAppUri = Settings.Secure.getUriFor( - Settings.Secure.SMS_DEFAULT_APPLICATION); final Uri defaultDialerAppUri = Settings.Secure.getUriFor( Settings.Secure.DIALER_DEFAULT_APPLICATION); - ContentObserver contentObserver = new ContentObserver( new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange, Uri uri, int userId) { - if (defaultSmsAppUri.equals(uri)) { - ComponentName smsComponent = SmsApplication.getDefaultSmsApplication( - mContext, true); - if (smsComponent != null) { - permissionPolicy.grantDefaultPermissionsToDefaultSmsApp( - smsComponent.getPackageName(), userId); - } - } else if (defaultDialerAppUri.equals(uri)) { - String packageName = DefaultDialerManager.getDefaultDialerApplication( - mContext); - if (packageName != null) { - permissionPolicy.grantDefaultPermissionsToDefaultDialerApp( - packageName, userId); - } + if (defaultDialerAppUri.equals(uri)) { updateSimCallManagerPermissions(permissionPolicy, userId); } } }; - - mContext.getContentResolver().registerContentObserver(defaultSmsAppUri, - false, contentObserver, UserHandle.USER_ALL); mContext.getContentResolver().registerContentObserver(defaultDialerAppUri, false, contentObserver, UserHandle.USER_ALL); }