1.音乐播放器在切换通道时添加主动连接和断开手机a2dp功能
authorluozheng <1732036298@qq.com>
Tue, 20 Aug 2024 10:07:03 +0000 (18:07 +0800)
committerluozheng <1732036298@qq.com>
Tue, 20 Aug 2024 10:07:03 +0000 (18:07 +0800)
2.播放器添加连接动画,手表连接手机音乐超时时间设置为5s

code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h
code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h
code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h
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
code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp

index 37be7a2..27b1d98 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-08-05 15:20:03
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-08-13 17:11:32
+ * @LastEditTime: 2024-08-20 17:18:32
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h
  */
 
@@ -101,6 +101,8 @@ public:
     void SetMusicSource(bool value);
     void UpdateMusicPlayerList(void);
     bool GetCurrentMusicIsPlaying(void);
+    void PlayerMusic_StartTimer(uint32_t interval = 1000);
+    void PlayerMusic_StopTimer(void);
 private:
     bool musicSourceFlag{false};//音乐来源标志:false:默认为手表音乐,true:手机音乐
 private:
index 519943b..31b761e 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-13 16:10:15\r
+ * @LastEditTime: 2024-08-20 17:57:54\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h\r
  */\r
 \r
@@ -240,7 +240,6 @@ public:
     void OnClickSuccBack(void);\r
     void OnClickConnFailBack(void);\r
     void OnClickFailBack(void);\r
-    void UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus);\r
     void SetPlaybackProgress(int64_t value);\r
     void SetPlayerState(bool value);\r
     void PlayerbackReset(void);\r
index d8b5f97..5e1304d 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-14 11:26:39\r
+ * @LastEditTime: 2024-08-20 17:39:13\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h\r
  */\r
 \r
@@ -34,6 +34,7 @@
 #include "player/include/MusicPlayerSourceView.h"\r
 #include "player/include/MusicPlayerBluetoothDisConView.h"\r
 #include "player/include/MusicPlayerBTConnectFailedView.h"\r
+#include "aivoice/include/AiVoiceConnectingView.h"\r
 namespace OHOS\r
 {\r
 #define PLAY_PROGRESS_MIN 0\r
@@ -98,7 +99,7 @@ namespace OHOS
         UICircleProgress *GetPlaybackProgress(void);\r
         UICheckBox::UICheckBoxState GetPlayerButtonState(void);\r
 \r
-        void UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus);\r
+        void UpdatePlayerView(void);\r
         void UpdateMusicListStatus(void);\r
         void OnClickBackKeyToMainMusicPlayerView(void);\r
 \r
@@ -152,6 +153,7 @@ namespace OHOS
         UIViewGroup *musicListGroupView{nullptr};                                // 音乐列表视图\r
         MusicPlayerBluetoothDisConView *musicPlayerBluetoothDisConView{nullptr}; // 蓝牙未连接视图\r
         MusicPlayerBTConnectFailedView *musicPlayerBTConnectFailedView{nullptr}; // 蓝牙连接失败视图\r
+        AiVoiceConnectingView *musicPlayerConnectingView{nullptr};               // 连接动画\r
 \r
     private:\r
         UIView::OnClickListener *clickListener{nullptr};\r
index bb47b64..1bef02a 100644 (file)
@@ -67,15 +67,16 @@ namespace OHOS
             // 1.a2dp未连接,向手机发起a2dp连接\r
             // 如果蓝牙没连接直接是跳转到蓝牙连接失败视图,连接了就有一个主动去连手机的a2dp过程,5秒超市\r
 \r
-            playersPresenter->UpdatePlayerView(PlayersModel::GetInstance()->GetMusicSource(), phonebluetoothcon && a2dp);\r
-\r
             if (!phonebluetoothcon)\r
             {\r
                 playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);\r
             }\r
