Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4843a5fa authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Pipe through featureId from caller to permission checks.

The featureId is only needed for runtime permission checks.

Test: atest FrameworksTelephonyTests
Bug: 136595429
Change-Id: I3ab07fc0abc0a20ee2018ed7f26f13255fb024fd
parent aa9efbf9
Loading
Loading
Loading
Loading
+10 −6
Original line number Original line Diff line number Diff line
@@ -407,7 +407,7 @@ public class MultiSimSettingController extends Handler {
        if (DBG) log("onSubscriptionGroupChanged");
        if (DBG) log("onSubscriptionGroupChanged");


        List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup(
        List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup(
                groupUuid, mContext.getOpPackageName());
                groupUuid, mContext.getOpPackageName(), mContext.getFeatureId());
        if (infoList == null || infoList.isEmpty()) return;
        if (infoList == null || infoList.isEmpty()) return;


        // Get a reference subscription to copy settings from.
        // Get a reference subscription to copy settings from.
@@ -470,7 +470,8 @@ public class MultiSimSettingController extends Handler {
        if (!isReadyToReevaluate()) return;
        if (!isReadyToReevaluate()) return;


        List<SubscriptionInfo> activeSubInfos = mSubController
        List<SubscriptionInfo> activeSubInfos = mSubController
                .getActiveSubscriptionInfoList(mContext.getOpPackageName());
                .getActiveSubscriptionInfoList(mContext.getOpPackageName(),
                        mContext.getFeatureId());


        if (ArrayUtils.isEmpty(activeSubInfos)) {
        if (ArrayUtils.isEmpty(activeSubInfos)) {
            mPrimarySubList.clear();
            mPrimarySubList.clear();
@@ -644,7 +645,8 @@ public class MultiSimSettingController extends Handler {
            if (phone != null && phone.isCdmaSubscriptionAppPresent()) {
            if (phone != null && phone.isCdmaSubscriptionAppPresent()) {
                cdmaPhoneCount++;
                cdmaPhoneCount++;
                String simName = mSubController.getActiveSubscriptionInfo(
                String simName = mSubController.getActiveSubscriptionInfo(
                        subId, mContext.getOpPackageName()).getDisplayName().toString();
                        subId, mContext.getOpPackageName(), mContext.getFeatureId())
                        .getDisplayName().toString();
                if (TextUtils.isEmpty(simName)) {
                if (TextUtils.isEmpty(simName)) {
                    // Fall back to carrier name.
                    // Fall back to carrier name.
                    simName = phone.getCarrierName();
                    simName = phone.getCarrierName();
@@ -700,7 +702,8 @@ public class MultiSimSettingController extends Handler {
    private void setUserDataEnabledForGroup(int subId, boolean enable) {
    private void setUserDataEnabledForGroup(int subId, boolean enable) {
        log("setUserDataEnabledForGroup subId " + subId + " enable " + enable);
        log("setUserDataEnabledForGroup subId " + subId + " enable " + enable);
        List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup(
        List<SubscriptionInfo> infoList = mSubController.getSubscriptionsInGroup(
                mSubController.getGroupUuid(subId), mContext.getOpPackageName());
                mSubController.getGroupUuid(subId), mContext.getOpPackageName(),
                mContext.getFeatureId());


        if (infoList == null) return;
        if (infoList == null) return;


@@ -730,7 +733,8 @@ public class MultiSimSettingController extends Handler {
    private void setRoamingDataEnabledForGroup(int subId, boolean enable) {
    private void setRoamingDataEnabledForGroup(int subId, boolean enable) {
        SubscriptionController subController = SubscriptionController.getInstance();
        SubscriptionController subController = SubscriptionController.getInstance();
        List<SubscriptionInfo> infoList = subController.getSubscriptionsInGroup(
        List<SubscriptionInfo> infoList = subController.getSubscriptionsInGroup(
                mSubController.getGroupUuid(subId), mContext.getOpPackageName());
                mSubController.getGroupUuid(subId), mContext.getOpPackageName(),
                mContext.getFeatureId());


        if (infoList == null) return;
        if (infoList == null) return;


@@ -778,7 +782,7 @@ public class MultiSimSettingController extends Handler {
        if (!SubscriptionInfoUpdater.isSubInfoInitialized()) return;
        if (!SubscriptionInfoUpdater.isSubInfoInitialized()) return;


        List<SubscriptionInfo> opptSubList = mSubController.getOpportunisticSubscriptions(
        List<SubscriptionInfo> opptSubList = mSubController.getOpportunisticSubscriptions(
                mContext.getOpPackageName());
                mContext.getOpPackageName(), mContext.getFeatureId());


        if (ArrayUtils.isEmpty(opptSubList)) return;
        if (ArrayUtils.isEmpty(opptSubList)) return;


+2 −1
Original line number Original line Diff line number Diff line
@@ -181,7 +181,8 @@ public final class NetworkScanRequestTracker {
        final long token = Binder.clearCallingIdentity();
        final long token = Binder.clearCallingIdentity();
        try {
        try {
            return SubscriptionController.getInstance()
            return SubscriptionController.getInstance()
                    .getAvailableSubscriptionInfoList(context.getOpPackageName()).stream()
                    .getAvailableSubscriptionInfoList(context.getOpPackageName(),
                            context.getFeatureId()).stream()
                    .flatMap(NetworkScanRequestTracker::getAllowableMccMncsFromSubscriptionInfo)
                    .flatMap(NetworkScanRequestTracker::getAllowableMccMncsFromSubscriptionInfo)
                    .collect(Collectors.toSet());
                    .collect(Collectors.toSet());
        } finally {
        } finally {
+120 −73
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@ package com.android.internal.telephony;
import static android.Manifest.permission.MODIFY_PHONE_STATE;
import static android.Manifest.permission.MODIFY_PHONE_STATE;
import static android.Manifest.permission.READ_PRIVILEGED_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.annotation.UnsupportedAppUsage;
import android.app.AppOpsManager;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.Context;
@@ -54,24 +56,31 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
        mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
        mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
    }
    }


    @Deprecated
    public String getDeviceId(String callingPackage) {
    public String getDeviceId(String callingPackage) {
        return getDeviceIdWithFeature(callingPackage, null);
    }

    public String getDeviceIdWithFeature(String callingPackage, String callingFeatureId) {
        return getDeviceIdForPhone(SubscriptionManager.getPhoneId(getDefaultSubscription()),
        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,
        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,
        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,
        return callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(subId, callingPackage,
                "getImei", (phone)-> phone.getImei());
                callingFeatureId, "getImei", (phone) -> phone.getImei());
    }
    }


    public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int subId, int keyType,
    public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int subId, int keyType,
@@ -107,34 +116,43 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
                });
                });
    }
    }


    public String getDeviceSvn(String callingPackage) {
    public String getDeviceSvn(String callingPackage, String callingFeatureId) {
        return getDeviceSvnUsingSubId(getDefaultSubscription(), callingPackage);
        return getDeviceSvnUsingSubId(getDefaultSubscription(), callingPackage, callingFeatureId);
    }
    }


    public String getDeviceSvnUsingSubId(int subId, String callingPackage) {
    public String getDeviceSvnUsingSubId(int subId, String callingPackage,
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getDeviceSvn",
            String callingFeatureId) {
                (phone)-> phone.getDeviceSvn());
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId,
                "getDeviceSvn", (phone)-> phone.getDeviceSvn());
    }
    }


    @Deprecated
    public String getSubscriberId(String callingPackage) {
    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";
        String message = "getSubscriberId";
        long identity = Binder.clearCallingIdentity();
        long identity = Binder.clearCallingIdentity();
        boolean isActive;
        boolean isActive;
        try {
        try {
            isActive = SubscriptionController.getInstance().isActiveSubId(subId, callingPackage);
            isActive = SubscriptionController.getInstance().isActiveSubId(subId, callingPackage,
                    callingFeatureId);
        } finally {
        } finally {
            Binder.restoreCallingIdentity(identity);
            Binder.restoreCallingIdentity(identity);
        }
        }
        if (isActive) {
        if (isActive) {
            return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage,
            return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage,
                    message, (phone) -> phone.getSubscriberId());
                    callingFeatureId, message, (phone) -> phone.getSubscriberId());
        } else {
        } else {
            if (!TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers(
            if (!TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers(
                    mContext, subId, callingPackage, message)) {
                    mContext, subId, callingPackage, callingFeatureId, message)) {
                return null;
                return null;
            }
            }
            identity = Binder.clearCallingIdentity();
            identity = Binder.clearCallingIdentity();
@@ -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.
     * Retrieves the serial number of the ICC, if applicable.
     */
     */
    public String getIccSerialNumber(String callingPackage) {
    public String getIccSerialNumberWithFeature(String callingPackage, String callingFeatureId) {
        return getIccSerialNumberForSubscriber(getDefaultSubscription(), callingPackage);
        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,
        return callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(subId, callingPackage,
                "getIccSerialNumber", (phone) -> phone.getIccSerialNumber());
                callingFeatureId, "getIccSerialNumber", (phone) -> phone.getIccSerialNumber());
    }
    }


    public String getLine1Number(String callingPackage) {
    public String getLine1Number(String callingPackage, String callingFeatureId) {
        return getLine1NumberForSubscriber(getDefaultSubscription(), callingPackage);
        return getLine1NumberForSubscriber(getDefaultSubscription(), callingPackage,
                callingFeatureId);
    }
    }


    public String getLine1NumberForSubscriber(int subId, String callingPackage) {
    public String getLine1NumberForSubscriber(int subId, String callingPackage,
            String callingFeatureId) {
        return callPhoneMethodForSubIdWithReadPhoneNumberCheck(
        return callPhoneMethodForSubIdWithReadPhoneNumberCheck(
                subId, callingPackage, "getLine1Number",
                subId, callingPackage, callingFeatureId, "getLine1Number",
                (phone)-> phone.getLine1Number());
                (phone)-> phone.getLine1Number());
    }
    }


    public String getLine1AlphaTag(String callingPackage) {
    public String getLine1AlphaTag(String callingPackage, String callingFeatureId) {
        return getLine1AlphaTagForSubscriber(getDefaultSubscription(), callingPackage);
        return getLine1AlphaTagForSubscriber(getDefaultSubscription(), callingPackage,
                callingFeatureId);
    }
    }


    public String getLine1AlphaTagForSubscriber(int subId, String callingPackage) {
    public String getLine1AlphaTagForSubscriber(int subId, String callingPackage,
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getLine1AlphaTag",
            String callingFeatureId) {
                (phone)-> phone.getLine1AlphaTag());
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId,
                "getLine1AlphaTag", (phone)-> phone.getLine1AlphaTag());
    }
    }


    public String getMsisdn(String callingPackage) {
    public String getMsisdn(String callingPackage, String callingFeatureId) {
        return getMsisdnForSubscriber(getDefaultSubscription(), callingPackage);
        return getMsisdnForSubscriber(getDefaultSubscription(), callingPackage, callingFeatureId);
    }
    }


    public String getMsisdnForSubscriber(int subId, String callingPackage) {
    public String getMsisdnForSubscriber(int subId, String callingPackage,
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, "getMsisdn",
            String callingFeatureId) {
                (phone)-> phone.getMsisdn());
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId,
                "getMsisdn", (phone)-> phone.getMsisdn());
    }
    }


    public String getVoiceMailNumber(String callingPackage) {
    public String getVoiceMailNumber(String callingPackage, String callingFeatureId) {
        return getVoiceMailNumberForSubscriber(getDefaultSubscription(), callingPackage);
        return getVoiceMailNumberForSubscriber(getDefaultSubscription(), callingPackage,
                callingFeatureId);
    }
    }


    public String getVoiceMailNumberForSubscriber(int subId, String callingPackage) {
    public String getVoiceMailNumberForSubscriber(int subId, String callingPackage,
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage,
            String callingFeatureId) {
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId,
                "getVoiceMailNumber", (phone)-> {
                "getVoiceMailNumber", (phone)-> {
                    String number = PhoneNumberUtils.extractNetworkPortion(
                    String number = PhoneNumberUtils.extractNetworkPortion(
                            phone.getVoiceMailNumber());
                            phone.getVoiceMailNumber());
@@ -200,12 +232,14 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
                });
                });
    }
    }


    public String getVoiceMailAlphaTag(String callingPackage) {
    public String getVoiceMailAlphaTag(String callingPackage, String callingFeatureId) {
        return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription(), callingPackage);
        return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription(), callingPackage,
                callingFeatureId);
    }
    }


    public String getVoiceMailAlphaTagForSubscriber(int subId, String callingPackage) {
    public String getVoiceMailAlphaTagForSubscriber(int subId, String callingPackage,
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage,
            String callingFeatureId) {
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId,
                "getVoiceMailAlphaTag", (phone)-> phone.getVoiceMailAlphaTag());
                "getVoiceMailAlphaTag", (phone)-> phone.getVoiceMailAlphaTag());
    }
    }


