1. 修复在连接手机音乐后在播放本地音乐有卡顿问题。
authorluozheng <1732036298@qq.com>
Tue, 13 Aug 2024 08:05:55 +0000 (16:05 +0800)
committerluozheng <1732036298@qq.com>
Tue, 13 Aug 2024 08:05:55 +0000 (16:05 +0800)
2. 新增音乐列表刷新消息
3. 新增音乐列表按字母(不区分大小写)排序
4.新增蓝牙耳机相关多国语言资源
5.新增音乐列表如果为空的标签提示 “当前音乐列表为空请通过APP下载添加”

21 files changed:
code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h
code/sdk/application/wearable/fd230app/nativeui/main/src/VolumeSettingPresenter.cpp
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/PlayersCaseListAdapter.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/uiservice/include/ui_service.h
code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/ui_resource_string.h
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/zh.lang
tools/language_tool/Language_xml/input_list_en.txt
tools/language_tool/Language_xml/input_list_zh.txt
tools/language_tool/Language_xml/language_en.xml
tools/language_tool/Language_xml/language_zh.xml
tools/language_tool/font/en.lang
tools/language_tool/font/ui_resource_string.h
tools/language_tool/font/zh.lang

index 353e3f2..e52cb31 100644 (file)
@@ -516,7 +516,10 @@ enum UIResourceTextId : uint16_t {
     STR_DISTURBNOTE_OFF = 503,\r
     STR_4G_NOTE = 504,\r
     STR_MUSIC_PLAYER_SOURCE_NOTE = 505,\r
-    STR_MAX_ID = 506,\r
+    STR_MUSIC_LIST_IS_EMPTY = 506,\r
+    STR_BT_HEADSET_RESCAN = 507,\r
+    STR_BT_HEADSET_NOFOND = 508,\r
+    STR_MAX_ID = 509,\r
 }; // UIResourceTextId\r
 \r
 enum FontLanguageId : uint8_t {\r
index 022e16e..1e067da 100644 (file)
@@ -119,7 +119,7 @@ void VolumeSliderEventListener::ChangeVolume(VolumeChangeStatus status)
     }
 
     if (playerCoefficients == VOLUMEPLAYERS) {
-        BtAndLocalVolumeSet(volumeSettingView->sounding);
+        BtAndLocalVolumeSet(volumeSettingView->sounding);  /*蓝牙耳机音乐调节*/
         ConfigModel::GetInstance()->SetSystemVolume(volumeSettingView->sounding);/*将设置的音量保存到系统音量*/
     }
     if (playerCoefficients == VOLUMEPHONE || playerCoefficients == VOLUMEPHONENOTIFY) {
index 060ed80..f4ba5bb 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-12 17:59:14
+ * @LastEditTime: 2024-08-13 11:11:47
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h
  */
 
@@ -16,7 +16,7 @@
 #include "source.h"
 #include "audio_manager.h"
 #include "audio_base_type.h"
-#include "PlayersPresenter.h"
+#include "player/include/PlayersPresenter.h"
 #include "bts_avrcp_controller.h"
 #include "PlayersCaseListAdapter.h"
 namespace OHOS {
@@ -99,6 +99,7 @@ public:
     std::string GetMusicPlayPath(void);
     bool GetMusicSource();
     void SetMusicSource(bool value);
+    void UpdateMusicPlayerList(void);
 private:
     bool musicSourceFlag{false};//音乐来源标志:false:默认为手表音乐,true:手机音乐
 private:
index a9e449a..ff9fc97 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-12 14:54:57\r
+ * @LastEditTime: 2024-08-13 14:26:21\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h\r
  */\r
 \r
@@ -66,7 +66,7 @@ static constexpr uint8_t FONT_THIRTY_SIZE = 30; // 30:字体大小
 static constexpr uint8_t FONT_FORTY_SIZE = 40; // 40:字体大小\r
 \r
 struct PlayerCaseInfo {\r
-    char sliceId[DEC_NUM_256];\r
+    char sliceId[DEC_NUM_256]; /*音乐名*/\r
     int16_t index;\r
 };\r
 \r
@@ -88,6 +88,9 @@ public:
 private:\r
     List<PlayerCaseInfo> *playersCaseList_{nullptr};\r
     int GetAllFiles(List<PlayerCaseInfo> *playersCaseList);\r
+    std::list<PlayerCaseInfo> playersList_; //音乐列表\r
+    int GetAllFiles(std::list<PlayerCaseInfo> &playersList);\r
+    void sortPlayersCaseList(std::list<PlayerCaseInfo>* playersCaseList);\r
 };\r
 \r
 // Button OnClick\r
@@ -100,17 +103,14 @@ public:
         LOUD,\r
     };\r
     ButtonOnClickListener() {}\r
