Browse Source

Fixed audio focus stealing.

housekeeping/remove-warnings
Antoine POPINEAU 4 years ago
parent
commit
5c684b6e67
No known key found for this signature in database
GPG Key ID: A78AC64694F84063
  1. 3
      app/src/main/java/com/github/apognu/otter/playback/MediaControlsManager.kt
  2. 72
      app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt

3
app/src/main/java/com/github/apognu/otter/playback/MediaControlsManager.kt

@ -14,7 +14,6 @@ import com.github.apognu.otter.R @@ -14,7 +14,6 @@ import com.github.apognu.otter.R
import com.github.apognu.otter.activities.MainActivity
import com.github.apognu.otter.utils.AppContext
import com.github.apognu.otter.utils.Track
import com.github.apognu.otter.utils.log
import com.github.apognu.otter.utils.maybeNormalizeUrl
import com.squareup.picasso.Picasso
import kotlinx.coroutines.CoroutineScope
@ -29,8 +28,6 @@ class MediaControlsManager(val context: Service, private val scope: CoroutineSco @@ -29,8 +28,6 @@ class MediaControlsManager(val context: Service, private val scope: CoroutineSco
private var notification: Notification? = null
fun updateNotification(track: Track?, playing: Boolean) {
"updateNotification".log()
if (notification == null && !playing) return
track?.let {

72
app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt

@ -12,6 +12,7 @@ import android.media.MediaMetadata @@ -12,6 +12,7 @@ import android.media.MediaMetadata
import android.os.Build
import android.os.IBinder
import android.support.v4.media.MediaMetadataCompat
import android.view.KeyEvent
import androidx.core.app.NotificationManagerCompat
import androidx.media.session.MediaButtonReceiver
import com.github.apognu.otter.Otter
@ -58,7 +59,15 @@ class PlayerService : Service() { @@ -58,7 +59,15 @@ class PlayerService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
intent?.action?.let {
if (it == Intent.ACTION_MEDIA_BUTTON) {
MediaButtonReceiver.handleIntent(Otter.get().mediaSession.session, intent)
intent.extras?.getParcelable<KeyEvent>(Intent.EXTRA_KEY_EVENT)?.let { key ->
when (key.keyCode) {
KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> {
if (hasAudioFocus(true)) MediaButtonReceiver.handleIntent(Otter.get().mediaSession.session, intent)
Unit
}
else -> MediaButtonReceiver.handleIntent(Otter.get().mediaSession.session, intent)
}
}
}
}
@ -71,6 +80,7 @@ class PlayerService : Service() { @@ -71,6 +80,7 @@ class PlayerService : Service() {
return START_STICKY
}
@SuppressLint("NewApi")
override fun onCreate() {
super.onCreate()
@ -79,7 +89,7 @@ class PlayerService : Service() { @@ -79,7 +89,7 @@ class PlayerService : Service() {
audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Build.VERSION_CODES.O.onApi {
audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run {
setAudioAttributes(AudioAttributes.Builder().run {
setUsage(AudioAttributes.USAGE_MEDIA)
@ -253,7 +263,6 @@ class PlayerService : Service() { @@ -253,7 +263,6 @@ class PlayerService : Service() {
super.onDestroy()
}
@SuppressLint("NewApi")
private fun setPlaybackState(state: Boolean) {
if (!state) {
val (progress, _, _) = getProgress()
@ -265,32 +274,7 @@ class PlayerService : Service() { @@ -265,32 +274,7 @@ class PlayerService : Service() {
player.prepare(queue.datasources)
}
var allowed = !state
if (!allowed) {
Build.VERSION_CODES.O.onApi(
{
audioFocusRequest?.let {
allowed = when (audioManager.requestAudioFocus(it)) {
AudioManager.AUDIOFOCUS_REQUEST_GRANTED -> true
else -> false
}
}
},
{
@Suppress("DEPRECATION")
audioManager.requestAudioFocus(audioFocusChangeListener, AudioAttributes.CONTENT_TYPE_MUSIC, AudioManager.AUDIOFOCUS_GAIN).let {
allowed = when (it) {
AudioManager.AUDIOFOCUS_REQUEST_GRANTED -> true
else -> false
}
}
}
)
}
if (allowed) {
if (hasAudioFocus(state)) {
player.playWhenReady = state
EventBus.send(Event.StateChanged(state))
@ -358,6 +342,36 @@ class PlayerService : Service() { @@ -358,6 +342,36 @@ class PlayerService : Service() {
return mediaMetadataBuilder.build()
}
@SuppressLint("NewApi")
private fun hasAudioFocus(state: Boolean): Boolean {
var allowed = !state
if (!allowed) {
Build.VERSION_CODES.O.onApi(
{
audioFocusRequest?.let {
allowed = when (audioManager.requestAudioFocus(it)) {
AudioManager.AUDIOFOCUS_REQUEST_GRANTED -> true
else -> false
}
}
},
{
@Suppress("DEPRECATION")
audioManager.requestAudioFocus(audioFocusChangeListener, AudioAttributes.CONTENT_TYPE_MUSIC, AudioManager.AUDIOFOCUS_GAIN).let {
allowed = when (it) {
AudioManager.AUDIOFOCUS_REQUEST_GRANTED -> true
else -> false
}
}
}
)
}
return allowed
}
@SuppressLint("NewApi")
inner class PlayerEventListener : Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {

Loading…
Cancel
Save