From b5c5fabad070dd34a0975f2bdf1f356bfbd6cd61 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 22 Aug 2021 09:01:30 -0600 Subject: [PATCH] home: re-add grid spans Re-add grid spans to HomeFragment when on landscape mode. --- .../org/oxycblt/auxio/home/HomeAdapter.kt | 5 - .../org/oxycblt/auxio/home/HomeFragment.kt | 5 + .../auxio/home/pager/AlbumListFragment.kt | 22 +-- .../auxio/home/pager/ArtistListFragment.kt | 22 +-- .../auxio/home/pager/GenreListFragment.kt | 22 +-- .../auxio/home/pager/SongListFragment.kt | 15 +- .../org/oxycblt/auxio/ui/SlideLinearLayout.kt | 133 ------------------ app/src/main/res/layout/fragment_home.xml | 2 +- app/src/main/res/menu/menu_home.xml | 9 ++ app/src/main/res/values/strings.xml | 3 + 10 files changed, 72 insertions(+), 166 deletions(-) delete mode 100644 app/src/main/java/org/oxycblt/auxio/ui/SlideLinearLayout.kt 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