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

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

Preferred network list add 5G item

Preferred network list add 5G item, and change "recommended" from 4G to
5G, and add summary for 5G.

Bug: 138544359
Test: 1.fake the device network type bitmask to 5G, UI show 5G list
2.atest EnabledNetworkModePreferenceControllerTest.java :pass

Change-Id: I4a78e2e7fbb067ce841df4aaf1d5161607fdcf90
parent ec384c2f
Loading
Loading
Loading
Loading
+176 −4
Original line number Diff line number Diff line
@@ -26,9 +26,12 @@ import android.os.Looper;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle;
@@ -42,6 +45,9 @@ import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.settings.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Preference controller for "Enabled network mode"
 */
@@ -49,6 +55,7 @@ public class EnabledNetworkModePreferenceController extends
        TelephonyBasePreferenceController implements
        ListPreference.OnPreferenceChangeListener, LifecycleObserver {

    private static final String LOG_TAG = "EnabledNetworkMode";
    private CarrierConfigManager mCarrierConfigManager;
    private ContentObserver mPreferredNetworkModeObserver;
    private TelephonyManager mTelephonyManager;
@@ -56,6 +63,8 @@ public class EnabledNetworkModePreferenceController extends
    @VisibleForTesting
    boolean mShow4GForLTE;
    private Preference mPreference;
    @VisibleForTesting
    boolean mDisplay5gList = false;

    public EnabledNetworkModePreferenceController(Context context, String key) {
        super(context, key);
@@ -149,6 +158,11 @@ public class EnabledNetworkModePreferenceController extends
                ? carrierConfig.getBoolean(
                CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL)
                : false;

        final long supportedRadioBitmask = mTelephonyManager.getSupportedRadioAccessFamily();
        mDisplay5gList = checkSupportedRadioBitmask(
                supportedRadioBitmask, mTelephonyManager.NETWORK_TYPE_BITMASK_NR);

        lifecycle.addObserver(this);
    }

@@ -249,6 +263,139 @@ public class EnabledNetworkModePreferenceController extends
            preference.setEntryValues(
                    R.array.preferred_network_mode_values_world_mode);
        }

        if (mDisplay5gList) {
            add5gListItem(preference);
        }
    }

    @VisibleForTesting
    boolean checkSupportedRadioBitmask(long supportedRadioBitmask, long targetBitmask) {
        Log.d(LOG_TAG, "supportedRadioBitmask: " + supportedRadioBitmask);
        if ((targetBitmask & supportedRadioBitmask) > 0) {
            return true;
        }
        return false;
    }

    /***
     * Preferred network list add 5G item.
     *
     * @string/enabled_networks_cdma_choices
     *         Before            |        After
     * @string/network_lte   , 8 |@string/network_5G + @string/network_recommended , 25
     * @string/network_3G    , 4 |@string/network_lte_pure, 8
     * @string/network_1x    , 5 |@string/network_3G      , 4
     * @string/network_global, 10|@string/network_1x      , 5
     *                           |@string/network_global  , 27
     *
     * @string/enabled_networks_cdma_only_lte_choices
     *         Before            |        After
     * @string/network_lte   , 8 |@string/network_5G + @string/network_recommended , 25
     * @string/network_global, 10|@string/network_lte_pure, 8
     *                           |@string/network_global  , 27
     *
     * @string/enabled_networks_tdscdma_choices
     *         Before         |        After
     * @string/network_lte, 22|@string/network_5G + @string/network_recommended , 33
     * @string/network_3G , 18|@string/network_lte_pure, 22
     * @string/network_2G , 1 |@string/network_3G      , 18
     *                        |@string/network_2G      , 1
     *
     * @string/enabled_networks_except_gsm_4g_choices
     *         Before         |        After
     * @string/network_4G , 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_4G_pure , 9
     *                        |@string/network_3G      , 0
     *
     * @string/enabled_networks_except_gsm_choices
     *         Before         |        After
     * @string/network_lte, 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_lte_pure, 9
     *                        |@string/network_3G      , 0
     *
     * @string/enabled_networks_4g_choices
     *         Before         |        After
     * @string/network_4G , 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_4G_pure , 9
     * @string/network_2G , 1 |@string/network_3G      , 0
     *                        |@string/network_2G      , 1
     *
     * @string/enabled_networks_choices
     *         Before         |        After
     * @string/network_lte, 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_lte_pure, 9
     * @string/network_2G , 1 |@string/network_3G      , 0
     *                        |@string/network_2G      , 1
     *
     * @string/preferred_network_mode_choices_world_mode
     *         Before         |        After
     * "Global"           , 10|@string/network_global  , 27
     * "LTE / CDMA"       , 8 |"LTE / CDMA"            , 8
     * "LTE / GSM / UMTS" , 9 |"LTE / GSM / UMTS"      , 9
     */
    @VisibleForTesting
    void add5gListItem(ListPreference preference) {
        final CharSequence[] oldEntries = preference.getEntries();
        final CharSequence[] oldEntryValues = preference.getEntryValues();
        List<CharSequence> newEntries = new ArrayList<>();
        List<CharSequence> newEntryValues = new ArrayList<>();

        CharSequence oldEntry;
        CharSequence oldEntryValue;
        CharSequence new5gEntry;
        CharSequence new5gEntryValue;

        for (int i = 0; i < oldEntries.length; i++) {
            oldEntry = oldEntries[i];
            oldEntryValue = oldEntryValues[i];
            new5gEntry = "";
            new5gEntryValue = "";

            if (mContext.getString(R.string.network_lte).equals(oldEntry)) {
                oldEntry = mContext.getString(R.string.network_lte_pure);
                new5gEntry = mContext.getString(R.string.network_5G)
                        + mContext.getString(R.string.network_recommended);
                new5gEntryValue = transformLteEntryValueTo5gEntryValue(oldEntryValue);
            } else if (mContext.getString(R.string.network_4G).equals(oldEntry)) {
                oldEntry = mContext.getString(R.string.network_4G_pure);
                new5gEntry = mContext.getString(R.string.network_5G)
                        + mContext.getString(R.string.network_recommended);
                new5gEntryValue = transformLteEntryValueTo5gEntryValue(oldEntryValue);
            } else if (mContext.getString(R.string.network_global).equals(oldEntry)) {
                //oldEntry: network_global
                //oldEntryValue: TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA
                oldEntryValue = Integer.toString(
                        TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
            }

            if (!TextUtils.isEmpty(new5gEntry)) {
                newEntries.add(new5gEntry);
                newEntryValues.add(new5gEntryValue);
            }
            newEntries.add(oldEntry);
            newEntryValues.add(oldEntryValue);
        }

        preference.setEntries(newEntries.toArray(new CharSequence[newEntries.size()]));
        preference.setEntryValues(newEntryValues.toArray(new CharSequence[newEntryValues.size()]));
    }

    /**
     * LTE network mode transform to 5G network mode.
     *
     * @param networkMode this is LTE network mode.
     * @return 5G network mode.
     */
    private CharSequence transformLteEntryValueTo5gEntryValue(CharSequence networkMode) {
        int networkModeInt = Integer.valueOf(networkMode.toString());
        return Integer.toString(addNrToNetworkType(networkModeInt));
    }

    private int addNrToNetworkType(int networkType) {
        long networkTypeBitmasks = RadioAccessFamily.getRafFromNetworkType(networkType);
        networkTypeBitmasks |= mTelephonyManager.NETWORK_TYPE_BITMASK_NR;
        return RadioAccessFamily.getNetworkTypeFromRaf((int) networkTypeBitmasks);
    }

    private void updatePreferenceValueAndSummary(ListPreference preference, int networkMode) {
@@ -312,7 +459,8 @@ public class EnabledNetworkModePreferenceController extends
                } else {
                    preference.setValue(
                            Integer.toString(TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO));
                    preference.setSummary(R.string.network_lte);
                    preference.setSummary(
                            mDisplay5gList ? R.string.network_lte_pure : R.string.network_lte);
                }
                break;
            case TelephonyManager.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
@@ -347,7 +495,8 @@ public class EnabledNetworkModePreferenceController extends
                    preference.setValue(
                            Integer.toString(TelephonyManager
                                    .NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA));
                    preference.setSummary(R.string.network_lte);
                    preference.setSummary(
                            mDisplay5gList ? R.string.network_lte_pure : R.string.network_lte);
                } else {
                    preference.setValue(
                            Integer.toString(TelephonyManager
@@ -356,11 +505,34 @@ public class EnabledNetworkModePreferenceController extends
                            || mIsGlobalCdma
                            || MobileNetworkUtils.isWorldMode(mContext, mSubId)) {
                        preference.setSummary(R.string.network_global);
                    } else {
                        if (mDisplay5gList) {
                            preference.setSummary(mShow4GForLTE
                                    ? R.string.network_4G_pure : R.string.network_lte_pure);
                        } else {
                            preference.setSummary(mShow4GForLTE
                                    ? R.string.network_4G : R.string.network_lte);
                        }
                    }
                }
                break;
            case TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO:
            case TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
                preference.setValue(Integer.toString(networkMode));
                preference.setSummary(mContext.getString(R.string.network_5G)
                        + mContext.getString(R.string.network_recommended));
                break;
            case TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA:
                preference.setValue(
                        Integer.toString(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA));
                if (mTelephonyManager.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA
                        || mIsGlobalCdma
                        || MobileNetworkUtils.isWorldMode(mContext, mSubId)) {
                    preference.setSummary(R.string.network_global);
                } else {
                    preference.setSummary(mContext.getString(R.string.network_5G)
                            + mContext.getString(R.string.network_recommended));
                }
                break;
            default:
                preference.setSummary(
+217 −0
Original line number Diff line number Diff line
@@ -147,6 +147,26 @@ public class EnabledNetworkModePreferenceControllerTest {
        assertThat(mController.mShow4GForLTE).isTrue();
    }

    @Test
    public void init_initDisplay5gList_returnTrue() {
        long testBitmask = TelephonyManager.NETWORK_TYPE_BITMASK_NR
                | TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
        doReturn(testBitmask).when(mTelephonyManager).getSupportedRadioAccessFamily();

        mController.init(mLifecycle, SUB_ID);

        assertThat(mController.mDisplay5gList).isTrue();
    }

    @Test
    public void checkSupportedRadioBitmask_nrBitmask_returnTrue() {
        long testBitmask = TelephonyManager.NETWORK_TYPE_BITMASK_NR
                | TelephonyManager.NETWORK_TYPE_BITMASK_LTE;

        assertThat(mController.checkSupportedRadioBitmask(testBitmask,
                TelephonyManager.NETWORK_TYPE_BITMASK_NR)).isTrue();
    }

    @Test
    public void updateState_updateByNetworkMode() {
        Settings.Global.putInt(mContext.getContentResolver(),
@@ -172,6 +192,203 @@ public class EnabledNetworkModePreferenceControllerTest {
                String.valueOf(TelephonyManager.NETWORK_MODE_LTE_GSM_WCDMA));
    }

    /**
     * @string/enabled_networks_cdma_choices
     *         Before            |        After
     * @string/network_lte   , 8 |@string/network_5G + @string/network_recommended , 25
     * @string/network_3G    , 4 |@string/network_lte_pure, 8
     * @string/network_1x    , 5 |@string/network_3G      , 4
     * @string/network_global, 10|@string/network_1x      , 5
     *                           |@string/network_global  , 27
     *
     * @string/enabled_networks_cdma_only_lte_choices
     *         Before            |        After
     * @string/network_lte   , 8 |@string/network_5G + @string/network_recommended , 25
     * @string/network_global, 10|@string/network_lte_pure, 8
     *                           |@string/network_global  , 27
     */
    @Test
    public void add5gListItem_lteCdma_5gLteCdma() {
        //case#1
        mPreference.setEntries(R.array.enabled_networks_cdma_choices);
        mPreference.setEntryValues(R.array.enabled_networks_cdma_values);
        CharSequence[] testEntries = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_lte_pure)
                , mContext.getString(R.string.network_3G)
                , mContext.getString(R.string.network_1x)
                , mContext.getString(R.string.network_global)};
        CharSequence[] testEntryValues = {"25", "8", "4", "5", "27"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues);

        //case#2
        mPreference.setEntries(R.array.enabled_networks_cdma_only_lte_choices);
        mPreference.setEntryValues(R.array.enabled_networks_cdma_only_lte_values);
        CharSequence[] testEntries1 = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_lte_pure)
                , mContext.getString(R.string.network_global)};
        CharSequence[] testEntryValues1 = {"25", "8", "27"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries1);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues1);
    }

    /**
     * @string/enabled_networks_except_gsm_4g_choices
     *         Before         |        After
     * @string/network_4G , 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_4G_pure , 9
     *                        |@string/network_3G      , 0
     *
     * @string/enabled_networks_except_gsm_choices
     *         Before         |        After
     * @string/network_lte, 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_lte_pure, 9
     *                        |@string/network_3G      , 0
     *
     * @string/enabled_networks_4g_choices
     *         Before         |        After
     * @string/network_4G , 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_4G_pure , 9
     * @string/network_2G , 1 |@string/network_3G      , 0
     *                        |@string/network_2G      , 1
     *
     * @string/enabled_networks_choices
     *         Before         |        After
     * @string/network_lte, 9 |@string/network_5G + @string/network_recommended , 26
     * @string/network_3G , 0 |@string/network_lte_pure, 9
     * @string/network_2G , 1 |@string/network_3G      , 0
     *                        |@string/network_2G      , 1
     */
    @Test
    public void add5gListItem_lteGsm_5gLteGsm() {
        //csae#1
        mPreference.setEntries(R.array.enabled_networks_except_gsm_4g_choices);
        mPreference.setEntryValues(R.array.enabled_networks_except_gsm_values);
        CharSequence[] testEntries = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_4G_pure)
                , mContext.getString(R.string.network_3G)};
        CharSequence[] testEntryValues = {"26", "9", "0"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues);

        //case#2
        mPreference.setEntries(R.array.enabled_networks_except_gsm_choices);
        mPreference.setEntryValues(R.array.enabled_networks_except_gsm_values);
        CharSequence[] testEntries1 = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_lte_pure)
                , mContext.getString(R.string.network_3G)};
        CharSequence[] testEntryValues1 = {"26", "9", "0"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries1);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues1);

        //case#3
        mPreference.setEntries(R.array.enabled_networks_4g_choices);
        mPreference.setEntryValues(R.array.enabled_networks_values);
        CharSequence[] testEntries2 = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_4G_pure)
                , mContext.getString(R.string.network_3G)
                , mContext.getString(R.string.network_2G)};
        CharSequence[] testEntryValues2 = {"26", "9", "0", "1"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries2);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues2);

        //case#4
        mPreference.setEntries(R.array.enabled_networks_choices);
        mPreference.setEntryValues(R.array.enabled_networks_values);
        CharSequence[] testEntries3 = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_lte_pure)
                , mContext.getString(R.string.network_3G)
                , mContext.getString(R.string.network_2G)};
        CharSequence[] testEntryValues3 = {"26", "9", "0", "1"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries3);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues3);
    }

    /**
     * @string/preferred_network_mode_choices_world_mode
     *         Before         |        After
     * "Global"           , 10|@string/network_global  , 27
     * "LTE / CDMA"       , 8 |"LTE / CDMA"            , 8
     * "LTE / GSM / UMTS" , 9 |"LTE / GSM / UMTS"      , 9
     */
    @Test
    public void add5gListItem_worldPhone_Global() {
        mPreference.setEntries(R.array.preferred_network_mode_choices_world_mode);
        mPreference.setEntryValues(R.array.preferred_network_mode_values_world_mode);
        CharSequence[] testEntries = {mContext.getString(R.string.network_global)
                , "LTE / CDMA"
                , "LTE / GSM / UMTS"};
        CharSequence[] testEntryValues = {"27", "8", "9"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues);
    }

    /**
     * @string/enabled_networks_tdscdma_choices
     *         Before         |        After
     * @string/network_lte, 22|@string/network_5G + @string/network_recommended , 33
     * @string/network_3G , 18|@string/network_lte_pure, 22
     * @string/network_2G , 1 |@string/network_3G      , 18
     *                        |@string/network_2G      , 1
     */
    @Test
    public void add5gListItem_td_5gTd() {
        mPreference.setEntries(R.array.enabled_networks_tdscdma_choices);
        mPreference.setEntryValues(R.array.enabled_networks_tdscdma_values);
        CharSequence[] testEntries = {mContext.getString(R.string.network_5G)
                + mContext.getString(R.string.network_recommended)
                , mContext.getString(R.string.network_lte_pure)
                , mContext.getString(R.string.network_3G)
                , mContext.getString(R.string.network_2G)};
        CharSequence[] testEntryValues = {"33", "22", "18", "1"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues);
    }

    @Test
    public void add5gListItem_noLte_no5g() {
        mPreference.setEntries(R.array.enabled_networks_except_lte_choices);
        mPreference.setEntryValues(R.array.enabled_networks_except_lte_values);
        CharSequence[] testEntries = {mContext.getString(R.string.network_3G)
                , mContext.getString(R.string.network_2G)};
        CharSequence[] testEntryValues = {"0", "1"};

        mController.add5gListItem(mPreference);

        assertThat(mPreference.getEntries()).isEqualTo(testEntries);
        assertThat(mPreference.getEntryValues()).isEqualTo(testEntryValues);
    }

    @Test
    public void onPreferenceChange_updateSuccess() {
        doReturn(true).when(mTelephonyManager).setPreferredNetworkType(SUB_ID,