增加安全模式Slice
authorCaisking <3449750381@qq.com>
Mon, 9 Sep 2024 09:53:22 +0000 (17:53 +0800)
committerCaisking <3449750381@qq.com>
Mon, 9 Sep 2024 09:53:22 +0000 (17:53 +0800)
15 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/rebootandshutdown/include/RebootAndShutdownModel.h
code/sdk/application/wearable/fd230app/nativeui/rebootandshutdown/src/RebootAndShutdownModel.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerView.cpp [new file with mode: 0644]
code/sdk/application/wearable/nativeabilityfwk/src/NativeAbility.cpp
code/sdk/application/wearable/nativeabilityfwk/src/StartNative.cpp
code/sdk/drivers/peripheral/utils/custom_resfile_check.c

index 3bac645..06c9715 100644 (file)
@@ -700,6 +700,12 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/codedlock/src/CodedLockPresenter.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/codedlock/src/CodedLockModel.cpp
 
+    #安全模式
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/safemodemanager/src/SafeModeManagerView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/safemodemanager/src/SafeModeManagerModel.cpp
+
+
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/phone/src/PhoneCallView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/phone/src/PhoneCallPresenter.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/phone/src/PhoneDirView.cpp
index 8ba8419..200735a 100644 (file)
@@ -121,7 +121,7 @@ typedef enum : uint16_t
     VIEW_GOAL,           // 每日目标
     VIEW_CALCULATOR,     // 计算器
     VIEW_SCHEDULE,       // schedule
-    VIEW_SLEEPMODE, // sleep mode
+    VIEW_SLEEPMODE,      // sleep mode
     /*屏蔽Slice*/
     VIEW_PHONERING,     // 拨号界面
     VIEW_PHONECALLING,  // 来电
@@ -136,6 +136,7 @@ typedef enum : uint16_t
     VIEW_MAIN_ALIPAY,
 #endif
     /*请在最末添加新的viewID*/
+    VIEW_SAFE_MODE,           // 安全模式
     VIEW_MAX_INTER_APP,       // 在此之前添加native应用ID.
     VIEW_EXTERN_APP = 0xFFFE, // 三方应用
     VIEW_INVALIDE_APP = 0xFFFF,
