#470,解决卡片管理-音乐-手机音乐界面触摸无反应,无法切换,暂停,音量操作bug 1006/1
authorluozheng <1732036298@qq.com>
Mon, 23 Sep 2024 07:52:18 +0000 (15:52 +0800)
committerluozheng <1732036298@qq.com>
Mon, 23 Sep 2024 07:52:18 +0000 (15:52 +0800)
code/sdk/application/wearable/fd230app/nativeui/bluetooth/include/BluetoothHeadsetEvent.h
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothHeadsetEvent.cpp
code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h
code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerBTConnectFailedView.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerBluetoothDisConView.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerSourceView.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersModel.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersView.cpp

index 2253e6d..500d144 100644 (file)
@@ -38,6 +38,7 @@ void ConnCtStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t
 void ConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state);\r
 void InitBtHeadsetEvent(void);\r
 void BtAvrcpVolumeChangedSyncMedia(uint8_t a2dp_volume);\r
+void user_avrcp_ct_press_button(const bd_addr_t *bd_addr, int32_t key_operation);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 0ab8b0a..05852ce 100644 (file)
@@ -11,6 +11,7 @@
 #include "PlayersModel.h"\r
 #include "service_id_define.h"\r
 #include "graphic_service.h"\r
+#include <bts_a2dp_source.h>\r
 \r
 using namespace OHOS;\r
 \r
@@ -251,6 +252,26 @@ void ConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_stat
     }\r
 }\r
 \r
+/* -------------------------------------------------------------------------- */\r
+void user_avrcp_ct_press_button(const bd_addr_t *bd_addr, int32_t key_operation)\r
+{\r
+    (void)avrcp_ct_press_button(bd_addr, key_operation);\r
+    uint8_t sleep_cnt = 0;\r
+    while (1) { //持续等待接收一个响应消息来确认按键按下操作已被正确处理\r
+        osal_msleep(100);  /* sleep 1000 ms */\r
+        if (g_avrcp_srv_inf.avrcp_button_flag == AVRCP_SRV_PRESS_VALUE) {\r
+            (void)avrcp_ct_release_button(bd_addr, key_operation);\r
+            break;\r
+        }\r
+        sleep_cnt++;\r
+        if (sleep_cnt > 20) { /* sleep 20 times */\r
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,"not receive rsp press button msg\n");\r
+            break;\r
+        }\r
+    }\r
+}\r
+/* -------------------------------------------------------------------------- */\r
+//记录按下按钮的回调事件以及按键操作值\r
 static void BtAvrcpCtPressButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)\r
 {\r
     if (bd_addr == nullptr) {\r
@@ -302,10 +323,11 @@ static void BtAvrcpPressReleaseButtonLog(uint32_t key_operation)
     }\r
 }\r
 \r
+//记录释放按钮的回调事件以及按键操作值\r
 static void BtAvrcpCtReleaseButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)\r
 {\r
     UNUSED(bd_addr);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct release button cbk key:%d\n", key_operation);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "avrcp ct release button cbk key:%x\n", key_operation);\r
     if (g_avrcp_srv_inf.avrcp_button_flag == AVRCP_SRV_PRESS_VALUE) {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct released button button_flag change:%u->%u\n",\r
             g_avrcp_srv_inf.avrcp_button_flag, AVRCP_SRV_RELEASED_VALUE);\r
index 31b761e..6cb74cb 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-08-05 15:20:03\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-20 17:57:54\r
+ * @LastEditTime: 2024-09-23 15:07:25\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h\r
  */\r
 \r
@@ -107,6 +107,8 @@ public:
     bool OnClick(UIView& view, const ClickEvent& event) override;\r
 private:\r
     void PlayerButtonOnClick();\r
+    void NextButtonOnClick();\r
+    void PreButtonOnClick();\r
     void SoundButtonOnClick();\r
     void PlayerModelButtonOnClick();\r
     void OptionsButtonOnClick();\r
index 625281a..5d90e33 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-08-12 11:31:43
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-03 20:31:31
+ * @LastEditTime: 2024-09-23 15:42:03
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerBTConnectFailedView.cpp
  */
 #include "player/include/MusicPlayerBTConnectFailedView.h"
@@ -36,7 +36,7 @@ namespace OHOS
         }
         if (strcmp(view.GetViewId(), CLOSEBUTTON_VIEWID) == 0)
         {
-            playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW, PlayersView::MAIN_MUSICPLAYER_VIEW);
+            playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW, PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);
         }
         return true;
     }
