MediaSession2: Stop overriding MediaPlayerBase for session/controller
Implement AutoClosable instead
Test: Run all MediaComponents test once
Change-Id: Ibb1dac06b80230d62e17111bf2da1b2df81a164c
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index 9ab8849..3836e78 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.media.MediaPlayerBase.PlaybackListener;
import android.media.MediaSession2.CommandButton;
import android.media.MediaSession2.CommandGroup;
import android.media.MediaSession2.ControllerInfo;
@@ -61,7 +62,7 @@
*/
// TODO(jaewan): Unhide
// TODO(jaewan): Revisit comments. Currently MediaBrowser case is missing.
-public class MediaController2 extends MediaPlayerBase {
+public class MediaController2 implements AutoCloseable {
/**
* Interface for listening to change in activeness of the {@link MediaSession2}. It's
* active if and only if it has set a player.
@@ -80,8 +81,8 @@
* the session. The controller becomes unavailable afterwards and the callback wouldn't
* be called.
* <p>
- * It will be also called after the {@link #release()}, so you can put clean up code here.
- * You don't need to call {@link #release()} after this.
+ * It will be also called after the {@link #close()}, so you can put clean up code here.
+ * You don't need to call {@link #close()} after this.
*/
public void onDisconnected() { }
@@ -131,8 +132,9 @@
* Release this object, and disconnect from the session. After this, callbacks wouldn't be
* received.
*/
- public void release() {
- mProvider.release_impl();
+ @Override
+ public void close() {
+ mProvider.close_impl();
}
/**
@@ -157,32 +159,27 @@
return mProvider.isConnected_impl();
}
- @Override
public void play() {
mProvider.play_impl();
}
- @Override
public void pause() {
mProvider.pause_impl();
}
- @Override
public void stop() {
mProvider.stop_impl();
}
- @Override
public void skipToPrevious() {
mProvider.skipToPrevious_impl();
}
- @Override
public void skipToNext() {
mProvider.skipToNext_impl();
}
- @Override
+
public @Nullable PlaybackState getPlaybackState() {
return mProvider.getPlaybackState_impl();
}
@@ -198,7 +195,6 @@
// TODO(jaewan): Match with the addSessionAvailabilityListener() that tells the current state
// through the listener.
// TODO(jaewan): Can handler be null? Follow the API guideline after it's finalized.
- @Override
public void addPlaybackListener(@NonNull PlaybackListener listener, @NonNull Handler handler) {
mProvider.addPlaybackListener_impl(listener, handler);
}
@@ -209,7 +205,6 @@
* @param listener the listener to be removed
* @throws IllegalArgumentException if the listener is {@code null}.
*/
- @Override
public void removePlaybackListener(@NonNull PlaybackListener listener) {
mProvider.removePlaybackListener_impl(listener);
}
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 5e7910d..0932fea 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.media.MediaPlayerBase.PlaybackListener;
import android.media.session.MediaSession;
import android.media.session.MediaSession.Callback;
import android.media.session.PlaybackState;
@@ -74,7 +75,7 @@
// TODO(jaewan): Should we make APIs for MediaSessionService2 public? It's helpful for
// developers that doesn't want to override from Browser, but user may not use this
// correctly.
-public class MediaSession2 extends MediaPlayerBase {
+public class MediaSession2 implements AutoCloseable {
private final MediaSession2Provider mProvider;
// Note: Do not define IntDef because subclass can add more command code on top of these.
@@ -341,10 +342,6 @@
if (player == null) {
throw new IllegalArgumentException("player shouldn't be null");
}
- if (player instanceof MediaSession2 || player instanceof MediaController2) {
- throw new IllegalArgumentException("player doesn't accept MediaSession2 nor"
- + " MediaController2");
- }
mContext = context;
mPlayer = player;
// Ensure non-null
@@ -698,14 +695,17 @@
*
* @param player a {@link MediaPlayerBase} that handles actual media playback in your app.
* It shouldn't be {@link MediaSession2} nor {@link MediaController2}.
- * @throws IllegalArgumentException if the player is either {@link MediaSession2}
- * or {@link MediaController2}.
+ * @throws IllegalArgumentException if the player is {@code null}.
*/
- // TODO(jaewan): Add release instead of setPlayer(null).
- public void setPlayer(MediaPlayerBase player) throws IllegalArgumentException {
+ public void setPlayer(@NonNull MediaPlayerBase player) throws IllegalArgumentException {
mProvider.setPlayer_impl(player);
}
+ @Override
+ public void close() {
+ mProvider.close_impl();
+ }
+
/**
* @return player
*/
@@ -749,32 +749,41 @@
mProvider.setCustomLayout_impl(controller, layout);
}
- @Override
+ /**
+ * Play playback
+ */
public void play() {
mProvider.play_impl();
}
- @Override
+ /**
+ * Pause playback
+ */
public void pause() {
mProvider.pause_impl();
}
- @Override
+ /**
+ * Stop playback
+ */
public void stop() {
mProvider.stop_impl();
}
- @Override
+ /**
+ * Rewind playback
+ */
public void skipToPrevious() {
mProvider.skipToPrevious_impl();
}
- @Override
+ /**
+ * Rewind playback
+ */
public void skipToNext() {
mProvider.skipToNext_impl();
}
- @Override
public @NonNull PlaybackState getPlaybackState() {
return mProvider.getPlaybackState_impl();
}
@@ -791,7 +800,6 @@
* @throws IllegalArgumentException when either the listener or handler is {@code null}.
*/
// TODO(jaewan): Can handler be null? Follow API guideline after it's finalized.
- @Override
public void addPlaybackListener(@NonNull PlaybackListener listener, @NonNull Handler handler) {
mProvider.addPlaybackListener_impl(listener, handler);
}
@@ -802,7 +810,6 @@
* @param listener the listener to be removed
* @throws IllegalArgumentException if the listener is {@code null}.
*/
- @Override
public void removePlaybackListener(PlaybackListener listener) {
mProvider.removePlaybackListener_impl(listener);
}
diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java
index b15d6db..9ad5a68 100644
--- a/media/java/android/media/update/MediaController2Provider.java
+++ b/media/java/android/media/update/MediaController2Provider.java
@@ -16,13 +16,20 @@
package android.media.update;
+import android.media.MediaPlayerBase;
import android.media.SessionToken;
+import android.media.session.PlaybackState;
+import android.os.Handler;
/**
* @hide
*/
-public interface MediaController2Provider extends MediaPlayerBaseProvider {
- void release_impl();
+public interface MediaController2Provider extends TransportControlProvider {
+ void close_impl();
SessionToken getSessionToken_impl();
boolean isConnected_impl();
+
+ PlaybackState getPlaybackState_impl();
+ void addPlaybackListener_impl(MediaPlayerBase.PlaybackListener listener, Handler handler);
+ void removePlaybackListener_impl(MediaPlayerBase.PlaybackListener listener);
}
diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java
index 3ec0201..402397e 100644
--- a/media/java/android/media/update/MediaSession2Provider.java
+++ b/media/java/android/media/update/MediaSession2Provider.java
@@ -20,13 +20,16 @@
import android.media.MediaSession2.CommandButton;
import android.media.MediaSession2.ControllerInfo;
import android.media.SessionToken;
+import android.media.session.PlaybackState;
+import android.os.Handler;
import java.util.List;
/**
* @hide
*/
-public interface MediaSession2Provider extends MediaPlayerBaseProvider {
+public interface MediaSession2Provider extends TransportControlProvider {
+ void close_impl();
void setPlayer_impl(MediaPlayerBase player) throws IllegalArgumentException;
MediaPlayerBase getPlayer_impl();
SessionToken getToken_impl();
diff --git a/media/java/android/media/update/MediaPlayerBaseProvider.java b/media/java/android/media/update/TransportControlProvider.java
similarity index 93%
rename from media/java/android/media/update/MediaPlayerBaseProvider.java
rename to media/java/android/media/update/TransportControlProvider.java
index 5b13e74..1b6b201 100644
--- a/media/java/android/media/update/MediaPlayerBaseProvider.java
+++ b/media/java/android/media/update/TransportControlProvider.java
@@ -23,7 +23,8 @@
/**
* @hide
*/
-public interface MediaPlayerBaseProvider {
+// TODO(jaewan): SystemApi
+public interface TransportControlProvider {
void play_impl();
void pause_impl();
void stop_impl();
diff --git a/services/core/java/com/android/server/media/MediaSession2Record.java b/services/core/java/com/android/server/media/MediaSession2Record.java
index b25eaa7..c59c5f6 100644
--- a/services/core/java/com/android/server/media/MediaSession2Record.java
+++ b/services/core/java/com/android/server/media/MediaSession2Record.java
@@ -81,7 +81,7 @@
public void onSessionDestroyed() {
if (mController != null) {
mControllerCallback.destroy();
- mController.release();
+ mController.close();
mController = null;
}
mSessionPid = 0;