-    ButtonOnClickListener(UIView *view) : view_(view) {}\r
     ~ButtonOnClickListener();\r
     bool OnClick(UIView& view, const ClickEvent& event) override;\r
 private:\r
-    UIView *view_{nullptr};\r
     void PlayerButtonOnClick();\r
     void SoundButtonOnClick();\r
     void PlayerModelButtonOnClick();\r
     void OptionsButtonOnClick();\r
     void MusicListButtonOnClick();\r
-    VolumeSettingView *volumeSettingView{nullptr};\r
 };\r
 \r
 // 播放器回调\r
index feb3f09..0a7806d 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-12 14:57:23\r
+ * @LastEditTime: 2024-08-13 15:07:08\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h\r
  */\r
 \r
@@ -141,6 +141,7 @@ namespace OHOS
         void PhoneMusicConnectStatusLabelColor(bool state);\r
         void OptionsButtonSetImageStyle(ImageInfo *image);\r
         void SetMusicPlayerButtonIsTouchable(bool musicSourceType);\r
+        void UpdateMusicListStatus(void);\r
 \r
     private:\r
         VolumeSettingView *volumeSettingView{nullptr};                           // 声音设置\r
@@ -166,10 +167,14 @@ namespace OHOS
         UILabelExt *MusciSourceLabel{nullptr};             // 音乐来源标签\r
         UILabelExt *PhoneMusicConnectStatusLabel{nullptr}; // 手机音乐连接状态标签\r
 \r
+        /* -------------------------------- 音乐列表相关组件 -------------------------------- */\r
         UIScrollView *musicListScrollView{nullptr};    // 音乐列表容器视图\r
         UILabelExt *musicListTitle{nullptr};           // 音乐列表的标题\r
+        UILabelExt *musicListIsEmptyLabel{nullptr};    // 音乐列表为空的标签\r
+        UIImageView *musicListIsEmptyImage{nullptr};   // 音乐列表为空的图片\r
         UIList *musicList{nullptr};                    // 音乐列表\r
         PlayersCaseListAdapter *musicAdapter{nullptr}; // 音乐列表适配器\r
+        /* -------------------------------------------------------------------------- */\r
 \r
         JumpView *jumpView{nullptr};\r
         PlayersPresenter *playersPresenter{nullptr};\r
index 9d9df4d..4351a5d 100644 (file)
@@ -124,6 +124,7 @@ namespace OHOS
         }\r
     }\r
 \r
+    /*获取歌曲数量*/\r
     uint16_t PlayersCaseListAdapter::GetCount()\r
     {\r
         return PlayersListGroup::GetInstance()->GetCase().Size();\r
index 777d749..f8a9d0d 100644 (file)
@@ -777,4 +777,9 @@ void PlayersModel::SetMusicSource(bool value)
     musicSourceFlag = value;
 }
 
+/*更新音乐列表*/
+void PlayersModel::UpdateMusicPlayerList(void)
+{
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::UpdateMusicPlayerList");
+}
 }
\ No newline at end of file
index cd6a2f4..9821536 100644 (file)
@@ -24,7 +24,7 @@
 #include "bts_avrcp_target.h"\r
 #include <PlayerListDelSongView.h>\r
 #include "ConfigModel.h"\r
-\r
+#include "ctype.h"\r
 namespace OHOS {\r
 static PlayerOnDragListener *g_pPlayerOnDragListener = nullptr;\r
 static JumpView *g_pJumpView = nullptr;\r
@@ -148,7 +148,6 @@ bool JumpView::ChangeBluetoothEarListView(int16_t hideView, int16_t thisView)
     return true;\r
 }\r
 \r
-//切换到音乐来源视图\r
 bool JumpView::ChangeBluetoothView(int16_t hideView, int16_t thisView)\r
 {\r
     /*\r
@@ -396,13 +395,16 @@ void JumpView::ChangeView(int16_t hideView, int16_t showView)
     BluetoothModel::GetInstance()->SetCurView(showView);\r
 }\r
 \r
+/* --------------------------------- 音乐列表相关 --------------------------------- */\r
 PlayersListGroup::~PlayersListGroup()\r
 {\r
     if (playersCaseList_ != nullptr) {\r
         playersCaseList_->Clear();\r
+        \r
+        delete playersCaseList_;\r
+        playersCaseList_ = nullptr;\r
     }\r
-    delete playersCaseList_;\r
-    playersCaseList_ = nullptr;\r
+    playersList_.clear();\r
 }\r
 \r
 void PlayersListGroup::AddCase(PlayerCaseInfo testCaseInfo)\r
@@ -424,14 +426,34 @@ void PlayersListGroup::SetUpListCase()
         }\r
     }\r
     playersCaseList_->Clear();\r
