Merge 2fa2013f4d1b43c56ea0bcc59814173331c10f42 on remote branch

Change-Id: Ic457fc8536fedf6a6685d0f4de0aca58500cabd0
diff --git a/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java b/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
index df0efe6..7c556bb 100644
--- a/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
+++ b/packages_apps_bluetooth_ext/src/avrcp/Avrcp_ext.java
@@ -199,7 +199,9 @@
 
     private static final ArrayList<String> playerBrowseWhiteListDB =
        new ArrayList<String>(Arrays.asList(
-               "com.google.android.music"
+               "com.google.android.music",
+               "com.nhn.android.music",
+               "com.gaana"
     ));
 
     private static final String nonMediaAppsBlacklistedNames[] = {
@@ -1443,18 +1445,6 @@
                 mA2dpState = msg.arg1;
                 BluetoothDevice playStateChangeDevice = (BluetoothDevice)msg.obj;
                 Log.v(TAG, "event for device address " + playStateChangeDevice.getAddress());
-                deviceIndex = getIndexForDevice(playStateChangeDevice);
-                if (deviceIndex == INVALID_DEVICE_INDEX) {
-                    Log.e(TAG,"Set A2DP state: invalid index for device");
-                    break;
-                }
-                // if BA streaming is ongoing, don't update AVRCP state based on A2DP State.
-                // This is for some remote devices, which send PLAY/PAUSE based on AVRCP State.
-                BATService mBatService = BATService.getBATService();
-                if ((mBatService == null) || !mBatService.isA2dpSuspendFromBA()) {
-                  // if this suspend was triggered by BA, then don't update AVRCP states
-                  updateCurrentMediaState((BluetoothDevice)msg.obj);
-                }
 
                 if (mA2dpState == BluetoothA2dp.STATE_PLAYING) {
                     boolean shoComplete = false;
@@ -1474,6 +1464,20 @@
                         CompleteSHO();
                     }
                 }
+
+                deviceIndex = getIndexForDevice(playStateChangeDevice);
+                if (deviceIndex == INVALID_DEVICE_INDEX) {
+                    Log.e(TAG,"Set A2DP state: invalid index for device");
+                    break;
+                }
+                // if BA streaming is ongoing, don't update AVRCP state based on A2DP State.
+                // This is for some remote devices, which send PLAY/PAUSE based on AVRCP State.
+                BATService mBatService = BATService.getBATService();
+                if ((mBatService == null) || !mBatService.isA2dpSuspendFromBA()) {
+                  // if this suspend was triggered by BA, then don't update AVRCP states
+                  updateCurrentMediaState((BluetoothDevice)msg.obj);
+                }
+
               }
               break;
 
@@ -1709,8 +1713,10 @@
                 if (mFastforward)  mFastforward = false;
                 if (mRewind)  mRewind = false;
 
