diff --git a/AuxioTODO b/AuxioTODO index 53dcc6ffa..848b95fe8 100644 --- a/AuxioTODO +++ b/AuxioTODO @@ -34,7 +34,7 @@ TODOs surrounded with !s are things I tried to do, but failed for reasons includ - Fix issue where fast navigations will cause the app to not display anything /other/ -- Collapse show constants into ShowMode enum +- Standardize fragment init To be added: /prefs/ diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index c2db01310..55350d774 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.ImageView import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat import androidx.core.view.forEach @@ -58,8 +59,9 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { val item = findItem(R.id.action_search) val searchView = item.actionView as SearchView - // Set up the SearchView itself - searchView.queryHint = getString(R.string.hint_search_library) + searchView.findViewById(androidx.appcompat.R.id.search_go_btn) + .setImageResource(R.drawable.ic_back) + searchView.setOnQueryTextListener(this@LibraryFragment) searchView.setOnQueryTextFocusChangeListener { _, hasFocus -> libraryModel.updateSearchFocusStatus(hasFocus) @@ -139,7 +141,9 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { libraryModel.searchResults.observe(viewLifecycleOwner) { if (libraryModel.searchHasFocus) { - searchAdapter.submitList(it) + searchAdapter.submitList(it) { + binding.libraryRecycler.scrollToPosition(0) + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt index 1835a7c2d..59a981692 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryViewModel.kt @@ -45,6 +45,7 @@ class LibraryViewModel : ViewModel() { } fun updateSearchQuery(query: String, musicModel: MusicViewModel) { + // Don't bother if the query is blank. if (query == "") { resetQuery() @@ -52,18 +53,32 @@ class LibraryViewModel : ViewModel() { } // Search MusicViewModel for all the items [Artists, Albums, Songs] that contain - // the query, and update the LiveData with those items. This is done on a seperate - // thread as it can be a very intensive operation for large music libraries. + // the query, and update the LiveData with those items. This is done on a separate + // thread as it can be a very long operation for large music libraries. viewModelScope.launch { val combined = mutableListOf() + val children = showMode.value!!.getChildren() - val artists = musicModel.artists.value!!.filter { it.name.contains(query, true) } + // If the Library ShowMode supports it, include artists / genres in the search. + if (children.contains(ShowMode.SHOW_GENRES)) { + val genres = musicModel.genres.value!!.filter { it.name.contains(query, true) } - if (artists.isNotEmpty()) { - combined.add(Header(id = ShowMode.SHOW_ARTISTS.constant)) - combined.addAll(artists) + if (genres.isNotEmpty()) { + combined.add(Header(id = ShowMode.SHOW_GENRES.constant)) + combined.addAll(genres) + } } + if (children.contains(ShowMode.SHOW_ARTISTS)) { + val artists = musicModel.artists.value!!.filter { it.name.contains(query, true) } + + if (artists.isNotEmpty()) { + combined.add(Header(id = ShowMode.SHOW_ARTISTS.constant)) + combined.addAll(artists) + } + } + + // Albums & Songs are always included. val albums = musicModel.albums.value!!.filter { it.name.contains(query, true) } if (albums.isNotEmpty()) { diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt index e8588dbaa..0788fe597 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtils.kt @@ -97,7 +97,7 @@ fun TextView.bindGenreCounts(genre: Genre) { R.plurals.format_artist_count, genre.numArtists, genre.numArtists ) val albums = context.resources.getQuantityString( - R.plurals.format_song_count, genre.numAlbums, genre.numAlbums + R.plurals.format_album_count, genre.numAlbums, genre.numAlbums ) text = context.getString(R.string.format_double_counts, artists, albums) diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/ShowMode.kt b/app/src/main/java/org/oxycblt/auxio/recycler/ShowMode.kt index ef18688b5..91b68f663 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/ShowMode.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/ShowMode.kt @@ -1,5 +1,13 @@ package org.oxycblt.auxio.recycler enum class ShowMode(val constant: Long) { - SHOW_GENRES(10), SHOW_ARTISTS(11), SHOW_ALBUMS(12), SHOW_SONGS(13); + SHOW_GENRES(0), SHOW_ARTISTS(1), SHOW_ALBUMS(2), SHOW_SONGS(3); + + // Make a slice of all the values that this ShowMode covers. + // ex. SHOW_ARTISTS would return SHOW_ARTISTS, SHOW_ALBUMS, and SHOW_SONGS + fun getChildren(): List { + val vals = values() + + return vals.slice(vals.indexOf(this) until vals.size) + } } diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt index 57caa5255..ea4afc4c2 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/viewholders/ModelHolders.kt @@ -14,8 +14,8 @@ import org.oxycblt.auxio.music.Header import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.recycler.ClickListener -// Basic ViewHolders for each music model. - +// Shared ViewHolders for each ViewModel, providing basic information +// All new instances should be created with from(context, listener) instead of direct instantiation. class GenreViewHolder private constructor( listener: ClickListener, private val binding: ItemGenreBinding diff --git a/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt b/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt index 5cdccf767..63de73a7e 100644 --- a/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt @@ -65,6 +65,7 @@ fun Int.toColor(context: Context): Int { } } +// Resolve an attribute into a color @ColorInt fun resolveAttr(context: Context, @AttrRes attr: Int): Int { // Convert the attribute into its color @@ -82,6 +83,7 @@ fun resolveAttr(context: Context, @AttrRes attr: Int): Int { return color.toColor(context) } +// Apply a color to a Menu Item fun MenuItem.applyColor(color: Int) { SpannableString(title).apply { setSpan(ForegroundColorSpan(color), 0, length, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE) diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml index 080fc1b88..eaca5044c 100644 --- a/app/src/main/res/drawable/ic_back.xml +++ b/app/src/main/res/drawable/ic_back.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="?android:attr/colorControlNormal"> + android:tint="@color/control_color"> diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml index 2b1a6a6b8..ae48aafda 100644 --- a/app/src/main/res/drawable/ic_search.xml +++ b/app/src/main/res/drawable/ic_search.xml @@ -4,7 +4,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> + android:tint="@color/control_color"> diff --git a/app/src/main/res/drawable/ic_sort_none.xml b/app/src/main/res/drawable/ic_sort_none.xml index 9e4362c1a..d4647283b 100644 --- a/app/src/main/res/drawable/ic_sort_none.xml +++ b/app/src/main/res/drawable/ic_sort_none.xml @@ -4,7 +4,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="?android:attr/colorControlNormal"> + android:tint="@color/control_color"> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index c845a9fc9..6fdbb41de 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -4,6 +4,7 @@ #323232 #484848 #404040 + #ffffff + %1$s / %2$s %1$s / %2$s / %3$s %1$s, %2$s - %s Song %s Songs diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 419f3c480..10d5ba9c5 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -18,10 +18,7 @@ ?android:attr/colorPrimary - + - - - -