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

Commit 66fa0a9e authored by rambowang's avatar rambowang
Browse files

Update UiccProfile with new CarrierConfigManager APIs

- Replace carrier config change broadcast receiver with listener
- Get subset of carrier config as needed to save memory

Bug: 263267340
Test: atest UiccProfileTest
Change-Id: I91f97dfb5363133d2928d1f6709bb8a754c4c733
parent 8e30609a
Loading
Loading
Loading
Loading
+52 −14
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT
import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT__EVENT__PIN_VERIFICATION_FAILURE;
import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT__EVENT__PIN_VERIFICATION_FAILURE;
import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT__EVENT__PIN_VERIFICATION_SUCCESS;
import static com.android.internal.telephony.TelephonyStatsLog.PIN_STORAGE_EVENT__EVENT__PIN_VERIFICATION_SUCCESS;


import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManager;
@@ -125,6 +126,8 @@ public class UiccProfile extends IccCard {
    private final int mPhoneId;
    private final int mPhoneId;
    private final PinStorage mPinStorage;
    private final PinStorage mPinStorage;


    private final CarrierConfigManager mCarrierConfigManager;

    private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 1;
    private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 1;
    private static final int EVENT_ICC_LOCKED = 2;
    private static final int EVENT_ICC_LOCKED = 2;
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -185,11 +188,16 @@ public class UiccProfile extends IccCard {
    };
    };
    private boolean mUserUnlockReceiverRegistered;
    private boolean mUserUnlockReceiverRegistered;


    private final BroadcastReceiver mCarrierConfigChangedReceiver = new BroadcastReceiver() {
    private final CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener =
            new CarrierConfigManager.CarrierConfigChangeListener() {
                @Override
                @Override
        public void onReceive(Context context, Intent intent) {
                public void onCarrierConfigChanged(int logicalSlotIndex, int subscriptionId,
            if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
                        int carrierId, int specificCarrierId) {
                mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARRIER_CONFIG_CHANGED));
                    if (logicalSlotIndex == mPhoneId) {
                        log("onCarrierConfigChanged: slotIndex=" + logicalSlotIndex
                                + ", subId=" + subscriptionId + ", carrierId=" + carrierId);
                        handleCarrierNameOverride();
                        handleSimCountryIsoOverride();
                    }
                    }
                }
                }
            };
            };
