${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
VIEW_GOAL, // 每日目标
VIEW_CALCULATOR, // 计算器
VIEW_SCHEDULE, // schedule
- VIEW_SLEEPMODE, // sleep mode
+ VIEW_SLEEPMODE, // sleep mode
/*屏蔽Slice*/
VIEW_PHONERING, // 拨号界面
VIEW_PHONECALLING, // 来电
VIEW_MAIN_ALIPAY,
#endif
/*请在最末添加新的viewID*/
+ VIEW_SAFE_MODE, // 安全模式
VIEW_MAX_INTER_APP, // 在此之前添加native应用ID.
VIEW_EXTERN_APP = 0xFFFE, // 三方应用
VIEW_INVALIDE_APP = 0xFFFF,
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);
void InitFastTrainingSlice(void);
void InitFastTrainingAttentionSlice(void);
void InitCodedlockSlice(void);
+ void InitSafeModeSlice(void);
/* -------------------------------------------------------------------------- */
// void InitPhoneSlice(void);
void InitPhoneCallSlice(void);
/*密码锁*/
#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"
//{VIEW_SET_HEART, &NativeLauncher::InitSetHeartSlice},
/*密码锁*/
{VIEW_CODED_LOCK, &NativeLauncher::InitCodedlockSlice},
+ /*安全模式*/
+ {VIEW_SAFE_MODE, &NativeLauncher::InitSafeModeSlice},
/* -------------------------------------------------------------------------- */
/*智能助手*/
{VIEW_OFFLINEVOICE, &NativeLauncher::InitOfflineVoice},
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)
}
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)
+/***
+ * @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
static RebootAndShutdownModel &GetInstance(void);
void HandFirstTimeStartJumpToMainView(void);
void RegisterAllKeyEvents(void);
+ bool GetPowerKey();
+ void SetPowerKey(bool state);
private:
RebootAndShutdownModel();
bool RegisterFuncKeyLongPressEvent(void);
bool RegisterFuncKeyClickEvent(void);
bool RegisterFuncKeyDoubleClickEvent(void);
-
+ bool RegisterPowerAndFuncKeyPressEvent(void);
+ bool powerKeyPressed{false};
+ bool funcKeyPressed{false};
};
}
}
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)
{
RegisterFuncKeyLongPressEvent();
// RegisterFuncKeyClickEvent();
RegisterFuncKeyDoubleClickEvent();
+ RegisterPowerAndFuncKeyPressEvent();
}
}
--- /dev/null
+/***
+ * @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
--- /dev/null
+/***
+ * @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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+
+#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
--- /dev/null
+#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
+/***
+ * @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");
InstallNativeAbility(nullptr, this);
// 初始化Launcher
- NativeLauncher::GetInstance().InitNativeLauncher();
+ NativeLauncher::GetInstance().InitNativeLauncher(LaunchMode::NORMAL_MODE);
return;
}
#endif
#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)));
#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