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;