index 3ee33f8..a857d71 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-08-10 16:23:46
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-08-12 12:01:13
+ * @LastEditTime: 2024-09-23 15:40:20
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerBluetoothDisConView.cpp
  */
 #include "player/include/MusicPlayerBluetoothDisConView.h"
@@ -38,6 +38,11 @@ namespace OHOS
         {
             playersView->ChangeView(PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW, PlayersView::MAIN_MUSICPLAYER_VIEW);
         }
+        else if(strcmp(view.GetViewId(), MUISC_PLAYER_BLUETOOTH_DISCONN_VIEW) == 0)
+        {
+            //跳转到蓝牙连接失败视图
+            playersView->ChangeView(PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW);
+        }
         return true;
     }
 
@@ -278,6 +283,7 @@ namespace OHOS
             }
         }
         group->SetOnDragListener(dragListener);
+        group->SetOnClickListener(this);
         /* -------------------------------------------------------------------------- */
         if (scrollView == nullptr)
         {
index 90fb346..2f67c8d 100644 (file)
@@ -101,10 +101,7 @@ namespace OHOS
                 PlayersModel::GetInstance()->SetMusicSource(false);\r
                 UpdateBluetoothHeadSetViewIsVisible();\r
                 /* -------------------------------------------------------------------------- */\r
-                if (a2dp)\r
-                {\r
-                    uapi_a2dp_snk_disconnect(); // 切换通道主动断开atdp\r
-                }\r
+                PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_STOP);//切换到手机音乐停止音乐\r
                 /* -------------------------------------------------------------------------- */\r
                 playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUISC_CONNECTING);\r
             }\r
index 825fd2a..df1a320 100644 (file)
@@ -20,6 +20,7 @@
 #include <service/graphic_service.h>
 #include "MainViewSample.h"
 #include "settings/include/SettingModel.h"
+#include "bluetooth/include/BluetoothHeadsetEvent.h"
 namespace OHOS {
 
 static constexpr int VOLUME_MAXIMUM = 100;
@@ -822,19 +823,14 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void)
         }
         bool type = PlayersModel::GetInstance()->GetMusicSource();
         if(type) {
-            bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态
-            bool a2dp = uapi_a2dp_snk_get_device_connect_state();                         // 获取a2dp连接状态
+            bool phoneMusicConnectStatus = uapi_a2dp_snk_get_device_connect_state(); // 获取a2dp连接状态
             if(g_PlayerTimes < 3) /*3秒切换时间*/
             {
-                if (!phonebluetoothcon)
+                if (!phoneMusicConnectStatus) 
                 {
                     playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);
                 }
-                else if (phonebluetoothcon && !a2dp) // 如果手机蓝牙已连接但手表与手机的a2dp未连接手表主动去连接a2dp
-                {
-                    playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW);
-                }
-                else if (phonebluetoothcon && a2dp)
+                else if (phoneMusicConnectStatus)
                 {
                     playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MAIN_MUSICPLAYER_VIEW);
                 }
@@ -959,6 +955,7 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void)
         SetCircleProgress();
     }
     
+    //更新音乐的声音进度条
     void PlayersModel::UpdateVolumeValue(void)
     {
         if(PlayersView::GetInstance())
@@ -985,40 +982,32 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void)
         return false;
     }
 
+    //用来控制手机音乐的播放,暂停,下一首,上一首音乐
     void PlayersModel::set_phone_music_play_state(avrcp_key_operation_t notify)
     {
-    #if 0
-       int ret;
-       int playerState;
        bd_addr_t bdAddr={0};
        uapi_get_br_address(&bdAddr); //获取手机蓝牙地址
-       int a2dp_play_stat = a2dp_src_get_playing_state(&bdAddr);
-       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_play_stat]%d", a2dp_play_stat);
        switch(notify)
         {
             case AVRCP_KEY_PLAY://播放
-                if(a2dp_play_stat == A2DP_IS_PLAYING)
-                    return;
-                ret = a2dp_src_start_playing(&bdAddr);//设置手机音乐的状态为播放
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_src_start_playing],ret:%x", ret);
-                playerState = AVRCP_PLAY_STATUS_PLAYING;
+                user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_PLAY);
                 break;
             case AVRCP_KEY_STOP: //停止
-                ret = a2dp_src_stop_playing(&bdAddr);//设置手机的状态停止
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_src_stop_playing],ret:%x", ret); 
-                playerState = AVRCP_PLAY_STATUS_STOPPED;
+                user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_STOP);
                 break;
             case AVRCP_KEY_PAUSE://暂停
