Migrate the rest of AVRCP Controller to use MediaCompat

There are still a few chunks of code in AVRCP Controller that do not use
the MediaCompat library objects. This change gets all AVRCP code to
agree on the compay library, providing a solid base for the cover art
feature.

Bug: b/132812696
Test: Build, Flash, Interopt test with other devices + atest
Change-Id: I62f3acb15ec9ba0ce8c6a6f2fc8a89d193964498
diff --git a/jni/com_android_bluetooth_avrcp_controller.cpp b/jni/com_android_bluetooth_avrcp_controller.cpp
index 050da06..9f47431 100755
--- a/jni/com_android_bluetooth_avrcp_controller.cpp
+++ b/jni/com_android_bluetooth_avrcp_controller.cpp
@@ -805,7 +805,7 @@
 
   method_handleGetFolderItemsRsp =
       env->GetMethodID(clazz, "handleGetFolderItemsRsp",
-                       "([BI[Landroid/media/browse/MediaBrowser$MediaItem;)V");
+                       "([BI[Landroid/support/v4/media/MediaBrowserCompat$MediaItem;)V");
   method_handleGetPlayerItemsRsp = env->GetMethodID(
       clazz, "handleGetPlayerItemsRsp",
       "([B[Lcom/android/bluetooth/avrcpcontroller/AvrcpPlayer;)V");
@@ -813,10 +813,10 @@
   method_createFromNativeMediaItem =
       env->GetMethodID(clazz, "createFromNativeMediaItem",
                        "(JILjava/lang/String;[I[Ljava/lang/String;)Landroid/"
-                       "media/browse/MediaBrowser$MediaItem;");
+                       "support/v4/media/MediaBrowserCompat$MediaItem;");
   method_createFromNativeFolderItem = env->GetMethodID(
       clazz, "createFromNativeFolderItem",
-      "(JILjava/lang/String;I)Landroid/media/browse/MediaBrowser$MediaItem;");
+      "(JILjava/lang/String;I)Landroid/support/v4/media/MediaBrowserCompat$MediaItem;");
   method_createFromNativePlayerItem =
       env->GetMethodID(clazz, "createFromNativePlayerItem",
                        "(ILjava/lang/String;[BII)Lcom/android/bluetooth/"
@@ -841,7 +841,7 @@
   std::unique_lock<std::shared_timed_mutex> lock(sCallbacks_mutex);
 
   jclass tmpMediaItem =
-      env->FindClass("android/media/browse/MediaBrowser$MediaItem");
+      env->FindClass("android/support/v4/media/MediaBrowserCompat$MediaItem");
   class_MediaBrowser_MediaItem = (jclass)env->NewGlobalRef(tmpMediaItem);
 
   jclass tmpBtPlayer =
diff --git a/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java b/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java
index 87291f0..5f601e9 100755
--- a/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java
+++ b/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java
@@ -22,10 +22,10 @@
 import android.bluetooth.BluetoothProfile;
 import android.bluetooth.IBluetoothAvrcpController;
 import android.content.Intent;
-import android.media.MediaDescription;
-import android.media.browse.MediaBrowser.MediaItem;
-import android.media.session.PlaybackState;
 import android.os.Bundle;
+import android.support.v4.media.MediaBrowserCompat.MediaItem;
+import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
 import android.util.Log;
 
 import com.android.bluetooth.Utils;
@@ -392,25 +392,25 @@
         if (DBG) {
             Log.d(TAG, "onPlayStatusChanged " + playStatus);
         }
-        int playbackState = PlaybackState.STATE_NONE;
+        int playbackState = PlaybackStateCompat.STATE_NONE;
         switch (playStatus) {
             case JNI_PLAY_STATUS_STOPPED:
-                playbackState = PlaybackState.STATE_STOPPED;
+                playbackState = PlaybackStateCompat.STATE_STOPPED;
                 break;
             case JNI_PLAY_STATUS_PLAYING:
-                playbackState = PlaybackState.STATE_PLAYING;
+                playbackState = PlaybackStateCompat.STATE_PLAYING;
                 break;
             case JNI_PLAY_STATUS_PAUSED:
-                playbackState = PlaybackState.STATE_PAUSED;
+                playbackState = PlaybackStateCompat.STATE_PAUSED;
                 break;
             case JNI_PLAY_STATUS_FWD_SEEK:
-                playbackState = PlaybackState.STATE_FAST_FORWARDING;
+                playbackState = PlaybackStateCompat.STATE_FAST_FORWARDING;
                 break;
             case JNI_PLAY_STATUS_REV_SEEK:
-                playbackState = PlaybackState.STATE_REWINDING;
+                playbackState = PlaybackStateCompat.STATE_REWINDING;
                 break;
             default:
-                playbackState = PlaybackState.STATE_NONE;
+                playbackState = PlaybackStateCompat.STATE_NONE;
         }
         BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address);
         AvrcpControllerStateMachine stateMachine = getStateMachine(device);
