blob: 97d001c580288325ba2e54ec682a185a1832a9fb [file] [log] [blame]
/*
* 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.net.Uri
import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringArrayResource
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.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.editor.SettingsTextFieldPassword
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
import java.util.Base64
const val URI_TYPE = "uriType"
const val URI = "uri"
const val SUB_ID = "subId"
const val MVNO_TYPE = "mvnoType"
const val MVNO_MATCH_DATA = "mvnoMatchData"
const val EDIT_URL = "editUrl"
object ApnEditPageProvider : SettingsPageProvider {
override val name = "Apn"
const val TAG = "ApnPageProvider"
override val parameter = listOf(
navArgument(URI_TYPE) { type = NavType.StringType },
navArgument(URI) { type = NavType.StringType },
navArgument(SUB_ID) { type = NavType.IntType },
navArgument(MVNO_TYPE) { type = NavType.StringType },
navArgument(MVNO_MATCH_DATA) { type = NavType.StringType },
)
@Composable
override fun Page(arguments: Bundle?) {
val apnDataInit = ApnData()
val apnDataCur = remember {
mutableStateOf(apnDataInit)
}
ApnPage(apnDataCur)
}
fun getRoute(
uriType: String,
uri: Uri,
subId: Int,
mMvnoType: String,
mMvnoMatchData: String
): String = "${name}/$uriType/${
Base64.getUrlEncoder().encodeToString(uri.toString().toByteArray())
}/$subId/$mMvnoType/$mMvnoMatchData"
}
@Composable
fun ApnPage(apnDataCur: MutableState<ApnData>) {
var apnData by apnDataCur
val context = LocalContext.current
val authTypeOptions = stringArrayResource(R.array.apn_auth_entries).toList()
val apnProtocolOptions = stringArrayResource(R.array.apn_protocol_entries).toList()
val networkTypeOptionsAll = stringArrayResource(R.array.network_type_entries)
val networkTypeOptions = networkTypeOptionsAll.drop(1).toList()
val networkTypeEmptyVal = networkTypeOptionsAll[0]
val mvnoTypeOptions = stringArrayResource(R.array.mvno_type_entries).toList()
val networkTypeSelectedOptionsState = remember {
getNetworkTypeSelectedOptionsState(apnData.networkType, context)
}
RegularScaffold(
title = stringResource(id = R.string.apn_edit),
) {
Column() {
SettingsOutlinedTextField(
value = apnData.name,
label = stringResource(R.string.apn_name),
enabled = apnData.nameEnabled
) { apnData = apnData.copy(name = it) }
SettingsOutlinedTextField(
value = apnData.apn,
label = stringResource(R.string.apn_apn),
enabled = apnData.apnEnabled
) { apnData = apnData.copy(apn = it) }
SettingsOutlinedTextField(
value = apnData.proxy,
label = stringResource(R.string.apn_http_proxy),
enabled = apnData.proxyEnabled
) { apnData = apnData.copy(proxy = it) }
SettingsOutlinedTextField(
value = apnData.port,
label = stringResource(R.string.apn_http_port),
enabled = apnData.portEnabled
) { apnData = apnData.copy(port = it) }
SettingsOutlinedTextField(
value = apnData.userName,
label = stringResource(R.string.apn_user),
enabled = apnData.userNameEnabled
) { apnData = apnData.copy(userName = it) }
SettingsTextFieldPassword(
value = apnData.passWord,
label = stringResource(R.string.apn_password),
enabled = apnData.passWordEnabled
) { apnData = apnData.copy(passWord = it) }
SettingsOutlinedTextField(
value = apnData.server,
label = stringResource(R.string.apn_server),
enabled = apnData.serverEnabled
) { apnData = apnData.copy(server = it) }
SettingsOutlinedTextField(
value = apnData.mmsc,
label = stringResource(R.string.apn_mmsc),
enabled = apnData.mmscEnabled
) { apnData = apnData.copy(mmsc = it) }
SettingsOutlinedTextField(
value = apnData.mmsProxy,
label = stringResource(R.string.apn_mms_proxy),
enabled = apnData.mmsProxyEnabled
) { apnData = apnData.copy(mmsProxy = it) }
SettingsOutlinedTextField(
value = apnData.mmsPort,
label = stringResource(R.string.apn_mms_port),
enabled = apnData.mmsPortEnabled
) { apnData = apnData.copy(mmsPort = it) }
SettingsOutlinedTextField(
value = apnData.mcc,
label = stringResource(R.string.apn_mcc),
enabled = apnData.mccEnabled
) { apnData = apnData.copy(mcc = it) }
SettingsOutlinedTextField(
value = apnData.mnc,
label = stringResource(R.string.apn_mnc),
enabled = apnData.mncEnabled
) { apnData = apnData.copy(mnc = it) }
// Warning: apnProtocol, apnRoaming, mvnoType string2Int
SettingsExposedDropdownMenuBox(
label = stringResource(R.string.apn_auth_type),
options = authTypeOptions,
selectedOptionIndex = apnData.authType,
enabled = apnData.authTypeEnabled,
) { apnData = apnData.copy(authType = it) }
SettingsOutlinedTextField(
value = apnData.apnType,
label = stringResource(R.string.apn_type),
enabled = apnData.apnTypeEnabled
) { apnData = apnData.copy(apn = it) } // TODO: updateApnType
SettingsExposedDropdownMenuBox(
label = stringResource(R.string.apn_protocol),
options = apnProtocolOptions,
selectedOptionIndex = apnData.apnProtocol,
enabled = apnData.apnProtocolEnabled
) { apnData = apnData.copy(apnProtocol = it) }
SettingsExposedDropdownMenuBox(
label = stringResource(R.string.apn_roaming_protocol),
options = apnProtocolOptions,
selectedOptionIndex = apnData.apnRoaming,
enabled = apnData.apnRoamingEnabled
) { apnData = apnData.copy(apnRoaming = it) }
SwitchPreference(
object : SwitchPreferenceModel {
override val title = context.resources.getString(R.string.carrier_enabled)
override val changeable =
stateOf(apnData.apnEnableEnabled)
override val checked =
stateOf(apnData.apnEnable)
override val onCheckedChange = { newChecked: Boolean ->
apnData = apnData.copy(apnEnable = newChecked)
}
}
)
SettingsExposedDropdownMenuCheckBox(
label = stringResource(R.string.network_type),
options = networkTypeOptions,
selectedOptionsState = networkTypeSelectedOptionsState,
emptyVal = networkTypeEmptyVal,
enabled = apnData.networkTypeEnabled
) {}
SettingsExposedDropdownMenuBox(
label = stringResource(R.string.mvno_type),
options = mvnoTypeOptions,
selectedOptionIndex = apnData.mvnoType,
enabled = apnData.mvnoTypeEnabled
) {
apnData = apnData.copy(mvnoType = it)
} // TODO: mvnoDescription
SettingsOutlinedTextField(
value = apnData.mvnoValue,
label = stringResource(R.string.mvno_match_data),
enabled = apnData.mvnoValueEnabled
) { apnData = apnData.copy(mvnoValue = it) }
}
}
}