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.common.SettingsPageProvider
|
||||||
import com.android.settingslib.spa.framework.compose.stateOf
|
import com.android.settingslib.spa.framework.compose.stateOf
|
||||||
import com.android.settingslib.spa.widget.editor.SettingsExposedDropdownMenuBox
|
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.editor.SettingsOutlinedTextField
|
||||||
import com.android.settingslib.spa.widget.preference.SwitchPreference
|
import com.android.settingslib.spa.widget.preference.SwitchPreference
|
||||||
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
|
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
|
||||||
@@ -86,8 +87,13 @@ fun ApnPage(apnDataCur: MutableState<ApnData>) {
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val authTypeOptions = stringArrayResource(R.array.apn_auth_entries).toList()
|
val authTypeOptions = stringArrayResource(R.array.apn_auth_entries).toList()
|
||||||
val apnProtocolOptions = stringArrayResource(R.array.apn_protocol_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 mvnoTypeOptions = stringArrayResource(R.array.mvno_type_entries).toList()
|
||||||
|
val bearerSelectedOptionsState = remember {
|
||||||
|
getBearerSelectedOptionsState(apnData.bearer, apnData.bearerBitmask, context)
|
||||||
|
}
|
||||||
RegularScaffold(
|
RegularScaffold(
|
||||||
title = stringResource(id = R.string.apn_edit),
|
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(
|
SettingsExposedDropdownMenuBox(
|
||||||
stringResource(R.string.mvno_type),
|
stringResource(R.string.mvno_type),
|
||||||
mvnoTypeOptions,
|
mvnoTypeOptions,
|
||||||
|
@@ -16,8 +16,12 @@
|
|||||||
|
|
||||||
package com.android.settings.network.apn
|
package com.android.settings.network.apn
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.provider.Telephony
|
import android.provider.Telephony
|
||||||
import android.telephony.TelephonyManager
|
import android.telephony.TelephonyManager
|
||||||
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
|
import androidx.compose.runtime.snapshots.SnapshotStateList
|
||||||
|
import com.android.settings.R
|
||||||
|
|
||||||
data class ApnData(
|
data class ApnData(
|
||||||
val name: String = "",
|
val name: String = "",
|
||||||
@@ -65,4 +69,29 @@ data class ApnData(
|
|||||||
var bearerEnabled = true
|
var bearerEnabled = true
|
||||||
var mvnoTypeEnabled = true
|
var mvnoTypeEnabled = true
|
||||||
var mvnoValueEnabled = false
|
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
|
package com.android.settings.network.apn
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import androidx.compose.runtime.MutableState
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.test.assertIsDisplayed
|
import androidx.compose.ui.test.assertIsDisplayed
|
||||||
|
import androidx.compose.ui.test.assertIsOff
|
||||||
import androidx.compose.ui.test.assertIsOn
|
import androidx.compose.ui.test.assertIsOn
|
||||||
import androidx.compose.ui.test.hasText
|
import androidx.compose.ui.test.hasText
|
||||||
|
import androidx.compose.ui.test.isFocused
|
||||||
import androidx.compose.ui.test.junit4.createComposeRule
|
import androidx.compose.ui.test.junit4.createComposeRule
|
||||||
|
import androidx.compose.ui.test.onAllNodesWithText
|
||||||
import androidx.compose.ui.test.onChild
|
import androidx.compose.ui.test.onChild
|
||||||
import androidx.compose.ui.test.onChildAt
|
import androidx.compose.ui.test.onChildAt
|
||||||
|
import androidx.compose.ui.test.onLast
|
||||||
import androidx.compose.ui.test.onNodeWithText
|
import androidx.compose.ui.test.onNodeWithText
|
||||||
import androidx.compose.ui.test.onRoot
|
import androidx.compose.ui.test.onRoot
|
||||||
|
import androidx.compose.ui.test.performClick
|
||||||
import androidx.compose.ui.test.performScrollToNode
|
import androidx.compose.ui.test.performScrollToNode
|
||||||
import androidx.test.core.app.ApplicationProvider
|
import androidx.test.core.app.ApplicationProvider
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
@@ -49,15 +55,20 @@ class ApnEditPageProviderTest {
|
|||||||
private val apnType = "apn_type"
|
private val apnType = "apn_type"
|
||||||
private val apnRoaming = "IPv4"
|
private val apnRoaming = "IPv4"
|
||||||
private val apnEnable = context.resources.getString(R.string.carrier_enabled)
|
private val apnEnable = context.resources.getString(R.string.carrier_enabled)
|
||||||
private val apnProtocolOptions = context.resources.getStringArray(R.array.apn_protocol_entries).toList()
|
private val apnProtocolOptions =
|
||||||
private val apnData = ApnData(
|
context.resources.getStringArray(R.array.apn_protocol_entries).toList()
|
||||||
name = apnName,
|
private val bearer = context.resources.getString(R.string.bearer)
|
||||||
mmsc = mmsc,
|
private val bearerOptions = context.resources.getStringArray(R.array.bearer_entries).toList()
|
||||||
mmsProxy = mmsProxy,
|
private val apnData = mutableStateOf(
|
||||||
mnc = mnc,
|
ApnData(
|
||||||
apnType = apnType,
|
name = apnName,
|
||||||
apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
|
mmsc = mmsc,
|
||||||
apnEnable = true
|
mmsProxy = mmsProxy,
|
||||||
|
mnc = mnc,
|
||||||
|
apnType = apnType,
|
||||||
|
apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
|
||||||
|
apnEnable = true
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -69,7 +80,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun title_displayed() {
|
fun title_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed()
|
composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed()
|
||||||
@@ -79,7 +90,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun name_displayed() {
|
fun name_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onNodeWithText(apnName, true).assertIsDisplayed()
|
composeTestRule.onNodeWithText(apnName, true).assertIsDisplayed()
|
||||||
@@ -89,7 +100,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun mmsc_displayed() {
|
fun mmsc_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
@@ -101,7 +112,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun mms_proxy_displayed() {
|
fun mms_proxy_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
@@ -113,7 +124,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun mnc_displayed() {
|
fun mnc_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
@@ -125,7 +136,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun apn_type_displayed() {
|
fun apn_type_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
@@ -137,7 +148,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun apn_roaming_displayed() {
|
fun apn_roaming_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
@@ -149,7 +160,7 @@ class ApnEditPageProviderTest {
|
|||||||
fun carrier_enabled_displayed() {
|
fun carrier_enabled_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
@@ -161,11 +172,73 @@ class ApnEditPageProviderTest {
|
|||||||
fun carrier_enabled_isChecked() {
|
fun carrier_enabled_isChecked() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(remember {
|
ApnPage(remember {
|
||||||
mutableStateOf(apnData)
|
apnData
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(apnEnable, true))
|
.performScrollToNode(hasText(apnEnable, true))
|
||||||
composeTestRule.onNodeWithText(apnEnable, true).assertIsOn()
|
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