Using Android's Action Mode instead of Material Cab
This commit is contained in:
parent
b1992e8d54
commit
f5063de70f
37 changed files with 311 additions and 549 deletions
|
@ -135,8 +135,6 @@ dependencies {
|
||||||
implementation "com.afollestad.material-dialogs:input:$material_dialog_version"
|
implementation "com.afollestad.material-dialogs:input:$material_dialog_version"
|
||||||
implementation "com.afollestad.material-dialogs:color:$material_dialog_version"
|
implementation "com.afollestad.material-dialogs:color:$material_dialog_version"
|
||||||
|
|
||||||
implementation 'com.afollestad:material-cab:2.0.1'
|
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
|
|
||||||
def kotlin_coroutines_version = '1.6.3'
|
def kotlin_coroutines_version = '1.6.3'
|
||||||
|
|
|
@ -163,7 +163,7 @@ class HomeAdapter(private val activity: AppCompatActivity) :
|
||||||
val songAdapter = SongAdapter(
|
val songAdapter = SongAdapter(
|
||||||
activity,
|
activity,
|
||||||
home.arrayList as MutableList<Song>,
|
home.arrayList as MutableList<Song>,
|
||||||
R.layout.item_favourite_card, null
|
R.layout.item_favourite_card
|
||||||
)
|
)
|
||||||
layoutManager = linearLayoutManager()
|
layoutManager = linearLayoutManager()
|
||||||
adapter = songAdapter
|
adapter = songAdapter
|
||||||
|
@ -178,10 +178,10 @@ class HomeAdapter(private val activity: AppCompatActivity) :
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun artistsAdapter(artists: List<Artist>) =
|
private fun artistsAdapter(artists: List<Artist>) =
|
||||||
ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this)
|
ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, this)
|
||||||
|
|
||||||
private fun albumAdapter(albums: List<Album>) =
|
private fun albumAdapter(albums: List<Album>) =
|
||||||
AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this)
|
AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, this)
|
||||||
|
|
||||||
private fun gridLayoutManager() =
|
private fun gridLayoutManager() =
|
||||||
GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
|
GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false)
|
||||||
|
|
|
@ -29,7 +29,6 @@ import code.name.monkey.retromusic.extensions.getTintedDrawable
|
||||||
import code.name.monkey.retromusic.glide.GlideApp
|
import code.name.monkey.retromusic.glide.GlideApp
|
||||||
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
import code.name.monkey.retromusic.glide.RetroGlideExtension
|
||||||
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
|
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICallbacks
|
import code.name.monkey.retromusic.interfaces.ICallbacks
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||||
|
@ -44,10 +43,9 @@ class SongFileAdapter(
|
||||||
override val activity: AppCompatActivity,
|
override val activity: AppCompatActivity,
|
||||||
private var dataSet: List<File>,
|
private var dataSet: List<File>,
|
||||||
private val itemLayoutRes: Int,
|
private val itemLayoutRes: Int,
|
||||||
private val iCallbacks: ICallbacks?,
|
private val iCallbacks: ICallbacks?
|
||||||
iCabHolder: ICabHolder?,
|
|
||||||
) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(
|
) : AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File>(
|
||||||
activity, iCabHolder, R.menu.menu_media_selection
|
activity, R.menu.menu_media_selection
|
||||||
), PopupTextProvider {
|
), PopupTextProvider {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
|
@ -30,7 +30,6 @@ import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
@ -42,11 +41,9 @@ open class AlbumAdapter(
|
||||||
override val activity: FragmentActivity,
|
override val activity: FragmentActivity,
|
||||||
var dataSet: List<Album>,
|
var dataSet: List<Album>,
|
||||||
var itemLayoutRes: Int,
|
var itemLayoutRes: Int,
|
||||||
iCabHolder: ICabHolder?,
|
|
||||||
val listener: IAlbumClickListener?
|
val listener: IAlbumClickListener?
|
||||||
) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>(
|
) : AbsMultiSelectAdapter<AlbumAdapter.ViewHolder, Album>(
|
||||||
activity,
|
activity,
|
||||||
iCabHolder,
|
|
||||||
R.menu.menu_media_selection
|
R.menu.menu_media_selection
|
||||||
), PopupTextProvider {
|
), PopupTextProvider {
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@ import code.name.monkey.retromusic.glide.RetroGlideExtension
|
||||||
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
|
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
|
@ -30,10 +29,9 @@ import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
class HorizontalAlbumAdapter(
|
class HorizontalAlbumAdapter(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
dataSet: List<Album>,
|
dataSet: List<Album>,
|
||||||
ICabHolder: ICabHolder?,
|
|
||||||
albumClickListener: IAlbumClickListener
|
albumClickListener: IAlbumClickListener
|
||||||
) : AlbumAdapter(
|
) : AlbumAdapter(
|
||||||
activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, ICabHolder, albumClickListener
|
activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, albumClickListener
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun createViewHolder(view: View, viewType: Int): ViewHolder {
|
override fun createViewHolder(view: View, viewType: Int): ViewHolder {
|
||||||
|
|
|
@ -33,7 +33,6 @@ import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.IArtistClickListener
|
import code.name.monkey.retromusic.interfaces.IArtistClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
@ -45,12 +44,10 @@ class ArtistAdapter(
|
||||||
override val activity: FragmentActivity,
|
override val activity: FragmentActivity,
|
||||||
var dataSet: List<Artist>,
|
var dataSet: List<Artist>,
|
||||||
var itemLayoutRes: Int,
|
var itemLayoutRes: Int,
|
||||||
val ICabHolder: ICabHolder?,
|
|
||||||
val IArtistClickListener: IArtistClickListener,
|
val IArtistClickListener: IArtistClickListener,
|
||||||
val IAlbumArtistClickListener: IAlbumArtistClickListener? = null
|
val IAlbumArtistClickListener: IAlbumArtistClickListener? = null
|
||||||
) : AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist>(
|
) : AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist>(activity, R.menu.menu_media_selection),
|
||||||
activity, ICabHolder, R.menu.menu_media_selection
|
PopupTextProvider {
|
||||||
), PopupTextProvider {
|
|
||||||
|
|
||||||
var albumArtistsOnly = false
|
var albumArtistsOnly = false
|
||||||
|
|
||||||
|
|
|
@ -1,56 +1,61 @@
|
||||||
package code.name.monkey.retromusic.adapter.base
|
package code.name.monkey.retromusic.adapter.base
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.view.ActionMode
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
|
import android.view.View
|
||||||
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.annotation.MenuRes
|
import androidx.annotation.MenuRes
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import code.name.monkey.appthemehelper.util.VersionUtils
|
import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.surfaceColor
|
import code.name.monkey.retromusic.databinding.NumberRollViewBinding
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
import code.name.monkey.retromusic.extensions.rootView
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
import code.name.monkey.retromusic.views.NumberRollView
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
|
|
||||||
abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
||||||
open val activity: FragmentActivity, private val ICabHolder: ICabHolder?, @MenuRes menuRes: Int
|
open val activity: FragmentActivity, @MenuRes menuRes: Int,
|
||||||
) : RecyclerView.Adapter<V>(), ICabCallback {
|
) : RecyclerView.Adapter<V>(), ActionMode.Callback {
|
||||||
private var cab: AttachedCab? = null
|
var actionMode: ActionMode? = null
|
||||||
private val checked: MutableList<I>
|
private val checked: MutableList<I>
|
||||||
private var menuRes: Int
|
private var menuRes: Int
|
||||||
override fun onCabCreated(cab: AttachedCab, menu: Menu): Boolean {
|
|
||||||
activity.window.statusBarColor =
|
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
|
||||||
RetroColorUtil.shiftBackgroundColor(activity.surfaceColor())
|
val inflater = mode?.menuInflater
|
||||||
|
inflater?.inflate(menuRes, menu)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCabFinished(cab: AttachedCab): Boolean {
|
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
|
||||||
|
if (item?.itemId == R.id.action_multi_select_adapter_check_all) {
|
||||||
|
checkAll()
|
||||||
|
} else {
|
||||||
|
onMultipleItemAction(item!!, ArrayList(checked))
|
||||||
|
actionMode?.finish()
|
||||||
|
clearChecked()
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyActionMode(mode: ActionMode?) {
|
||||||
clearChecked()
|
clearChecked()
|
||||||
activity.window.statusBarColor = when {
|
activity.window.statusBarColor = when {
|
||||||
VersionUtils.hasMarshmallow() -> Color.TRANSPARENT
|
VersionUtils.hasMarshmallow() -> Color.TRANSPARENT
|
||||||
else -> Color.BLACK
|
else -> Color.BLACK
|
||||||
}
|
}
|
||||||
return true
|
actionMode = null
|
||||||
}
|
onBackPressedCallback.remove()
|
||||||
|
|
||||||
override fun onCabItemClicked(item: MenuItem): Boolean {
|
|
||||||
if (item.itemId == R.id.action_multi_select_adapter_check_all) {
|
|
||||||
checkAll()
|
|
||||||
} else {
|
|
||||||
onMultipleItemAction(item, ArrayList(checked))
|
|
||||||
cab?.destroy()
|
|
||||||
clearChecked()
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkAll() {
|
private fun checkAll() {
|
||||||
if (ICabHolder != null) {
|
if (actionMode != null) {
|
||||||
checked.clear()
|
checked.clear()
|
||||||
for (i in 0 until itemCount) {
|
for (i in 0 until itemCount) {
|
||||||
val identifier = getIdentifier(i)
|
val identifier = getIdentifier(i)
|
||||||
|
@ -72,7 +77,7 @@ abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
||||||
}
|
}
|
||||||
|
|
||||||
protected val isInQuickSelectMode: Boolean
|
protected val isInQuickSelectMode: Boolean
|
||||||
get() = cab != null && cab!!.isActive()
|
get() = actionMode != null
|
||||||
|
|
||||||
protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List<I>)
|
protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List<I>)
|
||||||
protected fun setMultiSelectMenuRes(@MenuRes menuRes: Int) {
|
protected fun setMultiSelectMenuRes(@MenuRes menuRes: Int) {
|
||||||
|
@ -80,7 +85,6 @@ abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun toggleChecked(position: Int): Boolean {
|
protected fun toggleChecked(position: Int): Boolean {
|
||||||
if (ICabHolder != null) {
|
|
||||||
val identifier = getIdentifier(position) ?: return false
|
val identifier = getIdentifier(position) ?: return false
|
||||||
if (!checked.remove(identifier)) {
|
if (!checked.remove(identifier)) {
|
||||||
checked.add(identifier)
|
checked.add(identifier)
|
||||||
|
@ -89,31 +93,27 @@ abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
||||||
updateCab()
|
updateCab()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun clearChecked() {
|
private fun clearChecked() {
|
||||||
checked.clear()
|
checked.clear()
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("StringFormatInvalid", "StringFormatMatches")
|
|
||||||
private fun updateCab() {
|
private fun updateCab() {
|
||||||
if (ICabHolder != null) {
|
if (actionMode == null) {
|
||||||
if (cab == null || !cab!!.isActive()) {
|
actionMode = activity.startActionMode(this)?.apply {
|
||||||
cab = ICabHolder.openCab(menuRes, this)
|
customView = NumberRollViewBinding.inflate(activity.layoutInflater).root
|
||||||
|
}
|
||||||
|
activity.onBackPressedDispatcher.addCallback(onBackPressedCallback)
|
||||||
}
|
}
|
||||||
val size = checked.size
|
val size = checked.size
|
||||||
when {
|
when {
|
||||||
size <= 0 -> {
|
size <= 0 -> {
|
||||||
cab?.destroy()
|
actionMode?.finish()
|
||||||
}
|
|
||||||
size == 1 -> {
|
|
||||||
cab?.title(literal = getName(checked[0]))
|
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
cab?.title(literal = activity.getString(R.string.x_selected, size))
|
actionMode?.customView?.findViewById<NumberRollView>(R.id.selection_mode_number)
|
||||||
}
|
?.setNumber(size, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,4 +122,13 @@ abstract class AbsMultiSelectAdapter<V : RecyclerView.ViewHolder?, I>(
|
||||||
checked = ArrayList()
|
checked = ArrayList()
|
||||||
this.menuRes = menuRes
|
this.menuRes = menuRes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
|
||||||
|
override fun handleOnBackPressed() {
|
||||||
|
if (actionMode != null) {
|
||||||
|
actionMode?.finish()
|
||||||
|
remove()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -35,7 +35,6 @@ import code.name.monkey.retromusic.glide.playlistPreview.PlaylistPreview
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
|
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
|
||||||
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
|
import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
@ -46,11 +45,9 @@ class PlaylistAdapter(
|
||||||
override val activity: FragmentActivity,
|
override val activity: FragmentActivity,
|
||||||
var dataSet: List<PlaylistWithSongs>,
|
var dataSet: List<PlaylistWithSongs>,
|
||||||
private var itemLayoutRes: Int,
|
private var itemLayoutRes: Int,
|
||||||
ICabHolder: ICabHolder?,
|
|
||||||
private val listener: IPlaylistClickListener
|
private val listener: IPlaylistClickListener
|
||||||
) : AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, PlaylistWithSongs>(
|
) : AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, PlaylistWithSongs>(
|
||||||
activity,
|
activity,
|
||||||
ICabHolder,
|
|
||||||
R.menu.menu_playlists_selection
|
R.menu.menu_playlists_selection
|
||||||
), PopupTextProvider {
|
), PopupTextProvider {
|
||||||
|
|
||||||
|
|
|
@ -21,15 +21,13 @@ import androidx.annotation.LayoutRes
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
|
|
||||||
abstract class AbsOffsetSongAdapter(
|
abstract class AbsOffsetSongAdapter(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
dataSet: MutableList<Song>,
|
dataSet: MutableList<Song>,
|
||||||
@LayoutRes itemLayoutRes: Int,
|
@LayoutRes itemLayoutRes: Int
|
||||||
ICabHolder: ICabHolder?
|
) : SongAdapter(activity, dataSet, itemLayoutRes) {
|
||||||
) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
|
||||||
if (viewType == OFFSET_ITEM) {
|
if (viewType == OFFSET_ITEM) {
|
||||||
|
|
|
@ -28,7 +28,6 @@ import code.name.monkey.retromusic.extensions.accentColor
|
||||||
import code.name.monkey.retromusic.extensions.accentOutlineColor
|
import code.name.monkey.retromusic.extensions.accentOutlineColor
|
||||||
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
|
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter
|
||||||
|
@ -42,8 +41,7 @@ class OrderablePlaylistSongAdapter(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
dataSet: MutableList<Song>,
|
dataSet: MutableList<Song>,
|
||||||
itemLayoutRes: Int,
|
itemLayoutRes: Int,
|
||||||
ICabHolder: ICabHolder?,
|
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes),
|
||||||
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder),
|
|
||||||
DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
|
DraggableItemAdapter<OrderablePlaylistSongAdapter.ViewHolder> {
|
||||||
|
|
||||||
val libraryViewModel: LibraryViewModel by activity.viewModel()
|
val libraryViewModel: LibraryViewModel by activity.viewModel()
|
||||||
|
|
|
@ -43,9 +43,8 @@ class PlayingQueueAdapter(
|
||||||
dataSet: MutableList<Song>,
|
dataSet: MutableList<Song>,
|
||||||
private var current: Int,
|
private var current: Int,
|
||||||
itemLayoutRes: Int,
|
itemLayoutRes: Int,
|
||||||
) : SongAdapter(
|
) : SongAdapter(activity, dataSet, itemLayoutRes),
|
||||||
activity, dataSet, itemLayoutRes, null
|
DraggableItemAdapter<PlayingQueueAdapter.ViewHolder>,
|
||||||
), DraggableItemAdapter<PlayingQueueAdapter.ViewHolder>,
|
|
||||||
SwipeableItemAdapter<PlayingQueueAdapter.ViewHolder>,
|
SwipeableItemAdapter<PlayingQueueAdapter.ViewHolder>,
|
||||||
PopupTextProvider {
|
PopupTextProvider {
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.extensions.accentColor
|
import code.name.monkey.retromusic.extensions.accentColor
|
||||||
import code.name.monkey.retromusic.extensions.accentOutlineColor
|
import code.name.monkey.retromusic.extensions.accentOutlineColor
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
|
@ -30,9 +29,8 @@ import com.google.android.material.button.MaterialButton
|
||||||
class ShuffleButtonSongAdapter(
|
class ShuffleButtonSongAdapter(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
dataSet: MutableList<Song>,
|
dataSet: MutableList<Song>,
|
||||||
itemLayoutRes: Int,
|
itemLayoutRes: Int
|
||||||
ICabHolder: ICabHolder?
|
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes) {
|
||||||
) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
|
|
||||||
|
|
||||||
|
|
||||||
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
|
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
|
||||||
|
|
|
@ -17,16 +17,14 @@ package code.name.monkey.retromusic.adapter.song
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
|
|
||||||
class SimpleSongAdapter(
|
class SimpleSongAdapter(
|
||||||
context: FragmentActivity,
|
context: FragmentActivity,
|
||||||
songs: ArrayList<Song>,
|
songs: ArrayList<Song>,
|
||||||
layoutRes: Int,
|
layoutRes: Int
|
||||||
ICabHolder: ICabHolder?
|
) : SongAdapter(context, songs, layoutRes) {
|
||||||
) : SongAdapter(context, songs, layoutRes, ICabHolder) {
|
|
||||||
|
|
||||||
override fun swapDataSet(dataSet: List<Song>) {
|
override fun swapDataSet(dataSet: List<Song>) {
|
||||||
this.dataSet = dataSet.toMutableList()
|
this.dataSet = dataSet.toMutableList()
|
||||||
|
|
|
@ -36,8 +36,6 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
|
@ -53,13 +51,11 @@ open class SongAdapter(
|
||||||
override val activity: FragmentActivity,
|
override val activity: FragmentActivity,
|
||||||
var dataSet: MutableList<Song>,
|
var dataSet: MutableList<Song>,
|
||||||
protected var itemLayoutRes: Int,
|
protected var itemLayoutRes: Int,
|
||||||
ICabHolder: ICabHolder?,
|
|
||||||
showSectionName: Boolean = true
|
showSectionName: Boolean = true
|
||||||
) : AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>(
|
) : AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song>(
|
||||||
activity,
|
activity,
|
||||||
ICabHolder,
|
|
||||||
R.menu.menu_media_selection
|
R.menu.menu_media_selection
|
||||||
), ICabCallback, PopupTextProvider {
|
), PopupTextProvider {
|
||||||
|
|
||||||
private var showSectionName = true
|
private var showSectionName = true
|
||||||
|
|
||||||
|
@ -217,6 +213,7 @@ open class SongAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLongClick(v: View?): Boolean {
|
override fun onLongClick(v: View?): Boolean {
|
||||||
|
println("Long click")
|
||||||
return toggleChecked(layoutPosition)
|
return toggleChecked(layoutPosition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ import android.content.Intent
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
|
@ -56,18 +55,12 @@ import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_TRACK_LIST
|
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_TRACK_LIST
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_Z_A
|
import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder.Companion.SONG_Z_A
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.network.Result
|
import code.name.monkey.retromusic.network.Result
|
||||||
import code.name.monkey.retromusic.network.model.LastFmAlbum
|
import code.name.monkey.retromusic.network.model.LastFmAlbum
|
||||||
import code.name.monkey.retromusic.repository.RealRepository
|
import code.name.monkey.retromusic.repository.RealRepository
|
||||||
import code.name.monkey.retromusic.util.*
|
import code.name.monkey.retromusic.util.*
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialArcMotion
|
import com.google.android.material.transition.MaterialArcMotion
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
|
@ -80,7 +73,7 @@ import org.koin.core.parameter.parametersOf
|
||||||
import java.text.Collator
|
import java.text.Collator
|
||||||
|
|
||||||
class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details),
|
class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details),
|
||||||
IAlbumClickListener, ICabHolder {
|
IAlbumClickListener {
|
||||||
|
|
||||||
private var _binding: FragmentAlbumDetailsBinding? = null
|
private var _binding: FragmentAlbumDetailsBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
@ -170,12 +163,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
binding.appBarLayout?.statusBarForeground =
|
binding.appBarLayout?.statusBarForeground =
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
||||||
}
|
}
|
||||||
|
@ -189,8 +176,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
simpleSongAdapter = SimpleSongAdapter(
|
simpleSongAdapter = SimpleSongAdapter(
|
||||||
requireActivity() as AppCompatActivity,
|
requireActivity() as AppCompatActivity,
|
||||||
ArrayList(),
|
ArrayList(),
|
||||||
R.layout.item_song,
|
R.layout.item_song
|
||||||
this
|
|
||||||
)
|
)
|
||||||
binding.fragmentAlbumContent.recyclerView.apply {
|
binding.fragmentAlbumContent.recyclerView.apply {
|
||||||
layoutManager = LinearLayoutManager(requireContext())
|
layoutManager = LinearLayoutManager(requireContext())
|
||||||
|
@ -264,7 +250,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
String.format(getString(R.string.label_more_from), album.artistName)
|
String.format(getString(R.string.label_more_from), album.artistName)
|
||||||
|
|
||||||
val albumAdapter =
|
val albumAdapter =
|
||||||
HorizontalAlbumAdapter(requireActivity() as AppCompatActivity, albums, this, this)
|
HorizontalAlbumAdapter(requireActivity() as AppCompatActivity, albums, this)
|
||||||
binding.fragmentAlbumContent.moreRecyclerView.layoutManager = GridLayoutManager(
|
binding.fragmentAlbumContent.moreRecyclerView.layoutManager = GridLayoutManager(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
1,
|
1,
|
||||||
|
@ -452,38 +438,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
|
||||||
simpleSongAdapter.swapDataSet(album.songs)
|
simpleSongAdapter.swapDataSet(album.songs)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
_binding = null
|
_binding = null
|
||||||
|
|
|
@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.albums
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.navigation.fragment.FragmentNavigatorExtras
|
import androidx.navigation.fragment.FragmentNavigatorExtras
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
@ -25,26 +24,18 @@ import code.name.monkey.retromusic.EXTRA_ALBUM_ID
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
|
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
|
||||||
import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
|
import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
|
||||||
import code.name.monkey.retromusic.extensions.surfaceColor
|
|
||||||
import code.name.monkey.retromusic.fragments.GridStyle
|
import code.name.monkey.retromusic.fragments.GridStyle
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
import code.name.monkey.retromusic.fragments.ReloadType
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
|
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder
|
import code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
|
|
||||||
class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(),
|
class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager>(),
|
||||||
IAlbumClickListener, ICabHolder {
|
IAlbumClickListener {
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
@ -54,12 +45,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
|
||||||
else
|
else
|
||||||
adapter?.swapDataSet(listOf())
|
adapter?.swapDataSet(listOf())
|
||||||
}
|
}
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val titleRes: Int
|
override val titleRes: Int
|
||||||
|
@ -92,7 +77,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
dataSet,
|
dataSet,
|
||||||
itemLayoutRes(),
|
itemLayoutRes(),
|
||||||
this,
|
|
||||||
this
|
this
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -348,40 +332,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridL
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
if (cab.isActive()) {
|
adapter?.actionMode?.finish()
|
||||||
cab.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import android.view.Menu
|
||||||
import android.view.MenuInflater
|
import android.view.MenuInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
|
@ -37,17 +36,11 @@ import code.name.monkey.retromusic.glide.SingleColorTarget
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder
|
import code.name.monkey.retromusic.helper.SortOrder
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.network.Result
|
import code.name.monkey.retromusic.network.Result
|
||||||
import code.name.monkey.retromusic.network.model.LastFmArtist
|
import code.name.monkey.retromusic.network.model.LastFmArtist
|
||||||
import code.name.monkey.retromusic.repository.RealRepository
|
import code.name.monkey.retromusic.repository.RealRepository
|
||||||
import code.name.monkey.retromusic.util.*
|
import code.name.monkey.retromusic.util.*
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -57,7 +50,7 @@ import org.koin.android.ext.android.get
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details),
|
abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details),
|
||||||
IAlbumClickListener, ICabHolder {
|
IAlbumClickListener {
|
||||||
private var _binding: FragmentArtistDetailsBinding? = null
|
private var _binding: FragmentArtistDetailsBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
@ -115,26 +108,19 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
binding.fragmentArtistContent.biographyText.maxLines = 4
|
binding.fragmentArtistContent.biographyText.maxLines = 4
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setupSongSortButton()
|
setupSongSortButton()
|
||||||
binding.appBarLayout?.statusBarForeground =
|
binding.appBarLayout?.statusBarForeground =
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupRecyclerView() {
|
private fun setupRecyclerView() {
|
||||||
albumAdapter = HorizontalAlbumAdapter(requireActivity(), ArrayList(), this, this)
|
albumAdapter = HorizontalAlbumAdapter(requireActivity(), ArrayList(), this)
|
||||||
binding.fragmentArtistContent.albumRecyclerView.apply {
|
binding.fragmentArtistContent.albumRecyclerView.apply {
|
||||||
itemAnimator = DefaultItemAnimator()
|
itemAnimator = DefaultItemAnimator()
|
||||||
layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false)
|
layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false)
|
||||||
adapter = albumAdapter
|
adapter = albumAdapter
|
||||||
}
|
}
|
||||||
songAdapter = SimpleSongAdapter(requireActivity(), ArrayList(), R.layout.item_song, this)
|
songAdapter = SimpleSongAdapter(requireActivity(), ArrayList(), R.layout.item_song)
|
||||||
binding.fragmentArtistContent.recyclerView.apply {
|
binding.fragmentArtistContent.recyclerView.apply {
|
||||||
itemAnimator = DefaultItemAnimator()
|
itemAnimator = DefaultItemAnimator()
|
||||||
layoutManager = LinearLayoutManager(this.context)
|
layoutManager = LinearLayoutManager(this.context)
|
||||||
|
@ -277,8 +263,12 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
R.id.action_set_artist_image -> {
|
R.id.action_set_artist_image -> {
|
||||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
||||||
intent.type = "image/*"
|
intent.type = "image/*"
|
||||||
selectImageLauncher.launch(Intent.createChooser(intent,
|
selectImageLauncher.launch(
|
||||||
getString(R.string.pick_from_local_storage)))
|
Intent.createChooser(
|
||||||
|
intent,
|
||||||
|
getString(R.string.pick_from_local_storage)
|
||||||
|
)
|
||||||
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
R.id.action_reset_artist_image -> {
|
R.id.action_reset_artist_image -> {
|
||||||
|
@ -359,40 +349,6 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
inflater.inflate(R.menu.menu_artist_detail, menu)
|
inflater.inflate(R.menu.menu_artist_detail, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
_binding = null
|
_binding = null
|
||||||
|
|
|
@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.artists
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.navigation.fragment.FragmentNavigatorExtras
|
import androidx.navigation.fragment.FragmentNavigatorExtras
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
@ -26,7 +25,6 @@ import code.name.monkey.retromusic.EXTRA_ARTIST_NAME
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
|
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
|
||||||
import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
|
import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
|
||||||
import code.name.monkey.retromusic.extensions.surfaceColor
|
|
||||||
import code.name.monkey.retromusic.fragments.GridStyle
|
import code.name.monkey.retromusic.fragments.GridStyle
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
import code.name.monkey.retromusic.fragments.ReloadType
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
|
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
|
||||||
|
@ -34,19 +32,12 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.ArtistSortOrder
|
import code.name.monkey.retromusic.helper.SortOrder.ArtistSortOrder
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.IArtistClickListener
|
import code.name.monkey.retromusic.interfaces.IArtistClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
|
|
||||||
class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(),
|
class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager>(),
|
||||||
IArtistClickListener, IAlbumArtistClickListener, ICabHolder {
|
IArtistClickListener, IAlbumArtistClickListener {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
libraryViewModel.getArtists().observe(viewLifecycleOwner) {
|
libraryViewModel.getArtists().observe(viewLifecycleOwner) {
|
||||||
|
@ -55,12 +46,6 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
|
||||||
else
|
else
|
||||||
adapter?.swapDataSet(listOf())
|
adapter?.swapDataSet(listOf())
|
||||||
}
|
}
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val titleRes: Int
|
override val titleRes: Int
|
||||||
|
@ -98,7 +83,7 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
|
||||||
dataSet,
|
dataSet,
|
||||||
itemLayoutRes(),
|
itemLayoutRes(),
|
||||||
this,
|
this,
|
||||||
this, this
|
this
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,47 +331,8 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment<ArtistAdapter, Gri
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
libraryViewModel.forceReload(ReloadType.Artists)
|
libraryViewModel.forceReload(ReloadType.Artists)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
|
||||||
super.onPause()
|
|
||||||
if (cab.isActive()) {
|
|
||||||
cab.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||||
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
|
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
|
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
|
||||||
import code.name.monkey.retromusic.databinding.FragmentMainRecyclerBinding
|
import code.name.monkey.retromusic.databinding.FragmentMainRecyclerBinding
|
||||||
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
|
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
|
||||||
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
|
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
|
||||||
|
@ -225,4 +226,9 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
_binding = null
|
_binding = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
(adapter as? AbsMultiSelectAdapter<*, *>)?.actionMode?.finish()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,12 +40,13 @@ import code.name.monkey.retromusic.adapter.Storage
|
||||||
import code.name.monkey.retromusic.adapter.StorageAdapter
|
import code.name.monkey.retromusic.adapter.StorageAdapter
|
||||||
import code.name.monkey.retromusic.adapter.StorageClickListener
|
import code.name.monkey.retromusic.adapter.StorageClickListener
|
||||||
import code.name.monkey.retromusic.databinding.FragmentFolderBinding
|
import code.name.monkey.retromusic.databinding.FragmentFolderBinding
|
||||||
import code.name.monkey.retromusic.extensions.*
|
import code.name.monkey.retromusic.extensions.dip
|
||||||
|
import code.name.monkey.retromusic.extensions.showToast
|
||||||
|
import code.name.monkey.retromusic.extensions.textColorPrimary
|
||||||
|
import code.name.monkey.retromusic.extensions.textColorSecondary
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
||||||
import code.name.monkey.retromusic.helper.MusicPlayerRemote.openQueue
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote.openQueue
|
||||||
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICallbacks
|
import code.name.monkey.retromusic.interfaces.ICallbacks
|
||||||
import code.name.monkey.retromusic.interfaces.IMainActivityFragmentCallbacks
|
import code.name.monkey.retromusic.interfaces.IMainActivityFragmentCallbacks
|
||||||
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener
|
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener
|
||||||
|
@ -54,16 +55,11 @@ import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.providers.BlacklistStore
|
import code.name.monkey.retromusic.providers.BlacklistStore
|
||||||
import code.name.monkey.retromusic.util.FileUtil
|
import code.name.monkey.retromusic.util.FileUtil
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
|
import code.name.monkey.retromusic.util.PreferenceUtil.startDirectory
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import code.name.monkey.retromusic.util.ThemedFastScroller.create
|
import code.name.monkey.retromusic.util.ThemedFastScroller.create
|
||||||
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
import code.name.monkey.retromusic.util.getExternalStorageDirectory
|
||||||
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
|
import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory
|
||||||
import code.name.monkey.retromusic.views.BreadCrumbLayout.Crumb
|
import code.name.monkey.retromusic.views.BreadCrumbLayout.Crumb
|
||||||
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
|
import code.name.monkey.retromusic.views.BreadCrumbLayout.SelectionCallback
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.google.android.material.transition.MaterialFadeThrough
|
import com.google.android.material.transition.MaterialFadeThrough
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -76,7 +72,7 @@ import java.lang.ref.WeakReference
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
IMainActivityFragmentCallbacks, ICabHolder, SelectionCallback, ICallbacks,
|
IMainActivityFragmentCallbacks, SelectionCallback, ICallbacks,
|
||||||
LoaderManager.LoaderCallbacks<List<File>>, StorageClickListener {
|
LoaderManager.LoaderCallbacks<List<File>>, StorageClickListener {
|
||||||
private var _binding: FragmentFolderBinding? = null
|
private var _binding: FragmentFolderBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
@ -85,7 +81,6 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
|
|
||||||
private var adapter: SongFileAdapter? = null
|
private var adapter: SongFileAdapter? = null
|
||||||
private var storageAdapter: StorageAdapter? = null
|
private var storageAdapter: StorageAdapter? = null
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
private val fileComparator = Comparator { lhs: File, rhs: File ->
|
private val fileComparator = Comparator { lhs: File, rhs: File ->
|
||||||
if (lhs.isDirectory && !rhs.isDirectory) {
|
if (lhs.isDirectory && !rhs.isDirectory) {
|
||||||
return@Comparator -1
|
return@Comparator -1
|
||||||
|
@ -149,16 +144,10 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
saveScrollPosition()
|
saveScrollPosition()
|
||||||
if (cab.isActive()) {
|
adapter?.actionMode?.finish()
|
||||||
cab.destroy()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun handleBackPress(): Boolean {
|
override fun handleBackPress(): Boolean {
|
||||||
if (cab != null && cab!!.isActive()) {
|
|
||||||
cab?.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if (binding.breadCrumbs.popHistory()) {
|
if (binding.breadCrumbs.popHistory()) {
|
||||||
setCrumb(binding.breadCrumbs.lastHistory(), false)
|
setCrumb(binding.breadCrumbs.lastHistory(), false)
|
||||||
return true
|
return true
|
||||||
|
@ -388,24 +377,6 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
checkForMargins()
|
checkForMargins()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
if (cab != null && cab!!.isActive()) {
|
|
||||||
cab?.destroy()
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun checkForMargins() {
|
private fun checkForMargins() {
|
||||||
if (mainActivity.isBottomNavVisible) {
|
if (mainActivity.isBottomNavVisible) {
|
||||||
binding.recyclerView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
binding.recyclerView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||||
|
@ -593,7 +564,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun switchToFileAdapter() {
|
private fun switchToFileAdapter() {
|
||||||
adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this, this)
|
adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this)
|
||||||
adapter!!.registerAdapterDataObserver(
|
adapter!!.registerAdapterDataObserver(
|
||||||
object : RecyclerView.AdapterDataObserver() {
|
object : RecyclerView.AdapterDataObserver() {
|
||||||
override fun onChanged() {
|
override fun onChanged() {
|
||||||
|
|
|
@ -71,7 +71,7 @@ class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupRecyclerView() {
|
private fun setupRecyclerView() {
|
||||||
songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list, null)
|
songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list)
|
||||||
binding.recyclerView.apply {
|
binding.recyclerView.apply {
|
||||||
itemAnimator = DefaultItemAnimator()
|
itemAnimator = DefaultItemAnimator()
|
||||||
layoutManager = LinearLayoutManager(requireContext())
|
layoutManager = LinearLayoutManager(requireContext())
|
||||||
|
|
|
@ -36,27 +36,19 @@ import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter
|
||||||
import code.name.monkey.retromusic.adapter.song.SongAdapter
|
import code.name.monkey.retromusic.adapter.song.SongAdapter
|
||||||
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
|
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
|
||||||
import code.name.monkey.retromusic.db.toSong
|
import code.name.monkey.retromusic.db.toSong
|
||||||
import code.name.monkey.retromusic.extensions.surfaceColor
|
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
||||||
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.IArtistClickListener
|
import code.name.monkey.retromusic.interfaces.IArtistClickListener
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
|
|
||||||
|
|
||||||
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
|
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
|
||||||
IArtistClickListener, IAlbumClickListener, ICabHolder {
|
IArtistClickListener, IAlbumClickListener {
|
||||||
private val args by navArgs<DetailListFragmentArgs>()
|
private val args by navArgs<DetailListFragmentArgs>()
|
||||||
private var _binding: FragmentPlaylistDetailBinding? = null
|
private var _binding: FragmentPlaylistDetailBinding? = null
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
@ -104,12 +96,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
|
|
||||||
binding.appBarLayout.statusBarForeground =
|
binding.appBarLayout.statusBarForeground =
|
||||||
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
findNavController().navigateUp()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun lastAddedSongs() {
|
private fun lastAddedSongs() {
|
||||||
|
@ -117,7 +103,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
val songAdapter = ShuffleButtonSongAdapter(
|
val songAdapter = ShuffleButtonSongAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
mutableListOf(),
|
mutableListOf(),
|
||||||
R.layout.item_list, this
|
R.layout.item_list
|
||||||
)
|
)
|
||||||
binding.recyclerView.apply {
|
binding.recyclerView.apply {
|
||||||
adapter = songAdapter
|
adapter = songAdapter
|
||||||
|
@ -134,7 +120,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
val songAdapter = ShuffleButtonSongAdapter(
|
val songAdapter = ShuffleButtonSongAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
mutableListOf(),
|
mutableListOf(),
|
||||||
R.layout.item_list, this
|
R.layout.item_list
|
||||||
)
|
)
|
||||||
binding.recyclerView.apply {
|
binding.recyclerView.apply {
|
||||||
adapter = songAdapter
|
adapter = songAdapter
|
||||||
|
@ -151,7 +137,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
val songAdapter = ShuffleButtonSongAdapter(
|
val songAdapter = ShuffleButtonSongAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
mutableListOf(),
|
mutableListOf(),
|
||||||
R.layout.item_list, this
|
R.layout.item_list
|
||||||
)
|
)
|
||||||
binding.recyclerView.apply {
|
binding.recyclerView.apply {
|
||||||
adapter = songAdapter
|
adapter = songAdapter
|
||||||
|
@ -170,7 +156,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
val songAdapter = SongAdapter(
|
val songAdapter = SongAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
mutableListOf(),
|
mutableListOf(),
|
||||||
R.layout.item_list, this
|
R.layout.item_list
|
||||||
)
|
)
|
||||||
binding.recyclerView.apply {
|
binding.recyclerView.apply {
|
||||||
adapter = songAdapter
|
adapter = songAdapter
|
||||||
|
@ -211,14 +197,14 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
artists,
|
artists,
|
||||||
R.layout.item_grid_circle,
|
R.layout.item_grid_circle,
|
||||||
this, this@DetailListFragment
|
this
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun albumAdapter(albums: List<Album>): AlbumAdapter = AlbumAdapter(
|
private fun albumAdapter(albums: List<Album>): AlbumAdapter = AlbumAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
albums,
|
albums,
|
||||||
R.layout.item_grid,
|
R.layout.item_grid,
|
||||||
this, this@DetailListFragment
|
this
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun linearLayoutManager(): LinearLayoutManager =
|
private fun linearLayoutManager(): LinearLayoutManager =
|
||||||
|
@ -260,38 +246,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
_binding = null
|
_binding = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
inflater.inflate(R.menu.menu_clear_history, menu)
|
inflater.inflate(R.menu.menu_clear_history, menu)
|
||||||
if (showClearHistoryOption) {
|
if (showClearHistoryOption) {
|
||||||
|
|
|
@ -20,16 +20,9 @@ import code.name.monkey.retromusic.db.toSongs
|
||||||
import code.name.monkey.retromusic.extensions.surfaceColor
|
import code.name.monkey.retromusic.extensions.surfaceColor
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
||||||
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.model.Song
|
import code.name.monkey.retromusic.model.Song
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import code.name.monkey.retromusic.util.ThemedFastScroller
|
import code.name.monkey.retromusic.util.ThemedFastScroller
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
import com.google.android.material.transition.MaterialArcMotion
|
import com.google.android.material.transition.MaterialArcMotion
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
|
@ -41,8 +34,7 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
|
|
||||||
|
|
||||||
class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
|
class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) {
|
||||||
ICabHolder {
|
|
||||||
private val arguments by navArgs<PlaylistDetailsFragmentArgs>()
|
private val arguments by navArgs<PlaylistDetailsFragmentArgs>()
|
||||||
private val viewModel by viewModel<PlaylistDetailsViewModel> {
|
private val viewModel by viewModel<PlaylistDetailsViewModel> {
|
||||||
parametersOf(arguments.extraPlaylist)
|
parametersOf(arguments.extraPlaylist)
|
||||||
|
@ -95,8 +87,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
playlist.playlistEntity,
|
playlist.playlistEntity,
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
ArrayList(),
|
ArrayList(),
|
||||||
R.layout.item_queue,
|
R.layout.item_queue
|
||||||
this
|
|
||||||
)
|
)
|
||||||
|
|
||||||
val dragDropManager = RecyclerViewDragDropManager()
|
val dragDropManager = RecyclerViewDragDropManager()
|
||||||
|
@ -165,26 +156,4 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
_binding = null
|
_binding = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -66,7 +66,6 @@ class PlaylistsFragment :
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
dataSet,
|
dataSet,
|
||||||
itemLayoutRes(),
|
itemLayoutRes(),
|
||||||
null,
|
|
||||||
this
|
this
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,29 +16,19 @@ package code.name.monkey.retromusic.fragments.songs
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import androidx.activity.addCallback
|
|
||||||
import androidx.annotation.LayoutRes
|
import androidx.annotation.LayoutRes
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.adapter.song.SongAdapter
|
import code.name.monkey.retromusic.adapter.song.SongAdapter
|
||||||
import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
|
import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
|
||||||
import code.name.monkey.retromusic.extensions.surfaceColor
|
|
||||||
import code.name.monkey.retromusic.fragments.GridStyle
|
import code.name.monkey.retromusic.fragments.GridStyle
|
||||||
import code.name.monkey.retromusic.fragments.ReloadType
|
import code.name.monkey.retromusic.fragments.ReloadType
|
||||||
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
|
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
|
||||||
import code.name.monkey.retromusic.helper.SortOrder.SongSortOrder
|
import code.name.monkey.retromusic.helper.SortOrder.SongSortOrder
|
||||||
import code.name.monkey.retromusic.interfaces.ICabCallback
|
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
import com.afollestad.materialcab.attached.destroy
|
|
||||||
import com.afollestad.materialcab.attached.isActive
|
|
||||||
import com.afollestad.materialcab.createCab
|
|
||||||
|
|
||||||
class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager>(),
|
class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager>() {
|
||||||
ICabHolder {
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
libraryViewModel.getSongs().observe(viewLifecycleOwner) {
|
libraryViewModel.getSongs().observe(viewLifecycleOwner) {
|
||||||
|
@ -47,12 +37,6 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
|
||||||
else
|
else
|
||||||
adapter?.swapDataSet(listOf())
|
adapter?.swapDataSet(listOf())
|
||||||
}
|
}
|
||||||
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
|
|
||||||
if (!handleBackPress()) {
|
|
||||||
remove()
|
|
||||||
requireActivity().onBackPressed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val titleRes: Int
|
override val titleRes: Int
|
||||||
|
@ -77,8 +61,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
|
||||||
return SongAdapter(
|
return SongAdapter(
|
||||||
requireActivity(),
|
requireActivity(),
|
||||||
dataSet,
|
dataSet,
|
||||||
itemLayoutRes(),
|
itemLayoutRes()
|
||||||
this
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,9 +325,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
if (cab.isActive()) {
|
adapter?.actionMode?.finish()
|
||||||
cab.destroy()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -356,36 +337,4 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment<SongAdapter, GridLay
|
||||||
return SongsFragment()
|
return SongsFragment()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var cab: AttachedCab? = null
|
|
||||||
|
|
||||||
private fun handleBackPress(): Boolean {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
|
|
||||||
cab?.let {
|
|
||||||
if (it.isActive()) {
|
|
||||||
it.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cab = createCab(R.id.toolbar_container) {
|
|
||||||
menu(menuRes)
|
|
||||||
closeDrawable(R.drawable.ic_close)
|
|
||||||
backgroundColor(literal = RetroColorUtil.shiftBackgroundColor(surfaceColor()))
|
|
||||||
slideDown()
|
|
||||||
onCreate { cab, menu -> callback.onCabCreated(cab, menu) }
|
|
||||||
onSelection {
|
|
||||||
callback.onCabItemClicked(it)
|
|
||||||
}
|
|
||||||
onDestroy { callback.onCabFinished(it) }
|
|
||||||
}
|
|
||||||
return cab as AttachedCab
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package code.name.monkey.retromusic.interfaces
|
|
||||||
|
|
||||||
import android.view.Menu
|
|
||||||
import android.view.MenuItem
|
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
|
|
||||||
interface ICabCallback {
|
|
||||||
fun onCabCreated(cab: AttachedCab, menu: Menu): Boolean
|
|
||||||
|
|
||||||
fun onCabItemClicked(item: MenuItem): Boolean
|
|
||||||
|
|
||||||
fun onCabFinished(cab: AttachedCab): Boolean
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package code.name.monkey.retromusic.interfaces
|
|
||||||
|
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
|
||||||
|
|
||||||
interface ICabHolder {
|
|
||||||
|
|
||||||
fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab
|
|
||||||
}
|
|
|
@ -0,0 +1,151 @@
|
||||||
|
// Copyright 2015 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
package code.name.monkey.retromusic.views
|
||||||
|
|
||||||
|
import android.animation.Animator
|
||||||
|
import android.animation.ObjectAnimator
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.ColorStateList
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.util.Property
|
||||||
|
import android.view.animation.LinearInterpolator
|
||||||
|
import android.widget.FrameLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.annotation.VisibleForTesting
|
||||||
|
import code.name.monkey.retromusic.R
|
||||||
|
import java.text.NumberFormat
|
||||||
|
|
||||||
|
/**
|
||||||
|
* View that shows an integer number. It provides a smooth roll animation on changing the
|
||||||
|
* number.
|
||||||
|
*/
|
||||||
|
class NumberRollView(context: Context?, attrs: AttributeSet?) :
|
||||||
|
FrameLayout(context!!, attrs) {
|
||||||
|
private var mUpNumber: TextView? = null
|
||||||
|
private var mDownNumber: TextView? = null
|
||||||
|
private var mNumber = 0f
|
||||||
|
private var mLastRollAnimator: Animator? = null
|
||||||
|
private var mStringId = R.string.x_selected
|
||||||
|
private var mStringIdForZero = 0
|
||||||
|
override fun onFinishInflate() {
|
||||||
|
super.onFinishInflate()
|
||||||
|
mUpNumber = findViewById(R.id.up)
|
||||||
|
mDownNumber = findViewById(R.id.down)
|
||||||
|
assert(mUpNumber != null)
|
||||||
|
assert(mDownNumber != null)
|
||||||
|
setNumberRoll(mNumber)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a number to display.
|
||||||
|
* @param animate Whether it should smoothly animate to the number.
|
||||||
|
*/
|
||||||
|
fun setNumber(number: Int, animate: Boolean) {
|
||||||
|
if (mLastRollAnimator != null) mLastRollAnimator!!.cancel()
|
||||||
|
if (animate) {
|
||||||
|
val rollAnimator: Animator =
|
||||||
|
ObjectAnimator.ofFloat(this, NUMBER_PROPERTY, number.toFloat())
|
||||||
|
rollAnimator.interpolator = LinearInterpolator()
|
||||||
|
rollAnimator.start()
|
||||||
|
mLastRollAnimator = rollAnimator
|
||||||
|
} else {
|
||||||
|
setNumberRoll(number.toFloat())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param stringId The id of the string to use for the description. The string must be a plural
|
||||||
|
* that has one placeholder for a quantity.
|
||||||
|
*/
|
||||||
|
fun setString(stringId: Int) {
|
||||||
|
mStringId = stringId
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param stringIdForZero The id of the string to use for the description when the number is
|
||||||
|
* zero.
|
||||||
|
*/
|
||||||
|
fun setStringForZero(stringIdForZero: Int) {
|
||||||
|
mStringIdForZero = stringIdForZero
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the current number roll position.
|
||||||
|
*/
|
||||||
|
private fun getNumberRoll(): Float {
|
||||||
|
return mNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the number roll position.
|
||||||
|
*/
|
||||||
|
private fun setNumberRoll(number: Float) {
|
||||||
|
mNumber = number
|
||||||
|
val downNumber = number.toInt()
|
||||||
|
val upNumber = downNumber + 1
|
||||||
|
val numberFormatter = NumberFormat.getIntegerInstance()
|
||||||
|
var newString = if (mStringId != 0) {
|
||||||
|
if (upNumber == 0 && mStringIdForZero != 0) resources.getString(mStringIdForZero) else resources.getString(
|
||||||
|
mStringId,
|
||||||
|
upNumber
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
numberFormatter.format(upNumber.toLong())
|
||||||
|
}
|
||||||
|
if (newString != mUpNumber!!.text.toString()) {
|
||||||
|
mUpNumber!!.text = newString
|
||||||
|
}
|
||||||
|
newString = if (mStringId != 0) {
|
||||||
|
if (downNumber == 0 && mStringIdForZero != 0) resources.getString(mStringIdForZero) else resources.getString(
|
||||||
|
mStringId,
|
||||||
|
downNumber
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
numberFormatter.format(downNumber.toLong())
|
||||||
|
}
|
||||||
|
if (newString != mDownNumber!!.text.toString()) {
|
||||||
|
mDownNumber!!.text = newString
|
||||||
|
}
|
||||||
|
val offset = number % 1.0f
|
||||||
|
mUpNumber!!.translationY = mUpNumber!!.height * (offset - 1.0f)
|
||||||
|
mDownNumber!!.translationY = mDownNumber!!.height * offset
|
||||||
|
mUpNumber!!.alpha = offset
|
||||||
|
mDownNumber!!.alpha = 1.0f - offset
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Ends any in-progress animations. */
|
||||||
|
@VisibleForTesting
|
||||||
|
fun endAnimationsForTesting() {
|
||||||
|
if (mLastRollAnimator != null) mLastRollAnimator!!.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the text color with [ColorStateList] for both [TextView].
|
||||||
|
* @param resId The new text [ColorStateList] to use.
|
||||||
|
*/
|
||||||
|
fun setTextColorStateList(colorStateList: ColorStateList?) {
|
||||||
|
mUpNumber!!.setTextColor(colorStateList)
|
||||||
|
mDownNumber!!.setTextColor(colorStateList)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
/**
|
||||||
|
* A Property wrapper around the `number` functionality handled by the
|
||||||
|
* [NumberRollView.setNumberRoll] and [NumberRollView.getNumberRoll]
|
||||||
|
* methods.
|
||||||
|
*/
|
||||||
|
val NUMBER_PROPERTY: Property<NumberRollView, Float> =
|
||||||
|
object : Property<NumberRollView, Float>(
|
||||||
|
Float::class.java, ""
|
||||||
|
) {
|
||||||
|
override fun set(view: NumberRollView, value: Float) {
|
||||||
|
view.setNumberRoll(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun get(view: NumberRollView): Float {
|
||||||
|
return view.getNumberRoll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
|
android:tint="?colorControlNormal"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="?actionBarSize"
|
|
||||||
android:elevation="@dimen/mcab_toolbar_elevation"
|
|
||||||
android:theme="@style/mcab_theme"
|
|
||||||
tools:ignore="UnusedAttribute" />
|
|
26
app/src/main/res/layout/number_roll_view.xml
Normal file
26
app/src/main/res/layout/number_roll_view.xml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Copyright 2016 The Chromium Authors. All rights reserved.
|
||||||
|
Use of this source code is governed by a BSD-style license that can be
|
||||||
|
found in the LICENSE file. -->
|
||||||
|
<code.name.monkey.retromusic.views.NumberRollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/selection_mode_number"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:focusable="true"
|
||||||
|
android:focusableInTouchMode="true">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/up"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textAppearance="@style/TextAppearance.Material3.ActionBar.Title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/down"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textAppearance="@style/TextAppearance.Material3.ActionBar.Title" />
|
||||||
|
</code.name.monkey.retromusic.views.NumberRollView>
|
|
@ -25,5 +25,6 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.MaterialComponents.CardView</item>
|
<item name="materialCardViewStyle">@style/Widget.MaterialComponents.CardView</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlayDark</item>
|
<item name="elevationOverlayColor">@color/elevationOverlayDark</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
|
@ -25,7 +25,6 @@
|
||||||
<item name="colorSurface">@color/darkColorSurface</item>
|
<item name="colorSurface">@color/darkColorSurface</item>
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="mcab_theme" parent="@style/ThemeOverlay.MaterialComponents.Dark" />
|
|
||||||
</resources>
|
</resources>
|
|
@ -24,6 +24,7 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.Base" parent="Theme.Material3.Dark.NoActionBar">
|
<style name="Theme.RetroMusic.Base" parent="Theme.Material3.Dark.NoActionBar">
|
||||||
|
@ -39,6 +40,7 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.Base.Light" parent="Theme.Material3.Light.NoActionBar">
|
<style name="Theme.RetroMusic.Base.Light" parent="Theme.Material3.Light.NoActionBar">
|
||||||
|
@ -52,5 +54,6 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlayLight</item>
|
<item name="elevationOverlayColor">@color/elevationOverlayLight</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
|
@ -9,6 +9,7 @@
|
||||||
<item name="materialButtonStyle">@style/MaterialButtonTheme</item>
|
<item name="materialButtonStyle">@style/MaterialButtonTheme</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
<item name="android:windowBackground">?attr/colorSurface</item>
|
<item name="android:windowBackground">?attr/colorSurface</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.MD3.Black" parent="@style/Theme.RetroMusic.MD3" />
|
<style name="Theme.RetroMusic.MD3.Black" parent="@style/Theme.RetroMusic.MD3" />
|
||||||
|
|
|
@ -44,10 +44,6 @@
|
||||||
<item name="titleMarginStart">16dp</item>
|
<item name="titleMarginStart">16dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="mcab_theme" parent="@style/ThemeOverlay.MaterialComponents.Light">
|
|
||||||
<item name="android:actionOverflowButtonStyle">@style/mcab_overflow_style</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="mcab_overflow_style" parent="Widget.AppCompat.ActionButton.Overflow">
|
<style name="mcab_overflow_style" parent="Widget.AppCompat.ActionButton.Overflow">
|
||||||
<item name="srcCompat">@drawable/ic_more_vert</item>
|
<item name="srcCompat">@drawable/ic_more_vert</item>
|
||||||
<item name="android:tint">?colorSurface</item>
|
<item name="android:tint">?colorSurface</item>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.Base.Adaptive" parent="Theme.Material3.DayNight.NoActionBar">
|
<style name="Theme.RetroMusic.Base.Adaptive" parent="Theme.Material3.DayNight.NoActionBar">
|
||||||
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
|
||||||
<item name="roundSelector">@drawable/round_selector</item>
|
<item name="roundSelector">@drawable/round_selector</item>
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>T
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>T
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="android:windowActionModeOverlay">false</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.Base" parent="Theme.Material3.Dark.NoActionBar">
|
<style name="Theme.RetroMusic.Base" parent="Theme.Material3.Dark.NoActionBar">
|
||||||
|
@ -27,6 +29,7 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
<item name="elevationOverlayColor">@color/elevationOverlay</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.Base.Black" parent="Theme.Material3.Dark.NoActionBar">
|
<style name="Theme.RetroMusic.Base.Black" parent="Theme.Material3.Dark.NoActionBar">
|
||||||
|
@ -42,6 +45,7 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlayDark</item>
|
<item name="elevationOverlayColor">@color/elevationOverlayDark</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Theme.RetroMusic.Base.Light" parent="Theme.Material3.Light.NoActionBar">
|
<style name="Theme.RetroMusic.Base.Light" parent="Theme.Material3.Light.NoActionBar">
|
||||||
|
@ -56,6 +60,7 @@
|
||||||
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
<item name="materialCardViewStyle">@style/Widget.Material3.CardView.Elevated</item>
|
||||||
<item name="elevationOverlayColor">@color/elevationOverlayLight</item>
|
<item name="elevationOverlayColor">@color/elevationOverlayLight</item>
|
||||||
<item name="popupMenuBackground">@drawable/popup_background</item>
|
<item name="popupMenuBackground">@drawable/popup_background</item>
|
||||||
|
<item name="windowActionModeOverlay">true</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="MusicProgressSliderParent">
|
<style name="MusicProgressSliderParent">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue