Loading res/values/arrays.xml +55 −0 Original line number Diff line number Diff line Loading @@ -416,6 +416,61 @@ <item>20</item> </string-array> <!-- Network type used in APN editor --> <string-array name="network_type_entries"> <item>Unspecified</item> <item>LTE</item> <item>HSPAP</item> <item>HSPA</item> <item>HSUPA</item> <item>HSDPA</item> <item>UMTS</item> <item>EDGE</item> <item>GPRS</item> <item>eHRPD</item> <item>EVDO_B</item> <item>EVDO_A</item> <item>EVDO_0</item> <item>1xRTT</item> <item>CDMA</item> <item>NR</item> </string-array> <string-array translatable="false" name="network_type_values"> <!-- Do not translate. --> <item>0</item> <!-- Do not translate. --> <item>13</item> <!-- Do not translate. --> <item>15</item> <!-- Do not translate. --> <item>10</item> <!-- Do not translate. --> <item>9</item> <!-- Do not translate. --> <item>8</item> <!-- Do not translate. --> <item>3</item> <!-- Do not translate. --> <item>2</item> <!-- Do not translate. --> <item>1</item> <!-- Do not translate. --> <item>14</item> <!-- Do not translate. --> <item>12</item> <!-- Do not translate. --> <item>6</item> <!-- Do not translate. --> <item>5</item> <!-- Do not translate. --> <item>7</item> <!-- Do not translate. --> <item>4</item> <!-- Do not translate. --> <item>20</item> </string-array> <!-- MVNO Info used in APN editor --> <string-array name="mvno_type_entries"> <item>None</item> Loading res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -3121,6 +3121,8 @@ <string name="carrier_enabled_summaryOff">APN disabled</string> <!-- Edit Beaerer Info of APN --> <string name="bearer">Bearer</string> <!-- Edit Network Type Info of APN --> <string name="network_type">Network type</string> <!-- Edit Mvno Type Info of APN --> <string name="mvno_type">MVNO type</string> <!-- Edit Mvno Match Data Info of APN --> Loading src/com/android/settings/network/apn/ApnEditPageProvider.kt +10 −10 Original line number Diff line number Diff line Loading @@ -88,12 +88,12 @@ fun ApnPage(apnDataCur: MutableState<ApnData>) { val context = LocalContext.current val authTypeOptions = stringArrayResource(R.array.apn_auth_entries).toList() val apnProtocolOptions = stringArrayResource(R.array.apn_protocol_entries).toList() val bearerOptionsAll = stringArrayResource(R.array.bearer_entries) val bearerOptions = bearerOptionsAll.drop(1).toList() val bearerEmptyVal = bearerOptionsAll[0] val networkTypeOptionsAll = stringArrayResource(R.array.network_type_entries) val networkTypeOptions = networkTypeOptionsAll.drop(1).toList() val networkTypeEmptyVal = networkTypeOptionsAll[0] val mvnoTypeOptions = stringArrayResource(R.array.mvno_type_entries).toList() val bearerSelectedOptionsState = remember { getBearerSelectedOptionsState(apnData.bearer, apnData.bearerBitmask, context) val networkTypeSelectedOptionsState = remember { getNetworkTypeSelectedOptionsState(apnData.networkType, context) } RegularScaffold( title = stringResource(id = R.string.apn_edit), Loading Loading @@ -196,11 +196,11 @@ fun ApnPage(apnDataCur: MutableState<ApnData>) { } ) SettingsExposedDropdownMenuCheckBox( label = stringResource(R.string.bearer), options = bearerOptions, selectedOptionsState = bearerSelectedOptionsState, emptyVal = bearerEmptyVal, enabled = apnData.bearerEnabled label = stringResource(R.string.network_type), options = networkTypeOptions, selectedOptionsState = networkTypeSelectedOptionsState, emptyVal = networkTypeEmptyVal, enabled = apnData.networkTypeEnabled ) {} SettingsExposedDropdownMenuBox( label = stringResource(R.string.mvno_type), Loading src/com/android/settings/network/apn/ApnStatus.kt +18 −23 Original line number Diff line number Diff line Loading @@ -41,10 +41,9 @@ data class ApnData( val apnProtocol: Int = -1, val apnRoaming: Int = -1, val apnEnable: Boolean = true, val bearer: Int = 0, val networkType: Int = 0, val mvnoType: Int = -1, var mvnoValue: String = "", val bearerBitmask: Int = 0, val edited: Int = Telephony.Carriers.USER_EDITED, val userEditable: Int = 1, val carrierId: Int = TelephonyManager.UNKNOWN_CARRIER_ID Loading @@ -66,40 +65,36 @@ data class ApnData( var apnProtocolEnabled = true var apnRoamingEnabled = true var apnEnableEnabled = true var bearerEnabled = true var networkTypeEnabled = true var mvnoTypeEnabled = true var mvnoValueEnabled = false } /** * Initialize the selected Bearer Selected Options according to bearer. * @param bearer Initialized bearer options. * @param bearerBitmask Initialized bearer bitmask, often multiple bearer options may be included. * @param context The context to get bearerValues. * Initialize the selected Network type Selected Options according to network type. * @param networkType Initialized network type bitmask, often multiple network type options may be included. * @param context The context to get network type values. * * @return An error message if the apn data is invalid, otherwise return null. */ fun getBearerSelectedOptionsState( bearer: Int, bearerBitmask: Int, fun getNetworkTypeSelectedOptionsState( networkType: Int, context: Context ): SnapshotStateList<Int> { val bearerValues = context.resources.getStringArray(R.array.bearer_values) val bearerSelectedOptionsState = mutableStateListOf<Int>() if (bearerBitmask != 0) { val networkTypeValues = context.resources.getStringArray(R.array.network_type_values) val networkTypeSelectedOptionsState = mutableStateListOf<Int>() if (networkType != 0) { var i = 1 var _bearerBitmask = bearerBitmask while (_bearerBitmask != 0) { if (_bearerBitmask and 1 == 1 && !bearerSelectedOptionsState.contains(i)) { bearerSelectedOptionsState.add(bearerValues.indexOf("$i") - 1) var networkTypeBitMask = networkType while (networkTypeBitMask != 0) { if (networkTypeBitMask and 1 == 1 && !networkTypeSelectedOptionsState.contains(i)) { networkTypeSelectedOptionsState.add(networkTypeValues.indexOf("$i") - 1) } _bearerBitmask = _bearerBitmask shr 1 networkTypeBitMask = networkTypeBitMask shr 1 i++ } } if (bearer != 0 && !bearerSelectedOptionsState.contains(bearer)) { // add mBearerInitialVal to bearers bearerSelectedOptionsState.add(bearerValues.indexOf("$bearer") - 1) } return bearerSelectedOptionsState return networkTypeSelectedOptionsState } tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt +20 −20 Original line number Diff line number Diff line Loading @@ -57,8 +57,8 @@ class ApnEditPageProviderTest { private val apnEnable = context.resources.getString(R.string.carrier_enabled) private val apnProtocolOptions = context.resources.getStringArray(R.array.apn_protocol_entries).toList() private val bearer = context.resources.getString(R.string.bearer) private val bearerOptions = context.resources.getStringArray(R.array.bearer_entries).toList() private val networkType = context.resources.getString(R.string.network_type) private val networkTypeOptions = context.resources.getStringArray(R.array.network_type_entries).toList() private val passwordTitle = context.resources.getString(R.string.apn_password) private val apnData = mutableStateOf( ApnData( Loading Loading @@ -195,19 +195,19 @@ class ApnEditPageProviderTest { } @Test fun bearer_displayed() { fun network_type_displayed() { composeTestRule.setContent { ApnPage(remember { apnData }) } composeTestRule.onRoot().onChild().onChildAt(0) .performScrollToNode(hasText(bearer, true)) composeTestRule.onNodeWithText(bearer, true).assertIsDisplayed() .performScrollToNode(hasText(networkType, true)) composeTestRule.onNodeWithText(networkType, true).assertIsDisplayed() } @Test fun bearer_changed() { fun network_type_changed() { var apnDataa: MutableState<ApnData> = apnData composeTestRule.setContent { apnDataa = remember { Loading @@ -216,15 +216,15 @@ class ApnEditPageProviderTest { ApnPage(apnDataa) } composeTestRule.onRoot().onChild().onChildAt(0) .performScrollToNode(hasText(bearer, true)) composeTestRule.onNodeWithText(bearer, true).performClick() composeTestRule.onNodeWithText(bearerOptions[1], true).performClick() composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertIsDisplayed() .performScrollToNode(hasText(networkType, true)) composeTestRule.onNodeWithText(networkType, true).performClick() composeTestRule.onNodeWithText(networkTypeOptions[1], true).performClick() composeTestRule.onNode(hasText(networkTypeOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(networkTypeOptions[1]) and isFocused(), true).assertIsDisplayed() } @Test fun bearer_changed_back2Default() { fun network_type_changed_back2Default() { var apnDataa: MutableState<ApnData> = apnData composeTestRule.setContent { apnDataa = remember { Loading @@ -233,14 +233,14 @@ class ApnEditPageProviderTest { ApnPage(apnDataa) } composeTestRule.onRoot().onChild().onChildAt(0) .performScrollToNode(hasText(bearer, true)) composeTestRule.onNodeWithText(bearer, true).performClick() composeTestRule.onNodeWithText(bearerOptions[1], true).performClick() composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertIsDisplayed() composeTestRule.onAllNodesWithText(bearerOptions[1], true).onLast().performClick() composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertIsDisplayed() composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertDoesNotExist() .performScrollToNode(hasText(networkType, true)) composeTestRule.onNodeWithText(networkType, true).performClick() composeTestRule.onNodeWithText(networkTypeOptions[1], true).performClick() composeTestRule.onNode(hasText(networkTypeOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(networkTypeOptions[1]) and isFocused(), true).assertIsDisplayed() composeTestRule.onAllNodesWithText(networkTypeOptions[1], true).onLast().performClick() composeTestRule.onNode(hasText(networkTypeOptions[0]) and isFocused(), true).assertIsDisplayed() composeTestRule.onNode(hasText(networkTypeOptions[1]) and isFocused(), true).assertDoesNotExist() } @Test Loading Loading
res/values/arrays.xml +55 −0 Original line number Diff line number Diff line Loading @@ -416,6 +416,61 @@ <item>20</item> </string-array> <!-- Network type used in APN editor --> <string-array name="network_type_entries"> <item>Unspecified</item> <item>LTE</item> <item>HSPAP</item> <item>HSPA</item> <item>HSUPA</item> <item>HSDPA</item> <item>UMTS</item> <item>EDGE</item> <item>GPRS</item> <item>eHRPD</item> <item>EVDO_B</item> <item>EVDO_A</item> <item>EVDO_0</item> <item>1xRTT</item> <item>CDMA</item> <item>NR</item> </string-array> <string-array translatable="false" name="network_type_values"> <!-- Do not translate. --> <item>0</item> <!-- Do not translate. --> <item>13</item> <!-- Do not translate. --> <item>15</item> <!-- Do not translate. --> <item>10</item> <!-- Do not translate. --> <item>9</item> <!-- Do not translate. --> <item>8</item> <!-- Do not translate. --> <item>3</item> <!-- Do not translate. --> <item>2</item> <!-- Do not translate. --> <item>1</item> <!-- Do not translate. --> <item>14</item> <!-- Do not translate. --> <item>12</item> <!-- Do not translate. --> <item>6</item> <!-- Do not translate. --> <item>5</item> <!-- Do not translate. --> <item>7</item> <!-- Do not translate. --> <item>4</item> <!-- Do not translate. --> <item>20</item> </string-array> <!-- MVNO Info used in APN editor --> <string-array name="mvno_type_entries"> <item>None</item> Loading
res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -3121,6 +3121,8 @@ <string name="carrier_enabled_summaryOff">APN disabled</string> <!-- Edit Beaerer Info of APN --> <string name="bearer">Bearer</string> <!-- Edit Network Type Info of APN --> <string name="network_type">Network type</string> <!-- Edit Mvno Type Info of APN --> <string name="mvno_type">MVNO type</string> <!-- Edit Mvno Match Data Info of APN --> Loading
src/com/android/settings/network/apn/ApnEditPageProvider.kt +10 −10 Original line number Diff line number Diff line Loading @@ -88,12 +88,12 @@ fun ApnPage(apnDataCur: MutableState<ApnData>) { val context = LocalContext.current val authTypeOptions = stringArrayResource(R.array.apn_auth_entries).toList() val apnProtocolOptions = stringArrayResource(R.array.apn_protocol_entries).toList() val bearerOptionsAll = stringArrayResource(R.array.bearer_entries) val bearerOptions = bearerOptionsAll.drop(1).toList() val bearerEmptyVal = bearerOptionsAll[0] val networkTypeOptionsAll = stringArrayResource(R.array.network_type_entries) val networkTypeOptions = networkTypeOptionsAll.drop(1).toList() val networkTypeEmptyVal = networkTypeOptionsAll[0] val mvnoTypeOptions = stringArrayResource(R.array.mvno_type_entries).toList() val bearerSelectedOptionsState = remember { getBearerSelectedOptionsState(apnData.bearer, apnData.bearerBitmask, context) val networkTypeSelectedOptionsState = remember { getNetworkTypeSelectedOptionsState(apnData.networkType, context) } RegularScaffold( title = stringResource(id = R.string.apn_edit), Loading Loading @@ -196,11 +196,11 @@ fun ApnPage(apnDataCur: MutableState<ApnData>) { } ) SettingsExposedDropdownMenuCheckBox( label = stringResource(R.string.bearer), options = bearerOptions, selectedOptionsState = bearerSelectedOptionsState, emptyVal = bearerEmptyVal, enabled = apnData.bearerEnabled label = stringResource(R.string.network_type), options = networkTypeOptions, selectedOptionsState = networkTypeSelectedOptionsState, emptyVal = networkTypeEmptyVal, enabled = apnData.networkTypeEnabled ) {} SettingsExposedDropdownMenuBox( label = stringResource(R.string.mvno_type), Loading
src/com/android/settings/network/apn/ApnStatus.kt +18 −23 Original line number Diff line number Diff line Loading @@ -41,10 +41,9 @@ data class ApnData( val apnProtocol: Int = -1, val apnRoaming: Int = -1, val apnEnable: Boolean = true, val bearer: Int = 0, val networkType: Int = 0, val mvnoType: Int = -1, var mvnoValue: String = "", val bearerBitmask: Int = 0, val edited: Int = Telephony.Carriers.USER_EDITED, val userEditable: Int = 1, val carrierId: Int = TelephonyManager.UNKNOWN_CARRIER_ID Loading @@ -66,40 +65,36 @@ data class ApnData( var apnProtocolEnabled = true var apnRoamingEnabled = true var apnEnableEnabled = true var bearerEnabled = true var networkTypeEnabled = true var mvnoTypeEnabled = true var mvnoValueEnabled = false } /** * Initialize the selected Bearer Selected Options according to bearer. * @param bearer Initialized bearer options. * @param bearerBitmask Initialized bearer bitmask, often multiple bearer options may be included. * @param context The context to get bearerValues. * Initialize the selected Network type Selected Options according to network type. * @param networkType Initialized network type bitmask, often multiple network type options may be included. * @param context The context to get network type values. * * @return An error message if the apn data is invalid, otherwise return null. */ fun getBearerSelectedOptionsState( bearer: Int, bearerBitmask: Int, fun getNetworkTypeSelectedOptionsState( networkType: Int, context: Context ): SnapshotStateList<Int> { val bearerValues = context.resources.getStringArray(R.array.bearer_values) val bearerSelectedOptionsState = mutableStateListOf<Int>() if (bearerBitmask != 0) { val networkTypeValues = context.resources.getStringArray(R.array.network_type_values) val networkTypeSelectedOptionsState = mutableStateListOf<Int>() if (networkType != 0) { var i = 1 var _bearerBitmask = bearerBitmask while (_bearerBitmask != 0) { if (_bearerBitmask and 1 == 1 && !bearerSelectedOptionsState.contains(i)) { bearerSelectedOptionsState.add(bearerValues.indexOf("$i") - 1) var networkTypeBitMask = networkType while (networkTypeBitMask != 0) { if (networkTypeBitMask and 1 == 1 && !networkTypeSelectedOptionsState.contains(i)) { networkTypeSelectedOptionsState.add(networkTypeValues.indexOf("$i") - 1) } _bearerBitmask = _bearerBitmask shr 1 networkTypeBitMask = networkTypeBitMask shr 1 i++ } } if (bearer != 0 && !bearerSelectedOptionsState.contains(bearer)) { // add mBearerInitialVal to bearers bearerSelectedOptionsState.add(bearerValues.indexOf("$bearer") - 1) } return bearerSelectedOptionsState return networkTypeSelectedOptionsState }
tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt +20 −20 Original line number Diff line number Diff line Loading @@ -57,8 +57,8 @@ class ApnEditPageProviderTest { private val apnEnable = context.resources.getString(R.string.carrier_enabled) private val apnProtocolOptions = context.resources.getStringArray(R.array.apn_protocol_entries).toList() private val bearer = context.resources.getString(R.string.bearer) private val bearerOptions = context.resources.getStringArray(R.array.bearer_entries).toList() private val networkType = context.resources.getString(R.string.network_type) private val networkTypeOptions = context.resources.getStringArray(R.array.network_type_entries).toList() private val passwordTitle = context.resources.getString(R.string.apn_password) private val apnData = mutableStateOf( ApnData( Loading Loading @@ -195,19 +195,19 @@ class ApnEditPageProviderTest { } @Test fun bearer_displayed() { fun network_type_displayed() { composeTestRule.setContent { ApnPage(remember { apnData }) } composeTestRule.onRoot().onChild().onChildAt(0) .performScrollToNode(hasText(bearer, true)) composeTestRule.onNodeWithText(bearer, true).assertIsDisplayed() .performScrollToNode(hasText(networkType, true)) composeTestRule.onNodeWithText(networkType, true).assertIsDisplayed() } @Test fun bearer_changed() { fun network_type_changed() { var apnDataa: MutableState<ApnData> = apnData composeTestRule.setContent { apnDataa = remember { Loading @@ -216,15 +216,15 @@ class ApnEditPageProviderTest { ApnPage(apnDataa) } composeTestRule.onRoot().onChild().onChildAt(0) .performScrollToNode(hasText(bearer, true)) composeTestRule.onNodeWithText(bearer, true).performClick() composeTestRule.onNodeWithText(bearerOptions[1], true).performClick() composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertIsDisplayed() .performScrollToNode(hasText(networkType, true)) composeTestRule.onNodeWithText(networkType, true).performClick() composeTestRule.onNodeWithText(networkTypeOptions[1], true).performClick() composeTestRule.onNode(hasText(networkTypeOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(networkTypeOptions[1]) and isFocused(), true).assertIsDisplayed() } @Test fun bearer_changed_back2Default() { fun network_type_changed_back2Default() { var apnDataa: MutableState<ApnData> = apnData composeTestRule.setContent { apnDataa = remember { Loading @@ -233,14 +233,14 @@ class ApnEditPageProviderTest { ApnPage(apnDataa) } composeTestRule.onRoot().onChild().onChildAt(0) .performScrollToNode(hasText(bearer, true)) composeTestRule.onNodeWithText(bearer, true).performClick() composeTestRule.onNodeWithText(bearerOptions[1], true).performClick() composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertIsDisplayed() composeTestRule.onAllNodesWithText(bearerOptions[1], true).onLast().performClick() composeTestRule.onNode(hasText(bearerOptions[0]) and isFocused(), true).assertIsDisplayed() composeTestRule.onNode(hasText(bearerOptions[1]) and isFocused(), true).assertDoesNotExist() .performScrollToNode(hasText(networkType, true)) composeTestRule.onNodeWithText(networkType, true).performClick() composeTestRule.onNodeWithText(networkTypeOptions[1], true).performClick() composeTestRule.onNode(hasText(networkTypeOptions[0]) and isFocused(), true).assertDoesNotExist() composeTestRule.onNode(hasText(networkTypeOptions[1]) and isFocused(), true).assertIsDisplayed() composeTestRule.onAllNodesWithText(networkTypeOptions[1], true).onLast().performClick() composeTestRule.onNode(hasText(networkTypeOptions[0]) and isFocused(), true).assertIsDisplayed() composeTestRule.onNode(hasText(networkTypeOptions[1]) and isFocused(), true).assertDoesNotExist() } @Test Loading