index 6078437..f267a25 100644 (file)
@@ -6,11 +6,16 @@
 
 namespace OHOS
 {
+    enum class LaunchMode
+    {
+        NORMAL_MODE, // 普通模式
+        SAFE_MODE    // 安全模式
+    };
     class NativeLauncher
     {
     public:
         static NativeLauncher &GetInstance(void);
-        void InitNativeLauncher(void);
+        void InitNativeLauncher(LaunchMode mode);
         void InitMainSlice(void);
         void InitSetCardSlice(void);
         void InitAddCardSlice(void);
@@ -109,6 +114,7 @@ namespace OHOS
         void InitFastTrainingSlice(void);
         void InitFastTrainingAttentionSlice(void);
         void InitCodedlockSlice(void);
+        void InitSafeModeSlice(void);
         /* -------------------------------------------------------------------------- */
         // void InitPhoneSlice(void);
         void InitPhoneCallSlice(void);
index b9ffded..82779db 100644 (file)
 /*密码锁*/
 #include "codedlock/include/CodedLockView.h"
 #include "codedlock/include/CodedLockPresenter.h"
+/*安全模式*/
+#include "safemodemanager/include/SafeModeManagerView.h"
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
 /* -------------------------------------------------------------------------- */
 #include "secondaryfunction/include/SecondaryFunctionPresenter.h"
 #include "secondaryfunction/include/SecondaryFunctionView.h"
@@ -411,6 +414,8 @@ namespace OHOS
         //{VIEW_SET_HEART, &NativeLauncher::InitSetHeartSlice},
         /*密码锁*/
         {VIEW_CODED_LOCK, &NativeLauncher::InitCodedlockSlice},
+        /*安全模式*/
+        {VIEW_SAFE_MODE, &NativeLauncher::InitSafeModeSlice},
         /* -------------------------------------------------------------------------- */
         /*智能助手*/
         {VIEW_OFFLINEVOICE, &NativeLauncher::InitOfflineVoice},
@@ -451,62 +456,79 @@ namespace OHOS
         return instance;
     }
 
-    void NativeLauncher::InitNativeLauncher()
+    void NativeLauncher::InitNativeLauncher(LaunchMode mode)
     {
 #ifdef JS_ENABLE
         ACELite::ProductAdapter::SetScreenSize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
 #endif
-        // ConfigModel::GetInstance()->Init();
-        // 初始化语言
-        GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::VECTOR_FONT_DIR, HARMONYOS_VECTOR_FONT_FILENAME);
-        //GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, HARMONYOS_VECTOR_ARABIC_FILENAME);
-        GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, GILROY_BOLD_FONT);       // 注册字体
-        GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, AUDIOWIDE_REGULAR_FONT); // 注册字体
-
-        
-        // 默认设置全局字体为HarmonyOSFont,其他时候根据语言选择字体名字
-        set_current_global_font_name(HARMONYOS_VECTOR_FONT_FILENAME);
-    
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher  fontname %s", DEFAULT_VECTOR_FONT_FILENAME);
-        /* -------------------------------------------------------------------------- */
-        // 从语言json配置里面读取语言包
-        if (language::GetInstance()->InitLangues() == false)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLangues error");
-        }
-        // 初始化所有预加载slice
-        InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
-        InitAllNativeSlices();
-        CallerLogModel::GetInstance()->InitPhoneService();
-        PresenterTask::GetInstance()->Init();
-        PlayersModel::GetInstance()->AudioInit();
-        ActivityModel::GetInstance()->Init();
-        ScreenModels::GetInstance()->InitKvStorage();
-        VocassistModel::GetInstance()->Init();
-        HeartModel::GetInstance()->Init();
-        BluetoothModel::GetInstance()->Init();
-        TraingModel::GetInstance()->Init();     // 训练消息订阅
-        TakephotosModel::GetInstance()->Init(); // 拍照消息订阅
-        MessageModel::GetInstance().Init();     // 消息订阅监听
-
-        // 初始化默认首页
-        ScreenModels::GetInstance()->PreLoadAppimages();
-        // NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
-        //  注册按键事件
-        RebootAndShutdownModel::GetInstance().RegisterAllKeyEvents();
-
-        // 开机检测充电状态
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get_charge_stat is %d", get_charge_stat());
-        if (get_charge_stat())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Power is Charging!");
-            DialModelCharge::GetInstance()->UpdatechargeStatus(1);
-        }
-        /*开机读取天气历史数据*/
-        read_jsonHistory_weather();
-
-        C_ScheduleDataReadFromFile();
-        mmi_sleep_mode_switch_read();
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "LaunchMode mode is %d", mode);
+        if (mode == LaunchMode::SAFE_MODE)
+        {
+            GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, GILROY_BOLD_FONT); // 注册字体
+            set_current_global_font_name(GILROY_BOLD_FONT);
+            /*加载安全模式Slice*/
+            (this->*(SLICE_MAPPER[VIEW_SAFE_MODE].func))();
+            NativeAbility::GetInstance().SetDefaultSliceId(VIEW_SAFE_MODE);
+            InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
+            CallerLogModel::GetInstance()->InitPhoneService();
+            PresenterTask::GetInstance()->Init();
+            PlayersModel::GetInstance()->AudioInit();
+            ScreenModels::GetInstance()->InitKvStorage();
+            BluetoothModel::GetInstance()->Init();
+        }
+        else if (mode == LaunchMode::NORMAL_MODE)
+        {
+            // ConfigModel::GetInstance()->Init();
+            // 初始化语言
+            GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::VECTOR_FONT_DIR, HARMONYOS_VECTOR_FONT_FILENAME);
+            // GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, HARMONYOS_VECTOR_ARABIC_FILENAME);
+            GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, GILROY_BOLD_FONT);       // 注册字体
+            GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR, AUDIOWIDE_REGULAR_FONT); // 注册字体
+
+            // 默认设置全局字体为HarmonyOSFont,其他时候根据语言选择字体名字
+            set_current_global_font_name(HARMONYOS_VECTOR_FONT_FILENAME);
+
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher  fontname %s", DEFAULT_VECTOR_FONT_FILENAME);
+            /* -------------------------------------------------------------------------- */
+            // 从语言json配置里面读取语言包
+            if (language::GetInstance()->InitLangues() == false)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLangues error");
+            }
+            // 初始化所有预加载slice
+            InitBtHeadsetEvent(); // 蓝牙ct和tg适配初始化
+            InitAllNativeSlices();
+            CallerLogModel::GetInstance()->InitPhoneService();
+            PresenterTask::GetInstance()->Init();
+            PlayersModel::GetInstance()->AudioInit();
+            ActivityModel::GetInstance()->Init();
+            ScreenModels::GetInstance()->InitKvStorage();
+            VocassistModel::GetInstance()->Init();
+            HeartModel::GetInstance()->Init();
+            BluetoothModel::GetInstance()->Init();
+            TraingModel::GetInstance()->Init();     // 训练消息订阅
+            TakephotosModel::GetInstance()->Init(); // 拍照消息订阅
+            MessageModel::GetInstance().Init();     // 消息订阅监听
+
+            // 初始化默认首页
+            ScreenModels::GetInstance()->PreLoadAppimages();
+            // NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
+            //  注册按键事件
+            RebootAndShutdownModel::GetInstance().RegisterAllKeyEvents();
+
+            // 开机检测充电状态
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get_charge_stat is %d", get_charge_stat());
+            if (get_charge_stat())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Power is Charging!");
+                DialModelCharge::GetInstance()->UpdatechargeStatus(1);
+            }
+            /*开机读取天气历史数据*/
+            read_jsonHistory_weather();
+
+            C_ScheduleDataReadFromFile();
+            mmi_sleep_mode_switch_read();
+        }
     }
 
     void NativeLauncher::InitAllNativeSlices(void)
