diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeAdapter.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeAdapter.kt
index a5418f5d8..5dee2f24f 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/HomeAdapter.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/HomeAdapter.kt
@@ -26,17 +26,12 @@ import org.oxycblt.auxio.music.Album
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Genre
-import org.oxycblt.auxio.music.Parent
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.recycler.viewholders.AlbumViewHolder
import org.oxycblt.auxio.recycler.viewholders.ArtistViewHolder
import org.oxycblt.auxio.recycler.viewholders.GenreViewHolder
import org.oxycblt.auxio.recycler.viewholders.SongViewHolder
-/**
- * An adapter for displaying library items. Supports [Parent]s only.
- * @author OxygenCobalt
- */
class HomeAdapter(
private val doOnClick: (data: BaseModel) -> Unit,
private val doOnLongClick: (view: View, data: BaseModel) -> Unit
diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
index f75b0a6fa..53f022efd 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt
@@ -25,7 +25,9 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
+import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.adapter.FragmentStateAdapter
+import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import org.oxycblt.auxio.MainFragmentDirections
import org.oxycblt.auxio.R
@@ -35,12 +37,15 @@ import org.oxycblt.auxio.home.pager.ArtistListFragment
import org.oxycblt.auxio.home.pager.GenreListFragment
import org.oxycblt.auxio.home.pager.SongListFragment
import org.oxycblt.auxio.logD
+import org.oxycblt.auxio.logE
import org.oxycblt.auxio.playback.PlaybackViewModel
+import java.lang.Exception
/**
* The main "Launching Point" fragment of Auxio, allowing navigation to the detail
* views for each respective fragment.
* TODO: Re-add sorting (but new and improved)
+ * TODO: Fix issue where elevation will act wrong when switching tabs
* @author OxygenCobalt
*/
class HomeFragment : Fragment() {
diff --git a/app/src/main/java/org/oxycblt/auxio/home/pager/AlbumListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/pager/AlbumListFragment.kt
index 09afe9d22..43df5c1e2 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/pager/AlbumListFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/pager/AlbumListFragment.kt
@@ -23,17 +23,16 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
-import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.recyclerview.widget.GridLayoutManager
import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.home.HomeAdapter
import org.oxycblt.auxio.home.HomeFragmentDirections
import org.oxycblt.auxio.music.MusicStore
-import org.oxycblt.auxio.playback.PlaybackViewModel
+import org.oxycblt.auxio.spans
import org.oxycblt.auxio.ui.newMenu
class AlbumListFragment : Fragment() {
- private val playbackModel: PlaybackViewModel by viewModels()
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -41,18 +40,25 @@ class AlbumListFragment : Fragment() {
): View {
val binding = FragmentHomeListBinding.inflate(inflater)
- val adapter = HomeAdapter(
+ val homeAdapter = HomeAdapter(
doOnClick = { item ->
- HomeFragmentDirections.actionShowAlbum(item.id)
+ findNavController().navigate(HomeFragmentDirections.actionShowAlbum(item.id))
},
::newMenu
)
- adapter.updateData(MusicStore.getInstance().albums)
+ homeAdapter.updateData(MusicStore.getInstance().albums)
// --- UI SETUP ---
- binding.homeRecycler.adapter = adapter
+ binding.homeRecycler.apply {
+ adapter = homeAdapter
+ setHasFixedSize(true)
+
+ if (spans != 1) {
+ layoutManager = GridLayoutManager(requireContext(), spans)
+ }
+ }
return binding.root
}
diff --git a/app/src/main/java/org/oxycblt/auxio/home/pager/ArtistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/pager/ArtistListFragment.kt
index 2c1a656bd..f88757b63 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/pager/ArtistListFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/pager/ArtistListFragment.kt
@@ -23,17 +23,16 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
-import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.recyclerview.widget.GridLayoutManager
import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.home.HomeAdapter
import org.oxycblt.auxio.home.HomeFragmentDirections
import org.oxycblt.auxio.music.MusicStore
-import org.oxycblt.auxio.playback.PlaybackViewModel
+import org.oxycblt.auxio.spans
import org.oxycblt.auxio.ui.newMenu
class ArtistListFragment : Fragment() {
- private val playbackModel: PlaybackViewModel by viewModels()
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -41,18 +40,25 @@ class ArtistListFragment : Fragment() {
): View {
val binding = FragmentHomeListBinding.inflate(inflater)
- val adapter = HomeAdapter(
+ val homeAdapter = HomeAdapter(
doOnClick = { item ->
- HomeFragmentDirections.actionShowArtist(item.id)
+ findNavController().navigate(HomeFragmentDirections.actionShowArtist(item.id))
},
::newMenu
)
- adapter.updateData(MusicStore.getInstance().artists)
+ homeAdapter.updateData(MusicStore.getInstance().artists)
// --- UI SETUP ---
- binding.homeRecycler.adapter = adapter
+ binding.homeRecycler.apply {
+ adapter = homeAdapter
+ setHasFixedSize(true)
+
+ if (spans != 1) {
+ layoutManager = GridLayoutManager(requireContext(), spans)
+ }
+ }
return binding.root
}
diff --git a/app/src/main/java/org/oxycblt/auxio/home/pager/GenreListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/pager/GenreListFragment.kt
index 9331f0e99..04fcc6806 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/pager/GenreListFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/pager/GenreListFragment.kt
@@ -23,17 +23,16 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
-import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.recyclerview.widget.GridLayoutManager
import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.home.HomeAdapter
import org.oxycblt.auxio.home.HomeFragmentDirections
import org.oxycblt.auxio.music.MusicStore
-import org.oxycblt.auxio.playback.PlaybackViewModel
+import org.oxycblt.auxio.spans
import org.oxycblt.auxio.ui.newMenu
class GenreListFragment : Fragment() {
- private val playbackModel: PlaybackViewModel by viewModels()
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -41,18 +40,25 @@ class GenreListFragment : Fragment() {
): View {
val binding = FragmentHomeListBinding.inflate(inflater)
- val adapter = HomeAdapter(
+ val homeAdapter = HomeAdapter(
doOnClick = { item ->
- HomeFragmentDirections.actionShowGenre(item.id)
+ findNavController().navigate(HomeFragmentDirections.actionShowGenre(item.id))
},
::newMenu
)
- adapter.updateData(MusicStore.getInstance().genres)
+ homeAdapter.updateData(MusicStore.getInstance().genres)
// --- UI SETUP ---
- binding.homeRecycler.adapter = adapter
+ binding.homeRecycler.apply {
+ adapter = homeAdapter
+ setHasFixedSize(true)
+
+ if (spans != 1) {
+ layoutManager = GridLayoutManager(requireContext(), spans)
+ }
+ }
return binding.root
}
diff --git a/app/src/main/java/org/oxycblt/auxio/home/pager/SongListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/pager/SongListFragment.kt
index 69f53bf74..fb2decae9 100644
--- a/app/src/main/java/org/oxycblt/auxio/home/pager/SongListFragment.kt
+++ b/app/src/main/java/org/oxycblt/auxio/home/pager/SongListFragment.kt
@@ -24,11 +24,13 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.GridLayoutManager
import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.home.HomeAdapter
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel
+import org.oxycblt.auxio.spans
import org.oxycblt.auxio.ui.newMenu
class SongListFragment : Fragment() {
@@ -41,18 +43,25 @@ class SongListFragment : Fragment() {
): View {
val binding = FragmentHomeListBinding.inflate(inflater)
- val adapter = HomeAdapter(
+ val homeAdapter = HomeAdapter(
doOnClick = { item ->
playbackModel.playSong(item as Song)
},
::newMenu
)
- adapter.updateData(MusicStore.getInstance().songs)
+ homeAdapter.updateData(MusicStore.getInstance().songs)
// --- UI SETUP ---
- binding.homeRecycler.adapter = adapter
+ binding.homeRecycler.apply {
+ adapter = homeAdapter
+ setHasFixedSize(true)
+
+ if (spans != 1) {
+ layoutManager = GridLayoutManager(requireContext(), spans)
+ }
+ }
return binding.root
}
diff --git a/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt b/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt
deleted file mode 100644
index b1e91346a..000000000
--- a/app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2021 Auxio Project
- * SlideLinearLayout.kt is part of Auxio.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.oxycblt.auxio.ui
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.graphics.Canvas
-import android.util.AttributeSet
-import android.view.View
-import android.view.ViewGroup
-import android.widget.LinearLayout
-import org.oxycblt.auxio.logD
-import org.oxycblt.auxio.logE
-import java.lang.reflect.Field
-
-/**
- * Hack layout that fixes an issue where disappearing views would draw over non-disappearing
- * views when animated with a stock LayoutTransition. If something breaks on the playback controls
- * or nav bar, this is probably the culprit.
- *
- * "But oxygencobalt, couldn't you just write your own animation code and run that instea-"
- * **NO.**
- *
- * Adapted from this StackOverflow answer:
- * https://stackoverflow.com/a/35087229
- * @author OxygenCobalt
- */
-class SlideLinearLayout @JvmOverloads constructor(
- context: Context,
- attrs: AttributeSet? = null,
- defStyleAttr: Int = -1
-) : LinearLayout(context, attrs, defStyleAttr) {
- @SuppressLint("DiscouragedPrivateApi")
- private val disappearingChildrenField: Field? = try {
- // We need to read this field to correctly draw the disappearing children
- // If google ever hides this API I am going to scream, because its their busted
- // ViewGroup code that forces me to do this in the first place
- ViewGroup::class.java.getDeclaredField("mDisappearingChildren").also {
- it.isAccessible = true
- }
- } catch (e: NoSuchFieldException) {
- logE("Could not get mDisappearingChildren. This is very ungood.")
- null
- }
-
- private var disappearingChildren: List? = null
-
- private var dumpView: View? = null
- private var doDrawingTrick: Boolean = false
-
- init {
- if (disappearingChildrenField != null) {
- // Create a invisible junk view and add it, which makes all the magic happen [I think].
- dumpView = View(context)
- addView(dumpView, 0, 0)
- }
- }
-
- override fun dispatchDraw(canvas: Canvas?) {
- doDrawingTrick = beforeDispatchDraw()
- super.dispatchDraw(canvas)
-
- if (doDrawingTrick) {
- doDrawingTrick = false
- }
- }
-
- override fun drawChild(canvas: Canvas?, child: View?, drawingTime: Long): Boolean {
- val children = getDisappearingChildren()
-
- if (doDrawingTrick && children != null) {
- // Use the dump view as a marker for when to do the trick
- if (child == dumpView) {
- // I dont even know what this does.
- var consumed = false
-
- children.forEach { view ->
- consumed = consumed || super.drawChild(canvas, view, drawingTime)
- }
-
- return consumed
- } else if (children.contains(child)) {
- // Ignore the disappearing children
- return false
- }
- }
-
- return super.drawChild(canvas, child, drawingTime)
- }
-
- private fun beforeDispatchDraw(): Boolean {
- val children = getDisappearingChildren()
-
- // Dont do trick if there are no disappearing children or if there arent any children other
- // than the dump view.
- if (children == null || children.isEmpty() || childCount <= 1) {
- return false
- }
-
- return true
- }
-
- private fun getDisappearingChildren(): List? {
- if (disappearingChildrenField == null || disappearingChildren != null) {
- return disappearingChildren
- }
-
- try {
- @Suppress("UNCHECKED_CAST")
- disappearingChildren = disappearingChildrenField.get(this) as List?
- } catch (e: Exception) {
- logD("Could not get list of disappearing children.")
- }
-
- return disappearingChildren
- }
-}
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index f9dad6305..e2d0d7d34 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -44,7 +44,7 @@
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
- tools:listitem="@layout/item_artist" />
+ tools:layout="@layout/fragment_home_list" />
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_home.xml b/app/src/main/res/menu/menu_home.xml
index 745b3360d..0e7b88446 100644
--- a/app/src/main/res/menu/menu_home.xml
+++ b/app/src/main/res/menu/menu_home.xml
@@ -21,6 +21,15 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d32fd8453..eb6ca7756 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,6 +25,9 @@
Sort
Ascending
Descending
+ Artist
+ Album
+ Year
Play
Shuffle