Update for MediaSessionCompat support

Switches the MediaRouter sample to using MediaSessionCompat instead of
RemoteControlClient. This goes along with the update to the support lib
for full MediaSessionCompat support of RCC.

bug:18186638
Change-Id: If8dd25346b850512ea8d248012d8a369a39d301f
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java b/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
index ae018ed..fcab57d 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
@@ -16,7 +16,10 @@
 
 package com.example.android.supportv7.media;
 
+import android.app.PendingIntent;
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.graphics.Bitmap;
 import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.session.MediaSessionCompat;
@@ -43,7 +46,6 @@
 
     protected Callback mCallback;
     protected MediaSessionCompat mMediaSession;
-    protected MediaSessionCallback mSessionCallback;
 
     public abstract boolean isRemotePlayback();
     public abstract boolean isQueuingSupported();
@@ -76,7 +78,7 @@
         mCallback = callback;
     }
 
-    public static Player create(Context context, RouteInfo route) {
+    public static Player create(Context context, RouteInfo route, MediaSessionCompat session) {
         Player player;
         if (route != null && route.supportsControlCategory(
                 MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
@@ -86,7 +88,7 @@
         } else {
             player = new LocalPlayer.OverlayPlayer(context);
         }
-        player.initMediaSession(context);
+        player.initMediaSession(session);
         player.connect(route);
         return player;
     }
@@ -96,6 +98,9 @@
     }
 
     protected void updateMetadata() {
+        if (mMediaSession == null) {
+            return;
+        }
         MediaMetadataCompat.Builder bob = new MediaMetadataCompat.Builder();
         bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, getDescription());
         bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Subtitle of the thing");
@@ -106,6 +111,9 @@
     }
 
     protected void publishState(int state) {
+        if (mMediaSession == null) {
+            return;
+        }
         PlaybackStateCompat.Builder bob = new PlaybackStateCompat.Builder();
         bob.setActions(PLAYBACK_ACTIONS);
         switch (state) {
@@ -130,26 +138,11 @@
         }
     }
 
