安全模式:优化资源校验列表显示
authorCaisking <3449750381@qq.com>
Thu, 12 Sep 2024 12:09:53 +0000 (20:09 +0800)
committerCaisking <3449750381@qq.com>
Thu, 12 Sep 2024 12:09:53 +0000 (20:09 +0800)
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerView.h
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/ResourceCheckAdapter.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/ResourceCheckItemView.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/ResourceCheckView.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerView.cpp

index 4af1006..3a96170 100644 (file)
@@ -4,91 +4,98 @@
 #include "BaseView.h"
 #include "View.h"
 
-#include "components/ui_view_group.h"
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
 #include "components/ui_label.h"
 #include "components/ui_label_ext.h"
-#include "components/ui_image_view.h"
-#include "components/ui_button.h"
 #include "components/ui_scroll_view.h"
 #include "components/ui_toggle_button.h"
+#include "components/ui_view_group.h"
 
 #include "SafeModeManagerPresenter.h"
+#include "safemodemanager/include/RepairView.h"
 #include "safemodemanager/include/ResourceCheckView.h"
-namespace OHOS
-{
-    typedef enum
-    {
-        VIEW_SAFE_LIST,      // 安全模式列表
-        VIEW_BLE_OTA,        // BLE OTA 更新
-        VIEW_AUTO_OTA,       // 自动 OTA 更新
-        VIEW_FACTORY_RESET,  // 恢复出厂设置
-        VIEW_RESOURCE_CHECK, // 资源校验
-        MAX_VIEW_ID,         // 最大视图 ID
-    } SafeViewID;
-
-    class SafeModeManagerPresenter;
-    class ResourceCheckView;
-    class SafeModeManagerView : public View<SafeModeManagerPresenter>
-    {
-    public:
-        SafeModeManagerView();
-        virtual ~SafeModeManagerView();
-        static SafeModeManagerView *GetInstance(void);
-
-        void OnStart() override;
-        void OnSetUpView() override;
-        void OnTearDownView() override;
-        void OnStop() override;
-        void InitView();
-        void DeInit();
-
-        bool ClickFunc(int16_t interface);
-        bool CheckViewParam(int16_t hideView, int16_t showView);
-        void ChangeView(int16_t hideView, int16_t showView);
-
-        bool ChangeToSafeModelistView(int16_t thisView);
-        bool ChangeToBleOTAView(int16_t thisView);
-        bool ChangeToAutoOTAView(int16_t thisView);
-        bool ChangeToFactoryView(int16_t thisView);
-        bool ChangeToResourceCheckView(int16_t thisView);
-        UIScrollView *GetSafeScrollView(int ViewId);
-
-    private:
-        SafeModeManagerView *p_BleOTAView{nullptr};      // BleOTA
-        SafeModeManagerView *p_AutoOTAView{nullptr};     // 自动OTA
-        SafeModeManagerView *p_FactoryView{nullptr};     // 恢复出厂
-        ResourceCheckView *p_ResourceCheckView{nullptr}; // 资源校验
-
-    private:
-        SafeModeManagerView(SafeModeManagerView &&) = delete;
-        SafeModeManagerView &operator=(SafeModeManagerView &&) = delete;
-
-        // UI 组件
-        UILabelExt labelTitle_; // 标题标签
-
-        // 功能的背景图像
-        UIImageView backgroundBLE_;           // BLE OTA 背景图像
-        UIImageView backgroundAutoOTA_;       // Auto OTA 背景图像
-        UIImageView backgroundFactoryReset_;  // 恢复出厂设置背景图像
-        UIImageView backgroundResourceCheck_; // 资源校验背景图像
-        UIImageView backgroundRestart_;       // 重启背景图像
-
-        // 切换按钮
-        UIToggleButton btnBLE_;           // BLE OTA 切换按钮
-        UIToggleButton btnAutoOTA_;       // Auto OTA 切换按钮
-        UIToggleButton btnFactoryReset_;  // 恢复出厂设置切换按钮
-        UIToggleButton btnResourceCheck_; // 资源校验切换按钮
-        UIToggleButton btnRestart_;       // 重启切换按钮
-
-        // 标签显示功能状态
-        UILabelExt labelBLEStatus_;           // BLE OTA 状态标签
-        UILabelExt labelAutoOTAStatus_;       // Auto OTA 状态标签
-        UILabelExt labelFactoryResetStatus_;  // 恢复出厂设置状态标签
-        UILabelExt labelResourceCheckStatus_; // 资源校验状态标签
-        UILabelExt labelRestart_;             // 重启状态标签
-
-        UIScrollView *SafeModeScrollView[MAX_VIEW_ID]{nullptr};
-    };
+#include "safemodemanager/include/SafeModeManagerModel.h"
+
+namespace OHOS {
+typedef enum {
+  VIEW_SAFE_LIST,      // Safe Mode List
+  VIEW_BLE_OTA,        // BLE OTA Update
+  VIEW_AUTO_OTA,       // Automatic OTA Update
+  VIEW_FACTORY_RESET,  // Factory Reset
+  VIEW_RESOURCE_CHECK, // Resource Check
+  VIEW_REPAIR_FILE,    // File Repair
+  MAX_VIEW_ID,         // Maximum View ID
+} SafeViewID;
+
+class SafeModeManagerPresenter;
+class ResourceCheckView;
+
+class SafeModeManagerView : public View<SafeModeManagerPresenter> {
+public:
+  SafeModeManagerView();
+  virtual ~SafeModeManagerView();
+  static SafeModeManagerView *GetInstance(void);
+
+  void OnStart() override;
+  void OnSetUpView() override;
+  void OnTearDownView() override;
+  void OnStop() override;
+  void InitView();
+  void DeInit();
+
+  bool ClickFunc(int16_t interface);
+  bool CheckViewParam(int16_t hideView, int16_t showView);
+  void ChangeView(int16_t hideView, int16_t showView);
+
+  bool ChangeToSafeModelistView(int16_t thisView);
+  bool ChangeToBleOTAView(int16_t thisView);
+  bool ChangeToAutoOTAView(int16_t thisView);
+  bool ChangeToFactoryView(int16_t thisView);
+  bool ChangeToResourceCheckView(int16_t thisView);
+  bool ChangeToRepairView(int16_t thisView);
+  UIScrollView *GetSafeScrollView(int ViewId);
+
+  void UpdateToggleButState();
+  void UpdateButtonState(UIToggleButton button, Safe_State state);
+
+private:
+  SafeModeManagerView *p_BleOTAView{nullptr};      // BLE OTA View
+  SafeModeManagerView *p_AutoOTAView{nullptr};     // Automatic OTA View
+  SafeModeManagerView *p_FactoryView{nullptr};     // Factory Reset View
+  ResourceCheckView *p_ResourceCheckView{nullptr}; // Resource Check View
+  RepairView *p_RepairView{nullptr};               // File Repair View
+
+private:
+  SafeModeManagerView(SafeModeManagerView &&) = delete;
+  SafeModeManagerView &operator=(SafeModeManagerView &&) = delete;
+
+  // UI Components
+  UILabelExt labelTitle_; // Title Label
+
+  // Background Images for Features
+  UIImageView backgroundBLE_;           // BLE OTA Background Image
+  UIImageView backgroundAutoOTA_;       // Auto OTA Background Image
+  UIImageView backgroundFactoryReset_;  // Factory Reset Background Image
+  UIImageView backgroundResourceCheck_; // Resource Check Background Image
+  UIImageView backgroundRestart_;       // Restart Background Image
+
+  // Toggle Buttons
+  UIToggleButton btnBLE_;           // BLE OTA Toggle Button
+  UIToggleButton btnAutoOTA_;       // Auto OTA Toggle Button
+  UIToggleButton btnFactoryReset_;  // Factory Reset Toggle Button
+  UIToggleButton btnResourceCheck_; // Resource Check Toggle Button
+  UIToggleButton btnRestart_;       // Restart Toggle Button
+
+  // Status Labels
+  UILabelExt labelBLEStatus_;           // BLE OTA Status Label
+  UILabelExt labelAutoOTAStatus_;       // Auto OTA Status Label
+  UILabelExt labelFactoryResetStatus_;  // Factory Reset Status Label
+  UILabelExt labelResourceCheckStatus_; // Resource Check Status Label
+  UILabelExt labelRestart_;             // Restart Status Label
+
+  UIScrollView *SafeModeScrollView[MAX_VIEW_ID]{nullptr};
+};
 } // namespace OHOS
 
 #endif // _SafeModeManager_VIEW_H
\ No newline at end of file
index 1c4f6da..01e3d2b 100644 (file)
@@ -1,5 +1,3 @@
-
-
 #include "safemodemanager/include/ResourceCheckItemView.h"
 #include "safemodemanager/include/ResourceCheckView.h"
 #include "safemodemanager/include/SafeModeManagerModel.h"
@@ -9,6 +7,7 @@
 #include "wearable_log.h"
 
 namespace OHOS {
+
 ResourceCheckAdapter::ResourceCheckAdapter() {}
 
 ResourceCheckAdapter::~ResourceCheckAdapter() { listData.clear(); }
@@ -19,16 +18,11 @@ void ResourceCheckAdapter::SetData(std::list<ResourceCheckItem> &data) {
   if (!listData.empty()) {
     listData.clear();
   }
-  std::list<ResourceCheckItem>::iterator it;
-  for (it = data.begin(); it != data.end(); it++) {
-    listData.push_back(*it);
+  for (auto &item : data) { // 使用范围for循环简化代码
+    listData.push_back(item);
   }
 }
 
-/// @brief
-/// @param inView 一个指向已存在的视图对象的指
-/// @param index 要创建的视图在列表中的索引l。
-/// @return 返回该视图对象
 UIView *ResourceCheckAdapter::GetView(UIView *inView, int16_t index) {
   // 1.先检查列表数据是否为空,若为空则返回空指针
   if (listData.empty()) {
@@ -38,11 +32,11 @@ UIView *ResourceCheckAdapter::GetView(UIView *inView, int16_t index) {
   if (index < 0) {
     return nullptr;
   }
-  // printf("GetView : index %d\r\n", index);
   // 3.检查是否超出列表数据大小,若超出则返回空指针
-  size_t uindex = index;
-  if (uindex > listData.size())
+  size_t uindex = static_cast<size_t>(index); // 明确转换为size_t
+  if (uindex > listData.size()) {
     return nullptr;
+  }
 
   ResourceCheckItemView *item = nullptr;
   if (uindex == listData.size()) {
@@ -50,38 +44,44 @@ UIView *ResourceCheckAdapter::GetView(UIView *inView, int16_t index) {
       item = new ResourceCheckItemView();
     } else {
       item = static_cast<ResourceCheckItemView *>(inView);
-      // item->TearDownChild();
       item->RemoveAll();
     }
+
+    // Initialize DeleteButton lazily
     if (DeleteButton == nullptr) {
       DeleteButton = new UILabelButtonExt();
       if (DeleteButton == nullptr) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitButtonExt is error");
-        return nullptr; // 内存分配失败,返回false
+        return nullptr; // 内存分配失败,返回nullptr
       }
       DeleteButton->SetPosition(0, 0);
       DeleteButton->Resize(380, 100);
-      DeleteButton->SetViewId("repair_all");
+      DeleteButton->SetViewId(REPAIR_ALL);
       DeleteButton->SetText("repair_all");
       DeleteButton->SetStyle(STYLE_TEXT_FONT, 30);
       DeleteButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-      DeleteButton->SetStyle(STYLE_BACKGROUND_COLOR, STYLE_BACKGROUND_COLOR);
+      DeleteButton->SetStyle(STYLE_BACKGROUND_COLOR,
+                             Color::Green().full); // 确保设置一个有效的颜色值
       DeleteButton->SetVisible(true);
     }
-    DeleteButton->SetOnClickListener(itemClickListener);
+    // 设置点击事件监听器
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)
+        OHOS::SafeModeManagerPresenter::GetInstance();
+    DeleteButton->SetOnClickListener(clickListener);
+
     item->Add(DeleteButton);
     item->SetViewIndex(index);
     item->SetOnClickListener(nullptr);
 
     return item;
   }
-  // 4.通过迭代器访问列表中指定索引位置的元素,将其赋值给itemData变量
+
+  // 4.通过迭代器访问列表中指定索引位置的元素
   std::list<ResourceCheckItem>::iterator it = listData.begin();
-  for (int i = 0; i < index; i++) {
-    it++;
-  }
+  std::advance(it, index); // 使用 std::advance 简化迭代器变动
   ResourceCheckItem itemData = *it;
-  // 5.根据传入的inView参数是否已经存在一个视图对象,若为空则创建一个新的ResourceCheckItem对象,否则将inView转换成ResourceCheckItem类型的指针
+
+  // 5.根据传入的 inView 参数处理
   if (inView == nullptr) {
     item = new ResourceCheckItemView();
   } else {
@@ -92,10 +92,12 @@ UIView *ResourceCheckAdapter::GetView(UIView *inView, int16_t index) {
   item->SetItemInfo(itemData);
   item->SetViewIndex(index);
   item->SetOnClickListener(itemClickListener);
-  return item;
+
+  return item; // 结束 GetView 函数
 }
 
 void ResourceCheckAdapter::AddListItem(const ResourceCheckItem &item) {
   listData.push_back(item);
 }
-} // namespace OHOS
+
+} // namespace OHOS
\ No newline at end of file
index bb69a4c..7ed685c 100644 (file)
@@ -29,7 +29,7 @@ void ResourceCheckItemView::SetUpChild() {
   if (isSetupChild)
     return;
 
-  filenamelabel.SetPosition(0, 0, 466, 180);
+  filenamelabel.SetPosition(0, 0, 380, 120);
   filenamelabel.SetTextColor(Color::White());
   filenamelabel.SetFont(GILROY_BOLD_FONT, 30);
   filenamelabel.SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
index 9cbd151..fb31abb 100644 (file)
@@ -29,12 +29,20 @@ ResourceCheckView *ResourceCheckView::GetInstance() {
 }
 
 void ResourceCheckView::ClearAll() {
-  delete scrollView; // 删除滚动视图
-  scrollView = nullptr;
+
+  scrollView->RemoveAll();
+  FilenameList->RemoveAll();
+
   delete notelabel; // 删除提示标签
   notelabel = nullptr;
   delete FilenameList; // 删除提示标签
   FilenameList = nullptr;
+
+  delete scrollView; // 删除滚动视图
+  scrollView = nullptr;
+  delete p_ResourceCheckAdapter;
+  p_ResourceCheckAdapter = nullptr;
+  g_pResourceCheckView = nullptr;
 }
 
 UIScrollView *ResourceCheckView::ResourceCheckViewInit() {
@@ -112,8 +120,8 @@ void ResourceCheckView::InitFilenameList() {
   // 如果文件名列表未初始化则创建
   if (!FilenameList) {
     FilenameList = new UIList();
-    FilenameList->SetPosition(43, 120, 466, 466);
-    FilenameList->SetReboundSize(100);
+    FilenameList->SetPosition(43, 0, 466, 466);
+    // FilenameList->SetReboundSize(100);
     FilenameList->SetScrollBlankSize(50);
     FilenameList->SetThrowDrag(true);
     // FilenameList->SetScrollStateListener(this);
@@ -125,23 +133,37 @@ void ResourceCheckView::InitFilenameList() {
   }
 }
 
+//更新提示语
 void ResourceCheckView::UpdateView(int date) {
+  if (notelabel == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "ResourceCheckView::notelabel is null");
+    return;
+  }
   std::string display = "File verification";
-
   // 检查状态并更新提示文本
-  if (date == -1) {
-    notelabel->SetText("File verification error..."); // 保持为英语
-  } else if (date >= 0 && date <= 60) {
+  if (date >= 0 && date <= 60) {
     int progress = date % 5;
     display.append(progress, '.'); // 添加进度标记点
-  } else if (date == 61) {
-    notelabel->SetText("File verification is ok..."); // 保持为英语
-  } else {
-    notelabel->SetText("File verification is unknown..."); // 保持为英语
-  }
-  // 更新标签文本
-  if (date >= 0) {
     notelabel->SetText(display.c_str());
+  } else {
+    // 处理特定状态
+    switch (date) {
+    case 61:
+      notelabel->SetText("File verification is ok...");
+      break;
+    case -1:
+      //校验文件缺少
+      notelabel->SetText("File verification is not exsist...");
+      break;
+    case -2:
+      //校验文件失败
+      notelabel->SetText("File verification is failed...");
+      break;
+    default:
+      notelabel->SetText("Unknown status...");
+      break;
+    }
   }
 }
 
@@ -159,11 +181,13 @@ void ResourceCheckView::UpdateView() {
     notelabel->SetText(allFilenames.c_str());
     printf("验证的文件数量为 %d\r\n", num);
     if (num != 0) {
-      SafeModeManagerModel::GetInstance()->SetResourceCheckState(true);
+      SafeModeManagerModel::GetInstance()->SetState(Safe_State::RESOURCE_CHECK,
+                                                    true);
     }
   } else {
     notelabel->SetText("File verification is the same."); // 保持为英语
-    SafeModeManagerModel::GetInstance()->SetResourceCheckState(false);
+    SafeModeManagerModel::GetInstance()->SetState(Safe_State::RESOURCE_CHECK,
+                                                  false);
     printf("验证结果为失败。\r\n");
   }
   printf("验证结果已完成。\r\n");
@@ -174,12 +198,20 @@ void ResourceCheckView::AddFilenameToList(const ResourceCheckItem &item) {
 }
 
 void ResourceCheckView::SetViewState() {
+  //检查组件状态
   if (notelabel == nullptr || FilenameList == nullptr)
     return;
+
   int filenums = SafeModeManagerModel::GetInstance()->GetCheckFileCount();
   bool check_state =
-      SafeModeManagerModel::GetInstance()->GetResourceCheckState();
+      SafeModeManagerModel::GetInstance()->IsState(Safe_State::RESOURCE_CHECK);
   printf("filenums %d check_state %d \r\n", filenums, check_state);
+  /*
+    检查校验文件数量以及校验状态
+        如果校验是成功的话,则显示文件名列表
+        如果校验失败的话,则显示提示标签
+    校验成功之后,隐藏了提示标签则不能再次点击
+  */
   if (filenums != 0 && check_state) {
     notelabel->SetVisible(false);   // 隐藏提示标签
     FilenameList->SetVisible(true); // 显示文件名列表
@@ -193,14 +225,13 @@ void ResourceCheckView::SetViewState() {
     p_SafeModeManagerModel->InitFilenamesListItems();
     const ResourceCheckItem *itemInfo =
         p_SafeModeManagerModel->GetFilenamesListItems();
-    for (int i = 0; i < p_SafeModeManagerModel->GetFilenamesCount(); i++) {
+    int count = p_SafeModeManagerModel->GetFilenamesCount();
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "count %d", count);
+    for (int i = 0; i < count; i++) {
       AddFilenameToList(itemInfo[i]); // 将消息添加到视图中
-      FilenameList->SetAdapter(p_ResourceCheckAdapter);
-      SafeModeManagerModel::GetInstance()->SetResourceCheckState(false);
     }
-  } else {
-    FilenameList->SetVisible(false); // 隐藏文件名列表
-    notelabel->SetVisible(true);     // 显示提示标签
+    // 设置适配器
+    FilenameList->SetAdapter(p_ResourceCheckAdapter);
   }
 }
 
index a6c88ff..299800a 100644 (file)
@@ -8,6 +8,8 @@
 #include "ui_resource_string.h"
 
 #include "broadcast_service.h"
+
+#include "custom_runtime.h"
 #include "custom_utils.h"
 #include "gfx_utils/mem_check.h"
 #include "graphic_service.h"
@@ -71,6 +73,9 @@ bool SafeModeManagerPresenter::OnDrag(UIView &view, const DragEvent &event) {
         p_SafeModeManagerView->GetSafeScrollView(VIEW_RESOURCE_CHECK)) {
       p_SafeModeManagerView->ChangeView(VIEW_RESOURCE_CHECK, VIEW_SAFE_LIST);
     }
+    if (&view == p_SafeModeManagerView->GetSafeScrollView(VIEW_REPAIR_FILE)) {
+      p_SafeModeManagerView->ChangeView(VIEW_REPAIR_FILE, VIEW_RESOURCE_CHECK);
+    }
   }
   return true;
 }
@@ -100,8 +105,10 @@ bool SafeModeManagerPresenter::OnClick(UIView &view, const ClickEvent &event) {
   if (strcmp(view.GetViewId(), RESOURCE_CHECK) == 0) {
     /*资源校验*/
     p_SafeModeManagerView->ChangeView(VIEW_SAFE_LIST, VIEW_RESOURCE_CHECK);
-    if (SafeModeManagerModel::GetInstance()->GetResourceCheckState() == false)
+    if (SafeModeManagerModel::GetInstance()->IsState(
+            Safe_State::RESOURCE_CHECK) == false) {
       SafeModeManagerModel::GetInstance()->ResourceCheck();
+    }
   }
   if (strcmp(view.GetViewId(), RE_START) == 0) {
     /*重启*/
@@ -109,12 +116,110 @@ bool SafeModeManagerPresenter::OnClick(UIView &view, const ClickEvent &event) {
   }
   //点击查看列表
   if (strcmp(view.GetViewId(), CHECK_FILE_LIST) == 0) {
-    if (SafeModeManagerModel::GetInstance()->GetResourceCheckState() == true) {
+    if (SafeModeManagerModel::GetInstance()->IsState(
+            Safe_State::RESOURCE_CHECK) == true) {
       ResourceCheckView::GetInstance()->SetViewState();
     }
   }
+  // 点击修复
+  if (strcmp(view.GetViewId(), REPAIR_ALL) == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerPresenter::OnClick REPAIR_ALL");
+    /*修复 */
+    p_SafeModeManagerView->ChangeView(VIEW_RESOURCE_CHECK, VIEW_REPAIR_FILE);
+  }
+  if (strcmp(view.GetViewId(), REPAIR_FILE) == 0) {
+    if (SafeModeManagerModel::GetInstance()->IsState(Safe_State::REPAIR_FILE) ==
+            false &&
+        uapi_dev_runtime_get_repair_download_status() == 0) {
+      //将状态置为正在下载
+      uapi_dev_runtime_set_repair_download_status(1);
+      //开始修复
+      SafeModeManagerModel::GetInstance()->RepairFile();
+    }
+  }
   return true;
 }
+
+// 安全模式界面定时器
+void SafeModeManagerPresenter::OnTickEvent() {
+  // 开始校验文件
+  uint8_t check_state = uapi_dev_runtime_get_checkres_status();
+  switch (check_state) {
+  case CHECKING: {
+    // 处理正在校验的状态
+    time_t t = time(NULL);
+    tm curTime = *localtime(&t);
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::SafeModeManagerModel::UpdateCheckView,
+                  OHOS::SafeModeManagerModel::GetInstance(), curTime.tm_sec));
+    break;
+  }
+  case CHECK_SUCCESS: {
+    // 校验成功
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::SafeModeManagerModel::UpdateCheckView,
+                  OHOS::SafeModeManagerModel::GetInstance(), 61));
+    // 状态归位
+    uapi_dev_runtime_set_checkres_status(NO_OPERATION);
+    break;
+  }
+  case FILE_NOT_FOUND: {
+    // 校验失败: 文件不存在
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::SafeModeManagerModel::UpdateCheckView,
+                  OHOS::SafeModeManagerModel::GetInstance(), -1));
+    uapi_dev_runtime_set_checkres_status(NO_OPERATION);
+    break;
+  }
+  case FILE_CORRUPTED: {
+    // 校验失败: 文件损坏
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::SafeModeManagerModel::UpdateCheckView,
+                  OHOS::SafeModeManagerModel::GetInstance(), -2));
+    uapi_dev_runtime_set_checkres_status(NO_OPERATION);
+    break;
+  }
+  default:
+    break;
+  }
+  //下载状态
+  uint8_t download_state = uapi_dev_runtime_get_repair_download_status();
+  switch (download_state) {
+  case 1:
+    //下载中
+    {
+      time_t t = time(NULL);
+      tm curTime = *localtime(&t);
+      GraphicService::GetInstance()->PostGraphicEvent(
+          std::bind(&OHOS::SafeModeManagerModel::UpdateRepairView,
+                    OHOS::SafeModeManagerModel::GetInstance(), curTime.tm_sec));
+    }
+    break;
+  case 2:
+    //下载成功
+    {
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "download success");
+      GraphicService::GetInstance()->PostGraphicEvent(
+          std::bind(&OHOS::SafeModeManagerModel::UpdateRepairView,
+                    OHOS::SafeModeManagerModel::GetInstance(), 61));
+      uapi_dev_runtime_set_repair_download_status(0);
+    }
+    break;
+  case 3:
+    //下载失败
+    {
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "download failed");
+      GraphicService::GetInstance()->PostGraphicEvent(
+          std::bind(&OHOS::SafeModeManagerModel::UpdateRepairView,
+                    OHOS::SafeModeManagerModel::GetInstance(), -1));
+      uapi_dev_runtime_set_repair_download_status(0);
+    }
+    break;
+  default:
+    break;
+  }
+}
 bool SafeModeManagerPresenter::OnKeyAct(UIView &view, const KeyEvent &event) {
   unsigned short keyID = event.GetKeyId();
   unsigned short keyState = event.GetState();
index e9d65a4..13f7ee3 100644 (file)
 #include "safemodemanager/include/SafeModeManagerView.h"
-#include "safemodemanager/include/SafeModeManagerPresenter.h"
+#include "safemodemanager/include/RepairView.h"
 #include "safemodemanager/include/ResourceCheckView.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
 
-#include "common/image_cache_manager.h"
 #include "UiConfig.h"
-#include "ui_resource_image.h"
-#include <ui_scroll_view.h>
+#include "common/image_cache_manager.h"
 #include "components/ui_button.h"
-#include "uicomponents/UIComponents.h"
-#include "ui_resource_string.h"
 #include "components/ui_scroll_view.h"
 #include "custom_utils.h"
+#include "ui_resource_image.h"
+#include "ui_resource_string.h"
+#include "uicomponents/UIComponents.h"
+#include <ui_scroll_view.h>
 
 extern "C" bool resfile_checksum_thread(void);
 extern "C" void uapi_enter_power_saving_mode(void);
-namespace OHOS
-{
-
-    static SafeModeManagerView *g_pSafeModeManagerView{nullptr};
-    static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6;
-
-    SafeModeManagerView::SafeModeManagerView()
-    {
-        /*开启省电模式*/
-        uapi_enter_power_saving_mode();
-        g_pSafeModeManagerView = this;
-    }
-
-    SafeModeManagerView::~SafeModeManagerView()
-    {
-        /*删除变量*/
-        delete p_BleOTAView;
-        p_BleOTAView = nullptr;
-        delete p_AutoOTAView;
-        p_AutoOTAView = nullptr;
-        delete p_FactoryView;
-        p_FactoryView = nullptr;
-        delete p_ResourceCheckView;
-        p_ResourceCheckView = nullptr;
-        for (int i = VIEW_SAFE_LIST; i < MAX_VIEW_ID; i++)
-        {
-            SafeModeScrollView[i] = nullptr;
-        }
-
-        UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
-        UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
-
-        g_pSafeModeManagerView = nullptr;
-    }
-
-    SafeModeManagerView *SafeModeManagerView::GetInstance()
-    {
-        return g_pSafeModeManagerView;
-    }
-
-    void SafeModeManagerView::InitView()
-    {
-        if (SafeModeScrollView[VIEW_SAFE_LIST] == nullptr)
-        {
-            SafeModeScrollView[VIEW_SAFE_LIST] = new UIScrollView();
-            if (SafeModeScrollView[VIEW_SAFE_LIST] == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeScrollView[VIEW_SAFE_LIST]  new fail");
-                return;
-            }
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetScrollBlankSize(35);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetReboundSize(50);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetHorizontalScrollState(false);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetOnDragListener(presenter_);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetTouchable(true);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetDraggable(true);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetStyle(STYLE_BACKGROUND_COLOR, BACK_GROUND_COLOR);
-            SafeModeScrollView[VIEW_SAFE_LIST]->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
-        }
-
-        // 初始化背景图和按钮的位置
-        backgroundBLE_.SetPosition(43, 120, 380, 100); // BLE OTA 背景
-        backgroundBLE_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-        backgroundBLE_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        backgroundBLE_.SetStyle(STYLE_BORDER_RADIUS, 100);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundBLE_);
-
-        backgroundAutoOTA_.SetPosition(43, 240, 380, 100); // Auto OTA 背景
-        backgroundAutoOTA_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-        backgroundAutoOTA_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        backgroundAutoOTA_.SetStyle(STYLE_BORDER_RADIUS, 100);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundAutoOTA_);
-
-        backgroundFactoryReset_.SetPosition(43, 360, 380, 100); // 恢复出厂设置背景
-        backgroundFactoryReset_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-        backgroundFactoryReset_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        backgroundFactoryReset_.SetStyle(STYLE_BORDER_RADIUS, 100);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundFactoryReset_);
-
-        backgroundResourceCheck_.SetPosition(43, 480, 380, 100); // 资源校验背景
-        backgroundResourceCheck_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-        backgroundResourceCheck_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        backgroundResourceCheck_.SetStyle(STYLE_BORDER_RADIUS, 100);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundResourceCheck_);
-
-        backgroundRestart_.SetPosition(43, 600, 380, 100); // 资源校验背景
-        backgroundRestart_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-        backgroundRestart_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        backgroundRestart_.SetStyle(STYLE_BORDER_RADIUS, 100);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundRestart_);
-
-        labelTitle_.SetPosition(83, 50, 300, 60);
-        labelTitle_.SetFont(GILROY_BOLD_FONT, 30);
-        labelTitle_.SetText("Safe Mode");
-        labelTitle_.SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); // 居中
-        labelTitle_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelTitle_);
-
-        // 设置四个功能状态标签
-        labelBLEStatus_.SetPosition(90, 153, 200, 60);
-        labelBLEStatus_.SetFont(GILROY_BOLD_FONT, 30);
-        labelBLEStatus_.SetText("BLE OTA");
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelBLEStatus_);
-
-        labelAutoOTAStatus_.SetPosition(90, 273, 200, 60);
-        labelAutoOTAStatus_.SetFont(GILROY_BOLD_FONT, 30);
-        labelAutoOTAStatus_.SetText("Auto OTA");
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelAutoOTAStatus_);
-
-        labelFactoryResetStatus_.SetPosition(90, 393, 200, 60);
-        labelFactoryResetStatus_.SetFont(GILROY_BOLD_FONT, 30);
-        labelFactoryResetStatus_.SetText("Factory Reset");
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelFactoryResetStatus_);
-
-        labelResourceCheckStatus_.SetPosition(90, 513, 200, 60);
-        labelResourceCheckStatus_.SetFont(GILROY_BOLD_FONT, 30);
-        labelResourceCheckStatus_.SetText("Resource Check");
-        labelResourceCheckStatus_.SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
-        labelResourceCheckStatus_.SetAlign(TEXT_ALIGNMENT_CENTER);
-        labelResourceCheckStatus_.SetRollSpeed(30);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelResourceCheckStatus_);
-
-        labelRestart_.SetPosition(90, 633, 200, 60);
-        labelRestart_.SetFont(GILROY_BOLD_FONT, 30);
-        labelRestart_.SetText("Restart");
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelRestart_);
-
-        // 设置四个切换按钮
-        btnBLE_.SetPosition(245, 120, 200, 100); // BLE OTA 切换按钮
-        btnBLE_.SetViewId(BLE_OTA);              // 设置按钮的ViewId
-        btnBLE_.SetOnClickListener(presenter_);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnBLE_);
-
-        btnAutoOTA_.SetPosition(245, 240, 200, 100); // Auto OTA 切换按钮
-        btnAutoOTA_.SetViewId(AUTO_OTA);             // 设置按钮的ViewId
-        btnAutoOTA_.SetOnClickListener(presenter_);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnAutoOTA_);
-
-        btnFactoryReset_.SetPosition(245, 360, 200, 100); // 恢复出厂设置切换按钮
-        btnFactoryReset_.SetViewId(FACTORY_RESET_SAFE);   // 设置按钮的ViewId
-        btnFactoryReset_.SetOnClickListener(presenter_);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnFactoryReset_);
-
-        btnResourceCheck_.SetPosition(245, 480, 200, 100); // 资源校验切换按钮
-        btnResourceCheck_.SetViewId(RESOURCE_CHECK);       // 设置按钮的ViewId
-        btnResourceCheck_.SetOnClickListener(presenter_);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnResourceCheck_);
-
-        btnRestart_.SetPosition(245, 600, 200, 100); // 资源校验切换按钮
-        btnRestart_.SetViewId(RE_START);             // 设置按钮的ViewId
-        btnRestart_.SetOnClickListener(presenter_);
-        SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnRestart_);
+namespace OHOS {
+
+static SafeModeManagerView *g_pSafeModeManagerView{nullptr};
+static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6;
+
+SafeModeManagerView::SafeModeManagerView() {
+  /*开启省电模式*/
+  uapi_enter_power_saving_mode();
+  g_pSafeModeManagerView = this;
+}
+
+SafeModeManagerView::~SafeModeManagerView() {
+  /*删除变量*/
+  delete p_BleOTAView;
+  p_BleOTAView = nullptr;
+  delete p_AutoOTAView;
+  p_AutoOTAView = nullptr;
+  delete p_FactoryView;
+  p_FactoryView = nullptr;
+  delete p_ResourceCheckView;
+  p_ResourceCheckView = nullptr;
+  delete p_RepairView;
+  p_RepairView = nullptr;
+  for (int i = VIEW_SAFE_LIST; i < MAX_VIEW_ID; i++) {
+    SafeModeScrollView[i] = nullptr;
+  }
+
+  UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
+  UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
+
+  g_pSafeModeManagerView = nullptr;
+}
+
+SafeModeManagerView *SafeModeManagerView::GetInstance() {
+  return g_pSafeModeManagerView;
+}
+
+void SafeModeManagerView::InitView() {
+  if (SafeModeScrollView[VIEW_SAFE_LIST] == nullptr) {
+    SafeModeScrollView[VIEW_SAFE_LIST] = new UIScrollView();
+    if (SafeModeScrollView[VIEW_SAFE_LIST] == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "SafeModeScrollView[VIEW_SAFE_LIST]  new fail");
+      return;
     }
-    /* -------------------------------------------------------------------------- */
-    // 主视图
-    bool SafeModeManagerView::ChangeToSafeModelistView(int16_t thisView)
-    {
-        if (SafeModeScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToSafeModelistView");
-            container_->Add(SafeModeScrollView[thisView]);
-        }
-        return true;
-    }
-
-    // BleOTA
-    bool SafeModeManagerView::ChangeToBleOTAView(int16_t thisView)
-    {
-        if (SafeModeScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToBleOTAView");
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetScrollBlankSize(35);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetReboundSize(50);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetPosition(
+        0, 0, Screen::GetInstance().GetWidth(),
+        Screen::GetInstance().GetHeight());
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetHorizontalScrollState(false);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetOnDragListener(presenter_);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetTouchable(true);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetDraggable(true);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetStyle(STYLE_BACKGROUND_COLOR,
+                                                 BACK_GROUND_COLOR);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetStyle(STYLE_BACKGROUND_COLOR,
+                                                 Color::Black().full);
+  }
+
+  // 初始化背景图和按钮的位置
+  backgroundBLE_.SetPosition(43, 120, 380, 100); // BLE OTA 背景
+  backgroundBLE_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+  backgroundBLE_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  backgroundBLE_.SetStyle(STYLE_BORDER_RADIUS, 100);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundBLE_);
+
+  backgroundAutoOTA_.SetPosition(43, 240, 380, 100); // Auto OTA 背景
+  backgroundAutoOTA_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+  backgroundAutoOTA_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  backgroundAutoOTA_.SetStyle(STYLE_BORDER_RADIUS, 100);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundAutoOTA_);
+
+  backgroundFactoryReset_.SetPosition(43, 360, 380, 100); // 恢复出厂设置背景
+  backgroundFactoryReset_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+  backgroundFactoryReset_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  backgroundFactoryReset_.SetStyle(STYLE_BORDER_RADIUS, 100);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundFactoryReset_);
+
+  backgroundResourceCheck_.SetPosition(43, 480, 380, 100); // 资源校验背景
+  backgroundResourceCheck_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+  backgroundResourceCheck_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  backgroundResourceCheck_.SetStyle(STYLE_BORDER_RADIUS, 100);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundResourceCheck_);
+
+  backgroundRestart_.SetPosition(43, 600, 380, 100); // 资源校验背景
+  backgroundRestart_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+  backgroundRestart_.SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  backgroundRestart_.SetStyle(STYLE_BORDER_RADIUS, 100);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&backgroundRestart_);
+
+  labelTitle_.SetPosition(83, 50, 300, 60);
+  labelTitle_.SetFont(GILROY_BOLD_FONT, 30);
+  labelTitle_.SetText("Safe Mode");
+  labelTitle_.SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); // 居中
+  labelTitle_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelTitle_);
+
+  // 设置四个功能状态标签
+  labelBLEStatus_.SetPosition(90, 153, 200, 60);
+  labelBLEStatus_.SetFont(GILROY_BOLD_FONT, 30);
+  labelBLEStatus_.SetText("BLE OTA");
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelBLEStatus_);
+
+  labelAutoOTAStatus_.SetPosition(90, 273, 200, 60);
+  labelAutoOTAStatus_.SetFont(GILROY_BOLD_FONT, 30);
+  labelAutoOTAStatus_.SetText("Auto OTA");
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelAutoOTAStatus_);
+
+  labelFactoryResetStatus_.SetPosition(90, 393, 200, 60);
+  labelFactoryResetStatus_.SetFont(GILROY_BOLD_FONT, 30);
+  labelFactoryResetStatus_.SetText("Factory Reset");
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelFactoryResetStatus_);
+
+  labelResourceCheckStatus_.SetPosition(90, 513, 200, 60);
+  labelResourceCheckStatus_.SetFont(GILROY_BOLD_FONT, 30);
+  labelResourceCheckStatus_.SetText("Resource Check");
+  labelResourceCheckStatus_.SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
+  labelResourceCheckStatus_.SetAlign(TEXT_ALIGNMENT_CENTER);
+  labelResourceCheckStatus_.SetRollSpeed(30);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelResourceCheckStatus_);
+
+  labelRestart_.SetPosition(90, 633, 200, 60);
+  labelRestart_.SetFont(GILROY_BOLD_FONT, 30);
+  labelRestart_.SetText("Restart");
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelRestart_);
+
+  // 设置四个切换按钮
+  btnBLE_.SetPosition(245, 120, 200, 100); // BLE OTA 切换按钮
+  btnBLE_.SetViewId(BLE_OTA);              // 设置按钮的ViewId
+  btnBLE_.SetOnClickListener(presenter_);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnBLE_);
+
+  btnAutoOTA_.SetPosition(245, 240, 200, 100); // Auto OTA 切换按钮
+  btnAutoOTA_.SetViewId(AUTO_OTA);             // 设置按钮的ViewId
+  btnAutoOTA_.SetOnClickListener(presenter_);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnAutoOTA_);
+
+  btnFactoryReset_.SetPosition(245, 360, 200, 100); // 恢复出厂设置切换按钮
+  btnFactoryReset_.SetViewId(FACTORY_RESET_SAFE); // 设置按钮的ViewId
+  btnFactoryReset_.SetOnClickListener(presenter_);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnFactoryReset_);
+
+  btnResourceCheck_.SetPosition(245, 480, 200, 100); // 资源校验切换按钮
+  btnResourceCheck_.SetViewId(RESOURCE_CHECK);       // 设置按钮的ViewId
+  btnResourceCheck_.SetOnClickListener(presenter_);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnResourceCheck_);
+
+  btnRestart_.SetPosition(245, 600, 200, 100); // 资源校验切换按钮
+  btnRestart_.SetViewId(RE_START);             // 设置按钮的ViewId
+  btnRestart_.SetOnClickListener(presenter_);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&btnRestart_);
+}
+/* -------------------------------------------------------------------------- */
+// 主视图
+bool SafeModeManagerView::ChangeToSafeModelistView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::ChangeToSafeModelistView");
+    container_->Add(SafeModeScrollView[thisView]);
+  }
+  return true;
+}
+
+// BleOTA
+bool SafeModeManagerView::ChangeToBleOTAView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::ChangeToBleOTAView");
 #if 0
             p_BleOTAView = new SystemAboutTheWatchView();
             if (p_BleOTAView == nullptr)