@@ -524,7 +524,7 @@
             Log.d(TAG, "createFromNativeMediaItem uid: " + uid + " type " + type + " name "
                     + name + " attrids " + attrIds + " attrVals " + attrVals);
         }
-        MediaDescription.Builder mdb = new MediaDescription.Builder();
+        MediaDescriptionCompat.Builder mdb = new MediaDescriptionCompat.Builder();
 
         Bundle mdExtra = new Bundle();
         mdExtra.putLong(MEDIA_ITEM_UID_KEY, uid);
@@ -548,7 +548,7 @@
             Log.d(TAG, "createFromNativeFolderItem uid: " + uid + " type " + type + " name "
                     + name + " playable " + playable);
         }
-        MediaDescription.Builder mdb = new MediaDescription.Builder();
+        MediaDescriptionCompat.Builder mdb = new MediaDescriptionCompat.Builder();
 
         Bundle mdExtra = new Bundle();
         mdExtra.putLong(MEDIA_ITEM_UID_KEY, uid);
diff --git a/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java b/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java
index bd948b4..a31ada7 100755
--- a/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java
+++ b/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java
@@ -22,10 +22,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.media.AudioManager;
-import android.media.MediaMetadata;
-import android.media.browse.MediaBrowser.MediaItem;
 import android.os.Bundle;
 import android.os.Message;
+import android.support.v4.media.MediaBrowserCompat.MediaItem;
+import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.media.session.PlaybackStateCompat;
 import android.util.Log;
@@ -397,9 +397,9 @@
                     return true;
 
                 case MESSAGE_PROCESS_TRACK_CHANGED:
-                    mAddressedPlayer.updateCurrentTrack((MediaMetadata) msg.obj);
+                    mAddressedPlayer.updateCurrentTrack((MediaMetadataCompat) msg.obj);
                     if (isActive()) {
-                        BluetoothMediaBrowserService.trackChanged((MediaMetadata) msg.obj);
+                        BluetoothMediaBrowserService.trackChanged((MediaMetadataCompat) msg.obj);
                     }
                     return true;
 
diff --git a/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayer.java b/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayer.java
index 4736acf..7079fe5 100644
--- a/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayer.java
+++ b/src/com/android/bluetooth/avrcpcontroller/AvrcpPlayer.java
@@ -16,8 +16,8 @@
 
 package com.android.bluetooth.avrcpcontroller;
 
-import android.media.MediaMetadata;
 import android.os.SystemClock;
+import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.media.session.PlaybackStateCompat;
 import android.util.Log;
@@ -51,7 +51,7 @@
     private int mPlayerType;
     private byte[] mPlayerFeatures = new byte[16];
     private long mAvailableActions = PlaybackStateCompat.ACTION_PREPARE;
-    private MediaMetadata mCurrentTrack;
+    private MediaMetadataCompat mCurrentTrack;
     private PlaybackStateCompat mPlaybackStateCompat;
     private PlayerApplicationSettings mSupportedPlayerApplicationSettings =
             new PlayerApplicationSettings();
