Added grid layout change option

This commit is contained in:
h4h13 2020-01-17 22:49:06 +05:30
parent fc7c3b30f5
commit 6210065221
49 changed files with 1571 additions and 1428 deletions

View file

@ -12,10 +12,9 @@ abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerVie
private var gridSize: Int = 0
private var sortOrder: String? = null
private var usePaletteInitialized: Boolean = false
private var usePalette: Boolean = false
private var currentLayoutRes: Int = 0
private val isLandscape: Boolean
get() = RetroUtil.isLandscape()
val maxGridSize: Int
get() = if (isLandscape) {
@ -24,25 +23,24 @@ abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerVie
resources.getInteger(R.integer.max_columns)
}
/**
* Override to customize which item layout currentLayoutRes should be used. You might also want to
* override [.canUsePalette] then.
*
* @see .getGridSize
*/
protected val itemLayoutRes: Int
get() = if (getGridSize() > maxGridSizeForList) {
R.layout.item_grid
fun itemLayoutRes(): Int {
return if (getGridSize() > maxGridSizeForList) {
loadLayoutRes()
} else R.layout.item_list
}
protected val maxGridSizeForList: Int
protected abstract fun setLayoutRes(layoutRes: Int)
fun setAndSaveLayoutRes(layoutRes: Int) {
saveLayoutRes(layoutRes)
setLayoutRes(layoutRes)
}
private val maxGridSizeForList: Int
get() = if (isLandscape) {
activity!!.resources.getInteger(R.integer.default_list_columns_land)
} else activity!!.resources.getInteger(R.integer.default_list_columns)
private val isLandscape: Boolean
get() = RetroUtil.isLandscape()
fun getGridSize(): Int {
if (gridSize == 0) {
gridSize = if (isLandscape) {
@ -71,19 +69,8 @@ abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerVie
setSortOrder(sortOrder)
}
/**
* @return whether the palette should be used at all or not
*/
fun usePalette(): Boolean {
if (!usePaletteInitialized) {
usePalette = loadUsePalette()
usePaletteInitialized = true
}
return usePalette
}
fun setAndSaveGridSize(gridSize: Int) {
val oldLayoutRes = itemLayoutRes
val oldLayoutRes = itemLayoutRes()
this.gridSize = gridSize
if (isLandscape) {
saveGridSizeLand(gridSize)
@ -91,7 +78,7 @@ abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerVie
saveGridSize(gridSize)
}
// only recreate the adapter and layout manager if the layout currentLayoutRes has changed
if (oldLayoutRes != itemLayoutRes) {
if (oldLayoutRes != itemLayoutRes()) {
invalidateLayoutManager()
invalidateAdapter()
} else {
@ -99,19 +86,6 @@ abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerVie
}
}
fun setAndSaveUsePalette(usePalette: Boolean) {
this.usePalette = usePalette
saveUsePalette(usePalette)
setUsePalette(usePalette)
}
/**
* @return whether the palette option should be available for the current item layout or not
*/
fun canUsePalette(): Boolean {
return itemLayoutRes == R.layout.item_card_color
}
protected fun notifyLayoutResChanged(@LayoutRes res: Int) {
this.currentLayoutRes = res
val recyclerView = recyclerView()
@ -149,4 +123,8 @@ abstract class AbsLibraryPagerRecyclerViewCustomGridSizeFragment<A : RecyclerVie
protected abstract fun loadUsePalette(): Boolean
protected abstract fun setUsePalette(usePalette: Boolean)
protected abstract fun loadLayoutRes(): Int
protected abstract fun saveLayoutRes(layoutRes: Int)
}

View file

@ -10,15 +10,16 @@ import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.DensityUtil
import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create
import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener
import com.google.android.material.appbar.AppBarLayout
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.container
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.empty
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.emptyEmoji
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.emptyText
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.recyclerView
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import me.zhanghai.android.fastscroll.FastScroller
import me.zhanghai.android.fastscroll.FastScrollerBuilder
abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> :
AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener {
@ -41,13 +42,21 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
}
private fun setUpRecyclerView() {
if (recyclerView is FastScrollRecyclerView) {
ViewUtil.setUpFastScrollRecyclerViewColor(requireActivity(), recyclerView as FastScrollRecyclerView)
}
recyclerView.layoutManager = layoutManager
recyclerView.adapter = adapter
val fastScroller = create(recyclerView)
recyclerView.setOnApplyWindowInsetsListener(
ScrollingViewOnApplyWindowInsetsListener(
recyclerView,
fastScroller
)
)
//OverScrollDecoratorHelper.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL)
}
OverScrollDecoratorHelper.setUpOverScroll(recyclerView, OverScrollDecoratorHelper.ORIENTATION_VERTICAL)
protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller {
return FastScrollerBuilder(recyclerView).useMd2Style().build()
}
private fun initAdapter() {

View file

@ -53,13 +53,13 @@ open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<Al
}
override fun createAdapter(): AlbumAdapter {
var itemLayoutRes = itemLayoutRes
notifyLayoutResChanged(itemLayoutRes)
if (itemLayoutRes != R.layout.item_list) {
itemLayoutRes = PreferenceUtil.getInstance(requireContext()).getAlbumGridStyle(requireContext())
}
/* var itemLayoutRes = itemLayoutRes
notifyLayoutResChanged(itemLayoutRes)
if (itemLayoutRes != R.layout.item_list) {
itemLayoutRes = PreferenceUtil.getInstance(requireContext()).getAlbumGridStyle(requireContext())
}*/
val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet
return AlbumAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes, loadUsePalette(), libraryFragment)
return AlbumAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes(), loadUsePalette(), libraryFragment)
}
public override fun loadUsePalette(): Boolean {
@ -76,37 +76,30 @@ open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<Al
}
override fun loadSortOrder(): String {
return PreferenceUtil.getInstance(requireContext()).albumSortOrder
}
override fun saveSortOrder(sortOrder: String) {
PreferenceUtil.getInstance(requireContext()).albumSortOrder = sortOrder
}
override fun loadGridSize(): Int {
return PreferenceUtil.getInstance(requireContext()).getAlbumGridSize(activity!!)
}
override fun saveGridSize(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setAlbumGridSize(gridColumns)
}
override fun loadGridSizeLand(): Int {
return PreferenceUtil.getInstance(requireContext()).getAlbumGridSizeLand(activity!!)
}
override fun saveGridSizeLand(gridColumns: Int) {
PreferenceUtil.getInstance(requireContext()).setAlbumGridSizeLand(gridColumns)
}
override fun saveUsePalette(usePalette: Boolean) {
PreferenceUtil.getInstance(requireContext()).setAlbumColoredFooters(usePalette)
}
@ -122,6 +115,18 @@ open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<Al
adapter?.swapDataSet(ArrayList())
}
override fun setLayoutRes(layoutRes: Int) {
//adapter?.itemCount?.let { adapter?.notifyItemRangeChanged(0, it) }
}
override fun loadLayoutRes(): Int {
return PreferenceUtil.getInstance(requireContext()).albumGridStyle
}
override fun saveLayoutRes(layoutRes: Int) {
PreferenceUtil.getInstance(requireContext()).albumGridStyle = layoutRes
}
companion object {
@JvmField
var TAG: String = AlbumsFragment::class.java.simpleName

View file

@ -61,13 +61,14 @@ class ArtistsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<Artist
}
override fun createAdapter(): ArtistAdapter {
var itemLayoutRes = itemLayoutRes
notifyLayoutResChanged(itemLayoutRes)
if (itemLayoutRes != R.layout.item_list) {
itemLayoutRes = PreferenceUtil.getInstance(requireContext()).getArtistGridStyle(requireContext())
}
val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet
return ArtistAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes, loadUsePalette(), libraryFragment)
return ArtistAdapter(
libraryFragment.mainActivity,
dataSet,
itemLayoutRes(),
loadUsePalette(),
libraryFragment
)
}
override fun loadGridSize(): Int {
@ -128,4 +129,15 @@ class ArtistsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<Artist
return fragment
}
}
override fun setLayoutRes(layoutRes: Int) {
}
override fun loadLayoutRes(): Int {
return PreferenceUtil.getInstance(requireContext()).artistGridStyle
}
override fun saveLayoutRes(layoutRes: Int) {
PreferenceUtil.getInstance(requireContext()).artistGridStyle = layoutRes
}
}

