Add ApnData class and SettingsOutlinedTextField.

Bug: 298906796
Test: Munual
Change-Id: Iba6563fee091302989d2653c0b59b5c18accce4d
diff --git a/src/com/android/settings/network/apn/ApnEditPageProvider.kt b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
index c62cc78..1cca81a 100644
--- a/src/com/android/settings/network/apn/ApnEditPageProvider.kt
+++ b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
@@ -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
 
@@ -51,8 +55,8 @@
 
     @Composable
     override fun Page(arguments: Bundle?) {
-        val context = LocalContext.current
-        ApnPage(context)
+        val apnDataInit = ApnData()
+        ApnPage(apnDataInit)
     }
 
     fun getRoute(
@@ -67,9 +71,78 @@
 }
 
 @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
diff --git a/src/com/android/settings/network/apn/ApnStatus.kt b/src/com/android/settings/network/apn/ApnStatus.kt
new file mode 100644
index 0000000..78734d0
--- /dev/null
+++ b/src/com/android/settings/network/apn/ApnStatus.kt
@@ -0,0 +1,68 @@
+/*
+ * 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
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
new file mode 100644
index 0000000..bfdb408
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
@@ -0,0 +1,60 @@
+/*
+ * 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