-            else if (phonebluetoothcon && !a2dp)\r
+            else if (phonebluetoothcon && !a2dp) // 如果手机蓝牙已连接但手表与手机的a2dp未连接手表主动去连接a2dp\r
             {\r
-                playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW);\r
+                /* -------------------------------------------------------------------------- */\r
+                uapi_a2dp_snk_connect(); // 切换通道主动连接atdp\r
+                /* -------------------------------------------------------------------------- */\r
+                playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUISC_CONNECTING);\r
             }\r
             else if (phonebluetoothcon && a2dp)\r
             {\r
@@ -87,8 +88,12 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick watchLableButton");\r
             PlayersModel::GetInstance()->SetMusicSource(false);\r
             UpdateBluetoothHeadSetViewIsVisible();\r
-\r
-            playersPresenter->UpdatePlayerView(PlayersModel::GetInstance()->GetMusicSource(), phonebluetoothcon && a2dp);\r
+            /* -------------------------------------------------------------------------- */\r
+            if (a2dp)\r
+            {\r
+                uapi_a2dp_snk_disconnect(); // 切换通道主动断开atdp\r
+            }\r
+            /* -------------------------------------------------------------------------- */\r
         }\r
         else if (button == bluetoothHeadsetLableButton)\r
         {\r
index 3e2aa2c..e2dd531 100644 (file)
@@ -15,6 +15,9 @@
 #include "bluetooth/include/BluetoothModel.h"
 #include <unistd.h>
 #include <sys/stat.h>
+#include "cmsis_os.h"
+#include <cmsis_os2.h>
+#include <service/graphic_service.h>
 namespace OHOS {
 
 static constexpr int VOLUME_MAXIMUM = 100;
@@ -801,6 +804,92 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void)
     }
     return false;
 }
+    
+    /* -------------------------------------------------------------------------- */
+    static osTimerId_t g_timer = NULL;
+    static int g_PlayerTimes = 5;
+
+    static void PlayerMusic_TimerCallbackProc(int data)
+    {
+        g_PlayerTimes--;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_PlayerTimes = %d",g_PlayerTimes);
+        PlayersView *playersView = PlayersView::GetInstance();
+        if (playersView == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView nullptr err");
+            return;
+        }
+        if(g_PlayerTimes < 0) /*5秒超时*/
+        {
+            playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW);
+        }
+        else
+        {
+            bool a2dp = uapi_a2dp_snk_get_device_connect_state();// 获取a2dp连接状态
+            if(a2dp)
+            {
+                playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MAIN_MUSICPLAYER_VIEW);
+            }
+        }
+        return;
+    }
+    static void PlayerMusic_TimerCallback(int data)
+    {
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(PlayerMusic_TimerCallbackProc, data));
+    }
+
+    void PlayersModel::PlayerMusic_StartTimer(uint32_t interval)
+    {
+        /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */
+        if (g_timer != NULL)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersModel::StopWatch_StartTimer Timer already exists!!");
+            return;
+        }
+
+        /* --------------------------------- 2.创建定时器 -------------------------------- */
+        g_timer = osTimerNew((osTimerFunc_t)PlayerMusic_TimerCallback, osTimerPeriodic, NULL, NULL);
+        // 检查定时器创建是否成功
+        if (g_timer == NULL)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::StopWatch_StartTimer Timer create failed!!");
+            return;
+        }
+
+        /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */
+        int tick = osMs2Tick(interval);
+
+        /* --------------------------------- 4.启动定时器 -------------------------------- */
+        // g_timerStartTimestamp = GetCurrentTimestamp(); // 假设GetCurrentTimestamp()是获取当前时间戳的函数
+        osStatus_t ret = osTimerStart(g_timer, tick);
+        /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 NULL -------------------- */
+        if (ret != osOK)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[StopWatch_StartTimer]osTimerDelete failed, ret = %lx!!", ret);
+            if (g_timer != NULL)
+            {
+                ret = osTimerDelete(g_timer);
+            }
+            g_timer = NULL;
+            return;
+        }
+        return;
+    }
+
+    void PlayersModel::PlayerMusic_StopTimer(void)
+    {
+        // 检查定时器是否存在
+        if (g_timer != NULL)
+        {
+            // 删除定时器并置为 NULL
+            osStatus_t ret = osTimerDelete(g_timer);
+            if (ret != osOK)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret);
+            }
+            g_timer = NULL;
+            g_PlayerTimes = 5;
+        }
+    }
 }
 
 #ifdef __cplusplus
