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
This commit is contained in:
markchien
2019-03-19 20:57:04 +08:00
parent aed6ea52de
commit 29a650c98e
3 changed files with 35 additions and 6 deletions

View File

@@ -247,7 +247,14 @@ public class Tethering extends BaseNetworkObserver {
(Intent ignored) -> {
mLog.log("OBSERVED default data subscription change");
updateConfiguration();
mEntitlementMgr.reevaluateSimCardProvisioning();
// 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();

View File

@@ -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.

View File

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