@@ -1246,6 +1268,18 @@ namespace OHOS
         }
         NativeAbility::GetInstance().AddSliceProxy(VIEW_CODED_LOCK, codedlockView);
     }
+    // 安全模式
+    void NativeLauncher::InitSafeModeSlice(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitSafeModeSlice");
+        SliceProxy *safemodeView = new AbilitySliceProxy<SafeModeManagerView, SafeModeManagerPresenter>;
+        if (safemodeView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "safemodeView is nullptr");
+            return;
+        }
+        NativeAbility::GetInstance().AddSliceProxy(VIEW_SAFE_MODE, safemodeView);
+    }
     /* -------------------------------------------------------------------------- */
     // 查找手机
     void NativeLauncher::InitFindPhoneSlice(void)
index d1393fd..c830bc0 100644 (file)
@@ -1,3 +1,9 @@
+/***
+ * @Date: 2024-07-24 09:43:53
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-09 10:45:53
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/rebootandshutdown/include/RebootAndShutdownModel.h
+ */
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-07-18 14:55:21
@@ -17,6 +23,8 @@ namespace OHOS
         static RebootAndShutdownModel &GetInstance(void);
         void HandFirstTimeStartJumpToMainView(void);
         void RegisterAllKeyEvents(void);
+        bool GetPowerKey();
+        void SetPowerKey(bool state);
 
     private:
         RebootAndShutdownModel();
@@ -30,7 +38,9 @@ namespace OHOS
         bool RegisterFuncKeyLongPressEvent(void);
         bool RegisterFuncKeyClickEvent(void);
         bool RegisterFuncKeyDoubleClickEvent(void);
-
+        bool RegisterPowerAndFuncKeyPressEvent(void);
+        bool powerKeyPressed{false};
+        bool funcKeyPressed{false};
     };
 }
 
index d320562..5f0a7d6 100644 (file)
@@ -442,7 +442,95 @@ namespace OHOS
         }
         return true;
     }