index 858364f..27beed9 100644 (file)
@@ -1474,16 +1474,6 @@ bool PlayersPresenter::OnClick(UIView &view, const ClickEvent &event)
     return false;\r
 }\r
 \r
-void PlayersPresenter::UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus)\r
-{\r
-    PlayersView *playersView = PlayersView::GetInstance();\r
-    if (playersView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");\r
-        return;\r
-    }\r
-    playersView->UpdatePlayerView(musicSourceType,phoneMusicConnectStatus);\r
-}\r
-\r
 void PlayersPresenter::SetPlaybackProgress(int64_t value)\r
 {\r
     PlayersView *playersView = PlayersView::GetInstance();\r
index 204cce8..f981c7d 100644 (file)
@@ -488,6 +488,12 @@ namespace OHOS
             delete musicPlayerBTConnectFailedView;\r
             musicPlayerBTConnectFailedView = nullptr;\r
         }\r
+        if (musicPlayerConnectingView != nullptr)\r
+        {\r
+            PlayersModel::GetInstance()->PlayerMusic_StopTimer();\r
+            delete musicPlayerConnectingView;\r
+            musicPlayerConnectingView = nullptr;\r
+        }\r
 \r
         for (int i = MAIN_MUSICPLAYER_VIEW; i < MUSICPLAYERJUMPVIEWID_MAX; i++)\r
         {\r
@@ -922,11 +928,15 @@ namespace OHOS
     }\r
 \r
     /*刷新播放器界面的组件状态*/\r
-    void PlayersView::UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus)\r
+    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 musicSourceType = PlayersModel::GetInstance()->GetMusicSource();\r
         // 2.\r
         ImageInfo *image;\r
         if (musicSourceType)\r
@@ -989,9 +999,7 @@ namespace OHOS
             return false;\r
         }\r
         /* -------------------------------------------------------------------------- */\r
-        bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态\r
-        bool a2dp = uapi_a2dp_snk_get_device_connect_state();                         // 获取a2dp连接状态\r
-        UpdatePlayerView(PlayersModel::GetInstance()->GetMusicSource(), phonebluetoothcon && a2dp);\r
+        UpdatePlayerView();\r
         /* -------------------------------------------------------------------------- */\r
 \r
         PlayersListGroup::GetInstance()->SetUpListCase();\r
@@ -1238,6 +1246,7 @@ namespace OHOS
         {PlayersView::MUSIC_DELETE_VIEW, &PlayersView::ChangeToMusicDeleteView},\r
         {PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW, &PlayersView::ChangeToMusicBluetoothDisConnectView},\r
         {PlayersView::MUSIC_BT_CONNECTFAILED_VIEW, &PlayersView::ChangeToMusicBluetoothConnectFailedView},\r
+        {PlayersView::MUISC_CONNECTING, &PlayersView::ChangeToMusicConnectingView},\r
     };\r
 \r
     /*根据传入的 interface 值,在 ViewMapper 数组中查找匹配的 viewId*/\r
@@ -1278,10 +1287,37 @@ namespace OHOS
         return true;\r
     }\r
 \r
+    static const short PlayerDestroyMapper[] = {\r
+        PlayersView::MUISC_CONNECTING,\r
+    };\r
+\r
     /*删除临时视图*/\r
     void PlayersView::DestroyTempView(int16_t hideView)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::DestroyTempView");\r
