From 29a650c98e400d93190acb5381426b751ca05f57 Mon Sep 17 00:00:00 2001 From: markchien Date: Tue, 19 Mar 2019 20:57:04 +0800 Subject: [PATCH] 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 --- .../com/android/server/connectivity/Tethering.java | 9 ++++++++- .../connectivity/tethering/EntitlementManager.java | 21 ++++++++++++++++----- .../tethering/EntitlementManagerTest.java | 11 +++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 35704d404ff3..37fe3d094179 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -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(); diff --git a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java index 65cc51610e72..70ab38983446 100644 --- a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java +++ b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java @@ -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. diff --git a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java index 3944fad2ac9e..bac509802258 100644 --- a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java @@ -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 @@ -199,6 +200,16 @@ public final class EntitlementManagerTest { } @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(); when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app)) -- 2.11.0