From 76422cab6862e2d5898ee0eb1d9498853d8f5f04 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Fri, 30 Aug 2019 16:06:41 +0800 Subject: [PATCH] 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 Merged-In: I4a78e2e7fbb067ce841df4aaf1d5161607fdcf90 --- ...nabledNetworkModePreferenceController.java | 180 ++++++++++++++- ...edNetworkModePreferenceControllerTest.java | 217 ++++++++++++++++++ 2 files changed, 393 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index 7d53e221a0a..3abb36a7c4e 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -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 newEntries = new ArrayList<>(); + List 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 @@ -357,11 +506,34 @@ public class EnabledNetworkModePreferenceController extends || MobileNetworkUtils.isWorldMode(mContext, mSubId)) { preference.setSummary(R.string.network_global); } else { - preference.setSummary(mShow4GForLTE - ? R.string.network_4G : R.string.network_lte); + 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( mContext.getString(R.string.mobile_network_mode_error, networkMode)); diff --git a/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java index a4d708e689e..773041d0896 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceControllerTest.java @@ -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,