@@ -353,16 +387,17 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
            return uiccApp.getIccRecords().getIccSimChallengeResponse(authType, data);
            return uiccApp.getIccRecords().getIccSimChallengeResponse(authType, data);
        };
        };


        return callPhoneMethodWithPermissionCheck(
        return callPhoneMethodWithPermissionCheck(subId, null, null, "getIccSimChallengeResponse",
                subId, null, "getIccSimChallengeResponse", toExecute,
                toExecute,
                (aContext, aSubId, aCallingPackage, aMessage)-> {
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> {
                    enforcePrivilegedPermissionOrCarrierPrivilege(aSubId, aMessage);
                    enforcePrivilegedPermissionOrCarrierPrivilege(aSubId, aMessage);
                    return true;
                    return true;
                });
                });
    }
    }


    public String getGroupIdLevel1ForSubscriber(int subId, String callingPackage) {
    public String getGroupIdLevel1ForSubscriber(int subId, String callingPackage,
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage,
            String callingFeatureId) {
        return callPhoneMethodForSubIdWithReadCheck(subId, callingPackage, callingFeatureId,
                "getGroupIdLevel1", (phone)-> phone.getGroupIdLevel1());
                "getGroupIdLevel1", (phone)-> phone.getGroupIdLevel1());
    }
    }


