Skip to content

Commit

Permalink
UI State Loss In BrainzPlayerSearchScreen
Browse files Browse the repository at this point in the history
  • Loading branch information
rahul31124 committed Jan 26, 2025
1 parent 9f3783d commit c245f75
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
Expand All @@ -26,6 +27,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.TextFieldValue
import androidx.hilt.navigation.compose.hiltViewModel
import org.listenbrainz.android.R
import org.listenbrainz.android.model.PlayableType
Expand All @@ -46,21 +48,15 @@ fun BrainzPlayerSearchScreen(
deactivate: () -> Unit,
) {
val context = LocalContext.current
var brainzplayerQueryState by remember {
mutableStateOf("")
}

val searchItems = remember {
mutableStateListOf<Song>()
}
val brainzplayerQueryState by viewModel.searchQuery.collectAsState()
val searchItems by viewModel.searchItems.collectAsState()

var error by remember {
mutableStateOf<ResponseError?>(null)
}

fun onDismiss() {
searchItems.clear()
brainzplayerQueryState = ""
viewModel.clearSearchResults()
error = null
deactivate()
}
Expand All @@ -71,20 +67,22 @@ fun BrainzPlayerSearchScreen(
exit = fadeOut()
) {
SearchScreen(
uiState = remember(searchItems, brainzplayerQueryState, error) {
uiState = remember(searchItems, brainzplayerQueryState.text, error) {
SearchUiState(
query = brainzplayerQueryState,
query = brainzplayerQueryState.text,
result = searchItems,
error = error
)
},
onDismiss = ::onDismiss,
onQueryChange = { newValue ->
brainzplayerQueryState = newValue
searchItems.clear()
searchItems.addAll(viewModel.searchSongs(brainzplayerQueryState) ?: emptyList())
onQueryChange = { newValue: String ->
val updatedQuery = TextFieldValue(newValue, selection = brainzplayerQueryState.selection)
viewModel.updateSearchQuery(updatedQuery)
viewModel.searchSongs(newValue)
},
onClear = {
viewModel.clearSearchResults()
},
onClear = searchItems::clear,
onErrorShown = { error = null },
placeholderText = "Search your music library"
) {
Expand All @@ -102,12 +100,17 @@ fun BrainzPlayerSearchScreen(
onDropdownSuccess = { context.showToast(it) },
onDropdownError = { error = it }
) {
viewModel.changePlayable(listOf(song), PlayableType.SONG, song.mediaID, 0)
viewModel.changePlayable(
listOf(song),
PlayableType.SONG,
song.mediaID,
0
)
viewModel.playOrToggleSong(song, true)
onDismiss()
}
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.input.TextFieldValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.palette.graphics.Palette
Expand All @@ -23,6 +24,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -191,19 +193,37 @@ class BrainzPlayerViewModel @Inject constructor(
}
}

fun searchSongs(query: String): List<Song>? {
val listToSearch = _mediaItems.value.data
private val _searchQuery = MutableStateFlow(TextFieldValue(""))
val searchQuery: StateFlow<TextFieldValue> = _searchQuery

private val _searchItems = MutableStateFlow<List<Song>>(emptyList())
val searchItems: StateFlow<List<Song>> = _searchItems

fun updateSearchQuery(newQuery: TextFieldValue) {
_searchQuery.value = newQuery
}

fun searchSongs(query: String) {
val listToSearch = _mediaItems.value.data
if (query.isEmpty()) {
isSearching = false
_searchItems.value = emptyList()
} else {
val result: List<Song>? = listToSearch?.filter {
it.title.contains(query.trim(), ignoreCase = true)
}
_searchItems.value = result ?: emptyList()
isSearching = true
}
val result: List<Song>? = listToSearch?.filter {
it.title.contains(query.trim(), ignoreCase = true)
}
isSearching = true
return result
}

fun clearSearchResults() {
_searchItems.value = emptyList()
_searchQuery.value = TextFieldValue("")
}



fun playOrToggleSong(mediaItem: Song, toggle: Boolean = false) {
val isPrepared = playbackState.value.isPrepared
if (isPrepared && mediaItem.mediaID == currentlyPlayingSong.value.toSong.mediaID) {
Expand Down

0 comments on commit c245f75

Please sign in to comment.