summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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};