From 5fcb8ee011fb1b1339efb5c016f5fc4d259cc8cc Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Fri, 17 Jan 2020 05:12:04 +0800 Subject: [PATCH] [Settings] Support default value for APN protocol Add default value on APN (roaming) protocol based on configuration when user leave it empty during editing APN. Bug: 142440775 Test: manual Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=ApnEditorTest Change-Id: I3f1ca0ef17ceaaf2a94b21b6034cd74e56081b61 --- .../android/settings/network/ApnEditor.java | 38 +++++++++- .../settings/network/ApnEditorTest.java | 76 ++++++++++--------- 2 files changed, 75 insertions(+), 39 deletions(-) diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java index 326d44be472..091e7f5f3dd 100644 --- a/src/com/android/settings/network/ApnEditor.java +++ b/src/com/android/settings/network/ApnEditor.java @@ -137,6 +137,10 @@ public class ApnEditor extends SettingsPreferenceFragment String[] mReadOnlyApnTypes; @VisibleForTesting String[] mDefaultApnTypes; + @VisibleForTesting + String mDefaultApnProtocol; + @VisibleForTesting + String mDefaultApnRoamingProtocol; private String[] mReadOnlyApnFields; private boolean mReadOnlyApn; private Uri mCarrierUri; @@ -241,12 +245,14 @@ public class ApnEditor extends SettingsPreferenceFragment private static final int AUTH_TYPE_INDEX = 14; @VisibleForTesting static final int TYPE_INDEX = 15; - private static final int PROTOCOL_INDEX = 16; + @VisibleForTesting + static final int PROTOCOL_INDEX = 16; @VisibleForTesting static final int CARRIER_ENABLED_INDEX = 17; private static final int BEARER_INDEX = 18; private static final int BEARER_BITMASK_INDEX = 19; - private static final int ROAMING_PROTOCOL_INDEX = 20; + @VisibleForTesting + static final int ROAMING_PROTOCOL_INDEX = 20; private static final int MVNO_TYPE_INDEX = 21; private static final int MVNO_MATCH_DATA_INDEX = 22; private static final int EDITED_INDEX = 23; @@ -317,6 +323,19 @@ public class ApnEditor extends SettingsPreferenceFragment if (!ArrayUtils.isEmpty(mDefaultApnTypes)) { Log.d(TAG, "onCreate: default apn types: " + Arrays.toString(mDefaultApnTypes)); } + + mDefaultApnProtocol = b.getString( + CarrierConfigManager.Apn.KEY_SETTINGS_DEFAULT_PROTOCOL_STRING); + if (!TextUtils.isEmpty(mDefaultApnProtocol)) { + Log.d(TAG, "onCreate: default apn protocol: " + mDefaultApnProtocol); + } + + mDefaultApnRoamingProtocol = b.getString( + CarrierConfigManager.Apn.KEY_SETTINGS_DEFAULT_ROAMING_PROTOCOL_STRING); + if (!TextUtils.isEmpty(mDefaultApnRoamingProtocol)) { + Log.d(TAG, "onCreate: default apn roaming protocol: " + + mDefaultApnRoamingProtocol); + } } } @@ -1029,13 +1048,13 @@ public class ApnEditor extends SettingsPreferenceFragment callUpdate = setStringValueAndCheckIfDiff(values, Telephony.Carriers.PROTOCOL, - checkNotSet(mProtocol.getValue()), + getUserEnteredApnProtocol(mProtocol, mDefaultApnProtocol), callUpdate, PROTOCOL_INDEX); callUpdate = setStringValueAndCheckIfDiff(values, Telephony.Carriers.ROAMING_PROTOCOL, - checkNotSet(mRoamingProtocol.getValue()), + getUserEnteredApnProtocol(mRoamingProtocol, mDefaultApnRoamingProtocol), callUpdate, ROAMING_PROTOCOL_INDEX); @@ -1231,6 +1250,17 @@ public class ApnEditor extends SettingsPreferenceFragment return sNotSet.equals(value) ? null : value; } + @VisibleForTesting + String getUserEnteredApnProtocol(ListPreference preference, String defaultApnProtocol) { + // if user has not specified a protocol or enter empty type, map it just for default + final String userEnteredApnProtocol = checkNotSet( + ((preference == null) ? null : preference.getValue())); + if (TextUtils.isEmpty(userEnteredApnProtocol)) { + return defaultApnProtocol; + } + return userEnteredApnProtocol.trim(); + } + @VisibleForTesting String getUserEnteredApnType() { // if user has not specified a type, map it to "ALL APN TYPES THAT ARE NOT READ-ONLY" diff --git a/tests/robotests/src/com/android/settings/network/ApnEditorTest.java b/tests/robotests/src/com/android/settings/network/ApnEditorTest.java index 3aa6a6f88ed..e291a437656 100644 --- a/tests/robotests/src/com/android/settings/network/ApnEditorTest.java +++ b/tests/robotests/src/com/android/settings/network/ApnEditorTest.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.ContentValues; @@ -57,7 +56,6 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -246,7 +244,6 @@ public class ApnEditorTest { @Test public void testValidateApnData_validData_shouldReturnNull() { // GIVEN a valid apn data - mApnEditorUT.mApnData = new FakeApnData(APN_DATA); mApnEditorUT.fillUI(true /* firstTime */); // WHEN validate the apn data @@ -259,9 +256,7 @@ public class ApnEditorTest { @Test public void testValidateApn_apnNameNotSet_shouldReturnErrorMessage() { // GIVEN a apn data without the apn name - final FakeApnData apnData = new FakeApnData(APN_DATA); - apnData.mData[ApnEditor.NAME_INDEX] = ""; - mApnEditorUT.mApnData = apnData; + mApnEditorUT.mApnData.mData[ApnEditor.NAME_INDEX] = ""; mApnEditorUT.fillUI(true /* firstTime */); // THEN validate the apn data @@ -274,9 +269,7 @@ public class ApnEditorTest { @Test public void testValidateApnData_apnNotSet_shouldReturnErrorMessage() { // GIVEN a apn data without the apn - final FakeApnData apnData = new FakeApnData(APN_DATA); - apnData.mData[ApnEditor.APN_INDEX] = ""; - mApnEditorUT.mApnData = apnData; + mApnEditorUT.mApnData.mData[ApnEditor.APN_INDEX] = ""; mApnEditorUT.fillUI(true /* firstTime */); // THEN validate the apn data @@ -288,11 +281,8 @@ public class ApnEditorTest { @Test public void testValidateApnData_mccInvalid_shouldReturnErrorMessage() { - // GIVEN a apn data with invalid mcc - final FakeApnData apnData = new FakeApnData(APN_DATA); // The length of the mcc should be 3 - apnData.mData[ApnEditor.MCC_INDEX] = "1324"; - mApnEditorUT.mApnData = apnData; + mApnEditorUT.mApnData.mData[ApnEditor.MCC_INDEX] = "1324"; mApnEditorUT.fillUI(true /* firstTime */); // WHEN validate the apn data @@ -305,10 +295,8 @@ public class ApnEditorTest { @Test public void testValidateApnData_mncInvalid_shouldReturnErrorMessage() { // GIVEN an apn data with invalid mnc - final FakeApnData apnData = new FakeApnData(APN_DATA); // The length of the mnc should be 2 or 3 - apnData.mData[ApnEditor.MNC_INDEX] = "1324"; - mApnEditorUT.mApnData = apnData; + mApnEditorUT.mApnData.mData[ApnEditor.MNC_INDEX] = "1324"; mApnEditorUT.fillUI(true /* firstTime */); // WHEN validate the apn data @@ -321,7 +309,6 @@ public class ApnEditorTest { @Test public void testSaveApnData_pressBackButtonWithValidApnData_shouldSaveApnData() { // GIVEN a valid apn data - mApnEditorUT.mApnData = new FakeApnData(APN_DATA); mApnEditorUT.fillUI(true /* firstTime */); // WHEN press the back button @@ -336,7 +323,6 @@ public class ApnEditorTest { @Test public void testSaveApnData_pressSaveButtonWithValidApnData_shouldSaveApnData() { // GIVEN a valid apn data - mApnEditorUT.mApnData = new FakeApnData(APN_DATA); mApnEditorUT.fillUI(true /* firstTime */); // WHEN press the save button @@ -353,10 +339,8 @@ public class ApnEditorTest { @Test public void testSaveApnData_apnDataInvalid_shouldNotSaveApnData() { // GIVEN an invalid apn data - final FakeApnData apnData = new FakeApnData(APN_DATA); // The valid apn data should contains a non-empty apn name - apnData.mData[ApnEditor.NAME_INDEX] = ""; - mApnEditorUT.mApnData = apnData; + mApnEditorUT.mApnData.mData[ApnEditor.NAME_INDEX] = ""; mApnEditorUT.fillUI(true /* firstTime */); // WHEN press the save button @@ -474,20 +458,46 @@ public class ApnEditorTest { verify(mApnEditorUT).finish(); } + @Test + public void getUserEnteredApnProtocol_emptyApnProtocol_shouldReturnDefaultIPv4v6() { + // GIVEN read default APN protocol with IPV4V6 + mApnEditorUT.mDefaultApnProtocol = "IPV4V6"; + + // Input empty in TYPE + mApnEditorUT.mApnData.mData[ApnEditor.PROTOCOL_INDEX] = ""; + mApnEditorUT.fillUI(true /* firstTime */); + + // THEN APN type should be IPV4V6 + assertThat(mApnEditorUT.getUserEnteredApnProtocol( + mApnEditorUT.mProtocol, mApnEditorUT.mDefaultApnProtocol)) + .isEqualTo("IPV4V6"); + } + + @Test + public void getUserEnteredApnProtocol_emptyApnProtocol_shouldReturnDefaultIP() { + // GIVEN read default APN protocol with IP + mApnEditorUT.mDefaultApnProtocol = "IP"; + + // Input empty in TYPE + mApnEditorUT.mApnData.mData[ApnEditor.PROTOCOL_INDEX] = ""; + mApnEditorUT.fillUI(true /* firstTime */); + + // THEN APN type should be IPV4V6 + assertThat(mApnEditorUT.getUserEnteredApnProtocol( + mApnEditorUT.mProtocol, mApnEditorUT.mDefaultApnProtocol)) + .isEqualTo("IP"); + } + @Test public void getUserEnteredApnType_emptyApnType_shouldReturnDefault() { // case 1 // GIVEN read only APN types with DUN - String[] readOnlyApnTypes = {"dun"}; - mApnEditorUT.mReadOnlyApnTypes = readOnlyApnTypes; + mApnEditorUT.mReadOnlyApnTypes = new String [] {"dun"}; // GIVEN read specificApnTypeForEmptyInput with DEFAULT,DUN - String[] defaultApnTypes = {"default", "dun"}; - mApnEditorUT.mDefaultApnTypes = defaultApnTypes; + mApnEditorUT.mDefaultApnTypes = new String [] {"default", "dun"}; // Input empty in TYPE - final FakeApnData apnData = new FakeApnData(APN_DATA); - apnData.mData[ApnEditor.TYPE_INDEX] = ""; - mApnEditorUT.mApnData = apnData; + mApnEditorUT.mApnData.mData[ApnEditor.TYPE_INDEX] = ""; mApnEditorUT.fillUI(true /* firstTime */); // THEN APN type should be default @@ -495,16 +505,12 @@ public class ApnEditorTest { // case 2 // GIVEN read only APN types with DUN - String[] readOnlyApnTypesCase2 = {"dun"}; - mApnEditorUT.mReadOnlyApnTypes = readOnlyApnTypesCase2; + mApnEditorUT.mReadOnlyApnTypes = new String [] {"dun"}; // GIVEN read specificApnTypeForEmptyInput with DEFAULT - String[] defaultApnTypesCase2 = {"default"}; - mApnEditorUT.mDefaultApnTypes = defaultApnTypesCase2; + mApnEditorUT.mDefaultApnTypes = new String [] {"default"}; // Input empty in TYPE - final FakeApnData apnDataCase2 = new FakeApnData(APN_DATA); - apnDataCase2.mData[ApnEditor.TYPE_INDEX] = ""; - mApnEditorUT.mApnData = apnDataCase2; + mApnEditorUT.mApnData.mData[ApnEditor.TYPE_INDEX] = ""; mApnEditorUT.fillUI(true /* firstTime */); // THEN APN type should be default