From f5063de70f61e07a24cf05fb33b3a5ddb1e2d4b8 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Wed, 6 Jul 2022 13:08:52 +0530 Subject: [PATCH] Using Android's Action Mode instead of Material Cab --- app/build.gradle | 2 - .../monkey/retromusic/adapter/HomeAdapter.kt | 6 +- .../retromusic/adapter/SongFileAdapter.kt | 6 +- .../retromusic/adapter/album/AlbumAdapter.kt | 3 - .../adapter/album/HorizontalAlbumAdapter.kt | 4 +- .../adapter/artist/ArtistAdapter.kt | 7 +- .../adapter/base/AbsMultiSelectAdapter.kt | 111 +++++++------ .../adapter/playlist/PlaylistAdapter.kt | 3 - .../adapter/song/AbsOffsetSongAdapter.kt | 6 +- .../song/OrderablePlaylistSongAdapter.kt | 4 +- .../adapter/song/PlayingQueueAdapter.kt | 5 +- .../adapter/song/ShuffleButtonSongAdapter.kt | 6 +- .../adapter/song/SimpleSongAdapter.kt | 6 +- .../retromusic/adapter/song/SongAdapter.kt | 7 +- .../fragments/albums/AlbumDetailsFragment.kt | 52 +----- .../fragments/albums/AlbumsFragment.kt | 54 +------ .../artists/AbsArtistDetailsFragment.kt | 62 ++----- .../fragments/artists/ArtistsFragment.kt | 58 +------ .../fragments/base/AbsRecyclerViewFragment.kt | 6 + .../fragments/folder/FoldersFragment.kt | 43 +---- .../fragments/genres/GenreDetailsFragment.kt | 2 +- .../fragments/other/DetailListFragment.kt | 60 +------ .../playlists/PlaylistDetailsFragment.kt | 35 +--- .../fragments/playlists/PlaylistsFragment.kt | 1 - .../fragments/songs/SongsFragment.kt | 57 +------ .../retromusic/interfaces/ICabCallback.kt | 27 ---- .../retromusic/interfaces/ICabHolder.kt | 22 --- .../monkey/retromusic/views/NumberRollView.kt | 151 ++++++++++++++++++ app/src/main/res/drawable/ic_redo.xml | 1 + app/src/main/res/layout/mcab_toolbar.xml | 8 - app/src/main/res/layout/number_roll_view.xml | 26 +++ app/src/main/res/values-night-v27/styles.xml | 1 + app/src/main/res/values-night/styles.xml | 3 +- .../main/res/values-v27/styles_parents.xml | 3 + app/src/main/res/values-v31/styles.xml | 1 + app/src/main/res/values/styles.xml | 6 +- app/src/main/res/values/styles_parents.xml | 5 + 37 files changed, 311 insertions(+), 549 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/views/NumberRollView.kt delete mode 100644 app/src/main/res/layout/mcab_toolbar.xml create mode 100644 app/src/main/res/layout/number_roll_view.xml diff --git a/app/build.gradle b/app/build.gradle index 717f59c11..b4667e4ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -135,8 +135,6 @@ dependencies { implementation "com.afollestad.material-dialogs:input:$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" def kotlin_coroutines_version = '1.6.3' diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt index 8c1758879..e3f809b5f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt @@ -163,7 +163,7 @@ class HomeAdapter(private val activity: AppCompatActivity) : val songAdapter = SongAdapter( activity, home.arrayList as MutableList, - R.layout.item_favourite_card, null + R.layout.item_favourite_card ) layoutManager = linearLayoutManager() adapter = songAdapter @@ -178,10 +178,10 @@ class HomeAdapter(private val activity: AppCompatActivity) : } private fun artistsAdapter(artists: List) = - ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, null, this) + ArtistAdapter(activity, artists, PreferenceUtil.homeArtistGridStyle, this) private fun albumAdapter(albums: List) = - AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, null, this) + AlbumAdapter(activity, albums, PreferenceUtil.homeAlbumGridStyle, this) private fun gridLayoutManager() = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt index b9f8745f0..a391b6a4d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt @@ -29,7 +29,6 @@ import code.name.monkey.retromusic.extensions.getTintedDrawable import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension 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.util.MusicUtil import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -44,10 +43,9 @@ class SongFileAdapter( override val activity: AppCompatActivity, private var dataSet: List, private val itemLayoutRes: Int, - private val iCallbacks: ICallbacks?, - iCabHolder: ICabHolder?, + private val iCallbacks: ICallbacks? ) : AbsMultiSelectAdapter( - activity, iCabHolder, R.menu.menu_media_selection + activity, R.menu.menu_media_selection ), PopupTextProvider { init { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt index 49b00d412..33580acd2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt @@ -30,7 +30,6 @@ import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.helper.SortOrder import code.name.monkey.retromusic.helper.menu.SongsMenuHelper 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.Song import code.name.monkey.retromusic.util.MusicUtil @@ -42,11 +41,9 @@ open class AlbumAdapter( override val activity: FragmentActivity, var dataSet: List, var itemLayoutRes: Int, - iCabHolder: ICabHolder?, val listener: IAlbumClickListener? ) : AbsMultiSelectAdapter( activity, - iCabHolder, R.menu.menu_media_selection ), PopupTextProvider { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt index 1457de7bc..fe360b1dd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt @@ -22,7 +22,6 @@ import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.helper.HorizontalAdapterHelper 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.util.MusicUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor @@ -30,10 +29,9 @@ import code.name.monkey.retromusic.util.color.MediaNotificationProcessor class HorizontalAlbumAdapter( activity: FragmentActivity, dataSet: List, - ICabHolder: ICabHolder?, albumClickListener: IAlbumClickListener ) : AlbumAdapter( - activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, ICabHolder, albumClickListener + activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, albumClickListener ) { override fun createViewHolder(view: View, viewType: Int): ViewHolder { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt index 4976fcb44..30436a97d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt @@ -33,7 +33,6 @@ import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.interfaces.IAlbumArtistClickListener 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.Song import code.name.monkey.retromusic.util.MusicUtil @@ -45,12 +44,10 @@ class ArtistAdapter( override val activity: FragmentActivity, var dataSet: List, var itemLayoutRes: Int, - val ICabHolder: ICabHolder?, val IArtistClickListener: IArtistClickListener, val IAlbumArtistClickListener: IAlbumArtistClickListener? = null -) : AbsMultiSelectAdapter( - activity, ICabHolder, R.menu.menu_media_selection -), PopupTextProvider { +) : AbsMultiSelectAdapter(activity, R.menu.menu_media_selection), + PopupTextProvider { var albumArtistsOnly = false diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt index 675c3cbda..e76aeaa04 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.kt @@ -1,56 +1,61 @@ package code.name.monkey.retromusic.adapter.base -import android.annotation.SuppressLint import android.graphics.Color +import android.view.ActionMode import android.view.Menu import android.view.MenuItem +import android.view.View +import androidx.activity.OnBackPressedCallback import androidx.annotation.MenuRes +import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.extensions.surfaceColor -import code.name.monkey.retromusic.interfaces.ICabCallback -import code.name.monkey.retromusic.interfaces.ICabHolder -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 +import code.name.monkey.retromusic.databinding.NumberRollViewBinding +import code.name.monkey.retromusic.extensions.rootView +import code.name.monkey.retromusic.views.NumberRollView abstract class AbsMultiSelectAdapter( - open val activity: FragmentActivity, private val ICabHolder: ICabHolder?, @MenuRes menuRes: Int -) : RecyclerView.Adapter(), ICabCallback { - private var cab: AttachedCab? = null + open val activity: FragmentActivity, @MenuRes menuRes: Int, +) : RecyclerView.Adapter(), ActionMode.Callback { + var actionMode: ActionMode? = null private val checked: MutableList private var menuRes: Int - override fun onCabCreated(cab: AttachedCab, menu: Menu): Boolean { - activity.window.statusBarColor = - RetroColorUtil.shiftBackgroundColor(activity.surfaceColor()) + + override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { + val inflater = mode?.menuInflater + inflater?.inflate(menuRes, menu) return true } - override fun onCabFinished(cab: AttachedCab): Boolean { - clearChecked() - activity.window.statusBarColor = when { - VersionUtils.hasMarshmallow() -> Color.TRANSPARENT - else -> Color.BLACK - } - return true + override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean { + return false } - override fun onCabItemClicked(item: MenuItem): Boolean { - if (item.itemId == R.id.action_multi_select_adapter_check_all) { + 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)) - cab?.destroy() + onMultipleItemAction(item!!, ArrayList(checked)) + actionMode?.finish() clearChecked() } return true } + override fun onDestroyActionMode(mode: ActionMode?) { + clearChecked() + activity.window.statusBarColor = when { + VersionUtils.hasMarshmallow() -> Color.TRANSPARENT + else -> Color.BLACK + } + actionMode = null + onBackPressedCallback.remove() + } + private fun checkAll() { - if (ICabHolder != null) { + if (actionMode != null) { checked.clear() for (i in 0 until itemCount) { val identifier = getIdentifier(i) @@ -72,7 +77,7 @@ abstract class AbsMultiSelectAdapter( } protected val isInQuickSelectMode: Boolean - get() = cab != null && cab!!.isActive() + get() = actionMode != null protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List) protected fun setMultiSelectMenuRes(@MenuRes menuRes: Int) { @@ -80,16 +85,13 @@ abstract class AbsMultiSelectAdapter( } protected fun toggleChecked(position: Int): Boolean { - if (ICabHolder != null) { - val identifier = getIdentifier(position) ?: return false - if (!checked.remove(identifier)) { - checked.add(identifier) - } - notifyItemChanged(position) - updateCab() - return true + val identifier = getIdentifier(position) ?: return false + if (!checked.remove(identifier)) { + checked.add(identifier) } - return false + notifyItemChanged(position) + updateCab() + return true } private fun clearChecked() { @@ -97,23 +99,21 @@ abstract class AbsMultiSelectAdapter( notifyDataSetChanged() } - @SuppressLint("StringFormatInvalid", "StringFormatMatches") private fun updateCab() { - if (ICabHolder != null) { - if (cab == null || !cab!!.isActive()) { - cab = ICabHolder.openCab(menuRes, this) + if (actionMode == null) { + actionMode = activity.startActionMode(this)?.apply { + customView = NumberRollViewBinding.inflate(activity.layoutInflater).root } - val size = checked.size - when { - size <= 0 -> { - cab?.destroy() - } - size == 1 -> { - cab?.title(literal = getName(checked[0])) - } - else -> { - cab?.title(literal = activity.getString(R.string.x_selected, size)) - } + activity.onBackPressedDispatcher.addCallback(onBackPressedCallback) + } + val size = checked.size + when { + size <= 0 -> { + actionMode?.finish() + } + else -> { + actionMode?.customView?.findViewById(R.id.selection_mode_number) + ?.setNumber(size, true) } } } @@ -122,4 +122,13 @@ abstract class AbsMultiSelectAdapter( checked = ArrayList() this.menuRes = menuRes } + + private val onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (actionMode != null) { + actionMode?.finish() + remove() + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt index 70afd22b1..8a97b2193 100755 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt @@ -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.menu.PlaylistMenuHelper 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.model.Song import code.name.monkey.retromusic.util.MusicUtil @@ -46,11 +45,9 @@ class PlaylistAdapter( override val activity: FragmentActivity, var dataSet: List, private var itemLayoutRes: Int, - ICabHolder: ICabHolder?, private val listener: IPlaylistClickListener ) : AbsMultiSelectAdapter( activity, - ICabHolder, R.menu.menu_playlists_selection ), PopupTextProvider { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt index 03ed72337..2d5fd724f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt @@ -21,15 +21,13 @@ import androidx.annotation.LayoutRes import androidx.fragment.app.FragmentActivity import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song abstract class AbsOffsetSongAdapter( activity: FragmentActivity, dataSet: MutableList, - @LayoutRes itemLayoutRes: Int, - ICabHolder: ICabHolder? -) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) { + @LayoutRes itemLayoutRes: Int +) : SongAdapter(activity, dataSet, itemLayoutRes) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder { if (viewType == OFFSET_ITEM) { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt index 918ceb8de..50b2f8129 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt @@ -28,7 +28,6 @@ import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.accentOutlineColor import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song import com.google.android.material.button.MaterialButton import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter @@ -42,8 +41,7 @@ class OrderablePlaylistSongAdapter( activity: FragmentActivity, dataSet: MutableList, itemLayoutRes: Int, - ICabHolder: ICabHolder?, -) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder), +) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes), DraggableItemAdapter { val libraryViewModel: LibraryViewModel by activity.viewModel() diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt index 3ffad5efd..c3e955936 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt @@ -43,9 +43,8 @@ class PlayingQueueAdapter( dataSet: MutableList, private var current: Int, itemLayoutRes: Int, -) : SongAdapter( - activity, dataSet, itemLayoutRes, null -), DraggableItemAdapter, +) : SongAdapter(activity, dataSet, itemLayoutRes), + DraggableItemAdapter, SwipeableItemAdapter, PopupTextProvider { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt index b8f053ec7..82ba1a7f7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt @@ -21,7 +21,6 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.accentOutlineColor 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.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil @@ -30,9 +29,8 @@ import com.google.android.material.button.MaterialButton class ShuffleButtonSongAdapter( activity: FragmentActivity, dataSet: MutableList, - itemLayoutRes: Int, - ICabHolder: ICabHolder? -) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) { + itemLayoutRes: Int +) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes) { override fun createViewHolder(view: View): SongAdapter.ViewHolder { diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt index e96ab0924..c8de82062 100755 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt @@ -17,16 +17,14 @@ package code.name.monkey.retromusic.adapter.song import android.view.LayoutInflater import android.view.ViewGroup import androidx.fragment.app.FragmentActivity -import code.name.monkey.retromusic.interfaces.ICabHolder import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil class SimpleSongAdapter( context: FragmentActivity, songs: ArrayList, - layoutRes: Int, - ICabHolder: ICabHolder? -) : SongAdapter(context, songs, layoutRes, ICabHolder) { + layoutRes: Int +) : SongAdapter(context, songs, layoutRes) { override fun swapDataSet(dataSet: List) { this.dataSet = dataSet.toMutableList() diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt index 5023f7ba1..889861b0d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt @@ -36,8 +36,6 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SortOrder import code.name.monkey.retromusic.helper.menu.SongMenuHelper 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.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil @@ -53,13 +51,11 @@ open class SongAdapter( override val activity: FragmentActivity, var dataSet: MutableList, protected var itemLayoutRes: Int, - ICabHolder: ICabHolder?, showSectionName: Boolean = true ) : AbsMultiSelectAdapter( activity, - ICabHolder, R.menu.menu_media_selection -), ICabCallback, PopupTextProvider { +), PopupTextProvider { private var showSectionName = true @@ -217,6 +213,7 @@ open class SongAdapter( } override fun onLongClick(v: View?): Boolean { + println("Long click") return toggleChecked(layoutPosition) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt index df5ee9190..b83a3ba7c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt @@ -19,7 +19,6 @@ import android.content.Intent import android.graphics.Color import android.os.Bundle import android.view.* -import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.os.bundleOf 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_Z_A 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.Artist import code.name.monkey.retromusic.network.Result import code.name.monkey.retromusic.network.model.LastFmAlbum import code.name.monkey.retromusic.repository.RealRepository 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.transition.MaterialArcMotion import com.google.android.material.transition.MaterialContainerTransform @@ -80,7 +73,7 @@ import org.koin.core.parameter.parametersOf import java.text.Collator class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details), - IAlbumClickListener, ICabHolder { + IAlbumClickListener { private var _binding: FragmentAlbumDetailsBinding? = null 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 = MaterialShapeDrawable.createWithElevationOverlay(requireContext()) } @@ -189,8 +176,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det simpleSongAdapter = SimpleSongAdapter( requireActivity() as AppCompatActivity, ArrayList(), - R.layout.item_song, - this + R.layout.item_song ) binding.fragmentAlbumContent.recyclerView.apply { 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) val albumAdapter = - HorizontalAlbumAdapter(requireActivity() as AppCompatActivity, albums, this, this) + HorizontalAlbumAdapter(requireActivity() as AppCompatActivity, albums, this) binding.fragmentAlbumContent.moreRecyclerView.layoutManager = GridLayoutManager( requireContext(), 1, @@ -452,38 +438,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det 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() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt index ed00699a5..14d25e848 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt @@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.albums import android.os.Bundle import android.view.* -import androidx.activity.addCallback import androidx.core.os.bundleOf import androidx.navigation.fragment.FragmentNavigatorExtras 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.adapter.album.AlbumAdapter 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.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder 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.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroColorUtil 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(), - IAlbumClickListener, ICabHolder { + IAlbumClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -54,12 +45,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment callback.onCabCreated(cab, menu) } - onSelection { - callback.onCabItemClicked(it) - } - onDestroy { callback.onCabFinished(it) } - } - return cab as AttachedCab + adapter?.actionMode?.finish() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt index d6914c1d3..5e97d3705 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/AbsArtistDetailsFragment.kt @@ -9,7 +9,6 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.activity.addCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.widget.PopupMenu 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.SortOrder 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.network.Result import code.name.monkey.retromusic.network.model.LastFmArtist import code.name.monkey.retromusic.repository.RealRepository 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.transition.MaterialContainerTransform import kotlinx.coroutines.Dispatchers @@ -57,7 +50,7 @@ import org.koin.android.ext.android.get import java.util.* abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_details), - IAlbumClickListener, ICabHolder { + IAlbumClickListener { private var _binding: FragmentArtistDetailsBinding? = null private val binding get() = _binding!! @@ -115,26 +108,19 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm binding.fragmentArtistContent.biographyText.maxLines = 4 } } - - requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { - if (!handleBackPress()) { - remove() - requireActivity().onBackPressed() - } - } setupSongSortButton() binding.appBarLayout?.statusBarForeground = MaterialShapeDrawable.createWithElevationOverlay(requireContext()) } private fun setupRecyclerView() { - albumAdapter = HorizontalAlbumAdapter(requireActivity(), ArrayList(), this, this) + albumAdapter = HorizontalAlbumAdapter(requireActivity(), ArrayList(), this) binding.fragmentArtistContent.albumRecyclerView.apply { itemAnimator = DefaultItemAnimator() layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false) adapter = albumAdapter } - songAdapter = SimpleSongAdapter(requireActivity(), ArrayList(), R.layout.item_song, this) + songAdapter = SimpleSongAdapter(requireActivity(), ArrayList(), R.layout.item_song) binding.fragmentArtistContent.recyclerView.apply { itemAnimator = DefaultItemAnimator() layoutManager = LinearLayoutManager(this.context) @@ -277,8 +263,12 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm R.id.action_set_artist_image -> { val intent = Intent(Intent.ACTION_GET_CONTENT) intent.type = "image/*" - selectImageLauncher.launch(Intent.createChooser(intent, - getString(R.string.pick_from_local_storage))) + selectImageLauncher.launch( + Intent.createChooser( + intent, + getString(R.string.pick_from_local_storage) + ) + ) return true } 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) } - - 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() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt index 1fbb374cc..8e3cff6cc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistsFragment.kt @@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.artists import android.os.Bundle import android.view.* -import androidx.activity.addCallback import androidx.core.os.bundleOf import androidx.navigation.fragment.FragmentNavigatorExtras 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.adapter.artist.ArtistAdapter 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.ReloadType 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.interfaces.IAlbumArtistClickListener 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.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroColorUtil 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(), - IArtistClickListener, IAlbumArtistClickListener, ICabHolder { + IArtistClickListener, IAlbumArtistClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) libraryViewModel.getArtists().observe(viewLifecycleOwner) { @@ -55,12 +46,6 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment callback.onCabCreated(cab, menu) } - onSelection { - callback.onCabItemClicked(it) - } - onDestroy { callback.onCabFinished(it) } - } - return cab as AttachedCab - } - override fun onResume() { super.onResume() libraryViewModel.forceReload(ReloadType.Artists) } - - override fun onPause() { - super.onPause() - if (cab.isActive()) { - cab.destroy() - } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt index eafdfee8f..80089a097 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt @@ -27,6 +27,7 @@ import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.common.ATHToolbarActivity import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper 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.dialogs.CreatePlaylistDialog import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog @@ -225,4 +226,9 @@ abstract class AbsRecyclerViewFragment, LM : Recycle super.onDestroyView() _binding = null } + + override fun onPause() { + super.onPause() + (adapter as? AbsMultiSelectAdapter<*, *>)?.actionMode?.finish() + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt index 3b918cba7..bfe5dcbea 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt @@ -40,12 +40,13 @@ import code.name.monkey.retromusic.adapter.Storage import code.name.monkey.retromusic.adapter.StorageAdapter import code.name.monkey.retromusic.adapter.StorageClickListener 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.helper.MusicPlayerRemote.openQueue 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.IMainActivityFragmentCallbacks 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.util.FileUtil 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.getExternalStorageDirectory import code.name.monkey.retromusic.util.getExternalStoragePublicDirectory import code.name.monkey.retromusic.views.BreadCrumbLayout.Crumb 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.transition.MaterialFadeThrough import kotlinx.coroutines.Dispatchers @@ -76,7 +72,7 @@ import java.lang.ref.WeakReference import java.util.* class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), - IMainActivityFragmentCallbacks, ICabHolder, SelectionCallback, ICallbacks, + IMainActivityFragmentCallbacks, SelectionCallback, ICallbacks, LoaderManager.LoaderCallbacks>, StorageClickListener { private var _binding: FragmentFolderBinding? = null private val binding get() = _binding!! @@ -85,7 +81,6 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), private var adapter: SongFileAdapter? = null private var storageAdapter: StorageAdapter? = null - private var cab: AttachedCab? = null private val fileComparator = Comparator { lhs: File, rhs: File -> if (lhs.isDirectory && !rhs.isDirectory) { return@Comparator -1 @@ -149,16 +144,10 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), override fun onPause() { super.onPause() saveScrollPosition() - if (cab.isActive()) { - cab.destroy() - } + adapter?.actionMode?.finish() } override fun handleBackPress(): Boolean { - if (cab != null && cab!!.isActive()) { - cab?.destroy() - return true - } if (binding.breadCrumbs.popHistory()) { setCrumb(binding.breadCrumbs.lastHistory(), false) return true @@ -388,24 +377,6 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), 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() { if (mainActivity.isBottomNavVisible) { binding.recyclerView.updateLayoutParams { @@ -593,7 +564,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), } private fun switchToFileAdapter() { - adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this, this) + adapter = SongFileAdapter(mainActivity, LinkedList(), R.layout.item_list, this) adapter!!.registerAdapterDataObserver( object : RecyclerView.AdapterDataObserver() { override fun onChanged() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt index 64b4aefa2..65d4e8594 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt @@ -71,7 +71,7 @@ class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_ } private fun setupRecyclerView() { - songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list, null) + songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list) binding.recyclerView.apply { itemAnimator = DefaultItemAnimator() layoutManager = LinearLayoutManager(requireContext()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt index 24d8ef4ad..d3ea66bfd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt @@ -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.databinding.FragmentPlaylistDetailBinding 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.interfaces.IAlbumClickListener 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.Artist -import code.name.monkey.retromusic.util.RetroColorUtil 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.snackbar.Snackbar import com.google.android.material.transition.MaterialSharedAxis class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail), - IArtistClickListener, IAlbumClickListener, ICabHolder { + IArtistClickListener, IAlbumClickListener { private val args by navArgs() private var _binding: FragmentPlaylistDetailBinding? = null private val binding get() = _binding!! @@ -104,12 +96,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de binding.appBarLayout.statusBarForeground = MaterialShapeDrawable.createWithElevationOverlay(requireContext()) - requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { - if (!handleBackPress()) { - remove() - findNavController().navigateUp() - } - } } private fun lastAddedSongs() { @@ -117,7 +103,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de val songAdapter = ShuffleButtonSongAdapter( requireActivity(), mutableListOf(), - R.layout.item_list, this + R.layout.item_list ) binding.recyclerView.apply { adapter = songAdapter @@ -134,7 +120,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de val songAdapter = ShuffleButtonSongAdapter( requireActivity(), mutableListOf(), - R.layout.item_list, this + R.layout.item_list ) binding.recyclerView.apply { adapter = songAdapter @@ -151,7 +137,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de val songAdapter = ShuffleButtonSongAdapter( requireActivity(), mutableListOf(), - R.layout.item_list, this + R.layout.item_list ) binding.recyclerView.apply { adapter = songAdapter @@ -170,7 +156,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de val songAdapter = SongAdapter( requireActivity(), mutableListOf(), - R.layout.item_list, this + R.layout.item_list ) binding.recyclerView.apply { adapter = songAdapter @@ -211,14 +197,14 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de requireActivity(), artists, R.layout.item_grid_circle, - this, this@DetailListFragment + this ) private fun albumAdapter(albums: List): AlbumAdapter = AlbumAdapter( requireActivity(), albums, R.layout.item_grid, - this, this@DetailListFragment + this ) private fun linearLayoutManager(): LinearLayoutManager = @@ -260,38 +246,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de _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) { inflater.inflate(R.menu.menu_clear_history, menu) if (showClearHistoryOption) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index 911d6f8ce..9c12a2fb6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -20,16 +20,9 @@ import code.name.monkey.retromusic.db.toSongs import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment 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.util.MusicUtil -import code.name.monkey.retromusic.util.RetroColorUtil 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.transition.MaterialArcMotion 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 -class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail), - ICabHolder { +class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) { private val arguments by navArgs() private val viewModel by viewModel { parametersOf(arguments.extraPlaylist) @@ -95,8 +87,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli playlist.playlistEntity, requireActivity(), ArrayList(), - R.layout.item_queue, - this + R.layout.item_queue ) val dragDropManager = RecyclerViewDragDropManager() @@ -165,26 +156,4 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli super.onDestroyView() _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 - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt index bf74cee56..74baf03ec 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt @@ -66,7 +66,6 @@ class PlaylistsFragment : requireActivity(), dataSet, itemLayoutRes(), - null, this ) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index e47efaa1d..7e8b8b0ef 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -16,29 +16,19 @@ package code.name.monkey.retromusic.fragments.songs import android.os.Bundle import android.view.* -import androidx.activity.addCallback import androidx.annotation.LayoutRes import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.song.SongAdapter 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.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment 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.RetroColorUtil 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(), - ICabHolder { +class SongsFragment : AbsRecyclerViewCustomGridSizeFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) libraryViewModel.getSongs().observe(viewLifecycleOwner) { @@ -47,12 +37,6 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment callback.onCabCreated(cab, menu) } - onSelection { - callback.onCabItemClicked(it) - } - onDestroy { callback.onCabFinished(it) } - } - return cab as AttachedCab - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt deleted file mode 100644 index 76750ff01..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabCallback.kt +++ /dev/null @@ -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 -} diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt deleted file mode 100644 index e04a4c326..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt +++ /dev/null @@ -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 -} diff --git a/app/src/main/java/code/name/monkey/retromusic/views/NumberRollView.kt b/app/src/main/java/code/name/monkey/retromusic/views/NumberRollView.kt new file mode 100644 index 000000000..ea2d9cbd1 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/views/NumberRollView.kt @@ -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 = + object : Property( + Float::class.java, "" + ) { + override fun set(view: NumberRollView, value: Float) { + view.setNumberRoll(value) + } + + override fun get(view: NumberRollView): Float { + return view.getNumberRoll() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_redo.xml b/app/src/main/res/drawable/ic_redo.xml index 0167f1436..4f852a86f 100644 --- a/app/src/main/res/drawable/ic_redo.xml +++ b/app/src/main/res/drawable/ic_redo.xml @@ -2,6 +2,7 @@ diff --git a/app/src/main/res/layout/mcab_toolbar.xml b/app/src/main/res/layout/mcab_toolbar.xml deleted file mode 100644 index 0ad645b06..000000000 --- a/app/src/main/res/layout/mcab_toolbar.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/number_roll_view.xml b/app/src/main/res/layout/number_roll_view.xml new file mode 100644 index 000000000..6bf6370a1 --- /dev/null +++ b/app/src/main/res/layout/number_roll_view.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night-v27/styles.xml b/app/src/main/res/values-night-v27/styles.xml index 66c2e3508..2b9971e84 100644 --- a/app/src/main/res/values-night-v27/styles.xml +++ b/app/src/main/res/values-night-v27/styles.xml @@ -25,5 +25,6 @@ @style/Widget.MaterialComponents.CardView @color/elevationOverlayDark @drawable/popup_background + true \ No newline at end of file diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index b09adfb63..290fca5b5 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -25,7 +25,6 @@ @color/darkColorSurface @style/Widget.Material3.CardView.Elevated @drawable/popup_background + true - - \ No newline at end of file diff --git a/app/src/main/res/values-v31/styles.xml b/app/src/main/res/values-v31/styles.xml index 0bcec6594..0ebd16650 100644 --- a/app/src/main/res/values-v31/styles.xml +++ b/app/src/main/res/values-v31/styles.xml @@ -9,6 +9,7 @@ @style/MaterialButtonTheme @drawable/popup_background ?attr/colorSurface + true - - - diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index 18bed21e5..1b6add2be 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -1,5 +1,6 @@ +