View file

@ -35,7 +35,6 @@ import code.name.monkey.retromusic.util.RetroUtil;
import com.afollestad.materialcab.MaterialCab;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.card.MaterialCardView;
import io.reactivex.disposables.CompositeDisposable;
import org.jetbrains.annotations.NotNull;
public class LibraryFragment extends AbsMainActivityFragment implements CabHolder, MainActivityFragmentCallbacks {
@ -48,8 +47,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
private MaterialCab cab;
private CompositeDisposable disposable;
private FragmentManager fragmentManager;
private Toolbar toolbar;
@ -76,7 +73,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_library, container, false);
disposable = new CompositeDisposable();
appBarLayout = view.findViewById(R.id.appBarLayout);
toolbarContainer = view.findViewById(R.id.toolbarContainer);
toolbar = view.findViewById(R.id.toolbar);
@ -91,11 +87,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
inflateFragment();
}
@Override
public void onDestroyView() {
super.onDestroyView();
disposable.dispose();
}
public void addOnAppBarOffsetChangedListener(
@NonNull AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
@ -126,11 +117,18 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment
= (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment;
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size);
if (RetroUtil.isLandscape()) {
gridSizeItem.setTitle(R.string.action_grid_size_land);
if (fragment instanceof SongsFragment) {
menu.removeItem(R.id.action_grid_size);
menu.removeItem(R.id.action_layout_type);
} else {
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size);
if (RetroUtil.isLandscape()) {
gridSizeItem.setTitle(R.string.action_grid_size_land);
}
setUpGridSizeMenu(fragment, gridSizeItem.getSubMenu());
MenuItem layoutItem = menu.findItem(R.id.action_layout_type);
setupLayoutMenu(fragment, layoutItem.getSubMenu());
}
setUpGridSizeMenu(fragment, gridSizeItem.getSubMenu());
setUpSortOrderMenu(fragment, menu.findItem(R.id.action_sort_order).getSubMenu());
@ -157,6 +155,9 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
if (handleGridSizeMenuItem(fragment, item)) {
return true;
}
if (handleLayoutResType(fragment, item)) {
return true;
}
if (handleSortOrderMenuItem(fragment, item)) {
return true;
}
@ -220,8 +221,8 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
}
private boolean handleGridSizeMenuItem(
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment
fragment, @NonNull MenuItem item) {
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment,
@NonNull MenuItem item) {
int gridSize = 0;
switch (item.getItemId()) {
case R.id.action_grid_size_1:
@ -258,6 +259,38 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
return false;
}
private boolean handleLayoutResType(
final AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment,
final MenuItem item) {
int layoutRes = -1;
switch (item.getItemId()) {
case R.id.action_layout_normal:
layoutRes = R.layout.item_grid;
break;
case R.id.action_layout_card:
layoutRes = R.layout.item_card;
break;
case R.id.action_layout_colored_card:
layoutRes = R.layout.item_card_color;
break;
case R.id.action_layout_circular:
layoutRes = R.layout.item_grid_circle;
break;
case R.id.action_layout_image:
layoutRes = R.layout.image;
break;
case R.id.action_layout_gradient_image:
layoutRes = R.layout.item_image_gradient;
break;
}
if (layoutRes != -1) {
item.setChecked(true);
fragment.setAndSaveLayoutRes(layoutRes);
return true;
}
return false;
}
private boolean handleSortOrderMenuItem(
@NonNull AbsLibraryPagerRecyclerViewCustomGridSizeFragment
fragment, @NonNull MenuItem item) {
@ -448,7 +481,31 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
sortOrderMenu.setGroupCheckable(0, true, true);
}
@SuppressWarnings("ConstantConditions")
private void setupLayoutMenu(
@NonNull final AbsLibraryPagerRecyclerViewCustomGridSizeFragment fragment,
@NonNull final SubMenu subMenu) {
switch (fragment.itemLayoutRes()) {
case R.layout.item_card:
subMenu.findItem(R.id.action_layout_card).setChecked(true);
break;
case R.layout.item_grid:
subMenu.findItem(R.id.action_layout_normal).setChecked(true);
break;
case R.layout.item_card_color:
subMenu.findItem(R.id.action_layout_colored_card).setChecked(true);
break;
case R.layout.item_grid_circle:
subMenu.findItem(R.id.action_layout_circular).setChecked(true);
break;
case R.layout.image:
subMenu.findItem(R.id.action_layout_image).setChecked(true);
break;
case R.layout.item_image_gradient:
subMenu.findItem(R.id.action_layout_gradient_image).setChecked(true);
break;
}
}
private void setupToolbar() {
toolbar.setBackgroundTintList(
ColorStateList.valueOf(ATHUtil.INSTANCE.resolveColor(requireContext(), R.attr.colorSurface)));
@ -462,6 +519,5 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
getMainActivity().setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(v -> showMainMenu(OptionsSheetDialogFragment.LIBRARY));
ToolbarContentTintHelper.colorBackButton(toolbar);
//toolbar.setTitleTextColor(ATHUtil.INSTANCE.resolveColor(requireContext(), R.attr.colorOnSecondary));
}
}