@@ -341,9 +349,10 @@ public class UiccProfile extends IccCard {
        ci.registerForOffOrNotAvailable(mHandler, EVENT_RADIO_OFF_OR_UNAVAILABLE, null);
        ci.registerForOffOrNotAvailable(mHandler, EVENT_RADIO_OFF_OR_UNAVAILABLE, null);
        resetProperties();
        resetProperties();


        IntentFilter intentfilter = new IntentFilter();
        mCarrierConfigManager = c.getSystemService(CarrierConfigManager.class);
        intentfilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        // Listener callback directly handles config change and thus runs on handler thread
        c.registerReceiver(mCarrierConfigChangedReceiver, intentfilter);
        mCarrierConfigManager.registerCarrierConfigChangeListener(mHandler::post,
                mCarrierConfigChangeListener);
    }
    }


    /**
    /**
@@ -376,7 +385,11 @@ public class UiccProfile extends IccCard {
            InstallCarrierAppUtils.unregisterPackageInstallReceiver(mContext);
            InstallCarrierAppUtils.unregisterPackageInstallReceiver(mContext);


            mCi.unregisterForOffOrNotAvailable(mHandler);
            mCi.unregisterForOffOrNotAvailable(mHandler);
            mContext.unregisterReceiver(mCarrierConfigChangedReceiver);

            if (mCarrierConfigManager != null && mCarrierConfigChangeListener != null) {
                mCarrierConfigManager.unregisterCarrierConfigChangeListener(
                        mCarrierConfigChangeListener);
            }


            if (mCatService != null) mCatService.dispose();
            if (mCatService != null) mCatService.dispose();
            for (UiccCardApplication app : mUiccApplications) {
            for (UiccCardApplication app : mUiccApplications) {
@@ -448,7 +461,15 @@ public class UiccProfile extends IccCard {
            return;
            return;
        }
        }


        PersistableBundle config = configLoader.getConfigForSubId(subId);
        PersistableBundle config =
                getCarrierConfigSubset(
                        subId,
                        CarrierConfigManager.KEY_CARRIER_NAME_OVERRIDE_BOOL,
                        CarrierConfigManager.KEY_CARRIER_NAME_STRING);
        if (config.isEmpty()) {
            loge("handleCarrierNameOverride: fail to get carrier configs.");
            return;
        }
        boolean preferCcName = config.getBoolean(
        boolean preferCcName = config.getBoolean(
                CarrierConfigManager.KEY_CARRIER_NAME_OVERRIDE_BOOL, false);
                CarrierConfigManager.KEY_CARRIER_NAME_OVERRIDE_BOOL, false);
        String ccName = config.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
        String ccName = config.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
@@ -512,7 +533,13 @@ public class UiccProfile extends IccCard {
            return;
            return;
        }
        }


        PersistableBundle config = configLoader.getConfigForSubId(subId);
        PersistableBundle config =
                getCarrierConfigSubset(
                        subId, CarrierConfigManager.KEY_SIM_COUNTRY_ISO_OVERRIDE_STRING);
        if (config.isEmpty()) {
            loge("handleSimCountryIsoOverride: fail to get carrier configs.");
            return;
        }
        String iso = config.getString(CarrierConfigManager.KEY_SIM_COUNTRY_ISO_OVERRIDE_STRING);
        String iso = config.getString(CarrierConfigManager.KEY_SIM_COUNTRY_ISO_OVERRIDE_STRING);
        if (!TextUtils.isEmpty(iso)
        if (!TextUtils.isEmpty(iso)
                && !iso.equals(TelephonyManager.getSimCountryIsoForPhone(mPhoneId))) {
                && !iso.equals(TelephonyManager.getSimCountryIsoForPhone(mPhoneId))) {
@@ -1790,6 +1817,17 @@ public class UiccProfile extends IccCard {
        return null;
        return null;
    }
    }


    @NonNull
    private PersistableBundle getCarrierConfigSubset(int subId, String... keys) {
        PersistableBundle bundle = new PersistableBundle();
        try {
            bundle = mCarrierConfigManager.getConfigForSubId(subId, keys);
        } catch (RuntimeException e) {
            loge("CarrierConfigLoader is not available.");
        }
        return bundle;
    }

    private static String eventToString(int event) {
    private static String eventToString(int event) {
        switch (event) {
        switch (event) {
            case EVENT_RADIO_OFF_OR_UNAVAILABLE: return "RADIO_OFF_OR_UNAVAILABLE";
            case EVENT_RADIO_OFF_OR_UNAVAILABLE: return "RADIO_OFF_OR_UNAVAILABLE";
+18 −3
Original line number Original line Diff line number Diff line
@@ -32,8 +32,8 @@ import static org.mockito.Mockito.isA;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;


import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
@@ -41,6 +41,7 @@ import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;


@@ -70,6 +71,8 @@ public class UiccProfileTest extends TelephonyTest {
    }
    }


    private IccIoResult mIccIoResult;
    private IccIoResult mIccIoResult;
    private PersistableBundle mBundle;
    private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;


    private static final int UICCPROFILE_CARRIER_PRIVILEGE_LOADED_EVENT = 3;
    private static final int UICCPROFILE_CARRIER_PRIVILEGE_LOADED_EVENT = 3;


@@ -118,8 +121,18 @@ public class UiccProfileTest extends TelephonyTest {
                        mIccCardStatus.mGsmUmtsSubscriptionAppIndex = -1;
                        mIccCardStatus.mGsmUmtsSubscriptionAppIndex = -1;
        mIccIoResult = new IccIoResult(0x90, 0x00, IccUtils.hexStringToBytes("FF40"));
        mIccIoResult = new IccIoResult(0x90, 0x00, IccUtils.hexStringToBytes("FF40"));
        mSimulatedCommands.setIccIoResultForApduLogicalChannel(mIccIoResult);
        mSimulatedCommands.setIccIoResultForApduLogicalChannel(mIccIoResult);
        mBundle = mContextFixture.getCarrierConfigBundle();
        when(mCarrierConfigManager.getConfigForSubId(anyInt(), any())).thenReturn(mBundle);

        // Capture CarrierConfigChangeListener to emulate the carrier config change notification
        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
        mUiccProfile = new UiccProfile(mContext, mSimulatedCommands, mIccCardStatus,
        mUiccProfile = new UiccProfile(mContext, mSimulatedCommands, mIccCardStatus,
              0 /* phoneId */, mUiccCard, new Object());
              0 /* phoneId */, mUiccCard, new Object());
        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
                listenerArgumentCaptor.capture());
        mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(0);

        processAllMessages();
        processAllMessages();
        logd("Create UiccProfile");
        logd("Create UiccProfile");


@@ -130,6 +143,7 @@ public class UiccProfileTest extends TelephonyTest {
    public void tearDown() throws Exception {
    public void tearDown() throws Exception {
        mUiccProfile = null;
        mUiccProfile = null;
        mIccIoResult = null;
        mIccIoResult = null;
        mBundle = null;
        super.tearDown();
        super.tearDown();
    }
    }


@@ -535,8 +549,9 @@ public class UiccProfileTest extends TelephonyTest {
        carrierConfigBundle.putString(CarrierConfigManager.KEY_CARRIER_NAME_STRING,
        carrierConfigBundle.putString(CarrierConfigManager.KEY_CARRIER_NAME_STRING,
                fakeCarrierName);
                fakeCarrierName);


        // broadcast CARRIER_CONFIG_CHANGED
        // send carrier config change
        mContext.sendBroadcast(new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
        mCarrierConfigChangeListener.onCarrierConfigChanged(mPhone.getPhoneId(), mPhone.getSubId(),
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);
        processAllMessages();
        processAllMessages();


        // verify that setSimOperatorNameForPhone() is called with fakeCarrierName
        // verify that setSimOperatorNameForPhone() is called with fakeCarrierName