feat(android): revert search screen to old design

The Material3 SearchBar component is just not for me
This commit is contained in:
Harsh Shandilya 2023-11-04 20:50:37 +05:30
parent f17fb4487e
commit 0b3286cd1e
No known key found for this signature in database
3 changed files with 118 additions and 22 deletions

View file

@ -15,6 +15,7 @@ import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -56,8 +57,10 @@ class SearchActivity : ComponentActivity() {
) { ) {
val navController = rememberNavController() val navController = rememberNavController()
val postActions = rememberPostActions(urlLauncher, navController, viewModel) val postActions = rememberPostActions(urlLauncher, navController, viewModel)
val listState = rememberLazyListState()
SearchList( SearchList(
items = viewModel.searchResults, items = viewModel.searchResults,
listState = listState,
isPostSaved = viewModel::isPostSaved, isPostSaved = viewModel::isPostSaved,
postActions = postActions, postActions = postActions,
searchQuery = viewModel.searchQuery, searchQuery = viewModel.searchQuery,

View file

@ -6,18 +6,25 @@
*/ */
package dev.msfjarvis.claw.android.ui.lists package dev.msfjarvis.claw.android.ui.lists
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.foundation.layout.size
import androidx.compose.material3.HorizontalDivider import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material3.SearchBar import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.SearchOff
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.isTraversalGroup import androidx.compose.ui.semantics.isTraversalGroup
@ -27,15 +34,15 @@ import androidx.compose.ui.zIndex
import androidx.paging.PagingData import androidx.paging.PagingData
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.posts.PostActions
import dev.msfjarvis.claw.common.ui.SearchBar
import dev.msfjarvis.claw.database.local.SavedPost import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LobstersPost import dev.msfjarvis.claw.model.LobstersPost
import dev.msfjarvis.claw.model.toSavedPost
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SearchList( fun SearchList(
items: Flow<PagingData<LobstersPost>>, items: Flow<PagingData<LobstersPost>>,
listState: LazyListState,
isPostSaved: (SavedPost) -> Boolean, isPostSaved: (SavedPost) -> Boolean,
postActions: PostActions, postActions: PostActions,
searchQuery: String, searchQuery: String,
@ -51,30 +58,36 @@ fun SearchList(
// Clear search field when navigating away // Clear search field when navigating away
onDispose { setSearchQuery("") } onDispose { setSearchQuery("") }
} }
var searchActive by remember { mutableStateOf(false) } var searchActive by remember { mutableStateOf(false) }
Column( Column(modifier = modifier.semantics { isTraversalGroup = true }.zIndex(1f).fillMaxWidth()) {
modifier = modifier.semantics { isTraversalGroup = true }.zIndex(1f).fillMaxWidth(),
) {
SearchBar( SearchBar(
query = searchQuery, value = searchQuery,
onQueryChange = setSearchQuery, onValueChange = setSearchQuery,
onSearch = { onSearch = {
triggerSearch(it) triggerSearch(it)
searchActive = true searchActive = true
}, },
active = searchActive,
onActiveChange = { searchActive = it },
modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp).testTag("search_bar"), modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp).testTag("search_bar"),
) { )
lazyPagingItems.itemSnapshotList.items.forEach { item -> if (searchActive) {
val dbModel = item.toSavedPost() NetworkPosts(
LobstersListItem( lazyPagingItems = lazyPagingItems,
item = dbModel, listState = listState,
isSaved = isPostSaved, isPostSaved = isPostSaved,
isRead = { false }, isPostRead = { false },
postActions = postActions, postActions = postActions,
) )
HorizontalDivider() } else {
Box(modifier = Modifier.fillMaxSize()) {
Column(modifier = Modifier.align(Alignment.Center)) {
Icon(
imageVector = Icons.Filled.SearchOff,
contentDescription = "No search results",
modifier = Modifier.align(Alignment.CenterHorizontally).size(36.dp),
)
Text(text = "Nothing to see here", style = MaterialTheme.typography.headlineSmall)
}
} }
} }
} }

View file

@ -0,0 +1,80 @@
/*
* Copyright © 2023 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.common.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import dev.msfjarvis.claw.common.theme.LobstersTheme
@Composable
fun SearchBar(
value: String,
onValueChange: (String) -> Unit,
onSearch: (String) -> Unit,
modifier: Modifier = Modifier,
) {
TextField(
value = value,
onValueChange = onValueChange,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
textStyle = MaterialTheme.typography.bodyLarge,
placeholder = { Text(text = "Search") },
trailingIcon = {
IconButton(onClick = { onSearch(value) }) {
Icon(imageVector = Icons.Outlined.Search, contentDescription = "Search")
}
},
keyboardActions = KeyboardActions(onSearch = { onSearch(value) }),
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.Text,
imeAction = ImeAction.Search,
),
singleLine = true,
modifier = modifier.focusable(),
)
}
@Preview
@Composable
fun SearchBarPreview() {
LobstersTheme {
Box(Modifier.fillMaxWidth().background(MaterialTheme.colorScheme.background).padding(8.dp)) {
var value by remember { mutableStateOf("") }
SearchBar(
value = value,
onValueChange = { value = it },
onSearch = {},
modifier = Modifier.align(Alignment.TopCenter)
)
}
}
}