summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk1
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl5
-rw-r--r--core/java/android/content/pm/IPackagesProvider.aidl22
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java26
-rw-r--r--services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java174
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java82
-rw-r--r--services/core/java/com/android/server/pm/Settings.java4
-rw-r--r--services/core/java/com/android/server/telecom/TelecomLoaderService.java83
8 files changed, 275 insertions, 122 deletions
diff --git a/Android.mk b/Android.mk
index a02b326..e96a932 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 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);
+ }
}