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