[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
This commit is contained in:
Weng Su
2021-09-18 04:14:45 +08:00
parent f0c99d831e
commit e0037a25d7
3 changed files with 135 additions and 36 deletions

View File

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

View File

@@ -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<Boolean> mCallStrengthConfigs = new SparseArray<>();
private final SparseArray<Boolean> 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;
}
}

View File

@@ -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;
}