diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java index b8726808b45..9e1b6da24e9 100644 --- a/src/com/android/settings/network/SubscriptionsPreferenceController.java +++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java @@ -94,6 +94,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl private SignalStrengthListener mSignalStrengthListener; private TelephonyDisplayInfoListener mTelephonyDisplayInfoListener; private WifiPickerTrackerHelper mWifiPickerTrackerHelper; + private final WifiManager mWifiManager; @VisibleForTesting final BroadcastReceiver mConnectionChangeReceiver = new BroadcastReceiver() { @@ -150,6 +151,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl mStartOrder = startOrder; mTelephonyManager = context.getSystemService(TelephonyManager.class); mSubscriptionManager = context.getSystemService(SubscriptionManager.class); + mWifiManager = context.getSystemService(WifiManager.class); mSubscriptionPreferences = new ArrayMap<>(); mSubscriptionsListener = new SubscriptionsChangeListener(context, this); mDataEnabledListener = new MobileDataEnabledListener(context, this); @@ -271,9 +273,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl final boolean isDataInService = (regInfo == null) ? false : regInfo.isRegistered(); - final boolean isCarrierNetworkActive = - (mWifiPickerTrackerHelper != null) - && mWifiPickerTrackerHelper.isCarrierNetworkActive(); + final boolean isCarrierNetworkActive = isCarrierNetworkActive(); String result = mSubsPrefCtrlInjector.getNetworkType( mContext, mConfig, mTelephonyDisplayInfo, subId, isCarrierNetworkActive); if (mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext) || isCarrierNetworkActive) { @@ -291,20 +291,15 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl final SignalStrength strength = tmForSubId.getSignalStrength(); int level = (strength == null) ? 0 : strength.getLevel(); int numLevels = SignalStrength.NUM_SIGNAL_STRENGTH_BINS; - if (shouldInflateSignalStrength(subId)) { - level += 1; + boolean isCarrierNetworkActive = isCarrierNetworkActive(); + if (shouldInflateSignalStrength(subId) || isCarrierNetworkActive) { + level = isCarrierNetworkActive + ? SignalStrength.NUM_SIGNAL_STRENGTH_BINS + : (level + 1); numLevels += 1; } - Drawable icon = mSubsPrefCtrlInjector.getIcon(mContext, level, numLevels, - !mTelephonyManager.isDataEnabled()); - final boolean isActiveCellularNetwork = - mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext); - if (isActiveCellularNetwork || (mWifiPickerTrackerHelper != null) - && mWifiPickerTrackerHelper.isCarrierNetworkActive()) { - icon.setTint(Utils.getColorAccentDefaultColor(mContext)); - return icon; - } + Drawable icon = mContext.getDrawable(R.drawable.ic_signal_strength_zero_bar_no_internet); final ServiceState serviceState = tmForSubId.getServiceState(); final NetworkRegistrationInfo regInfo = (serviceState == null) @@ -319,11 +314,17 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl final boolean isVoiceInService = (serviceState == null) ? false : (serviceState.getState() == ServiceState.STATE_IN_SERVICE); - if (isDataInService || isVoiceInService) { - return icon; + if (isDataInService || isVoiceInService || isCarrierNetworkActive) { + icon = mSubsPrefCtrlInjector.getIcon(mContext, level, numLevels, + !mTelephonyManager.isDataEnabled()); + } + + final boolean isActiveCellularNetwork = + mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext); + if (isActiveCellularNetwork || isCarrierNetworkActive) { + icon.setTint(Utils.getColorAccentDefaultColor(mContext)); } - icon = mContext.getDrawable(R.drawable.ic_signal_strength_zero_bar_no_internet); return icon; } @@ -417,7 +418,8 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl */ @Override public boolean isAvailable() { - if (mSubscriptionsListener.isAirplaneModeOn()) { + if (mSubscriptionsListener.isAirplaneModeOn() + && (!mWifiManager.isWifiEnabled() || !isCarrierNetworkActive())) { return false; } List subInfoList = @@ -425,6 +427,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl if (subInfoList == null) { return false; } + return subInfoList.stream() // Avoid from showing subscription(SIM)s which has been marked as hidden // For example, only one subscription will be shown when there're multiple @@ -495,6 +498,11 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl return new SubsPrefCtrlInjector(); } + boolean isCarrierNetworkActive() { + return mWifiPickerTrackerHelper != null + && mWifiPickerTrackerHelper.isCarrierNetworkActive(); + } + /** * To inject necessary data from each static api. */ diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java index 8b03352c62b..ac07faefa47 100644 --- a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java @@ -39,6 +39,7 @@ import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; +import android.net.wifi.WifiManager; import android.os.Looper; import android.os.UserManager; import android.provider.Settings; @@ -102,6 +103,8 @@ public class SubscriptionsPreferenceControllerTest { private LifecycleOwner mLifecycleOwner; @Mock private WifiPickerTrackerHelper mWifiPickerTrackerHelper; + @Mock + private WifiManager mWifiManager; private LifecycleRegistry mLifecycleRegistry; private int mOnChildUpdatedCount; @@ -132,6 +135,7 @@ public class SubscriptionsPreferenceControllerTest { when(mConnectivityManager.getNetworkCapabilities(mActiveNetwork)) .thenReturn(mNetworkCapabilities); when(mUserManager.isAdminUser()).thenReturn(true); + when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry); mPreferenceManager = new PreferenceManager(mContext); @@ -171,16 +175,55 @@ public class SubscriptionsPreferenceControllerTest { } @Test - public void isAvailable_airplaneModeOn_availableFalse() { + public void isAvailable_airplaneModeOnWifiOff_availableFalse() { setupMockSubscriptions(2); assertThat(mController.isAvailable()).isTrue(); + when(mWifiManager.isWifiEnabled()).thenReturn(false); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); assertThat(mController.isAvailable()).isFalse(); } + @Test + public void isAvailable_airplaneModeOnWifiOnWithNoCarrierNetwork_availableFalse() { + setupMockSubscriptions(2); + + assertThat(mController.isAvailable()).isTrue(); + when(mWifiManager.isWifiEnabled()).thenReturn(true); + doReturn(false).when(mWifiPickerTrackerHelper).isCarrierNetworkActive(); + + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_airplaneModeOnWifiOffWithCarrierNetwork_availableTrue() { + setupMockSubscriptions(1); + + when(mWifiManager.isWifiEnabled()).thenReturn(false); + doReturn(true).when(mWifiPickerTrackerHelper).isCarrierNetworkActive(); + + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_airplaneModeOff_availableFalse() { + setupMockSubscriptions(2); + + assertThat(mController.isAvailable()).isTrue(); + when(mWifiManager.isWifiEnabled()).thenReturn(true); + doReturn(true).when(mWifiPickerTrackerHelper).isCarrierNetworkActive(); + + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0); + + assertThat(mController.isAvailable()).isTrue(); + } + @Test @UiThreadTest public void displayPreference_providerAndHasSim_showPreference() {