-    private void initMediaSession(Context context) {
-        mSessionCallback = new MediaSessionCallback();
-        mMediaSession = new MediaSessionCompat(context, "Support7Demos");
-        mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
-                | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
-        mMediaSession.setCallback(mSessionCallback);
+    private void initMediaSession(MediaSessionCompat session) {
+        mMediaSession = session;
         updateMetadata();
     }
 
-    private final class MediaSessionCallback extends MediaSessionCompat.Callback {
-        @Override
-        public void onPlay() {
-            resume();
-        }
-
-        @Override
-        public void onPause() {
-            pause();
-        }
-    }
 
     public interface Callback {
         void onError();
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
index 2e26630..15cf19b 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
@@ -248,7 +248,7 @@
 
         public SampleRouteController(String routeId) {
             mRouteId = routeId;
-            mPlayer = Player.create(getContext(), null);
+            mPlayer = Player.create(getContext(), null, null);
             mSessionManager.setPlayer(mPlayer);
             mSessionManager.setCallback(new SessionManager.Callback() {
                 @Override
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
index 164831f..694d69d 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
@@ -35,6 +35,7 @@
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.support.v4.app.FragmentManager;
+import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v7.app.ActionBarActivity;
 import android.support.v7.app.MediaRouteActionProvider;
@@ -132,19 +133,18 @@
         public void onRouteSelected(MediaRouter router, RouteInfo route) {
             Log.d(TAG, "onRouteSelected: route=" + route);
 
-            mPlayer = Player.create(SampleMediaRouterActivity.this, route);
+            mPlayer = Player.create(SampleMediaRouterActivity.this, route, mMediaSession);
             mPlayer.updatePresentation();
             mSessionManager.setPlayer(mPlayer);
             mSessionManager.unsuspend();
 
-            registerRCC();
             updateUi();
         }
 
         @Override
         public void onRouteUnselected(MediaRouter router, RouteInfo route) {
             Log.d(TAG, "onRouteUnselected: route=" + route);
-            unregisterRCC();
+            mMediaSession.setActive(false);
 
             PlaylistItem item = getCheckedPlaylistItem();
             if (item != null) {
@@ -184,7 +184,7 @@
         }
     };
 
-    private RemoteControlClient mRemoteControlClient;
+    private MediaSessionCompat mMediaSession;
     private ComponentName mEventReceiver;
     private AudioManager mAudioManager;
     private PendingIntent mMediaPendingIntent;
@@ -368,12 +368,12 @@
         mMediaPendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0);
 
         // Create and register the remote control client
-        registerRCC();
+        createMediaSession();
+        mMediaRouter.setMediaSessionCompat(mMediaSession);
 
         // Set up playback manager and player
         mPlayer = Player.create(SampleMediaRouterActivity.this,
-                mMediaRouter.getSelectedRoute());
-        mMediaRouter.setMediaSessionCompat(mPlayer.getMediaSession());
+                mMediaRouter.getSelectedRoute(), mMediaSession);
 
         mSessionManager.setPlayer(mPlayer);
         mSessionManager.setCallback(new SessionManager.Callback() {
@@ -390,40 +390,42 @@
         updateUi();
     }
 
-    private void registerRCC() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-            // Create the RCC and register with AudioManager and MediaRouter
-            mAudioManager.requestAudioFocus(mAfChangeListener,
-                    AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
-            mAudioManager.registerMediaButtonEventReceiver(mEventReceiver);
-            mRemoteControlClient = new RemoteControlClient(mMediaPendingIntent);
-            mAudioManager.registerRemoteControlClient(mRemoteControlClient);
-            mMediaRouter.addRemoteControlClient(mRemoteControlClient);
-            SampleMediaButtonReceiver.setActivity(SampleMediaRouterActivity.this);
-            mRemoteControlClient.setTransportControlFlags(
-                    RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE);
-            mRemoteControlClient.setPlaybackState(
-                    RemoteControlClient.PLAYSTATE_PLAYING);
-        }
-    }
+    private void createMediaSession() {
+        // Create the MediaSession
+        mMediaSession = new MediaSessionCompat(this, "SampleMediaRouter", mEventReceiver,
+                mMediaPendingIntent);
+        mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
+                | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
+        mMediaSession.setCallback(new MediaSessionCompat.Callback() {
+            @Override
+            public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
+                if (mediaButtonEvent != null) {
+                    return handleMediaKey(
+                            (KeyEvent) mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
+                }
+                return super.onMediaButtonEvent(mediaButtonEvent);
+            }
 
-    private void unregisterRCC() {
-        // Unregister the RCC with AudioManager and MediaRouter
-        if (mRemoteControlClient != null) {
-            mRemoteControlClient.setTransportControlFlags(0);
-            mAudioManager.abandonAudioFocus(mAfChangeListener);
-            mAudioManager.unregisterMediaButtonEventReceiver(mEventReceiver);
-            mAudioManager.unregisterRemoteControlClient(mRemoteControlClient);
-            mMediaRouter.removeRemoteControlClient(mRemoteControlClient);
-            SampleMediaButtonReceiver.setActivity(null);
-            mRemoteControlClient = null;
-        }
+            @Override
+            public void onPlay() {
+                mSessionManager.resume();
+            }
+
+            @Override
+            public void onPause() {
+                mSessionManager.pause();
+            }
+        });
+
+        SampleMediaButtonReceiver.setActivity(SampleMediaRouterActivity.this);
     }
 
     public boolean handleMediaKey(KeyEvent event) {
-        if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
+        if (event != null && event.getAction() == KeyEvent.ACTION_DOWN
+                && event.getRepeatCount() == 0) {
             switch (event.getKeyCode()) {
                 case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+                case KeyEvent.KEYCODE_HEADSETHOOK:
                 {
                     Log.d(TAG, "Received Play/Pause event from RemoteControlClient");
                     if (mSessionManager.isPaused()) {
@@ -500,11 +502,9 @@
 
     @Override
     public void onDestroy() {
-        // Unregister the remote control client
-        unregisterRCC();
-
         mSessionManager.stop();
         mPlayer.release();
+        mMediaSession.release();
         super.onDestroy();
     }
 
@@ -588,11 +588,6 @@
         // only enable seek bar when duration is known
         PlaylistItem item = getCheckedPlaylistItem();
         mSeekBar.setEnabled(item != null && item.getDuration() > 0);
-        if (mRemoteControlClient != null) {
-            mRemoteControlClient.setPlaybackState(mSessionManager.isPaused() ?
-                    RemoteControlClient.PLAYSTATE_PAUSED :
-                        RemoteControlClient.PLAYSTATE_PLAYING);
-        }
     }
 
     private PlaylistItem getCheckedPlaylistItem() {