Expose remaining READ_PHONE_STATE APIs to carrier apps.
Bug: 70041899
Test: Flash / boot; TreeHugger; Unit/CTS tests in topic
Change-Id: I2da2a2affb2d6c164e5723e59cd4ea7da6fb0dab
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 8b37a52..d482811 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -56,6 +56,7 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.TelephonyPermissions;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
@@ -786,12 +787,23 @@
@Override public
@NonNull
PersistableBundle getConfigForSubId(int subId) {
+ // TODO(b/73136824): Migrate to TelephonyPermissions#checkCallingOrSelfReadPhoneState.
try {
mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, null);
// SKIP checking run-time READ_PHONE_STATE since using PRIVILEGED
} catch (SecurityException e) {
- mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, null);
+ try {
+ mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, null);
+ } catch (SecurityException securityException) {
+ // If we don't have the runtime permission, but do have carrier privileges, that
+ // suffices for reading phone state.
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ throw securityException;
+ }
+ TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(subId, null);
+ }
}
+
int phoneId = SubscriptionManager.getPhoneId(subId);
PersistableBundle retConfig = CarrierConfigManager.getDefaultConfig();
if (SubscriptionManager.isValidPhoneId(phoneId)) {