summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvetoslav <svetoslavganov@google.com>2015-07-01 19:49:58 -0700
committerSvetoslav <svetoslavganov@google.com>2015-07-01 20:00:32 -0700
commita5a0d94023b2d9b7c9019fc40e7479995b82066c (patch)
tree173f5939a84709cb36057b9907c0c6c374727312
parentfcf9eb761463e3c6c19a56ce12ac68bf22511778 (diff)
downloadframeworks_base-a5a0d94023b2d9b7c9019fc40e7479995b82066c.zip
frameworks_base-a5a0d94023b2d9b7c9019fc40e7479995b82066c.tar.gz
frameworks_base-a5a0d94023b2d9b7c9019fc40e7479995b82066c.tar.bz2
Make granting default SMS and Phone permissions robust
The default dialer and sms apps are provided by the telecomm stak which is brought up asynchronously as a service to which the system binds. Hence, by the time we grant default permissions this service is not bound and we do not know the default dialer (accidentally the default SMS app is available before the service is up). Now the default permission grant code is robust to handle both cases of the default sms and phone apps being available at grant time or asynchronously. bug:22208642 Change-Id: I6385a0432368731aa9caea046d57eccbfb5abac0
-rw-r--r--services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java79
-rw-r--r--services/core/java/com/android/server/telecom/TelecomLoaderService.java95
2 files changed, 136 insertions, 38 deletions
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index cb7d932..cb65b75 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -287,20 +287,6 @@ final class DefaultPermissionGrantPolicy {
grantRuntimePermissionsLPw(setupPackage, SETTINGS_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 = getDefaultSystemHandlerActivityPackageLPr(
@@ -342,15 +328,37 @@ final class DefaultPermissionGrantPolicy {
grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, userId);
}
+ // Dialer
+ if (dialerAppPackageNames == null) {
+ Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
+ PackageParser.Package dialerPackage = getDefaultSystemHandlerActivityPackageLPr(
+ dialerIntent, userId);
+ if (dialerPackage != null) {
+ grantDefaultPermissionsToDefaultSystemDialerAppLPr(dialerPackage, userId);
+ }
+ } else {
+ for (String dialerAppPackageName : dialerAppPackageNames) {
+ PackageParser.Package dialerPackage = getSystemPackageLPr(dialerAppPackageName);
+ if (dialerPackage != null) {
+ grantDefaultPermissionsToDefaultSystemDialerAppLPr(dialerPackage, userId);
+ }
+ }
+ }
+
// SMS
- if (smsAppPackageNames != null) {
+ if (smsAppPackageNames == null) {
+ Intent smsIntent = new Intent(Intent.ACTION_MAIN);
+ smsIntent.addCategory(Intent.CATEGORY_APP_MESSAGING);
+ PackageParser.Package smsPackage = getDefaultSystemHandlerActivityPackageLPr(
+ smsIntent, userId);
+ if (smsPackage != null) {
+ grantDefaultPermissionsToDefaultSystemSmsAppLPr(smsPackage, userId);
+ }
+ } else {
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);
+ PackageParser.Package smsPackage = getSystemPackageLPr(smsPackageName);
+ if (smsPackage != null) {
+ grantDefaultPermissionsToDefaultSystemSmsAppLPr(smsPackage, userId);
}
}
}
@@ -379,8 +387,8 @@ final class DefaultPermissionGrantPolicy {
}
// Calendar provider sync adapters
- List<PackageParser.Package> calendarSyncAdapters =
- getHeadlessSyncAdapterPackagesLPr(calendarSyncAdapterPackages,
+ List<PackageParser.Package> calendarSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
+ calendarSyncAdapterPackages,
userId);
final int calendarSyncAdapterCount = calendarSyncAdapters.size();
for (int i = 0; i < calendarSyncAdapterCount; i++) {
@@ -403,8 +411,8 @@ final class DefaultPermissionGrantPolicy {
}
// Contacts provider sync adapters
- List<PackageParser.Package> contactsSyncAdapters =
- getHeadlessSyncAdapterPackagesLPr(contactsSyncAdapterPackages,
+ List<PackageParser.Package> contactsSyncAdapters = getHeadlessSyncAdapterPackagesLPr(
+ contactsSyncAdapterPackages,
userId);
final int contactsSyncAdapterCount = contactsSyncAdapters.size();
for (int i = 0; i < contactsSyncAdapterCount; i++) {
@@ -541,6 +549,27 @@ final class DefaultPermissionGrantPolicy {
}
}
+ private void grantDefaultPermissionsToDefaultSystemDialerAppLPr(
+ PackageParser.Package dialerPackage, int userId) {
+ if (doesPackageSupportRuntimePermissions(dialerPackage)) {
+ grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
+ }
+ }
+
+
+ private void grantDefaultPermissionsToDefaultSystemSmsAppLPr(
+ PackageParser.Package smsPackage, int userId) {
+ if (doesPackageSupportRuntimePermissions(smsPackage)) {
+ grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId);
+ }
+ }
+
+
public void grantDefaultPermissionsToDefaultSmsAppLPr(String packageName, int userId) {
Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
if (packageName == null) {
diff --git a/services/core/java/com/android/server/telecom/TelecomLoaderService.java b/services/core/java/com/android/server/telecom/TelecomLoaderService.java
index b165b42..c2ce572 100644
--- a/services/core/java/com/android/server/telecom/TelecomLoaderService.java
+++ b/services/core/java/com/android/server/telecom/TelecomLoaderService.java
@@ -31,8 +31,11 @@ import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.telecom.DefaultDialerManager;
+import android.util.IntArray;
import android.util.Slog;
+import android.util.SparseBooleanArray;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.telephony.SmsApplication;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -59,6 +62,41 @@ public class TelecomLoaderService extends SystemService {
}, 0);
SmsApplication.getDefaultMmsApplication(mContext, false);
ServiceManager.addService(Context.TELECOM_SERVICE, service);
+
+ synchronized (mLock) {
+ if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null) {
+ final PackageManagerInternal packageManagerInternal = LocalServices
+ .getService(PackageManagerInternal.class);
+
+ if (mDefaultSmsAppRequests != null) {
+ ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
+ mContext, true);
+ if (smsComponent != null) {
+ final int requestCount = mDefaultSmsAppRequests.size();
+ for (int i = requestCount - 1; i >= 0; i--) {
+ final int userid = mDefaultSmsAppRequests.get(i);
+ mDefaultSmsAppRequests.remove(i);
+ packageManagerInternal.grantDefaultPermissionsToDefaultSmsApp(
+ smsComponent.getPackageName(), userid);
+ }
+ }
+ }
+
+ if (mDefaultDialerAppRequests != null) {
+ String packageName = DefaultDialerManager.getDefaultDialerApplication(
+ mContext);
+ if (packageName != null) {
+ final int requestCount = mDefaultDialerAppRequests.size();
+ for (int i = requestCount - 1; i >= 0; i--) {
+ final int userId = mDefaultDialerAppRequests.get(i);
+ mDefaultDialerAppRequests.remove(i);
+ packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp(
+ packageName, userId);
+ }
+ }
+ }
+ }
+ }
} catch (RemoteException e) {
Slog.w(TAG, "Failed linking to death.");
}
@@ -76,7 +114,17 @@ public class TelecomLoaderService extends SystemService {
private static final String SERVICE_ACTION = "com.android.ITelecomService";
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private IntArray mDefaultSmsAppRequests;
+
+ @GuardedBy("mLock")
+ private IntArray mDefaultDialerAppRequests;
+
private final Context mContext;
+
+ @GuardedBy("mLock")
private TelecomServiceConnection mServiceConnection;
public TelecomLoaderService(Context context) {
@@ -98,24 +146,27 @@ public class TelecomLoaderService extends SystemService {
}
private void connectToTelecom() {
- if (mServiceConnection != null) {
- // TODO: Is unbinding worth doing or wait for system to rebind?
- mContext.unbindService(mServiceConnection);
- mServiceConnection = null;
- }
+ synchronized (mLock) {
+ if (mServiceConnection != null) {
+ // TODO: Is unbinding worth doing or wait for system to rebind?
+ mContext.unbindService(mServiceConnection);
+ mServiceConnection = null;
+ }
- TelecomServiceConnection serviceConnection = new TelecomServiceConnection();
- Intent intent = new Intent(SERVICE_ACTION);
- intent.setComponent(SERVICE_COMPONENT);
- int flags = Context.BIND_IMPORTANT | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_AUTO_CREATE;
+ TelecomServiceConnection serviceConnection = new TelecomServiceConnection();
+ Intent intent = new Intent(SERVICE_ACTION);
+ intent.setComponent(SERVICE_COMPONENT);
+ int flags = Context.BIND_IMPORTANT | Context.BIND_FOREGROUND_SERVICE
+ | Context.BIND_AUTO_CREATE;
- // Bind to Telecom and register the service
- if (mContext.bindServiceAsUser(intent, serviceConnection, flags, UserHandle.OWNER)) {
- mServiceConnection = serviceConnection;
+ // Bind to Telecom and register the service
+ if (mContext.bindServiceAsUser(intent, serviceConnection, flags, UserHandle.OWNER)) {
+ mServiceConnection = serviceConnection;
+ }
}
}
+
private void registerDefaultAppProviders() {
final PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
@@ -125,6 +176,15 @@ public class TelecomLoaderService extends SystemService {
new PackageManagerInternal.PackagesProvider() {
@Override
public String[] getPackages(int userId) {
+ synchronized (mLock) {
+ if (mServiceConnection == null) {
+ if (mDefaultSmsAppRequests == null) {
+ mDefaultSmsAppRequests = new IntArray();
+ }
+ mDefaultSmsAppRequests.add(userId);
+ return null;
+ }
+ }
ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
mContext, true);
if (smsComponent != null) {
@@ -139,6 +199,15 @@ public class TelecomLoaderService extends SystemService {
new PackageManagerInternal.PackagesProvider() {
@Override
public String[] getPackages(int userId) {
+ synchronized (mLock) {
+ if (mServiceConnection == null) {
+ if (mDefaultDialerAppRequests == null) {
+ mDefaultDialerAppRequests = new IntArray();
+ }
+ mDefaultDialerAppRequests.add(userId);
+ return null;
+ }
+ }
String packageName = DefaultDialerManager.getDefaultDialerApplication(mContext);
if (packageName != null) {
return new String[]{packageName};