diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java index e9cdb46e6fd..82df4aa25c8 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.core.AbstractPreferenceController; 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 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl 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 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl if (mSubscriptionsListener.isAirplaneModeOn()) { return false; } - return SubscriptionUtil.getActiveSubscriptions(mManager).size() >= 2; + List 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 class SubscriptionsPreferenceController extends AbstractPreferenceControl 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 6fd94c3a199..ea2212c31f6 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.times; 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.SubscriptionInfo; 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.junit.runner.RunWith; 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.ArrayList; 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 @@ public class SubscriptionsPreferenceControllerTest { 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 @@ public class SubscriptionsPreferenceControllerTest { eq(true)); } + @Test + public void displayPreference_subscriptionsWithSameGroupUUID_onlyOneWillBeSeen() { + doReturn(false).when(mController).isSubscriptionCanBeDisplayed(any(), eq(3)); + final List 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() {