Improved account screen implementation

This commit is contained in:
Juha Heinanen
2025-06-11 15:36:23 +03:00
parent f666599397
commit 6f1b1b2ac4
@@ -198,49 +198,27 @@ private val alertTitle = mutableStateOf("")
private val alertMessage = mutableStateOf("") private val alertMessage = mutableStateOf("")
private val showAlert = mutableStateOf(false) private val showAlert = mutableStateOf(false)
private var oldNickname = ""
private var newNickname = "" private var newNickname = ""
private var oldDisplayname = ""
private var newDisplayname = "" private var newDisplayname = ""
private var oldAuthUser = ""
private var newAuthUser = "" private var newAuthUser = ""
private var oldAuthPass = ""
private var newAuthPass = "" private var newAuthPass = ""
private val oldOutbound1 = mutableStateOf("")
private val oldOutbound2 = mutableStateOf("")
private var newOutbound1 = "" private var newOutbound1 = ""
private var newOutbound2 = "" private var newOutbound2 = ""
private var oldRegister = false
private var newRegister = false private var newRegister = false
private var oldRegInt = ""
private var newRegInt = "" private var newRegInt = ""
private var oldMediaEnc = ""
private var newMediaEnc = "" private var newMediaEnc = ""
private var oldMediaNat = ""
private var newMediaNat = "" private var newMediaNat = ""
private var oldStunServer = ""
private var newStunServer = "" private var newStunServer = ""
private var oldStunUser = ""
private var newStunUser = "" private var newStunUser = ""
private var oldStunPass = ""
private var newStunPass = "" private var newStunPass = ""
private var oldRtcpMux = false
private var newRtcpMux = false private var newRtcpMux = false
private var old100Rel = false
private var new100Rel = false private var new100Rel = false
private var oldDtmfMode = 0
private var newDtmfMode = 0 private var newDtmfMode = 0
private var oldAnswerMode = 0
private var newAnswerMode = 0 private var newAnswerMode = 0
private var oldAutoRedirect = false
private var newAutoRedirect = false private var newAutoRedirect = false
private var oldVmUri = ""
private var newVmUri = "" private var newVmUri = ""
private var oldCountryCode = ""
private var newCountryCode = "" private var newCountryCode = ""
private var oldTelProvider = ""
private var newTelProvider = "" private var newTelProvider = ""
private var oldDefaultAccount = false
private var newDefaultAccount = false private var newDefaultAccount = false
private var newNumericKeypad = false private var newNumericKeypad = false
@@ -256,138 +234,11 @@ private fun AccountContent(
val acc = ua.account val acc = ua.account
val aor = acc.aor val aor = acc.aor
var mediaNatState by remember { mutableStateOf(oldMediaNat) } var mediaNatState by remember { mutableStateOf(acc.mediaNat) }
val showStun by remember { derivedStateOf { mediaNatState != "" } } val showStun by remember { derivedStateOf { mediaNatState != "" } }
LaunchedEffect(acc) { @Composable
if (acc.outbound.isNotEmpty()) { fun AoR() {
oldOutbound1.value = acc.outbound[0]
newOutbound1 = oldOutbound1.value
if (acc.outbound.size > 1) {
oldOutbound2.value = acc.outbound[1]
newOutbound2 = oldOutbound2.value
} else {
oldOutbound2.value = ""
newOutbound2 = ""
}
} else {
oldOutbound1.value = ""
newOutbound1 = ""
oldOutbound2.value = ""
newOutbound2 = ""
}
oldMediaNat = acc.mediaNat
newMediaNat = oldMediaNat
mediaNatState = oldMediaNat
}
if (showAlert.value) {
AlertDialog(
showDialog = showAlert,
title = alertTitle.value,
message = alertMessage.value,
positiveButtonText = stringResource(R.string.ok),
)
}
oldNickname = acc.nickName.value
newNickname = oldNickname
oldDisplayname = acc.displayName
newDisplayname = oldDisplayname
oldAuthUser = acc.authUser
newAuthUser = oldAuthUser
if (BaresipService.aorPasswords[aor] == null && acc.authPass != NO_AUTH_PASS) {
oldAuthPass = acc.authPass
newAuthPass = oldAuthPass
}
else {
oldAuthPass = ""
newAuthPass = ""
}
oldRegister = acc.regint > 0
newRegister = oldRegister
oldRegInt = acc.configuredRegInt.toString()
newRegInt = oldRegInt
oldMediaEnc = acc.mediaEnc
newMediaEnc = oldMediaEnc
oldStunServer = acc.stunServer
newStunServer = oldStunServer
oldStunUser = acc.stunUser
newStunUser = oldStunUser
oldStunPass = acc.stunPass
newStunPass = oldStunPass
oldRtcpMux = acc.rtcpMux
newRtcpMux = oldRtcpMux
old100Rel = acc.rel100Mode == Api.REL100_ENABLED
new100Rel = old100Rel
oldDtmfMode = acc.dtmfMode
newDtmfMode = oldDtmfMode
oldAnswerMode = acc.answerMode
newAnswerMode = oldAnswerMode
oldAutoRedirect = acc.autoRedirect
newAutoRedirect = oldAutoRedirect
oldVmUri = acc.vmUri
newVmUri = oldVmUri
oldCountryCode = acc.countryCode
newCountryCode = oldCountryCode
oldTelProvider = acc.telProvider
newTelProvider = oldTelProvider
newNumericKeypad = acc.numericKeypad
oldDefaultAccount = UserAgent.findAorIndex(aor)!! == 0
newDefaultAccount = oldDefaultAccount
keyboardController = LocalSoftwareKeyboardController.current
val scrollState = rememberScrollState()
Column(
modifier = Modifier
.fillMaxWidth()
.padding(contentPadding)
.padding(start = 16.dp, end = 4.dp, top = 8.dp, bottom = 16.dp)
.verticalScrollbar(scrollState)
.verticalScroll(state = scrollState),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
AoR(acc)
Nickname()
DisplayName()
AuthUser()
AuthPass()
if (showPasswordDialog.value)
AskPassword(ctx, navController, ua)
Outbound()
Register()
RegInt()
AudioCodecs(navController, aor)
MediaEnc()
MediaNat(
currentMediaNat = mediaNatState,
onMediaNatSelected = { selectedMediaNat ->
mediaNatState = selectedMediaNat
newMediaNat = selectedMediaNat
}
)
if (showStun) {
StunServer()
StunUser()
StunPass()
}
RtcpMux()
Rel100()
Dtmf()
Answer()
Redirect()
Voicemail()
CountryCode()
TelProvider()
NumericKeypad(acc)
DefaultAccount()
}
}
@Composable
private fun AoR(acc: Account) {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -410,10 +261,10 @@ private fun AoR(acc: Account) {
} }
) )
} }
} }
@Composable @Composable
private fun Nickname() { fun Nickname() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -422,7 +273,8 @@ private fun Nickname() {
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var nickName by remember { mutableStateOf(oldNickname) } var nickName by remember { mutableStateOf(acc.nickName.value) }
newNickname = nickName
OutlinedTextField( OutlinedTextField(
value = nickName, value = nickName,
placeholder = { Text(stringResource(R.string.nickname)) }, placeholder = { Text(stringResource(R.string.nickname)) },
@@ -445,10 +297,10 @@ private fun Nickname() {
keyboardType = KeyboardType.Text), keyboardType = KeyboardType.Text),
) )
} }
} }
@Composable @Composable
private fun DisplayName() { fun DisplayName() {
val ctx = LocalContext.current val ctx = LocalContext.current
Row( Row(
Modifier Modifier
@@ -457,7 +309,8 @@ private fun DisplayName() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
var displayName by remember { mutableStateOf(oldDisplayname) } var displayName by remember { mutableStateOf(acc.displayName) }
newDisplayname = displayName
OutlinedTextField( OutlinedTextField(
value = displayName, value = displayName,
placeholder = { Text(stringResource(R.string.display_name)) }, placeholder = { Text(stringResource(R.string.display_name)) },
@@ -480,10 +333,10 @@ private fun DisplayName() {
keyboardType = KeyboardType.Text), keyboardType = KeyboardType.Text),
) )
} }
} }
@Composable @Composable
private fun AuthUser() { fun AuthUser() {
val ctx = LocalContext.current val ctx = LocalContext.current
Row( Row(
Modifier Modifier
@@ -492,7 +345,8 @@ private fun AuthUser() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
var authUser by remember { mutableStateOf(oldAuthUser) } var authUser by remember { mutableStateOf(acc.authUser) }
newAuthUser = authUser
OutlinedTextField( OutlinedTextField(
value = authUser, value = authUser,
placeholder = { Text(stringResource(R.string.authentication_username)) }, placeholder = { Text(stringResource(R.string.authentication_username)) },
@@ -513,10 +367,10 @@ private fun AuthUser() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun AuthPass() { fun AuthPass() {
val ctx = LocalContext.current val ctx = LocalContext.current
val showPassword = remember { mutableStateOf(false) } val showPassword = remember { mutableStateOf(false) }
Row( Row(
@@ -526,7 +380,13 @@ private fun AuthPass() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
var authPass by remember { mutableStateOf(oldAuthPass) } var authPass by remember { mutableStateOf(
if (BaresipService.aorPasswords[acc.aor] == null && acc.authPass != NO_AUTH_PASS)
acc.authPass
else
""
) }
newAuthPass = authPass
OutlinedTextField( OutlinedTextField(
value = authPass, value = authPass,
placeholder = { Text(stringResource(R.string.authentication_password)) }, placeholder = { Text(stringResource(R.string.authentication_password)) },
@@ -567,10 +427,10 @@ private fun AuthPass() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun AskPassword(ctx: Context, navController: NavController, ua: UserAgent) { fun AskPassword(ctx: Context, navController: NavController, ua: UserAgent) {
CustomElements.PasswordDialog( CustomElements.PasswordDialog(
ctx = ctx, ctx = ctx,
showPasswordDialog = showPasswordDialog, showPasswordDialog = showPasswordDialog,
@@ -591,10 +451,10 @@ private fun AskPassword(ctx: Context, navController: NavController, ua: UserAgen
navController.popBackStack() navController.popBackStack()
} }
) )
} }
@Composable @Composable
private fun Outbound() { fun Outbound() {
val ctx = LocalContext.current val ctx = LocalContext.current
Text(text = stringResource(R.string.outbound_proxies), Text(text = stringResource(R.string.outbound_proxies),
color = LocalCustomColors.current.itemText, color = LocalCustomColors.current.itemText,
@@ -614,13 +474,16 @@ private fun Outbound() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
var outbound1 by remember { mutableStateOf(oldOutbound1) } var outbound1 by remember { mutableStateOf(
if (acc.outbound.isNotEmpty()) acc.outbound[0] else "")
}
newOutbound1 = outbound1
OutlinedTextField( OutlinedTextField(
value = outbound1.value, value = outbound1,
placeholder = { Text(stringResource(R.string.sip_uri_of_proxy_server)) }, placeholder = { Text(stringResource(R.string.sip_uri_of_proxy_server)) },
onValueChange = { onValueChange = {
outbound1.value = it outbound1= it
newOutbound1 = outbound1.value newOutbound1 = outbound1
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
singleLine = true, singleLine = true,
@@ -637,13 +500,16 @@ private fun Outbound() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
var outbound2 by remember { mutableStateOf(oldOutbound2) } var outbound2 by remember { mutableStateOf(
if (acc.outbound.size > 1) acc.outbound[1] else "")
}
newOutbound2 = outbound2
OutlinedTextField( OutlinedTextField(
value = outbound2.value, value = outbound2,
placeholder = { Text(stringResource(R.string.sip_uri_of_another_proxy_server)) }, placeholder = { Text(stringResource(R.string.sip_uri_of_another_proxy_server)) },
onValueChange = { onValueChange = {
outbound2.value = it outbound2 = it
newOutbound2 = outbound2.value newOutbound2 = outbound2
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
singleLine = true, singleLine = true,
@@ -653,10 +519,10 @@ private fun Outbound() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun Register() { fun Register() {
val ctx = LocalContext.current val ctx = LocalContext.current
Row( Row(
Modifier Modifier
@@ -675,7 +541,8 @@ private fun Register() {
}, },
fontSize = 18.sp, fontSize = 18.sp,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
var register by remember { mutableStateOf(oldRegister) } var register by remember { mutableStateOf(acc.regint > 0) }
newRegister = register
Switch( Switch(
checked = register, checked = register,
onCheckedChange = { onCheckedChange = {
@@ -684,10 +551,10 @@ private fun Register() {
} }
) )
} }
} }
@Composable @Composable
private fun RegInt() { fun RegInt() {
val ctx = LocalContext.current val ctx = LocalContext.current
Row( Row(
Modifier Modifier
@@ -696,7 +563,8 @@ private fun RegInt() {
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
var regInt by remember { mutableStateOf(oldRegInt) } var regInt by remember { mutableStateOf(acc.configuredRegInt.toString()) }
newRegInt = regInt
OutlinedTextField( OutlinedTextField(
value = regInt, value = regInt,
placeholder = { Text(stringResource(R.string.reg_int)) }, placeholder = { Text(stringResource(R.string.reg_int)) },
@@ -717,10 +585,10 @@ private fun RegInt() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
) )
} }
} }
@Composable @Composable
private fun AudioCodecs(navController: NavController, aor: String) { fun AudioCodecs(navController: NavController, aor: String) {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -741,10 +609,10 @@ private fun AudioCodecs(navController: NavController, aor: String) {
fontWeight = FontWeight. Bold fontWeight = FontWeight. Bold
) )
} }
} }
@Composable @Composable
private fun MediaEnc() { fun MediaEnc() {
val ctx = LocalContext.current val ctx = LocalContext.current
Row( Row(
Modifier Modifier
@@ -764,7 +632,8 @@ private fun MediaEnc() {
color = LocalCustomColors.current.itemText, color = LocalCustomColors.current.itemText,
fontSize = 18.sp) fontSize = 18.sp)
val isDropDownExpanded = remember { mutableStateOf(false) } val isDropDownExpanded = remember { mutableStateOf(false) }
val mediaEnc = remember { mutableStateOf(oldMediaEnc) } var mediaEnc by remember { mutableStateOf(acc.mediaEnc) }
newMediaEnc = mediaEnc
Box { Box {
Row( Row(
horizontalArrangement = Arrangement.Center, horizontalArrangement = Arrangement.Center,
@@ -773,7 +642,7 @@ private fun MediaEnc() {
isDropDownExpanded.value = true isDropDownExpanded.value = true
} }
) { ) {
Text(text = mediaEncMap[mediaEnc.value]!!, Text(text = mediaEncMap[mediaEnc]!!,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
CustomElements.DrawDrawable(R.drawable.arrow_drop_down, CustomElements.DrawDrawable(R.drawable.arrow_drop_down,
tint = LocalCustomColors.current.itemText) tint = LocalCustomColors.current.itemText)
@@ -791,8 +660,8 @@ private fun MediaEnc() {
}, },
onClick = { onClick = {
isDropDownExpanded.value = false isDropDownExpanded.value = false
mediaEnc.value = it.key mediaEnc = it.key
newMediaEnc = mediaEnc.value newMediaEnc = mediaEnc
}) })
if (index < 4) if (index < 4)
HorizontalDivider( HorizontalDivider(
@@ -804,10 +673,10 @@ private fun MediaEnc() {
} }
} }
} }
} }
@Composable @Composable
private fun MediaNat(currentMediaNat: String, onMediaNatSelected: (String) -> Unit) { fun MediaNat(currentMediaNat: String, onMediaNatSelected: (String) -> Unit) {
val ctx = LocalContext.current val ctx = LocalContext.current
Row( Row(
Modifier Modifier
@@ -865,10 +734,10 @@ private fun MediaNat(currentMediaNat: String, onMediaNatSelected: (String) -> Un
} }
} }
} }
} }
@Composable @Composable
private fun StunServer() { fun StunServer() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -877,7 +746,8 @@ private fun StunServer() {
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var stunServer by remember { mutableStateOf(oldStunServer) } var stunServer by remember { mutableStateOf(acc.stunServer) }
newStunServer = stunServer
OutlinedTextField( OutlinedTextField(
value = stunServer, value = stunServer,
placeholder = { Text(stringResource(R.string.stun_server)) }, placeholder = { Text(stringResource(R.string.stun_server)) },
@@ -898,10 +768,10 @@ private fun StunServer() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun StunUser() { fun StunUser() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -910,7 +780,8 @@ private fun StunUser() {
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var stunUser by remember { mutableStateOf(oldStunUser) } var stunUser by remember { mutableStateOf(acc.stunUser) }
newStunUser = stunUser
OutlinedTextField( OutlinedTextField(
value = stunUser, value = stunUser,
placeholder = { Text(stringResource(R.string.stun_username)) }, placeholder = { Text(stringResource(R.string.stun_username)) },
@@ -931,10 +802,10 @@ private fun StunUser() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun StunPass() { fun StunPass() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -944,7 +815,8 @@ private fun StunPass() {
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
val showPassword = remember { mutableStateOf(false) } val showPassword = remember { mutableStateOf(false) }
var stunPass by remember { mutableStateOf(oldStunPass) } var stunPass by remember { mutableStateOf(acc.stunPass) }
newStunPass = stunPass
OutlinedTextField( OutlinedTextField(
value = stunPass, value = stunPass,
placeholder = { Text(stringResource(R.string.stun_password)) }, placeholder = { Text(stringResource(R.string.stun_password)) },
@@ -991,10 +863,10 @@ private fun StunPass() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun RtcpMux() { fun RtcpMux() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1013,7 +885,8 @@ private fun RtcpMux() {
}, },
fontSize = 18.sp, fontSize = 18.sp,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
var rtcpMux by remember { mutableStateOf(oldRtcpMux) } var rtcpMux by remember { mutableStateOf(acc.rtcpMux) }
newRtcpMux = rtcpMux
Switch( Switch(
checked = rtcpMux, checked = rtcpMux,
onCheckedChange = { onCheckedChange = {
@@ -1022,10 +895,10 @@ private fun RtcpMux() {
} }
) )
} }
} }
@Composable @Composable
private fun Rel100() { fun Rel100() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1044,7 +917,8 @@ private fun Rel100() {
}, },
fontSize = 18.sp, fontSize = 18.sp,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
var rel100 by remember { mutableStateOf(old100Rel) } var rel100 by remember { mutableStateOf(acc.rel100Mode == Api.REL100_ENABLED) }
new100Rel = rel100
Switch( Switch(
checked = rel100, checked = rel100,
onCheckedChange = { onCheckedChange = {
@@ -1053,10 +927,10 @@ private fun Rel100() {
} }
) )
} }
} }
@Composable @Composable
private fun Dtmf() { fun Dtmf() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1081,7 +955,8 @@ private fun Dtmf() {
val isDropDownExpanded = remember { val isDropDownExpanded = remember {
mutableStateOf(false) mutableStateOf(false)
} }
val dtmfMode = remember { mutableIntStateOf(oldDtmfMode) } val dtmfMode = remember { mutableIntStateOf(acc.dtmfMode) }
newDtmfMode = dtmfMode.intValue
Box { Box {
Row( Row(
horizontalArrangement = Arrangement.Center, horizontalArrangement = Arrangement.Center,
@@ -1120,10 +995,10 @@ private fun Dtmf() {
} }
} }
} }
} }
@Composable @Composable
private fun Answer() { fun Answer() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1147,7 +1022,8 @@ private fun Answer() {
val isDropDownExpanded = remember { val isDropDownExpanded = remember {
mutableStateOf(false) mutableStateOf(false)
} }
val answerMode = remember { mutableIntStateOf(oldAnswerMode) } var answerMode by remember { mutableIntStateOf(acc.answerMode) }
newAnswerMode = answerMode
Box { Box {
Row( Row(
horizontalArrangement = Arrangement.Center, horizontalArrangement = Arrangement.Center,
@@ -1156,7 +1032,7 @@ private fun Answer() {
isDropDownExpanded.value = true isDropDownExpanded.value = true
} }
) { ) {
Text(text = answerModeMap[answerMode.intValue]!!, Text(text = answerModeMap[answerMode]!!,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
CustomElements.DrawDrawable(R.drawable.arrow_drop_down, CustomElements.DrawDrawable(R.drawable.arrow_drop_down,
tint = LocalCustomColors.current.itemText) tint = LocalCustomColors.current.itemText)
@@ -1171,8 +1047,8 @@ private fun Answer() {
DropdownMenuItem(text = { Text(text = it.value) }, DropdownMenuItem(text = { Text(text = it.value) },
onClick = { onClick = {
isDropDownExpanded.value = false isDropDownExpanded.value = false
answerMode.intValue = it.key answerMode = it.key
newAnswerMode = answerMode.intValue newAnswerMode = answerMode
}) })
if (index < 1) if (index < 1)
HorizontalDivider( HorizontalDivider(
@@ -1184,10 +1060,10 @@ private fun Answer() {
} }
} }
} }
} }
@Composable @Composable
private fun Redirect() { fun Redirect() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1211,7 +1087,8 @@ private fun Redirect() {
val isDropDownExpanded = remember { val isDropDownExpanded = remember {
mutableStateOf(false) mutableStateOf(false)
} }
val autoRedirect = remember { mutableStateOf(oldAutoRedirect) } var autoRedirect by remember { mutableStateOf(acc.autoRedirect) }
newAutoRedirect = autoRedirect
Box { Box {
Row( Row(
horizontalArrangement = Arrangement.Center, horizontalArrangement = Arrangement.Center,
@@ -1220,7 +1097,7 @@ private fun Redirect() {
isDropDownExpanded.value = true isDropDownExpanded.value = true
} }
) { ) {
Text(text = redirectModeMap[autoRedirect.value]!!, Text(text = redirectModeMap[autoRedirect]!!,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
CustomElements.DrawDrawable(R.drawable.arrow_drop_down, CustomElements.DrawDrawable(R.drawable.arrow_drop_down,
tint = LocalCustomColors.current.itemText) tint = LocalCustomColors.current.itemText)
@@ -1237,8 +1114,8 @@ private fun Redirect() {
}, },
onClick = { onClick = {
isDropDownExpanded.value = false isDropDownExpanded.value = false
autoRedirect.value = it.key autoRedirect = it.key
newAutoRedirect = autoRedirect.value newAutoRedirect = autoRedirect
}) })
if (index < 1) if (index < 1)
HorizontalDivider( HorizontalDivider(
@@ -1250,10 +1127,10 @@ private fun Redirect() {
} }
} }
} }
} }
@Composable @Composable
private fun Voicemail() { fun Voicemail() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1262,7 +1139,8 @@ private fun Voicemail() {
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var vmUri by remember { mutableStateOf(oldVmUri) } var vmUri by remember { mutableStateOf(acc.vmUri) }
newVmUri = vmUri
OutlinedTextField( OutlinedTextField(
value = vmUri, value = vmUri,
placeholder = { Text(stringResource(R.string.voicemail_uri)) }, placeholder = { Text(stringResource(R.string.voicemail_uri)) },
@@ -1283,10 +1161,10 @@ private fun Voicemail() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun CountryCode() { fun CountryCode() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1295,7 +1173,8 @@ private fun CountryCode() {
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var countryCode by remember { mutableStateOf(oldCountryCode) } var countryCode by remember { mutableStateOf(acc.countryCode) }
newCountryCode = countryCode
OutlinedTextField( OutlinedTextField(
value = countryCode, value = countryCode,
placeholder = { Text(stringResource(R.string.country_code)) }, placeholder = { Text(stringResource(R.string.country_code)) },
@@ -1316,10 +1195,10 @@ private fun CountryCode() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun TelProvider() { fun TelProvider() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1328,7 +1207,8 @@ private fun TelProvider() {
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var telProvider by remember { mutableStateOf(oldTelProvider) } var telProvider by remember { mutableStateOf(acc.telProvider) }
newTelProvider = telProvider
OutlinedTextField( OutlinedTextField(
value = telProvider, value = telProvider,
placeholder = { Text(stringResource(R.string.telephony_provider)) }, placeholder = { Text(stringResource(R.string.telephony_provider)) },
@@ -1349,10 +1229,10 @@ private fun TelProvider() {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
) )
} }
} }
@Composable @Composable
private fun NumericKeypad(acc: Account) { fun NumericKeypad() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1372,6 +1252,7 @@ private fun NumericKeypad(acc: Account) {
fontSize = 18.sp, fontSize = 18.sp,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
var numericKeypad by remember { mutableStateOf(acc.numericKeypad) } var numericKeypad by remember { mutableStateOf(acc.numericKeypad) }
newNumericKeypad = numericKeypad
Switch( Switch(
checked = numericKeypad, checked = numericKeypad,
onCheckedChange = { onCheckedChange = {
@@ -1380,10 +1261,10 @@ private fun NumericKeypad(acc: Account) {
} }
) )
} }
} }
@Composable @Composable
private fun DefaultAccount() { fun DefaultAccount() {
Row( Row(
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
@@ -1402,7 +1283,8 @@ private fun DefaultAccount() {
}, },
fontSize = 18.sp, fontSize = 18.sp,
color = LocalCustomColors.current.itemText) color = LocalCustomColors.current.itemText)
var defaultAccount by remember { mutableStateOf(oldDefaultAccount) } var defaultAccount by remember { mutableStateOf(UserAgent.findAorIndex(acc.aor)!! == 0) }
newDefaultAccount = defaultAccount
Switch( Switch(
checked = defaultAccount, checked = defaultAccount,
onCheckedChange = { onCheckedChange = {
@@ -1411,6 +1293,65 @@ private fun DefaultAccount() {
} }
) )
} }
}
if (showAlert.value) {
AlertDialog(
showDialog = showAlert,
title = alertTitle.value,
message = alertMessage.value,
positiveButtonText = stringResource(R.string.ok),
)
}
keyboardController = LocalSoftwareKeyboardController.current
val scrollState = rememberScrollState()
Column(
modifier = Modifier
.fillMaxWidth()
.padding(contentPadding)
.padding(start = 16.dp, end = 4.dp, top = 8.dp, bottom = 16.dp)
.verticalScrollbar(scrollState)
.verticalScroll(state = scrollState),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
AoR()
Nickname()
DisplayName()
AuthUser()
AuthPass()
if (showPasswordDialog.value)
AskPassword(ctx, navController, ua)
Outbound()
Register()
RegInt()
AudioCodecs(navController, aor)
MediaEnc()
MediaNat(
currentMediaNat = mediaNatState,
onMediaNatSelected = { selectedMediaNat ->
mediaNatState = selectedMediaNat
newMediaNat = selectedMediaNat
}
)
if (showStun) {
StunServer()
StunUser()
StunPass()
}
RtcpMux()
Rel100()
Dtmf()
Answer()
Redirect()
Voicemail()
CountryCode()
TelProvider()
NumericKeypad()
DefaultAccount()
}
} }
private fun checkOnClick(ctx: Context, ua: UserAgent): Boolean { private fun checkOnClick(ctx: Context, ua: UserAgent): Boolean {
@@ -1418,7 +1359,7 @@ private fun checkOnClick(ctx: Context, ua: UserAgent): Boolean {
val acc = ua.account val acc = ua.account
val nn = newNickname.trim() val nn = newNickname.trim()
if (nn != oldNickname) { if (nn != acc.nickName.value) {
if (Account.checkDisplayName(nn)) { if (Account.checkDisplayName(nn)) {
if (nn == "" || Account.uniqueNickName(nn)) { if (nn == "" || Account.uniqueNickName(nn)) {
acc.nickName.value = nn acc.nickName.value = nn
@@ -1458,7 +1399,7 @@ private fun checkOnClick(ctx: Context, ua: UserAgent): Boolean {
} }
val au = newAuthUser.trim() val au = newAuthUser.trim()
if (au != oldAuthUser) { if (au != acc.authUser) {
if (Account.checkAuthUser(au)) { if (Account.checkAuthUser(au)) {
if (Api.account_set_auth_user(acc.accp, au) == 0) { if (Api.account_set_auth_user(acc.accp, au) == 0) {
acc.authUser = Api.account_auth_user(acc.accp) acc.authUser = Api.account_auth_user(acc.accp)
@@ -1480,7 +1421,7 @@ private fun checkOnClick(ctx: Context, ua: UserAgent): Boolean {
val ap = newAuthPass.trim() val ap = newAuthPass.trim()
if (ap != "") { if (ap != "") {
if (ap != oldAuthPass) { if (ap != acc.authPass) {
if (Account.checkAuthPass(ap)) { if (Account.checkAuthPass(ap)) {
if (Api.account_set_auth_pass(acc.accp, ap) == 0) { if (Api.account_set_auth_pass(acc.accp, ap) == 0) {
acc.authPass = Api.account_auth_pass(acc.accp) acc.authPass = Api.account_auth_pass(acc.accp)
@@ -1575,28 +1516,28 @@ private fun checkOnClick(ctx: Context, ua: UserAgent): Boolean {
Log.d(TAG, "New regint is ${acc.regint}") Log.d(TAG, "New regint is ${acc.regint}")
reRegister = true reRegister = true
} }
} else {
if (regInt != acc.configuredRegInt) {
acc.configuredRegInt = regInt
} }
else {
if (regInt != acc.configuredRegInt)
acc.configuredRegInt = regInt
} }
if (newMediaEnc != acc.mediaEnc) { if (newMediaEnc != acc.mediaEnc) {
if (Api.account_set_mediaenc(acc.accp, newMediaEnc) == 0) { if (Api.account_set_mediaenc(acc.accp, newMediaEnc) == 0) {
acc.mediaEnc = Api.account_mediaenc(acc.accp) acc.mediaEnc = Api.account_mediaenc(acc.accp)
Log.d(TAG, "New mediaenc is ${acc.mediaEnc}") Log.d(TAG, "New mediaenc is ${acc.mediaEnc}")
} else {
Log.e(TAG, "Setting of mediaenc $newMediaEnc failed")
} }
else
Log.e(TAG, "Setting of mediaenc $newMediaEnc failed")
} }
if (newMediaNat != acc.mediaNat) { if (newMediaNat != acc.mediaNat) {
if (Api.account_set_medianat(acc.accp, newMediaNat) == 0) { if (Api.account_set_medianat(acc.accp, newMediaNat) == 0) {
acc.mediaNat = Api.account_medianat(acc.accp) acc.mediaNat = Api.account_medianat(acc.accp)
Log.d(TAG, "New medianat is ${acc.mediaNat}") Log.d(TAG, "New medianat is ${acc.mediaNat}")
} else {
Log.e(TAG, "Setting of medianat $newMediaNat failed")
} }
else
Log.e(TAG, "Setting of medianat $newMediaNat failed")
} }
newStunServer = newStunServer.trim() newStunServer = newStunServer.trim()