Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package com.sosauce.chocola.data.datastore

import android.content.Context
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
Expand All @@ -29,11 +28,13 @@ import com.sosauce.chocola.data.datastore.PreferencesKeys.HIDDEN_TRACKS
import com.sosauce.chocola.data.datastore.PreferencesKeys.INITIAL_SCREEN
import com.sosauce.chocola.data.datastore.PreferencesKeys.LYRICS_ALIGNMENT
import com.sosauce.chocola.data.datastore.PreferencesKeys.LYRICS_FONT_SIZE
import com.sosauce.chocola.data.datastore.PreferencesKeys.MATCH_CASE_FILTER
import com.sosauce.chocola.data.datastore.PreferencesKeys.MIN_TRACK_DURATION
import com.sosauce.chocola.data.datastore.PreferencesKeys.NUMBER_OF_ALBUM_GRIDS
import com.sosauce.chocola.data.datastore.PreferencesKeys.PALETTE_STYLE
import com.sosauce.chocola.data.datastore.PreferencesKeys.PAUSE_ON_MUTE
import com.sosauce.chocola.data.datastore.PreferencesKeys.PLAYLIST_SORT
import com.sosauce.chocola.data.datastore.PreferencesKeys.REGEX_FILTER
import com.sosauce.chocola.data.datastore.PreferencesKeys.SAF_TRACKS
import com.sosauce.chocola.data.datastore.PreferencesKeys.SEEK_BUTTONS_DURATION
import com.sosauce.chocola.data.datastore.PreferencesKeys.SHOW_ALBUM_NAME
Expand Down Expand Up @@ -86,6 +87,10 @@ data object PreferencesKeys {
val ALBUM_SORT = intPreferencesKey("ALBUM_SORT")
val TRACK_SORT = intPreferencesKey("TRACK_SORT")
val ARTIST_SORT = intPreferencesKey("ARTIST_SORT")

val REGEX_FILTER = booleanPreferencesKey("REGEX_FILTER")
val MATCH_CASE_FILTER = booleanPreferencesKey("MATCH_CASE_FILTER")

val PAUSE_ON_MUTE = booleanPreferencesKey("PAUSE_ON_MUTE")
val MIN_TRACK_DURATION = intPreferencesKey("MIN_TRACK_DURATION")
val PLAYLIST_SORT = intPreferencesKey("PLAYLIST_SORT")
Expand Down Expand Up @@ -203,6 +208,14 @@ fun rememberHasSeenTip() =
fun rememberSortTracksAscending() =
rememberPreference(key = SORT_TRACKS_ASCENDING, defaultValue = true)

@Composable
fun rememberRegexFilter() =
rememberPreference(key = REGEX_FILTER, defaultValue = false)

@Composable
fun rememberMatchCaseFilter() =
rememberPreference(key = MATCH_CASE_FILTER, defaultValue = false)

@Composable
fun rememberHiddenTracks() =
rememberPreference(key = HIDDEN_TRACKS, defaultValue = emptySet())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ import com.sosauce.chocola.data.datastore.PreferencesKeys.EQUALIZER_ENABLED
import com.sosauce.chocola.data.datastore.PreferencesKeys.EQUALIZER_PRESETS
import com.sosauce.chocola.data.datastore.PreferencesKeys.HIDDEN_TRACKS
import com.sosauce.chocola.data.datastore.PreferencesKeys.LAST_MUSIC_STATE
import com.sosauce.chocola.data.datastore.PreferencesKeys.MATCH_CASE_FILTER
import com.sosauce.chocola.data.datastore.PreferencesKeys.MIN_TRACK_DURATION
import com.sosauce.chocola.data.datastore.PreferencesKeys.PAUSE_ON_MUTE
import com.sosauce.chocola.data.datastore.PreferencesKeys.PLAYLIST_SORT
import com.sosauce.chocola.data.datastore.PreferencesKeys.REGEX_FILTER
import com.sosauce.chocola.data.datastore.PreferencesKeys.SAF_TRACKS
import com.sosauce.chocola.data.datastore.PreferencesKeys.SORT_ALBUMS_ASCENDING
import com.sosauce.chocola.data.datastore.PreferencesKeys.SORT_ARTISTS_ASCENDING
Expand All @@ -30,7 +32,6 @@ import com.sosauce.chocola.utils.copyMutate
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

class UserPreferences(
Expand All @@ -57,6 +58,14 @@ class UserPreferences(
PlaylistSort.entries[sort]
}

val getRegexFilter = context.dataStore.data.map {
it[REGEX_FILTER] ?: false
}

val getMatchCaseFilter = context.dataStore.data.map {
it[MATCH_CASE_FILTER] ?: false
}

val sortTracksAscending = context.dataStore.data.map {
it[SORT_TRACKS_ASCENDING] ?: true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import com.sosauce.chocola.R
import com.sosauce.chocola.data.datastore.rememberIsLandscape
import com.sosauce.chocola.data.datastore.rememberMatchCaseFilter
import com.sosauce.chocola.data.datastore.rememberRegexFilter
import com.sosauce.chocola.data.datastore.rememberSortTracksAscending
import com.sosauce.chocola.data.datastore.rememberTrackSort
import com.sosauce.chocola.data.models.CuteTrack
Expand Down Expand Up @@ -63,6 +65,8 @@ fun SharedTransitionScope.AlbumDetailsScreen(
val lazyState = rememberLazyListState()
val isLandscape = rememberIsLandscape()
var sortTracksAsc by rememberSortTracksAscending()
var regexFilter by rememberRegexFilter()
var matchCaseFilter by rememberMatchCaseFilter()
var trackSort by rememberTrackSort()
val multiSelectState = rememberSweetSelectState<CuteTrack>()

Expand Down Expand Up @@ -133,7 +137,11 @@ fun SharedTransitionScope.AlbumDetailsScreen(
sortMenu = {
SortingDropdownMenu(
isSortedAscending = sortTracksAsc,
onChangeSorting = { sortTracksAsc = it }
onChangeSorting = { sortTracksAsc = it },
isRegexFilter = regexFilter,
onChangeRegexFilter = { regexFilter = it },
isMatchCaseFilter = matchCaseFilter,
onChangeMatchCaseFilter = { matchCaseFilter = it }
) {
repeat(6) { i ->
val text = when (i) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ class AlbumDetailsViewModel(
}
}
}


}

data class AlbumDetailsState(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package com.sosauce.chocola.presentation.screens.album

import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionScope
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
Expand All @@ -14,9 +13,7 @@ import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ContainedLoadingIndicator
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
Expand All @@ -29,13 +26,14 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.sosauce.chocola.R
import com.sosauce.chocola.data.datastore.rememberAlbumGrids
import com.sosauce.chocola.data.datastore.rememberAlbumSort
import com.sosauce.chocola.data.datastore.rememberMatchCaseFilter
import com.sosauce.chocola.data.datastore.rememberRegexFilter
import com.sosauce.chocola.data.datastore.rememberSortAlbumsAscending
import com.sosauce.chocola.data.states.MusicState
import com.sosauce.chocola.domain.actions.PlayerActions
Expand All @@ -56,6 +54,8 @@ fun SharedTransitionScope.AlbumsScreen(
) {
var isSortedByASC by rememberSortAlbumsAscending()
var albumSort by rememberAlbumSort()
var regexFilter by rememberRegexFilter()
var matchCaseFilter by rememberMatchCaseFilter()
val lazyState = rememberLazyGridState()
var numberOfAlbumGrids by rememberAlbumGrids()

Expand All @@ -79,6 +79,10 @@ fun SharedTransitionScope.AlbumsScreen(
SortingDropdownMenu(
isSortedAscending = isSortedByASC,
onChangeSorting = { isSortedByASC = it },
isRegexFilter = regexFilter,
onChangeRegexFilter = { regexFilter = it },
isMatchCaseFilter = matchCaseFilter,
onChangeMatchCaseFilter = { matchCaseFilter = it },
topContent = {
DropdownMenuItem(
onClick = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlin.system.measureTimeMillis
import kotlin.time.Duration.Companion.milliseconds

class AlbumsViewModel(
Expand All @@ -39,10 +38,12 @@ class AlbumsViewModel(

combine(
userPreferences.getAlbumsSort,
userPreferences.getRegexFilter,
userPreferences.getMatchCaseFilter,
userPreferences.sortAlbumsAscending,
userQuery
) { sort, ascending, query ->
val sortedAlbums = albums.ordered(sort, ascending, query.toString())
) { sort, regex, matchCase, ascending, query ->
val sortedAlbums = albums.ordered(sort, regex, matchCase, ascending, query.toString())

AlbumsState(
isLoading = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,13 @@ import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionScope
import androidx.compose.foundation.background
import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
Expand All @@ -44,26 +41,21 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.blur
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation3.ui.LocalNavAnimatedContentScope
import coil3.compose.AsyncImage
import com.sosauce.chocola.R
import com.sosauce.chocola.data.datastore.rememberIsLandscape
import com.sosauce.chocola.data.datastore.rememberSortTracksAscending
import com.sosauce.chocola.data.datastore.rememberTrackSort
import com.sosauce.chocola.data.models.CuteTrack
import com.sosauce.chocola.data.states.MusicState
import com.sosauce.chocola.domain.actions.PlayerActions
import com.sosauce.chocola.presentation.navigation.Screen
import com.sosauce.chocola.presentation.screens.album.components.AlbumCard
import com.sosauce.chocola.presentation.screens.album.components.NumberOfTracks
import com.sosauce.chocola.presentation.screens.artist.components.ArtistHeader
import com.sosauce.chocola.presentation.screens.artist.components.NumberOfAlbums
Expand All @@ -78,8 +70,6 @@ import com.sosauce.chocola.utils.ImageUtils
import com.sosauce.chocola.utils.barsContentTransform
import com.sosauce.chocola.utils.selfAlignHorizontally
import com.sosauce.sweetselect.rememberSweetSelectState
import sv.lib.squircleshape.CornerSmoothing
import sv.lib.squircleshape.SquircleShape

@Composable
fun SharedTransitionScope.ArtistDetailsScreen(
Expand Down Expand Up @@ -251,6 +241,10 @@ fun SharedTransitionScope.ArtistDetailsScreen(
SortingDropdownMenu(
isSortedAscending = sortTracksAscending,
onChangeSorting = { sortTracksAscending = it },
isMatchCaseFilter = null,
isRegexFilter = null,
onChangeMatchCaseFilter = null,
onChangeRegexFilter = null
) {
repeat(5) { i ->
val text = when (i) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
Expand All @@ -39,6 +38,8 @@ import androidx.navigation3.ui.LocalNavAnimatedContentScope
import coil3.compose.AsyncImage
import com.sosauce.chocola.R
import com.sosauce.chocola.data.datastore.rememberArtistSort
import com.sosauce.chocola.data.datastore.rememberMatchCaseFilter
import com.sosauce.chocola.data.datastore.rememberRegexFilter
import com.sosauce.chocola.data.datastore.rememberSortArtistsAscending
import com.sosauce.chocola.data.models.Artist
import com.sosauce.chocola.data.states.MusicState
Expand All @@ -64,6 +65,8 @@ fun SharedTransitionScope.ArtistsScreen(

val lazyState = rememberLazyListState()
var artistSort by rememberArtistSort()
var regexFilter by rememberRegexFilter()
var matchCaseFilter by rememberMatchCaseFilter()
var isSortedByASC by rememberSortArtistsAscending()

if (state.isLoading) {
Expand All @@ -86,6 +89,10 @@ fun SharedTransitionScope.ArtistsScreen(
SortingDropdownMenu(
isSortedAscending = isSortedByASC,
onChangeSorting = { isSortedByASC = it },
isMatchCaseFilter = matchCaseFilter,
onChangeMatchCaseFilter = { matchCaseFilter = it },
isRegexFilter = regexFilter,
onChangeRegexFilter = { regexFilter = it },
) {
repeat(3) { i ->
val text = when (i) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ class ArtistsViewModel(

combine(
userPreferences.getArtistsSort,
userPreferences.getRegexFilter,
userPreferences.getMatchCaseFilter,
userPreferences.sortArtistsAscending,
userQuery
) { sort, ascending, query ->
) { sort, regex, matchCase, ascending, query ->

val sortedArtists = artists.ordered(sort, ascending, query.toString())
val sortedArtists = artists.ordered(sort, regex, matchCase, ascending, query.toString())

ArtistsState(
isLoading = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ import androidx.compose.ui.util.fastForEach
import com.sosauce.chocola.R
import com.sosauce.chocola.data.datastore.rememberGroupByFolders
import com.sosauce.chocola.data.datastore.rememberHiddenFolders
import com.sosauce.chocola.data.datastore.rememberMatchCaseFilter
import com.sosauce.chocola.data.datastore.rememberRegexFilter
import com.sosauce.chocola.data.datastore.rememberShowShuffleButton
import com.sosauce.chocola.data.datastore.rememberSortTracksAscending
import com.sosauce.chocola.data.datastore.rememberTrackSort
Expand Down Expand Up @@ -79,6 +81,8 @@ fun SharedTransitionScope.MainScreen(
var groupByFolders by rememberGroupByFolders()
val showShuffleButton by rememberShowShuffleButton()
var trackSort by rememberTrackSort()
var regexFilter by rememberRegexFilter()
var matchCaseFilter by rememberMatchCaseFilter()
var sortTracksAscending by rememberSortTracksAscending()
val multiSelectState = rememberSweetSelectState<CuteTrack>()

Expand All @@ -96,8 +100,8 @@ fun SharedTransitionScope.MainScreen(
AnimatedContent(
targetState = multiSelectState.isInSelectionMode,
transitionSpec = { barsContentTransform },
) {
if (it) {
) { isInSelectionMode ->
if (isInSelectionMode) {
TracksSelectedBar(
modifier = Modifier.selfAlignHorizontally(),
tracks = state.tracks,
Expand All @@ -114,6 +118,10 @@ fun SharedTransitionScope.MainScreen(
SortingDropdownMenu(
isSortedAscending = sortTracksAscending,
onChangeSorting = { sortTracksAscending = it },
isMatchCaseFilter = matchCaseFilter,
onChangeMatchCaseFilter = { matchCaseFilter = it },
isRegexFilter = regexFilter,
onChangeRegexFilter = { regexFilter = it },
topContent = {
DropdownMenuItem(
selected = groupByFolders,
Expand Down
Loading