Loading cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/HomeScreen.kt +158 −87 Original line number Diff line number Diff line Loading @@ -129,17 +129,86 @@ private fun SearchPanelContent( .padding(dimensionResource(dimen.padding)) ) { val density = LocalDensity.current val textFieldRequester = remember { FocusRequester() } // Measure the height of this row for peekHeight PeekHeightContent( searchQuery = searchQuery, onSearchQueryChange = onSearchQueryChange, onSearchFocusChange = onSearchFocusChange, onSearchEvent = onSearchEvent, textFieldRequester = textFieldRequester, homeInSearchScreen = homeInSearchScreen, pinnedPlaces = pinnedPlaces, onPlaceSelected = onPlaceSelected, onPeekHeightChange = onPeekHeightChange, density = density ) ContentBelow( homeInSearchScreen = homeInSearchScreen, geocodePlaces = geocodePlaces, onPlaceSelected = onPlaceSelected, addressFormatter = addressFormatter ) } } @Composable private fun PeekHeightContent( searchQuery: TextFieldValue, onSearchQueryChange: (TextFieldValue) -> Unit, onSearchFocusChange: (Boolean) -> Unit, onSearchEvent: () -> Unit, textFieldRequester: FocusRequester, homeInSearchScreen: Boolean, pinnedPlaces: List<Place>, onPlaceSelected: (Place) -> Unit, onPeekHeightChange: (Dp) -> Unit, density: androidx.compose.ui.unit.Density, ) { Column( modifier = Modifier .fillMaxWidth() .onGloballyPositioned { coordinates -> val heightInDp = with(density) { coordinates.size.height.toDp() } onPeekHeightChange(heightInDp) }) { val textField = remember { FocusRequester() } // Search box with "Where to?" placeholder } ) { SearchTextField( searchQuery = searchQuery, onSearchQueryChange = onSearchQueryChange, onSearchFocusChange = onSearchFocusChange, onSearchEvent = onSearchEvent, textFieldRequester = textFieldRequester, homeInSearchScreen = homeInSearchScreen ) PinnedPlacesRow( pinnedPlaces = pinnedPlaces, homeInSearchScreen = homeInSearchScreen, onPlaceSelected = onPlaceSelected ) HorizontalDivider( modifier = Modifier .fillMaxWidth() .padding(vertical = dimensionResource(dimen.padding) / 2), thickness = DividerDefaults.Thickness, color = MaterialTheme.colorScheme.outlineVariant ) } } @Composable private fun SearchTextField( searchQuery: TextFieldValue, onSearchQueryChange: (TextFieldValue) -> Unit, onSearchFocusChange: (Boolean) -> Unit, onSearchEvent: () -> Unit, textFieldRequester: FocusRequester, homeInSearchScreen: Boolean, ) { TextField( value = searchQuery, onValueChange = onSearchQueryChange, Loading @@ -147,7 +216,7 @@ private fun SearchPanelContent( keyboardActions = KeyboardActions(onSearch = { onSearchEvent() }), singleLine = true, modifier = Modifier .focusRequester(textField) .focusRequester(textFieldRequester) .fillMaxWidth() .padding(bottom = dimensionResource(dimen.padding)) .onFocusChanged { focusState -> Loading Loading @@ -181,17 +250,22 @@ private fun SearchPanelContent( shape = RoundedCornerShape(dimensionResource(dimen.icon_size)) ) // This block is responsible for returning focus to the search bar after we pop back to the search panel from a place card. LaunchedEffect(homeInSearchScreen) { if (homeInSearchScreen) { textField.requestFocus() textFieldRequester.requestFocus() } } } @Composable private fun PinnedPlacesRow( pinnedPlaces: List<Place>, homeInSearchScreen: Boolean, onPlaceSelected: (Place) -> Unit, ) { AnimatedVisibility( visible = pinnedPlaces.isNotEmpty() ) { // The homeInSearchScreen isn't part of the animated visibility condition because it looks weird. if (!homeInSearchScreen) { FlowRow( modifier = Modifier Loading @@ -206,17 +280,15 @@ private fun SearchPanelContent( } } } // Inset horizontal divider HorizontalDivider( modifier = Modifier .fillMaxWidth() .padding(vertical = dimensionResource(dimen.padding) / 2), thickness = DividerDefaults.Thickness, color = MaterialTheme.colorScheme.outlineVariant ) } @Composable private fun ContentBelow( homeInSearchScreen: Boolean, geocodePlaces: List<Place>, onPlaceSelected: (Place) -> Unit, addressFormatter: AddressFormatter, ) { if (homeInSearchScreen) { LazyColumn { items(geocodePlaces) { Loading @@ -233,7 +305,6 @@ private fun SearchPanelContent( SavedPlacesList(savedPlacesViewModel, onPlaceSelected = onPlaceSelected) } } } @Composable fun NavigationIcon( Loading Loading
cardinal-android/app/src/main/java/earth/maps/cardinal/ui/home/HomeScreen.kt +158 −87 Original line number Diff line number Diff line Loading @@ -129,17 +129,86 @@ private fun SearchPanelContent( .padding(dimensionResource(dimen.padding)) ) { val density = LocalDensity.current val textFieldRequester = remember { FocusRequester() } // Measure the height of this row for peekHeight PeekHeightContent( searchQuery = searchQuery, onSearchQueryChange = onSearchQueryChange, onSearchFocusChange = onSearchFocusChange, onSearchEvent = onSearchEvent, textFieldRequester = textFieldRequester, homeInSearchScreen = homeInSearchScreen, pinnedPlaces = pinnedPlaces, onPlaceSelected = onPlaceSelected, onPeekHeightChange = onPeekHeightChange, density = density ) ContentBelow( homeInSearchScreen = homeInSearchScreen, geocodePlaces = geocodePlaces, onPlaceSelected = onPlaceSelected, addressFormatter = addressFormatter ) } } @Composable private fun PeekHeightContent( searchQuery: TextFieldValue, onSearchQueryChange: (TextFieldValue) -> Unit, onSearchFocusChange: (Boolean) -> Unit, onSearchEvent: () -> Unit, textFieldRequester: FocusRequester, homeInSearchScreen: Boolean, pinnedPlaces: List<Place>, onPlaceSelected: (Place) -> Unit, onPeekHeightChange: (Dp) -> Unit, density: androidx.compose.ui.unit.Density, ) { Column( modifier = Modifier .fillMaxWidth() .onGloballyPositioned { coordinates -> val heightInDp = with(density) { coordinates.size.height.toDp() } onPeekHeightChange(heightInDp) }) { val textField = remember { FocusRequester() } // Search box with "Where to?" placeholder } ) { SearchTextField( searchQuery = searchQuery, onSearchQueryChange = onSearchQueryChange, onSearchFocusChange = onSearchFocusChange, onSearchEvent = onSearchEvent, textFieldRequester = textFieldRequester, homeInSearchScreen = homeInSearchScreen ) PinnedPlacesRow( pinnedPlaces = pinnedPlaces, homeInSearchScreen = homeInSearchScreen, onPlaceSelected = onPlaceSelected ) HorizontalDivider( modifier = Modifier .fillMaxWidth() .padding(vertical = dimensionResource(dimen.padding) / 2), thickness = DividerDefaults.Thickness, color = MaterialTheme.colorScheme.outlineVariant ) } } @Composable private fun SearchTextField( searchQuery: TextFieldValue, onSearchQueryChange: (TextFieldValue) -> Unit, onSearchFocusChange: (Boolean) -> Unit, onSearchEvent: () -> Unit, textFieldRequester: FocusRequester, homeInSearchScreen: Boolean, ) { TextField( value = searchQuery, onValueChange = onSearchQueryChange, Loading @@ -147,7 +216,7 @@ private fun SearchPanelContent( keyboardActions = KeyboardActions(onSearch = { onSearchEvent() }), singleLine = true, modifier = Modifier .focusRequester(textField) .focusRequester(textFieldRequester) .fillMaxWidth() .padding(bottom = dimensionResource(dimen.padding)) .onFocusChanged { focusState -> Loading Loading @@ -181,17 +250,22 @@ private fun SearchPanelContent( shape = RoundedCornerShape(dimensionResource(dimen.icon_size)) ) // This block is responsible for returning focus to the search bar after we pop back to the search panel from a place card. LaunchedEffect(homeInSearchScreen) { if (homeInSearchScreen) { textField.requestFocus() textFieldRequester.requestFocus() } } } @Composable private fun PinnedPlacesRow( pinnedPlaces: List<Place>, homeInSearchScreen: Boolean, onPlaceSelected: (Place) -> Unit, ) { AnimatedVisibility( visible = pinnedPlaces.isNotEmpty() ) { // The homeInSearchScreen isn't part of the animated visibility condition because it looks weird. if (!homeInSearchScreen) { FlowRow( modifier = Modifier Loading @@ -206,17 +280,15 @@ private fun SearchPanelContent( } } } // Inset horizontal divider HorizontalDivider( modifier = Modifier .fillMaxWidth() .padding(vertical = dimensionResource(dimen.padding) / 2), thickness = DividerDefaults.Thickness, color = MaterialTheme.colorScheme.outlineVariant ) } @Composable private fun ContentBelow( homeInSearchScreen: Boolean, geocodePlaces: List<Place>, onPlaceSelected: (Place) -> Unit, addressFormatter: AddressFormatter, ) { if (homeInSearchScreen) { LazyColumn { items(geocodePlaces) { Loading @@ -233,7 +305,6 @@ private fun SearchPanelContent( SavedPlacesList(savedPlacesViewModel, onPlaceSelected = onPlaceSelected) } } } @Composable fun NavigationIcon( Loading