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

Commit 7c0e97dd authored by Rambo Wang's avatar Rambo Wang Committed by Gerrit Code Review
Browse files

Merge "Improve CarrierPrivilegesTracker with new CarrierConfigManager APIs" into main

parents 2888fc7c 83c08349
Loading
Loading
Loading
Loading
+19 −31
Original line number Original line Diff line number Diff line
@@ -16,11 +16,8 @@


package com.android.internal.telephony;
package com.android.internal.telephony;


import static android.telephony.CarrierConfigManager.EXTRA_SLOT_INDEX;
import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CERTIFICATE_STRING_ARRAY;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CERTIFICATE_STRING_ARRAY;
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
@@ -130,6 +127,13 @@ public class CarrierPrivilegesTracker extends Handler {
                    | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
                    | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
                    | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
                    | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;


    /**
     * All carrier config keys used in this class should list here in alphabetical order.
     */
    private static final String[] CARRIER_CONFIG_KEYS = {
            KEY_CARRIER_CERTIFICATE_STRING_ARRAY,
    };

    /**
    /**
     * Action to register a Registrant with this Tracker.
     * Action to register a Registrant with this Tracker.
     * obj: Registrant that will be notified of Carrier Privileged UID changes.
     * obj: Registrant that will be notified of Carrier Privileged UID changes.
@@ -142,13 +146,6 @@ public class CarrierPrivilegesTracker extends Handler {
     */
     */
    private static final int ACTION_UNREGISTER_LISTENER = 2;
    private static final int ACTION_UNREGISTER_LISTENER = 2;


    /**
     * Action for tracking when Carrier Configs are updated.
     * arg1: Subscription Id for the Carrier Configs update being broadcast
     * arg2: Slot Index for the Carrier Configs update being broadcast
     */
    private static final int ACTION_CARRIER_CONFIG_CERTS_UPDATED = 3;

    /**
    /**
     * Action for tracking when the Phone's SIM state changes.
     * Action for tracking when the Phone's SIM state changes.
     * arg1: slotId that this Action applies to
     * arg1: slotId that this Action applies to
@@ -298,19 +295,6 @@ public class CarrierPrivilegesTracker extends Handler {
                    if (action == null) return;
                    if (action == null) return;


                    switch (action) {
                    switch (action) {
                        case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: {
                            Bundle extras = intent.getExtras();
                            int slotIndex = extras.getInt(EXTRA_SLOT_INDEX);
                            int subId =
                                    extras.getInt(
                                            EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID);
                            sendMessage(
                                    obtainMessage(
                                            ACTION_CARRIER_CONFIG_CERTS_UPDATED,
                                            subId,
                                            slotIndex));
                            break;
                        }
                        case TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED: // fall through
                        case TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED: // fall through
                        case TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED: {
                        case TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED: {
                            Bundle extras = intent.getExtras();
                            Bundle extras = intent.getExtras();
@@ -373,13 +357,16 @@ public class CarrierPrivilegesTracker extends Handler {
        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        mCarrierConfigManager =
        mCarrierConfigManager =
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        // Callback is executed in handler thread and directly handles carrier config update
        mCarrierConfigManager.registerCarrierConfigChangeListener(this::post,
                (slotIndex, subId, carrierId, specificCarrierId) -> handleCarrierConfigUpdated(
                        subId, slotIndex));
        mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        mTelephonyRegistryManager =
        mTelephonyRegistryManager =
                (TelephonyRegistryManager)
                (TelephonyRegistryManager)
                        mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);
                        mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);


        IntentFilter certFilter = new IntentFilter();
        IntentFilter certFilter = new IntentFilter();
        certFilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        certFilter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED);
        certFilter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED);
        certFilter.addAction(TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED);
        certFilter.addAction(TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED);
        mContext.registerReceiver(mIntentReceiver, certFilter);
        mContext.registerReceiver(mIntentReceiver, certFilter);
@@ -409,12 +396,6 @@ public class CarrierPrivilegesTracker extends Handler {
                handleUnregisterListener((Handler) msg.obj);
                handleUnregisterListener((Handler) msg.obj);
                break;
                break;
            }
            }
            case ACTION_CARRIER_CONFIG_CERTS_UPDATED: {
                int subId = msg.arg1;
                int slotIndex = msg.arg2;
                handleCarrierConfigUpdated(subId, slotIndex);
                break;
            }
            case ACTION_SIM_STATE_UPDATED: {
            case ACTION_SIM_STATE_UPDATED: {
                handleSimStateChanged(msg.arg1, msg.arg2);
                handleSimStateChanged(msg.arg1, msg.arg2);
                break;
                break;
@@ -491,7 +472,14 @@ public class CarrierPrivilegesTracker extends Handler {


    @NonNull
    @NonNull
    private List<UiccAccessRule> getCarrierConfigRules(int subId) {
    private List<UiccAccessRule> getCarrierConfigRules(int subId) {
        PersistableBundle carrierConfigs = mCarrierConfigManager.getConfigForSubId(subId);
        PersistableBundle carrierConfigs = null;
        try {
            carrierConfigs = mCarrierConfigManager.getConfigForSubId(subId, CARRIER_CONFIG_KEYS);
        } catch (RuntimeException e) {
            mLocalLog.log("CarrierConfigLoader is not available, try it later.");
        }

        // CarrierConfigManager#isConfigForIdentifiedCarrier can handle null or empty bundle
        if (!mCarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfigs)) {
        if (!mCarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfigs)) {
            return Collections.EMPTY_LIST;
            return Collections.EMPTY_LIST;
        }
        }
+22 −19
Original line number Original line Diff line number Diff line
@@ -17,8 +17,6 @@
package com.android.internal.telephony;
package com.android.internal.telephony;


import static android.os.UserHandle.SYSTEM;
import static android.os.UserHandle.SYSTEM;
import static android.telephony.CarrierConfigManager.EXTRA_SLOT_INDEX;
import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CERTIFICATE_STRING_ARRAY;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CERTIFICATE_STRING_ARRAY;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -76,8 +74,8 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.InOrder;
import org.mockito.Mock;


import java.security.MessageDigest;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.ArrayList;
@@ -129,11 +127,10 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
                    | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
                    | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
                    | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
                    | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;


    @Mock private Signature mSignature;

    private PersistableBundle mCarrierConfigs;
    private PersistableBundle mCarrierConfigs;
    private CarrierPrivilegesTrackerTestHandler mHandler;
    private CarrierPrivilegesTrackerTestHandler mHandler;
    private CarrierPrivilegesTracker mCarrierPrivilegesTracker;
    private CarrierPrivilegesTracker mCarrierPrivilegesTracker;
    private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
@@ -164,7 +161,8 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
    private void setupCarrierConfigRules(String... rules) {
    private void setupCarrierConfigRules(String... rules) {
        mCarrierConfigs.putStringArray(KEY_CARRIER_CERTIFICATE_STRING_ARRAY, rules);
        mCarrierConfigs.putStringArray(KEY_CARRIER_CERTIFICATE_STRING_ARRAY, rules);
        mCarrierConfigs.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
        mCarrierConfigs.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
        when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfigs);
        when(mCarrierConfigManager.getConfigForSubId(eq(SUB_ID), any()))
                .thenReturn(mCarrierConfigs);
    }
    }


    private static String carrierConfigRuleString(String certificateHash, String... packageNames) {
    private static String carrierConfigRuleString(String certificateHash, String... packageNames) {
@@ -222,8 +220,14 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
     * #setupInstalledPackages}.
     * #setupInstalledPackages}.
     */
     */
    private CarrierPrivilegesTracker createCarrierPrivilegesTracker() throws Exception {
    private CarrierPrivilegesTracker createCarrierPrivilegesTracker() throws Exception {
        // Capture CarrierConfigChangeListener to emulate the carrier config change notification
        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
        CarrierPrivilegesTracker cpt =
        CarrierPrivilegesTracker cpt =
                new CarrierPrivilegesTracker(mTestableLooper.getLooper(), mPhone, mContext);
                new CarrierPrivilegesTracker(mTestableLooper.getLooper(), mPhone, mContext);
        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
                listenerArgumentCaptor.capture());
        mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(0);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        cpt.registerCarrierPrivilegesListener(mHandler, REGISTRANT_WHAT, null);
        cpt.registerCarrierPrivilegesListener(mHandler, REGISTRANT_WHAT, null);
@@ -371,7 +375,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        verifyCarrierPrivilegesChangedUpdates(List.of());
        verifyCarrierPrivilegesChangedUpdates(List.of());


        // Clear UIDs
        // Clear UIDs
        sendCarrierConfigChangedIntent(INVALID_SUBSCRIPTION_ID, PHONE_ID);
        sendCarrierConfigChanged(INVALID_SUBSCRIPTION_ID, PHONE_ID);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(Set.of(), new int[0]);
        verifyCurrentState(Set.of(), new int[0]);
@@ -389,7 +393,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        setupCarrierConfigRules(
        setupCarrierConfigRules(
                carrierConfigRuleString(getHash(CERT_1)), carrierConfigRuleString(getHash(CERT_2)));
                carrierConfigRuleString(getHash(CERT_1)), carrierConfigRuleString(getHash(CERT_2)));


        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        sendCarrierConfigChanged(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS);
        verifyCurrentState(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS);
@@ -403,7 +407,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        // Start with privileges. Incorrect phoneId shouldn't affect certs
        // Start with privileges. Incorrect phoneId shouldn't affect certs
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();


        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID_INCORRECT);
        sendCarrierConfigChanged(SUB_ID, PHONE_ID_INCORRECT);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS);
        verifyCurrentState(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS);
