PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt

212 lines
7.0 KiB
Kotlin
Raw Normal View History

2020-10-06 08:46:04 +00:00
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This 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 software 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.
*
*/
2019-04-20 05:29:45 +00:00
package code.name.monkey.retromusic.fragments.base
2018-11-30 01:06:16 +00:00
import android.os.Bundle
2020-10-17 12:15:52 +00:00
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
2019-12-01 11:28:57 +00:00
import androidx.annotation.NonNull
import androidx.annotation.StringRes
2020-09-25 17:38:59 +00:00
import androidx.core.text.HtmlCompat
2020-12-03 15:01:27 +00:00
import androidx.core.view.doOnPreDraw
2020-10-17 12:15:52 +00:00
import androidx.core.view.updatePadding
2020-09-25 17:38:59 +00:00
import androidx.navigation.fragment.findNavController
2018-11-30 01:06:16 +00:00
import androidx.recyclerview.widget.RecyclerView
2020-09-25 17:38:59 +00:00
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
2018-11-30 01:06:16 +00:00
import code.name.monkey.retromusic.R
2020-09-25 17:38:59 +00:00
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
2019-11-09 17:33:28 +00:00
import code.name.monkey.retromusic.helper.MusicPlayerRemote
2019-12-01 11:28:57 +00:00
import code.name.monkey.retromusic.util.DensityUtil
2020-01-17 17:19:06 +00:00
import code.name.monkey.retromusic.util.ThemedFastScroller.create
2018-11-30 01:06:16 +00:00
import com.google.android.material.appbar.AppBarLayout
2020-09-25 17:38:59 +00:00
import kotlinx.android.synthetic.main.fragment_main_recycler.*
2020-01-17 17:19:06 +00:00
import me.zhanghai.android.fastscroll.FastScroller
import me.zhanghai.android.fastscroll.FastScrollerBuilder
2018-11-30 01:06:16 +00:00
abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> :
2020-09-25 17:38:59 +00:00
AbsMainActivityFragment(R.layout.fragment_main_recycler),
AppBarLayout.OnOffsetChangedListener {
2018-11-30 01:06:16 +00:00
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
}
2020-05-23 15:09:07 +00:00
2019-12-01 11:28:57 +00:00
protected var adapter: A? = null
protected var layoutManager: LM? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
2020-12-03 15:01:27 +00:00
postponeEnterTransition()
view.doOnPreDraw { startPostponedEnterTransition() }
mainActivity.setBottomBarVisibility(View.VISIBLE)
2020-09-25 17:38:59 +00:00
mainActivity.setSupportActionBar(toolbar)
mainActivity.supportActionBar?.title = null
2019-12-01 11:28:57 +00:00
initLayoutManager()
initAdapter()
setUpRecyclerView()
2020-09-25 17:38:59 +00:00
setupTitle()
}
private fun setupTitle() {
toolbar.setNavigationOnClickListener {
findNavController().navigate(
R.id.searchFragment,
null,
navOptions
)
}
val color = ThemeStore.accentColor(requireContext())
val hexColor = String.format("#%06X", 0xFFFFFF and color)
val appName = HtmlCompat.fromHtml(
"Retro <span style='color:$hexColor';>Music</span>",
HtmlCompat.FROM_HTML_MODE_COMPACT
)
appNameText.text = appName
2019-12-01 11:28:57 +00:00
}
private fun setUpRecyclerView() {
2020-08-13 08:24:36 +00:00
recyclerView.apply {
layoutManager = this@AbsRecyclerViewFragment.layoutManager
adapter = this@AbsRecyclerViewFragment.adapter
val fastScroller = create(this)
2020-10-17 12:15:52 +00:00
2020-08-13 08:24:36 +00:00
}
2020-02-25 06:44:46 +00:00
checkForPadding()
2020-01-17 17:19:06 +00:00
}
2020-01-05 18:22:21 +00:00
2020-01-17 17:19:06 +00:00
protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller {
return FastScrollerBuilder(recyclerView).useMd2Style().build()
2019-12-01 11:28:57 +00:00
}
private fun initAdapter() {
adapter = createAdapter()
adapter?.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
checkIsEmpty()
checkForPadding()
}
})
}
protected open val emptyMessage: Int
@StringRes get() = R.string.empty
private fun getEmojiByUnicode(unicode: Int): String {
return String(Character.toChars(unicode))
}
2020-09-25 17:38:59 +00:00
private fun checkIsEmpty() {
2019-12-01 11:28:57 +00:00
emptyText.setText(emptyMessage)
empty.visibility = if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE
}
private fun checkForPadding() {
val itemCount: Int = adapter?.itemCount ?: 0
2020-10-17 12:15:52 +00:00
2019-12-01 11:28:57 +00:00
if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
2020-10-17 12:15:52 +00:00
val height = DensityUtil.dip2px(requireContext(), 112f)
recyclerView.updatePadding(0, 0, 0, height)
2019-12-01 11:28:57 +00:00
} else {
2020-10-17 12:15:52 +00:00
val height = DensityUtil.dip2px(requireContext(), 56f)
recyclerView.updatePadding(0, 0, 0, height)
2019-12-01 11:28:57 +00:00
}
}
private fun initLayoutManager() {
layoutManager = createLayoutManager()
}
protected abstract fun createLayoutManager(): LM
@NonNull
protected abstract fun createAdapter(): A
override fun onOffsetChanged(p0: AppBarLayout?, i: Int) {
2020-10-17 12:15:52 +00:00
/*recyclerView.setPadding(
recyclerView.paddingLeft,
recyclerView.paddingTop,
recyclerView.paddingRight,
2020-08-11 18:29:44 +00:00
i
2020-10-17 12:15:52 +00:00
)*/
2019-12-01 11:28:57 +00:00
}
override fun onQueueChanged() {
super.onQueueChanged()
checkForPadding()
}
override fun onServiceConnected() {
super.onServiceConnected()
checkForPadding()
}
protected fun invalidateLayoutManager() {
initLayoutManager()
recyclerView.layoutManager = layoutManager
}
protected fun invalidateAdapter() {
initAdapter()
checkIsEmpty()
recyclerView.adapter = adapter
}
fun recyclerView(): RecyclerView {
return recyclerView
}
2020-09-25 17:38:59 +00:00
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
ToolbarContentTintHelper.handleOnPrepareOptionsMenu(requireActivity(), toolbar)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_main, menu)
ToolbarContentTintHelper.handleOnCreateOptionsMenu(
requireContext(),
toolbar,
menu,
ATHToolbarActivity.getToolbarBackgroundColor(toolbar)
)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_settings -> findNavController().navigate(
R.id.settingsActivity,
null,
navOptions
)
R.id.action_import_playlist -> ImportPlaylistDialog().show(
childFragmentManager,
"ImportPlaylist"
)
R.id.action_add_to_playlist -> CreatePlaylistDialog.create(emptyList()).show(
childFragmentManager,
"ShowCreatePlaylistDialog"
)
}
return super.onOptionsItemSelected(item)
}
2020-10-06 08:46:04 +00:00
}