@@ -196,15 +195,13 @@ namespace OHOS
             SafeModeScrollView[thisView] = p_BleOTAView->SystemAbouTheWatchtInitIView();
             container_->Add(SafeModeScrollView[thisView]);
 #endif
-        }
-        return true;
-    }
+  }
+  return true;
+}
 
-    // 自动OTA
-    bool SafeModeManagerView::ChangeToAutoOTAView(int16_t thisView)
-    {
-        if (SafeModeScrollView[thisView] == nullptr)
-        {
+// 自动OTA
+bool SafeModeManagerView::ChangeToAutoOTAView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
 #if 0
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToAutoOTAView");
             p_AutoOTAView = new SystemFactoryResetView();
@@ -216,15 +213,13 @@ namespace OHOS
             SafeModeScrollView[thisView] = p_AutoOTAView->SystemFactoryResetViewInit();
             container_->Add(SafeModeScrollView[thisView]);
 #endif
-        }
-        return true;
-    }
+  }
+  return true;
+}
 
-    // 恢复出厂
-    bool SafeModeManagerView::ChangeToFactoryView(int16_t thisView)
-    {
-        if (SafeModeScrollView[thisView] == nullptr)
-        {
+// 恢复出厂
+bool SafeModeManagerView::ChangeToFactoryView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
 #if 0
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToFactoryView");
             p_FactoryView = new SystemRestart();
@@ -236,142 +231,163 @@ namespace OHOS
             SafeModeScrollView[thisView] = p_FactoryView->SystemRestartViewInit();
             container_->Add(SafeModeScrollView[thisView]);
 #endif
-        }
-        return true;
+  }
+  return true;
+}
+
+// 资源校验
+bool SafeModeManagerView::ChangeToResourceCheckView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::ChangeToResourceCheckView");
+    p_ResourceCheckView = new ResourceCheckView();
+    if (p_ResourceCheckView == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "SafeModeManagerView:: new scrollView[%d] fail", thisView);
+      return false;
     }
