/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved. * * Description: * * Author: huangshuyi * * Create: 2024-4 *--------------------------------------------------------------------------*/ #include "TjdUiAppMainPageShortCut.h" #include "TjdUiAppAlipayModel.h" #include "TjdUiAppLockScreenPresenter.h" #include "TjdUiAppMainPresenter.h" #include "TjdUiAppMainView.h" #include "TjdUiAppSettingNormalListModel.h" #include "TjdUiAppSettingView.h" #include "TjdUiEditShortcutPresenter.h" #include "TjdUiImageIds.h" #include "TjdUiMemManage.h" #include "TjdUiMultiLanguageExt.h" #include "TjdUiScreenEvent.h" #include "TjdUiScreenManage.h" #include "ble_api.h" #include "common/image_cache_manager.h" #include "rtc_api.h" #include "service_charger.h" #include "sql_fit.h" #include "sql_setting.h" #include "sys_config.h" #include "ui_screennotify.h" #include using namespace OHOS; namespace TJD { #define ENABLE_PRINT_INFO 1 #if ENABLE_PRINT_INFO #define static_print_info(...) sys_ui_log_i(__VA_ARGS__) //一般信息打印宏控制 #define static_print_warn(...) sys_ui_log_w(__VA_ARGS__) //警告信息打印一般常开 #define static_print_error(...) sys_ui_log_e(__VA_ARGS__) //错误信息打印一般常开 #define static_print_debug(...) sys_ui_log_d(__VA_ARGS__) #else #define static_print_info(...) #define static_print_warn(...) #define static_print_error(...) #define static_print_debug(...) #endif #define IMAGE_BIN_PATH TJD_IMAGE_PATH "img_main_shortcut.bin" #define BATTERY_IMAGE_BIN_PATH TJD_IMAGE_PATH "img_battery.bin" static TjdUiAppMainPageShortcut *g_pMainShortcutPage = nullptr; static const char *week_ch[] = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; static const char *week_en[] = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}; static uint8_t screenSetFlag = 0; // 0 disable 1 enable // #define SHORTCUT_EDIT_INDEX 0 // #define SHORTCUT_BUSINESS_CARD_INDEX 1 // #define SHORTCUT_LOCK_SCREEN_INDEX 2 // #define SHORTCUT_ALIPAY_INDEX 3 // #define SHORTCUT_NOT_DISTURB_INDEX 4 // #define SHORTCUT_POWER_SAVE_INDEX 5 // #define SHORTCUT_CARD_PACKET_INDEX 6 // #define SHORTCUT_FIND_PHONE_INDEX 7 // #define SHORTCUT_SCREEN_SET_INDEX 8 // #define SHORTCUT_WATER_INDEX 9 // #define SHORTCUT_MENU_STYLE_INDEX 10 // #define SHORTCUT_CLOCK_INDEX 11 // #define SHORTCUT_SYSTEM_SET_INDEX 12 // #define SHORTCUT_BLUETOOTH_INDEX 13 // #define SHORTCUT_BRIGHTNESS_SET_INDEX 14 // #define SHORTCUT_FLASHLIGHT_INDEX 15 std::list TjdUiAppMainPageShortcut::shortcutList = { TjdUiAppMainPageShortcut::SHORTCUT_BRIGHT_SCREEN_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_BUSINESS_CARD_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_ALIPAY_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_CARD_PACKET_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_FIND_PHONE_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_SCREEN_SET_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_WATER_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_MENU_STYLE_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_CLOCK_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_SYSTEM_SET_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_BLUETOOTH_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_BRIGHTNESS_SET_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_FLASHLIGHT_INDEX, }; std::list TjdUiAppMainPageShortcut::shortcutAddList_ = { TjdUiAppMainPageShortcut::SHORTCUT_LOCK_SCREEN_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_NOT_DISTURB_INDEX, TjdUiAppMainPageShortcut::SHORTCUT_POWER_SAVE_INDEX, }; ShortcutView TjdUiAppMainPageShortcut::currentViewIndex_ = SHORTCUT_NORMAL; TjdUiAppMainPageShortcut::ShortcutItem TjdUiAppMainPageShortcut::shortcutItems[] = { {STR_ID_494, TjdUiAppMainPageShortcut::SHORTCUT_BRIGHT_SCREEN_INDEX, IMG_MAIN_SHORTCUT_BRIGHT_SCREEN_OPEN, IMG_MAIN_SHORTCUT_BRIGHT_SCREEN_CLOSE}, //抬腕亮屏 {STR_ID_22, TjdUiAppMainPageShortcut::SHORTCUT_BUSINESS_CARD_INDEX, IMG_MAIN_SHORTCUT_BUSSINE_CARD_CLOSE, IMG_MAIN_SHORTCUT_BUSSINE_CARD_CLOSE}, //名片 {STR_ID_588, TjdUiAppMainPageShortcut::SHORTCUT_LOCK_SCREEN_INDEX, IMG_MAIN_SHORTCUT_LOCK_SCREEN_CLOSE, IMG_MAIN_SHORTCUT_LOCK_SCREEN_CLOSE}, //锁屏 {STR_ID_32, TjdUiAppMainPageShortcut::SHORTCUT_ALIPAY_INDEX, IMG_MAIN_SHORTCUT_ALIPAY_CLOSE, IMG_MAIN_SHORTCUT_ALIPAY_CLOSE}, //支付宝 {STR_ID_420, TjdUiAppMainPageShortcut::SHORTCUT_NOT_DISTURB_INDEX, IMG_MAIN_SHORTCUT_NOT_DISTURB_OPEN, IMG_MAIN_SHORTCUT_NOT_DISTURB_CLOSE}, //勿扰模式 {STR_ID_421, TjdUiAppMainPageShortcut::SHORTCUT_POWER_SAVE_INDEX, IMG_MAIN_SHORTCUT_POWER_SAVE_CLOSE, IMG_MAIN_SHORTCUT_POWER_SAVE_CLOSE}, //省电模式 {STR_ID_23, TjdUiAppMainPageShortcut::SHORTCUT_CARD_PACKET_INDEX, IMG_MAIN_SHORTCUT_CARD_PACKET_CLOSE, IMG_MAIN_SHORTCUT_CARD_PACKET_CLOSE}, //卡包 {STR_ID_587, TjdUiAppMainPageShortcut::SHORTCUT_FIND_PHONE_INDEX, IMG_MAIN_SHORTCUT_FIND_PHONE_CLOSE, IMG_MAIN_SHORTCUT_FIND_PHONE_CLOSE}, //查找手机 {STR_ID_586, TjdUiAppMainPageShortcut::SHORTCUT_SCREEN_SET_INDEX, IMG_MAIN_SHORTCUT_SCREEN_SET_OPEN, IMG_MAIN_SHORTCUT_SCREEN_SET_CLOSE}, //常亮设置 {STR_ID_585, TjdUiAppMainPageShortcut::SHORTCUT_WATER_INDEX, IMG_MAIN_SHORTCUT_WATER_CLOSE, IMG_MAIN_SHORTCUT_WATER_CLOSE}, //排水 {STR_ID_584, TjdUiAppMainPageShortcut::SHORTCUT_MENU_STYLE_INDEX, IMG_MAIN_SHORTCUT_MENU_STYLE_CLOSE, IMG_MAIN_SHORTCUT_MENU_STYLE_CLOSE}, //菜单风格 {STR_ID_491, TjdUiAppMainPageShortcut::SHORTCUT_CLOCK_INDEX, IMG_MAIN_SHORTCUT_CLOCK_OPEN, IMG_MAIN_SHORTCUT_CLOCK_CLOSE}, //床头钟 {STR_ID_28, TjdUiAppMainPageShortcut::SHORTCUT_SYSTEM_SET_INDEX, IMG_MAIN_SHORTCUT_SYSTEM_SET_CLOSE, IMG_MAIN_SHORTCUT_SYSTEM_SET_CLOSE}, //系统设置 {STR_ID_416, TjdUiAppMainPageShortcut::SHORTCUT_BLUETOOTH_INDEX, IMG_MAIN_SHORTCUT_BT_OPEN_NOT_CONNECT, IMG_MAIN_SHORTCUT_BT_CLOSE}, //蓝牙 {STR_ID_486, TjdUiAppMainPageShortcut::SHORTCUT_BRIGHTNESS_SET_INDEX, IMG_MAIN_SHORTCUT_BRIGHTNESS_SET_CLOSE, IMG_MAIN_SHORTCUT_BRIGHTNESS_SET_CLOSE}, //亮度 {STR_ID_583, TjdUiAppMainPageShortcut::SHORTCUT_FLASHLIGHT_INDEX, IMG_MAIN_SHORTCUT_FLASHLIGHT_CLOSE, IMG_MAIN_SHORTCUT_FLASHLIGHT_CLOSE}, //闪光灯 {STR_ID_69, TjdUiAppMainPageShortcut::SHORTCUT_EDIT_INDEX, IMG_MAIN_SHORTCUT_EDIT_BG, IMG_MAIN_SHORTCUT_EDIT_BG}, //编辑 }; TjdUiAppMainPageShortcut::TjdUiAppMainPageShortcut() { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); g_pMainShortcutPage = this; } TjdUiAppMainPageShortcut::~TjdUiAppMainPageShortcut() { UnLoad(); g_pMainShortcutPage = nullptr; } TjdUiAppMainPageShortcut *TjdUiAppMainPageShortcut::GetInstance(void) { return g_pMainShortcutPage; } std::list &TjdUiAppMainPageShortcut::GetShortcutList(void) { return shortcutList; } TjdUiAppMainPageShortcut::ShortcutItem *TjdUiAppMainPageShortcut::GetShortcutItems(void) { return shortcutItems; } uint8_t TjdUiAppMainPageShortcut::GetShortcutItemsCnt(void) { return sizeof(shortcutItems) / sizeof(shortcutItems[0]); } static void GraphicTimerCallback(void *param) { GraphicService::GetInstance()->PostGraphicEvent([] { if (g_pMainShortcutPage) { if (g_pMainShortcutPage->screenTipViewGroup_) { OHOS::RootView::GetInstance()->RemoveSystemView(g_pMainShortcutPage->screenTipViewGroup_); TjdUiMemManage::DeleteChildren(g_pMainShortcutPage->screenTipViewGroup_); } g_pMainShortcutPage->screenTipViewGroup_ = nullptr; } }); } void TjdUiAppMainPageShortcut::DisplayScreenTips(uint8_t status, uint8_t min) { if (screenTipViewGroup_) { OHOS::RootView::GetInstance()->RemoveSystemView(screenTipViewGroup_); TjdUiMemManage::DeleteChildren(screenTipViewGroup_); screenTipViewGroup_ = nullptr; } screenTipViewGroup_ = new UIViewGroup(); OHOS::RootView::GetInstance()->AddSystemView(screenTipViewGroup_); screenTipViewGroup_->SetStyle(STYLE_BORDER_RADIUS, 55); screenTipViewGroup_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff646464); screenTipViewGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE * 0.9); screenTipViewGroup_->SetWidth(320); screenTipViewGroup_->SetHeight(110); screenTipViewGroup_->LayoutCenterOfParent(0, 0); UILabelExt *labelNotify = new UILabelExt(); screenTipViewGroup_->Add(labelNotify); labelNotify->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_34); labelNotify->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); char text[60]; if (status == 0) { labelNotify->SetText("常亮已关闭"); } else { std::string text = "屏幕将常亮" + std::to_string(min) + "分钟"; labelNotify->SetText(text.c_str()); // 使用格式化后的字符串 } labelNotify->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); labelNotify->LayoutCenterOfParent(); if (timerToReturn_ == nullptr) { timerToReturn_ = new OHOS::GraphicTimer(2000, GraphicTimerCallback, nullptr, false); timerToReturn_->Start(); } else { timerToReturn_->Start(); } } void TjdUiAppMainPageShortcut::PreLoad(void) { static_print_debug("TjdUiAppMainPageShortcut::PreLoad"); if (!viewiInitStatus) { InitView(); viewiInitStatus = true; } } void TjdUiAppMainPageShortcut::ScrollBegin(bool isActive) { //为1时,是正处于快捷栏页面,为0时,是没有处于快捷栏页面 if (isActive == 1) { scrollCont->ClearFocus(); } } void TjdUiAppMainPageShortcut::ScrollEnd(bool isActive) { // isActive:滑动结束后,先前在前台显示的界面被替换后上抛0,新移入的界面上抛1 //为0的时候,是该界面已经完全移出,为1的时候是该界面已经完全移入 if (isActive == 1) { scrollCont->RequestFocus(); } } void TjdUiAppMainPageShortcut::ReturnToTop(void) { if (scrollCont == nullptr) { return; } scrollCont->SetReboundSize(0); auto viewGroup = dynamic_cast(scrollCont->GetChildrenTail()); if (viewGroup != nullptr) { scrollCont->ScrollBy(0, -viewGroup->GetRect().GetBottom()); } scrollCont->SetReboundSize(Screen::GetInstance().GetHeight() >> 1); } void TjdUiAppMainPageShortcut::ClearFocus() { if (scrollCont == nullptr) { return; } scrollCont->ClearFocus(); } void TjdUiAppMainPageShortcut::DeleteContainer(void) { if (container) { this->Remove(container); TjdUiMemManage::DeleteChildren(container); } } void TjdUiAppMainPageShortcut::SetEditShortcutViewVisible(bool isVisible) { if (scrollCont == nullptr) return; scrollCont->SetVisible(isVisible); } void TjdUiAppMainPageShortcut::UnLoad(void) { if (viewiInitStatus) { ImageCacheManager::GetInstance().UnloadAllInMultiRes(IMAGE_BIN_PATH); ImageCacheManager::GetInstance().UnloadAllInMultiRes(BATTERY_IMAGE_BIN_PATH); viewiInitStatus = false; if (g_pMainShortcutPage->screenTipViewGroup_) { OHOS::RootView::GetInstance()->RemoveSystemView(g_pMainShortcutPage->screenTipViewGroup_); TjdUiMemManage::DeleteChildren(g_pMainShortcutPage->screenTipViewGroup_); screenTipViewGroup_ = nullptr; } TjdUiMemManage::DeleteChildren(container); if (timerToReturn_) { delete timerToReturn_; timerToReturn_ = nullptr; } } // printf("TjdUiAppMainPageShortcut::UnLoad:%d..............\n"); // Main clock view is commonly used page, so we do not release it's resources inner slice. } static void ShortcuScreenStatusNotifyCallback(ScreenStatus status) { if (status != SCREEN_STATUS_OFF) { return; } GraphicService::GetInstance()->PostGraphicEvent([]() { if (TjdUiAppMainPageShortcut::GetInstance()) { TjdUiAppMainPageShortcut::GetInstance()->ResetKeepScreenIcon(); } TjdUiScreenManage::SetScreenOnSystime(); deregisterNotifyScreenStatus(ShortcuScreenStatusNotifyCallback); }); } bool TjdUiAppMainPageShortcut::OnClick(UIView &view, const ClickEvent &event) { uint8_t vieIndex = view.GetViewIndex(); ImageInfo *imgInfo; if (vieIndex == SHORTCUT_MENU_STYLE_INDEX) { TjdUiAppSettingNormalListModel::GetInstance().SetListType( TjdUiAppSettingNormalListModel::SettingListType::SETTING_LIST_TYPE_MENU_STYLE); OHOS::NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_SETTING_NORMAL_LIST, OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true); } else if (vieIndex == SHORTCUT_SYSTEM_SET_INDEX) { OHOS::NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_SETTING, OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true); } else if (vieIndex == SHORTCUT_BRIGHT_SCREEN_INDEX) { uint8_t isBright = sql_fit_get_switch_bright_screen(); if (!isBright) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BRIGHT_SCREEN_INDEX)].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BRIGHT_SCREEN_INDEX)].iconCloseId, IMAGE_BIN_PATH); } imgBrightScreen_->SetSrc(imgInfo); sql_fit_set_switch_bright_screen(!isBright); } else if (vieIndex == SHORTCUT_WATER_INDEX) { NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_DRAIN); } else if (vieIndex == SHORTCUT_BUSINESS_CARD_INDEX) { NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_BUSINESSCARD); } else if (vieIndex == SHORTCUT_CARD_PACKET_INDEX) { NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_WALLET); } else if (vieIndex == SHORTCUT_BRIGHTNESS_SET_INDEX) { OHOS::NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_SETTING_DISPLAY_AND_BRIGHTNESS, OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true); } else if (vieIndex == SHORTCUT_POWER_SAVE_INDEX) { OHOS::NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_SETTING_POWER_SAVING, OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true); } else if (vieIndex == SHORTCUT_NOT_DISTURB_INDEX) { OHOS::NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_SETTING_DO_NOT_DISTURB, OHOS::TransitionType::TRANSITION_INVALID, OHOS::gSliceDefaultPriority, true); } else if (vieIndex == SHORTCUT_LOCK_SCREEN_INDEX) { // NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_LOCKSCREEN); TjdUiAppMainView::GetInstance()->SwitchToClockPage(); SetLockScreenEnable(true); ShowLockScreenView(); } else if (vieIndex == SHORTCUT_FIND_PHONE_INDEX) { NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_FINDPHONE); } else if (vieIndex == SHORTCUT_FLASHLIGHT_INDEX) { NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_FLASHLIGHT); } else if (vieIndex == SHORTCUT_EDIT_INDEX) { // NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_SHORTCUT_EDIT); ShowShortcutEditView(); } else if (vieIndex == SHORTCUT_ALIPAY_INDEX) { TjdUiAppAlipayModel::GetInstance().SetQuickEnterFlag(true); NativeAbility::GetInstance().ChangeSlice(TJD_APP_VIEW_ALIPAY); } else if (vieIndex == SHORTCUT_SCREEN_SET_INDEX) { if (screenSetFlag) { screenSetFlag = 0; TjdUiScreenManage::SetScreenOnSystime(); DisplayScreenTips(0, 0); deregisterNotifyScreenStatus(ShortcuScreenStatusNotifyCallback); } else { uint32_t time_s = sql_setting_get_keep_screen_time(); TjdUiScreenManage::SetScreenOnSystime(time_s * 1000); DisplayScreenTips(1, time_s / 60); screenSetFlag = 1; registerNotifyScreenStatus(ShortcuScreenStatusNotifyCallback); } if (screenSetFlag == 1) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_SCREEN_SET_INDEX)].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_SCREEN_SET_INDEX)].iconCloseId, IMAGE_BIN_PATH); } imgScreenSet_->SetSrc(imgInfo); } else if (vieIndex == SHORTCUT_BLUETOOTH_INDEX) { if (tjd_get_bt_adv_statue()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BLUETOOTH_INDEX)].iconCloseId, IMAGE_BIN_PATH); tjd_close_bluetooth_only(); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BLUETOOTH_INDEX)].iconOpenId, IMAGE_BIN_PATH); tjd_open_bluetooth_only(); } imgBt_->SetSrc(imgInfo); } else if (vieIndex == SHORTCUT_CLOCK_INDEX) { sql_setting_set_bedside_clock(!sql_setting_get_bedside_clock()); if (sql_setting_get_bedside_clock()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_CLOCK_INDEX)].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_CLOCK_INDEX)].iconCloseId, IMAGE_BIN_PATH); } imgBedClock_->SetSrc(imgInfo); } return true; } void TjdUiAppMainPageShortcut::ResetKeepScreenIcon(void) { if (screenSetFlag) { auto imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_SCREEN_SET_INDEX)].iconCloseId, IMAGE_BIN_PATH); if (imgScreenSet_) { imgScreenSet_->SetSrc(imgInfo); } } } class TjdShortcutScrollView : public OHOS::UIScrollView { public: bool scrollControl_ = false; bool OnDragEvent(const DragEvent &event) override { UIView *child = GetChildrenHead(); Rect coor = child->GetRect(); Rect coor1 = GetRect(); // Rect coor = child->GetRelativeRect(); // Rect coor1 = GetRelativeRect(); bool dir = event.GetDeltaY() > 0 ? true : false; // true:向下滑动,false:向上滑动 // printf("get absolution coor of viewgroup x:%d,y:%d, top:%d, bottom:%d, h:%d,name:%s\n", coor.GetX(), coor.GetY(), // coor.GetTop(), coor.GetBottom(), coor.GetHeight(), child->GetViewId()); printf("get absolution coor of scroll // x:%d,y:%d, top:%d, bottom:%d, h:%d,name:%s\n", coor1.GetX(), coor1.GetY(), coor1.GetTop(), coor1.GetBottom(), // coor1.GetHeight(), GetViewId()); #if 0 if (!scrollControl_) { if (coor1.GetY() < 0) { return false; } else { UIScrollView::OnDragEvent(event); scrollControl_ = true; return true; } } else { UIScrollView::OnDragEvent(event); coor = child->GetRect(); if (coor.GetBottom() < Screen::GetInstance().GetHeight() - 1) { scrollControl_ = false; return false; } return true; } #endif #if 1 if (dir == false) { if ((coor.GetBottom() < Screen::GetInstance().GetHeight() - 1)) { //返回false表示不拦截事件,继续传递给父控件 return false; } UIScrollView::OnDragEvent(event); //返回true表示拦截事件,不继续传递给父控件,自己滚动 return true; } else if (dir == true) { if ((coor.GetBottom() < Screen::GetInstance().GetHeight() - 1)) { if (coor1.GetBottom() == Screen::GetInstance().GetHeight() - 1) { UIScrollView::OnDragEvent(event); return true; } //返回false表示不拦截事件,继续传递给父控件 return false; } //返回true表示拦截事件,不继续传递给父控件,自己滚动 UIScrollView::OnDragEvent(event); return true; } // UIScrollView::OnDragEvent(event); return true; #endif } private: bool isConsumed = true; }; void TjdUiAppMainPageShortcut::CreateShortcutItemView(UIViewGroup *viewGroup, uint8_t index, int16_t itemX, int16_t itemY, UIView::OnClickListener *clickListener) { uint8_t cntItem = sizeof(shortcutItems) / sizeof(shortcutItems[0]); uint8_t i; for (i = 0; i < cntItem; i++) { if (index == shortcutItems[i].index) { break; } } if (i >= cntItem) { return; } ImageInfo *imgInfo; UIImageView *img = new UIImageView(); viewGroup->Add(img); if (index == SHORTCUT_BLUETOOTH_INDEX) { imgBt_ = img; if (tjd_get_bt_adv_statue()) { if (tjd_get_bt_is_connect()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_SHORTCUT_BT_OPEN_CONNECT, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BLUETOOTH_INDEX)].iconOpenId, IMAGE_BIN_PATH); } } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BLUETOOTH_INDEX)].iconCloseId, IMAGE_BIN_PATH); } } else if (index == SHORTCUT_BRIGHT_SCREEN_INDEX) { imgBrightScreen_ = img; if (sql_fit_get_switch_bright_screen()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconCloseId, IMAGE_BIN_PATH); } } else if (index == SHORTCUT_CLOCK_INDEX) { imgBedClock_ = img; if (sql_setting_get_bedside_clock()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconCloseId, IMAGE_BIN_PATH); } } else if (index == SHORTCUT_NOT_DISTURB_INDEX) { imgNotDisturb_ = img; if (sql_setting_get_dnd_all_day()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconCloseId, IMAGE_BIN_PATH); } } else if (index == SHORTCUT_SCREEN_SET_INDEX) { imgScreenSet_ = img; if (screenSetFlag == 1) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconOpenId, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconCloseId, IMAGE_BIN_PATH); } } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(shortcutItems[i].iconOpenId, IMAGE_BIN_PATH); } img->SetSrc(imgInfo); img->SetPosition(itemX, itemY); img->SetOnClickListener(clickListener); img->SetTouchable(true); img->SetViewIndex(index); } uint8_t TjdUiAppMainPageShortcut::FindArrayIndex(uint8_t index) { uint8_t cntItem = sizeof(shortcutItems) / sizeof(shortcutItems[0]); for (uint8_t i = 0; i < cntItem; i++) { if (index == shortcutItems[i].index) { return i; } } return 0; } void TjdUiAppMainPageShortcut::UpdateView(void) { ImageInfo *imgInfo; char dig_text[20]; rtc_class_ops *rtc = tjd_driver_rtc_get_ops(); struct rtc_time localTime; rtc->get_rtc_time(&localTime); uint8_t battery = tjd_service_charger_get_battery(); std::ostringstream oss; uint8_t month = localTime.tm_mon; //获得当前的月份 uint8_t day = localTime.tm_mday; //获得当前的日期 uint8_t weekIndex = localTime.tm_wday; //获得当前是星期几 if (img_bat_level) { uint8_t bat_level = battery / 10; imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_BATTERY_BAT_0 + bat_level, BATTERY_IMAGE_BIN_PATH); img_bat_level->SetSrc(imgInfo); } if (label_bat_dig) { uint8_t bat_level_dig = (uint8_t)battery; oss.str(""); oss << static_cast(bat_level_dig) << '%'; std::string result = oss.str(); strcpy(dig_text, result.c_str()); label_bat_dig->SetText(dig_text); } if (img_ble_status) { uint8_t ble_connected = tjd_get_ble_is_connect(); //蓝牙图标 if (ble_connected) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_SHORTCUT_BLUETOOTH_ON, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_SHORTCUT_BLUETOOTH_OFF, IMAGE_BIN_PATH); } img_ble_status->SetSrc(imgInfo); } if (label_date) { std::string result; oss.str(""); oss << static_cast(month) << '/' << static_cast(day); result = oss.str(); memset(dig_text, 0, sizeof(dig_text)); strcpy(dig_text, result.c_str()); label_date->SetText(dig_text); } if (label_week) { const char *weekStr = nullptr; TjdUiLanguageId language = TjdUiMultiLanguageExt::GetCurrentLanguage(); if (language == LANGUAGE_ID_CHS) { weekStr = week_ch[weekIndex]; } else { weekStr = week_en[weekIndex]; } label_week->SetText(weekStr); } if (imgBt_) { if (tjd_get_bt_adv_statue()) { if (tjd_get_bt_is_connect()) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_SHORTCUT_BT_OPEN_CONNECT, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BLUETOOTH_INDEX)].iconOpenId, IMAGE_BIN_PATH); } } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_BLUETOOTH_INDEX)].iconCloseId, IMAGE_BIN_PATH); } imgBt_->SetSrc(imgInfo); } viewGroup1->Remove(label_bat_dig); viewGroup1->Add(label_bat_dig); viewGroup2->Remove(label_week); viewGroup2->Add(label_week); } bool TjdUiAppMainPageShortcut::InitView(void) { container = new UIViewGroup(); container->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); container->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); UIView::OnClickListener *clickListener = (UIView::OnClickListener *)TjdUiAppMainPresenter::GetInstance(); // UIView::OnDragListener *dragListener = (UIView::OnDragListener *)TjdUiAppMainPresenter::GetInstance(); // UIScrollView *scrollCont = new UIScrollView(); // scrollCont->SetOnDragListener(dragListener); scrollCont = new TjdShortcutScrollView(); scrollCont->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); scrollCont->SetScrollBlankSize(0); scrollCont->SetHorizontalScrollState(false); scrollCont->SetThrowDrag(true); //设置结束拖动时,是否产生惯性滑动动效 scrollCont->SetSwipeACCLevel(5); // 越大距离越长 scrollCont->SetDragACCLevel(10); //越大时间越短 // scrollCont->SetReboundSize(100); scrollCont->SetMaxScrollDistance(1000); scrollCont->SetElastic(true); scrollCont->SetReboundSize(Screen::GetInstance().GetHeight() >> 1); scrollCont->SetPosition(0, 0); scrollCont->SetWidth(Screen::GetInstance().GetWidth()); scrollCont->SetHeight(Screen::GetInstance().GetHeight()); viewGroup = new UIViewGroup(); viewGroup->SetViewId("viewGroup"); viewGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); // viewGroup->SetOnDragListener(dragListener); viewGroup->SetPosition(0, 0); viewGroup->SetAutoSize(true); scrollCont->Add(viewGroup); ImageInfo *imgInfo; UIImageView *editBackground = new UIImageView(); imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes( shortcutItems[FindArrayIndex(SHORTCUT_EDIT_INDEX)].iconCloseId, IMAGE_BIN_PATH); editBackground->SetPosition(143, 43); editBackground->SetSrc(imgInfo); editBackground->SetOnClickListener(clickListener); editBackground->SetTouchable(true); editBackground->SetViewIndex(SHORTCUT_EDIT_INDEX); editBackground->SetViewId("editBackground"); viewGroup->Add(editBackground); UILabelExt *labelEdit = new UILabelExt(); viewGroup->Add(labelEdit); // labelEdit->SetText("编辑");//需要换成多语言 labelEdit->SetTextId(STR_ID_69); //需要换成多语言 labelEdit->SetFont(TJD_VECTOR_FONT_FILENAME, 30); labelEdit->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); labelEdit->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); labelEdit->AlignHorCenterToSibling(editBackground->GetViewId(), 0); labelEdit->AlignVerCenterToSibling(editBackground->GetViewId(), 0); uint8_t itemVerGap = 32; uint8_t itemHorGap = 32; uint8_t imageHeight = 110; uint8_t imageWidth = 110; uint8_t listCnt = shortcutList.size(); if (listCnt < minShortcutNum) { static_print_error("shortcut num is too small, cnt:%d", listCnt); listCnt = minShortcutNum; } uint8_t cntItem = sizeof(shortcutItems) / sizeof(shortcutItems[0]); uint8_t numReminder = listCnt % 3; auto begin = shortcutList.begin(); auto end = shortcutList.end(); int x = 36; int y = 151; if (numReminder == 1) { auto it = shortcutList.begin(); auto &firstItem = *it; // 第一个元素 CreateShortcutItemView(viewGroup, firstItem, 178, 151, clickListener); begin = std::next(begin, 1); // 移动迭代器到下一个元素 y += itemHorGap + imageWidth; } else if (numReminder == 2) { auto it = shortcutList.begin(); auto &firstItem = *it; // 第一个元素 CreateShortcutItemView(viewGroup, firstItem, 105, 151, clickListener); std::advance(it, 1); // 移动迭代器到下一个元素 auto &secondItem = *it; // 第二个元素 CreateShortcutItemView(viewGroup, secondItem, 247, 151, clickListener); begin = std::next(begin, 2); // 移动迭代器到下一个元素 y += itemHorGap + imageWidth; } int index = 0; for (auto it = begin; it != end; ++it, ++index) { const auto &item = *it; x = 36 + (index % 3) * (itemHorGap + imageWidth); if (index != 0 && index % 3 == 0) { y += (itemVerGap + imageHeight); } CreateShortcutItemView(viewGroup, item, x, y, clickListener); } viewGroup1 = new UIViewGroup(); viewGroup->Add(viewGroup1); viewGroup1->SetViewId("viewGroup1"); viewGroup1->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); // viewGroup->SetOnDragListener(dragListener); viewGroup1->SetAutoSize(true); uint8_t ble_connected = tjd_get_ble_is_connect(); //蓝牙图标以及电量星期显示 img_ble_status = new UIImageView(); viewGroup1->Add(img_ble_status); if (ble_connected) { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_SHORTCUT_BLUETOOTH_ON, IMAGE_BIN_PATH); } else { imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_SHORTCUT_BLUETOOTH_OFF, IMAGE_BIN_PATH); } img_ble_status->SetSrc(imgInfo); img_ble_status->SetViewId("img_ble_status"); // img_ble_status->SetX(146); // img_ble_status->SetY(y + imageHeight + 32); img_ble_status->SetX(0); img_ble_status->SetY(0); // img_ble_status->LayoutBottomToSibling(img_flashlight->GetViewId(), 40); uint8_t battery = tjd_service_charger_get_battery(); uint8_t bat_level = battery / 10; img_bat_level = new UIImageView(); viewGroup1->Add(img_bat_level); imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_BATTERY_BAT_0 + bat_level, BATTERY_IMAGE_BIN_PATH); img_bat_level->SetSrc(imgInfo); img_bat_level->SetViewId("img_bat_level"); // img_bat_level->SetX(150); img_bat_level->LayoutRightToSibling(img_ble_status->GetViewId(), 20); img_bat_level->AlignVerCenterToSibling(img_ble_status->GetViewId(), 0); viewGroup1->Remove(img_bat_level); viewGroup1->Add(img_bat_level); uint8_t bat_level_dig = (uint8_t)battery; // bat_level_dig = 100; label_bat_dig = new UILabel(); viewGroup1->Add(label_bat_dig); char dig_text[20]; std::ostringstream oss; oss << static_cast(bat_level_dig) << '%'; std::string result = oss.str(); strcpy(dig_text, result.c_str()); label_bat_dig->SetText(dig_text); label_bat_dig->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label_bat_dig->SetFont(TJD_VECTOR_FONT_FILENAME, 36); label_bat_dig->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); label_bat_dig->LayoutRightToSibling(img_bat_level->GetViewId(), 20); int16_t offsety = (img_bat_level->GetHeight() - label_bat_dig->GetHeight()) / 2; label_bat_dig->SetY(img_bat_level->GetY() + offsety); // label_bat_dig->AlignVerCenterToSibling(img_bat_level->GetViewId(), -1); // printf("label bat level x:%d,y:%d, w:%d,%d, h:%d,%d\n", label_bat_dig->GetX(), label_bat_dig->GetY(), // label_bat_dig->GetWidth(), label_bat_dig->GetRect().GetWidth(), // label_bat_dig->GetHeight(),label_bat_dig->GetRect().GetHeight()); viewGroup1->Remove(label_bat_dig); viewGroup1->Add(label_bat_dig); viewGroup1->SetX((Screen::GetInstance().GetWidth() - viewGroup1->GetWidth()) / 2); viewGroup1->SetY(y + imageHeight + 32); // viewGroup1->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full); viewGroup->Remove(viewGroup1); viewGroup->Add(viewGroup1); viewGroup2 = new UIViewGroup(); viewGroup->Add(viewGroup2); viewGroup2->SetViewId("viewGroup2"); viewGroup2->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); // viewGroup->SetOnDragListener(dragListener); viewGroup2->SetAutoSize(true); rtc_class_ops *rtc = tjd_driver_rtc_get_ops(); struct rtc_time localTime; rtc->get_rtc_time(&localTime); uint8_t month = localTime.tm_mon; //获得当前的月份 uint8_t day = localTime.tm_mday; //获得当前的日期 uint8_t weekIndex = localTime.tm_wday; //获得当前是星期几 label_date = new UILabel(); viewGroup2->Add(label_date); oss.str(""); oss << static_cast(month) << '/' << static_cast(day); result = oss.str(); memset(dig_text, 0, sizeof(dig_text)); strcpy(dig_text, result.c_str()); label_date->SetViewId("label_date"); label_date->SetFont(TJD_DIN_MEDIUM_FONT_FILENAME, 36); label_date->SetText(dig_text); label_date->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); label_date->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label_date->SetX(0); label_date->SetY(0); // printf("label date x:%d,y:%d, w:%d, h:%d\n", label_date->GetX(), label_date->GetY(), // label_date->GetRect().GetWidth(), label_date->GetRect().GetHeight()); // printf("label date x:%d,y:%d, w:%d, h:%d\n", label_date->GetX(), label_date->GetY(), label_date->GetWidth(), // label_date->GetHeight()); viewGroup2->Remove(label_date); viewGroup2->Add(label_date); // printf("group2 width:%d, height:%d\n", viewGroup2->GetWidth(), viewGroup2->GetHeight()); const char *weekStr = nullptr; TjdUiLanguageId language = TjdUiMultiLanguageExt::GetCurrentLanguage(); if (language == LANGUAGE_ID_CHS) { weekStr = week_ch[weekIndex]; } else { weekStr = week_en[weekIndex]; } label_week = new UILabel(); viewGroup2->Add(label_week); label_week->SetText(weekStr); label_week->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); label_week->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label_week->SetFont(TJD_VECTOR_FONT_FILENAME, 36); label_week->LayoutRightToSibling(label_date->GetViewId(), 13); offsety = (label_date->GetHeight() - label_week->GetHeight()) / 2; label_week->SetY(label_date->GetY() + offsety); // printf("label label_week x:%d,y:%d, w:%d,%d, h:%d,%d\n", label_week->GetX(), label_week->GetY(), // label_week->GetWidth(), label_week->GetRect().GetWidth(), // label_week->GetHeight(),label_week->GetRect().GetHeight()); viewGroup2->Remove(label_week); viewGroup2->Add(label_week); // printf("group2 width:%d, height:%d\n", viewGroup2->GetWidth(), viewGroup2->GetHeight()); viewGroup2->SetX((Screen::GetInstance().GetWidth() - viewGroup2->GetWidth()) / 2); viewGroup2->SetY(viewGroup1->GetY() + viewGroup1->GetHeight() + 10); viewGroup->Remove(viewGroup2); viewGroup->Add(viewGroup2); UIViewGroup *blankGroup = new UIViewGroup(); viewGroup->Add(blankGroup); blankGroup->SetViewId("blankGroup"); blankGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); blankGroup->SetAutoSize(false); blankGroup->SetWidth(Screen::GetInstance().GetWidth()); blankGroup->SetHeight(40); blankGroup->LayoutBottomToSibling(viewGroup2->GetViewId(), 0); blankGroup->LayoutLeftToSibling(viewGroup2->GetViewId(), 0); viewGroup->Remove(blankGroup); viewGroup->Add(blankGroup); container->Add(scrollCont); container->SetViewId("shortcut"); Add(container); scrollCont->ScrollBy(0, -((viewGroup->GetHeight() - 1) - (Screen::GetInstance().GetHeight() - 1))); // printf("---------------------group top:%d, height:%d,scroll to:%d,bottom:%d\n", viewGroup->GetRect().GetTop(), // viewGroup->GetHeight(), -(viewGroup->GetHeight() - Screen::GetInstance().GetHeight() - 1), // viewGroup->GetRect().GetBottom()); return true; } } // namespace TJD