+    playersList_.clear();\r
     if(!PlayersModel::GetInstance()->CreateMusicPlayDirectory())\r
     {\r
         return;\r
     }\r
-    ret = GetAllFiles(playersCaseList_);\r
+    /* -------------------------------- 获取歌曲list -------------------------------- */\r
+    ret = GetAllFiles(playersList_);\r
     if (ret == OHOS_FAILURE) {\r
         return;\r
     }\r
+    /* -------------------------------- 依照字母排序歌曲名 ------------------------------- */\r
+    sortPlayersCaseList(&playersList_);  \r
+    // 遍历方式 使用迭代器\r
+    std::list<PlayerCaseInfo>::iterator it;\r
+    struct PlayerCaseInfo playerCaseInfo;\r
+    int i = 0;\r
+    for (it = playersList_.begin(); it!= playersList_.end(); ++it) {\r
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "it musicName = %s,it index = %d",it->sliceId,it->index);\r
+        ret = memcpy_s(playerCaseInfo.sliceId, DEC_NUM_256, it->sliceId, DEC_NUM_256);\r
+        if (ret != OHOS_SUCCESS) {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "memcpy_s err %d.", ret);\r
+            return;\r
+        }\r
+        playerCaseInfo.index = i;\r
+        i++;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicName = %s,index = %d",playerCaseInfo.sliceId,playerCaseInfo.index);\r
+        playersCaseList_->PushBack(playerCaseInfo);\r
+    }\r
 }\r
 \r
 List<PlayerCaseInfo>& PlayersListGroup::GetCase()\r
@@ -454,6 +476,27 @@ char *PlayersListGroup::GetCase(int16_t index)
     return nullptr;\r
 }\r
 \r
+// 比较函数,用于按照音乐名的字母顺序比较(不区分大小写)\r
+static bool comparePlayerCaseInfo(const PlayerCaseInfo& a, const PlayerCaseInfo& b) {\r
+    std::string nameA(a.sliceId);\r
+    std::string nameB(b.sliceId);\r
+\r
+    /*循环内部,tolower 函数将当前字符转换为小写*/\r
+    for (size_t i = 0; i < nameA.size() && i < nameB.size(); ++i) {\r
+        if (tolower(nameA[i]) < tolower(nameB[i])) {\r
+            return true;\r
+        } else if (tolower(nameA[i]) > tolower(nameB[i])) {\r
+            return false;\r
+        }\r
+    }\r
+    //如果循环结束而没有返回结果,则意味着当前字符比较没有得出结论,可能是两个字符串的前缀相同。此时,比较它们的长度:\r
+    return nameA.size() < nameB.size(); /*如:hello 与 hello word*/\r
+}\r
+\r
+/*将歌名排序*/\r
+void PlayersListGroup::sortPlayersCaseList(std::list<PlayerCaseInfo>* playersCaseList) {\r
+    playersCaseList->sort(comparePlayerCaseInfo);\r
+}\r
 // 读取指定目录(APP_MUSIC_PATH)下的文件,并将文件名等信息填充到提供的列表中\r
 int PlayersListGroup::GetAllFiles(List<PlayerCaseInfo> *playersCaseList)\r
 {\r
@@ -488,10 +531,42 @@ int PlayersListGroup::GetAllFiles(List<PlayerCaseInfo> *playersCaseList)
     return OHOS_SUCCESS;\r
 }\r
 \r
