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

Commit d58fa9e0 authored by rambowang's avatar rambowang
Browse files

Improve CarrierPrivilegesTracker with new CarrierConfigManager APIs

This CL improve the performance of CarrierPrivilegsTracker with the
new introduced CarrierConfigManager API:
- Replace carrier config change broadcast receiver with listener
  which has much low lagency
- Retrieve subset of carrier config to reduce memory consumption

Bug: 244087782
Test: atest CarrierPrivilegesTrackerTest
Change-Id: I1d3a49a0d669fed4c6db08364c9e1c9f7f5f1eb8
parent 3a3263b1
Loading
Loading
Loading
Loading
+19 −31
Original line number Diff line number Diff line
@@ -16,11 +16,8 @@

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.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_NO_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
@@ -129,6 +126,13 @@ public class CarrierPrivilegesTracker extends Handler {
                    | PackageManager.MATCH_DISABLED_UNTIL_USED_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.
     * obj: Registrant that will be notified of Carrier Privileged UID changes.
@@ -141,13 +145,6 @@ public class CarrierPrivilegesTracker extends Handler {
     */
    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.
     * arg1: slotId that this Action applies to
@@ -297,19 +294,6 @@ public class CarrierPrivilegesTracker extends Handler {
                    if (action == null) return;

                    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_APPLICATION_STATE_CHANGED: {
                            Bundle extras = intent.getExtras();
@@ -372,13 +356,16 @@ public class CarrierPrivilegesTracker extends Handler {
        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        mCarrierConfigManager =
                (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);
        mTelephonyRegistryManager =
                (TelephonyRegistryManager)
                        mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);

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

    @NonNull
    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)) {
            return Collections.EMPTY_LIST;
        }
+22 −19
Original line number Diff line number Diff line
@@ -17,8 +17,6 @@
package com.android.internal.telephony;

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_CONFIG_APPLIED_BOOL;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -76,8 +74,8 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;

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

    @Mock private Signature mSignature;

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

    @Before
    public void setUp() throws Exception {
@@ -164,7 +161,8 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
    private void setupCarrierConfigRules(String... rules) {
        mCarrierConfigs.putStringArray(KEY_CARRIER_CERTIFICATE_STRING_ARRAY, rules);
        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) {
@@ -222,8 +220,14 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
     * #setupInstalledPackages}.
     */
    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 =
                new CarrierPrivilegesTracker(mTestableLooper.getLooper(), mPhone, mContext);
        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
                listenerArgumentCaptor.capture());
        mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(0);
        mTestableLooper.processAllMessages();

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

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

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

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

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

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

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

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

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

        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();

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

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

        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_2), PACKAGE_1, PACKAGE_2));

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

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

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

    private void sendSimCardStateChangedIntent(int phoneId, int simState) {