This commit is contained in:
Muntashir Al-Islam 2020-08-19 13:40:58 +06:00
commit 3c3cbf08a9
226 changed files with 4395 additions and 5422 deletions

View file

@ -30,7 +30,7 @@ object M3UWriter : M3UConstants {
): File? {
if (!dir.exists()) dir.mkdirs()
val file = File(dir, playlist.name + "." + M3UConstants.EXTENSION)
val songs = playlist.getSongs(context)
val songs = playlist.getSongs()
if (songs.size > 0) {
val bw = BufferedWriter(FileWriter(file))
bw.write(M3UConstants.HEADER)

View file

@ -23,23 +23,26 @@ import android.os.Build
import android.os.Environment
import android.os.IBinder
import android.provider.DocumentsContract
import android.provider.MediaStore
import android.widget.Toast
import androidx.core.content.ContextCompat
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.loaders.SongLoader
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.repository.SongRepository
import io.github.muntashirakon.music.service.MusicService
import io.github.muntashirakon.music.util.PreferenceUtil
import org.koin.core.KoinComponent
import org.koin.core.inject
import java.io.File
import java.util.*
object MusicPlayerRemote {
object MusicPlayerRemote : KoinComponent {
val TAG: String = MusicPlayerRemote::class.java.simpleName
private val mConnectionMap = WeakHashMap<Context, ServiceBinder>()
var musicService: MusicService? = null
private val songRepository by inject<SongRepository>()
@JvmStatic
val isPlaying: Boolean
get() = musicService != null && musicService!!.isPlaying
@ -413,24 +416,17 @@ object MusicPlayerRemote {
songId = uri.lastPathSegment
}
if (songId != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
musicService!!,
MediaStore.Audio.AudioColumns._ID + "=?",
arrayOf(songId)
)
)
songs = songRepository.songs(songId)
}
}
}
if (songs == null) {
var songFile: File? = null
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
songFile =
File(
Environment.getExternalStorageDirectory(),
uri.path?.split(":".toRegex(), 2)?.get(1)
)
songFile = File(
Environment.getExternalStorageDirectory(),
uri.path?.split(":".toRegex(), 2)?.get(1)
)
}
if (songFile == null) {
val path = getFilePathFromUri(musicService!!, uri)
@ -441,13 +437,7 @@ object MusicPlayerRemote {
songFile = File(uri.path)
}
if (songFile != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
musicService!!,
MediaStore.Audio.AudioColumns.DATA + "=?",
arrayOf(songFile.absolutePath)
)
)
songs = songRepository.songsByFilePath(songFile.absolutePath)
}
}
if (songs != null && songs.isNotEmpty()) {

View file

@ -18,29 +18,31 @@ import android.app.SearchManager
import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import io.github.muntashirakon.music.loaders.SongLoader
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.repository.RealSongRepository
import org.koin.core.KoinComponent
import org.koin.core.inject
import java.util.*
object SearchQueryHelper {
object SearchQueryHelper : KoinComponent {
private const val TITLE_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.TITLE + ") = ?"
private const val ALBUM_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.ALBUM + ") = ?"
private const val ARTIST_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.ARTIST + ") = ?"
private const val AND = " AND "
private val songRepository by inject<RealSongRepository>()
var songs = ArrayList<Song>()
@JvmStatic
fun getSongs(context: Context, extras: Bundle): ArrayList<Song> {
fun getSongs(context: Context, extras: Bundle): List<Song> {
val query = extras.getString(SearchManager.QUERY, null)
val artistName = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST, null)
val albumName = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM, null)
val titleName = extras.getString(MediaStore.EXTRA_MEDIA_TITLE, null)
var songs = ArrayList<Song>()
var songs = listOf<Song>()
if (artistName != null && albumName != null && titleName != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
ARTIST_SELECTION + AND + ALBUM_SELECTION + AND + TITLE_SELECTION,
arrayOf(
artistName.toLowerCase(),
@ -54,9 +56,8 @@ object SearchQueryHelper {
return songs
}
if (artistName != null && titleName != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
ARTIST_SELECTION + AND + TITLE_SELECTION,
arrayOf(artistName.toLowerCase(), titleName.toLowerCase())
)
@ -66,9 +67,8 @@ object SearchQueryHelper {
return songs
}
if (albumName != null && titleName != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
ALBUM_SELECTION + AND + TITLE_SELECTION,
arrayOf(albumName.toLowerCase(), titleName.toLowerCase())
)
@ -78,9 +78,8 @@ object SearchQueryHelper {
return songs
}
if (artistName != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
ARTIST_SELECTION,
arrayOf(artistName.toLowerCase())
)
@ -90,9 +89,8 @@ object SearchQueryHelper {
return songs
}
if (albumName != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
ALBUM_SELECTION,
arrayOf(albumName.toLowerCase())
)
@ -102,9 +100,8 @@ object SearchQueryHelper {
return songs
}
if (titleName != null) {
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
TITLE_SELECTION,
arrayOf(titleName.toLowerCase())
)
@ -113,21 +110,18 @@ object SearchQueryHelper {
if (songs.isNotEmpty()) {
return songs
}
songs =
SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
ARTIST_SELECTION,
arrayOf(query.toLowerCase())
)
songs = songRepository.songs(
songRepository.makeSongCursor(
ARTIST_SELECTION,
arrayOf(query.toLowerCase())
)
)
if (songs.isNotEmpty()) {
return songs
}
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
ALBUM_SELECTION,
arrayOf(query.toLowerCase())
)
@ -135,9 +129,8 @@ object SearchQueryHelper {
if (songs.isNotEmpty()) {
return songs
}
songs = SongLoader.getSongs(
SongLoader.makeSongCursor(
context,
songs = songRepository.songs(
songRepository.makeSongCursor(
TITLE_SELECTION,
arrayOf(query.toLowerCase())
)

View file

@ -14,43 +14,43 @@
package io.github.muntashirakon.music.helper.menu
import android.app.Activity
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.loaders.GenreLoader
import io.github.muntashirakon.music.model.Genre
import io.github.muntashirakon.music.model.Song
import java.util.*
import io.github.muntashirakon.music.repository.GenreRepository
import org.koin.core.KoinComponent
import org.koin.core.inject
object GenreMenuHelper {
fun handleMenuClick(activity: AppCompatActivity, genre: Genre, item: MenuItem): Boolean {
object GenreMenuHelper : KoinComponent {
private val genreRepository by inject<GenreRepository>()
fun handleMenuClick(activity: FragmentActivity, genre: Genre, item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_play -> {
MusicPlayerRemote.openQueue(getGenreSongs(activity, genre), 0, true)
MusicPlayerRemote.openQueue(getGenreSongs(genre), 0, true)
return true
}
R.id.action_play_next -> {
MusicPlayerRemote.playNext(getGenreSongs(activity, genre))
MusicPlayerRemote.playNext(getGenreSongs(genre))
return true
}
R.id.action_add_to_playlist -> {
AddToPlaylistDialog.create(getGenreSongs(activity, genre))
AddToPlaylistDialog.create(getGenreSongs(genre))
.show(activity.supportFragmentManager, "ADD_PLAYLIST")
return true
}
R.id.action_add_to_current_playing -> {
MusicPlayerRemote.enqueue(getGenreSongs(activity, genre))
MusicPlayerRemote.enqueue(getGenreSongs(genre))
return true
}
}
return false
}
private fun getGenreSongs(activity: Activity, genre: Genre): ArrayList<Song> {
return GenreLoader.getSongs(activity, genre.id)
private fun getGenreSongs(genre: Genre): List<Song> {
return genreRepository.songs(genre.id)
}
}

View file

@ -19,26 +19,24 @@ import android.app.Activity
import android.content.Context
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.App
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog
import io.github.muntashirakon.music.dialogs.DeletePlaylistDialog
import io.github.muntashirakon.music.dialogs.RenamePlaylistDialog
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.loaders.PlaylistSongsLoader
import io.github.muntashirakon.music.misc.WeakContextAsyncTask
import io.github.muntashirakon.music.model.AbsCustomPlaylist
import io.github.muntashirakon.music.model.Playlist
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.PlaylistsUtil
import java.util.*
object PlaylistMenuHelper {
fun handleMenuClick(
activity: AppCompatActivity,
activity: FragmentActivity,
playlist: Playlist, item: MenuItem
): Boolean {
when (item.itemId) {
@ -80,11 +78,11 @@ object PlaylistMenuHelper {
private fun getPlaylistSongs(
activity: Activity,
playlist: Playlist
): ArrayList<Song> {
): List<Song> {
return if (playlist is AbsCustomPlaylist) {
playlist.getSongs(activity)
playlist.songs()
} else {
PlaylistSongsLoader.getPlaylistSongList(activity, playlist)
playlist.getSongs()
}
}

View file

@ -18,8 +18,11 @@ import android.content.Intent
import android.view.MenuItem
import android.view.View
import android.widget.PopupMenu
import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf
import androidx.fragment.app.FragmentActivity
import androidx.navigation.findNavController
import io.github.muntashirakon.music.EXTRA_ALBUM_ID
import io.github.muntashirakon.music.EXTRA_ARTIST_ID
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.activities.tageditor.AbsTagEditorActivity
import io.github.muntashirakon.music.activities.tageditor.SongTagEditorActivity
@ -30,7 +33,6 @@ import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.interfaces.PaletteColorHolder
import io.github.muntashirakon.music.model.Song
import io.github.muntashirakon.music.util.MusicUtil
import io.github.muntashirakon.music.util.NavigationUtil
import io.github.muntashirakon.music.util.RingtoneManager
object SongMenuHelper {
@ -89,18 +91,24 @@ object SongMenuHelper {
return true
}
R.id.action_go_to_album -> {
NavigationUtil.goToAlbum(activity, song.albumId)
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 -> {
NavigationUtil.goToArtist(activity, song.artistId)
activity.findNavController(R.id.fragment_container).navigate(
R.id.artistDetailsFragment,
bundleOf(EXTRA_ARTIST_ID to song.artistId)
)
return true
}
}
return false
}
abstract class OnClickSongMenu protected constructor(private val activity: AppCompatActivity) :
abstract class OnClickSongMenu(private val activity: FragmentActivity) :
View.OnClickListener, PopupMenu.OnMenuItemClickListener {
open val menuRes: Int

View file

@ -15,19 +15,17 @@
package io.github.muntashirakon.music.helper.menu
import androidx.fragment.app.FragmentActivity
import io.github.muntashirakon.music.R
import io.github.muntashirakon.music.dialogs.AddToPlaylistDialog
import io.github.muntashirakon.music.dialogs.DeleteSongsDialog
import io.github.muntashirakon.music.helper.MusicPlayerRemote
import io.github.muntashirakon.music.model.Song
import java.util.*
object SongsMenuHelper {
fun handleMenuClick(
activity: FragmentActivity,
songs: ArrayList<Song>,
songs: List<Song>,
menuItemId: Int
): Boolean {
when (menuItemId) {