+// 读取指定目录(APP_MUSIC_PATH)下的文件,并将文件名等信息填充到提供的列表中\r
+int PlayersListGroup::GetAllFiles(std::list<PlayerCaseInfo> &playersList)\r
+{\r
+    int ret;\r
+    int i{0};\r
+    struct dirent *direntp;\r
+    struct PlayerCaseInfo playerCaseInfo;\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::GetAllFiles");\r
+    // 打开目录\r
+    DIR *dirp = opendir(APP_MUSIC_PATH);\r
+    // 遍历文件\r
+    if (dirp != NULL) {\r
+        while ((direntp = readdir(dirp)) != NULL) {\r
+            ret = memcpy_s(playerCaseInfo.sliceId, DEC_NUM_256, direntp->d_name, DEC_NUM_256);\r
+            if (ret != OHOS_SUCCESS) {\r
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "memcpy_s err %d.", ret);\r
+                closedir(dirp);\r
+                return OHOS_FAILURE;\r
+            }\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "song Name %s.", playerCaseInfo.sliceId);\r
+            playerCaseInfo.index = i;\r
+            i++;\r
+            playersList.push_back(playerCaseInfo);\r
+        }\r
+    } else {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::opendir err!");\r
+        return OHOS_FAILURE;\r
+    }\r
+    // 关闭目录\r
+    closedir(dirp);\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::GetAllFiles end!");\r
+    return OHOS_SUCCESS;\r
+}\r
+\r
 ButtonOnClickListener::~ButtonOnClickListener()\r
 {\r
-    delete volumeSettingView;\r
-    volumeSettingView = nullptr;\r
 }\r
 \r
 /*播放或暂停按钮被点击时调用*/\r
index 500767d..7dfc124 100644 (file)
@@ -255,11 +255,14 @@ namespace OHOS
         musicListScrollView->SetReboundSize(35);\r
         musicListScrollView->SetDirection(UIScrollView::VERTICAL);\r
         /* -------------------------------------------------------------------------- */\r
-        musicListTitle = new UILabelExt();\r
         if (musicListTitle == nullptr)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicListTitle new fail");\r
-            return nullptr;\r
+            musicListTitle = new UILabelExt();\r
+            if (musicListTitle == nullptr)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicListTitle new fail");\r
+                return nullptr;\r
+            }\r
         }\r
         musicListTitle->SetPosition(83, 50, 300, 35);\r
         musicListTitle->SetStyle(STYLE_TEXT_FONT, 30);\r
@@ -269,6 +272,42 @@ namespace OHOS
         musicListTitle->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
         musicListTitle->SetRollSpeed(70);\r
         musicListTitle->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+        /* -------------------------- musicListIsEmptyImage ------------------------- */\r
+        if (musicListIsEmptyImage == nullptr)\r
+        {\r
+            musicListIsEmptyImage = new UIImageView();\r
+            if (musicListIsEmptyImage == nullptr)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicListIsEmptyImage new fail");\r
+                return nullptr;\r
+            }\r
+        }\r
+        musicListIsEmptyImage->SetPosition(163, 110, 140, 140);\r
+        musicListIsEmptyImage->SetAutoEnable(false);\r
+        musicListIsEmptyImage->SetResizeMode(UIImageView::CENTER);\r
+        if (LoadPlayerImage(musicListIsEmptyImage, PLAYER_PLAYING_GLARY) == false)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicListIsEmptyImage LoadPlayerImage fail");\r
+            return nullptr;\r
+        }\r
+        /* ---------------------------- musicListIsEmptyLabel ---------------------------- */\r
+        if (musicListIsEmptyLabel == nullptr)\r
+        {\r
+            musicListIsEmptyLabel = new UILabelExt();\r
+            if (musicListIsEmptyLabel == nullptr)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicListIsEmptyLabel new fail");\r
+                return nullptr;\r
+            }\r
+        }\r
+        musicListIsEmptyLabel->SetPosition(53, 280, 360, 70);\r
+        musicListIsEmptyLabel->SetStyle(STYLE_TEXT_FONT, 30);\r
+        musicListIsEmptyLabel->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+        musicListIsEmptyLabel->SetTextId(STR_MUSIC_LIST_IS_EMPTY); // 当前音乐列表为空请通过APP下载添加\r
+        musicListIsEmptyLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+        musicListIsEmptyLabel->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));\r
+        musicListIsEmptyLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+        musicListIsEmptyLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
         /* -------------------------------------------------------------------------- */\r
         if (musicAdapter == nullptr)\r
         {\r
@@ -301,16 +340,20 @@ namespace OHOS
             musicList->SetAdapter(musicAdapter);\r
         }\r
         musicListScrollView->Add(musicListTitle);\r
+        musicListScrollView->Add(musicListIsEmptyImage);\r
+        musicListScrollView->Add(musicListIsEmptyLabel);\r
         musicListScrollView->Add(musicList);\r
         musicListGroupView->Add(musicListScrollView);\r
         /* -------------------------------------------------------------------------- */\r
+        UpdateMusicListStatus(); // 音乐列表刷新\r
+        /* -------------------------------------------------------------------------- */\r
         return musicListGroupView;\r
     }\r
 \r
     /*删除容器上所有组件*/\r
     void PlayersView::ClearAll(void)\r
     {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::ClearAll");\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::ClearAll");\r
         if (group[MAIN_MUSICPLAYER_VIEW] != nullptr)\r
         {\r
             group[MAIN_MUSICPLAYER_VIEW]->RemoveAll();\r
@@ -403,6 +446,19 @@ namespace OHOS
                     delete musicListTitle;\r
                     musicListTitle = nullptr;\r
                 }\r
+                if (musicListIsEmptyImage != nullptr)\r
+                {\r
+                    ImageInfo *image = nullptr;\r
+                    musicListIsEmptyImage->SetSrc(image);\r
+                    delete musicListIsEmptyImage;\r
+                    musicListIsEmptyImage = nullptr;\r
+                    ImageCacheManager::GetInstance().UnloadOneInMultiRes(PLAYER_PLAYING_GLARY, PLAYER_IAMGES);\r
+                }\r
+                if (musicListIsEmptyLabel != nullptr)\r
+                {\r
+                    delete musicListIsEmptyLabel;\r
+                    musicListIsEmptyLabel = nullptr;\r
+                }\r
                 if (musicAdapter != nullptr)\r
                 {\r
                     delete musicAdapter;\r
@@ -439,6 +495,7 @@ namespace OHOS
         {\r
             group[i] = nullptr;\r
         }\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::ClearAll end");\r
     }\r
 \r
     UIButton *PlayersView::PlayerViewButtonInit(ButtonConfig &buttonconfig)\r
@@ -677,6 +734,7 @@ namespace OHOS
         return true;\r
     }\r
 \r
+    /*创建音乐播放器主视图*/\r
     bool PlayersView::CreatePlayerView(void)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::CreatePlayerVIew");\r
@@ -707,52 +765,73 @@ namespace OHOS
     /*设置音乐来源标签内容*/\r
     void PlayersView::MusicSourceLabelSetText(int textId)\r
     {\r
-        MusciSourceLabel->SetTextId(textId);\r
-        MusciSourceLabel->ForceResetText();\r
+        if (MusciSourceLabel)\r
+        {\r
+            MusciSourceLabel->SetTextId(textId);\r
+            MusciSourceLabel->ForceResetText();\r
+        }\r
     }\r
 \r
     /// @brief 设置手机音乐连接状态标签内容\r
     void PlayersView::PhoneMusicConnectStatusLabelSetText(int textId)\r
     {\r
-        PhoneMusicConnectStatusLabel->SetTextId(textId);\r
-        PhoneMusicConnectStatusLabel->Invalidate();\r
+        if (PhoneMusicConnectStatusLabel)\r
+        {\r
+            PhoneMusicConnectStatusLabel->SetTextId(textId);\r
+            PhoneMusicConnectStatusLabel->Invalidate();\r
+        }\r
     }\r
 \r
     /// @brief 设置手机连接状态标签是否可见\r
     void PlayersView::PhoneMusicConnectStatusLabelIsSetVisible(bool status)\r
     {\r
-        PhoneMusicConnectStatusLabel->SetVisible(status);\r
+        if (PhoneMusicConnectStatusLabel)\r
+        {\r
+            PhoneMusicConnectStatusLabel->SetVisible(status);\r
+        }\r
     }\r
 \r
     // 设置手机音乐连接状态标签颜色\r
     void PlayersView::PhoneMusicConnectStatusLabelColor(bool state)\r
     {\r
-        if (state)\r
-        {\r
-            PhoneMusicConnectStatusLabel->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));\r
-        }\r
-        else\r
+        if (PhoneMusicConnectStatusLabel)\r
         {\r
-            PhoneMusicConnectStatusLabel->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff));\r
+            if (state)\r
+            {\r
+                PhoneMusicConnectStatusLabel->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));\r
+            }\r
+            else\r
+            {\r
+                PhoneMusicConnectStatusLabel->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff));\r
+            }\r
         }\r
     }\r
 \r
     /*设置音乐列表按钮是否可见*/\r
     void PlayersView::MusicListButtonIsSetVisible(bool status)\r
     {\r
-        music_list_button->SetVisible(status);\r
+        if (music_list_button)\r
+        {\r
+            music_list_button->SetVisible(status);\r
+        }\r
     }\r
 \r
     /// @brief 设置选项按钮的图片样式:点击该按钮后进入音乐来源视图,点击里面的按钮,改选项按钮会被替换相应图片\r
     void PlayersView::OptionsButtonSetImageStyle(ImageInfo *image)\r
     {\r
-        musicSourceButton->SetImageSrc(image, image);\r
-        musicSourceButton->Invalidate();\r
+        if (musicSourceButton)\r
+        {\r
+            musicSourceButton->SetImageSrc(image, image);\r
+            musicSourceButton->Invalidate();\r
+        }\r
     }\r
 \r
     void PlayersView::PlayerModelButtonSetSrc(uint32_t playMode)\r
     {\r
-        LoadPlayerButtonImage(playerModelButton, playMode);\r
+        if (playerModelButton)\r
+        {\r
+            LoadPlayerButtonImage(playerModelButton, playMode);\r
+        }\r
     }\r
 \r
     /// @brief 设置音乐播放按钮是否可点击\r
