Removed some uses of GlobalScope
This commit is contained in:
parent
28d83d9437
commit
08df1b2958
8 changed files with 53 additions and 77 deletions
|
@ -35,6 +35,7 @@ import org.koin.core.component.KoinComponent
|
||||||
import org.koin.core.component.inject
|
import org.koin.core.component.inject
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlin.collections.set
|
||||||
|
|
||||||
|
|
||||||
object MusicPlayerRemote : KoinComponent {
|
object MusicPlayerRemote : KoinComponent {
|
||||||
|
|
|
@ -257,16 +257,6 @@ class CoverLrcView @JvmOverloads constructor(
|
||||||
postInvalidate()
|
postInvalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 普通歌词文本字体大小 */
|
|
||||||
fun setNormalTextSize(size: Float) {
|
|
||||||
mNormalTextSize = size
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 当前歌词文本字体大小 */
|
|
||||||
fun setCurrentTextSize(size: Float) {
|
|
||||||
mCurrentTextSize = size
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 设置当前行歌词的字体颜色 */
|
/** 设置当前行歌词的字体颜色 */
|
||||||
fun setCurrentColor(currentColor: Int) {
|
fun setCurrentColor(currentColor: Int) {
|
||||||
mCurrentTextColor = currentColor
|
mCurrentTextColor = currentColor
|
||||||
|
@ -404,28 +394,6 @@ class CoverLrcView @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 加载在线歌词,默认使用 utf-8 编码
|
|
||||||
*
|
|
||||||
* @param lrcUrl 歌词文件的网络地址
|
|
||||||
*/
|
|
||||||
@JvmOverloads
|
|
||||||
fun loadLrcByUrl(lrcUrl: String, charset: String? = "utf-8") {
|
|
||||||
val flag = "url://$lrcUrl"
|
|
||||||
this.flag = flag
|
|
||||||
object : AsyncTask<String?, Int?, String>() {
|
|
||||||
override fun doInBackground(vararg params: String?): String? {
|
|
||||||
return LrcUtils.getContentFromNetwork(params[0], params[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPostExecute(lrcText: String) {
|
|
||||||
if (flag == flag) {
|
|
||||||
loadLrc(lrcText)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.execute(lrcUrl, charset)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 歌词是否有效
|
* 歌词是否有效
|
||||||
*
|
*
|
||||||
|
@ -712,10 +680,6 @@ class CoverLrcView @JvmOverloads constructor(
|
||||||
fun onPlayClick(time: Long): Boolean
|
fun onPlayClick(time: Long): Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
fun interface OnFlingXListener {
|
|
||||||
fun onFlingX(velocityX: Float): Boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val ADJUST_DURATION: Long = 100
|
private const val ADJUST_DURATION: Long = 100
|
||||||
private const val TIMELINE_KEEP_TIME = 4 * DateUtils.SECOND_IN_MILLIS
|
private const val TIMELINE_KEEP_TIME = 4 * DateUtils.SECOND_IN_MILLIS
|
||||||
|
|
|
@ -190,7 +190,7 @@ class MediaSessionCallback(
|
||||||
musicService.updateMediaSessionPlaybackState()
|
musicService.updateMediaSessionPlaybackState()
|
||||||
}
|
}
|
||||||
TOGGLE_FAVORITE -> {
|
TOGGLE_FAVORITE -> {
|
||||||
MusicUtil.toggleFavorite(context, MusicPlayerRemote.currentSong)
|
musicService.toggleFavorite()
|
||||||
musicService.updateMediaSessionPlaybackState()
|
musicService.updateMediaSessionPlaybackState()
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
|
|
@ -72,6 +72,7 @@ import code.name.monkey.retromusic.service.notification.PlayingNotificationClass
|
||||||
import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl24
|
import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl24
|
||||||
import code.name.monkey.retromusic.service.playback.Playback
|
import code.name.monkey.retromusic.service.playback.Playback
|
||||||
import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks
|
import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks
|
||||||
|
import code.name.monkey.retromusic.util.MusicUtil
|
||||||
import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri
|
import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri
|
||||||
import code.name.monkey.retromusic.util.MusicUtil.toggleFavorite
|
import code.name.monkey.retromusic.util.MusicUtil.toggleFavorite
|
||||||
import code.name.monkey.retromusic.util.PackageValidator
|
import code.name.monkey.retromusic.util.PackageValidator
|
||||||
|
@ -202,10 +203,13 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
|
|
||||||
private val updateFavoriteReceiver = object : BroadcastReceiver() {
|
private val updateFavoriteReceiver = object : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() }
|
isCurrentFavorite { isFavorite ->
|
||||||
|
playingNotification?.updateFavorite(isFavorite)
|
||||||
|
startForegroundOrNotify()
|
||||||
appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED)
|
appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private val lockScreenReceiver = object : BroadcastReceiver() {
|
private val lockScreenReceiver = object : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
@ -718,7 +722,7 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
quit()
|
quit()
|
||||||
}
|
}
|
||||||
ACTION_PENDING_QUIT -> pendingQuit = true
|
ACTION_PENDING_QUIT -> pendingQuit = true
|
||||||
TOGGLE_FAVORITE -> toggleFavorite(applicationContext, currentSong)
|
TOGGLE_FAVORITE -> toggleFavorite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -852,6 +856,21 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun toggleFavorite() {
|
||||||
|
serviceScope.launch {
|
||||||
|
toggleFavorite(this@MusicService, currentSong)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isCurrentFavorite(completion: (isFavorite: Boolean) -> Unit) {
|
||||||
|
serviceScope.launch(IO) {
|
||||||
|
val isFavorite = MusicUtil.isFavorite(currentSong)
|
||||||
|
withContext(Main) {
|
||||||
|
completion(isFavorite)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun quit() {
|
fun quit() {
|
||||||
pause()
|
pause()
|
||||||
stopForeground(true)
|
stopForeground(true)
|
||||||
|
@ -1105,7 +1124,8 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
startForegroundOrNotify()
|
startForegroundOrNotify()
|
||||||
}
|
}
|
||||||
FAVORITE_STATE_CHANGED -> {
|
FAVORITE_STATE_CHANGED -> {
|
||||||
playingNotification?.updateFavorite(currentSong) {
|
isCurrentFavorite { isFavorite ->
|
||||||
|
playingNotification?.updateFavorite(isFavorite)
|
||||||
startForegroundOrNotify()
|
startForegroundOrNotify()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1122,7 +1142,11 @@ class MusicService : MediaBrowserServiceCompat(),
|
||||||
}
|
}
|
||||||
META_CHANGED -> {
|
META_CHANGED -> {
|
||||||
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
|
playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() }
|
||||||
playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() }
|
isCurrentFavorite { isFavorite ->
|
||||||
|
playingNotification?.updateFavorite(isFavorite)
|
||||||
|
startForegroundOrNotify()
|
||||||
|
}
|
||||||
|
|
||||||
updateMediaSessionMetaData()
|
updateMediaSessionMetaData()
|
||||||
updateMediaSessionPlaybackState()
|
updateMediaSessionPlaybackState()
|
||||||
savePosition()
|
savePosition()
|
||||||
|
|
|
@ -31,7 +31,7 @@ abstract class PlayingNotification(context: Context) :
|
||||||
|
|
||||||
abstract fun setPlaying(isPlaying: Boolean)
|
abstract fun setPlaying(isPlaying: Boolean)
|
||||||
|
|
||||||
abstract fun updateFavorite(song: Song, onUpdate: () -> Unit)
|
abstract fun updateFavorite(isFavorite: Boolean)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val NOTIFICATION_CONTROLS_SIZE_MULTIPLIER = 1.0f
|
const val NOTIFICATION_CONTROLS_SIZE_MULTIPLIER = 1.0f
|
||||||
|
|
|
@ -47,7 +47,6 @@ import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
||||||
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.color.MediaNotificationProcessor
|
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
|
||||||
import com.bumptech.glide.request.target.CustomTarget
|
import com.bumptech.glide.request.target.CustomTarget
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
|
@ -252,8 +251,7 @@ class PlayingNotificationClassic(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateFavorite(song: Song, onUpdate: () -> Unit) {
|
override fun updateFavorite(isFavorite: Boolean) {}
|
||||||
}
|
|
||||||
|
|
||||||
private fun buildPendingIntent(
|
private fun buildPendingIntent(
|
||||||
context: Context, action: String,
|
context: Context, action: String,
|
||||||
|
|
|
@ -18,7 +18,6 @@ import android.annotation.SuppressLint
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
|
@ -39,19 +38,14 @@ import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE
|
import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE
|
||||||
import code.name.monkey.retromusic.util.MusicUtil
|
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import com.bumptech.glide.request.target.CustomTarget
|
import com.bumptech.glide.request.target.CustomTarget
|
||||||
import com.bumptech.glide.request.transition.Transition
|
import com.bumptech.glide.request.transition.Transition
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.GlobalScope
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.withContext
|
|
||||||
|
|
||||||
@SuppressLint("RestrictedApi")
|
@SuppressLint("RestrictedApi")
|
||||||
class PlayingNotificationImpl24(
|
class PlayingNotificationImpl24(
|
||||||
val context: Context,
|
val context: MusicService,
|
||||||
mediaSessionToken: MediaSessionCompat.Token
|
mediaSessionToken: MediaSessionCompat.Token,
|
||||||
) : PlayingNotification(context) {
|
) : PlayingNotification(context) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -184,14 +178,8 @@ class PlayingNotificationImpl24(
|
||||||
mActions[2] = buildPlayAction(isPlaying)
|
mActions[2] = buildPlayAction(isPlaying)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateFavorite(song: Song, onUpdate: () -> Unit) {
|
override fun updateFavorite(isFavorite: Boolean) {
|
||||||
GlobalScope.launch(Dispatchers.IO) {
|
|
||||||
val isFavorite = MusicUtil.repository.isSongFavorite(song.id)
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
mActions[0] = buildFavoriteAction(isFavorite)
|
mActions[0] = buildFavoriteAction(isFavorite)
|
||||||
onUpdate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun retrievePlaybackAction(action: String): PendingIntent {
|
private fun retrievePlaybackAction(action: String): PendingIntent {
|
||||||
|
@ -208,9 +196,9 @@ class PlayingNotificationImpl24(
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
fun from(
|
fun from(
|
||||||
context: Context,
|
context: MusicService,
|
||||||
notificationManager: NotificationManager,
|
notificationManager: NotificationManager,
|
||||||
mediaSession: MediaSessionCompat
|
mediaSession: MediaSessionCompat,
|
||||||
): PlayingNotification {
|
): PlayingNotification {
|
||||||
if (VersionUtils.hasOreo()) {
|
if (VersionUtils.hasOreo()) {
|
||||||
createNotificationChannel(context, notificationManager)
|
createNotificationChannel(context, notificationManager)
|
||||||
|
|
|
@ -28,8 +28,7 @@ import code.name.monkey.retromusic.repository.Repository
|
||||||
import code.name.monkey.retromusic.repository.SongRepository
|
import code.name.monkey.retromusic.repository.SongRepository
|
||||||
import code.name.monkey.retromusic.service.MusicService
|
import code.name.monkey.retromusic.service.MusicService
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.jaudiotagger.audio.AudioFileIO
|
import org.jaudiotagger.audio.AudioFileIO
|
||||||
import org.jaudiotagger.tag.FieldKey
|
import org.jaudiotagger.tag.FieldKey
|
||||||
|
@ -100,7 +99,7 @@ object MusicUtil : KoinComponent {
|
||||||
|
|
||||||
fun getArtistInfoString(
|
fun getArtistInfoString(
|
||||||
context: Context,
|
context: Context,
|
||||||
artist: Artist
|
artist: Artist,
|
||||||
): String {
|
): String {
|
||||||
val albumCount = artist.albumCount
|
val albumCount = artist.albumCount
|
||||||
val songCount = artist.songCount
|
val songCount = artist.songCount
|
||||||
|
@ -190,7 +189,7 @@ object MusicUtil : KoinComponent {
|
||||||
|
|
||||||
fun getPlaylistInfoString(
|
fun getPlaylistInfoString(
|
||||||
context: Context,
|
context: Context,
|
||||||
songs: List<Song>
|
songs: List<Song>,
|
||||||
): String {
|
): String {
|
||||||
val duration = getTotalDuration(songs)
|
val duration = getTotalDuration(songs)
|
||||||
return buildInfoString(
|
return buildInfoString(
|
||||||
|
@ -201,7 +200,7 @@ object MusicUtil : KoinComponent {
|
||||||
|
|
||||||
fun playlistInfoString(
|
fun playlistInfoString(
|
||||||
context: Context,
|
context: Context,
|
||||||
songs: List<SongEntity>
|
songs: List<SongEntity>,
|
||||||
): String {
|
): String {
|
||||||
return getSongCountString(context, songs.size)
|
return getSongCountString(context, songs.size)
|
||||||
}
|
}
|
||||||
|
@ -299,7 +298,7 @@ object MusicUtil : KoinComponent {
|
||||||
fun insertAlbumArt(
|
fun insertAlbumArt(
|
||||||
context: Context,
|
context: Context,
|
||||||
albumId: Long,
|
albumId: Long,
|
||||||
path: String?
|
path: String?,
|
||||||
) {
|
) {
|
||||||
val contentResolver = context.contentResolver
|
val contentResolver = context.contentResolver
|
||||||
val artworkUri = "content://media/external/audio/albumart".toUri()
|
val artworkUri = "content://media/external/audio/albumart".toUri()
|
||||||
|
@ -334,8 +333,8 @@ object MusicUtil : KoinComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
val repository = get<Repository>()
|
val repository = get<Repository>()
|
||||||
fun toggleFavorite(context: Context, song: Song) {
|
suspend fun toggleFavorite(context: Context, song: Song) {
|
||||||
GlobalScope.launch {
|
withContext(IO) {
|
||||||
val playlist: PlaylistEntity = repository.favoritePlaylist()
|
val playlist: PlaylistEntity = repository.favoritePlaylist()
|
||||||
val songEntity = song.toSongEntity(playlist.playListId)
|
val songEntity = song.toSongEntity(playlist.playListId)
|
||||||
val isFavorite = repository.isFavoriteSong(songEntity).isNotEmpty()
|
val isFavorite = repository.isFavoriteSong(songEntity).isNotEmpty()
|
||||||
|
@ -348,11 +347,13 @@ object MusicUtil : KoinComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun isFavorite(song: Song) = repository.isSongFavorite(song.id)
|
||||||
|
|
||||||
fun deleteTracks(
|
fun deleteTracks(
|
||||||
activity: FragmentActivity,
|
activity: FragmentActivity,
|
||||||
songs: List<Song>,
|
songs: List<Song>,
|
||||||
safUris: List<Uri>?,
|
safUris: List<Uri>?,
|
||||||
callback: Runnable?
|
callback: Runnable?,
|
||||||
) {
|
) {
|
||||||
val songRepository: SongRepository = get()
|
val songRepository: SongRepository = get()
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue