Add updateApnDataToDatabase.
Fix: 304672976 Test: Visual Test Change-Id: If0ed6b8090a37c5a98ab2eeb29fba61c1173c0a7
This commit is contained in:
@@ -74,7 +74,7 @@ object ApnEditPageProvider : SettingsPageProvider {
|
|||||||
val apnDataCur = remember {
|
val apnDataCur = remember {
|
||||||
mutableStateOf(apnDataInit)
|
mutableStateOf(apnDataInit)
|
||||||
}
|
}
|
||||||
ApnPage(apnDataInit, apnDataCur)
|
ApnPage(apnDataInit, apnDataCur, uriInit)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getRoute(
|
fun getRoute(
|
||||||
@@ -87,7 +87,7 @@ object ApnEditPageProvider : SettingsPageProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ApnPage(apnDataInit: ApnData, apnDataCur: MutableState<ApnData>) {
|
fun ApnPage(apnDataInit: ApnData, apnDataCur: MutableState<ApnData>, uriInit: Uri) {
|
||||||
var apnData by apnDataCur
|
var apnData by apnDataCur
|
||||||
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()
|
||||||
@@ -99,7 +99,7 @@ fun ApnPage(apnDataInit: ApnData, apnDataCur: MutableState<ApnData>) {
|
|||||||
title = stringResource(id = R.string.apn_edit),
|
title = stringResource(id = R.string.apn_edit),
|
||||||
actions = {
|
actions = {
|
||||||
IconButton(onClick = {
|
IconButton(onClick = {
|
||||||
validateAndSaveApnData(apnDataInit, apnData, context)
|
validateAndSaveApnData(apnDataInit, apnData, context, uriInit)
|
||||||
}) { Icon(imageVector = Icons.Outlined.Done, contentDescription = "Save APN") }
|
}) { Icon(imageVector = Icons.Outlined.Done, contentDescription = "Save APN") }
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
@@ -16,11 +16,13 @@
|
|||||||
|
|
||||||
package com.android.settings.network.apn
|
package com.android.settings.network.apn
|
||||||
|
|
||||||
|
import android.content.ContentValues
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.Telephony
|
import android.provider.Telephony
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.android.settings.R
|
import com.android.settings.R
|
||||||
|
import com.android.settingslib.utils.ThreadUtils
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
const val NAME_INDEX = 1
|
const val NAME_INDEX = 1
|
||||||
@@ -161,4 +163,35 @@ private fun convertProtocol2Options(raw: String, context: Context): String {
|
|||||||
""
|
""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun convertOptions2Protocol(protocolIndex: Int, context: Context): String {
|
||||||
|
val apnProtocolValues = context.resources.getStringArray(R.array.apn_protocol_values).toList()
|
||||||
|
|
||||||
|
return if (protocolIndex == -1) {
|
||||||
|
""
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
apnProtocolValues[protocolIndex]
|
||||||
|
} catch (e: ArrayIndexOutOfBoundsException) {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateApnDataToDatabase(newApn: Boolean, values: ContentValues, context: Context, uriInit: Uri) {
|
||||||
|
ThreadUtils.postOnBackgroundThread {
|
||||||
|
if (newApn) {
|
||||||
|
// Add a new apn to the database
|
||||||
|
val newUri = context.contentResolver.insert(uriInit, values)
|
||||||
|
if (newUri == null) {
|
||||||
|
Log.e(TAG, "Can't add a new apn to database $uriInit")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Update the existing apn
|
||||||
|
context.contentResolver.update(
|
||||||
|
uriInit, values, null /* where */, null /* selection Args */
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.network.apn
|
package com.android.settings.network.apn
|
||||||
|
|
||||||
|
import android.content.ContentValues
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@@ -68,7 +69,29 @@ data class ApnData(
|
|||||||
val newApn: Boolean = false,
|
val newApn: Boolean = false,
|
||||||
val subId: Int = -1,
|
val subId: Int = -1,
|
||||||
val customizedConfig: CustomizedConfig = CustomizedConfig()
|
val customizedConfig: CustomizedConfig = CustomizedConfig()
|
||||||
)
|
) {
|
||||||
|
fun getContentValues(context: Context): ContentValues {
|
||||||
|
val values = ContentValues()
|
||||||
|
values.put(Telephony.Carriers.NAME, name)
|
||||||
|
values.put(Telephony.Carriers.APN, apn)
|
||||||
|
values.put(Telephony.Carriers.PROXY, proxy)
|
||||||
|
values.put(Telephony.Carriers.PORT, port)
|
||||||
|
values.put(Telephony.Carriers.MMSPROXY, mmsProxy)
|
||||||
|
values.put(Telephony.Carriers.MMSPORT, mmsPort)
|
||||||
|
values.put(Telephony.Carriers.USER, userName)
|
||||||
|
values.put(Telephony.Carriers.SERVER, server)
|
||||||
|
values.put(Telephony.Carriers.PASSWORD, passWord)
|
||||||
|
values.put(Telephony.Carriers.MMSC, mmsc)
|
||||||
|
values.put(Telephony.Carriers.AUTH_TYPE, authType)
|
||||||
|
values.put(Telephony.Carriers.PROTOCOL, convertOptions2Protocol(apnProtocol, context))
|
||||||
|
values.put(Telephony.Carriers.ROAMING_PROTOCOL, convertOptions2Protocol(apnRoaming, context))
|
||||||
|
values.put(Telephony.Carriers.TYPE, apnType)
|
||||||
|
values.put(Telephony.Carriers.NETWORK_TYPE_BITMASK, networkType)
|
||||||
|
values.put(Telephony.Carriers.CARRIER_ENABLED, apnEnable)
|
||||||
|
values.put(Telephony.Carriers.EDITED_STATUS, Telephony.Carriers.USER_EDITED)
|
||||||
|
return values
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data class CustomizedConfig(
|
data class CustomizedConfig(
|
||||||
val newApn: Boolean = false,
|
val newApn: Boolean = false,
|
||||||
@@ -181,7 +204,7 @@ fun getApnDataInit(arguments: Bundle, context: Context, uriInit: Uri, subId: Int
|
|||||||
*
|
*
|
||||||
* @return true if there is no error
|
* @return true if there is no error
|
||||||
*/
|
*/
|
||||||
fun validateAndSaveApnData(apnDataInit: ApnData, apnData: ApnData, context: Context): Boolean {
|
fun validateAndSaveApnData(apnDataInit: ApnData, apnData: ApnData, context: Context, uriInit: Uri): Boolean {
|
||||||
// Nothing to do if it's a read only APN
|
// Nothing to do if it's a read only APN
|
||||||
if (apnData.customizedConfig.readOnlyApn) {
|
if (apnData.customizedConfig.readOnlyApn) {
|
||||||
return true
|
return true
|
||||||
@@ -193,7 +216,7 @@ fun validateAndSaveApnData(apnDataInit: ApnData, apnData: ApnData, context: Cont
|
|||||||
}
|
}
|
||||||
if (apnData.newApn || (apnData != apnDataInit)) {
|
if (apnData.newApn || (apnData != apnDataInit)) {
|
||||||
Log.d(TAG, "validateAndSaveApnData: apnData ${apnData.name}")
|
Log.d(TAG, "validateAndSaveApnData: apnData ${apnData.name}")
|
||||||
// TODO: updateApnDataToDatabase
|
updateApnDataToDatabase(apnData.newApn, apnData.getContentValues(context), context, uriInit)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.network.apn
|
package com.android.settings.network.apn
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
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
|
||||||
@@ -40,6 +41,7 @@ import com.google.common.truth.Truth
|
|||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
|
import org.mockito.kotlin.mock
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
class ApnEditPageProviderTest {
|
class ApnEditPageProviderTest {
|
||||||
@@ -68,6 +70,7 @@ class ApnEditPageProviderTest {
|
|||||||
private val apnData = mutableStateOf(
|
private val apnData = mutableStateOf(
|
||||||
apnInit
|
apnInit
|
||||||
)
|
)
|
||||||
|
private val uri = mock<Uri> {}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun apnEditPageProvider_name() {
|
fun apnEditPageProvider_name() {
|
||||||
@@ -77,9 +80,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun title_displayed() {
|
fun title_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed()
|
composeTestRule.onNodeWithText(context.getString(R.string.apn_edit)).assertIsDisplayed()
|
||||||
}
|
}
|
||||||
@@ -87,9 +88,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun name_displayed() {
|
fun name_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onNodeWithText(apnName, true).assertIsDisplayed()
|
composeTestRule.onNodeWithText(apnName, true).assertIsDisplayed()
|
||||||
}
|
}
|
||||||
@@ -97,9 +96,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun mmsc_displayed() {
|
fun mmsc_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(mmsc, true))
|
.performScrollToNode(hasText(mmsc, true))
|
||||||
@@ -109,9 +106,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun mms_proxy_displayed() {
|
fun mms_proxy_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(mmsProxy, true))
|
.performScrollToNode(hasText(mmsProxy, true))
|
||||||
@@ -121,9 +116,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun apn_type_displayed() {
|
fun apn_type_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(apnType, true))
|
.performScrollToNode(hasText(apnType, true))
|
||||||
@@ -133,9 +126,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun apn_roaming_displayed() {
|
fun apn_roaming_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(apnRoaming, true))
|
.performScrollToNode(hasText(apnRoaming, true))
|
||||||
@@ -145,9 +136,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun carrier_enabled_displayed() {
|
fun carrier_enabled_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(apnEnable, true))
|
.performScrollToNode(hasText(apnEnable, true))
|
||||||
@@ -157,9 +146,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun carrier_enabled_isChecked() {
|
fun carrier_enabled_isChecked() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(apnEnable, true))
|
.performScrollToNode(hasText(apnEnable, true))
|
||||||
@@ -169,9 +156,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun carrier_enabled_checkChanged() {
|
fun carrier_enabled_checkChanged() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(apnEnable, true))
|
.performScrollToNode(hasText(apnEnable, true))
|
||||||
@@ -182,9 +167,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun network_type_displayed() {
|
fun network_type_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(networkType, true))
|
.performScrollToNode(hasText(networkType, true))
|
||||||
@@ -194,9 +177,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun network_type_changed() {
|
fun network_type_changed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(networkType, true))
|
.performScrollToNode(hasText(networkType, true))
|
||||||
@@ -210,9 +191,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun network_type_changed_back2Default() {
|
fun network_type_changed_back2Default() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(networkType, true))
|
.performScrollToNode(hasText(networkType, true))
|
||||||
@@ -230,9 +209,7 @@ class ApnEditPageProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
fun password_displayed() {
|
fun password_displayed() {
|
||||||
composeTestRule.setContent {
|
composeTestRule.setContent {
|
||||||
ApnPage(apnInit, remember {
|
ApnPage(apnInit, remember { apnData }, uri)
|
||||||
apnData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
composeTestRule.onRoot().onChild().onChildAt(0)
|
composeTestRule.onRoot().onChild().onChildAt(0)
|
||||||
.performScrollToNode(hasText(passwordTitle, true))
|
.performScrollToNode(hasText(passwordTitle, true))
|
||||||
|
Reference in New Issue
Block a user