diff options
8 files changed, 275 insertions, 122 deletions
@@ -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 cea6e99..2b83d86 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 7d76c88..0000000 --- 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 7599bd6..dbaba49 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 c9555c4..82b8bca 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,19 +439,62 @@ 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); } + } + } - mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(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); } } @@ -466,7 +528,7 @@ final class DefaultPermissionGrantPolicy { return handlerPackages; } - private PackageParser.Package getDefaultSystemHandlerActvityPackageLPr( + private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr( Intent intent, int userId) { List<ResolveInfo> 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 43f80d4..9d7650d 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 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; - } - } - }; + @Override + public void setDialerAppPackagesProvider(PackagesProvider provider) { synchronized (mPackages) { - mDefaultPermissionPolicy.setCarrierAppPackagesProviderLPw(wrapper); + mDefaultPermissionPolicy.setDialerAppPackagesProviderLPw(provider); } - } finally { - Binder.restoreCallingIdentity(token); + } + + @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 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 51ac81d..0ad2b4a 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 9abdf21..b165b42 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); + } } |