@@ -767,6 +846,7 @@ namespace OHOS
         play_or_pause_Button->SetTouchable(touchableState);\r
         preMusicButton->SetTouchable(touchableState);\r
         nextMusicButton->SetTouchable(touchableState);\r
+        soundButton->SetTouchable(touchableState);\r
         playerModelButton->SetTouchable(touchableState); // 如果音乐来源为手机音乐,播放顺序按钮就不可用\r
         /* -------------------------------------------------------------------------- */\r
         /*暂停音乐*/\r
@@ -775,11 +855,34 @@ namespace OHOS
         if (state == UICheckBox::UICheckBoxState::SELECTED)\r
         {\r
             PlayersModel::GetInstance()->PlayerStop();\r
+            PlayersModel::GetInstance()->ClearActivateAudioInterrupt();\r
         }\r
         /* -------------------------------------------------------------------------- */\r
         PreLoadPlayerModeImageRes();\r
     }\r
 \r
+    void PlayersView::UpdateMusicListStatus(void)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::UpdateMusicListStatus");\r
+        if (musicAdapter && musicListIsEmptyImage && musicListIsEmptyLabel && musicList)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "musicNum = %d", musicAdapter->GetCount());\r
+            if (0 == musicAdapter->GetCount()) /*歌曲为空*/\r
+            {\r
+                musicListIsEmptyImage->SetVisible(true);\r
+                musicListIsEmptyLabel->SetVisible(true);\r
+                musicList->SetVisible(false);\r
+            }\r
+            else\r
+            {\r
+                musicListIsEmptyImage->SetVisible(false);\r
+                musicListIsEmptyLabel->SetVisible(false);\r
+                musicList->SetVisible(true);\r
+            }\r
+        }\r
+    }\r
+\r
+    /*刷新播放器界面的组件状态*/\r
     void PlayersView::UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdatePlayerView");\r
@@ -825,6 +928,7 @@ namespace OHOS
             OptionsButtonSetImageStyle(image);\r
             PhoneMusicConnectStatusLabelIsSetVisible(false);\r
             MusicListButtonIsSetVisible(true);\r
+\r
             MusicSourceLabelSetText(STR_WATCH_MUSIC); /*手表音乐*/\r
             SetMusicPlayerButtonIsTouchable(musicSourceType);\r
         }\r
@@ -882,9 +986,9 @@ namespace OHOS
     {\r
         std::string file = PLAYER_IAMGES;\r
         ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
-        if (image == nullptr)\r
+        if (view == nullptr || image == nullptr)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::LoadPlayerImage %x fail", resId);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view is nullptr or PlayersView::LoadPlayerImage %x fail", resId);\r
             return false;\r
         }\r
         view->SetSrc(image);\r
@@ -896,9 +1000,9 @@ namespace OHOS
     {\r
         std::string file = PLAYER_IAMGES;\r
         ImageInfo *image = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
-        if (image == nullptr)\r
+        if (button == nullptr || image == nullptr)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::LoadPlayerImage %x fail", resId);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button is nullptr or PlayersView::LoadPlayerImage %x fail", resId);\r
             return false;\r
         }\r
         button->SetImageSrc(image, image);\r
@@ -910,9 +1014,9 @@ namespace OHOS
         std::string file = PLAYER_IAMGES;\r
         ImageInfo *image1 = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file);\r
         ImageInfo *image2 = ImageCacheManager::GetInstance().LoadOneInMultiRes(hlResId, file);\r
-        if (image1 == nullptr || image2 == nullptr)\r
+        if (button == nullptr || image1 == nullptr || image2 == nullptr)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::LoadPlayerImage resId = %x,hlResId = %x fail", resId, hlResId);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button is nullptr or PlayersView::LoadPlayerImage resId = %x,hlResId = %x fail", resId, hlResId);\r
             return false;\r
         }\r
         button->SetImages(image1, image2);\r