@@ -381,14 +416,17 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
        // If passes, it should return true.
        // If passes, it should return true.
        // If permission is not granted, throws SecurityException.
        // If permission is not granted, throws SecurityException.
        // If permission is revoked by AppOps, return false.
        // 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.
    // Base utility method that others use.
    private <T> T callPhoneMethodWithPermissionCheck(int subId, String callingPackage,
    private <T> T callPhoneMethodWithPermissionCheck(int subId, String callingPackage,
            String message, CallPhoneMethodHelper<T> callMethodHelper,
            @Nullable String callingFeatureId, String message,
            CallPhoneMethodHelper<T> callMethodHelper,
            PermissionCheckHelper permissionCheckHelper) {
            PermissionCheckHelper permissionCheckHelper) {
        if (!permissionCheckHelper.checkPermission(mContext, subId, callingPackage, message)) {
        if (!permissionCheckHelper.checkPermission(mContext, subId, callingPackage,
                callingFeatureId, message)) {
            return null;
            return null;
        }
        }


@@ -407,33 +445,39 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
    }
    }


    private <T> T callPhoneMethodForSubIdWithReadCheck(int subId, String callingPackage,
    private <T> T callPhoneMethodForSubIdWithReadCheck(int subId, String callingPackage,
            String message, CallPhoneMethodHelper<T> callMethodHelper) {
            @Nullable String callingFeatureId, String message,
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper,
            CallPhoneMethodHelper<T> callMethodHelper) {
                (aContext, aSubId, aCallingPackage, aMessage)->
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId,
                message, callMethodHelper,
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)->
                        TelephonyPermissions.checkCallingOrSelfReadPhoneState(
                        TelephonyPermissions.checkCallingOrSelfReadPhoneState(
                                aContext, aSubId, aCallingPackage, aMessage));
                                aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage));
    }
    }


    private <T> T callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(int subId,
    private <T> T callPhoneMethodForSubIdWithReadDeviceIdentifiersCheck(int subId,
            String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) {
            String callingPackage, @Nullable String callingFeatureId, String message,
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper,
            CallPhoneMethodHelper<T> callMethodHelper) {
                (aContext, aSubId, aCallingPackage, aMessage)->
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId,
                message, callMethodHelper,
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)->
                        TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(
                        TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(
                                aContext, aSubId, aCallingPackage, aMessage));
                                aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage));
    }
    }


    private <T> T callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(int subId,
    private <T> T callPhoneMethodForSubIdWithReadSubscriberIdentifiersCheck(int subId,
            String callingPackage, String message, CallPhoneMethodHelper<T> callMethodHelper) {
            String callingPackage, @Nullable String callingFeatureId, String message,
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper,
            CallPhoneMethodHelper<T> callMethodHelper) {
                (aContext, aSubId, aCallingPackage, aMessage)->
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId,
                message, callMethodHelper,
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)->
                        TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers(
                        TelephonyPermissions.checkCallingOrSelfReadSubscriberIdentifiers(
                                aContext, aSubId, aCallingPackage, aMessage));
                                aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage));
    }
    }


    private <T> T callPhoneMethodForSubIdWithPrivilegedCheck(
    private <T> T callPhoneMethodForSubIdWithPrivilegedCheck(
            int subId, String message, CallPhoneMethodHelper<T> callMethodHelper) {
            int subId, String message, CallPhoneMethodHelper<T> callMethodHelper) {
        return callPhoneMethodWithPermissionCheck(subId, null, message, callMethodHelper,
        return callPhoneMethodWithPermissionCheck(subId, null, null, message, callMethodHelper,
                (aContext, aSubId, aCallingPackage, aMessage)-> {
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) -> {
                    mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message);
                    mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message);
                    return true;
                    return true;
                });
                });
