From cdfd230a392d0f0557a3a5bada221b7a05113392 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Thu, 25 Jun 2015 19:07:31 -0700 Subject: [PATCH] Grant default permissons to the default SMS, Phone, Browser app. The default SMS, Phone, Browser are selected in the UI and we grant default permissions to these. We do this regardless if they are on the system image as the user has made an explicit choice in the UI and the permission we grant are considered essential for such type of a core app to operate properly. bug:22104986 Change-Id: Ide8caeb524b43dde11a20460666cf34c4d35f84b --- Android.mk | 1 - .../android/content/pm/IPackageManager.aidl | 5 +- .../android/content/pm/IPackagesProvider.aidl | 22 --- .../content/pm/PackageManagerInternal.java | 26 +++ .../pm/DefaultPermissionGrantPolicy.java | 176 ++++++++++++------ .../server/pm/PackageManagerService.java | 82 ++++---- .../java/com/android/server/pm/Settings.java | 4 +- .../server/telecom/TelecomLoaderService.java | 83 ++++++++- 8 files changed, 276 insertions(+), 123 deletions(-) delete mode 100644 core/java/android/content/pm/IPackagesProvider.aidl diff --git a/Android.mk b/Android.mk index a02b326304260..e96a93239f01f 100644 --- a/Android.mk +++ b/Android.mk @@ -142,7 +142,6 @@ LOCAL_SRC_FILES += \ core/java/android/content/pm/IPackageManager.aidl \ core/java/android/content/pm/IPackageMoveObserver.aidl \ core/java/android/content/pm/IPackageStatsObserver.aidl \ - core/java/android/content/pm/IPackagesProvider.aidl \ core/java/android/content/pm/IOnPermissionsChangeListener.aidl \ core/java/android/database/IContentObserver.aidl \ core/java/android/hardware/ICameraService.aidl \ diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index cea6e993c250a..2b83d86ce9f86 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -31,7 +31,6 @@ import android.content.pm.IPackageDeleteObserver2; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageMoveObserver; import android.content.pm.IPackageStatsObserver; -import android.content.pm.IPackagesProvider; import android.content.pm.IOnPermissionsChangeListener; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.InstrumentationInfo; @@ -504,7 +503,7 @@ interface IPackageManager { void addOnPermissionsChangeListener(in IOnPermissionsChangeListener listener); void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener); - void grantDefaultPermissions(int userId); - void setCarrierAppPackagesProvider(in IPackagesProvider provider); int getMountExternalMode(int uid); + + void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); } diff --git a/core/java/android/content/pm/IPackagesProvider.aidl b/core/java/android/content/pm/IPackagesProvider.aidl deleted file mode 100644 index 7d76c88d00275..0000000000000 --- a/core/java/android/content/pm/IPackagesProvider.aidl +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.content.pm; - -/** {@hide} */ -interface IPackagesProvider { - String[] getPackages(int userId); -} diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 7599bd6795fd0..dbaba4931ee32 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -55,4 +55,30 @@ public abstract class PackageManagerInternal { * @param provider The packages provider. */ public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider); + + /** + * Sets the SMS packages provider. + * @param provider The packages provider. + */ + public abstract void setSmsAppPackagesProvider(PackagesProvider provider); + + /** + * Sets the dialer packages provider. + * @param provider The packages provider. + */ + public abstract void setDialerAppPackagesProvider(PackagesProvider provider); + + /** + * Requests granting of the default permissions to the current default SMS app. + * @param packageName The default SMS package name. + * @param userId The user for which to grant the permissions. + */ + public abstract void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId); + + /** + * Requests granting of the default permissions to the current default dialer app. + * @param packageName The default dialer package name. + * @param userId The user for which to grant the permissions. + */ + public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId); } diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index c9555c4aacdb9..82b8bca9428e0 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -56,7 +56,7 @@ final class DefaultPermissionGrantPolicy { static { PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE); PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE); - PHONE_PERMISSIONS.add( Manifest.permission.READ_CALL_LOG); + PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG); PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG); PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL); PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP); @@ -135,7 +135,8 @@ final class DefaultPermissionGrantPolicy { private PackagesProvider mImePackagesProvider; private PackagesProvider mLocationPackagesProvider; private PackagesProvider mVoiceInteractionPackagesProvider; - private PackagesProvider mCarrierAppPackagesProvider; + private PackagesProvider mSmsAppPackagesProvider; + private PackagesProvider mDialerAppPackagesProvider; public DefaultPermissionGrantPolicy(PackageManagerService service) { mService = service; @@ -153,8 +154,12 @@ final class DefaultPermissionGrantPolicy { mVoiceInteractionPackagesProvider = provider; } - public void setCarrierAppPackagesProviderLPw(PackagesProvider provider) { - mCarrierAppPackagesProvider = provider; + public void setSmsAppPackagesProviderLPw(PackagesProvider provider) { + mSmsAppPackagesProvider = provider; + } + + public void setDialerAppPackagesProviderLPw(PackagesProvider provider) { + mDialerAppPackagesProvider = provider; } public void grantDefaultPermissions(int userId) { @@ -163,7 +168,7 @@ final class DefaultPermissionGrantPolicy { } private void grantPermissionsToSysComponentsAndPrivApps(int userId) { - Log.i(TAG, "Granting permissions to platform components"); + Log.i(TAG, "Granting permissions to platform components for user" + userId); synchronized (mService.mPackages) { for (PackageParser.Package pkg : mService.mPackages.values()) { @@ -195,18 +200,20 @@ final class DefaultPermissionGrantPolicy { } private void grantDefaultSystemHandlerPermissions(int userId) { - Log.i(TAG, "Granting permissions to default platform handlers"); + Log.i(TAG, "Granting permissions to default platform handlers for user:" + userId); final PackagesProvider imePackagesProvider; final PackagesProvider locationPackagesProvider; final PackagesProvider voiceInteractionPackagesProvider; - final PackagesProvider carrierAppPackagesProvider; + final PackagesProvider smsAppPackagesProvider; + final PackagesProvider dialerAppPackagesProvider; synchronized (mService.mPackages) { imePackagesProvider = mImePackagesProvider; locationPackagesProvider = mLocationPackagesProvider; voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider; - carrierAppPackagesProvider = mCarrierAppPackagesProvider; + smsAppPackagesProvider = mSmsAppPackagesProvider; + dialerAppPackagesProvider = mDialerAppPackagesProvider; } String[] imePackageNames = (imePackagesProvider != null) @@ -215,8 +222,10 @@ final class DefaultPermissionGrantPolicy { ? voiceInteractionPackagesProvider.getPackages(userId) : null; String[] locationPackageNames = (locationPackagesProvider != null) ? locationPackagesProvider.getPackages(userId) : null; - String[] carrierAppPackageNames = (carrierAppPackagesProvider != null) - ? carrierAppPackagesProvider.getPackages(userId) : null; + String[] smsAppPackageNames = (smsAppPackagesProvider != null) + ? smsAppPackagesProvider.getPackages(userId) : null; + String[] dialerAppPackageNames = (dialerAppPackagesProvider != null) + ? dialerAppPackagesProvider.getPackages(userId) : null; synchronized (mService.mPackages) { // Installers @@ -248,7 +257,7 @@ final class DefaultPermissionGrantPolicy { // SetupWizard Intent setupIntent = new Intent(Intent.ACTION_MAIN); setupIntent.addCategory(Intent.CATEGORY_HOME); - PackageParser.Package setupPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package setupPackage = getDefaultSystemHandlerActivityPackageLPr( setupIntent, userId); if (setupPackage != null && doesPackageSupportRuntimePermissions(setupPackage)) { @@ -257,21 +266,23 @@ final class DefaultPermissionGrantPolicy { grantRuntimePermissionsLPw(setupPackage, SETTINGS_PERMISSIONS, userId); } - // Phone - Intent dialerIntent = new Intent(Intent.ACTION_DIAL); - PackageParser.Package dialerPackage = getDefaultSystemHandlerActvityPackageLPr( - dialerIntent, userId); - if (dialerPackage != null - && doesPackageSupportRuntimePermissions(dialerPackage)) { - grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId); - grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId); - grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId); - grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId); + // Dialer + if (dialerAppPackageNames != null) { + for (String dialerAppPackageName : dialerAppPackageNames) { + PackageParser.Package dialerPackage = getPackageLPr(dialerAppPackageName); + if (dialerPackage != null + && doesPackageSupportRuntimePermissions(dialerPackage)) { + grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId); + } + } } // Camera Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - PackageParser.Package cameraPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr( cameraIntent, userId); if (cameraPackage != null && doesPackageSupportRuntimePermissions(cameraPackage)) { @@ -296,29 +307,30 @@ final class DefaultPermissionGrantPolicy { // Downloads UI Intent downloadsUiIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS); - PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActivityPackageLPr( downloadsUiIntent, userId); if (downloadsUiPackage != null && doesPackageSupportRuntimePermissions(downloadsUiPackage)) { grantRuntimePermissionsLPw(downloadsUiPackage, STORAGE_PERMISSIONS, userId); } - // Messaging - Intent messagingIntent = new Intent(Intent.ACTION_MAIN); - messagingIntent.addCategory(Intent.CATEGORY_APP_MESSAGING); - PackageParser.Package messagingPackage = getDefaultSystemHandlerActvityPackageLPr( - messagingIntent, userId); - if (messagingPackage != null - && doesPackageSupportRuntimePermissions(messagingPackage)) { - grantRuntimePermissionsLPw(messagingPackage, PHONE_PERMISSIONS, userId); - grantRuntimePermissionsLPw(messagingPackage, CONTACTS_PERMISSIONS, userId); - grantRuntimePermissionsLPw(messagingPackage, SMS_PERMISSIONS, userId); + // SMS + if (smsAppPackageNames != null) { + for (String smsPackageName : smsAppPackageNames) { + PackageParser.Package smsPackage = getPackageLPr(smsPackageName); + if (smsPackage != null + && doesPackageSupportRuntimePermissions(smsPackage)) { + grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId); + } + } } // Calendar Intent calendarIntent = new Intent(Intent.ACTION_MAIN); calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR); - PackageParser.Package calendarPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package calendarPackage = getDefaultSystemHandlerActivityPackageLPr( calendarIntent, userId); if (calendarPackage != null && doesPackageSupportRuntimePermissions(calendarPackage)) { @@ -329,7 +341,7 @@ final class DefaultPermissionGrantPolicy { // Contacts Intent contactsIntent = new Intent(Intent.ACTION_MAIN); contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS); - PackageParser.Package contactsPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package contactsPackage = getDefaultSystemHandlerActivityPackageLPr( contactsIntent, userId); if (contactsPackage != null && doesPackageSupportRuntimePermissions(contactsPackage)) { @@ -340,7 +352,7 @@ final class DefaultPermissionGrantPolicy { // Maps Intent mapsIntent = new Intent(Intent.ACTION_MAIN); mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS); - PackageParser.Package mapsPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package mapsPackage = getDefaultSystemHandlerActivityPackageLPr( mapsIntent, userId); if (mapsPackage != null && doesPackageSupportRuntimePermissions(mapsPackage)) { @@ -350,7 +362,7 @@ final class DefaultPermissionGrantPolicy { // Email Intent emailIntent = new Intent(Intent.ACTION_MAIN); emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL); - PackageParser.Package emailPackage = getDefaultSystemHandlerActvityPackageLPr( + PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackageLPr( emailIntent, userId); if (emailPackage != null && doesPackageSupportRuntimePermissions(emailPackage)) { @@ -358,10 +370,17 @@ final class DefaultPermissionGrantPolicy { } // Browser - Intent browserIntent = new Intent(Intent.ACTION_MAIN); - browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER); - PackageParser.Package browserPackage = getDefaultSystemHandlerActvityPackageLPr( - browserIntent, userId); + PackageParser.Package browserPackage = null; + String defaultBrowserPackage = mService.getDefaultBrowserPackageName(userId); + if (defaultBrowserPackage != null) { + browserPackage = getPackageLPr(defaultBrowserPackage); + } + if (browserPackage == null) { + Intent browserIntent = new Intent(Intent.ACTION_MAIN); + browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER); + browserPackage = getDefaultSystemHandlerActivityPackageLPr( + browserIntent, userId); + } if (browserPackage != null && doesPackageSupportRuntimePermissions(browserPackage)) { grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId); @@ -420,22 +439,65 @@ final class DefaultPermissionGrantPolicy { } } - // Carrier apps - if (carrierAppPackageNames != null) { - for (String packageName : carrierAppPackageNames) { - PackageParser.Package carrierPackage = getSystemPackageLPr(packageName); - if (carrierPackage != null - && doesPackageSupportRuntimePermissions(carrierPackage)) { - grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId); - grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId); - } - } - } - mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId); } } + public void grantDefaultPermissionsToDefaultSmsAppLPr(String packageName, int userId) { + Log.i(TAG, "Granting permissions to default sms app for user:" + userId); + if (packageName == null) { + return; + } + PackageParser.Package smsPackage = getPackageLPr(packageName); + if (smsPackage != null && doesPackageSupportRuntimePermissions(smsPackage)) { + grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId); + } + } + + public void grantDefaultPermissionsToDefaultDialerAppLPr(String packageName, int userId) { + Log.i(TAG, "Granting permissions to default dialer app for user:" + userId); + if (packageName == null) { + return; + } + PackageParser.Package dialerPackage = getPackageLPr(packageName); + if (dialerPackage != null + && doesPackageSupportRuntimePermissions(dialerPackage)) { + grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId); + grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId); + } + } + + public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) { + Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId); + if (packageNames == null) { + return; + } + for (String packageName : packageNames) { + PackageParser.Package carrierPackage = getSystemPackageLPr(packageName); + if (carrierPackage != null + && doesPackageSupportRuntimePermissions(carrierPackage)) { + grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId); + } + } + } + + public void grantDefaultPermissionsToDefaultBrowserLPr(String packageName, int userId) { + Log.i(TAG, "Granting permissions to default browser for user:" + userId); + if (packageName == null) { + return; + } + PackageParser.Package browserPackage = getSystemPackageLPr(packageName); + if (browserPackage != null + && doesPackageSupportRuntimePermissions(browserPackage)) { + grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId); + } + } + private List getPrivilegedHandlerReceiverPackagesLPr( Intent intent, int userId) { List handlers = mService.queryIntentReceivers( @@ -466,7 +528,7 @@ final class DefaultPermissionGrantPolicy { return handlerPackages; } - private PackageParser.Package getDefaultSystemHandlerActvityPackageLPr( + private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr( Intent intent, int userId) { List handlers = mService.queryIntentActivities(intent, null, 0, userId); final int handlerCount = handlers.size(); @@ -491,8 +553,12 @@ final class DefaultPermissionGrantPolicy { return null; } + private PackageParser.Package getPackageLPr(String packageName) { + return mService.mPackages.get(packageName); + } + private PackageParser.Package getSystemPackageLPr(String packageName) { - PackageParser.Package pkg = mService.mPackages.get(packageName); + PackageParser.Package pkg = getPackageLPr(packageName); if (pkg != null && pkg.isSystemApp()) { return !isSysComponentOrPersistentPrivApp(pkg) ? pkg : null; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 43f80d4c7dd8e..9d7650df87a87 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -102,7 +102,6 @@ import android.content.pm.IPackageInstaller; import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; import android.content.pm.IPackageStatsObserver; -import android.content.pm.IPackagesProvider; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.KeySet; @@ -9711,6 +9710,8 @@ public class PackageManagerService extends IPackageManager.Stub { result |= updateIntentVerificationStatus(packageName, PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, UserHandle.myUserId()); + mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowserLPr( + packageName, userId); } return result; } @@ -13026,7 +13027,7 @@ public class PackageManagerService extends IPackageManager.Stub { * @param flags The flags that is going to be reset. */ private void revokeRuntimePermissionsAndClearFlagsLocked( - PermissionsState permissionsState, int userId, int flags) { + PermissionsState permissionsState, final int userId, int flags) { boolean needsWrite = false; for (PermissionState state : permissionsState.getRuntimePermissionStates(userId)) { @@ -13039,7 +13040,12 @@ public class PackageManagerService extends IPackageManager.Stub { } // Ensure default permissions are never cleared. - mDefaultPermissionPolicy.grantDefaultPermissions(userId); + mHandler.post(new Runnable() { + @Override + public void run() { + mDefaultPermissionPolicy.grantDefaultPermissions(userId); + } + }); if (needsWrite) { mSettings.writeRuntimePermissionsForUserLPr(userId, true); @@ -15943,48 +15949,44 @@ public class PackageManagerService extends IPackageManager.Stub { mDefaultPermissionPolicy.setVoiceInteractionPackagesProviderLPw(provider); } } - } - @Override - public void grantDefaultPermissions(final int userId) { - enforceSystemOrPhoneCaller("grantDefaultPermissions"); - long token = Binder.clearCallingIdentity(); - try { - // We cannot grant the default permissions with a lock held as - // we query providers from other components for default handlers - // such as enabled IMEs, etc. - mHandler.post(new Runnable() { - @Override - public void run() { - mDefaultPermissionPolicy.grantDefaultPermissions(userId); - } - }); - } finally { - Binder.restoreCallingIdentity(token); + @Override + public void setSmsAppPackagesProvider(PackagesProvider provider) { + synchronized (mPackages) { + mDefaultPermissionPolicy.setSmsAppPackagesProviderLPw(provider); + } + } + + @Override + public void setDialerAppPackagesProvider(PackagesProvider provider) { + synchronized (mPackages) { + mDefaultPermissionPolicy.setDialerAppPackagesProviderLPw(provider); + } + } + + @Override + public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) { + synchronized (mPackages) { + mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultSmsAppLPr( + packageName, userId); + } + } + + @Override + public void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId) { + synchronized (mPackages) { + mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultDialerAppLPr( + packageName, userId); + } } } @Override - public void setCarrierAppPackagesProvider(final IPackagesProvider provider) { - enforceSystemOrPhoneCaller("setCarrierAppPackagesProvider"); - long token = Binder.clearCallingIdentity(); - try { - PackageManagerInternal.PackagesProvider wrapper = - new PackageManagerInternal.PackagesProvider() { - @Override - public String[] getPackages(int userId) { - try { - return provider.getPackages(userId); - } catch (RemoteException e) { - return null; - } - } - }; - synchronized (mPackages) { - mDefaultPermissionPolicy.setCarrierAppPackagesProviderLPw(wrapper); - } - } finally { - Binder.restoreCallingIdentity(token); + public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) { + enforceSystemOrPhoneCaller("grantPermissionsToEnabledCarrierApps"); + synchronized (mPackages) { + mDefaultPermissionPolicy.grantDefaultPermissionsToEnabledCarrierAppsLPr( + packageNames, userId); } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 51ac81d1e4fc7..0ad2b4a4be33f 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4487,7 +4487,9 @@ final class Settings { serializer.startTag(null, TAG_RUNTIME_PERMISSIONS); String fingerprint = mFingerprints.get(userId); - serializer.attribute(null, ATTR_FINGERPRINT, fingerprint); + if (fingerprint != null) { + serializer.attribute(null, ATTR_FINGERPRINT, fingerprint); + } final int packageCount = permissionsForPackage.size(); for (int i = 0; i < packageCount; i++) { diff --git a/services/core/java/com/android/server/telecom/TelecomLoaderService.java b/services/core/java/com/android/server/telecom/TelecomLoaderService.java index 9abdf2174fcf1..b165b42c51bdf 100644 --- a/services/core/java/com/android/server/telecom/TelecomLoaderService.java +++ b/services/core/java/com/android/server/telecom/TelecomLoaderService.java @@ -20,12 +20,21 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.pm.PackageManagerInternal; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.provider.Settings; +import android.telecom.DefaultDialerManager; import android.util.Slog; +import com.android.internal.telephony.SmsApplication; +import com.android.server.LocalServices; import com.android.server.SystemService; /** @@ -48,7 +57,7 @@ public class TelecomLoaderService extends SystemService { connectToTelecom(); } }, 0); - + SmsApplication.getDefaultMmsApplication(mContext, false); ServiceManager.addService(Context.TELECOM_SERVICE, service); } catch (RemoteException e) { Slog.w(TAG, "Failed linking to death."); @@ -73,6 +82,7 @@ public class TelecomLoaderService extends SystemService { public TelecomLoaderService(Context context) { super(context); mContext = context; + registerDefaultAppProviders(); } @Override @@ -82,6 +92,7 @@ public class TelecomLoaderService extends SystemService { @Override public void onBootPhase(int phase) { if (phase == PHASE_ACTIVITY_MANAGER_READY) { + registerDefaultAppNotifier(); connectToTelecom(); } } @@ -104,4 +115,74 @@ public class TelecomLoaderService extends SystemService { mServiceConnection = serviceConnection; } } + + private void registerDefaultAppProviders() { + final PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + + // Set a callback for the package manager to query the default sms app. + packageManagerInternal.setSmsAppPackagesProvider( + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + ComponentName smsComponent = SmsApplication.getDefaultSmsApplication( + mContext, true); + if (smsComponent != null) { + return new String[]{smsComponent.getPackageName()}; + } + return null; + } + }); + + // Set a callback for the package manager to query the default dialer app. + packageManagerInternal.setDialerAppPackagesProvider( + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + String packageName = DefaultDialerManager.getDefaultDialerApplication(mContext); + if (packageName != null) { + return new String[]{packageName}; + } + return null; + } + }); + } + + private void registerDefaultAppNotifier() { + final PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + + // 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) { + packageManagerInternal.grantDefaultPermissionsToDefaultSmsApp( + smsComponent.getPackageName(), userId); + } + } else if (defaultDialerAppUri.equals(uri)) { + String packageName = DefaultDialerManager.getDefaultDialerApplication( + mContext); + if (packageName != null) { + packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp( + packageName, userId); + } + } + } + }; + + mContext.getContentResolver().registerContentObserver(defaultSmsAppUri, + false, contentObserver, UserHandle.USER_ALL); + mContext.getContentResolver().registerContentObserver(defaultDialerAppUri, + false, contentObserver, UserHandle.USER_ALL); + } }