Loading src/java/com/android/internal/telephony/MultiSimSettingController.java +10 −6 Original line number Diff line number Diff line Loading @@ -407,7 +407,7 @@ public class MultiSimSettingController extends Handler { if (DBG) log("onSubscriptionGroupChanged"); List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup( groupUuid, mContext.getOpPackageName()); groupUuid, mContext.getOpPackageName(), mContext.getFeatureId()); if (infoList == null || infoList.isEmpty()) return; // Get a reference subscription to copy settings from. Loading Loading @@ -470,7 +470,8 @@ public class MultiSimSettingController extends Handler { if (!isReadyToReevaluate()) return; List<SubscriptionInfo> activeSubInfos = mSubController .getActiveSubscriptionInfoList(mContext.getOpPackageName()); .getActiveSubscriptionInfoList(mContext.getOpPackageName(), mContext.getFeatureId()); if (ArrayUtils.isEmpty(activeSubInfos)) { mPrimarySubList.clear(); Loading Loading @@ -644,7 +645,8 @@ public class MultiSimSettingController extends Handler { if (phone != null && phone.isCdmaSubscriptionAppPresent()) { cdmaPhoneCount++; String simName = mSubController.getActiveSubscriptionInfo( subId, mContext.getOpPackageName()).getDisplayName().toString(); subId, mContext.getOpPackageName(), mContext.getFeatureId()) .getDisplayName().toString(); if (TextUtils.isEmpty(simName)) { // Fall back to carrier name. simName = phone.getCarrierName(); Loading Loading @@ -700,7 +702,8 @@ public class MultiSimSettingController extends Handler { private void setUserDataEnabledForGroup(int subId, boolean enable) { log("setUserDataEnabledForGroup subId " + subId + " enable " + enable); List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup( mSubController.getGroupUuid(subId), mContext.getOpPackageName()); mSubController.getGroupUuid(subId), mContext.getOpPackageName(), mContext.getFeatureId()); if (infoList == null) return; Loading Loading @@ -730,7 +733,8 @@ public class MultiSimSettingController extends Handler { private void setRoamingDataEnabledForGroup(int subId, boolean enable) { SubscriptionController subController = SubscriptionController.getInstance(); List<SubscriptionInfo> infoList = subController.getSubscriptionsInGroup( mSubController.getGroupUuid(subId), mContext.getOpPackageName()); mSubController.getGroupUuid(subId), mContext.getOpPackageName(), mContext.getFeatureId()); if (infoList == null) return; Loading Loading @@ -778,7 +782,7 @@ public class MultiSimSettingController extends Handler { if (!SubscriptionInfoUpdater.isSubInfoInitialized()) return; List<SubscriptionInfo> opptSubList = mSubController.getOpportunisticSubscriptions( mContext.getOpPackageName()); mContext.getOpPackageName(), mContext.getFeatureId()); if (ArrayUtils.isEmpty(opptSubList)) return; Loading src/java/com/android/internal/telephony/NetworkScanRequestTracker.java +2 −1 Original line number Diff line number Diff line Loading @@ -191,7 +191,8 @@ public final class NetworkScanRequestTracker { final long token = Binder.clearCallingIdentity(); try { return SubscriptionController.getInstance() .getAvailableSubscriptionInfoList(context.getOpPackageName()).stream() .getAvailableSubscriptionInfoList(context.getOpPackageName(), context.getFeatureId()).stream() .flatMap(NetworkScanRequestTracker::getAllowableMccMncsFromSubscriptionInfo) .collect(Collectors.toSet()); } finally { Loading src/java/com/android/internal/telephony/PhoneSubInfoController.java +120 −73 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ package com.android.internal.telephony; import static android.Manifest.permission.MODIFY_PHONE_STATE; import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.app.AppOpsManager; import android.content.Context; Loading Loading @@ -54,24 +56,31 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); } @Deprecated public String getDeviceId(String callingPackage) { return getDeviceIdWithFeature(callingPackage, null); } public String getDeviceIdWithFeature(String callingPackage, String callingFeatureId) { return getDeviceIdForPhone(SubscriptionManager.getPhoneId(getDefaultSubscription()), callingPackage); callingPackage, callingFeatureId); } public String getDeviceIdForPhone(int phoneId, String callingPackage) { public String getDeviceIdForPhone(int phoneId, String callingPackage, String callingFeatureId) { return callPhoneMethodForPhoneIdWithReadDeviceIdentifiersCheck(phoneId, callingPackage, "getDeviceId", (phone)-> phone.getDeviceId()); callingFeatureId, "getDeviceId", (phone) -> phone.getDeviceId()); } public String getNaiForSubscriber(int subId, String callingPackage) { public String getNaiForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage, "getNai", (phone)-> phone.getNai()); callingFeatureId, "getNai", (phone)-> phone.getNai()); } public String getImeiForSubscriber(int subId, String callingPackage) { public String getImeiForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(subId, callingPackage, "getImei", (phone)-> phone.getImei()); callingFeatureId, "getImei", (phone) -> phone.getImei()); } public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int subId, int keyType, Loading Loading @@ -107,34 +116,43 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { }); } public String getDeviceSvn(String callingPackage) { return getDeviceSvnUsingSubId(getDefaultSubscription(), callingPackage); public String getDeviceSvn(String callingPackage, String callingFeatureId) { return getDeviceSvnUsingSubId(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getDeviceSvnUsingSubId(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getDeviceSvn", (phone)-> phone.getDeviceSvn()); public String getDeviceSvnUsingSubId(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getDeviceSvn", (phone)-> phone.getDeviceSvn()); } @Deprecated public String getSubscriberId(String callingPackage) { return getSubscriberIdForSubscriber(getDefaultSubscription(), callingPackage); return getSubscriberIdWithFeature(callingPackage, null); } public String getSubscriberIdForSubscriber(int subId, String callingPackage) { public String getSubscriberIdWithFeature(String callingPackage, String callingFeatureId) { return getSubscriberIdForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getSubscriberIdForSubscriber(int subId, String callingPackage, String callingFeatureId) { String message = "getSubscriberId"; long identity = Binder.clearCallingIdentity(); boolean isActive; try { isActive = SubscriptionController.getInstance().isActiveSubId(subId, callingPackage); isActive = SubscriptionController.getInstance().isActiveSubId(subId, callingPackage, callingFeatureId); } finally { Binder.restoreCallingIdentity(identity); } if (isActive) { return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage, message, (phone) -> phone.getSubscriberId()); callingFeatureId, message, (phone) -> phone.getSubscriberId()); } else { if (!TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers( mContext, subId, callingPackage, message)) { mContext, subId, callingPackage, callingFeatureId, message)) { return null; } identity = Binder.clearCallingIdentity(); Loading @@ -146,52 +164,66 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { } } @Deprecated public String getIccSerialNumber(String callingPackage) { return getIccSerialNumberWithFeature(callingPackage, null); } /** * Retrieves the serial number of the ICC, if applicable. */ public String getIccSerialNumber(String callingPackage) { return getIccSerialNumberForSubscriber(getDefaultSubscription(), callingPackage); public String getIccSerialNumberWithFeature(String callingPackage, String callingFeatureId) { return getIccSerialNumberForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getIccSerialNumberForSubscriber(int subId, String callingPackage) { public String getIccSerialNumberForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage, "getIccSerialNumber", (phone) -> phone.getIccSerialNumber()); callingFeatureId, "getIccSerialNumber", (phone) -> phone.getIccSerialNumber()); } public String getLine1Number(String callingPackage) { return getLine1NumberForSubscriber(getDefaultSubscription(), callingPackage); public String getLine1Number(String callingPackage, String callingFeatureId) { return getLine1NumberForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getLine1NumberForSubscriber(int subId, String callingPackage) { public String getLine1NumberForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadPhoneNumberCheck( subId, callingPackage, "getLine1Number", subId, callingPackage, callingFeatureId, "getLine1Number", (phone)-> phone.getLine1Number()); } public String getLine1AlphaTag(String callingPackage) { return getLine1AlphaTagForSubscriber(getDefaultSubscription(), callingPackage); public String getLine1AlphaTag(String callingPackage, String callingFeatureId) { return getLine1AlphaTagForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getLine1AlphaTagForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getLine1AlphaTag", (phone)-> phone.getLine1AlphaTag()); public String getLine1AlphaTagForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getLine1AlphaTag", (phone)-> phone.getLine1AlphaTag()); } public String getMsisdn(String callingPackage) { return getMsisdnForSubscriber(getDefaultSubscription(), callingPackage); public String getMsisdn(String callingPackage, String callingFeatureId) { return getMsisdnForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getMsisdnForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getMsisdn", (phone)-> phone.getMsisdn()); public String getMsisdnForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getMsisdn", (phone)-> phone.getMsisdn()); } public String getVoiceMailNumber(String callingPackage) { return getVoiceMailNumberForSubscriber(getDefaultSubscription(), callingPackage); public String getVoiceMailNumber(String callingPackage, String callingFeatureId) { return getVoiceMailNumberForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getVoiceMailNumberForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, public String getVoiceMailNumberForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getVoiceMailNumber", (phone)-> { String number = PhoneNumberUtils.extractNetworkPortion( phone.getVoiceMailNumber()); Loading @@ -200,12 +232,14 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { }); } public String getVoiceMailAlphaTag(String callingPackage) { return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription(), callingPackage); public String getVoiceMailAlphaTag(String callingPackage, String callingFeatureId) { return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getVoiceMailAlphaTagForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, public String getVoiceMailAlphaTagForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getVoiceMailAlphaTag", (phone)-> phone.getVoiceMailAlphaTag()); } Loading Loading @@ -353,16 +387,17 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { return uiccApp.getIccRecords().getIccSimChallengeResponse(authType, data); }; return callPhoneMethodWithPermissionCheck( subId, null, "getIccSimChallengeResponse", toExecute, (aContext, aSubId, aCallingPackage, aMessage)-> { return callPhoneMethodWithPermissionCheck(subId, null, null, "getIccSimChallengeResponse", toExecute, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> { enforcePrivilegedPermissionOrCarrierPrivilege(aSubId, aMessage); return true; }); } public String getGroupIdLevel1ForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, public String getGroupIdLevel1ForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getGroupIdLevel1", (phone)-> phone.getGroupIdLevel1()); } Loading @@ -381,14 +416,17 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { // If passes, it should return true. // If permission is not granted, throws SecurityException. // If permission is revoked by AppOps, return false. boolean checkPermission(Context context, int subId, String callingPackage, String message); boolean checkPermission(Context context, int subId, String callingPackage, @Nullable String callingFeatureId, String message); } // Base utility method that others use. private <T> T callPhoneMethodWithPermissionCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper, PermissionCheckHelper permissionCheckHelper) { if (!permissionCheckHelper.checkPermission(mContext, subId, callingPackage, message)) { if (!permissionCheckHelper.checkPermission(mContext, subId, callingPackage, callingFeatureId, message)) { return null; } Loading @@ -407,33 +445,39 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { } private <T> T callPhoneMethodForSubIdWithReadCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> TelephonyPermissions.checkCallingOrSelfReadPhoneState( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> String callingPackage, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> String callingPackage, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForSubIdWithPrivilegedCheck( int subId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> { return callPhoneMethodWithPermissionCheck(subId, null, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> { mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message); return true; }); Loading @@ -441,23 +485,26 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { private <T> T callPhoneMethodForSubIdWithModifyCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> { return callPhoneMethodWithPermissionCheck(subId, null, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> { enforceModifyPermission(); return true; }); } private <T> T callPhoneMethodForSubIdWithReadPhoneNumberCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> @NonNull String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> TelephonyPermissions.checkCallingOrSelfReadPhoneNumber( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForPhoneIdWithReadDeviceIdentifiersCheck(int phoneId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { String callingPackage, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { // Getting subId before doing permission check. if (!SubscriptionManager.isValidPhoneId(phoneId)) { phoneId = 0; Loading @@ -467,7 +514,7 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { return null; } if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext, phone.getSubId(), callingPackage, message)) { phone.getSubId(), callingPackage, callingFeatureId, message)) { return null; } Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +4 −2 Original line number Diff line number Diff line Loading @@ -4094,7 +4094,8 @@ public class ServiceStateTracker extends Handler { Context context = mPhone.getContext(); SubscriptionInfo info = mSubscriptionController .getActiveSubscriptionInfo(mPhone.getSubId(), context.getOpPackageName()); .getActiveSubscriptionInfo(mPhone.getSubId(), context.getOpPackageName(), context.getFeatureId()); //if subscription is part of a group and non-primary, suppress all notifications if (info == null || (info.isOpportunistic() && info.getGroupUuid() != null)) { Loading Loading @@ -4906,7 +4907,8 @@ public class ServiceStateTracker extends Handler { if (!isStale) return false; List<SubscriptionInfo> subInfoList = SubscriptionController.getInstance() .getActiveSubscriptionInfoList(mPhone.getContext().getOpPackageName()); .getActiveSubscriptionInfoList(mPhone.getContext().getOpPackageName(), mPhone.getContext().getFeatureId()); for (SubscriptionInfo info : subInfoList) { // If we have an active opportunistic subscription whose data is IN_SERVICE, we needs // to get signal strength to decide data switching threshold. In this case, we poll Loading src/java/com/android/internal/telephony/SmsController.java +3 −3 Original line number Diff line number Diff line Loading @@ -512,10 +512,10 @@ public class SmsController extends ISmsImplBase { } @Override public int checkSmsShortCodeDestination( int subId, String callingPackage, String destAddress, String countryIso) { public int checkSmsShortCodeDestination(int subId, String callingPackage, String callingFeatureId, String destAddress, String countryIso) { if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(getPhone(subId).getContext(), subId, callingPackage, "checkSmsShortCodeDestination")) { subId, callingPackage, callingFeatureId, "checkSmsShortCodeDestination")) { return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } final long identity = Binder.clearCallingIdentity(); Loading Loading
src/java/com/android/internal/telephony/MultiSimSettingController.java +10 −6 Original line number Diff line number Diff line Loading @@ -407,7 +407,7 @@ public class MultiSimSettingController extends Handler { if (DBG) log("onSubscriptionGroupChanged"); List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup( groupUuid, mContext.getOpPackageName()); groupUuid, mContext.getOpPackageName(), mContext.getFeatureId()); if (infoList == null || infoList.isEmpty()) return; // Get a reference subscription to copy settings from. Loading Loading @@ -470,7 +470,8 @@ public class MultiSimSettingController extends Handler { if (!isReadyToReevaluate()) return; List<SubscriptionInfo> activeSubInfos = mSubController .getActiveSubscriptionInfoList(mContext.getOpPackageName()); .getActiveSubscriptionInfoList(mContext.getOpPackageName(), mContext.getFeatureId()); if (ArrayUtils.isEmpty(activeSubInfos)) { mPrimarySubList.clear(); Loading Loading @@ -644,7 +645,8 @@ public class MultiSimSettingController extends Handler { if (phone != null && phone.isCdmaSubscriptionAppPresent()) { cdmaPhoneCount++; String simName = mSubController.getActiveSubscriptionInfo( subId, mContext.getOpPackageName()).getDisplayName().toString(); subId, mContext.getOpPackageName(), mContext.getFeatureId()) .getDisplayName().toString(); if (TextUtils.isEmpty(simName)) { // Fall back to carrier name. simName = phone.getCarrierName(); Loading Loading @@ -700,7 +702,8 @@ public class MultiSimSettingController extends Handler { private void setUserDataEnabledForGroup(int subId, boolean enable) { log("setUserDataEnabledForGroup subId " + subId + " enable " + enable); List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup( mSubController.getGroupUuid(subId), mContext.getOpPackageName()); mSubController.getGroupUuid(subId), mContext.getOpPackageName(), mContext.getFeatureId()); if (infoList == null) return; Loading Loading @@ -730,7 +733,8 @@ public class MultiSimSettingController extends Handler { private void setRoamingDataEnabledForGroup(int subId, boolean enable) { SubscriptionController subController = SubscriptionController.getInstance(); List<SubscriptionInfo> infoList = subController.getSubscriptionsInGroup( mSubController.getGroupUuid(subId), mContext.getOpPackageName()); mSubController.getGroupUuid(subId), mContext.getOpPackageName(), mContext.getFeatureId()); if (infoList == null) return; Loading Loading @@ -778,7 +782,7 @@ public class MultiSimSettingController extends Handler { if (!SubscriptionInfoUpdater.isSubInfoInitialized()) return; List<SubscriptionInfo> opptSubList = mSubController.getOpportunisticSubscriptions( mContext.getOpPackageName()); mContext.getOpPackageName(), mContext.getFeatureId()); if (ArrayUtils.isEmpty(opptSubList)) return; Loading
src/java/com/android/internal/telephony/NetworkScanRequestTracker.java +2 −1 Original line number Diff line number Diff line Loading @@ -191,7 +191,8 @@ public final class NetworkScanRequestTracker { final long token = Binder.clearCallingIdentity(); try { return SubscriptionController.getInstance() .getAvailableSubscriptionInfoList(context.getOpPackageName()).stream() .getAvailableSubscriptionInfoList(context.getOpPackageName(), context.getFeatureId()).stream() .flatMap(NetworkScanRequestTracker::getAllowableMccMncsFromSubscriptionInfo) .collect(Collectors.toSet()); } finally { Loading
src/java/com/android/internal/telephony/PhoneSubInfoController.java +120 −73 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ package com.android.internal.telephony; import static android.Manifest.permission.MODIFY_PHONE_STATE; import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.app.AppOpsManager; import android.content.Context; Loading Loading @@ -54,24 +56,31 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); } @Deprecated public String getDeviceId(String callingPackage) { return getDeviceIdWithFeature(callingPackage, null); } public String getDeviceIdWithFeature(String callingPackage, String callingFeatureId) { return getDeviceIdForPhone(SubscriptionManager.getPhoneId(getDefaultSubscription()), callingPackage); callingPackage, callingFeatureId); } public String getDeviceIdForPhone(int phoneId, String callingPackage) { public String getDeviceIdForPhone(int phoneId, String callingPackage, String callingFeatureId) { return callPhoneMethodForPhoneIdWithReadDeviceIdentifiersCheck(phoneId, callingPackage, "getDeviceId", (phone)-> phone.getDeviceId()); callingFeatureId, "getDeviceId", (phone) -> phone.getDeviceId()); } public String getNaiForSubscriber(int subId, String callingPackage) { public String getNaiForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage, "getNai", (phone)-> phone.getNai()); callingFeatureId, "getNai", (phone)-> phone.getNai()); } public String getImeiForSubscriber(int subId, String callingPackage) { public String getImeiForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(subId, callingPackage, "getImei", (phone)-> phone.getImei()); callingFeatureId, "getImei", (phone) -> phone.getImei()); } public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int subId, int keyType, Loading Loading @@ -107,34 +116,43 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { }); } public String getDeviceSvn(String callingPackage) { return getDeviceSvnUsingSubId(getDefaultSubscription(), callingPackage); public String getDeviceSvn(String callingPackage, String callingFeatureId) { return getDeviceSvnUsingSubId(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getDeviceSvnUsingSubId(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getDeviceSvn", (phone)-> phone.getDeviceSvn()); public String getDeviceSvnUsingSubId(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getDeviceSvn", (phone)-> phone.getDeviceSvn()); } @Deprecated public String getSubscriberId(String callingPackage) { return getSubscriberIdForSubscriber(getDefaultSubscription(), callingPackage); return getSubscriberIdWithFeature(callingPackage, null); } public String getSubscriberIdForSubscriber(int subId, String callingPackage) { public String getSubscriberIdWithFeature(String callingPackage, String callingFeatureId) { return getSubscriberIdForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getSubscriberIdForSubscriber(int subId, String callingPackage, String callingFeatureId) { String message = "getSubscriberId"; long identity = Binder.clearCallingIdentity(); boolean isActive; try { isActive = SubscriptionController.getInstance().isActiveSubId(subId, callingPackage); isActive = SubscriptionController.getInstance().isActiveSubId(subId, callingPackage, callingFeatureId); } finally { Binder.restoreCallingIdentity(identity); } if (isActive) { return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage, message, (phone) -> phone.getSubscriberId()); callingFeatureId, message, (phone) -> phone.getSubscriberId()); } else { if (!TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers( mContext, subId, callingPackage, message)) { mContext, subId, callingPackage, callingFeatureId, message)) { return null; } identity = Binder.clearCallingIdentity(); Loading @@ -146,52 +164,66 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { } } @Deprecated public String getIccSerialNumber(String callingPackage) { return getIccSerialNumberWithFeature(callingPackage, null); } /** * Retrieves the serial number of the ICC, if applicable. */ public String getIccSerialNumber(String callingPackage) { return getIccSerialNumberForSubscriber(getDefaultSubscription(), callingPackage); public String getIccSerialNumberWithFeature(String callingPackage, String callingFeatureId) { return getIccSerialNumberForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getIccSerialNumberForSubscriber(int subId, String callingPackage) { public String getIccSerialNumberForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage, "getIccSerialNumber", (phone) -> phone.getIccSerialNumber()); callingFeatureId, "getIccSerialNumber", (phone) -> phone.getIccSerialNumber()); } public String getLine1Number(String callingPackage) { return getLine1NumberForSubscriber(getDefaultSubscription(), callingPackage); public String getLine1Number(String callingPackage, String callingFeatureId) { return getLine1NumberForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getLine1NumberForSubscriber(int subId, String callingPackage) { public String getLine1NumberForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadPhoneNumberCheck( subId, callingPackage, "getLine1Number", subId, callingPackage, callingFeatureId, "getLine1Number", (phone)-> phone.getLine1Number()); } public String getLine1AlphaTag(String callingPackage) { return getLine1AlphaTagForSubscriber(getDefaultSubscription(), callingPackage); public String getLine1AlphaTag(String callingPackage, String callingFeatureId) { return getLine1AlphaTagForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getLine1AlphaTagForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getLine1AlphaTag", (phone)-> phone.getLine1AlphaTag()); public String getLine1AlphaTagForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getLine1AlphaTag", (phone)-> phone.getLine1AlphaTag()); } public String getMsisdn(String callingPackage) { return getMsisdnForSubscriber(getDefaultSubscription(), callingPackage); public String getMsisdn(String callingPackage, String callingFeatureId) { return getMsisdnForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getMsisdnForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getMsisdn", (phone)-> phone.getMsisdn()); public String getMsisdnForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getMsisdn", (phone)-> phone.getMsisdn()); } public String getVoiceMailNumber(String callingPackage) { return getVoiceMailNumberForSubscriber(getDefaultSubscription(), callingPackage); public String getVoiceMailNumber(String callingPackage, String callingFeatureId) { return getVoiceMailNumberForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getVoiceMailNumberForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, public String getVoiceMailNumberForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getVoiceMailNumber", (phone)-> { String number = PhoneNumberUtils.extractNetworkPortion( phone.getVoiceMailNumber()); Loading @@ -200,12 +232,14 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { }); } public String getVoiceMailAlphaTag(String callingPackage) { return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription(), callingPackage); public String getVoiceMailAlphaTag(String callingPackage, String callingFeatureId) { return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId); } public String getVoiceMailAlphaTagForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, public String getVoiceMailAlphaTagForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getVoiceMailAlphaTag", (phone)-> phone.getVoiceMailAlphaTag()); } Loading Loading @@ -353,16 +387,17 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { return uiccApp.getIccRecords().getIccSimChallengeResponse(authType, data); }; return callPhoneMethodWithPermissionCheck( subId, null, "getIccSimChallengeResponse", toExecute, (aContext, aSubId, aCallingPackage, aMessage)-> { return callPhoneMethodWithPermissionCheck(subId, null, null, "getIccSimChallengeResponse", toExecute, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> { enforcePrivilegedPermissionOrCarrierPrivilege(aSubId, aMessage); return true; }); } public String getGroupIdLevel1ForSubscriber(int subId, String callingPackage) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, public String getGroupIdLevel1ForSubscriber(int subId, String callingPackage, String callingFeatureId) { return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId, "getGroupIdLevel1", (phone)-> phone.getGroupIdLevel1()); } Loading @@ -381,14 +416,17 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { // If passes, it should return true. // If permission is not granted, throws SecurityException. // If permission is revoked by AppOps, return false. boolean checkPermission(Context context, int subId, String callingPackage, String message); boolean checkPermission(Context context, int subId, String callingPackage, @Nullable String callingFeatureId, String message); } // Base utility method that others use. private <T> T callPhoneMethodWithPermissionCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper, PermissionCheckHelper permissionCheckHelper) { if (!permissionCheckHelper.checkPermission(mContext, subId, callingPackage, message)) { if (!permissionCheckHelper.checkPermission(mContext, subId, callingPackage, callingFeatureId, message)) { return null; } Loading @@ -407,33 +445,39 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { } private <T> T callPhoneMethodForSubIdWithReadCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> TelephonyPermissions.checkCallingOrSelfReadPhoneState( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> String callingPackage, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> String callingPackage, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForSubIdWithPrivilegedCheck( int subId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> { return callPhoneMethodWithPermissionCheck(subId, null, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> { mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message); return true; }); Loading @@ -441,23 +485,26 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { private <T> T callPhoneMethodForSubIdWithModifyCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> { return callPhoneMethodWithPermissionCheck(subId, null, null, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> { enforceModifyPermission(); return true; }); } private <T> T callPhoneMethodForSubIdWithReadPhoneNumberCheck(int subId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aMessage)-> @NonNull String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId, message, callMethodHelper, (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> TelephonyPermissions.checkCallingOrSelfReadPhoneNumber( aContext, aSubId, aCallingPackage, aMessage)); aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)); } private <T> T callPhoneMethodForPhoneIdWithReadDeviceIdentifiersCheck(int phoneId, String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) { String callingPackage, @Nullable String callingFeatureId, String message, CallPhoneMethodHelper<T> callMethodHelper) { // Getting subId before doing permission check. if (!SubscriptionManager.isValidPhoneId(phoneId)) { phoneId = 0; Loading @@ -467,7 +514,7 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub { return null; } if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext, phone.getSubId(), callingPackage, message)) { phone.getSubId(), callingPackage, callingFeatureId, message)) { return null; } Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +4 −2 Original line number Diff line number Diff line Loading @@ -4094,7 +4094,8 @@ public class ServiceStateTracker extends Handler { Context context = mPhone.getContext(); SubscriptionInfo info = mSubscriptionController .getActiveSubscriptionInfo(mPhone.getSubId(), context.getOpPackageName()); .getActiveSubscriptionInfo(mPhone.getSubId(), context.getOpPackageName(), context.getFeatureId()); //if subscription is part of a group and non-primary, suppress all notifications if (info == null || (info.isOpportunistic() && info.getGroupUuid() != null)) { Loading Loading @@ -4906,7 +4907,8 @@ public class ServiceStateTracker extends Handler { if (!isStale) return false; List<SubscriptionInfo> subInfoList = SubscriptionController.getInstance() .getActiveSubscriptionInfoList(mPhone.getContext().getOpPackageName()); .getActiveSubscriptionInfoList(mPhone.getContext().getOpPackageName(), mPhone.getContext().getFeatureId()); for (SubscriptionInfo info : subInfoList) { // If we have an active opportunistic subscription whose data is IN_SERVICE, we needs // to get signal strength to decide data switching threshold. In this case, we poll Loading
src/java/com/android/internal/telephony/SmsController.java +3 −3 Original line number Diff line number Diff line Loading @@ -512,10 +512,10 @@ public class SmsController extends ISmsImplBase { } @Override public int checkSmsShortCodeDestination( int subId, String callingPackage, String destAddress, String countryIso) { public int checkSmsShortCodeDestination(int subId, String callingPackage, String callingFeatureId, String destAddress, String countryIso) { if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(getPhone(subId).getContext(), subId, callingPackage, "checkSmsShortCodeDestination")) { subId, callingPackage, callingFeatureId, "checkSmsShortCodeDestination")) { return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE; } final long identity = Binder.clearCallingIdentity(); Loading