修复自定义视频表盘的显示问题 1955/1 1955/head 1956/target/1
authorCaisking <Casiking@zhihuishixun.com>
Fri, 11 Jul 2025 09:13:50 +0000 (17:13 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Fri, 11 Jul 2025 09:13:50 +0000 (17:13 +0800)
code/sdk/application/wearable/fd230app/nativeui/clock/include/MainClockView.h
code/sdk/application/wearable/fd230app/nativeui/clock/src/MainClockView.cpp
code/sdk/application/wearable/fd230app/nativeui/system/src/SystemLogModel.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c

index dccf3b9..42c99fe 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef MAIN_CLOCK_VIEW_H
 #define MAIN_CLOCK_VIEW_H
 
+#include <cstdint>
 #include <string>
 #include "View.h"
 #include "components/ui_view_group.h"
@@ -169,6 +170,7 @@ namespace OHOS
         int64_t color_ = Color::White().full;                     // 电量颜色
         int32_t power_ = 101;                                     // 电量
         bool isBatteryIconVisible{false};                         // 电池暂停
+        uint8_t custom_id = 0;
     };
 } // namespace OHOS
 #endif // MAIN_CLOCK_VIEW_H
index 6f374d4..15bef02 100644 (file)
@@ -171,17 +171,20 @@ namespace OHOS
         if (Id == DIAL_CLOCK || Id > DIAL_MAX)
             return;
 
+        //赋值id
+        custom_id = Id;
+
         DialLayout dialconfig;
-        if (SetDialModel::GetInstance().loadDialConfig(Id, dialconfig))
+        if (SetDialModel::GetInstance().loadDialConfig(custom_id, dialconfig))
         {
             // 设置背景 Id == 2(实际是1) 视频表盘
             if(Id == 2)
             {
-                dialFile = SetDialModel::GetInstance().GetSaveDir(Id) + "/" + "main_bg.mp4";
+                dialFile = SetDialModel::GetInstance().GetSaveDir(custom_id) + "/" + "main_bg.mp4";
             }
             else // 图片表盘
             {
-                dialFile = SetDialModel::GetInstance().GetSaveDir(Id) + "/" + "main_bg.bin";
+                dialFile = SetDialModel::GetInstance().GetSaveDir(custom_id) + "/" + "main_bg.bin";
             }
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dialFile is %s", dialFile.c_str());
 
@@ -255,9 +258,19 @@ namespace OHOS
 
             videoPlayer_ = new DialVideoView();
             videoPlayer_->SetPosition(0 ,0,466, 466);
-            videoPlayer_->SetSurfaceColorkey(Color::White());
+            videoPlayer_->SetSurfaceColorkey(Color::GetColorFromRGBA(0xff,0x21,0x23,0x24));
             videoPlayer_->SetVideoRes(fp, 0);
-           
+            //阅览帧 preview.bin
+            std::string preview_img = SetDialModel::GetInstance().GetSaveDir(custom_id) + "/" + "preview.bin";
+            ImageInfo *image = ImageCacheManager::GetInstance().LoadSingleRes(preview_img.c_str(), false);
+            if (image != nullptr) {
+                videoPlayer_->SetPreview(image);
+            }
+            else
+            {
+              WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam loadimage %s fail", preview_img.c_str());
+              return false;
+            }
             Add(videoPlayer_);
             return true;
         } else {
@@ -945,14 +958,18 @@ namespace OHOS
 
     void MainClockView::OnActive(void)
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnActive");
         if (videoPlayer_ != nullptr)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnActive videoPlayer_");
             if (videoPlayer_->IsPaused())
             {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnActive videoPlayer_ resume");
                 videoPlayer_->ResumePlay();
             }
             else if (!videoPlayer_->IsPlayed())
             {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnActive videoPlayer_ start");
                 videoPlayer_->StartPlay();
             }
         }
@@ -960,10 +977,13 @@ namespace OHOS
 
     void MainClockView::OnInactive(void)
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnInactive");
         if (videoPlayer_ != nullptr)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnInactive videoPlayer_");
             if (!videoPlayer_->IsStopped())
             {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnInactive videoPlayer_ stop");
                 videoPlayer_->StopPlay();
             }
         }
index 36fc33a..c6a27e7 100644 (file)
@@ -283,9 +283,9 @@ bool SystemLogModel::canSyncFile(std::string path, uint32_t path_max_size,
                                  uint32_t download_size) {
   // 获取文件夹的大小
   long long usedSpace = getFolderSize(path.c_str());
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "usedSpace = %lld", usedSpace);
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "path_max_size = %lld", path_max_size);
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "download_size = %lld", download_size);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "usedSpace = %lld", usedSpace);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "path_max_size = %lld", path_max_size);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "download_size = %lld", download_size);
 
   return (usedSpace + download_size) <= path_max_size;
 }
index 0977143..d56d6e2 100644 (file)
@@ -7487,99 +7487,125 @@ errcode_t decode_single_dial_info(ble_read_data *buffer_handle)
 }\r
 static errcode_t install_dial(void)\r
 {\r
-    char *lzmapkgname =uapi_dev_runtime_get_dialname();\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"install %s\n",lzmapkgname);\r
-    char *lzmaindex = strstr(lzmapkgname,".lzma");\r
-    if (lzmaindex != NULL)\r
-    {\r
-        struct stat info;\r
-        if (stat(get_dial_path(), &info) != 0)\r
-        {\r
-            if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)\r
-            {\r
-                return ERRCODE_FAIL; // \r
-            }\r
-        }\r
+    char *lzmapkgname = uapi_dev_runtime_get_dialname();\r
+    // 增加初始参数校验打印\r
+    if (lzmapkgname == NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname);\r
 \r
