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

Commit fb108dc9 authored by rambowang's avatar rambowang
Browse files

Update ServiceStateTracker with new CarrierConfigManager APIs

Replace carrier config change broadcast receiver with listener
which has better performance.

Due to a large list of carrir configs are used and the list
may change in the near future, this CL doesn't replace
getConfigForForSub with subset retrieval one.

Bug: 263267340
Test: atest ServiceStateTrackerTest DisplayInfoControllerTest
Change-Id: I852ccc7e6e0cd8c6c96087ca4667be8956ea54b7
parent 88f6ed6b
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -279,7 +279,6 @@ public class ServiceStateTracker extends Handler {
    protected static final int EVENT_RADIO_POWER_OFF_DONE              = 54;
    protected static final int EVENT_PHYSICAL_CHANNEL_CONFIG           = 55;
    protected static final int EVENT_CELL_LOCATION_RESPONSE            = 56;
    protected static final int EVENT_CARRIER_CONFIG_CHANGED            = 57;
    private static final int EVENT_POLL_STATE_REQUEST                  = 58;
    // Timeout event used when delaying radio power off to wait for IMS deregistration to happen.
    private static final int EVENT_POWER_OFF_RADIO_IMS_DEREG_TIMEOUT   = 62;
@@ -557,13 +556,7 @@ public class ServiceStateTracker extends Handler {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
                int phoneId = intent.getExtras().getInt(CarrierConfigManager.EXTRA_SLOT_INDEX);
                // Ignore the carrier config changed if the phoneId is not matched.
                if (phoneId == mPhone.getPhoneId()) {
                    sendEmptyMessage(EVENT_CARRIER_CONFIG_CHANGED);
                }
            } else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) {
            if (action.equals(Intent.ACTION_LOCALE_CHANGED)) {
                // Update emergency string or operator name, polling service state.
                pollState();
            } else if (action.equals(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED)) {
@@ -576,6 +569,10 @@ public class ServiceStateTracker extends Handler {
        }
    };

    private final CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener =
            (slotIndex, subId, carrierId, specificCarrierId) ->
                    onCarrierConfigurationChanged(slotIndex);

    //CDMA
    // Min values used to by getOtasp()
    public static final String UNACTIVATED_MIN2_VALUE = "000000";
@@ -662,7 +659,11 @@ public class ServiceStateTracker extends Handler {
        mSubscriptionManager.addOnSubscriptionsChangedListener(
                new android.os.HandlerExecutor(this), mOnSubscriptionsChangedListener);
        mRestrictedState = new RestrictedState();

        mCarrierConfig = getCarrierConfig();
        CarrierConfigManager ccm = mPhone.getContext().getSystemService(CarrierConfigManager.class);
        // Callback which directly handle config change should be executed in handler thread
        ccm.registerCarrierConfigChangeListener(this::post, mCarrierConfigChangeListener);

        mAccessNetworksManager = mPhone.getAccessNetworksManager();
        mOutOfServiceSS = new ServiceState();
@@ -701,7 +702,6 @@ public class ServiceStateTracker extends Handler {
        Context context = mPhone.getContext();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_LOCALE_CHANGED);
        filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        filter.addAction(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED);
        context.registerReceiver(mIntentReceiver, filter);

@@ -862,6 +862,10 @@ public class ServiceStateTracker extends Handler {
        mPhone.getCarrierActionAgent().unregisterForCarrierAction(this,
                CARRIER_ACTION_SET_RADIO_ENABLED);
        mPhone.getContext().unregisterReceiver(mIntentReceiver);
        CarrierConfigManager ccm = mPhone.getContext().getSystemService(CarrierConfigManager.class);
        if (ccm != null && mCarrierConfigChangeListener != null) {
            ccm.unregisterCarrierConfigChangeListener(mCarrierConfigChangeListener);
        }
        if (mCSST != null) {
            mCSST.dispose();
            mCSST = null;
@@ -1730,10 +1734,6 @@ public class ServiceStateTracker extends Handler {
                rspRspMsg.sendToTarget();
                break;

            case EVENT_CARRIER_CONFIG_CHANGED:
                onCarrierConfigChanged();
                break;

            case EVENT_POLL_STATE_REQUEST:
                pollStateInternal(false);
                break;
@@ -5055,7 +5055,9 @@ public class ServiceStateTracker extends Handler {
        }
    }

    private void onCarrierConfigChanged() {
    private void onCarrierConfigurationChanged(int slotIndex) {
        if (slotIndex != mPhone.getPhoneId()) return;

        mCarrierConfig = getCarrierConfig();
        log("CarrierConfigChange " + mCarrierConfig);

+20 −18
Original line number Diff line number Diff line
@@ -18,13 +18,12 @@ package com.android.internal.telephony;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncResult;
import android.os.HandlerThread;
import android.os.PersistableBundle;
@@ -36,6 +35,7 @@ import android.telephony.CellIdentityLte;
import android.telephony.LteVopsSupportInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.testing.AndroidTestingRunner;
@@ -46,7 +46,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.ArgumentCaptor;

import java.util.Collections;
import java.util.concurrent.Executor;
@@ -66,6 +66,7 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    private ServiceStateTrackerTestHandler mSstHandler;
    private SignalStrengthController mSsc;
    private PersistableBundle mBundle;
    private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;

    private class ServiceStateTrackerTestHandler extends HandlerThread {
        private ServiceStateTrackerTestHandler(String name) {
@@ -80,7 +81,16 @@ public class DisplayInfoControllerTest extends TelephonyTest {
            doReturn(NUMERIC).when(mTelephonyManager).getSimOperatorNumericForPhone(eq(PHONE_ID));
            doReturn(NETWORK).when(mTelephonyManager).getSimOperatorNameForPhone(eq(PHONE_ID));

            // Capture listener registered for ServiceStateTracker to emulate the carrier config
            // change notification used later. In this test, it's the second one. The first one
            // comes from RatRatcheter.
            ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener>
                    listenerArgumentCaptor = ArgumentCaptor.forClass(
                    CarrierConfigManager.CarrierConfigChangeListener.class);
            mSst = new ServiceStateTracker(mPhone, mSimulatedCommands);
            verify(mCarrierConfigManager, atLeast(2)).registerCarrierConfigChangeListener(any(),
                    listenerArgumentCaptor.capture());
            mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(1);
            doReturn(mSst).when(mPhone).getServiceStateTracker();
            setReady(true);
        }
@@ -92,6 +102,7 @@ public class DisplayInfoControllerTest extends TelephonyTest {
        super.setUp(getClass().getSimpleName());

        doReturn((Executor) Runnable::run).when(mContext).getMainExecutor();
        mBundle = mContextFixture.getCarrierConfigBundle();
        mSstHandler = new ServiceStateTrackerTestHandler(getClass().getSimpleName());
        mSstHandler.start();
        waitUntilReady();
@@ -106,18 +117,14 @@ public class DisplayInfoControllerTest extends TelephonyTest {
        mSstHandler.join();
        mSstHandler = null;
        mBundle = null;
        mCarrierConfigChangeListener = null;
        super.tearDown();
    }

    private void sendCarrierConfigUpdate() {
        CarrierConfigManager mockConfigManager = Mockito.mock(CarrierConfigManager.class);
        when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
                .thenReturn(mockConfigManager);
        when(mockConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);

        Intent intent = new Intent().setAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, PHONE_ID);
        mContext.sendBroadcast(intent);
        mCarrierConfigChangeListener.onCarrierConfigChanged(PHONE_ID,
                SubscriptionManager.INVALID_SUBSCRIPTION_ID, TelephonyManager.UNKNOWN_CARRIER_ID,
                TelephonyManager.UNKNOWN_CARRIER_ID);
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
    }

@@ -174,7 +181,6 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    public void testIsRoamingOverride_NonRoamingOperator() {
        doReturn(true).when(mPhone).isPhoneTypeGsm();

        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putStringArray(
                CarrierConfigManager.KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, new String[] {NUMERIC});
        sendCarrierConfigUpdate();
@@ -196,7 +202,6 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    public void testIsRoamingOverride_ForceHomeNetwork() {
        doReturn(true).when(mPhone).isPhoneTypeGsm();

        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putBoolean(CarrierConfigManager.KEY_FORCE_HOME_NETWORK_BOOL, true);
        sendCarrierConfigUpdate();

@@ -217,7 +222,6 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    public void testIsRoamingOverride_RoamingOperator() {
        doReturn(true).when(mPhone).isPhoneTypeGsm();

        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putStringArray(
                CarrierConfigManager.KEY_ROAMING_OPERATOR_STRING_ARRAY, new String[] {"60101"});
        sendCarrierConfigUpdate();
@@ -239,7 +243,6 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    public void testIsRoamingOverride_NonRoamingGsmOperator() {
        doReturn(true).when(mPhone).isPhoneTypeGsm();

        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putStringArray(
                CarrierConfigManager.KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY,
                new String[] {NUMERIC});
@@ -262,7 +265,6 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    public void testIsRoamingOverride_RoamingGsmOperator() {
        doReturn(true).when(mPhone).isPhoneTypeGsm();

        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putStringArray(
                CarrierConfigManager.KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY, new String[] {NUMERIC});
        sendCarrierConfigUpdate();
+20 −14
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    private ServiceStateStats mServiceStateStats;

    private CellularNetworkService mCellularNetworkService;
    private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;

    // SST now delegates all signal strength operations to SSC
    // Add Mock SSC as the dependency to avoid NPE
@@ -181,7 +182,18 @@ public class ServiceStateTrackerTest extends TelephonyTest {
            mSsc = new SignalStrengthController(mPhone);
            doReturn(mSsc).when(mPhone).getSignalStrengthController();

            // Capture listener registered for ServiceStateTracker to emulate the carrier config
            // change notification used later. In this test, it's the third one. The first one
            // comes from RatRatcheter and the second one comes from SignalStrengthController.
            ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener>
                    listenerArgumentCaptor =
                            ArgumentCaptor.forClass(
                                    CarrierConfigManager.CarrierConfigChangeListener.class);
            sst = new ServiceStateTracker(mPhone, mSimulatedCommands);
            verify(mCarrierConfigManager, atLeast(3)).registerCarrierConfigChangeListener(any(),
                    listenerArgumentCaptor.capture());
            mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(2);

            sst.setServiceStateStats(mServiceStateStats);
            doReturn(sst).when(mPhone).getServiceStateTracker();
            setReady(true);
@@ -245,6 +257,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        replaceInstance(ProxyController.class, "sProxyController", null, mProxyController);
        mBundle = mContextFixture.getCarrierConfigBundle();
        when(mCarrierConfigManager.getConfigForSubId(anyInt(), any())).thenReturn(mBundle);
        when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
        mBundle.putStringArray(
                CarrierConfigManager.KEY_ROAMING_OPERATOR_STRING_ARRAY, new String[]{"123456"});

@@ -347,9 +360,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
                    30  /* SIGNAL_STRENGTH_GREAT */
                });

        Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, 0);
        mContext.sendBroadcast(intent);
        sendCarrierConfigUpdate(PHONE_ID);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());

        logd("ServiceStateTrackerTest -Setup!");
@@ -818,15 +829,10 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        verify(mPhone, times(1)).notifyServiceStateChanged(any(ServiceState.class));
    }

    private void sendCarrierConfigUpdate() {
        CarrierConfigManager mockConfigManager = Mockito.mock(CarrierConfigManager.class);
        when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
                .thenReturn(mockConfigManager);
        when(mockConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);

        Intent intent = new Intent().setAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, PHONE_ID);
        mContext.sendBroadcast(intent);
    private void sendCarrierConfigUpdate(int phoneId) {
        mCarrierConfigChangeListener.onCarrierConfigChanged(phoneId,
                SubscriptionManager.INVALID_SUBSCRIPTION_ID,
                TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
    }

@@ -2858,7 +2864,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    public void testUpdateSpnDisplay_spnEmptyAndWifiCallingEnabled_showPlmnOnly() {
        // set empty service provider name
        mBundle.putString(CarrierConfigManager.KEY_CARRIER_NAME_STRING, "");
        sendCarrierConfigUpdate();
        sendCarrierConfigUpdate(PHONE_ID);

        // GSM phone
        doReturn(true).when(mPhone).isPhoneTypeGsm();
@@ -2938,7 +2944,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    public void testUpdateSpnDisplayLegacy_WlanServiceNoWifiCalling_displayOOS() {
        mBundle.putBoolean(
                CarrierConfigManager.KEY_ENABLE_CARRIER_DISPLAY_NAME_RESOLVER_BOOL, false);
        sendCarrierConfigUpdate();
        sendCarrierConfigUpdate(PHONE_ID);

        // GSM phone
        doReturn(true).when(mPhone).isPhoneTypeGsm();