@@ -441,23 +485,26 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {


    private <T> T callPhoneMethodForSubIdWithModifyCheck(int subId, String callingPackage,
    private <T> T callPhoneMethodForSubIdWithModifyCheck(int subId, String callingPackage,
            String message, CallPhoneMethodHelper<T> callMethodHelper) {
            String message, CallPhoneMethodHelper<T> callMethodHelper) {
        return callPhoneMethodWithPermissionCheck(subId, null, message, callMethodHelper,
        return callPhoneMethodWithPermissionCheck(subId, null, null, message, callMethodHelper,
                (aContext, aSubId, aCallingPackage, aMessage)-> {
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage)-> {
                    enforceModifyPermission();
                    enforceModifyPermission();
                    return true;
                    return true;
                });
                });
    }
    }


    private <T> T callPhoneMethodForSubIdWithReadPhoneNumberCheck(int subId, String callingPackage,
    private <T> T callPhoneMethodForSubIdWithReadPhoneNumberCheck(int subId, String callingPackage,
            String message, CallPhoneMethodHelper<T> callMethodHelper) {
            @NonNull String callingFeatureId, String message,
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, message, callMethodHelper,
            CallPhoneMethodHelper<T> callMethodHelper) {
                (aContext, aSubId, aCallingPackage, aMessage)->
        return callPhoneMethodWithPermissionCheck(subId, callingPackage, callingFeatureId,
                message, callMethodHelper,
                (aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage) ->
                        TelephonyPermissions.checkCallingOrSelfReadPhoneNumber(
                        TelephonyPermissions.checkCallingOrSelfReadPhoneNumber(
                                aContext, aSubId, aCallingPackage, aMessage));
                                aContext, aSubId, aCallingPackage, aCallingFeatureId, aMessage));
    }
    }


    private <T> T callPhoneMethodForPhoneIdWithReadDeviceIdentifiersCheck(int phoneId,
    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.
        // Getting subId before doing permission check.
        if (!SubscriptionManager.isValidPhoneId(phoneId)) {
        if (!SubscriptionManager.isValidPhoneId(phoneId)) {
            phoneId = 0;
            phoneId = 0;
@@ -467,7 +514,7 @@ public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
            return null;
            return null;
        }
        }
        if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext,
        if (!TelephonyPermissions.checkCallingOrSelfReadDeviceIdentifiers(mContext,
                phone.getSubId(), callingPackage, message)) {
                phone.getSubId(), callingPackage, callingFeatureId, message)) {
            return null;
            return null;
        }
        }