index 64eba7b..ae30033 100644 (file)
@@ -8,7 +8,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-12 11:44:04
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-08-10 10:16:48
+ * @LastEditTime: 2024-08-13 11:06:07
  * @FilePath: /FD230/code/sdk/application/wearable/nativeapp/nativeui/uiservice/include/ui_service.h
  */
 /*
@@ -74,6 +74,7 @@ typedef enum {
     UI_UPDATE_VIBRATION_MODE,   //更新震动模式  
     UI_UPDATE_SILENT_MODE,      //更新静音模式
     UI_UPDATE_DNOTDISTURB_MODE, //更新勿扰模式
+    UI_UPDATE_MUSIC_PLAYER_LIST,//更新音乐列表
 
     UI_UPDATE_WEATHER_DATA,     //天气数据更新
     UI_UPDATE_SLEEP_DATA,       //更新睡眠数据
index 2ed316c..2144a50 100644 (file)
@@ -21,6 +21,7 @@
 #include "rebootandshutdown/include/RebootAndShutdownModel.h"
 #include "dnotdisturb/include/DnotDisturbModel.h"
 #include "obumessage/include/OBUMessageModel.h"
+#include "player/include/PlayersModel.h"
 #include "sleep/include/SleepModel.h"
 #include "message/include/MessageModel.h"
 #include "aivoice/include/AiVoiceModel.h"
@@ -108,6 +109,7 @@ static void HandleUpdateCallVolume(Request *request);
 static void HandleUpdateVibrationMode(Request *request);
 static void HandleUpdateSilentMode(Request *request);
 static void HandleUpdateDontDisturbMode(Request *request);
+static void HandleUpdateMusicPlayerList(Request *request);
 static void HandleAiJumpToResultView(Request *request);
 static void HandleAiJumpToListeningMessage(Request *request);
 static void HandleUpdateUserQuestionStr(Request *request);
@@ -142,6 +144,7 @@ MsgHandlerEntry msgHandlers[] = {
     {UI_UPDATE_VIBRATION_MODE, HandleUpdateVibrationMode},
     {UI_UPDATE_SILENT_MODE, HandleUpdateSilentMode},
     {UI_UPDATE_DNOTDISTURB_MODE,HandleUpdateDontDisturbMode},
+    {UI_UPDATE_MUSIC_PLAYER_LIST,HandleUpdateMusicPlayerList},
     {UI_AI_JUMP_TO_RESULT_VIEW, HandleAiJumpToResultView},
     {UI_UPDATE_USER_QUESTION_STR,HandleUpdateUserQuestionStr},
     {UI_UPDATE_AI_ANSWER_STR, HandleUpdateAIAnswerStr},
@@ -543,6 +546,14 @@ void HandleUpdateDontDisturbMode(Request *request)
         std::bind(&OHOS::DnotDisturbModel::UpdateDoNotDisturbMode, &OHOS::DnotDisturbModel::GetInstance()));
 }
 
+//处理更新音乐列表
+void HandleUpdateMusicPlayerList(Request *request)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMusicPlayerList");
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::PlayersModel::UpdateMusicPlayerList, OHOS::PlayersModel::GetInstance()));
+}
+
 //处理Ai回应的用户数据
 void HandleAiJumpToResultView(Request *request)
 {
index cfcbd09..2d40727 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang differ
index c2a32b0..7a74b5d 100644 (file)
@@ -516,7 +516,10 @@ enum UIResourceTextId : uint16_t {
     STR_DISTURBNOTE_OFF = 503,\r
     STR_4G_NOTE = 504,\r
     STR_MUSIC_PLAYER_SOURCE_NOTE = 505,\r
-    STR_MAX_ID = 506,\r
+    STR_MUSIC_LIST_IS_EMPTY = 506,\r
+    STR_BT_HEADSET_RESCAN = 507,\r
+    STR_BT_HEADSET_NOFOND = 508,\r
+    STR_MAX_ID = 509,\r
 }; // UIResourceTextId\r
 
 enum FontLanguageId : uint8_t {
index a5c590b..6ec39cf 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/zh.lang and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/zh.lang differ
index cae2583..ee0611c 100644 (file)
@@ -503,4 +503,7 @@ STR_TONGYI_QIANWEN$Tongyi Qianwen
 STR_IFLYTEK_SPARK$Xunfei Spark\r
 STR_DISTURBNOTE_OFF$Do not disturb mode is enabled or disabled\r
 STR_4G_NOTE$Note: After opening, the power consumption of the watch will be increased and the standby time will be shortened\r
-STR_MUSIC_PLAYER_SOURCE_NOTE$Please enter Music - Music Source from the watch app interface, set it to Mobile Mode and try again
\ No newline at end of file
+STR_MUSIC_PLAYER_SOURCE_NOTE$Please enter Music - Music Source from the watch app interface, set it to Mobile Mode and try again\r
+STR_MUSIC_LIST_IS_EMPTY$The current music list is empty, please download and add via APP\r
+STR_BT_HEADSET_RESCAN$Rescan\r
+STR_BT_HEADSET_NOFOND$No headset Bluetooth device can be found
\ No newline at end of file
index dec6098..fe74323 100644 (file)
@@ -503,4 +503,7 @@ STR_TONGYI_QIANWEN$通义千问
 STR_IFLYTEK_SPARK$讯飞星火\r
 STR_DISTURBNOTE_OFF$勿扰模式已开启是否关闭\r
 STR_4G_NOTE$注:开启后,手表功耗会提高,待机时间会缩短\r
-STR_MUSIC_PLAYER_SOURCE_NOTE$请从手表端应用界面进入“音乐”-“音乐来源”,设置为“手机模式”后重试
\ No newline at end of file
+STR_MUSIC_PLAYER_SOURCE_NOTE$请从手表端应用界面进入“音乐”-“音乐来源”,设置为“手机模式”后重试\r
+STR_MUSIC_LIST_IS_EMPTY$当前音乐列表为空请通过APP下载添加\r
+STR_BT_HEADSET_RESCAN$重新搜索\r
+STR_BT_HEADSET_NOFOND$当前搜索不到耳机蓝牙设备
\ No newline at end of file
index 99d5eb6..11c50ce 100644 (file)
        <lanstr id="STR_DISTURBNOTE_OFF" value="Do not disturb mode is enabled or disabled"/>
        <lanstr id="STR_4G_NOTE" value="Note: After opening, the power consumption of the watch will be increased and the standby time will be shortened"/>
        <lanstr id="STR_MUSIC_PLAYER_SOURCE_NOTE" value="Please enter Music - Music Source from the watch app interface, set it to Mobile Mode and try again"/>
+       <lanstr id="STR_MUSIC_LIST_IS_EMPTY" value="The current music list is empty, please download and add via APP"/>
+       <lanstr id="STR_BT_HEADSET_RESCAN" value="Rescan"/>
+       <lanstr id="STR_BT_HEADSET_NOFOND" value="No headset Bluetooth device can be found"/>
 </language>
index 70a0eba..2b70d68 100644 (file)
        <lanstr id="STR_DISTURBNOTE_OFF" value="勿扰模式已开启是否关闭"/>
        <lanstr id="STR_4G_NOTE" value="注:开启后,手表功耗会提高,待机时间会缩短"/>
        <lanstr id="STR_MUSIC_PLAYER_SOURCE_NOTE" value="请从手表端应用界面进入“音乐”-“音乐来源”,设置为“手机模式”后重试"/>
+       <lanstr id="STR_MUSIC_LIST_IS_EMPTY" value="当前音乐列表为空请通过APP下载添加"/>
+       <lanstr id="STR_BT_HEADSET_RESCAN" value="重新搜索"/>
+       <lanstr id="STR_BT_HEADSET_NOFOND" value="当前搜索不到耳机蓝牙设备"/>
 </language>
index cfcbd09..2d40727 100644 (file)
Binary files a/tools/language_tool/font/en.lang and b/tools/language_tool/font/en.lang differ
index c2a32b0..7a74b5d 100644 (file)
@@ -516,7 +516,10 @@ enum UIResourceTextId : uint16_t {
     STR_DISTURBNOTE_OFF = 503,\r
     STR_4G_NOTE = 504,\r
     STR_MUSIC_PLAYER_SOURCE_NOTE = 505,\r
-    STR_MAX_ID = 506,\r
+    STR_MUSIC_LIST_IS_EMPTY = 506,\r
+    STR_BT_HEADSET_RESCAN = 507,\r
+    STR_BT_HEADSET_NOFOND = 508,\r
+    STR_MAX_ID = 509,\r
 }; // UIResourceTextId\r
 
 enum FontLanguageId : uint8_t {
index a5c590b..6ec39cf 100644 (file)
Binary files a/tools/language_tool/font/zh.lang and b/tools/language_tool/font/zh.lang differ