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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user