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.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.core.net.toUri
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner
@ -71,9 +72,7 @@ import androidx.navigation.NavType
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.navArgument import androidx.navigation.navArgument
import coil.compose.AsyncImage import coil.compose.AsyncImage
import androidx.core.net.toUri
import com.tutpro.baresip.CustomElements.AlertDialog import com.tutpro.baresip.CustomElements.AlertDialog
import com.tutpro.baresip.CustomElements.SelectableAlertDialog
import com.tutpro.baresip.CustomElements.verticalScrollbar import com.tutpro.baresip.CustomElements.verticalScrollbar
fun NavGraphBuilder.callsScreenRoute(navController: NavController, viewModel: ViewModel) { fun NavGraphBuilder.callsScreenRoute(navController: NavController, viewModel: ViewModel) {
@ -311,15 +310,6 @@ private fun Calls(
lastButtonText = stringResource(R.string.ok), 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() val lazyListState = rememberLazyListState()
LazyColumn( LazyColumn(
modifier = Modifier modifier = Modifier

View File

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

View File

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

View File

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

View File

@ -81,7 +81,6 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import coil.compose.AsyncImage import coil.compose.AsyncImage
import com.tutpro.baresip.CustomElements.AlertDialog import com.tutpro.baresip.CustomElements.AlertDialog
import com.tutpro.baresip.CustomElements.SelectableAlertDialog
import com.tutpro.baresip.CustomElements.TextAvatar import com.tutpro.baresip.CustomElements.TextAvatar
import com.tutpro.baresip.CustomElements.verticalScrollbar import com.tutpro.baresip.CustomElements.verticalScrollbar
import java.io.ByteArrayOutputStream 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( Scaffold(
modifier = Modifier.fillMaxSize().imePadding(), modifier = Modifier.fillMaxSize().imePadding(),
containerColor = MaterialTheme.colorScheme.background, containerColor = MaterialTheme.colorScheme.background,

View File

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