+        int viewSize = sizeof(PlayerDestroyMapper) / sizeof(PlayerDestroyMapper[0]);\r
+        for (int i = 0; i < viewSize; i++)\r
+        {\r
+            if (hideView == PlayerDestroyMapper[i])\r
+            {\r
+                Remove(group[hideView]);\r
+                group[hideView] = nullptr;\r
+                break;\r
+            }\r
+        }\r
+        switch (hideView)\r
+        {\r
+        case PlayersView::MUISC_CONNECTING:\r
+            PlayersModel::GetInstance()->PlayerMusic_StopTimer();\r
+            if (musicPlayerConnectingView)\r
+            {\r
+                delete musicPlayerConnectingView;\r
+                musicPlayerConnectingView = nullptr;\r
+            }\r
+            break;\r
+        default:\r
+            break;\r
+        }\r
     }\r
 \r
     /*视图切换*/\r
@@ -1313,6 +1349,7 @@ namespace OHOS
         {\r
             Add(group[thisView]);\r
         }\r
+        UpdatePlayerView();\r
         return true;\r
     }\r
 \r
@@ -1372,7 +1409,7 @@ namespace OHOS
             group[thisView] = groupview;\r
             Add(group[thisView]);\r
         }\r
-        UpdateMusicListStatus();/*每次切换到音乐列表都将更新一次列表*/\r
+        UpdateMusicListStatus(); /*每次切换到音乐列表都将更新一次列表*/\r
         return true;\r
     }\r
 \r
@@ -1448,27 +1485,28 @@ namespace OHOS
         return true;\r
     }\r
 \r
-    /*å\88\87æ\8d¢å\88°è\93\9dç\89\99æ\9cªè¿\9eæ\8e¥视图*/\r
+    /*å\88\87æ\8d¢å\88°è¿\9eæ\8e¥å\8a¨ç\94»视图*/\r
     bool PlayersView::ChangeToMusicConnectingView(int16_t thisView)\r
     {\r
-        //  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::ChangeToMusicBluetoothConnectFailedView");\r
-        // if (group[thisView] == nullptr)\r
-        // {\r
-        //     musicPlayerBTConnectFailedView = new MusicPlayerBTConnectFailedView();\r
-        //     if (musicPlayerBTConnectFailedView == nullptr)\r
-        //     {\r
-        //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new playerListDelSongView fail");\r
-        //         return false;\r
-        //     }\r
-        //     UIViewGroup *groupview = musicPlayerBTConnectFailedView->CreateMusicPlayerBTConnectFailedView();\r
-        //     if (groupview == nullptr)\r
-        //     {\r
-        //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group[%d] fail", thisView);\r
-        //         return false;\r
-        //     }\r
-        //     group[thisView] = groupview;\r
-        //     Add(group[thisView]);\r
-        // }\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::ChangeToMusicConnectingView");\r
+        if (group[thisView] == nullptr)\r
+        {\r
+            musicPlayerConnectingView = new AiVoiceConnectingView();\r
+            if (musicPlayerConnectingView == nullptr)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new playerListDelSongView fail");\r
+                return false;\r
+            }\r
+            UIViewGroup *groupview = musicPlayerConnectingView->CreateAiVoiceConnectingView(1);\r
+            if (groupview == nullptr)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group[%d] fail", thisView);\r
+                return false;\r
+            }\r
+            group[thisView] = groupview;\r
+            Add(group[thisView]);\r
+        }\r
+        PlayersModel::GetInstance()->PlayerMusic_StartTimer();\r
         return true;\r
     }\r
 }\r
index f8fc69b..2dfd7d3 100644 (file)
@@ -2,13 +2,14 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-02-18 09:09:13
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-07-22 10:51:12
+ * @LastEditTime: 2024-08-20 17:42:37
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp
  */
 #include "settings/include/SettingModel.h"
 #include "main/include/PullUpDownView.h"
 #include "ui_resource_string.h"
 #include "classicbluetooth/include/BluetoothServiceOptionsView.h"
+#include "player/include/PlayersView.h"
 namespace OHOS
 {
     SettingModel::SettingModel() {}
@@ -99,5 +100,9 @@ namespace OHOS
         {
             BluetoothServiceOptionsView::GetInstance()->Button_UPdata();
         }
+        if(PlayersView::GetInstance())
+        {
+            PlayersView::GetInstance()->UpdatePlayerView();
+        }
     }
 }