Merge "Default permissions for sim call manager" into mnc-dev

This commit is contained in:
Sailesh Nepal
2015-07-29 17:39:37 +00:00
committed by Android (Google) Code Review
6 changed files with 179 additions and 1 deletions

View File

@@ -82,6 +82,12 @@ public abstract class PackageManagerInternal {
*/ */
public abstract void setDialerAppPackagesProvider(PackagesProvider provider); public abstract void setDialerAppPackagesProvider(PackagesProvider provider);
/**
* Sets the sim call manager packages provider.
* @param provider The packages provider.
*/
public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider);
/** /**
* Sets the sync adapter packages provider. * Sets the sync adapter packages provider.
* @param provider The provider. * @param provider The provider.
@@ -101,4 +107,12 @@ public abstract class PackageManagerInternal {
* @param userId The user for which to grant the permissions. * @param userId The user for which to grant the permissions.
*/ */
public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId); public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId);
/**
* Requests granting of the default permissions to the current default sim call manager.
* @param packageName The default sim call manager package name.
* @param userId The user for which to grant the permissions.
*/
public abstract void grantDefaultPermissionsToDefaultSimCallManager(String packageName,
int userId);
} }

View File

@@ -125,6 +125,7 @@ final class DefaultPermissionGrantPolicy {
private PackagesProvider mVoiceInteractionPackagesProvider; private PackagesProvider mVoiceInteractionPackagesProvider;
private PackagesProvider mSmsAppPackagesProvider; private PackagesProvider mSmsAppPackagesProvider;
private PackagesProvider mDialerAppPackagesProvider; private PackagesProvider mDialerAppPackagesProvider;
private PackagesProvider mSimCallManagerPackagesProvider;
private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider; private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
public DefaultPermissionGrantPolicy(PackageManagerService service) { public DefaultPermissionGrantPolicy(PackageManagerService service) {
@@ -151,6 +152,10 @@ final class DefaultPermissionGrantPolicy {
mDialerAppPackagesProvider = provider; mDialerAppPackagesProvider = provider;
} }
public void setSimCallManagerPackagesProviderLPw(PackagesProvider provider) {
mSimCallManagerPackagesProvider = provider;
}
public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) { public void setSyncAdapterPackagesProviderLPw(SyncAdapterPackagesProvider provider) {
mSyncAdapterPackagesProvider = provider; mSyncAdapterPackagesProvider = provider;
} }
@@ -201,6 +206,7 @@ final class DefaultPermissionGrantPolicy {
final PackagesProvider voiceInteractionPackagesProvider; final PackagesProvider voiceInteractionPackagesProvider;
final PackagesProvider smsAppPackagesProvider; final PackagesProvider smsAppPackagesProvider;
final PackagesProvider dialerAppPackagesProvider; final PackagesProvider dialerAppPackagesProvider;
final PackagesProvider simCallManagerPackagesProvider;
final SyncAdapterPackagesProvider syncAdapterPackagesProvider; final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
synchronized (mService.mPackages) { synchronized (mService.mPackages) {
@@ -209,6 +215,7 @@ final class DefaultPermissionGrantPolicy {
voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider; voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
smsAppPackagesProvider = mSmsAppPackagesProvider; smsAppPackagesProvider = mSmsAppPackagesProvider;
dialerAppPackagesProvider = mDialerAppPackagesProvider; dialerAppPackagesProvider = mDialerAppPackagesProvider;
simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
syncAdapterPackagesProvider = mSyncAdapterPackagesProvider; syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
} }
@@ -222,6 +229,8 @@ final class DefaultPermissionGrantPolicy {
? smsAppPackagesProvider.getPackages(userId) : null; ? smsAppPackagesProvider.getPackages(userId) : null;
String[] dialerAppPackageNames = (dialerAppPackagesProvider != null) String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
? dialerAppPackagesProvider.getPackages(userId) : null; ? dialerAppPackagesProvider.getPackages(userId) : null;
String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
? simCallManagerPackagesProvider.getPackages(userId) : null;
String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ? String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null; syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ? String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
@@ -313,6 +322,18 @@ final class DefaultPermissionGrantPolicy {
} }
} }
// Sim call manager
if (simCallManagerPackageNames != null) {
for (String simCallManagerPackageName : simCallManagerPackageNames) {
PackageParser.Package simCallManagerPackage =
getSystemPackageLPr(simCallManagerPackageName);
if (simCallManagerPackage != null) {
grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage,
userId);
}
}
}
// SMS // SMS
if (smsAppPackageNames == null) { if (smsAppPackageNames == null) {
Intent smsIntent = new Intent(Intent.ACTION_MAIN); Intent smsIntent = new Intent(Intent.ACTION_MAIN);
@@ -590,6 +611,25 @@ final class DefaultPermissionGrantPolicy {
} }
} }
private void grantDefaultPermissionsToDefaultSimCallManagerLPr(
PackageParser.Package simCallManagerPackage, int userId) {
Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
if (doesPackageSupportRuntimePermissions(simCallManagerPackage)) {
grantRuntimePermissionsLPw(simCallManagerPackage, PHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(simCallManagerPackage, MICROPHONE_PERMISSIONS, userId);
}
}
public void grantDefaultPermissionsToDefaultSimCallManagerLPr(String packageName, int userId) {
if (packageName == null) {
return;
}
PackageParser.Package simCallManagerPackage = getPackageLPr(packageName);
if (simCallManagerPackage != null) {
grantDefaultPermissionsToDefaultSimCallManagerLPr(simCallManagerPackage, userId);
}
}
public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) { public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) {
Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId); Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
if (packageNames == null) { if (packageNames == null) {

View File

@@ -16516,6 +16516,13 @@ public class PackageManagerService extends IPackageManager.Stub {
} }
} }
@Override
public void setSimCallManagerPackagesProvider(PackagesProvider provider) {
synchronized (mPackages) {
mDefaultPermissionPolicy.setSimCallManagerPackagesProviderLPw(provider);
}
}
@Override @Override
public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) { public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) {
synchronized (mPackages) { synchronized (mPackages) {
@@ -16538,6 +16545,13 @@ public class PackageManagerService extends IPackageManager.Stub {
packageName, userId); packageName, userId);
} }
} }
@Override
public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) {
synchronized (mPackages) {
mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultSimCallManagerLPr(
packageName, userId);
}
}
} }
@Override @Override

