Merge "Grant default permissons to the default SMS, Phone, Browser app." into mnc-dev

This commit is contained in:
Svetoslav
2015-06-30 00:49:06 +00:00
committed by Android (Google) Code Review
8 changed files with 275 additions and 122 deletions

View File

@@ -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 \

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -143,7 +143,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;
@@ -161,8 +162,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) {
@@ -171,7 +176,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()) {
@@ -203,18 +208,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)
@@ -223,8 +230,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
@@ -256,7 +265,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)) {
@@ -265,21 +274,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)) {
@@ -304,29 +315,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)) {
@@ -348,7 +360,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)) {
@@ -379,7 +391,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)) {
@@ -389,7 +401,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)) {
@@ -397,10 +409,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);
@@ -459,22 +478,65 @@ 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);
}
}
}
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 @@ 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();
@@ -530,8 +592,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;
}

View File

@@ -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 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);
}
}

View File

@@ -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++) {

View File

@@ -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);
}
}