-        char dial_basename[64]={0};\r
-        int dial_basenamelen =  (lzmaindex - lzmapkgname);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dial_basenamelen %d\n",dial_basenamelen);\r
-        if (dial_basenamelen>0 )\r
-        {\r
-            memcpy_s(dial_basename,sizeof(dial_basename),lzmapkgname,dial_basenamelen);\r
-        }\r
-        else{\r
+    // 检查是否为lzma格式包\r
+    char *lzmaindex = strstr(lzmapkgname, ".lzma");\r
+    if (lzmaindex == NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    // 创建表盘目录(若不存在)\r
+    struct stat info;\r
+    if (stat(get_dial_path(), &info) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n");\r
+        if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n");\r
             return ERRCODE_FAIL;\r
         }\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dial_basename %s\n",dial_basename);\r
-        char dialbin_filepath[128]={0};\r
-        if(ble_dial_uid>5)\r
-        {\r
-            if (get_dial_file_path(dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
-            {\r
-                return ERRCODE_FAIL;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            if (get_custom_dial_file_path(ble_dial_uid,dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
-            {\r
-                return ERRCODE_FAIL;\r
-            }\r
-        }\r
-       \r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n");\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n");\r
+    }\r
 \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dialbin_filepath %s\n",dialbin_filepath);\r
-        char lzma_filepath[128]={0};\r
-        if (get_file_recv_file_path(lzmapkgname,strlen(lzmapkgname),lzma_filepath,sizeof(lzma_filepath)) != ERRCODE_SUCC)\r
-        {\r
+    // 解析表盘基础名称(去除.lzma后缀)\r
+    char dial_basename[64] = {0};\r
+    int dial_basenamelen = lzmaindex - lzmapkgname;\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen);\r
+    if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen);\r
+        return ERRCODE_FAIL;\r
+    }\r
+    memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename);\r
+\r
+    // 确定解压后bin文件路径\r
+    char dialbin_filepath[128] = {0};\r
+    if (ble_dial_uid > 5) {\r
+        if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+    } else {\r
+        if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n");\r
             return ERRCODE_FAIL;\r
         }\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lzma_filepath %s\n",lzma_filepath);\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath);\r
 \r
-        errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath,dialbin_filepath);\r
+    // 确定源lzma文件路径\r
+    char lzma_filepath[128] = {0};\r
+    if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath);\r
 \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode %s to %s , ret %X \n",lzma_filepath,dialbin_filepath, ret);\r
+    // 执行解压操作\r
+    errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, \r
+                 (ret == ERRCODE_SUCC) ? "成功" : "失败");\r
 \r
-        char *namebuf= strtok(lzmapkgname,".");\r
+    // 关键:检查解压后bin文件是否存在及大小\r
+    struct stat bin_info;\r
+    if (stat(dialbin_filepath, &bin_info) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath);\r
+        ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败\r
+    } else {\r
+        if (bin_info.st_size <= 0) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size);\r
+            ret = ERRCODE_FAIL; // 大小为空视为失败\r
+        } else {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size);\r
+        }\r
+    }\r
 \r
-        if(ble_dial_uid>5)\r
-        {\r
-            install_Register_dial(namebuf,ble_dial_uid);\r
+    // 若解压失败,直接返回\r
+    if (ret != ERRCODE_SUCC) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n");\r
+        return ret;\r
+    }\r
 \r
+    // 注册并设置表盘\r
+    char *namebuf = strtok(lzmapkgname, ".");\r
+    if (ble_dial_uid > 5) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid);\r
+        install_Register_dial(namebuf, ble_dial_uid);\r
+        ble_set_dial_by_id(ble_dial_uid);\r
+    } else {\r
+        if (ble_dial_file_index == ble_dial_file_count) {\r
+            char name_str[32] = {0};\r
+            ble_get_custom_dial(ble_dial_uid, name_str);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid);\r
+            install_Register_dial(name_str, ble_dial_uid);\r
             ble_set_dial_by_id(ble_dial_uid);\r
-\r
-        }\r
-        else\r
-        {\r
-            if(ble_dial_file_index==ble_dial_file_count)\r
-            {\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"自定义表盘安装完毕\r\n");\r
-                char name_str[32]={0};\r
-                ble_get_custom_dial(ble_dial_uid,name_str);\r
-                install_Register_dial(name_str,ble_dial_uid);\r
-                ble_set_dial_by_id(ble_dial_uid);\r
-            }\r
-     \r
+        } else {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", \r
+                         ble_dial_file_index, ble_dial_file_count);\r
         }\r
-        \r
-       \r
-        //安装完后删除表盘\r
-         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"remove  %s\r\n",lzma_filepath);\r
-\r
-        if(0!=remove(lzma_filepath))\r
-        return ERRCODE_FAIL;\r
+    }\r
 \r
-        if ( ret == ERRCODE_SUCC)\r
-            return ERRCODE_SUCC;\r
-        else\r
-            return ERRCODE_FAIL;\r
-    }else{\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,".lzma not found\n");\r
-        return ERRCODE_FAIL;\r
+    // 删除源lzma文件\r
+    #if 1\r
+    if (remove(lzma_filepath) != 0) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath);\r
+        // 此处不返回失败,仅警告,因为核心安装已完成\r
+    } else {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n");\r
     }\r
-}\r
+    #endif\r
 \r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n");\r
+    return ERRCODE_SUCC;\r
+}\r
 static char file_name[128]={0};\r
 static uint32_t file_size=0;\r
 \r