From d1ae9a8123825aa7111d9b6fbefd9ea0efc5fb07 Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Thu, 4 Apr 2024 16:16:34 +0800 Subject: [PATCH] =?utf8?q?1.=E6=B7=BB=E5=8A=A0=E7=A7=92=E8=A1=A8=E8=A7=86?= =?utf8?q?=E5=9B=BE=202.=E6=B7=BB=E5=8A=A0=E5=80=92=E8=AE=A1=E6=97=B6?= =?utf8?q?=E5=92=8C=E7=A7=92=E8=A1=A8=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../wearable/fd230app/CMakeLists.txt | 8 + .../nativelauncher/include/AppViewIDs.h | 1 + .../nativelauncher/include/NativeLauncher.h | 1 + .../nativelauncher/include/UiConfig.h | 1 + .../nativelauncher/src/NativeLauncher.cpp | 19 +- .../nativeui/applist/src/ApplistModel.cpp | 3 +- .../nativeui/compass/src/CompassModel.cpp | 2 +- .../nativeui/settings/src/SettingView.cpp | 2 +- .../include/MainStopWatchPresenter.h | 65 +++ .../stopwatch/include/MainStopWatchView.h | 76 ++++ .../stopwatch/include/StopWatchModel.h | 31 ++ .../include/StopWatchRecordCycleToLimitView.h | 34 ++ .../include/StopWatchRecordTimeToLimitView.h | 32 ++ .../stopwatch/src/MainStopWatchPresenter.cpp | 207 ++++++++++ .../stopwatch/src/MainStopWatchView.cpp | 385 ++++++++++++++++++ .../nativeui/stopwatch/src/StopWatchModel.cpp | 21 + .../src/StopWatchRecordCycleToLimitView.cpp | 146 +++++++ .../src/StopWatchRecordTimeToLimitView.cpp | 147 +++++++ .../fs/user/res/countdown/COUNTDOWM_END.bin | Bin 0 -> 6824 bytes .../res/countdown/COUNTDOWM_FIVE_MINUTE.bin | Bin 0 -> 21624 bytes .../res/countdown/COUNTDOWM_ONE_MINUTE.bin | Bin 0 -> 21624 bytes .../fs/user/res/countdown/COUNTDOWM_PAUSE.bin | Bin 0 -> 6824 bytes .../fs/user/res/countdown/COUNTDOWM_PLAY.bin | Bin 0 -> 6824 bytes .../fs/user/res/countdown/COUNTDOWM_RESET.bin | Bin 0 -> 6824 bytes .../res/countdown/COUNTDOWM_TEN_MINUTE.bin | Bin 0 -> 21624 bytes .../res/countdown/COUNTDOWM_THIRTY_MINUTE.bin | Bin 0 -> 21624 bytes .../user/res/countdown/COUNTDOWM_VECTOR.bin | Bin 0 -> 584 bytes .../res/countdown/COUNTDOWN_ATTENTION.bin | Bin 0 -> 4504 bytes .../user/res/countdown/COUNTDOWN_BUTTON.bin | Bin 0 -> 31224 bytes .../user/res/countdown/COUNTDOWN_COLONE.bin | Bin 0 -> 312 bytes .../fs/user/res/stopwatch/STOPWATCH_LINE.bin | Bin 0 -> 984 bytes .../fs/user/res/stopwatch/STOPWATCH_MARK.bin | Bin 0 -> 6824 bytes .../fs/user/res/stopwatch/STOPWATH_RESET1.bin | Bin 0 -> 6824 bytes .../fs/user/res/stopwatch/STOPWATH_RESET2.bin | Bin 0 -> 6824 bytes 34 files changed, 1176 insertions(+), 5 deletions(-) create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchModel.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordCycleToLimitView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordTimeToLimitView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_END.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_FIVE_MINUTE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_ONE_MINUTE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_PAUSE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_PLAY.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_RESET.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_TEN_MINUTE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_THIRTY_MINUTE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_VECTOR.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_ATTENTION.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_BUTTON.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_COLONE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATCH_LINE.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATCH_MARK.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATH_RESET1.bin create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATH_RESET2.bin diff --git a/code/sdk/application/wearable/fd230app/CMakeLists.txt b/code/sdk/application/wearable/fd230app/CMakeLists.txt index ef3aae1fe..e2ff02ffd 100644 --- a/code/sdk/application/wearable/fd230app/CMakeLists.txt +++ b/code/sdk/application/wearable/fd230app/CMakeLists.txt @@ -252,12 +252,20 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/src/HeartCardView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/health_service/health_service.cpp + # 语言切换 ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/src/LanguageSwitchListAdapter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/src/LanguageSwitchListitemView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/src/LanguageSwitchPresenter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/src/LanguageSwitchView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/src/LanguageSwitchModel.cpp + #秒表 + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/stopwatch/src/MainStopWatchPresenter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/stopwatch/src/MainStopWatchView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/stopwatch/src/StopWatchModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/LanguageInit.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/config/src/ConfigModel.cpp diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h index 83875d21e..113b71df6 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h @@ -56,6 +56,7 @@ typedef enum : uint16_t VIEW_FAST_TRAINING_ATTENTION, // 快速训练项目选择超出提示 VIEW_FIND_PHONE, // 查找手机 VIEW_LANGUAGE_SWITCH, // 语言切换 + VIEW_MAIN_STOPWATCH, // 秒表 /* ----------------------------------- 录音 ----------------------------------- */ VIEW_RECORD, /* ---------------------------------- 界面 ---------------------------------- */ diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h index 59c4144f4..830bad2a0 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h @@ -45,6 +45,7 @@ namespace OHOS void InitClassicBluetoothSlice(void); void InitFindPhoneSlice(void); void InitLanguageSwitchSlice(void); + void InitMainStopWatchSlice(void); /* --------------------------------界面------------------------------------ */ void InitRotateSlice(void); void InitBloodSlice(void); diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h index 85a4d8b5a..757e573d4 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h @@ -219,6 +219,7 @@ namespace OHOS static constexpr const char *PNG_APPLIST_RECORD_IMAGE = APP_RES_PATH "/APPLIST_RECORD_IMAGE.bin"; // 录音 static constexpr const char *PNG_APPLIST_TRAINING_IMAGE = APP_RES_PATH "/APPLIST_TRAINING.bin"; // 训练 static constexpr const char *PNG_APPLIST_TRAINING_RECORD_IMAGE = APP_RES_PATH "/APPLIST_TRAINING_RECORD.bin"; // 训练记录 + static constexpr const char *PNG_APPLIST_STOPWATCH_IMAGE = APP_RES_PATH "/APPLIST_STOPWATCH.bin"; // 秒表 /* ---------------------------------- 快速训练 ---------------------------------- */ static constexpr const char *PNG_TRAING_BOUTTONMORE_IMAGE = APP_RES_PATH "/Training/More.bin"; static constexpr const char *PNG_TRAING_BUTTONGRONG_IMAGE = APP_RES_PATH "/Training/Bouttonground.bin"; diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp index 6ed5ba071..ae32d0041 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp @@ -143,6 +143,9 @@ #include "language/include/LanguageSwitchPresenter.h" #include "language/include/LanguageSwitchView.h" + +#include "stopwatch/include/MainStopWatchPresenter.h" +#include "stopwatch/include/MainStopWatchView.h" /* -------------------------------------------------------------------------- */ #include "traing/include/TraingView.h" #include "traing/include/TraingPresenter.h" @@ -260,7 +263,8 @@ namespace OHOS {VIEW_RECORD, &NativeLauncher::InitRecordingSlice}, // 录音实例化地址 {VIEW_FIND_PHONE, &NativeLauncher::InitFindPhoneSlice}, - {VIEW_LANGUAGE_SWITCH,&NativeLauncher::InitLanguageSwitchSlice}, + {VIEW_LANGUAGE_SWITCH, &NativeLauncher::InitLanguageSwitchSlice}, + {VIEW_MAIN_STOPWATCH, &NativeLauncher::InitMainStopWatchSlice}, {VIEW_MESSAGE, &NativeLauncher::InitMessageSlice}, {VIEW_ROTATE, &NativeLauncher::InitRotateSlice}, {VIEW_DIALUPDATE, &NativeLauncher::InitDialUpdateSlice}, @@ -1088,7 +1092,7 @@ namespace OHOS NativeAbility::GetInstance().AddSliceProxy(VIEW_FIND_PHONE, findphoneview); } - //语言切换 + // 语言切换 void NativeLauncher::InitLanguageSwitchSlice(void) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitLanguageSwitchSlice"); @@ -1100,5 +1104,16 @@ namespace OHOS } NativeAbility::GetInstance().AddSliceProxy(VIEW_LANGUAGE_SWITCH, languageswitchview); } + + /*秒表*/ + void NativeLauncher::InitMainStopWatchSlice(void) + { + SliceProxy *mainstopwatch = new AbilitySliceProxy; + if (mainstopwatch == nullptr) + { + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_MAIN_STOPWATCH, mainstopwatch); + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp index 01bb17e1b..5cfe6b578 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp @@ -36,7 +36,8 @@ namespace OHOS {VIEW_RECORD, PNG_APPLIST_RECORD_IMAGE, PNG_APPLIST_RECORD_IMAGE, "录音", nullptr}, {VIEW_CALLER_LOG, PNG_APPLIST_CALLLOG_IMAGE, PNG_APPLIST_CALLLOG_IMAGE, "通话记录", nullptr}, {VIEW_PHONE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, "电话", nullptr}, - {VIEW_CONNECT_PHONE, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "连接手机", nullptr}, + {VIEW_MAIN_STOPWATCH, PNG_APPLIST_STOPWATCH_IMAGE, PNG_APPLIST_STOPWATCH_IMAGE, "秒表", nullptr}, + //{VIEW_CONNECT_PHONE, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "连接手机", nullptr}, //{VIEW_LANGUAGE_SWITCH, PNG_CONNECT_PHONE_IMAGE, PNG_CONNECT_PHONE_IMAGE, "语言切换", nullptr}, #ifdef SUPPORT_ALIPAY_SEC {VIEW_MAIN_ALIPAY, PNG_APPLIST_ALIPAY_IMAGE, PNG_APPLIST_ALIPAY_IMAGE, "支付宝", nullptr}, diff --git a/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassModel.cpp index d789e6d0d..06f069be3 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/compass/src/CompassModel.cpp @@ -51,7 +51,7 @@ uint8_t CompassModel::GetCalibrationStatus(void) } /* - * @brief 设置显示的角度 + * @brief 设置显示的角度,通常表示为从地磁北方向到设备当前朝向的角度。 */ void CompassModel::SetDisplayAngle(uint16_t angle) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingView.cpp b/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingView.cpp index 6059b6e1b..a76060ef1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingView.cpp @@ -101,7 +101,7 @@ namespace OHOS contentList->SetScrollBlankSize(SETTING_SCROLLBLANKSIZE); contentList->SetSelectPosition(HORIZONTAL_RESOLUTION / SNUM_2); // middle position contentList->SetDraggable(true); - contentList->SetThrowDrag(false); + contentList->SetThrowDrag(true); contentList->EnableAutoAlign(true); contentList->SetReboundSize(REBOUNDSIZE); contentList->SetMaxScrollDistance(MAX_SCR_DIS / SNUM_2); diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h new file mode 100644 index 000000000..ccb4d9e7c --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h @@ -0,0 +1,65 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-04 15:13:51 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-04-04 16:05:17 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h + */ +#ifndef MAIN_STOPWATCH_PRESENTER_H +#define MAIN_STOPWATCH_PRESENTER_H + +#include "Presenter.h" +#include "View.h" +#include "MainStopWatchView.h" +#include +/*秒表主视图*/ +namespace OHOS +{ + typedef enum + { + MAIN_STOPWATCH = 0, // 秒表主视图 + STOPWATCH_RECORD_CYCLE_TO_LIMIT, // 到达秒表计时的最高记录圈数后弹出视图 + STOPWATCH_RECORD_TIME_TO_LIMIT, // 到达秒表最大的记录时间后弹出该视图 + STOPWATCH_MAXVIEWID, // 秒表的视图id数量 + } StopWatchViewId; + class MainStopWatchView; + class MainStopWatchPresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener, + public RootView::OnKeyActListener, + public UICheckBox::OnChangeListener + { + public: + MainStopWatchPresenter(); + virtual ~MainStopWatchPresenter(); + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + static MainStopWatchPresenter *GetInstance(); + void SetCheckBoxAndButton(UICheckBox *checkbox, UIButton *button); + void SetLable(UILabel *label1, UILabel *label2); + void SetShowTimeLableStyle(UILabel *label, int x, int y, int TextFont, int LineHeight); + void SetList(UIList *list, TextAdapter *listadapter, List *listdata); + void SetImage(UIImageView *image); + private: + // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnChange(UICheckBox::UICheckBoxState state) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + private: + UICheckBox *m_checkbox{nullptr}; + UIButton *m_button{nullptr}; + UILabel *m_stopWatchlabel{nullptr}; + UILabel *m_showTimelabel{nullptr}; + UIImageView *m_image{nullptr}; + UIList *m_list = nullptr; + TextAdapter *m_listadapter = nullptr; + List *m_listdata = nullptr; + int RecordCycleNumber{0}; // 用来记录点击计时按钮("Mark")的次数 + std::string RecordMaxTime{"99:59.59"}; // 计时时间最高为99:59.59 + }; +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchView.h b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchView.h new file mode 100644 index 000000000..3af8a0e0b --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchView.h @@ -0,0 +1,76 @@ +#ifndef MAIN_STOPWATCH_VIEW_H +#define MAIN_STOPWATCH_VIEW_H + +#include "BaseView.h" +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label.h" +#include "components/ui_checkbox.h" +#include "components/ui_button.h" +#include "components/ui_list.h" +#include "components/text_adapter.h" +#include "stopwatch/include/StopWatchRecordCycleToLimitView.h" +#include "stopwatch/include/StopWatchRecordTimeToLimitView.h" +/*秒表主视图*/ +namespace OHOS +{ + + static const char *checkBox1selectedImg = "/user/res/countdown/COUNTDOWM_PLAY.bin"; // 播放 + static const char *checkBox1unSelectedImg = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 暂停 + static const char *ResetOrMarkButtonImg_Reset1 = "/user/res/stopwatch/STOPWATH_RESET1.bin"; // 重置_灰色 图片 + static const char *ResetOrMarkButtonImg_Reset2 = "/user/res/stopwatch/STOPWATH_RESET2.bin"; // 重置_白色 图片 + static const char *ResetOrMarkButtonImg_Mark = "/user/res/stopwatch/STOPWATCH_MARK.bin"; // 标记 图片 + static const char *PlayOrPausecheckBoxVIEWID = "PlayOrPausecheckBox"; // 播放或暂停复选框视图ID + static const char *ResetOrMarkButton_RESET1_VIEWID = "ResetOrMarkButtonReset1"; // ResetOrMarkButtonReset1 + static const char *ResetOrMarkButton_RESET2_VIEWID = "ResetOrMarkButtonReset2"; // ResetOrMarkButtonReset2 + static const char *ResetOrMarkButton_MARK_VIEWID = "ResetOrMarkButtonMark"; // ResetOrMarkButtonMark + static const char *CycleToLimitReturnButton_VIEWID = "CycleToLimitReturnButton"; // CycleToLimitReturnButton + static const char *TimeToLimitReturnButton_VIEWID = "TimeToLimitReturnButton"; // TimeToLimitReturnButton + class MainStopWatchPresenter; + class MainStopWatchView : public View + { + + public: + MainStopWatchView(); + virtual ~MainStopWatchView(); + static MainStopWatchView *GetInstance(void); + + void OnStart() override; + void OnSetUpView() override; + void OnTearDownView() override; + void OnStop() override; + void SetViewIsVisible(UIView *view, bool status); + bool ClickFunc(int16_t interface); + void ChangeView(int16_t hideView, int16_t showView); + bool ChangeMainStopWatch(int16_t thisView); + bool ChangeStopWatchRecordCycleLimit(int16_t thisView); + bool ChangeMainStopWatchRecordTimeLimit(int16_t thisView); + + private: + void InitMainStopWatchView(void); + void DeInitView(void); + void PreLoad(void); + + private: + StopWatchRecordCycleToLimitView *p_StopWatchRecordCycleToLimitView{nullptr}; // 圈数到达上限后弹出该视图 + StopWatchRecordTimeToLimitView *p_StopWatchRecordTimeToLimitView{nullptr}; // 计时时间到达上限后弹出该视图 + + private: + UIViewGroup *container_ = nullptr; + UIScrollView *scrollView[3] = {nullptr}; + UILabel *stopWatchlabel = nullptr; // 内容为“秒表”的标签 + UILabel *showTimelabel = nullptr; // 用来显示计时时间 + UICheckBox *PlayOrPausecheckBox = nullptr; // 播放或暂停复选框 + UIButton *ResetOrMarkbutton = nullptr; // 重置或标记按钮 + UIImageView *LineImage{nullptr}; + UIList *list = nullptr; + TextAdapter *listadapter = nullptr; + List *listdata = nullptr; + UIView::OnDragListener *draglistener{nullptr}; + UICheckBox::OnChangeListener *PlayOrPausecheckBoxChangeListener{nullptr}; + UIView::OnClickListener *ResetOrMarkbuttonClick{nullptr}; + bool viewInitStatus{false}; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchModel.h b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchModel.h new file mode 100644 index 000000000..66baa6de1 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchModel.h @@ -0,0 +1,31 @@ +#ifndef STOP_WATCH_MODEL_H +#define STOP_WATCH_MODEL_H + +#include +#include +#include + +namespace OHOS +{ + class StopWatchModel + { + public: + static std::shared_ptr GetInstance(); // shared_ptr:当没有引用指向这个实例时会自动释放内存 + ~StopWatchModel() {} + char *DisplayMotionDuration(); + + private: + // 将构造函数、拷贝构造函数和赋值操作符私有化 + StopWatchModel() = default; + StopWatchModel(const StopWatchModel &) = delete; + StopWatchModel &operator=(const StopWatchModel &) = delete; + + private: + static int oneDaySec; // 一天的秒数 + static int oneHourSec; // 一个小时的秒数 + static int oneMinuteSec; // 一分钟秒数 + }; + +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordCycleToLimitView.h b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordCycleToLimitView.h new file mode 100644 index 000000000..390fa0c36 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordCycleToLimitView.h @@ -0,0 +1,34 @@ +#ifndef STOPWATCH_RECORD_CYCLE_TO_LIMIT_VIEW_H +#define STOPWATCH_RECORD_CYCLE_TO_LIMIT_VIEW_H + +#include "BaseView.h" +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label.h" +#include "components/ui_image_view.h" +#include "components/ui_button.h" +/*弹窗视图:到达最高圈数99时弹出*/ +namespace OHOS +{ + class StopWatchRecordCycleToLimitView + { + + public: + StopWatchRecordCycleToLimitView(); + void DeInitView(void); + virtual ~StopWatchRecordCycleToLimitView(); + static StopWatchRecordCycleToLimitView *GetInstance(void); + UIScrollView *InitStopWatchRecordCycleToLimitView(void); + + private: + UIViewGroup *container_ = nullptr; + UIScrollView *scrollView1_ = nullptr; + UILabel *label1_ = nullptr; + UIImageView *image1_ = nullptr; + UILabel *label3_ = nullptr; + UIButton *button1_ = nullptr; + bool viewInitStatus{false}; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordTimeToLimitView.h b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordTimeToLimitView.h new file mode 100644 index 000000000..22495f27c --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/StopWatchRecordTimeToLimitView.h @@ -0,0 +1,32 @@ +#ifndef STOPWATCH_RECORD_TIME_TO_LIMIT_VIEW_H +#define STOPWATCH_RECORD_TIME_TO_LIMIT_VIEW_H + +#include "BaseView.h" +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label.h" +#include "components/ui_image_view.h" +#include "components/ui_button.h" +/*弹窗视图:到达最高时间99:59.99时弹出*/ +namespace OHOS +{ + class StopWatchRecordTimeToLimitView + { + public: + StopWatchRecordTimeToLimitView(); + virtual ~StopWatchRecordTimeToLimitView(); + static StopWatchRecordTimeToLimitView *GetInstance(void); + UIScrollView *InitStopWatchRecordTimeToLimitView(void); + void DeInitView(void); + + private: + UIScrollView *scrollView1_ = nullptr; + UILabel *label1_ = nullptr; + UIImageView *image1_ = nullptr; + UILabel *label3_ = nullptr; + UIButton *button1_ = nullptr; + bool viewInitStatus{false}; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp new file mode 100644 index 000000000..4c5e74255 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp @@ -0,0 +1,207 @@ +#include "AppViewIDs.h" +#include "NativeAbility.h" +#include "stopwatch/include/MainStopWatchPresenter.h" +#include "common/key_code.h" +#include +/*秒表主视图*/ +namespace OHOS +{ + + // 当前Presenter属性实例化的内存指针 + static MainStopWatchPresenter *g_pMainStopWatchPresenter = nullptr; + + MainStopWatchPresenter::MainStopWatchPresenter() + { + + g_pMainStopWatchPresenter = this; + } + + MainStopWatchPresenter::~MainStopWatchPresenter() + { + + g_pMainStopWatchPresenter = nullptr; + } + + MainStopWatchPresenter *MainStopWatchPresenter::GetInstance() + { + + return g_pMainStopWatchPresenter; + } + + void MainStopWatchPresenter::OnStart() + { + + Presenter::OnStart(); + } + + void MainStopWatchPresenter::OnPause(void) + { + + Presenter::OnPause(); + } + + void MainStopWatchPresenter::OnResume(void) + { + + Presenter::OnResume(); + } + + void MainStopWatchPresenter::OnStop(void) + { + + Presenter::OnStop(); + } + + /// @brief 设置复选框和按钮 + /// @param checkbox + /// @param button + void MainStopWatchPresenter::SetCheckBoxAndButton(UICheckBox *checkbox, UIButton *button) + { + m_checkbox = checkbox; + m_button = button; + } + + /// @brief 设置标签 + /// @param label1 + /// @param label2 + void MainStopWatchPresenter::SetLable(UILabel *label1, UILabel *label2) + { + m_stopWatchlabel = label1; + m_showTimelabel = label2; + } + + /// @brief 设置显示时间的标签样式 + /// @param label + /// @param x + /// @param y + /// @param TextFont + /// @param LineHeight + void MainStopWatchPresenter::SetShowTimeLableStyle(UILabel *label, int x, int y, int TextFont, int LineHeight) + { + label->SetPosition(x, y); + label->SetStyle(STYLE_TEXT_FONT, TextFont); + label->SetStyle(STYLE_LINE_HEIGHT, LineHeight); + label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TextFont); + label->Invalidate(); + } + + void MainStopWatchPresenter::SetList(UIList *list, TextAdapter *listadapter, List *listdata) + { + m_list = list; + m_listadapter = listadapter; + m_listdata = listdata; + } + + void MainStopWatchPresenter::SetImage(UIImageView *image) + { + m_image = image; + } + + bool MainStopWatchPresenter::OnDrag(UIView &view, const DragEvent &event) + { + UNUSED(view); + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && + (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY())))) + { + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); + } + return true; + } + + bool MainStopWatchPresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(view); + MainStopWatchView *mainStopWatchView = MainStopWatchView::GetInstance(); + const char *clickedViewId = view.GetViewId(); + if (strcmp(clickedViewId, ResetOrMarkButton_MARK_VIEWID) == 0) + { + RecordCycleNumber += 1; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordCycleNumber:%d\n",RecordCycleNumber); + if (RecordCycleNumber >= 99) + { + mainStopWatchView->ChangeView(MAIN_STOPWATCH, STOPWATCH_RECORD_CYCLE_TO_LIMIT); + return true; + } + else + { + mainStopWatchView->SetViewIsVisible(m_stopWatchlabel, false); + SetShowTimeLableStyle(m_showTimelabel, 93, 60, 65, 78); + mainStopWatchView->SetViewIsVisible(m_list, true); + mainStopWatchView->SetViewIsVisible(m_image, true); + } + char *PickerData = (char *)malloc(128); + sprintf(PickerData, "0%d %s %s", RecordCycleNumber, "00:08:09", "+00:08:09"); + m_listdata->PushFront(static_cast(PickerData)); + m_listadapter->SetData(m_listdata); + m_list->SetAdapter(m_listadapter); + m_list->SetStartIndex(RecordCycleNumber - 1); + m_list->SetSelectPosition(RecordCycleNumber); + m_list->RefreshList(); + return true; + } + else if (strcmp(clickedViewId, ResetOrMarkButton_RESET2_VIEWID) == 0) + { + m_button->SetViewId(ResetOrMarkButton_RESET1_VIEWID); + m_button->SetImageSrc(ResetOrMarkButtonImg_Reset1, ResetOrMarkButtonImg_Reset1); + m_button->Invalidate(); + + mainStopWatchView->SetViewIsVisible(m_stopWatchlabel, true); + SetShowTimeLableStyle(m_showTimelabel, 63, 160, 80, 94); + mainStopWatchView->SetViewIsVisible(m_image, false); + if (m_listdata != nullptr) + { + for (int i = 0; i < m_listdata->Size(); i++) + { + char *p = (char *)(m_listdata->Tail()->data_); + free(p); + } + m_listdata->Clear(); + } + mainStopWatchView->SetViewIsVisible(m_list, false); + m_list->Invalidate(); + RecordCycleNumber = 0; + } + else if (strcmp(clickedViewId, CycleToLimitReturnButton_VIEWID) == 0) + { + mainStopWatchView->ChangeView(STOPWATCH_RECORD_CYCLE_TO_LIMIT, MAIN_STOPWATCH); + } + else if (strcmp(clickedViewId, TimeToLimitReturnButton_VIEWID) == 0) + { + mainStopWatchView->ChangeView(STOPWATCH_RECORD_TIME_TO_LIMIT, MAIN_STOPWATCH); + } + return true; + } + + bool MainStopWatchPresenter::OnChange(UICheckBox::UICheckBoxState state) + { + if (state == UICheckBox::UICheckBoxState::SELECTED) + { + m_button->SetViewId(ResetOrMarkButton_MARK_VIEWID); + m_button->SetImageSrc(ResetOrMarkButtonImg_Mark, nullptr); + m_button->Invalidate(); // 图片重新赋值要刷新该区域 + } + else + { + m_button->SetViewId(ResetOrMarkButton_RESET2_VIEWID); + m_button->SetImageSrc(ResetOrMarkButtonImg_Reset2, nullptr); + m_button->Invalidate(); + } + return true; + } + + // 增加按键事件 + bool MainStopWatchPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainStopWatchPresenter::OnKeyAct"); + uint16_t keyID = event.GetKeyId(); + uint16_t keyState = event.GetState(); + // 如果是power键就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0) + { + uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); + NativeAbility::GetInstance().ChangeSlice(preSlice); + } + return true; + } + +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp new file mode 100644 index 000000000..6c31fdcf8 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp @@ -0,0 +1,385 @@ +#include "stopwatch/include/MainStopWatchView.h" +#include "stopwatch/include/MainStopWatchPresenter.h" +#include "UiConfig.h" +#include "NativeAbility.h" +#include "AppViewIDs.h" +/*秒表主视图*/ +namespace OHOS +{ + + static MainStopWatchView *g_pMainStopWatchView{nullptr}; + + MainStopWatchView::MainStopWatchView() + { + + g_pMainStopWatchView = this; + } + + MainStopWatchView::~MainStopWatchView() + { + if (viewInitStatus == true) + { + DeInitView(); + } + g_pMainStopWatchView = nullptr; + } + + MainStopWatchView *MainStopWatchView::GetInstance() + { + + return g_pMainStopWatchView; + } + + /// @brief 设置视图是否可见 + /// @param view 具体视图 + /// @param status true 可见 false 不可见 + void MainStopWatchView::SetViewIsVisible(UIView *view, bool status) + { + if (status == true) + { + view->SetVisible(true); + } + else + { + view->SetVisible(false); + } + view->Invalidate(); + } + + // 切换到秒表主视图 + bool MainStopWatchView::ChangeMainStopWatch(int16_t thisView) + { + container_->Add(scrollView[thisView]); + return true; + } + + // 切换到秒表到达最高圈数视图 + bool MainStopWatchView::ChangeStopWatchRecordCycleLimit(int16_t thisView) + { + if (scrollView[thisView] == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainAlarmView::StopWatchRecordCycleToLimitView"); + p_StopWatchRecordCycleToLimitView = new StopWatchRecordCycleToLimitView(); + if (p_StopWatchRecordCycleToLimitView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainStopWatchView:: new scrollView[%d] fail", thisView); + return false; + } + scrollView[thisView] = p_StopWatchRecordCycleToLimitView->InitStopWatchRecordCycleToLimitView(); + container_->Add(scrollView[thisView]); + } + return true; + } + + // 切换到秒表到达最大时间计时视图 + bool MainStopWatchView::ChangeMainStopWatchRecordTimeLimit(int16_t thisView) + { + if (scrollView[thisView] == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainAlarmView::ChangeMainStopWatchRecordTimeLimit"); + p_StopWatchRecordTimeToLimitView = new StopWatchRecordTimeToLimitView(); + if (p_StopWatchRecordTimeToLimitView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainStopWatchView:: new scrollView[%d] fail", thisView); + return false; + } + scrollView[thisView] = p_StopWatchRecordTimeToLimitView->InitStopWatchRecordTimeToLimitView(); + container_->Add(scrollView[thisView]); + } + return true; + } + /* -------------------------------------------------------------------------- */ + // 1.MainStopWatchViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。 + struct MainStopWatchViewMapper + { + const int16_t viewId; + bool (MainStopWatchView::*func)(int16_t thisView); + }; + + // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。 + static const MainStopWatchViewMapper ViewMapper[] = + { + {MAIN_STOPWATCH, &MainStopWatchView::ChangeMainStopWatch}, + {STOPWATCH_RECORD_CYCLE_TO_LIMIT, &MainStopWatchView::ChangeStopWatchRecordCycleLimit}, + {STOPWATCH_RECORD_TIME_TO_LIMIT, &MainStopWatchView::ChangeMainStopWatchRecordTimeLimit}}; + + // 3.根据传入的interface参数执行相应视图ID关联的成员函数。 + bool MainStopWatchView::ClickFunc(int16_t interface) + { + int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[0]); + 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 MainStopWatchView::ChangeView(int16_t hideView, int16_t showView) + { + if (hideView > STOPWATCH_MAXVIEWID) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainStopWatchView:: StopWatchViewId Overstep ones bounds"); + return; + } + scrollView[hideView]->SetVisible(false); + ClickFunc(showView); + scrollView[showView]->SetVisible(true); + Draw(); + } + /* -------------------------------------------------------------------------- */ + // 初始化秒表主视图 + void MainStopWatchView::InitMainStopWatchView() + { + if (scrollView[MAIN_STOPWATCH] == nullptr) + { + scrollView[MAIN_STOPWATCH] = new UIScrollView(); + } + scrollView[MAIN_STOPWATCH]->SetPosition(0, 0); + scrollView[MAIN_STOPWATCH]->Resize(466, 466); + scrollView[MAIN_STOPWATCH]->SetViewId("scrollView1"); + scrollView[MAIN_STOPWATCH]->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + container_->Add(scrollView[MAIN_STOPWATCH]); + scrollView[MAIN_STOPWATCH]->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (stopWatchlabel == nullptr) + { + stopWatchlabel = new UILabel(); + } + stopWatchlabel->SetPosition(203, 52); + stopWatchlabel->Resize(60, 35); + stopWatchlabel->SetViewId("label1"); + stopWatchlabel->SetStyle(STYLE_TEXT_FONT, 30); + stopWatchlabel->SetStyle(STYLE_LINE_HEIGHT, 35); + stopWatchlabel->SetText("秒表"); + stopWatchlabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + stopWatchlabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + stopWatchlabel->SetRollSpeed(0); + stopWatchlabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + scrollView[MAIN_STOPWATCH]->Add(stopWatchlabel); + stopWatchlabel->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (showTimelabel == nullptr) + { + showTimelabel = new UILabel(); + } + showTimelabel->SetPosition(63, 160); + showTimelabel->Resize(200, 60); + showTimelabel->SetViewId("showTimelabel"); + showTimelabel->SetStyle(STYLE_TEXT_FONT, 80); + showTimelabel->SetStyle(STYLE_LINE_HEIGHT, 94); + showTimelabel->SetText("00:00.00"); + showTimelabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + showTimelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + showTimelabel->SetRollSpeed(0); + showTimelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 80); + scrollView[MAIN_STOPWATCH]->Add(showTimelabel); + showTimelabel->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (LineImage == nullptr) + { + LineImage = new UIImageView(); + } + LineImage->SetPosition(53, 150); + char *imageimagesPath = "/user/res/stopwatch/STOPWATCH_LINE.bin"; + LineImage->SetSrc(imageimagesPath); + scrollView[MAIN_STOPWATCH]->Add(LineImage); + LineImage->SetVisible(false); + /* -------------------------------------------------------------------------- */ + if (list == nullptr) + { + list = new UIList(); + } + list->SetPosition(56, 170, 360, 100); + list->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000); + list->SetReboundSize(30); + if (listadapter == nullptr) + { + listadapter = new TextAdapter(); + } + listadapter->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28); + if (listdata == nullptr) + { + listdata = new List(); + } + scrollView[MAIN_STOPWATCH]->Add(list); + list->SetVisible(false); + /* -------------------------------------------------------------------------- */ + // Add CheckBox to App + if (PlayOrPausecheckBox == nullptr) + { + PlayOrPausecheckBox = new UICheckBox(); + } + PlayOrPausecheckBox->SetPosition(118, 321); + PlayOrPausecheckBox->Resize(120, 120); + PlayOrPausecheckBox->SetViewId(PlayOrPausecheckBoxVIEWID); + PlayOrPausecheckBox->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + PlayOrPausecheckBox->SetStyle(STYLE_BORDER_RADIUS, 51); + PlayOrPausecheckBox->SetImages(checkBox1selectedImg, checkBox1unSelectedImg); + // Add to scrollView1 + scrollView[MAIN_STOPWATCH]->Add(PlayOrPausecheckBox); + PlayOrPausecheckBox->SetVisible(true); + /* -------------------------------------------------------------------------- */ + // Add Button to App + if (ResetOrMarkbutton == nullptr) + { + ResetOrMarkbutton = new UIButton(); + } + ResetOrMarkbutton->SetPosition(256, 333); + ResetOrMarkbutton->Resize(100, 100); + ResetOrMarkbutton->SetViewId(ResetOrMarkButton_RESET1_VIEWID); + ResetOrMarkbutton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + ResetOrMarkbutton->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + ResetOrMarkbutton->SetImageSrc(ResetOrMarkButtonImg_Reset1, nullptr); + ResetOrMarkbutton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xfffbfbfb, UIButton::PRESSED); + ResetOrMarkbutton->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED); + ResetOrMarkbutton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + scrollView[MAIN_STOPWATCH]->Add(ResetOrMarkbutton); + ResetOrMarkbutton->SetVisible(true); + /* -------------------------------------------------------------------------- */ + MainStopWatchPresenter::GetInstance()->SetCheckBoxAndButton(PlayOrPausecheckBox, ResetOrMarkbutton); + MainStopWatchPresenter::GetInstance()->SetLable(stopWatchlabel, showTimelabel); + MainStopWatchPresenter::GetInstance()->SetImage(LineImage); + MainStopWatchPresenter::GetInstance()->SetList(list, listadapter, listdata); + // Add the CallBack about events + PlayOrPausecheckBoxChangeListener = static_cast(MainStopWatchPresenter::GetInstance()); + PlayOrPausecheckBox->SetOnChangeListener(PlayOrPausecheckBoxChangeListener); + ResetOrMarkbuttonClick = static_cast(MainStopWatchPresenter::GetInstance()); + ResetOrMarkbutton->SetOnClickListener(ResetOrMarkbuttonClick); + } + + void MainStopWatchView::DeInitView() + { + if (stopWatchlabel != nullptr) + { + delete stopWatchlabel; + stopWatchlabel = nullptr; + } + if (showTimelabel != nullptr) + { + delete showTimelabel; + showTimelabel = nullptr; + } + if (PlayOrPausecheckBox != nullptr) + { + delete PlayOrPausecheckBox; + PlayOrPausecheckBox = nullptr; + } + if (ResetOrMarkbutton != nullptr) + { + delete ResetOrMarkbutton; + ResetOrMarkbutton = nullptr; + } + if (LineImage != nullptr) + { + delete LineImage; + LineImage = nullptr; + } + if (list != nullptr) + { + delete list; + list = nullptr; + } + if (listadapter != nullptr) + { + delete listadapter; + listadapter = nullptr; + } + if (listdata != nullptr) + { + listdata->Clear(); + delete listdata; + listdata = nullptr; + } + if (draglistener != nullptr) + { + delete draglistener; + draglistener = nullptr; + } + if (PlayOrPausecheckBoxChangeListener != nullptr) + { + delete PlayOrPausecheckBoxChangeListener; + PlayOrPausecheckBoxChangeListener = nullptr; + } + if (ResetOrMarkbuttonClick != nullptr) + { + delete ResetOrMarkbuttonClick; + ResetOrMarkbuttonClick = nullptr; + } + if (scrollView[MAIN_STOPWATCH] != nullptr) + { + delete scrollView[MAIN_STOPWATCH]; + scrollView[MAIN_STOPWATCH] = nullptr; + } + if (container_ != nullptr) + { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } + } + void MainStopWatchView::PreLoad(void) + { + if (!viewInitStatus) + { + InitMainStopWatchView(); + viewInitStatus = true; + } + } + void MainStopWatchView::OnStart() + { + // container_容器属性 new + container_ = new UIViewGroup(); + if (container_ == nullptr) + { + return; + } + // container_容器属性 扩展 + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + draglistener = static_cast(MainStopWatchPresenter::GetInstance()); + if (draglistener == nullptr) + { + return; + } + container_->SetOnDragListener(draglistener); + container_->SetTouchable(true); + container_->SetDraggable(true); + PreLoad(); + RootView::GetInstance()->Add(container_); + // 增加按键监听 + RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::MainStopWatchPresenter::GetInstance(); + RootView::GetInstance()->SetOnKeyActListener(keyactListener); + RootView::GetInstance()->SetIntercept(true); + } + + void MainStopWatchView::OnSetUpView() + { + + View::OnSetUpView(); + Draw(); + } + + void MainStopWatchView::OnTearDownView() + { + + View::OnTearDownView(); + return; + } + + void MainStopWatchView::OnStop() + { + + View::OnStop(); + RootView::GetInstance()->ClearOnKeyActListener(); + RootView::GetInstance()->RemoveAll(); + return; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp new file mode 100644 index 000000000..bb4f2be89 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp @@ -0,0 +1,21 @@ +#include "stopwatch/include/StopWatchModel.h" +#include "cmsis_os2.h" +#include "cmsis_os.h" + +namespace OHOS +{ + int StopWatchModel::oneDaySec = 86400; // 一天的秒数 + int StopWatchModel::oneHourSec = 3600; // 一个小时的秒数 + int StopWatchModel::oneMinuteSec = 60; // 一分钟秒数 + + std::shared_ptr StopWatchModel::GetInstance() // shared_ptr:当没有引用指向这个实例时会自动释放内存 + { + static std::shared_ptr instance(new StopWatchModel()); + return instance; + } + + /* 时间显示 */ + char *StopWatchModel::DisplayMotionDuration() + { + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp new file mode 100644 index 000000000..24318e8e0 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp @@ -0,0 +1,146 @@ +#include "stopwatch/include/StopWatchRecordCycleToLimitView.h" +#include "stopwatch/include/MainStopWatchPresenter.h" +/*弹窗视图:到达最高圈数99时弹出*/ +namespace OHOS +{ + + static StopWatchRecordCycleToLimitView *g_pStopWatchRecordCycleToLimitView{nullptr}; + + StopWatchRecordCycleToLimitView::StopWatchRecordCycleToLimitView() + { + + g_pStopWatchRecordCycleToLimitView = this; + } + + StopWatchRecordCycleToLimitView::~StopWatchRecordCycleToLimitView() + { + if (viewInitStatus == true) + { + DeInitView(); + } + g_pStopWatchRecordCycleToLimitView = nullptr; + } + + StopWatchRecordCycleToLimitView *StopWatchRecordCycleToLimitView::GetInstance() + { + + return g_pStopWatchRecordCycleToLimitView; + } + // 初始化秒表到达最高圈数时弹出的视图 + UIScrollView *StopWatchRecordCycleToLimitView::InitStopWatchRecordCycleToLimitView() + { + if (scrollView1_ == nullptr) + { + scrollView1_ = new UIScrollView(); + } + scrollView1_->SetPosition(0, 0); + scrollView1_->Resize(466, 466); + scrollView1_->SetViewId("scrollView1"); + scrollView1_->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + scrollView1_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (label1_ == nullptr) + { + label1_ = new UILabel(); + } + label1_->SetPosition(203, 52); + label1_->Resize(60, 35); + label1_->SetViewId("label1"); + label1_->SetStyle(STYLE_TEXT_FONT, 30); + label1_->SetStyle(STYLE_LINE_HEIGHT, 35); + 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); + scrollView1_->Add(label1_); + label1_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (image1_ == nullptr) + { + image1_ = new UIImageView(); + } + image1_->SetPosition(193, 121); + image1_->Resize(100, 100); + image1_->SetViewId("image1"); + image1_->SetStyle(STYLE_BORDER_RADIUS, 100); + char *image1imagesPath = "/user/res/countdown/COUNTDOWN_ATTENTION.bin"; + image1_->SetSrc(image1imagesPath); + scrollView1_->Add(image1_); + image1_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + // Add Label to App + if (label3_ == nullptr) + { + label3_ = new UILabel(); + } + label3_->SetPosition(83, 253); + label3_->Resize(300, 35); + label3_->SetViewId("label3"); + label3_->SetStyle(STYLE_TEXT_FONT, 30); + label3_->SetStyle(STYLE_LINE_HEIGHT, 35); + 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); + // Add to scrollView1 + scrollView1_->Add(label3_); + label3_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + // Add Button to App + if (button1_ == nullptr) + { + button1_ = new UIButton(); + } + button1_->SetPosition(0, 366); + button1_->Resize(466, 100); + button1_->SetViewId(CycleToLimitReturnButton_VIEWID); + button1_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + button1_->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + char *button1defaultImgSrc = "/user/res/countdown/COUNTDOWN_BUTTON.bin"; + button1_->SetImageSrc(button1defaultImgSrc, nullptr); + button1_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xfffbfbfb, UIButton::PRESSED); + button1_->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED); + button1_->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + + // Add the CallBack about events + UIView::OnClickListener *button1Click = static_cast(MainStopWatchPresenter::GetInstance()); + button1_->SetOnClickListener(button1Click); + // Add to scrollView1 + scrollView1_->Add(button1_); + button1_->SetVisible(true); + viewInitStatus == true; + return scrollView1_; + } + + void StopWatchRecordCycleToLimitView::DeInitView() + { + if (scrollView1_ != nullptr) + { + scrollView1_->RemoveAll(); + delete scrollView1_; + scrollView1_ = nullptr; + } + if (label1_ != nullptr) + { + delete label1_; + label1_ = nullptr; + } + if (image1_ != nullptr) + { + delete image1_; + image1_ = nullptr; + } + if (label3_ != nullptr) + { + delete label3_; + label3_ = nullptr; + } + if (button1_ != nullptr) + { + delete button1_; + button1_ = nullptr; + } + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp new file mode 100644 index 000000000..eaf3cb638 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp @@ -0,0 +1,147 @@ +#include "stopwatch/include/StopWatchRecordTimeToLimitView.h" +#include "stopwatch/include/MainStopWatchPresenter.h" +#include "UiConfig.h" + +/*弹窗视图:到达最高时间99:59.99时弹出*/ +namespace OHOS +{ + + static StopWatchRecordTimeToLimitView *g_pStopWatchRecordTimeToLimitView{nullptr}; + + StopWatchRecordTimeToLimitView::StopWatchRecordTimeToLimitView() + { + + g_pStopWatchRecordTimeToLimitView = this; + } + + StopWatchRecordTimeToLimitView::~StopWatchRecordTimeToLimitView() + { + if (viewInitStatus == true) + { + DeInitView(); + } + g_pStopWatchRecordTimeToLimitView = nullptr; + } + + StopWatchRecordTimeToLimitView *StopWatchRecordTimeToLimitView::GetInstance() + { + + return g_pStopWatchRecordTimeToLimitView; + } + + UIScrollView *StopWatchRecordTimeToLimitView::InitStopWatchRecordTimeToLimitView() + { + if (scrollView1_ == nullptr) + { + scrollView1_ = new UIScrollView(); + } + scrollView1_->SetPosition(0, 0); + scrollView1_->Resize(466, 466); + scrollView1_->SetViewId("scrollView1"); + scrollView1_->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + scrollView1_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (label1_ == nullptr) + { + label1_ = new UILabel(); + } + label1_->SetPosition(203, 52); + label1_->Resize(60, 35); + label1_->SetViewId("label1"); + label1_->SetStyle(STYLE_TEXT_FONT, 30); + label1_->SetStyle(STYLE_LINE_HEIGHT, 35); + 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); + scrollView1_->Add(label1_); + label1_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + if (image1_ == nullptr) + { + image1_ = new UIImageView(); + } + image1_->SetPosition(193, 121); + image1_->Resize(100, 100); + image1_->SetViewId("image1"); + image1_->SetStyle(STYLE_BORDER_RADIUS, 100); + char *image1imagesPath = "/user/res/countdown/COUNTDOWN_ATTENTION.bin"; + image1_->SetSrc(image1imagesPath); + scrollView1_->Add(image1_); + image1_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + // Add Label to App + if (label3_ == nullptr) + { + label3_ = new UILabel(); + } + label3_->SetPosition(53, 235); + label3_->Resize(300, 35); + label3_->SetViewId("label3"); + label3_->SetStyle(STYLE_TEXT_FONT, 30); + label3_->SetStyle(STYLE_LINE_HEIGHT, 35); + label3_->SetText("当前已达到了最长时间\n表秒自动暂停,请重新开始"); + label3_->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + label3_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + label3_->SetRollSpeed(0); + label3_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + // Add to scrollView1 + scrollView1_->Add(label3_); + label3_->SetVisible(true); + /* -------------------------------------------------------------------------- */ + // Add Button to App + if (button1_ == nullptr) + { + button1_ = new UIButton(); + } + button1_->SetPosition(0, 366); + button1_->Resize(466, 100); + button1_->SetViewId(TimeToLimitReturnButton_VIEWID); + button1_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + button1_->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + char *button1defaultImgSrc = "/user/res/countdown/COUNTDOWN_BUTTON.bin"; + button1_->SetImageSrc(button1defaultImgSrc, nullptr); + button1_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xfffbfbfb, UIButton::PRESSED); + button1_->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED); + button1_->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + // Add the CallBack about events + UIView::OnClickListener *button1Click = static_cast(MainStopWatchPresenter::GetInstance()); + button1_->SetOnClickListener(button1Click); + // Add to scrollView1 + scrollView1_->Add(button1_); + button1_->SetVisible(true); + viewInitStatus = true; + return scrollView1_; + } + + void StopWatchRecordTimeToLimitView::DeInitView() + { + if (scrollView1_ != nullptr) + { + scrollView1_->RemoveAll(); + delete scrollView1_; + scrollView1_ = nullptr; + } + if (label1_ != nullptr) + { + delete label1_; + label1_ = nullptr; + } + if (image1_ != nullptr) + { + delete image1_; + image1_ = nullptr; + } + if (label3_ != nullptr) + { + delete label3_; + label3_ = nullptr; + } + if (button1_ != nullptr) + { + delete button1_; + button1_ = nullptr; + } + } +} \ No newline at end of file diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_END.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_END.bin new file mode 100644 index 0000000000000000000000000000000000000000..85ed573cfcbc13bc5d5f3c9fcdc8ff995643e97a GIT binary patch literal 6824 zcmds5eNa?Y6hHUf$Kx$MVHX%7jrPGqf@I{elpp1|@9nCI=Eve6!A#N;G^0~mnd3NW z?rz}6Q%n@ek7*{7{t#!Hu&J3EbyzeJCY7|N(V`$R(^QeI{Kv;^^v4aRYcKLi`EE!Ot=kjn|aldpY28 zIa$u#THMwY{S`=~`(2;fgm>ykuXVO!vf2`uktYyXs@Ja9~X?n7vCqs(q=Pze*Om)RbBZ z7)a(Q-JhGqCw{-vLSz${Cm%#21~_$*Np*HvCu4yo=_%Ff_HI``M7n=LJs+Dh-z*+36KeS=@f=D=H?n`X@m=|OE&k8q&`vNHt_;|g>Hh0@IFvCg zkLjWdbX+&Sr#n<{{x9+C@#^u&3iBp~nF68fx)mDLUb(dd0R?GTFq?sA!C^u(GA1C2 z;XU10?MC7Hk)|P^MX*G+h?zfgC;X4 zXPw|nuc%fH3jj0g$nSMuu?wV91E>8HZcncF5q_yw(*fFYVZM^&Z=Zw%>QCwxwQ=bE zOZa{Z4yenBBgv&)PwK*}&%;xjH&!SLTFmB2rV1}~hRY9?EjWRvqt_F&#p@soC3a@LhyKh+A~J-!_9YQRr94J-b__U3B&A(Z0Jt>hFv7xjUWe58C==sb`r{!iy&xw-N1cR&9|&Qs^WX#(&`e5CtD zDqp;Kiv#0;R?#+?(`rr@2l2o(IX^&ATy3QGjO1mLG8i9UVIKVcqc+U_=F`9+-G81! z^tI6)CpCN)t<~!niBmSWk@!NimMnjB9zuNNAK{Mf#`4*ZwfbTW-dE+K*J%Gp`Di`F z`a1xs_Ot@H>slRI3G7UmR`hCy8CVI}NbQBoJIMXo-+z#Bxdw15d-=L|2I}MMuq|BP zh)zvNmqyu95ks=$5p$Z!NIp`2Ztl?-3C$$^#?b`Q$AdgOkDUn3;^B_C2FUsU_ouGC z*=tXEC+B%N9+Qp~U3d{!n}bi{R4z*J;PrNj?Q-Adqspv8UUv^M|W`-EMo-{shvW$L{nV z7spwF>(>3z;}56hNfJxyh|lehF3FZe_EbwrX#Pn2KXiiE7#xLpmw+kPAe(Kfc*L|u==G$66@JlLl5Jh2H_wV1v zZ=@f@$FExl+L`qPnQu=`d=SdeTZubP>-x6}AKA1twX{n;l!lpj?TeH6EoA@mGbRw9 z*zq2Hf8E2|O*<7UD=?B*^Jg4v-*oySP3BG0i((72VPX{Nz`n1bocKqrKVCA0JZUW> zdV=qTYbkE>ngocqY(4H4AAfR}yDHaD2DtLZm5AX9gH-t4v(uC#>=YF6=S)l2gaK-X HJKo;`U2s71 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_FIVE_MINUTE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_FIVE_MINUTE.bin new file mode 100644 index 0000000000000000000000000000000000000000..7dd2cf84565880bc0f67d313f3b6e0b51b026782 GIT binary patch literal 21624 zcmeG^4R}*kmgnWAXu)x#ymHK>*l+NnwpU>fAR1{aRWT^}AAGF=7B(r#}D4c@CFaErOeC=1C}zo?N~M6 zzltCrEWEAW@KFz=1nDJ~LVzosf8C9rP!4vGka6T=0G!+G#sOdu$LWeZRzF3#+^|?Yh2UeiTI`5V(Id{hrQ>rl(s+Zt)!Yh+fb}OXfoOzI?z>IJdVp6d&wae#x_}7>0`p9l#TgnsHgV(!Augcp7 z$%Eh*L|t8V`d#$*3e@f}!+Nmv;Sm4&{=@sZg5Fe_ZPerXXNl)msbd-@m0u`wZN8Je zW2)T*jSTQT0CvaayOUOPTaJx2K!L1l#Pzj0dur?a2j4am-AF#sxSF&1zQ(%vS!A8K zssjwVan;!yS_hWCy;04_Uj?jV2L2G%DcF-%|eeEoMyxJbf@<_MIDP+Xc{wO}(4Xf+t7%~#^!+*qe56-DLv!}VQ z6~XiU+Tf4{1RvjvYP*bJaEm7HUKGNT+LF@+HTy|%u< zyyMu3iRNoyNn1WTKEf5^@?G0ja_lkIfW)qXS0Qe^PGTH5E&%R?BzOttMdfuq`iVZ@ zlMBf^myW5}f5f*0`8gPV5#cA-{qh!*lFF->v@sS~zG&ejSEux7`RT0h!Ic>-3v8JX zf>c>2?43U0-6KjGna>E-S6zc4nl-1rNLLH&ZA3grcM2d1_nBu-JhT6&P)Pg(&& zEJ&)3)aDCJv12@@2>$v>3x;sEEpHF2Nd?f$iIv*&R~qcxu$UkG+Ju9Z2SEm72<^8H z`Wf}S7GGTd??GCnBsm4{!vDnOmk)Ie!8Aru=dfOAI%BAUZy-f}wi=B3s680rSG4}c zf}LOW9iLk?oi`j%PHyxznYH+7VU+KbaNjr@(7saPMl^Ny11y4g`$b#-YKL9h{=n6| zJl0@`?;#aUJe2QjDhr$-wVl!D-o_bM++?uU*_S=J|G2A}mZxo8D4Z|O82?Num^Oj6 zB)?LMju*O~h^)hnrm#f&6PSsPJ29y+7e78JKD7SdI~>C=oU#J*501MqosWNM_h&Pe zOry1;)C>Fwi0U`Wf6C9F3kyw8C(D5TBSY|&#KI>yTA#`%X1{K`LHfQ zdR<%o8XWc)QvRVnI{@4(FwA6eL4y%Gv+vwV9^>wj2CHT1m=)&ZY?tS=8~qPtf6f)i zU`HQcbbS@hy}oMY<&IfTzlodg+VU407NK{66%!f1d^6hfU4-2Xt&au(eis`*ZF_EJ zg5!2fYG(j;ZN3&pc{s?|R!Z0B$BlLf*bm`;%VdX6*Jsf`I*)B$#+bmg$X+roj=qTf zZ)UjRP=!ls%zlHr^!(7$>t?n(UdDv`UnEZ-#Wy@l+WnV57tUZEZ7SygT3O&PyZ=*Q zUT{2*NtHJug7fbLu+NPUM<4zsMNQn|tNb}YD9m-Q!+&;``;y;+; zt!Q2BoxCJkp6U~UneOmlij>!r{sn+xXfZvi1O8rt`6tICnAChO9v|92ZSO*1C-Gmf zZ(2!zj7}G&pUP9HZc~)K5s8Hqr8>K`> zN9m802ccNc01J26Y(0Ad3hLfLr|`VR#h&U*N=Syz@ayjUY-92-*#J0T%*OAYWa8!P z^7|T>??Umr(E6x9bhy=;2w+x! zXnS=2y8S-6xrm(p8G+q&_3g*fk^i<}khmIDd&pIMmb2vsSs2M=pNs$E+%e=lwP(fW zS$tuwrNsReYfRu*u1ap%kmX4XFqA)3zFPYj`Kf9yfbX{g|Hwvd`O6JYT9T8^avgO_gweuV=aHtp0AC}P5?O>_d{z7Dlido z;kQT&6ZxUCn*gwD9Ln=EfjQbP-@}T6{>H|h0mp{t9uApXL*|gSzwU;svv0U1)x2`$ z^Jp6q15u05n1_Ai2G1ZId29Yc(Ez1uS1>R z)ABf*%@@28H3lcKvbKD8!!iCK6l7=k9A2}!QBiWjYmN;4)%kl?f$-1C%f3I-;_KeK zkK4lL68)@`6HI{em=l(VwEphv-n41Um!=ST$|%oKb<9YBX=_)by=-Gcy<|v!DWOw- zXxr;<*xCDGKKC#)bz$Ou+}*4DMcr9N*`X*LF0u_Kfw|8y50lCh4)^QD`hCORT04Ks zl3UtVIuXu0#kG|VxK7Pi&UmLio`v?dsg-DaS^Uk`?xwG+{ZC9G@^rDG-W4|t!i`aO z-Lt?lM0G|eZy>Rd3F9m8}MhLQh};&pT878x?Xk$i`2ihivgpheLqa=$HXVe3#0KY zb@SG~@u?9YW8aIYpIx{adG$XSn0J3?{axyO^mkK#(;nb^f*bb_zWU}YSgPN+|HR23 zY5!E-S{Ua)X9>JGwDPxA`-@u0`QFfiA(+BCF#ddx)~Ecs)Nsbvedy)7>g;DNe?@T*7tFDh{e|p+EIgB* zkpmCpTjZI)@AIzoZ}+phj2yXEA==j?zPm|$*Uc2Pkrc7f>a^`$ZLovR-;LEK67SP- z{RQ0}o3A!{uHhTjOjMt!>u=2rTz^g0q>wzL-F^m`!za$y@(b;?`Su59wchOsYb30zx(ER;JxCXwB;lFt(%B19`{=-wE5i)I}c97_0w^1-E_Nt2-2(CN2i{K z5+OVuwfKqF|HbvpR`yfT(Cc_)kdtX}e2xiA8+rUCYYaq)y?|C?(g#J@G4;of}BiT*1dbW>03i$XoTp`y!;Z&&+sZg-)4g8%(? z7F&tx1MfTdxF3qPko{qzESn46k6Pf9qJ(ObotY&!Fw3;|aQG z7Jk^+R8*FRom)>_FED<`DoiRe=#M4xK)1#kfWrW17!W71w2XOKHC+7((a==;%R>{yPG>b|11!`+kfCJ(tz_H6w`{O4i)H3dl@l^o*FBJdI>bsfNf)-4qe-6*AoU94G7%+Q@PEaC6D$CqylDp>(q*2@mYLNFNhB*@tfe(_qNjw?d zaGJn7y}$cuBDAHzkL~A4bpMb(_cKqEdLB&9Q$JGc!^cXA(pontBts}2@4LAE5;;Fi z!2L7R;k@D!=wpF-*zpi1m7f@&i1;7+A3bm{=)qG4kQozC&Bg0u*WAfQjvJdH=wlAXjDz^Ab3kzvU?eTa#n1qObdK&RhbM56Rzi535yCUlaIdmkS zHvbwNyFYG^H~o3>FjOAu{RR|Cy(NFTX$J!y(r#FQjOZxAMER%Q2Z;dEIqa9TZ~HP;-1z#i zvcW#RS;j3U+M6BjL!N^lDDO`QKNjer&I}OeFQokBiM@lN+aG_~7wuiyz6_l zYwvRBi`$;!%4~y(wXW{Ro%I7b*YOAMVlySS3S)M=ijTNZ&m2K-k_4N zw7ts(<9+jCz@cEmpI%%yVopWto@R@s?&yNY9*f?8I-k6${eKVK!sNh`DE_oOu|FOI zn5Bj|Y_9O0+!vLwCc@ykAupE=!*S;}9dW#NzuB z#sRw2si~RdeT;a1#OUX9>@S@Q&0LMmc1&-mlUPoUi%9`*;?g8A?T+f@tg%gY>ZclS>6ORa6?X-Lt{dRs`sj#r!qn=-o_e9X) zd3}B8>_>K7S5tz`Of#B*lpe|-EgUnS(B-7fcg=l?v(21k;F)Z^Kiz)6jJAjV+GE6) z@kAcc3B!08i1r$C9^YpRMBWPu zV2>cI%L(91Lg*YM{D330yxJW8y4qoUKL+KESN#I`gbY|R#l2SQe@S29Zu3(5&d0B= z=EuY*@fO^_b&OXsUUdJlke`M0ePlmGp2&IiuZn>4Q-yJSqxtoFivRx?d3HvRy54M} z)Pi0Ve>tb(EW_MaQOek1LXoeefxIUebOwVrkYje*-o=uCSKA}=@$*xuZxFB-%dx!!LOY*SXka)xZ3oqcDHn4dj080dK_+W(K}M=+4s-|6QO5cCP;+^rMhB RoZxdbn>7)9HeKoR`adp!i39)u literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_ONE_MINUTE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_ONE_MINUTE.bin new file mode 100644 index 0000000000000000000000000000000000000000..d0efbc5075b0b11528193562ed425c2636aeb761 GIT binary patch literal 21624 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 Uze9gK!q3OqtcCEit-s^-|LqOWivR!s literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_PAUSE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_PAUSE.bin new file mode 100644 index 0000000000000000000000000000000000000000..87c18748a633248f2b5c518a6157304d04a31c81 GIT binary patch literal 6824 zcmdT}Yfw{16h1dMCV+}jpkl2}h#m8M_c5fDPUzrJ5EPi3t>`6J5~gxt$&I}%cwXV5pj5^+3pQ)?8IRZ6JMKO=bqiO z=lkxLJ-d5>0a%NFh<00>%?1EzkDnl0bCs>kj<`_ZGYnwU99glP0*0M=q2R0Gf*tfV z;yf|jgxkD{)3I@HD8RuLHz0~@~qty0ILsr;2ri*`nm9s z3llRoe8ojA2s;ttNc@Eh&E}XGgq*dRsKkffVNX~~uDl}?p-0T5gp&m=wLik;?h#h- zeC7NQ{7IMPBAtN$gjaK0`mqnsM)PUgw#~E8?<%~5<%^kHx~JI6A<87k{2pRchAg)H zleK;;rAZAp``Yt!mHwIg-dOK~{$o;$FNNCUzbX6!@x?@4-JDU$Ayr~W&Nt}ZBPK;@ z)AO1uNe6XqVi6htqWnZ0UuiDz2^P914#j^^M%DSh_()CSy{&vW=Eqhm7F#-76Gl@Z zsmMAtjrd=fk7^q8Icu4oM;%giyPeN>1wX;tU%nBBnKpb!d45DA4C6_E!q3H;;0NN5 zp7_P%2dTROw9G^4drDDX(Yb_1kpBI}f7kqM)KsjOn+Y?hki_lXQ=ZdHgyG}7*alw! z&E$5FhP?IbgR}fIhCQ3N8%zBH(|fy0>(HaPNm{HIKErru!-+<$3D%v$>+#*Br4;`| zYJ9rX+4&sDo2w}EJn7KoOM_DOFK8{F)g=0(e%xHq9A%oJXyO#CN6Kcy85)G`#A|;a zY!t@dc`G4-;(<1W@LmRwEg6Aa4=$yh$c$)5JkHvobSyoa`VN$y{Cr9=#*Vk|4~bAD zRc_5f#a5Lnz-Y|BolE$6K=V>iyn24T?$BE@D%Aphak3g7`$gjV-8oYpmOJ#4-dyu#?Wo)t=h0%tBIfCSW~cgEL*au~lAo*Q^P~ItV3d^q`l5fwhW^wKSJHyQ6LJ{;o_epD*|fHNoaFFX33we9+-5cHvZX?;+^I%8FSj?3R) z-~U60Pg}G3q#JcTtG@JDa+)oRo91y)GI3vTva|Rd$BPWKaQ>?1y18Dd8g&tWfBMi; z)9c5@i>_NA_4Qy=4wqNDm8cKR%ofVeRWjaH`iQ-2%WvW8Tsh@)yys$4=*lqw-f>Bm z&Kc$08vFZm)qM8)LJRd}vwb}zd_2Y9XzhB6UsYqtbRT`7MZFimBwOKX{EqSZ>I;%% zuEog!qVc~);Qfeq+_jxX_DFR80>}Q&+PHo;jhm|k@P&3TO@<~>Q@xJ~Z#9nWTj8(F z(KGI~cY-6Df)~k=7AMu@?0kbA&xFpsu%D7G|Fb4`(@}+3!-R^@)zHbymre%Q5Scn` zu<_ot{%lpS*Yw#vrPWD53_p~C38qBt$Sawq zFDjX)(1&4RAv0q%N1UEktuRpv4`Ms(xFF!ZfbK+jDqQ_E0O>sljSpGx1IeFhu^N(bMI5j`3>NQy(3YN- literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_PLAY.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_PLAY.bin new file mode 100644 index 0000000000000000000000000000000000000000..97b64f8128f543604e1a305618d9162d7e614dda GIT binary patch literal 6824 zcmds6eN0nV6hG}NrDZ_NN2APz2Z&3WK`eF@hpg>uWkMDvt;wc~49rw;g5e?CvW?Nl z&|#geQv!EB*>k*1mY%K5h2~zjweZ9(5hmb;1QGNmmsw@`W<}L%#oDd^ini6ZxOHIl1 znoP!OBV_F;wY62%coN~XJm%0Q$chYuGCdIqz_jIP>N zpt)RWWU4Ih5MnBTZ)156!b*fJ-24b_->%UhG+mj>UwNzevKO7XK;GPf&YlHlcm^OsDm$@2x z;|2Q4#kRR){_z$6lr#RQY-=F?EBAM1jLrX~@K44UmEY~0(_}%G*5N%(=mzE|1;?{o z`&_p`u$Z0t`7*Z@4bX2qgXt{ERS^J`(mif|q?^p2*`_yjJymTh(|F5`Or_7Kex390 zVdI5z>JG`mc4^})0m?czM{?t5YdlQVKZA7%ju(2}VTO@8Ad=z6bNmz?OH(`65$y{6 z!)h_W3JT}7+|Guel6g6@~anfI(X4q_w^KV4G!#KtqD* zt`|DKXG2z|Tq2~tBvs)hyM(YpK%APRnh&>$5*&^9^BadRs3#EV%?xbWJ(=|p7oz{o zK6JgQ%2dWGHx1Y5#1Z-csge+J)(98Q$HSN(H?kpOs`E`|PYDomqO1PfFi?-gT_p^Evcd7W3jygRrvh&Y@_QcrHmaw3*X9O@tB4aH%3D3rz>NBFn*mMzoK}jd?Bv5pAw`964f;v>;X!F5?Bx&dWcB#N@gW>{UI4jtGksn{@pJqr zm8lDU{O+@hp?d!0hvVaMpBHl=KI(9O(=x^VCx?5i5t)usA+<|UE^YsQ@G5`!L*r$3 z@=-82mOliFmSKBwMo|JlZ4Nr;I{yvxmyd5g{&BzbB1B0C`cPl57ZsP!ljnRo5V~Fl zK?rZ3`T|nSb$O{tdnAN1cD}qu>5_>kW~j&UYpDHn<>37ixL-w}V@BtnH{kje^D(bZ z1Y+R5{^;69X39maNuD!*hyZ>*$<-hJ>z7GjM?>-4t2g}Wp-U_Zr>uwjP+NBf>V2v2 zRbcu41Dr0}DONk)7Utp2gLo`2%Kt#^$!0S=*-6D6cU;4K`}3sd zGg%kl_ls`S3Hsf7J%~Af`~m6zLS_8^Q`bnp!tWV5e*J-*({uIoe_b|wOJIDl7#~Pj zh#IR0gKRv=hgsQ3+X}PA+pxh9T!yapJ{&7^lYQCpk4AMC-ur(u&98aGCE9p4D{?Dn zKkw|jAMX?4=lq#SZ?eYyvRtGec6vuobr%|!aQ3q`UMT6!VE?KM_s34)`)toz+{&nZ zzSm859>UL8&i{$wA?i<9NCltxP1#Ihwe{WdzaRd08hgTONy%0AOATB LD@%Y);~UT4i*`jd literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_RESET.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_RESET.bin new file mode 100644 index 0000000000000000000000000000000000000000..2d3105e7d64bc42957fe07d03a8ea09542d7073d GIT binary patch literal 6824 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 CN9&3J literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_THIRTY_MINUTE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_THIRTY_MINUTE.bin new file mode 100644 index 0000000000000000000000000000000000000000..ba69e921bde8ce9f0d84aecea0262ad0dad405c1 GIT binary patch literal 21624 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_VECTOR.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWM_VECTOR.bin new file mode 100644 index 0000000000000000000000000000000000000000..40be9d194c0544c9fefc1b1ecf2dd1723a73d6d8 GIT binary patch literal 584 zcmZQ@WMGg1!vD-1G6eyu3^3sA$#r`j{H^$jV`O1tqBsu+4;ur6V>SnaLT#FtD9y5LVz}a9&x! zVIlCnL4l2>M}pB{0dwVEF`#)T&gjT9s+fq>{Q3JI4AQ{h|No$s3s}03Z*XK`IKZI5 zuz(@n(vXp%;rzKA83qPd1BM5Vk{ONX@AcgG;Q`urzMKbLKOw%OVI*S$Ly_X5*bNy0 z1{}=3#&@L{7!F8?tu|F?(2#K`jspxreW9$){QocT1H)76M4=i3n?i%WPu$<1 zWs=YkI~e7`X7KOhv?$<^(9K|&1ZmMs@_G#sy9 insSSMErfreB_jR)Upqp@aeMa#(=7wRq!>7Q*+StaFP8&En_sm4^x;%Kwa;)9_p6G< zJ+0co05d2s&_)Q$`d5YH5pwWgK>;CF?QDP%zGR@IMIoNq@Ld(2hrVdtMi*%QNr+?Y z7-O>(9PWG)KnwnbW&AD?|Dt#TblE3?)IK7R3ltnC_rJ7Ht#5phD^N9!)LS;T1ellzObGgFHH-EqS!2TYo%@!Fj6dq>KF%ZWclZ3H#YE<$uE&RQS{R>X6!&%6f; zr^R&OLrar9-<8_d+--R++GjvIFt`A8_vZ7u&zn{szn$Uz&BXkYwf|&*NhjDJp_j8LkH1N#z|z1rvq8Hv{>JxImc>BJJf$2iW+TOuuiKniiEuSH zF1J5B|Fo(UGP{juehgjJM&Q&lkPz|w9sR~cm|+G_00$S8qm+2wDXDdP1QwGuVt=`x z6W4c~fNyh34mkP#4)lV((WLheZOfMnEV<#jbwutTt^KI+(Ph8ueq${dTL%_~ zJhu7-yV<#WqzY!<`mO0F%|dZQ@@Vz){l6mKe+5|G2OrKu1DVxje6aUP?58h!uT{la zAm;ng;*tBy@hQGuKS=P({Ug~G`Fm0T0y|GCfJ+07Lf)^HcI6pejJrtH3GmuxwQ}2` zxUaBZ$mMZE;}6bHl$!@i)39~mZ#{Io%B!!6v|pt4M~zRupLwi0Z?a~%RLr?ypK!6# z9ml_PBV?ap8U6tKG-a0VM_ug+oR9S^TYS|WC)M}zI0(RP} z`1m`gxs(3?;uGiI`(oK1lHS*gI8qRQ7~he0P-R7nNA54jx6=6{kAKzt5MRydEhQPx zJeX%txKCF2HV&%tx&D)K9G zTeM>TyAJOmB~35xwd zyMGqYJ>l8J4lK-j2;t3T&3XQ6rB!_372fFi{7U(YJm0MTSj30*|)*6~OG{jo4%Kcv4o@mGF9{(U4nTu<9o)JJ&2R_Cu! zzleNY=Px8nti(?<6e2mjNQ!5P^~3Er4QH|>|?9vd`i?4 zq1V$u`5(O**0=Vvt3>|1S>(^w|uq(#)d1U!76>bkor{8d%ou&S|`^f`5tn1-xtOBjvl&^>BUhJyW-1ed+GT zIkCQji#?#>>X)vKR`Wid;H3VRjzbJ~4)sG?U9C`p{f&2S%8L4=L}7eA$z7VA+1+V( f??XK{L3ET6lK#T7nWh@4J_Nh73cTxAn(w~>)-Cjh literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_BUTTON.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_BUTTON.bin new file mode 100644 index 0000000000000000000000000000000000000000..5f89b63715405a59b75d7be0a7a6369b2de2afc3 GIT binary patch literal 31224 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 literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_COLONE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/countdown/COUNTDOWN_COLONE.bin new file mode 100644 index 0000000000000000000000000000000000000000..f3d90d91fedb6aab0cc7d096321a7fc55b77d914 GIT binary patch literal 312 zcmZQ@WMJT7P-ghg%)!$WpvnLP!JM2LLQV|~4h#nvKREC+IClzbxNvYBkYG??XkcQv z;MBqO@jnR2a|qb~|8F19-Sq^*V_>TJz{ucqQRl^fZaF47CR+wR2Id1!A4LQiCfso8 z0-E>n2><^-e?gl6|A*N}DnGE5;UA;JHa3`k$3`GO0m@TgU~m#tdLb_lw4d$&fBpK; zJWdz66_ut}I5r3{Ixy%k@cSCy)Dhrd@>CNLFk*5DdkA*_{r~bu1Q-}n3Jx*^WwLTI hF#L0uXFtGrK>S0wGp8gc!-M^D3>O$rFih{51OSfgX)pi) literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATCH_LINE.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATCH_LINE.bin new file mode 100644 index 0000000000000000000000000000000000000000..28019b06d27b832b307fe75753cef768ea26e3fb GIT binary patch literal 984 zcmZQ@WMIf(WMcTw%#pzvpvnLP$|pD<{@>sD@P54;8w10E+oSx^@EA=GLnl7~0Ct@4 AL;wH) literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATCH_MARK.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATCH_MARK.bin new file mode 100644 index 0000000000000000000000000000000000000000..482ef15ca5bc02b469e18d1f9d71aef864b95462 GIT binary patch literal 6824 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 Dn8Uz* literal 0 HcmV?d00001 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATH_RESET2.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/stopwatch/STOPWATH_RESET2.bin new file mode 100644 index 0000000000000000000000000000000000000000..2730fd954bdbe5834724b32b713d177674a8f017 GIT binary patch literal 6824 zcmdT}du&rx82{a#uB$NEc!Y-nyKM&|vQRo6#y{NcI%E@kw1lXM2}RIsq7g-%Cc^IA z9IFt6+cXgVSjmbybOxNFiBs;F8Zntj6a`UM7>M9d1X+=d9lv|qI|638bn6h#S+{$8 z&iDGAbH2wJ+`v-moLQHy^G<}`x-M|7Mc+B^?|ZWeF4_6%Z=+%Y_I&(;XnW)^Qx=C! z_4N}4FB|2;x{6%;@IYS1mX(4}$eQA!ju-E!*?nxqxf~{~Ez+Cv>%yJH58%8e!cjRG za5LOStm{)CY7+XZZ-43C0(4UW0mvDa9kkUdf}eEW@h9mkWI0{bHDx(3*5!@W+C{wk z`tD{H!Y89L&mPFAw9X268FC?g^QipW5af|Qx;#xj>6GYqvfmQrO}|z98Rm1I&3Oqw zhE{Wr{Jz?!>)Tg)!he#BdJO+gRX?edBaH*k0g}!?QTTYDDnn3oG}{@rzEN%wbpCzS zf1v4ob+0NpOZ>o}kyu641 zg;kBII=^cbkIVJT*)v$S*KQ(vx~B2=)QCQ=+IA&)(0(I-HmK-+6wO1Cr3cUJ#eUu1 z-t<+^6Z~|TE&$H}eto`<&jJBc=s5{#(Qn9K-9heq`%jO(Q@?%BW7pk&(CzCLkLl*% zAtr}&*aLGGN=ZI_zK)0HpZA&303`{_FP^X7`04c5>$sa)wfIzE542TU?P`1)Ls&>L z_kbuK?Z{fDv}5b|0Y4uL3TFpzaz4(JSC7z^WP~>$oym5z@pK?E?dKgiY`zKA5#a6U zin+G!mQG~1WjZLX4t-uoxPI>G`=JDzUZQvbIIYZ+FN=023X_j#B!xy+k4p6Vd!8~Y z1>Y~~vSo&n-X)Qmy^w+TrGvba7YkLNiH^30)-TnlF3laOjxREUFGD9^7UtYNcCU0I z)8XjmC)06T`I1EIclRe;B&TV8>b~@3`+EY&@pBimskHb4pdT89y%&zo|XK8(gNAY_Y-*TMi=;+C>5_MkP z%tZO_zWt3GS_1o0DYLB~wEW3+3pln=pn4L?se04pGDX?ol^zcn!(5>t%%4xPeFuz>9m@i)G z`nt!S6&|O42zrINPmwobJ7gzXcRi~TYqWwRjB?$p~{4s z)hQa$8;yG_EIs~%QW}$LPnfU4U+Hjih=%9iEsV|@MP1WJtCuL=e8BNfy2RJ4;}#?N z@s4K+rrR}H*f*(gu}or;4#I{6eyeMyXG_F;^i0bd{3YTe`GgnHS-Xmx?C6$63<5c z@A|5tvv;X@Mb`@`KxI$8ai#tyUVUQsDHw#EP=?@ZPksY}vW-o~NMx{)2|u6l>Nn8y zDV|zf)WutlZVpvfSNa4kKaDMcNul~>YV1XV0(kN}B{qgAK>zwC)uzNfAPN|T+*Q-+0PIv+ZHZ}uCFdjeGm zlE)P-Q-x4+_0#(NYZVV)epz(=!bP1IX#L!UwQ#Ut)O=Vs>H7B-k4x@PY14dH@G_Lc zHnvN!K z2>umwJ;%%FenDho5K33$+lb%G{EH_#nE%5xHGIJ*%$z!dI*vrN{oQObx$wn%cUGj? lbFIVdWyFu}Z>W9S9Z~SO=_ literal 0 HcmV?d00001 -- 2.17.1