Merge "Grant default permissons to the default SMS, Phone, Browser app." into mnc-dev
diff --git a/Android.mk b/Android.mk
index a02b326..e96a932 100644
--- a/Android.mk
+++ b/Android.mk
@@ -142,7 +142,6 @@
 	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.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 @@
     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 @@
      * @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 79cd0aa..ff097e5 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -143,7 +143,8 @@
     private PackagesProvider mImePackagesProvider;
     private PackagesProvider mLocationPackagesProvider;
     private PackagesProvider mVoiceInteractionPackagesProvider;
-    private PackagesProvider mCarrierAppPackagesProvider;
+    private PackagesProvider mSmsAppPackagesProvider;
+    private PackagesProvider mDialerAppPackagesProvider;
 
     public DefaultPermissionGrantPolicy(PackageManagerService service) {
         mService = service;
@@ -161,8 +162,12 @@
         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) {
@@ -171,7 +176,7 @@
     }
 
     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()) {
@@ -203,18 +208,20 @@
     }
 
     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)
@@ -223,8 +230,10 @@
                 ? 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
@@ -256,7 +265,7 @@
             // 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)) {
@@ -265,21 +274,23 @@
                 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)) {
@@ -304,29 +315,30 @@
 
             // 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)) {
@@ -348,7 +360,7 @@
             // 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)) {
@@ -379,7 +391,7 @@
             // 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)) {
@@ -389,7 +401,7 @@
             // 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)) {
@@ -397,10 +409,17 @@
             }
 
             // 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);
@@ -459,22 +478,65 @@
                 }
             }
 
-            // 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<PackageParser.Package> getPrivilegedHandlerReceiverPackagesLPr(
             Intent intent, int userId) {
         List<ResolveInfo> handlers = mService.queryIntentReceivers(
@@ -505,7 +567,7 @@
         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();
@@ -530,8 +592,12 @@
         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 4d5f566..c86e2f1 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.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 @@
                 result |= updateIntentVerificationStatus(packageName,
                         PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
                         UserHandle.myUserId());
+                mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowserLPr(
+                        packageName, userId);
             }
             return result;
         }
@@ -13026,7 +13027,7 @@
      * @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 @@
         }
 
         // 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 @@
                 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 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 @@
                 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.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 @@
                         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 TelecomLoaderService(Context context) {
         super(context);
         mContext = context;
+        registerDefaultAppProviders();
     }
 
     @Override
@@ -82,6 +92,7 @@
     @Override
     public void onBootPhase(int phase) {
         if (phase == PHASE_ACTIVITY_MANAGER_READY) {
+            registerDefaultAppNotifier();
             connectToTelecom();
         }
     }
@@ -104,4 +115,74 @@
             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);
+    }
 }