Merge "Grant Notifications to Carrier Provisioning App" into tm-dev

This commit is contained in:
Nate Myren
2022-04-28 06:58:08 +00:00
committed by Android (Google) Code Review
5 changed files with 137 additions and 0 deletions

View File

@@ -49,4 +49,6 @@ interface ILegacyPermissionManager {
void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId); void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId);
void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId); void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId);
void grantDefaultPermissionsToCarrierServiceApp(in String packageName, int userId);
} }

View File

@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresPermission; import android.annotation.RequiresPermission;
import android.annotation.SystemService; import android.annotation.SystemService;
import android.annotation.UserIdInt;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.RemoteException; import android.os.RemoteException;
@@ -244,4 +245,20 @@ public final class LegacyPermissionManager {
e.rethrowFromSystemServer(); e.rethrowFromSystemServer();
} }
} }
/**
* Grant permissions to a newly set Carrier Services app.
* @param packageName The newly set Carrier Services app
* @param userId The user for which to grant the permissions.
* @hide
*/
public void grantDefaultPermissionsToCarrierServiceApp(@NonNull String packageName,
@UserIdInt int userId) {
try {
mLegacyPermissionManager.grantDefaultPermissionsToCarrierServiceApp(packageName,
userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
} }

View File

@@ -21,6 +21,7 @@ import static android.os.Process.FIRST_APPLICATION_UID;
import android.Manifest; import android.Manifest;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.DownloadManager; import android.app.DownloadManager;
import android.app.SearchManager; import android.app.SearchManager;
@@ -1093,6 +1094,14 @@ final class DefaultPermissionGrantPolicy {
} }
} }
public void grantDefaultPermissionsToCarrierServiceApp(@NonNull String packageName,
@UserIdInt int userId) {
Log.i(TAG, "Grant permissions to Carrier Service app " + packageName + " for user:"
+ userId);
grantPermissionsToPackage(NO_PM_CACHE, packageName, userId, /* ignoreSystemPackage */ false,
/* whitelistRestricted */ true, NOTIFICATION_PERMISSIONS);
}
private String getDefaultSystemHandlerActivityPackage(PackageManagerWrapper pm, private String getDefaultSystemHandlerActivityPackage(PackageManagerWrapper pm,
String intentAction, int userId) { String intentAction, int userId) {
return getDefaultSystemHandlerActivityPackage(pm, new Intent(intentAction), userId); return getDefaultSystemHandlerActivityPackage(pm, new Intent(intentAction), userId);

View File

@@ -18,6 +18,7 @@ package com.android.server.pm.permission;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
@@ -247,6 +248,15 @@ public class LegacyPermissionManagerService extends ILegacyPermissionManager.Stu
return PackageManager.PERMISSION_GRANTED; return PackageManager.PERMISSION_GRANTED;
} }
@Override
public void grantDefaultPermissionsToCarrierServiceApp(@NonNull String packageName,
@UserIdInt int userId) {
PackageManagerServiceUtils.enforceSystemOrRoot(
"grantDefaultPermissionsForCarrierServiceApp");
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToCarrierServiceApp(packageName, userId));
}
@Override @Override
public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
final int callingUid = Binder.getCallingUid(); final int callingUid = Binder.getCallingUid();

View File

