${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/CheckInvalidView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/CheckInvalidPresenter.cpp
+ #HeartCheck
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartResultView.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartResultPresenter.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartModel.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartDetectionView.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartDetectionPresenter.cpp
+
#BloodCheck
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodResultView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodResultPresenter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/activity/src/ActivityPresenter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/activity/src/ActivityModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartRateView.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartModel.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartBandoffView.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartCheckView.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartResultView.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartView.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartPresenter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/alarm/src/AlarmClockModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/alarm/src/MainAlarmView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/alarm/src/AlarmConfigView.cpp
VIEW_ROTATE, // 模拟表冠
VIEW_CHECK_ABNORMAL, // 检测异常
VIEW_CHECK_INVALID, // 检测数无效
- VIEW_BLOODXY_RESULT, // 血氧结果界面
- VIEW_BLOODOXY_CHECK, // 血氧检测界面
+ VIEW_BLOOD_RESULT, // 血氧结果界面
+ VIEW_BLOOD_CHECK, // 血氧检测界面
+ VIEW_HEART_RESULT, // 心率结果界面
+ VIEW_HEART_CHECK, // 心率检测界面
VIEW_HEART, // 心率监测
VIEW_SAVEELE, // 省电模式
VIEW_SAVEBAT, // 省电模式界面
VIEW_DIALING_METHOD, // 拨号方式
VIEW_TEST, // 测试
VIEW_GOAL, // 每日目标
- VIEW_CALCULATOR, //计算器
+ VIEW_CALCULATOR, // 计算器
/* -------------------------------------------------------------------------- */
#ifdef SUPPORT_ALIPAY_SEC
VIEW_MAIN_ALIPAY,
void InitBloodSlice(void);
void InitCheckAbnormalSlice(void);
void InitCheckInvalidSlice(void);
+ void InitHeartResultSlice(void);
+ void InitHeartCheckSlice(void);
void InitBloodResultSlice(void);
void InitBloodCheckSlice(void);
void InitHeartSlice(void);
STR_PE4GC = 491,\r
STR_OBU_MESSAGE = 492,\r
STR_DELETE = 493,\r
- STR_MAX_ID = 494,\r
+ STR_CHARGE = 494,\r
+ STR_CHARGE_NOTE = 495,\r
+ STR_MAX_ID = 496,\r
}; // UIResourceTextId\r
\r
enum FontLanguageId : uint8_t {\r
- LANGUAGE_ID_EN,\r
LANGUAGE_ID_ZH,\r
+ LANGUAGE_ID_EN,\r
LANGUAGE_ID_MAX\r
}; // UITextLanguageTextId\r
}\r
#include "ApplistView.h"
#include "ApplistPresenter.h"
-#include "HeartPresenter.h"
#include "CallerLogView.h"
#include "CallerLogPresenter.h"
#include "MainCallingView.h"
#include "bloodoxygen/include/BloodResultView.h"
#include "bloodoxygen/include/BloodResultPresenter.h"
/*心率监测*/
-#include "heartrate/include/HeartPresenter.h"
-#include "heartrate/include/HeartView.h"
+#include "heartrate/include/HeartDetectionView.h"
+#include "heartrate/include/HeartDetectionPresenter.h"
+#include "heartrate/include/HeartResultView.h"
+#include "heartrate/include/HeartResultPresenter.h"
#include "secondaryfunction/include/SecondaryFunctionPresenter.h"
#include "secondaryfunction/include/SecondaryFunctionView.h"
{VIEW_MAIN_PHONE, &NativeLauncher::InitMainPhoneSlice},
{VIEW_DIALING_METHOD, &NativeLauncher::InitDialingMethodSlice},
{VIEW_TEST, &NativeLauncher::InittestSlice},
- {VIEW_CALCULATOR,&NativeLauncher::InitCalculatorSlice},
+ {VIEW_CALCULATOR, &NativeLauncher::InitCalculatorSlice},
/* -------------------------------------------------------------------------- */
/* ----------------------------------- 训练 ----------------------------------- */
{VIEW_CHECK_ABNORMAL, &NativeLauncher::InitCheckAbnormalSlice},
{VIEW_CHECK_INVALID, &NativeLauncher::InitCheckInvalidSlice},
/*血氧检测*/
- {VIEW_BLOODOXY_CHECK, &NativeLauncher::InitBloodCheckSlice},
- {VIEW_BLOODXY_RESULT, &NativeLauncher::InitBloodResultSlice},
+ {VIEW_BLOOD_CHECK, &NativeLauncher::InitBloodCheckSlice},
+ {VIEW_BLOOD_RESULT, &NativeLauncher::InitBloodResultSlice},
/*心率检测*/
- {VIEW_HEART, &NativeLauncher::InitHeartSlice},
+ {VIEW_HEART_CHECK, &NativeLauncher::InitHeartCheckSlice},
+ {VIEW_HEART_RESULT, &NativeLauncher::InitHeartResultSlice},
/*设置卡片*/
{VIEW_SET_CARD, &NativeLauncher::InitSetCardSlice},
/*添加卡片*/
}
NativeAbility::GetInstance().AddSliceProxy(VIEW_ALARM_POP_UP, alarmPopUpView);
}
- void NativeLauncher::InitHeartSlice(void)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::HeartSlice");
- SliceProxy *heartView = new AbilitySliceProxy<HeartView, HeartPresenter>;
- if (heartView == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartView is nullptr");
- return;
- }
- NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART, heartView);
- }
void NativeLauncher::InitMainMakePhoneView(void)
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitMainMakePhoneView");
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bloodCheckView is nullptr");
return;
}
- NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOODOXY_CHECK, bloodCheckView);
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOOD_CHECK, bloodCheckView);
}
// 血氧监测结果
void NativeLauncher::InitBloodResultSlice(void)
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bloodResultView is nullptr");
return;
}
- NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOODXY_RESULT, bloodResultView);
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOOD_RESULT, bloodResultView);
+ }
+ // 心率监测界面
+ void NativeLauncher::InitHeartCheckSlice(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartCheckSlice");
+ SliceProxy *HeartCheckView = new AbilitySliceProxy<HeartDetectionView, HeartDetectionPresenter>;
+ if (HeartCheckView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartCheckView is nullptr");
+ return;
+ }
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_CHECK, HeartCheckView);
+ }
+ // 心率监测结果
+ void NativeLauncher::InitHeartResultSlice(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartResultSlice");
+ SliceProxy *heartResultView = new AbilitySliceProxy<HeartResultView, HeartResultPresenter>;
+ if (heartResultView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartResultView is nullptr");
+ return;
+ }
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_RESULT, heartResultView);
}
/* -------------------------------------------------------------------------- */
// 查找手机
#include "applist/include/ApplistModel.h"
#include "themestyle/include/ThemeStyleModel.h"
-#define HEART_APPLIST 0
+#define HEART_APPLIST 1
namespace OHOS
{
/**- APPLSIT
#endif
{VIEW_MAIN_PHONE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_DEFAULT_IMG, "手机", STR_PHONE, nullptr},
#if HEART_APPLIST
- {VIEW_HEART, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_DEFAULT_IMG, "心率", STR_HEART_RATE, nullptr},
+ {VIEW_HEART_RESULT, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_DEFAULT_IMG, "心率", STR_HEART_RATE, nullptr},
#endif
- {VIEW_BLOODXY_RESULT, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧", STR_BLOOD_OXYGEN, nullptr},
+ {VIEW_BLOOD_RESULT, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧", STR_BLOOD_OXYGEN, nullptr},
{VIEW_TRAINING, PNG_APPLIST_TRAINING_IMAGE, PNG_APPLIST_TRAINING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "训练", STR_TRAINING, nullptr},
{VIEW_TRAINING_RECORD, PNG_APPLIST_TRAINING_RECORD_IMAGE, PNG_APPLIST_TRAINING_RECORD_IMAGE, PNG_APPLIST_DEFAULT_IMG, "训练记录", STR_TRAINING_RECORD, nullptr},
{VIEW_GOAL, PNG_APPLIST_GOAL_IMAGE, PNG_APPLIST_GOAL_IMAGE, PNG_APPLIST_DEFAULT_IMG, "活动", STR_ACTIVITY, nullptr},
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 10:38:26
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
+ */
#ifndef BLOOD_OXYGEN_MODEL_H
#define BLOOD_OXYGEN_MODEL_H
uint32_t GetCheckTime();
void SetCheckTime(uint32_t time);
-
void SetWearStatus(int32_t wear);
- bool GetWearStatus();
-
void SetResult(BloodResult result);
BloodResult GetResult();
void ReInit();
private:
- bool OxygenView;
- bool BandoffView;
- bool CheckView;
- bool ResultView;
- bool CheckStatus;
- bool wearStatus;
+
uint16_t displayspo2;
uint16_t currentspo2;
uint32_t timestamp_ms;
}
}
- bool BloodOxygenModel::GetWearStatus()
- {
- return wearStatus;
- }
-
uint16_t BloodOxygenModel::GetSPO2data()
{
return currentspo2;
// 开始检测
void BloodOxygenModel::Blood_Start()
{
- currentspo2 = 0;
+ displayspo2 = 0;
SetResult(BloodResult::NOT_TESTED); // 成功检测
// 进行初始化操作
if (!sensorstate)
void BloodOxygenModel::SetWearStatus(int32_t wear)
{
// 设置佩戴状态
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenModel Weartest::%d", wear);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenModel Weartest::%d", wear);
// 计数更新
if (wear_ != 1 && wear != 1)
#include "power_display_service.h"
#include "custom_utils.h"
#include "cywee_service.h"
+#include "battery_hal.h"
+
+#include"heart_blood/health_service/health_service.h"
#define BLOODKEYABLE 1
namespace OHOS
{
if (strcmp(view.GetViewId(), CLICK_BLOOD) == 0)
{
- NativeAbility::GetInstance().EnterSlice(VIEW_BLOODOXY_CHECK, TransitionType::TRANSITION_ZOOM);
+ // 如果正在充电进入提醒界面
+ if (get_charge_stat())
+ {
+ HealthState highHealthState;
+ highHealthState.checkType = CHARGE;
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID, TransitionType::TRANSITION_ZOOM);
+ }
+ else
+ {
+ NativeAbility::GetInstance().EnterSlice(VIEW_BLOOD_CHECK, TransitionType::TRANSITION_ZOOM);
+ }
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodPresenter::OnClick");
return true;
/***
* @Date: 2024-04-15 10:55:58
* @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-30 16:39:56
+ * @LastEditTime: 2024-07-31 14:36:25
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp
*/
/*初始化title*/
InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_BLOOD, DEFAULT_VECTOR_FONT_FILENAME, 30);
/*初始化血氧值label*/
- InitUILabel(bloodLabel, 83, 22, 300, 300, "bloodtext", "--", DEFAULT_VECTOR_FONT_FILENAME, 120);
+ InitUILabel(bloodLabel, 83, 32, 300, 300, "bloodtext", "--", DEFAULT_VECTOR_FONT_FILENAME, 140);
/*初始化检测时间*/
- InitLabelExt(timeLabel, 53, 260, 360, 35, "time", STR_CHECKNO, DEFAULT_VECTOR_FONT_FILENAME, 30);
+ InitLabelExt(timeLabel, 53, 270, 360, 35, "time", STR_CHECKNO, DEFAULT_VECTOR_FONT_FILENAME, 30);
// 设置来回滚动属性
timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
timeLabel->SetRollSpeed(70);
}
if (strcmp(view.GetViewId(), CLICK_BLOOD_RE) == 0)
{
- NativeAbility::GetInstance().ChangeSlice(VIEW_BLOODOXY_CHECK, TransitionType::TRANSITION_ZOOM);
+ NativeAbility::GetInstance().ChangeSlice(VIEW_BLOOD_CHECK, TransitionType::TRANSITION_ZOOM);
}
return true;
}
+/***
+ * @Date: 2024-07-30 11:22:44
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 15:22:17
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heart_blood/CheckInvalidPresenter.cpp
+ */
/*
* Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
* Description: bloodOxygen view
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodPresenter::OnClick");
- if (strcmp(view.GetViewId(), CLICK_BLOOD_KONW) == 0)
+ if (strcmp(view.GetViewId(), CLICK_HEALTH_KONW) == 0)
{
NativeAbility::GetInstance().Back(TransitionType::TRANSITION_ZOOM);
}
namespace OHOS
{
- static constexpr const char *CLICK_BLOOD_KONW = "clickbloodkown"; // 血氧检测重新
+ static constexpr const char *CLICK_HEALTH_KONW = "clickbloodkown"; // 检测重新
class CheckInvalidView;
class CheckInvalidPresenter : public Presenter<CheckInvalidView>,
+/***
+ * @Date: 2024-07-30 11:20:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 15:16:05
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heart_blood/CheckInvalidView.cpp
+ */
/***
* @Date: 2024-04-15 10:55:58
* @LastEditors: Caisking 3449750381@qq.com
break;
}
}
+ else if (healthState.checkType == CHARGE)
+ {
+ titleLabel->SetTextId(STR_CHARGE);
+ noteLabel->SetTextId(STR_CHARGE_NOTE);
+ remindLabel->SetVisible(false);
+ }
}
void CheckInvalidView::SetNoteLabel(UIResourceTextId viewId, int checkResult)
bool CheckInvalidView::AddButton()
{
/*初始化按键*/
- InitButtonExt(kownButton, 0, 366, 466, 100, CLICK_BLOOD_KONW, STR_KONW, 30);
+ InitButtonExt(kownButton, 0, 366, 466, 100, CLICK_HEALTH_KONW, STR_KONW, 30);
kownButton->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE);
kownButton->SetOnClickListener(presenter_);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CheckInvalidView::InitBloodView fail");
}
SetViewData();
-
+
custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO); // 震动提醒
RootView::GetInstance()->Add(container_);
typedef enum
{
BLOOD_CHECK,
- HEART_CHECK
+ HEART_CHECK,
+ CHARGE,
} CheckClass;
// 检查结果
+++ /dev/null
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-05-07 18:46:22
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h
- */
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-05-07 14:53:32
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h
- */
-
-
-#ifndef Heart_BANDOFF_VIEW_H
-#define Heart_BANDOFF_VIEW_H
-
-#include "components/ui_label.h"
-#include "components/ui_label_ext.h"
-#include "components/ui_view_group.h"
-#include "components/ui_image_animator.h"
-#include "components/ui_button.h"
-#include "components/ui_label_button.h"
-#include "BaseView.h"
-#include "View.h"
-#include "ohos_types.h"
-#include "components/ui_scroll_view.h"
-namespace OHOS
-{
- class HeartBandoffView
- {
- public:
- HeartBandoffView();
- virtual ~HeartBandoffView();
-
- UIViewGroup *CreateUIViewGroup();
- static HeartBandoffView *GetInstance(void);
- UIScrollView *HeartBondoffViewInit();
- UIImageAnimatorView *GetImageAnimator();
-
- private:
- UILabelExt *label;
- UILabelButton *testButton;
- UIScrollView *HeartBandoffScrollView;
- UIViewGroup *group;
- UIImageView *imageView;
- UIImageAnimatorView *imageAnimator;
- };
-}
-
-#endif // 血氧跳转界面
\ No newline at end of file
+++ /dev/null
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-05-07 14:55:13
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodCheck view
- * Author:
- * Create: 2021-08-01
- */
-
-#ifndef HEART_Check_VIEW_H
-#define HEART_Check_VIEW_H
-
-#include "View.h"
-#include "BaseView.h"
-#include "wearable_log.h"
-#include "UiConfig.h"
-#include "components/ui_label.h"
-#include "components/ui_label_ext.h"
-#include "components/ui_button.h"
-#include "components/ui_label_button.h"
-#include "components/ui_image_animator.h"
-#include "components/ui_circle_progress.h"
-#include "components/ui_view_group.h"
-#include "HeartPresenter.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label_button_ext.h"
-namespace OHOS
-{
- class HeartPresenter;
- class HeartBandoffView;
-
- class HeartCheckView : public View<HeartPresenter>
- {
- public:
- HeartCheckView();
- virtual ~HeartCheckView();
- static HeartCheckView *GetInstance(void);
- UIScrollView *HeartCheckViewInit();
- UIImageAnimatorView *GetImageAnimator();
- UILabelButtonExt *CreateAndSetUIButton(const char *title);
- void UpShowHeartText();
-
- private:
- UIImageAnimatorView *imageAnimator;
- UILabelExt *titleLabel;
- UILabelExt *HeartText;
- UIScrollView *HeartCheckScrollView;
- UILabelButtonExt *testButton;
- };
-}
-
-#endif // 血氧主界面
\ No newline at end of file
--- /dev/null
+/***
+ * @Date: 2024-07-29 15:33:59
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 16:28:08
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionPresenter.h
+ */
+
+#ifndef HEART_DETECTION_PRESENTER_H
+#define HEART_DETECTION_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_list.h"
+#include "components/ui_view.h"
+#include "KeyInputListener.h"
+#include "ModelListenerSample.h"
+#include "heartrate/include/HeartDetectionView.h"
+#include "power_display_service.h"
+
+#define HEART_KEEP_TIME 40000 // 40s
+
+namespace OHOS
+{
+
+ class HeartDetectionView;
+ class HeartDetectionPresenter : public Presenter<HeartDetectionView>,
+ public ModelListenerSample,
+ public UIView::OnClickListener,
+ public UIView::OnDragListener,
+ public RootView::OnKeyActListener,
+ public ListScrollListener
+ {
+ public:
+ HeartDetectionPresenter();
+ ~HeartDetectionPresenter() override;
+ static HeartDetectionPresenter *GetInstance(void);
+
+ void OnStart() override;
+ void OnResume() override;
+ void OnStop() override;
+ void OnTickEvent() override;
+ void Notify() override {}
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnDrag(UIView &view, const DragEvent &event) override;
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+ void NavigateBack(void);
+
+ private:
+ void ResetTickTimer(void);
+ uint64_t startTime{0};
+ bool HeartCountEvent{false};
+ bool HeartCheckState{false};
+
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ uint32_t display_time;
+ };
+}
+
+#endif // HEART_DETECTION_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/***
+ * @Date: 2024-07-31 10:27:26
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 14:12:07
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
+ */
+/***
+ * @Date: 2024-07-31 10:27:26
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 10:30:11
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
+ */
+/***
+ * @Date: 2024-07-29 15:38:56
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 15:42:12
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.cpp
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodDetection view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#ifndef HEART_Detection_VIEW_H
+#define HEART_Detection_VIEW_H
+
+#include "View.h"
+#include "BaseView.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_button.h"
+#include "components/ui_label_button.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_circle_progress.h"
+#include "components/ui_view_group.h"
+
+#include "heartrate/include/HeartDetectionPresenter.h"
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_button_ext.h"
+
+#include "power_display_service.h"
+
+#define STOPCHECK "stop_check"
+namespace OHOS
+{
+ class HeartDetectionPresenter;
+ class HeartDetectionView : public View<HeartDetectionPresenter>
+ {
+ public:
+ HeartDetectionView();
+ virtual ~HeartDetectionView();
+ void OnStop() override;
+ void OnSetUpView() override;
+ void OnTearDownView() override;
+ void OnStart() override;
+ static HeartDetectionView *GetInstance(void);
+
+ bool HeartDetectionViewInit();
+ UIImageAnimatorView *GetImageAnimator(void);
+ void UpShowHeartText(void);
+
+ private:
+ UIImageAnimatorView *imageAnimator;
+ UILabelExt *titleLabel;
+ UILabel *HeartText;
+ UIScrollView *HeartDetectionScrollView;
+ UILabelButtonExt *testButton;
+
+ uint32_t heart_;
+ };
+}
+
+#endif // 心率主界面
\ No newline at end of file
{\r
RESTSTSTE = 0, // 未检测状态\r
PASSIVITY, // 被动检测心率\r
+ CARDCHECK, // 卡片检测\r
INITIATIVE, // 主动检测心率\r
EXERCISE, // 运动心率\r
};\r
+ enum class HeartResult\r
+ {\r
+ NOT_TESTED = 0, // 未检测\r
+ SUCCESS, // 检测成功\r
+ NOT_WORN, // 未佩戴检测\r
+ TIMEOUT, // 检测超时\r
+ HIGH_RESULT, // 检测结果过高\r
+ LOW_RESULT, // 检测结果过低\r
+ INVALID_DATA // 无效数据\r
+ };\r
// 控制心率检测\r
typedef struct\r
{\r
void SetHeartRatePerSec(uint32_t sec);\r
uint16_t GetHeartRateMax(void);\r
uint16_t GetHeartRateMin(void);\r
+ /* -------------------------------------------------------------------------- */\r
+ void UpHeartdata(uint16_t heart);\r
+ uint16_t GetHeartdata();\r
+ uint16_t GetShowHeartdata();\r
\r
- bool GetHeartViewStatus(void);\r
- bool GetHeartBandoffViewStatus(void);\r
- bool GetHeartCheckViewStatus(void);\r
- bool GetHeartResultViewStaus(void);\r
-\r
- void SetHeartViewStatus(bool HeartViewStatus);\r
- void SetHeartBandoffViewStatus(bool bandoffViewStatus);\r
- void SetHeartCheckViewStatus(bool checkViewStatus);\r
- void SetHeartResultViewStatus(bool resultViewStatus);\r
+ uint16_t GetIndex();\r
+ void SetIndex(uint16_t index);\r
\r
- bool GetCheckStatus();\r
- void SetCheckStatus(bool checkstatus);\r
+ uint32_t GetCheckTime(void);\r
+ void SetCheckTime(uint32_t time);\r
void SetWearStatus(int32_t wear);\r
- bool GetWearStatus(void);\r
+ void SetResult(HeartResult result);\r
+ HeartResult GetResult();\r
\r
- void Heart_Start();\r
- void Heart_Stop();\r
- void UpHeartdata(uint16_t heart);\r
+ void Heart_Start(void);\r
+ void Heart_Stop(void);\r
+ void Heart_Save(void);\r
+ void Heart_Result(void);\r
\r
- uint16_t GetHeartdata();\r
- uint16_t GetShowHeartdata();\r
- uint64_t GetCheckTime(); // 获取距离上传测试时间\r
- void SetCheckTime(uint64_t time); // 设置本次测试完的时间\r
- uint16_t GetIndex(); // 测试点位\r
- void SetIndex(uint16_t index);\r
void Heart_Control(HeartState state, HeartCheck check);\r
void ReInit();\r
\r
bool wearStatus{true};\r
uint16_t index_ = 0;\r
\r
- bool HeartView;\r
- bool BandoffView;\r
- bool CheckView;\r
- bool ResultView;\r
- bool CheckStatus; // 检测状态标志\r
- uint16_t Show_Heart_; // 显示心率\r
- uint16_t Heart_; // 保存心率\r
- uint32 TIME_; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+ uint16_t displayheart; // 显示心率\r
+ uint16_t currentheart; // 保存心率\r
+ uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
\r
bool initstatus = true;\r
bool heartstate = false;\r
- uint8_t wear_;\r
- uint8_t valid_counter_ = 0; // 有效数计数器\r
- uint8_t disvalid_counter_ = 0; // 无效数计数器\r
- uint8_t unwear_counter_ = 0; // 佩戴错误计数器\r
+ bool sensorstate{false};\r
+\r
+ uint16_t wear_;\r
+ uint16_t valid_counter_ = 0; // 有效数计数器\r
+ uint16_t disvalid_counter_ = 0; // 无效数计数器\r
+ uint16_t unwear_counter_ = 0; // 佩戴错误计数器\r
\r
- HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
+ HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
+ HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
};\r
}\r
\r
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodOxygen view
- * Author:
- * Create: 2021-08-01
- */
-
-#ifndef HEART_PRESENTER_H
-#define HEART_PRESENTER_H
-
-#include "Presenter.h"
-#include "ModelListenerSample.h"
-#include "components/ui_circle_progress.h"
-#include "ohos_types.h"
-#include "KeyInputListener.h"
-#include "common/key_code.h"
-
-namespace OHOS
-{
-
- typedef enum
- {
- HEARTVIEW = 0, // 血氧视图(slice)
- HEARTBANDVIEW, // 佩戴提醒
- HEARTCHECKVIEW, // 检测视图(subView)
- HEARTRESULT, // 测试失败(subView)
- MAX_HEARTVIEW,
- } HEARTVIEWID;
-
- class HeartView;
- class HeartPresenter : public Presenter<HeartView>,
- public UIView::OnClickListener,
- public RootView::OnKeyActListener,
- public ModelListenerSample,
- public UIView::OnDragListener
- {
- public:
- HeartPresenter();
- virtual ~HeartPresenter();
-
- void OnStart() override;
- void OnPause() override;
- void OnResume() override;
- void OnStop() override;
- virtual void Notify() override;
- static HeartPresenter *GetInstance(void);
- bool OnDrag(UIView &view, const DragEvent &event) override;
- bool OnDragEnd(UIView &view, const DragEvent &event) override;
- bool OnClick(UIView &view, const ClickEvent &event) override;
- bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
-
- uint32_t GetCurrentTime();
- int GetTDOA(uint32_t new_time, uint32_t old_time);
-
- private:
- bool CheckPointersValue(void);
- void ReturnInterface(void);
- void ProgressNotify(void);
- int count;
- bool startheart = true;
- KeyInputListener *keyActListenr{nullptr};
- };
-}
-
-#endif
--- /dev/null
+/***
+ * @Date: 2024-07-31 10:27:08
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 10:31:42
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultPresenter.h
+ */
+
+
+#ifndef HEART_RESULT_PRESENTER_H
+#define HEART_RESULT_PRESENTER_H
+
+#include "Presenter.h"
+#include "ModelListenerSample.h"
+#include "components/ui_circle_progress.h"
+#include "ohos_types.h"
+#include "KeyInputListener.h"
+#include "common/key_code.h"
+#include "battery_hal.h"
+#include "heartrate/include/HeartResultView.h"
+
+namespace OHOS
+{
+ static constexpr const char *CLICK_HEART = "clickheart"; // 心率检测
+
+ class HeartResultView;
+ class HeartResultPresenter : public Presenter<HeartResultView>,
+ public UIView::OnClickListener,
+ public RootView::OnKeyActListener,
+ public UIView::OnDragListener
+ {
+ public:
+ HeartResultPresenter();
+ virtual ~HeartResultPresenter();
+ static HeartResultPresenter *GetInstance(void);
+
+ void OnStart() override;
+ void OnPause() override;
+ void OnResume() override;
+ void OnStop() override;
+
+ bool OnDrag(UIView &view, const DragEvent &event) override;
+ bool OnDragEnd(UIView &view, const DragEvent &event) override;
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+ uint32_t GetCurrentTime();
+ int GetTDOA(uint32_t new_time, uint32_t old_time);
+ };
+}
+
+#endif
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodResult view
- * Author:
- * Create: 2021-08-01
- */
#ifndef HEART_Result_VIEW_H
#define HEART_Result_VIEW_H
#include "components/ui_image_animator.h"
#include "components/ui_circle_progress.h"
#include "components/ui_view_group.h"
-#include "HeartPresenter.h"
+#include "heartrate/include/HeartResultPresenter.h"
+
#include "components/ui_scroll_view.h"
#include "components/ui_label_button_ext.h"
namespace OHOS
{
- class HeartPresenter;
- class HeartBandoffView;
-
- class HeartResultView : public View<HeartPresenter>
+ class HeartResultPresenter;
+ class HeartResultView : public View<HeartResultPresenter>
{
public:
HeartResultView();
virtual ~HeartResultView();
static HeartResultView *GetInstance(void);
- UIScrollView *HeartResultViewInit();
+
+ void OnStop() override;
+ void OnSetUpView() override;
+ void OnTearDownView() override;
+ void OnStart() override;
+
+ bool HeartResultViewInit();
+ void UpHeartText(void);
+
+ void DeInit();
+ bool AddButton();
+ bool InitLable();
+ bool Initbackground();
+
private:
- // 增加图片
- bool InitImageDisplay(void);
- // 初始化标签
- bool InitLabel(void);
- HeartResultView *bloodresult{nullptr};
- UIImageView *imageerror; // 图片
- UILabelExt *titlelabel;
- UILabelExt *label1;
- UILabelExt *label2;
- UILabelExt *label3;
-
- UIScrollView *HeartResultScrollView;
- UILabelButtonExt *ReButton;
- UILabelButtonExt *StButton;
+ UIImageView *background = nullptr;
+ UILabelExt *titleLabel = nullptr;
+ UILabelExt *timeLabel = nullptr;
+ UILabel *heartLabel = nullptr;
+ UILabelButtonExt *checkButton;
};
}
-#endif // 血氧主界面
\ No newline at end of file
+#endif // 心率主界面
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: heart view
- * Author:
- * Create: 2021-08-01
- */
-
-#ifndef HEART_VIEW_H
-#define HEART_VIEW_H
-
-#include "View.h"
-#include "BaseView.h"
-#include "wearable_log.h"
-#include "UiConfig.h"
-#include "components/ui_label.h"
-#include "components/ui_label_ext.h"
-#include "components/ui_button.h"
-#include "components/ui_label_button.h"
-#include "components/ui_image_animator.h"
-#include "components/ui_circle_progress.h"
-#include "components/ui_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "HeartPresenter.h"
-#include "HeartCheckView.h"
-#include "HeartResultView.h"
-#include "power_display_service.h"
-#include "components/ui_label_button_ext.h"
-
-namespace OHOS
-{
- class HeartPresenter;
- class HeartBandoffView;
- class HeartCheckView;
- class HeartResultView;
- class HeartView : public View<HeartPresenter>
- {
- public:
- HeartView();
- virtual ~HeartView();
-
- void OnStop() override;
- void OnSetUpView() override;
- void OnTearDownView() override;
- void OnStart() override;
- static HeartView *GetInstance(void);
- bool ChangeHeartView(int16_t thisview); // 主视图
- bool ChangeBandoffView(int16_t thisview); // 佩戴手表
- bool ChangeCheckView(int16_t thisview); // 检测心率
- bool ChangeResultView(int16_t thisview); // 异常检测(佩戴,心率过高或过低)
-
- bool ClickFunc(int16_t interface);
- void ChangeView(int16_t hideView, int16_t showView);
- UIScrollView *GetHeartScrollView(int ViewId);
- void UpHeartText(); // 更新心率结果文本
-
- private:
- bool InitImageDisplay(void); // 初始化背景图片
- bool InitLabel(void); // 初始化标签
- UILabelButtonExt *CreateAndSetUIButton(const char *title); // 添加label按键
- bool InitHeartView(void); // 初始化界面
- bool SetOnDragListener(void);
-
- HeartBandoffView *heartbandoff{nullptr};
- HeartCheckView *heartcheck{nullptr};
- HeartResultView *heartresult{nullptr};
- UIScrollView *HeartScrollView[4]{nullptr};
-
- UIViewGroup *group;
- UIImageView *imageViewMain; // 背景图片
- UILabelExt *percent; // 心率值
- UILabelExt *timeLabel; // 检测时间
- UILabelExt *titleLabel; // 页面title
- UILabelButtonExt *testButton; // 检测按键
-
- const power_display_svr_api_t *display_api = power_display_svr_get_api();
- uint32_t display_time; // 获取系统亮屏时间暂存
- };
-}
-
-#endif // 血氧主界面
\ No newline at end of file
+++ /dev/null
-
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: HeartBandoff view
- * Author:
- * Create: 2021-08-01
- */
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "HeartBandoffView.h"
-#include "HeartModel.h"
-#include "ui_resource_string.h"
-
-namespace OHOS
-{
- // 动态显示图片设置
- static constexpr uint16_t IMAGE_SIZE = 96;
- static constexpr uint16_t IMAGE_POSITION_Y = 276;
- static constexpr uint16_t IMAGE_POSITION_X = 179;
- static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 24;
- static constexpr uint16_t IMAGEANIMATOERVIEW_SPEED = 40;
-
- // 标签设置
- static constexpr uint16_t LABEL_POSITION_X = 87;
- static constexpr uint16_t LABEL_POSITION_Y = 200;
- static constexpr uint16_t LABEL_POSITION_WIDTH = 288;
- static constexpr uint16_t LABEL_POSITION_HEIGHT = 50;
-
- // 图片设置
- static constexpr uint16_t IMAGE_ENTER_POSITION_X = 131;
- static constexpr uint16_t IMAGE_ENTER_POSITION_Y = 70;
-
- static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;
- static constexpr uint16_t FONT_DEFAULT_SIZE = 25;
- static constexpr uint16_t VIEW_DISTANCE_TO_LEFT_SIDE = 48;
- static constexpr uint16_t TEXT_DISTANCE_TO_LEFT_SIDE = 50;
- static constexpr uint16_t TEXT_DISTANCE_TO_TOP_SIDE = 11;
-
- static ImageAnimatorInfo g_imageAnimatorInfo_Time[IMAGEANIMATOERVIEW_SIZE] = {
- {PNG_COUNTDOWN_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_COUNTDOWN_TIME_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- };
- static HeartBandoffView *g_pMainView = nullptr;
- HeartBandoffView::HeartBandoffView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
- label = nullptr;
- imageView = nullptr;
- HeartBandoffScrollView = nullptr;
- imageAnimator = nullptr;
- g_pMainView = this;
- }
-
- HeartBandoffView::~HeartBandoffView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::~HeartBandoffView");
- HeartBandoffScrollView->RemoveAll();
- delete label;
- delete imageView;
- delete imageAnimator;
- label = nullptr;
- imageView = nullptr;
- delete HeartBandoffScrollView;
- HeartBandoffScrollView = nullptr;
- imageAnimator = nullptr;
- g_pMainView = nullptr;
- }
-
- HeartBandoffView *HeartBandoffView::GetInstance(void)
- {
- return g_pMainView;
- }
-
- // 返回动画状态
- UIImageAnimatorView *HeartBandoffView::GetImageAnimator()
- {
- return imageAnimator;
- }
-
- UIScrollView *HeartBandoffView::HeartBondoffViewInit()
- {
- // 初始化界面
- HeartBandoffScrollView = new UIScrollView();
- if (HeartBandoffScrollView == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBondoffViewInit::HeartBandoffView new fail!");
- // return nullptr;
- }
- HeartBandoffScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
- HeartBandoffScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
- HeartBandoffScrollView->SetStyle(STYLE_BORDER_RADIUS, 1294);
- HeartBandoffScrollView->SetScrollBlankSize(35);
- HeartBandoffScrollView->SetReboundSize(50);
- HeartBandoffScrollView->SetDirection(1);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::CreateUIViewGroup");
-
- // 佩戴title
- label = new UILabelExt();
- if (label == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new Label fail");
- // return nullptr;
- }
- label->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);
- // label->SetText("偏紧佩戴,保持静止");
- label->SetTextId(STR_CHECKNOTE);
- label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
- label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- HeartBandoffScrollView->Add(label);
-
- // 播放动画
- imageAnimator = new UIImageAnimatorView();
- if (imageAnimator == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageAnimatorView fail");
- // return nullptr;
- }
- imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, IMAGEANIMATOERVIEW_SIZE, IMAGEANIMATOERVIEW_SPEED);
- imageAnimator->Start();
- imageAnimator->SetRepeat(false);
- HeartBandoffScrollView->Add(imageAnimator);
-
- // 提醒图片
- imageView = new UIImageView();
- if (imageView == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageView fail");
- // return nullptr;
- }
- imageView->SetPosition(IMAGE_ENTER_POSITION_X, IMAGE_ENTER_POSITION_Y); // 30 : offset
- imageView->SetSrc(PNG_BLOOD_ICON_ENTER);
- HeartBandoffScrollView->Add(imageView);
-
- return HeartBandoffScrollView;
- }
-}
+++ /dev/null
-
-
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "HeartCheckView.h"
-#include "HeartModel.h"
-#include "ui_image_animator.h"
-#include "HeartCheckView.h"
-#include "ui_resource_string.h"
-namespace OHOS
-{
- // 动态刷新设置
- static constexpr uint16_t IMAGE_SIZE = 180;
- static constexpr uint16_t IMAGE_POSITION_Y = 134;
- static constexpr uint16_t IMAGE_POSITION_X = 150;
- static constexpr uint16_t CHECKIMAGEANIMATORVIEW_SIZE = 20;
- static constexpr uint16_t CHECKIMAGEANIMATORVIEW_SPEED = 40;
-
- static ImageAnimatorInfo g_imageAnimatorInfo_Time[20] = {
- {PNG_CHECK_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- {PNG_CHECK_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
- };
-
- static HeartCheckView *g_pMainView = nullptr;
- HeartCheckView::HeartCheckView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
- titleLabel = nullptr;
- HeartCheckScrollView = nullptr;
- imageAnimator = nullptr;
- testButton = nullptr;
- g_pMainView = this;
- }
-
- HeartCheckView *HeartCheckView::GetInstance(void)
- {
- return g_pMainView;
- }
-
- UIImageAnimatorView *HeartCheckView::GetImageAnimator()
- {
- return imageAnimator;
- }
-
- HeartCheckView::~HeartCheckView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartCheckView::~HeartCheckView");
- HeartCheckScrollView->RemoveAll();
- delete titleLabel;
- delete testButton;
- delete HeartCheckScrollView;
- delete imageAnimator;
- delete HeartText;
- titleLabel = nullptr;
- HeartCheckScrollView = nullptr;
- imageAnimator = nullptr;
- testButton = nullptr;
- HeartText = nullptr;
- g_pMainView = this;
- }
- void HeartCheckView::UpShowHeartText()
- {
- // 防止访问空的Text
- if (HeartText != nullptr)
- {
- uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
- std::string bloodoxygenStr = std::to_string(heart_);
- HeartText->SetText(bloodoxygenStr.c_str());
- }
- }
- UIScrollView *HeartCheckView::HeartCheckViewInit()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartCheckView::CreateUIViewHeartCheckScrollView");
- HeartCheckScrollView = new UIScrollView();
- if (HeartCheckScrollView == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new HeartCheckScrollView fail");
- return nullptr;
- }
- HeartCheckScrollView->SetPosition(0, 0);
- HeartCheckScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
- /* -------------------------------------------------------------------------- */
- titleLabel = new UILabelExt();
- if (titleLabel == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new titleLabel fail");
- return nullptr;
- }
- titleLabel->SetPosition(175, 55); // widget's left position and top position
- titleLabel->Resize(200, 90); // widget's width and height
- titleLabel->SetViewId("label3"); // Set style
- titleLabel->SetStyle(STYLE_TEXT_FONT, 28);
- // titleLabel->SetText("正在检测");
- titleLabel->SetTextId(STR_CHECKON);
- titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
- titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- titleLabel->SetRollSpeed(0);
- titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
- HeartCheckScrollView->Add(titleLabel);
- /* -------------------------------------------------------------------------- */
-
- imageAnimator = new UIImageAnimatorView();
- if (imageAnimator == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageAnimatorView fail");
- return nullptr;
- }
- imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, CHECKIMAGEANIMATORVIEW_SIZE, CHECKIMAGEANIMATORVIEW_SPEED);
- // imageAnimator->SetRepeatTimes(30);
- imageAnimator->SetRepeat(true);
- imageAnimator->Start();
- HeartCheckScrollView->Add(imageAnimator);
- /* -------------------------------------------------------------------------- */
- if (testButton == nullptr)
- {
- testButton = new UILabelButtonExt();
- }
- testButton->SetPosition(118, 336); // widget's left position and top position
- testButton->Resize(230, 80); // widget's width and height
- testButton->SetViewId("labelButton"); // Set style
- testButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-
- // Set additional property
- // testButton->SetText("停止检测");
- testButton->SetTextId(STR_CHECKSTOP);
- testButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
- testButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
- testButton->SetViewId("checkstop");
- UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
- if (clickLeftListener == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeftListener fail");
- return nullptr;
- }
- testButton->SetOnClickListener(clickLeftListener);
- HeartCheckScrollView->Add(testButton);
- /* -------------------------------------------------------------------------- */
- HeartText = new UILabelExt();
- if (HeartText == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new HeartText fail");
- return nullptr;
- }
- HeartText->SetPosition(83, 110); // widget's left position and top position
- HeartText->Resize(300, 250); // widget's width and height
- HeartText->SetViewId("label"); // Set style
- HeartText->SetStyle(STYLE_TEXT_FONT, 140);
- uint16_t heart_ = HeartModel::GetInstance()->GetHeartdata();
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetHeartData %d", heart_);
- std::string bloodoxygenStr = std::to_string(heart_);
- HeartText->SetText(bloodoxygenStr.c_str());
- HeartText->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
- HeartText->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- HeartText->SetRollSpeed(0);
- HeartText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 140);
- HeartCheckScrollView->Add(HeartText);
- /* -------------------------------------------------------------------------- */
- return HeartCheckScrollView;
- }
-}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HeartDetectionPresenter.cpp
+ * Author:
+ * Create: 2021-11-23
+ */
+
+#include "heartrate/include/HeartDetectionView.h"
+#include "heartrate/include/HeartDetectionPresenter.h"
+
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include "KeyInputListener.h"
+#include "custom_utils.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "heartrate/include/HeartModel.h"
+#include "MainModel.h"
+
+namespace OHOS
+{
+
+ // 当前Presenter属性实例化的内存指针
+ static HeartDetectionPresenter *g_pHeartDetectionPresenter = nullptr;
+
+ HeartDetectionPresenter::HeartDetectionPresenter()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionPresenter::HeartDetectionPresenter");
+ g_pHeartDetectionPresenter = this;
+ display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
+ display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
+ ResetTickTimer();
+ }
+
+ HeartDetectionPresenter::~HeartDetectionPresenter()
+ {
+ display_api->set_screen_auto_off_timeout(display_time); // 恢复
+ g_pHeartDetectionPresenter = nullptr;
+ }
+ HeartDetectionPresenter *HeartDetectionPresenter::GetInstance()
+ {
+ return g_pHeartDetectionPresenter;
+ }
+ void HeartDetectionPresenter::NavigateBack()
+ {
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_ZOOM);
+ }
+ void HeartDetectionPresenter::OnStart()
+ {
+ Presenter<HeartDetectionView>::OnStart();
+ if (!HeartCheckState)
+ {
+ HeartModel::GetInstance()->Heart_Start();
+ HeartCheckState = true;
+ }
+ }
+ void HeartDetectionPresenter::OnResume(void)
+ {
+ }
+
+ void HeartDetectionPresenter::OnStop(void)
+ {
+ if (HeartCheckState)
+ {
+ HeartModel::GetInstance()->Heart_Stop();
+ HeartCheckState = false;
+ }
+ }
+
+ bool HeartDetectionPresenter::OnDrag(UIView &view, const DragEvent &event)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionPresenter::OnDrag");
+ UNUSED(view);
+ if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&
+ (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY()))))
+ {
+ NavigateBack();
+ }
+ return false;
+ }
+
+ bool HeartDetectionPresenter::OnClick(UIView &view, const ClickEvent &event)
+ {
+ if (strcmp(view.GetViewId(), STOPCHECK) == 0)
+ {
+ NavigateBack();
+ }
+ return true;
+ }
+
+ void HeartDetectionPresenter::OnTickEvent()
+ {
+ // 更新显示心率数据
+ HeartDetectionView::GetInstance()->UpShowHeartText();
+ uint64_t current_time = osKernelGetTick2ms();
+ // printf("current_time diff: %d\r\n", (current_time - startTime));
+ if ((startTime != 0) && (current_time - startTime > HEART_KEEP_TIME))
+ {
+ // 超时处理
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 HEART_KEEP_TIME: %lld", current_time - startTime);
+ HeartModel::GetInstance()->SetResult(HeartResult::TIMEOUT);
+ HeartModel::GetInstance()->Heart_Stop();
+ }
+ }
+ void HeartDetectionPresenter::ResetTickTimer(void)
+ {
+ startTime = osKernelGetTick2ms();
+ }
+ // 增加按键事件
+ bool HeartDetectionPresenter::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 == 0 && uapi_get_screen_state() == 0)
+ {
+ NavigateBack();
+ }
+ return true;
+ }
+}
--- /dev/null
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 15:35:06
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionView.cpp
+ */
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "HeartDetectionView.h"
+#include "HeartModel.h"
+#include "ui_image_animator.h"
+#include "HeartDetectionView.h"
+#include "ui_resource_string.h"
+#include "power_display_service.h"
+#include "uicomponents/UIComponents.h"
+namespace OHOS
+{
+ // 动态刷新设置
+ static constexpr uint16_t IMAGE_SIZE = 180;
+ static constexpr uint16_t IMAGE_POSITION_Y = 134;
+ static constexpr uint16_t IMAGE_POSITION_X = 150;
+ static constexpr uint16_t DETECTION_IMAGE_ANIMATORVIEW_SIZE = 20;
+ static constexpr uint16_t DETECTION_IMAGE_ANIMATORVIEW_SPEED = 40;
+
+ static ImageAnimatorInfo g_imageAnimatorInfo_heart[20] = {
+ {PNG_CHECK_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ {PNG_CHECK_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+ };
+
+ static HeartDetectionView *g_pHeartCheckView = nullptr;
+ HeartDetectionView::HeartDetectionView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
+ g_pHeartCheckView = this;
+ }
+ HeartDetectionView::~HeartDetectionView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::~HeartDetectionView");
+ // container_->RemoveAll();
+
+ delete titleLabel;
+ titleLabel = nullptr;
+
+ delete testButton;
+ testButton = nullptr;
+
+ imageAnimator->Stop();
+ delete imageAnimator;
+ imageAnimator = nullptr;
+
+ delete HeartText;
+ HeartText = nullptr;
+
+ g_pHeartCheckView = this;
+ }
+ HeartDetectionView *HeartDetectionView::GetInstance(void)
+ {
+ return g_pHeartCheckView;
+ }
+ UIImageAnimatorView *HeartDetectionView::GetImageAnimator()
+ {
+ return imageAnimator;
+ }
+
+ /*更新显示数据*/
+ void HeartDetectionView::UpShowHeartText()
+ {
+ uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
+ std::string heartrateStr = std::to_string(heart_);
+ if (HeartText != nullptr)
+ HeartText->SetText(heartrateStr.c_str());
+ }
+ /*初始化检测界面*/
+ bool HeartDetectionView::HeartDetectionViewInit()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionViewInit is begin");
+ /*初始化title*/
+ InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_CHECKON, DEFAULT_VECTOR_FONT_FILENAME, 30);
+ container_->Add(titleLabel);
+
+ /* -------------------------------------------------------------------------- */
+ imageAnimator = new UIImageAnimatorView();
+ if (imageAnimator == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageAnimatorView fail");
+ return false;
+ }
+ imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_heart, DETECTION_IMAGE_ANIMATORVIEW_SIZE, DETECTION_IMAGE_ANIMATORVIEW_SPEED);
+ imageAnimator->SetRepeat(true);
+ container_->Add(imageAnimator);
+
+ /* -------------------------------------------------------------------------- */
+ /*初始化心率值label*/
+ InitUILabel(HeartText, 83, 83, 300, 300, "hearttext", "--", GILROY_BOLD_FONT, 140);
+ container_->Add(HeartText);
+
+ /* -------------------------------------------------------------------------- */
+ InitButtonExt(testButton, 118, 336, 230, 80, STOPCHECK, STR_CHECKSTOP, 30);
+ container_->Add(testButton);
+
+ /* -------------------------------------------------------------------------- */
+ UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartDetectionPresenter::GetInstance();
+ if (clickLeftListener == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::new clickLeftListener fail");
+ return false;
+ }
+ testButton->SetOnClickListener(clickLeftListener);
+ /* -------------------------------------------------------------------------- */
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionViewInit is ok");
+ return true;
+ }
+ void HeartDetectionView::OnStart()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnStart");
+ View<HeartDetectionPresenter>::OnStart();
+
+ SetContainerView(new UIViewGroup());
+ container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+
+ if (!HeartDetectionViewInit())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::InitHeartView fail");
+ }
+
+ RootView::GetInstance()->Add(container_);
+ SetContainerView(container_);
+
+ container_->SetDraggable(true);
+ container_->SetTouchable(true);
+ container_->SetOnDragListener(presenter_);
+
+ // 增加按键监听
+ RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartDetectionPresenter::GetInstance();
+ RootView::GetInstance()->SetOnKeyActListener(keyactListener);
+ }
+ void HeartDetectionView::OnSetUpView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnSetUpView");
+ View<HeartDetectionPresenter>::OnSetUpView();
+ if (imageAnimator != nullptr)
+ {
+ imageAnimator->Start();
+ }
+ Draw();
+ }
+ void HeartDetectionView::OnTearDownView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnTearDownView");
+ View<HeartDetectionPresenter>::OnTearDownView();
+ return;
+ }
+
+ void HeartDetectionView::OnStop()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnStop");
+ View<HeartDetectionPresenter>::OnStop();
+ if (container_ != nullptr)
+ {
+ container_->RemoveAll();
+ delete container_;
+ container_ = nullptr;
+ }
+ return;
+ }
+}
#include "IndoorWalkPreparedView.h"\r
#include "IndoorWalkPresenter.h"\r
#include "MainViewSample.h"\r
+\r
#include "heartrate/include/HeartRateView.h"\r
+#include "heartrate/include/HeartDetectionPresenter.h"\r
+#include "heartrate/include/HeartResultPresenter.h"\r
+\r
#include <iostream>\r
#include <random>\r
-#include "heartrate/include/HeartView.h"\r
-#include "heartrate/include/HeartPresenter.h"\r
#include "DialModelHeartRate.h"\r
#include "health_service.h"\r
#include "custom_utils.h"\r
{\r
#endif\r
\r
-#define MAX_UNWEAR_COUNT 20\r
+#define MAX_UNWEAR_COUNT 30\r
#define MAX_VALID_HRS_COUNT 40\r
-#define MAX_DISVALID_HRS_COUNT 40\r
+#define MAX_DISVALID_HRS_COUNT 70\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
+\r
/* 佩戴检测结果 */\r
enum\r
{\r
HeartModel::HeartModel()\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
- HeartView = false;\r
- BandoffView = false;\r
- CheckView = false;\r
- ResultView = false;\r
- CheckStatus = false;\r
- wearStatus = true;\r
-\r
HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
if (data != nullptr)\r
{\r
- Heart_ = data->Heart;\r
- TIME_ = data->timestamp;\r
+ currentheart = data->Heart;\r
+ timestamp_ms = data->timestamp;\r
delete data;\r
}\r
else\r
{\r
- Heart_ = 0;\r
- TIME_ = 0;\r
+ currentheart = 0;\r
+ timestamp_ms = 0;\r
}\r
}\r
\r
// 重新初始化\r
void HeartModel::ReInit()\r
{\r
- Heart_ = 0;\r
- TIME_ = 0;\r
+ currentheart = 0;\r
+ timestamp_ms = 0;\r
+ }\r
+ // 获取心率数据\r
+ uint16_t HeartModel::GetHeartdata()\r
+ {\r
+ return currentheart;\r
+ }\r
+\r
+ uint16_t HeartModel::GetShowHeartdata()\r
+ {\r
+ return displayheart;\r
+ }\r
+\r
+ uint32_t HeartModel::GetCheckTime()\r
+ {\r
+ return timestamp_ms;\r
}\r
\r
+ void HeartModel::SetCheckTime(uint32_t time)\r
+ {\r
+ timestamp_ms = time;\r
+ }\r
+ void HeartModel::SetResult(HeartResult result)\r
+ {\r
+ heartresult_ = result;\r
+ }\r
+ HeartResult HeartModel::GetResult()\r
+ {\r
+ return heartresult_;\r
+ }\r
// 控制心率检测\r
void HeartModel::Heart_Control(HeartState state, HeartCheck check)\r
{\r
checkstate = check;\r
}\r
}\r
+ // 开始检测\r
void HeartModel::Heart_Start()\r
{\r
+ displayheart = 0;\r
+ SetResult(HeartResult::NOT_TESTED); // 成功检测\r
// 进行初始化操作\r
- SetCheckStatus(true);\r
+ if (!sensorstate)\r
+ {\r
+ Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+ sensorstate = true;\r
+ }\r
}\r
\r
+ // 结束检测\r
void HeartModel::Heart_Stop()\r
{\r
valid_counter_ = 0;\r
- unwear_counter_ = 0;\r
disvalid_counter_ = 0;\r
- SetCheckStatus(false);\r
- SetWearStatus(1);\r
- }\r
+ unwear_counter_ = 0;\r
\r
- void HeartModel::SetWearStatus(int32_t wear)\r
- {\r
- // 设置佩戴状态\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
- if (wear_ != 1 && wear != 1)\r
+ /*主界面卡片检测 或者 被动检测*/\r
+ if (checkstate == HeartCheck::CARDCHECK || checkstate == HeartCheck::PASSIVITY)\r
{\r
- unwear_counter_++; // 佩戴错误计时器计数\r
+ Heart_Save();\r
}\r
- else\r
- {\r
- unwear_counter_ = 0;\r
- }\r
-\r
- wear_ = wear;\r
\r
- if (unwear_counter_ >= MAX_UNWEAR_COUNT)\r
+ if (sensorstate)\r
{\r
- wearStatus = false; // 计数达到10次,停止检测\r
+ Heart_Control(HeartState::End, HeartCheck::INITIATIVE);\r
+ sensorstate = false;\r
+ Heart_Result(); // 处理结果\r
}\r
- else\r
- {\r
- wearStatus = true;\r
- }\r
- }\r
-\r
- bool HeartModel::GetWearStatus()\r
- {\r
- return wearStatus;\r
- }\r
-\r
- void HeartModel::SetHeartBandoffViewStatus(bool bandoffViewStatus)\r
- {\r
- BandoffView = bandoffViewStatus;\r
- }\r
-\r
- bool HeartModel::GetHeartBandoffViewStatus()\r
- {\r
- return BandoffView;\r
- }\r
-\r
- void HeartModel::SetHeartViewStatus(bool heartViewStatus)\r
- {\r
- HeartView = heartViewStatus;\r
}\r
-\r
- bool HeartModel::GetHeartViewStatus()\r
+ // 保存检测数据\r
+ void HeartModel::Heart_Save()\r
{\r
- return HeartView;\r
- }\r
+ HeartRateData data;\r
+ data.Heart = currentheart;\r
+ data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
+ SetCheckTime(data.timestamp);\r
+ HealthService::GetInstance()->UpdateHealthData(data);\r
\r
- void HeartModel::SetHeartCheckViewStatus(bool checkViewStatus)\r
- {\r
- CheckView = checkViewStatus;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentheart, data.timestamp);\r
}\r
\r
- bool HeartModel::GetHeartCheckViewStatus()\r
+ // 显示检测结果// 显示检测结果\r
+ void HeartModel::Heart_Result()\r
{\r
- return CheckView;\r
- }\r
+ // 心率提醒(0开 1关)\r
+ uint8_t HeartState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
+ uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
\r
- void HeartModel::SetHeartResultViewStatus(bool resultViewStatus)\r
- {\r
- ResultView = resultViewStatus;\r
- }\r
-\r
- bool HeartModel::GetHeartResultViewStaus()\r
- {\r
- return ResultView;\r
- }\r
-\r
- void HeartModel::SetCheckStatus(bool checkStatus)\r
- {\r
- CheckStatus = checkStatus;\r
- }\r
+ if (HeartState)\r
+ {\r
+ // 检查当前心率是否高于或低于阈值\r
+ uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
\r
- bool HeartModel::GetCheckStatus()\r
- {\r
- return CheckStatus;\r
- }\r
- // 获取心率数据\r
- uint16_t HeartModel::GetHeartdata()\r
- {\r
- return Heart_;\r
- }\r
+ if (ThresholdState == 0 && currentheart < ThresholdValue)\r
+ {\r
+ // 当前心率低于阈值\r
+ heartresult_ = HeartResult::LOW_RESULT;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
+ }\r
+ else if (ThresholdState == 1 && currentheart > ThresholdValue)\r
+ {\r
+ // 当前心率高于阈值\r
+ heartresult_ = HeartResult::HIGH_RESULT;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
+ }\r
+ }\r
\r
- uint16_t HeartModel::GetShowHeartdata()\r
- {\r
- return Show_Heart_;\r
+ // 根据结果进行处理\r
+ switch (heartresult_)\r
+ {\r
+ case HeartResult::SUCCESS:\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
+ Heart_Save();\r
+ NativeAbility::GetInstance().Back(); // 成功\r
+ break;\r
+\r
+ case HeartResult::NOT_WORN: // 未佩戴状态\r
+ case HeartResult::TIMEOUT: // 超时情况\r
+ case HeartResult::INVALID_DATA: // 无效数据情况\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况",\r
+ heartresult_ == HeartResult::NOT_WORN ? "未佩戴状态" : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
+ : "无效数据");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+ break;\r
+\r
+ case HeartResult::LOW_RESULT:\r
+ // 低心率结果处理\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");\r
+ HealthState lowHealthState;\r
+ lowHealthState.checkType = BLOOD_CHECK;\r
+ lowHealthState.resultStatus = LOW;\r
+ lowHealthState.checkResult = ThresholdValue;\r
+ HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ break;\r
+\r
+ case HeartResult::HIGH_RESULT:\r
+ // 高心率结果处理\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况");\r
+ HealthState highHealthState;\r
+ highHealthState.checkType = BLOOD_CHECK;\r
+ highHealthState.resultStatus = HIGH;\r
+ highHealthState.checkResult = ThresholdValue;\r
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ break;\r
+\r
+ default:\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");\r
+ break;\r
+ }\r
}\r
-\r
- uint64_t HeartModel::GetCheckTime()\r
+ void HeartModel::SetWearStatus(int32_t wear)\r
{\r
- return TIME_;\r
- }\r
+ // 设置佩戴状态\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
\r
- void HeartModel::SetCheckTime(uint64_t time)\r
- {\r
- TIME_ = time;\r
+ // 计数更新\r
+ if (wear_ != 1 && wear != 1)\r
+ {\r
+ unwear_counter_++; // 佩戴错误计时器计数\r
+ }\r
+ else\r
+ {\r
+ unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
+ }\r
+ wear_ = wear;\r
+ // 检查是否达到了最大未佩戴计数限制\r
+ if (unwear_counter_ >= MAX_UNWEAR_COUNT)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_);\r
+ SetResult(HeartResult::NOT_WORN);\r
+ Heart_Stop();\r
+ }\r
}\r
\r
void HeartModel::UpHeartdata(uint16_t heart)\r
if (uapi_dev_runtime_get_train_status() == 1)\r
return;\r
\r
- Show_Heart_ = heart;\r
- if (Show_Heart_ != 0)\r
+ displayheart = heart;\r
+\r
+ // 处理有效与无效计数\r
+ if (displayheart != 0)\r
{\r
- Heart_ = heart;\r
- valid_counter_++; // 增加有效计数器\r
- disvalid_counter_ = 0; // 清零无效数\r
+ currentheart = displayheart; // 更新 currentheart\r
+ valid_counter_++; // 增加有效计数器\r
+ disvalid_counter_ = 0; // 清空无效计数器\r
}\r
else\r
{\r
+ disvalid_counter_++; // 增加无效计数器\r
valid_counter_ = 0; // 清零有效计数器\r
- disvalid_counter_++; // 增加无效数\r
}\r
- // 一直为无效数\r
+\r
+ // 检查无效计数器是否达标\r
if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
{\r
- // 结束本次测试\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MAX_DISVALID_HRS_COUNT");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
+ SetResult(HeartResult::INVALID_DATA); // 无效数达标\r
Heart_Stop();\r
- // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
- HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
- return;\r
}\r
-#if HEARTTEST\r
+\r
+ // 检查有效计数器是否达标\r
if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
{\r
- // 结束本次测试,将最后一次有效数作为本次测量结果\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
+ SetResult(HeartResult::SUCCESS); // 成功检测\r
Heart_Stop();\r
- // 保存心率数据\r
- HeartRateData *data = new HeartRateData;\r
- data->Heart = heart;\r
- data->timestamp = HeartPresenter::GetInstance()->GetCurrentTime();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp);\r
- SetCheckTime(data->timestamp);\r
- HealthService::GetInstance()->UpdateHealthData(*data); // 心率数据存储\r
- // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
- HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
}\r
-#endif\r
}\r
-\r
}\r
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: heart view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#include "heartrate/include/HeartResultPresenter.h"
+#include "common/task_manager.h"
+#include "HeartModel.h"
+
+#include "heartrate/include/HeartDetectionView.h"
+#include "heartrate/include/HeartResultView.h"
+
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+
+#include "ChangeSliceListener.h"
+#include "broadcast_service.h"
+#include <fstream>
+#include "iostream"
+#include <sstream>
+#include <string>
+#include <cstdlib>
+#include <ctime>
+#include "wearable_log.h"
+#include "cmsis_os.h"
+#include "securec.h"
+#include "broadcast_service.h"
+#include "graphic_service.h"
+#include <chrono>
+#include <thread>
+#include <sys/time.h>
+
+#include "ppg_service.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "power_display_service.h"
+#include "custom_utils.h"
+#include "cywee_service.h"
+#include "battery_hal.h"
+
+#include "heart_blood/health_service/health_service.h"
+
+#define BLOODKEYABLE 1
+namespace OHOS
+{
+ static constexpr uint16_t PROGRESS_VALUE_MIN = 0;
+ static constexpr uint16_t PROGRESS_VALUE_MAX = 10;
+
+ static HeartResultPresenter *g_pHeartResultPresenter;
+ /* -------------------------------------------------------------------------- */
+ // 获取当前的时间戳
+ uint32_t HeartResultPresenter::GetCurrentTime()
+ {
+ uint32_t time;
+ if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
+ return 0;
+ }
+ return time;
+ }
+
+ // 获取时间差,现在传进来的是两个时间戳
+ int HeartResultPresenter::GetTDOA(uint32_t new_time, uint32_t old_time)
+ {
+ if (new_time == old_time || old_time > new_time)
+ {
+ return 0;
+ }
+ int time_diff_seconds = new_time - old_time;
+ // 转换为分钟的差值
+ int time_diff_minutes = time_diff_seconds / 60;
+ return time_diff_minutes;
+ }
+ /* -------------------------------------------------------------------------- */
+ HeartResultPresenter::HeartResultPresenter()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultPresenter::new HeartResultPresenter");
+ g_pHeartResultPresenter = this;
+ }
+ HeartResultPresenter::~HeartResultPresenter()
+ {
+ g_pHeartResultPresenter = nullptr;
+ }
+ HeartResultPresenter *HeartResultPresenter::GetInstance()
+ {
+ return g_pHeartResultPresenter;
+ }
+ void HeartResultPresenter::OnStart()
+ {
+ Presenter<HeartResultView>::OnStart();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultPresenter::On Start ");
+ }
+ void HeartResultPresenter::OnPause(void) {}
+
+ void HeartResultPresenter::OnResume(void) {}
+
+ void HeartResultPresenter::OnStop(void) {}
+
+ bool HeartResultPresenter::OnDrag(UIView &view, const DragEvent &event)
+ {
+ return true;
+ }
+ bool HeartResultPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+ {
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
+ {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+ return true;
+ }
+ return false;
+ }
+ bool HeartResultPresenter::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 == 0 && uapi_get_screen_state() == 0)
+ {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+ }
+ return true;
+ }
+
+ bool HeartResultPresenter::OnClick(UIView &view, const ClickEvent &event)
+ {
+ if (strcmp(view.GetViewId(), CLICK_HEART) == 0)
+ {
+ // 如果正在充电进入提醒界面
+ if (get_charge_stat())
+ {
+ HealthState highHealthState;
+ highHealthState.checkType = CHARGE;
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID, TransitionType::TRANSITION_ZOOM);
+ }
+ else
+ {
+ NativeAbility::GetInstance().EnterSlice(VIEW_HEART_CHECK, TransitionType::TRANSITION_ZOOM);
+ }
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartPresenter::OnClick");
+ return true;
+ }
+
+}
\ No newline at end of file
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-30 16:39:56
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultView.cpp
+ */
+#include "common/image_cache_manager.h"
+#include "ui_resource_image.h"
+#include <ui_scroll_view.h>
+#include "components/ui_button.h"
+#include "MainViewSample.h"
+#include "components/ui_view_group.h"
+#include "DialModelSPO2.h"
+#include "DialModelHeartRate.h"
+#include "HeartModel.h"
#include "UiConfig.h"
-#include "wearable_log.h"
-#include "HeartResultView.h"
-#include "HeartModel.h"
-#include "ui_image_animator.h"
-#include "HeartResultView.h"
-#include "ui_resource_string.h"
+#include "uicomponents/UIComponents.h"
+#include "MainPresenterSample.h"
+
+#include "heartrate/include/HeartResultPresenter.h"
+#include "heartrate/include/HeartResultView.h"
namespace OHOS
{
- // 图片设置
- static constexpr uint16_t IMAGE_SIZE = 80;
- static constexpr uint16_t IMAGE_X = 193;
- static constexpr uint16_t IMAGE_Y = 111;
-
- // 按钮设置
- static constexpr uint16_t BUTTON_LABEL_SIZE = 26;
- static constexpr uint16_t BUTTON_WIDHT = 230;
- static constexpr uint16_t BUTTON_HEIGHT = 80;
- static constexpr uint16_t ST_BUTTON_X = 118;
- static constexpr uint16_t ST_BUTTON_Y = 334;
- static constexpr uint16_t RE_BUTTON_X = 118;
- static constexpr uint16_t RE_BUTTON_Y = 434;
-
- // 标签设置
- static constexpr uint16_t LABLE_FONT_SIZE = 30;
- static constexpr uint16_t TITLE_POSITION_X = 149;
- static constexpr uint16_t TITLE_POSITION_Y = 52;
- static constexpr uint16_t label1_POSITION_X = 58;
- static constexpr uint16_t label1_POSITION_Y = 208;
- static constexpr uint16_t label2_POSITION_X = 38;
- static constexpr uint16_t label2_POSITION_Y = 243;
- static constexpr uint16_t LABEL3_POSITION_X = 143;
- static constexpr uint16_t LABEL3_POSITION_Y = 278;
-
- static HeartResultView *g_pMainView = nullptr;
+ static HeartResultView *g_pHeartResultView{nullptr};
+ static const char *HEARTBACKPATH = "/user/res/Blood/beijing.bin";
+
HeartResultView::HeartResultView()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
-
- g_pMainView = this;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::HeartResultView");
+ g_pHeartResultView = this;
}
- HeartResultView *HeartResultView::GetInstance(void)
+ HeartResultView::~HeartResultView()
{
- return g_pMainView;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::~HeartResultView");
+ DeInit();
+ g_pHeartResultView = nullptr;
}
- HeartResultView::~HeartResultView()
+ HeartResultView *HeartResultView::GetInstance()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::~HeartResultView");
- HeartResultScrollView->RemoveAll();
- delete imageerror;
- delete titlelabel;
- delete label1;
- delete label2;
- delete label3;
- delete ReButton;
- delete StButton;
- delete HeartResultScrollView;
-
- titlelabel = nullptr;
- label1 = nullptr;
- label2 = nullptr;
- label3 = nullptr;
- HeartResultScrollView = nullptr;
- ReButton = nullptr;
- StButton = nullptr;
- g_pMainView = this;
+ return g_pHeartResultView;
}
- // 初始化标签
- bool HeartResultView::InitLabel()
+
+ /* -------------------------------------------------------------------------- */
+ void HeartResultView::UpHeartText()
{
- titlelabel = new UILabelExt();
- if (titlelabel == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
- return false;
- }
- titlelabel->SetPosition(149, 52); // widget's left position and top position
- titlelabel->Resize(200, 60); // widget's width and height
- titlelabel->SetViewId("label1"); // Set style
- titlelabel->SetStyle(STYLE_TEXT_FONT, 28);
-
- // Set additional property
- // titlelabel->SetText("检测不到结果");
- titlelabel->SetTextId(STR_CHECKERROR);
- titlelabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
- titlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- titlelabel->SetRollSpeed(0);
- titlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
- /* -------------------------------------------------------------------------- */
- label1 = new UILabelExt();
- if (label1 == nullptr)
+ // 更新心率数据
+ uint16_t heart = HeartModel::GetInstance()->GetHeartdata();
+ if (heart != 0) // 判断是否为默认数据
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
- return false;
- }
- label1->SetPosition(53, 208); // widget's left position and top position
- label1->Resize(200, 60); // widget's width and height
- label1->SetViewId("label4"); // Set style
- label1->SetStyle(STYLE_TEXT_FONT, 30);
-
- label1->SetText("请确认已带上手表,并保持静止");
- label1->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
- label1->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- label1->SetRollSpeed(0);
- label1->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
- /* -------------------------------------------------------------------------- */
- label2 = new UILabelExt();
- if (label2 == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
- return false;
+ // 更新数据
+ std::string heartrateStr = std::to_string(heart);
+ heartLabel->SetText(heartrateStr.c_str());
+
+ // 获取时间差
+ uint32_t time = HeartResultPresenter::GetInstance()->GetCurrentTime();
+ uint32_t check_time = HeartModel::GetInstance()->GetCheckTime();
+ int time_diff = HeartResultPresenter::GetInstance()->GetTDOA(time, check_time);
+
+ if (time_diff == 0)
+ {
+ timeLabel->SetTextId(STR_CHECKNEW);
+ }
+ else if (time_diff <= 60)
+ {
+ UpdateLabel(timeLabel, time_diff, STR_CHECKTIME);
+ }
+ else
+ {
+ timeLabel->SetTextId(STR_CHECKLONG);
+ }
}
- label2->SetPosition(38, 243); // widget's left position and top position
- label2->Resize(200, 60); // widget's width and height
- label2->SetViewId("label5"); // Set style
- label2->SetStyle(STYLE_TEXT_FONT, 30);
- label2->SetText("准备好后点击下方按钮");
- label2->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
- label2->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- label2->SetRollSpeed(0);
- label2->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
- /* -------------------------------------------------------------------------- */
- label3 = new UILabelExt();
- if (label3 == nullptr)
+ else
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
- return false;
+ heartLabel->SetText("--");
+ timeLabel->SetTextId(STR_CHECKNO);
}
- label3->SetPosition(143, 278); // widget's left position and top position
- label3->Resize(200, 60); // widget's width and height
- label3->SetViewId("label6"); // Set style
- label3->SetStyle(STYLE_TEXT_FONT, 30);
- label3->SetText("进行重新检测");
- label3->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
- label3->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- label3->SetRollSpeed(0);
- label3->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ }
+
+ /* -------------------------------------------------------------------------- */
+ /***
+ * @description:
+ * @return 添加按键是否成功
+ */
+ bool HeartResultView::AddButton()
+ {
+ InitButtonExt(checkButton, 118, 336, 230, 80, CLICK_HEART, STR_CHECK, 30);
+ checkButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF5A36); // 设置按键颜色
+ // 设置按键监听
+ UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::HeartResultPresenter::GetInstance();
+ checkButton->SetOnClickListener(clickListener);
+ container_->Add(checkButton);
return true;
}
- // 初始化图片
- bool HeartResultView::InitImageDisplay()
+ /***
+ * @description:
+ * @return 初始化标签是否成功
+ */
+ bool HeartResultView::InitLable()
{
- imageerror = new UIImageView();
- if (imageerror == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImageDisplay fail");
- return false;
- }
- imageerror->SetPosition(193, 111); // widget's left position and top position
- imageerror->Resize(100, 100); // widget's width and height
- imageerror->SetViewId("image1"); // Set style
- char *image1imagesPath = "/user/res/Blood/Error.bin";
- imageerror->SetSrc(image1imagesPath);
+ /*初始化title*/
+ InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_HEARTDATA, DEFAULT_VECTOR_FONT_FILENAME, 30);
+ /*初始化心率值label*/
+ InitUILabel(heartLabel, 83, 32, 300, 300, "bloodtext", "--", DEFAULT_VECTOR_FONT_FILENAME, 140);
+ /*初始化检测时间*/
+ InitLabelExt(timeLabel, 53, 270, 360, 35, "time", STR_CHECKNO, DEFAULT_VECTOR_FONT_FILENAME, 30);
+ // 设置来回滚动属性
+ timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+ timeLabel->SetRollSpeed(70);
+
+ UpHeartText();
+
+ container_->Add(titleLabel);
+ container_->Add(heartLabel);
+ container_->Add(timeLabel);
+
return true;
}
- UIScrollView *HeartResultView::HeartResultViewInit()
+ /***
+ * @description:
+ * @return 初始化背景是否成功
+ */
+ bool HeartResultView::Initbackground()
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::CreateUIViewHeartResultScrollView");
- HeartResultScrollView = new UIScrollView();
- if (HeartResultScrollView == nullptr)
+
+ background = new UIImageView();
+ background->SetPosition(0, 0, 466, 466);
+ background->SetSrc(HEARTBACKPATH);
+
+ container_->Add(background);
+ return true;
+ }
+ /***
+ * @description:
+ * @return 是否初始化成功
+ */
+ bool HeartResultView::HeartResultViewInit()
+ {
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bool HeartResultView::InitView()");
+ if (!Initbackground())
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new HeartResultScrollView fail");
- return nullptr;
- }
- HeartResultScrollView->SetPosition(0, 0);
- HeartResultScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
- HeartResultScrollView->SetScrollBlankSize(35);
- HeartResultScrollView->SetReboundSize(50);
- HeartResultScrollView->SetDirection(1);
- // 增加拖拽监听
- UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(new HeartPresenter());
- if (draglistener == nullptr)
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Initbackground error!");
+ };
+ if (!InitLable())
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::draglistener can not be nullptr!");
- return nullptr;
- }
- HeartResultScrollView->SetOnDragListener(draglistener);
- HeartResultScrollView->SetTouchable(true);
- HeartResultScrollView->SetDraggable(true);
- HeartResultScrollView->SetHorizontalScrollState(false); // 禁止横向滑动
- /* -------------------------------------------------------------------------- */
- if (InitImageDisplay() == false)
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLable error!");
+ };
+ if (!AddButton())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AddButton error!");
+ };
+ return true;
+ }
+ /***
+ * @description:
+ * @return 删除组件
+ */
+ void HeartResultView::DeInit()
+ {
+ if (background != nullptr)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "nitImageDisplay fail");
- return nullptr;
+ delete background;
+ background = nullptr;
}
- if (InitLabel() == false)
+ if (heartLabel != nullptr)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
- return nullptr;
+ delete heartLabel;
+ heartLabel = nullptr;
}
- /* -------------------------------------------------------------------------- */
- ReButton = new UILabelButtonExt();
- if (ReButton == nullptr)
+ if (timeLabel != nullptr)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButtonExt fail");
- return nullptr;
+ delete timeLabel;
+ timeLabel = nullptr;
}
- ReButton->SetPosition(118, 334);
- ReButton->Resize(230, 80);
- // ReButton->SetText("重新检测");
- ReButton->SetTextId(STR_RECHECK);
- ReButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF8A36);
- ReButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
- ReButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
- ReButton->SetViewId("ReCheck");
- UIView::OnClickListener *clickLeft1Listener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
- if (clickLeft1Listener == nullptr)
+ if (titleLabel != nullptr)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeft1Listener fail");
- return nullptr;
+ delete titleLabel;
+ titleLabel = nullptr;
}
- ReButton->SetOnClickListener(clickLeft1Listener);
- /* -------------------------------------------------------------------------- */
- StButton = new UILabelButtonExt();
- if (StButton == nullptr)
+ }
+
+ void HeartResultView::OnStart()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStart");
+ View<HeartResultPresenter>::OnStart();
+
+ SetContainerView(new UIViewGroup());
+ container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+
+ if (!HeartResultViewInit())
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButtonExt fail");
- return nullptr;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::InitHeartView fail");
}
- StButton->SetPosition(118, 434); // widget's left position and top position
- StButton->Resize(230, 80); // widget's width and height
- // StButton->SetText("停止检测");
- StButton->SetTextId(STR_CHECKSTOP);
- StButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
- StButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
- StButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
- StButton->SetViewId("StCheck");
- UIView::OnClickListener *clickLeft2Listener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
- if (clickLeft2Listener == nullptr)
+
+ RootView::GetInstance()->Add(container_);
+ SetContainerView(container_);
+
+ container_->SetDraggable(true);
+ container_->SetTouchable(true);
+ container_->SetOnDragListener(presenter_);
+
+ // 增加按键监听
+ RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartResultPresenter::GetInstance();
+ RootView::GetInstance()->SetOnKeyActListener(keyactListener);
+ }
+ void HeartResultView::OnSetUpView()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnSetUpView");
+ View<HeartResultPresenter>::OnSetUpView();
+ Draw();
+ }
+ void HeartResultView::OnTearDownView()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnTearDownView");
+ View<HeartResultPresenter>::OnTearDownView();
+ return;
+ }
+
+ void HeartResultView::OnStop()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStop");
+ View<HeartResultPresenter>::OnStop();
+ if (container_ != nullptr)
{
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeft2Listener fail");
- return nullptr;
+ container_->RemoveAll();
+ delete container_;
+ container_ = nullptr;
}
- StButton->SetOnClickListener(clickLeft2Listener);
- /* -------------------------------------------------------------------------- */
- HeartResultScrollView->Add(imageerror);
- HeartResultScrollView->Add(titlelabel);
- HeartResultScrollView->Add(label1);
- HeartResultScrollView->Add(label2);
- HeartResultScrollView->Add(label3);
- HeartResultScrollView->Add(ReButton);
- HeartResultScrollView->Add(StButton);
- /* -------------------------------------------------------------------------- */
- return HeartResultScrollView;
+ return;
}
}
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: heart view
- * Author:
- * Create: 2021-08-01
- */
-
-#include "heartrate/include/HeartView.h"
-#include "heartrate/include/HeartPresenter.h"
-#include "heartrate/include/HeartModel.h"
-#include "displaybrightness/include/DisplayBrightnessModel.h"
-#include "power_display_service.h"
-#include "heartrate/include/HeartBandoffView.h"
-#include "heartrate/include/HeartCheckView.h"
-#include "heartrate/include/HeartRateView.h"
-#include "ui_resource_string.h"
-#include "uicomponents/UIComponents.h"
-#include "heart_blood/health_service/health_service.h"
-namespace OHOS
-{
- // 按钮设置
- static constexpr uint16_t BUTTON_LABEL_SIZE = 30;
- static constexpr uint16_t TESTBUTTON_X = 118;
- static constexpr uint16_t TESTBUTTON_Y = 336;
- static constexpr uint16_t BUTTON_WIDHT2 = 230;
- static constexpr uint16_t BUTTON_HEIGHT2 = 80;
-
- // 标签设置
- static constexpr uint16_t PERCENT_X = 83;
- static constexpr uint16_t PERCENT_Y = 103;
- static constexpr uint16_t PERCENT_FONT_SIZE = 140;
- static constexpr uint16_t TIMELABEL_X = 90;
- static constexpr uint16_t TIMELABEL_Y = 260;
- static constexpr uint16_t TIMELABEL_FONT_SIZE = 30;
- static constexpr uint16_t TITLE_X = 151;
- static constexpr uint16_t TITLE_Y = 55;
- static constexpr uint16_t TITLE_FONT_SIZE = 28;
-
- static constexpr uint16_t MATH_ZERO = 0;
- static HeartView *g_pMainView = nullptr;
-
- HeartView::HeartView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::HeartView");
- g_pMainView = this;
- /*更新model 如果model数据为0,尝试再读一次*/
- if (!HeartModel::GetInstance()->GetHeartdata())
- {
- HeartRateData *data;
- data = HealthService::GetInstance()->ReadHeartRateData(); // 初始化心率值
- if (data != nullptr)
- {
- HeartModel::GetInstance()->UpHeartdata(data->Heart);
- HeartModel::GetInstance()->SetCheckTime(data->timestamp);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
- }
- delete data;
- }
- }
-
- HeartView::~HeartView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::~HeartView");
-
- HeartScrollView[HEARTVIEW]->RemoveAll();
- UIView::OnDragListener *draglistener = HeartScrollView[HEARTVIEW]->GetOnDragListener();
- if (draglistener != nullptr)
- {
- delete draglistener;
- draglistener = nullptr;
- }
- delete imageViewMain;
- delete timeLabel;
- delete titleLabel;
- delete testButton;
- delete percent;
- delete heartcheck;
- delete heartbandoff;
- delete heartresult;
-
- imageViewMain = nullptr;
- titleLabel = nullptr;
- timeLabel = nullptr;
- percent = nullptr;
- testButton = nullptr;
- g_pMainView = nullptr;
- heartcheck = nullptr;
- heartbandoff = nullptr;
- heartresult = nullptr;
-
- delete HeartScrollView[HEARTVIEW];
- HeartScrollView[HEARTVIEW] = nullptr;
- }
- HeartView *HeartView::GetInstance(void)
- {
- return g_pMainView;
- }
- void HeartView::UpHeartText()
- {
- // 更新心率数据
- uint8_t heart = HeartModel::GetInstance()->GetHeartdata();
-
- // 防止访问空组件
- if (percent == nullptr || timeLabel == nullptr)
- return;
-
- if (heart != 0) // 判断是否为默认数据
- {
- // 更新心率数据
- std::string heartStr = std::to_string(heart);
- percent->SetText(heartStr.c_str());
-
- // 获取时间差
- uint32_t time = HeartPresenter::GetInstance()->GetCurrentTime();
- uint32_t check_time = HeartModel::GetInstance()->GetCheckTime();
- int time_diff = HeartPresenter::GetInstance()->GetTDOA(time, check_time);
-
- // 更新时间标签
- if (time_diff == 0)
- {
- timeLabel->SetTextId(STR_CHECKNEW);
- }
- else if (time_diff <= 60)
- {
- UpdateLabel(timeLabel, time_diff, STR_CHECKTIME);
- }
- else
- {
- timeLabel->SetTextId(STR_CHECKLONG);
- }
- }
- else
- {
- percent->SetText("--");
- timeLabel->SetTextId(STR_CHECKNO);
- }
- }
-
- // 初始化标签
- bool HeartView::InitLabel()
- {
- /* -------------------------------------------------------------------------- */
- percent = new UILabelExt();
- if (percent == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new percent fail");
- return false;
- }
- percent->SetPosition(PERCENT_X, PERCENT_Y); // widget's left position and top position
- percent->Resize(300, 250); // widget's width and height
- percent->SetViewId("label2"); // Set style
- percent->SetStyle(STYLE_TEXT_FONT, PERCENT_FONT_SIZE);
- percent->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
- percent->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- percent->SetRollSpeed(0);
- percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE);
- /* -------------------------------------------------------------------------- */
- timeLabel = new UILabelExt();
- if (timeLabel == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new timeLabel fail");
- return false;
- }
- timeLabel->SetPosition(TIMELABEL_X, TIMELABEL_Y); // widget's left position and top position
- timeLabel->Resize(280, 100); // widget's width and height
- timeLabel->SetViewId("label1"); // Set style
- timeLabel->SetStyle(STYLE_TEXT_FONT, TIMELABEL_FONT_SIZE);
- /* -------------------------------------------------------------------------- */
- timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
- timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- timeLabel->SetRollSpeed(0);
- timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMELABEL_FONT_SIZE);
- /* -------------------------------------------------------------------------- */
- titleLabel = new UILabelExt();
- if (titleLabel == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new titleLabel fail");
- return false;
- }
- titleLabel->SetPosition(TITLE_X, TITLE_Y); // widget's left position and top position
- titleLabel->Resize(200, 90); // widget's width and height
- titleLabel->SetViewId("label3"); // Set style
- titleLabel->SetStyle(STYLE_TEXT_FONT, TITLE_FONT_SIZE);
- // titleLabel->SetText("心率检测结果");
- titleLabel->SetTextId(STR_HEARTDATA);
- titleLabel->SetLineBreakMode(UILabelExt::LINE_BREAK_MARQUEE);
- titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
- titleLabel->SetRollSpeed(30);
- titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);
-
- UpHeartText();
- /* -------------------------------------------------------------------------- */
- return true;
- }
- // 创建标签按键
- UILabelButtonExt *HeartView::CreateAndSetUIButton(const char *title)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::CreateAndSetUIButton");
- UILabelButtonExt *btn = new UILabelButtonExt();
- if (btn == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new UILabelButtonExt fail");
- return nullptr;
- }
- btn->SetPosition(TESTBUTTON_X, TESTBUTTON_Y, BUTTON_WIDHT2, BUTTON_HEIGHT2);
- btn->SetStyle(STYLE_BACKGROUND_COLOR, 0xffcd492c);
- // btn->SetText(title);
- btn->SetTextId(STR_CHECK);
- // btn->SetTextColor(Color::Red());
- btn->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_LABEL_SIZE);
- btn->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
- btn->SetAlign(TEXT_ALIGNMENT_CENTER);
- btn->SetViewId("checkbegin");
- UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
- if (clickLeftListener == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeftListener fail");
- return nullptr;
- }
- btn->SetOnClickListener(clickLeftListener);
- return btn;
- }
- // 初始化背景
- bool HeartView::InitImageDisplay()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::InitImageDisplay");
- imageViewMain = new UIImageView();
- if (imageViewMain == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new UIImageView fail");
- return false;
- }
- imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 : offset
- char *image1imagesPath = "/user/res/Blood/beijing.bin";
- imageViewMain->SetSrc(image1imagesPath);
- return true;
- }
- // 初始化界面
- bool HeartView::InitHeartView()
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitHeartView");
- HeartScrollView[HEARTVIEW] = new UIScrollView();
- if (HeartScrollView[HEARTVIEW] == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::HeartScrollView new fail!");
- return false;
- }
- HeartScrollView[HEARTVIEW]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
- HeartScrollView[HEARTVIEW]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
- HeartScrollView[HEARTVIEW]->SetScrollBlankSize(35);
- HeartScrollView[HEARTVIEW]->SetReboundSize(50);
- HeartScrollView[HEARTVIEW]->SetDirection(1);
- // 增加拖拽监听
- UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(new HeartPresenter());
- if (draglistener == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::draglistener can not be nullptr!");
- return false;
- }
- HeartScrollView[HEARTVIEW]->SetOnDragListener(draglistener);
- HeartScrollView[HEARTVIEW]->SetTouchable(true);
- HeartScrollView[HEARTVIEW]->SetDraggable(true);
- HeartScrollView[HEARTVIEW]->SetVerticalScrollState(false); // 禁止纵向滑动
- /* -------------------------------------------------------------------------- */
- if (InitImageDisplay() == false)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitImageDisplay() fail!");
- return false;
- }
- if (InitLabel() == false)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitLabel() fail!");
- return false;
- }
- testButton = CreateAndSetUIButton("检测");
- if (testButton == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new Button fail");
- return false;
- }
- /* -------------------------------------------------------------------------- */
- return true;
- }
-
- // 1.跳转到心率界面
- bool HeartView::ChangeHeartView(int16_t thisView)
- {
- if (HeartScrollView[thisView] == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::ChangeHeartView");
- RootView::GetInstance()->Add(HeartScrollView[thisView]);
- }
- return true;
- }
- // 2.跳转到佩戴界面
- bool HeartView::ChangeBandoffView(int16_t thisView)
- {
- if (HeartScrollView[thisView] == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartOxygenView::ChangeBandoffView");
- heartbandoff = new HeartBandoffView();
- if (heartbandoff == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartOxygenView:: new scrollView[%d] fail", thisView);
- return false;
- }
- HeartScrollView[thisView] = heartbandoff->HeartBondoffViewInit();
- RootView::GetInstance()->Add(HeartScrollView[thisView]);
- }
- return true;
- }
- // 3.跳转到检测界面
- bool HeartView::ChangeCheckView(int16_t thisView)
- {
- if (HeartScrollView[thisView] == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::ChangeCheckView");
- heartcheck = new HeartCheckView();
- if (heartcheck == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: new scrollView[%d] fail", thisView);
- return false;
- }
- HeartScrollView[thisView] = heartcheck->HeartCheckViewInit();
- RootView::GetInstance()->Add(HeartScrollView[thisView]);
- }
- return true;
- }
- // 4.跳转到检测失败界面
- bool HeartView::ChangeResultView(int16_t thisView)
- {
- if (HeartScrollView[thisView] == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::HeartResultView");
- heartresult = new HeartResultView();
- if (heartresult == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: new scrollView[%d] fail", thisView);
- return false;
- }
- HeartScrollView[thisView] = heartresult->HeartResultViewInit();
- RootView::GetInstance()->Add(HeartScrollView[thisView]);
- }
- return true;
- }
- UIScrollView *HeartView::GetHeartScrollView(int ViewId)
- {
- if (HeartScrollView[ViewId] == nullptr)
- {
- return nullptr;
- }
- return HeartScrollView[ViewId];
- }
- /* -------------------------------------------------------------------------- */
- // 1.MainStopWatchViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。
- struct HeartViewMapper
- {
- const int16_t viewId;
- bool (HeartView::*func)(int16_t thisView);
- };
-
- // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。
- static const HeartViewMapper ViewMapper[] = {
- {HEARTVIEW, &HeartView::ChangeHeartView},
- {HEARTBANDVIEW, &HeartView::ChangeBandoffView},
- {HEARTCHECKVIEW, &HeartView::ChangeCheckView},
- {HEARTRESULT, &HeartView::ChangeResultView},
- };
-
- // 3.根据传入的interface参数执行相应视图ID关联的成员函数。
- bool HeartView::ClickFunc(int16_t interface)
- {
- int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[HEARTVIEW]);
- 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;
- }
-
- // 4.切换视图
- void HeartView::ChangeView(int16_t hideView, int16_t showView)
- {
- if (hideView > MAX_HEARTVIEW)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: HeartViewId Overstep ones bounds");
- return;
- }
- HeartScrollView[hideView]->SetVisible(false);
- ClickFunc(showView);
- HeartScrollView[showView]->SetVisible(true);
- Draw();
- }
- bool HeartView::SetOnDragListener()
- {
- UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::HeartPresenter::GetInstance();
- if (dragListener == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::OnDragListener fail");
- return false;
- }
- group->SetDraggable(true);
- group->SetTouchable(true);
- group->SetOnDragListener(dragListener);
- return true;
- }
-
- /* -------------------------------------------------------------------------- */
- void HeartView::OnStart()
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::OnStart");
- display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
- display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
- View<HeartPresenter>::OnStart();
- if (!InitHeartView())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitHeartView fail");
- }
- // 增加按键监听
- RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartPresenter::GetInstance();
- RootView::GetInstance()->SetOnKeyActListener(keyactListener);
- }
-
- void HeartView::OnSetUpView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnSetUpView");
- View<HeartPresenter>::OnSetUpView();
- if (HeartScrollView[HEARTVIEW] == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTVIEW:: OnSetUpView has nullptr");
- return;
- }
-
- HeartScrollView[HEARTVIEW]->Add(imageViewMain);
- HeartScrollView[HEARTVIEW]->Add(percent);
- HeartScrollView[HEARTVIEW]->Add(timeLabel);
- HeartScrollView[HEARTVIEW]->Add(titleLabel);
- HeartScrollView[HEARTVIEW]->Add(testButton);
-
- RootView::GetInstance()->Add(HeartScrollView[HEARTVIEW]);
-
- Draw();
- }
-
- void HeartView::OnTearDownView()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnTearDownView");
- View<HeartPresenter>::OnTearDownView();
- return;
- }
-
- void HeartView::OnStop()
- {
- display_api->set_screen_auto_off_timeout(display_time); // 恢复
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnStop");
- View<HeartPresenter>::OnStop();
- RootView::GetInstance()->RemoveAll();
- return;
- }
-}
+++ /dev/null
-STR_EXERCISE_OUTDOORWALKING$Walk\r
-STR_EXERCISE_OUTDOORRUNNING$Run\r
-STR_EXERCISE_OUTDOORBIKING$Biking\r
-STR_EXERCISE_GENERAL$Exercise general\r
-STR_EXERCISE_FREETRAINING$Free training\r
-STR_EXERCISE_RESISTANCETRAINING$Resistance training\r
-STR_EXERCISE_SPINBIKE$Spin bike\r
-STR_EXERCISE_TREADMILL$Treadmill\r
-STR_EXERCISE_STROLLMACHINE$Stroll machine\r
-STR_EXERCISE_HIIT$High intense interval training\r
-STR_EXERCISE_CROSSFIT$Crossfit\r
-STR_EXERCISE_GROUPCALISTHENICS$Group calisthenics\r
-STR_EXERCISE_YOGA$Yoga\r
-STR_EXERCISE_YOGACAT$Yoga cat\r
-STR_EXERCISE_YOGACOW$Yoga cow\r
-STR_EXERCISE_YOGACOBRA$Yoga cobra\r
-STR_EXERCISE_YOGAHERO1$Yoga hero1\r
-STR_EXERCISE_YOGAHERO2$Yoga hero2\r
-STR_EXERCISE_YOGAHERO3$Yoga hero3\r
-STR_EXERCISE_YOGAROLLING$Yoga rolling\r
-STR_EXERCISE_INDOORWALKING$Indoor walking\r
-STR_EXERCISE_INDOORRUNNING$Indoor running\r
-STR_EXERCISE_JUMPINGROPE$Jumping rope\r
-STR_EXERCISE_PILATES$Pilates\r
-STR_EXERCISE_CROSS_FIT$Cross fit\r
-STR_EXERCISE_FUNCTIONALTRAINING$Functional training\r
-STR_EXERCISE_PHYSICALTRAINING$Physical Training\r
-STR_EXERCISE_TAEKWONDO$Taekwondo\r
-STR_EXERCISE_BOXING$Boxing\r
-STR_EXERCISE_KICKBOXING$Kickboxing\r
-STR_EXERCISE_KARATE$Karate\r
-STR_EXERCISE_FENCING$Fencing\r
-STR_EXERCISE_CORETRAINING$Core training\r
-STR_EXERCISE_BODYCOMBAT$Body Combat\r
-STR_EXERCISE_KENDO$Kendo\r
-STR_EXERCISE_HORIZONTALBAR$Horizontal bar\r
-STR_EXERCISE_PARALLELBARS$Parallel bars\r
-STR_EXERCISE_CIRCUIT$Circuit training\r
-STR_EXERCISE_AEROBICS$Aerobics\r
-STR_EXERCISE_CALISTHENICE$Calisthenice\r
-STR_EXERCISE_P90X$P90X\r
-STR_EXERCISE_KETTLEBELLTRAINING$Kettlebell Training\r
-STR_EXERCISE_MIXEDMARTIALARTS$Mixed martial arts\r
-STR_EXERCISE_STAIRCLIMBINGMACHINE$Stair climbing machine\r
-STR_EXERCISE_WEIGHTLIFTING$Weightlifting\r
-STR_EXERCISE_BARRE$Barre\r
-STR_EXERCISE_HANDCYCLING$Hand cycling\r
-STR_EXERCISE_TRACKFIELD$Track field\r
-STR_EXERCISE_WRESTLING$Wrestling\r
-STR_EXERCISE_MINDBODY$Mind body\r
-STR_EXERCISE_FLEXIBILITY$Flexibility\r
-STR_EXERCISE_MIXEDCARDIO$Mixed cardio\r
-STR_EXERCISE_TRADITIONALSTRENGTHTRAINING$Traditional strength training\r
-STR_EXERCISE_CROSSTRAINING$Cross training\r
-STR_EXERCISE_GYMNASTICS$Gymnastics\r
-STR_EXERCISE_STEPTRAINING$Step training\r
-STR_EXERCISE_ELLIPTICALTRAINER$Elliptical trainer\r
-STR_EXERCISE_ROWINGMACHINE$Rowing machine\r
-STR_DANCING_GENERAL$Dancing general\r
-STR_DANCING_BELLY$Belly dance\r
-STR_DANCING_JAZZ$Jazz dance\r
-STR_DANCING_LATIN$Latin dance\r
-STR_DANCING_BALLET$Ballet dance\r
-STR_DANCING_STREET$Street dance\r
-STR_DANCING_PUBLICSQUARE$Public square dancing\r
-STR_DANCING_ZUMBA$Zumba\r
-STR_DANCING_SOCIALDANCE$Social dance\r
-STR_DANCING_TAPDANCE$Tap dance\r
-STR_RECREATIONAL_SPORTS$Recreational Sports\r
-STR_RECREATIONAL_SKATING$Roller Skating\r
-STR_RECREATIONAL_MARTIALARTS$Martial arts\r
-STR_RECREATIONAL_TAICHI$Tai Chi\r
-STR_RECREATIONAL_HULAHOOP$Hula hoop\r
-STR_RECREATIONAL_DISCSPORT$Disc sport\r
-STR_RECREATIONAL_DARTS$Darts\r
-STR_RECREATIONAL_ARCHERY$Archery\r
-STR_RECREATIONAL_HORSERIDING$Horse riding\r
-STR_RECREATIONAL_BATTLEGAME$Battle game\r
-STR_RECREATIONAL_KITE$Fly a kite\r
-STR_RECREATIONAL_TUGOFWAR$Tug of war\r
-STR_RECREATIONAL_SWING$Swing\r
-STR_RECREATIONAL_STAIRCLIMBING$Stair climbing\r
-STR_RECREATIONAL_OBSTACLERACE$Obstacle race\r
-STR_RECREATIONAL_FISHING$Fishing\r
-STR_RECREATIONAL_HUNTING$Hunting\r
-STR_RECREATIONAL_SCOOTERRIDING$Scooter Riding\r
-STR_RECREATIONAL_PARAGLIDING$Paragliding\r
-STR_RECREATIONAL_TEAMSPORTS$Team sports\r
-STR_RECREATIONAL_FINESSGAMING$Finess gaming\r
-STR_RECREATIONAL_HIKING$Hiking\r
-STR_RECREATIONAL_EQUESTRIANSPORTS$Equestrian sports\r
-STR_RECREATIONAL_PLAY$Play\r
-STR_BALL_GAMES$Ball games\r
-STR_BALL_BADMINTON$Badminton\r
-STR_BALL_TABLETENNIS$Table tennis\r
-STR_BALL_TENNIS$Tennis\r
-STR_BALL_BILLIARDS$Billiards\r
-STR_BALL_BOWLING$Bowling\r
-STR_BALL_VOLLEYBALL$Volleyball\r
-STR_BALL_SHUTTLECOCK$Shuttlecock\r
-STR_BALL_HANDBALL$Handball\r
-STR_BALL_BASEBALL$Baseball\r
-STR_BALL_SOFTBALL$Softball\r
-STR_BALL_CRICKET$Cricket\r
-STR_BALL_FOOTBALL$Football\r
-STR_BALL_BEACHSOCCER$Beach soccer\r
-STR_BALL_BEACHVOLLEYBALL$Beach volleyball\r
-STR_BALL_CROQUET$Croquet\r
-STR_BALL_HOCKEY$Hockey\r
-STR_BALL_SQUASH$Squash\r
-STR_BALL_SEPAKTAKRAW$Sepak takraw\r
-STR_BALL_DODGEBALL$Dodge ball\r
-STR_BALL_BASKETBALL$Basketball\r
-STR_BALL_SOCCER$Soccer\r
-STR_BALL_GOLF$Golf\r
-STR_BALL_POLO$Polo\r
-STR_BALL_RACQUETBALL$Racquetball\r
-STR_BALL_RUGBY$Rugby\r
-STR_BALL_GATEBALL$Gateball\r
-STR_BALL_PICKLEBALL$Pickleball\r
-STR_BALL_LACROSSE$Lacrosse\r
-STR_WATER_ACTIVITIES$Water activities\r
-STR_WATER_SAILING$Sailing\r
-STR_WATER_SURFING$Surfing\r
-STR_WATER_WHITEWATERRAFTING$Whitewater rafting\r
-STR_WATER_CANOEING$Canoeing\r
-STR_WATER_KAYAKING$Kayaking\r
-STR_WATER_ROWING$Rowing\r
-STR_WATER_MOTORBOAT$Motorboat\r
-STR_WATER_SUP$SUP\r
-STR_WATER_SCUBADIVING$Scuba diving\r
-STR_WATER_DIVING$Diving\r
-STR_WATER_KITESURFING$Kitesurfing\r
-STR_WATER_WAKEBOARDING$Wakeboarding\r
-STR_WATER_POLO$Water Polo\r
-STR_WATER_WINDSURFING$Windsurfing\r
-STR_WATER_DRIFTING$Drifting\r
-STR_WATER_FITNESS$Water fitness\r
-STR_WATER_SPORTS$Water sports\r
-STR_WATER_OUTDOORSWIM$Outdoor swim\r
-STR_WATER_INDOORSWIM$Indoor swim\r
-STR_WATER_SWIMFREESTYLE$Swim freestyle\r
-STR_WATER_SWIMBREASTSTROKE$Swim breaststroke\r
-STR_WATER_SWIMBACKSTROKE$Swim backstroke\r
-STR_WATER_SWIMBUTTERFLY$Swim butterfly\r
-STR_ICE_SPORTS$Ice sports\r
-STR_ICE_SKATING$Skating\r
-STR_ICE_HOCKEY$Ice hockey\r
-STR_ICE_CURLING$Curling\r
-STR_ICE_SNOWMOBILING$Snow mobiling\r
-STR_ICE_SLED$Sled\r
-STR_ICE_BIATHLON$Biathlon\r
-STR_ICE_CROSSCOUNTRYSKING$Crosscountry sking\r
-STR_ICE_SKIING$Skiing\r
-STR_ICE_SNOWBOARDING$Snowboarding\r
-STR_ICE_SNOWSHOEING$Snowshoeing\r
-STR_ICE_SNOWSPORTS$Snow sport\r
-STR_EXTREME_SPORTS$Extreme sports\r
-STR_EXTREME_SKATEBOARDING$Skateboarding\r
-STR_EXTREME_ROCKCLIMBING$Rock climbing\r
-STR_EXTREME_BUNGEEJUMPING$Bungee Jumping\r
-STR_EXTREME_PARKOUR$Parkour\r
-STR_EXTREME_BMX$Bike motocross\r
-STR_EXTREME_ORIENTEERING$Orienteering\r
-STR_EXTREME_PARACHUTE$Parachute\r
-STR_EXTREME_RACING$Racing\r
-STR_EXTREME_TRIATHLONS$Triathlons\r
-STR_OTHER_ELEVATOR$Elevator\r
-STR_OTHER_ESCALATOR$Escalator\r
-STR_OTHER_GARDENING$Gardening\r
-STR_OTHER_HORSEWORK$House Work\r
-STR_OTHER_INVEHICLE$In Vehicle\r
-STR_OTHER_MEDITATION$Meditation\r
-STR_OTHER_STILL$Still\r
-STR_OTHER_TILTING$Tilting\r
-STR_OTHER_WHEELCHAIR$Wheelchair\r
-STR_HEART_RATE$Heart Rate\r
-STR_BLOOD_OXYGEN$Blood Oxygen\r
-STR_TRAINING$Training\r
-STR_TRAINING_RECORD$Training Record\r
-STR_COMPASS$Compass\r
-STR_TELEPHONE$Telephone\r
-STR_FAVORITE_CONTACTS$Favorite Contacts\r
-STR_WEATHER$Weather\r
-STR_ACTIVITY$Activity\r
-STR_WATCH_FACE$Watch Face\r
-STR_DISPLAY_MODE$Display Mode\r
-STR_CARD_MANAGEMENT$Card Management\r
-STR_MUSIC$Music\r
-STR_SLEEP$Sleep\r
-STR_RECORD$Record\r
-STR_BREATH_TRAINING$Breath Training\r
-STR_REMOTE_SHOOTING$Remote Shooting\r
-STR_VOICE_ASSISTANT$Voice Assistant\r
-STR_ALIPAY$Alipay\r
-STR_TIMER$Timer\r
-STR_ALARM$Alarm\r
-STR_STOPWATCH$Stopwatch\r
-STR_CALCULATOR$Calculator\r
-STR_FIND_PHONE$Find Phone\r
-STR_BRIGHTNESS_ADJUSTMENT$Brightness Adjustment\r
-STR_SOUND$Sound\r
-STR_BLUETOOTH$Bluetooth\r
-STR_DO_NOT_DISTURB$Do Not Disturb\r
-STR_MESSAGE_NOTIFICATION$Message Notification\r
-STR_POWER_SAVE_MODE$Power Save Mode\r
-STR_FLASHLIGHT$Flashlight\r
-STR_SETTINGS$Settings\r
-STR_EXERCISE_LIST$Exercise\r
-STR_BALL_LIST$Ball\r
-STR_WATER_LIST$Water\r
-STR_DANCING_LIST$Dance\r
-STR_EXTREME_LIST$Extreme\r
-STR_ICE_LIST$Ice\r
-STR_RECREATIONAL_LIST$Recreational\r
-STR_OTHER_LIST$Other\r
-STR_DANCING_TITLE$Dance Sport\r
-STR_BALL_LIST_TITLE$Ball Sport\r
-STR_OTHER_TITLE$Other Sport\r
-STR_EXERCISE_TITLE$Exercise Sport\r
-STR_RAPID_TRAINING$Rapid training\r
-STR_SET_GOALS$Set goals \r
-STR_DURATION$duration\r
-STR_DURATION_SETTING$Duration setting(Min)\r
-STR_CALORIE$calorie\r
-STR_CALORIE_SETTING$Calorie setting(Kcal)\r
-STR_DISTANCE$distance\r
-STR_RANGE_SETTING$Range setting(Km)\r
-STR_STEP_NUMBER$Step number\r
-STR_STEP_SETTING$Step setting(steps)\r
-STR_HEART_RATE_SETTING$Heart rate (times/min)\r
-STR_MEAN_HEART_RATE$Mean heart rate\r
-STR_TIMES_PER_MIN$Times/min\r
-STR_MEAN_HEART_RATE_MIN$Mean heart rate(Times/min)\r
-STR_LOWER_STRENGTH$Lower strength\r
-STR_MEDIUM_STRENGTH$Medium strength\r
-STR_HIGH_STRENGTH$High strength\r
-STR_ULTRA_HIGH_STRENGTH$Ultra-high strength\r
-STR_TRAINING_INTENSITY$Training intensity\r
-STR_TRAINING_IN_PROGRESS$Training in progress\r
-STR_BREAK_TRAINING$Break training\r
-STR_FINISH$finish\r
-STR_PAUSE$Pause\r
-STR_RESUME$Resume\r
-STR_GOAL_ACHIEVED$Goal achieved\r
-STR_ACCOMPLISH_GOAL$Accomplish the goal\r
-STR_OK$OK\r
-STR_LOOK_OUT$Look out\r
-STR_INSUFFICIENT_EXERCISE_AMOUNT$The current amount of exercise is too small to record\r
-STR_END_MOVEMENT$End movement\r
-STR_END_THIS_MOVEMENT$Whether to end this movement\r
-STR_GOAL_ACCOMPLISHMENT_DEGREE$Goal accomplishment degree\r
-STR_TRAINING_DURATION$Training duration\r
-STR_RANGE_MILE$Distance (m)\r
-STR_CLOSE$Close\r
-STR_MORE$More\r
-STR_MORE_APP$Check out the APP for more\r
-STR_SAVENOTE$Turning on power-saving mode turns off non-essential Bluetooth connections, as well as features such as sensor monitoring\r
-STR_SAVEBACK$Press and hold the screen for more than 3 seconds or charge to exit the power saving mode\r
-STR_SAVEASK$Enable or not\r
-STR_BLOOD$bloodoxygen \r
-STR_CHECK$detection\r
-STR_CHECKNEW$Just detected\r
-STR_CHECKTIME$Detected XX minutes ago\r
-STR_CHECKLONG$Detected over 1 hour ago\r
-STR_CHECKNO$No detection records available\r
-STR_CHECKNOTE$Wear it snugly and stay still\r
-STR_CHECKON$Detecting\r
-STR_CHECKSTOP$Stop detection\r
-STR_CHECKERROR$Unable to detect results\r
-STR_WAERKEEP$Please ensure the watch is worn and remain still\r
-STR_WEARRE$Perform a retest\r
-STR_WEARREADY$Click the button below when ready\r
-STR_RECHECK$Retest\r
-STR_CHECKEWARN$Blood Oxygen Alert\r
-STR_BLOODSHORT$Current blood oxygen level is below XX%\r
-STR_HEARTNOTE$Please take care of your health\r
-STR_KONW$Got it\r
-STR_EXPLAIN$Explanation\r
-STR_HEARTREST$Resting\r
-STR_HEARTDATA$Heart rate detection result\r
-STR_HEARTTITLE$Heart rate alert\r
-STR_HEARTMAX$Current heart rate is higher than XX\r
-STR_HEARTMIN$Current heart rate is lower than XX\r
-STR_TRAINGNO$no record\r
-STR_TRAINGGO$Go to training\r
-STR_MESSAGENO$No content currently\r
-STR_CLEAN$Clear\r
-STR_CLEANALL$Clear all\r
-STR_SLEEP_YESTERDAY$Last Night's Sleep\r
-STR_HOUR$Hours\r
-STR_MIN$MInutes\r
-STR_SLEEPMGOAL$Goal XX Hours\r
-STR_REATTIME$Schedule\r
-STR_SLEEPTIME$Bedtime\r
-STR_WALKTIME$Wake-up Time\r
-STR_APPMORE$For more details yesterday, please visit the mobile APP\r
-STR_DISTURB$The watch will enter Do Not Disturb mode in 20 minutes. To turn it off, please go to the Control Center.\r
-STR_DISTURBNOTE$Do Not Disturb mode is enabled, thus the watch won't vibrate or ring.\r
-STR_MORNNING$Good morning\r
-STR_NOW$Current\r
-STR_NAP$Nap (5 minutes)\r
-STR_TACK$Please open the app first, go to "Device" - "Camera"\r
-STR_CLICK$click on "Take a Photo\r
-STR_TACKNUM$Number of photos taken: XX\r
-STR_SCREEN_AND_BRIGHTNESS$Screen and Brightness\r
-STR_NETWORKANDCALL$NetworkAndCall\r
-STR_SOUND_AND_VIBRATION$Sound and Vibration\r
-STR_MOTION_RECOGNITION$Motion Recognition\r
-STR_SYSTEM$System \r
-STR_SHUTDOWN_AND_RESTART$Shutdown and Restart\r
-STR_SCREEN_ON_DURATION$Screen On Duration\r
-STR_RAISE_TO_WAKE$Raise to Wake\r
-STR_5_SECONDS$5 s\r
-STR_10_SECONDS$10 s\r
-STR_15_SECONDS$15 s\r
-STR_30_SECONDS$30 s\r
-STR_60_SECONDS$60 s\r
-STR_300_SECONDS$300 s\r
-STR_4G_CAPABILITY$4G capability\r
-STR_VOLTE_CALL$VoLTE call\r
-STR_MOBILE_DATA_OPTION$Mobile data option\r
-STR_SYSTEM_UPDATE$System Update\r
-STR_ONLINE_MUSIC$Online music\r
-STR_BLUETOOTH_HEADPHONES$Bluetooth Headphones\r
-STR_TRADITIONAL_BLUETOOTH$Traditional Bluetooth\r
-STR_AUTO_OFF_BLUETOOTH_NOTE$Note: It will be automatically turned off if the connection is not successful for 10 minutes after opening, because the traditional Bluetooth will increase the power consumption for a long time, it is recommended to use when necessary(this function is mainly used for phone calls/notifications、music control/transmission, etc.)\r
-STR_BLUETOOTH_SERVICE_OPTIONS$Bluetooth Service Options\r
-STR_HFP$HFP\r
-STR_A2DP$A2DP\r
-STR_SYSTEM_VOLUME$System Volume\r
-STR_MEDIA_VOLUME$Media Volume\r
-STR_CALL_VOLUME$Call Volume\r
-STR_VIBRATION_MODE$Vibration Mode\r
-STR_SILENT_MODE$Silent Mode\r
-STR_LIST_DISPLAY$List display\r
-STR_GRID_DISPLAY$Grid Display\r
-STR_CELLULAR_DISPLAY$Cellular Display\r
-STR_AUTO_DETECT$Auto Detect\r
-STR_ABOUT_WATCH$About Watch\r
-STR_WATCH_QR_CODE$watch QR code\r
-STR_SYSTEM_LANGUAGE$System Language\r
-STR_RESTART$Restart\r
-STR_SHUTDOWN$Shutdown\r
-STR_FACTORY_RESET$Factory Reset\r
-STR_WATCH_NAME$Watch Name\r
-STR_FIRMWARE_VERSION$Firmware Version \r
-STR_BLUETOOTH_NAME$Bluetooth Name\r
-STR_BLUETOOTH_ADDRESS$Bluetooth Address \r
-STR_UPDATENOW$Update Now\r
-STR_LATEST_VERSION$Latest version\r
-STR_LATER$Later\r
-STR_UP_TO_DATE$The system has been upgraded to the latest version\r
-STR_NO_UPDATE$No update\r
-STR_LANGUAGE_SELECTION$Language Select \r
-STR_RESET_CONFIRM$Are you sure to restart?\r
-STR_SHUTDOWN_CONFIRM$Are you sure to shut down?\r
-STR_RESET_CONFIRM_NOTE$The operation will clear and reset the watch data. Are you sure you want to continue?\r
-STR_RECORDER$Recorder\r
-STR_CLICK_TO_RECORD$Click to record\r
-STR_RECORDING$Recording\r
-STR_AUDIO_XX$Audio_XX\r
-STR_VOICE_RECORDING_REMINDER$Voice recording reminder\r
-STR_VOICE_RECORDING_REMINDER_NOTE$The number of recordings must not exceed 30. Please delete some existing recordings.\r
-STR_DELETE_RECORDING$Delete recording\r
-STR_DELETE_PERMANENTLY$Permanently Delete\r
-STR_RECORDING_LIST$Recording List\r
-STR_CRLEMPTY$Current recording list is empty.\r
-STR_DO_NOT_DISTURB_MODE$Turn on Do Not Disturb mode, the watch will not vibrate or ring, do you want to turn it on?\r
-STR_CONNECTION_STATUS$Connection Status\r
-STR_PHONE$Phone\r
-STR_HEADSET$Headset\r
-STR_CONNECTED$Connected\r
-STR_DISCONNECTED$Disconnected\r
-STR_PHONE_RINGING_VIBRATING$The mobile phone is ringing/vibrating\r
-STR_BLUETOOTH_DISCONNECTED$Bluetooth not connected\r
-STR_STOP$Stop\r
-STR_WORKDAY$WorkDay\r
-STR_REPEAT_NO$no-repeat\r
-STR_EVERYDAY$Everyday\r
-STR_ADD_A_NEW_ALARM$Add a new alarm\r
-STR_TIME$Time\r
-STR_NEXT_STEP$Next Step\r
-STR_MON$Mon\r
-STR_TUES$Tue\r
-STR_WEDNES$Wed\r
-STR_THURS$Thu\r
-STR_FRI$Fri\r
-STR_SATUR$Sat\r
-STR_SUN$Sun\r
-STR_MONDAY$Monday\r
-STR_TUESDAY$Tuesday\r
-STR_WEDNESDAY$Wednesday\r
-STR_THURSDAY$Thursday\r
-STR_FRIDAY$Friday\r
-STR_SATURDAY$Saturday\r
-STR_SUNDAY$Sunday\r
-STR_CALIBRATE_COMPASS$Calibration compass\r
-STR_CALIBRATE_COMPASS_NOTE$Please stay away from interference sources and follow the instructions Rotate the watch to calibrate\r
-STR_EAST$E\r
-STR_SOUTH$S\r
-STR_WEST$W\r
-STR_NORTH$N\r
-STR_SOUTHEAST$SE\r
-STR_SOUTHWEST$SW\r
-STR_NORTHEAST$NE\r
-STR_NORTHWEST$NW\r
-STR_KEEP_STILL_FOCUS_ON_BREATHING$Keep Still Focus on Breathing\r
-STR_EXHALE_NOW$Exhale now\r
-STR_INHALE_NOW$Inhale now\r
-STR_TRAINING_COMPLETE$Training Complete\r
-STR_THIS_BREATH$This breath\r
-STR_TODAYS_BREATHING_TRAINING$Today's Breathing Training\r
-STR_RECENT_CALLS$Recent Calls\r
-STR_NO_CALLS$No Calls\r
-STR_MISSED_CALLS$Missed Calls\r
-STR_DIALED_CALLS$Dialed Calls\r
-STR_RECEIVED_CALLS$Received Calls\r
-STR_NOTE_RECENT_CALLS_LIMITATION$Note: Only the last 20 calls are saved\r
-STR_NO_CONTACTS_ADDED$No contacts added, please set up in APP\r
-STR_DIAL_MODE$Dial Mode\r
-STR_DIAL_VIA_WATCH_SIM$Dial via Watch SIM\r
-STR_DIAL_VIA_PHONE$Dial via Phone\r
-STR_KUMI_TECHNOLOGY$KUMI Technology\r
-STR_CALLING$Calling\r
-STR_NOT_PAIRED$Not Paired\r
-STR_PAIRED$Paired\r
-STR_UNPAIR$Unpair\r
-STR_CONNECTION_ERROR$Connection Error\r
-STR_INSERT_WATCH_SIM_OR_CONNECT_PHONE$Insert watch SIM or connect phone to make calls\r
-STR_ENABLE_BLUETOOTH_CALL$Enable Bluetooth Call\r
-STR_ENABLE_BLUETOOTH_CALL_NOTE_IPHONE$The solution:1. IPhone Please go to the phone "Settings" → "Bluetooth" list to find “KUMI_XX” Click and try again \r
-STR_ENABLE_BLUETOOTH_CALL_NOTE_ANDRODIR$2. Android phones Please go to the phone "Settings" → "Bluetooth" list to find “KUMI_XX” \r
-STR_ENABLE_BLUETOOTH_CALL_NOTE$Click the icon on the right to enter Bluetooth Settings Enable the call and media functions and try again\r
-STR_SIM_CARD_ERROR$SIM Card Error\r
-STR_CHECK_SIM_CARD_INSERTION$Check if the watch’s SIM card is properly inserted\r
-STR_WEATHER_REPORT$Weather report\r
-STR_ULTRAVIOLET$Ultraviolet\r
-STR_WIND_SPEED$WindSpeed\r
-STR_HUMIDITY$Humidity\r
-STR_NEXT_7_DAYS$Next 7 Days\r
-STR_GET_WEATHER_ERROR$No weather information was obtained Please go to APP Update\r
-STR_MUSIC_SOURCE$Music source\r
-STR_MOBILE_MUSIC$Mobile music\r
-STR_WATCH_MUSIC$Watch music\r
-STR_MUSIC_LIST$Music list\r
-STR_BLUETOOTH_CONNECTION_FAILED$Bluetooth connection failed\r
-STR_SCANNING_BINDING$Scanning binding\r
-STR_DEVICE_BINDING$Device binding\r
-STR_DEVICE_BINDING_NOTE$XX wants to connect and bind with you\r
-STR_EQUIPMENT_UNTYING$Equipment untying\r
-STR_EQUIPMENT_UNTYING_NOTE$XX would like to unbind you\r
-STR_DRINK_WATER_REMINDER$Drink water reminder\r
-STR_DRINK_WATER_REMINDER_NOTE$Time for some water! And stay hydrated\r
-STR_SEDENTARY_REMINDER$Sedentary reminder\r
-STR_SEDENTARY_REMINDER_NOTE$You haven't moved for XX hours. Get up and move.\r
-STR_SYSTEM_UPGRADING$System upgrading\r
-STR_NEWDEVICE_BIND_REMIND_NOTE$The device has been bound to XX. If you continue to connect the device, the device will be unbound and the watch will be restored to factory Settings (the watch data will be cleared).\r
-STR_AI_VOICE$AI Voice\r
-STR_AI_INTELLIGENT_ASSISTANT$AI Intelligent Assistant\r
-STR_START_CHAT$Start Chat\r
-STR_BOOT_FAILED$Boot Failed\r
-STR_ENABLE_MOBILE_DATA_FIRST$Please enable mobile data first\r
-STR_ENABLE_BLUETOOTH_FIRST$Please enable Bluetooth first\r
-STR_LISTENING$Listening\r
-STR_FINISH_SPEAKING$Finish Speaking\r
-STR_THINKING$Thinking\r
-STR_CANCEL$Cancel\r
-STR_CONNECT_TIMEOUT$Connection Timeout\r
-STR_PLEASE_RESTART_CHAT$Please restart the conversation\r
-STR_CONTINUE_CHAT$Continue the conversation\r
-STR_AIMODELS_DOUBAO$Cici\r
-STR_AIMODES_WENXINYIYAN$ERNIE Bot\r
-STR_AIMODES_KIMI$KIMI\r
-STR_AIMODES_CHATGPT$ChatGPT\r
-STR_SLIDE_TO_SHUTDOWN$Slide to shutdown >>\r
-STR_SLIDE_TO_REBOOT$Slide to reboot >>\r
-STR_AI_FAMILY_MEALS$AI Family Meals\r
-STR_CHAT$Chat\r
-STR_PCY4GC_OR_AS$Please check your 4G connection or APP Settings\r
-STR_API_KEYS$API keys\r
-STR_PGTTAF$Please go to the APP first\r
-STR_DAFBS$Device" - "AI Family Bucket" setting\r
-STR_OPENAI_API_KEYS$OpenAI API keys\r
-STR_KHBB$API keys have been bound\r
-STR_GTAS$Please go to APP Settings\r
-STR_DYWTDAK$Do you want to delete API keys\r
-STR_CONNECTING$Connecting\r
-STR_CONNECTION_FAIL$Connection fail\r
-STR_PTALORTM$Please try again later or replace the model\r
-STR_MOTION_DETECTION_NOTE$It seems that you are performing XX movement, whether to start recording\r
-STR_PE4GC$Please enable 4G capability\r
-STR_OBU_MESSAGE$OBU\r
-STR_DELETE$Delete
\ No newline at end of file
+++ /dev/null
-STR_EXERCISE_OUTDOORWALKING$室外走路\r
-STR_EXERCISE_OUTDOORRUNNING$室外跑步\r
-STR_EXERCISE_OUTDOORBIKING$室外骑行\r
-STR_EXERCISE_GENERAL$一般锻炼\r
-STR_EXERCISE_FREETRAINING$自由训练\r
-STR_EXERCISE_RESISTANCETRAINING$肌力训练\r
-STR_EXERCISE_SPINBIKE$飞轮车/室内健身车\r
-STR_EXERCISE_TREADMILL$踏步机\r
-STR_EXERCISE_STROLLMACHINE$漫步机\r
-STR_EXERCISE_HIIT$HIIT/高强度间歇训练\r
-STR_EXERCISE_CROSSFIT$健身\r
-STR_EXERCISE_GROUPCALISTHENICS$团体操\r
-STR_EXERCISE_YOGA$瑜珈\r
-STR_EXERCISE_YOGACAT$瑜珈猫式\r
-STR_EXERCISE_YOGACOW$瑜珈牛式\r
-STR_EXERCISE_YOGACOBRA$瑜珈眼镜蛇式\r
-STR_EXERCISE_YOGAHERO1$瑜珈英雄式1\r
-STR_EXERCISE_YOGAHERO2$瑜珈英雄式2\r
-STR_EXERCISE_YOGAHERO3$瑜珈英雄式3\r
-STR_EXERCISE_YOGAROLLING$瑜珈滚轮\r
-STR_EXERCISE_INDOORWALKING$室内走路\r
-STR_EXERCISE_INDOORRUNNING$室内跑步\r
-STR_EXERCISE_JUMPINGROPE$跳绳\r
-STR_EXERCISE_PILATES$皮拉提斯\r
-STR_EXERCISE_CROSS_FIT$混合健身\r
-STR_EXERCISE_FUNCTIONALTRAINING$功能性训练\r
-STR_EXERCISE_PHYSICALTRAINING$体能训练\r
-STR_EXERCISE_TAEKWONDO$跆拳道/踢拳\r
-STR_EXERCISE_BOXING$拳击\r
-STR_EXERCISE_KICKBOXING$自由搏击\r
-STR_EXERCISE_KARATE$空手道\r
-STR_EXERCISE_FENCING$击剑\r
-STR_EXERCISE_CORETRAINING$核心训练\r
-STR_EXERCISE_BODYCOMBAT$拳击有氧\r
-STR_EXERCISE_KENDO$剑道\r
-STR_EXERCISE_HORIZONTALBAR$单杠\r
-STR_EXERCISE_PARALLELBARS$双杠\r
-STR_EXERCISE_CIRCUIT$循环训练\r
-STR_EXERCISE_AEROBICS$有氧运动\r
-STR_EXERCISE_CALISTHENICE$健美操\r
-STR_EXERCISE_P90X$P90X\r
-STR_EXERCISE_KETTLEBELLTRAINING$壶铃训练\r
-STR_EXERCISE_MIXEDMARTIALARTS$综合格斗\r
-STR_EXERCISE_STAIRCLIMBINGMACHINE$爬楼梯机\r
-STR_EXERCISE_WEIGHTLIFTING$举重\r
-STR_EXERCISE_BARRE$Barre\r
-STR_EXERCISE_HANDCYCLING$手轮\r
-STR_EXERCISE_TRACKFIELD$田径\r
-STR_EXERCISE_WRESTLING$角力\r
-STR_EXERCISE_MINDBODY$身心运动\r
-STR_EXERCISE_FLEXIBILITY$柔软操\r
-STR_EXERCISE_MIXEDCARDIO$混和有氧\r
-STR_EXERCISE_TRADITIONALSTRENGTHTRAINING$传统肌力训练\r
-STR_EXERCISE_CROSSTRAINING$交叉训练\r
-STR_EXERCISE_GYMNASTICS$体操\r
-STR_EXERCISE_STEPTRAINING$阶梯训练\r
-STR_EXERCISE_ELLIPTICALTRAINER$椭圆机\r
-STR_EXERCISE_ROWINGMACHINE$划船机\r
-STR_DANCING_GENERAL$一般舞蹈\r
-STR_DANCING_BELLY$肚皮舞\r
-STR_DANCING_JAZZ$爵士舞\r
-STR_DANCING_LATIN$拉丁舞\r
-STR_DANCING_BALLET$芭蕾\r
-STR_DANCING_STREET$街舞\r
-STR_DANCING_PUBLICSQUARE$广场舞\r
-STR_DANCING_ZUMBA$尊巴\r
-STR_DANCING_SOCIALDANCE$社交舞\r
-STR_DANCING_TAPDANCE$踢踏舞\r
-STR_RECREATIONAL_SPORTS$一般休闲运动\r
-STR_RECREATIONAL_SKATING$滑轮溜冰\r
-STR_RECREATIONAL_MARTIALARTS$武术\r
-STR_RECREATIONAL_TAICHI$太极拳\r
-STR_RECREATIONAL_HULAHOOP$呼拉圈\r
-STR_RECREATIONAL_DISCSPORT$飞盘\r
-STR_RECREATIONAL_DARTS$飞镖\r
-STR_RECREATIONAL_ARCHERY$射箭\r
-STR_RECREATIONAL_HORSERIDING$骑马\r
-STR_RECREATIONAL_BATTLEGAME$对战游戏\r
-STR_RECREATIONAL_KITE$放风筝\r
-STR_RECREATIONAL_TUGOFWAR$拔河\r
-STR_RECREATIONAL_SWING$鞦韆\r
-STR_RECREATIONAL_STAIRCLIMBING$爬楼梯\r
-STR_RECREATIONAL_OBSTACLERACE$障碍赛\r
-STR_RECREATIONAL_FISHING$钓鱼\r
-STR_RECREATIONAL_HUNTING$打猎\r
-STR_RECREATIONAL_SCOOTERRIDING$滑板车\r
-STR_RECREATIONAL_PARAGLIDING$滑翔伞\r
-STR_RECREATIONAL_TEAMSPORTS$团队竞技\r
-STR_RECREATIONAL_FINESSGAMING$健身电玩\r
-STR_RECREATIONAL_HIKING$健行\r
-STR_RECREATIONAL_EQUESTRIANSPORTS$马术运动\r
-STR_RECREATIONAL_PLAY$玩乐\r
-STR_BALL_GAMES$一般球类运动\r
-STR_BALL_BADMINTON$羽毛球\r
-STR_BALL_TABLETENNIS$乒乓球\r
-STR_BALL_TENNIS$网球\r
-STR_BALL_BILLIARDS$撞球\r
-STR_BALL_BOWLING$保龄球\r
-STR_BALL_VOLLEYBALL$排球\r
-STR_BALL_SHUTTLECOCK$毽子球\r
-STR_BALL_HANDBALL$手球\r
-STR_BALL_BASEBALL$棒球\r
-STR_BALL_SOFTBALL$垒球\r
-STR_BALL_CRICKET$板球\r
-STR_BALL_FOOTBALL$美式橄榄球\r
-STR_BALL_BEACHSOCCER$沙滩足球\r
-STR_BALL_BEACHVOLLEYBALL$沙滩排球\r
-STR_BALL_CROQUET$槌球\r
-STR_BALL_HOCKEY$曲棍球\r
-STR_BALL_SQUASH$英式壁球\r
-STR_BALL_SEPAKTAKRAW$藤球\r
-STR_BALL_DODGEBALL$躲避球\r
-STR_BALL_BASKETBALL$篮球\r
-STR_BALL_SOCCER$足球\r
-STR_BALL_GOLF$高尔夫球\r
-STR_BALL_POLO$马球\r
-STR_BALL_RACQUETBALL$美式壁球\r
-STR_BALL_RUGBY$英式橄榄球\r
-STR_BALL_GATEBALL$门球\r
-STR_BALL_PICKLEBALL$匹克球\r
-STR_BALL_LACROSSE$袋棍球\r
-STR_WATER_ACTIVITIES$一般水上活动\r
-STR_WATER_SAILING$帆船\r
-STR_WATER_SURFING$冲浪\r
-STR_WATER_WHITEWATERRAFTING$泛舟\r
-STR_WATER_CANOEING$划龙舟\r
-STR_WATER_KAYAKING$轻艇\r
-STR_WATER_ROWING$赛艇\r
-STR_WATER_MOTORBOAT$水上摩托车\r
-STR_WATER_SUP$立桨冲浪\r
-STR_WATER_SCUBADIVING$潜水\r
-STR_WATER_DIVING$跳水\r
-STR_WATER_KITESURFING$滑翔伞冲浪\r
-STR_WATER_WAKEBOARDING$冲浪滑水\r
-STR_WATER_POLO$水球\r
-STR_WATER_WINDSURFING$风帆冲浪\r
-STR_WATER_DRIFTING$漂流活动\r
-STR_WATER_FITNESS$水中健身\r
-STR_WATER_SPORTS$水上运动\r
-STR_WATER_OUTDOORSWIM$户外游泳\r
-STR_WATER_INDOORSWIM$室内游泳\r
-STR_WATER_SWIMFREESTYLE$游泳_自由式\r
-STR_WATER_SWIMBREASTSTROKE$游泳_蛙式\r
-STR_WATER_SWIMBACKSTROKE$游泳_仰式\r
-STR_WATER_SWIMBUTTERFLY$游泳_蝶式\r
-STR_ICE_SPORTS$一般冰上运动\r
-STR_ICE_SKATING$溜冰\r
-STR_ICE_HOCKEY$冰球\r
-STR_ICE_CURLING$冰石壶/冰壶\r
-STR_ICE_SNOWMOBILING$雪上摩托车\r
-STR_ICE_SLED$雪橇\r
-STR_ICE_BIATHLON$冬季两项\r
-STR_ICE_CROSSCOUNTRYSKING$越野滑雪\r
-STR_ICE_SKIING$滑雪\r
-STR_ICE_SNOWBOARDING$单板滑雪/滑雪板\r
-STR_ICE_SNOWSHOEING$雪鞋健行\r
-STR_ICE_SNOWSPORTS$雪地运动\r
-STR_EXTREME_SPORTS$一般极限运动\r
-STR_EXTREME_SKATEBOARDING$滑板\r
-STR_EXTREME_ROCKCLIMBING$攀岩\r
-STR_EXTREME_BUNGEEJUMPING$高空弹跳/蹦极活动\r
-STR_EXTREME_PARKOUR$跑酷\r
-STR_EXTREME_BMX$BMX\r
-STR_EXTREME_ORIENTEERING$定向越野\r
-STR_EXTREME_PARACHUTE$跳伞\r
-STR_EXTREME_RACING$赛车\r
-STR_EXTREME_TRIATHLONS$铁人三项运动\r
-STR_OTHER_ELEVATOR$乘电梯\r
-STR_OTHER_ESCALATOR$乘手扶梯\r
-STR_OTHER_GARDENING$做园艺\r
-STR_OTHER_HORSEWORK$做家务\r
-STR_OTHER_INVEHICLE$在车里\r
-STR_OTHER_MEDITATION$冥想\r
-STR_OTHER_STILL$静止\r
-STR_OTHER_TILTING$倾斜\r
-STR_OTHER_WHEELCHAIR$坐轮椅移动\r
-STR_HEART_RATE$心率\r
-STR_BLOOD_OXYGEN$血氧\r
-STR_TRAINING$训练\r
-STR_TRAINING_RECORD$训练记录\r
-STR_COMPASS$指南针\r
-STR_TELEPHONE$电话\r
-STR_FAVORITE_CONTACTS$常用联系人\r
-STR_WEATHER$天气\r
-STR_ACTIVITY$活动\r
-STR_WATCH_FACE$更换表盘\r
-STR_DISPLAY_MODE$显示方式\r
-STR_CARD_MANAGEMENT$卡片管理\r
-STR_MUSIC$音乐\r
-STR_SLEEP$睡眠\r
-STR_RECORD$录音\r
-STR_BREATH_TRAINING$呼吸训练\r
-STR_REMOTE_SHOOTING$遥控拍照\r
-STR_VOICE_ASSISTANT$语音助手\r
-STR_ALIPAY$支付宝\r
-STR_TIMER$计时器\r
-STR_ALARM$闹钟\r
-STR_STOPWATCH$秒表\r
-STR_CALCULATOR$计算器\r
-STR_FIND_PHONE$查找手机\r
-STR_BRIGHTNESS_ADJUSTMENT$亮度调节\r
-STR_SOUND$声音\r
-STR_BLUETOOTH$蓝牙\r
-STR_DO_NOT_DISTURB$勿扰模式\r
-STR_MESSAGE_NOTIFICATION$消息通知\r
-STR_POWER_SAVE_MODE$省电模式\r
-STR_FLASHLIGHT$手电筒\r
-STR_SETTINGS$设置\r
-STR_EXERCISE_LIST$健身类\r
-STR_BALL_LIST$球类\r
-STR_WATER_LIST$水上运动\r
-STR_DANCING_LIST$舞蹈类\r
-STR_EXTREME_LIST$极限运动\r
-STR_ICE_LIST$冰上运动\r
-STR_RECREATIONAL_LIST$休闲运动\r
-STR_OTHER_LIST$其他\r
-STR_DANCING_TITLE$舞蹈运动\r
-STR_BALL_LIST_TITLE$球类运动\r
-STR_OTHER_TITLE$其他运动\r
-STR_EXERCISE_TITLE$健身运动\r
-STR_RAPID_TRAINING$快速训练\r
-STR_SET_GOALS$设置目标 \r
-STR_DURATION$时长\r
-STR_DURATION_SETTING$时长(分钟)\r
-STR_CALORIE$卡路里\r
-STR_CALORIE_SETTING$卡路里(千卡)\r
-STR_DISTANCE$距离\r
-STR_RANGE_SETTING$距离(公里)\r
-STR_STEP_NUMBER$步数\r
-STR_STEP_SETTING$步数(步)\r
-STR_HEART_RATE_SETTING$心率(次/分)\r
-STR_MEAN_HEART_RATE$平均心率\r
-STR_TIMES_PER_MIN$次/分\r
-STR_MEAN_HEART_RATE_MIN$平均心率(次/分)\r
-STR_LOWER_STRENGTH$较低强度\r
-STR_MEDIUM_STRENGTH$中等强度\r
-STR_HIGH_STRENGTH$高等强度\r
-STR_ULTRA_HIGH_STRENGTH$超大强度\r
-STR_TRAINING_INTENSITY$训练强度\r
-STR_TRAINING_IN_PROGRESS$训练中\r
-STR_BREAK_TRAINING$暂停训练\r
-STR_FINISH$结束\r
-STR_PAUSE$暂停\r
-STR_RESUME$继续\r
-STR_GOAL_ACHIEVED$目标已达成\r
-STR_ACCOMPLISH_GOAL$完成目标\r
-STR_OK$确定\r
-STR_LOOK_OUT$注意\r
-STR_INSUFFICIENT_EXERCISE_AMOUNT$当前运动量太小,无法记录\r
-STR_END_MOVEMENT$结束运动\r
-STR_END_THIS_MOVEMENT$是否结束本次运动\r
-STR_GOAL_ACCOMPLISHMENT_DEGREE$目标完成度\r
-STR_TRAINING_DURATION$训练时长\r
-STR_RANGE_MILE$距离(米)\r
-STR_CLOSE$关闭\r
-STR_MORE$更多\r
-STR_MORE_APP$更多前往APP查看\r
-STR_SAVENOTE$开启省电模式会关闭非必要的蓝牙连接,以及传感器监测等功能\r
-STR_SAVEBACK$长按屏幕3秒以上或充电可退出省电模式\r
-STR_SAVEASK$是否开启\r
-STR_BLOOD$血氧饱和度\r
-STR_CHECK$检测\r
-STR_CHECKNEW$刚刚检测\r
-STR_CHECKTIME$XX分钟前检测\r
-STR_CHECKLONG$超过1个小时前检测\r
-STR_CHECKNO$暂无检测记录\r
-STR_CHECKNOTE$偏紧佩戴,保持静止\r
-STR_CHECKON$正在检测\r
-STR_CHECKSTOP$停止检测\r
-STR_CHECKERROR$检测不到结果\r
-STR_WAERKEEP$请确认已带上手表,并保持静止\r
-STR_WEARRE$进行重新检测\r
-STR_WEARREADY$准备好后点击下方按钮\r
-STR_RECHECK$重新检测\r
-STR_CHECKEWARN$血氧提醒\r
-STR_BLOODSHORT$当前血氧含量已低于XX%\r
-STR_HEARTNOTE$请注意身体健康\r
-STR_KONW$知道了\r
-STR_EXPLAIN$说明\r
-STR_HEARTREST$静息 \r
-STR_HEARTDATA$心率检测结果\r
-STR_HEARTTITLE$心率提醒\r
-STR_HEARTMAX$当前心率值高于XX\r
-STR_HEARTMIN$当前心率值低于XX\r
-STR_TRAINGNO$无记录\r
-STR_TRAINGGO$去训练\r
-STR_MESSAGENO$暂无内容\r
-STR_CLEAN$清除\r
-STR_CLEANALL$全部清除\r
-STR_SLEEP_YESTERDAY$昨日睡眠\r
-STR_HOUR$小时\r
-STR_MIN$分钟\r
-STR_SLEEPMGOAL$目标XX小时\r
-STR_REATTIME$作息时间\r
-STR_SLEEPTIME$入睡时间\r
-STR_WALKTIME$醒来时间\r
-STR_APPMORE$更多详情请前往手机APP查看\r
-STR_DISTURB$手表将在20分钟后开启勿扰模式,关闭请到控制中心\r
-STR_DISTURBNOTE$已开启勿扰模式,此模式下手表将不会发出震动与铃声\r
-STR_MORNNING$早安\r
-STR_NOW$当前\r
-STR_NAP$小睡(5分钟)\r
-STR_TACK$请先打开app,进入“设备”-“拍照”\r
-STR_CLICK$点击拍照\r
-STR_TACKNUM$已拍摄XX张\r
-STR_SCREEN_AND_BRIGHTNESS$屏幕与亮度\r
-STR_NETWORKANDCALL$网络与通话\r
-STR_SOUND_AND_VIBRATION$声音与震动\r
-STR_MOTION_RECOGNITION$运动识别\r
-STR_SYSTEM$系统\r
-STR_SHUTDOWN_AND_RESTART$关机和重启\r
-STR_SCREEN_ON_DURATION$亮屏时长\r
-STR_RAISE_TO_WAKE$抬腕亮屏\r
-STR_5_SECONDS$5秒\r
-STR_10_SECONDS$10秒\r
-STR_15_SECONDS$15秒\r
-STR_30_SECONDS$30秒\r
-STR_60_SECONDS$60秒\r
-STR_300_SECONDS$300秒\r
-STR_4G_CAPABILITY$4G能力\r
-STR_VOLTE_CALL$VoLTE 通话\r
-STR_MOBILE_DATA_OPTION$移动数据选项\r
-STR_SYSTEM_UPDATE$系统更新\r
-STR_ONLINE_MUSIC$在线音乐\r
-STR_BLUETOOTH_HEADPHONES$蓝牙耳机\r
-STR_TRADITIONAL_BLUETOOTH$传统蓝牙\r
-STR_AUTO_OFF_BLUETOOTH_NOTE$注:开启后10分钟没连接成功会自动关闭,因为传统蓝牙长时间打开会增加电耗,建议在有需要的时候使用(该功能主要用于电话拨打/通知、音乐控制/传输等)\r
-STR_BLUETOOTH_SERVICE_OPTIONS$蓝牙服务选项\r
-STR_HFP$通话蓝牙\r
-STR_A2DP$媒体蓝牙\r
-STR_SYSTEM_VOLUME$系统音量\r
-STR_MEDIA_VOLUME$媒体音量\r
-STR_CALL_VOLUME$通话音量\r
-STR_VIBRATION_MODE$震动模式\r
-STR_SILENT_MODE$静音模式\r
-STR_LIST_DISPLAY$列表显示\r
-STR_GRID_DISPLAY$网格显示\r
-STR_CELLULAR_DISPLAY$蜂窝显示\r
-STR_AUTO_DETECT$自动识别\r
-STR_ABOUT_WATCH$关于手表\r
-STR_WATCH_QR_CODE$手表二维码\r
-STR_SYSTEM_LANGUAGE$系统语言\r
-STR_RESTART$重启\r
-STR_SHUTDOWN$关机\r
-STR_FACTORY_RESET$恢复出厂\r
-STR_WATCH_NAME$手表名称\r
-STR_FIRMWARE_VERSION$固件版本\r
-STR_BLUETOOTH_NAME$蓝牙名称\r
-STR_BLUETOOTH_ADDRESS$蓝牙地址\r
-STR_UPDATENOW$立即更新\r
-STR_LATEST_VERSION$最新版本\r
-STR_LATER$稍后再说\r
-STR_UP_TO_DATE$当前已升级到最新版本\r
-STR_NO_UPDATE$暂无更新\r
-STR_LANGUAGE_SELECTION$语言选择\r
-STR_RESET_CONFIRM$是否确定重新启动?\r
-STR_SHUTDOWN_CONFIRM$是否确定关机?\r
-STR_RESET_CONFIRM_NOTE$该操作会清空并重置手表数据,是否确认继续?\r
-STR_RECORDER$录音机\r
-STR_CLICK_TO_RECORD$点击开始录音\r
-STR_RECORDING$录音中\r
-STR_AUDIO_XX$录音XX\r
-STR_VOICE_RECORDING_REMINDER$录音提醒\r
-STR_VOICE_RECORDING_REMINDER_NOTE$录音数量不得超过30首,请删除已有录音\r
-STR_DELETE_RECORDING$删除录音\r
-STR_DELETE_PERMANENTLY$是否永久删除\r
-STR_RECORDING_LIST$录音列表\r
-STR_CRLEMPTY$当前录音列表为空\r
-STR_DO_NOT_DISTURB_MODE$开启勿扰模式,手表将不会发出震动与铃声,是否开启\r
-STR_CONNECTION_STATUS$连接状态\r
-STR_PHONE$手机\r
-STR_HEADSET$耳机\r
-STR_CONNECTED$已连接\r
-STR_DISCONNECTED$未连接\r
-STR_PHONE_RINGING_VIBRATING$手机正在响铃/震动\r
-STR_BLUETOOTH_DISCONNECTED$蓝牙未连接\r
-STR_STOP$停止\r
-STR_WORKDAY$工作日\r
-STR_REPEAT_NO$不重复\r
-STR_EVERYDAY$每日\r
-STR_ADD_A_NEW_ALARM$添加新闹钟\r
-STR_TIME$时间\r
-STR_NEXT_STEP$下一步\r
-STR_MON$一\r
-STR_TUES$二\r
-STR_WEDNES$三\r
-STR_THURS$四\r
-STR_FRI$五\r
-STR_SATUR$六\r
-STR_SUN$日\r
-STR_MONDAY$星期一\r
-STR_TUESDAY$星期二\r
-STR_WEDNESDAY$星期三\r
-STR_THURSDAY$星期四\r
-STR_FRIDAY$星期五\r
-STR_SATURDAY$星期六\r
-STR_SUNDAY$星期日\r
-STR_CALIBRATE_COMPASS$校准指南针\r
-STR_CALIBRATE_COMPASS_NOTE$请远离干扰源,按图示旋转手表进行校准\r
-STR_EAST$东\r
-STR_SOUTH$南\r
-STR_WEST$西\r
-STR_NORTH$北\r
-STR_SOUTHEAST$东南\r
-STR_SOUTHWEST$西南\r
-STR_NORTHEAST$东北\r
-STR_NORTHWEST$西北\r
-STR_KEEP_STILL_FOCUS_ON_BREATHING$保持不动,将注意力集中在呼吸上\r
-STR_EXHALE_NOW$现在呼气\r
-STR_INHALE_NOW$现在吸气\r
-STR_TRAINING_COMPLETE$训练完成\r
-STR_THIS_BREATH$本次呼吸\r
-STR_TODAYS_BREATHING_TRAINING$今日呼吸训练\r
-STR_RECENT_CALLS$最近通话\r
-STR_NO_CALLS$暂无通话\r
-STR_MISSED_CALLS$未接来电\r
-STR_DIALED_CALLS$拨出电话\r
-STR_RECEIVED_CALLS$拨入电话\r
-STR_NOTE_RECENT_CALLS_LIMITATION$注:只保留最近20条通话记录\r
-STR_NO_CONTACTS_ADDED$尚未添加联系人,请前往APP进行设置\r
-STR_DIAL_MODE$拨号方式\r
-STR_DIAL_VIA_WATCH_SIM$通过手表SIM卡拨号\r
-STR_DIAL_VIA_PHONE$通过手机拨号\r
-STR_KUMI_TECHNOLOGY$库密科技\r
-STR_CALLING$拨号中\r
-STR_NOT_PAIRED$未配对\r
-STR_PAIRED$已配对\r
-STR_UNPAIR$取消配对\r
-STR_CONNECTION_ERROR$连接异常\r
-STR_INSERT_WATCH_SIM_OR_CONNECT_PHONE$请插入手表SIM卡或连接手机并确认开启蓝牙通话后再进行拨号\r
-STR_ENABLE_BLUETOOTH_CALL$开启蓝牙通话\r
-STR_ENABLE_BLUETOOTH_CALL_NOTE_IPHONE$解决方法:1.苹果手机 请前往手机“设置”→“蓝牙”列表找到“KUMI_XX”并点击后重试\r
-STR_ENABLE_BLUETOOTH_CALL_NOTE_ANDRODIR$2.安卓手机 请前往手机“设置”→“蓝牙”列表找到 “KUMI_XX”\r
-STR_ENABLE_BLUETOOTH_CALL_NOTE$点击右侧图标进入蓝牙设置\r
-STR_SIM_CARD_ERROR$Sim卡异常\r
-STR_CHECK_SIM_CARD_INSERTION$SIM卡拨号异常,请检查手表SIM卡是否正确插入\r
-STR_WEATHER_REPORT$气象报告\r
-STR_ULTRAVIOLET$紫外线\r
-STR_WIND_SPEED$风速\r
-STR_HUMIDITY$湿度\r
-STR_NEXT_7_DAYS$未来七天\r
-STR_GET_WEATHER_ERROR$未获取到天气信息请前往APP更新\r
-STR_MUSIC_SOURCE$音乐来源\r
-STR_MOBILE_MUSIC$手机音乐\r
-STR_WATCH_MUSIC$手表音乐\r
-STR_MUSIC_LIST$音乐列表\r
-STR_BLUETOOTH_CONNECTION_FAILED$蓝牙连接失败\r
-STR_SCANNING_BINDING$扫码绑定\r
-STR_DEVICE_BINDING$设备绑定\r
-STR_DEVICE_BINDING_NOTE$XX想要与你进行连接绑定\r
-STR_EQUIPMENT_UNTYING$设备解绑\r
-STR_EQUIPMENT_UNTYING_NOTE$XX想要与你进行解绑\r
-STR_DRINK_WATER_REMINDER$喝水提醒\r
-STR_DRINK_WATER_REMINDER_NOTE$该喝水啦!记得按时保持水分充足\r
-STR_SEDENTARY_REMINDER$久坐提醒\r
-STR_SEDENTARY_REMINDER_NOTE$你已经XX小时未活动了,站起来活动一下吧。\r
-STR_SYSTEM_UPGRADING$系统升级中\r
-STR_NEWDEVICE_BIND_REMIND_NOTE$当前设备已经与XX绑定继续连接操作会解除绑定并将手表恢复出厂设置(会清空手表数据)是否继续此操作\r
-STR_AI_VOICE$AI Voice\r
-STR_AI_INTELLIGENT_ASSISTANT$AI智能助手\r
-STR_START_CHAT$开始对话\r
-STR_BOOT_FAILED$启动失败\r
-STR_ENABLE_MOBILE_DATA_FIRST$请先开启移动数据 \r
-STR_ENABLE_BLUETOOTH_FIRST$请先开启蓝牙\r
-STR_LISTENING$正在聆听...\r
-STR_FINISH_SPEAKING$说话完毕\r
-STR_THINKING$正在思考...\r
-STR_CANCEL$取消\r
-STR_CONNECT_TIMEOUT$连接超时\r
-STR_PLEASE_RESTART_CHAT$请重新开始对话\r
-STR_CONTINUE_CHAT$继续对话\r
-STR_AIMODELS_DOUBAO$豆包\r
-STR_AIMODES_WENXINYIYAN$文心一言\r
-STR_AIMODES_KIMI$KIMI\r
-STR_AIMODES_CHATGPT$ChatGPT\r
-STR_SLIDE_TO_SHUTDOWN$滑动关机 >>\r
-STR_SLIDE_TO_REBOOT$滑动重启 >>\r
-STR_AI_FAMILY_MEALS$AI 全家桶\r
-STR_CHAT$对话\r
-STR_PCY4GC_OR_AS$请检查4G连接或APP设置\r
-STR_API_KEYS$API keys\r
-STR_PGTTAF$请先前往APP\r
-STR_DAFBS$“设备”-“AI全家桶”设置\r
-STR_OPENAI_API_KEYS$OpenAI API keys\r
-STR_KHBB$已绑定API keys\r
-STR_GTAS$更换请前往APP设置\r
-STR_DYWTDAK$是否确认删除API keys\r
-STR_CONNECTING$正在连接\r
-STR_CONNECTION_FAIL$连接失败\r
-STR_PTALORTM$请稍后再重试或更换模型\r
-STR_MOTION_DETECTION_NOTE$检测到您好像在进行XX运动,是否开始记录\r
-STR_PE4GC$请开启4G能力\r
-STR_OBU_MESSAGE$OBU\r
-STR_DELETE$删除
\ No newline at end of file
+++ /dev/null
-<language id="language" direct="ltr" languageinfo="en">
- <lanstr id="STR_EXERCISE_OUTDOORWALKING" value="Walk"/>
- <lanstr id="STR_EXERCISE_OUTDOORRUNNING" value="Run"/>
- <lanstr id="STR_EXERCISE_OUTDOORBIKING" value="Biking"/>
- <lanstr id="STR_EXERCISE_GENERAL" value="Exercise general"/>
- <lanstr id="STR_EXERCISE_FREETRAINING" value="Free training"/>
- <lanstr id="STR_EXERCISE_RESISTANCETRAINING" value="Resistance training"/>
- <lanstr id="STR_EXERCISE_SPINBIKE" value="Spin bike"/>
- <lanstr id="STR_EXERCISE_TREADMILL" value="Treadmill"/>
- <lanstr id="STR_EXERCISE_STROLLMACHINE" value="Stroll machine"/>
- <lanstr id="STR_EXERCISE_HIIT" value="High intense interval training"/>
- <lanstr id="STR_EXERCISE_CROSSFIT" value="Crossfit"/>
- <lanstr id="STR_EXERCISE_GROUPCALISTHENICS" value="Group calisthenics"/>
- <lanstr id="STR_EXERCISE_YOGA" value="Yoga"/>
- <lanstr id="STR_EXERCISE_YOGACAT" value="Yoga cat"/>
- <lanstr id="STR_EXERCISE_YOGACOW" value="Yoga cow"/>
- <lanstr id="STR_EXERCISE_YOGACOBRA" value="Yoga cobra"/>
- <lanstr id="STR_EXERCISE_YOGAHERO1" value="Yoga hero1"/>
- <lanstr id="STR_EXERCISE_YOGAHERO2" value="Yoga hero2"/>
- <lanstr id="STR_EXERCISE_YOGAHERO3" value="Yoga hero3"/>
- <lanstr id="STR_EXERCISE_YOGAROLLING" value="Yoga rolling"/>
- <lanstr id="STR_EXERCISE_INDOORWALKING" value="Indoor walking"/>
- <lanstr id="STR_EXERCISE_INDOORRUNNING" value="Indoor running"/>
- <lanstr id="STR_EXERCISE_JUMPINGROPE" value="Jumping rope"/>
- <lanstr id="STR_EXERCISE_PILATES" value="Pilates"/>
- <lanstr id="STR_EXERCISE_CROSS_FIT" value="Cross fit"/>
- <lanstr id="STR_EXERCISE_FUNCTIONALTRAINING" value="Functional training"/>
- <lanstr id="STR_EXERCISE_PHYSICALTRAINING" value="Physical Training"/>
- <lanstr id="STR_EXERCISE_TAEKWONDO" value="Taekwondo"/>
- <lanstr id="STR_EXERCISE_BOXING" value="Boxing"/>
- <lanstr id="STR_EXERCISE_KICKBOXING" value="Kickboxing"/>
- <lanstr id="STR_EXERCISE_KARATE" value="Karate"/>
- <lanstr id="STR_EXERCISE_FENCING" value="Fencing"/>
- <lanstr id="STR_EXERCISE_CORETRAINING" value="Core training"/>
- <lanstr id="STR_EXERCISE_BODYCOMBAT" value="Body Combat"/>
- <lanstr id="STR_EXERCISE_KENDO" value="Kendo"/>
- <lanstr id="STR_EXERCISE_HORIZONTALBAR" value="Horizontal bar"/>
- <lanstr id="STR_EXERCISE_PARALLELBARS" value="Parallel bars"/>
- <lanstr id="STR_EXERCISE_CIRCUIT" value="Circuit training"/>
- <lanstr id="STR_EXERCISE_AEROBICS" value="Aerobics"/>
- <lanstr id="STR_EXERCISE_CALISTHENICE" value="Calisthenice"/>
- <lanstr id="STR_EXERCISE_P90X" value="P90X"/>
- <lanstr id="STR_EXERCISE_KETTLEBELLTRAINING" value="Kettlebell Training"/>
- <lanstr id="STR_EXERCISE_MIXEDMARTIALARTS" value="Mixed martial arts"/>
- <lanstr id="STR_EXERCISE_STAIRCLIMBINGMACHINE" value="Stair climbing machine"/>
- <lanstr id="STR_EXERCISE_WEIGHTLIFTING" value="Weightlifting"/>
- <lanstr id="STR_EXERCISE_BARRE" value="Barre"/>
- <lanstr id="STR_EXERCISE_HANDCYCLING" value="Hand cycling"/>
- <lanstr id="STR_EXERCISE_TRACKFIELD" value="Track field"/>
- <lanstr id="STR_EXERCISE_WRESTLING" value="Wrestling"/>
- <lanstr id="STR_EXERCISE_MINDBODY" value="Mind body"/>
- <lanstr id="STR_EXERCISE_FLEXIBILITY" value="Flexibility"/>
- <lanstr id="STR_EXERCISE_MIXEDCARDIO" value="Mixed cardio"/>
- <lanstr id="STR_EXERCISE_TRADITIONALSTRENGTHTRAINING" value="Traditional strength training"/>
- <lanstr id="STR_EXERCISE_CROSSTRAINING" value="Cross training"/>
- <lanstr id="STR_EXERCISE_GYMNASTICS" value="Gymnastics"/>
- <lanstr id="STR_EXERCISE_STEPTRAINING" value="Step training"/>
- <lanstr id="STR_EXERCISE_ELLIPTICALTRAINER" value="Elliptical trainer"/>
- <lanstr id="STR_EXERCISE_ROWINGMACHINE" value="Rowing machine"/>
- <lanstr id="STR_DANCING_GENERAL" value="Dancing general"/>
- <lanstr id="STR_DANCING_BELLY" value="Belly dance"/>
- <lanstr id="STR_DANCING_JAZZ" value="Jazz dance"/>
- <lanstr id="STR_DANCING_LATIN" value="Latin dance"/>
- <lanstr id="STR_DANCING_BALLET" value="Ballet dance"/>
- <lanstr id="STR_DANCING_STREET" value="Street dance"/>
- <lanstr id="STR_DANCING_PUBLICSQUARE" value="Public square dancing"/>
- <lanstr id="STR_DANCING_ZUMBA" value="Zumba"/>
- <lanstr id="STR_DANCING_SOCIALDANCE" value="Social dance"/>
- <lanstr id="STR_DANCING_TAPDANCE" value="Tap dance"/>
- <lanstr id="STR_RECREATIONAL_SPORTS" value="Recreational Sports"/>
- <lanstr id="STR_RECREATIONAL_SKATING" value="Roller Skating"/>
- <lanstr id="STR_RECREATIONAL_MARTIALARTS" value="Martial arts"/>
- <lanstr id="STR_RECREATIONAL_TAICHI" value="Tai Chi"/>
- <lanstr id="STR_RECREATIONAL_HULAHOOP" value="Hula hoop"/>
- <lanstr id="STR_RECREATIONAL_DISCSPORT" value="Disc sport"/>
- <lanstr id="STR_RECREATIONAL_DARTS" value="Darts"/>
- <lanstr id="STR_RECREATIONAL_ARCHERY" value="Archery"/>
- <lanstr id="STR_RECREATIONAL_HORSERIDING" value="Horse riding"/>
- <lanstr id="STR_RECREATIONAL_BATTLEGAME" value="Battle game"/>
- <lanstr id="STR_RECREATIONAL_KITE" value="Fly a kite"/>
- <lanstr id="STR_RECREATIONAL_TUGOFWAR" value="Tug of war"/>
- <lanstr id="STR_RECREATIONAL_SWING" value="Swing"/>
- <lanstr id="STR_RECREATIONAL_STAIRCLIMBING" value="Stair climbing"/>
- <lanstr id="STR_RECREATIONAL_OBSTACLERACE" value="Obstacle race"/>
- <lanstr id="STR_RECREATIONAL_FISHING" value="Fishing"/>
- <lanstr id="STR_RECREATIONAL_HUNTING" value="Hunting"/>
- <lanstr id="STR_RECREATIONAL_SCOOTERRIDING" value="Scooter Riding"/>
- <lanstr id="STR_RECREATIONAL_PARAGLIDING" value="Paragliding"/>
- <lanstr id="STR_RECREATIONAL_TEAMSPORTS" value="Team sports"/>
- <lanstr id="STR_RECREATIONAL_FINESSGAMING" value="Finess gaming"/>
- <lanstr id="STR_RECREATIONAL_HIKING" value="Hiking"/>
- <lanstr id="STR_RECREATIONAL_EQUESTRIANSPORTS" value="Equestrian sports"/>
- <lanstr id="STR_RECREATIONAL_PLAY" value="Play"/>
- <lanstr id="STR_BALL_GAMES" value="Ball games"/>
- <lanstr id="STR_BALL_BADMINTON" value="Badminton"/>
- <lanstr id="STR_BALL_TABLETENNIS" value="Table tennis"/>
- <lanstr id="STR_BALL_TENNIS" value="Tennis"/>
- <lanstr id="STR_BALL_BILLIARDS" value="Billiards"/>
- <lanstr id="STR_BALL_BOWLING" value="Bowling"/>
- <lanstr id="STR_BALL_VOLLEYBALL" value="Volleyball"/>
- <lanstr id="STR_BALL_SHUTTLECOCK" value="Shuttlecock"/>
- <lanstr id="STR_BALL_HANDBALL" value="Handball"/>
- <lanstr id="STR_BALL_BASEBALL" value="Baseball"/>
- <lanstr id="STR_BALL_SOFTBALL" value="Softball"/>
- <lanstr id="STR_BALL_CRICKET" value="Cricket"/>
- <lanstr id="STR_BALL_FOOTBALL" value="Football"/>
- <lanstr id="STR_BALL_BEACHSOCCER" value="Beach soccer"/>
- <lanstr id="STR_BALL_BEACHVOLLEYBALL" value="Beach volleyball"/>
- <lanstr id="STR_BALL_CROQUET" value="Croquet"/>
- <lanstr id="STR_BALL_HOCKEY" value="Hockey"/>
- <lanstr id="STR_BALL_SQUASH" value="Squash"/>
- <lanstr id="STR_BALL_SEPAKTAKRAW" value="Sepak takraw"/>
- <lanstr id="STR_BALL_DODGEBALL" value="Dodge ball"/>
- <lanstr id="STR_BALL_BASKETBALL" value="Basketball"/>
- <lanstr id="STR_BALL_SOCCER" value="Soccer"/>
- <lanstr id="STR_BALL_GOLF" value="Golf"/>
- <lanstr id="STR_BALL_POLO" value="Polo"/>
- <lanstr id="STR_BALL_RACQUETBALL" value="Racquetball"/>
- <lanstr id="STR_BALL_RUGBY" value="Rugby"/>
- <lanstr id="STR_BALL_GATEBALL" value="Gateball"/>
- <lanstr id="STR_BALL_PICKLEBALL" value="Pickleball"/>
- <lanstr id="STR_BALL_LACROSSE" value="Lacrosse"/>
- <lanstr id="STR_WATER_ACTIVITIES" value="Water activities"/>
- <lanstr id="STR_WATER_SAILING" value="Sailing"/>
- <lanstr id="STR_WATER_SURFING" value="Surfing"/>
- <lanstr id="STR_WATER_WHITEWATERRAFTING" value="Whitewater rafting"/>
- <lanstr id="STR_WATER_CANOEING" value="Canoeing"/>
- <lanstr id="STR_WATER_KAYAKING" value="Kayaking"/>
- <lanstr id="STR_WATER_ROWING" value="Rowing"/>
- <lanstr id="STR_WATER_MOTORBOAT" value="Motorboat"/>
- <lanstr id="STR_WATER_SUP" value="SUP"/>
- <lanstr id="STR_WATER_SCUBADIVING" value="Scuba diving"/>
- <lanstr id="STR_WATER_DIVING" value="Diving"/>
- <lanstr id="STR_WATER_KITESURFING" value="Kitesurfing"/>
- <lanstr id="STR_WATER_WAKEBOARDING" value="Wakeboarding"/>
- <lanstr id="STR_WATER_POLO" value="Water Polo"/>
- <lanstr id="STR_WATER_WINDSURFING" value="Windsurfing"/>
- <lanstr id="STR_WATER_DRIFTING" value="Drifting"/>
- <lanstr id="STR_WATER_FITNESS" value="Water fitness"/>
- <lanstr id="STR_WATER_SPORTS" value="Water sports"/>
- <lanstr id="STR_WATER_OUTDOORSWIM" value="Outdoor swim"/>
- <lanstr id="STR_WATER_INDOORSWIM" value="Indoor swim"/>
- <lanstr id="STR_WATER_SWIMFREESTYLE" value="Swim freestyle"/>
- <lanstr id="STR_WATER_SWIMBREASTSTROKE" value="Swim breaststroke"/>
- <lanstr id="STR_WATER_SWIMBACKSTROKE" value="Swim backstroke"/>
- <lanstr id="STR_WATER_SWIMBUTTERFLY" value="Swim butterfly"/>
- <lanstr id="STR_ICE_SPORTS" value="Ice sports"/>
- <lanstr id="STR_ICE_SKATING" value="Skating"/>
- <lanstr id="STR_ICE_HOCKEY" value="Ice hockey"/>
- <lanstr id="STR_ICE_CURLING" value="Curling"/>
- <lanstr id="STR_ICE_SNOWMOBILING" value="Snow mobiling"/>
- <lanstr id="STR_ICE_SLED" value="Sled"/>
- <lanstr id="STR_ICE_BIATHLON" value="Biathlon"/>
- <lanstr id="STR_ICE_CROSSCOUNTRYSKING" value="Crosscountry sking"/>
- <lanstr id="STR_ICE_SKIING" value="Skiing"/>
- <lanstr id="STR_ICE_SNOWBOARDING" value="Snowboarding"/>
- <lanstr id="STR_ICE_SNOWSHOEING" value="Snowshoeing"/>
- <lanstr id="STR_ICE_SNOWSPORTS" value="Snow sport"/>
- <lanstr id="STR_EXTREME_SPORTS" value="Extreme sports"/>
- <lanstr id="STR_EXTREME_SKATEBOARDING" value="Skateboarding"/>
- <lanstr id="STR_EXTREME_ROCKCLIMBING" value="Rock climbing"/>
- <lanstr id="STR_EXTREME_BUNGEEJUMPING" value="Bungee Jumping"/>
- <lanstr id="STR_EXTREME_PARKOUR" value="Parkour"/>
- <lanstr id="STR_EXTREME_BMX" value="Bike motocross"/>
- <lanstr id="STR_EXTREME_ORIENTEERING" value="Orienteering"/>
- <lanstr id="STR_EXTREME_PARACHUTE" value="Parachute"/>
- <lanstr id="STR_EXTREME_RACING" value="Racing"/>
- <lanstr id="STR_EXTREME_TRIATHLONS" value="Triathlons"/>
- <lanstr id="STR_OTHER_ELEVATOR" value="Elevator"/>
- <lanstr id="STR_OTHER_ESCALATOR" value="Escalator"/>
- <lanstr id="STR_OTHER_GARDENING" value="Gardening"/>
- <lanstr id="STR_OTHER_HORSEWORK" value="House Work"/>
- <lanstr id="STR_OTHER_INVEHICLE" value="In Vehicle"/>
- <lanstr id="STR_OTHER_MEDITATION" value="Meditation"/>
- <lanstr id="STR_OTHER_STILL" value="Still"/>
- <lanstr id="STR_OTHER_TILTING" value="Tilting"/>
- <lanstr id="STR_OTHER_WHEELCHAIR" value="Wheelchair"/>
- <lanstr id="STR_HEART_RATE" value="Heart Rate"/>
- <lanstr id="STR_BLOOD_OXYGEN" value="Blood Oxygen"/>
- <lanstr id="STR_TRAINING" value="Training"/>
- <lanstr id="STR_TRAINING_RECORD" value="Training Record"/>
- <lanstr id="STR_COMPASS" value="Compass"/>
- <lanstr id="STR_TELEPHONE" value="Telephone"/>
- <lanstr id="STR_FAVORITE_CONTACTS" value="Favorite Contacts"/>
- <lanstr id="STR_WEATHER" value="Weather"/>
- <lanstr id="STR_ACTIVITY" value="Activity"/>
- <lanstr id="STR_WATCH_FACE" value="Watch Face"/>
- <lanstr id="STR_DISPLAY_MODE" value="Display Mode"/>
- <lanstr id="STR_CARD_MANAGEMENT" value="Card Management"/>
- <lanstr id="STR_MUSIC" value="Music"/>
- <lanstr id="STR_SLEEP" value="Sleep"/>
- <lanstr id="STR_RECORD" value="Record"/>
- <lanstr id="STR_BREATH_TRAINING" value="Breath Training"/>
- <lanstr id="STR_REMOTE_SHOOTING" value="Remote Shooting"/>
- <lanstr id="STR_VOICE_ASSISTANT" value="Voice Assistant"/>
- <lanstr id="STR_ALIPAY" value="Alipay"/>
- <lanstr id="STR_TIMER" value="Timer"/>
- <lanstr id="STR_ALARM" value="Alarm"/>
- <lanstr id="STR_STOPWATCH" value="Stopwatch"/>
- <lanstr id="STR_CALCULATOR" value="Calculator"/>
- <lanstr id="STR_FIND_PHONE" value="Find Phone"/>
- <lanstr id="STR_BRIGHTNESS_ADJUSTMENT" value="Brightness Adjustment"/>
- <lanstr id="STR_SOUND" value="Sound"/>
- <lanstr id="STR_BLUETOOTH" value="Bluetooth"/>
- <lanstr id="STR_DO_NOT_DISTURB" value="Do Not Disturb"/>
- <lanstr id="STR_MESSAGE_NOTIFICATION" value="Message Notification"/>
- <lanstr id="STR_POWER_SAVE_MODE" value="Power Save Mode"/>
- <lanstr id="STR_FLASHLIGHT" value="Flashlight"/>
- <lanstr id="STR_SETTINGS" value="Settings"/>
- <lanstr id="STR_EXERCISE_LIST" value="Exercise"/>
- <lanstr id="STR_BALL_LIST" value="Ball"/>
- <lanstr id="STR_WATER_LIST" value="Water"/>
- <lanstr id="STR_DANCING_LIST" value="Dance"/>
- <lanstr id="STR_EXTREME_LIST" value="Extreme"/>
- <lanstr id="STR_ICE_LIST" value="Ice"/>
- <lanstr id="STR_RECREATIONAL_LIST" value="Recreational"/>
- <lanstr id="STR_OTHER_LIST" value="Other"/>
- <lanstr id="STR_DANCING_TITLE" value="Dance Sport"/>
- <lanstr id="STR_BALL_LIST_TITLE" value="Ball Sport"/>
- <lanstr id="STR_OTHER_TITLE" value="Other Sport"/>
- <lanstr id="STR_EXERCISE_TITLE" value="Exercise Sport"/>
- <lanstr id="STR_RAPID_TRAINING" value="Rapid training"/>
- <lanstr id="STR_SET_GOALS" value="Set goals"/>
- <lanstr id="STR_DURATION" value="duration"/>
- <lanstr id="STR_DURATION_SETTING" value="Duration setting(Min)"/>
- <lanstr id="STR_CALORIE" value="calorie"/>
- <lanstr id="STR_CALORIE_SETTING" value="Calorie setting(Kcal)"/>
- <lanstr id="STR_DISTANCE" value="distance"/>
- <lanstr id="STR_RANGE_SETTING" value="Range setting(Km)"/>
- <lanstr id="STR_STEP_NUMBER" value="Step number"/>
- <lanstr id="STR_STEP_SETTING" value="Step setting(steps)"/>
- <lanstr id="STR_HEART_RATE_SETTING" value="Heart rate (times/min)"/>
- <lanstr id="STR_MEAN_HEART_RATE" value="Mean heart rate"/>
- <lanstr id="STR_TIMES_PER_MIN" value="Times/min"/>
- <lanstr id="STR_MEAN_HEART_RATE_MIN" value="Mean heart rate(Times/min)"/>
- <lanstr id="STR_LOWER_STRENGTH" value="Lower strength"/>
- <lanstr id="STR_MEDIUM_STRENGTH" value="Medium strength"/>
- <lanstr id="STR_HIGH_STRENGTH" value="High strength"/>
- <lanstr id="STR_ULTRA_HIGH_STRENGTH" value="Ultra-high strength"/>
- <lanstr id="STR_TRAINING_INTENSITY" value="Training intensity"/>
- <lanstr id="STR_TRAINING_IN_PROGRESS" value="Training in progress"/>
- <lanstr id="STR_BREAK_TRAINING" value="Break training"/>
- <lanstr id="STR_FINISH" value="finish"/>
- <lanstr id="STR_PAUSE" value="Pause"/>
- <lanstr id="STR_RESUME" value="Resume"/>
- <lanstr id="STR_GOAL_ACHIEVED" value="Goal achieved"/>
- <lanstr id="STR_ACCOMPLISH_GOAL" value="Accomplish the goal"/>
- <lanstr id="STR_OK" value="OK"/>
- <lanstr id="STR_LOOK_OUT" value="Look out"/>
- <lanstr id="STR_INSUFFICIENT_EXERCISE_AMOUNT" value="The current amount of exercise is too small to record"/>
- <lanstr id="STR_END_MOVEMENT" value="End movement"/>
- <lanstr id="STR_END_THIS_MOVEMENT" value="Whether to end this movement"/>
- <lanstr id="STR_GOAL_ACCOMPLISHMENT_DEGREE" value="Goal accomplishment degree"/>
- <lanstr id="STR_TRAINING_DURATION" value="Training duration"/>
- <lanstr id="STR_RANGE_MILE" value="Distance (m)"/>
- <lanstr id="STR_CLOSE" value="Close"/>
- <lanstr id="STR_MORE" value="More"/>
- <lanstr id="STR_MORE_APP" value="Check out the APP for more"/>
- <lanstr id="STR_SAVENOTE" value="Turning on power-saving mode turns off non-essential Bluetooth connections, as well as features such as sensor monitoring"/>
- <lanstr id="STR_SAVEBACK" value="Press and hold the screen for more than 3 seconds or charge to exit the power saving mode"/>
- <lanstr id="STR_SAVEASK" value="Enable or not"/>
- <lanstr id="STR_BLOOD" value="bloodoxygen"/>
- <lanstr id="STR_CHECK" value="detection"/>
- <lanstr id="STR_CHECKNEW" value="Just detected"/>
- <lanstr id="STR_CHECKTIME" value="Detected XX minutes ago"/>
- <lanstr id="STR_CHECKLONG" value="Detected over 1 hour ago"/>
- <lanstr id="STR_CHECKNO" value="No detection records available"/>
- <lanstr id="STR_CHECKNOTE" value="Wear it snugly and stay still"/>
- <lanstr id="STR_CHECKON" value="Detecting"/>
- <lanstr id="STR_CHECKSTOP" value="Stop detection"/>
- <lanstr id="STR_CHECKERROR" value="Unable to detect results"/>
- <lanstr id="STR_WAERKEEP" value="Please ensure the watch is worn and remain still"/>
- <lanstr id="STR_WEARRE" value="Perform a retest"/>
- <lanstr id="STR_WEARREADY" value="Click the button below when ready"/>
- <lanstr id="STR_RECHECK" value="Retest"/>
- <lanstr id="STR_CHECKEWARN" value="Blood Oxygen Alert"/>
- <lanstr id="STR_BLOODSHORT" value="Current blood oxygen level is below XX%"/>
- <lanstr id="STR_HEARTNOTE" value="Please take care of your health"/>
- <lanstr id="STR_KONW" value="Got it"/>
- <lanstr id="STR_EXPLAIN" value="Explanation"/>
- <lanstr id="STR_HEARTREST" value="Resting"/>
- <lanstr id="STR_HEARTDATA" value="Heart rate detection result"/>
- <lanstr id="STR_HEARTTITLE" value="Heart rate alert"/>
- <lanstr id="STR_HEARTMAX" value="Current heart rate is higher than XX"/>
- <lanstr id="STR_HEARTMIN" value="Current heart rate is lower than XX"/>
- <lanstr id="STR_TRAINGNO" value="no record"/>
- <lanstr id="STR_TRAINGGO" value="Go to training"/>
- <lanstr id="STR_MESSAGENO" value="No content currently"/>
- <lanstr id="STR_CLEAN" value="Clear"/>
- <lanstr id="STR_CLEANALL" value="Clear all"/>
- <lanstr id="STR_SLEEP_YESTERDAY" value="Last Night's Sleep"/>
- <lanstr id="STR_HOUR" value="Hours"/>
- <lanstr id="STR_MIN" value="MInutes"/>
- <lanstr id="STR_SLEEPMGOAL" value="Goal XX Hours"/>
- <lanstr id="STR_REATTIME" value="Schedule"/>
- <lanstr id="STR_SLEEPTIME" value="Bedtime"/>
- <lanstr id="STR_WALKTIME" value="Wake-up Time"/>
- <lanstr id="STR_APPMORE" value="For more details yesterday, please visit the mobile APP"/>
- <lanstr id="STR_DISTURB" value="The watch will enter Do Not Disturb mode in 20 minutes. To turn it off, please go to the Control Center."/>
- <lanstr id="STR_DISTURBNOTE" value="Do Not Disturb mode is enabled, thus the watch won't vibrate or ring."/>
- <lanstr id="STR_MORNNING" value="Good morning"/>
- <lanstr id="STR_NOW" value="Current"/>
- <lanstr id="STR_NAP" value="Nap (5 minutes)"/>
- <lanstr id="STR_TACK" value="Please open the app first, go to "Device" - "Camera""/>
- <lanstr id="STR_CLICK" value="click on "Take a Photo"/>
- <lanstr id="STR_TACKNUM" value="Number of photos taken: XX"/>
- <lanstr id="STR_SCREEN_AND_BRIGHTNESS" value="Screen and Brightness"/>
- <lanstr id="STR_NETWORKANDCALL" value="NetworkAndCall"/>
- <lanstr id="STR_SOUND_AND_VIBRATION" value="Sound and Vibration"/>
- <lanstr id="STR_MOTION_RECOGNITION" value="Motion Recognition"/>
- <lanstr id="STR_SYSTEM" value="System"/>
- <lanstr id="STR_SHUTDOWN_AND_RESTART" value="Shutdown and Restart"/>
- <lanstr id="STR_SCREEN_ON_DURATION" value="Screen On Duration"/>
- <lanstr id="STR_RAISE_TO_WAKE" value="Raise to Wake"/>
- <lanstr id="STR_5_SECONDS" value="5 s"/>
- <lanstr id="STR_10_SECONDS" value="10 s"/>
- <lanstr id="STR_15_SECONDS" value="15 s"/>
- <lanstr id="STR_30_SECONDS" value="30 s"/>
- <lanstr id="STR_60_SECONDS" value="60 s"/>
- <lanstr id="STR_300_SECONDS" value="300 s"/>
- <lanstr id="STR_4G_CAPABILITY" value="4G capability"/>
- <lanstr id="STR_VOLTE_CALL" value="VoLTE call"/>
- <lanstr id="STR_MOBILE_DATA_OPTION" value="Mobile data option"/>
- <lanstr id="STR_SYSTEM_UPDATE" value="System Update"/>
- <lanstr id="STR_ONLINE_MUSIC" value="Online music"/>
- <lanstr id="STR_BLUETOOTH_HEADPHONES" value="Bluetooth Headphones"/>
- <lanstr id="STR_TRADITIONAL_BLUETOOTH" value="Traditional Bluetooth"/>
- <lanstr id="STR_AUTO_OFF_BLUETOOTH_NOTE" value="Note: It will be automatically turned off if the connection is not successful for 10 minutes after opening, because the traditional Bluetooth will increase the power consumption for a long time, it is recommended to use when necessary(this function is mainly used for phone calls/notifications、music control/transmission, etc.)"/>
- <lanstr id="STR_BLUETOOTH_SERVICE_OPTIONS" value="Bluetooth Service Options"/>
- <lanstr id="STR_HFP" value="HFP"/>
- <lanstr id="STR_A2DP" value="A2DP"/>
- <lanstr id="STR_SYSTEM_VOLUME" value="System Volume"/>
- <lanstr id="STR_MEDIA_VOLUME" value="Media Volume"/>
- <lanstr id="STR_CALL_VOLUME" value="Call Volume"/>
- <lanstr id="STR_VIBRATION_MODE" value="Vibration Mode"/>
- <lanstr id="STR_SILENT_MODE" value="Silent Mode"/>
- <lanstr id="STR_LIST_DISPLAY" value="List display"/>
- <lanstr id="STR_GRID_DISPLAY" value="Grid Display"/>
- <lanstr id="STR_CELLULAR_DISPLAY" value="Cellular Display"/>
- <lanstr id="STR_AUTO_DETECT" value="Auto Detect"/>
- <lanstr id="STR_ABOUT_WATCH" value="About Watch"/>
- <lanstr id="STR_WATCH_QR_CODE" value="watch QR code"/>
- <lanstr id="STR_SYSTEM_LANGUAGE" value="System Language"/>
- <lanstr id="STR_RESTART" value="Restart"/>
- <lanstr id="STR_SHUTDOWN" value="Shutdown"/>
- <lanstr id="STR_FACTORY_RESET" value="Factory Reset"/>
- <lanstr id="STR_WATCH_NAME" value="Watch Name"/>
- <lanstr id="STR_FIRMWARE_VERSION" value="Firmware Version"/>
- <lanstr id="STR_BLUETOOTH_NAME" value="Bluetooth Name"/>
- <lanstr id="STR_BLUETOOTH_ADDRESS" value="Bluetooth Address"/>
- <lanstr id="STR_UPDATENOW" value="Update Now"/>
- <lanstr id="STR_LATEST_VERSION" value="Latest version"/>
- <lanstr id="STR_LATER" value="Later"/>
- <lanstr id="STR_UP_TO_DATE" value="The system has been upgraded to the latest version"/>
- <lanstr id="STR_NO_UPDATE" value="No update"/>
- <lanstr id="STR_LANGUAGE_SELECTION" value="Language Select"/>
- <lanstr id="STR_RESET_CONFIRM" value="Are you sure to restart?"/>
- <lanstr id="STR_SHUTDOWN_CONFIRM" value="Are you sure to shut down?"/>
- <lanstr id="STR_RESET_CONFIRM_NOTE" value="The operation will clear and reset the watch data. Are you sure you want to continue?"/>
- <lanstr id="STR_RECORDER" value="Recorder"/>
- <lanstr id="STR_CLICK_TO_RECORD" value="Click to record"/>
- <lanstr id="STR_RECORDING" value="Recording"/>
- <lanstr id="STR_AUDIO_XX" value="Audio_XX"/>
- <lanstr id="STR_VOICE_RECORDING_REMINDER" value="Voice recording reminder"/>
- <lanstr id="STR_VOICE_RECORDING_REMINDER_NOTE" value="The number of recordings must not exceed 30. Please delete some existing recordings."/>
- <lanstr id="STR_DELETE_RECORDING" value="Delete recording"/>
- <lanstr id="STR_DELETE_PERMANENTLY" value="Permanently Delete"/>
- <lanstr id="STR_RECORDING_LIST" value="Recording List"/>
- <lanstr id="STR_CRLEMPTY" value="Current recording list is empty."/>
- <lanstr id="STR_DO_NOT_DISTURB_MODE" value="Turn on Do Not Disturb mode, the watch will not vibrate or ring, do you want to turn it on?"/>
- <lanstr id="STR_CONNECTION_STATUS" value="Connection Status"/>
- <lanstr id="STR_PHONE" value="Phone"/>
- <lanstr id="STR_HEADSET" value="Headset"/>
- <lanstr id="STR_CONNECTED" value="Connected"/>
- <lanstr id="STR_DISCONNECTED" value="Disconnected"/>
- <lanstr id="STR_PHONE_RINGING_VIBRATING" value="The mobile phone is ringing/vibrating"/>
- <lanstr id="STR_BLUETOOTH_DISCONNECTED" value="Bluetooth not connected"/>
- <lanstr id="STR_STOP" value="Stop"/>
- <lanstr id="STR_WORKDAY" value="WorkDay"/>
- <lanstr id="STR_REPEAT_NO" value="no-repeat"/>
- <lanstr id="STR_EVERYDAY" value="Everyday"/>
- <lanstr id="STR_ADD_A_NEW_ALARM" value="Add a new alarm"/>
- <lanstr id="STR_TIME" value="Time"/>
- <lanstr id="STR_NEXT_STEP" value="Next Step"/>
- <lanstr id="STR_MON" value="Mon"/>
- <lanstr id="STR_TUES" value="Tue"/>
- <lanstr id="STR_WEDNES" value="Wed"/>
- <lanstr id="STR_THURS" value="Thu"/>
- <lanstr id="STR_FRI" value="Fri"/>
- <lanstr id="STR_SATUR" value="Sat"/>
- <lanstr id="STR_SUN" value="Sun"/>
- <lanstr id="STR_MONDAY" value="Monday"/>
- <lanstr id="STR_TUESDAY" value="Tuesday"/>
- <lanstr id="STR_WEDNESDAY" value="Wednesday"/>
- <lanstr id="STR_THURSDAY" value="Thursday"/>
- <lanstr id="STR_FRIDAY" value="Friday"/>
- <lanstr id="STR_SATURDAY" value="Saturday"/>
- <lanstr id="STR_SUNDAY" value="Sunday"/>
- <lanstr id="STR_CALIBRATE_COMPASS" value="Calibration compass"/>
- <lanstr id="STR_CALIBRATE_COMPASS_NOTE" value="Please stay away from interference sources and follow the instructions Rotate the watch to calibrate"/>
- <lanstr id="STR_EAST" value="E"/>
- <lanstr id="STR_SOUTH" value="S"/>
- <lanstr id="STR_WEST" value="W"/>
- <lanstr id="STR_NORTH" value="N"/>
- <lanstr id="STR_SOUTHEAST" value="SE"/>
- <lanstr id="STR_SOUTHWEST" value="SW"/>
- <lanstr id="STR_NORTHEAST" value="NE"/>
- <lanstr id="STR_NORTHWEST" value="NW"/>
- <lanstr id="STR_KEEP_STILL_FOCUS_ON_BREATHING" value="Keep Still Focus on Breathing"/>
- <lanstr id="STR_EXHALE_NOW" value="Exhale now"/>
- <lanstr id="STR_INHALE_NOW" value="Inhale now"/>
- <lanstr id="STR_TRAINING_COMPLETE" value="Training Complete"/>
- <lanstr id="STR_THIS_BREATH" value="This breath"/>
- <lanstr id="STR_TODAYS_BREATHING_TRAINING" value="Today's Breathing Training"/>
- <lanstr id="STR_RECENT_CALLS" value="Recent Calls"/>
- <lanstr id="STR_NO_CALLS" value="No Calls"/>
- <lanstr id="STR_MISSED_CALLS" value="Missed Calls"/>
- <lanstr id="STR_DIALED_CALLS" value="Dialed Calls"/>
- <lanstr id="STR_RECEIVED_CALLS" value="Received Calls"/>
- <lanstr id="STR_NOTE_RECENT_CALLS_LIMITATION" value="Note: Only the last 20 calls are saved"/>
- <lanstr id="STR_NO_CONTACTS_ADDED" value="No contacts added, please set up in APP"/>
- <lanstr id="STR_DIAL_MODE" value="Dial Mode"/>
- <lanstr id="STR_DIAL_VIA_WATCH_SIM" value="Dial via Watch SIM"/>
- <lanstr id="STR_DIAL_VIA_PHONE" value="Dial via Phone"/>
- <lanstr id="STR_KUMI_TECHNOLOGY" value="KUMI Technology"/>
- <lanstr id="STR_CALLING" value="Calling"/>
- <lanstr id="STR_NOT_PAIRED" value="Not Paired"/>
- <lanstr id="STR_PAIRED" value="Paired"/>
- <lanstr id="STR_UNPAIR" value="Unpair"/>
- <lanstr id="STR_CONNECTION_ERROR" value="Connection Error"/>
- <lanstr id="STR_INSERT_WATCH_SIM_OR_CONNECT_PHONE" value="Insert watch SIM or connect phone to make calls"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL" value="Enable Bluetooth Call"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL_NOTE_IPHONE" value="The solution:1. IPhone Please go to the phone "Settings" → "Bluetooth" list to find “KUMI_XX” Click and try again"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL_NOTE_ANDRODIR" value="2. Android phones Please go to the phone "Settings" → "Bluetooth" list to find “KUMI_XX”"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL_NOTE" value="Click the icon on the right to enter Bluetooth Settings Enable the call and media functions and try again"/>
- <lanstr id="STR_SIM_CARD_ERROR" value="SIM Card Error"/>
- <lanstr id="STR_CHECK_SIM_CARD_INSERTION" value="Check if the watch’s SIM card is properly inserted"/>
- <lanstr id="STR_WEATHER_REPORT" value="Weather report"/>
- <lanstr id="STR_ULTRAVIOLET" value="Ultraviolet"/>
- <lanstr id="STR_WIND_SPEED" value="WindSpeed"/>
- <lanstr id="STR_HUMIDITY" value="Humidity"/>
- <lanstr id="STR_NEXT_7_DAYS" value="Next 7 Days"/>
- <lanstr id="STR_GET_WEATHER_ERROR" value="No weather information was obtained Please go to APP Update"/>
- <lanstr id="STR_MUSIC_SOURCE" value="Music source"/>
- <lanstr id="STR_MOBILE_MUSIC" value="Mobile music"/>
- <lanstr id="STR_WATCH_MUSIC" value="Watch music"/>
- <lanstr id="STR_MUSIC_LIST" value="Music list"/>
- <lanstr id="STR_BLUETOOTH_CONNECTION_FAILED" value="Bluetooth connection failed"/>
- <lanstr id="STR_SCANNING_BINDING" value="Scanning binding"/>
- <lanstr id="STR_DEVICE_BINDING" value="Device binding"/>
- <lanstr id="STR_DEVICE_BINDING_NOTE" value="XX wants to connect and bind with you"/>
- <lanstr id="STR_EQUIPMENT_UNTYING" value="Equipment untying"/>
- <lanstr id="STR_EQUIPMENT_UNTYING_NOTE" value="XX would like to unbind you"/>
- <lanstr id="STR_DRINK_WATER_REMINDER" value="Drink water reminder"/>
- <lanstr id="STR_DRINK_WATER_REMINDER_NOTE" value="Time for some water! And stay hydrated"/>
- <lanstr id="STR_SEDENTARY_REMINDER" value="Sedentary reminder"/>
- <lanstr id="STR_SEDENTARY_REMINDER_NOTE" value="You haven't moved for XX hours. Get up and move."/>
- <lanstr id="STR_SYSTEM_UPGRADING" value="System upgrading"/>
- <lanstr id="STR_NEWDEVICE_BIND_REMIND_NOTE" value="The device has been bound to XX. If you continue to connect the device, the device will be unbound and the watch will be restored to factory Settings (the watch data will be cleared)."/>
- <lanstr id="STR_AI_VOICE" value="AI Voice"/>
- <lanstr id="STR_AI_INTELLIGENT_ASSISTANT" value="AI Intelligent Assistant"/>
- <lanstr id="STR_START_CHAT" value="Start Chat"/>
- <lanstr id="STR_BOOT_FAILED" value="Boot Failed"/>
- <lanstr id="STR_ENABLE_MOBILE_DATA_FIRST" value="Please enable mobile data first"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_FIRST" value="Please enable Bluetooth first"/>
- <lanstr id="STR_LISTENING" value="Listening"/>
- <lanstr id="STR_FINISH_SPEAKING" value="Finish Speaking"/>
- <lanstr id="STR_THINKING" value="Thinking"/>
- <lanstr id="STR_CANCEL" value="Cancel"/>
- <lanstr id="STR_CONNECT_TIMEOUT" value="Connection Timeout"/>
- <lanstr id="STR_PLEASE_RESTART_CHAT" value="Please restart the conversation"/>
- <lanstr id="STR_CONTINUE_CHAT" value="Continue the conversation"/>
- <lanstr id="STR_AIMODELS_DOUBAO" value="Cici"/>
- <lanstr id="STR_AIMODES_WENXINYIYAN" value="ERNIE Bot"/>
- <lanstr id="STR_AIMODES_KIMI" value="KIMI"/>
- <lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
- <lanstr id="STR_SLIDE_TO_SHUTDOWN" value="Slide to shutdown >>"/>
- <lanstr id="STR_SLIDE_TO_REBOOT" value="Slide to reboot >>"/>
- <lanstr id="STR_AI_FAMILY_MEALS" value="AI Family Meals"/>
- <lanstr id="STR_CHAT" value="Chat"/>
- <lanstr id="STR_PCY4GC_OR_AS" value="Please check your 4G connection or APP Settings"/>
- <lanstr id="STR_API_KEYS" value="API keys"/>
- <lanstr id="STR_PGTTAF" value="Please go to the APP first"/>
- <lanstr id="STR_DAFBS" value="Device" - "AI Family Bucket" setting"/>
- <lanstr id="STR_OPENAI_API_KEYS" value="OpenAI API keys"/>
- <lanstr id="STR_KHBB" value="API keys have been bound"/>
- <lanstr id="STR_GTAS" value="Please go to APP Settings"/>
- <lanstr id="STR_DYWTDAK" value="Do you want to delete API keys"/>
- <lanstr id="STR_CONNECTING" value="Connecting"/>
- <lanstr id="STR_CONNECTION_FAIL" value="Connection fail"/>
- <lanstr id="STR_PTALORTM" value="Please try again later or replace the model"/>
- <lanstr id="STR_MOTION_DETECTION_NOTE" value="It seems that you are performing XX movement, whether to start recording"/>
- <lanstr id="STR_PE4GC" value="Please enable 4G capability"/>
- <lanstr id="STR_OBU_MESSAGE" value="OBU"/>
- <lanstr id="STR_DELETE" value="Delete"/>
-</language>
+++ /dev/null
-<language id="language" direct="ltr" languageinfo="zh">
- <lanstr id="STR_EXERCISE_OUTDOORWALKING" value="室外走路"/>
- <lanstr id="STR_EXERCISE_OUTDOORRUNNING" value="室外跑步"/>
- <lanstr id="STR_EXERCISE_OUTDOORBIKING" value="室外骑行"/>
- <lanstr id="STR_EXERCISE_GENERAL" value="一般锻炼"/>
- <lanstr id="STR_EXERCISE_FREETRAINING" value="自由训练"/>
- <lanstr id="STR_EXERCISE_RESISTANCETRAINING" value="肌力训练"/>
- <lanstr id="STR_EXERCISE_SPINBIKE" value="飞轮车/室内健身车"/>
- <lanstr id="STR_EXERCISE_TREADMILL" value="踏步机"/>
- <lanstr id="STR_EXERCISE_STROLLMACHINE" value="漫步机"/>
- <lanstr id="STR_EXERCISE_HIIT" value="HIIT/高强度间歇训练"/>
- <lanstr id="STR_EXERCISE_CROSSFIT" value="健身"/>
- <lanstr id="STR_EXERCISE_GROUPCALISTHENICS" value="团体操"/>
- <lanstr id="STR_EXERCISE_YOGA" value="瑜珈"/>
- <lanstr id="STR_EXERCISE_YOGACAT" value="瑜珈猫式"/>
- <lanstr id="STR_EXERCISE_YOGACOW" value="瑜珈牛式"/>
- <lanstr id="STR_EXERCISE_YOGACOBRA" value="瑜珈眼镜蛇式"/>
- <lanstr id="STR_EXERCISE_YOGAHERO1" value="瑜珈英雄式1"/>
- <lanstr id="STR_EXERCISE_YOGAHERO2" value="瑜珈英雄式2"/>
- <lanstr id="STR_EXERCISE_YOGAHERO3" value="瑜珈英雄式3"/>
- <lanstr id="STR_EXERCISE_YOGAROLLING" value="瑜珈滚轮"/>
- <lanstr id="STR_EXERCISE_INDOORWALKING" value="室内走路"/>
- <lanstr id="STR_EXERCISE_INDOORRUNNING" value="室内跑步"/>
- <lanstr id="STR_EXERCISE_JUMPINGROPE" value="跳绳"/>
- <lanstr id="STR_EXERCISE_PILATES" value="皮拉提斯"/>
- <lanstr id="STR_EXERCISE_CROSS_FIT" value="混合健身"/>
- <lanstr id="STR_EXERCISE_FUNCTIONALTRAINING" value="功能性训练"/>
- <lanstr id="STR_EXERCISE_PHYSICALTRAINING" value="体能训练"/>
- <lanstr id="STR_EXERCISE_TAEKWONDO" value="跆拳道/踢拳"/>
- <lanstr id="STR_EXERCISE_BOXING" value="拳击"/>
- <lanstr id="STR_EXERCISE_KICKBOXING" value="自由搏击"/>
- <lanstr id="STR_EXERCISE_KARATE" value="空手道"/>
- <lanstr id="STR_EXERCISE_FENCING" value="击剑"/>
- <lanstr id="STR_EXERCISE_CORETRAINING" value="核心训练"/>
- <lanstr id="STR_EXERCISE_BODYCOMBAT" value="拳击有氧"/>
- <lanstr id="STR_EXERCISE_KENDO" value="剑道"/>
- <lanstr id="STR_EXERCISE_HORIZONTALBAR" value="单杠"/>
- <lanstr id="STR_EXERCISE_PARALLELBARS" value="双杠"/>
- <lanstr id="STR_EXERCISE_CIRCUIT" value="循环训练"/>
- <lanstr id="STR_EXERCISE_AEROBICS" value="有氧运动"/>
- <lanstr id="STR_EXERCISE_CALISTHENICE" value="健美操"/>
- <lanstr id="STR_EXERCISE_P90X" value="P90X"/>
- <lanstr id="STR_EXERCISE_KETTLEBELLTRAINING" value="壶铃训练"/>
- <lanstr id="STR_EXERCISE_MIXEDMARTIALARTS" value="综合格斗"/>
- <lanstr id="STR_EXERCISE_STAIRCLIMBINGMACHINE" value="爬楼梯机"/>
- <lanstr id="STR_EXERCISE_WEIGHTLIFTING" value="举重"/>
- <lanstr id="STR_EXERCISE_BARRE" value="Barre"/>
- <lanstr id="STR_EXERCISE_HANDCYCLING" value="手轮"/>
- <lanstr id="STR_EXERCISE_TRACKFIELD" value="田径"/>
- <lanstr id="STR_EXERCISE_WRESTLING" value="角力"/>
- <lanstr id="STR_EXERCISE_MINDBODY" value="身心运动"/>
- <lanstr id="STR_EXERCISE_FLEXIBILITY" value="柔软操"/>
- <lanstr id="STR_EXERCISE_MIXEDCARDIO" value="混和有氧"/>
- <lanstr id="STR_EXERCISE_TRADITIONALSTRENGTHTRAINING" value="传统肌力训练"/>
- <lanstr id="STR_EXERCISE_CROSSTRAINING" value="交叉训练"/>
- <lanstr id="STR_EXERCISE_GYMNASTICS" value="体操"/>
- <lanstr id="STR_EXERCISE_STEPTRAINING" value="阶梯训练"/>
- <lanstr id="STR_EXERCISE_ELLIPTICALTRAINER" value="椭圆机"/>
- <lanstr id="STR_EXERCISE_ROWINGMACHINE" value="划船机"/>
- <lanstr id="STR_DANCING_GENERAL" value="一般舞蹈"/>
- <lanstr id="STR_DANCING_BELLY" value="肚皮舞"/>
- <lanstr id="STR_DANCING_JAZZ" value="爵士舞"/>
- <lanstr id="STR_DANCING_LATIN" value="拉丁舞"/>
- <lanstr id="STR_DANCING_BALLET" value="芭蕾"/>
- <lanstr id="STR_DANCING_STREET" value="街舞"/>
- <lanstr id="STR_DANCING_PUBLICSQUARE" value="广场舞"/>
- <lanstr id="STR_DANCING_ZUMBA" value="尊巴"/>
- <lanstr id="STR_DANCING_SOCIALDANCE" value="社交舞"/>
- <lanstr id="STR_DANCING_TAPDANCE" value="踢踏舞"/>
- <lanstr id="STR_RECREATIONAL_SPORTS" value="一般休闲运动"/>
- <lanstr id="STR_RECREATIONAL_SKATING" value="滑轮溜冰"/>
- <lanstr id="STR_RECREATIONAL_MARTIALARTS" value="武术"/>
- <lanstr id="STR_RECREATIONAL_TAICHI" value="太极拳"/>
- <lanstr id="STR_RECREATIONAL_HULAHOOP" value="呼拉圈"/>
- <lanstr id="STR_RECREATIONAL_DISCSPORT" value="飞盘"/>
- <lanstr id="STR_RECREATIONAL_DARTS" value="飞镖"/>
- <lanstr id="STR_RECREATIONAL_ARCHERY" value="射箭"/>
- <lanstr id="STR_RECREATIONAL_HORSERIDING" value="骑马"/>
- <lanstr id="STR_RECREATIONAL_BATTLEGAME" value="对战游戏"/>
- <lanstr id="STR_RECREATIONAL_KITE" value="放风筝"/>
- <lanstr id="STR_RECREATIONAL_TUGOFWAR" value="拔河"/>
- <lanstr id="STR_RECREATIONAL_SWING" value="鞦韆"/>
- <lanstr id="STR_RECREATIONAL_STAIRCLIMBING" value="爬楼梯"/>
- <lanstr id="STR_RECREATIONAL_OBSTACLERACE" value="障碍赛"/>
- <lanstr id="STR_RECREATIONAL_FISHING" value="钓鱼"/>
- <lanstr id="STR_RECREATIONAL_HUNTING" value="打猎"/>
- <lanstr id="STR_RECREATIONAL_SCOOTERRIDING" value="滑板车"/>
- <lanstr id="STR_RECREATIONAL_PARAGLIDING" value="滑翔伞"/>
- <lanstr id="STR_RECREATIONAL_TEAMSPORTS" value="团队竞技"/>
- <lanstr id="STR_RECREATIONAL_FINESSGAMING" value="健身电玩"/>
- <lanstr id="STR_RECREATIONAL_HIKING" value="健行"/>
- <lanstr id="STR_RECREATIONAL_EQUESTRIANSPORTS" value="马术运动"/>
- <lanstr id="STR_RECREATIONAL_PLAY" value="玩乐"/>
- <lanstr id="STR_BALL_GAMES" value="一般球类运动"/>
- <lanstr id="STR_BALL_BADMINTON" value="羽毛球"/>
- <lanstr id="STR_BALL_TABLETENNIS" value="乒乓球"/>
- <lanstr id="STR_BALL_TENNIS" value="网球"/>
- <lanstr id="STR_BALL_BILLIARDS" value="撞球"/>
- <lanstr id="STR_BALL_BOWLING" value="保龄球"/>
- <lanstr id="STR_BALL_VOLLEYBALL" value="排球"/>
- <lanstr id="STR_BALL_SHUTTLECOCK" value="毽子球"/>
- <lanstr id="STR_BALL_HANDBALL" value="手球"/>
- <lanstr id="STR_BALL_BASEBALL" value="棒球"/>
- <lanstr id="STR_BALL_SOFTBALL" value="垒球"/>
- <lanstr id="STR_BALL_CRICKET" value="板球"/>
- <lanstr id="STR_BALL_FOOTBALL" value="美式橄榄球"/>
- <lanstr id="STR_BALL_BEACHSOCCER" value="沙滩足球"/>
- <lanstr id="STR_BALL_BEACHVOLLEYBALL" value="沙滩排球"/>
- <lanstr id="STR_BALL_CROQUET" value="槌球"/>
- <lanstr id="STR_BALL_HOCKEY" value="曲棍球"/>
- <lanstr id="STR_BALL_SQUASH" value="英式壁球"/>
- <lanstr id="STR_BALL_SEPAKTAKRAW" value="藤球"/>
- <lanstr id="STR_BALL_DODGEBALL" value="躲避球"/>
- <lanstr id="STR_BALL_BASKETBALL" value="篮球"/>
- <lanstr id="STR_BALL_SOCCER" value="足球"/>
- <lanstr id="STR_BALL_GOLF" value="高尔夫球"/>
- <lanstr id="STR_BALL_POLO" value="马球"/>
- <lanstr id="STR_BALL_RACQUETBALL" value="美式壁球"/>
- <lanstr id="STR_BALL_RUGBY" value="英式橄榄球"/>
- <lanstr id="STR_BALL_GATEBALL" value="门球"/>
- <lanstr id="STR_BALL_PICKLEBALL" value="匹克球"/>
- <lanstr id="STR_BALL_LACROSSE" value="袋棍球"/>
- <lanstr id="STR_WATER_ACTIVITIES" value="一般水上活动"/>
- <lanstr id="STR_WATER_SAILING" value="帆船"/>
- <lanstr id="STR_WATER_SURFING" value="冲浪"/>
- <lanstr id="STR_WATER_WHITEWATERRAFTING" value="泛舟"/>
- <lanstr id="STR_WATER_CANOEING" value="划龙舟"/>
- <lanstr id="STR_WATER_KAYAKING" value="轻艇"/>
- <lanstr id="STR_WATER_ROWING" value="赛艇"/>
- <lanstr id="STR_WATER_MOTORBOAT" value="水上摩托车"/>
- <lanstr id="STR_WATER_SUP" value="立桨冲浪"/>
- <lanstr id="STR_WATER_SCUBADIVING" value="潜水"/>
- <lanstr id="STR_WATER_DIVING" value="跳水"/>
- <lanstr id="STR_WATER_KITESURFING" value="滑翔伞冲浪"/>
- <lanstr id="STR_WATER_WAKEBOARDING" value="冲浪滑水"/>
- <lanstr id="STR_WATER_POLO" value="水球"/>
- <lanstr id="STR_WATER_WINDSURFING" value="风帆冲浪"/>
- <lanstr id="STR_WATER_DRIFTING" value="漂流活动"/>
- <lanstr id="STR_WATER_FITNESS" value="水中健身"/>
- <lanstr id="STR_WATER_SPORTS" value="水上运动"/>
- <lanstr id="STR_WATER_OUTDOORSWIM" value="户外游泳"/>
- <lanstr id="STR_WATER_INDOORSWIM" value="室内游泳"/>
- <lanstr id="STR_WATER_SWIMFREESTYLE" value="游泳_自由式"/>
- <lanstr id="STR_WATER_SWIMBREASTSTROKE" value="游泳_蛙式"/>
- <lanstr id="STR_WATER_SWIMBACKSTROKE" value="游泳_仰式"/>
- <lanstr id="STR_WATER_SWIMBUTTERFLY" value="游泳_蝶式"/>
- <lanstr id="STR_ICE_SPORTS" value="一般冰上运动"/>
- <lanstr id="STR_ICE_SKATING" value="溜冰"/>
- <lanstr id="STR_ICE_HOCKEY" value="冰球"/>
- <lanstr id="STR_ICE_CURLING" value="冰石壶/冰壶"/>
- <lanstr id="STR_ICE_SNOWMOBILING" value="雪上摩托车"/>
- <lanstr id="STR_ICE_SLED" value="雪橇"/>
- <lanstr id="STR_ICE_BIATHLON" value="冬季两项"/>
- <lanstr id="STR_ICE_CROSSCOUNTRYSKING" value="越野滑雪"/>
- <lanstr id="STR_ICE_SKIING" value="滑雪"/>
- <lanstr id="STR_ICE_SNOWBOARDING" value="单板滑雪/滑雪板"/>
- <lanstr id="STR_ICE_SNOWSHOEING" value="雪鞋健行"/>
- <lanstr id="STR_ICE_SNOWSPORTS" value="雪地运动"/>
- <lanstr id="STR_EXTREME_SPORTS" value="一般极限运动"/>
- <lanstr id="STR_EXTREME_SKATEBOARDING" value="滑板"/>
- <lanstr id="STR_EXTREME_ROCKCLIMBING" value="攀岩"/>
- <lanstr id="STR_EXTREME_BUNGEEJUMPING" value="高空弹跳/蹦极活动"/>
- <lanstr id="STR_EXTREME_PARKOUR" value="跑酷"/>
- <lanstr id="STR_EXTREME_BMX" value="BMX"/>
- <lanstr id="STR_EXTREME_ORIENTEERING" value="定向越野"/>
- <lanstr id="STR_EXTREME_PARACHUTE" value="跳伞"/>
- <lanstr id="STR_EXTREME_RACING" value="赛车"/>
- <lanstr id="STR_EXTREME_TRIATHLONS" value="铁人三项运动"/>
- <lanstr id="STR_OTHER_ELEVATOR" value="乘电梯"/>
- <lanstr id="STR_OTHER_ESCALATOR" value="乘手扶梯"/>
- <lanstr id="STR_OTHER_GARDENING" value="做园艺"/>
- <lanstr id="STR_OTHER_HORSEWORK" value="做家务"/>
- <lanstr id="STR_OTHER_INVEHICLE" value="在车里"/>
- <lanstr id="STR_OTHER_MEDITATION" value="冥想"/>
- <lanstr id="STR_OTHER_STILL" value="静止"/>
- <lanstr id="STR_OTHER_TILTING" value="倾斜"/>
- <lanstr id="STR_OTHER_WHEELCHAIR" value="坐轮椅移动"/>
- <lanstr id="STR_HEART_RATE" value="心率"/>
- <lanstr id="STR_BLOOD_OXYGEN" value="血氧"/>
- <lanstr id="STR_TRAINING" value="训练"/>
- <lanstr id="STR_TRAINING_RECORD" value="训练记录"/>
- <lanstr id="STR_COMPASS" value="指南针"/>
- <lanstr id="STR_TELEPHONE" value="电话"/>
- <lanstr id="STR_FAVORITE_CONTACTS" value="常用联系人"/>
- <lanstr id="STR_WEATHER" value="天气"/>
- <lanstr id="STR_ACTIVITY" value="活动"/>
- <lanstr id="STR_WATCH_FACE" value="更换表盘"/>
- <lanstr id="STR_DISPLAY_MODE" value="显示方式"/>
- <lanstr id="STR_CARD_MANAGEMENT" value="卡片管理"/>
- <lanstr id="STR_MUSIC" value="音乐"/>
- <lanstr id="STR_SLEEP" value="睡眠"/>
- <lanstr id="STR_RECORD" value="录音"/>
- <lanstr id="STR_BREATH_TRAINING" value="呼吸训练"/>
- <lanstr id="STR_REMOTE_SHOOTING" value="遥控拍照"/>
- <lanstr id="STR_VOICE_ASSISTANT" value="语音助手"/>
- <lanstr id="STR_ALIPAY" value="支付宝"/>
- <lanstr id="STR_TIMER" value="计时器"/>
- <lanstr id="STR_ALARM" value="闹钟"/>
- <lanstr id="STR_STOPWATCH" value="秒表"/>
- <lanstr id="STR_CALCULATOR" value="计算器"/>
- <lanstr id="STR_FIND_PHONE" value="查找手机"/>
- <lanstr id="STR_BRIGHTNESS_ADJUSTMENT" value="亮度调节"/>
- <lanstr id="STR_SOUND" value="声音"/>
- <lanstr id="STR_BLUETOOTH" value="蓝牙"/>
- <lanstr id="STR_DO_NOT_DISTURB" value="勿扰模式"/>
- <lanstr id="STR_MESSAGE_NOTIFICATION" value="消息通知"/>
- <lanstr id="STR_POWER_SAVE_MODE" value="省电模式"/>
- <lanstr id="STR_FLASHLIGHT" value="手电筒"/>
- <lanstr id="STR_SETTINGS" value="设置"/>
- <lanstr id="STR_EXERCISE_LIST" value="健身类"/>
- <lanstr id="STR_BALL_LIST" value="球类"/>
- <lanstr id="STR_WATER_LIST" value="水上运动"/>
- <lanstr id="STR_DANCING_LIST" value="舞蹈类"/>
- <lanstr id="STR_EXTREME_LIST" value="极限运动"/>
- <lanstr id="STR_ICE_LIST" value="冰上运动"/>
- <lanstr id="STR_RECREATIONAL_LIST" value="休闲运动"/>
- <lanstr id="STR_OTHER_LIST" value="其他"/>
- <lanstr id="STR_DANCING_TITLE" value="舞蹈运动"/>
- <lanstr id="STR_BALL_LIST_TITLE" value="球类运动"/>
- <lanstr id="STR_OTHER_TITLE" value="其他运动"/>
- <lanstr id="STR_EXERCISE_TITLE" value="健身运动"/>
- <lanstr id="STR_RAPID_TRAINING" value="快速训练"/>
- <lanstr id="STR_SET_GOALS" value="设置目标"/>
- <lanstr id="STR_DURATION" value="时长"/>
- <lanstr id="STR_DURATION_SETTING" value="时长(分钟)"/>
- <lanstr id="STR_CALORIE" value="卡路里"/>
- <lanstr id="STR_CALORIE_SETTING" value="卡路里(千卡)"/>
- <lanstr id="STR_DISTANCE" value="距离"/>
- <lanstr id="STR_RANGE_SETTING" value="距离(公里)"/>
- <lanstr id="STR_STEP_NUMBER" value="步数"/>
- <lanstr id="STR_STEP_SETTING" value="步数(步)"/>
- <lanstr id="STR_HEART_RATE_SETTING" value="心率(次/分)"/>
- <lanstr id="STR_MEAN_HEART_RATE" value="平均心率"/>
- <lanstr id="STR_TIMES_PER_MIN" value="次/分"/>
- <lanstr id="STR_MEAN_HEART_RATE_MIN" value="平均心率(次/分)"/>
- <lanstr id="STR_LOWER_STRENGTH" value="较低强度"/>
- <lanstr id="STR_MEDIUM_STRENGTH" value="中等强度"/>
- <lanstr id="STR_HIGH_STRENGTH" value="高等强度"/>
- <lanstr id="STR_ULTRA_HIGH_STRENGTH" value="超大强度"/>
- <lanstr id="STR_TRAINING_INTENSITY" value="训练强度"/>
- <lanstr id="STR_TRAINING_IN_PROGRESS" value="训练中"/>
- <lanstr id="STR_BREAK_TRAINING" value="暂停训练"/>
- <lanstr id="STR_FINISH" value="结束"/>
- <lanstr id="STR_PAUSE" value="暂停"/>
- <lanstr id="STR_RESUME" value="继续"/>
- <lanstr id="STR_GOAL_ACHIEVED" value="目标已达成"/>
- <lanstr id="STR_ACCOMPLISH_GOAL" value="完成目标"/>
- <lanstr id="STR_OK" value="确定"/>
- <lanstr id="STR_LOOK_OUT" value="注意"/>
- <lanstr id="STR_INSUFFICIENT_EXERCISE_AMOUNT" value="当前运动量太小,无法记录"/>
- <lanstr id="STR_END_MOVEMENT" value="结束运动"/>
- <lanstr id="STR_END_THIS_MOVEMENT" value="是否结束本次运动"/>
- <lanstr id="STR_GOAL_ACCOMPLISHMENT_DEGREE" value="目标完成度"/>
- <lanstr id="STR_TRAINING_DURATION" value="训练时长"/>
- <lanstr id="STR_RANGE_MILE" value="距离(米)"/>
- <lanstr id="STR_CLOSE" value="关闭"/>
- <lanstr id="STR_MORE" value="更多"/>
- <lanstr id="STR_MORE_APP" value="更多前往APP查看"/>
- <lanstr id="STR_SAVENOTE" value="开启省电模式会关闭非必要的蓝牙连接,以及传感器监测等功能"/>
- <lanstr id="STR_SAVEBACK" value="长按屏幕3秒以上或充电可退出省电模式"/>
- <lanstr id="STR_SAVEASK" value="是否开启"/>
- <lanstr id="STR_BLOOD" value="血氧饱和度"/>
- <lanstr id="STR_CHECK" value="检测"/>
- <lanstr id="STR_CHECKNEW" value="刚刚检测"/>
- <lanstr id="STR_CHECKTIME" value="XX分钟前检测"/>
- <lanstr id="STR_CHECKLONG" value="超过1个小时前检测"/>
- <lanstr id="STR_CHECKNO" value="暂无检测记录"/>
- <lanstr id="STR_CHECKNOTE" value="偏紧佩戴,保持静止"/>
- <lanstr id="STR_CHECKON" value="正在检测"/>
- <lanstr id="STR_CHECKSTOP" value="停止检测"/>
- <lanstr id="STR_CHECKERROR" value="检测不到结果"/>
- <lanstr id="STR_WAERKEEP" value="请确认已带上手表,并保持静止"/>
- <lanstr id="STR_WEARRE" value="进行重新检测"/>
- <lanstr id="STR_WEARREADY" value="准备好后点击下方按钮"/>
- <lanstr id="STR_RECHECK" value="重新检测"/>
- <lanstr id="STR_CHECKEWARN" value="血氧提醒"/>
- <lanstr id="STR_BLOODSHORT" value="当前血氧含量已低于XX%"/>
- <lanstr id="STR_HEARTNOTE" value="请注意身体健康"/>
- <lanstr id="STR_KONW" value="知道了"/>
- <lanstr id="STR_EXPLAIN" value="说明"/>
- <lanstr id="STR_HEARTREST" value="静息"/>
- <lanstr id="STR_HEARTDATA" value="心率检测结果"/>
- <lanstr id="STR_HEARTTITLE" value="心率提醒"/>
- <lanstr id="STR_HEARTMAX" value="当前心率值高于XX"/>
- <lanstr id="STR_HEARTMIN" value="当前心率值低于XX"/>
- <lanstr id="STR_TRAINGNO" value="无记录"/>
- <lanstr id="STR_TRAINGGO" value="去训练"/>
- <lanstr id="STR_MESSAGENO" value="暂无内容"/>
- <lanstr id="STR_CLEAN" value="清除"/>
- <lanstr id="STR_CLEANALL" value="全部清除"/>
- <lanstr id="STR_SLEEP_YESTERDAY" value="昨日睡眠"/>
- <lanstr id="STR_HOUR" value="小时"/>
- <lanstr id="STR_MIN" value="分钟"/>
- <lanstr id="STR_SLEEPMGOAL" value="目标XX小时"/>
- <lanstr id="STR_REATTIME" value="作息时间"/>
- <lanstr id="STR_SLEEPTIME" value="入睡时间"/>
- <lanstr id="STR_WALKTIME" value="醒来时间"/>
- <lanstr id="STR_APPMORE" value="更多详情请前往手机APP查看"/>
- <lanstr id="STR_DISTURB" value="手表将在20分钟后开启勿扰模式,关闭请到控制中心"/>
- <lanstr id="STR_DISTURBNOTE" value="已开启勿扰模式,此模式下手表将不会发出震动与铃声"/>
- <lanstr id="STR_MORNNING" value="早安"/>
- <lanstr id="STR_NOW" value="当前"/>
- <lanstr id="STR_NAP" value="小睡(5分钟)"/>
- <lanstr id="STR_TACK" value="请先打开app,进入“设备”-“拍照”"/>
- <lanstr id="STR_CLICK" value="点击拍照"/>
- <lanstr id="STR_TACKNUM" value="已拍摄XX张"/>
- <lanstr id="STR_SCREEN_AND_BRIGHTNESS" value="屏幕与亮度"/>
- <lanstr id="STR_NETWORKANDCALL" value="网络与通话"/>
- <lanstr id="STR_SOUND_AND_VIBRATION" value="声音与震动"/>
- <lanstr id="STR_MOTION_RECOGNITION" value="运动识别"/>
- <lanstr id="STR_SYSTEM" value="系统"/>
- <lanstr id="STR_SHUTDOWN_AND_RESTART" value="关机和重启"/>
- <lanstr id="STR_SCREEN_ON_DURATION" value="亮屏时长"/>
- <lanstr id="STR_RAISE_TO_WAKE" value="抬腕亮屏"/>
- <lanstr id="STR_5_SECONDS" value="5秒"/>
- <lanstr id="STR_10_SECONDS" value="10秒"/>
- <lanstr id="STR_15_SECONDS" value="15秒"/>
- <lanstr id="STR_30_SECONDS" value="30秒"/>
- <lanstr id="STR_60_SECONDS" value="60秒"/>
- <lanstr id="STR_300_SECONDS" value="300秒"/>
- <lanstr id="STR_4G_CAPABILITY" value="4G能力"/>
- <lanstr id="STR_VOLTE_CALL" value="VoLTE 通话"/>
- <lanstr id="STR_MOBILE_DATA_OPTION" value="移动数据选项"/>
- <lanstr id="STR_SYSTEM_UPDATE" value="系统更新"/>
- <lanstr id="STR_ONLINE_MUSIC" value="在线音乐"/>
- <lanstr id="STR_BLUETOOTH_HEADPHONES" value="蓝牙耳机"/>
- <lanstr id="STR_TRADITIONAL_BLUETOOTH" value="传统蓝牙"/>
- <lanstr id="STR_AUTO_OFF_BLUETOOTH_NOTE" value="注:开启后10分钟没连接成功会自动关闭,因为传统蓝牙长时间打开会增加电耗,建议在有需要的时候使用(该功能主要用于电话拨打/通知、音乐控制/传输等)"/>
- <lanstr id="STR_BLUETOOTH_SERVICE_OPTIONS" value="蓝牙服务选项"/>
- <lanstr id="STR_HFP" value="通话蓝牙"/>
- <lanstr id="STR_A2DP" value="媒体蓝牙"/>
- <lanstr id="STR_SYSTEM_VOLUME" value="系统音量"/>
- <lanstr id="STR_MEDIA_VOLUME" value="媒体音量"/>
- <lanstr id="STR_CALL_VOLUME" value="通话音量"/>
- <lanstr id="STR_VIBRATION_MODE" value="震动模式"/>
- <lanstr id="STR_SILENT_MODE" value="静音模式"/>
- <lanstr id="STR_LIST_DISPLAY" value="列表显示"/>
- <lanstr id="STR_GRID_DISPLAY" value="网格显示"/>
- <lanstr id="STR_CELLULAR_DISPLAY" value="蜂窝显示"/>
- <lanstr id="STR_AUTO_DETECT" value="自动识别"/>
- <lanstr id="STR_ABOUT_WATCH" value="关于手表"/>
- <lanstr id="STR_WATCH_QR_CODE" value="手表二维码"/>
- <lanstr id="STR_SYSTEM_LANGUAGE" value="系统语言"/>
- <lanstr id="STR_RESTART" value="重启"/>
- <lanstr id="STR_SHUTDOWN" value="关机"/>
- <lanstr id="STR_FACTORY_RESET" value="恢复出厂"/>
- <lanstr id="STR_WATCH_NAME" value="手表名称"/>
- <lanstr id="STR_FIRMWARE_VERSION" value="固件版本"/>
- <lanstr id="STR_BLUETOOTH_NAME" value="蓝牙名称"/>
- <lanstr id="STR_BLUETOOTH_ADDRESS" value="蓝牙地址"/>
- <lanstr id="STR_UPDATENOW" value="立即更新"/>
- <lanstr id="STR_LATEST_VERSION" value="最新版本"/>
- <lanstr id="STR_LATER" value="稍后再说"/>
- <lanstr id="STR_UP_TO_DATE" value="当前已升级到最新版本"/>
- <lanstr id="STR_NO_UPDATE" value="暂无更新"/>
- <lanstr id="STR_LANGUAGE_SELECTION" value="语言选择"/>
- <lanstr id="STR_RESET_CONFIRM" value="是否确定重新启动?"/>
- <lanstr id="STR_SHUTDOWN_CONFIRM" value="是否确定关机?"/>
- <lanstr id="STR_RESET_CONFIRM_NOTE" value="该操作会清空并重置手表数据,是否确认继续?"/>
- <lanstr id="STR_RECORDER" value="录音机"/>
- <lanstr id="STR_CLICK_TO_RECORD" value="点击开始录音"/>
- <lanstr id="STR_RECORDING" value="录音中"/>
- <lanstr id="STR_AUDIO_XX" value="录音XX"/>
- <lanstr id="STR_VOICE_RECORDING_REMINDER" value="录音提醒"/>
- <lanstr id="STR_VOICE_RECORDING_REMINDER_NOTE" value="录音数量不得超过30首,请删除已有录音"/>
- <lanstr id="STR_DELETE_RECORDING" value="删除录音"/>
- <lanstr id="STR_DELETE_PERMANENTLY" value="是否永久删除"/>
- <lanstr id="STR_RECORDING_LIST" value="录音列表"/>
- <lanstr id="STR_CRLEMPTY" value="当前录音列表为空"/>
- <lanstr id="STR_DO_NOT_DISTURB_MODE" value="开启勿扰模式,手表将不会发出震动与铃声,是否开启"/>
- <lanstr id="STR_CONNECTION_STATUS" value="连接状态"/>
- <lanstr id="STR_PHONE" value="手机"/>
- <lanstr id="STR_HEADSET" value="耳机"/>
- <lanstr id="STR_CONNECTED" value="已连接"/>
- <lanstr id="STR_DISCONNECTED" value="未连接"/>
- <lanstr id="STR_PHONE_RINGING_VIBRATING" value="手机正在响铃/震动"/>
- <lanstr id="STR_BLUETOOTH_DISCONNECTED" value="蓝牙未连接"/>
- <lanstr id="STR_STOP" value="停止"/>
- <lanstr id="STR_WORKDAY" value="工作日"/>
- <lanstr id="STR_REPEAT_NO" value="不重复"/>
- <lanstr id="STR_EVERYDAY" value="每日"/>
- <lanstr id="STR_ADD_A_NEW_ALARM" value="添加新闹钟"/>
- <lanstr id="STR_TIME" value="时间"/>
- <lanstr id="STR_NEXT_STEP" value="下一步"/>
- <lanstr id="STR_MON" value="一"/>
- <lanstr id="STR_TUES" value="二"/>
- <lanstr id="STR_WEDNES" value="三"/>
- <lanstr id="STR_THURS" value="四"/>
- <lanstr id="STR_FRI" value="五"/>
- <lanstr id="STR_SATUR" value="六"/>
- <lanstr id="STR_SUN" value="日"/>
- <lanstr id="STR_MONDAY" value="星期一"/>
- <lanstr id="STR_TUESDAY" value="星期二"/>
- <lanstr id="STR_WEDNESDAY" value="星期三"/>
- <lanstr id="STR_THURSDAY" value="星期四"/>
- <lanstr id="STR_FRIDAY" value="星期五"/>
- <lanstr id="STR_SATURDAY" value="星期六"/>
- <lanstr id="STR_SUNDAY" value="星期日"/>
- <lanstr id="STR_CALIBRATE_COMPASS" value="校准指南针"/>
- <lanstr id="STR_CALIBRATE_COMPASS_NOTE" value="请远离干扰源,按图示旋转手表进行校准"/>
- <lanstr id="STR_EAST" value="东"/>
- <lanstr id="STR_SOUTH" value="南"/>
- <lanstr id="STR_WEST" value="西"/>
- <lanstr id="STR_NORTH" value="北"/>
- <lanstr id="STR_SOUTHEAST" value="东南"/>
- <lanstr id="STR_SOUTHWEST" value="西南"/>
- <lanstr id="STR_NORTHEAST" value="东北"/>
- <lanstr id="STR_NORTHWEST" value="西北"/>
- <lanstr id="STR_KEEP_STILL_FOCUS_ON_BREATHING" value="保持不动,将注意力集中在呼吸上"/>
- <lanstr id="STR_EXHALE_NOW" value="现在呼气"/>
- <lanstr id="STR_INHALE_NOW" value="现在吸气"/>
- <lanstr id="STR_TRAINING_COMPLETE" value="训练完成"/>
- <lanstr id="STR_THIS_BREATH" value="本次呼吸"/>
- <lanstr id="STR_TODAYS_BREATHING_TRAINING" value="今日呼吸训练"/>
- <lanstr id="STR_RECENT_CALLS" value="最近通话"/>
- <lanstr id="STR_NO_CALLS" value="暂无通话"/>
- <lanstr id="STR_MISSED_CALLS" value="未接来电"/>
- <lanstr id="STR_DIALED_CALLS" value="拨出电话"/>
- <lanstr id="STR_RECEIVED_CALLS" value="拨入电话"/>
- <lanstr id="STR_NOTE_RECENT_CALLS_LIMITATION" value="注:只保留最近20条通话记录"/>
- <lanstr id="STR_NO_CONTACTS_ADDED" value="尚未添加联系人,请前往APP进行设置"/>
- <lanstr id="STR_DIAL_MODE" value="拨号方式"/>
- <lanstr id="STR_DIAL_VIA_WATCH_SIM" value="通过手表SIM卡拨号"/>
- <lanstr id="STR_DIAL_VIA_PHONE" value="通过手机拨号"/>
- <lanstr id="STR_KUMI_TECHNOLOGY" value="库密科技"/>
- <lanstr id="STR_CALLING" value="拨号中"/>
- <lanstr id="STR_NOT_PAIRED" value="未配对"/>
- <lanstr id="STR_PAIRED" value="已配对"/>
- <lanstr id="STR_UNPAIR" value="取消配对"/>
- <lanstr id="STR_CONNECTION_ERROR" value="连接异常"/>
- <lanstr id="STR_INSERT_WATCH_SIM_OR_CONNECT_PHONE" value="请插入手表SIM卡或连接手机并确认开启蓝牙通话后再进行拨号"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL" value="开启蓝牙通话"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL_NOTE_IPHONE" value="解决方法:1.苹果手机 请前往手机“设置”→“蓝牙”列表找到“KUMI_XX”并点击后重试"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL_NOTE_ANDRODIR" value="2.安卓手机 请前往手机“设置”→“蓝牙”列表找到 “KUMI_XX”"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_CALL_NOTE" value="点击右侧图标进入蓝牙设置"/>
- <lanstr id="STR_SIM_CARD_ERROR" value="Sim卡异常"/>
- <lanstr id="STR_CHECK_SIM_CARD_INSERTION" value="SIM卡拨号异常,请检查手表SIM卡是否正确插入"/>
- <lanstr id="STR_WEATHER_REPORT" value="气象报告"/>
- <lanstr id="STR_ULTRAVIOLET" value="紫外线"/>
- <lanstr id="STR_WIND_SPEED" value="风速"/>
- <lanstr id="STR_HUMIDITY" value="湿度"/>
- <lanstr id="STR_NEXT_7_DAYS" value="未来七天"/>
- <lanstr id="STR_GET_WEATHER_ERROR" value="未获取到天气信息请前往APP更新"/>
- <lanstr id="STR_MUSIC_SOURCE" value="音乐来源"/>
- <lanstr id="STR_MOBILE_MUSIC" value="手机音乐"/>
- <lanstr id="STR_WATCH_MUSIC" value="手表音乐"/>
- <lanstr id="STR_MUSIC_LIST" value="音乐列表"/>
- <lanstr id="STR_BLUETOOTH_CONNECTION_FAILED" value="蓝牙连接失败"/>
- <lanstr id="STR_SCANNING_BINDING" value="扫码绑定"/>
- <lanstr id="STR_DEVICE_BINDING" value="设备绑定"/>
- <lanstr id="STR_DEVICE_BINDING_NOTE" value="XX想要与你进行连接绑定"/>
- <lanstr id="STR_EQUIPMENT_UNTYING" value="设备解绑"/>
- <lanstr id="STR_EQUIPMENT_UNTYING_NOTE" value="XX想要与你进行解绑"/>
- <lanstr id="STR_DRINK_WATER_REMINDER" value="喝水提醒"/>
- <lanstr id="STR_DRINK_WATER_REMINDER_NOTE" value="该喝水啦!记得按时保持水分充足"/>
- <lanstr id="STR_SEDENTARY_REMINDER" value="久坐提醒"/>
- <lanstr id="STR_SEDENTARY_REMINDER_NOTE" value="你已经XX小时未活动了,站起来活动一下吧。"/>
- <lanstr id="STR_SYSTEM_UPGRADING" value="系统升级中"/>
- <lanstr id="STR_NEWDEVICE_BIND_REMIND_NOTE" value="当前设备已经与XX绑定继续连接操作会解除绑定并将手表恢复出厂设置(会清空手表数据)是否继续此操作"/>
- <lanstr id="STR_AI_VOICE" value="AI Voice"/>
- <lanstr id="STR_AI_INTELLIGENT_ASSISTANT" value="AI智能助手"/>
- <lanstr id="STR_START_CHAT" value="开始对话"/>
- <lanstr id="STR_BOOT_FAILED" value="启动失败"/>
- <lanstr id="STR_ENABLE_MOBILE_DATA_FIRST" value="请先开启移动数据"/>
- <lanstr id="STR_ENABLE_BLUETOOTH_FIRST" value="请先开启蓝牙"/>
- <lanstr id="STR_LISTENING" value="正在聆听..."/>
- <lanstr id="STR_FINISH_SPEAKING" value="说话完毕"/>
- <lanstr id="STR_THINKING" value="正在思考..."/>
- <lanstr id="STR_CANCEL" value="取消"/>
- <lanstr id="STR_CONNECT_TIMEOUT" value="连接超时"/>
- <lanstr id="STR_PLEASE_RESTART_CHAT" value="请重新开始对话"/>
- <lanstr id="STR_CONTINUE_CHAT" value="继续对话"/>
- <lanstr id="STR_AIMODELS_DOUBAO" value="豆包"/>
- <lanstr id="STR_AIMODES_WENXINYIYAN" value="文心一言"/>
- <lanstr id="STR_AIMODES_KIMI" value="KIMI"/>
- <lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
- <lanstr id="STR_SLIDE_TO_SHUTDOWN" value="滑动关机 >>"/>
- <lanstr id="STR_SLIDE_TO_REBOOT" value="滑动重启 >>"/>
- <lanstr id="STR_AI_FAMILY_MEALS" value="AI 全家桶"/>
- <lanstr id="STR_CHAT" value="对话"/>
- <lanstr id="STR_PCY4GC_OR_AS" value="请检查4G连接或APP设置"/>
- <lanstr id="STR_API_KEYS" value="API keys"/>
- <lanstr id="STR_PGTTAF" value="请先前往APP"/>
- <lanstr id="STR_DAFBS" value="“设备”-“AI全家桶”设置"/>
- <lanstr id="STR_OPENAI_API_KEYS" value="OpenAI API keys"/>
- <lanstr id="STR_KHBB" value="已绑定API keys"/>
- <lanstr id="STR_GTAS" value="更换请前往APP设置"/>
- <lanstr id="STR_DYWTDAK" value="是否确认删除API keys"/>
- <lanstr id="STR_CONNECTING" value="正在连接"/>
- <lanstr id="STR_CONNECTION_FAIL" value="连接失败"/>
- <lanstr id="STR_PTALORTM" value="请稍后再重试或更换模型"/>
- <lanstr id="STR_MOTION_DETECTION_NOTE" value="检测到您好像在进行XX运动,是否开始记录"/>
- <lanstr id="STR_PE4GC" value="请开启4G能力"/>
- <lanstr id="STR_OBU_MESSAGE" value="OBU"/>
- <lanstr id="STR_DELETE" value="删除"/>
-</language>
+++ /dev/null
-import xml.dom.minidom
-
-# 从外部文件读取列表数据,使用特殊分隔符
-def read_list_from_file(file_path, delimiter):
- with open(file_path, "r", encoding="utf-8") as f:
- lines = f.readlines()
- input_list = [line.strip().split(delimiter) for line in lines]
- return input_list
-
-# 生成 XML 文件,使用特殊分隔符
-def generate_xml_from_list(input_list, output_file, lang, delimiter):
- dom = xml.dom.minidom.getDOMImplementation().createDocument(None, "language", None)
- root = dom.documentElement
- root.setAttribute("id", "language")
- root.setAttribute("direct", "ltr")
- root.setAttribute("languageinfo", lang)
-
- for item in input_list:
- key = item[0]
- value = item[1]
-
- lanstr_element = dom.createElement("lanstr")
- lanstr_element.setAttribute("id", key)
- lanstr_element.setAttribute("value", value)
- root.appendChild(lanstr_element)
-
- with open(output_file, "w", encoding="utf-8") as f:
- f.write(root.toprettyxml())
-
-
-# 从外部文件读取不同语言的列表数据,使用特殊分隔符
-input_list_en = read_list_from_file("./input_list_en.txt", "$")
-input_list_zh = read_list_from_file("./input_list_zh.txt", "$")
-#input_list_ja = read_list_from_file("./input_list_ja.txt", "$")
-#input_list_de = read_list_from_file("./input_list_de.txt", "$")
-
-
-# 生成不同语言的 XML 文件,使用特殊分隔符
-generate_xml_from_list(input_list_en, "./language_en.xml", "en", "$")
-generate_xml_from_list(input_list_zh, "./language_zh.xml", "zh", "$")
-#generate_xml_from_list(input_list_ja, "./language_ja.xml", "ja", "$")
-#generate_xml_from_list(input_list_de, "./language_de.xml", "de", "$")
-
-print("XML文件生成完成。")
+++ /dev/null
-## 根元素\r
-\r
-XML 必须以 language 为根元素并支持以下属性,\r
-language 元素中的属性对所有的子元素都生效,并且作为子元素的默认值,\r
-如果子元素有定义相同的属性,以子元素设置的生效。 \r
-\r
-**表3-3 多语言 xml 配置**\r
-\r
-| 属性名 | 描述 | 取值 | 必选 |\r
-| ------------ | ------------------------------------------------------------ | :---------------------------------------------- | :--: |\r
-| languageinfo | 语言信息,使用语言代码 (ISO 639)标识语言 | ISO 639 标准定义的语言代码 | Y |\r
-| direct | 文本方向布局 | ltr(left to right) rtl (right to left) | N |\r
-| fontName | 设置矢量字库名,路径需要 在 graphic_config.h 中配置 宏 VECTOR_FONT_DIR。 | ttf 文件名 | N |\r
-\r
-例如:\r
-\r
-```c++\r
-<language\r
- id="language"\r
- direct="ltf"\r
- languageinfo="zh">\r
- <lanstr\r
- ....\r
- />\r
-</language>\r
-```\r
-\r
-\r
-\r
-## 字符串元素 \r
-\r
-字符串元素以 lanstr 为命名,定义字符串的相关信息,包括字符串取值、文本大小、 字库名等信息。\r
-\r
-如果根元素也定义的相同的属性,会以字符串元素中定义的值为准,\r
-\r
- 如果都没有定义,取 UIKit 中设置的默认值。\r
-\r
-\r
-\r
- **表3-4 字符串元素配置** \r
-\r
-| 属性名 | 描述 | 取值 | 必选 |\r
-| -------- | ------------------------------------------------------------ | ----------------------------------------------- | ---- |\r
-| id | 字符串唯一标识,需要保证唯一性 | 统一以 STR_ 为前缀 是 value 字符串内容 | Y |\r
-| value | 字符串内容 | 任意字符串 | Y |\r
-| direct | 文本方向布局 | ltr(left to right) rtl (right to left) | N |\r
-| size | 文本大小,如果同时有在代码中通 过接口 SetFont 进行设置,会按照 和 SetText 以及 ForceResetText 先 后顺序为准 | 0~255 | N |\r
-| fontName | 设置矢量字库名,路径需要在 graphic_config.h 中配置宏 VECTOR_FONT_DIR。如果同时有 在代码中通过接口 SetFont 进行设 置,会按照和 SetText 以及 ForceResetText 先后顺序为准 | ttf 文件名 | N |\r
-\r
-例如:\r
-\r
-```c++\r
-<lanstr\r
- id="STR_IMAGE"\r
- value="Image"\r
- size="21"\r
- direct="rtl"\r
-/>\r
-```\r
-\r
+++ /dev/null
-/*
-* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved.
-* Description: language
-* Author: Graphic develop team
-* Create: 2021-07-06
-*/
-
-#ifndef UI_RESOURCE_STRING_H
-#define UI_RESOURCE_STRING_H
-#include <cstdint>
-namespace OHOS {
-enum UIResourceTextId : uint16_t {
- STR_EXERCISE_OUTDOORWALKING = 0,\r
- STR_EXERCISE_OUTDOORRUNNING = 1,\r
- STR_EXERCISE_OUTDOORBIKING = 2,\r
- STR_EXERCISE_GENERAL = 3,\r
- STR_EXERCISE_FREETRAINING = 4,\r
- STR_EXERCISE_RESISTANCETRAINING = 5,\r
- STR_EXERCISE_SPINBIKE = 6,\r
- STR_EXERCISE_TREADMILL = 7,\r
- STR_EXERCISE_STROLLMACHINE = 8,\r
- STR_EXERCISE_HIIT = 9,\r
- STR_EXERCISE_CROSSFIT = 10,\r
- STR_EXERCISE_GROUPCALISTHENICS = 11,\r
- STR_EXERCISE_YOGA = 12,\r
- STR_EXERCISE_YOGACAT = 13,\r
- STR_EXERCISE_YOGACOW = 14,\r
- STR_EXERCISE_YOGACOBRA = 15,\r
- STR_EXERCISE_YOGAHERO1 = 16,\r
- STR_EXERCISE_YOGAHERO2 = 17,\r
- STR_EXERCISE_YOGAHERO3 = 18,\r
- STR_EXERCISE_YOGAROLLING = 19,\r
- STR_EXERCISE_INDOORWALKING = 20,\r
- STR_EXERCISE_INDOORRUNNING = 21,\r
- STR_EXERCISE_JUMPINGROPE = 22,\r
- STR_EXERCISE_PILATES = 23,\r
- STR_EXERCISE_CROSS_FIT = 24,\r
- STR_EXERCISE_FUNCTIONALTRAINING = 25,\r
- STR_EXERCISE_PHYSICALTRAINING = 26,\r
- STR_EXERCISE_TAEKWONDO = 27,\r
- STR_EXERCISE_BOXING = 28,\r
- STR_EXERCISE_KICKBOXING = 29,\r
- STR_EXERCISE_KARATE = 30,\r
- STR_EXERCISE_FENCING = 31,\r
- STR_EXERCISE_CORETRAINING = 32,\r
- STR_EXERCISE_BODYCOMBAT = 33,\r
- STR_EXERCISE_KENDO = 34,\r
- STR_EXERCISE_HORIZONTALBAR = 35,\r
- STR_EXERCISE_PARALLELBARS = 36,\r
- STR_EXERCISE_CIRCUIT = 37,\r
- STR_EXERCISE_AEROBICS = 38,\r
- STR_EXERCISE_CALISTHENICE = 39,\r
- STR_EXERCISE_P90X = 40,\r
- STR_EXERCISE_KETTLEBELLTRAINING = 41,\r
- STR_EXERCISE_MIXEDMARTIALARTS = 42,\r
- STR_EXERCISE_STAIRCLIMBINGMACHINE = 43,\r
- STR_EXERCISE_WEIGHTLIFTING = 44,\r
- STR_EXERCISE_BARRE = 45,\r
- STR_EXERCISE_HANDCYCLING = 46,\r
- STR_EXERCISE_TRACKFIELD = 47,\r
- STR_EXERCISE_WRESTLING = 48,\r
- STR_EXERCISE_MINDBODY = 49,\r
- STR_EXERCISE_FLEXIBILITY = 50,\r
- STR_EXERCISE_MIXEDCARDIO = 51,\r
- STR_EXERCISE_TRADITIONALSTRENGTHTRAINING = 52,\r
- STR_EXERCISE_CROSSTRAINING = 53,\r
- STR_EXERCISE_GYMNASTICS = 54,\r
- STR_EXERCISE_STEPTRAINING = 55,\r
- STR_EXERCISE_ELLIPTICALTRAINER = 56,\r
- STR_EXERCISE_ROWINGMACHINE = 57,\r
- STR_DANCING_GENERAL = 58,\r
- STR_DANCING_BELLY = 59,\r
- STR_DANCING_JAZZ = 60,\r
- STR_DANCING_LATIN = 61,\r
- STR_DANCING_BALLET = 62,\r
- STR_DANCING_STREET = 63,\r
- STR_DANCING_PUBLICSQUARE = 64,\r
- STR_DANCING_ZUMBA = 65,\r
- STR_DANCING_SOCIALDANCE = 66,\r
- STR_DANCING_TAPDANCE = 67,\r
- STR_RECREATIONAL_SPORTS = 68,\r
- STR_RECREATIONAL_SKATING = 69,\r
- STR_RECREATIONAL_MARTIALARTS = 70,\r
- STR_RECREATIONAL_TAICHI = 71,\r
- STR_RECREATIONAL_HULAHOOP = 72,\r
- STR_RECREATIONAL_DISCSPORT = 73,\r
- STR_RECREATIONAL_DARTS = 74,\r
- STR_RECREATIONAL_ARCHERY = 75,\r
- STR_RECREATIONAL_HORSERIDING = 76,\r
- STR_RECREATIONAL_BATTLEGAME = 77,\r
- STR_RECREATIONAL_KITE = 78,\r
- STR_RECREATIONAL_TUGOFWAR = 79,\r
- STR_RECREATIONAL_SWING = 80,\r
- STR_RECREATIONAL_STAIRCLIMBING = 81,\r
- STR_RECREATIONAL_OBSTACLERACE = 82,\r
- STR_RECREATIONAL_FISHING = 83,\r
- STR_RECREATIONAL_HUNTING = 84,\r
- STR_RECREATIONAL_SCOOTERRIDING = 85,\r
- STR_RECREATIONAL_PARAGLIDING = 86,\r
- STR_RECREATIONAL_TEAMSPORTS = 87,\r
- STR_RECREATIONAL_FINESSGAMING = 88,\r
- STR_RECREATIONAL_HIKING = 89,\r
- STR_RECREATIONAL_EQUESTRIANSPORTS = 90,\r
- STR_RECREATIONAL_PLAY = 91,\r
- STR_BALL_GAMES = 92,\r
- STR_BALL_BADMINTON = 93,\r
- STR_BALL_TABLETENNIS = 94,\r
- STR_BALL_TENNIS = 95,\r
- STR_BALL_BILLIARDS = 96,\r
- STR_BALL_BOWLING = 97,\r
- STR_BALL_VOLLEYBALL = 98,\r
- STR_BALL_SHUTTLECOCK = 99,\r
- STR_BALL_HANDBALL = 100,\r
- STR_BALL_BASEBALL = 101,\r
- STR_BALL_SOFTBALL = 102,\r
- STR_BALL_CRICKET = 103,\r
- STR_BALL_FOOTBALL = 104,\r
- STR_BALL_BEACHSOCCER = 105,\r
- STR_BALL_BEACHVOLLEYBALL = 106,\r
- STR_BALL_CROQUET = 107,\r
- STR_BALL_HOCKEY = 108,\r
- STR_BALL_SQUASH = 109,\r
- STR_BALL_SEPAKTAKRAW = 110,\r
- STR_BALL_DODGEBALL = 111,\r
- STR_BALL_BASKETBALL = 112,\r
- STR_BALL_SOCCER = 113,\r
- STR_BALL_GOLF = 114,\r
- STR_BALL_POLO = 115,\r
- STR_BALL_RACQUETBALL = 116,\r
- STR_BALL_RUGBY = 117,\r
- STR_BALL_GATEBALL = 118,\r
- STR_BALL_PICKLEBALL = 119,\r
- STR_BALL_LACROSSE = 120,\r
- STR_WATER_ACTIVITIES = 121,\r
- STR_WATER_SAILING = 122,\r
- STR_WATER_SURFING = 123,\r
- STR_WATER_WHITEWATERRAFTING = 124,\r
- STR_WATER_CANOEING = 125,\r
- STR_WATER_KAYAKING = 126,\r
- STR_WATER_ROWING = 127,\r
- STR_WATER_MOTORBOAT = 128,\r
- STR_WATER_SUP = 129,\r
- STR_WATER_SCUBADIVING = 130,\r
- STR_WATER_DIVING = 131,\r
- STR_WATER_KITESURFING = 132,\r
- STR_WATER_WAKEBOARDING = 133,\r
- STR_WATER_POLO = 134,\r
- STR_WATER_WINDSURFING = 135,\r
- STR_WATER_DRIFTING = 136,\r
- STR_WATER_FITNESS = 137,\r
- STR_WATER_SPORTS = 138,\r
- STR_WATER_OUTDOORSWIM = 139,\r
- STR_WATER_INDOORSWIM = 140,\r
- STR_WATER_SWIMFREESTYLE = 141,\r
- STR_WATER_SWIMBREASTSTROKE = 142,\r
- STR_WATER_SWIMBACKSTROKE = 143,\r
- STR_WATER_SWIMBUTTERFLY = 144,\r
- STR_ICE_SPORTS = 145,\r
- STR_ICE_SKATING = 146,\r
- STR_ICE_HOCKEY = 147,\r
- STR_ICE_CURLING = 148,\r
- STR_ICE_SNOWMOBILING = 149,\r
- STR_ICE_SLED = 150,\r
- STR_ICE_BIATHLON = 151,\r
- STR_ICE_CROSSCOUNTRYSKING = 152,\r
- STR_ICE_SKIING = 153,\r
- STR_ICE_SNOWBOARDING = 154,\r
- STR_ICE_SNOWSHOEING = 155,\r
- STR_ICE_SNOWSPORTS = 156,\r
- STR_EXTREME_SPORTS = 157,\r
- STR_EXTREME_SKATEBOARDING = 158,\r
- STR_EXTREME_ROCKCLIMBING = 159,\r
- STR_EXTREME_BUNGEEJUMPING = 160,\r
- STR_EXTREME_PARKOUR = 161,\r
- STR_EXTREME_BMX = 162,\r
- STR_EXTREME_ORIENTEERING = 163,\r
- STR_EXTREME_PARACHUTE = 164,\r
- STR_EXTREME_RACING = 165,\r
- STR_EXTREME_TRIATHLONS = 166,\r
- STR_OTHER_ELEVATOR = 167,\r
- STR_OTHER_ESCALATOR = 168,\r
- STR_OTHER_GARDENING = 169,\r
- STR_OTHER_HORSEWORK = 170,\r
- STR_OTHER_INVEHICLE = 171,\r
- STR_OTHER_MEDITATION = 172,\r
- STR_OTHER_STILL = 173,\r
- STR_OTHER_TILTING = 174,\r
- STR_OTHER_WHEELCHAIR = 175,\r
- STR_HEART_RATE = 176,\r
- STR_BLOOD_OXYGEN = 177,\r
- STR_TRAINING = 178,\r
- STR_TRAINING_RECORD = 179,\r
- STR_COMPASS = 180,\r
- STR_TELEPHONE = 181,\r
- STR_FAVORITE_CONTACTS = 182,\r
- STR_WEATHER = 183,\r
- STR_ACTIVITY = 184,\r
- STR_WATCH_FACE = 185,\r
- STR_DISPLAY_MODE = 186,\r
- STR_CARD_MANAGEMENT = 187,\r
- STR_MUSIC = 188,\r
- STR_SLEEP = 189,\r
- STR_RECORD = 190,\r
- STR_BREATH_TRAINING = 191,\r
- STR_REMOTE_SHOOTING = 192,\r
- STR_VOICE_ASSISTANT = 193,\r
- STR_ALIPAY = 194,\r
- STR_TIMER = 195,\r
- STR_ALARM = 196,\r
- STR_STOPWATCH = 197,\r
- STR_CALCULATOR = 198,\r
- STR_FIND_PHONE = 199,\r
- STR_BRIGHTNESS_ADJUSTMENT = 200,\r
- STR_SOUND = 201,\r
- STR_BLUETOOTH = 202,\r
- STR_DO_NOT_DISTURB = 203,\r
- STR_MESSAGE_NOTIFICATION = 204,\r
- STR_POWER_SAVE_MODE = 205,\r
- STR_FLASHLIGHT = 206,\r
- STR_SETTINGS = 207,\r
- STR_EXERCISE_LIST = 208,\r
- STR_BALL_LIST = 209,\r
- STR_WATER_LIST = 210,\r
- STR_DANCING_LIST = 211,\r
- STR_EXTREME_LIST = 212,\r
- STR_ICE_LIST = 213,\r
- STR_RECREATIONAL_LIST = 214,\r
- STR_OTHER_LIST = 215,\r
- STR_DANCING_TITLE = 216,\r
- STR_BALL_LIST_TITLE = 217,\r
- STR_OTHER_TITLE = 218,\r
- STR_EXERCISE_TITLE = 219,\r
- STR_RAPID_TRAINING = 220,\r
- STR_SET_GOALS = 221,\r
- STR_DURATION = 222,\r
- STR_DURATION_SETTING = 223,\r
- STR_CALORIE = 224,\r
- STR_CALORIE_SETTING = 225,\r
- STR_DISTANCE = 226,\r
- STR_RANGE_SETTING = 227,\r
- STR_STEP_NUMBER = 228,\r
- STR_STEP_SETTING = 229,\r
- STR_HEART_RATE_SETTING = 230,\r
- STR_MEAN_HEART_RATE = 231,\r
- STR_TIMES_PER_MIN = 232,\r
- STR_MEAN_HEART_RATE_MIN = 233,\r
- STR_LOWER_STRENGTH = 234,\r
- STR_MEDIUM_STRENGTH = 235,\r
- STR_HIGH_STRENGTH = 236,\r
- STR_ULTRA_HIGH_STRENGTH = 237,\r
- STR_TRAINING_INTENSITY = 238,\r
- STR_TRAINING_IN_PROGRESS = 239,\r
- STR_BREAK_TRAINING = 240,\r
- STR_FINISH = 241,\r
- STR_PAUSE = 242,\r
- STR_RESUME = 243,\r
- STR_GOAL_ACHIEVED = 244,\r
- STR_ACCOMPLISH_GOAL = 245,\r
- STR_OK = 246,\r
- STR_LOOK_OUT = 247,\r
- STR_INSUFFICIENT_EXERCISE_AMOUNT = 248,\r
- STR_END_MOVEMENT = 249,\r
- STR_END_THIS_MOVEMENT = 250,\r
- STR_GOAL_ACCOMPLISHMENT_DEGREE = 251,\r
- STR_TRAINING_DURATION = 252,\r
- STR_RANGE_MILE = 253,\r
- STR_CLOSE = 254,\r
- STR_MORE = 255,\r
- STR_MORE_APP = 256,\r
- STR_SAVENOTE = 257,\r
- STR_SAVEBACK = 258,\r
- STR_SAVEASK = 259,\r
- STR_BLOOD = 260,\r
- STR_CHECK = 261,\r
- STR_CHECKNEW = 262,\r
- STR_CHECKTIME = 263,\r
- STR_CHECKLONG = 264,\r
- STR_CHECKNO = 265,\r
- STR_CHECKNOTE = 266,\r
- STR_CHECKON = 267,\r
- STR_CHECKSTOP = 268,\r
- STR_CHECKERROR = 269,\r
- STR_WAERKEEP = 270,\r
- STR_WEARRE = 271,\r
- STR_WEARREADY = 272,\r
- STR_RECHECK = 273,\r
- STR_CHECKEWARN = 274,\r
- STR_BLOODSHORT = 275,\r
- STR_HEARTNOTE = 276,\r
- STR_KONW = 277,\r
- STR_EXPLAIN = 278,\r
- STR_HEARTREST = 279,\r
- STR_HEARTDATA = 280,\r
- STR_HEARTTITLE = 281,\r
- STR_HEARTMAX = 282,\r
- STR_HEARTMIN = 283,\r
- STR_TRAINGNO = 284,\r
- STR_TRAINGGO = 285,\r
- STR_MESSAGENO = 286,\r
- STR_CLEAN = 287,\r
- STR_CLEANALL = 288,\r
- STR_SLEEP_YESTERDAY = 289,\r
- STR_HOUR = 290,\r
- STR_MIN = 291,\r
- STR_SLEEPMGOAL = 292,\r
- STR_REATTIME = 293,\r
- STR_SLEEPTIME = 294,\r
- STR_WALKTIME = 295,\r
- STR_APPMORE = 296,\r
- STR_DISTURB = 297,\r
- STR_DISTURBNOTE = 298,\r
- STR_MORNNING = 299,\r
- STR_NOW = 300,\r
- STR_NAP = 301,\r
- STR_TACK = 302,\r
- STR_CLICK = 303,\r
- STR_TACKNUM = 304,\r
- STR_SCREEN_AND_BRIGHTNESS = 305,\r
- STR_NETWORKANDCALL = 306,\r
- STR_SOUND_AND_VIBRATION = 307,\r
- STR_MOTION_RECOGNITION = 308,\r
- STR_SYSTEM = 309,\r
- STR_SHUTDOWN_AND_RESTART = 310,\r
- STR_SCREEN_ON_DURATION = 311,\r
- STR_RAISE_TO_WAKE = 312,\r
- STR_5_SECONDS = 313,\r
- STR_10_SECONDS = 314,\r
- STR_15_SECONDS = 315,\r
- STR_30_SECONDS = 316,\r
- STR_60_SECONDS = 317,\r
- STR_300_SECONDS = 318,\r
- STR_4G_CAPABILITY = 319,\r
- STR_VOLTE_CALL = 320,\r
- STR_MOBILE_DATA_OPTION = 321,\r
- STR_SYSTEM_UPDATE = 322,\r
- STR_ONLINE_MUSIC = 323,\r
- STR_BLUETOOTH_HEADPHONES = 324,\r
- STR_TRADITIONAL_BLUETOOTH = 325,\r
- STR_AUTO_OFF_BLUETOOTH_NOTE = 326,\r
- STR_BLUETOOTH_SERVICE_OPTIONS = 327,\r
- STR_HFP = 328,\r
- STR_A2DP = 329,\r
- STR_SYSTEM_VOLUME = 330,\r
- STR_MEDIA_VOLUME = 331,\r
- STR_CALL_VOLUME = 332,\r
- STR_VIBRATION_MODE = 333,\r
- STR_SILENT_MODE = 334,\r
- STR_LIST_DISPLAY = 335,\r
- STR_GRID_DISPLAY = 336,\r
- STR_CELLULAR_DISPLAY = 337,\r
- STR_AUTO_DETECT = 338,\r
- STR_ABOUT_WATCH = 339,\r
- STR_WATCH_QR_CODE = 340,\r
- STR_SYSTEM_LANGUAGE = 341,\r
- STR_RESTART = 342,\r
- STR_SHUTDOWN = 343,\r
- STR_FACTORY_RESET = 344,\r
- STR_WATCH_NAME = 345,\r
- STR_FIRMWARE_VERSION = 346,\r
- STR_BLUETOOTH_NAME = 347,\r
- STR_BLUETOOTH_ADDRESS = 348,\r
- STR_UPDATENOW = 349,\r
- STR_LATEST_VERSION = 350,\r
- STR_LATER = 351,\r
- STR_UP_TO_DATE = 352,\r
- STR_NO_UPDATE = 353,\r
- STR_LANGUAGE_SELECTION = 354,\r
- STR_RESET_CONFIRM = 355,\r
- STR_SHUTDOWN_CONFIRM = 356,\r
- STR_RESET_CONFIRM_NOTE = 357,\r
- STR_RECORDER = 358,\r
- STR_CLICK_TO_RECORD = 359,\r
- STR_RECORDING = 360,\r
- STR_AUDIO_XX = 361,\r
- STR_VOICE_RECORDING_REMINDER = 362,\r
- STR_VOICE_RECORDING_REMINDER_NOTE = 363,\r
- STR_DELETE_RECORDING = 364,\r
- STR_DELETE_PERMANENTLY = 365,\r
- STR_RECORDING_LIST = 366,\r
- STR_CRLEMPTY = 367,\r
- STR_DO_NOT_DISTURB_MODE = 368,\r
- STR_CONNECTION_STATUS = 369,\r
- STR_PHONE = 370,\r
- STR_HEADSET = 371,\r
- STR_CONNECTED = 372,\r
- STR_DISCONNECTED = 373,\r
- STR_PHONE_RINGING_VIBRATING = 374,\r
- STR_BLUETOOTH_DISCONNECTED = 375,\r
- STR_STOP = 376,\r
- STR_WORKDAY = 377,\r
- STR_REPEAT_NO = 378,\r
- STR_EVERYDAY = 379,\r
- STR_ADD_A_NEW_ALARM = 380,\r
- STR_TIME = 381,\r
- STR_NEXT_STEP = 382,\r
- STR_MON = 383,\r
- STR_TUES = 384,\r
- STR_WEDNES = 385,\r
- STR_THURS = 386,\r
- STR_FRI = 387,\r
- STR_SATUR = 388,\r
- STR_SUN = 389,\r
- STR_MONDAY = 390,\r
- STR_TUESDAY = 391,\r
- STR_WEDNESDAY = 392,\r
- STR_THURSDAY = 393,\r
- STR_FRIDAY = 394,\r
- STR_SATURDAY = 395,\r
- STR_SUNDAY = 396,\r
- STR_CALIBRATE_COMPASS = 397,\r
- STR_CALIBRATE_COMPASS_NOTE = 398,\r
- STR_EAST = 399,\r
- STR_SOUTH = 400,\r
- STR_WEST = 401,\r
- STR_NORTH = 402,\r
- STR_SOUTHEAST = 403,\r
- STR_SOUTHWEST = 404,\r
- STR_NORTHEAST = 405,\r
- STR_NORTHWEST = 406,\r
- STR_KEEP_STILL_FOCUS_ON_BREATHING = 407,\r
- STR_EXHALE_NOW = 408,\r
- STR_INHALE_NOW = 409,\r
- STR_TRAINING_COMPLETE = 410,\r
- STR_THIS_BREATH = 411,\r
- STR_TODAYS_BREATHING_TRAINING = 412,\r
- STR_RECENT_CALLS = 413,\r
- STR_NO_CALLS = 414,\r
- STR_MISSED_CALLS = 415,\r
- STR_DIALED_CALLS = 416,\r
- STR_RECEIVED_CALLS = 417,\r
- STR_NOTE_RECENT_CALLS_LIMITATION = 418,\r
- STR_NO_CONTACTS_ADDED = 419,\r
- STR_DIAL_MODE = 420,\r
- STR_DIAL_VIA_WATCH_SIM = 421,\r
- STR_DIAL_VIA_PHONE = 422,\r
- STR_KUMI_TECHNOLOGY = 423,\r
- STR_CALLING = 424,\r
- STR_NOT_PAIRED = 425,\r
- STR_PAIRED = 426,\r
- STR_UNPAIR = 427,\r
- STR_CONNECTION_ERROR = 428,\r
- STR_INSERT_WATCH_SIM_OR_CONNECT_PHONE = 429,\r
- STR_ENABLE_BLUETOOTH_CALL = 430,\r
- STR_ENABLE_BLUETOOTH_CALL_NOTE_IPHONE = 431,\r
- STR_ENABLE_BLUETOOTH_CALL_NOTE_ANDRODIR = 432,\r
- STR_ENABLE_BLUETOOTH_CALL_NOTE = 433,\r
- STR_SIM_CARD_ERROR = 434,\r
- STR_CHECK_SIM_CARD_INSERTION = 435,\r
- STR_WEATHER_REPORT = 436,\r
- STR_ULTRAVIOLET = 437,\r
- STR_WIND_SPEED = 438,\r
- STR_HUMIDITY = 439,\r
- STR_NEXT_7_DAYS = 440,\r
- STR_GET_WEATHER_ERROR = 441,\r
- STR_MUSIC_SOURCE = 442,\r
- STR_MOBILE_MUSIC = 443,\r
- STR_WATCH_MUSIC = 444,\r
- STR_MUSIC_LIST = 445,\r
- STR_BLUETOOTH_CONNECTION_FAILED = 446,\r
- STR_SCANNING_BINDING = 447,\r
- STR_DEVICE_BINDING = 448,\r
- STR_DEVICE_BINDING_NOTE = 449,\r
- STR_EQUIPMENT_UNTYING = 450,\r
- STR_EQUIPMENT_UNTYING_NOTE = 451,\r
- STR_DRINK_WATER_REMINDER = 452,\r
- STR_DRINK_WATER_REMINDER_NOTE = 453,\r
- STR_SEDENTARY_REMINDER = 454,\r
- STR_SEDENTARY_REMINDER_NOTE = 455,\r
- STR_SYSTEM_UPGRADING = 456,\r
- STR_NEWDEVICE_BIND_REMIND_NOTE = 457,\r
- STR_AI_VOICE = 458,\r
- STR_AI_INTELLIGENT_ASSISTANT = 459,\r
- STR_START_CHAT = 460,\r
- STR_BOOT_FAILED = 461,\r
- STR_ENABLE_MOBILE_DATA_FIRST = 462,\r
- STR_ENABLE_BLUETOOTH_FIRST = 463,\r
- STR_LISTENING = 464,\r
- STR_FINISH_SPEAKING = 465,\r
- STR_THINKING = 466,\r
- STR_CANCEL = 467,\r
- STR_CONNECT_TIMEOUT = 468,\r
- STR_PLEASE_RESTART_CHAT = 469,\r
- STR_CONTINUE_CHAT = 470,\r
- STR_AIMODELS_DOUBAO = 471,\r
- STR_AIMODES_WENXINYIYAN = 472,\r
- STR_AIMODES_KIMI = 473,\r
- STR_AIMODES_CHATGPT = 474,\r
- STR_SLIDE_TO_SHUTDOWN = 475,\r
- STR_SLIDE_TO_REBOOT = 476,\r
- STR_AI_FAMILY_MEALS = 477,\r
- STR_CHAT = 478,\r
- STR_PCY4GC_OR_AS = 479,\r
- STR_API_KEYS = 480,\r
- STR_PGTTAF = 481,\r
- STR_DAFBS = 482,\r
- STR_OPENAI_API_KEYS = 483,\r
- STR_KHBB = 484,\r
- STR_GTAS = 485,\r
- STR_DYWTDAK = 486,\r
- STR_CONNECTING = 487,\r
- STR_CONNECTION_FAIL = 488,\r
- STR_PTALORTM = 489,\r
- STR_MOTION_DETECTION_NOTE = 490,\r
- STR_PE4GC = 491,\r
- STR_OBU_MESSAGE = 492,\r
- STR_DELETE = 493,\r
- STR_MAX_ID = 494,\r
-}; // UIResourceTextId\r
-
-enum FontLanguageId : uint8_t {
- LANGUAGE_ID_EN,\r
- LANGUAGE_ID_ZH,\r
- LANGUAGE_ID_MAX\r
-}; // UITextLanguageTextId\r
-}\r
-#endif /* UI_RESOURCE_STRING_H */\r
+++ /dev/null
-#!/bin/bash
-###
- # @Date: 2024-07-10 21:03:33
- # @LastEditors: luozheng 1732036298@qq.com
- # @LastEditTime: 2024-07-23 11:29:39
- # @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/languagemake.sh
-###
-
-# 进入目录 Language_xml
-cd ~/XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/language/Language_xml
-#cd /home/luozheng/xts_origin/FD230/code/sdk/application/wearable/fd230app/nativeui/language/Language_xml
-# 运行 languagetool.py
-python languagetool.py
-
-# 回到上级目录
-cd ..
-
-# 进入目录 stringpack_tool
-cd stringpack_tool
-
-# 运行 language_trans.py
-python language_trans.py ../Language_xml/ ../font/ ../font/
-
-# 打印完成信息
-echo "脚本执行完成。"
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/env python
-# coding: utf-8
-# Description: language_trans
-
-import sys
-sys.dont_write_bytecode = True
-import xml.etree.ElementTree as ET
-import zlib
-import struct
-import searchdir
-import os
-
-g_lang_info = {}
-g_lang_id = []
-g_lang_default_text_info = {}
-
-def make_sure_dir_exit(filename):
- if not os.path.exists(os.path.dirname(filename)):
- try:
- os.makedirs(os.path.dirname(filename))
- except OSError as exc: # Guard against race condition
- if exc.errno != errno.EEXIST:
- raise
-
-class TextInfo:
- KEY_VALUE = "value"
- KEY_fontName = "fontName"
- KEY_SIZE = "size"
- KEY_DIRECT = "direct"
- DIRECT_LTR = 0
- DIRECT_RTL = 1
- DIRECT_MIXED = 2
- DIRECT_NONE = 3
-
- def __init__(self, info):
- self._info = info
-
- def get_size(self):
- if TextInfo.KEY_SIZE in self._info:
- return int(self._info[TextInfo.KEY_SIZE])
- else:
- return 0
-
- def get_font_name(self):
- if TextInfo.KEY_fontName in self._info:
- return self._info[TextInfo.KEY_fontName]
- return None
-
- def get_value(self):
- if TextInfo.KEY_VALUE in self._info:
- return self._info[TextInfo.KEY_VALUE]
- return ""
-
- def get_direct(self):
- if TextInfo.KEY_DIRECT in self._info:
- if self._info[TextInfo.KEY_DIRECT] == "ltr":
- return TextInfo.DIRECT_LTR
- if self._info[TextInfo.KEY_DIRECT] == "rtl":
- return TextInfo.DIRECT_RTL
- if self._info[TextInfo.KEY_DIRECT] == "mixed":
- return TextInfo.DIRECT_MIXED
- return TextInfo.DIRECT_NONE
-
- def __repr__(self):
- return "%s" % (self._info)
-
-
-def int_prim_xml_layer_tree(tree):
- root = tree.getroot()
- layer_root_element = ET.Element('')
- for child_1 in root:
- if child_1.tag == 'language':
- layer_root_element = child_1
- break
- return layer_root_element
-
-
-def get_lang_binary_body(tree):
- offset = b''
- str = b''
- num = b''
- crcData = b''
- langId = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
- # print(len(tree.findall('lanstr')))
- num += len(tree.findall('lanstr')).to_bytes(4, byteorder="little")
- for item in tree.findall('lanstr'):
- id = item.get('id')
- value = item.get('value')
- str += bytes(value, 'utf-8')
- str += b'\x00'
- offset += (len(bytes(value, 'utf-8')) +
- 1).to_bytes(4, byteorder="little")
-
- langId = struct.pack('16s', bytes(tree.get('languageinfo'), 'utf-8'))
- crcData += zlib.crc32(langId + num + offset +
- str).to_bytes(4, byteorder="little")
- return crcData + langId + num + offset + str
-
-
-def get_lang_head_body(tree):
- result = ''
- index = 0
- result += '/*\r\n'
- result += '* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved.\r\n'
- result += '* Description: language\r\n'
- result += '* Author: Graphic develop team\r\n'
- result += '* Create: 2021-07-06\r\n'
- result += '*/\r\n'
- result += '\r\n'
- result += '#ifndef UI_TEXT_LANGUAGE_H\r\n'
- result += '#define UI_TEXT_LANGUAGE_H\r\n'
- result += '#include <cstdint>\r\n'
- result += 'namespace OHOS {\r\n'
- result += 'enum UITextLanguageTextId : uint16_t {\r\n'
-
- for item in tree.findall('lanstr'):
- id = item.get('id')
- value = item.get('value')
- result += ' ' + id + ' = ' + str(index) + ',\r\n'
- index += 1
- result += '}; // UITextLanguageTextId\r\n'
- result += '#endif /* UI_TEXT_LANGUAGE_H */\r\n'
- return result
-
-
-def get_lang_binary_body_map(map, langType):
- # print(langType)
- offset = b''
- str = b''
- num = b''
- crcData = b''
- langId = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
- # print(len(tree.findall('lanstr')))
- keys = map.keys()
- totalNum = len(keys)
- index = 0
- default_text_info = g_lang_default_text_info[langType]
- # check default fontName
- default_fontName = default_text_info.get_font_name()
- if default_fontName != None:
- str += bytes(default_fontName, 'utf-8')
- str += b'\x00'
- index += len(bytes(default_fontName, 'utf-8')) + 1
- totalNum |= 0x8000
- num += totalNum.to_bytes(2, byteorder="little")
-
- for item in keys:
- id = item
- if langType in map[item]:
- text_info = map[item][langType]
- else:
- text_info = TextInfo({})
- value = text_info.get_value()
- str += bytes(value, 'utf-8')
- str += b'\x00'
- index_value = index
- font_size = text_info.get_size()
- if font_size > 0:
- index_value |= (index_value & 0xFF000000) | (font_size << 24)
-
- direct = text_info.get_direct()
- if direct == TextInfo.DIRECT_NONE:
- direct = default_text_info.get_direct()
- if direct != None:
- index_value |= (index_value & 0x00600000) | (direct << 21)
-
- font_name = text_info.get_font_name()
- if font_name != None:
- index_value |= (index_value | 0x00800000)
- str += bytes(font_name, 'utf-8')
- str += b'\x00'
- index += len(bytes(font_name, 'utf-8')) + 1
-
- offset += (index_value).to_bytes(4, byteorder="little")
- index += len(bytes(value, 'utf-8')) + 1
-
- langId = struct.pack('16s', bytes(langType, 'utf-8'))
- crcData += zlib.crc32(langId + num + offset +
- str).to_bytes(4, byteorder="little")
- return crcData + langId + num + offset + str
-
-
-def GetTextInfo(item):
- info = {}
- if item.get(TextInfo.KEY_VALUE) != None:
- info[TextInfo.KEY_VALUE] = item.get(TextInfo.KEY_VALUE)
- if item.get(TextInfo.KEY_SIZE) != None:
- info[TextInfo.KEY_SIZE] = item.get(TextInfo.KEY_SIZE)
- if item.get(TextInfo.KEY_fontName) != None:
- info[TextInfo.KEY_fontName] = item.get(TextInfo.KEY_fontName)
- if item.get(TextInfo.KEY_DIRECT) != None:
- info[TextInfo.KEY_DIRECT] = item.get(TextInfo.KEY_DIRECT)
- text_info = TextInfo(info)
- return text_info
-
-
-def get_lang_map(tree):
- langid = tree.get('languageinfo')
- g_lang_id.append(langid)
- # print(g_lang_id)
-
- text_info = GetTextInfo(tree)
- # print(text_info)
- g_lang_default_text_info[langid] = text_info
-
- for item in tree.findall('lanstr'):
- text_info = GetTextInfo(item)
- id = item.get('id')
- value = item.get('value')
- if id in g_lang_info:
- g_lang_info[id][langid] = text_info
- else:
- g_lang_info[id] = {langid: text_info}
- # print(g_lang_info)
-
-
-def get_language_id_enum():
- result = """
-enum FontLanguageId : uint8_t {
-"""
- for language in g_lang_id:
- result += " LANGUAGE_ID_" + language.upper() + ",\r\n"
- result += ' LANGUAGE_ID_MAX\r\n'
- result += '}; // UITextLanguageTextId\r\n'
- return result
-
-
-def get_lang_head_body_map(map):
- result = """/*
-* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved.
-* Description: language
-* Author: Graphic develop team
-* Create: 2021-07-06
-*/
-
-#ifndef UI_RESOURCE_STRING_H
-#define UI_RESOURCE_STRING_H
-#include <cstdint>
-namespace OHOS {
-enum UIResourceTextId : uint16_t {
-"""
- index = 0
- keys = map.keys()
- for item in keys:
- id = item
- result += ' ' + id + ' = ' + str(index) + ',\r\n'
- index += 1
- result += ' ' + "STR_MAX_ID" + ' = ' + str(index) + ',\r\n'
- result += '}; // UIResourceTextId\r\n'
- result += get_language_id_enum()
- result += '}\r\n'
- result += '#endif /* UI_RESOURCE_STRING_H */\r\n'
- # print(result)
- return result
-
-
-if __name__ == "__main__":
- args = len(sys.argv)
- argv = sys.argv
- if (args < 3):
- print("param should be \'xmlpath langPath headPath\'")
- # sys.exit()
- dirlist = searchdir.BASE()
- dirlist.RecusWalkDir(dir=argv[1])
- for item in dirlist.fileList:
- # print(item)
- tree = ET.parse(item).getroot()
- get_lang_map(tree)
- for item in g_lang_id:
- bin = get_lang_binary_body_map(g_lang_info, item)
- make_sure_dir_exit(os.path.join(argv[2], item + ".lang"));
- with open(os.path.join(argv[2], item + ".lang"), 'wb+') as file:
- file.write(bin)
- head = get_lang_head_body_map(g_lang_info)
- make_sure_dir_exit(os.path.join(argv[3], "ui_resource_string.h"))
- with open(os.path.join(argv[3], "ui_resource_string.h"), 'wb+') as file:
- file.write(bytes(head, 'utf-8'))
+++ /dev/null
-import os
-
-#全局变量设置歌曲预定格式
-Const_Song_Format=["xml"]
-
-
-class BASE:
- #类变量,设置文件列表
- fileList=[]
- #类变量,设置文件计算
- counter=0
- def __init__(self):
- pass
- def RecusWalkDir(self,dir,filtrate=0):
- """本方法递归遍历目的文件夹中所有文件,获取指定格式的文件绝对地址,利用类变量fileList存储地址"""
- global Const_Song_Format
- for s in os.listdir(dir):
- newDir=dir+"/"+s
- if os.path.isdir(newDir):
- self.RecusWalkDir(newDir)
- else:
- if os.path.isfile(newDir):
-
- if newDir and (self.GetFileFormat(newDir) in Const_Song_Format):
- self.__class__.fileList.append(newDir)
- self.__class__.counter+=1
-
-
-
- def CycWalkDir(self,dir,filtrate=0):
- """本方法循环遍历文件夹中所有文件,获取指定格式的文件绝对地址,返回歌曲列表fileList"""
- global Const_Song_Format
- fileList=[""]
- for s in os.listdir(dir):
- newDir=dir+"/"+s
- if os.path.isfile(newDir):
- if filtrate:
- if newDir and (self.GetFileFormat(newDir) in Const_Song_Format):
- fileList.append(newDir)
- else:
- fileList.append(newDir)
- else:
- newDir=dir+"/"+s
- while os.path.isdir(newDir):
- for s in os.listdir(dir):
- newDir=dir+"/"+s
- if os.path.isfile(newDir):
- if filtrate:
- if newDir and (self.GetFileFormat(newDir) in Const_Song_Format):
- fileList.append(newDir)
- else:
- fileList.append(newDir)
- else:
- newDir=dir+"/"+s
- return fileList
-
-
- def GetFileFormat(self,fileName):
- """返回文件格式"""
- if fileName:
- BaseName=os.path.basename(fileName)
- str=BaseName.split(".")
-
- return str[-1]
- else:
- return fileName
-
+++ /dev/null
-<!--\r
- * @Date: 2024-04-15 10:55:58\r
- * @LastEditors: Caisking 3449750381@qq.com\r
- * @LastEditTime: 2024-07-10 21:18:59\r
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/多国语言工具脚本.md\r
--->\r
-## 多国语言工具脚本使用方法\r
-\r
-### 1.下载打包工具\r
-\r
-\tools\string_packer 属于DebugKit里面的tool\r
-\r
-同时新建文件夹font\r
-\r
-### 2.下载脚本文件\r
-\r
-将**【Language_xml】**下载到打包工具里面\r
-\r
-【Language_xml】文件夹包含:\r
-\r
-```c\r
- languagetool.py: 生成xml脚本\r
-\r
- language_zh.xml: 中文xml(使用脚本可生成)\r
-\r
- language_eh.xml: 英语xml(使用脚本可生成)\r
-\r
- input_list_zh.txt: 中文语言列表 \r
- 里面可以直接输入键和建值:比如:STR_ICE_SPORTS,冰上运动\r
- input_list_en.txt: 英语语言列表 (同上)\r
-```\r
-\r
-### 3.使用方法\r
-\r
-在\tools\string_packer\Language_xml目录下使用cmd:\r
-\r
-输入以下指令将脚本增加权限:\r
-\r
-```\r
- icacls languagetool.py /grant Everyone:F\r
-```\r
-\r
-使用指令运行脚本:\r
-\r
-```\r
- python languagetool.py\r
-```\r
-\r
-文件夹里面生成两个xml文件。\r
-\r
-在**DebugKit**里面\r
-\r
-选择“system”->"string packer"\r
-\r
-```c\r
-python file: /tools/string_packer/language_trans.py\r
-\r
-File path: /tools/string_packer/Language_xml\r
-\r
-Output Path: /tools/string_packer/font\r
-```\r
-\r
-点击Execute生成:生成的font文件夹里面的内容**需要同步到代码以及res资源库**\r
-\r
-代码路径:application/wearable/fd230app/nativeui/language/font\r
-\r
-res路径: \FD230\code\sdk\build\config\target_config\brandy\mk_fs_image\fd230\fs\user\res\font\r
-\r
-\r
-【完成多国语言文件配置】\r
-### PS:如果需要增加语言语种 需要增加 languagetool.py 里面语种数组项\r
-\r
-### 更新 0709\r
-\r
-使用多国语言工具直接生成多国语言lang文件 以及 字体头文件\r
-\r
-python language_trans.py ../Language_xml/ ../font/ ../font/\r
-脚本 输入路径 字体文件输出路径 头文件输出路径\r
-\r
-### 更新 0710\r
-在language路径下 直接使用脚本即可生成语言文件夹 /font\r
-\r
-chmod +x languagemake.sh\r
-./languagemake.sh\r
-\r
#include "traing/training_card/include/Training_CardView.h"
#include "dnotdisturb/include/DnotDisturbModel.h"
#include "weather/include/WeatherModel.h"
+#include "heart_blood/health_service/health_service.h"
+
#if USE_OFFLINE_DIAL
#include "DialViewGroup.h"
#endif
{DROPDOWN_CLICK_DNOTDISTURB, VIEW_DNOTDISTURB}, // 勿扰
{DROPDOWN_CLICK_SAVEELE, VIEW_NETWORKANDCALL}, // 4G
{DROPDOWN_CLICK_FINDMYPHONE, VIEW_MAIN_ALIPAY}, // 支付宝
- {MAIN_CLICK_BLOOD, VIEW_BLOODOXY_CHECK}, // 血氧检查
+ {MAIN_CLICK_BLOOD, VIEW_BLOOD_CHECK}, // 血氧检查
{MAIN_CLICK_SETCARD, VIEW_ADD_CARD}, // 卡片管理
};
{
MainModel::GetInstance().SetFromSetCardView(true);
MainModel::GetInstance().SetFromCardId(BLOODOXGEN);
+ // 如果正在充电进入提醒界面
+ if (get_charge_stat())
+ {
+ HealthState highHealthState;
+ highHealthState.checkType = CHARGE;
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID, TransitionType::TRANSITION_ZOOM);
+ }
}
-
// 如果勿扰模式是开启状态,在下拉界面点击勿扰快捷入口会关闭勿扰模式不进入勿扰视图
if (g_jumpView[curViewId] == VIEW_DNOTDISTURB && DnotDisturbModel::GetInstance().GetDoNotDisturbModeEnabled() == true)
{
if (previousCardId == HEART_RATE && cardId != HEART_RATE)
{
// 从心率卡片变为其他卡片时调用关闭心率检测的函数
- HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE);
+ HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::CARDCHECK);
}
// 更新上一个卡片的值
case HEART_RATE:
// 开启心率检测 [UI优先级最高直接打断正在检测 重新检测]
HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);
- HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);
+ HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::CARDCHECK);
break;
case COMPASS:
};\r
enum PopupType\r
{\r
- EndPopup,\r
- GetTagPopup,\r
- HeartPopup,\r
+ EndPopup, // 结束训练弹窗\r
+ GetTagPopup, // 达到训练目标弹窗\r
+ HeartPopup, // 达到最高心率弹窗\r
};\r
class TraingCardPresenter;\r
class TrainingControlView;\r
\r
// 定义点击事件映射\r
static const std::unordered_map<std::string, std::function<void()>> actionMap = {\r
+ // 暂停按键\r
{BUTTONSTOP, [&]()\r
{\r
auto currentState = TraingModel::GetInstance()->GetSportState();\r
handleContinueState();\r
}\r
}},\r
+ // 结束按键\r
{BUTTONEND, [&]()\r
{\r
ControlSensor(ExerciseState::Pause);\r
TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, true);\r
TraingCardView::GetInstance()->RefreshEndView();\r
}},\r
+ // 确定结束\r
{BUTTONEXIT, [&]()\r
{\r
handleEndState();\r
}},\r
+ // 返回\r
{BUTTONBACK, [&]()\r
{\r
ControlSensor(ExerciseState::Continue);\r
TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, false);\r
}},\r
+ // 确定达到目标\r
{BUTTONWINOK, [&]()\r
{\r
TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, false);\r
TraingCardView::GetInstance()->GetAnimator()->Stop();\r
}},\r
+ // 确定心率提醒\r
{BUTTONNOTE, [&]()\r
{\r
TraingCardView::GetInstance()->SetPopupViewStatus(HeartPopup, false);\r
{\r
// 设置目标:在非运动情况下设置 [单指令,执行后退出]\r
TraingModel::GetInstance()->SetSportTag(static_cast<ExerciseTag>(cmd->sportTagType), cmd->sportTag);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetSportTag is succeed!\r\n");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetSportTag is succeed!\r\n");\r
return true;\r
}\r
break;\r
\r
case SENDDATA:\r
TraingModel::GetInstance()->SendLiveData(); // 发送实时数据 [单指令,执行后退出]\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SendLiveData is succeed!\r\n");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SendLiveData is succeed!\r\n");\r
return true;\r
default:\r
break;\r
}\r
}\r
\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],cmd->sportTag[%d]\r\n", cmd->sportType, cmd->controlmd, cmd->sportTagType, cmd->sportTag);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],cmd->sportTag[%d]\r\n", cmd->sportType, cmd->controlmd, cmd->sportTagType, cmd->sportTag);\r
\r
ExerciseState cmdState = static_cast<ExerciseState>(cmd->controlmd);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ExerciseState::End [%d]\r\n", cmdState);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ExerciseState::End [%d]\r\n", cmdState);\r
\r
switch (cmdState)\r
{\r
{
TraingBallList = new UIList();
}
+#if 0
TraingBallList->SetPosition(Ball_LIST_POSITION_X, Ball_LIST_POSITION_Y);
TraingBallList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
TraingBallList->SetScrollBlankSize(Ball_SCROLLBLANKSIZE);
TraingBallList->SetElastic(true); // 设置回弹效果
TraingBallList->SetMaxScrollDistance(MAX_SCR_DIS);
TraingBallList->SetYScrollBarVisible(true); // 设置滑动滚动条
+#endif
+
+ TraingBallList->SetPosition(Ball_LIST_POSITION_X, Ball_LIST_POSITION_Y, 466, 466);
+ TraingBallList->SetThrowDrag(true);
+ TraingBallList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ TraingBallList->SetMaxScrollDistance(1000);
+ TraingBallList->SetSwipeACCLevel(800);
+ TraingBallList->SetDragACCLevel(5);
// 增加表冠控制
TraingBallList->SetRotateFactor(2);
{
View<TraingBallPresenter>::OnStop();
-
RootView::GetInstance()->ClearOnKeyActListener();
- //FocusManager::GetInstance()->ClearFocus();
+ // FocusManager::GetInstance()->ClearFocus();
RootView::GetInstance()->RemoveAll();
// RootView::GetInstance()->ClearFocus();
return;
{
TraingDanceList = new UIList();
}
+#if 0
TraingDanceList->SetPosition(Dance_LIST_POSITION_X, Dance_LIST_POSITION_Y);
TraingDanceList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
TraingDanceList->SetScrollBlankSize(Dance_SCROLLBLANKSIZE);
TraingDanceList->SetElastic(true); // 设置回弹效果
TraingDanceList->SetMaxScrollDistance(MAX_SCR_DIS);
TraingDanceList->SetYScrollBarVisible(true); // 设置滑动滚动条
+#endif
+
+ TraingDanceList->SetPosition(Dance_LIST_POSITION_X, Dance_LIST_POSITION_Y, 466, 466);
+ TraingDanceList->SetThrowDrag(true);
+ TraingDanceList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ TraingDanceList->SetMaxScrollDistance(1000);
+ TraingDanceList->SetSwipeACCLevel(800);
+ TraingDanceList->SetDragACCLevel(5);
// 增加表冠控制
TraingDanceList->SetRotateFactor(2);
{
View<TraingDancePresenter>::OnStop();
-
RootView::GetInstance()->ClearOnKeyActListener();
- //FocusManager::GetInstance()->ClearFocus();
+ // FocusManager::GetInstance()->ClearFocus();
RootView::GetInstance()->RemoveAll();
// RootView::GetInstance()->ClearFocus();
return;
{
TraingFitnessList = new UIList();
}
+#if 0
TraingFitnessList->SetPosition(Fitness_LIST_POSITION_X, Fitness_LIST_POSITION_Y);
TraingFitnessList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
TraingFitnessList->SetScrollBlankSize(Fitness_SCROLLBLANKSIZE);
TraingFitnessList->SetElastic(true); // 设置回弹效果
TraingFitnessList->SetMaxScrollDistance(MAX_SCR_DIS);
TraingFitnessList->SetYScrollBarVisible(true); // 设置滑动滚动条
+#endif
+
+ TraingFitnessList->SetPosition(Fitness_LIST_POSITION_X, Fitness_LIST_POSITION_Y, 466, 466);
+ TraingFitnessList->SetThrowDrag(true);
+ TraingFitnessList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ TraingFitnessList->SetMaxScrollDistance(1000);
+ TraingFitnessList->SetSwipeACCLevel(800);
+ TraingFitnessList->SetDragACCLevel(5);
// 增加表冠控制
TraingFitnessList->SetRotateFactor(2);
{
View<TraingFitnessPresenter>::OnStop();
-
RootView::GetInstance()->ClearOnKeyActListener();
- //FocusManager::GetInstance()->ClearFocus();
+ // FocusManager::GetInstance()->ClearFocus();
RootView::GetInstance()->RemoveAll();
// RootView::GetInstance()->ClearFocus();
return;
{
TraingIceList = new UIList();
}
+#if 0
TraingIceList->SetPosition(Ice_LIST_POSITION_X, Ice_LIST_POSITION_Y);
TraingIceList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
TraingIceList->SetScrollBlankSize(Ice_SCROLLBLANKSIZE);
TraingIceList->SetElastic(true); // 设置回弹效果
TraingIceList->SetMaxScrollDistance(MAX_SCR_DIS);
TraingIceList->SetYScrollBarVisible(true); // 设置滑动滚动条
+#endif
+
+ TraingIceList->SetPosition(Ice_LIST_POSITION_X, Ice_LIST_POSITION_Y, 466, 466);
+ TraingIceList->SetThrowDrag(true);
+ TraingIceList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ TraingIceList->SetMaxScrollDistance(1000);
+ TraingIceList->SetSwipeACCLevel(800);
+ TraingIceList->SetDragACCLevel(5);
// 增加表冠控制
scrollView->SetRotateFactor(2);
View<TraingIcePresenter>::OnStop();
RootView::GetInstance()->ClearOnKeyActListener();
- //FocusManager::GetInstance()->ClearFocus();
+ // FocusManager::GetInstance()->ClearFocus();
RootView::GetInstance()->RemoveAll();
// RootView::GetInstance()->ClearFocus();
return;
{\r
TraingLimitList = new UIList();\r
}\r
+#if 0\r
TraingLimitList->SetPosition(Limit_LIST_POSITION_X, Limit_LIST_POSITION_Y);\r
TraingLimitList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
TraingLimitList->SetScrollBlankSize(Limit_SCROLLBLANKSIZE);\r
TraingLimitList->SetElastic(true); // 设置回弹效果\r
TraingLimitList->SetMaxScrollDistance(MAX_SCR_DIS);\r
TraingLimitList->SetYScrollBarVisible(true); // 设置滑动滚动条\r
+#endif\r
+\r
+ TraingLimitList->SetPosition(Limit_LIST_POSITION_X, Limit_LIST_POSITION_Y, 466, 466);\r
+ TraingLimitList->SetThrowDrag(true);\r
+ TraingLimitList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ TraingLimitList->SetMaxScrollDistance(1000);\r
+ TraingLimitList->SetSwipeACCLevel(800);\r
+ TraingLimitList->SetDragACCLevel(5);\r
\r
// 增加表冠控制\r
TraingLimitList->SetRotateFactor(2);\r
View<TraingLimitPresenter>::OnStop();\r
\r
RootView::GetInstance()->ClearOnKeyActListener();\r
- //FocusManager::GetInstance()->ClearFocus();\r
+ // FocusManager::GetInstance()->ClearFocus();\r
RootView::GetInstance()->RemoveAll();\r
// RootView::GetInstance()->ClearFocus();\r
return;\r
{\r
TraingMoreList = new UIList();\r
}\r
- TraingMoreList->SetPosition(More_LIST_POSITION_X, More_LIST_POSITION_Y);\r
- TraingMoreList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
- TraingMoreList->SetScrollBlankSize(More_SCROLLBLANKSIZE);\r
- TraingMoreList->SetReboundSize(50);\r
- TraingMoreList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position\r
- TraingMoreList->SetDraggable(true);\r
+\r
+ // TraingMoreList->SetScrollBlankSize(More_SCROLLBLANKSIZE);\r
+ // TraingMoreList->SetReboundSize(50);\r
+ // TraingMoreList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position\r
+ // TraingMoreList->SetDraggable(true);\r
+ // TraingMoreList->SetThrowDrag(true);\r
+ // TraingMoreList->EnableAutoAlign(true);\r
+ // TraingMoreList->SetElastic(true); // 设置回弹效果\r
+ // TraingMoreList->SetMaxScrollDistance(MAX_SCR_DIS);\r
+\r
+ TraingMoreList->SetPosition(More_LIST_POSITION_X, More_LIST_POSITION_Y, 466, 466);\r
TraingMoreList->SetThrowDrag(true);\r
- TraingMoreList->EnableAutoAlign(true);\r
- TraingMoreList->SetElastic(true); // 设置回弹效果\r
- TraingMoreList->SetMaxScrollDistance(MAX_SCR_DIS);\r
+ TraingMoreList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ TraingMoreList->SetMaxScrollDistance(1000);\r
+ TraingMoreList->SetSwipeACCLevel(800);\r
+ TraingMoreList->SetDragACCLevel(5);\r
\r
scrollView->SetYScrollBarVisible(true); // 设置滑动滚动条\r
\r
{\r
View<TraingMorePresenter>::OnStop();\r
\r
-\r
RootView::GetInstance()->ClearOnKeyActListener();\r
- //FocusManager::GetInstance()->ClearFocus();\r
+ // FocusManager::GetInstance()->ClearFocus();\r
RootView::GetInstance()->RemoveAll();\r
// RootView::GetInstance()->ClearFocus();\r
return;\r
{
TraingOtherList = new UIList();
}
+#if 0
TraingOtherList->SetPosition(Other_LIST_POSITION_X, Other_LIST_POSITION_Y);
TraingOtherList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
TraingOtherList->SetScrollBlankSize(Other_SCROLLBLANKSIZE);
TraingOtherList->SetElastic(true); // 设置回弹效果
TraingOtherList->SetMaxScrollDistance(MAX_SCR_DIS);
TraingOtherList->SetYScrollBarVisible(true); // 设置滑动滚动条
+#endif
+
+ TraingOtherList->SetPosition(Other_LIST_POSITION_X, Other_LIST_POSITION_Y, 466, 466);
+ TraingOtherList->SetThrowDrag(true);
+ TraingOtherList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ TraingOtherList->SetMaxScrollDistance(1000);
+ TraingOtherList->SetSwipeACCLevel(800);
+ TraingOtherList->SetDragACCLevel(5);
// 增加表冠控制
TraingOtherList->SetRotateFactor(2);
View<TraingOtherPresenter>::OnStop();
RootView::GetInstance()->ClearOnKeyActListener();
- //FocusManager::GetInstance()->ClearFocus();
+ // FocusManager::GetInstance()->ClearFocus();
RootView::GetInstance()->RemoveAll();
// RootView::GetInstance()->ClearFocus();
return;
{
TraingRestList = new UIList();
}
+#if 0
TraingRestList->SetPosition(Rest_LIST_POSITION_X, Rest_LIST_POSITION_Y);
TraingRestList->Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
TraingRestList->SetScrollBlankSize(Rest_SCROLLBLANKSIZE);
TraingRestList->SetElastic(true); // 设置回弹效果
TraingRestList->SetMaxScrollDistance(MAX_SCR_DIS);
TraingRestList->SetYScrollBarVisible(true); // 设置滑动滚动条
+#endif
+
+ TraingRestList->SetPosition(Rest_LIST_POSITION_X, Rest_LIST_POSITION_Y, 466, 466);
+ TraingRestList->SetThrowDrag(true);
+ TraingRestList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+ TraingRestList->SetMaxScrollDistance(1000);
+ TraingRestList->SetSwipeACCLevel(800);
+ TraingRestList->SetDragACCLevel(5);
// 增加表冠控制
TraingRestList->SetRotateFactor(2);
View<TraingRestPresenter>::OnStop();
RootView::GetInstance()->ClearOnKeyActListener();
- //FocusManager::GetInstance()->ClearFocus();
+ // FocusManager::GetInstance()->ClearFocus();
RootView::GetInstance()->RemoveAll();
// RootView::GetInstance()->ClearFocus();
return;
/* DeInit:删除组件 */
void TraingRecordView::DeInit()
{
- container_->RemoveAll();
lackView->RemoveAll();
recordView->RemoveAll();
- TraingRecordList->RemoveAll();
- if (labeltitle_ != nullptr)
- {
- lackView->Remove(labeltitle_);
- delete labeltitle_;
- labeltitle_ = nullptr;
- }
- if (labelrecord_ != nullptr)
- {
- lackView->Remove(labelrecord_);
- delete labelrecord_;
- labelrecord_ = nullptr;
- }
- if (buttongo != nullptr)
- {
- lackView->Remove(buttongo);
- delete buttongo;
- buttongo = nullptr;
- }
- if (imagerecord != nullptr)
- {
- lackView->Remove(imagerecord);
- delete imagerecord;
- imagerecord = nullptr;
- }
- if (lackView != nullptr)
- {
- lackView->RemoveAll();
- delete lackView;
- lackView = nullptr;
- }
+ delete labeltitle_;
+ labeltitle_ = nullptr;
- if (TraingRecordList != nullptr)
- {
- recordView->Remove(TraingRecordList);
- delete TraingRecordList;
- TraingRecordList = nullptr;
- }
- if (labelercord_ != nullptr)
- {
- recordView->Remove(labelercord_);
- delete labelercord_;
- labelercord_ = nullptr;
- }
- if (recordView != nullptr)
- {
- recordView->RemoveAll();
- delete recordView;
- recordView = nullptr;
- }
- if (container_ != nullptr)
- {
- container_->RemoveAll();
- delete container_;
- container_ = nullptr;
- }
- }
+ delete labelrecord_;
+ labelrecord_ = nullptr;
+
+ delete buttongo;
+ buttongo = nullptr;
+
+ delete imagerecord;
+ imagerecord = nullptr;
+
+ delete lackView;
+ lackView = nullptr;
+
+ delete TraingRecordList;
+ TraingRecordList = nullptr;
+ delete labelercord_;
+ labelercord_ = nullptr;
+
+ delete recordView;
+ recordView = nullptr;
+ }
void TraingRecordView::PreLoad(void)
{
if (!viewiInitStatus)
void TraingRecordView::OnStop()
{
View<TraingRecordPresenter>::OnStop();
+ if (container_ != nullptr)
+ {
+ container_->RemoveAll();
+ delete container_;
+ container_ = nullptr;
+ }
RootView::GetInstance()->RemoveAll();
return;
}
#include "watchQRcode/include/WatchQRCodeView.h"
#include "wearable_log.h"
#include "custom_utils.h"
-#include "language/font/ui_resource_string.h"
+#include "ui_resource_string.h"
#include "iostream"
#include "string"
namespace OHOS
STR_PE4GC = 491,\r
STR_OBU_MESSAGE = 492,\r
STR_DELETE = 493,\r
- STR_MAX_ID = 494,\r
+ STR_CHARGE = 494,\r
+ STR_CHARGE_NOTE = 495,\r
+ STR_MAX_ID = 496,\r
}; // UIResourceTextId\r
enum FontLanguageId : uint8_t {
- LANGUAGE_ID_EN,\r
LANGUAGE_ID_ZH,\r
+ LANGUAGE_ID_EN,\r
LANGUAGE_ID_MAX\r
}; // UITextLanguageTextId\r
}\r
{ConfigDataType::DATATYPE_INT, "heartrate_freq", "0" },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率
{ConfigDataType::DATATYPE_INT, "heartrate_remind", "0"},// CONFIGMODEL_ITEM_HEARTRATE_REMIND//提醒开关
- {ConfigDataType::DATATYPE_INT, "heartrate_threshold_value", "0"},// CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE//
+ {ConfigDataType::DATATYPE_INT, "heartrate_threshold_value", "0"},// CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE//心率值
{ConfigDataType::DATATYPE_INT, "heart_max_min", "0"},// CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN//最大值或者最小值
STR_EQUIPMENT_UNTYING$Equipment untying\r
STR_EQUIPMENT_UNTYING_NOTE$XX would like to unbind you\r
STR_DRINK_WATER_REMINDER$Drink water reminder\r
-STR_DRINK_WATER_REMINDER_NOTE$Time for some water! And stay hydrated (๑•̀ㅂ•́)\r
+STR_DRINK_WATER_REMINDER_NOTE$Time for some water! And stay hydrated\r
STR_SEDENTARY_REMINDER$Sedentary reminder\r
STR_SEDENTARY_REMINDER_NOTE$You haven't moved for XX hours. Get up and move.\r
STR_SYSTEM_UPGRADING$System upgrading\r
STR_CONTINUE_CHAT$Continue the conversation\r
STR_AIMODELS_DOUBAO$Cici\r
STR_AIMODES_WENXINYIYAN$ERNIE Bot\r
-STR_AIMODES_KIMI$Kimi\r
-STR_AIMODES_CHATGPT$ChatGPT
\ No newline at end of file
+STR_AIMODES_KIMI$KIMI\r
+STR_AIMODES_CHATGPT$ChatGPT\r
+STR_SLIDE_TO_SHUTDOWN$Slide to shutdown >>\r
+STR_SLIDE_TO_REBOOT$Slide to reboot >>\r
+STR_AI_FAMILY_MEALS$AI Family Meals\r
+STR_CHAT$Chat\r
+STR_PCY4GC_OR_AS$Please check your 4G connection or APP Settings\r
+STR_API_KEYS$API keys\r
+STR_PGTTAF$Please go to the APP first\r
+STR_DAFBS$Device" - "AI Family Bucket" setting\r
+STR_OPENAI_API_KEYS$OpenAI API keys\r
+STR_KHBB$API keys have been bound\r
+STR_GTAS$Please go to APP Settings\r
+STR_DYWTDAK$Do you want to delete API keys\r
+STR_CONNECTING$Connecting\r
+STR_CONNECTION_FAIL$Connection fail\r
+STR_PTALORTM$Please try again later or replace the model\r
+STR_MOTION_DETECTION_NOTE$It seems that you are performing XX movement, whether to start recording\r
+STR_PE4GC$Please enable 4G capability\r
+STR_OBU_MESSAGE$OBU\r
+STR_DELETE$Delete\r
+STR_CHARGE$Charging\r
+STR_CHARGE_NOTE$Currently charging, do not use detection
\ No newline at end of file
STR_EQUIPMENT_UNTYING$设备解绑\r
STR_EQUIPMENT_UNTYING_NOTE$XX想要与你进行解绑\r
STR_DRINK_WATER_REMINDER$喝水提醒\r
-STR_DRINK_WATER_REMINDER_NOTE$该喝水啦!记得按时保持水分充足(๑•̀ㅂ•́)و✧\r
+STR_DRINK_WATER_REMINDER_NOTE$该喝水啦!记得按时保持水分充足\r
STR_SEDENTARY_REMINDER$久坐提醒\r
STR_SEDENTARY_REMINDER_NOTE$你已经XX小时未活动了,站起来活动一下吧。\r
STR_SYSTEM_UPGRADING$系统升级中\r
STR_CONTINUE_CHAT$继续对话\r
STR_AIMODELS_DOUBAO$豆包\r
STR_AIMODES_WENXINYIYAN$文心一言\r
-STR_AIMODES_KIMI$Kimi\r
-STR_AIMODES_CHATGPT$ChatGPT
\ No newline at end of file
+STR_AIMODES_KIMI$KIMI\r
+STR_AIMODES_CHATGPT$ChatGPT\r
+STR_SLIDE_TO_SHUTDOWN$滑动关机 >>\r
+STR_SLIDE_TO_REBOOT$滑动重启 >>\r
+STR_AI_FAMILY_MEALS$AI 全家桶\r
+STR_CHAT$对话\r
+STR_PCY4GC_OR_AS$请检查4G连接或APP设置\r
+STR_API_KEYS$API keys\r
+STR_PGTTAF$请先前往APP\r
+STR_DAFBS$“设备”-“AI全家桶”设置\r
+STR_OPENAI_API_KEYS$OpenAI API keys\r
+STR_KHBB$已绑定API keys\r
+STR_GTAS$更换请前往APP设置\r
+STR_DYWTDAK$是否确认删除API keys\r
+STR_CONNECTING$正在连接\r
+STR_CONNECTION_FAIL$连接失败\r
+STR_PTALORTM$请稍后再重试或更换模型\r
+STR_MOTION_DETECTION_NOTE$检测到您好像在进行XX运动,是否开始记录\r
+STR_PE4GC$请开启4G能力\r
+STR_OBU_MESSAGE$OBU\r
+STR_DELETE$删除\r
+STR_CHARGE$正在充电\r
+STR_CHARGE_NOTE$当前处于充电中,请勿使用检测
\ No newline at end of file
<lanstr id="STR_EQUIPMENT_UNTYING" value="Equipment untying"/>
<lanstr id="STR_EQUIPMENT_UNTYING_NOTE" value="XX would like to unbind you"/>
<lanstr id="STR_DRINK_WATER_REMINDER" value="Drink water reminder"/>
- <lanstr id="STR_DRINK_WATER_REMINDER_NOTE" value="Time for some water! And stay hydrated (๑•̀ㅂ•́)"/>
+ <lanstr id="STR_DRINK_WATER_REMINDER_NOTE" value="Time for some water! And stay hydrated"/>
<lanstr id="STR_SEDENTARY_REMINDER" value="Sedentary reminder"/>
<lanstr id="STR_SEDENTARY_REMINDER_NOTE" value="You haven't moved for XX hours. Get up and move."/>
<lanstr id="STR_SYSTEM_UPGRADING" value="System upgrading"/>
<lanstr id="STR_CONTINUE_CHAT" value="Continue the conversation"/>
<lanstr id="STR_AIMODELS_DOUBAO" value="Cici"/>
<lanstr id="STR_AIMODES_WENXINYIYAN" value="ERNIE Bot"/>
- <lanstr id="STR_AIMODES_KIMI" value="Kimi"/>
+ <lanstr id="STR_AIMODES_KIMI" value="KIMI"/>
<lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
+ <lanstr id="STR_SLIDE_TO_SHUTDOWN" value="Slide to shutdown >>"/>
+ <lanstr id="STR_SLIDE_TO_REBOOT" value="Slide to reboot >>"/>
+ <lanstr id="STR_AI_FAMILY_MEALS" value="AI Family Meals"/>
+ <lanstr id="STR_CHAT" value="Chat"/>
+ <lanstr id="STR_PCY4GC_OR_AS" value="Please check your 4G connection or APP Settings"/>
+ <lanstr id="STR_API_KEYS" value="API keys"/>
+ <lanstr id="STR_PGTTAF" value="Please go to the APP first"/>
+ <lanstr id="STR_DAFBS" value="Device" - "AI Family Bucket" setting"/>
+ <lanstr id="STR_OPENAI_API_KEYS" value="OpenAI API keys"/>
+ <lanstr id="STR_KHBB" value="API keys have been bound"/>
+ <lanstr id="STR_GTAS" value="Please go to APP Settings"/>
+ <lanstr id="STR_DYWTDAK" value="Do you want to delete API keys"/>
+ <lanstr id="STR_CONNECTING" value="Connecting"/>
+ <lanstr id="STR_CONNECTION_FAIL" value="Connection fail"/>
+ <lanstr id="STR_PTALORTM" value="Please try again later or replace the model"/>
+ <lanstr id="STR_MOTION_DETECTION_NOTE" value="It seems that you are performing XX movement, whether to start recording"/>
+ <lanstr id="STR_PE4GC" value="Please enable 4G capability"/>
+ <lanstr id="STR_OBU_MESSAGE" value="OBU"/>
+ <lanstr id="STR_DELETE" value="Delete"/>
+ <lanstr id="STR_CHARGE" value="Charging"/>
+ <lanstr id="STR_CHARGE_NOTE" value="Currently charging, do not use detection"/>
</language>
<lanstr id="STR_EQUIPMENT_UNTYING" value="设备解绑"/>
<lanstr id="STR_EQUIPMENT_UNTYING_NOTE" value="XX想要与你进行解绑"/>
<lanstr id="STR_DRINK_WATER_REMINDER" value="喝水提醒"/>
- <lanstr id="STR_DRINK_WATER_REMINDER_NOTE" value="该喝水啦!记得按时保持水分充足(๑•̀ㅂ•́)و✧"/>
+ <lanstr id="STR_DRINK_WATER_REMINDER_NOTE" value="该喝水啦!记得按时保持水分充足"/>
<lanstr id="STR_SEDENTARY_REMINDER" value="久坐提醒"/>
<lanstr id="STR_SEDENTARY_REMINDER_NOTE" value="你已经XX小时未活动了,站起来活动一下吧。"/>
<lanstr id="STR_SYSTEM_UPGRADING" value="系统升级中"/>
<lanstr id="STR_CONTINUE_CHAT" value="继续对话"/>
<lanstr id="STR_AIMODELS_DOUBAO" value="豆包"/>
<lanstr id="STR_AIMODES_WENXINYIYAN" value="文心一言"/>
- <lanstr id="STR_AIMODES_KIMI" value="Kimi"/>
+ <lanstr id="STR_AIMODES_KIMI" value="KIMI"/>
<lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
+ <lanstr id="STR_SLIDE_TO_SHUTDOWN" value="滑动关机 >>"/>
+ <lanstr id="STR_SLIDE_TO_REBOOT" value="滑动重启 >>"/>
+ <lanstr id="STR_AI_FAMILY_MEALS" value="AI 全家桶"/>
+ <lanstr id="STR_CHAT" value="对话"/>
+ <lanstr id="STR_PCY4GC_OR_AS" value="请检查4G连接或APP设置"/>
+ <lanstr id="STR_API_KEYS" value="API keys"/>
+ <lanstr id="STR_PGTTAF" value="请先前往APP"/>
+ <lanstr id="STR_DAFBS" value="“设备”-“AI全家桶”设置"/>
+ <lanstr id="STR_OPENAI_API_KEYS" value="OpenAI API keys"/>
+ <lanstr id="STR_KHBB" value="已绑定API keys"/>
+ <lanstr id="STR_GTAS" value="更换请前往APP设置"/>
+ <lanstr id="STR_DYWTDAK" value="是否确认删除API keys"/>
+ <lanstr id="STR_CONNECTING" value="正在连接"/>
+ <lanstr id="STR_CONNECTION_FAIL" value="连接失败"/>
+ <lanstr id="STR_PTALORTM" value="请稍后再重试或更换模型"/>
+ <lanstr id="STR_MOTION_DETECTION_NOTE" value="检测到您好像在进行XX运动,是否开始记录"/>
+ <lanstr id="STR_PE4GC" value="请开启4G能力"/>
+ <lanstr id="STR_OBU_MESSAGE" value="OBU"/>
+ <lanstr id="STR_DELETE" value="删除"/>
+ <lanstr id="STR_CHARGE" value="正在充电"/>
+ <lanstr id="STR_CHARGE_NOTE" value="当前处于充电中,请勿使用检测"/>
</language>
STR_AIMODES_WENXINYIYAN = 472,\r
STR_AIMODES_KIMI = 473,\r
STR_AIMODES_CHATGPT = 474,\r
- STR_MAX_ID = 475,\r
+ STR_SLIDE_TO_SHUTDOWN = 475,\r
+ STR_SLIDE_TO_REBOOT = 476,\r
+ STR_AI_FAMILY_MEALS = 477,\r
+ STR_CHAT = 478,\r
+ STR_PCY4GC_OR_AS = 479,\r
+ STR_API_KEYS = 480,\r
+ STR_PGTTAF = 481,\r
+ STR_DAFBS = 482,\r
+ STR_OPENAI_API_KEYS = 483,\r
+ STR_KHBB = 484,\r
+ STR_GTAS = 485,\r
+ STR_DYWTDAK = 486,\r
+ STR_CONNECTING = 487,\r
+ STR_CONNECTION_FAIL = 488,\r
+ STR_PTALORTM = 489,\r
+ STR_MOTION_DETECTION_NOTE = 490,\r
+ STR_PE4GC = 491,\r
+ STR_OBU_MESSAGE = 492,\r
+ STR_DELETE = 493,\r
+ STR_CHARGE = 494,\r
+ STR_CHARGE_NOTE = 495,\r
+ STR_MAX_ID = 496,\r
}; // UIResourceTextId\r
enum FontLanguageId : uint8_t {