View file

@ -2,7 +2,8 @@ package code.name.monkey.retromusic.fragments.mainactivity
import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter
@ -12,15 +13,15 @@ import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.mvp.presenter.SongPresenter
import code.name.monkey.retromusic.mvp.presenter.SongView
import code.name.monkey.retromusic.util.PreferenceUtil
import java.util.*
import java.util.ArrayList
import javax.inject.Inject
class SongsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager>(), SongView {
class SongsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdapter, LinearLayoutManager>(),
SongView {
@Inject
lateinit var songPresenter: SongPresenter
override val emptyMessage: Int
get() = R.string.no_songs
@ -34,20 +35,18 @@ class SongsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdap
songPresenter.attachView(this)
}
override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(activity, getGridSize())
override fun createLayoutManager(): LinearLayoutManager {
return LinearLayoutManager(activity)
}
override fun createAdapter(): SongAdapter {
val itemLayoutRes = itemLayoutRes
notifyLayoutResChanged(itemLayoutRes)
val usePalette = loadUsePalette()
val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet
return if (getGridSize() <= maxGridSizeForList) {
ShuffleButtonSongAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes, usePalette, libraryFragment)
} else SongAdapter(libraryFragment.mainActivity, dataSet, itemLayoutRes, usePalette, libraryFragment)
return ShuffleButtonSongAdapter(
libraryFragment.mainActivity,
dataSet,
R.layout.item_list,
libraryFragment
)
}
override fun songs(songs: ArrayList<Song>) {
@ -83,11 +82,9 @@ class SongsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdap
}
public override fun setUsePalette(usePalette: Boolean) {
adapter?.usePalette(usePalette)
}
override fun setGridSize(gridSize: Int) {
layoutManager?.spanCount = gridSize
adapter?.notifyDataSetChanged()
}
@ -131,4 +128,15 @@ class SongsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment<SongAdap
return fragment
}
}
override fun setLayoutRes(@LayoutRes layoutRes: Int) {
}
@LayoutRes
override fun loadLayoutRes(): Int {
return R.layout.item_list
}
override fun saveLayoutRes(@LayoutRes layoutRes: Int) {
}
}

View file

@ -111,6 +111,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment(), OnSharedPref
val song = MusicPlayerRemote.currentSong
title.text = song.title
text.text = song.artistName
if (PreferenceUtil.getInstance(requireContext()).isSongInfo) {
songInfo?.text = getSongInfo(song)
} else {
@ -266,7 +267,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment(), OnSharedPref
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
println(key)
if (key == PreferenceUtil.EXTRA_SONG_INFO) {
updateSong()
if (activity != null) updateSong()
}
}

View file

@ -41,11 +41,7 @@ class PersonalizeSettingsFragment : AbsSettingsFragment(), SharedPreferences.OnS
super.onViewCreated(view, savedInstanceState)
PreferenceUtil.getInstance(requireContext()).registerOnSharedPreferenceChangedListener(this)
var preference: Preference? = findPreference("album_grid_style")
setSummary(preference!!)
preference = findPreference("artist_grid_style")
setSummary(preference!!)
preference = findPreference("home_artist_grid_style")
var preference: Preference? = findPreference("home_artist_grid_style")
setSummary(preference!!)
preference = findPreference("tab_text_mode")
setSummary(preference!!)