Loading src/com/android/settings/network/SubscriptionUtil.java +54 −17 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static com.android.internal.util.CollectionUtils.emptyIfNull; import android.annotation.Nullable; import android.content.Context; import android.content.SharedPreferences; import android.os.ParcelUuid; import android.provider.Settings; import android.telephony.PhoneNumberUtils; Loading Loading @@ -61,6 +62,10 @@ import java.util.stream.Stream; public class SubscriptionUtil { private static final String TAG = "SubscriptionUtil"; private static final String PROFILE_GENERIC_DISPLAY_NAME = "CARD"; @VisibleForTesting static final String SUB_ID = "sub_id"; @VisibleForTesting static final String KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME = "unique_subscription_displayName"; private static List<SubscriptionInfo> sAvailableResultsForTesting; private static List<SubscriptionInfo> sActiveResultsForTesting; Loading Loading @@ -274,7 +279,8 @@ public class SubscriptionUtil { DisplayInfo info = new DisplayInfo(); info.subscriptionInfo = i; String displayName = i.getDisplayName().toString(); info.originalName = TextUtils.equals(displayName, PROFILE_GENERIC_DISPLAY_NAME) info.originalName = TextUtils.equals(displayName, PROFILE_GENERIC_DISPLAY_NAME) ? context.getResources().getString(R.string.sim_card) : displayName.trim(); return info; Loading @@ -292,6 +298,14 @@ public class SubscriptionUtil { // If a display name is duplicate, append the final 4 digits of the phone number. // Creates a mapping of Subscription id to original display name + phone number display name final Supplier<Stream<DisplayInfo>> uniqueInfos = () -> originalInfos.get().map(info -> { String cachedDisplayName = getDisplayNameFromSharedPreference( context, info.subscriptionInfo.getSubscriptionId()); if (!TextUtils.isEmpty(cachedDisplayName)) { Log.d(TAG, "use cached display name : " + cachedDisplayName); info.uniqueName = cachedDisplayName; return info; } if (duplicateOriginalNames.contains(info.originalName)) { // This may return null, if the user cannot view the phone number itself. final String phoneNumber = getBidiFormattedPhoneNumber(context, Loading @@ -301,13 +315,15 @@ public class SubscriptionUtil { lastFourDigits = (phoneNumber.length() > 4) ? phoneNumber.substring(phoneNumber.length() - 4) : phoneNumber; } if (TextUtils.isEmpty(lastFourDigits)) { info.uniqueName = info.originalName; } else { info.uniqueName = info.originalName + " " + lastFourDigits; Log.d(TAG, "Cache display name [" + info.uniqueName + "] for sub id " + info.subscriptionInfo.getSubscriptionId()); saveDisplayNameToSharedPreference( context, info.subscriptionInfo.getSubscriptionId(), info.uniqueName); } } else { info.uniqueName = info.originalName; } Loading Loading @@ -371,6 +387,27 @@ public class SubscriptionUtil { return getUniqueSubscriptionDisplayName(info.getSubscriptionId(), context); } private static SharedPreferences getDisplayNameSharedPreferences(Context context) { return context.getSharedPreferences( KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME, Context.MODE_PRIVATE); } private static SharedPreferences.Editor getDisplayNameSharedPreferenceEditor(Context context) { return getDisplayNameSharedPreferences(context).edit(); } private static void saveDisplayNameToSharedPreference( Context context, int subId, CharSequence displayName) { getDisplayNameSharedPreferenceEditor(context) .putString(SUB_ID + subId, String.valueOf(displayName)) .apply(); } private static String getDisplayNameFromSharedPreference(Context context, int subid) { return getDisplayNameSharedPreferences(context).getString(SUB_ID + subid, ""); } public static String getDisplayName(SubscriptionInfo info) { final CharSequence name = info.getDisplayName(); if (name != null) { Loading tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java +37 −2 Original line number Diff line number Diff line Loading @@ -16,26 +16,32 @@ package com.android.settings.network; import static com.android.settings.network.SubscriptionUtil.KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME; import static com.android.settings.network.SubscriptionUtil.SUB_ID; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import com.android.settings.R; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.R; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; Loading Loading @@ -444,6 +450,35 @@ public class SubscriptionUtilTest { assertTrue(TextUtils.isEmpty(name)); } @Test public void getUniqueDisplayName_hasRecord_useRecordBeTheResult() { final SubscriptionInfo info1 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class); when(info1.getSubscriptionId()).thenReturn(SUBID_1); when(info2.getSubscriptionId()).thenReturn(SUBID_2); when(info1.getDisplayName()).thenReturn(CARRIER_1); when(info2.getDisplayName()).thenReturn(CARRIER_1); when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn( Arrays.asList(info1, info2)); SharedPreferences sp = mock(SharedPreferences.class); when(mContext.getSharedPreferences( KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME, Context.MODE_PRIVATE)).thenReturn(sp); when(sp.getString(eq(SUB_ID + SUBID_1), anyString())).thenReturn(CARRIER_1 + "6789"); when(sp.getString(eq(SUB_ID + SUBID_2), anyString())).thenReturn(CARRIER_1 + "4321"); final CharSequence nameOfSub1 = SubscriptionUtil.getUniqueSubscriptionDisplayName(info1, mContext); final CharSequence nameOfSub2 = SubscriptionUtil.getUniqueSubscriptionDisplayName(info2, mContext); assertThat(nameOfSub1).isNotNull(); assertThat(nameOfSub2).isNotNull(); assertEquals(CARRIER_1 + "6789", nameOfSub1.toString()); assertEquals(CARRIER_1 + "4321", nameOfSub2.toString()); } @Test public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() { assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse(); Loading Loading
src/com/android/settings/network/SubscriptionUtil.java +54 −17 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static com.android.internal.util.CollectionUtils.emptyIfNull; import android.annotation.Nullable; import android.content.Context; import android.content.SharedPreferences; import android.os.ParcelUuid; import android.provider.Settings; import android.telephony.PhoneNumberUtils; Loading Loading @@ -61,6 +62,10 @@ import java.util.stream.Stream; public class SubscriptionUtil { private static final String TAG = "SubscriptionUtil"; private static final String PROFILE_GENERIC_DISPLAY_NAME = "CARD"; @VisibleForTesting static final String SUB_ID = "sub_id"; @VisibleForTesting static final String KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME = "unique_subscription_displayName"; private static List<SubscriptionInfo> sAvailableResultsForTesting; private static List<SubscriptionInfo> sActiveResultsForTesting; Loading Loading @@ -274,7 +279,8 @@ public class SubscriptionUtil { DisplayInfo info = new DisplayInfo(); info.subscriptionInfo = i; String displayName = i.getDisplayName().toString(); info.originalName = TextUtils.equals(displayName, PROFILE_GENERIC_DISPLAY_NAME) info.originalName = TextUtils.equals(displayName, PROFILE_GENERIC_DISPLAY_NAME) ? context.getResources().getString(R.string.sim_card) : displayName.trim(); return info; Loading @@ -292,6 +298,14 @@ public class SubscriptionUtil { // If a display name is duplicate, append the final 4 digits of the phone number. // Creates a mapping of Subscription id to original display name + phone number display name final Supplier<Stream<DisplayInfo>> uniqueInfos = () -> originalInfos.get().map(info -> { String cachedDisplayName = getDisplayNameFromSharedPreference( context, info.subscriptionInfo.getSubscriptionId()); if (!TextUtils.isEmpty(cachedDisplayName)) { Log.d(TAG, "use cached display name : " + cachedDisplayName); info.uniqueName = cachedDisplayName; return info; } if (duplicateOriginalNames.contains(info.originalName)) { // This may return null, if the user cannot view the phone number itself. final String phoneNumber = getBidiFormattedPhoneNumber(context, Loading @@ -301,13 +315,15 @@ public class SubscriptionUtil { lastFourDigits = (phoneNumber.length() > 4) ? phoneNumber.substring(phoneNumber.length() - 4) : phoneNumber; } if (TextUtils.isEmpty(lastFourDigits)) { info.uniqueName = info.originalName; } else { info.uniqueName = info.originalName + " " + lastFourDigits; Log.d(TAG, "Cache display name [" + info.uniqueName + "] for sub id " + info.subscriptionInfo.getSubscriptionId()); saveDisplayNameToSharedPreference( context, info.subscriptionInfo.getSubscriptionId(), info.uniqueName); } } else { info.uniqueName = info.originalName; } Loading Loading @@ -371,6 +387,27 @@ public class SubscriptionUtil { return getUniqueSubscriptionDisplayName(info.getSubscriptionId(), context); } private static SharedPreferences getDisplayNameSharedPreferences(Context context) { return context.getSharedPreferences( KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME, Context.MODE_PRIVATE); } private static SharedPreferences.Editor getDisplayNameSharedPreferenceEditor(Context context) { return getDisplayNameSharedPreferences(context).edit(); } private static void saveDisplayNameToSharedPreference( Context context, int subId, CharSequence displayName) { getDisplayNameSharedPreferenceEditor(context) .putString(SUB_ID + subId, String.valueOf(displayName)) .apply(); } private static String getDisplayNameFromSharedPreference(Context context, int subid) { return getDisplayNameSharedPreferences(context).getString(SUB_ID + subid, ""); } public static String getDisplayName(SubscriptionInfo info) { final CharSequence name = info.getDisplayName(); if (name != null) { Loading
tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java +37 −2 Original line number Diff line number Diff line Loading @@ -16,26 +16,32 @@ package com.android.settings.network; import static com.android.settings.network.SubscriptionUtil.KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME; import static com.android.settings.network.SubscriptionUtil.SUB_ID; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import com.android.settings.R; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.R; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; Loading Loading @@ -444,6 +450,35 @@ public class SubscriptionUtilTest { assertTrue(TextUtils.isEmpty(name)); } @Test public void getUniqueDisplayName_hasRecord_useRecordBeTheResult() { final SubscriptionInfo info1 = mock(SubscriptionInfo.class); final SubscriptionInfo info2 = mock(SubscriptionInfo.class); when(info1.getSubscriptionId()).thenReturn(SUBID_1); when(info2.getSubscriptionId()).thenReturn(SUBID_2); when(info1.getDisplayName()).thenReturn(CARRIER_1); when(info2.getDisplayName()).thenReturn(CARRIER_1); when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn( Arrays.asList(info1, info2)); SharedPreferences sp = mock(SharedPreferences.class); when(mContext.getSharedPreferences( KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME, Context.MODE_PRIVATE)).thenReturn(sp); when(sp.getString(eq(SUB_ID + SUBID_1), anyString())).thenReturn(CARRIER_1 + "6789"); when(sp.getString(eq(SUB_ID + SUBID_2), anyString())).thenReturn(CARRIER_1 + "4321"); final CharSequence nameOfSub1 = SubscriptionUtil.getUniqueSubscriptionDisplayName(info1, mContext); final CharSequence nameOfSub2 = SubscriptionUtil.getUniqueSubscriptionDisplayName(info2, mContext); assertThat(nameOfSub1).isNotNull(); assertThat(nameOfSub2).isNotNull(); assertEquals(CARRIER_1 + "6789", nameOfSub1.toString()); assertEquals(CARRIER_1 + "4321", nameOfSub2.toString()); } @Test public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() { assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse(); Loading