mirror of
https://github.com/androidx/media.git
synced 2025-04-29 22:36:54 +08:00
Make setSessionActivity accept null
Issue: androidx/media#2109 PiperOrigin-RevId: 728160580
This commit is contained in:
parent
abe836d9cd
commit
2b8700beaa
@ -19,6 +19,8 @@
|
||||
* Muxers:
|
||||
* IMA extension:
|
||||
* Session:
|
||||
* Make `MediaSession.setSessionActivity(PendingIntent)` accept null
|
||||
([#2109](https://github.com/androidx/media/issues/2109)).
|
||||
* UI:
|
||||
* Downloads:
|
||||
* OkHttp Extension:
|
||||
|
@ -48,7 +48,7 @@ oneway interface IMediaController {
|
||||
int seq, in Bundle sessionCommandsBundle, in Bundle playerCommandsBundle) = 3009;
|
||||
void onRenderedFirstFrame(int seq) = 3010;
|
||||
void onExtrasChanged(int seq, in Bundle extras) = 3011;
|
||||
void onSessionActivityChanged(int seq, in PendingIntent pendingIntent) = 3013;
|
||||
void onSessionActivityChanged(int seq, in @nullable PendingIntent pendingIntent) = 3013;
|
||||
void onError(int seq, in Bundle sessionError) = 3014;
|
||||
void onSetMediaButtonPreferences(int seq, in List<Bundle> commandButtonList) = 3015;
|
||||
// Next Id for MediaController: 3016
|
||||
|
@ -493,7 +493,7 @@ public class MediaController implements Player {
|
||||
*/
|
||||
@UnstableApi
|
||||
default void onSessionActivityChanged(
|
||||
MediaController controller, PendingIntent sessionActivity) {}
|
||||
MediaController controller, @Nullable PendingIntent sessionActivity) {}
|
||||
|
||||
/**
|
||||
* Called when an non-fatal error {@linkplain
|
||||
|
@ -93,6 +93,7 @@ import com.google.common.util.concurrent.MoreExecutors;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CancellationException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
@ -3079,8 +3080,8 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
});
|
||||
}
|
||||
|
||||
public void onSetSessionActivity(int seq, PendingIntent sessionActivity) {
|
||||
if (!isConnected()) {
|
||||
public void onSetSessionActivity(int seq, @Nullable PendingIntent sessionActivity) {
|
||||
if (!isConnected() || Objects.equals(this.sessionActivity, sessionActivity)) {
|
||||
return;
|
||||
}
|
||||
this.sessionActivity = sessionActivity;
|
||||
|
@ -214,10 +214,6 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
@Override
|
||||
public void onSessionActivityChanged(int seq, @Nullable PendingIntent sessionActivity)
|
||||
throws RemoteException {
|
||||
if (sessionActivity == null) {
|
||||
Log.w(TAG, "Ignoring null session activity intent");
|
||||
return;
|
||||
}
|
||||
dispatchControllerTaskOnHandler(
|
||||
controller -> controller.onSetSessionActivity(seq, sessionActivity));
|
||||
}
|
||||
|
@ -789,13 +789,16 @@ public class MediaSession {
|
||||
* Updates the session activity that was set when {@linkplain
|
||||
* Builder#setSessionActivity(PendingIntent) building the session}.
|
||||
*
|
||||
* @param activityPendingIntent The pending intent to start the session activity.
|
||||
* <p>Note: When a controller is connected to the session that has a version smaller than 1.6.0,
|
||||
* then setting the session activity to null has no effect on the controller side.
|
||||
*
|
||||
* @param activityPendingIntent The pending intent to start the session activity or null.
|
||||
* @throws IllegalArgumentException if the {@link PendingIntent} passed into this method is
|
||||
* {@linkplain PendingIntent#getActivity(Context, int, Intent, int) not an activity}.
|
||||
*/
|
||||
@UnstableApi
|
||||
public final void setSessionActivity(PendingIntent activityPendingIntent) {
|
||||
if (Util.SDK_INT >= 31) {
|
||||
public final void setSessionActivity(@Nullable PendingIntent activityPendingIntent) {
|
||||
if (Util.SDK_INT >= 31 && activityPendingIntent != null) {
|
||||
checkArgument(Api31.isActivity(activityPendingIntent));
|
||||
}
|
||||
impl.setSessionActivity(activityPendingIntent);
|
||||
@ -818,8 +821,8 @@ public class MediaSession {
|
||||
*/
|
||||
@UnstableApi
|
||||
public final void setSessionActivity(
|
||||
ControllerInfo controller, PendingIntent activityPendingIntent) {
|
||||
if (Util.SDK_INT >= 31) {
|
||||
ControllerInfo controller, @Nullable PendingIntent activityPendingIntent) {
|
||||
if (Util.SDK_INT >= 31 && activityPendingIntent != null) {
|
||||
checkArgument(Api31.isActivity(activityPendingIntent));
|
||||
}
|
||||
impl.setSessionActivity(controller, activityPendingIntent);
|
||||
@ -2088,7 +2091,7 @@ public class MediaSession {
|
||||
default void setMediaButtonPreferences(int seq, List<CommandButton> mediaButtonPreferences)
|
||||
throws RemoteException {}
|
||||
|
||||
default void onSessionActivityChanged(int seq, PendingIntent sessionActivity)
|
||||
default void onSessionActivityChanged(int seq, @Nullable PendingIntent sessionActivity)
|
||||
throws RemoteException {}
|
||||
|
||||
default void onSessionExtrasChanged(int seq, Bundle sessionExtras) throws RemoteException {}
|
||||
|
@ -95,7 +95,6 @@ import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import org.checkerframework.checker.initialization.qual.Initialized;
|
||||
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
|
||||
/* package */ class MediaSessionImpl {
|
||||
|
||||
@ -136,7 +135,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
|
||||
private PlayerInfo playerInfo;
|
||||
private PlayerWrapper playerWrapper;
|
||||
private @MonotonicNonNull PendingIntent sessionActivity;
|
||||
@Nullable private PendingIntent sessionActivity;
|
||||
@Nullable private PlayerListener playerListener;
|
||||
@Nullable private MediaSession.Listener mediaSessionListener;
|
||||
@Nullable private ControllerInfo controllerForCurrentRequest;
|
||||
@ -850,7 +849,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
}
|
||||
|
||||
@UnstableApi
|
||||
protected void setSessionActivity(PendingIntent sessionActivity) {
|
||||
protected void setSessionActivity(@Nullable PendingIntent sessionActivity) {
|
||||
this.sessionActivity = sessionActivity;
|
||||
ImmutableList<ControllerInfo> connectedControllers =
|
||||
sessionStub.getConnectedControllersManager().getConnectedControllers();
|
||||
@ -860,7 +859,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
}
|
||||
|
||||
@UnstableApi
|
||||
protected void setSessionActivity(ControllerInfo controller, PendingIntent sessionActivity) {
|
||||
protected void setSessionActivity(
|
||||
ControllerInfo controller, @Nullable PendingIntent sessionActivity) {
|
||||
if (controller.getControllerVersion() >= 3
|
||||
&& sessionStub.getConnectedControllersManager().isConnected(controller)) {
|
||||
dispatchRemoteControllerTaskWithoutReturn(
|
||||
|
@ -1137,7 +1137,7 @@ import org.checkerframework.checker.initialization.qual.Initialized;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSessionActivityChanged(int seq, PendingIntent sessionActivity) {
|
||||
public void onSessionActivityChanged(int seq, @Nullable PendingIntent sessionActivity) {
|
||||
sessionCompat.setSessionActivity(sessionActivity);
|
||||
}
|
||||
|
||||
|
@ -2098,9 +2098,10 @@ import java.util.concurrent.ExecutionException;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("nullness:argument") // sessionActivity can be null.
|
||||
@Override
|
||||
public void onSessionActivityChanged(int sequenceNumber, PendingIntent sessionActivity)
|
||||
throws RemoteException {
|
||||
public void onSessionActivityChanged(
|
||||
int sequenceNumber, @Nullable PendingIntent sessionActivity) throws RemoteException {
|
||||
iController.onSessionActivityChanged(sequenceNumber, sessionActivity);
|
||||
}
|
||||
|
||||
|
@ -550,7 +550,7 @@ public class MediaSessionCompat {
|
||||
*
|
||||
* @param pi The intent to launch to show UI for this Session.
|
||||
*/
|
||||
public void setSessionActivity(PendingIntent pi) {
|
||||
public void setSessionActivity(@Nullable PendingIntent pi) {
|
||||
mImpl.setSessionActivity(pi);
|
||||
}
|
||||
|
||||
@ -2219,7 +2219,7 @@ public class MediaSessionCompat {
|
||||
|
||||
void setMetadata(@Nullable MediaMetadataCompat metadata);
|
||||
|
||||
void setSessionActivity(PendingIntent pi);
|
||||
void setSessionActivity(@Nullable PendingIntent pi);
|
||||
|
||||
void setMediaButtonReceiver(@Nullable PendingIntent mbr);
|
||||
|
||||
@ -2700,7 +2700,7 @@ public class MediaSessionCompat {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSessionActivity(PendingIntent pi) {
|
||||
public void setSessionActivity(@Nullable PendingIntent pi) {
|
||||
synchronized (mLock) {
|
||||
mSessionActivity = pi;
|
||||
}
|
||||
@ -4053,7 +4053,7 @@ public class MediaSessionCompat {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSessionActivity(PendingIntent pi) {
|
||||
public void setSessionActivity(@Nullable PendingIntent pi) {
|
||||
mSessionFwk.setSessionActivity(pi);
|
||||
}
|
||||
|
||||
|
@ -1217,6 +1217,7 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
|
||||
assertThat(playbackStateExtrasFromController.get()).string("key-0").isEqualTo("value-0");
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Testing access through deprecated androidx.media library
|
||||
@Test
|
||||
public void setSessionActivity_forAllControllers_changedWhenReceivedWithSetter()
|
||||
throws Exception {
|
||||
@ -1224,12 +1225,17 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
|
||||
PendingIntent sessionActivity =
|
||||
PendingIntent.getActivity(
|
||||
context, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
CountDownLatch playingLatch = new CountDownLatch(1);
|
||||
CountDownLatch bufferingLatch = new CountDownLatch(1);
|
||||
MediaControllerCompat.Callback callback =
|
||||
new MediaControllerCompat.Callback() {
|
||||
@Override
|
||||
public void onPlaybackStateChanged(PlaybackStateCompat state) {
|
||||
latch.countDown();
|
||||
if (state.getState() == PlaybackStateCompat.STATE_BUFFERING) {
|
||||
bufferingLatch.countDown();
|
||||
} else if (state.getState() == PlaybackStateCompat.STATE_PLAYING) {
|
||||
playingLatch.countDown();
|
||||
}
|
||||
}
|
||||
};
|
||||
controllerCompat.registerCallback(callback, handler);
|
||||
@ -1238,12 +1244,25 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
|
||||
session.setSessionActivity(/* controllerKey= */ null, sessionActivity);
|
||||
// The legacy API has no change listener for the session activity. Changing the state to
|
||||
// trigger a callback.
|
||||
session
|
||||
.getMockPlayer()
|
||||
.notifyPlayWhenReadyChanged(
|
||||
true,
|
||||
Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
Player.PLAYBACK_SUPPRESSION_REASON_NONE);
|
||||
session.getMockPlayer().notifyPlaybackStateChanged(STATE_READY);
|
||||
|
||||
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(playingLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controllerCompat.getSessionActivity()).isEqualTo(sessionActivity);
|
||||
|
||||
session.setSessionActivity(/* controllerKey= */ null, null);
|
||||
session.getMockPlayer().notifyPlaybackStateChanged(Player.STATE_BUFFERING);
|
||||
|
||||
assertThat(bufferingLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controllerCompat.getSessionActivity()).isNull();
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // Testing access through deprecated androidx.media library
|
||||
@Test
|
||||
public void setSessionActivity_setToNotificationController_changedWhenReceivedWithSetter()
|
||||
throws Exception {
|
||||
@ -1251,24 +1270,41 @@ public class MediaControllerCompatCallbackWithMediaSessionTest {
|
||||
PendingIntent sessionActivity =
|
||||
PendingIntent.getActivity(
|
||||
context, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
CountDownLatch playingLatch = new CountDownLatch(1);
|
||||
CountDownLatch bufferingLatch = new CountDownLatch(1);
|
||||
MediaControllerCompat.Callback callback =
|
||||
new MediaControllerCompat.Callback() {
|
||||
@Override
|
||||
public void onPlaybackStateChanged(PlaybackStateCompat state) {
|
||||
latch.countDown();
|
||||
if (state.getState() == PlaybackStateCompat.STATE_BUFFERING) {
|
||||
bufferingLatch.countDown();
|
||||
} else if (state.getState() == PlaybackStateCompat.STATE_PLAYING) {
|
||||
playingLatch.countDown();
|
||||
}
|
||||
}
|
||||
};
|
||||
controllerCompat.registerCallback(callback, handler);
|
||||
assertThat(controllerCompat.getSessionActivity()).isNull();
|
||||
|
||||
session.setSessionActivity(NOTIFICATION_CONTROLLER_KEY, sessionActivity);
|
||||
session
|
||||
.getMockPlayer()
|
||||
.notifyPlayWhenReadyChanged(
|
||||
true,
|
||||
Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||
Player.PLAYBACK_SUPPRESSION_REASON_NONE);
|
||||
// The legacy API has no change listener for the session activity. Changing the state to
|
||||
// trigger a callback.
|
||||
session.getMockPlayer().notifyPlaybackStateChanged(STATE_READY);
|
||||
|
||||
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(playingLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controllerCompat.getSessionActivity()).isEqualTo(sessionActivity);
|
||||
|
||||
session.setSessionActivity(NOTIFICATION_CONTROLLER_KEY, null);
|
||||
session.getMockPlayer().notifyPlaybackStateChanged(Player.STATE_BUFFERING);
|
||||
|
||||
assertThat(bufferingLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controllerCompat.getSessionActivity()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -2566,14 +2566,19 @@ public class MediaControllerListenerTest {
|
||||
PendingIntent.getActivity(
|
||||
context, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
CountDownLatch nullLatch = new CountDownLatch(1);
|
||||
List<PendingIntent> receivedSessionActivities = new ArrayList<>();
|
||||
MediaController.Listener listener =
|
||||
new MediaController.Listener() {
|
||||
@Override
|
||||
public void onSessionActivityChanged(
|
||||
MediaController controller, PendingIntent sessionActivity) {
|
||||
receivedSessionActivities.add(sessionActivity);
|
||||
latch.countDown();
|
||||
MediaController controller, @Nullable PendingIntent sessionActivity) {
|
||||
if (sessionActivity == null) {
|
||||
nullLatch.countDown();
|
||||
} else {
|
||||
receivedSessionActivities.add(sessionActivity);
|
||||
latch.countDown();
|
||||
}
|
||||
}
|
||||
};
|
||||
MediaController controller =
|
||||
@ -2586,6 +2591,13 @@ public class MediaControllerListenerTest {
|
||||
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controller.getSessionActivity()).isEqualTo(sessionActivity);
|
||||
assertThat(receivedSessionActivities).containsExactly(sessionActivity);
|
||||
|
||||
remoteSession.setSessionActivity(/* controllerKey= */ null, sessionActivity);
|
||||
remoteSession.setSessionActivity(/* controllerKey= */ null, null);
|
||||
|
||||
assertThat(nullLatch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controller.getSessionActivity()).isNull();
|
||||
assertThat(receivedSessionActivities).containsExactly(sessionActivity);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -2601,7 +2613,7 @@ public class MediaControllerListenerTest {
|
||||
new MediaController.Listener() {
|
||||
@Override
|
||||
public void onSessionActivityChanged(
|
||||
MediaController controller, PendingIntent sessionActivity) {
|
||||
MediaController controller, @Nullable PendingIntent sessionActivity) {
|
||||
receivedSessionActivities1.add(sessionActivity);
|
||||
latch1.countDown();
|
||||
}
|
||||
@ -2610,15 +2622,17 @@ public class MediaControllerListenerTest {
|
||||
connectionHints1.putString(KEY_CONTROLLER, "ctrl-1");
|
||||
MediaController controller1 =
|
||||
controllerTestRule.createController(remoteSession.getToken(), connectionHints1, listener1);
|
||||
List<PendingIntent> receivedSessionActivities2 = new ArrayList<>();
|
||||
AtomicInteger controller2CallbackCount = new AtomicInteger();
|
||||
CountDownLatch latch2 = new CountDownLatch(1);
|
||||
MediaController.Listener listener2 =
|
||||
new MediaController.Listener() {
|
||||
@Override
|
||||
public void onSessionActivityChanged(
|
||||
MediaController controller, PendingIntent sessionActivity) {
|
||||
receivedSessionActivities2.add(sessionActivity);
|
||||
latch2.countDown();
|
||||
MediaController controller, @Nullable PendingIntent sessionActivity) {
|
||||
controller2CallbackCount.incrementAndGet();
|
||||
if (sessionActivity == null) {
|
||||
latch2.countDown();
|
||||
}
|
||||
}
|
||||
};
|
||||
Bundle connectionHints2 = new Bundle();
|
||||
@ -2634,14 +2648,16 @@ public class MediaControllerListenerTest {
|
||||
assertThat(controller1.getSessionActivity()).isEqualTo(sessionActivity);
|
||||
assertThat(controller2.getSessionActivity()).isNull();
|
||||
assertThat(receivedSessionActivities1).containsExactly(sessionActivity);
|
||||
assertThat(receivedSessionActivities2).isEmpty();
|
||||
assertThat(controller2CallbackCount.get()).isEqualTo(0);
|
||||
|
||||
remoteSession.setSessionActivity(/* controllerKey= */ "ctrl-2", sessionActivity);
|
||||
remoteSession.setSessionActivity(/* controllerKey= */ "ctrl-2", null);
|
||||
|
||||
assertThat(latch2.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
|
||||
assertThat(controller2.getSessionActivity()).isEqualTo(sessionActivity);
|
||||
assertThat(controller1.getSessionActivity()).isEqualTo(sessionActivity);
|
||||
assertThat(controller2.getSessionActivity()).isNull();
|
||||
assertThat(receivedSessionActivities1).containsExactly(sessionActivity);
|
||||
assertThat(receivedSessionActivities2).containsExactly(sessionActivity);
|
||||
assertThat(controller2CallbackCount.get()).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -703,7 +703,7 @@ public class MediaSessionProviderService extends Service {
|
||||
|
||||
@Override
|
||||
public void setSessionActivity(
|
||||
String sessionId, @Nullable String controllerKey, PendingIntent sessionActivity)
|
||||
String sessionId, @Nullable String controllerKey, @Nullable PendingIntent sessionActivity)
|
||||
throws RemoteException {
|
||||
MediaSession mediaSession = sessionMap.get(sessionId);
|
||||
if (mediaSession == null) {
|
||||
|
@ -218,7 +218,7 @@ public class RemoteMediaSession {
|
||||
binder.setSessionExtrasForController(sessionId, controllerKey, extras);
|
||||
}
|
||||
|
||||
public void setSessionActivity(String controllerKey, PendingIntent sessionActivity)
|
||||
public void setSessionActivity(String controllerKey, @Nullable PendingIntent sessionActivity)
|
||||
throws RemoteException {
|
||||
binder.setSessionActivity(sessionId, controllerKey, sessionActivity);
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ public class RemoteMediaSessionCompat {
|
||||
binder.setShuffleMode(sessionTag, shuffleMode);
|
||||
}
|
||||
|
||||
public void setSessionActivity(PendingIntent intent) throws RemoteException {
|
||||
public void setSessionActivity(@Nullable PendingIntent intent) throws RemoteException {
|
||||
binder.setSessionActivity(sessionTag, intent);
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,8 @@ public final class TestMediaBrowserListener implements MediaBrowser.Listener {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSessionActivityChanged(MediaController controller, PendingIntent sessionActivity) {
|
||||
public void onSessionActivityChanged(
|
||||
MediaController controller, @Nullable PendingIntent sessionActivity) {
|
||||
delegate.onSessionActivityChanged(controller, sessionActivity);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user