Loading jni/com_android_bluetooth_a2dp_sink.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -231,7 +231,7 @@ static JNINativeMethod sMethods[] = { int register_com_android_bluetooth_a2dp_sink(JNIEnv* env) { return jniRegisterNativeMethods( env, "com/android/bluetooth/a2dpsink/A2dpSinkStateMachine", sMethods, env, "com/android/bluetooth/a2dpsink/A2dpSinkService", sMethods, NELEM(sMethods)); } } jni/com_android_bluetooth_avrcp_controller.cpp +111 −79 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ static void btavrcp_passthrough_response_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr for passthrough response"); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -109,7 +109,7 @@ static void btavrcp_connection_state_callback(bool rc_connect, bool br_connect, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr for connection state"); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -134,7 +134,7 @@ static void btavrcp_get_rcfeatures_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -158,7 +158,7 @@ static void btavrcp_setplayerapplicationsetting_rsp_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -184,7 +184,7 @@ static void btavrcp_playerapplicationsetting_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading @@ -202,7 +202,7 @@ static void btavrcp_playerapplicationsetting_callback( ScopedLocalRef<jbyteArray> playerattribs( sCallbackEnv.get(), sCallbackEnv->NewByteArray(arraylen)); if (!playerattribs.get()) { ALOGE("Fail to new jbyteArray playerattribs "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -236,7 +236,7 @@ static void btavrcp_playerapplicationsetting_changed_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading Loading @@ -279,7 +279,7 @@ static void btavrcp_set_abs_vol_cmd_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -303,7 +303,7 @@ static void btavrcp_register_notification_absvol_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -333,7 +333,7 @@ static void btavrcp_track_changed_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -388,7 +388,7 @@ static void btavrcp_play_position_changed_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading @@ -411,7 +411,7 @@ static void btavrcp_play_status_changed_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading @@ -436,6 +436,16 @@ static void btavrcp_get_folder_items_callback( 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.address); // Inspect if the first element is a folder/item or player listing. They are // always exclusive. bool isPlayerListing = Loading Loading @@ -468,17 +478,7 @@ static void btavrcp_get_folder_items_callback( return; } // Parse UID ScopedLocalRef<jbyteArray> uidByteArray( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(uint8_t) * BTRC_UID_SIZE)); if (!uidByteArray.get()) { ALOGE("%s can't allocate uid array!", __func__); return; } sCallbackEnv->SetByteArrayRegion(uidByteArray.get(), 0, BTRC_UID_SIZE * sizeof(uint8_t), (jbyte*)item->media.uid); long long uid = *(long long*)item->media.uid; // Parse Attrs ScopedLocalRef<jintArray> attrIdArray( sCallbackEnv.get(), Loading @@ -504,10 +504,6 @@ static void btavrcp_get_folder_items_callback( ScopedLocalRef<jstring> attrValStr( sCallbackEnv.get(), sCallbackEnv->NewStringUTF((char*)(item->media.p_attrs[j].text))); if (!uidByteArray.get()) { ALOGE("%s can't allocate uid array!", __func__); return; } sCallbackEnv->SetObjectArrayElement(attrValArray.get(), j, attrValStr.get()); } Loading @@ -515,9 +511,9 @@ static void btavrcp_get_folder_items_callback( ScopedLocalRef<jobject> mediaObj( sCallbackEnv.get(), (jobject)sCallbackEnv->CallObjectMethod( sCallbacksObj, method_createFromNativeMediaItem, uidByteArray.get(), (jint)item->media.type, mediaName.get(), attrIdArray.get(), attrValArray.get())); sCallbacksObj, method_createFromNativeMediaItem, uid, (jint)item->media.type, mediaName.get(), attrIdArray.get(), attrValArray.get())); if (!mediaObj.get()) { ALOGE("%s failed to creae MediaItem for type ITEM_MEDIA", __func__); return; Loading @@ -536,22 +532,12 @@ static void btavrcp_get_folder_items_callback( return; } // Parse UID ScopedLocalRef<jbyteArray> uidByteArray( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(uint8_t) * BTRC_UID_SIZE)); if (!uidByteArray.get()) { ALOGE("%s can't allocate uid array!", __func__); return; } sCallbackEnv->SetByteArrayRegion(uidByteArray.get(), 0, BTRC_UID_SIZE * sizeof(uint8_t), (jbyte*)item->folder.uid); long long uid = *(long long*)item->folder.uid; ScopedLocalRef<jobject> folderObj( sCallbackEnv.get(), (jobject)sCallbackEnv->CallObjectMethod( sCallbacksObj, method_createFromNativeFolderItem, uidByteArray.get(), (jint)item->folder.type, folderName.get(), sCallbacksObj, method_createFromNativeFolderItem, uid, (jint)item->folder.type, folderName.get(), (jint)item->folder.playable)); if (!folderObj.get()) { ALOGE("%s failed to create MediaItem for type ITEM_FOLDER", __func__); Loading Loading @@ -609,10 +595,10 @@ static void btavrcp_get_folder_items_callback( if (isPlayerListing) { sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleGetPlayerItemsRsp, itemArray.get()); addr.get(), itemArray.get()); } else { sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleGetFolderItemsRsp, status, itemArray.get()); addr.get(), status, itemArray.get()); } } Loading @@ -626,9 +612,18 @@ static void btavrcp_change_path_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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.address); sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleChangeFolderRsp, (jint)count); addr.get(), (jint)count); } static void btavrcp_set_browsed_player_callback(const RawAddress& bd_addr, Loading @@ -642,9 +637,18 @@ static void btavrcp_set_browsed_player_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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.address); sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleSetBrowsedPlayerRsp, (jint)num_items, (jint)depth); addr.get(), (jint)num_items, (jint)depth); } static void btavrcp_set_addressed_player_callback(const RawAddress& bd_addr, Loading @@ -657,9 +661,19 @@ static void btavrcp_set_addressed_player_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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->CallVoidMethod( sCallbacksObj, method_handleSetAddressedPlayerRsp, (jint)status); sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr.address); sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleSetAddressedPlayerRsp, addr.get(), (jint)status); } static void btavrcp_addressed_player_changed_callback(const RawAddress& bd_addr, Loading @@ -672,9 +686,18 @@ static void btavrcp_addressed_player_changed_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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->CallVoidMethod(sCallbacksObj, method_handleAddressedPlayerChanged, (jint)id); sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr.address); sCallbackEnv->CallVoidMethod( sCallbacksObj, method_handleAddressedPlayerChanged, addr.get(), (jint)id); } static void btavrcp_now_playing_content_changed_callback( Loading @@ -683,9 +706,18 @@ static void btavrcp_now_playing_content_changed_callback( CallbackEnv sCallbackEnv(__func__); 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->CallVoidMethod(sCallbacksObj, method_handleNowPlayingContentChanged); sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr.address); sCallbackEnv->CallVoidMethod( sCallbacksObj, method_handleNowPlayingContentChanged, addr.get()); } static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = { Loading Loading @@ -747,32 +779,32 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_handleGetFolderItemsRsp = env->GetMethodID(clazz, "handleGetFolderItemsRsp", "(I[Landroid/media/browse/MediaBrowser$MediaItem;)V"); "([BI[Landroid/media/browse/MediaBrowser$MediaItem;)V"); method_handleGetPlayerItemsRsp = env->GetMethodID( clazz, "handleGetPlayerItemsRsp", "([Lcom/android/bluetooth/avrcpcontroller/AvrcpPlayer;)V"); "([B[Lcom/android/bluetooth/avrcpcontroller/AvrcpPlayer;)V"); method_createFromNativeMediaItem = env->GetMethodID(clazz, "createFromNativeMediaItem", "([BILjava/lang/String;[I[Ljava/lang/String;)Landroid/" "(JILjava/lang/String;[I[Ljava/lang/String;)Landroid/" "media/browse/MediaBrowser$MediaItem;"); method_createFromNativeFolderItem = env->GetMethodID( clazz, "createFromNativeFolderItem", "([BILjava/lang/String;I)Landroid/media/browse/MediaBrowser$MediaItem;"); "(JILjava/lang/String;I)Landroid/media/browse/MediaBrowser$MediaItem;"); method_createFromNativePlayerItem = env->GetMethodID(clazz, "createFromNativePlayerItem", "(ILjava/lang/String;[BII)Lcom/android/bluetooth/" "avrcpcontroller/AvrcpPlayer;"); method_handleChangeFolderRsp = env->GetMethodID(clazz, "handleChangeFolderRsp", "(I)V"); env->GetMethodID(clazz, "handleChangeFolderRsp", "([BI)V"); method_handleSetBrowsedPlayerRsp = env->GetMethodID(clazz, "handleSetBrowsedPlayerRsp", "(II)V"); env->GetMethodID(clazz, "handleSetBrowsedPlayerRsp", "([BII)V"); method_handleSetAddressedPlayerRsp = env->GetMethodID(clazz, "handleSetAddressedPlayerRsp", "(I)V"); env->GetMethodID(clazz, "handleSetAddressedPlayerRsp", "([BI)V"); method_handleAddressedPlayerChanged = env->GetMethodID(clazz, "handleAddressedPlayerChanged", "(I)V"); env->GetMethodID(clazz, "handleAddressedPlayerChanged", "([BI)V"); method_handleNowPlayingContentChanged = env->GetMethodID(clazz, "handleNowPlayingContentChanged", "()V"); env->GetMethodID(clazz, "handleNowPlayingContentChanged", "([B)V"); ALOGI("%s: succeeds", __func__); } Loading Loading @@ -1081,7 +1113,7 @@ static void getPlayerListNative(JNIEnv* env, jobject object, jbyteArray address, static void changeFolderPathNative(JNIEnv* env, jobject object, jbyteArray address, jbyte direction, jbyteArray uidarr) { jlong uid) { if (!sBluetoothAvrcpInterface) return; jbyte* addr = env->GetByteArrayElements(address, NULL); if (!addr) { Loading @@ -1089,22 +1121,22 @@ static void changeFolderPathNative(JNIEnv* env, jobject object, return; } jbyte* uid = env->GetByteArrayElements(uidarr, NULL); if (!uid) { jniThrowIOException(env, EINVAL); return; } // jbyte* uid = env->GetByteArrayElements(uidarr, NULL); // if (!uid) { // jniThrowIOException(env, EINVAL); // return; //} ALOGI("%s: sBluetoothAvrcpInterface: %p", __func__, sBluetoothAvrcpInterface); RawAddress rawAddress; rawAddress.FromOctets((uint8_t*)addr); bt_status_t status = sBluetoothAvrcpInterface->change_folder_path_cmd( rawAddress, (uint8_t)direction, (uint8_t*)uid); rawAddress, (uint8_t)direction, (uint8_t*)&uid); if (status != BT_STATUS_SUCCESS) { ALOGE("Failed sending changeFolderPathNative command, status: %d", status); } env->ReleaseByteArrayElements(address, addr, 0); // env->ReleaseByteArrayElements(address, addr, 0); } static void setBrowsedPlayerNative(JNIEnv* env, jobject object, Loading Loading @@ -1149,7 +1181,7 @@ static void setAddressedPlayerNative(JNIEnv* env, jobject object, } static void playItemNative(JNIEnv* env, jobject object, jbyteArray address, jbyte scope, jbyteArray uidArr, jint uidCounter) { jbyte scope, jlong uid, jint uidCounter) { if (!sBluetoothAvrcpInterface) return; jbyte* addr = env->GetByteArrayElements(address, NULL); if (!addr) { Loading @@ -1157,17 +1189,17 @@ static void playItemNative(JNIEnv* env, jobject object, jbyteArray address, return; } jbyte* uid = env->GetByteArrayElements(uidArr, NULL); if (!uid) { jniThrowIOException(env, EINVAL); return; } // jbyte* uid = env->GetByteArrayElements(uidArr, NULL); // if (!uid) { // jniThrowIOException(env, EINVAL); // return; // } RawAddress rawAddress; rawAddress.FromOctets((uint8_t*)addr); ALOGI("%s: sBluetoothAvrcpInterface: %p", __func__, sBluetoothAvrcpInterface); bt_status_t status = sBluetoothAvrcpInterface->play_item_cmd( rawAddress, (uint8_t)scope, (uint8_t*)uid, (uint16_t)uidCounter); rawAddress, (uint8_t)scope, (uint8_t*)&uid, (uint16_t)uidCounter); if (status != BT_STATUS_SUCCESS) { ALOGE("Failed sending playItemNative command, status: %d", status); } Loading @@ -1191,8 +1223,8 @@ static JNINativeMethod sMethods[] = { {"getNowPlayingListNative", "([BII)V", (void*)getNowPlayingListNative}, {"getFolderListNative", "([BII)V", (void*)getFolderListNative}, {"getPlayerListNative", "([BII)V", (void*)getPlayerListNative}, {"changeFolderPathNative", "([BB[B)V", (void*)changeFolderPathNative}, {"playItemNative", "([BB[BI)V", (void*)playItemNative}, {"changeFolderPathNative", "([BBJ)V", (void*)changeFolderPathNative}, {"playItemNative", "([BBJI)V", (void*)playItemNative}, {"setBrowsedPlayerNative", "([BI)V", (void*)setBrowsedPlayerNative}, {"setAddressedPlayerNative", "([BI)V", (void*)setAddressedPlayerNative}, }; Loading jni/com_android_bluetooth_hearing_aid.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,22 @@ static jboolean disconnectHearingAidNative(JNIEnv* env, jobject object, return JNI_TRUE; } static jboolean addToWhiteListNative(JNIEnv* env, jobject object, jbyteArray address) { std::shared_lock<std::shared_timed_mutex> lock(interface_mutex); if (!sHearingAidInterface) return JNI_FALSE; jbyte* addr = env->GetByteArrayElements(address, nullptr); if (!addr) { jniThrowIOException(env, EINVAL); return JNI_FALSE; } RawAddress* tmpraw = (RawAddress*)addr; sHearingAidInterface->AddToWhiteList(*tmpraw); env->ReleaseByteArrayElements(address, addr, 0); return JNI_TRUE; } static void setVolumeNative(JNIEnv* env, jclass clazz, jint volume) { if (!sHearingAidInterface) { LOG(ERROR) << __func__ Loading @@ -209,6 +225,7 @@ static JNINativeMethod sMethods[] = { {"cleanupNative", "()V", (void*)cleanupNative}, {"connectHearingAidNative", "([B)Z", (void*)connectHearingAidNative}, {"disconnectHearingAidNative", "([B)Z", (void*)disconnectHearingAidNative}, {"addToWhiteListNative", "([B)Z", (void*)addToWhiteListNative}, {"setVolumeNative", "(I)V", (void*)setVolumeNative}, }; Loading res/values-ar/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ <string name="status_connection_error" msgid="947681831523219891">"لم يتم الاتصال بنجاح."</string> <string name="status_protocol_error" msgid="3245444473429269539">"لا يمكن معالجة الطلب بشكل صحيح."</string> <string name="status_unknown_error" msgid="8156660554237824912">"خطأ غير معروف."</string> <string name="btopp_live_folder" msgid="7967791481444474554">"تم الاستلام عبر بلوتوث"</string> <string name="btopp_live_folder" msgid="7967791481444474554">"ملفات بلوتوث المستلَمة"</string> <string name="opp_notification_group" msgid="3486303082135789982">"مشاركة البلوتوث"</string> <string name="download_success" msgid="7036160438766730871">"اكتمل استلام <xliff:g id="FILE_SIZE">%1$s</xliff:g>."</string> <string name="upload_success" msgid="4014469387779648949">"اكتمل إرسال <xliff:g id="FILE_SIZE">%1$s</xliff:g>."</string> Loading res/values-fr/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ <string name="status_connection_error" msgid="947681831523219891">"Échec de la connexion."</string> <string name="status_protocol_error" msgid="3245444473429269539">"Impossible de traiter la demande correctement."</string> <string name="status_unknown_error" msgid="8156660554237824912">"Erreur inconnue."</string> <string name="btopp_live_folder" msgid="7967791481444474554">"Reçu par Bluetooth"</string> <string name="btopp_live_folder" msgid="7967791481444474554">"Reçus via Bluetooth"</string> <string name="opp_notification_group" msgid="3486303082135789982">"Partage Bluetooth"</string> <string name="download_success" msgid="7036160438766730871">"Réception de <xliff:g id="FILE_SIZE">%1$s</xliff:g> terminée"</string> <string name="upload_success" msgid="4014469387779648949">"Envoi de <xliff:g id="FILE_SIZE">%1$s</xliff:g> terminé"</string> Loading Loading
jni/com_android_bluetooth_a2dp_sink.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -231,7 +231,7 @@ static JNINativeMethod sMethods[] = { int register_com_android_bluetooth_a2dp_sink(JNIEnv* env) { return jniRegisterNativeMethods( env, "com/android/bluetooth/a2dpsink/A2dpSinkStateMachine", sMethods, env, "com/android/bluetooth/a2dpsink/A2dpSinkService", sMethods, NELEM(sMethods)); } }
jni/com_android_bluetooth_avrcp_controller.cpp +111 −79 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ static void btavrcp_passthrough_response_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr for passthrough response"); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -109,7 +109,7 @@ static void btavrcp_connection_state_callback(bool rc_connect, bool br_connect, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr for connection state"); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -134,7 +134,7 @@ static void btavrcp_get_rcfeatures_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -158,7 +158,7 @@ static void btavrcp_setplayerapplicationsetting_rsp_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -184,7 +184,7 @@ static void btavrcp_playerapplicationsetting_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to new jbyteArray bd addr "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading @@ -202,7 +202,7 @@ static void btavrcp_playerapplicationsetting_callback( ScopedLocalRef<jbyteArray> playerattribs( sCallbackEnv.get(), sCallbackEnv->NewByteArray(arraylen)); if (!playerattribs.get()) { ALOGE("Fail to new jbyteArray playerattribs "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -236,7 +236,7 @@ static void btavrcp_playerapplicationsetting_changed_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading Loading @@ -279,7 +279,7 @@ static void btavrcp_set_abs_vol_cmd_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading @@ -303,7 +303,7 @@ static void btavrcp_register_notification_absvol_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -333,7 +333,7 @@ static void btavrcp_track_changed_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } Loading Loading @@ -388,7 +388,7 @@ static void btavrcp_play_position_changed_callback(const RawAddress& bd_addr, ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading @@ -411,7 +411,7 @@ static void btavrcp_play_status_changed_callback( ScopedLocalRef<jbyteArray> addr( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); if (!addr.get()) { ALOGE("Fail to get new array "); ALOGE("%s: Failed to allocate a new byte array", __func__); return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), Loading @@ -436,6 +436,16 @@ static void btavrcp_get_folder_items_callback( 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.address); // Inspect if the first element is a folder/item or player listing. They are // always exclusive. bool isPlayerListing = Loading Loading @@ -468,17 +478,7 @@ static void btavrcp_get_folder_items_callback( return; } // Parse UID ScopedLocalRef<jbyteArray> uidByteArray( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(uint8_t) * BTRC_UID_SIZE)); if (!uidByteArray.get()) { ALOGE("%s can't allocate uid array!", __func__); return; } sCallbackEnv->SetByteArrayRegion(uidByteArray.get(), 0, BTRC_UID_SIZE * sizeof(uint8_t), (jbyte*)item->media.uid); long long uid = *(long long*)item->media.uid; // Parse Attrs ScopedLocalRef<jintArray> attrIdArray( sCallbackEnv.get(), Loading @@ -504,10 +504,6 @@ static void btavrcp_get_folder_items_callback( ScopedLocalRef<jstring> attrValStr( sCallbackEnv.get(), sCallbackEnv->NewStringUTF((char*)(item->media.p_attrs[j].text))); if (!uidByteArray.get()) { ALOGE("%s can't allocate uid array!", __func__); return; } sCallbackEnv->SetObjectArrayElement(attrValArray.get(), j, attrValStr.get()); } Loading @@ -515,9 +511,9 @@ static void btavrcp_get_folder_items_callback( ScopedLocalRef<jobject> mediaObj( sCallbackEnv.get(), (jobject)sCallbackEnv->CallObjectMethod( sCallbacksObj, method_createFromNativeMediaItem, uidByteArray.get(), (jint)item->media.type, mediaName.get(), attrIdArray.get(), attrValArray.get())); sCallbacksObj, method_createFromNativeMediaItem, uid, (jint)item->media.type, mediaName.get(), attrIdArray.get(), attrValArray.get())); if (!mediaObj.get()) { ALOGE("%s failed to creae MediaItem for type ITEM_MEDIA", __func__); return; Loading @@ -536,22 +532,12 @@ static void btavrcp_get_folder_items_callback( return; } // Parse UID ScopedLocalRef<jbyteArray> uidByteArray( sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(uint8_t) * BTRC_UID_SIZE)); if (!uidByteArray.get()) { ALOGE("%s can't allocate uid array!", __func__); return; } sCallbackEnv->SetByteArrayRegion(uidByteArray.get(), 0, BTRC_UID_SIZE * sizeof(uint8_t), (jbyte*)item->folder.uid); long long uid = *(long long*)item->folder.uid; ScopedLocalRef<jobject> folderObj( sCallbackEnv.get(), (jobject)sCallbackEnv->CallObjectMethod( sCallbacksObj, method_createFromNativeFolderItem, uidByteArray.get(), (jint)item->folder.type, folderName.get(), sCallbacksObj, method_createFromNativeFolderItem, uid, (jint)item->folder.type, folderName.get(), (jint)item->folder.playable)); if (!folderObj.get()) { ALOGE("%s failed to create MediaItem for type ITEM_FOLDER", __func__); Loading Loading @@ -609,10 +595,10 @@ static void btavrcp_get_folder_items_callback( if (isPlayerListing) { sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleGetPlayerItemsRsp, itemArray.get()); addr.get(), itemArray.get()); } else { sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleGetFolderItemsRsp, status, itemArray.get()); addr.get(), status, itemArray.get()); } } Loading @@ -626,9 +612,18 @@ static void btavrcp_change_path_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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.address); sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleChangeFolderRsp, (jint)count); addr.get(), (jint)count); } static void btavrcp_set_browsed_player_callback(const RawAddress& bd_addr, Loading @@ -642,9 +637,18 @@ static void btavrcp_set_browsed_player_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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.address); sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleSetBrowsedPlayerRsp, (jint)num_items, (jint)depth); addr.get(), (jint)num_items, (jint)depth); } static void btavrcp_set_addressed_player_callback(const RawAddress& bd_addr, Loading @@ -657,9 +661,19 @@ static void btavrcp_set_addressed_player_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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->CallVoidMethod( sCallbacksObj, method_handleSetAddressedPlayerRsp, (jint)status); sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr.address); sCallbackEnv->CallVoidMethod(sCallbacksObj, method_handleSetAddressedPlayerRsp, addr.get(), (jint)status); } static void btavrcp_addressed_player_changed_callback(const RawAddress& bd_addr, Loading @@ -672,9 +686,18 @@ static void btavrcp_addressed_player_changed_callback(const RawAddress& bd_addr, ALOGE("%s: sCallbacksObj is null", __func__); 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->CallVoidMethod(sCallbacksObj, method_handleAddressedPlayerChanged, (jint)id); sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr.address); sCallbackEnv->CallVoidMethod( sCallbacksObj, method_handleAddressedPlayerChanged, addr.get(), (jint)id); } static void btavrcp_now_playing_content_changed_callback( Loading @@ -683,9 +706,18 @@ static void btavrcp_now_playing_content_changed_callback( CallbackEnv sCallbackEnv(__func__); 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->CallVoidMethod(sCallbacksObj, method_handleNowPlayingContentChanged); sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), (jbyte*)&bd_addr.address); sCallbackEnv->CallVoidMethod( sCallbacksObj, method_handleNowPlayingContentChanged, addr.get()); } static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = { Loading Loading @@ -747,32 +779,32 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_handleGetFolderItemsRsp = env->GetMethodID(clazz, "handleGetFolderItemsRsp", "(I[Landroid/media/browse/MediaBrowser$MediaItem;)V"); "([BI[Landroid/media/browse/MediaBrowser$MediaItem;)V"); method_handleGetPlayerItemsRsp = env->GetMethodID( clazz, "handleGetPlayerItemsRsp", "([Lcom/android/bluetooth/avrcpcontroller/AvrcpPlayer;)V"); "([B[Lcom/android/bluetooth/avrcpcontroller/AvrcpPlayer;)V"); method_createFromNativeMediaItem = env->GetMethodID(clazz, "createFromNativeMediaItem", "([BILjava/lang/String;[I[Ljava/lang/String;)Landroid/" "(JILjava/lang/String;[I[Ljava/lang/String;)Landroid/" "media/browse/MediaBrowser$MediaItem;"); method_createFromNativeFolderItem = env->GetMethodID( clazz, "createFromNativeFolderItem", "([BILjava/lang/String;I)Landroid/media/browse/MediaBrowser$MediaItem;"); "(JILjava/lang/String;I)Landroid/media/browse/MediaBrowser$MediaItem;"); method_createFromNativePlayerItem = env->GetMethodID(clazz, "createFromNativePlayerItem", "(ILjava/lang/String;[BII)Lcom/android/bluetooth/" "avrcpcontroller/AvrcpPlayer;"); method_handleChangeFolderRsp = env->GetMethodID(clazz, "handleChangeFolderRsp", "(I)V"); env->GetMethodID(clazz, "handleChangeFolderRsp", "([BI)V"); method_handleSetBrowsedPlayerRsp = env->GetMethodID(clazz, "handleSetBrowsedPlayerRsp", "(II)V"); env->GetMethodID(clazz, "handleSetBrowsedPlayerRsp", "([BII)V"); method_handleSetAddressedPlayerRsp = env->GetMethodID(clazz, "handleSetAddressedPlayerRsp", "(I)V"); env->GetMethodID(clazz, "handleSetAddressedPlayerRsp", "([BI)V"); method_handleAddressedPlayerChanged = env->GetMethodID(clazz, "handleAddressedPlayerChanged", "(I)V"); env->GetMethodID(clazz, "handleAddressedPlayerChanged", "([BI)V"); method_handleNowPlayingContentChanged = env->GetMethodID(clazz, "handleNowPlayingContentChanged", "()V"); env->GetMethodID(clazz, "handleNowPlayingContentChanged", "([B)V"); ALOGI("%s: succeeds", __func__); } Loading Loading @@ -1081,7 +1113,7 @@ static void getPlayerListNative(JNIEnv* env, jobject object, jbyteArray address, static void changeFolderPathNative(JNIEnv* env, jobject object, jbyteArray address, jbyte direction, jbyteArray uidarr) { jlong uid) { if (!sBluetoothAvrcpInterface) return; jbyte* addr = env->GetByteArrayElements(address, NULL); if (!addr) { Loading @@ -1089,22 +1121,22 @@ static void changeFolderPathNative(JNIEnv* env, jobject object, return; } jbyte* uid = env->GetByteArrayElements(uidarr, NULL); if (!uid) { jniThrowIOException(env, EINVAL); return; } // jbyte* uid = env->GetByteArrayElements(uidarr, NULL); // if (!uid) { // jniThrowIOException(env, EINVAL); // return; //} ALOGI("%s: sBluetoothAvrcpInterface: %p", __func__, sBluetoothAvrcpInterface); RawAddress rawAddress; rawAddress.FromOctets((uint8_t*)addr); bt_status_t status = sBluetoothAvrcpInterface->change_folder_path_cmd( rawAddress, (uint8_t)direction, (uint8_t*)uid); rawAddress, (uint8_t)direction, (uint8_t*)&uid); if (status != BT_STATUS_SUCCESS) { ALOGE("Failed sending changeFolderPathNative command, status: %d", status); } env->ReleaseByteArrayElements(address, addr, 0); // env->ReleaseByteArrayElements(address, addr, 0); } static void setBrowsedPlayerNative(JNIEnv* env, jobject object, Loading Loading @@ -1149,7 +1181,7 @@ static void setAddressedPlayerNative(JNIEnv* env, jobject object, } static void playItemNative(JNIEnv* env, jobject object, jbyteArray address, jbyte scope, jbyteArray uidArr, jint uidCounter) { jbyte scope, jlong uid, jint uidCounter) { if (!sBluetoothAvrcpInterface) return; jbyte* addr = env->GetByteArrayElements(address, NULL); if (!addr) { Loading @@ -1157,17 +1189,17 @@ static void playItemNative(JNIEnv* env, jobject object, jbyteArray address, return; } jbyte* uid = env->GetByteArrayElements(uidArr, NULL); if (!uid) { jniThrowIOException(env, EINVAL); return; } // jbyte* uid = env->GetByteArrayElements(uidArr, NULL); // if (!uid) { // jniThrowIOException(env, EINVAL); // return; // } RawAddress rawAddress; rawAddress.FromOctets((uint8_t*)addr); ALOGI("%s: sBluetoothAvrcpInterface: %p", __func__, sBluetoothAvrcpInterface); bt_status_t status = sBluetoothAvrcpInterface->play_item_cmd( rawAddress, (uint8_t)scope, (uint8_t*)uid, (uint16_t)uidCounter); rawAddress, (uint8_t)scope, (uint8_t*)&uid, (uint16_t)uidCounter); if (status != BT_STATUS_SUCCESS) { ALOGE("Failed sending playItemNative command, status: %d", status); } Loading @@ -1191,8 +1223,8 @@ static JNINativeMethod sMethods[] = { {"getNowPlayingListNative", "([BII)V", (void*)getNowPlayingListNative}, {"getFolderListNative", "([BII)V", (void*)getFolderListNative}, {"getPlayerListNative", "([BII)V", (void*)getPlayerListNative}, {"changeFolderPathNative", "([BB[B)V", (void*)changeFolderPathNative}, {"playItemNative", "([BB[BI)V", (void*)playItemNative}, {"changeFolderPathNative", "([BBJ)V", (void*)changeFolderPathNative}, {"playItemNative", "([BBJI)V", (void*)playItemNative}, {"setBrowsedPlayerNative", "([BI)V", (void*)setBrowsedPlayerNative}, {"setAddressedPlayerNative", "([BI)V", (void*)setAddressedPlayerNative}, }; Loading
jni/com_android_bluetooth_hearing_aid.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,22 @@ static jboolean disconnectHearingAidNative(JNIEnv* env, jobject object, return JNI_TRUE; } static jboolean addToWhiteListNative(JNIEnv* env, jobject object, jbyteArray address) { std::shared_lock<std::shared_timed_mutex> lock(interface_mutex); if (!sHearingAidInterface) return JNI_FALSE; jbyte* addr = env->GetByteArrayElements(address, nullptr); if (!addr) { jniThrowIOException(env, EINVAL); return JNI_FALSE; } RawAddress* tmpraw = (RawAddress*)addr; sHearingAidInterface->AddToWhiteList(*tmpraw); env->ReleaseByteArrayElements(address, addr, 0); return JNI_TRUE; } static void setVolumeNative(JNIEnv* env, jclass clazz, jint volume) { if (!sHearingAidInterface) { LOG(ERROR) << __func__ Loading @@ -209,6 +225,7 @@ static JNINativeMethod sMethods[] = { {"cleanupNative", "()V", (void*)cleanupNative}, {"connectHearingAidNative", "([B)Z", (void*)connectHearingAidNative}, {"disconnectHearingAidNative", "([B)Z", (void*)disconnectHearingAidNative}, {"addToWhiteListNative", "([B)Z", (void*)addToWhiteListNative}, {"setVolumeNative", "(I)V", (void*)setVolumeNative}, }; Loading
res/values-ar/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ <string name="status_connection_error" msgid="947681831523219891">"لم يتم الاتصال بنجاح."</string> <string name="status_protocol_error" msgid="3245444473429269539">"لا يمكن معالجة الطلب بشكل صحيح."</string> <string name="status_unknown_error" msgid="8156660554237824912">"خطأ غير معروف."</string> <string name="btopp_live_folder" msgid="7967791481444474554">"تم الاستلام عبر بلوتوث"</string> <string name="btopp_live_folder" msgid="7967791481444474554">"ملفات بلوتوث المستلَمة"</string> <string name="opp_notification_group" msgid="3486303082135789982">"مشاركة البلوتوث"</string> <string name="download_success" msgid="7036160438766730871">"اكتمل استلام <xliff:g id="FILE_SIZE">%1$s</xliff:g>."</string> <string name="upload_success" msgid="4014469387779648949">"اكتمل إرسال <xliff:g id="FILE_SIZE">%1$s</xliff:g>."</string> Loading
res/values-fr/strings.xml +1 −1 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ <string name="status_connection_error" msgid="947681831523219891">"Échec de la connexion."</string> <string name="status_protocol_error" msgid="3245444473429269539">"Impossible de traiter la demande correctement."</string> <string name="status_unknown_error" msgid="8156660554237824912">"Erreur inconnue."</string> <string name="btopp_live_folder" msgid="7967791481444474554">"Reçu par Bluetooth"</string> <string name="btopp_live_folder" msgid="7967791481444474554">"Reçus via Bluetooth"</string> <string name="opp_notification_group" msgid="3486303082135789982">"Partage Bluetooth"</string> <string name="download_success" msgid="7036160438766730871">"Réception de <xliff:g id="FILE_SIZE">%1$s</xliff:g> terminée"</string> <string name="upload_success" msgid="4014469387779648949">"Envoi de <xliff:g id="FILE_SIZE">%1$s</xliff:g> terminé"</string> Loading