AVRCP_Browse: Entertain GetFolderItemsVFS without SetBrowse (2/2)

Remove dependency of SetBrowsed Player on GetFolderItemsVFS as some
Remotes not following spec and perform GetFolderItemVFS scope without
doing SetBrowsed Player.

Upon request of GetFolderItemsVFS without SetBrowse Player try reconnect
Browse Service with current package name so that necessary data-structure
gets initialized for FolderVFS items display.

Change-Id: I22682fdcbeda31e5084aa47358f2a17412687855
diff --git a/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java b/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
index 6147857..9f20e51 100644
--- a/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
+++ b/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
@@ -155,6 +155,8 @@
     private boolean updateAbsVolume = false;
     private static final int NO_PLAYER_ID = 0;
 
+    private boolean is_player_updated_for_browse;
+    private String mCachedBrowsePlayer;
     private int mCurrAddrPlayerID;
     private int mCurrBrowsePlayerID;
     private int mLastUsedPlayerID;
@@ -420,6 +422,8 @@
 
     private Avrcp_ext(Context context, A2dpService svc, int maxConnections ) {
         if (DEBUG) Log.v(TAG, "Avrcp");
+        mCachedBrowsePlayer = null;
+        is_player_updated_for_browse = false;
         mAdapter = BluetoothAdapter.getDefaultAdapter();
         mMediaAttributes = new MediaAttributes(null, null);
         mLastQueueId = MediaSession.QueueItem.UNKNOWN_ID;
@@ -3057,6 +3061,36 @@
         }
     }
 
+
+    private void SetBrowsePackage(String PackageName) {
+        String browseService = (PackageName != null)?getBrowseServiceName(PackageName):null;
+        Log.w(TAG, "SetBrowsePackage for pkg " + PackageName + "svc" + browseService);
+        if (browseService != null && !browseService.isEmpty()) {
+            BluetoothDevice active_device = null;
+            for (int i = 0; i < maxAvrcpConnections; i++) {
+                if (deviceFeatures[i].mCurrentDevice != null &&
+                        deviceFeatures[i].isActiveDevice == true) {
+                    Log.w(TAG,"Device " + deviceFeatures[i].mCurrentDevice.getAddress() +" active");
+                    active_device = deviceFeatures[i].mCurrentDevice;
+                }
+            }
+            if (active_device != null) {
+                is_player_updated_for_browse = true;
+                byte[] addr = getByteAddress(active_device);
+                if (mAvrcpBrowseManager.getBrowsedMediaPlayer(addr) != null) {
+                    mCurrentBrowsingDevice = active_device;
+                    Log.w(TAG, "Addr Player update to Browse " + PackageName);
+                    mAvrcpBrowseManager.getBrowsedMediaPlayer(addr).
+                            setCurrentPackage(PackageName, browseService);
+                }
+            } else {
+                Log.w(TAG, "SetBrowsePackage Active device not set yet cache " + PackageName +
+                        "wait for connection");
+                mCachedBrowsePlayer = PackageName;
+            }
+        }
+    }
+
     private void blackListCurrentDevice(int i) {
         String mAddress = null;
         if (deviceFeatures[i].mCurrentDevice == null) {
@@ -3298,6 +3332,8 @@
             mCurrentBrowsingDevice = null;
             changePathDepth = 0;
             changePathFolderType = 0;
+            is_player_updated_for_browse = false;
+            Log.w(TAG,"Reset is_player_updated_for_browse on device disconnection");
         }
         Log.v(TAG,"Exit setAvrcpDisconnectedDevice");
     }
@@ -3549,6 +3585,7 @@
                     if (newControllers.size() > 0 && getAddressedPlayerInfo() == null) {
                         if (DEBUG)
                             Log.v(TAG, "No addressed player but active sessions, taking first.");
+                        Log.w(TAG,"Trigger setAddressedMediaSessionPkg frm onActiveSessionChanged");
                         setAddressedMediaSessionPackage(newControllers.get(0).getPackageName());
                     }
                     updateCurrentMediaState(null);
@@ -3567,13 +3604,16 @@
         }
         // No change.
         if (getPackageName(mCurrAddrPlayerID).equals(packageName)) return;
-        if (DEBUG) Log.v(TAG, "Changing addressed media session to " + packageName);
+        Log.w(TAG, "Changing addressed media session to " + packageName);
         // If the player doesn't exist, we need to add it.
         if (getMediaPlayerInfo(packageName) == null) {
             addMediaPlayerPackage(packageName);
             updateCurrentMediaState(null);
         }
 
+        Log.w(TAG, "Calling SetBrowsePackage for " + packageName);
+        SetBrowsePackage(packageName);
+
         synchronized (this) {
             synchronized (mMediaPlayerInfoList) {
                 for (Map.Entry<Integer, MediaPlayerInfo_ext> entry : mMediaPlayerInfoList.entrySet()) {
@@ -3614,6 +3654,9 @@
         synchronized (Avrcp_ext.this) {
             addMediaPlayerController(activeController);
             setAddressedMediaSessionPackage(activeController.getPackageName());
+            mCachedBrowsePlayer = activeController.getPackageName();
+            Log.w(TAG,"Trigger setAddressedMediaSessionPackage from setActiveMediaSession" +
+                    mCachedBrowsePlayer);
         }
     }
 
@@ -3628,6 +3671,9 @@
 
         addMediaPlayerController(mController);
         setAddressedMediaSessionPackage(mController.getPackageName());
+        mCachedBrowsePlayer = mController.getPackageName();
+        Log.w(TAG,"Trigger setAddressedMediaSessionPkg from setActiveMediaSession" +
+                mCachedBrowsePlayer);
     }
 
     private boolean startBrowseService(byte[] bdaddr, String packageName) {
@@ -4964,6 +5010,12 @@
             return;
         }
         deviceFeatures[deviceIndex].isActiveDevice = true;
+
+        Log.w(TAG, "Active device Calling SetBrowsePackage for " + mCachedBrowsePlayer);
+        if (mCachedBrowsePlayer != null && is_player_updated_for_browse == false) {
+            SetBrowsePackage(mCachedBrowsePlayer);
+        }
+
         if (updateAbsVolume == true && deviceFeatures[deviceIndex].mCurrentDevice.isTwsPlusDevice()) {
             Log.d(TAG,"setting absVolume flag for TWS+ device");
             mAudioManager.avrcpSupportsAbsoluteVolume(device.getAddress(),true);
@@ -5397,6 +5449,8 @@
         long time = System.currentTimeMillis();
         Log.v(TAG, "recordKeyDispatched: " + event + " dispatched to " + packageName);
         setAddressedMediaSessionPackage(packageName);
+        mCachedBrowsePlayer = packageName;
+        Log.w(TAG,"Trigger setAddressedMediaSessionPkg recordKeyDispatch" + mCachedBrowsePlayer);
         synchronized (mPassthroughPending) {
             Iterator<MediaKeyLog> pending = mPassthroughPending.iterator();
             while (pending.hasNext()) {
@@ -5444,6 +5498,9 @@
                     }
                     // We can still get a passthrough which will revive this player.
                     setAddressedMediaSessionPackage(receiver.getPackageName());
+                    mCachedBrowsePlayer = receiver.getPackageName();
+                    Log.w(TAG,"Trigger setAddressedMediaSessionPackage from onAddrPlayerChanged" +
+                            mCachedBrowsePlayer);
                 }
             };