-                ret = a2dp_src_suspend_playing(&bdAddr);//设置手机的状态暂停
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_src_suspend_playing],ret:%x", ret); 
-                playerState = AVRCP_PLAY_STATUS_PAUSED;
+                user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_PAUSE);
+                break;
+            case AVRCP_KEY_FORWARD: // 下一曲
+                user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_FORWARD);
+                break;
+        case AVRCP_KEY_BACKWARD: // 上一曲
+                user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_BACKWARD);
                 break;
             default:
-                playerState = AVRCP_PLAY_STATUS_STOPPED;
+                user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_STOP);//停止
                 break;
         }
-       avrcp_tg_notify_playback_status_changed((unsigned char)(playerState));
-    #endif
     }
 }
 
index a4b3caf..22442fd 100644 (file)
@@ -615,18 +615,20 @@ void ButtonOnClickListener::PlayerButtonOnClick()
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerButtonOnClick] calling phone");\r
         return;\r
     }\r
+    /* -------------------------- 若ct或tg端是已连接状态且当前为手机音乐 ------------------------- */\r
     if(PlayersModel::GetInstance()->get_avrcp_ct_or_tg_is_connected() && PlayersModel::GetInstance()->GetMusicSource())\r
     {\r
         if (state == UICheckBox::UICheckBoxState::SELECTED) \r
         {\r
-           PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PLAY);\r
+           PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PLAY); //控制手机音乐播放\r
         } \r
         else if (state == UICheckBox::UICheckBoxState::UNSELECTED) \r
         {\r
-           PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PAUSE);\r
+           PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PAUSE);//控制手机音乐暂停\r
         }\r
         return;\r
     }\r
+    /* -------------------------------------------------------------------------- */\r
      \r
     if (state == UICheckBox::UICheckBoxState::SELECTED) {\r
         /* start play */\r
@@ -637,7 +639,52 @@ void ButtonOnClickListener::PlayerButtonOnClick()
     /* -------------------------------------------------------------------------- */\r
     PlayersModel::GetInstance()->SetCurrentIndex(PlayersModel::GetInstance()->GetCurrentIndex());\r
 }\r
-\r
+/*下一首按钮被点击时调用*/\r
+void ButtonOnClickListener::NextButtonOnClick()\r
+{\r
+    /* -------------------------- 若ct或tg端是已连接状态且当前为手机音乐 ------------------------- */\r
+    if(PlayersModel::GetInstance()->get_avrcp_ct_or_tg_is_connected() && PlayersModel::GetInstance()->GetMusicSource())\r
+    {\r
+        PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_FORWARD); //控制手机音乐下一首\r
+        return;\r
+    }\r
+    else\r
+    {\r
+        PlayersView *playersView = PlayersView::GetInstance();\r
+        if (playersView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance");\r
+            return;\r
+        }\r
+        if (playersView->GetPlaybackProgress() != nullptr) {\r
+            playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
+            playersView->GetPlaybackProgress()->Invalidate();\r
+        }\r
+        PlayersModel::GetInstance()->LoopingPlayout();\r
+    }\r
+}\r
+/*上一首按钮被点击时调用*/\r
+void ButtonOnClickListener::PreButtonOnClick()\r
+{\r
+    /* -------------------------- 若ct或tg端是已连接状态且当前为手机音乐 ------------------------- */\r
+    if(PlayersModel::GetInstance()->get_avrcp_ct_or_tg_is_connected() && PlayersModel::GetInstance()->GetMusicSource())\r
+    {\r
+        PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_BACKWARD); //控制手机音乐上一首\r
+        return;\r
+    }\r
+    else\r
+    {\r
+        PlayersView *playersView = PlayersView::GetInstance();\r
+        if (playersView == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance");\r
+            return;\r
+        }\r
+        if (playersView->GetPlaybackProgress() != nullptr) {\r
+            playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
+            playersView->GetPlaybackProgress()->Invalidate();\r
+        }\r
+        PlayersModel::GetInstance()->PreviousPlayout();\r
+    }\r
+}\r
 /*当声音按钮被点击时候调用*/\r
 void ButtonOnClickListener::SoundButtonOnClick()\r
 {\r
@@ -692,8 +739,13 @@ void ButtonOnClickListener::MusicDeleteButtonOnClick()
     PlayersListGroup::GetInstance()->SetUpListCase();\r
     return;\r
 }\r