@@ -66,11 +66,13 @@ import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.permission.LegacyPermissionManager;
import android.permission.PermissionControllerManager; import android.permission.PermissionControllerManager;
import android.permission.PermissionManager; import android.permission.PermissionManager;
import android.provider.Settings; import android.provider.Settings;
import android.provider.Telephony; import android.provider.Telephony;
import android.telecom.TelecomManager; import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.Log; import android.util.Log;
@@ -106,6 +108,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
/** /**
@@ -163,6 +166,7 @@ public final class PermissionPolicyService extends SystemService {
private PackageManagerInternal mPackageManagerInternal; private PackageManagerInternal mPackageManagerInternal;
private PermissionManagerServiceInternal mPermissionManagerInternal; private PermissionManagerServiceInternal mPermissionManagerInternal;
private NotificationManagerInternal mNotificationManager; private NotificationManagerInternal mNotificationManager;
private TelephonyManager mTelephonyManager;
private final KeyguardManager mKeyguardManager; private final KeyguardManager mKeyguardManager;
private final PackageManager mPackageManager; private final PackageManager mPackageManager;
private final Handler mHandler; private final Handler mHandler;
@@ -384,6 +388,13 @@ public final class PermissionPolicyService extends SystemService {
public void onBootPhase(int phase) { public void onBootPhase(int phase) {
if (DEBUG) Slog.i(LOG_TAG, "onBootPhase(" + phase + ")"); if (DEBUG) Slog.i(LOG_TAG, "onBootPhase(" + phase + ")");
if (phase == PHASE_DEVICE_SPECIFIC_SERVICES_READY) {
registerCarrierPrivilegesCallbacks();
IntentFilter filter =
new IntentFilter(TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED);
mContext.registerReceiver(mSimConfigBroadcastReceiver, filter);
}
if (phase == PHASE_ACTIVITY_MANAGER_READY) { if (phase == PHASE_ACTIVITY_MANAGER_READY) {
final UserManagerInternal um = LocalServices.getService(UserManagerInternal.class); final UserManagerInternal um = LocalServices.getService(UserManagerInternal.class);
@@ -408,6 +419,94 @@ public final class PermissionPolicyService extends SystemService {
} }
private void initTelephonyManagerIfNeeded() {
if (mTelephonyManager == null) {
mTelephonyManager = TelephonyManager.from(mContext);
}
}
private void registerCarrierPrivilegesCallbacks() {
initTelephonyManagerIfNeeded();
if (mTelephonyManager == null) {
return;
}
int numPhones = mTelephonyManager.getActiveModemCount();
for (int i = 0; i < numPhones; i++) {
PhoneCarrierPrivilegesCallback callback = new PhoneCarrierPrivilegesCallback(i);
mPhoneCarrierPrivilegesCallbacks.add(callback);
mTelephonyManager.registerCarrierPrivilegesCallback(i, mContext.getMainExecutor(),
callback);
}
}
private void unregisterCarrierPrivilegesCallback() {
initTelephonyManagerIfNeeded();
if (mTelephonyManager == null) {
return;
}
for (int i = 0; i < mPhoneCarrierPrivilegesCallbacks.size(); i++) {
PhoneCarrierPrivilegesCallback callback = mPhoneCarrierPrivilegesCallbacks.get(i);
if (callback != null) {
mTelephonyManager.unregisterCarrierPrivilegesCallback(callback);
}
}
mPhoneCarrierPrivilegesCallbacks.clear();
}
private final class PhoneCarrierPrivilegesCallback
implements TelephonyManager.CarrierPrivilegesCallback {
private int mPhoneId;
PhoneCarrierPrivilegesCallback(int phoneId) {
mPhoneId = phoneId;
}
@Override
public void onCarrierPrivilegesChanged(
@NonNull Set<String> privilegedPackageNames,
@NonNull Set<Integer> privilegedUids) {
initTelephonyManagerIfNeeded();
if (mTelephonyManager == null) {
Log.e(LOG_TAG, "Cannot grant default permissions to Carrier Service app. "
+ "TelephonyManager is null");
return;
}
String servicePkg = mTelephonyManager.getCarrierServicePackageNameForLogicalSlot(
mPhoneId);
if (servicePkg == null) {
return;
}
int[] users = LocalServices.getService(UserManagerInternal.class).getUserIds();
LegacyPermissionManager legacyPermManager =
mContext.getSystemService(LegacyPermissionManager.class);
for (int i = 0; i < users.length; i++) {
try {
mPackageManager.getPackageInfoAsUser(servicePkg, 0, users[i]);
legacyPermManager.grantDefaultPermissionsToCarrierServiceApp(
servicePkg, users[i]);
} catch (PackageManager.NameNotFoundException e) {
// Do nothing if the package does not exist for the specified user
}
}
}
}
private final ArrayList<PhoneCarrierPrivilegesCallback> mPhoneCarrierPrivilegesCallbacks =
new ArrayList<>();
private final BroadcastReceiver mSimConfigBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED.equals(intent.getAction())) {
return;
}
unregisterCarrierPrivilegesCallback();
registerCarrierPrivilegesCallbacks();
}
};
/** /**
* @return Whether the user is started but not yet stopped * @return Whether the user is started but not yet stopped
*/ */