From 7e74f4c8ad9eab77c59cad620320b4a0af95fdcb Mon Sep 17 00:00:00 2001 From: Charlotte Lu Date: Thu, 21 Sep 2023 17:29:14 +0800 Subject: [PATCH] Add SettingsExposedDropdownMenuCheckBox. SettingsExposedDropdownMenuCheckBox requires input index. Bug: 298906796 Test: Munual Change-Id: I6059bd5371a2472fbbb9a6b0aa83be769f90264e --- .../network/apn/ApnEditPageProvider.kt | 15 ++- .../android/settings/network/apn/ApnStatus.kt | 31 ++++- .../network/apn/ApnEditPageProviderTest.kt | 109 +++++++++++++++--- 3 files changed, 135 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/network/apn/ApnEditPageProvider.kt b/src/com/android/settings/network/apn/ApnEditPageProvider.kt index 90d96c6b795..f2c33258e7f 100644 --- a/src/com/android/settings/network/apn/ApnEditPageProvider.kt +++ b/src/com/android/settings/network/apn/ApnEditPageProvider.kt @@ -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) { 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) { } } ) + SettingsExposedDropdownMenuCheckBox( + stringResource(R.string.bearer), + bearerOptions, + bearerSelectedOptionsState, + bearerEmptyVal, + apnData.bearerEnabled + ) {} SettingsExposedDropdownMenuBox( stringResource(R.string.mvno_type), mvnoTypeOptions, diff --git a/src/com/android/settings/network/apn/ApnStatus.kt b/src/com/android/settings/network/apn/ApnStatus.kt index 7f4c297c131..06d8cfb83da 100644 --- a/src/com/android/settings/network/apn/ApnStatus.kt +++ b/src/com/android/settings/network/apn/ApnStatus.kt @@ -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 -} \ No newline at end of file +} + +fun getBearerSelectedOptionsState( + bearer: Int, + bearerBitmask: Int, + context: Context +): SnapshotStateList { + val bearerValues = context.resources.getStringArray(R.array.bearer_values) + val bearerSelectedOptionsState = mutableStateListOf() + 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 +} diff --git a/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt index 590fe9e6875..0d2dcef9b64 100644 --- a/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt @@ -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 + 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 + 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