-
-    // 资源校验
-    bool SafeModeManagerView::ChangeToResourceCheckView(int16_t thisView)
-    {
-        if (SafeModeScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToResourceCheckView");
-            p_ResourceCheckView = new ResourceCheckView();
-            if (p_ResourceCheckView == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView:: new scrollView[%d] fail", thisView);
-                return false;
-            }
-            SafeModeScrollView[thisView] = p_ResourceCheckView->ResourceCheckViewInit();
-            container_->Add(SafeModeScrollView[thisView]);
-        }
-        return true;
+    SafeModeScrollView[thisView] = p_ResourceCheckView->ResourceCheckViewInit();
+    container_->Add(SafeModeScrollView[thisView]);
+  }
+  return true;
+}
+
+// 修复文件
+bool SafeModeManagerView::ChangeToRepairView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::ChangeToRepairView");
+    p_RepairView = new RepairView();
+    if (p_RepairView == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "SafeModeManagerView:: new scrollView[%d] fail", thisView);
+      return false;
     }
-
-    struct SafeModeManagerViewMapper
-    {
-        const int16_t viewId;
-        bool (SafeModeManagerView::*func)(int16_t thisView);
-    };
-
-    static const SafeModeManagerViewMapper ViewMapper[] = {
-        {VIEW_SAFE_LIST, &SafeModeManagerView::ChangeToSafeModelistView},
-        {VIEW_BLE_OTA, &SafeModeManagerView::ChangeToBleOTAView},
-        {VIEW_AUTO_OTA, &SafeModeManagerView::ChangeToAutoOTAView},
-        {VIEW_FACTORY_RESET, &SafeModeManagerView::ChangeToFactoryView},
-        {VIEW_RESOURCE_CHECK, &SafeModeManagerView::ChangeToResourceCheckView},
-    };
-
-    // 根据传入的interface参数执行相应视图ID关联的成员函数。
-    bool SafeModeManagerView::ClickFunc(int16_t interface)
-    {
-        int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[VIEW_SAFE_LIST]);
-        for (int i = 0; i < funcSize; i++)
-        {
-            if (interface == ViewMapper[i].viewId)
-            {
-                bool jug = (this->*(ViewMapper[i].func))(interface);
-                if (jug == false)
-                {
-                    return false;
-                }
-                return true;
-            }
-        }
+    SafeModeScrollView[thisView] = p_RepairView->RepairViewInit();
+    container_->Add(SafeModeScrollView[thisView]);
+  }
+  return true;
+}
+
+struct SafeModeManagerViewMapper {
+  const int16_t viewId;
+  bool (SafeModeManagerView::*func)(int16_t thisView);
+};
+
+static const SafeModeManagerViewMapper ViewMapper[] = {
+    {VIEW_SAFE_LIST, &SafeModeManagerView::ChangeToSafeModelistView},
+    {VIEW_BLE_OTA, &SafeModeManagerView::ChangeToBleOTAView},
+    {VIEW_AUTO_OTA, &SafeModeManagerView::ChangeToAutoOTAView},
+    {VIEW_FACTORY_RESET, &SafeModeManagerView::ChangeToFactoryView},
+    {VIEW_RESOURCE_CHECK, &SafeModeManagerView::ChangeToResourceCheckView},
+    {VIEW_REPAIR_FILE, &SafeModeManagerView::ChangeToRepairView}};
+
+// 根据传入的interface参数执行相应视图ID关联的成员函数。
+bool SafeModeManagerView::ClickFunc(int16_t interface) {
+  int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[VIEW_SAFE_LIST]);
+  for (int i = 0; i < funcSize; i++) {
+    if (interface == ViewMapper[i].viewId) {
+      bool jug = (this->*(ViewMapper[i].func))(interface);
+      if (jug == false) {
         return false;
+      }
+      return true;
     }
-
-    /*检查传入的两个视图参数 hideView 和 showView 的有效性。*/
-    bool SafeModeManagerView::CheckViewParam(int16_t hideView, int16_t showView)
-    {
-        if (showView < 0 || showView >= MAX_VIEW_ID)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::CheckViewParam showView err.");
-            return false;
-        }
-
-        if (hideView < 0 || hideView > MAX_VIEW_ID)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::CheckViewParam hideView err.");
-            return false;
-        }
-
-        return true;
-    }
-
-    // 切换视图
-    void SafeModeManagerView::ChangeView(int16_t hideView, int16_t showView)
-    {
-        if (!CheckViewParam(hideView, showView))
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::CheckViewParam failed.");
-            return;
-        }
-        SafeModeScrollView[hideView]->SetVisible(false);
-        ClickFunc(showView);
-        SafeModeScrollView[showView]->SetVisible(true);
-        Draw();
-    }
-    UIScrollView *SafeModeManagerView::GetSafeScrollView(int ViewId)
-    {
-        if (SafeModeScrollView[ViewId] == nullptr)
-        {
-            return nullptr;
-        }
-        return SafeModeScrollView[ViewId];
-    }
-    /* -------------------------------------------------------------------------- */
-    void SafeModeManagerView::OnStart()
-    {
-        View<SafeModeManagerPresenter>::OnStart();
-        SetContainerView(new UIViewGroup());
-        if (GetContainer() == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetContainerView fail!!");
-            return;
-        }
-        container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-
-        InitView();
-
-        // SetContainerView(container_);
-        // RootView::GetInstance()->SetOnKeyActListener(presenter_);
-    }
-
-    void SafeModeManagerView::OnSetUpView()
-    {
-        View<SafeModeManagerPresenter>::OnSetUpView();
-        container_->Add(SafeModeScrollView[VIEW_SAFE_LIST]);
-        Draw();
-    }
-
-    void SafeModeManagerView::OnTearDownView()
-    {
-        View<SafeModeManagerPresenter>::OnTearDownView();
-        return;
-    }
-
-    void SafeModeManagerView::OnStop()
-    {
-        View<SafeModeManagerPresenter>::OnStop();
-        if (container_ != nullptr)
-        {
-            container_->RemoveAll();
-            delete container_;
-            container_ = nullptr;
-        }
-        RootView::GetInstance()->RemoveAll();
-        return;
-    }
-
-}
\ No newline at end of file
+  }
+  return false;
+}
+
+/*检查传入的两个视图参数 hideView 和 showView 的有效性。*/
+bool SafeModeManagerView::CheckViewParam(int16_t hideView, int16_t showView) {
+  if (showView < 0 || showView >= MAX_VIEW_ID) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::CheckViewParam showView err.");
+    return false;
+  }
+
+  if (hideView < 0 || hideView > MAX_VIEW_ID) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::CheckViewParam hideView err.");
+    return false;
+  }
+
+  return true;
+}
+
+// 切换视图
+void SafeModeManagerView::ChangeView(int16_t hideView, int16_t showView) {
+  if (!CheckViewParam(hideView, showView)) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerView::CheckViewParam failed.");
+    return;
+  }
+  SafeModeScrollView[hideView]->SetVisible(false);
+  ClickFunc(showView);
+  SafeModeScrollView[showView]->SetVisible(true);
+  Draw();
+}
+UIScrollView *SafeModeManagerView::GetSafeScrollView(int ViewId) {
+  if (SafeModeScrollView[ViewId] == nullptr) {
+    return nullptr;
+  }
+  return SafeModeScrollView[ViewId];
+}
+
+// 按键状态更新
+void SafeModeManagerView::UpdateToggleButState(void) {
+  // 更新按钮状态
+  UpdateButtonState(btnBLE_, Safe_State::BLE_OTA);
+  UpdateButtonState(btnAutoOTA_, Safe_State::AUTO_OTA);
+  UpdateButtonState(btnResourceCheck_, Safe_State::RESOURCE_CHECK);
+  UpdateButtonState(btnFactoryReset_, Safe_State::FACTORY_RESET);
+}
+
+// 更新单个按钮状态的辅助函数
+void SafeModeManagerView::UpdateButtonState(UIToggleButton button,
+                                            Safe_State state) {
+  if (SafeModeManagerModel::GetInstance()->IsState(state)) {
+    button.SetState(true);
+  } else {
+    button.SetState(false);
+  }
+}
+/* -------------------------------------------------------------------------- */
+void SafeModeManagerView::OnStart() {
+  View<SafeModeManagerPresenter>::OnStart();
+  SetContainerView(new UIViewGroup());
+  if (GetContainer() == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetContainerView fail!!");
+    return;
+  }
+  container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(),
+                          Screen::GetInstance().GetHeight());
+
+  InitView();
+
+  // SetContainerView(container_);
+  // RootView::GetInstance()->SetOnKeyActListener(presenter_);
+}
+
+void SafeModeManagerView::OnSetUpView() {
+  View<SafeModeManagerPresenter>::OnSetUpView();
+  container_->Add(SafeModeScrollView[VIEW_SAFE_LIST]);
+  Draw();
+}
+
+void SafeModeManagerView::OnTearDownView() {
+  View<SafeModeManagerPresenter>::OnTearDownView();
+  return;
+}
+
+void SafeModeManagerView::OnStop() {
+  View<SafeModeManagerPresenter>::OnStop();
+  if (container_ != nullptr) {
+    container_->RemoveAll();
+    delete container_;
+    container_ = nullptr;
+  }
+  RootView::GetInstance()->RemoveAll();
+  return;
+}
+
+} // namespace OHOS
\ No newline at end of file