From 98ba9ecd3ef7c313ac261bca8090a56def45c71c Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 1 May 2021 10:42:25 +0200 Subject: [PATCH] Migrate from deprecated registerMediaButtonReceiver to MediaSession equivalent --- .../java/org/moire/ultrasonic/util/Util.java | 21 ++++++++++----- .../ultrasonic/service/MediaPlayerService.kt | 27 ++++++++++++++++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index cf4a13f3..cb2ddd89 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -31,7 +31,6 @@ import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; @@ -53,8 +52,8 @@ import org.moire.ultrasonic.R; import org.moire.ultrasonic.data.ActiveServerProvider; import org.moire.ultrasonic.domain.*; import org.moire.ultrasonic.domain.MusicDirectory.Entry; -import org.moire.ultrasonic.receiver.MediaButtonIntentReceiver; import org.moire.ultrasonic.service.DownloadFile; +import org.moire.ultrasonic.service.MediaPlayerService; import java.io.*; import java.security.MessageDigest; @@ -685,8 +684,13 @@ public class Util if (isService) mediaButtonsRegisteredForService = true; else mediaButtonsRegisteredForUI = true; - AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - audioManager.registerMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName())); + MediaPlayerService.executeOnStartedMediaPlayerService(context, (mediaPlayerService) -> + { + mediaPlayerService.registerMediaButtonEventReceiver(); + return null; + } + ); + } } @@ -698,8 +702,13 @@ public class Util // Do not unregister while there is an active part of the app which needs the control if (mediaButtonsRegisteredForService || mediaButtonsRegisteredForUI) return; - AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - audioManager.unregisterMediaButtonEventReceiver(new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName())); + MediaPlayerService.executeOnStartedMediaPlayerService(context, (mediaPlayerService) -> + { + mediaPlayerService.unregisterMediaButtonEventReceiver(); + return null; + } + ); + Timber.i("MediaButtonEventReceiver unregistered."); } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt index 5d4a9b69..3018a6c1 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt @@ -12,6 +12,7 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.app.Service +import android.content.ComponentName import android.content.Context import android.content.Intent import android.os.Build @@ -22,7 +23,6 @@ import android.support.v4.media.session.PlaybackStateCompat import android.view.KeyEvent import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import java.util.ArrayList import org.koin.android.ext.android.inject import org.moire.ultrasonic.R import org.moire.ultrasonic.activity.NavigationActivity @@ -33,6 +33,7 @@ import org.moire.ultrasonic.provider.UltrasonicAppWidgetProvider4X1 import org.moire.ultrasonic.provider.UltrasonicAppWidgetProvider4X2 import org.moire.ultrasonic.provider.UltrasonicAppWidgetProvider4X3 import org.moire.ultrasonic.provider.UltrasonicAppWidgetProvider4X4 +import org.moire.ultrasonic.receiver.MediaButtonIntentReceiver import org.moire.ultrasonic.service.MusicServiceFactory.getMusicService import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.FileUtil @@ -838,10 +839,31 @@ class MediaPlayerService : Service() { ) } + fun registerMediaButtonEventReceiver() { + val component = ComponentName(packageName, MediaButtonIntentReceiver::class.java.name) + val mediaButtonIntent = Intent(Intent.ACTION_MEDIA_BUTTON) + mediaButtonIntent.component = component + + val pendingIntent = PendingIntent.getBroadcast( + this, + INTENT_CODE_MEDIA_BUTTON, + mediaButtonIntent, + PendingIntent.FLAG_CANCEL_CURRENT + ) + + mediaSession?.setMediaButtonReceiver(pendingIntent) + } + + fun unregisterMediaButtonEventReceiver() { + mediaSession?.setMediaButtonReceiver(null) + } + companion object { private const val NOTIFICATION_CHANNEL_ID = "org.moire.ultrasonic" private const val NOTIFICATION_CHANNEL_NAME = "Ultrasonic background service" private const val NOTIFICATION_ID = 3033 + private const val INTENT_CODE_MEDIA_BUTTON = 161 + private var instance: MediaPlayerService? = null private val instanceLock = Any() @@ -869,9 +891,6 @@ class MediaPlayerService : Service() { synchronized(instanceLock) { return instance } } - - - @JvmStatic fun executeOnStartedMediaPlayerService( context: Context,