Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb624a31 authored by Charlotte Lu's avatar Charlotte Lu Committed by Android (Google) Code Review
Browse files

Merge "Add SettingsExposedDropdownMenuCheckBox....

Merge "Add SettingsExposedDropdownMenuCheckBox. SettingsExposedDropdownMenuCheckBox requires input index." into main
parents b158ef82 7e74f4c8
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -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,
+30 −1
Original line number Diff line number Diff line
@@ -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 = "",
@@ -66,3 +70,28 @@ data class ApnData(
    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
}
+91 −18
Original line number Diff line number Diff line
@@ -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,8 +55,12 @@ 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(
    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,
@@ -59,6 +69,7 @@ class ApnEditPageProviderTest {
            apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
            apnEnable = true
        )
    )

    @Test
    fun apnEditPageProvider_name() {
@@ -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()
    }
}
 No newline at end of file