From bb7ee69870b37db4cb831e017f508e7aa4ee5a4b Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 16 Feb 2022 20:38:39 +0000 Subject: [PATCH] Use service context in DefaultActionFactory We need to use a Service to create the pending intents in the `DefaultActionFactory`. PiperOrigin-RevId: 429115746 --- .../media3/session/DefaultActionFactory.java | 24 +++++++++---------- .../media3/session/MediaSessionService.java | 2 +- .../session/DefaultActionFactoryTest.java | 18 ++++++++++---- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/libraries/session/src/main/java/androidx/media3/session/DefaultActionFactory.java b/libraries/session/src/main/java/androidx/media3/session/DefaultActionFactory.java index fba9b917a9..fff79f9eeb 100644 --- a/libraries/session/src/main/java/androidx/media3/session/DefaultActionFactory.java +++ b/libraries/session/src/main/java/androidx/media3/session/DefaultActionFactory.java @@ -16,8 +16,8 @@ package androidx.media3.session; import android.app.PendingIntent; +import android.app.Service; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.media.session.PlaybackStateCompat; @@ -39,10 +39,10 @@ import androidx.media3.common.util.Util; public static final String EXTRAS_KEY_ACTION_CUSTOM_EXTRAS = "androidx.media3.session.EXTRAS_KEY_CUSTOM_NOTIFICATION_ACTION_EXTRAS"; - private final Context context; + private final Service service; - public DefaultActionFactory(Context context) { - this.context = context.getApplicationContext(); + public DefaultActionFactory(Service service) { + this.service = service; } @Override @@ -62,13 +62,13 @@ import androidx.media3.common.util.Util; public PendingIntent createMediaActionPendingIntent(@Command long command) { int keyCode = PlaybackStateCompat.toKeyCode(command); Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); - intent.setComponent(new ComponentName(context, context.getClass())); + intent.setComponent(new ComponentName(service, service.getClass())); intent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); if (Util.SDK_INT >= 26 && command != COMMAND_PAUSE && command != COMMAND_STOP) { - return Api26.createPendingIntent(context, /* requestCode= */ keyCode, intent); + return Api26.createPendingIntent(service, /* requestCode= */ keyCode, intent); } else { return PendingIntent.getService( - context, + service, /* requestCode= */ keyCode, intent, Util.SDK_INT >= 23 ? PendingIntent.FLAG_IMMUTABLE : 0); @@ -77,15 +77,15 @@ import androidx.media3.common.util.Util; private PendingIntent createCustomActionPendingIntent(String action, Bundle extras) { Intent intent = new Intent(ACTION_CUSTOM); - intent.setComponent(new ComponentName(context, context.getClass())); + intent.setComponent(new ComponentName(service, service.getClass())); intent.putExtra(EXTRAS_KEY_ACTION_CUSTOM, action); intent.putExtra(EXTRAS_KEY_ACTION_CUSTOM_EXTRAS, extras); if (Util.SDK_INT >= 26) { return Api26.createPendingIntent( - context, /* requestCode= */ KeyEvent.KEYCODE_UNKNOWN, intent); + service, /* requestCode= */ KeyEvent.KEYCODE_UNKNOWN, intent); } else { return PendingIntent.getService( - context, + service, /* requestCode= */ KeyEvent.KEYCODE_UNKNOWN, intent, Util.SDK_INT >= 23 ? PendingIntent.FLAG_IMMUTABLE : 0); @@ -141,9 +141,9 @@ import androidx.media3.common.util.Util; private static final class Api26 { private Api26() {} - public static PendingIntent createPendingIntent(Context context, int keyCode, Intent intent) { + public static PendingIntent createPendingIntent(Service service, int keyCode, Intent intent) { return PendingIntent.getForegroundService( - context, /* requestCode= */ keyCode, intent, PendingIntent.FLAG_IMMUTABLE); + service, /* requestCode= */ keyCode, intent, PendingIntent.FLAG_IMMUTABLE); } } } diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java index cc840c534a..56c3c0e450 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionService.java @@ -396,7 +396,7 @@ public abstract class MediaSessionService extends Service { if (mediaNotificationProvider == null) { mediaNotificationProvider = new DefaultMediaNotificationProvider(getApplicationContext()); } - actionFactory = new DefaultActionFactory(getApplicationContext()); + actionFactory = new DefaultActionFactory(/* service= */ this); mediaNotificationManager = new MediaNotificationManager( /* mediaSessionService= */ this, mediaNotificationProvider, actionFactory); diff --git a/libraries/session/src/test/java/androidx/media3/session/DefaultActionFactoryTest.java b/libraries/session/src/test/java/androidx/media3/session/DefaultActionFactoryTest.java index 9301b618b0..d1af51c288 100644 --- a/libraries/session/src/test/java/androidx/media3/session/DefaultActionFactoryTest.java +++ b/libraries/session/src/test/java/androidx/media3/session/DefaultActionFactoryTest.java @@ -20,10 +20,11 @@ import static org.robolectric.Shadows.shadowOf; import android.app.PendingIntent; import android.content.Intent; -import androidx.test.core.app.ApplicationProvider; +import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.Robolectric; import org.robolectric.shadows.ShadowPendingIntent; /** Tests for {@link DefaultActionFactory}. */ @@ -33,7 +34,7 @@ public class DefaultActionFactoryTest { @Test public void createMediaPendingIntent_intentIsMediaAction() { DefaultActionFactory actionFactory = - new DefaultActionFactory(ApplicationProvider.getApplicationContext()); + new DefaultActionFactory(Robolectric.setupService(TestService.class)); PendingIntent pendingIntent = actionFactory.createMediaActionPendingIntent(MediaNotification.ActionFactory.COMMAND_PLAY); @@ -45,7 +46,7 @@ public class DefaultActionFactoryTest { @Test public void isMediaAction_withNonMediaIntent_returnsFalse() { DefaultActionFactory actionFactory = - new DefaultActionFactory(ApplicationProvider.getApplicationContext()); + new DefaultActionFactory(Robolectric.setupService(TestService.class)); Intent intent = new Intent("invalid_action"); @@ -55,10 +56,19 @@ public class DefaultActionFactoryTest { @Test public void isCustomAction_withNonCustomActionIntent_returnsFalse() { DefaultActionFactory actionFactory = - new DefaultActionFactory(ApplicationProvider.getApplicationContext()); + new DefaultActionFactory(Robolectric.setupService(TestService.class)); Intent intent = new Intent("invalid_action"); assertThat(actionFactory.isCustomAction(intent)).isFalse(); } + + /** A test service for unit tests. */ + public static final class TestService extends MediaLibraryService { + @Nullable + @Override + public MediaLibrarySession onGetSession(MediaSession.ControllerInfo controllerInfo) { + return null; + } + } }