155 lines
6.2 KiB
Kotlin
155 lines
6.2 KiB
Kotlin
/*
|
|
* 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.helper.menu
|
|
|
|
import android.content.Intent
|
|
import android.view.MenuItem
|
|
import android.view.View
|
|
import android.widget.PopupMenu
|
|
import androidx.core.os.bundleOf
|
|
import androidx.fragment.app.FragmentActivity
|
|
import androidx.navigation.findNavController
|
|
import code.name.monkey.retromusic.App
|
|
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
|
|
import code.name.monkey.retromusic.EXTRA_ARTIST_ID
|
|
import code.name.monkey.retromusic.R
|
|
import code.name.monkey.retromusic.activities.tageditor.AbsTagEditorActivity
|
|
import code.name.monkey.retromusic.activities.tageditor.SongTagEditorActivity
|
|
import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
|
|
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
|
|
import code.name.monkey.retromusic.dialogs.SongDetailDialog
|
|
import code.name.monkey.retromusic.fragments.LibraryViewModel
|
|
import code.name.monkey.retromusic.fragments.ReloadType
|
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
|
import code.name.monkey.retromusic.interfaces.IPaletteColorHolder
|
|
import code.name.monkey.retromusic.model.Song
|
|
import code.name.monkey.retromusic.providers.BlacklistStore
|
|
import code.name.monkey.retromusic.repository.RealRepository
|
|
import code.name.monkey.retromusic.util.MusicUtil
|
|
import code.name.monkey.retromusic.util.RingtoneManager
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.launch
|
|
import kotlinx.coroutines.withContext
|
|
import org.koin.androidx.viewmodel.ext.android.getViewModel
|
|
import org.koin.core.component.KoinComponent
|
|
import org.koin.core.component.get
|
|
import java.io.File
|
|
|
|
object SongMenuHelper : KoinComponent {
|
|
const val MENU_RES = R.menu.menu_item_song
|
|
|
|
fun handleMenuClick(activity: FragmentActivity, song: Song, menuItemId: Int): Boolean {
|
|
val libraryViewModel = activity.getViewModel() as LibraryViewModel
|
|
when (menuItemId) {
|
|
R.id.action_set_as_ringtone -> {
|
|
if (RingtoneManager.requiresDialog(activity)) {
|
|
RingtoneManager.getDialog(activity)
|
|
} else {
|
|
val ringtoneManager = RingtoneManager(activity)
|
|
ringtoneManager.setRingtone(song)
|
|
}
|
|
return true
|
|
}
|
|
R.id.action_share -> {
|
|
activity.startActivity(
|
|
Intent.createChooser(
|
|
MusicUtil.createShareSongFileIntent(song, activity),
|
|
null
|
|
)
|
|
)
|
|
return true
|
|
}
|
|
R.id.action_delete_from_device -> {
|
|
DeleteSongsDialog.create(song).show(activity.supportFragmentManager, "DELETE_SONGS")
|
|
return true
|
|
}
|
|
R.id.action_add_to_playlist -> {
|
|
CoroutineScope(Dispatchers.IO).launch {
|
|
val playlists = get<RealRepository>().fetchPlaylists()
|
|
withContext(Dispatchers.Main) {
|
|
AddToPlaylistDialog.create(playlists, song)
|
|
.show(activity.supportFragmentManager, "ADD_PLAYLIST")
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
R.id.action_play_next -> {
|
|
MusicPlayerRemote.playNext(song)
|
|
return true
|
|
}
|
|
R.id.action_add_to_current_playing -> {
|
|
MusicPlayerRemote.enqueue(song)
|
|
return true
|
|
}
|
|
R.id.action_tag_editor -> {
|
|
val tagEditorIntent = Intent(activity, SongTagEditorActivity::class.java)
|
|
tagEditorIntent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id)
|
|
if (activity is IPaletteColorHolder)
|
|
tagEditorIntent.putExtra(
|
|
AbsTagEditorActivity.EXTRA_PALETTE,
|
|
(activity as IPaletteColorHolder).paletteColor
|
|
)
|
|
activity.startActivity(tagEditorIntent)
|
|
return true
|
|
}
|
|
R.id.action_details -> {
|
|
SongDetailDialog.create(song).show(activity.supportFragmentManager, "SONG_DETAILS")
|
|
return true
|
|
}
|
|
R.id.action_go_to_album -> {
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
|
R.id.albumDetailsFragment,
|
|
bundleOf(EXTRA_ALBUM_ID to song.albumId)
|
|
)
|
|
return true
|
|
}
|
|
R.id.action_go_to_artist -> {
|
|
activity.findNavController(R.id.fragment_container).navigate(
|
|
R.id.artistDetailsFragment,
|
|
bundleOf(EXTRA_ARTIST_ID to song.artistId)
|
|
)
|
|
return true
|
|
}
|
|
R.id.action_add_to_blacklist -> {
|
|
BlacklistStore.getInstance(App.getContext()).addPath(File(song.data))
|
|
libraryViewModel.forceReload(ReloadType.Songs)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
abstract class OnClickSongMenu(private val activity: FragmentActivity) :
|
|
View.OnClickListener, PopupMenu.OnMenuItemClickListener {
|
|
|
|
open val menuRes: Int
|
|
get() = MENU_RES
|
|
|
|
abstract val song: Song
|
|
|
|
override fun onClick(v: View) {
|
|
val popupMenu = PopupMenu(activity, v)
|
|
popupMenu.inflate(menuRes)
|
|
popupMenu.setOnMenuItemClickListener(this)
|
|
popupMenu.show()
|
|
}
|
|
|
|
override fun onMenuItemClick(item: MenuItem): Boolean {
|
|
return handleMenuClick(activity, song, item.itemId)
|
|
}
|
|
}
|
|
}
|