mcu_hi3321_watch/tjd/ui/app/message/total/TjdUiMessageTotalPage.cpp
2025-05-26 20:15:20 +08:00

386 lines
14 KiB
C++

/*----------------------------------------------------------------------------
* Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved.
*
* Description:
*
* Author: huangshuyi
*
* Create: 2024-7
*--------------------------------------------------------------------------*/
#include "TjdUiMessageTotalPage.h"
#include "components/ui_label.h"
#include "wearable_log.h"
#include "common/image_cache_manager.h"
#include <time.h>
#include <unordered_map>
#include "gfx_utils/image_info.h"
#include "gfx_utils/heap_base.h"
#include "TjdUiImageIds.h"
#include "ui_label.h"
#include "components/ui_label_ext.h"
#include "TjdUiMultiLanguageExt.h"
#include "sys_config.h"
#include "components/ui_view.h"
#include "TjdUiMessageCommon.h"
#include "TjdUiMessageTotalView.h"
#include "TjdUiMemManage.h"
#include <ctime>
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_message.bin"
message_enum TjdUiMessageTotalPage::messageType;
TjdUiAppViewId TjdUiMessageTotalPage::sliceId;
static TjdUiMessageTotalPage *g_pMessageTotalPage = nullptr;
TjdUiMessageTotalPage::TjdUiMessageTotalPage()
{
//SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
g_pMessageTotalPage = this;
}
TjdUiMessageTotalPage::~TjdUiMessageTotalPage()
{
static_print_debug("delete TjdUiMessageTotalPage......");
ImageCacheManager::GetInstance().UnloadAllInMultiRes(IMAGE_BIN_PATH);
if (itemClickListener) {
delete itemClickListener;
itemClickListener = nullptr;
}
if (delClickListener) {
delete delClickListener;
delClickListener = nullptr;
}
scrollCont->ClearFocus();
if (container_ != nullptr) {
//从slice来的
container_->Remove(pageGroup);
TjdUiMemManage::DeleteChildren(pageGroup);
} else {
//从主页面来的
TjdUiMemManage::DeleteChildren(pageGroup);
}
// if (screenDragListener) {
// delete screenDragListener;
// screenDragListener = nullptr;
// }
g_pMessageTotalPage = nullptr;
}
TjdUiMessageTotalPage *TjdUiMessageTotalPage::GetInstance(void)
{
return g_pMessageTotalPage;
}
bool TjdUiMessageTotalPage::OnClick(UIView &view, const ClickEvent &event)
{
return true;
}
void TjdUiMessageTotalPage::FocusManage(bool flag)
{
if (flag) {
scrollCont->RequestFocus();
} else {
scrollCont->ClearFocus();
}
}
void TjdUiMessageTotalPage::show(void)
{
if (scrollCont) {
scrollCont->SetVisible(true);
}
}
void TjdUiMessageTotalPage::hide(void)
{
if (scrollCont) {
scrollCont->SetVisible(false);
}
}
void TjdUiMessageTotalPage::DeleteMessage(uint8_t index)
{
if (TjdUiMessageNoMessagePage::GetInstance()) {
TjdUiMessageNoMessagePage::GetInstance()->show();
}
sql_message_del_all_messages();
}
int16_t TjdUiMessageTotalPage::CreateMessageItem(UIViewGroup*& cont, const uint8_t& index, const int16_t& x, const int16_t& y, UIView::OnClickListener*itemClickListener)
{
message_enum messageType = (message_enum)sql_message_get_type(index);//找到类型
UIViewGroup*textGroup = new UIViewGroup();
textGroup->SetTouchable(true);
textGroup->SetOnClickListener(itemClickListener);
textGroup->SetViewIndex((uint8_t)messageType);
cont->Add(textGroup);
textGroup->SetStyle(OHOS::STYLE_BORDER_RADIUS, 25);
textGroup->SetStyle(STYLE_BACKGROUND_COLOR, 0xff262626);
textGroup->SetAutoSize(false);
textGroup->SetPosition(x, y);
textGroup->SetWidth(Screen::GetInstance().GetWidth() - 120);
//textGroup->SetPosition(60, 80,Screen::GetInstance().GetWidth() - 120, 200);
UIViewGroup*line1Group = new UIViewGroup();
line1Group->SetViewId("line1Group");
textGroup->Add(line1Group);
line1Group->LayoutTopOfParent(11);
line1Group->SetStyle(STYLE_BACKGROUND_COLOR, 0xff262626);
line1Group->SetAutoSize(true);
UIImageView* imageType = new UIImageView();
line1Group->Add(imageType);
TjdUiMessage* messageRes = TjdUiMessageResGet(messageType);
if (messageRes == nullptr) {
static_print_error("messageRes is null......");
return 0;
}
ImageInfo* imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(messageRes->imageId, IMAGE_BIN_PATH);
imageType->SetSrc(imgInfo);
Vector2<float> itemScaleCenter = {0, 0};
float imgFac = (float)30/imgInfo->header.width ;
Vector2<float> itemScaleFactor = {imgFac, imgFac};
//imageType->Scale(itemScaleFactor, itemScaleCenter);
imageType->SetAutoEnable(false);
imageType->Resize(40, 40);
imageType->SetResizeMode(UIImageView::ImageResizeMode::FILL);
imageType->SetViewId("messageIcon");
imageType->SetPosition(0, 0);
line1Group->Remove(imageType);
line1Group->Add(imageType);
UILabel *labelType = new UILabel();
line1Group->Add(labelType);
labelType->SetText(messageRes->name);//需要换成多语言
labelType->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_28);
labelType->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
labelType->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
labelType->AlignVerCenterToSibling(imageType->GetViewId(), 0);
labelType->LayoutRightToSibling(imageType->GetViewId(), 8);
labelType->SetViewId("labelType");
line1Group->Remove(labelType);
line1Group->Add(labelType);
UILabel *labelMessageNum = new UILabel();
line1Group->Add(labelMessageNum);
char messageNum[10];
uint8_t messageNumCount = sql_message_get_message_type_cnt(messageType);
//printf("messageNumCount=%d\n", messageNumCount);
snprintf(messageNum, sizeof(messageNum), "[%d]", messageNumCount);
labelMessageNum->SetText(messageNum);//需要换成多语言
labelMessageNum->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_28);
labelMessageNum->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
labelMessageNum->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
labelMessageNum->AlignVerCenterToSibling(labelType->GetViewId(), 0);
labelMessageNum->LayoutRightToSibling(labelType->GetViewId(), 8);
labelMessageNum->SetViewId("labelMessageNum");
line1Group->Remove(labelMessageNum);
line1Group->Add(labelMessageNum);
if (sql_message_get_read_flag(index)) {
UIImageView* imageUnread = new UIImageView();
line1Group->Add(imageUnread);
imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_MESSAGE_UNREAD_DOT, IMAGE_BIN_PATH);
imageUnread->SetSrc(imgInfo);
imageUnread->AlignVerCenterToSibling(labelMessageNum->GetViewId(), 0);
imageUnread->LayoutRightToSibling(labelMessageNum->GetViewId(), 8);
line1Group->Remove(imageUnread);
line1Group->Add(imageUnread);
}
line1Group->LayoutLeftOfParent((textGroup->GetWidth()-line1Group->GetWidth()) / 2);
time_t timesample = sql_message_get_timestamp(index);
struct tm *timeinfo = std::localtime(&timesample);
uint16_t year = timeinfo->tm_year + 1900;
uint8_t month = timeinfo->tm_mon + 1;
uint8_t day = timeinfo->tm_mday;
uint8_t hour = timeinfo->tm_hour;
uint8_t minute = timeinfo->tm_min;
char strTime[30];
snprintf(strTime, sizeof(strTime), "%d-%d-%d %d:%d", year, month, day, hour, minute);
//std::string strTime = "2024-5-21";
UILabel *labelTime = new UILabel();
textGroup->Add(labelTime);
//labelTime->SetText(strTime.c_str());
labelTime->SetText(strTime);
labelTime->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_28);
labelTime->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
labelTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
labelTime->AlignHorCenterToSibling(line1Group->GetViewId(), 0);
labelTime->LayoutBottomToSibling(line1Group->GetViewId(), 3);
labelTime->SetViewId("labelTime");
//std::string strText = "nnoodsfofdjojglfdjlgjfdslkjlkgjfdlkjnnodsfljglkjelkrjglkkndsnvsalkfkjaljlgkjrkejlkglkalkgj";
char* strText;
sql_message_get_detail_info(index, &strText);
UILabel *labelText = new UILabel();
textGroup->Add(labelText);
//labelText->SetText(strText.c_str());
labelText->SetText(strText);
labelText->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_28);
labelText->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
labelText->SetWidth(textGroup->GetWidth() - 40);
labelText->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
labelText->AlignHorCenterToSibling(labelTime->GetViewId(), 0);
labelText->LayoutBottomToSibling(labelTime->GetViewId(), 3);
int16_t labelTextH = labelText->GetHeight();
int16_t labelTextY = labelText->GetY();
textGroup->SetHeight(labelTextY + labelTextH + 11);
cont->Remove(textGroup);
cont->Add(textGroup);
return textGroup->GetRelativeRect().GetBottom();
}
void TjdUiMessageTotalPage::UpdateMessagePageGroup(void)
{
TjdUiMemManage::DeleteChildren(messagePageGroup);
if (itemClickListener) {
delete itemClickListener;
itemClickListener = nullptr;
}
if (delClickListener) {
delete delClickListener;
delClickListener = nullptr;
}
CreateMessagePageGroup();
show();
}
void TjdUiMessageTotalPage::CreateMessagePageGroup(void)
{
messagePageGroup = new UIViewGroup();
messagePageGroup->SetViewId("messagePageGroup");
scrollCont->Add(messagePageGroup);
messagePageGroup->SetAutoSize(true);
messagePageGroup->SetPosition(0, 0);
//pageGroup->SetWidth(Screen::GetInstance().GetWidth());
//pageGroup->SetHeight(Screen::GetInstance().GetHeight());
UILabelExt *labelNotify = new UILabelExt();
messagePageGroup->Add(labelNotify);
labelNotify->SetText("通知");//需要换成多语言
labelNotify->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_30);
labelNotify->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
labelNotify->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
labelNotify->LayoutTopOfParent(20);
int16_t scrollW = scrollCont->GetWidth();
int16_t labelNotifyW = labelNotify->GetWidth();
labelNotify->LayoutLeftOfParent((scrollW - labelNotifyW) / 2);
labelNotify->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full);
itemClickListener = new ItemClickListener();
//sql_message_test();
uint8_t* type_list = new uint8_t[sql_message_get_max_number()];
uint8_t type_cnt = sql_message_get_message_type_list(type_list);
#define ITEM_GAP_DISTANCE 20
int16_t y = 80;
for (uint8_t i = 0; i < type_cnt; i++) {
uint8_t index = sql_message_get_message_type_newest_index(type_list[i]);
//sprintf("index=%d, type=%d\n", index, type_list[i]);
y = CreateMessageItem(messagePageGroup, index, 60, y, itemClickListener);
y += ITEM_GAP_DISTANCE;
}
delete []type_list;
UIImageView* imageDel = new UIImageView();
messagePageGroup->Add(imageDel);
ImageInfo* imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_MAIN_MESSAGE_DELETE, IMAGE_BIN_PATH);
if (y + imgInfo->header.height < Screen::GetInstance().GetHeight()) {
y = Screen::GetInstance().GetHeight() - imgInfo->header.height;
}
imageDel->SetPosition(186, y);
imageDel->SetSrc(imgInfo);
imageDel->SetTouchable(true);
delClickListener = new DelClickListener();
imageDel->SetOnClickListener(delClickListener);
messagePageGroup->Remove(imageDel);
messagePageGroup->Add(imageDel);
uint16_t slice = NativeAbility::GetInstance().GetCurSliceId();
if (TJD_APP_VIEW_MAIN == slice) {
scrollCont->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
messagePageGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
pageGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
// screenDragListener = new TjdUiMessageScreenDragListener();
}
//printf("messagePageGroup height:%d\n", messagePageGroup->GetHeight());
}
UIViewGroup *TjdUiMessageTotalPage::PageInit(UIViewGroup *cont)
{
static_print_debug("TjdUiMessageTotalPage::PageInit:%p", cont);
container_ = cont;
pageGroup = new UIViewGroup();
if (container_ != nullptr) {
//从slice来的
container_->Add(pageGroup);
pageGroup->SetTouchable(true);
pageGroup->SetDraggable(true);
pageGroup->SetOnDragListener(this);
}
pageGroup->SetViewId("TjdUiMessageTotalPage pageGroup");
pageGroup->SetPosition(0, 0);
pageGroup->SetWidth(Screen::GetInstance().GetWidth());
pageGroup->SetHeight(Screen::GetInstance().GetHeight());
// if (sql_message_get_message_num() == 0) {
// uint16_t slice = NativeAbility::GetInstance().GetCurSliceId();
// if (TJD_APP_VIEW_MAIN == slice) {
// pageGroup->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
// }
// return pageGroup;
// }
if (scrollCont != nullptr) {
return scrollCont;
}
//UIViewGroup *container = (UIViewGroup *)TjdUiMessageTotalView::GetInstance()->GetContainer();
if (container_ != nullptr) {
//从slice来的
scrollCont = new UIScrollView();
} else {
//从主页面来的
scrollCont = new TjdUiMessageScroll();
}
pageGroup->Add(scrollCont);
scrollCont->SetViewId("TjdUiMessageTotalPage scrollCont");
scrollCont->SetScrollBlankSize(0);
scrollCont->SetHorizontalScrollState(false);
scrollCont->SetThrowDrag(true);//设置结束拖动时,是否产生惯性滑动动效
scrollCont->SetMaxScrollDistance(0);
scrollCont->SetSwipeACCLevel(5); // 越大距离越长
scrollCont->SetDragACCLevel(10); //越大时间越短
scrollCont->SetReboundSize(Screen::GetInstance().GetHeight() >> 1);
scrollCont->SetElastic(true);
scrollCont->SetPosition(0, 0);
scrollCont->SetWidth(Screen::GetInstance().GetWidth());
scrollCont->SetHeight(Screen::GetInstance().GetHeight());
CreateMessagePageGroup();
pageGroup->SetViewId("messagepage");
return pageGroup;
}
}