diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index fe6160e80..13a63170b 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -1,7 +1,6 @@ package org.oxycblt.auxio import android.content.Context -import android.os.Bundle import android.util.AttributeSet import android.view.View import androidx.appcompat.app.AppCompatActivity @@ -10,7 +9,7 @@ import org.oxycblt.auxio.theme.accent // FIXME: Fix bug where fast navigation will break the fade animation and // lead to nothing being displayed [Possibly Un-fixable] -class MainActivity : AppCompatActivity() { +class MainActivity : AppCompatActivity(R.layout.activity_main) { override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? { // Apply the theme @@ -18,9 +17,4 @@ class MainActivity : AppCompatActivity() { return super.onCreateView(name, context, attrs) } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } } diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index 27365a142..22df92ba4 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -15,6 +15,8 @@ import com.google.android.material.tabs.TabLayoutMediator import org.oxycblt.auxio.databinding.FragmentMainBinding import org.oxycblt.auxio.library.LibraryFragment import org.oxycblt.auxio.music.MusicViewModel +import org.oxycblt.auxio.playback.PlaybackFragment +import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.songs.SongsFragment import org.oxycblt.auxio.theme.accent import org.oxycblt.auxio.theme.getInactiveAlpha @@ -26,8 +28,9 @@ class MainFragment : Fragment() { MusicViewModel.Factory(requireActivity().application) } - private val shownFragments = listOf(0, 1) + private val playbackModel: PlaybackViewModel by activityViewModels() + private val shownFragments = listOf(0, 1) private val tabIcons = listOf( R.drawable.ic_library, R.drawable.ic_song @@ -72,8 +75,6 @@ class MainFragment : Fragment() { } }.attach() - binding.compactPlayback.visibility = View.GONE - // Set up the selected/deselected colors binding.mainTabs.addOnTabSelectedListener( object : TabLayout.OnTabSelectedListener { @@ -91,6 +92,16 @@ class MainFragment : Fragment() { } ) + // --- VIEWMODEL SETUP --- + + playbackModel.shouldOpenPlayback.observe(viewLifecycleOwner) { + if (it) { + PlaybackFragment().show(requireActivity().supportFragmentManager, "TAG_PLAYBACK") + + playbackModel.doneWithOpenPlayback() + } + } + Log.d(this::class.simpleName, "Fragment Created.") return binding.root 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 e69d589dd..d4c2bcefd 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -85,6 +85,7 @@ class LibraryFragment : Fragment(), SearchView.OnQueryTextListener { val item = findItem(R.id.action_search) val searchView = item.actionView as SearchView + searchView.queryHint = getString(R.string.hint_search_library) searchView.setOnQueryTextListener(this@LibraryFragment) searchView.setOnQueryTextFocusChangeListener { _, hasFocus -> libraryModel.updateSearchFocusStatus(hasFocus) 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 e23b5a98e..c2bfd92ab 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/CompactPlaybackFragment.kt @@ -33,6 +33,10 @@ class CompactPlaybackFragment : Fragment() { binding.song = musicModel.songs.value!![0] binding.root.visibility = View.GONE + binding.root.setOnClickListener { + playbackModel.openPlayback() + } + // --- VIEWMODEL SETUP --- // TODO: Add some kind of animation to when this view becomes visible/invisible. diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt new file mode 100644 index 000000000..2a66f62af --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -0,0 +1,37 @@ +package org.oxycblt.auxio.playback + +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.databinding.FragmentPlaybackBinding + +class PlaybackFragment : BottomSheetDialogFragment() { + private val playbackModel: PlaybackViewModel by activityViewModels() + + // TODO: Implement nav to artists/albums + // TODO: Possibly implement a trackbar with a spectrum shown as well. + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val binding = FragmentPlaybackBinding.inflate(inflater) + + // --- UI SETUP --- + + // Make marquee scroll work + binding.songName.isSelected = true + binding.songAlbum.isSelected = true + binding.songArtist.isSelected = true + + // --- VIEWMODEL SETUP -- + playbackModel.currentSong.observe(viewLifecycleOwner) { + binding.song = it + } + + 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 876d7236f..77aac5143 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -5,11 +5,24 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.oxycblt.auxio.music.Song +// TODO: Implement media controls +// TODO: Add the playback service itself class PlaybackViewModel : ViewModel() { private val mCurrentSong = MutableLiveData() val currentSong: LiveData get() = mCurrentSong + private val mShouldOpenPlayback = MutableLiveData() + val shouldOpenPlayback: LiveData get() = mShouldOpenPlayback + fun updateSong(song: Song) { mCurrentSong.value = song } + + fun openPlayback() { + mShouldOpenPlayback.value = true + } + + fun doneWithOpenPlayback() { + mShouldOpenPlayback.value = false + } } 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 7ae8c29f5..427a7af6a 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 @@ -16,7 +16,6 @@ import org.oxycblt.auxio.recycler.ClickListener // Shared ViewHolders for each ViewModel, providing basic information // All new instances should be created with from() instead of direct instantiation. -// TODO: Add indicators to song recycler items when they're being played. class GenreViewHolder private constructor( listener: ClickListener, diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt index 37f01a3d4..ff3e47cc1 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt @@ -12,6 +12,7 @@ import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.recycler.ClickListener import org.oxycblt.auxio.theme.applyDivider + class SongsFragment : Fragment() { private val musicModel: MusicViewModel by activityViewModels { MusicViewModel.Factory(requireActivity().application) diff --git a/app/src/main/res/layout/fragment_compact_playback.xml b/app/src/main/res/layout/fragment_compact_playback.xml index 4b3869135..5b9f0023a 100644 --- a/app/src/main/res/layout/fragment_compact_playback.xml +++ b/app/src/main/res/layout/fragment_compact_playback.xml @@ -13,6 +13,9 @@ diff --git a/app/src/main/res/layout/fragment_playback.xml b/app/src/main/res/layout/fragment_playback.xml new file mode 100644 index 000000000..42659b958 --- /dev/null +++ b/app/src/main/res/layout/fragment_playback.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_main.xml b/app/src/main/res/navigation/nav_main.xml index b7d84a054..beac67e46 100644 --- a/app/src/main/res/navigation/nav_main.xml +++ b/app/src/main/res/navigation/nav_main.xml @@ -45,7 +45,7 @@ app:exitAnim="@anim/nav_default_exit_anim" app:popEnterAnim="@anim/nav_default_pop_enter_anim" app:popExitAnim="@anim/nav_default_pop_exit_anim" - app:destination="@id/genreDetailFragment" /> + app:destination="@id/genre_detail_fragment" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0cb8c3306..db116b898 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -17,6 +17,7 @@ 56dp 68dp 250dp + 110dp 32dp 20sp