Merge "[Settings] Should show carrier network if airplane mode is on" into sc-v2-dev am: 1df187a439

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/16332786

Change-Id: I1a63b9d82fd530af87c2c70ab21e24e599a967e2
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index b872680..9e1b6da 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -94,6 +94,7 @@
     private SignalStrengthListener mSignalStrengthListener;
     private TelephonyDisplayInfoListener mTelephonyDisplayInfoListener;
     private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+    private final WifiManager mWifiManager;
 
     @VisibleForTesting
     final BroadcastReceiver mConnectionChangeReceiver = new BroadcastReceiver() {
@@ -150,6 +151,7 @@
         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 @@
         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 @@
         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 @@
         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());
         }
 
-        icon = mContext.getDrawable(R.drawable.ic_signal_strength_zero_bar_no_internet);
+        final boolean isActiveCellularNetwork =
+                mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext);
+        if (isActiveCellularNetwork || isCarrierNetworkActive) {
+            icon.setTint(Utils.getColorAccentDefaultColor(mContext));
+        }
+
         return icon;
     }
 
@@ -417,7 +418,8 @@
      */
     @Override
     public boolean isAvailable() {
-        if (mSubscriptionsListener.isAirplaneModeOn()) {
+        if (mSubscriptionsListener.isAirplaneModeOn()
+                && (!mWifiManager.isWifiEnabled() || !isCarrierNetworkActive())) {
             return false;
         }
         List<SubscriptionInfo> subInfoList =
@@ -425,6 +427,7 @@
         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 @@
         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 8b03352..ac07fae 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.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 @@
     private LifecycleOwner mLifecycleOwner;
     @Mock
     private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+    @Mock
+    private WifiManager mWifiManager;
 
     private LifecycleRegistry mLifecycleRegistry;
     private int mOnChildUpdatedCount;
@@ -132,6 +135,7 @@
         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,10 +175,11 @@
     }
 
     @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);
 
@@ -182,6 +187,44 @@
     }
 
     @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() {
         final List<SubscriptionInfo> sub = setupMockSubscriptions(1);