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

Commit 29a650c9 authored by markchien's avatar markchien
Browse files

Fix the race between carrier config and DDS change

Tethering may receive default data subscription change when
carrier config don't load yet. Don't reevaluate provisioning
for this transient "carrier config not loaded" time. Assume
tethering will receive carrier config change and process
provisioning reevaluation after carrier config loaded.

Fix: 128650184
Test: -build, flash, boot
      -atest FrameworksNetTests
      -manual test with Google Fi

Change-Id: I9e66fe2cbc340ba7477283bea7853ff15f41dd81
parent aed6ea52
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -247,7 +247,14 @@ public class Tethering extends BaseNetworkObserver {
                (Intent ignored) -> {
                    mLog.log("OBSERVED default data subscription change");
                    updateConfiguration();
                    // To avoid launch unexpected provisioning checks, ignore re-provisioning when
                    // no CarrierConfig loaded yet. Assume reevaluateSimCardProvisioning() will be
                    // triggered again when CarrierConfig is loaded.
                    if (mEntitlementMgr.getCarrierConfig() != null) {
                        mEntitlementMgr.reevaluateSimCardProvisioning();
                    } else {
                        mLog.log("IGNORED reevaluate provisioning due to no carrier config loaded");
                    }
                });
        mStateReceiver = new StateReceiver();

+16 −5
Original line number Diff line number Diff line
@@ -158,6 +158,21 @@ public class EntitlementManager {
        }
    }

    /** Get carrier configuration bundle. */
    public PersistableBundle getCarrierConfig() {
        final CarrierConfigManager configManager = (CarrierConfigManager) mContext
                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
        if (configManager == null) return null;

        final PersistableBundle carrierConfig = configManager.getConfig();

        if (CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfig)) {
            return carrierConfig;
        }

        return null;
    }

    // The logic here is aimed solely at confirming that a CarrierConfig exists
    // and affirms that entitlement checks are not required.
    //
@@ -165,11 +180,7 @@ public class EntitlementManager {
    // entirely so that this is more intuitive.
    private boolean carrierConfigAffirmsEntitlementCheckNotRequired() {
        // Check carrier config for entitlement checks
        final CarrierConfigManager configManager = (CarrierConfigManager) mContext
                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
        if (configManager == null) return false;

        final PersistableBundle carrierConfig = configManager.getConfig();
        final PersistableBundle carrierConfig = getCarrierConfig();
        if (carrierConfig == null) return false;

        // A CarrierConfigManager was found and it has a config.
+11 −0
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ public final class EntitlementManagerTest {
                .thenReturn(mCarrierConfigManager);
        when(mCarrierConfigManager.getConfig()).thenReturn(mCarrierConfig);
        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true);
        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
    }

    @Test
@@ -198,6 +199,16 @@ public final class EntitlementManagerTest {
        assertTrue(mEnMgr.isTetherProvisioningRequired());
    }

    @Test
    public void toleratesCarrierConfigNotLoaded() {
        setupForRequiredProvisioning();
        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
        mEnMgr.updateConfiguration(
                new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID));
        // We still have a provisioning app configured, so still require provisioning.
        assertTrue(mEnMgr.isTetherProvisioningRequired());
    }

    @Test
    public void provisioningNotRequiredWhenAppNotFound() {
        setupForRequiredProvisioning();