Show URI's label (if exists) in the list of selectable contact URIs

This commit is contained in:
Juha Heinanen
2026-05-31 17:46:30 +03:00
parent be65d99ac1
commit 269373f259
6 changed files with 27 additions and 49 deletions

View File

@ -62,6 +62,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.net.toUri
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
@ -71,9 +72,7 @@ import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import coil.compose.AsyncImage
import androidx.core.net.toUri
import com.tutpro.baresip.CustomElements.AlertDialog
import com.tutpro.baresip.CustomElements.SelectableAlertDialog
import com.tutpro.baresip.CustomElements.verticalScrollbar
fun NavGraphBuilder.callsScreenRoute(navController: NavController, viewModel: ViewModel) {
@ -311,15 +310,6 @@ private fun Calls(
lastButtonText = stringResource(R.string.ok),
)
SelectableAlertDialog(
openDialog = CustomElements.showSelectItemDialog,
title = stringResource(R.string.choose_destination_uri),
items = CustomElements.selectItems.value,
onItemClicked = CustomElements.selectItemAction.value,
neutralButtonText = stringResource(R.string.cancel),
onNeutralClicked = {}
)
val lazyListState = rememberLazyListState()
LazyColumn(
modifier = Modifier

View File

@ -593,7 +593,7 @@ private fun NewChatPeer(ctx: Context, navController: NavController, account: Acc
showSuggestions = false
val peerText = newPeer.trim()
if (peerText.isNotEmpty()) {
val uris = Contact.contactUris(peerText, account.isMobile)
val uris = Contact.contactContactUris(peerText, account.isMobile)
if (uris.isEmpty()) {
if (Contact.nameExists(peerText, BaresipService.contacts, true)) {
alertTitle.value = ctx.getString(R.string.notice)
@ -606,11 +606,11 @@ private fun NewChatPeer(ctx: Context, navController: NavController, account: Acc
makeChat(ctx, navController, account, peerText)
}
} else if (uris.size == 1)
makeChat(ctx, navController, account, uris[0])
makeChat(ctx, navController, account, uris[0].uri)
else {
items.value = uris
items.value = uris.map { it.label.ifEmpty { it.uri.substringAfter(":") } }
itemAction.value = { index ->
makeChat(ctx, navController, account, uris[index])
makeChat(ctx, navController, account, uris[index].uri)
}
showDialog.value = true
}

View File

@ -95,34 +95,29 @@ sealed class Contact {
return null
}
fun contactUris(name: String, tel: Boolean = false): ArrayList<String> {
val uris = ArrayList<String>()
fun contactContactUris(name: String, tel: Boolean = false): List<ContactUri> {
synchronized(BaresipService.contacts) {
for (c in BaresipService.contacts)
when (c) {
is BaresipContact -> {
if (c.name.equals(name, ignoreCase = true)) {
for (u in c.uris) {
if (tel && !u.uri.startsWith("tel:"))
continue
uris.add(u.uri)
}
return uris
return if (tel)
c.uris.filter { it.uri.startsWith("tel:") }
else
c.uris
}
}
is AndroidContact -> {
if (c.name == name) {
for (u in c.uris) {
if (tel && !u.uri.startsWith("tel:"))
continue
uris.add(u.uri)
}
return uris
return if (tel)
c.uris.filter { it.uri.startsWith("tel:") }
else
c.uris
}
}
}
}
return uris
return emptyList()
}
fun findContact(uri: String): Contact? {

View File

@ -648,7 +648,10 @@ private fun UrisSection(
modifier = Modifier.fillMaxWidth(),
textStyle = androidx.compose.ui.text.TextStyle(fontSize = 18.sp),
label = { Text(stringResource(R.string.label)) },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
keyboardOptions = KeyboardOptions(
capitalization = KeyboardCapitalization.Words,
keyboardType = KeyboardType.Text
)
)
}
if (uris.size > 1) {

View File

@ -81,7 +81,6 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import coil.compose.AsyncImage
import com.tutpro.baresip.CustomElements.AlertDialog
import com.tutpro.baresip.CustomElements.SelectableAlertDialog
import com.tutpro.baresip.CustomElements.TextAvatar
import com.tutpro.baresip.CustomElements.verticalScrollbar
import java.io.ByteArrayOutputStream
@ -397,15 +396,6 @@ private fun ContactsScreen(navController: NavController) {
}
)
SelectableAlertDialog(
openDialog = CustomElements.showSelectItemDialog,
title = stringResource(R.string.choose_destination_uri),
items = CustomElements.selectItems.value,
onItemClicked = CustomElements.selectItemAction.value,
neutralButtonText = stringResource(R.string.cancel),
onNeutralClicked = {}
)
Scaffold(
modifier = Modifier.fillMaxSize().imePadding(),
containerColor = MaterialTheme.colorScheme.background,

View File

@ -1830,11 +1830,11 @@ private fun CallRow(
call.showSuggestions.value = false
var uriText = transferUri.trim()
if (uriText.isNotEmpty()) {
val uris = Contact.contactUris(uriText)
val uris = Contact.contactContactUris(uriText)
if (uris.size > 1) {
selectItems.value = uris
selectItems.value = uris.map { it.label.ifEmpty { it.uri.substringAfter(":") } }
selectItemAction.value = { index ->
val uri = uris[index]
val uri = uris[index].uri
transfer(
ctx,
viewModel,
@ -1847,7 +1847,7 @@ private fun CallRow(
showSelectItemDialog.value = true
}
else {
if (uris.size == 1) uriText = uris[0]
if (uris.size == 1) uriText = uris[0].uri
transfer(
ctx,
viewModel,
@ -2062,7 +2062,7 @@ private fun callClick(ctx: Context, viewModel: ViewModel, dialerState: ViewModel
uriText == Utils.friendlyUri(ctx, dialerState.redialUri, ua!!.account))
dialerState.redialUri
else {
val uris = Contact.contactUris(uriText, ua?.account?.isMobile ?: false)
val uris = Contact.contactContactUris(uriText, ua?.account?.isMobile ?: false)
if (uris.isEmpty()) {
if (Contact.nameExists(uriText, BaresipService.contacts, true)) {
alertTitle.value = ctx.getString(R.string.notice)
@ -2076,11 +2076,11 @@ private fun callClick(ctx: Context, viewModel: ViewModel, dialerState: ViewModel
uriText
}
else if (uris.size == 1)
uris[0]
uris[0].uri
else {
selectItems.value = uris
selectItems.value = uris.map { it.label.ifEmpty { it.uri.substringAfter(":") } }
selectItemAction.value = { index ->
makeCall(ctx, viewModel, uris[index], dialerState)
makeCall(ctx, viewModel, uris[index].uri, dialerState)
}
showSelectItemDialog.value = true
return