+4 −2
Original line number Original line Diff line number Diff line
@@ -4094,7 +4094,8 @@ public class ServiceStateTracker extends Handler {
        Context context = mPhone.getContext();
        Context context = mPhone.getContext();


        SubscriptionInfo info = mSubscriptionController
        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 subscription is part of a group and non-primary, suppress all notifications
        if (info == null || (info.isOpportunistic() && info.getGroupUuid() != null)) {
        if (info == null || (info.isOpportunistic() && info.getGroupUuid() != null)) {
@@ -4906,7 +4907,8 @@ public class ServiceStateTracker extends Handler {
        if (!isStale) return false;
        if (!isStale) return false;


        List<SubscriptionInfo> subInfoList = SubscriptionController.getInstance()
        List<SubscriptionInfo> subInfoList = SubscriptionController.getInstance()
                .getActiveSubscriptionInfoList(mPhone.getContext().getOpPackageName());
                .getActiveSubscriptionInfoList(mPhone.getContext().getOpPackageName(),
                        mPhone.getContext().getFeatureId());
        for (SubscriptionInfo info : subInfoList) {
        for (SubscriptionInfo info : subInfoList) {
            // If we have an active opportunistic subscription whose data is IN_SERVICE, we needs
            // 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
            // to get signal strength to decide data switching threshold. In this case, we poll
+3 −3
Original line number Original line Diff line number Diff line
@@ -512,10 +512,10 @@ public class SmsController extends ISmsImplBase {
    }
    }


    @Override
    @Override
    public int checkSmsShortCodeDestination(
    public int checkSmsShortCodeDestination(int subId, String callingPackage,
            int subId, String callingPackage, String destAddress, String countryIso) {
            String callingFeatureId, String destAddress, String countryIso) {
        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(getPhone(subId).getContext(),
        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(getPhone(subId).getContext(),
                subId, callingPackage, "checkSmsShortCodeDestination")) {
                subId, callingPackage, callingFeatureId, "checkSmsShortCodeDestination")) {
            return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE;
            return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE;
        }
        }
        final long identity = Binder.clearCallingIdentity();
        final long identity = Binder.clearCallingIdentity();
Loading