From bf5886e2f1e36c74f1235235a414ed019f14bba7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E7=BD=97=E6=AD=A3?= <1732036298@qq.com> Date: Tue, 20 Aug 2024 11:14:49 +0000 Subject: [PATCH] Merge #742 into sdk602patch0626 from refs/changes/742/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 罗正 * refs/changes/742/head: (17 commits squashed) - 1. 优化连接中的gif动画,由原来的20帧修改为现在的20帧 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - 修改连接动画为60帧 - 添加手机同步歌曲到手表,手表音乐列表同步刷新。 - 音乐列表刷新机制优化在每次切换到音乐列表刷新一次,list高度会根据歌曲数量自适应 - 显示方式界面添加弧形列表样式,并添加对应资源 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - 倒计时界面配置多国语言 - 1.运动识别弹窗根据弹窗汇总设置显示时长为10s,并添加震动 2.修复开始按钮的视图Id - 倒计时界面优化修改 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - 倒计时优化修改 - 倒计时配置多国语言 - APPlist应用顺序按照KUMI已经重新排列,放入设置中的四个Slice暂未屏蔽等之后加入后再屏蔽 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - 1.音乐播放器在切换通道时添加主动连接和断开手机a2dp功能 2.播放器添加连接动画,手表连接手机音乐超时时间设置为5s - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 Signed-off-by: 罗正 <1732036298@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/742 --- .../include/ui_resource_string.h | 15 +- .../nativeui/applist/src/ApplistModel.cpp | 10 +- .../include/MainCountDownPresenter.h | 4 +- .../countdown/include/MainCountDownView.h | 4 +- .../nativeui/countdown/src/CountDownModel.cpp | 11 +- .../countdown/src/CountDownTimeConfigView.cpp | 8 +- .../src/CountDownTimeNotNullView.cpp | 27 ++-- .../countdown/src/MainCountDownView.cpp | 31 ++-- .../countdown/src/StartCountDownView.cpp | 42 +++--- .../nativeui/player/include/PlayersModel.h | 4 +- .../player/include/PlayersPresenter.h | 3 +- .../nativeui/player/include/PlayersView.h | 6 +- .../player/src/MusicPlayerSourceView.cpp | 17 ++- .../nativeui/player/src/PlayersModel.cpp | 89 +++++++++++ .../nativeui/player/src/PlayersPresenter.cpp | 10 -- .../nativeui/player/src/PlayersView.cpp | 86 ++++++++--- .../nativeui/settings/src/SettingModel.cpp | 7 +- .../include/MainStopWatchPresenter.h | 3 +- .../stopwatch/src/MainStopWatchPresenter.cpp | 2 +- .../stopwatch/src/MainStopWatchView.cpp | 138 ++++++++++-------- .../nativeui/stopwatch/src/StopWatchModel.cpp | 2 +- .../src/StopWatchRecordCycleToLimitView.cpp | 91 +++++++----- .../src/StopWatchRecordTimeToLimitView.cpp | 103 ++++++++----- .../msg_center/src/msg_center_customer.cpp | 5 - .../motion_recognition_notification.cpp | 11 +- .../fd230/fs/user/res/font/en.lang | Bin 11447 -> 11726 bytes .../fs/user/res/font/ui_resource_string.h | 15 +- .../fd230/fs/user/res/font/zh.lang | Bin 10313 -> 10582 bytes .../Language_xml/input_list_en.txt | 16 +- .../Language_xml/input_list_zh.txt | 16 +- .../language_tool/Language_xml/language.xlsx | Bin 31637 -> 32193 bytes .../Language_xml/language_en.xml | 14 +- .../Language_xml/language_zh.xml | 14 +- tools/language_tool/font/en.lang | Bin 11447 -> 11726 bytes tools/language_tool/font/ui_resource_string.h | 15 +- tools/language_tool/font/zh.lang | Bin 10313 -> 10582 bytes 36 files changed, 562 insertions(+), 257 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h index fc0599e31..974f2c6e6 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h @@ -531,7 +531,20 @@ enum UIResourceTextId : uint16_t { STR_IGNORE = 518, STR_START = 519, STR_ARC_SCALE_LIST_DISPLAY = 520, - STR_MAX_ID = 521, + STR_COUNT_DOWN = 521, + STR_CUSTOM_TIME = 522, + STR_QUICK_START = 523, + STR_1_MIN = 524, + STR_5_MIN = 525, + STR_10_MIN = 526, + STR_30_MIN = 527, + STR_SET_COUNT_DOWN_NOTE = 528, + STR_COUNTDOWN_ENDS = 529, + STR_MAXIMUM_TIME_REACH = 530, + STR_STOPWATCH_STOP_NOTE = 531, + STR_TMCHBR = 532, + STR_MAXIMUM_TIME_REACH_NOTE = 533, + STR_MAX_ID = 534, }; // UIResourceTextId enum FontLanguageId : uint8_t { 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 a3b1bcec2..b84bc5eb1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp @@ -55,11 +55,12 @@ namespace OHOS #ifdef A5133_DEMO_CLIENT {VIEW_OBU_MESSAGE, PNG_APPLIST_THEME_IMAGE, PNG_APPLIST_THEME_IMAGE, PNG_APPLIST_DEFAULT_IMG, "OBU", STR_OBU_MESSAGE, nullptr}, #endif - {VIEW_MAIN_PHONE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_DEFAULT_IMG, "手机", STR_PHONE, nullptr}, + {VIEW_MAIN_PHONE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_DEFAULT_IMG, "电话", STR_PHONE, nullptr}, #if HEART_APPLIST {VIEW_HEART_CHART, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_DEFAULT_IMG, "心率", STR_HEART_RATE, nullptr}, #endif {VIEW_BLOOD_RESULT, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧", STR_BLOOD_OXYGEN, nullptr}, + {VIEW_SLEEP, PNG_APPLIST_SLEEP_IMAGE, PNG_APPLIST_SLEEP_IMAGE, PNG_APPLIST_DEFAULT_IMG, "睡眠", STR_SLEEP, nullptr}, {VIEW_TRAINING, PNG_APPLIST_TRAINING_IMAGE, PNG_APPLIST_TRAINING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "训练", STR_TRAINING, nullptr}, {VIEW_TRAINING_RECORD, PNG_APPLIST_TRAINING_RECORD_IMAGE, PNG_APPLIST_TRAINING_RECORD_IMAGE, PNG_APPLIST_DEFAULT_IMG, "训练记录", STR_TRAINING_RECORD, nullptr}, {VIEW_GOAL, PNG_APPLIST_GOAL_IMAGE, PNG_APPLIST_GOAL_IMAGE, PNG_APPLIST_DEFAULT_IMG, "活动", STR_ACTIVITY, nullptr}, @@ -67,9 +68,9 @@ namespace OHOS #ifdef SUPPORT_ALIPAY_SEC {VIEW_MAIN_ALIPAY, PNG_APPLIST_ALIPAY_IMAGE, PNG_APPLIST_ALIPAY_IMAGE, PNG_APPLIST_DEFAULT_IMG, "支付宝", STR_ALIPAY, nullptr}, #endif - {VIEW_CALCULATOR, PNG_APPLIST_INFORMATION_IMAGE, PNG_APPLIST_INFORMATION_IMAGE, PNG_APPLIST_DEFAULT_IMG, "计算器", STR_CALCULATOR, nullptr}, {VIEW_MESSAGE, PNG_APPLIST_MESSAGE_IMAGE, PNG_APPLIST_MESSAGE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "消息通知", STR_MESSAGE_NOTIFICATION, nullptr}, {VIEW_COMPASS, PNG_APPLIST_COMPASS_IMAGE, PNG_APPLIST_COMPASS_IMAGE, PNG_APPLIST_DEFAULT_IMG, "指南针", STR_COMPASS, nullptr}, + {VIEW_CALCULATOR, PNG_APPLIST_INFORMATION_IMAGE, PNG_APPLIST_INFORMATION_IMAGE, PNG_APPLIST_DEFAULT_IMG, "计算器", STR_CALCULATOR, nullptr}, {VIEW_RECORD, PNG_APPLIST_RECORD_IMAGE, PNG_APPLIST_RECORD_IMAGE, PNG_APPLIST_DEFAULT_IMG, "录音", STR_RECORD, nullptr}, {VIEW_FLASHLIGHT, PNG_APPLIST_FLASHLIGHT_IMAGE, PNG_APPLIST_FLASHLIGHT_IMAGE, PNG_APPLIST_DEFAULT_IMG, "手电筒", STR_FLASHLIGHT, nullptr}, {VIEW_WEATHER, PNG_APPLIST_WEATHER_IMAGE, PNG_APPLIST_WEATHER_IMAGE, PNG_APPLIST_DEFAULT_IMG, "天气", STR_WEATHER, nullptr}, @@ -78,19 +79,20 @@ namespace OHOS {VIEW_RESPIRATORY_TRAINING, PNG_APPLIST_BREATHE_IMAGE, PNG_APPLIST_BREATHE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "呼吸训练", STR_BREATH_TRAINING, nullptr}, {VIEW_TAKEPHOTOS, PNG_APPLIST_TACKEPHOTOS_IMAGE, PNG_APPLIST_TACKEPHOTOS_IMAGE, PNG_APPLIST_DEFAULT_IMG, "遥控拍照", STR_REMOTE_SHOOTING, nullptr}, {VIEW_MAIN_ALARM, PNG_APPLIST_ALARM_IMAGE, PNG_APPLIST_ALARM_IMAGE, PNG_APPLIST_DEFAULT_IMG, "闹钟", STR_ALARM, nullptr}, - {VIEW_SOUND_VIBRATION, PNG_APPLIST_VOICE_IMAGE, PNG_APPLIST_VOICE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "声音", STR_SOUND, nullptr}, {VIEW_FIND_PHONE, PNG_APPLIST_FINDPHONE_IMAGE, PNG_APPLIST_FINDPHONE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "查找手机", STR_FIND_PHONE, nullptr}, + /* ------------------------------- 放入设置中后将会屏蔽 ------------------------------- */ {VIEW_DNOTDISTURB, PNG_APPLIST_DISTURB_IMAGE, PNG_APPLIST_DISTURB_IMAGE, PNG_APPLIST_DEFAULT_IMG, "勿扰模式", STR_DO_NOT_DISTURB, nullptr}, {VIEW_ADD_CARD, PNG_APPLIST_CARDSET_IMAGE, PNG_APPLIST_CARDSET_IMAGE, PNG_APPLIST_DEFAULT_IMG, "卡片管理", STR_CARD_MANAGEMENT, nullptr}, {VIEW_SET_DIAL_STYLE, PNG_APPLIST_CHANGEDIAL_IMAGE, PNG_APPLIST_CHANGEDIAL_IMAGE, PNG_APPLIST_DEFAULT_IMG, "更换表盘", STR_WATCH_FACE, nullptr}, {VIEW_SAVEELE, PNG_APPLIST_SAVEELE_IMAGE, PNG_APPLIST_SAVEELE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "省电模式", STR_POWER_SAVE_MODE, nullptr}, - {VIEW_SLEEP, PNG_APPLIST_SLEEP_IMAGE, PNG_APPLIST_SLEEP_IMAGE, PNG_APPLIST_DEFAULT_IMG, "睡眠", STR_SLEEP, nullptr}, + /* -------------------------------------------------------------------------- */ // {VIEW_MUSIC_PLAYER, PNG_APPLIST_MUSIC_IMAGE, PNG_APPLIST_MUSIC_IMAGE, PNG_APPLIST_DEFAULT_IMG, "音乐播放器", STR_MUSIC, nullptr}, {VIEW_OFFLINEVOICE, PNG_APPLIST_VOCASSIST_IMAGE, PNG_APPLIST_VOCASSIST_IMAGE, PNG_APPLIST_DEFAULT_IMG, "语音助手", STR_VOICE_ASSISTANT, nullptr}, // {VIEW_SCHEDULE, PNG_APPLIST_SCHEDULE_IMAGE, PNG_APPLIST_SCHEDULE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "schedule", STR_SCHEDULE, nullptr}, {VIEW_SETTING, PNG_APPLIST_SETTING_IMAGE, PNG_APPLIST_SETTING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "设置", STR_SETTINGS, nullptr}, #if 0 /*屏蔽Slice*/ + {VIEW_SOUND_VIBRATION, PNG_APPLIST_VOICE_IMAGE, PNG_APPLIST_VOICE_IMAGE, PNG_APPLIST_DEFAULT_IMG, "声音", STR_SOUND, nullptr}, {VIEW_PHONEDIR, PNG_APPLIST_CALLLOG_IMAGE, PNG_APPLIST_CALLLOG_IMAGE, PNG_APPLIST_DEFAULT_IMG, "常用联系人", STR_FAVORITE_CONTACTS, nullptr}, {VIEW_THEME_STYLE, PNG_APPLIST_THEME_IMAGE, PNG_APPLIST_THEME_IMAGE, PNG_APPLIST_DEFAULT_IMG, "显示方式", STR_DISPLAY_MODE, nullptr}, {VIEW_BRIGHTNESSLEVEL, PNG_APPLIST_BRIGHTNESSLEVEL_IMAGE, PNG_APPLIST_BRIGHTNESSLEVEL_IMAGE, PNG_APPLIST_DEFAULT_IMG, "亮度调节", STR_BRIGHTNESS_ADJUSTMENT, nullptr}, diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h index d946e7b39..c87e4a417 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-04-07 18:15:53 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-06-07 19:57:56 + * @LastEditTime: 2024-08-20 10:17:35 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h */ #ifndef MAIN_COUNTDOWN_PRESENTER_H @@ -11,7 +11,7 @@ #include "View.h" #include "Presenter.h" #include "MainCountDownView.h" - +#include "ui_resource_string.h" /*倒计时的主界面*/ namespace OHOS { diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h b/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h index 2eaf8ca2a..0b43fbb59 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-04-07 18:15:53 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-04-08 16:15:10 + * @LastEditTime: 2024-08-20 10:48:28 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h */ #ifndef MAIN_COUNTDOWN_VIEW_H @@ -67,7 +67,7 @@ namespace OHOS private: void MainCountDownViewInit(void); void ClearAll(void); - UILabelButtonExt *SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text); + UILabelButtonExt *SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text,int textId); UIViewGroup *group = nullptr; UIScrollView *scrollView[COUNTDOWN_MAX_VIEW]{nullptr}; UILabelExt *Title{nullptr}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp index b93a47fc0..a8a031f74 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-04-07 18:15:53 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-04-09 15:38:14 + * @LastEditTime: 2024-08-20 15:16:40 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp */ #include "countdown/include/CountDownModel.h" @@ -12,8 +12,8 @@ #include "wearable_log.h" #include "countdown/include/MainCountDownView.h" #include -#include "../../../../../../../drivers/peripheral/config/include/ConfigModel.h" - +#include "ConfigModel.h" +#include "ui_resource_string.h" namespace OHOS { /* -------------------------------------------------------------------------- */ @@ -354,7 +354,7 @@ namespace OHOS static void CountDown_TimerCallbackProc(int data) { CountDownModel::g_CountDownTimes--; // 每次回调减少1秒 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_CountDownTimes:%d\n", CountDownModel::g_CountDownTimes); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_CountDownTimes:%d\n", CountDownModel::g_CountDownTimes); if (MainCountDownView::GetInstance() == nullptr) { @@ -386,7 +386,8 @@ namespace OHOS MainCountDownView::GetInstance()->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(false); MainCountDownView::GetInstance()->GetStartCountDownView()->GetRepeatButton()->SetVisible(true); CountDownModel::GetInstance()->CountDown_StopTimer(); // 停止定时器 - MainCountDownView::GetInstance()->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText("倒计时结束"); + MainCountDownView::GetInstance()->GetStartCountDownView()->GetShowCountDownTimelabel()->SetTextId(STR_COUNTDOWN_ENDS);//倒计时结束 + MainCountDownView::GetInstance()->GetStartCountDownView()->GetShowCountDownTimelabel()->ForceResetText(); // 进行倒计时结束时的额外操作,比如播放声音、显示通知等 // CountDownModel::GetInstance()->StartRingtonePlayback(); CountDownModel::GetInstance()->RequestStartRingtone(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeConfigView.cpp b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeConfigView.cpp index da9348c0e..3863c7917 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeConfigView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeConfigView.cpp @@ -91,13 +91,13 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::Title is new fail!!"); return nullptr; } - Title->SetPosition(83, 52, 300, 40); + Title->SetPosition(83, 50, 300, 35); Title->SetStyle(STYLE_TEXT_FONT, 30); Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("倒计时"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + Title->SetTextId(STR_COUNT_DOWN);//倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(40); + Title->SetRollSpeed(70); Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ timePicker = new UITimePicker(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeNotNullView.cpp b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeNotNullView.cpp index dbb2cd97b..f2d4dc97a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeNotNullView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownTimeNotNullView.cpp @@ -73,13 +73,13 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is new fail!!"); return nullptr; } - Title->SetPosition(83, 52, 300, 40); + Title->SetPosition(83, 50, 300, 35); Title->SetStyle(STYLE_TEXT_FONT, 30); Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("倒计时"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(40); + Title->SetRollSpeed(70); Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ Attention = new UIImageView(); @@ -98,27 +98,34 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::AttentionLabel is new fail!!"); return nullptr; } - AttentionLabel->SetPosition(33, 253, 400, 40); + AttentionLabel->SetPosition(53, 253, 360, 35); AttentionLabel->SetStyle(STYLE_TEXT_FONT, 30); AttentionLabel->SetStyle(STYLE_LINE_HEIGHT, 35); - AttentionLabel->SetText("请先设置好倒计时间"); - AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + AttentionLabel->SetTextId(STR_SET_COUNT_DOWN_NOTE); // 请先设置好倒计时间 + AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); AttentionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - AttentionLabel->SetRollSpeed(40); + AttentionLabel->SetRollSpeed(70); AttentionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ + button = new UILabelButtonExt(); if (button == nullptr) { - button = new UILabelButtonExt(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::button is new fail!!"); + return nullptr; } button->SetPosition(0, 366, 466, 100); button->SetViewId(COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON); button->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE); - button->SetText("知道了"); + button->SetTextId(STR_KONW); // 知道了 button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); button->SetStyle(STYLE_LINE_HEIGHT, 35); button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); UIView::OnClickListener *buttonClick = static_cast(MainCountDownPresenter::GetInstance()); + if (buttonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::buttonClick is new fail!!"); + return nullptr; + } button->SetOnClickListener(buttonClick); /* ----------------------------------- Add ---------------------------------- */ scrollView->Add(Title); diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/MainCountDownView.cpp b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/MainCountDownView.cpp index 2680cbae7..6a7674a9e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/MainCountDownView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/MainCountDownView.cpp @@ -142,13 +142,13 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title is new fail!!"); return; } - Title->SetPosition(83, 55, 300, 40); + Title->SetPosition(83, 50, 300, 35); Title->SetStyle(STYLE_TEXT_FONT, 30); Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("倒计时"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(40); + Title->SetRollSpeed(70); Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------- CUSTOM_COUNTDOWN ------------------------- */ CUSTOM_COUNTDOWN = new UILabelButtonExt(); @@ -161,7 +161,7 @@ namespace OHOS CUSTOM_COUNTDOWN->SetViewId(COUNTDOWN_LABELBUTTON_VIEWID); CUSTOM_COUNTDOWN->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffa800); CUSTOM_COUNTDOWN->SetStyle(STYLE_BORDER_RADIUS, 100); - CUSTOM_COUNTDOWN->SetText("自定义时间"); + CUSTOM_COUNTDOWN->SetTextId(STR_CUSTOM_TIME); // 自定义时间 CUSTOM_COUNTDOWN->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); CUSTOM_COUNTDOWN->SetStyle(STYLE_LINE_HEIGHT, 35); CUSTOM_COUNTDOWN->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); @@ -172,37 +172,37 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QuickStart is new fail!!"); return; } - QuickStart->SetPosition(83, 270, 300, 40); + QuickStart->SetPosition(83, 270, 300, 35); QuickStart->SetStyle(STYLE_TEXT_FONT, 30); QuickStart->SetStyle(STYLE_LINE_HEIGHT, 35); - QuickStart->SetText("快速开始"); - QuickStart->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + QuickStart->SetTextId(STR_QUICK_START); + QuickStart->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); QuickStart->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - QuickStart->SetRollSpeed(40); + QuickStart->SetRollSpeed(70); QuickStart->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* ----------------------- COUNTDOWN_ONE_MINUTE_BUTTON ---------------------- */ - COUNTDOWN_ONE_MINUTE_BUTTON = SetUILabelButton(43, 345, 180, 150, COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID, "1分钟"); + COUNTDOWN_ONE_MINUTE_BUTTON = SetUILabelButton(43, 345, 180, 150, COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID, "1分钟", STR_1_MIN); if (COUNTDOWN_ONE_MINUTE_BUTTON == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON is new fail!!"); return; } /* ---------------------- COUNTDOWN_FIVE_MINUTE_BUTTON ---------------------- */ - COUNTDOWN_FIVE_MINUTE_BUTTON = SetUILabelButton(243, 345, 180, 150, COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID, "5分钟"); + COUNTDOWN_FIVE_MINUTE_BUTTON = SetUILabelButton(243, 345, 180, 150, COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID, "5分钟", STR_5_MIN); if (COUNTDOWN_FIVE_MINUTE_BUTTON == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON is new fail!!"); return; } /* ----------------------- COUNTDOWN_TEN_MINUTE_BUTTON ---------------------- */ - COUNTDOWN_TEN_MINUTE_BUTTON = SetUILabelButton(43, 515, 180, 150, COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID, "10分钟"); + COUNTDOWN_TEN_MINUTE_BUTTON = SetUILabelButton(43, 515, 180, 150, COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID, "10分钟", STR_10_MIN); if (COUNTDOWN_TEN_MINUTE_BUTTON == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON is new fail!!"); return; } /* --------------------- COUNTDOWN_THIRTY_MINUTE_BUTTON --------------------- */ - COUNTDOWN_THIRTY_MINUTE_BUTTON = SetUILabelButton(243, 515, 180, 150, COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID, "30分钟"); + COUNTDOWN_THIRTY_MINUTE_BUTTON = SetUILabelButton(243, 515, 180, 150, COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID, "30分钟", STR_30_MIN); if (COUNTDOWN_THIRTY_MINUTE_BUTTON == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON is new fail!!"); @@ -218,7 +218,7 @@ namespace OHOS } } - UILabelButtonExt *MainCountDownView::SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text) + UILabelButtonExt *MainCountDownView::SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text, int textId) { UILabelButtonExt *button = new UILabelButtonExt(); if (button == nullptr) @@ -232,7 +232,8 @@ namespace OHOS button->SetImagePosition(72, 30); ImageInfo *img = ImageCacheManager::GetInstance().LoadSingleRes(COUNTDOWM_TIMER_ICON); button->SetImageSrc(img, img); - button->SetText(text); + // button->SetText(text); + button->SetTextId(textId); button->SetAlign(TEXT_ALIGNMENT_LEFT); button->SetLabelPosition(51, 61); button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/StartCountDownView.cpp b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/StartCountDownView.cpp index e93ec1234..d5b3083f5 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/StartCountDownView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/StartCountDownView.cpp @@ -95,13 +95,13 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is is new fail!!"); return nullptr; } - Title->SetPosition(83, 52, 300, 40); + Title->SetPosition(83, 50, 300, 35); Title->SetStyle(STYLE_TEXT_FONT, 30); Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("倒计时"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(40); + Title->SetRollSpeed(70); Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ showCountDownTimelabel = new UILabelExt(); @@ -114,9 +114,10 @@ namespace OHOS showCountDownTimelabel->SetStyle(STYLE_TEXT_FONT, 80); showCountDownTimelabel->SetStyle(STYLE_LINE_HEIGHT, 94); showCountDownTimelabel->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str()); - showCountDownTimelabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + showCountDownTimelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); showCountDownTimelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); showCountDownTimelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 80); + showCountDownTimelabel->SetRollSpeed(70); /* -------------------------------------------------------------------------- */ vectorImage = new UIImageView(); if (vectorImage == nullptr) @@ -142,9 +143,11 @@ namespace OHOS showTheRingTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); showTheRingTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 35); /* -------------------------------------------------------------------------- */ + play_or_pause_toggleButton = new UIToggleButton(); if (play_or_pause_toggleButton == nullptr) { - play_or_pause_toggleButton = new UIToggleButton(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "play_or_pause_toggleButton is new fail!!"); + return nullptr; } play_or_pause_toggleButton->SetPosition(248, 321, 100, 100); play_or_pause_toggleButton->SetViewId(PlayOrPauseToggleButton_ViewID); @@ -156,13 +159,13 @@ namespace OHOS play_or_pause_toggleButton->SetVisible(true); /* -------------------------------------------------------------------------- */ - // Add Button to App + endbutton = new UIButton(); if (endbutton == nullptr) { - endbutton = new UIButton(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!"); + return nullptr; } - endbutton->SetPosition(118, 321); - endbutton->Resize(100, 100); + endbutton->SetPosition(118, 321, 100, 100); endbutton->SetViewId(STARTCOUNTDOWNVIEWRETURNBUTTON); endbutton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); endbutton->SetStyle(STYLE_BACKGROUND_OPA, 0x00); @@ -171,15 +174,19 @@ namespace OHOS endbutton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); endbutton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED); UIView::OnClickListener *buttonClick = static_cast(MainCountDownPresenter::GetInstance()); + if (buttonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonClick is new fail!!"); + return nullptr; + } endbutton->SetOnClickListener(buttonClick); - /* ----------------------------------- Add ---------------------------------- */ - + RepeatButton = new UIButton(); if (nullptr == RepeatButton) { - RepeatButton = new UIButton(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!"); + return nullptr; } - RepeatButton->SetPosition(248, 321); - RepeatButton->Resize(100, 100); + RepeatButton->SetPosition(248, 321, 100, 100); RepeatButton->SetViewId(RepeatButtonViewID); RepeatButton->SetStyle(STYLE_BACKGROUND_COLOR, 0x00); RepeatButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00); @@ -187,10 +194,11 @@ namespace OHOS RepeatButton->SetImageSrc(RepeatButtonImagePath, RepeatButtonImagePath); RepeatButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); RepeatButton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED); - UIView::OnClickListener * RepeatButtonClick = static_cast(MainCountDownPresenter::GetInstance()); + UIView::OnClickListener *RepeatButtonClick = static_cast(MainCountDownPresenter::GetInstance()); RepeatButton->SetOnClickListener(RepeatButtonClick); RepeatButton->SetVisible(false); + /* ----------------------------------- Add ---------------------------------- */ scrollView->Add(Title); scrollView->Add(showCountDownTimelabel); scrollView->Add(vectorImage); @@ -220,7 +228,7 @@ namespace OHOS return play_or_pause_toggleButton; } - UIButton * StartCountDownView::GetRepeatButton(void) + UIButton *StartCountDownView::GetRepeatButton(void) { return RepeatButton; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h b/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h index 37be7a259..27b1d98a7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-08-05 15:20:03 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-08-13 17:11:32 + * @LastEditTime: 2024-08-20 17:18:32 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h */ @@ -101,6 +101,8 @@ public: void SetMusicSource(bool value); void UpdateMusicPlayerList(void); bool GetCurrentMusicIsPlaying(void); + void PlayerMusic_StartTimer(uint32_t interval = 1000); + void PlayerMusic_StopTimer(void); private: bool musicSourceFlag{false};//音乐来源标志:false:默认为手表音乐,true:手机音乐 private: diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h index 519943b3e..31b761ebb 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-08-05 15:20:03 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-08-13 16:10:15 + * @LastEditTime: 2024-08-20 17:57:54 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h */ @@ -240,7 +240,6 @@ public: void OnClickSuccBack(void); void OnClickConnFailBack(void); void OnClickFailBack(void); - void UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus); void SetPlaybackProgress(int64_t value); void SetPlayerState(bool value); void PlayerbackReset(void); diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h b/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h index d8b5f973a..5e1304da1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-08-05 15:20:03 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-08-14 11:26:39 + * @LastEditTime: 2024-08-20 17:39:13 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersView.h */ @@ -34,6 +34,7 @@ #include "player/include/MusicPlayerSourceView.h" #include "player/include/MusicPlayerBluetoothDisConView.h" #include "player/include/MusicPlayerBTConnectFailedView.h" +#include "aivoice/include/AiVoiceConnectingView.h" namespace OHOS { #define PLAY_PROGRESS_MIN 0 @@ -98,7 +99,7 @@ namespace OHOS UICircleProgress *GetPlaybackProgress(void); UICheckBox::UICheckBoxState GetPlayerButtonState(void); - void UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus); + void UpdatePlayerView(void); void UpdateMusicListStatus(void); void OnClickBackKeyToMainMusicPlayerView(void); @@ -152,6 +153,7 @@ namespace OHOS UIViewGroup *musicListGroupView{nullptr}; // 音乐列表视图 MusicPlayerBluetoothDisConView *musicPlayerBluetoothDisConView{nullptr}; // 蓝牙未连接视图 MusicPlayerBTConnectFailedView *musicPlayerBTConnectFailedView{nullptr}; // 蓝牙连接失败视图 + AiVoiceConnectingView *musicPlayerConnectingView{nullptr}; // 连接动画 private: UIView::OnClickListener *clickListener{nullptr}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerSourceView.cpp b/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerSourceView.cpp index bb47b64d4..1bef02af6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerSourceView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerSourceView.cpp @@ -67,15 +67,16 @@ namespace OHOS // 1.a2dp未连接,向手机发起a2dp连接 // 如果蓝牙没连接直接是跳转到蓝牙连接失败视图,连接了就有一个主动去连手机的a2dp过程,5秒超市 - playersPresenter->UpdatePlayerView(PlayersModel::GetInstance()->GetMusicSource(), phonebluetoothcon && a2dp); - if (!phonebluetoothcon) { playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW); } - else if (phonebluetoothcon && !a2dp) + else if (phonebluetoothcon && !a2dp) // 如果手机蓝牙已连接但手表与手机的a2dp未连接手表主动去连接a2dp { - playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW); + /* -------------------------------------------------------------------------- */ + uapi_a2dp_snk_connect(); // 切换通道主动连接atdp + /* -------------------------------------------------------------------------- */ + playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUISC_CONNECTING); } else if (phonebluetoothcon && a2dp) { @@ -87,8 +88,12 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick watchLableButton"); PlayersModel::GetInstance()->SetMusicSource(false); UpdateBluetoothHeadSetViewIsVisible(); - - playersPresenter->UpdatePlayerView(PlayersModel::GetInstance()->GetMusicSource(), phonebluetoothcon && a2dp); + /* -------------------------------------------------------------------------- */ + if (a2dp) + { + uapi_a2dp_snk_disconnect(); // 切换通道主动断开atdp + } + /* -------------------------------------------------------------------------- */ } else if (button == bluetoothHeadsetLableButton) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersModel.cpp index 3e2aa2c79..e2dd531dd 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersModel.cpp @@ -15,6 +15,9 @@ #include "bluetooth/include/BluetoothModel.h" #include #include +#include "cmsis_os.h" +#include +#include namespace OHOS { static constexpr int VOLUME_MAXIMUM = 100; @@ -801,6 +804,92 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void) } return false; } + + /* -------------------------------------------------------------------------- */ + static osTimerId_t g_timer = NULL; + static int g_PlayerTimes = 5; + + static void PlayerMusic_TimerCallbackProc(int data) + { + g_PlayerTimes--; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_PlayerTimes = %d",g_PlayerTimes); + PlayersView *playersView = PlayersView::GetInstance(); + if (playersView == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView nullptr err"); + return; + } + if(g_PlayerTimes < 0) /*5秒超时*/ + { + playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW); + } + else + { + bool a2dp = uapi_a2dp_snk_get_device_connect_state();// 获取a2dp连接状态 + if(a2dp) + { + playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MAIN_MUSICPLAYER_VIEW); + } + } + return; + } + static void PlayerMusic_TimerCallback(int data) + { + GraphicService::GetInstance()->PostGraphicEvent(std::bind(PlayerMusic_TimerCallbackProc, data)); + } + + void PlayersModel::PlayerMusic_StartTimer(uint32_t interval) + { + /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */ + if (g_timer != NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersModel::StopWatch_StartTimer Timer already exists!!"); + return; + } + + /* --------------------------------- 2.创建定时器 -------------------------------- */ + g_timer = osTimerNew((osTimerFunc_t)PlayerMusic_TimerCallback, osTimerPeriodic, NULL, NULL); + // 检查定时器创建是否成功 + if (g_timer == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersModel::StopWatch_StartTimer Timer create failed!!"); + return; + } + + /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */ + int tick = osMs2Tick(interval); + + /* --------------------------------- 4.启动定时器 -------------------------------- */ + // g_timerStartTimestamp = GetCurrentTimestamp(); // 假设GetCurrentTimestamp()是获取当前时间戳的函数 + osStatus_t ret = osTimerStart(g_timer, tick); + /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 NULL -------------------- */ + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[StopWatch_StartTimer]osTimerDelete failed, ret = %lx!!", ret); + if (g_timer != NULL) + { + ret = osTimerDelete(g_timer); + } + g_timer = NULL; + return; + } + return; + } + + void PlayersModel::PlayerMusic_StopTimer(void) + { + // 检查定时器是否存在 + if (g_timer != NULL) + { + // 删除定时器并置为 NULL + osStatus_t ret = osTimerDelete(g_timer); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret); + } + g_timer = NULL; + g_PlayerTimes = 5; + } + } } #ifdef __cplusplus diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersPresenter.cpp index 858364f59..27beed95a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersPresenter.cpp @@ -1474,16 +1474,6 @@ bool PlayersPresenter::OnClick(UIView &view, const ClickEvent &event) return false; } -void PlayersPresenter::UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus) -{ - PlayersView *playersView = PlayersView::GetInstance(); - if (playersView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail"); - return; - } - playersView->UpdatePlayerView(musicSourceType,phoneMusicConnectStatus); -} - void PlayersPresenter::SetPlaybackProgress(int64_t value) { PlayersView *playersView = PlayersView::GetInstance(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersView.cpp b/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersView.cpp index 204cce835..f981c7dc8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersView.cpp @@ -488,6 +488,12 @@ namespace OHOS delete musicPlayerBTConnectFailedView; musicPlayerBTConnectFailedView = nullptr; } + if (musicPlayerConnectingView != nullptr) + { + PlayersModel::GetInstance()->PlayerMusic_StopTimer(); + delete musicPlayerConnectingView; + musicPlayerConnectingView = nullptr; + } for (int i = MAIN_MUSICPLAYER_VIEW; i < MUSICPLAYERJUMPVIEWID_MAX; i++) { @@ -922,11 +928,15 @@ namespace OHOS } /*刷新播放器界面的组件状态*/ - void PlayersView::UpdatePlayerView(bool musicSourceType, bool phoneMusicConnectStatus) + void PlayersView::UpdatePlayerView(void) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdatePlayerView"); // 1.a2dp未连接,向手机发起a2dp连接 + bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态 + bool a2dp = uapi_a2dp_snk_get_device_connect_state(); // 获取a2dp连接状态 + bool phoneMusicConnectStatus = phonebluetoothcon && a2dp; + bool musicSourceType = PlayersModel::GetInstance()->GetMusicSource(); // 2. ImageInfo *image; if (musicSourceType) @@ -989,9 +999,7 @@ namespace OHOS return false; } /* -------------------------------------------------------------------------- */ - bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态 - bool a2dp = uapi_a2dp_snk_get_device_connect_state(); // 获取a2dp连接状态 - UpdatePlayerView(PlayersModel::GetInstance()->GetMusicSource(), phonebluetoothcon && a2dp); + UpdatePlayerView(); /* -------------------------------------------------------------------------- */ PlayersListGroup::GetInstance()->SetUpListCase(); @@ -1238,6 +1246,7 @@ namespace OHOS {PlayersView::MUSIC_DELETE_VIEW, &PlayersView::ChangeToMusicDeleteView}, {PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW, &PlayersView::ChangeToMusicBluetoothDisConnectView}, {PlayersView::MUSIC_BT_CONNECTFAILED_VIEW, &PlayersView::ChangeToMusicBluetoothConnectFailedView}, + {PlayersView::MUISC_CONNECTING, &PlayersView::ChangeToMusicConnectingView}, }; /*根据传入的 interface 值,在 ViewMapper 数组中查找匹配的 viewId*/ @@ -1278,10 +1287,37 @@ namespace OHOS return true; } + static const short PlayerDestroyMapper[] = { + PlayersView::MUISC_CONNECTING, + }; + /*删除临时视图*/ void PlayersView::DestroyTempView(int16_t hideView) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "PlayersView::DestroyTempView"); + int viewSize = sizeof(PlayerDestroyMapper) / sizeof(PlayerDestroyMapper[0]); + for (int i = 0; i < viewSize; i++) + { + if (hideView == PlayerDestroyMapper[i]) + { + Remove(group[hideView]); + group[hideView] = nullptr; + break; + } + } + switch (hideView) + { + case PlayersView::MUISC_CONNECTING: + PlayersModel::GetInstance()->PlayerMusic_StopTimer(); + if (musicPlayerConnectingView) + { + delete musicPlayerConnectingView; + musicPlayerConnectingView = nullptr; + } + break; + default: + break; + } } /*视图切换*/ @@ -1313,6 +1349,7 @@ namespace OHOS { Add(group[thisView]); } + UpdatePlayerView(); return true; } @@ -1372,7 +1409,7 @@ namespace OHOS group[thisView] = groupview; Add(group[thisView]); } - UpdateMusicListStatus();/*每次切换到音乐列表都将更新一次列表*/ + UpdateMusicListStatus(); /*每次切换到音乐列表都将更新一次列表*/ return true; } @@ -1448,27 +1485,28 @@ namespace OHOS return true; } - /*切换到蓝牙未连接视图*/ + /*切换到连接动画视图*/ bool PlayersView::ChangeToMusicConnectingView(int16_t thisView) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::ChangeToMusicBluetoothConnectFailedView"); - // if (group[thisView] == nullptr) - // { - // musicPlayerBTConnectFailedView = new MusicPlayerBTConnectFailedView(); - // if (musicPlayerBTConnectFailedView == nullptr) - // { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new playerListDelSongView fail"); - // return false; - // } - // UIViewGroup *groupview = musicPlayerBTConnectFailedView->CreateMusicPlayerBTConnectFailedView(); - // if (groupview == nullptr) - // { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group[%d] fail", thisView); - // return false; - // } - // group[thisView] = groupview; - // Add(group[thisView]); - // } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::ChangeToMusicConnectingView"); + if (group[thisView] == nullptr) + { + musicPlayerConnectingView = new AiVoiceConnectingView(); + if (musicPlayerConnectingView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new playerListDelSongView fail"); + return false; + } + UIViewGroup *groupview = musicPlayerConnectingView->CreateAiVoiceConnectingView(1); + if (groupview == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new group[%d] fail", thisView); + return false; + } + group[thisView] = groupview; + Add(group[thisView]); + } + PlayersModel::GetInstance()->PlayerMusic_StartTimer(); return true; } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp index f8fc69b0c..2dfd7d38d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp @@ -2,13 +2,14 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-02-18 09:09:13 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-07-22 10:51:12 + * @LastEditTime: 2024-08-20 17:42:37 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/settings/src/SettingModel.cpp */ #include "settings/include/SettingModel.h" #include "main/include/PullUpDownView.h" #include "ui_resource_string.h" #include "classicbluetooth/include/BluetoothServiceOptionsView.h" +#include "player/include/PlayersView.h" namespace OHOS { SettingModel::SettingModel() {} @@ -99,5 +100,9 @@ namespace OHOS { BluetoothServiceOptionsView::GetInstance()->Button_UPdata(); } + if(PlayersView::GetInstance()) + { + PlayersView::GetInstance()->UpdatePlayerView(); + } } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h index f866b60ae..dc906baa6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-04-04 15:13:51 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-06-07 17:07:38 + * @LastEditTime: 2024-08-20 11:25:11 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/stopwatch/include/MainStopWatchPresenter.h */ #ifndef MAIN_STOPWATCH_PRESENTER_H @@ -12,6 +12,7 @@ #include "View.h" #include "MainStopWatchView.h" #include +#include "ui_resource_string.h" /*秒表主视图*/ namespace OHOS { diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp index d9284b70f..4c32e7d27 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchPresenter.cpp @@ -272,7 +272,7 @@ namespace OHOS { StopWatchModel::GetInstance()->StopWatch_PauseTimer(); // 暂停定时器 m_button->SetViewId(ResetOrMarkButton_RESET2_VIEWID); - m_button->SetImageSrc(ResetOrMarkButtonImg_Reset2, nullptr); + m_button->SetImageSrc(ResetOrMarkButtonImg_Reset2, ResetOrMarkButtonImg_Reset2); m_button->Invalidate(); } return true; diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp index 165ae0266..cfac70da8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/MainStopWatchView.cpp @@ -30,78 +30,83 @@ namespace OHOS void MainStopWatchView::ClearAll() { - group->RemoveAll(); - scrollView[MAIN_STOPWATCH]->RemoveAll(); - - if (stopWatchlabel != nullptr) + if (group != nullptr) { - delete stopWatchlabel; - stopWatchlabel = nullptr; - } + group->RemoveAll(); + scrollView[MAIN_STOPWATCH]->RemoveAll(); - if (showTimelabel != nullptr) - { - delete showTimelabel; - showTimelabel = nullptr; - } + if (stopWatchlabel != nullptr) + { + delete stopWatchlabel; + stopWatchlabel = nullptr; + } - if (PlayOrPausecheckBox != nullptr) - { - delete PlayOrPausecheckBox; - PlayOrPausecheckBox = nullptr; - } + if (showTimelabel != nullptr) + { + delete showTimelabel; + showTimelabel = nullptr; + } - if (ResetOrMarkbutton != nullptr) - { - delete ResetOrMarkbutton; - ResetOrMarkbutton = nullptr; - } + if (PlayOrPausecheckBox != nullptr) + { + delete PlayOrPausecheckBox; + PlayOrPausecheckBox = nullptr; + } - if (LineImage != nullptr) - { - delete LineImage; - LineImage = nullptr; - } + if (ResetOrMarkbutton != nullptr) + { + delete ResetOrMarkbutton; + ResetOrMarkbutton = nullptr; + } - if (list != nullptr) - { - delete list; - list = nullptr; - } + if (LineImage != nullptr) + { + delete LineImage; + LineImage = nullptr; + } - if (listadapter != nullptr) - { - delete listadapter; - listadapter = nullptr; - } + if (list != nullptr) + { + delete list; + list = nullptr; + } - if (listdata != nullptr) - { - listdata->Clear(); - delete listdata; - listdata = nullptr; - } + if (listadapter != nullptr) + { + delete listadapter; + listadapter = nullptr; + } - if (scrollView[MAIN_STOPWATCH] != nullptr) - { - delete scrollView[MAIN_STOPWATCH]; - scrollView[MAIN_STOPWATCH] = nullptr; - } + if (listdata != nullptr) + { + listdata->Clear(); + delete listdata; + listdata = nullptr; + } - if (p_StopWatchRecordCycleToLimitView != nullptr) - { - delete p_StopWatchRecordCycleToLimitView; - p_StopWatchRecordCycleToLimitView = nullptr; - } + if (scrollView[MAIN_STOPWATCH] != nullptr) + { + delete scrollView[MAIN_STOPWATCH]; + scrollView[MAIN_STOPWATCH] = nullptr; + } - if (p_StopWatchRecordTimeToLimitView != nullptr) - { - delete p_StopWatchRecordTimeToLimitView; - p_StopWatchRecordTimeToLimitView = nullptr; - } + if (p_StopWatchRecordCycleToLimitView != nullptr) + { + delete p_StopWatchRecordCycleToLimitView; + p_StopWatchRecordCycleToLimitView = nullptr; + } + + if (p_StopWatchRecordTimeToLimitView != nullptr) + { + delete p_StopWatchRecordTimeToLimitView; + p_StopWatchRecordTimeToLimitView = nullptr; + } + + for (int i = MAIN_STOPWATCH; i < STOPWATCH_MAXVIEWID; i++) + { + scrollView[MAIN_STOPWATCH] = nullptr; + } - if (group != nullptr) - { delete group; group = nullptr; } @@ -251,13 +256,13 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stopWatchlabel new fail!!"); return; } - stopWatchlabel->SetPosition(83, 52, 300, 40); + stopWatchlabel->SetPosition(83, 50, 300, 35); stopWatchlabel->SetStyle(STYLE_TEXT_FONT, 30); stopWatchlabel->SetStyle(STYLE_LINE_HEIGHT, 35); - stopWatchlabel->SetText("秒表"); - stopWatchlabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + stopWatchlabel->SetTextId(STR_STOPWATCH); // 秒表 + stopWatchlabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); stopWatchlabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - stopWatchlabel->SetRollSpeed(40); + stopWatchlabel->SetRollSpeed(70); stopWatchlabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); stopWatchlabel->SetVisible(true); /* ------------------------------ showTimelabel ----------------------------- */ @@ -295,6 +300,11 @@ namespace OHOS list->SetPosition(56, 170, 360, 100); list->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000); list->SetReboundSize(30); + list->SetThrowDrag(true); + list->SetIntercept(true); + list->SetMaxScrollDistance(1000); + list->SetDragACCLevel(5); + list->SetSwipeACCLevel(800); /*设置手指抬起屏幕后的补偿距离。*/ list->SetVisible(false); /* ------------------------------- listadapter ------------------------------ */ listadapter = new TextAdapter(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp index 3b64f189e..d7276cf39 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchModel.cpp @@ -82,7 +82,7 @@ namespace OHOS static void StopWatch_TimerCallbackProc(int data) { g_StopWatchTimes += 10; // 每次回调增加10毫秒 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_StopWatchTimes:%d\n", g_StopWatchTimes); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_StopWatchTimes:%d\n", g_StopWatchTimes); if (MainStopWatchView::GetInstance() == nullptr) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp index feca45ee8..276d7f90c 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordCycleToLimitView.cpp @@ -1,6 +1,7 @@ #include "stopwatch/include/StopWatchRecordCycleToLimitView.h" #include "stopwatch/include/MainStopWatchPresenter.h" #include "UiConfig.h" +#include "wearable_log.h" /*弹窗视图:到达最高圈数99时弹出*/ namespace OHOS { @@ -9,19 +10,19 @@ namespace OHOS StopWatchRecordCycleToLimitView::StopWatchRecordCycleToLimitView() { - + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopWatchRecordCycleToLimitView::StopWatchRecordCycleToLimitView"); g_pStopWatchRecordCycleToLimitView = this; } StopWatchRecordCycleToLimitView::~StopWatchRecordCycleToLimitView() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StopWatchRecordCycleToLimitView::~StopWatchRecordCycleToLimitView"); ClearAll(); g_pStopWatchRecordCycleToLimitView = nullptr; } StopWatchRecordCycleToLimitView *StopWatchRecordCycleToLimitView::GetInstance() { - return g_pStopWatchRecordCycleToLimitView; } // 初始化秒表到达最高圈数时弹出的视图 @@ -37,19 +38,29 @@ namespace OHOS if (Title == nullptr) { Title = new UILabelExt(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail"); + return nullptr; + } } - Title->SetPosition(83, 52, 300, 40); + Title->SetPosition(83, 50, 300, 35); Title->SetStyle(STYLE_TEXT_FONT, 30); Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("秒表"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + Title->SetTextId(STR_STOPWATCH); // 秒表 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(40); + Title->SetRollSpeed(70); Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ if (AttentionImage == nullptr) { AttentionImage = new UIImageView(); + if (AttentionImage == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AttentionImage new fail"); + return nullptr; + } } AttentionImage->SetPosition(193, 121, 100, 100); AttentionImage->SetStyle(STYLE_BORDER_RADIUS, 100); @@ -58,29 +69,44 @@ namespace OHOS if (AttentionLabel == nullptr) { AttentionLabel = new UILabelExt(); + if (AttentionLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AttentionLabel new fail"); + return nullptr; + } } - AttentionLabel->SetPosition(83, 253, 300, 40); + AttentionLabel->SetPosition(83, 253, 300, 35); AttentionLabel->SetStyle(STYLE_TEXT_FONT, 30); AttentionLabel->SetStyle(STYLE_LINE_HEIGHT, 35); - AttentionLabel->SetText("当前已达到了最高圈数"); - AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + AttentionLabel->SetTextId(STR_TMCHBR); // 当前已达到了最高计数 + AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); AttentionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); AttentionLabel->SetTextColor(Color::GetColorFromRGBA(0xaa, 0xaa, 0xaa, 0xff)); - AttentionLabel->SetRollSpeed(40); + AttentionLabel->SetRollSpeed(70); AttentionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ if (button == nullptr) { button = new UILabelButtonExt(); + if (button == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button new fail"); + return nullptr; + } } button->SetPosition(0, 366, 466, 100); button->SetViewId(CycleToLimitReturnButton_VIEWID); button->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE); - button->SetText("知道了"); + button->SetTextId(STR_KONW); button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); button->SetStyle(STYLE_LINE_HEIGHT, 35); button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); UIView::OnClickListener *buttonClick = static_cast(MainStopWatchPresenter::GetInstance()); + if (buttonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonClick new fail"); + return nullptr; + } button->SetOnClickListener(buttonClick); /* ----------------------------------- Add ---------------------------------- */ scrollView->Add(Title); @@ -93,30 +119,29 @@ namespace OHOS void StopWatchRecordCycleToLimitView::ClearAll() { - scrollView->RemoveAll(); - - if (Title != nullptr) - { - delete Title; - Title = nullptr; - } - if (AttentionImage != nullptr) - { - delete AttentionImage; - AttentionImage = nullptr; - } - if (AttentionLabel != nullptr) - { - delete AttentionLabel; - AttentionLabel = nullptr; - } - if (button != nullptr) - { - delete button; - button = nullptr; - } if (scrollView != nullptr) { + scrollView->RemoveAll(); + if (Title != nullptr) + { + delete Title; + Title = nullptr; + } + if (AttentionImage != nullptr) + { + delete AttentionImage; + AttentionImage = nullptr; + } + if (AttentionLabel != nullptr) + { + delete AttentionLabel; + AttentionLabel = nullptr; + } + if (button != nullptr) + { + delete button; + button = nullptr; + } delete scrollView; scrollView = nullptr; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp index 241bd2cbb..8df7a038a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/stopwatch/src/StopWatchRecordTimeToLimitView.cpp @@ -1,7 +1,7 @@ #include "stopwatch/include/StopWatchRecordTimeToLimitView.h" #include "stopwatch/include/MainStopWatchPresenter.h" #include "UiConfig.h" - +#include "wearable_log.h" /*弹窗视图:到达最高时间99:59.99时弹出*/ namespace OHOS { @@ -10,11 +10,13 @@ namespace OHOS StopWatchRecordTimeToLimitView::StopWatchRecordTimeToLimitView() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopWatchRecordTimeToLimitView::StopWatchRecordTimeToLimitView"); g_pStopWatchRecordTimeToLimitView = this; } StopWatchRecordTimeToLimitView::~StopWatchRecordTimeToLimitView() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopWatchRecordTimeToLimitView::~StopWatchRecordTimeToLimitView"); ClearAll(); g_pStopWatchRecordTimeToLimitView = nullptr; } @@ -36,19 +38,29 @@ namespace OHOS if (Title == nullptr) { Title = new UILabelExt(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail"); + return nullptr; + } } - Title->SetPosition(83, 52, 300, 40); + Title->SetPosition(83, 50, 300, 35); Title->SetStyle(STYLE_TEXT_FONT, 30); Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("秒表"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + Title->SetTextId(STR_STOPWATCH); // 秒表 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(40); + Title->SetRollSpeed(70); Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ if (AttentionImage == nullptr) { AttentionImage = new UIImageView(); + if (AttentionImage == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AttentionImage new fail"); + return nullptr; + } } AttentionImage->SetPosition(193, 121, 100, 100); AttentionImage->SetStyle(STYLE_BORDER_RADIUS, 100); @@ -57,43 +69,63 @@ namespace OHOS if (AttentionLabel_1 == nullptr) { AttentionLabel_1 = new UILabelExt(); + if (AttentionLabel_1 == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AttentionLabel_1 new fail"); + return nullptr; + } } - AttentionLabel_1->SetPosition(83, 235, 300, 40); + AttentionLabel_1->SetPosition(83, 235, 300, 35); AttentionLabel_1->SetStyle(STYLE_TEXT_FONT, 30); AttentionLabel_1->SetStyle(STYLE_LINE_HEIGHT, 35); - AttentionLabel_1->SetText("当前已达到了最长时间"); - AttentionLabel_1->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + AttentionLabel_1->SetTextId(STR_MAXIMUM_TIME_REACH_NOTE); // 当前已达到了最长时间 + AttentionLabel_1->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); AttentionLabel_1->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); AttentionLabel_1->SetTextColor(Color::GetColorFromRGBA(0xaa, 0xaa, 0xaa, 0xff)); - AttentionLabel_1->SetRollSpeed(40); + AttentionLabel_1->SetRollSpeed(70); AttentionLabel_1->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* ---------------------------- AttentionLabel_2 ---------------------------- */ if (AttentionLabel_2 == nullptr) { AttentionLabel_2 = new UILabelExt(); + if (AttentionLabel_2 == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AttentionLabel_2 new fail"); + return nullptr; + } } - AttentionLabel_2->SetPosition(33, 279, 400, 40); + AttentionLabel_2->SetPosition(53, 279, 360, 35); AttentionLabel_2->SetStyle(STYLE_TEXT_FONT, 30); AttentionLabel_2->SetStyle(STYLE_LINE_HEIGHT, 35); - AttentionLabel_2->SetText("表秒自动暂停,请重新开始"); - AttentionLabel_2->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); + AttentionLabel_2->SetTextId(STR_STOPWATCH_STOP_NOTE); // 秒表自动暂停,请重新开始 + AttentionLabel_2->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); AttentionLabel_2->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); AttentionLabel_2->SetTextColor(Color::GetColorFromRGBA(0xaa, 0xaa, 0xaa, 0xff)); - AttentionLabel_2->SetRollSpeed(40); + AttentionLabel_2->SetRollSpeed(70); AttentionLabel_2->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); /* -------------------------------------------------------------------------- */ if (button == nullptr) { button = new UILabelButtonExt(); + if (button == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button new fail"); + return nullptr; + } } button->SetPosition(0, 366, 466, 100); button->SetViewId(TimeToLimitReturnButton_VIEWID); button->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE); - button->SetText("知道了"); + button->SetTextId(STR_KONW); button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); button->SetStyle(STYLE_LINE_HEIGHT, 35); button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); UIView::OnClickListener *buttonClick = static_cast(MainStopWatchPresenter::GetInstance()); + if (buttonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonClick new fail"); + return nullptr; + } button->SetOnClickListener(buttonClick); /* ----------------------------------- Add ---------------------------------- */ scrollView->Add(Title); @@ -107,29 +139,30 @@ namespace OHOS void StopWatchRecordTimeToLimitView::ClearAll() { - scrollView->RemoveAll(); - if (Title != nullptr) - { - delete Title; - Title = nullptr; - } - if (AttentionImage != nullptr) - { - delete AttentionImage; - AttentionImage = nullptr; - } - if (AttentionLabel_1 != nullptr) - { - delete AttentionLabel_1; - AttentionLabel_1 = nullptr; - } - if (button != nullptr) - { - delete button; - button = nullptr; - } if (scrollView != nullptr) { + scrollView->RemoveAll(); + if (Title != nullptr) + { + delete Title; + Title = nullptr; + } + if (AttentionImage != nullptr) + { + delete AttentionImage; + AttentionImage = nullptr; + } + if (AttentionLabel_1 != nullptr) + { + delete AttentionLabel_1; + AttentionLabel_1 = nullptr; + } + if (button != nullptr) + { + delete button; + button = nullptr; + } + delete scrollView; scrollView = nullptr; } diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index ff5de3a97..fc65cf674 100644 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -1139,11 +1139,6 @@ void MsgCenterNotifyArAlertProc(const Topic topic, Request* req) { return; } - const power_display_svr_api_t *display_api = power_display_svr_get_api(); - if (display_api->get_screen_state() != SCREEN_ON) - { - display_api->turn_on_screen(); - } MotionRecognitionViewEventListener::GetInstance().SetMotionTypeId(*motionType); NotificationManager::GetInstance()->ShowNotify(showMotionRecognitionNotify, (uint16_t)topic, true); } diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/motion_recognition_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/motion_recognition_notification.cpp index 2dbd7a4fd..c4c9770a0 100644 --- a/code/sdk/application/wearable/service/msg_center/src/notify/motion_recognition_notification.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/notify/motion_recognition_notification.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-08-17 16:44:20 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-08-19 11:25:09 + * @LastEditTime: 2024-08-20 11:01:16 * @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/src/notify/motion_recognition_notification.cpp */ #include "notification_manager.h" @@ -19,7 +19,8 @@ #include #include "ConfigModel.h" #include "traing/include/TraingModel.h" - +#include "ui_service.h" +#include "vibrator_service.h" namespace OHOS { @@ -292,7 +293,7 @@ namespace OHOS MotionRecognitionStartButton = new UIButton(); } MotionRecognitionStartButton->SetPosition(238, MotionRecognitionNoteLabel->GetY() + MotionRecognitionNoteLabel->GetHeight() + 40, 170, 90); - MotionRecognitionStartButton->SetViewId(MOTION_RECOGNITION_IGNORE_BUTTONVIEWID); + MotionRecognitionStartButton->SetViewId(MOTION_RECOGNITION_START_BUTTONVIEWID); MotionRecognitionStartButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff4fc34c); MotionRecognitionStartButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff383838, UIButton::PRESSED); MotionRecognitionStartButton->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED); @@ -330,6 +331,10 @@ namespace OHOS MotionRecognitionScrollView->Add(MotionRecognitionIgnoreLabel); MotionRecognitionGroupView->Add(MotionRecognitionScrollView); } + /* -------------------------------------------------------------------------- */ + ScreenTurnOn(10*1000);//显示时长10s + ui_api_vibrate_once_func(); + /* -------------------------------------------------------------------------- */ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeMotionRecognitionView); return MotionRecognitionGroupView; } diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang index 0f091fb31a84ecd20a10173c9157e4fb36c7016d..a7601977fe5261b336328d0c8a02b18ae177e601 100644 GIT binary patch delta 337 zcmZXOy-EZz6oqfOm0+>fS9H29Tt(Qz%Jl*KYs5mX$(00Wl3{YgY9Y4vinWc6l_KaH zSXzpWZ{S0CXQojMe5VM>ch2j<`{D3y^0CVS{+xxUVKG>}SO&OKZj?LaUU^U+l^5kp z`Bvr%fDPrSc%BSCm*zLi%o3wGbWAp}TrZApFQ+jF!L2w8FwIF~h2krQo$SpiCZR@P zT=@X&ZH!miTOz qSwAru#}@V^)-w|0v_94eDeEc{Z>TKKM_Bj04fo@I3%ddTh42G&+-qk5 delta 57 zcmX>Xy**O2wJXRuHID%WaBdV;<=C9ZaZOn;BQ-IlIJHEZa4ksmmr~A$stg7cAhuCdmBWZ%fq_91h&6%O42bQ3*bRvNfj9z)OMtiqh+Bbp z6%e0P*lfYkC(k{3?(@!>FB&#Ko3m^3MfHmMrwx-{tXueO`Zk6a?W>-yoAqR8Cy?`U z`WA+#`&YkgnE!N7!_(#642DlT+FnkY&tM9r4Go|SV;JMb`t46!J6^2Y_k8cVr%U(3 z%>^3;v*h{i$bTU9RqGn}WRR#kJ;M^#x%CR|*qeq^*Ve_*&yIxG5`@D1JWLAv|0Cx@$w*UYD diff --git a/tools/language_tool/Language_xml/input_list_en.txt b/tools/language_tool/Language_xml/input_list_en.txt index 86267f05c..677da9ead 100644 --- a/tools/language_tool/Language_xml/input_list_en.txt +++ b/tools/language_tool/Language_xml/input_list_en.txt @@ -510,7 +510,7 @@ STR_4G_NOTE$Note: After opening, the power consumption of the watch will be incr STR_MUSIC_PLAYER_SOURCE_NOTE$Please enter Music - Music Source from the watch app interface, set it to Mobile Mode and try again STR_MUSIC_LIST_IS_EMPTY$The current music list is empty, please download and add via APP STR_BT_HEADSET_RESCAN$Rescan -STR_BT_HEADSET_NOFOND$No headset Bluetooth device can be found +STR_BT_HEADSET_NOFOND$No Bluetooth headset device can be found STR_SCHEDULE$Schedule STR_SCHEDULE_TITLE$Schedule management STR_SCHEDULE_NO_DATA$No schedules @@ -518,4 +518,16 @@ STR_SCHEDULE_NO_DATA_PROMPT$Please sync with the APP STR_NO_PAIRED_DEV$No paired devices are available STR_IGNORE$Ignore STR_START$Start -STR_ARC_SCALE_LIST_DISPLAY$Arc list display \ No newline at end of file +STR_ARC_SCALE_LIST_DISPLAY$Arc list display +STR_COUNT_DOWN$Count Down +STR_CUSTOM_TIME$Custom time +STR_QUICK_START$Quick start +STR_1_MIN$1min +STR_5_MIN$5min +STR_10_MIN$10min +STR_30_MIN$30min +STR_SET_COUNT_DOWN_NOTE$Please set up the countdown room first +STR_COUNTDOWN_ENDS$Countdown ends +STR_MAXIMUM_TIME_REACH$The maximum time has been reached +STR_STOPWATCH_STOP_NOTE$Stopwatch stops automatically, please restart +STR_TMCHBR$The maximum count has been reached \ No newline at end of file diff --git a/tools/language_tool/Language_xml/input_list_zh.txt b/tools/language_tool/Language_xml/input_list_zh.txt index 8b688eb3a..6900f9dbd 100644 --- a/tools/language_tool/Language_xml/input_list_zh.txt +++ b/tools/language_tool/Language_xml/input_list_zh.txt @@ -510,7 +510,7 @@ STR_4G_NOTE$注:开启后,手表功耗会提高,待机时间会缩短 STR_MUSIC_PLAYER_SOURCE_NOTE$请从手表端应用界面进入“音乐”-“音乐来源”,设置为“手机模式”后重试 STR_MUSIC_LIST_IS_EMPTY$当前音乐列表为空请通过APP下载添加 STR_BT_HEADSET_RESCAN$重新搜索 -STR_BT_HEADSET_NOFOND$当前搜索不到耳机蓝牙设备 +STR_BT_HEADSET_NOFOND$当前搜索不到蓝牙耳机设备 STR_SCHEDULE$日程 STR_SCHEDULE_TITLE$日程管理 STR_SCHEDULE_NO_DATA$当前无日程 @@ -518,4 +518,16 @@ STR_SCHEDULE_NO_DATA_PROMPT$请先通过APP同步 STR_NO_PAIRED_DEV$暂无已配对设备 STR_IGNORE$忽略 STR_START$开始 -STR_ARC_SCALE_LIST_DISPLAY$弧形列表显示 \ No newline at end of file +STR_ARC_SCALE_LIST_DISPLAY$弧形列表显示 +STR_COUNT_DOWN$倒计时 +STR_CUSTOM_TIME$自定义时间 +STR_QUICK_START$快速开始 +STR_1_MIN$1分钟 +STR_5_MIN$5分钟 +STR_10_MIN$10分钟 +STR_30_MIN$30分钟 +STR_SET_COUNT_DOWN_NOTE$请先设置好倒计时间 +STR_COUNTDOWN_ENDS$倒计时结束 +STR_MAXIMUM_TIME_REACH_NOTE$当前已达到了最长时间 +STR_STOPWATCH_STOP_NOTE$秒表自动暂停,请重新开始 +STR_TMCHBR$当前已达到了最高计数 \ No newline at end of file diff --git a/tools/language_tool/Language_xml/language.xlsx b/tools/language_tool/Language_xml/language.xlsx index 9dab50fa261ad9509bbcd0cc3c6c6b6320978792..924ee89cd72e079d687e38650ec01eac9a7419c4 100644 GIT binary patch delta 26202 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 L(wy^Q{|^2O>$OMX delta 25727 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 diff --git a/tools/language_tool/Language_xml/language_en.xml b/tools/language_tool/Language_xml/language_en.xml index 306a5e106..7d04ae171 100644 --- a/tools/language_tool/Language_xml/language_en.xml +++ b/tools/language_tool/Language_xml/language_en.xml @@ -511,7 +511,7 @@ - + @@ -520,4 +520,16 @@ + + + + + + + + + + + + diff --git a/tools/language_tool/Language_xml/language_zh.xml b/tools/language_tool/Language_xml/language_zh.xml index 8470de53d..5533e5cdc 100644 --- a/tools/language_tool/Language_xml/language_zh.xml +++ b/tools/language_tool/Language_xml/language_zh.xml @@ -511,7 +511,7 @@ - + @@ -520,4 +520,16 @@ + + + + + + + + + + + + diff --git a/tools/language_tool/font/en.lang b/tools/language_tool/font/en.lang index 0f091fb31a84ecd20a10173c9157e4fb36c7016d..a7601977fe5261b336328d0c8a02b18ae177e601 100644 GIT binary patch delta 337 zcmZXOy-EZz6oqfOm0+>fS9H29Tt(Qz%Jl*KYs5mX$(00Wl3{YgY9Y4vinWc6l_KaH zSXzpWZ{S0CXQojMe5VM>ch2j<`{D3y^0CVS{+xxUVKG>}SO&OKZj?LaUU^U+l^5kp z`Bvr%fDPrSc%BSCm*zLi%o3wGbWAp}TrZApFQ+jF!L2w8FwIF~h2krQo$SpiCZR@P zT=@X&ZH!miTOz qSwAru#}@V^)-w|0v_94eDeEc{Z>TKKM_Bj04fo@I3%ddTh42G&+-qk5 delta 57 zcmX>Xy**O2wJXRuHID%WaBdV;<=C9ZaZOn;BQ-IlIJHEZa4ksmmr~A$stg7cAhuCdmBWZ%fq_91h&6%O42bQ3*bRvNfj9z)OMtiqh+Bbp z6%e0P*lfYkC(k{3?(@!>FB&#Ko3m^3MfHmMrwx-{tXueO`Zk6a?W>-yoAqR8Cy?`U z`WA+#`&YkgnE!N7!_(#642DlT+FnkY&tM9r4Go|SV;JMb`t46!J6^2Y_k8cVr%U(3 z%>^3;v*h{i$bTU9RqGn}WRR#kJ;M^#x%CR|*qeq^*Ve_*&yIxG5`@D1JWLAv|0Cx@$w*UYD -- 2.17.1