Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d21f14a0 authored by SongFerngWang's avatar SongFerngWang Committed by SongFerng Wang
Browse files

Remove the cached display name

If the display name is changed, then the Settings should remove the
cached display name.

Bug: 296157273
Test: [pass] atest SubscriptionUtilTest  [pass]Build and manual test
Change-Id: I3b1297ddddf9f9051dd16523b97fc27255cf3923
parent d43d6f25
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.settings.network;

import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT;

import static com.android.internal.util.CollectionUtils.emptyIfNull;

import android.annotation.Nullable;
@@ -56,6 +55,8 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@@ -66,6 +67,9 @@ public class SubscriptionUtil {
    static final String SUB_ID = "sub_id";
    @VisibleForTesting
    static final String KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME = "unique_subscription_displayName";
    private static final String REGEX_DISPLAY_NAME_PREFIXES = "^";
    private static final String REGEX_DISPLAY_NAME_SUFFIXES = "\\s[0-9]+";

    private static List<SubscriptionInfo> sAvailableResultsForTesting;
    private static List<SubscriptionInfo> sActiveResultsForTesting;

@@ -298,12 +302,17 @@ 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 -> {
            int infoSubId = info.subscriptionInfo.getSubscriptionId();
            String cachedDisplayName = getDisplayNameFromSharedPreference(
                    context, info.subscriptionInfo.getSubscriptionId());
            if (!TextUtils.isEmpty(cachedDisplayName)) {
                Log.d(TAG, "use cached display name : " + cachedDisplayName);
                    context, infoSubId);
            if (isValidCachedDisplayName(cachedDisplayName, info.originalName.toString())) {
                Log.d(TAG, "use cached display name : for subId : " + infoSubId
                        + "cached display name : " + cachedDisplayName);
                info.uniqueName = cachedDisplayName;
                return info;
            } else {
                Log.d(TAG, "remove cached display name : " + infoSubId);
                removeItemFromDisplayNameSharedPreference(context, infoSubId);
            }

            if (duplicateOriginalNames.contains(info.originalName)) {
@@ -320,9 +329,8 @@ public class SubscriptionUtil {
                } 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);
                            + infoSubId);
                    saveDisplayNameToSharedPreference(context, infoSubId, info.uniqueName);
                }
            } else {
                info.uniqueName = info.originalName;
@@ -404,10 +412,27 @@ public class SubscriptionUtil {
                .apply();
    }

    private static void removeItemFromDisplayNameSharedPreference(Context context, int subId) {
        getDisplayNameSharedPreferenceEditor(context)
                .remove(SUB_ID + subId)
                .commit();
    }

    private static String getDisplayNameFromSharedPreference(Context context, int subid) {
        return getDisplayNameSharedPreferences(context).getString(SUB_ID + subid, "");
    }

    @VisibleForTesting
    static boolean isValidCachedDisplayName(String cachedDisplayName, String originalName) {
        if (TextUtils.isEmpty(cachedDisplayName) || TextUtils.isEmpty(originalName)) {
            return false;
        }
        String regex = REGEX_DISPLAY_NAME_PREFIXES + originalName + REGEX_DISPLAY_NAME_SUFFIXES;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(cachedDisplayName);
        return matcher.matches();
    }

    public static String getDisplayName(SubscriptionInfo info) {
        final CharSequence name = info.getDisplayName();
        if (name != null) {
+99 −12
Original line number Diff line number Diff line
@@ -18,9 +18,7 @@ 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;
@@ -185,7 +183,7 @@ public class SubscriptionUtilTest {
    @Ignore
    @Test
    public void getUniqueDisplayNames_identicalCarriers_fourDigitsUsed() {
        // Both subscriptoins have the same display name.
        // Both subscriptions have the same display name.
        final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
        final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
        when(info1.getSubscriptionId()).thenReturn(SUBID_1);
@@ -215,7 +213,7 @@ public class SubscriptionUtilTest {
    @Ignore
    @Test
    public void getUniqueDisplayNames_identicalCarriersAfterTrim_fourDigitsUsed() {
        // Both subscriptoins have the same display name.
        // Both subscriptions have the same display name.
        final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
        final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
        when(info1.getSubscriptionId()).thenReturn(SUBID_1);
@@ -244,8 +242,8 @@ public class SubscriptionUtilTest {

    @Ignore
    @Test
    public void getUniqueDisplayNames_phoneNumberBlocked_subscriptoinIdFallback() {
        // Both subscriptoins have the same display name.
    public void getUniqueDisplayNames_phoneNumberBlocked_subscriptionIdFallback() {
        // Both subscriptions have the same display name.
        final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
        final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
        when(info1.getSubscriptionId()).thenReturn(SUBID_1);
@@ -273,9 +271,9 @@ public class SubscriptionUtilTest {

    @Ignore
    @Test
    public void getUniqueDisplayNames_phoneNumberIdentical_subscriptoinIdFallback() {
    public void getUniqueDisplayNames_phoneNumberIdentical_subscriptionIdFallback() {
        // TODO have three here from the same carrier
        // Both subscriptoins have the same display name.
        // Both subscriptions have the same display name.
        final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
        final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
        final SubscriptionInfo info3 = mock(SubscriptionInfo.class);
@@ -479,6 +477,39 @@ public class SubscriptionUtilTest {
        assertEquals(CARRIER_1 + " 4321", nameOfSub2.toString());
    }

    @Test
    public void getUniqueDisplayName_hasRecordAndNameIsChanged_doesNotUseRecordBeTheResult() {
        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_2);
        when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(
                Arrays.asList(info1, info2));

        SharedPreferences sp = mock(SharedPreferences.class);
        SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);
        when(mContext.getSharedPreferences(
                KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME, Context.MODE_PRIVATE)).thenReturn(sp);
        when(sp.edit()).thenReturn(editor);
        when(editor.remove(anyString())).thenReturn(editor);

        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_2.toString(), nameOfSub2.toString());
    }

    @Test
    public void isInactiveInsertedPSim_nullSubInfo_doesNotCrash() {
        assertThat(SubscriptionUtil.isInactiveInsertedPSim(null)).isFalse();
@@ -501,4 +532,60 @@ public class SubscriptionUtilTest {

        assertTrue(SubscriptionUtil.isSimHardwareVisible(mContext));
    }

    @Test
    public void isValidCachedDisplayName_matchesRule1_returnTrue() {
        String originalName = "originalName";
        String cacheString = "originalName 1234";

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isTrue();
    }

    @Test
    public void isValidCachedDisplayName_matchesRule2_returnTrue() {
        String originalName = "original Name";
        String cacheString = originalName + " " + 1234;

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isTrue();
    }

    @Test
    public void isValidCachedDisplayName_nameIsEmpty1_returnFalse() {
        String originalName = "original Name";
        String cacheString = "";

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isFalse();
    }

    @Test
    public void isValidCachedDisplayName_nameIsEmpty2_returnFalse() {
        String originalName = "";
        String cacheString = "originalName 1234";

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isFalse();
    }

    @Test
    public void isValidCachedDisplayName_nameIsDifferent_returnFalse() {
        String originalName = "original Name";
        String cacheString = "originalName 1234";

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isFalse();
    }

    @Test
    public void isValidCachedDisplayName_noNumber_returnFalse() {
        String originalName = "original Name";
        String cacheString = originalName;

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isFalse();
    }

    @Test
    public void isValidCachedDisplayName_noSpace_returnFalse() {
        String originalName = "original Name";
        String cacheString = originalName;

        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isFalse();
    }
}