From e0037a25d7d728c0279a95a80b9389c217ff4cee Mon Sep 17 00:00:00 2001 From: Weng Su Date: Sat, 18 Sep 2021 04:14:45 +0800 Subject: [PATCH] [Provider Model] Fix the issue of turning off carrier network - Refer to KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL carrier config - True: do not set the status of merged-carrier-wifi together - False: set the status of merged-carrier-wifi together Bug: 200222406 Test: manual test atest -c InternetDialogControllerTest Change-Id: Ied6487067307bc263320dd9d52e25b6973ee25e3 --- .../dialog/InternetDialogController.java | 30 ++++++- .../systemui/util/CarrierConfigTracker.java | 88 +++++++++++++------ .../dialog/InternetDialogControllerTest.java | 53 +++++++++-- 3 files changed, 135 insertions(+), 36 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index 25de6f0fc4fac..02439ecd72bc5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -25,7 +25,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PixelFormat; @@ -73,6 +72,7 @@ import com.android.settingslib.net.SignalStrengthUtil; import com.android.settingslib.wifi.WifiUtils; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -80,6 +80,7 @@ import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.toast.SystemUIToast; import com.android.systemui.toast.ToastFactory; +import com.android.systemui.util.CarrierConfigTracker; import com.android.systemui.util.settings.GlobalSettings; import com.android.wifitrackerlib.MergedCarrierEntry; import com.android.wifitrackerlib.WifiEntry; @@ -125,10 +126,12 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private SubscriptionManager mSubscriptionManager; private TelephonyManager mTelephonyManager; private ConnectivityManager mConnectivityManager; + private CarrierConfigTracker mCarrierConfigTracker; private TelephonyDisplayInfo mTelephonyDisplayInfo = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); private Handler mHandler; + private Handler mWorkerHandler; private MobileMappings.Config mConfig = null; private Executor mExecutor; private AccessPointController mAccessPointController; @@ -191,11 +194,14 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, @Main Handler handler, @Main Executor mainExecutor, BroadcastDispatcher broadcastDispatcher, KeyguardUpdateMonitor keyguardUpdateMonitor, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, - WindowManager windowManager, ToastFactory toastFactory) { + WindowManager windowManager, ToastFactory toastFactory, + @Background Handler workerHandler, + CarrierConfigTracker carrierConfigTracker) { if (DEBUG) { Log.d(TAG, "Init InternetDialogController"); } mHandler = handler; + mWorkerHandler = workerHandler; mExecutor = mainExecutor; mContext = context; mGlobalSettings = globalSettings; @@ -203,6 +209,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mTelephonyManager = telephonyManager; mConnectivityManager = connectivityManager; mSubscriptionManager = subscriptionManager; + mCarrierConfigTracker = carrierConfigTracker; mBroadcastDispatcher = broadcastDispatcher; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardStateController = keyguardStateController; @@ -611,6 +618,24 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return mergedCarrierEntry != null && mergedCarrierEntry.isDefaultNetwork(); } + @WorkerThread + void setMergedCarrierWifiEnabledIfNeed(int subId, boolean enabled) { + // If the Carrier Provisions Wi-Fi Merged Networks enabled, do not set the merged carrier + // Wi-Fi state together. + if (mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(subId)) { + return; + } + + final MergedCarrierEntry entry = mAccessPointController.getMergedCarrierEntry(); + if (entry == null) { + if (DEBUG) { + Log.d(TAG, "MergedCarrierEntry is null, can not set the status."); + } + return; + } + entry.setEnabled(enabled); + } + WifiManager getWifiManager() { return mWifiManager; } @@ -685,6 +710,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } } } + mWorkerHandler.post(() -> setMergedCarrierWifiEnabledIfNeed(subId, enabled)); } boolean isDataStateInService() { diff --git a/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java b/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java index de5a3637fe9fc..14190fa752c34 100644 --- a/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java +++ b/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java @@ -23,8 +23,9 @@ import android.content.IntentFilter; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; -import android.util.SparseArray; +import android.util.SparseBooleanArray; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; @@ -34,39 +35,54 @@ import javax.inject.Inject; */ @SysUISingleton public class CarrierConfigTracker extends BroadcastReceiver { - private final SparseArray mCallStrengthConfigs = new SparseArray<>(); - private final SparseArray mNoCallingConfigs = new SparseArray<>(); + private final SparseBooleanArray mCallStrengthConfigs = new SparseBooleanArray(); + private final SparseBooleanArray mNoCallingConfigs = new SparseBooleanArray(); + private final SparseBooleanArray mCarrierProvisionsWifiMergedNetworks = + new SparseBooleanArray(); private final CarrierConfigManager mCarrierConfigManager; private boolean mDefaultCallStrengthConfigLoaded; private boolean mDefaultCallStrengthConfig; private boolean mDefaultNoCallingConfigLoaded; private boolean mDefaultNoCallingConfig; + private boolean mDefaultCarrierProvisionsWifiMergedNetworksLoaded; + private boolean mDefaultCarrierProvisionsWifiMergedNetworks; @Inject - public CarrierConfigTracker(Context context) { + public CarrierConfigTracker(Context context, BroadcastDispatcher broadcastDispatcher) { mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); - context.registerReceiver( + broadcastDispatcher.registerReceiver( this, new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)); } @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction() == CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED) { - int subId = intent.getIntExtra( - CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, - SubscriptionManager.INVALID_SUBSCRIPTION_ID); - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - return; - } - PersistableBundle b = mCarrierConfigManager.getConfigForSubId(subId); - if (b != null) { - boolean hideNoCallingConfig = b.getBoolean( - CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL); - boolean displayCallStrengthIcon = b.getBoolean( - CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL); - mCallStrengthConfigs.put(subId, displayCallStrengthIcon); - mNoCallingConfigs.put(subId, hideNoCallingConfig); - } + if (!CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) { + return; + } + + final int subId = intent.getIntExtra( + CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + if (!SubscriptionManager.isValidSubscriptionId(subId)) { + return; + } + + final PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId); + if (config == null) { + return; + } + + synchronized (mCallStrengthConfigs) { + mCallStrengthConfigs.put(subId, config.getBoolean( + CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL)); + } + synchronized (mNoCallingConfigs) { + mNoCallingConfigs.put(subId, config.getBoolean( + CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL)); + } + synchronized (mCarrierProvisionsWifiMergedNetworks) { + mCarrierProvisionsWifiMergedNetworks.put(subId, config.getBoolean( + CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL)); } } @@ -74,8 +90,10 @@ public class CarrierConfigTracker extends BroadcastReceiver { * Returns the KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL value for the given subId. */ public boolean getCallStrengthConfig(int subId) { - if (mCallStrengthConfigs.indexOfKey(subId) >= 0) { - return mCallStrengthConfigs.get(subId); + synchronized (mCallStrengthConfigs) { + if (mCallStrengthConfigs.indexOfKey(subId) >= 0) { + return mCallStrengthConfigs.get(subId); + } } if (!mDefaultCallStrengthConfigLoaded) { mDefaultCallStrengthConfig = @@ -90,8 +108,10 @@ public class CarrierConfigTracker extends BroadcastReceiver { * Returns the KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL value for the given subId. */ public boolean getNoCallingConfig(int subId) { - if (mNoCallingConfigs.indexOfKey(subId) >= 0) { - return mNoCallingConfigs.get(subId); + synchronized (mNoCallingConfigs) { + if (mNoCallingConfigs.indexOfKey(subId) >= 0) { + return mNoCallingConfigs.get(subId); + } } if (!mDefaultNoCallingConfigLoaded) { mDefaultNoCallingConfig = @@ -101,4 +121,22 @@ public class CarrierConfigTracker extends BroadcastReceiver { } return mDefaultNoCallingConfig; } + + /** + * Returns the KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL value for the given subId. + */ + public boolean getCarrierProvisionsWifiMergedNetworksBool(int subId) { + synchronized (mCarrierProvisionsWifiMergedNetworks) { + if (mCarrierProvisionsWifiMergedNetworks.indexOfKey(subId) >= 0) { + return mCarrierProvisionsWifiMergedNetworks.get(subId); + } + } + if (!mDefaultCarrierProvisionsWifiMergedNetworksLoaded) { + mDefaultCarrierProvisionsWifiMergedNetworks = + CarrierConfigManager.getDefaultConfig().getBoolean( + CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL); + mDefaultCarrierProvisionsWifiMergedNetworksLoaded = true; + } + return mDefaultCarrierProvisionsWifiMergedNetworks; + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index b270a7f90d942..f9d5be6c48077 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -15,7 +15,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -34,10 +33,6 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableResources; import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.WindowManager; -import android.widget.TextView; import android.view.Gravity; import android.view.View; import android.view.WindowManager; @@ -58,6 +53,7 @@ import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.toast.SystemUIToast; import com.android.systemui.toast.ToastFactory; +import com.android.systemui.util.CarrierConfigTracker; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.time.FakeSystemClock; @@ -68,7 +64,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -99,6 +94,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Mock private Handler mHandler; @Mock + private Handler mWorkerHandler; + @Mock private ActivityStarter mActivityStarter; @Mock private GlobalSettings mGlobalSettings; @@ -136,6 +133,8 @@ public class InternetDialogControllerTest extends SysuiTestCase { private View mToastView; @Mock private Animator mAnimator; + @Mock + private CarrierConfigTracker mCarrierConfigTracker; private TestableResources mTestableResources; private MockInternetDialogController mInternetDialogController; @@ -157,6 +156,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { when(mWifiEntry4.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED); mAccessPoints.add(mConnectedEntry); mAccessPoints.add(mWifiEntry1); + when(mAccessPointController.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[]{SUB_ID}); when(mAccessPointController.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry); when(mToastFactory.createToast(any(), anyString(), anyString(), anyInt(), anyInt())) @@ -170,7 +170,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { mSubscriptionManager, mTelephonyManager, mWifiManager, mock(ConnectivityManager.class), mHandler, mExecutor, mBroadcastDispatcher, mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, - mWindowManager, mToastFactory); + mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker); mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, mInternetDialogController.mOnSubscriptionsChangedListener); mInternetDialogController.onStart(mInternetDialogCallback, true); @@ -569,6 +569,39 @@ public class InternetDialogControllerTest extends SysuiTestCase { .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); } + @Test + public void setMergedCarrierWifiEnabledIfNeed_carrierProvisionsEnabled_doNothing() { + when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) + .thenReturn(true); + + mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); + + verify(mMergedCarrierEntry, never()).setEnabled(anyBoolean()); + } + + @Test + public void setMergedCarrierWifiEnabledIfNeed_mergedCarrierEntryEmpty_doesntCrash() { + when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) + .thenReturn(false); + when(mAccessPointController.getMergedCarrierEntry()).thenReturn(null); + + mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); + } + + @Test + public void setMergedCarrierWifiEnabledIfNeed_neededSetMergedCarrierEntry_setTogether() { + when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) + .thenReturn(false); + + mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); + + verify(mMergedCarrierEntry).setEnabled(true); + + mInternetDialogController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, false); + + verify(mMergedCarrierEntry).setEnabled(false); + } + private String getResourcesString(String name) { return mContext.getResources().getString(getResourcesId(name)); } @@ -591,11 +624,13 @@ public class InternetDialogControllerTest extends SysuiTestCase { BroadcastDispatcher broadcastDispatcher, KeyguardUpdateMonitor keyguardUpdateMonitor, GlobalSettings globalSettings, KeyguardStateController keyguardStateController, WindowManager windowManager, - ToastFactory toastFactory) { + ToastFactory toastFactory, Handler workerHandler, + CarrierConfigTracker carrierConfigTracker) { super(context, uiEventLogger, starter, accessPointController, subscriptionManager, telephonyManager, wifiManager, connectivityManager, handler, mainExecutor, broadcastDispatcher, keyguardUpdateMonitor, globalSettings, - keyguardStateController, windowManager, toastFactory); + keyguardStateController, windowManager, toastFactory, workerHandler, + carrierConfigTracker); mGlobalSettings = globalSettings; }