+    bool RebootAndShutdownModel::GetPowerKey()
+    {
+        return powerKeyPressed;
+    }
+    void RebootAndShutdownModel::SetPowerKey(bool state)
+    {
+        powerKeyPressed = state;
+    }
+    static void PowerAndFuncKeyPressCallBack(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PowerAndFuncKeyPressCallBack");
+        /*关闭动画*/
+        ShutDownImageAnimatorView *shutDownImageAnimatorView = ShutDownImageAnimatorView::GetInstance();
+        if (shutDownImageAnimatorView != nullptr && true == shutDownImageAnimatorView->GetShutDownImageAnimatorIsStart())
+        {
+            return;
+        }
+        /*第一次启动*/
+        if (true == ConfigModel::GetInstance()->GetisFirstTimeStart())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PowerAndFuncKeyPressCallBack: first time power on");
+            return;
+        }
+        /*是否亮屏*/
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        if (!display_api)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+            return;
+        }
+        if (display_api->get_screen_state() == SCREEN_ON)
+        {
+            uint16_t curSliceId = NativeAbility::GetInstance().GetCurSliceId();
+            /*处于主界面锁屏 或者密码锁界面*/
+            if (curSliceId == VIEW_MAIN || curSliceId == VIEW_CODED_LOCK)
+            {
+                /*被锁*/
+                if (uapi_dev_runtime_get_lock_status())
+                {
+                    if (curSliceId != VIEW_CODED_LOCK)
+                    {
+                        NativeAbility::GetInstance().EnterSlice(VIEW_CODED_LOCK);
+                    }
+                    return;
+                }
+            }
+            // 全局切换安全模式界面
+            NativeAbility::GetInstance().EnterSlice(VIEW_SAFE_MODE);
+        }
+    }
+
+    // 处理同时按下电源键和功能键的事件
+    static void HandlePowerAndFuncKeySetPress(void)
+    {
+        RebootAndShutdownModel::GetInstance().SetPowerKey(true);
+    }
+    static void HandlePowerAndFuncKeyPress(void)
+    {
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(PowerAndFuncKeyPressCallBack));
+    }
+    // 注册同时按下电源键和功能键的事件
+    bool RebootAndShutdownModel::RegisterPowerAndFuncKeyPressEvent(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootAndShutdownModel::RegisterPowerAndFuncKeyPressEvent");
+#if 0
+        int32_t ret = uapi_button_register_double_event_cb(HandlePowerAndFuncKeyPress, BUTTON_PWR_PRESS, BUTTON1_PRESS);
+        if (ret != ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register FuncKey or Power Click Event error, ret = %d", ret);
+            return false;
+        }   
+
+        int32_t funcret = uapi_button_register_event_cb(HandlePowerAndFuncKeyPress, BUTTON1_PRESS);
+        if (funcret != ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to register Function Button Press Event, ret = %d", funcret);
+            return false;
+        }
+#endif
+        // 注册按键按下事件 2秒
+        int32_t powerret = uapi_button_register_event_cb(HandlePowerAndFuncKeyPress, BUTTON_PWR_LONGPRESS_2S);
+        if (powerret != ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to register Power Button Press Event, ret = %d", powerret);
+            return false;
+        }
 
+        return true;
+    }
     /*注册所有按键事件*/
     void RebootAndShutdownModel::RegisterAllKeyEvents(void)
     {
@@ -452,5 +540,6 @@ namespace OHOS
         RegisterFuncKeyLongPressEvent();
         // RegisterFuncKeyClickEvent();
         RegisterFuncKeyDoubleClickEvent();
+        RegisterPowerAndFuncKeyPressEvent();
     }
 }
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModel.h b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModel.h
new file mode 100644 (file)
index 0000000..4769631
--- /dev/null
@@ -0,0 +1,39 @@
+/***
+ * @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 <string>
+#include <vector>
+
+namespace OHOS
+{
+    class SafeModeManagerModel
+    {
+    public:
+        // 获取单例实例
+        static SafeModeManagerModel *GetInstance();
+
+        // 资源检查和读取差异文件
+        bool ResourceCheck();
+        bool ReadCheckFile();
+        // 获取检查文件列表
+        const std::vector<std::string> &GetCheckDifferentialFiles() const;
+        size_t GetCheckFileCount() const;
+
+    private:
+        SafeModeManagerModel() = default;                                       // 默认构造函数
+        ~SafeModeManagerModel() = default;                                      // 默认析构函数
+        SafeModeManagerModel(const SafeModeManagerModel &) = delete;            // 禁止拷贝构造
+        SafeModeManagerModel &operator=(const SafeModeManagerModel &) = delete; // 禁止赋值操作
+
+        std::vector<std::string> resource_check_files; // 存储检查的资源文件列表
+    };
+}
+
+#endif // SAFE_MODE_MANAGER_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerPresenter.h
new file mode 100644 (file)
index 0000000..6672c4f
--- /dev/null
@@ -0,0 +1,47 @@
+/***
+ * @Date: 2024-09-09 09:48:47
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-09 09:52:39
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerPresenter.h
+ */
+
+#ifndef _SafeModeManager_PRESENTER_H
+#define _SafeModeManager_PRESENTER_H
+
+#include "Presenter.h"
+#include "SafeModeManagerView.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 *RE_START = "restart";
+
+    class SafeModeManagerView;
+    class SafeModeManagerPresenter : public Presenter<SafeModeManagerView>,
+                                     public UIView::OnClickListener,
+                                     public UIView::OnDragListener,
+                                     public RootView::OnKeyActListener
+    {
+    public:
+        SafeModeManagerPresenter();
+        virtual ~SafeModeManagerPresenter();
+
+        void OnStart() override;
+        void OnPause() override;
+        void OnResume() override;
+        void OnStop() 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
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerView.h b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerView.h
new file mode 100644 (file)
index 0000000..0de6463
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef _SafeModeManager_VIEW_H
+#define _SafeModeManager_VIEW_H
+
+#include "BaseView.h"
+#include "View.h"
+
+#include "components/ui_view_group.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 "SafeModeManagerPresenter.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 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);
+
+    private:
+        SafeModeManagerView *p_BleOTAView{nullptr};        // BleOTA
+        SafeModeManagerView *p_AutoOTAView{nullptr};       // 自动OTA
+        SafeModeManagerView *p_FactoryView{nullptr};       // 恢复出厂
+        SafeModeManagerView *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};
+    };
+} // namespace OHOS
+
+#endif // _SafeModeManager_VIEW_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerModel.cpp
new file mode 100644 (file)
index 0000000..d491231
--- /dev/null
@@ -0,0 +1,69 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "custom_utils.h"
+#include "wearable_log.h"
+
+extern "C" bool resfile_checksum_thread(void);
+
+static const char *CHECK_DIFFERENTIAL_FILE = "/system/check_differential.txt";
+namespace OHOS
+{
+    SafeModeManagerModel *SafeModeManagerModel::GetInstance(void)
+    {
+        static SafeModeManagerModel instance;
+        return &instance;
+    }
+
+    /*-----------------------------资源校验相关-----------------------------*/
+    bool SafeModeManagerModel::ResourceCheck()
+    {
+        bool checkstate{false};
+        if (resfile_checksum_thread())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "文件校验成功");
+            checkstate = true;
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "文件校验失败");
+        }
+        return checkstate;
+    }
+    // 进行文件读取
+    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;
+    }
+    // 获取校验数组
+    const std::vector<std::string> &SafeModeManagerModel::GetCheckDifferentialFiles() const // 返回常量引用以避免复制
+    {
+        return resource_check_files; // 返回资源检查文件列表
+    }
+    // 获取文件个数
+    size_t SafeModeManagerModel::GetCheckFileCount() const
+    {
+        return resource_check_files.size(); // 返回文件个数
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerPresenter.cpp
new file mode 100644 (file)
index 0000000..722d097
--- /dev/null
@@ -0,0 +1,115 @@
+
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "NativeAbility.h"
+#include "KeyInputListener.h"
+#include "custom_utils.h"
+#include "common/key_code.h"
+
+#include "safemodemanager/include/SafeModeManagerPresenter.h"
+#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "gfx_utils/mem_check.h"
+#include "custom_utils.h"
+namespace OHOS
+{
+
+    // 当前Presenter属性实例化的内存指针
+    static SafeModeManagerPresenter *g_pSafeModeManagerPresenter = nullptr;
+
+    SafeModeManagerPresenter::SafeModeManagerPresenter()
+    {
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+        g_pSafeModeManagerPresenter = this;
+    }
+
+    SafeModeManagerPresenter::~SafeModeManagerPresenter()
+    {
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+        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)
+    {
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT &&
+            (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY()))))
+        {
+            // NativeAbility::GetInstance().Back();
+        }
+        UNUSED(view);
+        return true;
+    }
+
+    bool SafeModeManagerPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        if (strcmp(view.GetViewId(), BLE_OTA) == 0)
+        {
+            /*蓝牙ota*/
+        }
+        if (strcmp(view.GetViewId(), AUTO_OTA) == 0)
+        {
+            /*auto ota*/
+        }
+        if (strcmp(view.GetViewId(), FACTORY_RESET_SAFE) == 0)
+        {
+            /*恢复出厂*/
+        }
+        if (strcmp(view.GetViewId(), RESOURCE_CHECK) == 0)
+        {
+            /*资源校验*/
+            GraphicService::GetInstance()->PostGraphicEvent(std::bind(&SafeModeManagerModel::ResourceCheck,
+                                                                      SafeModeManagerModel::GetInstance()));
+        }
+        if (strcmp(view.GetViewId(), RE_START) == 0)
+        {
+            /*重启*/
+            uapi_reboot_device(); // 重启
+        }
+        return true;
+    }
+    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;
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerView.cpp b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerView.cpp
new file mode 100644 (file)
index 0000000..130955d
--- /dev/null
@@ -0,0 +1,365 @@
+#include "safemodemanager/include/SafeModeManagerView.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 "components/ui_button.h"
+#include "uicomponents/UIComponents.h"
+#include "ui_resource_string.h"
+#include "components/ui_scroll_view.h"
+
+namespace OHOS
+{
+
+    static SafeModeManagerView *g_pSafeModeManagerView{nullptr};
+    static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6;
+
+    SafeModeManagerView::SafeModeManagerView()
+    {
+        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_);
+    }
+    /* -------------------------------------------------------------------------- */
+    // 主视图
+    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)
+        {
+#if 0
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView::ChangeToResourceCheckView");
+            p_ResourceCheckView = new SystemShutdown();
+            if (p_ResourceCheckView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SafeModeManagerView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            SafeModeScrollView[thisView] = p_ResourceCheckView->SystemShutdownViewInit();
+            container_->Add(SafeModeScrollView[thisView]);
+#endif
+        }
+        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},
+    };
+
+    // 根据传入的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();
+    }
+    /* -------------------------------------------------------------------------- */
+    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
index 0f2cd97..601d64e 100755 (executable)
@@ -1,3 +1,9 @@
+/*** 
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-09 15:48:54
+ * @FilePath: /FD230/code/sdk/application/wearable/nativeabilityfwk/src/NativeAbility.cpp
+ */
 /*
  * Copyright (c) CompanyNameMagicTag.
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -51,7 +57,7 @@ void NativeAbility::InstallAbility(void)
     InstallNativeAbility(nullptr, this);
 
     // 初始化Launcher
-    NativeLauncher::GetInstance().InitNativeLauncher();
+    NativeLauncher::GetInstance().InitNativeLauncher(LaunchMode::NORMAL_MODE);
     return;
 }
 #endif
index d25d83e..3395a7f 100755 (executable)
@@ -4,8 +4,9 @@
 #include "graphic_service_wrapper.h"
 #include "adapter.h"
 
-void StartNative() {
-    OHOS::NativeLauncher::GetInstance().InitNativeLauncher();
+void StartNative()
+{
+    OHOS::NativeLauncher::GetInstance().InitNativeLauncher(OHOS::LaunchMode::NORMAL_MODE);
     HideGraphicLogo();
     HideGraphicOtaLogo();
     Want *info = static_cast<Want *>(AdapterMalloc(sizeof(Want)));
index 0255b3d..761f207 100644 (file)
@@ -28,7 +28,6 @@
 #include "custom_runtime.h"
 #include "pm_definition.h"
 
-
 #include "sys/time.h"
 #include "time.h"
 
 #include "mbedtls/md5.h"
 #include "mbedtls/error.h"
 
-
 #define MAX_FILE_NAME_LEN 256
-#define MAX_FILE_CHECKSUM_STR_LEN (256+64)
+#define MAX_FILE_CHECKSUM_STR_LEN (256 + 64)
 #define RESFILE_CHECKSUM_FILE "/system/fileschecksum.txt"
-
+#define CHECK_DIFFERENTER_FILE "/system/check_differential.txt"
 // #define ENABLE_RESFILECHECK_LOG
 #ifdef ENABLE_RESFILECHECK_LOG
-#define LOG_RESCHECK  printf
+#define LOG_RESCHECK printf
 #else
 #define LOG_RESCHECK
 #endif
 /**
- * 输入: 
+ * 输入:
  *      /music/ring/ring.mp3,523621,8c0b93aae3b2ee12e6cf58336a092c43
-*/
-static bool split_argument(char* buf,int inputlen , char* outfilename, int max_outfile_namelen,uint32_t *outfilesize ,char *md5sum_buf, uint32_t nax_md5sum_buf_len)
+ */
+static bool split_argument(char *buf, int inputlen, char *outfilename, int max_outfile_namelen, uint32_t *outfilesize, char *md5sum_buf, uint32_t nax_md5sum_buf_len)
 {
-    char *tokbuf=NULL;
+    char *tokbuf = NULL;
     char *pchStrTmpIn = NULL;
-    tokbuf=strtok_r(buf,",",&pchStrTmpIn);
-    if(tokbuf!=NULL)
+    tokbuf = strtok_r(buf, ",", &pchStrTmpIn);
+    if (tokbuf != NULL)
+    {
+        int filenamelen = strlen(tokbuf);
+        memcpy_s(outfilename, max_outfile_namelen, tokbuf, filenamelen);
+        outfilename[filenamelen] = 0;
+    }
+    else
     {
-        int filenamelen=strlen(tokbuf);
-        memcpy_s(outfilename,max_outfile_namelen,tokbuf,filenamelen);
-        outfilename[filenamelen]=0;
-    }else{
         return false;
     }
-    tokbuf=strtok_r(NULL,",",&pchStrTmpIn);
-    if(tokbuf!=NULL)
+    tokbuf = strtok_r(NULL, ",", &pchStrTmpIn);
+    if (tokbuf != NULL)
+    {
+        *outfilesize = atoi(tokbuf);
+    }
+    else
     {
-        *outfilesize=atoi(tokbuf);
-    }else{
         return false;
     }
-    tokbuf=strtok_r(NULL,",",&pchStrTmpIn);
-    if(tokbuf!=NULL)
+    tokbuf = strtok_r(NULL, ",", &pchStrTmpIn);
+    if (tokbuf != NULL)
     {
-        int md5sum_size=strlen(tokbuf);
-        memcpy_s(md5sum_buf,nax_md5sum_buf_len,tokbuf,md5sum_size);
-        md5sum_buf[md5sum_size]=0;
+        int md5sum_size = strlen(tokbuf);
+        memcpy_s(md5sum_buf, nax_md5sum_buf_len, tokbuf, md5sum_size);
+        md5sum_buf[md5sum_size] = 0;
         // printf("checksum %s ,size %d \n",tokbuf,md5sum_size);
-    }else{
+    }
+    else
+    {
         return false;
     }
-    
+
     return true;
 }
 /**
  * 资源文件校验码保存在文件 /system/fileschecksum.txt 中
  * 读出每一行,输入本函数,检测文件是否正常。
- * 输入: 
+ * 输入:
  *      /music/ring/ring.mp3,523621,8c0b93aae3b2ee12e6cf58336a092c43
  * 输出:
  *      outputfile 显示到UI中使用 ,文件错误或者缺失的时候用到。
  * return true 正确
- *        false 文件错误,或者缺失 
-*/
-bool check_file(char* buffer,int inputlen,char* outputfile,int outputsize)
+ *        false 文件错误,或者缺失
+ */
+bool check_file(char *buffer, int inputlen, char *outputfile, int outputsize)
 {
-    unsigned char md5sum_str[64]={0};
-    unsigned char current_md5sum_str[64]={0};
-    unsigned char current_md5sum[16]={0};
+    unsigned char md5sum_str[64] = {0};
+    unsigned char current_md5sum_str[64] = {0};
+    unsigned char current_md5sum[16] = {0};
     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     mbedtls_md5_context ctx;
-    char* filename=malloc(MAX_FILE_NAME_LEN);
-    char* checksumbuf=malloc(MAX_FILE_NAME_LEN);
+    char *filename = malloc(MAX_FILE_NAME_LEN);
+    char *checksumbuf = malloc(MAX_FILE_NAME_LEN);
 
-    uint32_t filesize=0;
-    uint32_t current_filesize=0;
-    if ( buffer == NULL || outputfile == NULL)
+    uint32_t filesize = 0;
+    uint32_t current_filesize = 0;
+    if (buffer == NULL || outputfile == NULL)
     {
         return false;
     }
 
     // printf("check %s\n",buffer);
-    if (false == split_argument(buffer,inputlen,(char*)filename,MAX_FILE_NAME_LEN,&filesize,(char*)md5sum_str,64))
+    if (false == split_argument(buffer, inputlen, (char *)filename, MAX_FILE_NAME_LEN, &filesize, (char *)md5sum_str, 64))
     {
-        printf("splite_argument %s failed !\r\n",buffer);
+        printf("splite_argument %s failed !\r\n", buffer);
         goto freebuf;
     }
-    memcpy_s(outputfile,outputsize,filename,strlen((char*)filename));
+    memcpy_s(outputfile, outputsize, filename, strlen((char *)filename));
 
     // printf("===---filename %s, size %d,checksum %s\n",filename,filesize,md5sum_str);
     FILE *file = NULL;
-    file = fopen((char*)filename, "rb");
-    if (file == NULL) {
+    file = fopen((char *)filename, "rb");
+    if (file == NULL)
+    {
         goto freebuf;
     }
 
-    mbedtls_md5_init( &ctx );
-    if( ( ret = mbedtls_md5_starts( &ctx ) ) != 0 )
+    mbedtls_md5_init(&ctx);
+    if ((ret = mbedtls_md5_starts(&ctx)) != 0)
         goto fileread_error;
-        
-    uint32_t filesize_readed = fread(checksumbuf,1,sizeof(checksumbuf),file); 
-    while (filesize_readed > 0 )
+
+    uint32_t filesize_readed = fread(checksumbuf, 1, sizeof(checksumbuf), file);
+    while (filesize_readed > 0)
     {
-        current_filesize+=filesize_readed;
-        if( ( ret = mbedtls_md5_update( &ctx,(unsigned char*) checksumbuf, filesize_readed ) ) != 0 )
+        current_filesize += filesize_readed;
+        if ((ret = mbedtls_md5_update(&ctx, (unsigned char *)checksumbuf, filesize_readed)) != 0)
             goto fileread_error;
-        filesize_readed = fread(checksumbuf,1,sizeof(checksumbuf),file); 
+        filesize_readed = fread(checksumbuf, 1, sizeof(checksumbuf), file);
     }
     fclose(file);
-    if( ( ret = mbedtls_md5_finish( &ctx, (unsigned char*)current_md5sum ) ) != 0 )
+    if ((ret = mbedtls_md5_finish(&ctx, (unsigned char *)current_md5sum)) != 0)
         goto md5_error;
 
-    sprintf((char*)current_md5sum_str,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
-    current_md5sum[0],current_md5sum[1],current_md5sum[2],current_md5sum[3],
-    current_md5sum[4],current_md5sum[5],current_md5sum[6],current_md5sum[7],
-    current_md5sum[8],current_md5sum[9],current_md5sum[10],current_md5sum[11],
-    current_md5sum[12],current_md5sum[13],current_md5sum[14],current_md5sum[15]);
+    sprintf((char *)current_md5sum_str, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+            current_md5sum[0], current_md5sum[1], current_md5sum[2], current_md5sum[3],
+            current_md5sum[4], current_md5sum[5], current_md5sum[6], current_md5sum[7],
+            current_md5sum[8], current_md5sum[9], current_md5sum[10], current_md5sum[11],
+            current_md5sum[12], current_md5sum[13], current_md5sum[14], current_md5sum[15]);
     // printf("===+++filename %s, current_filesize %d,current_md5sum %s\n",filename,current_filesize,current_md5sum_str);
-    int cmpret=memcmp(md5sum_str,current_md5sum_str,32);
-    int cmpsize=(filesize == current_filesize);
+    int cmpret = memcmp(md5sum_str, current_md5sum_str, 32);
+    int cmpsize = (filesize == current_filesize);
     LOG_RESCHECK("filename %s, filesize=compare(%d,%d)=%d,md5sum compare(%s,%s)=%d\n",
-            filename,
-            filesize,current_filesize,cmpsize,
-            md5sum_str,current_md5sum_str,cmpret);
-    if ( cmpret != 0 || cmpsize != 1 )
+                 filename,
+                 filesize, current_filesize, cmpsize,
+                 md5sum_str, current_md5sum_str, cmpret);
+    if (cmpret != 0 || cmpsize != 1)
     {
         LOG_RESCHECK("check failed!\r\n");
         return false;
-    }else{
+    }
+    else
+    {
         LOG_RESCHECK("check pass\n");
         return true;
     }
 fileread_error:
     fclose(file);
 md5_error:
-    mbedtls_md5_free( &ctx );
+    mbedtls_md5_free(&ctx);
 freebuf:
     free(filename);
     free(checksumbuf);
     return false;
 }
 