-                Log.w(TAG, "Active device Calling SetBrowsePackage for " + mCachedBrowsePlayer);
-                if (mCachedBrowsePlayer != null && is_player_updated_for_browse == false) {
+                if (mCurrentBrowsingDevice == null && mCachedBrowsePlayer != null &&
+                        is_player_updated_for_browse == false) {
+                    Log.w(TAG, "Calling SetBrowsePackage as part of device switch for "
+                            + mCachedBrowsePlayer);
                     SetBrowsePackage(mCachedBrowsePlayer);
                 }
 
@@ -2337,6 +2343,7 @@
                         playerBrowseWhiteListDB.contains(currPkg))
                         || (prevPkg != null && !prevPkg.isEmpty() &&
                         playerBrowseWhiteListDB.contains(prevPkg))) {
+                    Log.w(TAG, "Send change response as part of player switch");
                     if (deviceFeatures[index].mAvailablePlayersChangedNT ==
                                 AvrcpConstants_ext.NOTIFICATION_TYPE_INTERIM) {
                         registerNotificationRspAvalPlayerChangedNative(
@@ -2798,23 +2805,6 @@
         return playStatus;
     }
 
-    private boolean isPlayerInBrowseList() {
-        MediaPlayerInfo_ext info = getAddressedPlayerInfo();
-        String pkgName = (info != null) ? info.getPackageName():"";
-        if (pkgName == null || pkgName.isEmpty())
-            return false;
-
-        BrowsedMediaPlayer_ext player =
-                mAvrcpBrowseManager.getBrowsedMediaPlayer(dummyaddr);
-        String browseService = (pkgName != null)?getBrowseServiceName(pkgName):null;
-        if (player == null || browseService == null || browseService.isEmpty())
-            return false;
-
-        boolean isBrowseSupported = player.isPackageInMBSList(pkgName);
-        Log.d(TAG, "Browse supported for pkg " + pkgName + " is " + isBrowseSupported);
-        return isBrowseSupported;
-    }
-
     private boolean isPlayingState(@Nullable PlaybackState state) {
         if (state == null) return false;
         return (state != null) && (state.getState() == PlaybackState.STATE_PLAYING);
@@ -3293,7 +3283,6 @@
 
     private void SetBrowsePackage(String PackageName) {
         String browseService = (PackageName != null)?getBrowseServiceName(PackageName):null;
-        BrowsedMediaPlayer_ext player = mAvrcpBrowseManager.getBrowsedMediaPlayer(dummyaddr);
         Log.w(TAG, "SetBrowsePackage for pkg " + PackageName + "svc" + browseService);
         if (browseService != null && !browseService.isEmpty()) {
             BluetoothDevice browse_active_device = mBrowsingActiveDevice;
@@ -3301,17 +3290,9 @@
                 is_player_updated_for_browse = true;
                 byte[] addr = getByteAddress(browse_active_device);
                 if (mAvrcpBrowseManager.getBrowsedMediaPlayer(addr) != null) {
-                    Log.w(TAG, "Addr Player update to Browse " + PackageName +
-                            " already req MBS list " + mPkgRequestedMBSConnect);
-                    mCurrentBrowsingDevice = browse_active_device;
                     Log.w(TAG, "Addr Player update to Browse " + PackageName);
                     mAvrcpBrowseManager.getBrowsedMediaPlayer(addr).
                             setCurrentPackage(PackageName, browseService);
-                    if (player != null && !mPkgRequestedMBSConnect.contains(PackageName)) {
-                        Log.w(TAG,"checkMBSConnection try connect");
-                        player.CheckMBSConnection(PackageName, browseService);
-                        mPkgRequestedMBSConnect.add(PackageName);
-                    }
                 }
             } else {
                 Log.w(TAG, "SetBrowsePackage Active device not set yet cache " + PackageName +
@@ -3789,10 +3770,12 @@
 
         Log.d(TAG, "Enter setBrowsedPlayer");
         String address = Utils.getAddressStringFromByte(bdaddr);
+        BluetoothDevice prevBrowseDevice = mCurrentBrowsingDevice;
         mCurrentBrowsingDevice = mAdapter.getRemoteDevice(address);
         // checking for error cases
         BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(bdaddr);
         if (mBrowsingActiveDevice != null && !Objects.equals(mBrowsingActiveDevice, device)) {
+            mCurrentBrowsingDevice = prevBrowseDevice;
             status = AvrcpConstants_ext.RSP_INTERNAL_ERR;
             Log.w(TAG, "setBrowsedPlayer: Cmd from browse inactive device reject it");
         } else if (mMediaPlayerInfoList.isEmpty()) {
@@ -3887,8 +3870,10 @@
             updateCurrentMediaState(null);
         }
 
-        Log.w(TAG, "Calling SetBrowsePackage for " + packageName);
-        SetBrowsePackage(packageName);
+        if (mCurrentBrowsingDevice == null) {
+            Log.w(TAG, "Calling SetBrowsePackage as part of player switch for " + packageName);
+            SetBrowsePackage(packageName);
+        }
 
         synchronized (this) {
             synchronized (mMediaPlayerInfoList) {
@@ -3991,9 +3976,7 @@
         synchronized (this) {
             synchronized (mBrowsePlayerInfoList) {
                 mBrowsePlayerInfoList.clear();
-                BrowsedMediaPlayer_ext player =
-                        mAvrcpBrowseManager.getBrowsedMediaPlayer(dummyaddr);
-                Log.d(TAG, "buildBrowsablePlayerList " + player);
+                Log.d(TAG, "buildBrowsablePlayerList ");
                 Intent intent = new Intent(android.service.media.MediaBrowserService.SERVICE_INTERFACE);
                 List<ResolveInfo> playerList =
                         mPackageManager.queryIntentServices(intent, PackageManager.MATCH_ALL);
@@ -4007,9 +3990,6 @@
                     String serviceName = info.serviceInfo.name;
                     String packageName = info.serviceInfo.packageName;
                     Log.d(TAG, "svc " + serviceName + " and pkg = " + packageName);
-                    if ((player != null) && (serviceName != null)) {
-                        player.CheckMBSConnection(packageName, serviceName);
-                    }
                     BrowsePlayerInfo_ext currentPlayer =
                             new BrowsePlayerInfo_ext(packageName, displayableName, serviceName);
                     mBrowsePlayerInfoList.add(currentPlayer);
@@ -4741,6 +4721,11 @@
         if (br_connected == true) {
             mBrowsingActiveDevice = device;
             Log.w(TAG, "onConnectionStateChanged Set Active browse device" + mBrowsingActiveDevice);
+            if (mCurrentBrowsingDevice == null && mCachedBrowsePlayer != null &&
+                    is_player_updated_for_browse == false) {
+                Log.w(TAG, "Calling SetBrowsePackage as part of connect for "+ mCachedBrowsePlayer);
+                SetBrowsePackage(mCachedBrowsePlayer);
+            }
             return;
         }
         int newState = (rc_connected ? BluetoothProfile.STATE_CONNECTED :
diff --git a/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java b/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java
index d0827bb..6974369 100644
--- a/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java
+++ b/packages_apps_bluetooth_ext/src/avrcp/BrowsedMediaPlayer_ext.java
@@ -462,6 +462,8 @@
             mPackageName = packageName;
             mClassName = cls;
 
+            mCurrentBrowsePackage = packageName;
+            mCurrentBrowseClass = cls;
            /* cleanup variables from previous browsed calls */
            mFolderItems = null;
            mMediaId = null;
diff --git a/system_bt_ext/conf/interop_database.conf b/system_bt_ext/conf/interop_database.conf
index 057a547..9a0e3b1 100644
--- a/system_bt_ext/conf/interop_database.conf
+++ b/system_bt_ext/conf/interop_database.conf
@@ -518,3 +518,6 @@
 #Requires custom HID report command to change mode.
 [INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL]
 98:B6:E9 = Address_Based
+
+#Disable LPA enhanced power control feature
+[INTEROP_DISABLE_LPA_ENHANCED_POWER_CONTROL]
diff --git a/system_bt_ext/device/src/interop.cc b/system_bt_ext/device/src/interop.cc
index 22cdab3..76dd441 100644
--- a/system_bt_ext/device/src/interop.cc
+++ b/system_bt_ext/device/src/interop.cc
@@ -251,11 +251,12 @@
     CASE_RETURN_STR(INTEROP_DISABLE_CONNECTION_AFTER_COLLISION)
     CASE_RETURN_STR(INTEROP_AVRCP_BROWSE_OPEN_CHANNEL_COLLISION)
     CASE_RETURN_STR(INTEROP_ENABLE_PL10_ADAPTIVE_CONTROL)
-    CASE_RETURN_STR(END_OF_INTEROP_LIST)
     CASE_RETURN_STR(INTEROP_ADV_PBAP_VER_1_2)
     CASE_RETURN_STR(INTEROP_DISABLE_SNIFF_LINK_DURING_SCO)
     CASE_RETURN_STR(INTEROP_DISABLE_SNIFF_DURING_CALL)
     CASE_RETURN_STR(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL)
+    CASE_RETURN_STR(INTEROP_DISABLE_LPA_ENHANCED_POWER_CONTROL)
+    CASE_RETURN_STR(END_OF_INTEROP_LIST)
   }
   return "UNKNOWN";
 }