2020-10-06 08:46:04 +00:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
2019-04-20 05:29:45 +00:00
|
|
|
package code.name.monkey.retromusic.activities.base
|
2018-11-30 01:06:16 +00:00
|
|
|
|
|
|
|
import android.Manifest
|
2021-09-08 18:30:20 +00:00
|
|
|
import android.content.*
|
2019-12-30 11:01:50 +00:00
|
|
|
import android.os.Bundle
|
|
|
|
import android.os.IBinder
|
2020-08-31 12:30:07 +00:00
|
|
|
import androidx.lifecycle.lifecycleScope
|
2018-11-30 01:06:16 +00:00
|
|
|
import code.name.monkey.retromusic.R
|
2020-08-31 12:30:07 +00:00
|
|
|
import code.name.monkey.retromusic.db.toPlayCount
|
2018-11-30 01:06:16 +00:00
|
|
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
2020-09-23 20:55:12 +00:00
|
|
|
import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
|
2020-08-31 12:30:07 +00:00
|
|
|
import code.name.monkey.retromusic.repository.RealRepository
|
2020-02-26 16:49:24 +00:00
|
|
|
import code.name.monkey.retromusic.service.MusicService.*
|
2020-08-31 12:30:07 +00:00
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
import org.koin.android.ext.android.inject
|
2021-09-08 18:30:20 +00:00
|
|
|
import java.lang.ref.WeakReference
|
|
|
|
import java.util.*
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2020-09-23 20:55:12 +00:00
|
|
|
abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventListener {
|
2018-11-30 01:06:16 +00:00
|
|
|
|
2020-09-23 20:55:12 +00:00
|
|
|
private val mMusicServiceEventListeners = ArrayList<IMusicServiceEventListener>()
|
2020-08-31 12:30:07 +00:00
|
|
|
private val repository: RealRepository by inject()
|
2019-12-30 11:01:50 +00:00
|
|
|
private var serviceToken: MusicPlayerRemote.ServiceToken? = null
|
|
|
|
private var musicStateReceiver: MusicStateReceiver? = null
|
|
|
|
private var receiverRegistered: Boolean = false
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
serviceToken = MusicPlayerRemote.bindToService(this, object : ServiceConnection {
|
|
|
|
override fun onServiceConnected(name: ComponentName, service: IBinder) {
|
|
|
|
this@AbsMusicServiceActivity.onServiceConnected()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onServiceDisconnected(name: ComponentName) {
|
|
|
|
this@AbsMusicServiceActivity.onServiceDisconnected()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
setPermissionDeniedMessage(getString(R.string.permission_external_storage_denied))
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
|
|
|
super.onDestroy()
|
|
|
|
MusicPlayerRemote.unbindFromService(serviceToken)
|
|
|
|
if (receiverRegistered) {
|
|
|
|
unregisterReceiver(musicStateReceiver)
|
|
|
|
receiverRegistered = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-23 20:55:12 +00:00
|
|
|
fun addMusicServiceEventListener(listenerI: IMusicServiceEventListener?) {
|
|
|
|
if (listenerI != null) {
|
|
|
|
mMusicServiceEventListeners.add(listenerI)
|
2019-12-30 11:01:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-23 20:55:12 +00:00
|
|
|
fun removeMusicServiceEventListener(listenerI: IMusicServiceEventListener?) {
|
|
|
|
if (listenerI != null) {
|
|
|
|
mMusicServiceEventListeners.remove(listenerI)
|
2019-12-30 11:01:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onServiceConnected() {
|
|
|
|
if (!receiverRegistered) {
|
|
|
|
musicStateReceiver = MusicStateReceiver(this)
|
|
|
|
|
|
|
|
val filter = IntentFilter()
|
|
|
|
filter.addAction(PLAY_STATE_CHANGED)
|
|
|
|
filter.addAction(SHUFFLE_MODE_CHANGED)
|
|
|
|
filter.addAction(REPEAT_MODE_CHANGED)
|
|
|
|
filter.addAction(META_CHANGED)
|
|
|
|
filter.addAction(QUEUE_CHANGED)
|
|
|
|
filter.addAction(MEDIA_STORE_CHANGED)
|
|
|
|
filter.addAction(FAVORITE_STATE_CHANGED)
|
|
|
|
|
|
|
|
registerReceiver(musicStateReceiver, filter)
|
|
|
|
|
|
|
|
receiverRegistered = true
|
|
|
|
}
|
|
|
|
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onServiceConnected()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onServiceDisconnected() {
|
|
|
|
if (receiverRegistered) {
|
|
|
|
unregisterReceiver(musicStateReceiver)
|
|
|
|
receiverRegistered = false
|
|
|
|
}
|
|
|
|
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onServiceDisconnected()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPlayingMetaChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onPlayingMetaChanged()
|
|
|
|
}
|
2020-08-31 12:30:07 +00:00
|
|
|
lifecycleScope.launch(Dispatchers.IO) {
|
|
|
|
val entity = repository.songPresentInHistory(MusicPlayerRemote.currentSong)
|
|
|
|
if (entity != null) {
|
|
|
|
repository.updateHistorySong(MusicPlayerRemote.currentSong)
|
|
|
|
} else {
|
|
|
|
repository.addSongToHistory(MusicPlayerRemote.currentSong)
|
|
|
|
}
|
|
|
|
val songs = repository.checkSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
|
|
|
|
if (songs.isNotEmpty()) {
|
|
|
|
repository.updateSongInPlayCount(songs.first().apply {
|
|
|
|
playCount += 1
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
repository.insertSongInPlayCount(MusicPlayerRemote.currentSong.toPlayCount())
|
|
|
|
}
|
|
|
|
}
|
2019-12-30 11:01:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onQueueChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onQueueChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPlayStateChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onPlayStateChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onMediaStoreChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onMediaStoreChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onRepeatModeChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onRepeatModeChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onShuffleModeChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onShuffleModeChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-08 18:30:20 +00:00
|
|
|
override fun onFavoriteStateChanged() {
|
|
|
|
for (listener in mMusicServiceEventListeners) {
|
|
|
|
listener.onFavoriteStateChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-30 11:01:50 +00:00
|
|
|
override fun onHasPermissionsChanged(hasPermissions: Boolean) {
|
|
|
|
super.onHasPermissionsChanged(hasPermissions)
|
|
|
|
val intent = Intent(MEDIA_STORE_CHANGED)
|
|
|
|
intent.putExtra(
|
|
|
|
"from_permissions_changed",
|
|
|
|
true
|
|
|
|
) // just in case we need to know this at some point
|
|
|
|
sendBroadcast(intent)
|
2020-05-16 19:59:18 +00:00
|
|
|
println("sendBroadcast $hasPermissions")
|
2019-12-30 11:01:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun getPermissionsToRequest(): Array<String> {
|
|
|
|
return arrayOf(
|
|
|
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
2020-02-17 17:40:28 +00:00
|
|
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
|
|
|
Manifest.permission.BLUETOOTH
|
2019-12-30 11:01:50 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
private class MusicStateReceiver(activity: AbsMusicServiceActivity) : BroadcastReceiver() {
|
|
|
|
|
|
|
|
private val reference: WeakReference<AbsMusicServiceActivity> = WeakReference(activity)
|
|
|
|
|
|
|
|
override fun onReceive(context: Context, intent: Intent) {
|
|
|
|
val action = intent.action
|
|
|
|
val activity = reference.get()
|
|
|
|
if (activity != null && action != null) {
|
|
|
|
when (action) {
|
2021-09-08 18:30:20 +00:00
|
|
|
FAVORITE_STATE_CHANGED -> activity.onFavoriteStateChanged()
|
|
|
|
META_CHANGED -> activity.onPlayingMetaChanged()
|
2019-12-30 11:01:50 +00:00
|
|
|
QUEUE_CHANGED -> activity.onQueueChanged()
|
|
|
|
PLAY_STATE_CHANGED -> activity.onPlayStateChanged()
|
|
|
|
REPEAT_MODE_CHANGED -> activity.onRepeatModeChanged()
|
|
|
|
SHUFFLE_MODE_CHANGED -> activity.onShuffleModeChanged()
|
|
|
|
MEDIA_STORE_CHANGED -> activity.onMediaStoreChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
val TAG: String = AbsMusicServiceActivity::class.java.simpleName
|
|
|
|
}
|
2018-11-30 01:06:16 +00:00
|
|
|
}
|