-void resfile_checksum_thread(void)
+bool resfile_checksum_thread(void)
 {
-
     printf("resfile start check\r\n");
-    char* readbuf=malloc(MAX_FILE_CHECKSUM_STR_LEN);
-    if (readbuf == NULL )
+    char *readbuf = malloc(MAX_FILE_CHECKSUM_STR_LEN);
+    if (readbuf == NULL)
     {
         printf("malloc fail, skip resfile check\r\n");
-        return ;
+        return false;
     }
-    char* filename=malloc(MAX_FILE_NAME_LEN);
-    if (filename == NULL )
+    char *filename = malloc(MAX_FILE_NAME_LEN);
+    if (filename == NULL)
     {
         free(readbuf);
         printf("malloc fail, skip resfile check\r\n");
-        return ;
+        return false;
     }
-    FILE * file=fopen(RESFILE_CHECKSUM_FILE,"rb");
-
+    FILE *file = fopen(RESFILE_CHECKSUM_FILE, "rb");
     if (file == NULL)
     {
-        printf("checksum list file %s not exist,skip resfile check\r\n",RESFILE_CHECKSUM_FILE);
+        printf("checksum list file %s not exist, skip resfile check\r\n", RESFILE_CHECKSUM_FILE);
         free(readbuf);
         free(filename);
-        return ;
+        return false;
     }
-    memset(readbuf,0,MAX_FILE_CHECKSUM_STR_LEN);
+
+    memset(readbuf, 0, MAX_FILE_CHECKSUM_STR_LEN);
     char tmp;
-    int i=0;
-    while(fread(&tmp,1,1,file)>0)
+    int i = 0;
+    FILE *diff_file = fopen(CHECK_DIFFERENTER_FILE, "a");
+    if (diff_file == NULL)
+    {
+        printf("Failed to open differential file %s\r\n", CHECK_DIFFERENTER_FILE);
+        fclose(file);
+        free(readbuf);
+        free(filename);
+        return false;
+    }
+
+    while (fread(&tmp, 1, 1, file) > 0)
     {
-        if(i>=MAX_FILE_CHECKSUM_STR_LEN)
+        if (i >= MAX_FILE_CHECKSUM_STR_LEN - 1) // 保留一个字符用于 '\0'
         {
             break;
         }
-        if(tmp == '\n')
+        if (tmp == '\n')
         {
-            readbuf[i]=tmp;
-            memset(filename,0,MAX_FILE_NAME_LEN);
-            if (check_file(readbuf,i+1,filename,MAX_FILE_NAME_LEN) == false)
+            readbuf[i] = '\0'; // 结束字符串
+            memset(filename, 0, MAX_FILE_NAME_LEN);
+            if (check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN) == false)
             {
-                printf("resfile %s is modified or deleted!\r\n",filename);
+                printf("resfile %s is modified or deleted!\r\n", filename);
+                fprintf(diff_file, "%s\n", filename); // 写文件并换行
             }
-            i=0;
-            memset(readbuf,0,MAX_FILE_CHECKSUM_STR_LEN);
+            i = 0;
+            memset(readbuf, 0, MAX_FILE_CHECKSUM_STR_LEN);
             continue;
-
-        }else{
-            readbuf[i]=tmp;
+        }
+        else
+        {
+            readbuf[i] = tmp;
         }
         i++;
     }
-    
+
+    // 处理最后一行
+    if (i > 0 && i < MAX_FILE_CHECKSUM_STR_LEN)
+    {
+        readbuf[i] = '\0'; // 结束字符串
+        memset(filename, 0, MAX_FILE_NAME_LEN);
+        if (check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN) == false)
+        {
+            printf("resfile %s is modified or deleted!\r\n", filename);
+            fprintf(diff_file, "%s\n", filename); // 写文件并换行
+        }
+    }
+
+    fclose(diff_file);
     fclose(file);
     free(readbuf);
     free(filename);
     printf("resfile check done\r\n");
-
+    return true;
 }
\ No newline at end of file