From 150eb72a81b0e6ac9521f698c55fadfbea1a6a6c Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Wed, 21 Oct 2020 02:25:26 +0800 Subject: [PATCH 1/2] [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 a single SIM. Bug: 169455114 Bug: 175069803 Test: make RunSettingsRoboTests ROBOTEST_FILTER=SubscriptionsPreferenceControllerTest Change-Id: I0934a45a2917ab106627c733162efbee9a13f216 (cherry picked from commit a6b249d625bcc4bace97a886c0681e559e7e3e05) Merged-In: I0934a45a2917ab106627c733162efbee9a13f216 --- .../SubscriptionsPreferenceController.java | 25 +++++++++++++++++- ...SubscriptionsPreferenceControllerTest.java | 26 ++++++++++++------- 2 files changed, 41 insertions(+), 10 deletions(-) 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() { From c2232020c461295cc640da76f3bd6aacf1ae1a87 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 17 Dec 2020 01:59:56 +0000 Subject: [PATCH 2/2] [Settings] code refactor - rename isSubscriptionCanBeDisplayed canSubscriptionBeDisplayed is more readable. Reasonale: When cherry-picking ag/12886476 into Android R branch (ag/13209427), a comment from code reviewer suggested this change. Since ag/12886476 has been merged for a while, another patch for it is perferred option when comparing with reverting that CL and resubmit it. Bug: 175830728 Change-Id: Ie91eb82504fd7cff6671803a2bc2560139690952 Test: build pass Merged-In: Ie91eb82504fd7cff6671803a2bc2560139690952 --- .../settings/network/SubscriptionsPreferenceController.java | 6 +++--- .../network/SubscriptionsPreferenceControllerTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java index 82df4aa25c8..9fe6566d61e 100644 --- a/src/com/android/settings/network/SubscriptionsPreferenceController.java +++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java @@ -170,7 +170,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl // 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)) { + if (!canSubscriptionBeDisplayed(mContext, subId)) { continue; } activeSubIds.add(subId); @@ -308,7 +308,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl // For example, only one subscription will be shown when there're multiple // subscriptions with same group UUID. .filter(subInfo -> - isSubscriptionCanBeDisplayed(mContext, subInfo.getSubscriptionId())) + canSubscriptionBeDisplayed(mContext, subInfo.getSubscriptionId())) .count() >= 2; } @@ -349,7 +349,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl } @VisibleForTesting - boolean isSubscriptionCanBeDisplayed(Context context, int subId) { + boolean canSubscriptionBeDisplayed(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 ea2212c31f6..57b2e2fd6cb 100644 --- a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java @@ -122,7 +122,7 @@ public class SubscriptionsPreferenceControllerTest { mController = spy( new SubscriptionsPreferenceController(mContext, mLifecycle, mUpdateListener, KEY, 5)); - doReturn(true).when(mController).isSubscriptionCanBeDisplayed(any(), anyInt()); + doReturn(true).when(mController).canSubscriptionBeDisplayed(any(), anyInt()); doReturn(mSignalStrengthIcon).when(mController).getIcon(anyInt(), anyInt(), anyBoolean()); } @@ -458,7 +458,7 @@ public class SubscriptionsPreferenceControllerTest { @Test public void displayPreference_subscriptionsWithSameGroupUUID_onlyOneWillBeSeen() { - doReturn(false).when(mController).isSubscriptionCanBeDisplayed(any(), eq(3)); + doReturn(false).when(mController).canSubscriptionBeDisplayed(any(), eq(3)); final List subs = setupMockSubscriptions(3); SubscriptionUtil.setActiveSubscriptionsForTesting(subs.subList(0, 3));