+//当音乐播放模式按钮被点击时候调用\r
 void ButtonOnClickListener::PlayerModelButtonOnClick()\r
 {\r
+    PlayersModel::GetInstance()->SetPlayerModelAddOne();\r
+    if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {\r
+        PlayersModel::GetInstance()->SetPlayerModel(LOOP);\r
+    }\r
     PlayersView *playersView = PlayersView::GetInstance();\r
     if (playersView == nullptr) {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerModelButtonOnClick playersView nullptr err");\r
@@ -730,22 +782,10 @@ bool ButtonOnClickListener::OnClick(UIView& view, const ClickEvent& event)
     if (&view == (UIView *)playersView->GetPlayerButton()) {\r
         PlayerButtonOnClick();\r
     } else if (&view == (UIView *)playersView->GetNextButton()) {\r
-        if (playersView->GetPlaybackProgress() != nullptr) {\r
-            playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
-            playersView->GetPlaybackProgress()->Invalidate();\r
-        }\r
-        PlayersModel::GetInstance()->LoopingPlayout();\r
+        NextButtonOnClick();\r
     } else if (&view == (UIView *)playersView->GetPreButton()) {\r
-        if (playersView->GetPlaybackProgress() != nullptr) {\r
-            playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
-            playersView->GetPlaybackProgress()->Invalidate();\r
-        }\r
-        PlayersModel::GetInstance()->PreviousPlayout();\r
+        PreButtonOnClick();\r
     } else if (&view == (UIView *)playersView->GetPlayerModelButton()) {\r
-        PlayersModel::GetInstance()->SetPlayerModelAddOne();\r
-        if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {\r
-            PlayersModel::GetInstance()->SetPlayerModel(LOOP);\r
-        }\r
         PlayerModelButtonOnClick();\r
     } else if (&view == (UIView *)playersView->GetSoundButton()) {\r
         SoundButtonOnClick();\r
@@ -1105,7 +1145,7 @@ void PlayerOnDragListener::OnDragChangMusicPlayerBTDisConnectView(const DragEven
         X_DRAG_FLAG = true;\r
     }\r
 }\r
-/*从蓝牙连接失败视图回到音乐主视图*/\r
+/*从蓝牙连接失败视图回到蓝牙未连接视图*/\r
 void PlayerOnDragListener::OnDragChangMusicPlayerBTConnectFailedView(const DragEvent& event)\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnDragChangMusicPlayerBTConnectFailedView");\r
@@ -1115,7 +1155,7 @@ void PlayerOnDragListener::OnDragChangMusicPlayerBTConnectFailedView(const DragE
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");\r
             return;\r
         }\r
-        playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW,PlayersView::MAIN_MUSICPLAYER_VIEW);\r
+        playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW,PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);\r
         X_DRAG_FLAG = true;\r
     }\r
 }\r
index d6cea87..7b611c4 100644 (file)
@@ -871,9 +871,9 @@ namespace OHOS
         if (play_or_pause_Button && preMusicButton && nextMusicButton && soundButton && playerModelButton)\r
         {\r
             bool touchableState = !musicSourceType;\r
-            play_or_pause_Button->SetTouchable(touchableState);\r
-            preMusicButton->SetTouchable(touchableState);\r
-            nextMusicButton->SetTouchable(touchableState);\r
+            // play_or_pause_Button->SetTouchable(touchableState);\r
+            // preMusicButton->SetTouchable(touchableState);\r
+            // nextMusicButton->SetTouchable(touchableState);\r
             // soundButton->SetTouchable(touchableState);\r
             playerModelButton->SetTouchable(touchableState); // 如果音乐来源为手机音乐,播放顺序按钮就不可用\r
             /* -------------------------------------------------------------------------- */\r
@@ -953,13 +953,9 @@ namespace OHOS
     void PlayersView::UpdatePlayerView(void)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdatePlayerView");\r
-        // 1.a2dp未连接,向手机发起a2dp连接\r
-        bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态\r
-        bool a2dp = uapi_a2dp_snk_get_device_connect_state();                         // 获取a2dp连接状态\r
-\r
-        bool phoneMusicConnectStatus = phonebluetoothcon && a2dp;\r
+        bool phoneMusicConnectStatus = uapi_a2dp_snk_get_device_connect_state();// 获取a2dp连接状态\r
         bool musicSourceType = PlayersModel::GetInstance()->GetMusicSource();\r
-        // 2.\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneMusicConnectStatus %d,musicSourceType %d",phoneMusicConnectStatus,musicSourceType);\r
         ImageInfo *image;\r
         if (musicSourceType)\r
         {\r