@@ -166,9 +166,9 @@
         return mPlaybackStateCompat;
     }
 
-    public synchronized void updateCurrentTrack(MediaMetadata update) {
+    public synchronized void updateCurrentTrack(MediaMetadataCompat update) {
         if (update != null) {
-            long trackNumber = update.getLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER);
+            long trackNumber = update.getLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER);
             mPlaybackStateCompat = new PlaybackStateCompat.Builder(
                     mPlaybackStateCompat).setActiveQueueItemId(
                     trackNumber - 1).build();
@@ -176,7 +176,7 @@
         mCurrentTrack = update;
     }
 
-    public synchronized MediaMetadata getCurrentTrack() {
+    public synchronized MediaMetadataCompat getCurrentTrack() {
         return mCurrentTrack;
     }
 
diff --git a/src/com/android/bluetooth/avrcpcontroller/BluetoothMediaBrowserService.java b/src/com/android/bluetooth/avrcpcontroller/BluetoothMediaBrowserService.java
index df88b80..1da3883 100644
--- a/src/com/android/bluetooth/avrcpcontroller/BluetoothMediaBrowserService.java
+++ b/src/com/android/bluetooth/avrcpcontroller/BluetoothMediaBrowserService.java
@@ -18,11 +18,8 @@
 
 import android.app.PendingIntent;
 import android.content.Intent;
-import android.media.MediaMetadata;
-import android.media.browse.MediaBrowser.MediaItem;
 import android.os.Bundle;
-import android.support.v4.media.MediaBrowserCompat;
-import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.MediaBrowserCompat.MediaItem;
 import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.session.MediaControllerCompat;
 import android.support.v4.media.session.MediaSessionCompat;
@@ -137,10 +134,9 @@
 
     @Override
     public synchronized void onLoadChildren(final String parentMediaId,
-            final Result<List<MediaBrowserCompat.MediaItem>> result) {
+            final Result<List<MediaItem>> result) {
         if (DBG) Log.d(TAG, "onLoadChildren parentMediaId=" + parentMediaId);
-        List<MediaBrowserCompat.MediaItem> contents =
-                MediaBrowserCompat.MediaItem.fromMediaItemList(getContents(parentMediaId));
+        List<MediaItem> contents = getContents(parentMediaId);
         if (contents == null) {
             result.detach();
         } else {
@@ -161,7 +157,7 @@
         if (songList != null) {
             for (MediaItem song : songList) {
                 mMediaQueue.add(new MediaSessionCompat.QueueItem(
-                        MediaDescriptionCompat.fromMediaDescription(song.getDescription()),
+                        song.getDescription(),
                         mMediaQueue.size()));
             }
         }
@@ -189,10 +185,9 @@
         }
     }
 
-    static synchronized void trackChanged(MediaMetadata mediaMetadata) {
+    static synchronized void trackChanged(MediaMetadataCompat mediaMetadata) {
         if (sBluetoothMediaBrowserService != null) {
-            sBluetoothMediaBrowserService.mSession.setMetadata(
-                    MediaMetadataCompat.fromMediaMetadata(mediaMetadata));
+            sBluetoothMediaBrowserService.mSession.setMetadata(mediaMetadata);
         } else {
             Log.w(TAG, "trackChanged Unavailable");
         }
diff --git a/src/com/android/bluetooth/avrcpcontroller/BrowseTree.java b/src/com/android/bluetooth/avrcpcontroller/BrowseTree.java
index 923282d..d94f6da 100644
--- a/src/com/android/bluetooth/avrcpcontroller/BrowseTree.java
+++ b/src/com/android/bluetooth/avrcpcontroller/BrowseTree.java
@@ -17,10 +17,9 @@
 package com.android.bluetooth.avrcpcontroller;
 
 import android.bluetooth.BluetoothDevice;
-import android.media.MediaDescription;
-import android.media.browse.MediaBrowser;
-import android.media.browse.MediaBrowser.MediaItem;
 import android.os.Bundle;
+import android.support.v4.media.MediaBrowserCompat.MediaItem;
+import android.support.v4.media.MediaDescriptionCompat;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -61,11 +60,11 @@
 
     BrowseTree(BluetoothDevice device) {
         if (device == null) {
-            mRootNode = new BrowseNode(new MediaItem(new MediaDescription.Builder()
+            mRootNode = new BrowseNode(new MediaItem(new MediaDescriptionCompat.Builder()
                     .setMediaId(ROOT).setTitle(ROOT).build(), MediaItem.FLAG_BROWSABLE));
             mRootNode.setCached(true);
         } else {
-            mRootNode = new BrowseNode(new MediaItem(new MediaDescription.Builder()
+            mRootNode = new BrowseNode(new MediaItem(new MediaDescriptionCompat.Builder()
                     .setMediaId(ROOT + device.getAddress().toString()).setTitle(
                             device.getName()).build(), MediaItem.FLAG_BROWSABLE));
             mRootNode.mDevice = device;
@@ -74,11 +73,11 @@
         mRootNode.mBrowseScope = AvrcpControllerService.BROWSE_SCOPE_PLAYER_LIST;
         mRootNode.setExpectedChildren(255);
 
-        mNavigateUpNode = new BrowseNode(new MediaItem(new MediaDescription.Builder()
+        mNavigateUpNode = new BrowseNode(new MediaItem(new MediaDescriptionCompat.Builder()
                 .setMediaId(UP).setTitle(UP).build(),
                 MediaItem.FLAG_BROWSABLE));
 
-        mNowPlayingNode = new BrowseNode(new MediaItem(new MediaDescription.Builder()
+        mNowPlayingNode = new BrowseNode(new MediaItem(new MediaDescriptionCompat.Builder()
                 .setMediaId(NOW_PLAYING_PREFIX)
                 .setTitle(NOW_PLAYING_PREFIX).build(), MediaItem.FLAG_BROWSABLE));
         mNowPlayingNode.mBrowseScope = AvrcpControllerService.BROWSE_SCOPE_NOW_PLAYING;
@@ -139,33 +138,33 @@
             mIsPlayer = true;
 
             // Transform the player into a item.
-            MediaDescription.Builder mdb = new MediaDescription.Builder();
+            MediaDescriptionCompat.Builder mdb = new MediaDescriptionCompat.Builder();
             String playerKey = PLAYER_PREFIX + player.getId();
             mBluetoothId = player.getId();
 
             mdb.setMediaId(UUID.randomUUID().toString());
             mdb.setTitle(player.getName());
             int mediaItemFlags = player.supportsFeature(AvrcpPlayer.FEATURE_BROWSING)
-                    ? MediaBrowser.MediaItem.FLAG_BROWSABLE : 0;
-            mItem = new MediaBrowser.MediaItem(mdb.build(), mediaItemFlags);
+                    ? MediaItem.FLAG_BROWSABLE : 0;
+            mItem = new MediaItem(mdb.build(), mediaItemFlags);
         }
 
         BrowseNode(BluetoothDevice device) {
             boolean mIsPlayer = true;
             mDevice = device;
-            MediaDescription.Builder mdb = new MediaDescription.Builder();
+            MediaDescriptionCompat.Builder mdb = new MediaDescriptionCompat.Builder();
             String playerKey = PLAYER_PREFIX + device.getAddress().toString();
             mdb.setMediaId(playerKey);
             mdb.setTitle(device.getName());
-            int mediaItemFlags = MediaBrowser.MediaItem.FLAG_BROWSABLE;
-            mItem = new MediaBrowser.MediaItem(mdb.build(), mediaItemFlags);
+            int mediaItemFlags = MediaItem.FLAG_BROWSABLE;
+            mItem = new MediaItem(mdb.build(), mediaItemFlags);
         }
 
         private BrowseNode(String name) {
-            MediaDescription.Builder mdb = new MediaDescription.Builder();
+            MediaDescriptionCompat.Builder mdb = new MediaDescriptionCompat.Builder();
             mdb.setMediaId(name);
             mdb.setTitle(name);
-            mItem = new MediaBrowser.MediaItem(mdb.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE);
+            mItem = new MediaItem(mdb.build(), MediaItem.FLAG_BROWSABLE);
         }
 
         synchronized void setExpectedChildren(int count) {
diff --git a/src/com/android/bluetooth/avrcpcontroller/TrackInfo.java b/src/com/android/bluetooth/avrcpcontroller/TrackInfo.java
index fd1b784..9b192ac 100644
--- a/src/com/android/bluetooth/avrcpcontroller/TrackInfo.java
+++ b/src/com/android/bluetooth/avrcpcontroller/TrackInfo.java
@@ -16,7 +16,7 @@
 
 package com.android.bluetooth.avrcpcontroller;
 
-import android.media.MediaMetadata;
+import android.support.v4.media.MediaMetadataCompat;
 
 final class TrackInfo {
     /*
@@ -30,23 +30,23 @@
     private static final int MEDIA_ATTRIBUTE_GENRE = 0x06;
     private static final int MEDIA_ATTRIBUTE_PLAYING_TIME = 0x07;
 
-    static MediaMetadata getMetadata(int[] attrIds, String[] attrMap) {
-        MediaMetadata.Builder metaDataBuilder = new MediaMetadata.Builder();
+    static MediaMetadataCompat getMetadata(int[] attrIds, String[] attrMap) {
+        MediaMetadataCompat.Builder metaDataBuilder = new MediaMetadataCompat.Builder();
         int attributeCount = Math.max(attrIds.length, attrMap.length);
         for (int i = 0; i < attributeCount; i++) {
             switch (attrIds[i]) {
                 case MEDIA_ATTRIBUTE_TITLE:
-                    metaDataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, attrMap[i]);
+                    metaDataBuilder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, attrMap[i]);
                     break;
                 case MEDIA_ATTRIBUTE_ARTIST_NAME:
-                    metaDataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, attrMap[i]);
+                    metaDataBuilder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, attrMap[i]);
                     break;
                 case MEDIA_ATTRIBUTE_ALBUM_NAME:
-                    metaDataBuilder.putString(MediaMetadata.METADATA_KEY_ALBUM, attrMap[i]);
+                    metaDataBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, attrMap[i]);
                     break;
                 case MEDIA_ATTRIBUTE_TRACK_NUMBER:
                     try {
-                        metaDataBuilder.putLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER,
+                        metaDataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER,
                                 Long.valueOf(attrMap[i]));
                     } catch (java.lang.NumberFormatException e) {
                         // If Track Number doesn't parse, leave it unset
@@ -54,18 +54,18 @@
                     break;
                 case MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER:
                     try {
-                        metaDataBuilder.putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS,
+                        metaDataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS,
                                 Long.valueOf(attrMap[i]));
                     } catch (java.lang.NumberFormatException e) {
                         // If Total Track Number doesn't parse, leave it unset
                     }
                     break;
                 case MEDIA_ATTRIBUTE_GENRE:
-                    metaDataBuilder.putString(MediaMetadata.METADATA_KEY_GENRE, attrMap[i]);
+                    metaDataBuilder.putString(MediaMetadataCompat.METADATA_KEY_GENRE, attrMap[i]);
                     break;
                 case MEDIA_ATTRIBUTE_PLAYING_TIME:
                     try {
-                        metaDataBuilder.putLong(MediaMetadata.METADATA_KEY_DURATION,
+                        metaDataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION,
                                 Long.valueOf(attrMap[i]));
                     } catch (java.lang.NumberFormatException e) {
                         // If Playing Time doesn't parse, leave it unset