--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-11-21 16:06:32\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h\r
+ */\r
+#ifndef COUNTDOWN_MODEL_H\r
+#define COUNTDOWN_MODEL_H\r
+\r
+#include <iostream>\r
+#include "source.h"\r
+#include "audio_manager.h"\r
+#include "../../../../../../middleware/services/media/foundation/player/interfaces/kits/player.h"\r
+namespace OHOS\r
+{\r
+ using OHOS::Media::Player;\r
+ using OHOS::Media::Source;\r
+ using namespace OHOS::Media;\r
+ using namespace Audio;\r
+ using Audio::AudioManager;\r
+\r
+ // 计时器铃声播放监听类\r
+ class CountDownRingPlayerListener : public InterruptListener\r
+ {\r
+ public:\r
+ CountDownRingPlayerListener() {}\r
+ ~CountDownRingPlayerListener() {}\r
+\r
+ void SetOwner(std::shared_ptr<Player> player);\r
+ void RestFlag();\r
+ bool IsPaused();\r
+ bool IsDelayed();\r
+ bool IsResumed();\r
+ bool IsBeginStopped();\r
+ bool IsEndStopped();\r
+ void StopCountDownRing();\r
+ void StartCountDownRing();\r
+ void OnInterrupt(int32_t type, int32_t hint) override;\r
+\r
+ private:\r
+ std::shared_ptr<Player> player_{nullptr};\r
+ bool isPaused_{false};\r
+ bool isDelayed_{false};\r
+ bool isResumed_{false};\r
+ bool isBeginStopped_{false};\r
+ bool isEndStopped_{false};\r
+ };\r
+\r
+ /*处理计时器铃声媒体播放事件的类*/\r
+ class CountDownRingPlayerCallbackImpl : public OHOS::Media::PlayerCallback\r
+ {\r
+ public:\r
+ CountDownRingPlayerCallbackImpl() {}\r
+ ~CountDownRingPlayerCallbackImpl() {}\r
+ /*媒体播放完毕时被调用*/\r
+ void OnPlaybackComplete();\r
+ /*当播放过程中发生错误时,此方法将被调用,提供了错误类型和错误代码以供分析和处理。*/\r
+ void OnError(int32_t errorType, int32_t errorCode);\r
+ /*在播放过程中,为处理某些信息而调用该方法,信息类型和额外数据通过参数提供。*/\r
+ void OnInfo(int type, int extra);\r
+ /*当跳转操作完成时(例如快进到某个特定位置),该方法被调用*/\r
+ void OnRewindToComplete();\r
+ };\r
+\r
+ class CountDownModel\r
+ {\r
+ public:\r
+ static CountDownModel *GetInstance(); // shared_ptr:当没有引用指向这个实例时会自动释放内存\r
+\r
+ bool CountDownTimerIsEnd(); // 计时器是否结束\r
+ bool GetChanageToStartCountDownView();\r
+ void SetChanageToStartCountDownView(bool val);\r
+ bool CountDownViewIsExit(); // 计时器界面是否退出\r
+ void HandCountDownEndOperator(void);\r
+ bool GetCountDownTimerIsPause();\r
+ void SetCountDownTimerIsPause(bool val);\r
+\r
+ void SetCountDownTime(const std::string &countdowntime); // 设置倒计时时间\r
+ std::string GetCountDownTime(void); // 获取倒计时时间\r
+ std::string GetBackupCountDownTime(void);\r
+ void SetRingTime(const std::string &ringtime); // 设置响铃时间\r
+ std::string GetRingTime(void); // 获取响铃时间\r
+ void ParseCountDownTime(const char *countdowntime);\r
+ std::string ParseRingTime(const std::string &ringtime);\r
+ const char *DisplayCountDownDuration();\r
+ void CountDown_StartTimer(uint32_t interval);\r
+ void CountDown_StopTimer(void);\r
+ void CountDown_PauseTimer(void);\r
+ void CountDown_ResumeTimer(uint32_t interval);\r
+\r
+ /*播放器相关函数*/\r
+ int CountDownRingPlayerInit(const char *RingMusicName);\r
+ int InitializeAndPlayRingtone(void);\r
+ int StartRingtonePlayback(void);\r
+ int StopRingtonePlaybackAndReleaseResources(void);\r
+ void RequestStartRingtone(void);\r
+ void RequestStopRingtone(void);\r
+ int ResetRingtonePlayback(void);\r
+\r
+ void countdownstart();\r
+ void countdownpause();\r
+ void countdownresume();\r
+ void countdownstop();\r
+\r
+ void SetisRunning(bool val) {\r
+ isRunning = val;\r
+ }\r
+ bool GetisRunning(void) const {\r
+ return isRunning;\r
+ }\r
+ void SetisPaused(bool val) {\r
+ isPaused = val;\r
+ }\r
+ bool GetisPaused(void) const {\r
+ return isPaused;\r
+ }\r
+ uint32_t get_current_time();//获取当前系统时间戳\r
+ public:\r
+ static int g_CountDownTimes;\r
+ static int totalSeconds; //要到计时总秒数\r
+ static uint32_t startTime; //开始时间戳\r
+ static uint32_t pauseTime; //暂停时间戳\r
+ static uint32_t endTime; //结束时间戳\r
+\r
+ private:\r
+ CountDownModel() {}\r
+ ~CountDownModel() {}\r
+ CountDownModel(const CountDownModel &) = delete;\r
+ CountDownModel &operator=(const CountDownModel &) = delete;\r
+\r
+ std::string uri;\r
+ std::shared_ptr<PlayerCallback> playerCallback{nullptr};\r
+ std::shared_ptr<Player> playerCtr{nullptr};\r
+ std::map<std::string, std::string> header;\r
+ std::shared_ptr<Source> source{nullptr};\r
+ std::shared_ptr<CountDownRingPlayerListener> playerInterruptListener{nullptr};\r
+ AudioSession sessionId;\r
+ AudioInterrupt interrupt;\r
+ // const char *RingMusicPath = "/user/music/alarm.mp3"; // 铃声路径\r
+#ifdef SINGLE_USER_PARTITION \r
+ const char *RingMusicPath = "/user/music/ring/alarm.mp3"; // 铃声路径\r
+#else\r
+ const char *RingMusicPath = "/music/ring/alarm.mp3"; // 铃声路径\r
+#endif\r
+ std::string countdownDuration{nullptr};\r
+ std::string RingTime{"00:00:00"}; // 响铃时间\r
+ std::string CountTime{"00:00:00"}; // 倒计时时间\r
+ std::string CountTimeBackup{"00:00:00"};\r
+ bool IsChanageToStartCountDownViewFlag{false};//是否需要切换到开始倒计时界面标志\r
+ bool CountDownTimerIsPauseFlag{false};\r
+\r
+ bool isRunning{false};//记录倒计时是否正在运行\r
+ bool isPaused{false}; //记录倒计时是否暂停\r
+ };\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2025-02-21 15:22:25\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownTimeConfigView.h\r
+ */\r
+#ifndef COUNTDOWN_TIME_CONFIG_VIEW_H\r
+#define COUNTDOWN_TIME_CONFIG_VIEW_H\r
+\r
+#include "common/screen.h"\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_time_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_button.h"\r
+/*倒计时时间配置*/\r
+namespace OHOS\r
+{\r
+ static constexpr const char *COLONEIMAGESPATH = "/user/res/countdown/COUNTDOWN_COLONE.bin"; // 冒号图片\r
+ static constexpr const char *START_COUNTDOWN_BUTTON_IMAGEPATH = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 开始倒计时按钮图片\r
+ static constexpr const char *STARTCOUNTDOWN_BUTTON = "startCountdownButton"; // 开始倒计时按钮视图id\r
+ static constexpr const char *COUNTDOWN_TIMECONFIG_VIEW = "CountDownTimeConfigView";\r
+ class CountDownTimeConfigView\r
+ {\r
+ public:\r
+ CountDownTimeConfigView();\r
+ virtual ~CountDownTimeConfigView();\r
+ static CountDownTimeConfigView *GetInstance(void);\r
+ UIScrollView *CountDownTimeConfigViewInit(void);\r
+ void ClearAll(void);\r
+ UITimePicker * GetTimePicker(void);\r
+\r
+ private:\r
+ UIScrollView *scrollView = nullptr;\r
+ UILabelExt *Title = nullptr;\r
+ UITimePicker *timePicker = nullptr;\r
+ UIImageView *Img[2]{nullptr};\r
+ UIButton *startCountdownButton{nullptr};\r
+ };\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-04-08 14:52:37\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownTimeNotNullView.h\r
+ */\r
+#ifndef COUNTDOWN_TIME_NOT_NULL_VIEW_H\r
+#define COUNTDOWN_TIME_NOT_NULL_VIEW_H\r
+\r
+\r
+#include "View.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button_ext.h"\r
+\r
+/*倒计时时间不能为0*/\r
+namespace OHOS\r
+{\r
+ static constexpr const char *COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON = "ReturnButton"; // 点击该按钮后回到倒计时设置界面\r
+ static constexpr const char *COUNTDOWNTIMENOTNULLVIEW = "CountDownTimeNotNullView";\r
+ class CountDownTimeNotNullView\r
+ {\r
+\r
+ public:\r
+ CountDownTimeNotNullView();\r
+ virtual ~CountDownTimeNotNullView();\r
+ static CountDownTimeNotNullView *GetInstance(void);\r
+ UIScrollView * CountDownTimeNotNullViewInit(void);\r
+ void ClearAll(void);\r
+\r
+ private:\r
+ UIScrollView *scrollView = nullptr;\r
+ UILabelExt *Title = nullptr;\r
+ UIImageView *Attention = nullptr;\r
+ UILabelExt *AttentionLabel = nullptr;\r
+ UILabelButtonExt *button = nullptr;\r
+ };\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-10-19 17:07:09\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h\r
+ */\r
+#ifndef MAIN_COUNTDOWN_PRESENTER_H\r
+#define MAIN_COUNTDOWN_PRESENTER_H\r
+\r
+#include "View.h"\r
+#include "Presenter.h"\r
+#include "MainCountDownView.h"\r
+#include "ui_resource_string.h"\r
+#include "ModelListenerSample.h"\r
+/*倒计时的主界面*/\r
+namespace OHOS\r
+{\r
+ typedef enum\r
+ {\r
+ MAIN_COUNTDOWN = 0, // 倒计时主视图\r
+ TIMECONFIG_COUNTDOWN, // 自定义倒计时\r
+ START_COUNTDOWN, // 开始倒计时\r
+ COUNTDOWN_TIMENOTNULL, // 倒计时时间不能为空\r
+ COUNTDOWN_MAX,\r
+ } CountDownViewId;\r
+\r
+ static constexpr const int COUNTDOWN_TIMER_DURATION = 1000; // 计时器的定时器周期\r
+ class MainCountDownView;\r
+ class MainCountDownPresenter : public Presenter<MainCountDownView>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ UITimePicker::SelectedListener,\r
+ public UICheckBox::OnChangeListener,\r
+ public RootView::OnKeyActListener,\r
+ public ModelListenerSample\r
+ {\r
+ public:\r
+ MainCountDownPresenter();\r
+ virtual ~MainCountDownPresenter();\r
+\r
+ void OnStart() override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+\r
+ static MainCountDownPresenter *GetInstance();\r
+\r
+ private:\r
+ // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool OnDragEnd(UIView &view, const DragEvent &event) override;\r
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件\r
+ bool OnChange(UICheckBox::UICheckBoxState state) override;\r
+ void OnTimePickerStoped(UITimePicker &picker) override;\r
+ void Notify() override;\r
+\r
+ std::string countdowntime{0};\r
+ std::string ringtime{0};\r
+ bool X_DRAG_FLAG{false};\r
+ };\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2025-02-24 18:39:35\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h\r
+ */\r
+#ifndef MAIN_COUNTDOWN_VIEW_H\r
+#define MAIN_COUNTDOWN_VIEW_H\r
+\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "countdown/include/CountDownTimeConfigView.h"\r
+#include "countdown/include/CountDownTimeNotNullView.h"\r
+#include "countdown/include/StartCountDownView.h"\r
+/*倒计时的主界面*/\r
+namespace OHOS\r
+{\r
+#define CountDownImageSrc "/user/res/countdown/"\r
+\r
+ // 图片路径\r
+ static const char *COUNTDOWM_TIMER_ICON = CountDownImageSrc "COUNTDOWM_TIMER_ICON.bin";\r
+\r
+ // 视图ID\r
+ static constexpr const char *COUNTDOWN_LABELBUTTON_VIEWID = "COUNTDOWN_LABELBUTTON"; // 自定义时间ID\r
+ static constexpr const char *COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID = "COUNTDOWN_ONE_MINUTE_BUTTON"; // 1分钟\r
+ static constexpr const char *COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID = "COUNTDOWN_FIVE_MINUTE_BUTTON"; // 5分钟\r
+ static constexpr const char *COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID = "COUNTDOWN_TEN_MINUTE_BUTTON"; // 10分钟\r
+ static constexpr const char *COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID = "COUNTDOWN_THIRTY_MINUTE_BUTTON"; // 30 分钟\r
+ static constexpr const char *MAINCOUNTDOWNVIEW = "MainCountDownView";\r
+}\r
+namespace OHOS\r
+{\r
+#define COUNTDOWN_MAX_VIEW 4\r
+\r
+ class MainCountDownPresenter;\r
+ class MainCountDownView : public View<MainCountDownPresenter>\r
+ {\r
+\r
+ public:\r
+ MainCountDownView();\r
+ virtual ~MainCountDownView();\r
+ static MainCountDownView *GetInstance(void);\r
+ bool ClickFunc(int16_t interface);\r
+ bool CheckViewParam(int16_t hideView, int16_t showView);\r
+ void ChangeView(int16_t hideView, int16_t showView);\r
+ bool ChangeMainCountDown(int16_t thisView);\r
+ bool ChangeTimeConfigCountdown(int16_t thisView);\r
+ bool ChangeCountdownTimeNotNull(int16_t thisView);\r
+ bool ChangeStartCountDown(int16_t thisView);\r
+ StartCountDownView *GetStartCountDownView(void);\r
+\r
+ public:\r
+ void OnStart() override;\r
+\r
+ private:\r
+ CountDownTimeConfigView *p_CountDownTimeConfigView{nullptr};\r
+ CountDownTimeNotNullView *p_CountDownTimeNotNullView{nullptr};\r
+ StartCountDownView *p_StartCountDownView{nullptr};\r
+\r
+ private:\r
+ UIScrollView * MainCountDownViewInit(void);\r
+ void ClearAll(void);\r
+ UILabelButtonExt *SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text,int textId);\r
+ UIScrollView *scrollView[COUNTDOWN_MAX_VIEW]{nullptr};\r
+ UILabelExt *Title{nullptr};\r
+ UILabelExt *QuickStart{nullptr};\r
+ UILabelButtonExt *CUSTOM_COUNTDOWN{nullptr}; // 自定义倒计时\r
+ UILabelButtonExt *COUNTDOWN_ONE_MINUTE_BUTTON = nullptr;\r
+ UILabelButtonExt *COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr;\r
+ UILabelButtonExt *COUNTDOWN_TEN_MINUTE_BUTTON = nullptr;\r
+ UILabelButtonExt *COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr;\r
+ bool viewInitStatus{false};\r
+ };\r
+} // namespace OHOS\r
+#endif // MainCountDown_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/***\r
+ * @Date: 2024-08-06 18:11:47\r
+ * @LastEditors: Caisking 3449750381@qq.com\r
+ * @LastEditTime: 2024-08-27 18:27:41\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/StartCountDownView.h\r
+ */\r
+#ifndef START_COUNTDOWN_VIEW_H\r
+#define START_COUNTDOWN_VIEW_H\r
+\r
+\r
+#include "View.h"\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_checkbox.h"\r
+\r
+/*开始倒计时*/\r
+namespace OHOS\r
+{\r
+ static constexpr const char *EndButton_ImagePath = "/user/res/countdown/COUNTDOWM_END.bin"; // 结束返回按钮图片\r
+ static constexpr const char *CountDown_Play_ImagePath = "/user/res/countdown/COUNTDOWM_PLAY.bin"; // 开始倒计时image\r
+ static constexpr const char *CountDown_PAUSE_ImagePath = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 暂停倒计时image\r
+ static constexpr const char *RepeatButtonImagePath = "/user/res/countdown/repeat_button.bin";\r
+ static constexpr const char *VectorImagesPath = "/user/res/countdown/COUNTDOWM_VECTOR.bin";\r
+ static constexpr const char *VectorBigImagesPath = "/user/res/countdown/Vector_Big.bin";\r
+ static constexpr const char *PlayOrPauseToggleButton_ViewID = "PlayOrPauseToggleButton"; // 暂停和开始toggleButton视图id\r
+ static constexpr const char *STARTCOUNTDOWNVIEWRETURNBUTTON = "StartCountDownViewReturnButton";\r
+ static constexpr const char *STARTCOUNTDOWNVIEW = "StartCountDownView";\r
+ static constexpr const char *RepeatButtonViewID = "RepeatButtonViewID";\r
+ class StartCountDownView\r
+ {\r
+\r
+ public:\r
+ StartCountDownView();\r
+ virtual ~StartCountDownView();\r
+ static StartCountDownView *GetInstance(void);\r
+ UIScrollView *StartCountDownViewInit(void);\r
+ void ClearAll(void);\r
+ UILabelExt *GetShowCountDownTimelabel(void); // 获取显示倒计时时间标签\r
+ UILabelExt *GetShowTheRingTimelabel(void); // 获取显示响铃时间标签\r
+ UIToggleButton *GetPlayOrPauseToggleButton(void);\r
+ UIButton *GetRepeatButton(void);\r
+\r
+ void SetEndView();\r
+ void SetImageAndLabel(bool state);\r
+ void ShowEndView(bool state);\r
+ void UpdateimageAndLabelPosition(void);\r
+ private:\r
+ UIScrollView *scrollView = nullptr;\r
+ UILabelExt *Title = nullptr;\r
+ UILabelExt *showCountDownTimelabel = nullptr;\r
+ UILabelExt *showTheRingTime = nullptr;\r
+ UIImageView *vectorImage = nullptr;\r
+\r
+ UILabelExt *showTheEndRingTime = nullptr;\r
+ UIImageView *vectorbigImage = nullptr;\r
+\r
+ UIToggleButton *play_or_pause_toggleButton = nullptr;\r
+ UIButton *endbutton = nullptr;\r
+ UIButton *RepeatButton = nullptr;\r
+ bool viewInitStatus{false};\r
+ };\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-12-18 17:42:19\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp\r
+ */\r
+#include "countdown/include/CountDownModel.h"\r
+#include <cmsis_os2.h>\r
+#include <ohos_types.h>\r
+#include <service/graphic_service.h>\r
+#include "wearable_log.h"\r
+#include "countdown/include/MainCountDownView.h"\r
+#include <cmsis_os.h>\r
+#include "ConfigModel.h"\r
+#include "ui_resource_string.h"\r
+#include "custom_runtime.h"\r
+#include "uiservice/include/ui_service.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include <custom_utils.h>\r
+#include <errcode.h>\r
+#include <custom_save_runtime.h>\r
+namespace OHOS\r
+{\r
+ /* -------------------------------------------------------------------------- */\r
+ // 声明定时器变量\r
+ static osTimerId_t g_timer = nullptr;\r
+ int CountDownModel::g_CountDownTimes = {0};\r
+ int CountDownModel::totalSeconds = 0; //总的倒计时时间\r
+ uint32_t CountDownModel::startTime = 0;\r
+ uint32_t CountDownModel::pauseTime = 0;\r
+ uint32_t CountDownModel::endTime = 0;\r
+ static constexpr int32 NUM_TEN = 10; // 主要用于格式化输出,当小时、分钟或秒小于10时,在其前面添加一个’0’以保持常规时间格式,例如“09:05:03”。\r
+ static constexpr int16 NUM_TIME_MIN = 60;\r
+ static constexpr int16 NUM_TIME_HOUR = 3600;\r
+ static constexpr int32 NUM_TIME_DAY = 86400;\r
+\r
+ /* -------------------------------------------------------------------------- */\r
+ // 定义了 GetInstance() 方法来获取 CountDownModel 的实例,确保只有一个全局实例存在。\r
+ CountDownModel *CountDownModel::GetInstance()\r
+ {\r
+ static CountDownModel instance;\r
+ return &instance;\r
+ }\r
+\r
+ // 函数用于解析"HH:MM:SS"格式的时间字符串,并更新g_CountDownTimes\r
+ void CountDownModel::ParseCountDownTime(const char *countdowntime)\r
+ {\r
+ int hours, minutes, seconds;\r
+\r
+ // 使用sscanf从字符串中读取格式化数据\r
+ // "%2d:%2d:%2d"用于检查两个数字,后面跟一个冒号,这样的模式重复两次,从而捕获三个整数\r
+ if (sscanf(countdowntime, "%2d:%2d:%2d", &hours, &minutes, &seconds) == 3)\r
+ {\r
+ // 解析成功,现在转换为总秒数\r
+ g_CountDownTimes = hours * NUM_TIME_HOUR + minutes * NUM_TIME_MIN + seconds;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_CountDownTimes = %d", g_CountDownTimes);\r
+ }\r
+ else\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::ParseCountDownTime Parsing failure");\r
+ }\r
+ }\r
+\r
+ std::string CountDownModel::ParseRingTime(const std::string &timeStr)\r
+ {\r
+ int hours, minutes, seconds;\r
+ std::string formattedTime;\r
+ // 使用 sscanf 从字符串中读取时间数据\r
+ if (sscanf(timeStr.c_str(), "%2d:%2d:%2d", &hours, &minutes, &seconds) == 3)\r
+ {\r
+ // 如果小时部分为0,则格式化去掉小时部分\r
+ if (hours == 0)\r
+ {\r
+ formattedTime = (minutes < NUM_TEN ? "0" : "") + std::to_string(minutes) + ":" + (seconds < NUM_TEN ? "0" : "") + std::to_string(seconds);\r
+ }\r
+ else\r
+ {\r
+ // 如果小时部分不为0,保持原有格式\r
+ formattedTime = timeStr;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // 解析失败逻辑处理:可以选择记录错误、返回原字符串或其他合适的处理方式\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrimTimeFormat Parsing failure: Invalid format");\r
+ formattedTime = timeStr; // 例子中选择返回原字符串\r
+ }\r
+ return formattedTime;\r
+ }\r
+\r
+ // 设置倒计时时间\r
+ void CountDownModel::SetCountDownTime(const std::string &countdowntime)\r
+ {\r
+ CountTime = countdowntime;\r
+ CountTimeBackup = countdowntime;\r
+ ParseCountDownTime(CountTime.c_str());\r
+ }\r
+\r
+ // 获取倒计时时间\r
+ std::string CountDownModel::GetCountDownTime(void)\r
+ {\r
+ return CountTime;\r
+ }\r
+\r
+ std::string CountDownModel::GetBackupCountDownTime(void)\r
+ {\r
+ return CountTimeBackup;\r
+ }\r
+\r
+ // 设置响铃时间\r
+ void CountDownModel::SetRingTime(const std::string &ringtime)\r
+ {\r
+ RingTime = ParseRingTime(ringtime);\r
+ }\r
+\r
+ // 获取响铃时间\r
+ std::string CountDownModel::GetRingTime(void)\r
+ {\r
+ return RingTime;\r
+ }\r
+\r
+ /*\r
+ * @brief 初始化音乐播放器以播放一个指定的铃声文件\r
+ * @param {char*} RingMusicName 铃声文件\r
+ */\r
+ int CountDownModel::CountDownRingPlayerInit(const char *RingMusicName)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDownRingPlayerInit");\r
+ /* ------------------------------- 1.播放文件路径设置 ------------------------------- */\r
+ uri = RingMusicName;\r
+ /* -------------------------------- 2.播放器对象创建 ------------------------------- */\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ playerCtr = std::make_shared<Player>();\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr new fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ }\r
+ /* ------------------------------- 3.播放器回调对象创建 ------------------------------ */\r
+ if (playerCallback.get() == nullptr)\r
+ {\r
+ playerCallback = std::make_shared<CountDownRingPlayerCallbackImpl>();\r
+ if (playerCallback.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCallback new fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] PlayerInit success!");\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ /*\r
+ * @brief 对铃声播放器进行设置并开始播放铃声。\r
+ */\r
+ int CountDownModel::InitializeAndPlayRingtone(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::InitializeAndPlayRingtone");\r
+ /* -------------------------------- 1.检查播放器实例 ------------------------------- */\r
+ int32_t ret;\r
+ int32_t state;\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerCtr->GetPlayerState(state);\r
+ /* -------------------------------- 2.设置播放器回调 ------------------------------- */\r
+ playerCtr->SetPlayerCallback(playerCallback);\r
+ /* -------------------------------- 3.创建并设置音频源 -------------------------------- */\r
+ source = std::make_shared<Source>(uri, header);\r
+ if (source.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] source.get() == fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Player url:%s", uri.c_str());\r
+ playerCtr->SetSource(*source);\r
+ /* --------------------------------- 4.配置播放器 -------------------------------- */\r
+ playerCtr->SetAudioStreamType(AUDIO_STREAM_NOTIFICATION_SYSTEM); // 设置播放器的音频流类型\r
+ playerCtr->Prepare(); // 准备播放器对象以播放音频。\r
+ /* -------------------------------- 5.请求音频焦点 -------------------------------- */\r
+ AudioManager &amIntance = AudioManager::GetInstance();\r
+ sessionId = amIntance.MakeSessionId();\r
+ if (sessionId == AUDIO_SESSION_ID_NONE)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] sessionId invalid!!");\r
+ return OHOS_FAILURE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] MakeSessionId = %d", sessionId);\r
+ playerInterruptListener = std::make_shared<CountDownRingPlayerListener>(); // 创建音频中断监听器\r
+ if (playerInterruptListener.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerInterruptListener playerInterruptListener.get() == nullptr");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerInterruptListener->SetOwner(playerCtr);\r
+ interrupt = {AUDIO_STREAM_NOTIFICATION_SYSTEM, sessionId, playerInterruptListener};\r
+ // 激活音频中断 5s超时\r
+ if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
+ return OHOS_FAILURE;\r
+ }\r
+ // playerCtr->SetVolume(50, 50); // 将左声道和右声道音量都设置为50\r
+ playerCtr->SetAudioSessionId(sessionId);\r
+ // 播放\r
+ ret = playerCtr->Play();\r
+ if(ret == 0)\r
+ {\r
+ //如果倒计时铃声播放成功,记录该事件\r
+ uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_START_COUNTDOWN);//TOOD*\r
+ }\r
+ playerCtr->EnableSingleLooping(true); // 设置是否循环播放\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ /*\r
+ * @brief 开始铃声的播放\r
+ */\r
+ int CountDownModel::StartRingtonePlayback(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::StartRingtonePlayback");\r
+ if (CountDownRingPlayerInit(RingMusicPath) != OHOS_SUCCESS)\r
+ {\r
+ // 错误处理,例如记录日志或者返回错误状态码\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDownRingPlayerInit error!!");\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ if (InitializeAndPlayRingtone() != OHOS_SUCCESS)\r
+ {\r
+ // 错误处理,例如记录日志或者返回错误状态码\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::InitializeAndPlayRingtone error!!");\r
+ return OHOS_FAILURE;\r
+ }\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ /*\r
+ * @brief 停止播放铃声,重置并释放播放器资源,并去激活之前设置的音频中断。\r
+ */\r
+ int CountDownModel::StopRingtonePlaybackAndReleaseResources(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::StopRingtonePlaybackAndReleaseResources");\r
+ int32_t ret = 0;\r
+ int32_t state = 0;\r
+ AudioManager &amIntance = AudioManager::GetInstance();\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerCtr->GetPlayerState(state);\r
+ if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PAUSED)\r
+ {\r
+ ret = playerCtr->Stop();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to stop the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ //如果倒计时铃声停止播放成功,记录该事件\r
+ uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_STOP_COUNTDOWN);//TOOD*\r
+ }\r
+ ret = playerCtr->Reset();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to reset the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ ret = playerCtr->Release();\r
+ playerCtr.reset();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to release the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ if (amIntance.DeactivateAudioInterrupt(interrupt) != 0)\r
+ {\r
+ return OHOS_FAILURE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ int CountDownModel::ResetRingtonePlayback(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::ResetRingtonePlayback");\r
+ int32_t ret = 0;\r
+ int32_t state = 0;\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr is null");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerCtr->GetPlayerState(state);\r
+ if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PAUSED)\r
+ {\r
+ ret = playerCtr->Stop();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to stop the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ }\r
+ ret = playerCtr->Reset();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to reset the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ template <typename Func>\r
+ static void PostRingtoneEvent(Func function)\r
+ {\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(function, CountDownModel::GetInstance()));\r
+ }\r
+\r
+ /*触发铃声的开始*/\r
+ void CountDownModel::RequestStartRingtone(void)\r
+ {\r
+ if (uapi_sleep_mode_flag_get())\r
+ {\r
+ return;\r
+ }\r
+ if (true != ConfigModel::GetInstance()->GetDnotdisturb())\r
+ {\r
+ PostRingtoneEvent(&CountDownModel::StartRingtonePlayback);\r
+ }\r
+ }\r
+\r
+ /*触发铃声的停止*/\r
+ void CountDownModel::RequestStopRingtone(void)\r
+ {\r
+ PostRingtoneEvent(&CountDownModel::StopRingtonePlaybackAndReleaseResources);\r
+ }\r
+\r
+ // 判断计时器是否结束\r
+ bool CountDownModel::CountDownTimerIsEnd() // 计时器是否结束\r
+ {\r
+ if (g_timer == nullptr)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+ // 获取是否需要跳转到开始到计时界面\r
+ bool CountDownModel::GetChanageToStartCountDownView()\r
+ {\r
+ return IsChanageToStartCountDownViewFlag;\r
+ }\r
+\r
+ // 设置是否需要跳转到开始到计时界面\r
+ void CountDownModel::SetChanageToStartCountDownView(bool val)\r
+ {\r
+ IsChanageToStartCountDownViewFlag = val;\r
+ }\r
+\r
+ bool CountDownModel::CountDownViewIsExit() // 计时器界面是否退出\r
+ {\r
+ MainCountDownView *g_CountDownView = MainCountDownView::GetInstance();\r
+ if (g_CountDownView == nullptr)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ // 处理倒计时到期时的一些操作\r
+ void CountDownModel::HandCountDownEndOperator(void)\r
+ {\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_StartCountDownView)\r
+ {\r
+ CountDown_StopTimer(); // 停止定时器\r
+ uapi_set_screen_on_api(); // 点亮屏幕\r
+ CountDownModel::GetInstance()->RequestStartRingtone(); // 播放铃声\r
+\r
+ StartCountDownView::GetInstance()->GetPlayOrPauseToggleButton()->SetVisible(false);\r
+ p_StartCountDownView->GetRepeatButton()->SetVisible(true);\r
+ /*倒计时结束 显示大图标 */\r
+ p_StartCountDownView->ShowEndView(true);\r
+ }\r
+ }\r
+\r
+ bool CountDownModel::GetCountDownTimerIsPause()\r
+ {\r
+ return CountDownTimerIsPauseFlag;\r
+ }\r
+ void CountDownModel::SetCountDownTimerIsPause(bool val)\r
+ {\r
+ CountDownTimerIsPauseFlag = val;\r
+ }\r
+ /* ----------------------------------- 定时器 ---------------------------------- */\r
+\r
+ /*\r
+ * @brief 显示计时器(时、分、秒)\r
+ */\r
+ const char *CountDownModel::DisplayCountDownDuration()\r
+ {\r
+ countdownDuration.clear(); // 更正为clear(),更加表明意图,与erase()等价\r
+ std::string hours;\r
+ std::string minute;\r
+ std::string seconds;\r
+\r
+ if (g_CountDownTimes >= NUM_TIME_DAY)\r
+ {\r
+ g_CountDownTimes = 0;\r
+ }\r
+\r
+ int hour = g_CountDownTimes / NUM_TIME_HOUR;\r
+ int min = (g_CountDownTimes % NUM_TIME_HOUR) / NUM_TIME_MIN;\r
+ int sec = (g_CountDownTimes % NUM_TIME_HOUR) % NUM_TIME_MIN;\r
+\r
+ hours = (hour < NUM_TEN) ? "0" + std::to_string(hour) : std::to_string(hour);\r
+ minute = (min < NUM_TEN) ? "0" + std::to_string(min) : std::to_string(min);\r
+ seconds = (sec < NUM_TEN) ? "0" + std::to_string(sec) : std::to_string(sec);\r
+ countdownDuration = hours + ":" + minute + ":" + seconds;\r
+\r
+ return countdownDuration.c_str(); // 返回 std::string 的 c_str(),但需要注意生命周期\r
+ }\r
+ /*\r
+ * @brief 在这里添加定时器到期后的处理逻辑\r
+ */\r
+ static void CountDown_TimerCallbackProc(int data)\r
+ {\r
+ if (CountDownModel::GetInstance()->CountDownViewIsExit()) // 如果已经退出了界面定时器还在跑,就先跳转Slice\r
+ {\r
+ CountDownModel::GetInstance()->CountDown_StopTimer(); // 停止定时器\r
+ CountDownModel::GetInstance()->SetChanageToStartCountDownView(true);\r
+ NativeAbility::GetInstance().EnterSlice(VIEW_MAIN_COUNTDOWN);\r
+ }\r
+ else\r
+ {\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_StartCountDownView)\r
+ {\r
+ CountDownModel::GetInstance()->HandCountDownEndOperator();\r
+ }\r
+ }\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * @brief 计时器回调函数\r
+ */\r
+ static void CountDown_TimerCallback(int data)\r
+ {\r
+\r
+ /*拿系统时间实现倒计时功能*/\r
+ bool isRunning = CountDownModel::GetInstance()->GetisRunning();\r
+ bool isPaused = CountDownModel::GetInstance()->GetisPaused();\r
+\r
+ if (isRunning &&!isPaused) \r
+ {\r
+ uint32_t currentTime = CountDownModel::GetInstance()->get_current_time();\r
+ CountDownModel::g_CountDownTimes = CountDownModel::totalSeconds - (currentTime - CountDownModel::startTime);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳:%u,倒计时剩余时间:%d", currentTime ,CountDownModel::g_CountDownTimes);\r
+ if (CountDownModel::g_CountDownTimes <= 0 && currentTime == CountDownModel::endTime) {\r
+ // 这里可以添加倒计时结束后的操作,比如发出提示音等\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data));\r
+ }\r
+ }\r
+ }\r
+\r
+ uint32_t CountDownModel::get_current_time()\r
+ {\r
+ uint32_t time;\r
+ if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");\r
+ return 0;\r
+ }\r
+ return time;\r
+ }\r
+\r
+ void CountDownModel::countdownstart()\r
+ {\r
+ isRunning = true;\r
+ isPaused = false;\r
+ CountDownModel::totalSeconds = CountDownModel::g_CountDownTimes;\r
+ CountDownModel::startTime = get_current_time(); //获取开始时间戳\r
+ CountDownModel::endTime = CountDownModel::startTime + g_CountDownTimes; //获取结束时间戳\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,endTime:%u",CountDownModel::startTime,CountDownModel::endTime);\r
+\r
+ }\r
+ \r
+ void CountDownModel::countdownpause()\r
+ {\r
+ if (isRunning &&!isPaused) {\r
+ isPaused = true;\r
+ CountDownModel::pauseTime = get_current_time();\r
+ }\r
+ }\r
+ void CountDownModel::countdownresume()\r
+ {\r
+ if (isRunning && isPaused) {\r
+ isPaused = false;\r
+ uint32_t currentTime = get_current_time();\r
+ uint32_t pauseDuration = currentTime - CountDownModel::pauseTime;\r
+ CountDownModel::endTime = CountDownModel::endTime + pauseDuration;\r
+ CountDownModel::totalSeconds = CountDownModel::totalSeconds + pauseDuration;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,pauseDuration:%u,endTime:%u",CountDownModel::startTime,pauseDuration,CountDownModel::endTime);\r
+ }\r
+ }\r
+ \r
+ void CountDownModel::countdownstop()\r
+ {\r
+ isRunning = false;\r
+ isPaused = false;\r
+ }\r
+\r
+ /*\r
+ * @brief 开启定时器函数\r
+ * @param interval 时间间隔,单位ms\r
+ */\r
+ void CountDownModel::CountDown_StartTimer(uint32_t interval)\r
+ {\r
+ /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */\r
+ if (g_timer != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer already exists!!");\r
+ return;\r
+ }\r
+\r
+ countdownstart();\r
+\r
+ /* --------------------------------- 2.创建定时器 -------------------------------- */\r
+ g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr);\r
+ // 检查定时器创建是否成功\r
+ if (g_timer == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer create failed!!");\r
+ return;\r
+ }\r
+\r
+ /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */\r
+ int tick = osMs2Tick(interval);\r
+\r
+ /* --------------------------------- 4.启动定时器 -------------------------------- */\r
+ // g_timerStartTimestamp = GetCurrentTimestamp(); // 假设GetCurrentTimestamp()是获取当前时间戳的函数\r
+ osStatus_t ret = osTimerStart(g_timer, tick);\r
+ /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_StartTimer] osTimerDelete failed, ret = %lx!!", ret);\r
+ if (g_timer != nullptr)\r
+ {\r
+ ret = osTimerDelete(g_timer);\r
+ }\r
+ g_timer = nullptr;\r
+ return;\r
+ }\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * @brief 停止定时器\r
+ */\r
+ void CountDownModel::CountDown_StopTimer(void)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_timer != nullptr)\r
+ {\r
+ countdownstop();\r
+\r
+ osTimerStop(g_timer);\r
+ // 删除定时器并置为 nullptr\r
+ osStatus_t ret = osTimerDelete(g_timer);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret);\r
+ }\r
+ g_timer = nullptr;\r
+ g_CountDownTimes = 0;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stop timer success!!");\r
+ }\r
+ }\r
+ /*\r
+ * @brief 暂停定时器\r
+ */\r
+ void CountDownModel::CountDown_PauseTimer(void)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_timer != nullptr)\r
+ {\r
+ countdownpause();\r
+\r
+ // 暂停定时器,但不删除它\r
+ osStatus_t ret = osTimerStop(g_timer);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_PauseTimer osTimerStop failed, ret = %lx!!", ret);\r
+ }\r
+ }\r
+ }\r
+\r
+ /*\r
+ * @brief 恢复定时器\r
+ */\r
+ void CountDownModel::CountDown_ResumeTimer(uint32_t interval)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_timer != nullptr)\r
+ {\r
+ countdownresume();\r
+\r
+ int tick = osMs2Tick(interval);\r
+ // 恢复定时器\r
+ osStatus_t ret = osTimerStart(g_timer, tick);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_ResumeTimer osTimerStart failed, ret = %lx!!", ret);\r
+ }\r
+ }\r
+ }\r
+\r
+ /* ----------------------- CountDownRingPlayerListener ---------------------- */\r
+\r
+ void CountDownRingPlayerListener::SetOwner(std::shared_ptr<Player> player)\r
+ {\r
+ player_ = player;\r
+ }\r
+\r
+ /*重置标志位*/\r
+ void CountDownRingPlayerListener::RestFlag()\r
+ {\r
+ isPaused_ = false;\r
+ isDelayed_ = false;\r
+ isResumed_ = false;\r
+ isBeginStopped_ = false;\r
+ isEndStopped_ = false;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsPaused()\r
+ {\r
+ return isPaused_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsDelayed()\r
+ {\r
+ return isDelayed_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsResumed()\r
+ {\r
+ return isResumed_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsBeginStopped()\r
+ {\r
+ return isBeginStopped_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsEndStopped()\r
+ {\r
+ return isEndStopped_;\r
+ }\r
+\r
+ static void Start(void)\r
+ {\r
+ CountDownModel::GetInstance()->RequestStartRingtone();\r
+ }\r
+\r
+ static void Stop(void)\r
+ {\r
+ CountDownModel::GetInstance()->RequestStopRingtone();\r
+ }\r
+\r
+ /*开始计时器铃声播放*/\r
+ void CountDownRingPlayerListener::StartCountDownRing(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownRingPlayerListener::StartCountDownRing] start");\r
+ GraphicService::GetInstance()->PostGraphicEvent(Start);\r
+ }\r
+\r
+ /*停止计时器铃声播放*/\r
+ void CountDownRingPlayerListener::StopCountDownRing(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownRingPlayerListener::StopCountDownRing] start");\r
+ GraphicService::GetInstance()->PostGraphicEvent(Stop);\r
+ }\r
+\r
+ /*响应外部的音频中断事件*/\r
+ void CountDownRingPlayerListener::OnInterrupt(int32_t type, int32_t hint)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnInterrupt go in, type %d, hint %d.", type, hint);\r
+ if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_PAUSE)\r
+ {\r
+ isDelayed_ = true;\r
+ }\r
+\r
+ if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_STOP)\r
+ {\r
+ StopCountDownRing();\r
+ }\r
+ else if (type == INTERRUPT_TYPE_END && isDelayed_ == true)\r
+ {\r
+ // 重新开始计时器的铃声播放\r
+ StartCountDownRing();\r
+ isDelayed_ = false;\r
+ }\r
+ return;\r
+ }\r
+\r
+ /* --------------------- CountDownRingPlayerCallbackImpl -------------------- */\r
+ void CountDownRingPlayerCallbackImpl::OnPlaybackComplete(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnPlaybackComplete");\r
+ // CountDownModel::GetInstance()->RequestStopRingtone();\r
+ // CountDownModel::GetInstance()->RequestStartRingtone();\r
+ }\r
+\r
+ void CountDownRingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnError test, errorType %d, errorCode %d", errorType, errorCode);\r
+ // 此处实现代码处理错误事件\r
+ }\r
+\r
+ void CountDownRingPlayerCallbackImpl::OnInfo(int type, int extra)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnInfo test, type %d, extra %d.", type, extra);\r
+ // 此处实现代码处理普通事件\r
+ }\r
+\r
+ void CountDownRingPlayerCallbackImpl::OnRewindToComplete(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRewindToComplete test");\r
+ // 此处实现代码处理进度控制完成的事件\r
+ }\r
+}\r
--- /dev/null
+#include "countdown/include/CountDownTimeConfigView.h"
+#include "countdown/include/MainCountDownPresenter.h"
+#include "countdown/include/CountDownModel.h"
+#include "UiConfig.h"
+#include "wearable_log.h"
+/*倒计时时间配置*/
+namespace OHOS
+{
+
+ static CountDownTimeConfigView *g_pCountDownTimeConfigView{nullptr};
+
+ CountDownTimeConfigView::CountDownTimeConfigView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::CountDownTimeConfigView");
+ g_pCountDownTimeConfigView = this;
+ }
+
+ CountDownTimeConfigView::~CountDownTimeConfigView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::~CountDownTimeConfigView");
+ ClearAll();
+ g_pCountDownTimeConfigView = nullptr;
+ }
+
+ CountDownTimeConfigView *CountDownTimeConfigView::GetInstance()
+ {
+ return g_pCountDownTimeConfigView;
+ }
+
+ void CountDownTimeConfigView::ClearAll()
+ {
+ scrollView->RemoveAll();
+
+ if (Title != nullptr)
+ {
+ delete Title;
+ Title = nullptr;
+ }
+
+ if (timePicker != nullptr)
+ {
+ delete timePicker;
+ timePicker = nullptr;
+ }
+
+ for (int i = 0; i < 2; i++)
+ {
+ delete Img[i];
+ Img[i] = nullptr;
+ }
+
+ if (startCountdownButton != nullptr)
+ {
+ delete startCountdownButton;
+ startCountdownButton = nullptr;
+ }
+
+ if (scrollView != nullptr)
+ {
+ delete scrollView;
+ scrollView = nullptr;
+ }
+ }
+
+ UIScrollView *CountDownTimeConfigView::CountDownTimeConfigViewInit()
+ {
+ if (scrollView == nullptr)
+ {
+ scrollView = new UIScrollView();
+ if (scrollView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::scrollView is new fail!!");
+ return nullptr;
+ }
+ scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+ UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(MainCountDownPresenter::GetInstance());
+ if (dragListener == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dragListener is nullptr!!");
+ return nullptr;
+ }
+ scrollView->SetViewId(COUNTDOWN_TIMECONFIG_VIEW);
+ scrollView->SetOnDragListener(dragListener);
+ scrollView->SetHorizontalScrollState(false);
+ scrollView->SetVerticalScrollState(false);
+ /* -------------------------------------------------------------------------- */
+ Title = new UILabelExt();
+ if (Title == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::Title is new fail!!");
+ return nullptr;
+ }
+ Title->SetPosition(83, 50, 300, 35);
+ Title->SetStyle(STYLE_TEXT_FONT, 30);
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ Title->SetRollSpeed(23);
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ /* -------------------------------------------------------------------------- */
+ timePicker = new UITimePicker();
+ if (timePicker == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::timePicker is new fail!!");
+ return nullptr;
+ }
+ timePicker->SetPosition(74, 121, 320, 180);
+ timePicker->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+ timePicker->SetStyle(STYLE_BORDER_RADIUS, 51);
+ timePicker->SetItemHeight(60); // 设置时间选择器中每个项目的高度。
+ timePicker->EnableSecond(true); // 设置在时间选择器中启用秒。
+ timePicker->SetSelected(CountDownModel::GetInstance()->GetCountDownTime().c_str()); // 设置时间选择器中当前选择的时间。
+ timePicker->SetTextColor(Color::GetColorFromRGBA(0x80, 0x80, 0x80, 0xff), Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));
+ // timePicker->SetTextColor(Color::GetColorFromRGBA(0xcc, 0xcc, 0xcc, 0xff), Color::GetColorFromRGBA(0xff, 0xa8, 0x00, 0xff)); // 设置时间选择器中的文本颜色。
+ timePicker->SetLoopState(UITimePicker::PickerType::PICKER_HOUR, true); // 设置是否开启循环 :时
+ timePicker->SetLoopState(UITimePicker::PickerType::PICKER_MIN, true); // 设置是否开启循环:分
+ timePicker->SetLoopState(UITimePicker::PickerType::PICKER_SEC, true); // 设置是否开启循环:秒
+ timePicker->SetHighlightFont(GILROY_BOLD_FONT, 55); // 设置突出显示文本的字体名称和大小。
+ timePicker->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, 50); // 设置背景文本的字体名称和大小。
+ UITimePicker::SelectedListener *selectTimeListener =
+ (UITimePicker::SelectedListener *)OHOS::MainCountDownPresenter::GetInstance();
+ timePicker->RegisterSelectedListener(selectTimeListener);
+ /* -------------------------------------------------------------------------- */
+ for (int i = 0; i < 2; i++)
+ {
+ // 计算每个图片的x位置,这里第一张图片的x坐标是 175,第二张图片的x坐标是 280
+ int xpos = (i == 0) ? 175 : 280;
+ Img[i] = new UIImageView();
+ if (Img[i] == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::Img[%d] is new fail!!", i);
+ return nullptr;
+ }
+
+ Img[i]->SetPosition(xpos, 200, 18, 79);
+ Img[i]->SetSrc(COLONEIMAGESPATH);
+ }
+ /* -------------------------------------------------------------------------- */
+ startCountdownButton = new UIButton();
+ if (startCountdownButton == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::startCountdownButton is new fail!!");
+ return nullptr;
+ }
+ startCountdownButton->SetPosition(183, 321, 100, 100);
+ startCountdownButton->SetViewId(STARTCOUNTDOWN_BUTTON);
+ startCountdownButton->SetStyle(STYLE_BORDER_RADIUS, 52);
+ startCountdownButton->SetImageSrc(START_COUNTDOWN_BUTTON_IMAGEPATH, START_COUNTDOWN_BUTTON_IMAGEPATH);
+ startCountdownButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);
+ startCountdownButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+ startCountdownButton->SetStyleForState(STYLE_BORDER_RADIUS, 52, UIButton::PRESSED);
+ UIView::OnClickListener *start_countdown_button_Click = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());
+ startCountdownButton->SetOnClickListener(start_countdown_button_Click);
+
+ /* ----------------------------------- Add ---------------------------------- */
+ scrollView->Add(Title);
+ scrollView->Add(timePicker);
+ scrollView->Add(Img[0]);
+ scrollView->Add(Img[1]);
+ scrollView->Add(startCountdownButton);
+ }
+ return scrollView;
+ }
+
+ UITimePicker *CountDownTimeConfigView::GetTimePicker(void)
+ {
+ return timePicker;
+ }
+}
\ No newline at end of file
--- /dev/null
+#include "countdown/include/CountDownTimeNotNullView.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+/*倒计时时间不能为0*/\r
+namespace OHOS\r
+{\r
+\r
+ static CountDownTimeNotNullView *g_pCountDownTimeNotNullView{nullptr};\r
+\r
+ CountDownTimeNotNullView::CountDownTimeNotNullView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::CountDownTimeNotNullView");\r
+\r
+ g_pCountDownTimeNotNullView = this;\r
+ }\r
+\r
+ CountDownTimeNotNullView::~CountDownTimeNotNullView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::~CountDownTimeNotNullView");\r
+ ClearAll();\r
+ g_pCountDownTimeNotNullView = nullptr;\r
+ }\r
+\r
+ CountDownTimeNotNullView *CountDownTimeNotNullView::GetInstance()\r
+ {\r
+\r
+ return g_pCountDownTimeNotNullView;\r
+ }\r
+\r
+ void CountDownTimeNotNullView::ClearAll()\r
+ {\r
+ scrollView->RemoveAll();\r
+ if (Title != nullptr)\r
+ {\r
+ delete Title;\r
+ Title = nullptr;\r
+ }\r
+ if (Attention != nullptr)\r
+ {\r
+ delete Attention;\r
+ Attention = nullptr;\r
+ }\r
+ if (AttentionLabel != nullptr)\r
+ {\r
+ delete AttentionLabel;\r
+ AttentionLabel = nullptr;\r
+ }\r
+ if (button != nullptr)\r
+ {\r
+ delete button;\r
+ button = nullptr;\r
+ }\r
+ if (scrollView != nullptr)\r
+ {\r
+ delete scrollView;\r
+ scrollView = nullptr;\r
+ }\r
+ }\r
+\r
+ UIScrollView *CountDownTimeNotNullView::CountDownTimeNotNullViewInit()\r
+ {\r
+ if (scrollView == nullptr)\r
+ {\r
+ scrollView = new UIScrollView();\r
+ scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ scrollView->SetViewId(COUNTDOWNTIMENOTNULLVIEW);\r
+ scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ /* -------------------------------------------------------------------------- */\r
+ Title = new UILabelExt();\r
+ if (Title == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Title->SetPosition(83, 50, 300, 35);\r
+ Title->SetStyle(STYLE_TEXT_FONT, 30);\r
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时\r
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ Title->SetRollSpeed(23);\r
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------------------------------------------------------- */\r
+ Attention = new UIImageView();\r
+ if (Attention == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Attention is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Attention->SetPosition(193, 121, 80, 80);\r
+ Attention->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ #ifdef FD230\r
+ Attention->SetSrc(PNG_ATTENTION_IMAGE);\r
+ #endif\r
+ /* -------------------------------------------------------------------------- */\r
+ AttentionLabel = new UILabelExt();\r
+ if (AttentionLabel == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::AttentionLabel is new fail!!");\r
+ return nullptr;\r
+ }\r
+ AttentionLabel->SetPosition(53, 253, 360, 35);\r
+ AttentionLabel->SetStyle(STYLE_TEXT_FONT, 30);\r
+ AttentionLabel->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ AttentionLabel->SetTextId(STR_SET_COUNT_DOWN_NOTE); // 请先设置好倒计时间\r
+ AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ AttentionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ AttentionLabel->SetRollSpeed(23);\r
+ AttentionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------------------------------------------------------- */\r
+ button = new UILabelButtonExt();\r
+ if (button == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::button is new fail!!");\r
+ return nullptr;\r
+ }\r
+ button->SetPosition(0, 366, 466, 100);\r
+ button->SetViewId(COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON);\r
+ #ifdef FD230\r
+ button->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE);\r
+ #endif\r
+ button->SetTextId(STR_KONW); // 知道了\r
+ button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ button->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);\r
+ UIView::OnClickListener *buttonClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ if (buttonClick == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::buttonClick is new fail!!");\r
+ return nullptr;\r
+ }\r
+ button->SetOnClickListener(buttonClick);\r
+ /* ----------------------------------- Add ---------------------------------- */\r
+ scrollView->Add(Title);\r
+ scrollView->Add(Attention);\r
+ scrollView->Add(AttentionLabel);\r
+ scrollView->Add(button);\r
+ }\r
+\r
+ return scrollView;\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "UiConfig.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "countdown/include/CountDownModel.h"\r
+#include "countdown/include/StartCountDownView.h"\r
+#include "common/key_code.h"\r
+#include "custom_utils.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS\r
+{\r
+ REGIST_MENU_PRO(VIEW_MAIN_COUNTDOWN, MainCountDownView, MainCountDownPresenter,\r
+ PNG_APPLIST_COUNTDOWN_IMAGE_BIG, PNG_APPLIST_COUNTDOWN_IMAGE,PNG_APPLIST_COUNTDOWN_IMAGE, "计时器", STR_TIMER);\r
+\r
+ static constexpr const char *OneMinuteTime = "00:01:00"; // 1分钟\r
+ static constexpr const char *FiveMinuteTime = "00:05:00"; // 5分钟\r
+ static constexpr const char *TenMinuteTime = "00:10:00"; // 10分钟\r
+ static constexpr const char *ThirtyMinuteTime = "00:30:00"; // 30分钟\r
+\r
+ // 当前Presenter属性实例化的内存指针\r
+ static MainCountDownPresenter *g_pMainCountDownPresenter = nullptr;\r
+ MainCountDownPresenter::MainCountDownPresenter()\r
+ {\r
+ g_pMainCountDownPresenter = this;\r
+ }\r
+\r
+ MainCountDownPresenter::~MainCountDownPresenter()\r
+ {\r
+ g_pMainCountDownPresenter = nullptr;\r
+ }\r
+\r
+ MainCountDownPresenter *MainCountDownPresenter::GetInstance()\r
+ {\r
+\r
+ return g_pMainCountDownPresenter;\r
+ }\r
+\r
+ void MainCountDownPresenter::OnStart()\r
+ {\r
+ // ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 长亮屏\r
+ }\r
+\r
+ void MainCountDownPresenter::OnPause(void)\r
+ {\r
+\r
+ Presenter<MainCountDownView>::OnPause();\r
+ }\r
+\r
+ void MainCountDownPresenter::OnResume(void)\r
+ {\r
+\r
+ Presenter<MainCountDownView>::OnResume();\r
+ }\r
+\r
+ void MainCountDownPresenter::OnStop(void)\r
+ {\r
+ // ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 取消长亮屏\r
+ CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); // 清理播放器资源\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动\r
+ {\r
+ MainCountDownPresenter::X_DRAG_FLAG = true;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnDragEnd(UIView &view, const DragEvent &event)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnDragEnd");\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && MainCountDownPresenter::X_DRAG_FLAG)\r
+ {\r
+ if (strcmp(view.GetViewId(), MAINCOUNTDOWNVIEW) == 0)\r
+ {\r
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_TIMECONFIG_VIEW) == 0)\r
+ {\r
+ MainCountDownView::GetInstance()->ChangeView(TIMECONFIG_COUNTDOWN, MAIN_COUNTDOWN);\r
+ }\r
+ MainCountDownPresenter::X_DRAG_FLAG = false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ static bool SetCountDownAndChangeView(MainCountDownView *p_MainCountDownView, const std::string &timeValue)\r
+ {\r
+ CountDownModel *model = CountDownModel::GetInstance();\r
+ model->SetCountDownTime(timeValue);\r
+ model->SetRingTime(timeValue);\r
+\r
+ // Update label texts if necessary\r
+ if (p_MainCountDownView->GetStartCountDownView() != nullptr)\r
+ {\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowTheRingTimelabel()->SetText(CountDownModel::GetInstance()->GetRingTime().c_str());\r
+ p_MainCountDownView->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(true);\r
+ p_MainCountDownView->GetStartCountDownView()->GetRepeatButton()->SetVisible(false);\r
+ }\r
+\r
+ p_MainCountDownView->ChangeView(MAIN_COUNTDOWN, START_COUNTDOWN);\r
+ return true;\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+ {\r
+ UNUSED(event);\r
+\r
+ MainCountDownView *p_MainCountDownView = MainCountDownView::GetInstance();\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+\r
+ if (p_MainCountDownView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::GetInstance fail!!");\r
+ return false;\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), COUNTDOWN_LABELBUTTON_VIEWID) == 0)\r
+ {\r
+ p_MainCountDownView->ChangeView(MAIN_COUNTDOWN, TIMECONFIG_COUNTDOWN);\r
+ return true;\r
+ }\r
+\r
+ /*四个快速开始倒计时按钮*/\r
+ if (strcmp(view.GetViewId(), COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, OneMinuteTime);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, FiveMinuteTime);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, TenMinuteTime);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, ThirtyMinuteTime);\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), STARTCOUNTDOWN_BUTTON) == 0) // 在自定义倒计时界面点击开始按钮跳转到开始倒计时界面\r
+ {\r
+ UITimePicker *timePicker = CountDownTimeConfigView::GetInstance()->GetTimePicker();\r
+\r
+ std::string timeValue = timePicker->GetSelectValue();\r
+ if (nullptr != timePicker && ("00:00:00" != timeValue))\r
+ {\r
+ CountDownModel::GetInstance()->SetCountDownTime(timePicker->GetSelectValue()); // 设置倒计时时间\r
+ CountDownModel::GetInstance()->SetRingTime(timePicker->GetSelectValue()); // 设置响铃时间\r
+ }\r
+\r
+ if (strcmp(CountDownModel::GetInstance()->GetCountDownTime().c_str(), "00:00:00") == 0) // 如果自定义时间设置为0\r
+ {\r
+ p_MainCountDownView->ChangeView(TIMECONFIG_COUNTDOWN, COUNTDOWN_TIMENOTNULL);\r
+ return true;\r
+ }\r
+ else\r
+ {\r
+ p_MainCountDownView->ChangeView(TIMECONFIG_COUNTDOWN, START_COUNTDOWN);\r
+ if (p_StartCountDownView != nullptr)\r
+ {\r
+ std::string CountDownTime = CountDownModel::GetInstance()->GetCountDownTime();\r
+ std::string RingTime = CountDownModel::GetInstance()->GetRingTime();\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTime = %s RingTime = %s", CountDownTime.c_str(), RingTime.c_str());\r
+ p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownTime.c_str());\r
+ p_StartCountDownView->GetShowTheRingTimelabel()->SetText(RingTime.c_str());\r
+ p_StartCountDownView->GetPlayOrPauseToggleButton()->SetVisible(true);\r
+ p_StartCountDownView->GetRepeatButton()->SetVisible(false);\r
+ }\r
+\r
+ return true;\r
+ }\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON) == 0) // 从倒计时不为空视图退到自定义倒计时界面\r
+ {\r
+ p_MainCountDownView->ChangeView(COUNTDOWN_TIMENOTNULL, TIMECONFIG_COUNTDOWN);\r
+ /*结束视图恢复*/\r
+ if (p_StartCountDownView == nullptr)\r
+ return false;\r
+ p_StartCountDownView->ShowEndView(false);\r
+ return true;\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), STARTCOUNTDOWNVIEWRETURNBUTTON) == 0) // 从开始倒计时视图退到倒计时主视图\r
+ {\r
+ CountDownModel::GetInstance()->SetCountDownTime("00:00:00");\r
+ CountDownModel::GetInstance()->SetRingTime("00:00:00");\r
+ CountDownModel::GetInstance()->CountDown_StopTimer();\r
+ CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources();\r
+ p_StartCountDownView->GetPlayOrPauseToggleButton()->SetTouchable(true);\r
+ p_StartCountDownView->GetPlayOrPauseToggleButton()->SetState(false);\r
+ p_MainCountDownView->ChangeView(START_COUNTDOWN, MAIN_COUNTDOWN);\r
+ p_StartCountDownView->ShowEndView(false);\r
+\r
+ return true;\r
+ }\r
+\r
+ // repeat button cb\r
+ if (0 == strcmp(view.GetViewId(), RepeatButtonViewID))\r
+ {\r
+ // close prompt\r
+ CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources();\r
+\r
+ /*结束视图恢复*/\r
+ if (p_StartCountDownView == nullptr)\r
+ return false;\r
+ p_StartCountDownView->ShowEndView(false);\r
+\r
+ // set param & change view\r
+ CountDownModel *model = CountDownModel::GetInstance();\r
+ const std::string timeValue = model->GetBackupCountDownTime();\r
+ model->SetCountDownTime(timeValue);\r
+ model->SetRingTime(timeValue);\r
+\r
+ if (nullptr != p_MainCountDownView->GetStartCountDownView())\r
+ {\r
+\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowTheRingTimelabel()->SetText(CountDownModel::GetInstance()->GetRingTime().c_str());\r
+\r
+ p_MainCountDownView->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(true);\r
+ p_MainCountDownView->GetStartCountDownView()->GetRepeatButton()->SetVisible(false);\r
+ }\r
+\r
+ // start timer\r
+ CountDownModel::GetInstance()->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION);\r
+\r
+ return true;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ // 增加按键事件\r
+ bool MainCountDownPresenter::OnKeyAct(UIView &view, const KeyEvent &event)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnKeyAct");\r
+ uint16_t keyID = event.GetKeyId();\r
+ uint16_t keyState = event.GetState();\r
+ // 如果是power键就返回上一级\r
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)\r
+ {\r
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnChange(UICheckBox::UICheckBoxState state)\r
+ {\r
+ CountDownModel *p_CountDownModel = CountDownModel::GetInstance();\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_CountDownModel == nullptr || p_StartCountDownView == nullptr)\r
+ return false;\r
+\r
+ switch (state)\r
+ {\r
+ case UICheckBox::SELECTED:\r
+ p_CountDownModel->SetCountDownTimerIsPause(false);\r
+ p_CountDownModel->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION);\r
+ p_CountDownModel->CountDown_ResumeTimer(COUNTDOWN_TIMER_DURATION);\r
+ /*视图恢复*/\r
+ p_StartCountDownView->SetImageAndLabel(true);\r
+ p_StartCountDownView->ShowEndView(false);\r
+ break;\r
+ case UICheckBox::UNSELECTED:\r
+ p_CountDownModel->SetCountDownTimerIsPause(true);\r
+ p_CountDownModel->CountDown_PauseTimer();\r
+ /*进行视图隐藏*/\r
+ p_StartCountDownView->SetImageAndLabel(false);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ void MainCountDownPresenter::OnTimePickerStoped(UITimePicker &picker)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "picker.GetSelectValue = %s", picker.GetSelectValue());\r
+ CountDownModel::GetInstance()->SetCountDownTime(picker.GetSelectValue()); // 设置倒计时时间\r
+ CountDownModel::GetInstance()->SetRingTime(picker.GetSelectValue()); // 设置响铃时间\r
+ }\r
+ void MainCountDownPresenter::Notify()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::Notify");\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd()) // 倒计时timer已经停止直接退出不刷新\r
+ {\r
+ return;\r
+ }\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_StartCountDownView && p_StartCountDownView->GetShowCountDownTimelabel())\r
+ {\r
+ // 更新显示\r
+ p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+ }\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+#include "countdown/include/MainCountDownView.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "wearable_log.h"\r
+#include "common/image_cache_manager.h"\r
+#include "countdown/include/CountDownModel.h"\r
+/*倒计时的主界面*/\r
+namespace OHOS\r
+{\r
+#define VISIBLE_XBAR(visible)\r
+\r
+ static MainCountDownView *g_pMainCountDownView{nullptr};\r
+\r
+ MainCountDownView::MainCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::MainCountDownView");\r
+ g_pMainCountDownView = this;\r
+ }\r
+\r
+ MainCountDownView::~MainCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::~MainCountDownView");\r
+ ClearAll();\r
+ g_pMainCountDownView = nullptr;\r
+ }\r
+\r
+ MainCountDownView *MainCountDownView::GetInstance()\r
+ {\r
+ return g_pMainCountDownView;\r
+ }\r
+\r
+ void MainCountDownView::ClearAll()\r
+ {\r
+ if (scrollView[MAIN_COUNTDOWN] != nullptr)\r
+ {\r
+ scrollView[MAIN_COUNTDOWN]->RemoveAll();\r
+ if (Title != nullptr)\r
+ {\r
+ delete Title;\r
+ Title = nullptr;\r
+ }\r
+ if (QuickStart != nullptr)\r
+ {\r
+ delete QuickStart;\r
+ QuickStart = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(COUNTDOWM_TIMER_ICON);\r
+ if (CUSTOM_COUNTDOWN != nullptr)\r
+ {\r
+ delete CUSTOM_COUNTDOWN;\r
+ CUSTOM_COUNTDOWN = nullptr;\r
+ }\r
+ if (COUNTDOWN_ONE_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_ONE_MINUTE_BUTTON;\r
+ COUNTDOWN_ONE_MINUTE_BUTTON = nullptr;\r
+ }\r
+ if (COUNTDOWN_FIVE_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_FIVE_MINUTE_BUTTON;\r
+ COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr;\r
+ }\r
+ if (COUNTDOWN_TEN_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_TEN_MINUTE_BUTTON;\r
+ COUNTDOWN_TEN_MINUTE_BUTTON = nullptr;\r
+ }\r
+ if (COUNTDOWN_THIRTY_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_THIRTY_MINUTE_BUTTON;\r
+ COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr;\r
+ }\r
+ delete scrollView[MAIN_COUNTDOWN];\r
+ scrollView[MAIN_COUNTDOWN] = nullptr;\r
+ }\r
+ if (p_CountDownTimeConfigView != nullptr)\r
+ {\r
+ delete p_CountDownTimeConfigView;\r
+ p_CountDownTimeConfigView = nullptr;\r
+ }\r
+ if (p_CountDownTimeNotNullView != nullptr)\r
+ {\r
+ delete p_CountDownTimeNotNullView;\r
+ p_CountDownTimeNotNullView = nullptr;\r
+ }\r
+ if (p_StartCountDownView != nullptr)\r
+ {\r
+ delete p_StartCountDownView;\r
+ p_StartCountDownView = nullptr;\r
+ }\r
+ }\r
+\r
+ UIScrollView *MainCountDownView::MainCountDownViewInit()\r
+ {\r
+ if (scrollView[MAIN_COUNTDOWN] == nullptr)\r
+ {\r
+ /* ----------------------- scrollView[MAIN_COUNTDOWN] ----------------------- */\r
+ scrollView[MAIN_COUNTDOWN] = new UIScrollView();\r
+ if (scrollView[MAIN_COUNTDOWN] == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView[MAIN_COUNTDOWN] is new fail!!");\r
+ return nullptr;\r
+ }\r
+ scrollView[MAIN_COUNTDOWN]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ scrollView[MAIN_COUNTDOWN]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ scrollView[MAIN_COUNTDOWN]->SetViewId(MAINCOUNTDOWNVIEW);\r
+ UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(MainCountDownPresenter::GetInstance());\r
+ if (draglistener == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "draglistener is nullptr!!");\r
+ return nullptr;\r
+ }\r
+ scrollView[MAIN_COUNTDOWN]->SetOnDragListener(draglistener);\r
+ scrollView[MAIN_COUNTDOWN]->SetReboundSize(50); // 设置回弹大小\r
+ scrollView[MAIN_COUNTDOWN]->SetHorizontalScrollState(false); // 设置横向不可以滚动\r
+ scrollView[MAIN_COUNTDOWN]->SetScrollBlankSize(75);\r
+ scrollView[MAIN_COUNTDOWN]->SetThrowDrag(true);\r
+ scrollView[MAIN_COUNTDOWN]->SetMaxScrollDistance(1000);\r
+ scrollView[MAIN_COUNTDOWN]->SetSwipeACCLevel(200); // 800: compensation distance\r
+ scrollView[MAIN_COUNTDOWN]->SetDragACCLevel(5); // 5: drag acceleration\r
+ scrollView[MAIN_COUNTDOWN]->SetRotateFactor(2);\r
+ scrollView[MAIN_COUNTDOWN]->RequestFocus();\r
+ /* ---------------------------------- Title --------------------------------- */\r
+ Title = new UILabelExt();\r
+ if (Title == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Title->SetPosition(83, 50, 300, 35);\r
+ Title->SetStyle(STYLE_TEXT_FONT, 30);\r
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时\r
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ Title->SetRollSpeed(23);\r
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------- CUSTOM_COUNTDOWN ------------------------- */\r
+ CUSTOM_COUNTDOWN = new UILabelButtonExt();\r
+ if (CUSTOM_COUNTDOWN == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CUSTOM_COUNTDOWN is new fail!!");\r
+ return nullptr;\r
+ }\r
+ CUSTOM_COUNTDOWN->SetPosition(43, 130, 380, 100);\r
+ CUSTOM_COUNTDOWN->SetViewId(COUNTDOWN_LABELBUTTON_VIEWID);\r
+ CUSTOM_COUNTDOWN->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffa800);\r
+ CUSTOM_COUNTDOWN->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ CUSTOM_COUNTDOWN->SetTextId(STR_CUSTOM_TIME); // 自定义时间\r
+ CUSTOM_COUNTDOWN->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ CUSTOM_COUNTDOWN->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ CUSTOM_COUNTDOWN->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);\r
+ /* ------------------------------- QuickStart ------------------------------- */\r
+ QuickStart = new UILabelExt();\r
+ if (QuickStart == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QuickStart is new fail!!");\r
+ return nullptr;\r
+ }\r
+ QuickStart->SetPosition(83, 270, 300, 35);\r
+ QuickStart->SetStyle(STYLE_TEXT_FONT, 30);\r
+ QuickStart->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ QuickStart->SetTextId(STR_QUICK_START);\r
+ QuickStart->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ QuickStart->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ QuickStart->SetRollSpeed(23);\r
+ QuickStart->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* ----------------------- COUNTDOWN_ONE_MINUTE_BUTTON ---------------------- */\r
+ COUNTDOWN_ONE_MINUTE_BUTTON = SetUILabelButton(43, 345, 180, 150, COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID, "1分钟", STR_1_MIN);\r
+ if (COUNTDOWN_ONE_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* ---------------------- COUNTDOWN_FIVE_MINUTE_BUTTON ---------------------- */\r
+ COUNTDOWN_FIVE_MINUTE_BUTTON = SetUILabelButton(243, 345, 180, 150, COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID, "5分钟", STR_5_MIN);\r
+ if (COUNTDOWN_FIVE_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* ----------------------- COUNTDOWN_TEN_MINUTE_BUTTON ---------------------- */\r
+ COUNTDOWN_TEN_MINUTE_BUTTON = SetUILabelButton(43, 515, 180, 150, COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID, "10分钟", STR_10_MIN);\r
+ if (COUNTDOWN_TEN_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* --------------------- COUNTDOWN_THIRTY_MINUTE_BUTTON --------------------- */\r
+ COUNTDOWN_THIRTY_MINUTE_BUTTON = SetUILabelButton(243, 515, 180, 150, COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID, "30分钟", STR_30_MIN);\r
+ if (COUNTDOWN_THIRTY_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* -------------------------------------------------------------------------- */\r
+ UIView::OnClickListener *ButtonOnClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ CUSTOM_COUNTDOWN->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_ONE_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_FIVE_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_TEN_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_THIRTY_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ /* -------------------------------------------------------------------------- */\r
+ scrollView[MAIN_COUNTDOWN]->Add(Title);\r
+ scrollView[MAIN_COUNTDOWN]->Add(CUSTOM_COUNTDOWN);\r
+ scrollView[MAIN_COUNTDOWN]->Add(QuickStart);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_ONE_MINUTE_BUTTON);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_FIVE_MINUTE_BUTTON);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_TEN_MINUTE_BUTTON);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_THIRTY_MINUTE_BUTTON);\r
+ }\r
+ return scrollView[MAIN_COUNTDOWN];\r
+ }\r
+\r
+ UILabelButtonExt *MainCountDownView::SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text, int textId)\r
+ {\r
+ UILabelButtonExt *button = new UILabelButtonExt();\r
+ if (button == nullptr)\r
+ {\r
+ return nullptr;\r
+ }\r
+ button->SetPosition(x, y, w, h);\r
+ button->SetViewId(id);\r
+ button->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);\r
+ button->SetStyle(STYLE_BORDER_RADIUS, 50);\r
+ button->SetImagePosition(72, 30);\r
+ ImageInfo *img = ImageCacheManager::GetInstance().LoadSingleRes(COUNTDOWM_TIMER_ICON);\r
+ button->SetImageSrc(img, img);\r
+ // button->SetText(text);\r
+ button->SetTextId(textId);\r
+ button->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ button->SetLabelPosition(0, 61);\r
+ button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ button->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ button->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);\r
+ button->SetStyleForState(STYLE_BORDER_RADIUS, 50, UIButton::PRESSED);\r
+ return button;\r
+ }\r
+\r
+ // 获取开始倒计时视图\r
+ StartCountDownView *MainCountDownView::GetStartCountDownView(void)\r
+ {\r
+ return p_StartCountDownView;\r
+ }\r
+\r
+ /*1.切换到主倒计时视图*/\r
+ bool MainCountDownView::ChangeMainCountDown(int16_t thisView)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeMainCountDown");\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ UIScrollView *view = MainCountDownViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /*2.切换到自定义倒计时界面*/\r
+ bool MainCountDownView::ChangeTimeConfigCountdown(int16_t thisView)\r
+ {\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeTimeConfigCountdown");\r
+ p_CountDownTimeConfigView = new CountDownTimeConfigView();\r
+ if (p_CountDownTimeConfigView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
+ return false;\r
+ }\r
+ UIScrollView *view = p_CountDownTimeConfigView->CountDownTimeConfigViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /*3.开始倒计时*/\r
+ bool MainCountDownView::ChangeStartCountDown(int16_t thisView)\r
+ {\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeCountdownTimeNotNull");\r
+ p_StartCountDownView = new StartCountDownView();\r
+ if (p_StartCountDownView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
+ return false;\r
+ }\r
+ UIScrollView *view = p_StartCountDownView->StartCountDownViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ if (p_StartCountDownView)\r
+ {\r
+ p_StartCountDownView->UpdateimageAndLabelPosition();\r
+ if(CountDownModel::GetInstance()->GetChanageToStartCountDownView() == true)\r
+ {\r
+ CountDownModel::GetInstance()->SetChanageToStartCountDownView(false);\r
+ CountDownModel::GetInstance()->HandCountDownEndOperator();\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /*4.切换到倒计时不能为空界面*/\r
+ bool MainCountDownView::ChangeCountdownTimeNotNull(int16_t thisView)\r
+ {\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeCountdownTimeNotNull");\r
+ p_CountDownTimeNotNullView = new CountDownTimeNotNullView();\r
+ if (p_CountDownTimeNotNullView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
+ return false;\r
+ }\r
+ UIScrollView *view = p_CountDownTimeNotNullView->CountDownTimeNotNullViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /* -------------------------------------------------------------------------- */\r
+ // 1.MainCountDownViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。\r
+ struct MainCountDownViewMapper\r
+ {\r
+ const int16_t viewId;\r
+ bool (MainCountDownView::*func)(int16_t thisView);\r
+ };\r
+\r
+ // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainCountDownView类中的特定成员函数指针进行了绑定。\r
+ static const MainCountDownViewMapper ViewMapper[] = {\r
+ {MAIN_COUNTDOWN, &MainCountDownView::ChangeMainCountDown},\r
+ {TIMECONFIG_COUNTDOWN, &MainCountDownView::ChangeTimeConfigCountdown},\r
+ {START_COUNTDOWN, &MainCountDownView::ChangeStartCountDown},\r
+ {COUNTDOWN_TIMENOTNULL, &MainCountDownView::ChangeCountdownTimeNotNull},\r
+ };\r
+\r
+ // 3.根据传入的interface参数执行相应视图ID关联的成员函数。\r
+ bool MainCountDownView::ClickFunc(int16_t interface)\r
+ {\r
+ int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[0]);\r
+ for (int i = 0; i < funcSize; i++)\r
+ {\r
+ if (interface == ViewMapper[i].viewId)\r
+ {\r
+ bool jug = (this->*(ViewMapper[i].func))(interface);\r
+ if (jug == false)\r
+ {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ bool MainCountDownView::CheckViewParam(int16_t hideView, int16_t showView)\r
+ {\r
+ if (showView < 0 || showView >= COUNTDOWN_MAX)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootView::CheckViewParam showView err.");\r
+ return false;\r
+ }\r
+\r
+ if (hideView < 0 || hideView > COUNTDOWN_MAX)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootView::CheckViewParam hideView err.");\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ // 4.切换视图\r
+ void MainCountDownView::ChangeView(int16_t hideView, int16_t showView)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeView %d, %d", hideView, showView);\r
+ if (!CheckViewParam(hideView, showView))\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::CheckViewParam failed.");\r
+ return;\r
+ }\r
+ if (hideView != COUNTDOWN_MAX)\r
+ {\r
+ if (scrollView[hideView] == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ scrollView[hideView]->SetVisible(false);\r
+ }\r
+ ClickFunc(showView);\r
+ scrollView[showView]->SetVisible(true);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: ChangeView end!!!%d", showView);\r
+ Draw();\r
+ }\r
+ /* -------------------------------------------------------------------------- */\r
+\r
+ void MainCountDownView::OnStart()\r
+ {\r
+ /* -------------------------------------------------------------------------- */\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d,%d",CountDownModel::GetInstance()->CountDownTimerIsEnd(),CountDownModel::GetInstance()->GetChanageToStartCountDownView());\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd() == false ||\r
+ CountDownModel::GetInstance()->GetChanageToStartCountDownView() == true)\r
+ {\r
+ ChangeView(COUNTDOWN_MAX, START_COUNTDOWN); // 如果倒计时的timer没有结束或需要跳转到开始倒计时界面,则跳转到开始倒计时界面\r
+ }\r
+ else\r
+ {\r
+ ChangeView(COUNTDOWN_MAX, MAIN_COUNTDOWN); // 如果倒计时的timer已经结束,则跳转到主界面\r
+ }\r
+ /* -------------------------------------------------------------------------- */\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+#include "countdown/include/StartCountDownView.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "countdown/include/CountDownModel.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "uicomponents/UIComponents.h"\r
+\r
+/*开始倒计时*/\r
+namespace OHOS\r
+{\r
+\r
+ static StartCountDownView *g_pStartCountDownView{nullptr};\r
+\r
+ StartCountDownView::StartCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartCountDownView::StartCountDownView");\r
+ g_pStartCountDownView = this;\r
+ }\r
+\r
+ StartCountDownView::~StartCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartCountDownView::~StartCountDownView");\r
+ ClearAll();\r
+ g_pStartCountDownView = nullptr;\r
+ }\r
+\r
+ StartCountDownView *StartCountDownView::GetInstance()\r
+ {\r
+ return g_pStartCountDownView;\r
+ }\r
+\r
+ void StartCountDownView::ClearAll()\r
+ {\r
+ scrollView->RemoveAll();\r
+\r
+ if (Title != nullptr)\r
+ {\r
+ delete Title;\r
+ Title = nullptr;\r
+ }\r
+\r
+ if (showCountDownTimelabel != nullptr)\r
+ {\r
+ delete showCountDownTimelabel;\r
+ showCountDownTimelabel = nullptr;\r
+ }\r
+\r
+ if (vectorImage != nullptr)\r
+ {\r
+ delete vectorImage;\r
+ vectorImage = nullptr;\r
+ }\r
+ if (showTheRingTime != nullptr)\r
+ {\r
+ delete showTheRingTime;\r
+ showTheRingTime = nullptr;\r
+ }\r
+\r
+ if (play_or_pause_toggleButton != nullptr)\r
+ {\r
+ delete play_or_pause_toggleButton;\r
+ play_or_pause_toggleButton = nullptr;\r
+ }\r
+\r
+ if (endbutton != nullptr)\r
+ {\r
+ delete endbutton;\r
+ endbutton = nullptr;\r
+ }\r
+\r
+ if (nullptr != RepeatButton)\r
+ {\r
+ delete RepeatButton;\r
+ RepeatButton = nullptr;\r
+ }\r
+\r
+ if (nullptr != showTheEndRingTime)\r
+ {\r
+ delete showTheEndRingTime;\r
+ showTheEndRingTime = nullptr;\r
+ }\r
+ if (nullptr != vectorbigImage)\r
+ {\r
+ delete vectorbigImage;\r
+ vectorbigImage = nullptr;\r
+ }\r
+ if (scrollView != nullptr)\r
+ {\r
+ delete scrollView;\r
+ scrollView = nullptr;\r
+ }\r
+ }\r
+ void StartCountDownView::SetEndView()\r
+ {\r
+ /*最后显示图片*/\r
+ InitImageView(vectorbigImage, 183, 120, 100, 100, "image", VectorBigImagesPath);\r
+\r
+ /*显示时间字符串*/\r
+ std::string EndTimeStr = CountDownModel::GetInstance()->GetCountDownTime();\r
+ InitLabel(showTheEndRingTime, 83, 240, 300, 47, "title", EndTimeStr.c_str(), GILROY_BOLD_FONT, 40);\r
+\r
+ /*结束前先隐藏*/\r
+ vectorbigImage->SetVisible(false);\r
+ showTheEndRingTime->SetVisible(false);\r
+ }\r
+ UIScrollView *StartCountDownView::StartCountDownViewInit()\r
+ {\r
+ if (scrollView == nullptr)\r
+ {\r
+ scrollView = new UIScrollView();\r
+ scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ scrollView->SetViewId(STARTCOUNTDOWNVIEW);\r
+ scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ /* -------------------------------------------------------------------------- */\r
+ Title = new UILabelExt();\r
+ if (Title == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Title->SetPosition(83, 50, 300, 35);\r
+ Title->SetStyle(STYLE_TEXT_FONT, 30);\r
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时\r
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ Title->SetRollSpeed(23);\r
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------------------------------------------------------- */\r
+ showCountDownTimelabel = new UILabelExt();\r
+ if (showCountDownTimelabel == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCountDownTimelabel is new fail!!");\r
+ return nullptr;\r
+ }\r
+ showCountDownTimelabel->SetPosition(33, 138, 400, 94);\r
+ showCountDownTimelabel->SetStyle(STYLE_TEXT_FONT, 80);\r
+ showCountDownTimelabel->SetStyle(STYLE_LINE_HEIGHT, 94);\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd()) // 如果定时器是停的,显示设置的倒计时时间\r
+ showCountDownTimelabel->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\r
+ else\r
+ showCountDownTimelabel->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+ showCountDownTimelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ showCountDownTimelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ showCountDownTimelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 80);\r
+ showCountDownTimelabel->SetRollSpeed(23);\r
+ /* -------------------------------------------------------------------------- */\r
+ vectorImage = new UIImageView();\r
+ if (vectorImage == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "vectorImage is new fail!!");\r
+ return nullptr;\r
+ }\r
+ vectorImage->SetPosition(174, 247, 28, 28);\r
+ vectorImage->SetSrc(VectorImagesPath);\r
+ /* -------------------------------------------------------------------------- */\r
+ showTheRingTime = new UILabelExt();\r
+ if (showTheRingTime == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showTheRingTime is new fail!!");\r
+ return nullptr;\r
+ }\r
+ showTheRingTime->SetPosition(209, 241, 81, 41);\r
+ showTheRingTime->SetStyle(STYLE_TEXT_FONT, 35);\r
+ showTheRingTime->SetStyle(STYLE_LINE_HEIGHT, 41);\r
+ showTheRingTime->SetText(CountDownModel::GetInstance()->GetRingTime().c_str());\r
+ showTheRingTime->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ showTheRingTime->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));\r
+ showTheRingTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ showTheRingTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 35);\r
+ /* -------------------------------------------------------------------------- */\r
+ play_or_pause_toggleButton = new UIToggleButton();\r
+ if (play_or_pause_toggleButton == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "play_or_pause_toggleButton is new fail!!");\r
+ return nullptr;\r
+ }\r
+ play_or_pause_toggleButton->SetPosition(248, 321, 100, 100);\r
+ play_or_pause_toggleButton->SetViewId(PlayOrPauseToggleButton_ViewID);\r
+ play_or_pause_toggleButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+ play_or_pause_toggleButton->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd() || CountDownModel::GetInstance()->GetCountDownTimerIsPause()) // 如果定时器是停的\r
+ play_or_pause_toggleButton->SetState(false);\r
+ else\r
+ play_or_pause_toggleButton->SetState(true);\r
+ play_or_pause_toggleButton->SetImages(CountDown_Play_ImagePath, CountDown_PAUSE_ImagePath);\r
+ UICheckBox::OnChangeListener *ToggleButtonChange = static_cast<UICheckBox::OnChangeListener *>(MainCountDownPresenter::GetInstance());\r
+ play_or_pause_toggleButton->SetOnChangeListener(ToggleButtonChange);\r
+ play_or_pause_toggleButton->SetVisible(true);\r
+\r
+ /* -------------------------------------------------------------------------- */\r
+ endbutton = new UIButton();\r
+ if (endbutton == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!");\r
+ return nullptr;\r
+ }\r
+ endbutton->SetPosition(118, 321, 100, 100);\r
+ endbutton->SetViewId(STARTCOUNTDOWNVIEWRETURNBUTTON);\r
+ endbutton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);\r
+ endbutton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+ endbutton->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ endbutton->SetImageSrc(EndButton_ImagePath, EndButton_ImagePath);\r
+ endbutton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);\r
+ endbutton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED);\r
+ UIView::OnClickListener *buttonClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ if (buttonClick == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonClick is new fail!!");\r
+ return nullptr;\r
+ }\r
+ endbutton->SetOnClickListener(buttonClick);\r
+ RepeatButton = new UIButton();\r
+ if (nullptr == RepeatButton)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!");\r
+ return nullptr;\r
+ }\r
+ RepeatButton->SetPosition(248, 321, 100, 100);\r
+ RepeatButton->SetViewId(RepeatButtonViewID);\r
+ RepeatButton->SetStyle(STYLE_BACKGROUND_COLOR, 0x00);\r
+ RepeatButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+ RepeatButton->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ RepeatButton->SetImageSrc(RepeatButtonImagePath, RepeatButtonImagePath);\r
+ RepeatButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);\r
+ RepeatButton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED);\r
+ UIView::OnClickListener *RepeatButtonClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ RepeatButton->SetOnClickListener(RepeatButtonClick);\r
+ RepeatButton->SetVisible(false);\r
+\r
+ SetEndView();\r
+\r
+ /* ----------------------------------- Add ---------------------------------- */\r
+ scrollView->Add(Title);\r
+ scrollView->Add(showCountDownTimelabel);\r
+ scrollView->Add(vectorImage);\r
+ scrollView->Add(showTheRingTime);\r
+ scrollView->Add(endbutton);\r
+ scrollView->Add(play_or_pause_toggleButton);\r
+ scrollView->Add(RepeatButton);\r
+ scrollView->Add(vectorbigImage);\r
+ scrollView->Add(showTheEndRingTime);\r
+ }\r
+\r
+ return scrollView;\r
+ }\r
+\r
+ // 获取显示倒计时时间标签\r
+ UILabelExt *StartCountDownView::GetShowCountDownTimelabel(void)\r
+ {\r
+ return showCountDownTimelabel;\r
+ }\r
+\r
+ // 获取显示响铃时间标签\r
+ UILabelExt *StartCountDownView::GetShowTheRingTimelabel(void)\r
+ {\r
+ return showTheRingTime;\r
+ }\r
+\r
+ UIToggleButton *StartCountDownView::GetPlayOrPauseToggleButton(void)\r
+ {\r
+ return play_or_pause_toggleButton;\r
+ }\r
+\r
+ UIButton *StartCountDownView::GetRepeatButton(void)\r
+ {\r
+ return RepeatButton;\r
+ }\r
+\r
+ void StartCountDownView::SetImageAndLabel(bool state)\r
+ {\r
+ if (vectorImage == nullptr || showTheRingTime == nullptr)\r
+ return;\r
+\r
+ vectorImage->SetVisible(state);\r
+ showTheRingTime->SetVisible(state);\r
+ }\r
+ /*结束状态更新*/\r
+ void StartCountDownView::ShowEndView(bool state)\r
+ {\r
+ if (vectorImage == nullptr || showTheRingTime == nullptr || showCountDownTimelabel == nullptr)\r
+ return;\r
+\r
+ vectorImage->SetVisible(!state);\r
+ showTheRingTime->SetVisible(!state);\r
+ showCountDownTimelabel->SetVisible(!state);\r
+\r
+ vectorbigImage->SetVisible(state);\r
+ showTheEndRingTime->SetVisible(state);\r
+ showTheEndRingTime->SetText(showTheRingTime->GetText());\r
+ }\r
+ void StartCountDownView::UpdateimageAndLabelPosition(void)\r
+ {\r
+ if (vectorImage == nullptr || showTheRingTime == nullptr)\r
+ return;\r
+ int w = vectorImage->GetWidth() + showTheRingTime->GetTextWidth() + 7;\r
+ vectorImage->SetX((Screen::GetInstance().GetWidth() - w) / 2);\r
+ showTheRingTime->SetX(vectorImage->GetX() + vectorImage->GetWidth() + 7);\r
+ vectorImage->Invalidate();\r
+ showTheRingTime->Invalidate();\r
+ }\r
+}
\ No newline at end of file