View File

@@ -16,9 +16,11 @@
package com.android.server.telecom; package com.android.server.telecom;
import android.content.BroadcastReceiver;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver; import android.database.ContentObserver;
@@ -31,6 +33,9 @@ import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.telecom.DefaultDialerManager; import android.telecom.DefaultDialerManager;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.util.IntArray; import android.util.IntArray;
import android.util.Slog; import android.util.Slog;
@@ -39,6 +44,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.telephony.SmsApplication; import com.android.internal.telephony.SmsApplication;
import com.android.server.LocalServices; import com.android.server.LocalServices;
import com.android.server.SystemService; import com.android.server.SystemService;
import com.android.server.pm.UserManagerService;
/** /**
* Starts the telecom component by binding to its ITelecomService implementation. Telecom is setup * Starts the telecom component by binding to its ITelecomService implementation. Telecom is setup
@@ -64,7 +70,8 @@ public class TelecomLoaderService extends SystemService {
ServiceManager.addService(Context.TELECOM_SERVICE, service); ServiceManager.addService(Context.TELECOM_SERVICE, service);
synchronized (mLock) { synchronized (mLock) {
if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null) { if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null
|| mDefaultSimCallManagerRequests != null) {
final PackageManagerInternal packageManagerInternal = LocalServices final PackageManagerInternal packageManagerInternal = LocalServices
.getService(PackageManagerInternal.class); .getService(PackageManagerInternal.class);
@@ -95,6 +102,23 @@ public class TelecomLoaderService extends SystemService {
} }
} }
} }
if (mDefaultSimCallManagerRequests != null) {
TelecomManager telecomManager =
(TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager();
if (phoneAccount != null) {
final int requestCount = mDefaultSimCallManagerRequests.size();
final String packageName =
phoneAccount.getComponentName().getPackageName();
for (int i = requestCount - 1; i >= 0; i--) {
final int userId = mDefaultSimCallManagerRequests.get(i);
mDefaultSimCallManagerRequests.remove(i);
packageManagerInternal
.grantDefaultPermissionsToDefaultSimCallManager(
packageName, userId);
}
}
}
} }
} }
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -122,6 +146,9 @@ public class TelecomLoaderService extends SystemService {
@GuardedBy("mLock") @GuardedBy("mLock")
private IntArray mDefaultDialerAppRequests; private IntArray mDefaultDialerAppRequests;
@GuardedBy("mLock")
private IntArray mDefaultSimCallManagerRequests;
private final Context mContext; private final Context mContext;
@GuardedBy("mLock") @GuardedBy("mLock")
@@ -141,6 +168,7 @@ public class TelecomLoaderService extends SystemService {
public void onBootPhase(int phase) { public void onBootPhase(int phase) {
if (phase == PHASE_ACTIVITY_MANAGER_READY) { if (phase == PHASE_ACTIVITY_MANAGER_READY) {
registerDefaultAppNotifier(); registerDefaultAppNotifier();
registerCarrierConfigChangedReceiver();
connectToTelecom(); connectToTelecom();
} }
} }
@@ -215,6 +243,30 @@ public class TelecomLoaderService extends SystemService {
return null; return null;
} }
}); });
// Set a callback for the package manager to query the default sim call manager.
packageManagerInternal.setSimCallManagerPackagesProvider(
new PackageManagerInternal.PackagesProvider() {
@Override
public String[] getPackages(int userId) {
synchronized (mLock) {
if (mServiceConnection == null) {
if (mDefaultSimCallManagerRequests == null) {
mDefaultSimCallManagerRequests = new IntArray();
}
mDefaultSimCallManagerRequests.add(userId);
return null;
}
}
TelecomManager telecomManager =
(TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
if (phoneAccount != null) {
return new String[]{phoneAccount.getComponentName().getPackageName()};
}
return null;
}
});
} }
private void registerDefaultAppNotifier() { private void registerDefaultAppNotifier() {
@@ -245,6 +297,7 @@ public class TelecomLoaderService extends SystemService {
packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp( packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp(
packageName, userId); packageName, userId);
} }
updateSimCallManagerPermissions(packageManagerInternal, userId);
} }
} }
}; };
@@ -254,4 +307,36 @@ public class TelecomLoaderService extends SystemService {
mContext.getContentResolver().registerContentObserver(defaultDialerAppUri, mContext.getContentResolver().registerContentObserver(defaultDialerAppUri,
false, contentObserver, UserHandle.USER_ALL); false, contentObserver, UserHandle.USER_ALL);
} }
private void registerCarrierConfigChangedReceiver() {
final PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
for (int userId : UserManagerService.getInstance().getUserIds()) {
updateSimCallManagerPermissions(packageManagerInternal, userId);
}
}
}
};
mContext.registerReceiverAsUser(receiver, UserHandle.ALL,
new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null, null);
}
private void updateSimCallManagerPermissions(PackageManagerInternal packageManagerInternal,
int userId) {
TelecomManager telecomManager =
(TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
if (phoneAccount != null) {
Slog.i(TAG, "updating sim call manager permissions for userId:" + userId);
String packageName = phoneAccount.getComponentName().getPackageName();
packageManagerInternal.grantDefaultPermissionsToDefaultSimCallManager(
packageName, userId);
}
}
} }

View File

@@ -492,6 +492,26 @@ public class TelecomManager {
return null; return null;
} }
/**
* Returns the current SIM call manager for the specified user. Apps must be prepared for this
* method to return {@code null}, indicating that there currently exists no user-chosen default
* {@code PhoneAccount}.
*
* @return The phone account handle of the current sim call manager.
*
* @hide
*/
public PhoneAccountHandle getSimCallManager(int userId) {
try {
if (isServiceConnected()) {
return getTelecomService().getSimCallManagerForUser(userId);
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getSimCallManagerForUser");
}
return null;
}
/** /**
* Returns the current connection manager. Apps must be prepared for this method to return * Returns the current connection manager. Apps must be prepared for this method to return
* {@code null}, indicating that there currently exists no user-chosen default * {@code null}, indicating that there currently exists no user-chosen default

View File

@@ -92,6 +92,11 @@ interface ITelecomService {
*/ */
PhoneAccountHandle getSimCallManager(); PhoneAccountHandle getSimCallManager();
/**
* @see TelecomServiceImpl#getSimCallManagerForUser
*/
PhoneAccountHandle getSimCallManagerForUser(int userId);
/** /**
* @see TelecomServiceImpl#registerPhoneAccount * @see TelecomServiceImpl#registerPhoneAccount
*/ */