@@ -417,7 +421,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        // Start with privileges, verify clearing certs clears UIDs
        // Start with privileges, verify clearing certs clears UIDs
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();


        sendCarrierConfigChangedIntent(INVALID_SUBSCRIPTION_ID, PHONE_ID);
        sendCarrierConfigChanged(INVALID_SUBSCRIPTION_ID, PHONE_ID);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(Set.of(), new int[0]);
        verifyCurrentState(Set.of(), new int[0]);
@@ -434,9 +438,10 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();


        mCarrierConfigs.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
        mCarrierConfigs.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
        when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfigs);
        when(mCarrierConfigManager.getConfigForSubId(eq(SUB_ID), any()))
                .thenReturn(mCarrierConfigs);


        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        sendCarrierConfigChanged(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(Set.of(), new int[0]);
        verifyCurrentState(Set.of(), new int[0]);
@@ -456,7 +461,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
                carrierConfigRuleString(getHash(CERT_1), PACKAGE_1),
                carrierConfigRuleString(getHash(CERT_1), PACKAGE_1),
                carrierConfigRuleString(getHash(CERT_2), PACKAGE_1));
                carrierConfigRuleString(getHash(CERT_2), PACKAGE_1));


        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        sendCarrierConfigChanged(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(Set.of(PACKAGE_1), new int[] {UID_1});
        verifyCurrentState(Set.of(PACKAGE_1), new int[] {UID_1});
@@ -469,7 +474,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
                carrierConfigRuleString(getHash(CERT_1), PACKAGE_1),
                carrierConfigRuleString(getHash(CERT_1), PACKAGE_1),
                carrierConfigRuleString(getHash(CERT_2), PACKAGE_1, PACKAGE_2));
                carrierConfigRuleString(getHash(CERT_2), PACKAGE_1, PACKAGE_2));


        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        sendCarrierConfigChanged(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();
        mTestableLooper.processAllMessages();


        verifyCurrentState(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS);
        verifyCurrentState(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS);
@@ -1137,11 +1142,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        verify(mPackageManager).queryIntentServices(any(), anyInt());
        verify(mPackageManager).queryIntentServices(any(), anyInt());
    }
    }


    private void sendCarrierConfigChangedIntent(int subId, int phoneId) {
    private void sendCarrierConfigChanged(int subId, int phoneId) {
        mContext.sendBroadcast(
        mCarrierConfigChangeListener.onCarrierConfigChanged(phoneId, subId,
                new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);
                        .putExtra(EXTRA_SUBSCRIPTION_INDEX, subId)
                        .putExtra(EXTRA_SLOT_INDEX, phoneId));
    }
    }


    private void sendSimCardStateChangedIntent(int phoneId, int simState) {
    private void sendSimCardStateChangedIntent(int phoneId, int simState) {