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

Commit 436ed6ad authored by Ling Ma's avatar Ling Ma
Browse files

Read device resource on bootup

Since some resource config are per device(versus per sub), we can read those value on device bootup before waiting for any sub specific events.

Fix: 275421272
Test: verify values are populated before selecting default data
Change-Id: I7767927b3e777d0a53016f976c87e8db22b7670b
parent 32cf81dd
Loading
Loading
Loading
Loading
+21 −41
Original line number Diff line number Diff line
@@ -292,17 +292,6 @@ public class PhoneSwitcher extends Handler {

    private ISetOpportunisticDataCallback mSetOpptSubCallback;

    /** Data config manager callback for updating device config. **/
    private final DataConfigManager.DataConfigManagerCallback mDataConfigManagerCallback =
            new DataConfigManager.DataConfigManagerCallback(this::post) {

        @Override
        public void onCarrierConfigChanged() {
            log("onCarrierConfigChanged");
            PhoneSwitcher.this.updateCarrierConfig();
        }
    };

    private static final int EVENT_PRIMARY_DATA_SUB_CHANGED       = 101;
    protected static final int EVENT_SUBSCRIPTION_CHANGED         = 102;
    private static final int EVENT_REQUEST_NETWORK                = 103;
@@ -589,6 +578,8 @@ public class PhoneSwitcher extends Handler {
            PhoneFactory.getPhone(0).mCi.registerForOn(this, EVENT_RADIO_ON, null);
        }

        readDeviceResourceConfig();

        TelephonyRegistryManager telephonyRegistryManager = (TelephonyRegistryManager)
                context.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);
        telephonyRegistryManager.addOnSubscriptionsChangedListener(
@@ -914,44 +905,34 @@ public class PhoneSwitcher extends Handler {
                break;
            }
            case EVENT_PROCESS_SIM_STATE_CHANGE: {
                int slotIndex = (int) msg.arg1;
                int simState = (int) msg.arg2;
                int slotIndex = msg.arg1;
                int simState = msg.arg2;

                if (!SubscriptionManager.isValidSlotIndex(slotIndex)) {
                    logl("EVENT_PROCESS_SIM_STATE_CHANGE: skip processing due to invalid slotId: "
                            + slotIndex);
                } else if (mCurrentDdsSwitchFailure.get(slotIndex).contains(
                } else if (TelephonyManager.SIM_STATE_LOADED == simState) {
                    if (mCurrentDdsSwitchFailure.get(slotIndex).contains(
                        CommandException.Error.INVALID_SIM_STATE)
                        && (TelephonyManager.SIM_STATE_LOADED == simState)
                        && isSimApplicationReady(slotIndex)) {
                        sendRilCommands(slotIndex);
                    }

                registerConfigChange();
                break;
            }
                    // SIM loaded after subscriptions slot mapping are done. Evaluate for auto
                    // data switch.
                    sendEmptyMessage(EVENT_EVALUATE_AUTO_SWITCH);
                }
                break;
            }

    /**
     * Register for config change on the primary data phone.
     */
    private void registerConfigChange() {
        Phone phone = getPhoneBySubId(mPrimaryDataSubId);
        if (phone != null) {
            DataConfigManager dataConfig = phone.getDataNetworkController().getDataConfigManager();
            dataConfig.registerCallback(mDataConfigManagerCallback);
            updateCarrierConfig();
            sendEmptyMessage(EVENT_EVALUATE_AUTO_SWITCH);
        }
    }

    /**
     * Update carrier config.
     * Read the default device config from any default phone because the resource config are per
     * device. No need to register callback for the same reason.
     */
    private void updateCarrierConfig() {
        Phone phone = getPhoneBySubId(mPrimaryDataSubId);
        if (phone != null) {
    private void readDeviceResourceConfig() {
        Phone phone = PhoneFactory.getDefaultPhone();
        DataConfigManager dataConfig = phone.getDataNetworkController().getDataConfigManager();
        mRequirePingTestBeforeDataSwitch = dataConfig.isPingTestBeforeAutoDataSwitchRequired();
        mAutoDataSwitchAvailabilityStabilityTimeThreshold =
@@ -959,7 +940,6 @@ public class PhoneSwitcher extends Handler {
        mAutoDataSwitchValidationMaxRetry =
                dataConfig.getAutoDataSwitchValidationMaxRetry();
    }
    }

    private synchronized void onMultiSimConfigChanged(int activeModemCount) {
        // No change.
+15 −19
Original line number Diff line number Diff line
@@ -131,7 +131,6 @@ public class PhoneSwitcherTest extends TelephonyTest {
    private Messenger mNetworkProviderMessenger = null;
    private Map<Integer, DataSettingsManager.DataSettingsManagerCallback>
            mDataSettingsManagerCallbacks;
    private DataConfigManager.DataConfigManagerCallback mDataConfigManagerCallback;
    private int mDefaultDataSub = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    private int[][] mSlotIndexToSubId;
    private boolean[] mDataAllowed;
@@ -641,15 +640,17 @@ public class PhoneSwitcherTest extends TelephonyTest {
    @SmallTest
    public void testAutoDataSwitch_exemptPingTest() throws Exception {
        initialize();
        // Change resource overlay
        doReturn(false).when(mDataConfigManager).isPingTestBeforeAutoDataSwitchRequired();
        mPhoneSwitcherUT = new PhoneSwitcher(mMaxDataAttachModemCount, mContext, Looper.myLooper());
        processAllMessages();

        // Phone 0 has sub 1, phone 1 has sub 2.
        // Sub 1 is default data sub.
        setSlotIndexToSubId(0, 1);
        setSlotIndexToSubId(1, 2);
        setDefaultDataSubId(1);

        doReturn(false).when(mDataConfigManager).isPingTestBeforeAutoDataSwitchRequired();
        mDataConfigManagerCallback.onCarrierConfigChanged();

        //1. Attempting to switch to nDDS, switch even if validation failed
        prepareIdealAutoSwitchCondition();
        processAllFutureMessages();
@@ -2028,6 +2029,7 @@ public class PhoneSwitcherTest extends TelephonyTest {
        initializeCommandInterfacesMock();
        initializeTelRegistryMock();
        initializeConnManagerMock();
        initializeConfigMock();

        mPhoneSwitcherUT = new PhoneSwitcher(mMaxDataAttachModemCount, mContext, Looper.myLooper());

@@ -2037,21 +2039,6 @@ public class PhoneSwitcherTest extends TelephonyTest {
                (Map<Integer, DataSettingsManager.DataSettingsManagerCallback>)
                        field.get(mPhoneSwitcherUT);

        field = PhoneSwitcher.class.getDeclaredField("mDataConfigManagerCallback");
        field.setAccessible(true);
        mDataConfigManagerCallback =
                (DataConfigManager.DataConfigManagerCallback) field.get(mPhoneSwitcherUT);

        doReturn(mDataNetworkController).when(mPhone).getDataNetworkController();
        doReturn(mDataConfigManager).when(mDataNetworkController).getDataConfigManager();
        doReturn(1000L).when(mDataConfigManager)
                .getAutoDataSwitchAvailabilityStabilityTimeThreshold();
        doReturn(7).when(mDataConfigManager).getAutoDataSwitchValidationMaxRetry();
        doReturn(true).when(mDataConfigManager).isPingTestBeforeAutoDataSwitchRequired();

        mDataConfigManagerCallback.onCarrierConfigChanged();
        mDataConfigManagerCallback.onDeviceConfigChanged();

        processAllMessages();

        verify(mTelephonyRegistryManager).addOnSubscriptionsChangedListener(any(), any());
@@ -2216,6 +2203,15 @@ public class PhoneSwitcherTest extends TelephonyTest {
                .getActiveSubIdList(true);
    }

    private void initializeConfigMock() {
        doReturn(mDataNetworkController).when(mPhone).getDataNetworkController();
        doReturn(mDataConfigManager).when(mDataNetworkController).getDataConfigManager();
        doReturn(1000L).when(mDataConfigManager)
                .getAutoDataSwitchAvailabilityStabilityTimeThreshold();
        doReturn(7).when(mDataConfigManager).getAutoDataSwitchValidationMaxRetry();
        doReturn(true).when(mDataConfigManager).isPingTestBeforeAutoDataSwitchRequired();
    }

    private void setDefaultDataSubId(int defaultDataSub) throws Exception {
        mDefaultDataSub = defaultDataSub;
        doReturn(mDefaultDataSub).when(mSubscriptionController).getDefaultDataSubId();