From 56fb742af3248bcd22d131a6c23a4864a7151519 Mon Sep 17 00:00:00 2001 From: Alberto Pedron Date: Fri, 15 May 2026 22:23:47 +0200 Subject: [PATCH] SearchScreen: Show organization address on tap --- .../ouilookup/ui/search/SearchScreen.kt | 38 +++++++++++++++---- .../ouilookup/ui/search/SearchViewModel.kt | 8 ++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchScreen.kt b/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchScreen.kt index 0c2aaebf..368bab14 100644 --- a/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchScreen.kt +++ b/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.LocalOverscrollFactory +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow @@ -46,6 +47,7 @@ fun SearchScreen( val list: List by viewModel.list.collectAsState(listOf()) val lookupList: List by viewModel.bulkLookupList.collectAsState(listOf()) val placeholder by viewModel.placeholder.collectAsState(UiSearchPlaceholder.Instructions) + val selectedOui by viewModel.selectedOui.collectAsState() val clipboardPasteScope = rememberCoroutineScope() LifecycleEventEffect(Lifecycle.Event.ON_RESUME, lifecycleOwner) { @@ -62,7 +64,9 @@ fun SearchScreen( onTextChange = { value -> viewModel.onTextChange(value) }, list = list, lookupList = lookupList, - placeholder = placeholder + placeholder = placeholder, + selectedOui = selectedOui, + onOuiSelected = { oui -> viewModel.onOuiSelected(oui) } ) } @@ -73,7 +77,9 @@ fun SearchScreen( onTextChange: (value: String) -> Unit, list: List, lookupList: List, - placeholder: UiSearchPlaceholder? + placeholder: UiSearchPlaceholder?, + selectedOui: Oui?, + onOuiSelected: (Oui?) -> Unit ) { val scrollState = rememberLazyListState() val bottomBarVisible by remember { derivedStateOf { scrollState.firstVisibleItemIndex == 0 } } @@ -129,15 +135,29 @@ fun SearchScreen( } } else - items(list) { device -> + items(list) { oui -> ListItem( - headlineContent = { Text(device.orgName) }, - supportingContent = { Text(device.oui) } + headlineContent = { Text(oui.orgName) }, + supportingContent = { Text(oui.oui) }, + modifier = Modifier.clickable { onOuiSelected(oui) } ) } } } } + + selectedOui?.let { oui -> + AlertDialog( + onDismissRequest = { onOuiSelected(null) }, + title = { Text(oui.orgName) }, + text = { Text(oui.orgAddress) }, + confirmButton = { + TextButton(onClick = { onOuiSelected(null) }) { + Text(stringResource(android.R.string.ok)) + } + } + ) + } } @OptIn(ExperimentalMaterial3Api::class) @@ -238,7 +258,9 @@ fun DefaultPreview() { Oui("FF:FF:FF", "Google", "") ), lookupList = listOf("BB:BB:BB"), - placeholder = null + placeholder = null, + selectedOui = null, + onOuiSelected = { } ) } } @@ -253,7 +275,9 @@ fun EmptyPreview() { onTextChange = { }, list = emptyList(), lookupList = emptyList(), - placeholder = UiSearchPlaceholder.NoResults + placeholder = UiSearchPlaceholder.NoResults, + selectedOui = null, + onOuiSelected = { } ) } } diff --git a/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchViewModel.kt b/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchViewModel.kt index 533cbc70..c80499cb 100644 --- a/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchViewModel.kt +++ b/app/src/main/java/org/alberto97/ouilookup/ui/search/SearchViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import org.alberto97.ouilookup.db.Oui import org.alberto97.ouilookup.repository.IOuiRepository import org.alberto97.ouilookup.tools.IUpdateManager import org.alberto97.ouilookup.tools.StringInspector @@ -26,6 +27,9 @@ class SearchViewModel @Inject constructor( private val _bulkLookupList = MutableStateFlow(listOf()) val bulkLookupList = _bulkLookupList.asStateFlow() + private val _selectedOui = MutableStateFlow(null) + val selectedOui = _selectedOui.asStateFlow() + val list = combine(_text, _bulkLookupList) { text, list -> if (text.isNotEmpty()) repository.search(text) @@ -71,6 +75,10 @@ class SearchViewModel @Inject constructor( } } + fun onOuiSelected(oui: Oui?) { + _selectedOui.value = oui + } + fun onTextChange(text: String) { val list = StringInspector.splitForList(text) if (StringInspector.countSearchable(list) > 1) {