Loading jni/com_android_bluetooth_avrcp_controller.cpp 100644 → 100755 +30 −1 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ static jmethodID method_handleSetBrowsedPlayerRsp; static jmethodID method_handleSetAddressedPlayerRsp; static jmethodID method_handleAddressedPlayerChanged; static jmethodID method_handleNowPlayingContentChanged; static jmethodID method_onAvailablePlayerChanged; static jclass class_MediaBrowser_MediaItem; static jclass class_AvrcpPlayer; Loading Loading @@ -719,6 +720,31 @@ static void btavrcp_now_playing_content_changed_callback( sCallbacksObj, method_handleNowPlayingContentChanged, addr.get()); } static void btavrcp_available_player_changed_callback ( const RawAddress& bd_addr) { ALOGI("%s", __func__); std::shared_lock<std::shared_timed_mutex> lock(sCallbacks_mutex); CallbackEnv sCallbackEnv(__func__); if (!sCallbacksObj) { ALOGE("%s: sCallbacksObj is null", __func__); return; } if (!sCallbackEnv.valid()) return; ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr); sCallbackEnv->CallVoidMethod( sCallbacksObj, method_onAvailablePlayerChanged, addr.get()); } static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = { sizeof(sBluetoothAvrcpCallbacks), btavrcp_passthrough_response_callback, Loading @@ -738,7 +764,8 @@ static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = { btavrcp_set_browsed_player_callback, btavrcp_set_addressed_player_callback, btavrcp_addressed_player_changed_callback, btavrcp_now_playing_content_changed_callback}; btavrcp_now_playing_content_changed_callback, btavrcp_available_player_changed_callback}; static void classInitNative(JNIEnv* env, jclass clazz) { method_handlePassthroughRsp = Loading Loading @@ -804,6 +831,8 @@ static void classInitNative(JNIEnv* env, jclass clazz) { env->GetMethodID(clazz, "handleAddressedPlayerChanged", "([BI)V"); method_handleNowPlayingContentChanged = env->GetMethodID(clazz, "handleNowPlayingContentChanged", "([B)V"); method_onAvailablePlayerChanged = env->GetMethodID(clazz, "onAvailablePlayerChanged", "([B)V"); ALOGI("%s: succeeds", __func__); } Loading src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java 100644 → 100755 +12 −0 Original line number Diff line number Diff line Loading @@ -435,6 +435,18 @@ public class AvrcpControllerService extends ProfileService { } } private void onAvailablePlayerChanged(byte[] address) { if (DBG) { Log.d(TAG," onAvailablePlayerChanged"); } BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address); AvrcpControllerStateMachine stateMachine = getStateMachine(device); if (stateMachine != null) { stateMachine.sendMessage(AvrcpControllerStateMachine.MESSAGE_PROCESS_AVAILABLE_PLAYER_CHANGED); } } // Browsing related JNI callbacks. void handleGetFolderItemsRsp(byte[] address, int status, MediaItem[] items) { if (DBG) { Loading src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java 100644 → 100755 +12 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ class AvrcpControllerStateMachine extends StateMachine { static final int MESSAGE_PROCESS_NOW_PLAYING_CONTENTS_CHANGED = 216; static final int MESSAGE_PROCESS_SUPPORTED_APPLICATION_SETTINGS = 217; static final int MESSAGE_PROCESS_CURRENT_APPLICATION_SETTINGS = 218; static final int MESSAGE_PROCESS_AVAILABLE_PLAYER_CHANGED = 219; //300->399 Events for Browsing static final int MESSAGE_GET_FOLDER_ITEMS = 300; Loading Loading @@ -400,6 +401,10 @@ class AvrcpControllerStateMachine extends StateMachine { BluetoothMediaBrowserService.notifyChanged(mAddressedPlayer.getPlaybackState()); return true; case MESSAGE_PROCESS_AVAILABLE_PLAYER_CHANGED: processAvailablePlayerChanged(); return true; case DISCONNECT: transitionTo(mDisconnecting); return true; Loading Loading @@ -471,6 +476,13 @@ class AvrcpControllerStateMachine extends StateMachine { PlayerApplicationSettings.mapAvrcpPlayerSettingstoBTattribVal( PlayerApplicationSettings.SHUFFLE_STATUS, shuffleMode)}); } private void processAvailablePlayerChanged() { logD("processAvailablePlayerChanged"); mBrowseTree.mRootNode.setCached(false); mBrowseTree.mRootNode.setExpectedChildren(255); BluetoothMediaBrowserService.notifyChanged(mBrowseTree.mRootNode); } } // Handle the get folder listing action Loading Loading
jni/com_android_bluetooth_avrcp_controller.cpp 100644 → 100755 +30 −1 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ static jmethodID method_handleSetBrowsedPlayerRsp; static jmethodID method_handleSetAddressedPlayerRsp; static jmethodID method_handleAddressedPlayerChanged; static jmethodID method_handleNowPlayingContentChanged; static jmethodID method_onAvailablePlayerChanged; static jclass class_MediaBrowser_MediaItem; static jclass class_AvrcpPlayer; Loading Loading @@ -719,6 +720,31 @@ static void btavrcp_now_playing_content_changed_callback( sCallbacksObj, method_handleNowPlayingContentChanged, addr.get()); } static void btavrcp_available_player_changed_callback ( const RawAddress& bd_addr) { ALOGI("%s", __func__); std::shared_lock<std::shared_timed_mutex> lock(sCallbacks_mutex); CallbackEnv sCallbackEnv(__func__); if (!sCallbacksObj) { ALOGE("%s: sCallbacksObj is null", __func__); return; } if (!sCallbackEnv.valid()) return; ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr); sCallbackEnv->CallVoidMethod( sCallbacksObj, method_onAvailablePlayerChanged, addr.get()); } static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = { sizeof(sBluetoothAvrcpCallbacks), btavrcp_passthrough_response_callback, Loading @@ -738,7 +764,8 @@ static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = { btavrcp_set_browsed_player_callback, btavrcp_set_addressed_player_callback, btavrcp_addressed_player_changed_callback, btavrcp_now_playing_content_changed_callback}; btavrcp_now_playing_content_changed_callback, btavrcp_available_player_changed_callback}; static void classInitNative(JNIEnv* env, jclass clazz) { method_handlePassthroughRsp = Loading Loading @@ -804,6 +831,8 @@ static void classInitNative(JNIEnv* env, jclass clazz) { env->GetMethodID(clazz, "handleAddressedPlayerChanged", "([BI)V"); method_handleNowPlayingContentChanged = env->GetMethodID(clazz, "handleNowPlayingContentChanged", "([B)V"); method_onAvailablePlayerChanged = env->GetMethodID(clazz, "onAvailablePlayerChanged", "([B)V"); ALOGI("%s: succeeds", __func__); } Loading
src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java 100644 → 100755 +12 −0 Original line number Diff line number Diff line Loading @@ -435,6 +435,18 @@ public class AvrcpControllerService extends ProfileService { } } private void onAvailablePlayerChanged(byte[] address) { if (DBG) { Log.d(TAG," onAvailablePlayerChanged"); } BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address); AvrcpControllerStateMachine stateMachine = getStateMachine(device); if (stateMachine != null) { stateMachine.sendMessage(AvrcpControllerStateMachine.MESSAGE_PROCESS_AVAILABLE_PLAYER_CHANGED); } } // Browsing related JNI callbacks. void handleGetFolderItemsRsp(byte[] address, int status, MediaItem[] items) { if (DBG) { Loading
src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java 100644 → 100755 +12 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ class AvrcpControllerStateMachine extends StateMachine { static final int MESSAGE_PROCESS_NOW_PLAYING_CONTENTS_CHANGED = 216; static final int MESSAGE_PROCESS_SUPPORTED_APPLICATION_SETTINGS = 217; static final int MESSAGE_PROCESS_CURRENT_APPLICATION_SETTINGS = 218; static final int MESSAGE_PROCESS_AVAILABLE_PLAYER_CHANGED = 219; //300->399 Events for Browsing static final int MESSAGE_GET_FOLDER_ITEMS = 300; Loading Loading @@ -400,6 +401,10 @@ class AvrcpControllerStateMachine extends StateMachine { BluetoothMediaBrowserService.notifyChanged(mAddressedPlayer.getPlaybackState()); return true; case MESSAGE_PROCESS_AVAILABLE_PLAYER_CHANGED: processAvailablePlayerChanged(); return true; case DISCONNECT: transitionTo(mDisconnecting); return true; Loading Loading @@ -471,6 +476,13 @@ class AvrcpControllerStateMachine extends StateMachine { PlayerApplicationSettings.mapAvrcpPlayerSettingstoBTattribVal( PlayerApplicationSettings.SHUFFLE_STATUS, shuffleMode)}); } private void processAvailablePlayerChanged() { logD("processAvailablePlayerChanged"); mBrowseTree.mRootNode.setCached(false); mBrowseTree.mRootNode.setExpectedChildren(255); BluetoothMediaBrowserService.notifyChanged(mBrowseTree.mRootNode); } } // Handle the get folder listing action Loading