diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index e58c91503..a6be69b87 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -103,7 +103,7 @@ class AlbumDetailFragment : Fragment() { } } - binding.albumArtist.setBackgroundResource(R.drawable.ripple) + binding.albumArtist.setBackgroundResource(R.drawable.ui_ripple) } Log.d(this::class.simpleName, "Fragment created.") diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index 3372a5903..fcfbd8b2b 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -109,7 +109,7 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) { ) == PackageManager.PERMISSION_DENIED } - // Remove the loading indicator and show the error groups + // Remove the loading ui_indicator and show the error groups private fun showError(binding: FragmentLoadingBinding) { binding.loadingBar.visibility = View.GONE binding.loadingErrorIcon.visibility = View.VISIBLE diff --git a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt index 932d1ed37..00669d1c2 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/processing/MusicLoader.kt @@ -66,7 +66,7 @@ class MusicLoader( private fun loadGenres() { Log.d(this::class.simpleName, "Starting genre search...") - // First, get a cursor for every genre in the android system + // First, get a ui_cursor for every genre in the android system genreCursor = resolver.query( Genres.EXTERNAL_CONTENT_URI, arrayOf( diff --git a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt index c2bfd92ab..f50f85561 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentCompactPlaybackBinding import org.oxycblt.auxio.music.MusicViewModel @@ -31,6 +32,7 @@ class CompactPlaybackFragment : Fragment() { // Put a placeholder song in the binding & hide the playback fragment initially, // as for some reason the attach event doesn't register anymore w/LiveData binding.song = musicModel.songs.value!![0] + binding.playbackModel = playbackModel binding.root.visibility = View.GONE binding.root.setOnClickListener { @@ -54,6 +56,15 @@ class CompactPlaybackFragment : Fragment() { } } + // TODO: Animate this icon + playbackModel.isPlaying.observe(viewLifecycleOwner) { + if (it) { + binding.songControls.setImageResource(R.drawable.ic_pause) + } else { + binding.songControls.setImageResource(R.drawable.ic_play) + } + } + Log.d(this::class.simpleName, "Fragment Created") return binding.root diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index 2a66f62af..26d08fab4 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -1,17 +1,22 @@ package org.oxycblt.auxio.playback +import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentPlaybackBinding +import org.oxycblt.auxio.theme.accent +import org.oxycblt.auxio.theme.toColor class PlaybackFragment : BottomSheetDialogFragment() { private val playbackModel: PlaybackViewModel by activityViewModels() // TODO: Implement nav to artists/albums + // TODO: Add a full playback fragment // TODO: Possibly implement a trackbar with a spectrum shown as well. override fun onCreateView( inflater: LayoutInflater, @@ -20,18 +25,39 @@ class PlaybackFragment : BottomSheetDialogFragment() { ): View? { val binding = FragmentPlaybackBinding.inflate(inflater) + val accentColor = ColorStateList.valueOf(accent.first.toColor(requireContext())) + val white = ColorStateList.valueOf(android.R.color.white.toColor(requireContext())) + // --- UI SETUP --- + binding.playbackModel = playbackModel + // Make marquee scroll work - binding.songName.isSelected = true - binding.songAlbum.isSelected = true - binding.songArtist.isSelected = true + binding.playbackSong.isSelected = true + binding.playbackAlbum.isSelected = true + binding.playbackArtist.isSelected = true + + // Override the accents manually because the BottomSheetFragment is too dumb to do it themselves. + binding.playbackSeekBar.thumbTintList = accentColor + binding.playbackSeekBar.progressTintList = accentColor + binding.playbackSeekBar.progressBackgroundTintList = accentColor // --- VIEWMODEL SETUP -- + playbackModel.currentSong.observe(viewLifecycleOwner) { binding.song = it } + playbackModel.isPlaying.observe(viewLifecycleOwner) { + if (it) { + binding.playbackPlayPause.setImageResource(R.drawable.ic_pause) + binding.playbackPlayPause.backgroundTintList = accentColor + } else { + binding.playbackPlayPause.setImageResource(R.drawable.ic_play) + binding.playbackPlayPause.backgroundTintList = white + } + } + return binding.root } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 77aac5143..1937b8cd7 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -7,6 +7,8 @@ import org.oxycblt.auxio.music.Song // TODO: Implement media controls // TODO: Add the playback service itself +// TODO: Possibly add some swipe-to-next-track function, could require a ViewPager. +// A ViewModel that acts as an intermediary between PlaybackService and the Playback Fragments. class PlaybackViewModel : ViewModel() { private val mCurrentSong = MutableLiveData() val currentSong: LiveData get() = mCurrentSong @@ -14,8 +16,12 @@ class PlaybackViewModel : ViewModel() { private val mShouldOpenPlayback = MutableLiveData() val shouldOpenPlayback: LiveData get() = mShouldOpenPlayback + private val mIsPlaying = MutableLiveData(false) + val isPlaying: LiveData get() = mIsPlaying + fun updateSong(song: Song) { mCurrentSong.value = song + mIsPlaying.value = true } fun openPlayback() { @@ -25,4 +31,9 @@ class PlaybackViewModel : ViewModel() { fun doneWithOpenPlayback() { mShouldOpenPlayback.value = false } + + // Invert, not directly set the p + fun invertPlayingStatus() { + mIsPlaying.value = !mIsPlaying.value!! + } } diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 000000000..19d2d6f8b --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml new file mode 100644 index 000000000..bb18124a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_play.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ui_circular_button.xml b/app/src/main/res/drawable/ui_circular_button.xml new file mode 100644 index 000000000..57bf6eb9b --- /dev/null +++ b/app/src/main/res/drawable/ui_circular_button.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cursor.xml b/app/src/main/res/drawable/ui_cursor.xml similarity index 82% rename from app/src/main/res/drawable/cursor.xml rename to app/src/main/res/drawable/ui_cursor.xml index b6adfefdd..5d7eb28cc 100644 --- a/app/src/main/res/drawable/cursor.xml +++ b/app/src/main/res/drawable/ui_cursor.xml @@ -1,5 +1,5 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ui_unbounded_ripple.xml b/app/src/main/res/drawable/ui_unbounded_ripple.xml new file mode 100644 index 000000000..61bb0e72c --- /dev/null +++ b/app/src/main/res/drawable/ui_unbounded_ripple.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album_detail.xml b/app/src/main/res/layout/fragment_album_detail.xml index 6376a3b22..958b4fde8 100644 --- a/app/src/main/res/layout/fragment_album_detail.xml +++ b/app/src/main/res/layout/fragment_album_detail.xml @@ -103,7 +103,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/padding_medium" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:fontFamily="@font/inter_bold" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" @@ -119,7 +119,7 @@ android:layout_width="wrap_content" android:layout_height="0dp" android:layout_marginTop="@dimen/margin_medium" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:contentDescription="@string/description_sort_button" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" diff --git a/app/src/main/res/layout/fragment_artist_detail.xml b/app/src/main/res/layout/fragment_artist_detail.xml index cb1ab0b55..0858039a8 100644 --- a/app/src/main/res/layout/fragment_artist_detail.xml +++ b/app/src/main/res/layout/fragment_artist_detail.xml @@ -100,7 +100,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="@dimen/margin_medium" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:fontFamily="@font/inter_bold" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" @@ -117,7 +117,7 @@ android:layout_width="wrap_content" android:layout_height="0dp" android:layout_marginTop="@dimen/margin_medium" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:contentDescription="@string/description_sort_button" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" diff --git a/app/src/main/res/layout/fragment_compact_playback.xml b/app/src/main/res/layout/fragment_compact_playback.xml index 5b9f0023a..3a8f010c2 100644 --- a/app/src/main/res/layout/fragment_compact_playback.xml +++ b/app/src/main/res/layout/fragment_compact_playback.xml @@ -9,18 +9,22 @@ + + + + + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_play" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_genre_detail.xml b/app/src/main/res/layout/fragment_genre_detail.xml index 0c78e9eca..6dbd749e8 100644 --- a/app/src/main/res/layout/fragment_genre_detail.xml +++ b/app/src/main/res/layout/fragment_genre_detail.xml @@ -100,7 +100,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="@dimen/margin_medium" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:fontFamily="@font/inter_bold" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" @@ -117,7 +117,7 @@ android:layout_width="wrap_content" android:layout_height="0dp" android:layout_marginTop="@dimen/margin_medium" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:contentDescription="@string/description_sort_button" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 6d96daa3d..2f112bb17 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -34,7 +34,7 @@ app:tabGravity="fill" app:tabIconTint="?android:attr/colorPrimary" app:tabIconTintMode="src_in" - app:tabIndicator="@drawable/indicator" + app:tabIndicator="@drawable/ui_indicator" app:tabIndicatorColor="?android:attr/colorPrimary" app:tabMode="fixed" app:tabRippleColor="@color/selection_color" diff --git a/app/src/main/res/layout/fragment_playback.xml b/app/src/main/res/layout/fragment_playback.xml index 42659b958..eb2bcc90d 100644 --- a/app/src/main/res/layout/fragment_playback.xml +++ b/app/src/main/res/layout/fragment_playback.xml @@ -8,17 +8,22 @@ + + + android:theme="@style/ThemeOverlay.AppCompat.DayNight" + android:padding="@dimen/padding_medium"> + + + app:layout_constraintTop_toBottomOf="@+id/playback_seek_bar" + android:backgroundTint="?android:attr/colorPrimary" + tools:src="@drawable/ic_play" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_album.xml b/app/src/main/res/layout/item_album.xml index 14e7e4ec7..41d2fe6dc 100644 --- a/app/src/main/res/layout/item_album.xml +++ b/app/src/main/res/layout/item_album.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/layout/item_album_song.xml b/app/src/main/res/layout/item_album_song.xml index f7dc15e2d..af3cd3429 100644 --- a/app/src/main/res/layout/item_album_song.xml +++ b/app/src/main/res/layout/item_album_song.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/layout/item_artist.xml b/app/src/main/res/layout/item_artist.xml index df60661a3..a22dcde3c 100644 --- a/app/src/main/res/layout/item_artist.xml +++ b/app/src/main/res/layout/item_artist.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/layout/item_artist_album.xml b/app/src/main/res/layout/item_artist_album.xml index b5a0bba9d..c6fe20345 100644 --- a/app/src/main/res/layout/item_artist_album.xml +++ b/app/src/main/res/layout/item_artist_album.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/layout/item_genre.xml b/app/src/main/res/layout/item_genre.xml index 90c653d7d..c777b3009 100644 --- a/app/src/main/res/layout/item_genre.xml +++ b/app/src/main/res/layout/item_genre.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/layout/item_genre_artist.xml b/app/src/main/res/layout/item_genre_artist.xml index ec8d33468..373caf885 100644 --- a/app/src/main/res/layout/item_genre_artist.xml +++ b/app/src/main/res/layout/item_genre_artist.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/layout/item_header.xml b/app/src/main/res/layout/item_header.xml index 47112c812..99df0d600 100644 --- a/app/src/main/res/layout/item_header.xml +++ b/app/src/main/res/layout/item_header.xml @@ -19,7 +19,7 @@ android:id="@+id/header_text" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/header_dividers" + android:background="@drawable/ui_header_dividers" android:fontFamily="@font/inter_bold" android:paddingStart="@dimen/padding_medium" android:paddingTop="@dimen/padding_small" diff --git a/app/src/main/res/layout/item_song.xml b/app/src/main/res/layout/item_song.xml index 43d0bc30a..076bec2d6 100644 --- a/app/src/main/res/layout/item_song.xml +++ b/app/src/main/res/layout/item_song.xml @@ -14,7 +14,7 @@ diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index db116b898..84ea1dbcd 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,6 +7,7 @@ 8dp 10dp 16dp + 24dp 48dp @@ -31,5 +32,8 @@ 2dp + 70dp + 36dp + 4dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91181eeda..888552425 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,6 +36,8 @@ Default Sort Order Sort from A to Z Sort from Z to A + Play + Pause Unknown Genre diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 05b2dd123..ec98a991d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,7 +5,7 @@ @color/background @android:color/black @font/inter - @drawable/cursor + @drawable/ui_cursor @style/AppThemeOverlay.Popup @@ -35,4 +35,6 @@ @color/background @color/selection_color + +