[Settings] Only display 1 SIM UI when multiple with same group UUID

Some carrier(s) expand their service through providing eSIM in companion
with pSIM. Group UUID is designed to group them together as an single
SIM.

Bug: 165363542
Test: make RunSettingsRoboTests ROBOTEST_FILTER=SubscriptionsPreferenceControllerTest
Change-Id: I0934a45a2917ab106627c733162efbee9a13f216
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index e9cdb46..82df4aa 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -52,6 +52,7 @@
 import com.android.settingslib.net.SignalStrengthUtil;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -166,6 +167,12 @@
         final int dataDefaultSubId = SubscriptionManager.getDefaultDataSubscriptionId();
         for (SubscriptionInfo info : SubscriptionUtil.getActiveSubscriptions(mManager)) {
             final int subId = info.getSubscriptionId();
+            // Avoid from showing subscription(SIM)s which has been marked as hidden
+            // For example, only one subscription will be shown when there're multiple
+            // subscriptions with same group UUID.
+            if (!isSubscriptionCanBeDisplayed(mContext, subId)) {
+                continue;
+            }
             activeSubIds.add(subId);
             Preference pref = existingPrefs.remove(subId);
             if (pref == null) {
@@ -292,7 +299,17 @@
         if (mSubscriptionsListener.isAirplaneModeOn()) {
             return false;
         }
-        return SubscriptionUtil.getActiveSubscriptions(mManager).size() >= 2;
+        List<SubscriptionInfo> subInfoList = SubscriptionUtil.getActiveSubscriptions(mManager);
+        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
+                // subscriptions with same group UUID.
+                .filter(subInfo ->
+                        isSubscriptionCanBeDisplayed(mContext, subInfo.getSubscriptionId()))
+                .count() >= 2;
     }
 
     @Override
@@ -330,4 +347,10 @@
     public void onSignalStrengthChanged() {
         update();
     }
+
+    @VisibleForTesting
+    boolean isSubscriptionCanBeDisplayed(Context context, int subId) {
+        return (SubscriptionUtil.getAvailableSubscription(context,
+                ProxySubscriptionManager.getInstance(context), subId) != null);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
index 6fd94c3..ea2212c 100644
--- a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
@@ -37,11 +37,9 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
 import android.net.ConnectivityManager;
 import android.net.Network;
 import android.net.NetworkCapabilities;
@@ -51,9 +49,13 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+
 import com.android.settings.R;
 import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.graph.SignalDrawable;
 
 import org.junit.After;
 import org.junit.Before;
@@ -62,7 +64,6 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
@@ -72,11 +73,6 @@
 import java.util.Arrays;
 import java.util.List;
 
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceScreen;
-
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = ShadowSubscriptionManager.class)
 public class SubscriptionsPreferenceControllerTest {
@@ -126,6 +122,7 @@
         mController = spy(
                 new SubscriptionsPreferenceController(mContext, mLifecycle, mUpdateListener,
                         KEY, 5));
+        doReturn(true).when(mController).isSubscriptionCanBeDisplayed(any(), anyInt());
         doReturn(mSignalStrengthIcon).when(mController).getIcon(anyInt(), anyInt(), anyBoolean());
     }
 
@@ -459,6 +456,17 @@
                 eq(true));
     }
 
+    @Test
+    public void displayPreference_subscriptionsWithSameGroupUUID_onlyOneWillBeSeen() {
+        doReturn(false).when(mController).isSubscriptionCanBeDisplayed(any(), eq(3));
+        final List<SubscriptionInfo> subs = setupMockSubscriptions(3);
+        SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 3));
+
+        mController.onResume();
+        mController.displayPreference(mScreen);
+
+        verify(mPreferenceCategory, times(2)).addPreference(any(Preference.class));
+    }
 
     @Test
     public void onMobileDataEnabledChange_mobileDataTurnedOff_bothSubsHaveCutOut() {