Loading src/com/android/settings/network/apn/ApnEditPageProvider.kt +78 −5 Original line number Diff line number Diff line Loading @@ -16,16 +16,20 @@ package com.android.settings.network.apn import android.content.Context import android.net.Uri import android.os.Bundle import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import androidx.navigation.NavType import androidx.navigation.navArgument import com.android.settings.R import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField import com.android.settingslib.spa.widget.scaffold.RegularScaffold import java.util.Base64 Loading @@ -51,8 +55,8 @@ object ApnEditPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { val context = LocalContext.current ApnPage(context) val apnDataInit = ApnData() ApnPage(apnDataInit) } fun getRoute( Loading @@ -67,9 +71,78 @@ object ApnEditPageProvider : SettingsPageProvider { } @Composable fun ApnPage(context: Context) { fun ApnPage(apnDataInit: ApnData) { var apnData by remember { mutableStateOf(apnDataInit) } RegularScaffold( title = stringResource(id = R.string.apn_edit), ) { Column() { SettingsOutlinedTextField( apnData.name, stringResource(R.string.apn_name), enabled = apnData.nameEnabled ) { apnData = apnData.copy(name = it) } SettingsOutlinedTextField( apnData.apn, stringResource(R.string.apn_apn), enabled = apnData.apnEnabled ) { apnData = apnData.copy(apn = it) } SettingsOutlinedTextField( apnData.proxy, stringResource(R.string.apn_http_proxy), enabled = apnData.proxyEnabled ) { apnData = apnData.copy(proxy = it) } SettingsOutlinedTextField( apnData.port, stringResource(R.string.apn_http_port), enabled = apnData.portEnabled ) { apnData = apnData.copy(port = it) } SettingsOutlinedTextField( apnData.userName, stringResource(R.string.apn_user), enabled = apnData.userNameEnabled ) { apnData = apnData.copy(userName = it) } // TODO: password SettingsOutlinedTextField( apnData.server, stringResource(R.string.apn_server), enabled = apnData.serverEnabled ) { apnData = apnData.copy(server = it) } SettingsOutlinedTextField( apnData.mmsc, stringResource(R.string.apn_mmsc), enabled = apnData.mmscEnabled ) { apnData = apnData.copy(mmsc = it) } SettingsOutlinedTextField( apnData.mmsProxy, stringResource(R.string.apn_mms_proxy), enabled = apnData.mmsProxyEnabled ) { apnData = apnData.copy(mmsProxy = it) } SettingsOutlinedTextField( apnData.mmsPort, stringResource(R.string.apn_mms_port), enabled = apnData.mmsPortEnabled ) { apnData = apnData.copy(mmsPort = it) } SettingsOutlinedTextField( apnData.mcc, stringResource(R.string.apn_mcc), enabled = apnData.mccEnabled ) { apnData = apnData.copy(mcc = it) } SettingsOutlinedTextField( apnData.mnc, stringResource(R.string.apn_mnc), enabled = apnData.mncEnabled ) { apnData = apnData.copy(mnc = it) } SettingsOutlinedTextField( apnData.apnType, stringResource(R.string.apn_type), enabled = apnData.apnTypeEnabled ) { apnData = apnData.copy(apn = it) } // TODO: updateApnType SettingsOutlinedTextField( apnData.mvnoValue, stringResource(R.string.mvno_match_data), enabled = apnData.mvnoValueEnabled ) { apnData = apnData.copy(mvnoValue = it) } } } } No newline at end of file src/com/android/settings/network/apn/ApnStatus.kt 0 → 100644 +68 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network.apn import android.provider.Telephony import android.telephony.TelephonyManager data class ApnData( val name: String = "", val apn: String = "", val proxy: String = "", val port: String = "", val userName: String = "", val passWord: String = "", val server: String = "", val mmsc: String = "", val mmsProxy: String = "", val mmsPort: String = "", val mcc: String = "", val mnc: String = "", val authType: Int = -1, val apnType: String = "", val apnProtocol: String = "", val apnRoaming: String = "", val apnEnable: Int = 1, val bearer: Int = 0, val mvnoType: String = "", 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 ) { var nameEnabled = true var apnEnabled = true var proxyEnabled = true var portEnabled = true var userNameEnabled = true var passWordEnabled = true var serverEnabled = true var mmscEnabled = true var mmsProxyEnabled = true var mmsPortEnabled = true var mccEnabled = true var mncEnabled = true var authTypeEnabled = true var apnTypeEnabled = true var apnProtocolEnabled = true var apnRoamingEnabled = true var apnEnableEnabled = true var bearerEnabled = true var mvnoTypeEnabled = true var mvnoValueEnabled = false } No newline at end of file tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network.apn import android.content.Context import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R import com.google.common.truth.Truth import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class ApnEditPageProviderTest { @get:Rule val composeTestRule = createComposeRule() private val context: Context = ApplicationProvider.getApplicationContext() val apnData = ApnData(name = "apn_name") @Test fun apnEditPageProvider_name() { Truth.assertThat(ApnEditPageProvider.name).isEqualTo("Apn") } @Test fun title_displayed() { composeTestRule.setContent { ApnPage(apnData) } composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed() } @Test fun name_displayed() { composeTestRule.setContent { ApnPage(apnData) } composeTestRule.onNodeWithText("apn_name", true).assertIsDisplayed() } } No newline at end of file Loading
src/com/android/settings/network/apn/ApnEditPageProvider.kt +78 −5 Original line number Diff line number Diff line Loading @@ -16,16 +16,20 @@ package com.android.settings.network.apn import android.content.Context import android.net.Uri import android.os.Bundle import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import androidx.navigation.NavType import androidx.navigation.navArgument import com.android.settings.R import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField import com.android.settingslib.spa.widget.scaffold.RegularScaffold import java.util.Base64 Loading @@ -51,8 +55,8 @@ object ApnEditPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { val context = LocalContext.current ApnPage(context) val apnDataInit = ApnData() ApnPage(apnDataInit) } fun getRoute( Loading @@ -67,9 +71,78 @@ object ApnEditPageProvider : SettingsPageProvider { } @Composable fun ApnPage(context: Context) { fun ApnPage(apnDataInit: ApnData) { var apnData by remember { mutableStateOf(apnDataInit) } RegularScaffold( title = stringResource(id = R.string.apn_edit), ) { Column() { SettingsOutlinedTextField( apnData.name, stringResource(R.string.apn_name), enabled = apnData.nameEnabled ) { apnData = apnData.copy(name = it) } SettingsOutlinedTextField( apnData.apn, stringResource(R.string.apn_apn), enabled = apnData.apnEnabled ) { apnData = apnData.copy(apn = it) } SettingsOutlinedTextField( apnData.proxy, stringResource(R.string.apn_http_proxy), enabled = apnData.proxyEnabled ) { apnData = apnData.copy(proxy = it) } SettingsOutlinedTextField( apnData.port, stringResource(R.string.apn_http_port), enabled = apnData.portEnabled ) { apnData = apnData.copy(port = it) } SettingsOutlinedTextField( apnData.userName, stringResource(R.string.apn_user), enabled = apnData.userNameEnabled ) { apnData = apnData.copy(userName = it) } // TODO: password SettingsOutlinedTextField( apnData.server, stringResource(R.string.apn_server), enabled = apnData.serverEnabled ) { apnData = apnData.copy(server = it) } SettingsOutlinedTextField( apnData.mmsc, stringResource(R.string.apn_mmsc), enabled = apnData.mmscEnabled ) { apnData = apnData.copy(mmsc = it) } SettingsOutlinedTextField( apnData.mmsProxy, stringResource(R.string.apn_mms_proxy), enabled = apnData.mmsProxyEnabled ) { apnData = apnData.copy(mmsProxy = it) } SettingsOutlinedTextField( apnData.mmsPort, stringResource(R.string.apn_mms_port), enabled = apnData.mmsPortEnabled ) { apnData = apnData.copy(mmsPort = it) } SettingsOutlinedTextField( apnData.mcc, stringResource(R.string.apn_mcc), enabled = apnData.mccEnabled ) { apnData = apnData.copy(mcc = it) } SettingsOutlinedTextField( apnData.mnc, stringResource(R.string.apn_mnc), enabled = apnData.mncEnabled ) { apnData = apnData.copy(mnc = it) } SettingsOutlinedTextField( apnData.apnType, stringResource(R.string.apn_type), enabled = apnData.apnTypeEnabled ) { apnData = apnData.copy(apn = it) } // TODO: updateApnType SettingsOutlinedTextField( apnData.mvnoValue, stringResource(R.string.mvno_match_data), enabled = apnData.mvnoValueEnabled ) { apnData = apnData.copy(mvnoValue = it) } } } } No newline at end of file
src/com/android/settings/network/apn/ApnStatus.kt 0 → 100644 +68 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network.apn import android.provider.Telephony import android.telephony.TelephonyManager data class ApnData( val name: String = "", val apn: String = "", val proxy: String = "", val port: String = "", val userName: String = "", val passWord: String = "", val server: String = "", val mmsc: String = "", val mmsProxy: String = "", val mmsPort: String = "", val mcc: String = "", val mnc: String = "", val authType: Int = -1, val apnType: String = "", val apnProtocol: String = "", val apnRoaming: String = "", val apnEnable: Int = 1, val bearer: Int = 0, val mvnoType: String = "", 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 ) { var nameEnabled = true var apnEnabled = true var proxyEnabled = true var portEnabled = true var userNameEnabled = true var passWordEnabled = true var serverEnabled = true var mmscEnabled = true var mmsProxyEnabled = true var mmsPortEnabled = true var mccEnabled = true var mncEnabled = true var authTypeEnabled = true var apnTypeEnabled = true var apnProtocolEnabled = true var apnRoamingEnabled = true var apnEnableEnabled = true var bearerEnabled = true var mvnoTypeEnabled = true var mvnoValueEnabled = false } No newline at end of file
tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network.apn import android.content.Context import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R import com.google.common.truth.Truth import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class ApnEditPageProviderTest { @get:Rule val composeTestRule = createComposeRule() private val context: Context = ApplicationProvider.getApplicationContext() val apnData = ApnData(name = "apn_name") @Test fun apnEditPageProvider_name() { Truth.assertThat(ApnEditPageProvider.name).isEqualTo("Apn") } @Test fun title_displayed() { composeTestRule.setContent { ApnPage(apnData) } composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed() } @Test fun name_displayed() { composeTestRule.setContent { ApnPage(apnData) } composeTestRule.onNodeWithText("apn_name", true).assertIsDisplayed() } } No newline at end of file