Merge "Add SettingsExposedDropdownMenuCheckBox. SettingsExposedDropdownMenuCheckBox requires input index." into main
This commit is contained in:
@@ -34,6 +34,7 @@ import com.android.settings.R
|
||||
import com.android.settingslib.spa.framework.common.SettingsPageProvider
|
||||
import com.android.settingslib.spa.framework.compose.stateOf
|
||||
import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuBox
|
||||
import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuCheckBox
|
||||
import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField
|
||||
import com.android.settingslib.spa.widget.preference.SwitchPreference
|
||||
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
|
||||
@@ -86,8 +87,13 @@ 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 mvnoTypeOptions = stringArrayResource(R.array.mvno_type_entries).toList()
|
||||
|
||||
val bearerSelectedOptionsState = remember {
|
||||
getBearerSelectedOptionsState(apnData.bearer, apnData.bearerBitmask, context)
|
||||
}
|
||||
RegularScaffold(
|
||||
title = stringResource(id = R.string.apn_edit),
|
||||
) {
|
||||
@@ -184,6 +190,13 @@ fun ApnPage(apnDataCur: MutableState<ApnData>) {
|
||||
}
|
||||
}
|
||||
)
|
||||
SettingsExposedDropdownMenuCheckBox(
|
||||
stringResource(R.string.bearer),
|
||||
bearerOptions,
|
||||
bearerSelectedOptionsState,
|
||||
bearerEmptyVal,
|
||||
apnData.bearerEnabled
|
||||
) {}
|
||||
SettingsExposedDropdownMenuBox(
|
||||
stringResource(R.string.mvno_type),
|
||||
mvnoTypeOptions,
|
||||
|
@@ -16,8 +16,12 @@
|
||||
|
||||
package com.android.settings.network.apn
|
||||
|
||||
import android.content.Context
|
||||
import android.provider.Telephony
|
||||
import android.telephony.TelephonyManager
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||
import com.android.settings.R
|
||||
|
||||
data class ApnData(
|
||||
val name: String = "",
|
||||
@@ -65,4 +69,29 @@ data class ApnData(
|
||||
var bearerEnabled = true
|
||||
var mvnoTypeEnabled = true
|
||||
var mvnoValueEnabled = false
|
||||
}
|
||||
}
|
||||
|
||||
fun getBearerSelectedOptionsState(
|
||||
bearer: Int,
|
||||
bearerBitmask: Int,
|
||||
context: Context
|
||||
): SnapshotStateList<Int> {
|
||||
val bearerValues = context.resources.getStringArray(R.array.bearer_values)
|
||||
val bearerSelectedOptionsState = mutableStateListOf<Int>()
|
||||
if (bearerBitmask != 0) {
|
||||
var i = 1
|
||||
var _bearerBitmask = bearerBitmask
|
||||
while (_bearerBitmask != 0) {
|
||||
if (_bearerBitmask and 1 == 1 && !bearerSelectedOptionsState.contains(i)) {
|
||||
bearerSelectedOptionsState.add(bearerValues.indexOf("$i") - 1)
|
||||
}
|
||||
_bearerBitmask = _bearerBitmask shr 1
|
||||
i++
|
||||
}
|
||||
}
|
||||
if (bearer != 0 && !bearerSelectedOptionsState.contains(bearer)) {
|
||||
// add mBearerInitialVal to bearers
|
||||
bearerSelectedOptionsState.add(bearerValues.indexOf("$bearer") - 1)
|
||||
}
|
||||
return bearerSelectedOptionsState
|
||||
}
|
||||
|
@@ -17,16 +17,22 @@
|
||||
package com.android.settings.network.apn
|
||||
|
||||
import android.content.Context
|
||||
import androidx.compose.runtime.MutableState
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.test.assertIsDisplayed
|
||||
import androidx.compose.ui.test.assertIsOff
|
||||
import androidx.compose.ui.test.assertIsOn
|
||||
import androidx.compose.ui.test.hasText
|
||||
import androidx.compose.ui.test.isFocused
|
||||
import androidx.compose.ui.test.junit4.createComposeRule
|
||||
import androidx.compose.ui.test.onAllNodesWithText
|
||||
import androidx.compose.ui.test.onChild
|
||||
import androidx.compose.ui.test.onChildAt
|
||||
import androidx.compose.ui.test.onLast
|
||||
import androidx.compose.ui.test.onNodeWithText
|
||||
import androidx.compose.ui.test.onRoot
|
||||
import androidx.compose.ui.test.performClick
|
||||
import androidx.compose.ui.test.performScrollToNode
|
||||
import androidx.test.core.app.ApplicationProvider
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
@@ -49,15 +55,20 @@ class ApnEditPageProviderTest {
|
||||
private val apnType = "apn_type"
|
||||
private val apnRoaming = "IPv4"
|
||||
private val apnEnable = context.resources.getString(R.string.carrier_enabled)
|
||||
private val apnProtocolOptions = context.resources.getStringArray(R.array.apn_protocol_entries).toList()
|
||||
private val apnData = ApnData(
|
||||
name = apnName,
|
||||
mmsc = mmsc,
|
||||
mmsProxy = mmsProxy,
|
||||
mnc = mnc,
|
||||
apnType = apnType,
|
||||
apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
|
||||
apnEnable = true
|
||||
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 apnData = mutableStateOf(
|
||||
ApnData(
|
||||
name = apnName,
|
||||
mmsc = mmsc,
|
||||
mmsProxy = mmsProxy,
|
||||
mnc = mnc,
|
||||
apnType = apnType,
|
||||
apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
|
||||
apnEnable = true
|
||||
)
|
||||
)
|
||||
|
||||
@Test
|
||||
@@ -69,7 +80,7 @@ class ApnEditPageProviderTest {
|
||||
fun title_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed()
|
||||
@@ -79,7 +90,7 @@ class ApnEditPageProviderTest {
|
||||
fun name_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onNodeWithText(apnName, true).assertIsDisplayed()
|
||||
@@ -89,7 +100,7 @@ class ApnEditPageProviderTest {
|
||||
fun mmsc_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
@@ -101,7 +112,7 @@ class ApnEditPageProviderTest {
|
||||
fun mms_proxy_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
@@ -113,7 +124,7 @@ class ApnEditPageProviderTest {
|
||||
fun mnc_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
@@ -125,7 +136,7 @@ class ApnEditPageProviderTest {
|
||||
fun apn_type_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
@@ -137,7 +148,7 @@ class ApnEditPageProviderTest {
|
||||
fun apn_roaming_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
@@ -149,7 +160,7 @@ class ApnEditPageProviderTest {
|
||||
fun carrier_enabled_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
@@ -161,11 +172,73 @@ class ApnEditPageProviderTest {
|
||||
fun carrier_enabled_isChecked() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
mutableStateOf(apnData)
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
.performScrollToNode(hasText(apnEnable, true))
|
||||
composeTestRule.onNodeWithText(apnEnable, true).assertIsOn()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun carrier_enabled_checkChanged() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
.performScrollToNode(hasText(apnEnable, true))
|
||||
composeTestRule.onNodeWithText(apnEnable, true).performClick()
|
||||
composeTestRule.onNodeWithText(apnEnable, true).assertIsOff()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bearer_displayed() {
|
||||
composeTestRule.setContent {
|
||||
ApnPage(remember {
|
||||
apnData
|
||||
})
|
||||
}
|
||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||
.performScrollToNode(hasText(bearer, true))
|
||||
composeTestRule.onNodeWithText(bearer, true).assertIsDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bearer_changed() {
|
||||
var apnDataa: MutableState<ApnData> = apnData
|
||||
composeTestRule.setContent {
|
||||
apnDataa = remember {
|
||||
apnData
|
||||
}
|
||||
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()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bearer_changed_back2Default() {
|
||||
var apnDataa: MutableState<ApnData> = apnData
|
||||
composeTestRule.setContent {
|
||||
apnDataa = remember {
|
||||
apnData
|
||||
}
|
||||
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()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user