增加安全模式Slice
authorCaisking <Casiking@zhihuishixun.com>
Thu, 24 Jul 2025 10:17:00 +0000 (18:17 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Thu, 24 Jul 2025 10:17:00 +0000 (18:17 +0800)
15 files changed:
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/RepairView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckItemView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerModelC.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/RepairView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerView.cpp [new file with mode: 0644]

diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/RepairView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/RepairView.h
new file mode 100644 (file)
index 0000000..5c8d798
--- /dev/null
@@ -0,0 +1,47 @@
+#if 0
+
+#ifndef Repair_VIEW_H
+#define Repair_VIEW_H
+
+
+#include "View.h"
+
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label_button_ext.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_scroll_view.h"
+namespace OHOS {
+class RepairView {
+public:
+  RepairView();
+  virtual ~RepairView();
+  static RepairView *GetInstance(void);
+
+  UIScrollView *RepairViewInit(void);
+  void ClearAll(void);
+
+  void UpdateView(void);
+  void InitScrollView(void);
+  void InitLabels(void);
+  void InitButtons(void);
+  void InitBasicdata(void);
+  void UpdateView(int date);
+  void UpdateSginandOperate(void);
+
+private:
+  UIScrollView *scrollView_{nullptr};
+  UILabel *signalLabel_{nullptr};
+  UILabel *operationLabel_{nullptr};
+  UILabel *instructionLabel_{nullptr};
+  UILabelButtonExt *repairButton_{nullptr};
+  UILabelButtonExt *wakeUpButton_{nullptr};
+  UILabel *downLabel_{nullptr};
+  UILabel *totalLabel_{nullptr};
+  UILabel *versionLabel_{nullptr};
+  UILabel *downingLabel_{nullptr};
+};
+} // namespace OHOS
+#endif
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckAdapter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckAdapter.h
new file mode 100644 (file)
index 0000000..adddba0
--- /dev/null
@@ -0,0 +1,49 @@
+#if 0
+#ifndef ResourceCheck_ADAPTER_H
+#define ResourceCheck_ADAPTER_H
+#include <list>
+#include <string>
+#include "components/ui_list.h"
+#include "components/abstract_adapter.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_checkbox.h"
+#include "components/ui_label_button_ext.h"
+
+namespace OHOS
+{
+    typedef struct
+    {
+        int index;
+        std::string filename; 
+    } ResourceCheckItem;
+
+    class ResourceCheckAdapter : public AbstractAdapter
+    {
+    public:
+        explicit ResourceCheckAdapter();
+        virtual ~ResourceCheckAdapter();
+
+        void SetData(std::list<ResourceCheckItem> &data);
+
+        virtual uint16_t GetCount(void) override;
+
+        virtual UIView *GetView(UIView *inView, int16_t index) override;
+
+        virtual void AddListItem(const ResourceCheckItem &item);
+
+        void SetItemClickListener(UIView::OnClickListener *itemclicklistener)
+        {
+            itemClickListener = itemclicklistener;
+        }
+
+    private:
+        std::list<ResourceCheckItem> listData;
+        UIView::OnClickListener *itemClickListener{nullptr};
+        UILabelButtonExt *DeleteButton{nullptr};
+    };
+}
+
+#endif
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckItemView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckItemView.h
new file mode 100644 (file)
index 0000000..c18369e
--- /dev/null
@@ -0,0 +1,42 @@
+/*** 
+ * @Date: 2024-09-10 09:53:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-10 10:31:06
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/ResourceCheckItemView.cpp
+ */
+
+
+#ifndef ResourceCheck_ITEM_VIEW_H
+#define ResourceCheck_ITEM_VIEW_H
+
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_view_group.h"
+#include "components/ui_checkbox.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label_button.h"
+
+#include "safemodemanager/include/ResourceCheckAdapter.h"
+#include "safemodemanager/include/ResourceCheckItemView.h"
+
+
+namespace OHOS
+{
+    class ResourceCheckItemView : public UIViewGroup
+    {
+    public:
+        explicit ResourceCheckItemView();
+        virtual ~ResourceCheckItemView();
+        virtual void SetItemInfo(const ResourceCheckItem itemInfo);
+        virtual void SetUpChild();
+        void TearDownChild();
+        int GetResourceCheckListIndex();
+
+    private:
+        ResourceCheckItemView(const ResourceCheckItem &);
+        UILabel filenamelabel;            
+        ResourceCheckItem sItemInfo = {0, nullptr};
+        bool isSetupChild{false};
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/ResourceCheckView.h
new file mode 100644 (file)
index 0000000..cacbd39
--- /dev/null
@@ -0,0 +1,44 @@
+
+#if 0
+
+#ifndef ResourceCheck_VIEW_H
+#define ResourceCheck_VIEW_H
+
+
+#include "View.h"
+
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_scroll_view.h"
+#include "safemodemanager/include/ResourceCheckAdapter.h"
+#include "safemodemanager/include/ResourceCheckItemView.h"
+namespace OHOS {
+class ResourceCheckView {
+public:
+  ResourceCheckView();
+  virtual ~ResourceCheckView();
+  static ResourceCheckView *GetInstance(void);
+
+  UIScrollView *ResourceCheckViewInit(void);
+  void ClearAll(void);
+
+  void UpdateView(int date);
+  void UpdateView();
+  void AddFilenameToList(const ResourceCheckItem &item);
+  void InitScrollView(void);
+  void InitFilenameList(void);
+  void InitNoteLabel(void);
+  void SetViewState(void);
+
+private:
+  UIScrollView *scrollView{nullptr};
+  UILabel *notelabel{nullptr};
+  ResourceCheckAdapter *p_ResourceCheckAdapter{nullptr};
+  UIList *FilenameList = nullptr;
+  bool initViewStatus{false};
+};
+} // namespace OHOS
+#endif
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerModel.h
new file mode 100644 (file)
index 0000000..ea7b452
--- /dev/null
@@ -0,0 +1,127 @@
+/***
+ * @Date: 2024-08-21 16:18:26
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-06 18:19:25
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/SafeModeManager/include/SafeModeManagerModel.h
+ */
+
+#ifndef SAFE_MODE_MANAGER_MODEL_H
+#define SAFE_MODE_MANAGER_MODEL_H
+
+#include "safemodemanager/include/ResourceCheckAdapter.h"
+#include "safemodemanager/include/ResourceCheckItemView.h"
+#include <functional>
+#include <map>
+#include <string>
+#include <vector>
+
+namespace OHOS {
+
+// 定义状态类型
+enum class Safe_State {
+  BLE_OTA,        // BLE OTA
+  AUTO_OTA,       // Auto OTA
+  FACTORY_RESET,  // 恢复出厂
+  RESOURCE_CHECK, // 资源检查
+  REPAIR_FILE     // 修复
+};
+enum CheckState {
+  NO_OPERATION = 0,   // 未操作
+  CHECKING = 1,       // 校验中
+  CHECK_SUCCESS = 2,  // 校验成功
+  FILE_NOT_FOUND = 3, // 文件未找到
+  FILE_CORRUPTED = 4  // 文件损坏
+};
+struct SafeStateInfo {
+  Safe_State state;
+  bool active; // 是否激活
+};
+static const int SAFE_STATE_COUNT = 5; // 安全状态数量
+class SafeModeManagerModel {
+public:
+  // 获取单例实例
+  static SafeModeManagerModel *GetInstance();
+
+  // 恢复出厂
+  bool FactorySet();
+  /* ---------------------------------- 校验文件
+   * ---------------------------------- */
+  // 初始化列表项
+  void InitFilenamesListItems();
+  // 获取列表项
+  const ResourceCheckItem *GetFilenamesListItems() const;
+  // 获取数量
+  uint16_t GetFilenamesCount() const;
+  // 资源检查和读取差异文件
+  bool ResourceCheck();
+  bool ReadCheckFile();
+  // 获取校验状态
+  bool GetResourceCheckState() const;
+  void SetResourceCheckState(bool state);
+  // 获取检查文件列表
+  const std::vector<std::string> &GetCheckDifferentialFiles() const;
+  size_t GetCheckFileCount() const;
+  // 更新检查视图
+  void UpdateCheckView(int date);
+  /* ---------------------------------- 文件修复
+   * ---------------------------------- */
+  //获取信号值
+  uint8_t GetSignal() const;
+  //获取运营商
+  std::string GetOperator() const;
+  //获取版本号
+  std::string GetVersion() const;
+  //获取下载地址
+  std::string GetRepairUrl() const;
+  //唤醒Cat1
+  void uapi_cat1_wakeup_cat1(bool wakeupstate);
+  //进行修复开始
+  bool RepairStart();
+  // 进行修复结束
+  bool RepairEnd();
+  //更新修复界面
+  void UpdateRepairView(int date);
+  //更新信号与运营商
+  void UpdateSginOperate();
+  //获取下载数
+  uint16_t GetRepairCount() const;
+  //设置下载数
+  void SetRepairCount(uint16_t count);
+  //增加下载数
+  void AddRepairCount();
+
+  /* ---------------------------------- map管理
+   * --------------------------------- */
+  // 设置状态
+  void SetState(Safe_State state, bool executeAction);
+  // 获取状态
+  bool IsState(Safe_State state) const;
+  // 输出当前状态
+  void PrintState() const;
+
+  /* ---------------------------------- 手表信息
+   * ---------------------------------- */
+  std::string get_voltage_and_version_string();
+  std::string get_bluetooth_name();
+
+private:
+  SafeModeManagerModel() = default;  // 默认构造函数
+  ~SafeModeManagerModel() = default; // 默认析构函数
+
+  // 禁止拷贝构造和赋值操作
+  SafeModeManagerModel(const SafeModeManagerModel &) = delete;
+  SafeModeManagerModel &operator=(const SafeModeManagerModel &) = delete;
+
+  std::vector<std::string> resource_check_files; // 存储检查的资源文件列表
+  uint16_t numberOfItems = 0;                    // 初始化文件项数为 0
+  static const uint16_t MAX_RESOURCE_CHECK_FILE_NUM = 500; // 列表最大数量
+  ResourceCheckItem Filenames[MAX_RESOURCE_CHECK_FILE_NUM] = {0,
+                                                              nullptr}; // 列表
+  bool resource_check_state{false}; // 资源检查状态
+  uint16_t repair_count{0};         //下载数
+};
+
+} // namespace OHOS
+
+#endif // SAFE_MODE_MANAGER_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerModelC.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerModelC.h
new file mode 100644 (file)
index 0000000..6717e0d
--- /dev/null
@@ -0,0 +1,24 @@
+
+#ifndef SAFE_MODE_MANAGER_MODEL_C_H
+#define SAFE_MODE_MANAGER_MODEL_C_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//进行修复开始
+void repair_file_start(void);
+//进行运动存储
+void store_sport_data(void);
+//进行心率存储
+void save_heart_rate_data(void);
+//进行血氧存储
+void save_blood_oxygen_data(void);
+//进行心率列表存储
+void save_heart_rate_data(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerPresenter.h
new file mode 100644 (file)
index 0000000..7af8ea9
--- /dev/null
@@ -0,0 +1,50 @@
+#if 0
+
+#ifndef _SafeModeManager_PRESENTER_H
+#define _SafeModeManager_PRESENTER_H
+
+#include "Presenter.h"
+#include "SafeModeManagerView.h"
+#include "ModelListenerSample.h"
+
+namespace OHOS {
+static constexpr const char *BLE_OTA = "ble_ota";
+static constexpr const char *AUTO_OTA = "auto_ota";
+static constexpr const char *FACTORY_RESET_SAFE = "factory_reset";
+static constexpr const char *RESOURCE_CHECK = "resource_check";
+static constexpr const char *REPAIR_ALL = "repair_all";
+static constexpr const char *RE_START = "restart";
+static constexpr const char *CHECK_FILE_LIST = "check_file_list";
+static constexpr const char *WAKE_UP = "wake_up";
+static constexpr const char *REPAIR_FILE_START = "repair_file";
+
+class SafeModeManagerView;
+class SafeModeManagerPresenter : public Presenter<SafeModeManagerView>,
+                                 public UIView::OnClickListener,
+                                 public UIView::OnDragListener,
+                                 public ModelListenerSample,
+                                 public RootView::OnKeyActListener {
+public:
+  SafeModeManagerPresenter();
+  virtual ~SafeModeManagerPresenter();
+
+  void OnStart() override;
+  void OnPause() override;
+  void OnResume() override;
+  void OnStop() override;
+  void OnTickEvent() override;
+  void Notify() override {}
+
+  static SafeModeManagerPresenter *GetInstance();
+
+private:
+  // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;
+  bool OnClick(UIView &view, const ClickEvent &event) override;
+  bool OnDrag(UIView &view, const DragEvent &event) override;
+  bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+};
+} // namespace OHOS
+
+#endif // SLEEPDETAIL_PRESENTER_H
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/include/SafeModeManagerView.h
new file mode 100644 (file)
index 0000000..24c673f
--- /dev/null
@@ -0,0 +1,137 @@
+#if 0
+
+#ifndef _SafeModeManager_VIEW_H
+#define _SafeModeManager_VIEW_H
+
+
+#include "View.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_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"
+#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;
+
+// 定义结构体用于位置设置
+struct Position {
+  int x;
+  int y;
+};
+
+// 初始化背景项及其位置
+struct BackgroundItem {
+  UIImageView *background;
+  Position position;
+};
+// 定义按钮
+struct ButtonItem {
+  UIToggleButton *button;
+  Position position;
+  const char *viewId;
+};
+
+// 定义功能状态标签
+struct StatusLabelItem {
+  UILabel *label;
+  std::string text;
+  Position position;
+};
+
+struct SafeViewItem {
+  BackgroundItem background;
+  ButtonItem button;
+  StatusLabelItem statusLabel;
+};
+
+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
+  UILabel labelTitle_; // Title Label
+  UILabel labelInfo_;
+
+  // 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
+  UILabel labelBLEStatus_;           // BLE OTA Status Label
+  UILabel labelAutoOTAStatus_;       // Auto OTA Status Label
+  UILabel labelFactoryResetStatus_;  // Factory Reset Status Label
+  UILabel labelResourceCheckStatus_; // Resource Check Status Label
+  UILabel labelRestart_;             // Restart Status Label
+
+  UIScrollView *SafeModeScrollView[MAX_VIEW_ID]{nullptr};
+};
+} // namespace OHOS
+
+#endif // _SafeModeManager_VIEW_H
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/RepairView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/RepairView.cpp
new file mode 100644 (file)
index 0000000..095dee9
--- /dev/null
@@ -0,0 +1,324 @@
+#if 0
+
+#include "safemodemanager/include/RepairView.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
+
+#include "UiConfig.h"
+#include "ui_resource_string.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+static RepairView *g_pRepairView{nullptr};
+
+RepairView::RepairView() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RepairView::RepairView");
+  g_pRepairView = this;
+}
+
+RepairView::~RepairView() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RepairView::~RepairView");
+  ClearAll();
+  g_pRepairView = nullptr;
+}
+
+RepairView *RepairView::GetInstance() { return g_pRepairView; }
+
+void RepairView::ClearAll() {
+  scrollView_->RemoveAll();
+  delete signalLabel_;
+  signalLabel_ = nullptr;
+  delete operationLabel_;
+  operationLabel_ = nullptr;
+  delete instructionLabel_;
+  instructionLabel_ = nullptr;
+  delete versionLabel_;
+  versionLabel_ = nullptr;
+  delete wakeUpButton_;
+  wakeUpButton_ = nullptr;
+  delete repairButton_;
+  repairButton_ = nullptr;
+  delete downLabel_;
+  downLabel_ = nullptr;
+  delete totalLabel_;
+  totalLabel_ = nullptr;
+  delete downingLabel_;
+  downingLabel_ = nullptr;
+  delete scrollView_;
+  scrollView_ = nullptr;
+}
+
+void RepairView::InitScrollView() {
+  if (scrollView_ == nullptr) {
+    scrollView_ = new UIScrollView();
+    scrollView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(),
+                             Screen::GetInstance().GetHeight());
+    scrollView_->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+    scrollView_->SetScrollBlankSize(100);
+    scrollView_->SetMaxScrollDistance(1000);
+    scrollView_->SetThrowDrag(true);
+    scrollView_->SetHorizontalScrollState(false);
+  }
+}
+
+void RepairView::InitLabels() {
+  //  Signal Label
+  if (signalLabel_ == nullptr) {
+    signalLabel_ = new UILabel();
+    signalLabel_->SetPosition(133, 130);
+    signalLabel_->Resize(200, 60);
+    signalLabel_->SetViewId("signalLabel");
+    signalLabel_->SetText("Signal: --");
+    signalLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    signalLabel_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    signalLabel_->SetFont(GILROY_BOLD_FONT,
+                          30); // Updated font size
+    signalLabel_->SetTextColor(
+        Color::GetColorFromRGBA(0x15, 0xcb, 0x06, 0xff)); // Updated text color
+    scrollView_->Add(signalLabel_);
+    signalLabel_->SetVisible(true);
+  }
+
+  // Operation Label
+  if (operationLabel_ == nullptr) {
+    operationLabel_ = new UILabel();
+    operationLabel_->SetPosition(83, 80);
+    operationLabel_->Resize(300, 60);
+    operationLabel_->SetViewId("operationLabel");
+    operationLabel_->SetText("Operation: --");
+    operationLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    operationLabel_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    operationLabel_->SetFont(GILROY_BOLD_FONT,
+                             30); // Updated font size
+    scrollView_->Add(operationLabel_);
+    operationLabel_->SetVisible(true);
+  }
+
+  // Instruction Label
+  if (instructionLabel_ == nullptr) {
+    instructionLabel_ = new UILabel();
+    instructionLabel_->SetPosition(20, 180);
+    instructionLabel_->Resize(400, 60);
+    instructionLabel_->SetViewId("instructionLabel");
+    instructionLabel_->SetText("If the signal is outside the range of 0 to 30, "
+                               "please click 'Wake Up' and wait for a moment.");
+    instructionLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    instructionLabel_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    instructionLabel_->SetTextColor(
+        Color::GetColorFromRGBA(0xeb, 0x05, 0x05, 0xff));
+    instructionLabel_->SetFont(GILROY_BOLD_FONT,
+                               20); // Updated font size
+    // scrollView_->Add(instructionLabel_);
+    // instructionLabel_->SetVisible(true);
+  }
+
+  // Version Label
+  if (versionLabel_ == nullptr) {
+    versionLabel_ = new UILabel();
+    versionLabel_->SetPosition(133, 180);
+    versionLabel_->Resize(200, 60);
+    versionLabel_->SetViewId("versionLabel");
+    versionLabel_->SetText("Version: --");
+    versionLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    versionLabel_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    versionLabel_->SetFont(GILROY_BOLD_FONT,
+                           30); // Updated font size
+    scrollView_->Add(versionLabel_);
+    versionLabel_->SetVisible(true);
+  }
+
+  // down Label
+  if (downingLabel_ == nullptr) {
+    downingLabel_ = new UILabel();
+    downingLabel_->SetPosition(133, 406);
+    downingLabel_->Resize(200, 60);
+    downingLabel_->SetViewId("label11");
+    downingLabel_->SetStyle(STYLE_TEXT_FONT, 26);
+    downingLabel_->SetText("downing...");
+    downingLabel_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+    downingLabel_->SetTextColor(
+        Color::GetColorFromRGBA(0xef, 0x0e, 0x0e, 0xff));
+    downingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    downingLabel_->SetRollSpeed(23);
+    downingLabel_->SetFont(GILROY_BOLD_FONT, 26);
+    scrollView_->Add(downingLabel_);
+    downingLabel_->SetVisible(false);
+  }
+}
+
+void RepairView::InitButtons() {
+  // Repair Button
+  if (repairButton_ == nullptr) {
+    repairButton_ = new UILabelButtonExt();
+    repairButton_->SetPosition(265, 245);
+    repairButton_->Resize(160, 80); // Updated size
+    repairButton_->SetViewId(REPAIR_FILE_START);
+    repairButton_->SetText("Repair File");
+    repairButton_->SetFont(GILROY_BOLD_FONT,
+                           26); // Updated font size
+    repairButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff14ff00);
+    scrollView_->Add(repairButton_);
+    repairButton_->SetVisible(true);
+    // 设置点击事件监听器
+    UIView::OnClickListener *repairclickListener = (UIView::OnClickListener *)
+        OHOS::SafeModeManagerPresenter::GetInstance();
+    if (repairclickListener == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "repairclickListener is null");
+      return;
+    }
+    repairButton_->SetOnClickListener(repairclickListener);
+  }
+
+  // Wake Up Button
+  if (wakeUpButton_ == nullptr) {
+    wakeUpButton_ = new UILabelButtonExt();
+    wakeUpButton_->SetPosition(45, 245);
+    wakeUpButton_->Resize(160, 80); // Updated size
+    wakeUpButton_->SetViewId(WAKE_UP);
+    wakeUpButton_->SetText("Wake Up");
+    wakeUpButton_->SetFont(GILROY_BOLD_FONT,
+                           26); // Updated font size
+    wakeUpButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff0c77e6);
+    scrollView_->Add(wakeUpButton_);
+    wakeUpButton_->SetVisible(true);
+    // 设置点击事件监听器
+    UIView::OnClickListener *wakeclickListener = (UIView::OnClickListener *)
+        OHOS::SafeModeManagerPresenter::GetInstance();
+    if (wakeclickListener == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wakeclickListener is null");
+      return;
+    }
+    wakeUpButton_->SetOnClickListener(wakeclickListener);
+  }
+}
+UIScrollView *RepairView::RepairViewInit() {
+
+  InitScrollView();
+  // 设置拖拽监听器
+  UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(
+      SafeModeManagerPresenter::GetInstance());
+  if (!dragListener) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerPresenter::获取实例失败!");
+    return nullptr; // 获取失败,返回空指针
+  }
+  scrollView_->SetOnDragListener(dragListener);
+
+  InitLabels();
+  InitButtons();
+
+  // Adding other labels
+  if (downLabel_ == nullptr) {
+    downLabel_ = new UILabel();
+    downLabel_->SetPosition(26, 366);
+    downLabel_->Resize(200, 60);
+    downLabel_->SetViewId("downLabel");
+    downLabel_->SetText("down: --");
+    downLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    downLabel_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    downLabel_->SetFont(GILROY_BOLD_FONT,
+                        30); // Updated font size
+    downLabel_->SetTextColor(
+        Color::GetColorFromRGBA(0x15, 0xcb, 0x06, 0xff)); // Updated text color
+    scrollView_->Add(downLabel_);
+    downLabel_->SetVisible(true);
+  }
+
+  if (totalLabel_ == nullptr) {
+    totalLabel_ = new UILabel();
+    totalLabel_->SetPosition(230, 366);
+    totalLabel_->Resize(200, 60);
+    totalLabel_->SetViewId("totalLabel");
+    totalLabel_->SetText("total: --");
+    totalLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+    totalLabel_->SetAlign(TEXT_ALIGNMENT_CENTER);
+    totalLabel_->SetFont(GILROY_BOLD_FONT,
+                         30); // Updated font size
+    scrollView_->Add(totalLabel_);
+    totalLabel_->SetVisible(true);
+  }
+
+  // 初始化基本数据
+  InitBasicdata();
+
+  return scrollView_;
+}
+
+//初始化版本号与下载总数
+void RepairView::InitBasicdata() {
+  if (versionLabel_ != nullptr) {
+    // 获取版本号
+    std::string version = SafeModeManagerModel::GetInstance()->GetVersion();
+    versionLabel_->SetText(version.c_str());
+  }
+  if (downLabel_ != nullptr) {
+    // 获取文件总数
+    int totalcount = SafeModeManagerModel::GetInstance()->GetFilenamesCount();
+    std::string total = "total: " + std::to_string(totalcount);
+    totalLabel_->SetText(total.c_str());
+  }
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "versionstr: %s, totalstr:%s",
+                versionLabel_->GetText(), totalLabel_->GetText());
+}
+
+//更新信号值与运营商
+void RepairView::UpdateSginandOperate(void) {
+
+  if (signalLabel_ != nullptr) {
+    //获取信号值
+    uint8_t signal = SafeModeManagerModel::GetInstance()->GetSignal();
+    std::string signalStr = "Signal: " + std::to_string(signal);
+    signalLabel_->SetText(signalStr.c_str());
+  }
+  if (operationLabel_ != nullptr) {
+    //获取运营商
+    std::string operate =
+        "Operation" + SafeModeManagerModel::GetInstance()->GetOperator();
+    operationLabel_->SetText(operate.c_str());
+  }
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "signalstr: %s, operate:%s",
+                signalLabel_->GetText(), operationLabel_->GetText());
+}
+
+//更新下载进度
+void RepairView::UpdateView(int date) {
+  if (downingLabel_ == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "ResourceCheckView::downingLabel_ is null");
+    return;
+  }
+  //显示下载中
+  if (downingLabel_->IsVisible() == false) {
+    downingLabel_->SetVisible(true);
+  }
+  std::string display = "downing";
+  //下载文件数
+  uint16_t count = SafeModeManagerModel::GetInstance()->GetRepairCount();
+  std::string downcount = "down: " + std::to_string(count);
+  if (downLabel_ != nullptr)
+    downLabel_->SetText(downcount.c_str());
+  // 检查状态并更新提示文本
+  if (date >= 0 && date <= 60) {
+    int progress = date % 4;
+    display.append(progress, '.'); // 添加进度标记点
+    downingLabel_->SetText(display.c_str());
+  } else {
+    switch (date) {
+    //下载修复文件成功
+    case 61:
+      downingLabel_->SetText("Repair file download success!");
+      break;
+    case -1:
+      //下载修复文件失败
+      downingLabel_->SetText("Repair file download failed!");
+      break;
+    default:
+      downingLabel_->SetText("Unknown status...");
+      break;
+    }
+  }
+}
+} // namespace OHOS
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckAdapter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckAdapter.cpp
new file mode 100644 (file)
index 0000000..cbae436
--- /dev/null
@@ -0,0 +1,106 @@
+#if 0
+#include "safemodemanager/include/ResourceCheckItemView.h"
+#include "safemodemanager/include/ResourceCheckView.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
+
+#include "uicomponents/UIComponents.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+ResourceCheckAdapter::ResourceCheckAdapter() {}
+
+ResourceCheckAdapter::~ResourceCheckAdapter() { listData.clear(); }
+
+uint16_t ResourceCheckAdapter::GetCount(void) { return listData.size() + 1; }
+
+void ResourceCheckAdapter::SetData(std::list<ResourceCheckItem> &data) {
+  if (!listData.empty()) {
+    listData.clear();
+  }
+  for (auto &item : data) { // 使用范围for循环简化代码
+    listData.push_back(item);
+  }
+}
+
+UIView *ResourceCheckAdapter::GetView(UIView *inView, int16_t index) {
+  // 1.先检查列表数据是否为空,若为空则返回空指针
+  if (listData.empty()) {
+    return nullptr;
+  }
+  // 2.接着检查索引是否小于0,若小于0则返回空指针
+  if (index < 0) {
+    return nullptr;
+  }
+  // 3.检查是否超出列表数据大小,若超出则返回空指针
+  size_t uindex = static_cast<size_t>(index); // 明确转换为size_t
+  if (uindex > listData.size()) {
+    return nullptr;
+  }
+
+  ResourceCheckItemView *item = nullptr;
+  if (uindex == listData.size()) {
+    if (inView == nullptr) {
+      item = new ResourceCheckItemView();
+    } else {
+      item = static_cast<ResourceCheckItemView *>(inView);
+      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; // 内存分配失败,返回nullptr
+      }
+      DeleteButton->SetPosition(0, 0);
+      DeleteButton->Resize(380, 100);
+      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,
+                             Color::Green().full); // 确保设置一个有效的颜色值
+      DeleteButton->SetVisible(true);
+    }
+    // 设置点击事件监听器
+    UIView::OnClickListener *clickListener = (UIView::OnClickListener *)
+        OHOS::SafeModeManagerPresenter::GetInstance();
+    DeleteButton->SetOnClickListener(clickListener);
+
+    item->Add(DeleteButton);
+    item->SetViewIndex(index);
+    item->SetOnClickListener(nullptr);
+
+    return item;
+  }
+
+  // 4.通过迭代器访问列表中指定索引位置的元素
+  std::list<ResourceCheckItem>::iterator it = listData.begin();
+  std::advance(it, index); // 使用 std::advance 简化迭代器变动
+  ResourceCheckItem itemData = *it;
+
+  // 5.根据传入的 inView 参数处理
+  if (inView == nullptr) {
+    item = new ResourceCheckItemView();
+  } else {
+    item = static_cast<ResourceCheckItemView *>(inView);
+    item->RemoveAll();
+  }
+  item->SetUpChild();
+  item->SetItemInfo(itemData);
+  item->SetViewIndex(index);
+  item->SetOnClickListener(itemClickListener);
+
+  return item; // 结束 GetView 函数
+}
+
+void ResourceCheckAdapter::AddListItem(const ResourceCheckItem &item) {
+  listData.push_back(item);
+}
+
+} // namespace OHOS
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckItemView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckItemView.cpp
new file mode 100644 (file)
index 0000000..7893677
--- /dev/null
@@ -0,0 +1,47 @@
+#if 0
+
+#include "safemodemanager/include/ResourceCheckItemView.h"
+#include "safemodemanager/include/ResourceCheckAdapter.h"
+
+namespace OHOS {
+
+ResourceCheckItemView::ResourceCheckItemView() {
+  SetPosition(0, 0, 380, 120);
+  SetStyle(STYLE_BACKGROUND_OPA, 255);
+  SetStyle(STYLE_BORDER_RADIUS, 20);
+  SetTouchable(true);
+}
+
+ResourceCheckItemView::~ResourceCheckItemView() { RemoveAll(); }
+
+void ResourceCheckItemView::SetItemInfo(const ResourceCheckItem itemInfo) {
+ 
+  sItemInfo = itemInfo;
+  filenamelabel.SetText(sItemInfo.filename.c_str());
+}
+void ResourceCheckItemView::TearDownChild() {
+  if (!isSetupChild)
+    return;
+
+  Remove(&filenamelabel);
+
+  isSetupChild = false;
+}
+void ResourceCheckItemView::SetUpChild() {
+  if (isSetupChild)
+    return;
+
+  filenamelabel.SetPosition(0, 0, 380, 120);
+  filenamelabel.SetTextColor(Color::White());
+  filenamelabel.SetFont(GILROY_BOLD_FONT, 30);
+  filenamelabel.SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+
+  Add(&filenamelabel);
+  isSetupChild = false;
+}
+int ResourceCheckItemView::GetResourceCheckListIndex() {
+  return sItemInfo.index;
+}
+} // namespace OHOS
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/ResourceCheckView.cpp
new file mode 100644 (file)
index 0000000..12b2d49
--- /dev/null
@@ -0,0 +1,242 @@
+#if 0
+
+#include "safemodemanager/include/ResourceCheckView.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
+
+#include "UiConfig.h"
+#include "ui_resource_string.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+
+// 静态指针,用于获取单例实例
+static ResourceCheckView *g_pResourceCheckView{nullptr};
+
+ResourceCheckView::ResourceCheckView() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "ResourceCheckView::ResourceCheckView");
+  g_pResourceCheckView = this; // 设置单例指针
+}
+
+ResourceCheckView::~ResourceCheckView() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "ResourceCheckView::~ResourceCheckView");
+  ClearAll();                     // 清理资源
+  g_pResourceCheckView = nullptr; // 释放单例指针
+}
+
+ResourceCheckView *ResourceCheckView::GetInstance() {
+  return g_pResourceCheckView; // 返回单例实例
+}
+
+void ResourceCheckView::ClearAll() {
+
+  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() {
+  scrollView = new UIScrollView();
+  if (!scrollView) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "ResourceCheckView::新建滚动视图失败!");
+    return nullptr; // 创建失败,返回空指针
+  }
+
+  // 初始化滚动视图属性
+  InitScrollView();
+
+  // 设置拖拽监听器
+  UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(
+      SafeModeManagerPresenter::GetInstance());
+  if (!dragListener) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerPresenter::获取实例失败!");
+    return nullptr; // 获取失败,返回空指针
+  }
+  scrollView->SetOnDragListener(dragListener);
+
+  // 初始化提示标签
+  InitNoteLabel();
+
+  // 初始化文件名列表
+  InitFilenameList();
+
+  // 添加视图到滚动视图中
+  scrollView->Add(FilenameList);
+  scrollView->Add(notelabel);
+
+  return scrollView; // 返回初始化后的滚动视图
+}
+
+void ResourceCheckView::InitScrollView() {
+  // 设置滚动视图的初始位置和样式
+  scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(),
+                          Screen::GetInstance().GetHeight());
+  scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  scrollView->SetScrollBlankSize(100);
+  scrollView->SetMaxScrollDistance(1000);
+  scrollView->SetThrowDrag(true);
+  scrollView->SetHorizontalScrollState(false); // 禁止水平滑动
+  //   scrollView->SetVerticalScrollState(false);   // 禁止垂直滑动
+}
+void ResourceCheckView::InitNoteLabel() {
+  notelabel = new UILabel();
+  if (!notelabel) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResourceCheckView::新建标题失败!");
+    return; //
+  }
+  // 设置标签的基本属性
+  notelabel->SetPosition(83, 217);
+  notelabel->Resize(300, 60);
+  notelabel->SetViewId(CHECK_FILE_LIST);
+  notelabel->SetStyle(STYLE_TEXT_FONT, 50);
+  notelabel->SetText("File verification..."); // 保持为英语
+  notelabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+  notelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+  notelabel->SetFont(GILROY_BOLD_FONT, 30);
+  notelabel->SetTouchable(true);
+  // 设置点击事件监听器
+  UIView::OnClickListener *clickListener =
+      (UIView::OnClickListener *)OHOS::SafeModeManagerPresenter::GetInstance();
+  notelabel->SetOnClickListener(clickListener);
+}
+
+void ResourceCheckView::InitFilenameList() {
+  // 如果适配器未初始化则创建
+  if (!p_ResourceCheckAdapter) {
+    p_ResourceCheckAdapter = new ResourceCheckAdapter();
+  }
+  // 如果文件名列表未初始化则创建
+  if (!FilenameList) {
+    FilenameList = new UIList();
+    FilenameList->SetPosition(43, 0, 466, 466);
+    // FilenameList->SetReboundSize(100);
+    FilenameList->SetScrollBlankSize(50);
+    FilenameList->SetThrowDrag(true);
+    // FilenameList->SetScrollStateListener(this);
+    FilenameList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+    FilenameList->SetMaxScrollDistance(1000);
+    FilenameList->SetSwipeACCLevel(200);
+    FilenameList->SetDragACCLevel(5);
+    FilenameList->SetVisible(false); // 初始隐藏界面
+  }
+}
+
+//更新提示语
+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 >= 0 && date <= 60) {
+    int progress = date % 5;
+    display.append(progress, '.'); // 添加进度标记点
+    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;
+    }
+  }
+}
+
+void ResourceCheckView::UpdateView() {
+  printf("开始显示验证结果。\r\n");
+  // 读取文件检查结果
+  if (SafeModeManagerModel::GetInstance()->ReadCheckFile()) {
+    std::vector<std::string> filenames =
+        SafeModeManagerModel::GetInstance()->GetCheckDifferentialFiles();
+    int num = SafeModeManagerModel::GetInstance()->GetCheckFileCount();
+    std::string allFilenames =
+        "This verification result is successful. Number of verified files: " +
+        std::to_string(num) + ". Please click the screen to view the data.";
+
+    notelabel->SetText(allFilenames.c_str());
+    printf("验证的文件数量为 %d\r\n", num);
+    if (num != 0) {
+      SafeModeManagerModel::GetInstance()->SetState(Safe_State::RESOURCE_CHECK,
+                                                    true);
+    }
+  } else {
+    notelabel->SetText("File verification is the same."); // 保持为英语
+    SafeModeManagerModel::GetInstance()->SetState(Safe_State::RESOURCE_CHECK,
+                                                  false);
+    printf("验证结果为失败。\r\n");
+  }
+  printf("验证结果已完成。\r\n");
+}
+
+void ResourceCheckView::AddFilenameToList(const ResourceCheckItem &item) {
+  p_ResourceCheckAdapter->AddListItem(item);
+}
+
+void ResourceCheckView::SetViewState() {
+  //检查组件状态
+  if (notelabel == nullptr || FilenameList == nullptr)
+    return;
+
+  int filenums = SafeModeManagerModel::GetInstance()->GetCheckFileCount();
+  bool check_state =
+      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); // 显示文件名列表
+    SafeModeManagerModel *p_SafeModeManagerModel =
+        SafeModeManagerModel::GetInstance();
+    if (!p_SafeModeManagerModel) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_SafeModeManagerModel fail");
+      return; //
+    }
+    // 加载消息列表
+    p_SafeModeManagerModel->InitFilenamesListItems();
+    const ResourceCheckItem *itemInfo =
+        p_SafeModeManagerModel->GetFilenamesListItems();
+    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);
+  }
+}
+
+} // namespace OHOS
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerModel.cpp
new file mode 100644 (file)
index 0000000..bc7cfd6
--- /dev/null
@@ -0,0 +1,455 @@
+#if 0
+#include <array>
+#include <cstdint>
+#include <fstream>
+#include <iostream>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "safemodemanager/include/RepairView.h"
+#include "safemodemanager/include/ResourceCheckView.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerModelC.h"
+#include "safemodemanager/include/SafeModeManagerView.h"
+
+#include "broadcast_feature.h"
+#include "broadcast_service.h"
+#include "cat1_ctl.h"
+#include "cat1_server.h"
+#include "custom_runtime.h"
+#include "custom_utils.h"
+#include "graphic_service.h"
+#include "iostream"
+#include "lwip/apps/http_client.h"
+#include "string"
+#include "tcxo.h"
+#include "thread_adapter.h"
+#include "thread_init.h"
+#include "ui_resource_string.h"
+#include "wearable_log.h"
+#include <cmsis_os.h>
+#include <cmsis_os2.h>
+#include <sstream> 
+#include <string>  
+
+extern "C" {
+// #include "build_version.h"
+// const char *get_version_string(void);
+
+#include "battery_hal.h"
+#include "build_version.h"
+extern uint8_t battery_get_voltage(float *voltage);
+// const char *get_version_string(void);
+
+bool resfile_checksum_thread(void);
+}
+
+static const char *CHECK_DIFFERENTIAL_FILE = "/user/check_differential.txt";
+
+void repair_file_start() {
+  OHOS::SafeModeManagerModel::GetInstance()->RepairStart();
+}
+
+namespace OHOS {
+
+SafeModeManagerModel *SafeModeManagerModel::GetInstance(void) {
+  static SafeModeManagerModel instance;
+  return &instance;
+}
+
+extern "C" {
+
+#include "custom_http_download.h"
+errcode_t http_single_download_stop(void);
+static bool download_repair_file(const char *uristr);
+
+static uint32_t file_total_len = 0;
+static void httpc_download_result(void *arg, httpc_result_t httpc_result,
+                                  u32_t rx_content_len, u32_t srv_res,
+                                  err_t err) {
+  printf("httpc_download_result , httpc_result_t %d, rx_content_len %d , "
+         "srv_res %d, err %d\n",
+         httpc_result, rx_content_len, srv_res, err);
+  if (httpc_result == HTTPC_RESULT_OK) {
+    OHOS::SafeModeManagerModel::GetInstance()->AddRepairCount();
+    //发消息进行重新开始
+    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_DOWNLOAD_RES, nullptr, 0);
+  } else {
+    //结束
+    OHOS::SafeModeManagerModel::GetInstance()->RepairEnd();
+  }
+  http_single_download_stop();
+  file_total_len = 0;
+  return;
+}
+static err_t httpc_download_headers_done(httpc_state_t *connection, void *arg,
+                                         struct pbuf *hdr, u16_t hdr_len,
+                                         u32_t content_len) {
+  printf("httpc_download_headers_done , hdr_len %d ,content_len %d\n", hdr_len,
+         content_len);
+  file_total_len = content_len;
+  return 0;
+}
+static err_t httpc_download_file_recv_ui(httpc_state_t *connection,
+                                         u32_t rx_len, u32_t rx_total_len) {
+  printf("httpc_download_file_recv_ui recv %d bytes total received %d "
+         "filelen %d\r\n",
+         rx_len, rx_total_len, file_total_len);
+  return 0;
+}
+
+// uir:
+// http://snicker.com.cn:8089/FD230/V1.1.49/user/res/font_bin/ja.bin
+// 服务器:snicker.com.cn:8089
+// 端口:8089
+// 保存路径:/user/res/settings/SETTINGS_SAVEELE.bin
+// 下载文件
+static char *my_strndup(const char *s, size_t n) {
+  char *p = new char[n + 1];
+  if (p) {
+    strncpy(p, s, n);
+    p[n] = '\0';
+  }
+  return p;
+}
+
+static bool download_repair_file(const char *uristr) {
+  if (!uristr) {
+    printf("Error: No repair URL provided.\r\n");
+    return false;
+  }
+
+  char *server = NULL;
+  uint16_t port = 0;
+  char *uri = NULL;
+  char *filepath = NULL;
+
+  // 解析 uristr
+  const char *pos = strstr(uristr, "://");
+  if (pos == NULL) {
+    printf("Error: Invalid URL format.\r\n");
+    return false;
+  }
+
+  pos += 3; // 跳过 "://"
+  const char *port_pos = strchr(pos, ':');
+  const char *uri_pos = strchr(pos, '/');
+
+  if (port_pos && uri_pos) {
+    server = my_strndup(pos, port_pos - pos);
+    port = (uint16_t)atoi(port_pos + 1);
+    uri = strdup(uristr);
+  } else {
+    printf("Error: Missing URI in the URL.\r\n");
+    return false;
+  }
+
+  if (!server || !uri) {
+    printf("Error: Failed to allocate memory for server or uri.\r\n");
+    delete[] server;
+    delete[] uri;
+    return false;
+  }
+
+  // 查找以 'V' 开头的版本号
+  const char *version_pos = strstr(uri, "/V");
+  if (version_pos) {
+    const char *first_slash_after_v = strchr(version_pos + 2, '/');
+    if (first_slash_after_v) {
+      filepath =
+          my_strndup(first_slash_after_v + 1, strlen(first_slash_after_v + 1));
+    } else {
+      filepath = strdup("");
+    }
+  } else {
+    filepath = strdup("");
+  }
+
+  // 打印解析结果
+  printf("download_repair_file called with parameters:\n");
+  printf("  Server: %s\n", server);
+  printf("  Port: %d\n", port);
+  printf("  URI: %s\n", uri);
+  printf("  Filepath: %s\n", filepath);
+
+  // // 拼接服务器域名
+  // size_t server_with_port_len = strlen(server) + 6; //
+  // 考虑端口号长度加上分隔符长度 char *server_with_port = new
+  // char[server_with_port_len]; snprintf(server_with_port,
+  // server_with_port_len, "%s:%d", server, port);
+
+  // 通讯开始,唤醒 cat1
+  uapi_cat1_keep_wakeup(1);
+  // 开始下载
+  errcode_t rett = http_single_download_start(
+      (uint8_t *)server, port, (uint8_t *)uri, (uint8_t *)filepath,
+      httpc_download_result, httpc_download_headers_done,
+      httpc_download_file_recv_ui);
+  printf("download_repair_file: %d \r\n", rett);
+
+  // 释放内存
+  delete[] server;
+  delete[] uri;
+  delete[] filepath;
+  if (rett != ERRCODE_SUCC) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "download_repair_file: %d \r\n",
+                  rett);
+    return false;
+  }
+
+  return true;
+}
+}
+/* ---------------------------------- map修改 ---------------------------------
+ */
+/*显示状态map*/
+std::array<SafeStateInfo, SAFE_STATE_COUNT> safestateInfo = {{
+    {Safe_State::BLE_OTA, false},
+    {Safe_State::AUTO_OTA, false},
+    {Safe_State::FACTORY_RESET, false},
+    {Safe_State::RESOURCE_CHECK, false},
+    {Safe_State::REPAIR_FILE, false},
+}};
+//设置某个配置状态
+void SafeModeManagerModel::SetState(Safe_State state, bool executeAction) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetState: %d", state);
+  //将状态赋值
+  int stateIndex = static_cast<int>(state);
+  if (stateIndex > 0 && stateIndex < SAFE_STATE_COUNT) {
+    //检查状态是否一致
+    if (safestateInfo[stateIndex].active != executeAction) {
+      safestateInfo[stateIndex].active = executeAction;
+      safestateInfo[stateIndex].state = state;
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "state is same");
+    }
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "state is invalid");
+  }
+}
+//获取某个配置状态
+bool SafeModeManagerModel::IsState(Safe_State state) const {
+  int stateIndex = static_cast<int>(state);
+  if (stateIndex > 0 && stateIndex < SAFE_STATE_COUNT) {
+    return safestateInfo[stateIndex].active;
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "state is invalid");
+    return false;
+  }
+}
+//打印所有配置状态
+void SafeModeManagerModel::PrintState() const {
+  for (int i = 0; i < SAFE_STATE_COUNT; i++) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "state[%d]: %d", i,
+                  safestateInfo[i].active);
+  }
+}
+/* --------------------------------- 恢复出厂相关
+ * --------------------------------- */
+// 恢复出厂
+bool SafeModeManagerModel::FactorySet() {
+  do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING,
+                                  nullptr, 0);
+  return true;
+}
+
+/*-----------------------------资源校验相关-----------------------------*/
+// 资源校验
+bool SafeModeManagerModel::ResourceCheck() {
+  do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CHECK_RES, nullptr, 0);
+  return true;
+}
+
+// 进行文件读取
+bool SafeModeManagerModel::ReadCheckFile() {
+  resource_check_files.clear();                  // 清空数组原内容
+  std::ifstream infile(CHECK_DIFFERENTIAL_FILE); // 打开差异文件
+
+  if (!infile.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "无法打开文件: %s",
+                  CHECK_DIFFERENTIAL_FILE);
+    return false;
+  }
+
+  std::string filename;
+  while (std::getline(infile, filename)) {      // 逐行读取文件
+    if (!filename.empty()) {                    // 确保文件名不为空
+      resource_check_files.push_back(filename); // 将文件名添加到向量中
+    }
+  }
+
+  infile.close(); // 关闭文件
+  return true;
+}
+// 获取校验状态
+bool SafeModeManagerModel::GetResourceCheckState() const {
+  return resource_check_state;
+}
+// 设置校验状态
+void SafeModeManagerModel::SetResourceCheckState(bool state) {
+  resource_check_state = state;
+}
+// 获取校验数组
+const std::vector<std::string> &
+SafeModeManagerModel::GetCheckDifferentialFiles() const {
+  return resource_check_files; // 返回资源检查文件列表
+}
+// 获取文件个数
+size_t SafeModeManagerModel::GetCheckFileCount() const {
+  return resource_check_files.size(); // 返回文件个数
+}
+// 更新文件校对界面
+void SafeModeManagerModel::UpdateCheckView(int date) {
+  auto safeModeView = SafeModeManagerView::GetInstance();
+  if (safeModeView != nullptr) {
+    auto resourceCheckView = ResourceCheckView::GetInstance();
+    if (safeModeView->GetSafeScrollView(VIEW_RESOURCE_CHECK) != nullptr) {
+      resourceCheckView->UpdateView(date);
+      if (date == 61) {
+        LOS_Msleep(1000); // 暂停1秒
+        resourceCheckView->UpdateView();
+      }
+    }
+  }
+}
+
+/* --------------------------------- 配置列表相关
+ * --------------------------------- */
+// 初始化消息列表项
+void SafeModeManagerModel::InitFilenamesListItems() {
+  numberOfItems = resource_check_files.size(); // 获取大小
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "numberOfItems: %d", numberOfItems);
+
+  for (size_t i = 0; i < numberOfItems && i < MAX_RESOURCE_CHECK_FILE_NUM;
+       i++) {
+    Filenames[i] = {static_cast<uint16_t>(i), resource_check_files[i].c_str()};
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Filenames[%d].filename: %s", i,
+                  Filenames[i].filename);
+  }
+}
+// 获取消息列表项
+const ResourceCheckItem *SafeModeManagerModel::GetFilenamesListItems() const {
+  return Filenames;
+}
+// 获取消息数量
+uint16_t SafeModeManagerModel::GetFilenamesCount() const {
+  return numberOfItems;
+}
+
+/* ---------------------------------- 下载修复文件
+ * ---------------------------------- */
+//下载数
+uint16_t SafeModeManagerModel::GetRepairCount() const { return repair_count; }
+void SafeModeManagerModel::SetRepairCount(uint16_t count) {
+  repair_count = count;
+}
+//获取版本号
+std::string SafeModeManagerModel::GetVersion() const {
+  std::string version = std::string("V") + get_version_string();
+  return version;
+}
+//增加下载数
+void SafeModeManagerModel::AddRepairCount() { repair_count++; }
+//获取信号值sign
+uint8_t SafeModeManagerModel::GetSignal() const {
+  return uapi_dev_runtime_get_cat1_signal();
+}
+//获取运营商
+std::string SafeModeManagerModel::GetOperator() const {
+  std::string operator_name = uapi_dev_runtime_get_cat1_operator();
+  return operator_name;
+}
+/*获取下载http地址
+    http://snicker.com.cn:8089/FD230/V1.1.14_20240706_182936_CT/filename
+*/
+std::string SafeModeManagerModel::GetRepairUrl() const {
+  std::string filename = GetFilenamesListItems()[repair_count].filename;
+  std::string url =
+      "http://snicker.com.cn:8089/FD230/" + GetVersion() + filename;
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetRepairUrl url: %s", url.c_str());
+  return url;
+}
+//控制cat1
+void SafeModeManagerModel::uapi_cat1_wakeup_cat1(bool wakeupstate) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wakeupstate: %d", wakeupstate);
+  uapi_set4GCapability(wakeupstate);
+  return;
+}
+//开始修复
+bool SafeModeManagerModel::RepairStart() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Repair");
+  if (download_repair_file(GetRepairUrl().c_str()) == false) {
+    RepairEnd();
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RepairEnd");
+    return false;
+  }
+  return true;
+}
+// 0.下载失败
+// 1.下载成功
+bool SafeModeManagerModel::RepairEnd() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RepairEnd");
+  if (GetRepairCount() != GetFilenamesCount()) {
+    //下载失败
+    SetState(Safe_State::REPAIR_FILE, false);
+    http_single_download_stop();
+    uapi_dev_runtime_set_repair_download_status(3);
+    return false;
+  } else {
+    //下载成功
+    SetState(Safe_State::REPAIR_FILE, true);
+    uapi_dev_runtime_set_repair_download_status(2);
+  }
+  repair_count = 0;
+  return true;
+}
+// 更新文件下载
+void SafeModeManagerModel::UpdateRepairView(int date) {
+  auto safeModeView = SafeModeManagerView::GetInstance();
+  if (safeModeView != nullptr) {
+    auto RepairView = RepairView::GetInstance();
+    if (safeModeView->GetSafeScrollView(VIEW_REPAIR_FILE) != nullptr) {
+      RepairView->UpdateView(date);
+    }
+  }
+}
+//更新信号与运营商
+void SafeModeManagerModel::UpdateSginOperate() {
+  auto safeModeView = SafeModeManagerView::GetInstance();
+  if (safeModeView != nullptr) {
+    auto RepairView = RepairView::GetInstance();
+    if (safeModeView->GetSafeScrollView(VIEW_REPAIR_FILE) != nullptr) {
+      RepairView->UpdateSginandOperate();
+    }
+  }
+}
+
+//手表信息
+std::string SafeModeManagerModel::get_voltage_and_version_string(void) {
+  // 电量
+  float voltage = 0.0F;
+  uint8_t value = battery_get_voltage(&voltage);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "battery_get_voltage = %d", value);
+
+  // 版本号
+  std::string version_string =
+      std::string("V") + get_version_string(); // 修正字符串拼接
+
+  // 拼接字符串
+  std::ostringstream oss;
+  oss << "bat: " << static_cast<int>(value) << "% " << version_string;
+
+  return oss.str();
+}
+
+// 蓝牙名称
+std::string SafeModeManagerModel::get_bluetooth_name(void) {
+  uint8_t ble_name[30] = {0};
+  uint32_t ble_name_len = sizeof(ble_name);
+  errcode_t ret = uapi_get_nv_btname(ble_name, &ble_name_len);
+
+  return std::string(reinterpret_cast<char *>(ble_name));
+}
+} // namespace OHOS
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp
new file mode 100644 (file)
index 0000000..7890a98
--- /dev/null
@@ -0,0 +1,278 @@
+#if 0
+#include "AppViewIDs.h"
+#include "KeyInputListener.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include "components/ui_label_ext.h"
+#include "custom_utils.h"
+#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"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
+namespace OHOS {
+
+// 当前Presenter属性实例化的内存指针
+static SafeModeManagerPresenter *g_pSafeModeManagerPresenter = nullptr;
+SafeModeManagerPresenter::SafeModeManagerPresenter() {
+  // 设置常亮
+  ScreenAlwaysOnCtr(0);
+  ScreenAlwaysOnCtr(1);
+
+  g_pSafeModeManagerPresenter = this;
+}
+
+SafeModeManagerPresenter::~SafeModeManagerPresenter() {
+
+  g_pSafeModeManagerPresenter = nullptr;
+}
+
+SafeModeManagerPresenter *SafeModeManagerPresenter::GetInstance() {
+
+  return g_pSafeModeManagerPresenter;
+}
+
+void SafeModeManagerPresenter::OnStart() {
+
+  Presenter<SafeModeManagerView>::OnStart();
+}
+
+void SafeModeManagerPresenter::OnPause(void) {
+
+  Presenter<SafeModeManagerView>::OnPause();
+}
+
+void SafeModeManagerPresenter::OnResume(void) {
+
+  Presenter<SafeModeManagerView>::OnResume();
+}
+
+void SafeModeManagerPresenter::OnStop(void) {
+
+  Presenter<SafeModeManagerView>::OnStop();
+}
+
+bool SafeModeManagerPresenter::OnDrag(UIView &view, const DragEvent &event) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SafeModeManagerPresenter::OnDrag");
+  SafeModeManagerView *p_SafeModeManagerView =
+      SafeModeManagerView::GetInstance();
+  if (p_SafeModeManagerView == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  " SafeModeManagerView::GetInstance fail!");
+    return false;
+  }
+  if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT &&
+      (event.GetDeltaX() > 20) &&
+      (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY())))) {
+    if (&view ==
+        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;
+}
+
+bool SafeModeManagerPresenter::OnClick(UIView &view, const ClickEvent &event) {
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerPresenter::OnClick %s",
+                view.GetViewId());
+  SafeModeManagerView *p_SafeModeManagerView =
+      SafeModeManagerView::GetInstance();
+  if (p_SafeModeManagerView == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  " SafeModeManagerView::GetInstance fail!");
+    return false;
+  }
+
+  if (strcmp(view.GetViewId(), BLE_OTA) == 0) {
+    /*蓝牙ota*/    
+      }
+  if (strcmp(view.GetViewId(), AUTO_OTA) == 0) {
+    /*auto ota*/
+    static int sppinit=0;
+    if (sppinit == 0)
+    {
+      //BtInitSpp();
+     
+      sppinit = 1;
+    } 
+  }
+  if (strcmp(view.GetViewId(), FACTORY_RESET_SAFE) == 0) {
+    /*恢复出厂*/
+    SafeModeManagerModel::GetInstance()->FactorySet();
+  }
+  if (strcmp(view.GetViewId(), RESOURCE_CHECK) == 0) {
+    /*资源校验*/
+    p_SafeModeManagerView->ChangeView(VIEW_SAFE_LIST, VIEW_RESOURCE_CHECK);
+    if (SafeModeManagerModel::GetInstance()->IsState(
+            Safe_State::RESOURCE_CHECK) == false) {
+      SafeModeManagerModel::GetInstance()->ResourceCheck();
+    }
+  }
+  if (strcmp(view.GetViewId(), RE_START) == 0) {
+    /*重启*/
+    uapi_reboot_device(); // 重启
+  }
+  //点击查看列表
+  if (strcmp(view.GetViewId(), CHECK_FILE_LIST) == 0) {
+    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_START) == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerPresenter::OnClick REPAIR_FILE_START");
+    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()->RepairStart();
+    }
+  }
+  //点击唤醒cat1
+  if (strcmp(view.GetViewId(), WAKE_UP) == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "SafeModeManagerPresenter::OnClick WAKE_CAT1");
+    // 唤醒cat1
+    SafeModeManagerModel::GetInstance()->uapi_cat1_wakeup_cat1(true);
+  }
+  return true;
+}
+
+// 安全模式界面定时器
+void SafeModeManagerPresenter::OnTickEvent() {
+  // 开始校验文件
+  uint8_t check_state = uapi_dev_runtime_get_checkres_status();
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "SafeModeManagerPresenter::OnTickEvent %d", check_state);
+  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();
+
+  //如果下载数等于总数 -> 下载成功
+  if (SafeModeManagerModel::GetInstance()->GetRepairCount() ==
+          SafeModeManagerModel::GetInstance()->GetCheckFileCount() &&
+      download_state == 1) {
+    // 下载完成 标志位设置为 2
+    download_state = 2;
+    SafeModeManagerModel::GetInstance()->RepairEnd();
+  }
+
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "download state %d", download_state);
+  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_LOGE(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_LOGE(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;
+  }
+  //处于修复界面,更新信号
+  SafeModeManagerView *p_SafeModeManagerView =
+      SafeModeManagerView::GetInstance();
+  if (p_SafeModeManagerView == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  " SafeModeManagerView::GetInstance fail!");
+    return;
+  }
+  if (p_SafeModeManagerView->GetSafeScrollView(VIEW_REPAIR_FILE)->IsVisible()) {
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::SafeModeManagerModel::UpdateSginOperate,
+                  OHOS::SafeModeManagerModel::GetInstance()));
+  }
+}
+bool SafeModeManagerPresenter::OnKeyAct(UIView &view, const KeyEvent &event) {
+  unsigned short keyID = event.GetKeyId();
+  unsigned short keyState = event.GetState();
+  // 如果是power键,且是亮屏状态,按键释放就返回上一级
+  if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) &&
+      keyState == 1 && uapi_get_screen_state() == 0) {
+    // NativeAbility::GetInstance().Back();
+  }
+  return true;
+}
+} // namespace OHOS
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/safemodemanager/src/SafeModeManagerView.cpp
new file mode 100644 (file)
index 0000000..a3f9001
--- /dev/null
@@ -0,0 +1,378 @@
+#if 0
+#include "safemodemanager/include/SafeModeManagerView.h"
+#include "safemodemanager/include/RepairView.h"
+#include "safemodemanager/include/ResourceCheckView.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
+
+#include "UiConfig.h"
+#include "common/image_cache_manager.h"
+#include "components/ui_button.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() {
+  /*删除变量*/
+
+  container_->RemoveAll();
+
+  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() {
+  // 初始化 SafeModeScrollView
+  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,
+                                                 Color::Black().full);
+    SafeModeScrollView[VIEW_SAFE_LIST]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+  }
+
+  // 初始化标题
+  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_);
+
+  // 初始化信息标签
+  std::string infostr =
+      SafeModeManagerModel::GetInstance()->get_voltage_and_version_string() +
+      "\n" + SafeModeManagerModel::GetInstance()->get_bluetooth_name();
+  labelInfo_.SetPosition(43, 100, 380, 60);
+  labelInfo_.SetFont(GILROY_BOLD_FONT, 26);
+  labelInfo_.SetText(infostr.c_str());
+  labelInfo_.SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+  labelInfo_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+  SafeModeScrollView[VIEW_SAFE_LIST]->Add(&labelInfo_);
+
+  // 定义安全视图项
+  SafeViewItem safeItems[] = {
+      {{&backgroundBLE_, {43, 120}},
+       {&btnBLE_, {245, 120}, BLE_OTA},
+       {&labelBLEStatus_, "BLE OTA", {90, 153}}},
+      // {{&backgroundAutoOTA_, {43, 0}},
+      //  {&btnAutoOTA_, {245, 0}, AUTO_OTA},
+      //  {&labelAutoOTAStatus_, "Auto OTA", {90, 0}}},
+      {{&backgroundFactoryReset_, {43, 0}},
+       {&btnFactoryReset_, {245, 0}, FACTORY_RESET_SAFE},
+       {&labelFactoryResetStatus_, "Factory Reset", {90, 0}}},
+      {{&backgroundResourceCheck_, {43, 0}},
+       {&btnResourceCheck_, {245, 0}, RESOURCE_CHECK},
+       {&labelResourceCheckStatus_, "Resource Check", {90, 0}}},
+      {{&backgroundRestart_, {43, 0}},
+       {&btnRestart_, {245, 0}, RE_START},
+       {&labelRestart_, "Restart", {90, 0}}}};
+
+  // 初始 Y 坐标
+  int initialY = 180;
+  int itemHeight = 120; // 每个 item 的高度,包括背景和按钮的高度
+
+  // 遍历安全视图项并设置UI元素
+  for (const auto &item : safeItems) {
+    // 设置背景
+    item.background.background->SetPosition(item.background.position.x,
+                                            initialY, 380, 100);
+    item.background.background->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+    item.background.background->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+    item.background.background->SetStyle(STYLE_BORDER_RADIUS, 100);
+    SafeModeScrollView[VIEW_SAFE_LIST]->Add(item.background.background);
+
+    // 设置状态标签
+    item.statusLabel.label->SetPosition(item.statusLabel.position.x,
+                                        initialY + 33, 200, 60);
+    item.statusLabel.label->SetFont(GILROY_BOLD_FONT, 30);
+    item.statusLabel.label->SetText(item.statusLabel.text.c_str());
+    if (item.statusLabel.text == "Resource Check") {
+      item.statusLabel.label->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
+      item.statusLabel.label->SetAlign(TEXT_ALIGNMENT_CENTER);
+      item.statusLabel.label->SetRollSpeed(23);
+    }
+    SafeModeScrollView[VIEW_SAFE_LIST]->Add(item.statusLabel.label);
+
+    // 设置按钮
+    item.button.button->SetPosition(item.button.position.x, initialY, 200, 100);
+    item.button.button->SetViewId(item.button.viewId);
+    item.button.button->SetOnClickListener(presenter_);
+    SafeModeScrollView[VIEW_SAFE_LIST]->Add(item.button.button);
+
+    // 更新 Y 坐标
+    initialY += itemHeight;
+  }
+}
+/* -------------------------------------------------------------------------- */
+// 主视图
+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)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            SafeModeScrollView[thisView] = p_BleOTAView->SystemAbouTheWatchtInitIView();
+            container_->Add(SafeModeScrollView[thisView]);
+#endif
+  }
+  return true;
+}
+
+// 自动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();
+            if (p_AutoOTAView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            SafeModeScrollView[thisView] = p_AutoOTAView->SystemFactoryResetViewInit();
+            container_->Add(SafeModeScrollView[thisView]);
+#endif
+  }
+  return true;
+}
+
+// 恢复出厂
+bool SafeModeManagerView::ChangeToFactoryView(int16_t thisView) {
+  if (SafeModeScrollView[thisView] == nullptr) {
+#if 0
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToFactoryView");
+            p_FactoryView = new SystemRestart();
+            if (p_FactoryView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            SafeModeScrollView[thisView] = p_FactoryView->SystemRestartViewInit();
+            container_->Add(SafeModeScrollView[thisView]);
+#endif
+  }
+  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;
+    }
+    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;
+    }
+    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;
+    }
+  }
+  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
+#endif
\ No newline at end of file