From e209b1cd2af0dc80330bdac5a4bb9c707c498208 Mon Sep 17 00:00:00 2001 From: Caisking Date: Tue, 15 Apr 2025 17:37:51 +0800 Subject: [PATCH] =?utf8?q?=E3=80=90=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5?= =?utf8?q?=E3=80=91UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/clock/src/MainClockView.cpp | 44 +- .../nativeui/main/include/MainViewSample.h | 8 +- .../nativeui/main/src/MainViewSample.cpp | 62 +- .../nativeui/message/include/MessageAdapter.h | 57 + .../message/include/MessageCardView.h | 45 + .../message/include/MessageControlPresenter.h | 47 + .../message/include/MessageControlView.h | 47 + .../message/include/MessageItemView.h | 49 + .../message/include/MessageLackView.h | 50 + .../nativeui/message/include/MessageModel.h | 85 ++ .../message/include/MessagePresenter.h | 44 + .../message/include/MessageShowPresenter.h | 46 + .../message/include/MessageShowView.h | 62 + .../nativeui/message/include/MessageView.h | 72 ++ .../nativeui/message/src/MessageAdapter.cpp | 105 ++ .../nativeui/message/src/MessageCardView.cpp | 150 +++ .../message/src/MessageControlPresenter.cpp | 75 ++ .../message/src/MessageControlView.cpp | 117 ++ .../nativeui/message/src/MessageItemView.cpp | 142 +++ .../nativeui/message/src/MessageLackView.cpp | 96 ++ .../nativeui/message/src/MessageModel.cpp | 1109 +++++++++++++++++ .../nativeui/message/src/MessagePresenter.cpp | 155 +++ .../message/src/MessageShowPresenter.cpp | 101 ++ .../nativeui/message/src/MessageShowView.cpp | 282 +++++ .../nativeui/message/src/MessageView.cpp | 223 ++++ 25 files changed, 3208 insertions(+), 65 deletions(-) create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/clock/src/MainClockView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/clock/src/MainClockView.cpp index 380016e7f..4fc468560 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/clock/src/MainClockView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/clock/src/MainClockView.cpp @@ -431,28 +431,28 @@ void MainClockView::UpdateStateShow() { - // if (messageicon_ == nullptr || dialstateicon_ == nullptr) - // return; + if (messageicon_ == nullptr || dialstateicon_ == nullptr) + return; - // /*配置未读状态*/ - // messageicon_->SetVisible(MainModel::GetInstance().getMessageActiveState()); - // /*配置表盘状态*/ - // dialstateicon_->SetVisible(true); - // switch (MainModel::GetInstance().getHighestPriorityActiveState()) - // { - // case DialState::DO_NOT_DISTURB: - // dialstateicon_->SetSrc(DISTURBICON); - // break; - // case DialState::SLEEP: - // dialstateicon_->SetSrc(SLEEPICON); - // break; - // case DialState::LOCK: - // dialstateicon_->SetSrc(LOCKICON); - // break; - // default: - // dialstateicon_->SetVisible(false); - // break; - // } + /*配置未读状态*/ + messageicon_->SetVisible(MainModel::GetInstance().getMessageActiveState()); + /*配置表盘状态*/ + dialstateicon_->SetVisible(true); + switch (MainModel::GetInstance().getHighestPriorityActiveState()) + { + case DialState::DO_NOT_DISTURB: + dialstateicon_->SetSrc(DISTURBICON); + break; + case DialState::SLEEP: + dialstateicon_->SetSrc(SLEEPICON); + break; + case DialState::LOCK: + dialstateicon_->SetSrc(LOCKICON); + break; + default: + dialstateicon_->SetVisible(false); + break; + } } void MainClockView::PreLoad(void) @@ -464,7 +464,7 @@ /*增加手表状态图标*/ InitImageView(dialstateicon_, 213, 2, 40, 40, "disturbicon", DISTURBICON); - // dialstateicon_->SetVisible(false); + dialstateicon_->SetVisible(false); /*增加未读图标*/ InitImageView(messageicon_, 223, 444, 20, 20, "messageicon_", MESSAGEICON); diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/include/MainViewSample.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/include/MainViewSample.h index 1d9741afc..e2af5d72b 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/include/MainViewSample.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/include/MainViewSample.h @@ -37,7 +37,7 @@ #include "weather/include/WeatherControlView.h" #include "goal/include/goalControlView.h" -// #include "message/include/MessageControlView.h" +#include "message/include/MessageControlView.h" // #include "sleep/include/SleepCardView.h" #include "set_card/include/SetMainView.h" // #include "heartrate/include/HeartRateCardView.h" @@ -111,7 +111,7 @@ namespace OHOS // BloodCardView *bloodView{nullptr}; // SleepCardView *sleepView{nullptr}; // Training_CardView *traingView{nullptr}; - // MessageControlView *messageView{nullptr}; + MessageControlView *messageView{nullptr}; SetMainView *setmainView{nullptr}; WeatherControlView *weatherControlView{nullptr}; @@ -119,8 +119,8 @@ namespace OHOS // ApplistCardView *applistCardView{nullptr}; UIButton *changebut{nullptr}; - // UIImageView *dialstateicon_{nullptr}; - // UIImageView *messageicon_{nullptr}; + UIImageView *dialstateicon_{nullptr}; + UIImageView *messageicon_{nullptr}; /* -------------------------------------------------------------------------- */ UICardPage *recordCard[MAX_CARD]{nullptr}; bool pageStatus[MAX_CARD]{false}; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/MainViewSample.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/MainViewSample.cpp index ffdfe0456..dc9e257dd 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/MainViewSample.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/MainViewSample.cpp @@ -98,30 +98,14 @@ namespace OHOS delete activityWeekView; activityWeekView = nullptr; } - // if (messageView != nullptr) - // { - // messageView->ClearBackgroundBlur(); - // messageView->RemoveAll(); - // delete messageView; - // messageView = nullptr; - // } - // if (MessageLable != nullptr) - // { - // delete MessageLable; - // MessageLable = nullptr; - // } - // if (dialstateicon != nullptr) - // { - // mainClockView->Remove(dialstateicon); - // delete dialstateicon; - // dialstateicon = nullptr; - // } - // if (messageicon != nullptr) - // { - // mainClockView->Remove(messageicon); - // delete messageicon; - // messageicon = nullptr; - // } + if (messageView != nullptr) + { + messageView->ClearBackgroundBlur(); + messageView->RemoveAll(); + delete messageView; + messageView = nullptr; + } + if (compassControlView != nullptr) { compassControlView->RemoveAll(); @@ -351,21 +335,21 @@ namespace OHOS dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); /* -------------------------------------------------------------------------- */ - // if (messageView == nullptr) { - // messageView = new MessageControlView(); - // if (messageView == nullptr) - // { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail"); - // return; - // } - // } + if (messageView == nullptr) { + messageView = new MessageControlView(); + if (messageView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail"); + return; + } + } - // messageView->SetViewId("messageView"); - // messageView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); - // messageView->PreLoad(); - // messageView->SetDraggable(false); - // // messageView->SetIntercept(true); - // messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + messageView->SetViewId("messageView"); + messageView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + messageView->PreLoad(); + messageView->SetDraggable(false); + // messageView->SetIntercept(true); + messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); #endif } @@ -379,7 +363,7 @@ namespace OHOS { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::VertViewLoad"); mainSwipeGroup->VerAdd(dropDownView, UICrossView::VPage::UP_PAGE); - // mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE); + mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete"); } diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h new file mode 100644 index 000000000..daef831b5 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h @@ -0,0 +1,57 @@ +/*** + * @Date: 2024-08-12 15:34:39 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-09-10 10:54:51 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageAdapter.h + */ + +#ifndef Message_ADAPTER_H +#define Message_ADAPTER_H +#include +#include +#include "components/ui_list.h" +#include "components/abstract_adapter.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_checkbox.h" +#include "components/ui_label_button_ext.h" + +namespace OHOS +{ + + typedef struct + { + int index; + bool read; // 是否未读 + std::string labeltitle; // 来信人 + std::string labeldetails; // 信息内容 + std::string labeltime; // 来信时间 + } MessageListItem; + + class MessageListAdapter : public AbstractAdapter + { + public: + explicit MessageListAdapter(); + virtual ~MessageListAdapter(); + + void SetData(std::list &data); + + virtual uint16_t GetCount(void) override; + + virtual UIView *GetView(UIView *inView, int16_t index) override; + + virtual void AddListItem(const MessageListItem &item); + + void SetItemClickListener(UIView::OnClickListener *itemclicklistener) + { + itemClickListener = itemclicklistener; + } + + private: + std::list listData; + UIView::OnClickListener *itemClickListener{nullptr}; + UILabelButtonExt *DeleteButton{nullptr}; + }; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h new file mode 100644 index 000000000..526eca9c6 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h @@ -0,0 +1,45 @@ + + +#ifndef MESSAGE_CARD_VIEW_H +#define MESSAGE_CARD_VIEW_H + +#include "View.h" +#include "components/root_view.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" +#include "ChangeSliceListener.h" +#include "UiConfig.h" +#include "AppGroupView.h" +#include "components/ui_label_button_ext.h" +#include "message/include/MessageCardView.h" +#include "components/ui_label_button_ext.h" +#include "message/include/MessageAdapter.h" +#include "message/include/MessageItemView.h" +#include "message/include/MessageModel.h" +namespace OHOS +{ +#define MAINMESSAGEVIEW "messagecard" + class MessageCardView : public AppGroupView + { + public: + MessageCardView(); + ~MessageCardView() override; + static MessageCardView *GetInstance(void); + + void AddMessageToList(const MessageListItem &item); + bool InitPage(void); + bool InitView(void *caller) override; + bool GetInitViewState(void); + void SetUpView(MessageCardView *messageCardView); + void UpdateMessageCard(void); + UIList *GetList(void); + + private: + void ClearAll(void); + MessageListAdapter *p_MessageListAdapter{nullptr}; + UIList *MessageList = nullptr; + UIImageView *imageline{nullptr}; + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h new file mode 100644 index 000000000..e3abc0ba2 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h @@ -0,0 +1,47 @@ +/*** + * @Date: 2024-06-22 11:36:07 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-22 14:57:34 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageControlPresenter.h + */ +/*** + * @Date: 2024-06-22 11:36:16 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-22 11:39:50 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp + */ + +#ifndef MESSAGE_CONTROL_PRESENTER_H +#define MESSAGE_CONTROL_PRESENTER_H + +#include "Presenter.h" +#include "components/ui_view.h" +#include "components/ui_image_view.h" +#include "ohos_types.h" +#include "UiConfig.h" +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "message/include/MessageControlView.h" + +namespace OHOS +{ + class MessageControlView; + class MessageControlPresenter : public UIView::OnClickListener + { + public: + MessageControlPresenter(){}; + virtual ~MessageControlPresenter(){}; + static MessageControlPresenter *GetInstance() + { + static MessageControlPresenter instance; + return &instance; + } + + bool OnClick(UIView &view, const ClickEvent &event) override; + + private: + UIView *view_{nullptr}; + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h new file mode 100644 index 000000000..16b411a7d --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h @@ -0,0 +1,47 @@ +/*** + * @Date: 2024-06-19 16:39:31 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-19 17:30:37 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlView.cpp + */ +/* + * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved. + * Description: MessageControlView.h + * Author: + * Create: 2022-04-02 + */ + +#ifndef MESSAGE_CONTROL_VIEW_H +#define MESSAGE_CONTROL_VIEW_H + +#include "components/root_view.h" +#include "UiConfig.h" +#include "components/ui_card_page.h" +#include "message/include/MessageLackView.h" +#include "message/include/MessageCardView.h" + +namespace OHOS +{ + + class MessageControlView : public UICardPage + { + public: + MessageControlView(); + ~MessageControlView() override; + static MessageControlView *GetInstance(); + bool InitView(void); + void PreLoad(void) override; + void UnLoad(void) override; + void SetLackView(bool flag); + + + private: + MessageLackView *messageLackView{nullptr}; + MessageCardView *messageCardView{nullptr}; + bool viewiInitStatus{false}; + bool isLack{true}; + + void ClearAll(void); + }; +} +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h new file mode 100644 index 000000000..7e17347a8 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h @@ -0,0 +1,49 @@ +/*** + * @Date: 2024-04-15 10:55:58 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-09 11:55:24 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageItemView.h + */ +/*** + * @Date: 2024-04-15 10:55:58 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-13 16:51:22 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageItemView.h + */ + +#ifndef Message_ITEM_VIEW_H +#define Message_ITEM_VIEW_H + +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_view_group.h" +#include "components/ui_checkbox.h" +#include "components/ui_image_view.h" +#include "message/include/MessageAdapter.h" +#include "components/ui_label_button.h" + +namespace OHOS +{ + class MessageItemView : public UIViewGroup + { + public: + explicit MessageItemView(); + virtual ~MessageItemView(); + virtual void SetItemInfo(const MessageListItem itemInfo); + virtual void SetUpChild(); + void TearDownChild(); + int GetMessageListIndex(); + + private: + MessageItemView(const MessageItemView &); + UIImageView sIcon; // 未读图标 + UILabel stitle; // 消息来源 + UILabel smessgae; // 消息 + UILabel stime; // 时间 + UILabelButton sLabelButton; // 按键 + MessageListItem sItemInfo = {0, false, nullptr, nullptr, nullptr}; + bool isSetupChild{false}; + bool unread_state = false; + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h new file mode 100644 index 000000000..53adf1f38 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h @@ -0,0 +1,50 @@ +/*** + * @Date: 2024-06-19 17:04:12 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-10 16:50:28 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageLackView.h + */ +/*** + * @Date: 2024-06-19 17:04:12 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-19 17:12:03 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageLackViewView.h + */ +/* + * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved. + * Description: MessageLackView.h + * Author: + * Create: 2022-04-02 + */ + +#ifndef MESSAGE_LACK_VIEW_H +#define MESSAGE_LACK_VIEW_H + +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "View.h" +#include "ohos_types.h" +#include "AppGroupView.h" +#include "components/ui_image_view.h" + +namespace OHOS +{ + class MessageLackView : public AppGroupView + { + public: + MessageLackView(); + ~MessageLackView() override; + + bool CreateUIViewGroup(void); + static MessageLackView *GetInstance(void); + bool InitView(void *caller) override; + + private: + UIImageView *imageline{nullptr}; + UIImageView *imagemeage{nullptr}; + UILabelExt *labelmeage{nullptr}; + + void ClearAll(void); + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h new file mode 100644 index 000000000..7f736a818 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h @@ -0,0 +1,85 @@ + +#ifndef MESSAGE_MODEL_H +#define MESSAGE_MODEL_H + + +// #include "bletest.h" + +#include "message/include/MessagePresenter.h" +#include +#include +#include + +namespace OHOS { +// 消息数据结构体 +struct MessageData { + bool isRead; // 消息是否已读 + std::string labelTitle; // 消息标题 + std::string labelDetails; // 消息详情 + std::string labelTime; // 消息时间 + uint32_t timestamp; // 消息时间戳 +}; + +// 消息模型类 +class MessageModel { +public: + MessageModel(); + ~MessageModel(); + void Init(); + + static MessageModel &GetInstance(); + void InitMessageListItems(); // 初始化消息列表项 + const MessageListItem *GetMessageListItems() const; // 获取消息列表项 + uint8_t GetMessageCount() const; // 获取消息数量 + // void AddMessageData(ancs_data_info_t *messageInfo); // 增加消息项 + bool LoadMessagesFromStorage(); // 初始化信息数组 {开机调用一次} + bool SaveMessagesToStorage(); // 保存信息数组 {关机时候调用} + bool SetMessageAsRead(); // 设置当前项已读 + void SetCurrentIndex(uint8_t index); // 设置当前下标 + uint8_t GetCurrentIndex(); // 获取当前下标 + MessageData *GetCurrentMessageData(); // 获取当前项 + bool DeleteCurrentMessage(); // 删除当前项 + bool ClearAllMessages(); // 删除所有数据 + MessageData *GetNewMessage(); // 获取最新信息 + void SetPopupViewState(bool state); // 设置弹出视图状态 + bool GetPopupViewState(); // 获取弹出视图状态 + bool HasDataVector(); // 判断数组是否存在数据 + void UpdateMessageView(); + + void at_message_test(); + +private: + MessageModel &operator=(const MessageModel &); + + uint16_t numberOfItems; // 项数 + static const uint16_t MaxMessageListCount = 10; // 消息列表最大数量 + MessageListItem Messages[MaxMessageListCount] = {0, false, nullptr, nullptr, + nullptr}; // 消息列表 + uint8_t currentIndex_; // 选择的项 + std::vector MessageVector; + + bool popupViewState_{false}; // 弹出视图状态 +}; +} // namespace OHOS + +#endif + +#if 0 + bool HasDataJson(); // 判断是否存在数据Json + bool GetJsonLoadStatus(); // 获取Json加载状态 + std::vector LoadMessageData(); // 加载消息数据 + uint8_t GetMessageCount() const; // 获取消息数量 + void SetPopupViewState(bool state); // 设置弹出视图状态 + bool GetPopupViewState(); // 获取弹出视图状态 + void PrintData(const MessageData messageData); // 打印数据 + MessageData *GetCurrentMessageData(); // 获取当前消息数据 + void SetCurrentMessageData(MessageData *data); // 设置当前消息数据 + bool ClearAllData(); // 清除所有数据 + bool DeleteSingleItem(int currentIndex); // 删除单个项 + MessageData *GetNewestData(int index); // 获取最新信息项 + void SetCurrentIndex(uint8_t index); // 设置当前项 + uint8_t GetCurrentIndex(); // 获取当前项 + bool SetMessageIsread(); // 设置当前项已读 + void DeleteExcessFiles(std::vector &filenames); // 删除文件 + void SaveMessageData(const MessageData data, const int index); // 保存json数据 +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h new file mode 100644 index 000000000..187229ac6 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h @@ -0,0 +1,44 @@ + + +#ifndef Message_PRESENTER_H +#define Message_PRESENTER_H + +#include "Presenter.h" +#include "MessageView.h" +#include "message/include/MessageModel.h" +// #include "components/ui_list.h" +// #include "KeyInputListener.h" +#include "common/key_code.h" + +namespace OHOS +{ + class MessageView; + class MessageModel; + class MessagePresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener, + public ListScrollListener, + public RootView::OnKeyActListener, + public UIList + { + public: + MessagePresenter(); + virtual ~MessagePresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + + static MessagePresenter *GetInstance(); + + private: + // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + MessageModel *model{nullptr}; + }; +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h new file mode 100644 index 000000000..2025cb0fd --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h @@ -0,0 +1,46 @@ +/*** + * @Date: 2024-06-17 19:39:27 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-03 14:18:46 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageShowPresenter.h + */ + +#ifndef MessageShow_PRESENTER_H +#define MessageShow_PRESENTER_H + +#include "Presenter.h" +#include "MessageShowView.h" +#include "message/include/MessageModel.h" +#include "components/ui_list.h" +#include "common/key_code.h" +namespace OHOS +{ + class MessageShowView; + class MessageShowModel; + class MessageShowPresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener, + public RootView::OnKeyActListener, + public UIList + { + public: + MessageShowPresenter(); + virtual ~MessageShowPresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + + static MessageShowPresenter *GetInstance(); + + private: + // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + MessageShowModel *p_MessageShowModel{nullptr}; + }; +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h new file mode 100644 index 000000000..f94e746c6 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h @@ -0,0 +1,62 @@ + + +#ifndef MessageShow_VIEW_H +#define MessageShow_VIEW_H + +// #include "BaseView.h" +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_list.h" +#include "message/include/MessageModel.h" +#include "message/include/MessageShowPresenter.h" +#include "components/ui_image_view.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_label_button_ext.h" + +namespace OHOS +{ +#define DELETEBUTTON "deletebutton" + + class MessageModel; + class MessageShowPresenter; + class MessageShowView : public View + { + + public: + MessageShowView(); + virtual ~MessageShowView(); + static MessageShowView *GetInstance(void); + + void OnStart() override; + + + void InitializeLabel(UILabel *label, int posX, int posY, int width, int height, const char *viewId, int fontSize); + void InitializeButton(UILabelButton *&button, int left, int top, int width, int height, const char *viewId); + + void UpdateMessage(); + void InitView(); + void DeInitView(void); + void PreLoad(void); + void UpdateShowConfig(); + + private: + UIScrollView *scrollView_ = nullptr; + + UILabel *title{nullptr}; + UILabel *time{nullptr}; + + UILabelButton *messageButton{nullptr}; // 消息 + UILabelButtonExt *deleteButton{nullptr}; // 清除按键 + + UIImageView *background{nullptr}; + UIImageView *backgroundtop{nullptr}; + + bool viewInitStatus{false}; + std::string titleStr; + std::string timeStr; + std::string messageStr; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h new file mode 100644 index 000000000..9c03f05b9 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h @@ -0,0 +1,72 @@ + + +#ifndef Message_VIEW_H +#define Message_VIEW_H + + +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_list.h" +#include "message/include/MessageAdapter.h" +#include "message/include/MessageModel.h" +#include "components/ui_image_view.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_label_button_ext.h" +#include "components/ui_list_ext.h" + +namespace OHOS +{ +#define DELETEALLDATA "deletealldata" + enum class PopupMessage + { + LackPopup, + MessagePopup + }; + class MessagePresenter; + class MessageModel; + class MessageView : public View, public ListScrollListener + { + + public: + MessageView(); + virtual ~MessageView(); + static MessageView *GetInstance(void); + + void OnStart() override; + + void AddMessageToList(const MessageListItem &item); + UIList *GetList(); + + void ShowLackView(); + void ShowMessageView(); + void SetPopupViewStatus(PopupMessage view, bool status); + + void InitView(void); + void DeInitView(void); + void PreLoad(void); + + bool InitPage(); + bool SetupViewPage(MessageView *messageView); + void UpdataButton(int num); + + private: + /*无消息界面*/ + UIScrollView *lackView{nullptr}; + UIImageView *imageline{nullptr}; + UIImageView *imagemeage{nullptr}; + UILabelExt *labeltitle{nullptr}; + UILabelExt *labelmeage{nullptr}; + + /*消息列表界面*/ + UIScrollView *messageView{nullptr}; + UIImageView *imageline2{nullptr}; + MessageListAdapter *p_MessageListAdapter{nullptr}; + UIList *MessageList = nullptr; + + bool viewInitStatus{false}; + + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp new file mode 100644 index 000000000..20d01164b --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp @@ -0,0 +1,105 @@ +/*** + * @Author: Caisking 3449750381@qq.com + * @Date: 2024-01-29 19:58:37 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-21 10:35:36 + * @FilePath: + * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageAdapter.cpp + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 + * 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ + +#include "message/include/MessageAdapter.h" +#include "message/include/MessageItemView.h" +#include "message/include/MessageModel.h" +#include "message/include/MessagePresenter.h" +#include "wearable_log.h" + +#include "uicomponents/UIComponents.h" +namespace OHOS { +MessageListAdapter::MessageListAdapter() {} + +MessageListAdapter::~MessageListAdapter() { + if (DeleteButton) { + delete DeleteButton; + DeleteButton = nullptr; + } + listData.clear(); +} + +uint16_t MessageListAdapter::GetCount(void) { return listData.size() + 1; } + +void MessageListAdapter::SetData(std::list &data) { + if (!listData.empty()) { + listData.clear(); + } + std::list::iterator it; + for (it = data.begin(); it != data.end(); it++) { + listData.push_back(*it); + } +} + +/// @brief +/// @param inView 一个指向已存在的视图对象的指 +/// @param index 要创建的视图在列表中的索引l。 +/// @return 返回该视图对象 +UIView *MessageListAdapter::GetView(UIView *inView, int16_t index) { + // 1.先检查列表数据是否为空,若为空则返回空指针 + if (listData.empty()) { + return nullptr; + } + // 2.接着检查索引是否小于0,若小于0则返回空指针 + if (index < 0) { + return nullptr; + } + // printf("GetView : index %d\r\n", index); + // 3.检查是否超出列表数据大小,若超出则返回空指针 + size_t uindex = index; + if (uindex > listData.size()) + return nullptr; + + MessageItemView *item = nullptr; + if (uindex == listData.size()) { + if (inView == nullptr) { + item = new MessageItemView(); + } else { + item = static_cast(inView); + // item->TearDownChild(); + item->RemoveAll(); + } + InitButtonExt(DeleteButton, 0, 0, 380, 100, DELETEALLDATA, STR_CLEANALL, + 30); + DeleteButton->SetOnClickListener(itemClickListener); + item->Add(DeleteButton); + item->SetViewIndex(index); + item->SetOnClickListener(nullptr); + item->SetHeight(300); + // printf("GetView : item GetHeight %d GetWidth %d\r\n", item->GetHeight(), + // item->GetWidth()); + return item; + } + // 4.通过迭代器访问列表中指定索引位置的元素,将其赋值给itemData变量 + std::list::iterator it = listData.begin(); + for (int i = 0; i < index; i++) { + it++; + } + MessageListItem itemData = *it; + // 5.根据传入的inView参数是否已经存在一个视图对象,若为空则创建一个新的MessageItemView对象,否则将inView转换成MessageItemView类型的指针 + if (inView == nullptr) { + item = new MessageItemView(); + } else { + item = static_cast(inView); + item->TearDownChild(); + item->RemoveAll(); + } + item->SetUpChild(); + item->SetItemInfo(itemData); + item->SetViewIndex(index); + item->SetOnClickListener(itemClickListener); + return item; +} + +void MessageListAdapter::AddListItem(const MessageListItem &item) { + listData.push_back(item); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp new file mode 100644 index 000000000..2dddf4028 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: MessageCardView.cpp + * Author: + * Create: 2021-12-21 + */ + +#include +#include "common/image_cache_manager.h" +#include "ui_resource_image.h" +#include "message/include/MessageCardView.h" +#include "message/include/MessagePresenter.h" +#include "uicomponents/UIComponents.h" +#include "message/include/MessageControlPresenter.h" +namespace OHOS +{ + + static MessageCardView *g_pMessageCardView = nullptr; + static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6; + static constexpr int16_t MORE_LIST_POSITION_X = 43; + static constexpr int16_t MORE_LIST_POSITION_Y = 95; + static constexpr int16_t MORE_SCROLLBLANKSIZE = 35; // 设置此滚动视图的空白大小。 + static constexpr int16 MAX_SCR_DIS = 1000; + static constexpr int16 LIST_POS = 20; + static constexpr int16 SNUM_2 = 2; + static constexpr uint8_t NUM_2 = 2; + + static constexpr char *lineimagePath = "/user/res/message/Line.bin"; + MessageCardView::MessageCardView() + { + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + g_pMessageCardView = this; + } + + MessageCardView::~MessageCardView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageCardView::~MessageCardView()"); + ClearAll(); + g_pMessageCardView = nullptr; + } + + void MessageCardView::ClearAll(void) + { + RemoveAll(); + if (imageline != nullptr) + { + delete imageline; + imageline = nullptr; + } + if (MessageList != nullptr) + { + delete MessageList; + MessageList = nullptr; + } + if(p_MessageListAdapter != nullptr) + { + delete p_MessageListAdapter; + p_MessageListAdapter = nullptr; + } + } + void MessageCardView::AddMessageToList(const MessageListItem &item) + { + p_MessageListAdapter->AddListItem(item); + } + // 初始化页面 + bool MessageCardView::InitPage(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitPage is begin"); + + /*初始化image*/ + InitImageView(imageline, 193, 30, 365, 35, "image", lineimagePath); + Add(imageline); + + // UIList 的适配器 + if(p_MessageListAdapter == nullptr) + { + p_MessageListAdapter = new MessageListAdapter(); + } + + p_MessageListAdapter->SetItemClickListener(MessageControlPresenter::GetInstance()); + if (MessageList == nullptr) + { + MessageList = new UIList(); + } + // MessageList->SetPosition(MORE_LIST_POSITION_X, MORE_LIST_POSITION_Y, 466, 466); + MessageList->SetPosition(MORE_LIST_POSITION_X, MORE_LIST_POSITION_Y, 466, 466); + MessageList->SetThrowDrag(true); + MessageList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + MessageList->SetMaxScrollDistance(1000); // 1000: max scroll distance + MessageList->SetSwipeACCLevel(200); // 800: compensation distance + MessageList->SetDragACCLevel(5); // 5: drag acceleration + MessageList->SetViewId(MAINMESSAGEVIEW); + MessageList->SetOnClickListener((UIView::OnClickListener *)OHOS::MessageControlPresenter::GetInstance()); + MessageList->SetIntercept(true); + + + Add(MessageList); + MessageList->SetAdapter(p_MessageListAdapter); + + // MessageList->RefreshList(); + // SetDraggable(true); + // SetTouchable(true); + + initViewStatus = true; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitPage is end"); + return true; + } + + // 初始化视图为可拖拽,可触摸 + bool MessageCardView::InitView(void *caller) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageCardView InitView %p", caller); + if (InitPage() == false) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitPage fail"); + return false; + } + SetDraggable(true); + SetTouchable(true); + return true; + } + + bool MessageCardView::GetInitViewState(void) + { + return initViewStatus; + } + + MessageCardView *MessageCardView::GetInstance(void) + { + return g_pMessageCardView; + } + void MessageCardView::SetUpView(MessageCardView *messageCardView) + { + /* 加载list */ + MessageModel::GetInstance().InitMessageListItems(); + const MessageListItem *itemInfo = MessageModel::GetInstance().GetMessageListItems(); + uint8_t num = MessageModel::GetInstance().GetMessageCount(); + for (int i = 0; i < num; i++) + { + messageCardView->AddMessageToList(itemInfo[i]); + } + } + void MessageCardView::UpdateMessageCard() + { + } + UIList *MessageCardView::GetList() + { + return MessageList; + } +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp new file mode 100644 index 000000000..2179f2c8b --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp @@ -0,0 +1,75 @@ +/*** + * @Date: 2024-06-22 11:36:16 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-03 14:23:21 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp + */ +/*** + * @Date: 2024-06-22 11:36:16 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-07-25 15:51:56 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp + */ + +#include "message/include/MessageControlPresenter.h" +#include "message/include/MessageControlView.h" +#include "message/include/MessageModel.h" + +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "NativeAbility.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "UiConfig.h" +#include "wearable_log.h" + +#include "uicomponents/UIComponents.h" + +namespace OHOS +{ + bool MessageControlPresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(event); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageControlView::OnClick %s", view.GetViewId()); + + MessageModel &messageModel = MessageModel::GetInstance(); + + if (!messageModel.HasDataVector()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Vector data not loaded."); + return false; + } + + if (strcmp(view.GetViewId(), DELETEALLDATA) == 0) + { + // 执行全部删除操作 + messageModel.ClearAllMessages(); + NativeAbility::GetInstance().Back(); + return true; + } + + // 获取 MessageItemView 并检查索引 + MessageItemView *pMessageItemView = dynamic_cast(&view); + if (!pMessageItemView) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Invalid view type for view ID %s.", view.GetViewId()); + return false; + } + + int index = pMessageItemView->GetMessageListIndex(); + int messageCount = messageModel.GetMessageCount(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Clicked message index: %d, Total messages: %d", index, messageCount); + + if (index >= 0 && index < messageCount) + { + messageModel.SetCurrentIndex(index); + messageModel.SetMessageAsRead(); + NativeAbility::GetInstance().EnterSlice(VIEW_MESSAGE_SHOW); // 切换到详情界面 + return true; + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Index %d is out of bounds.", index); + return false; + } +} // namespace OHOS \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp new file mode 100644 index 000000000..d95047a63 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp @@ -0,0 +1,117 @@ + +#include "message/include/MessageControlView.h" +#include "message/include/MessageControlPresenter.h" +#include "message/include/MessageModel.h" +#include "wearable_log.h" + +namespace OHOS { +static MessageControlView *g_pMessageControlView{nullptr}; +MessageControlView::MessageControlView() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "MessageControlView::MessageControlView()"); + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + g_pMessageControlView = this; +} + +MessageControlView::~MessageControlView() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "MessageControlView::~MessageControlView()"); + if (viewiInitStatus) { + ClearAll(); + } + g_pMessageControlView = nullptr; +} + +MessageControlView *MessageControlView::GetInstance() { + return g_pMessageControlView; +} + +void MessageControlView::ClearAll(void) { + RemoveAll(); + if (messageLackView != nullptr) { + messageLackView->RemoveAll(); + delete messageLackView; + messageLackView = nullptr; + } + if (messageCardView != nullptr) { + messageCardView->RemoveAll(); + delete messageCardView; + messageCardView = nullptr; + } +} + +bool MessageControlView::InitView(void) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageControlView InitView"); + if (messageLackView == nullptr) { + messageLackView = new MessageLackView(); + if (messageLackView == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MessageLackView::new messageLackView fail"); + return false; + } + } + if (messageLackView->CreateUIViewGroup() == false) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateUIViewGroup fail"); + return false; + } + if (messageCardView == nullptr) { + messageCardView = new MessageCardView(); + if (messageCardView == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MessageCardView::new messageCardView fail"); + return false; + } + } + if (messageCardView->InitPage() == false) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitPage fail"); + return false; + } + + Add(messageCardView); + Add(messageLackView); + + isLack = MessageModel::GetInstance().HasDataVector(); + if (!isLack) { + messageCardView->SetVisible(false); + messageLackView->SetVisible(true); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLackView true"); + } else { + messageCardView->SetVisible(true); + messageCardView->SetUpView(messageCardView); + messageCardView->GetList()->RefreshList(); + messageLackView->SetVisible(false); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageCardView true"); + } + return true; +} + +void MessageControlView::SetLackView(bool flag) { + // 避免相同设置多次赋值 + if (flag == isLack) + return; + + isLack = flag; + + if (isLack) { + messageLackView->SetVisible(true); + messageCardView->SetVisible(false); + } else { + messageLackView->SetVisible(false); + messageCardView->SetVisible(true); + } +} + +void MessageControlView::PreLoad(void) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageControlView::PreLoad"); + if (!viewiInitStatus) { + InitView(); + viewiInitStatus = true; + } +} + +void MessageControlView::UnLoad(void) { + // Message's usage scenes is complicated, so we do not release it's resources + // inner slice. + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageControlView::UnLoad"); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp new file mode 100644 index 000000000..f4e7c83e6 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp @@ -0,0 +1,142 @@ +#include "message/include/MessageItemView.h" +#include "message/include/MessageModel.h" +#include "ConfigModel.h" +namespace OHOS +{ + static constexpr const char *ICON_IMAGE = "user/res/message/Icon.bin"; + +#define SELF_ADAPTION 1 +#define RECTANGLE_WIDTH 380 + +// 定义不同大小背景矩形的长度常量 +#define SMALL_RECTANGLE_LENGTH 180 +#define MEDIUM_RECTANGLE_LENGTH 210 +#define BIG_RECTANGLE_LENGTH 240 + +// 定义不同大小标签的长度常量 +#define SMALL_LABEL_LENGTH 30 +#define MEDIUM_LABEL_LENGTH 80 +#define BIG_LABEL_LENGTH 115 + +// 时间的top +#define SMALL_TIMELABEL_LENGTH 110 +#define MEDIUM_TIMELABEL_LENGTH 141 +#define BIG_LABELTIME_LENGTH 173 + + // 定义全局变量 + static int item_length = BIG_RECTANGLE_LENGTH; + static int label_length = BIG_LABEL_LENGTH; + static int time_top = BIG_LABELTIME_LENGTH; + + MessageItemView::MessageItemView() + { + SetPosition(0, 0, RECTANGLE_WIDTH, item_length); + SetStyle(STYLE_BACKGROUND_OPA, 255); + SetStyle(STYLE_BORDER_RADIUS, 20); + SetTouchable(true); + } + + MessageItemView::~MessageItemView() + { + RemoveAll(); + } + + void MessageItemView::SetItemInfo(const MessageListItem itemInfo) + { + sItemInfo = itemInfo; +#if SELF_ADAPTION + // 根据 labeldetails 的大小设置矩形和标签的长度 + // printf("itemInfo.labeldetails.size():%d\r\n", itemInfo.labeldetails.size()); + + if (itemInfo.labeldetails.size() <= 30) // 一行 + { + item_length = SMALL_RECTANGLE_LENGTH; + label_length = SMALL_LABEL_LENGTH; + time_top = SMALL_TIMELABEL_LENGTH; + } + else if (itemInfo.labeldetails.size() > 30 && itemInfo.labeldetails.size() <= 60) // 两行 + { + item_length = MEDIUM_RECTANGLE_LENGTH; + label_length = MEDIUM_LABEL_LENGTH; + time_top = MEDIUM_TIMELABEL_LENGTH; + } + else + { + item_length = BIG_RECTANGLE_LENGTH; + label_length = BIG_LABEL_LENGTH; + time_top = BIG_LABELTIME_LENGTH; + } + /* 自适应消息列表配置 测试中 */ + SetPosition(0, 0, RECTANGLE_WIDTH, item_length); + smessgae.SetPosition(40, 69, 300, label_length); + stime.SetPosition(40, time_top, 300, 33); + sLabelButton.SetPosition(0, 0, 380, item_length - 20); +#endif + sIcon.SetSrc(ICON_IMAGE); + stitle.SetText(itemInfo.labeltitle.c_str()); + smessgae.SetText(itemInfo.labeldetails.c_str()); + stime.SetText(itemInfo.labeltime.c_str()); + // 设置图标可见性 + sIcon.SetVisible(!itemInfo.read); + + // printf("MessageItemView itemInfo %d %s %s\r\n", itemInfo.read, itemInfo.labeltitle.c_str(), itemInfo.labeldetails.c_str(), itemInfo.labeltime.c_str()); + // printf("MessageItemView size %d %d %d\r\n", label_length, item_length, time_top); + } + void MessageItemView::TearDownChild() + { + if (!isSetupChild) + return; + + Remove(&sIcon); + Remove(&stitle); + Remove(&smessgae); + Remove(&stime); + Remove(&sLabelButton); + + isSetupChild = false; + } + void MessageItemView::SetUpChild() + { + if (isSetupChild) + return; + + sIcon.SetPosition(40, 43); + sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + + stitle.SetPosition(60, 31, 280, 35); + stitle.SetTextColor(Color::White()); + stitle.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + // 来回滚动属性 + stitle.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + stitle.SetRollSpeed(23); + + smessgae.SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + smessgae.SetTextColor(Color::Gray()); + smessgae.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + + stime.SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + stime.SetTextColor(Color::Gray()); + stime.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28); + + sLabelButton.SetPosition(0, 0, 380, item_length - 20); + sLabelButton.SetStyle(STYLE_BACKGROUND_COLOR, 0xff303030); + sLabelButton.SetStyle(STYLE_BORDER_RADIUS, 20); + + sLabelButton.SetStyleForState(STYLE_BORDER_RADIUS, 20, UIButton::PRESSED); + sLabelButton.SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); + sLabelButton.SetTouchable(true); + + Add(&sLabelButton); + Add(&sIcon); + Add(&stitle); + Add(&smessgae); + Add(&stime); + + isSetupChild = false; + } + + int MessageItemView::GetMessageListIndex() + { + return sItemInfo.index; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp new file mode 100644 index 000000000..fe01bf486 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp @@ -0,0 +1,96 @@ +/*** + * @Date: 2024-06-19 17:04:20 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-19 18:04:58 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageLackView.cpp + */ +/* + * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved. + * Description: MessageLackView.cpp + * Author: + * Create: 2022-04-02 + */ +#include "UiConfig.h" +#include "wearable_log.h" +#include "message/include/MessageLackView.h" +#include "message/include/MessageModel.h" +#include "uicomponents/UIComponents.h" +namespace OHOS +{ + static constexpr char *lineimagePath = "/user/res/message/Line.bin"; + static constexpr char *messageimagePath = "/user/res/message/message.bin"; + static MessageLackView *g_pMainView = nullptr; + MessageLackView::MessageLackView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView::MessageLackView"); + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + g_pMainView = this; + } + + MessageLackView::~MessageLackView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView::~MessageLackView"); + ClearAll(); + g_pMainView = nullptr; + } + + void MessageLackView::ClearAll(void) + { + RemoveAll(); + if (imageline != nullptr) + { + delete imageline; + imageline = nullptr; + } + if (imagemeage != nullptr) + { + delete imagemeage; + imagemeage = nullptr; + } + if (labelmeage != nullptr) + { + delete labelmeage; + labelmeage = nullptr; + } + } + + MessageLackView *MessageLackView::GetInstance(void) + { + return g_pMainView; + } + + bool MessageLackView::CreateUIViewGroup(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView::CreateUIViewGroup"); + + /*初始化label*/ + InitRollLabel(labelmeage, 53, 276, 360, 40, "labelMessage", STR_MESSAGENO, DEFAULT_VECTOR_FONT_FILENAME, 30); + labelmeage->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff)); + /*初始化image*/ + InitImageView(imageline, 193, 30, 365, 35, "image", lineimagePath); + InitImageView(imagemeage, 183, 156, 100, 100, "image", messageimagePath); + + Add(imageline); + Add(imagemeage); + Add(labelmeage); + + SetDraggable(false); + SetTouchable(false); + initViewStatus = true; + return true; + } + + bool MessageLackView::InitView(void *caller) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView InitView %p", caller); + bool ret = CreateUIViewGroup(); + if (ret == false) + { + return false; + } + SetDraggable(true); + SetTouchable(true); + return true; + } + +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp new file mode 100644 index 000000000..86a2f5d4b --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp @@ -0,0 +1,1109 @@ +/* + * @Date: 2024-06-21 09:56:18 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-10-11 19:05:25 + * @FilePath: + * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp + */ + +#include "message/include/MessageModel.h" +#include "AppViewIDs.h" +#include "ConfigModel.h" +#include "MainModel.h" +#include "MainViewSample.h" +#include "NativeAbility.h" +#include "UiConfig.h" + +// #include "bleANCS.h" + +#include "broadcast_feature.h" +#include "broadcast_service.h" +#include "cJSON.h" +#include "common/image_cache_manager.h" +#include "custom_runtime.h" +#include "custom_utils.h" +#include "samgr_lite.h" +#include "thread_adapter.h" +#include "ui_resource_image.h" +#include "wearable_log.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "message/include/MessageCardView.h" +#include "message/include/MessageControlView.h" +#include "message/include/MessageView.h" + +// #include "traing/include/TraingModel.h" + +#define MESSAGE_JSON_FILE "user/userdata/ancs.json" +#define MESSAGE_JSON_DIR "user/userdata/message/" +#define PRINTFDATA 0 + +// #include "message_notification.h" +#include "msg_center.h" +#include "notification_manager.h" + +extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, + char date_separator, char time_separator, + date_format_t format); + +// #include "msg_center_customerC.h" + +// void show_notify_messgae() { +// // printf("show_notify_messgae\n"); +// OHOS::NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE); +// OHOS::NotificationManager::GetInstance()->ShowNotify( +// OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true); +// } + +#ifdef __cplusplus +extern "C" { +#endif + +static void Notify(void *args, const Topic topic, Request *request); + +using namespace OHOS; + +Subscriber MessageSubscirber = { + .identity = NULL, + .args = NULL, + .Notify = Notify, +}; + +void MessageSubscribeTopic(Topic topic) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "stepsubscribeTopic, topic=%u", topic); + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, + BROADCAST_FEATURE_NAME); + if (api == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "stepsubscribeTopic, GetFeatureApi failed"); + return; + } + int result = + api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "stepsubscribeTopic, QueryInterface failed"); + return; + } + broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, + &MessageSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); +} + +void MessageUnsubscribeTopic(Topic topic) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageUnsubscribeTopic, topic=%u", + topic); + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, + BROADCAST_FEATURE_NAME); + if (api == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MessageUnsubscribeTopic, GetFeatureApi failed"); + return; + } + int result = + api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MessageUnsubscribeTopic, QueryInterface failed"); + return; + } + broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, + &MessageSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); +} + +// 存储消息更新的定时器 +static uint32_t messageTimestamp = 0; + +static void Notify(void *args, const Topic topic, Request *request) { + UNUSED(args); + UNUSED(topic); + + if (request == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL request"); + return; + } + + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", request->msgId); + + // if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + // "Processing TOPIC_EVENT_MESSAGE_UPDATA"); + + // if (request->data == NULL) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL data"); + // return; + // } + + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", + // request->msgId); + // ancs_data_info_t *messageInfo = (ancs_data_info_t *)request->data; + // ancs_data_info_t messageInfo_; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo"); + + // messageInfo_.title = (char *)malloc(messageInfo->titlelen + 1); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo.title"); + // if (messageInfo_.title == NULL) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + // "Failed to allocate memory for title"); + // return; + // } + + // memcpy(messageInfo_.title, messageInfo->title, messageInfo->titlelen); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "memcpy"); + // messageInfo_.title[messageInfo->titlelen] = '\0'; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + // "messageInfo.title[messageInfo->titlelen]"); + // messageInfo_.msg = (char *)malloc(messageInfo->msglen + 1); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo_.msg"); + // if (messageInfo_.msg == NULL) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + // "Failed to allocate memory for message"); + // free(messageInfo_.title); // Free previously allocated title + // return; + // } + + // memcpy(messageInfo_.msg, messageInfo->msg, messageInfo->msglen); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + // "messageInfo.msg[messageInfo->msglen]"); + // messageInfo_.msg[messageInfo->msglen] = '\0'; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + // "messageInfo_.msg[messageInfo->msglen end"); + + // messageInfo_.appid = messageInfo->appid; + // messageInfo_.uid = messageInfo->uid; + // messageInfo_.time = messageInfo->time; + // messageInfo_.read = 0; + + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "message_data %p %p\r\n", + // messageInfo_.title, messageInfo_.msg); + + // MessageModel::GetInstance().AddMessageData(&messageInfo_); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddMessageData"); + + // // uint32_t currentTimestamp = OHOS::TraingModel::GetInstance()->get_current_time(); + // uint32_t currentTimestamp = 0; + // if (currentTimestamp - messageTimestamp <= 1) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageTimestamp too short"); + // free(messageInfo_.title); + // free(messageInfo_.msg); + // return; + // } + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get_current_time end"); + + // messageTimestamp = currentTimestamp; + + // /* + // 以下状态不进行消息弹窗 + // -训练中 + // -省电模式 + // -呼吸训练中 + // -使用语音助手 + // */ + // if (uapi_dev_runtime_get_train_status() || + // uapi_dev_runtime_get_saveele_status() || + // uapi_dev_runtime_get_respiratory_training_status() || + // uapi_dev_runtime_get_voice_status()) { + + // free(messageInfo_.title); + // free(messageInfo_.msg); + // return; + // } + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "status end"); + + // CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0); + + // // show_notify_messgae(); + + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Message popup sent"); + + // free(messageInfo_.title); + // free(messageInfo_.msg); + // } +} +void saveancsdata() { + // printf("saveancs\r\n"); + OHOS::MessageModel::GetInstance().SaveMessagesToStorage(); + return; +} + +#ifdef __cplusplus +} +#endif + +namespace OHOS { +MessageModel::MessageModel() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageModel"); + // LoadMessagesFromStorage(); +} +MessageModel::~MessageModel() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageModel::~MessageModel()"); + MessageUnsubscribeTopic(TOPIC_EVENT_MESSAGE_UPDATA); // 取消订阅 +} +MessageModel &MessageModel::GetInstance() { + static MessageModel instance; + return instance; +} + +void MessageModel::at_message_test() { + // // Initialize timestamp + // uint32_t timestamp = 0; + // if (uapi_get_timestampe_ss(×tamp) != ERRCODE_SUCC) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); + // return; + // } + + // ancs_data_info_t data; + // const char *title = "title"; // Assuming title and msg are defined elsewhere + // const char *msg = "message"; + + // data.title = (char *)malloc(strlen(title) + 1); + // data.msg = (char *)malloc(strlen(msg) + 1); + + // if (data.title == NULL || data.msg == NULL) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failed"); + // free(data.title); // Free previously allocated memory + // free(data.msg); + // return; + // } + + // strcpy(data.title, title); + // strcpy(data.msg, msg); + + // data.appid = 0; + // data.uid = 0; + // data.time = timestamp; + // data.read = 0; + // data.hasCode = 1; + + // data.msglen = strlen(msg); + // data.titlelen = strlen(title); + + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "message_data %s %s\r\n", data.title, + // data.msg); + + // CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA, (uint8_t *)&data, + // sizeof(ancs_data_info_t)); + + // free(data.title); + // free(data.msg); + + // Simulate message push notification (if needed) + // OHOS::NotificationManager::GetInstance()->ShowNotify( + // OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true); +} + +void MessageModel ::Init() { + MessageSubscribeTopic(TOPIC_EVENT_MESSAGE_UPDATA); // 进行消息订阅 +} +// 获取消息列表项 +const MessageListItem *MessageModel::GetMessageListItems() const { + return Messages; +} + +// 获取消息数量 +uint8_t MessageModel::GetMessageCount() const { return numberOfItems; } + +// 加载Message文件 +bool MessageModel::LoadMessagesFromStorage() { + // 加载消息过滤文件 + // filtration_file_read(); + + std::ifstream file(MESSAGE_JSON_FILE); + if (!file.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for reading"); + return false; + } + + std::string fileContent((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + file.close(); + + cJSON *root = cJSON_Parse(fileContent.c_str()); + if (!root) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error parsing JSON file"); + return false; // JSON 解析失败,直接返回 + } + + cJSON *messageArray = cJSON_GetObjectItem(root, "messages"); + if (!messageArray || !cJSON_IsArray(messageArray)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid data format in JSON file"); + cJSON_Delete(root); + return false; // 无效的消息数组,直接返回 + } + + // 清空现有数据 + // MessageVector.clear(); + + // 将JSON数据转换为MessageData并添加到消息数组中 + int dataCount = cJSON_GetArraySize(messageArray); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dataCount is %d", dataCount); + + for (int i = 0; i < dataCount; i++) { + cJSON *item = cJSON_GetArrayItem(messageArray, i); + if (!item) // 检查数组项是否有效 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid item at index %d", i); + cJSON_Delete(root); + return false; // 找到无效项,直接返回 + } + + // 验证并获取各字段 + cJSON *isRead = cJSON_GetObjectItem(item, "isRead"); + cJSON *labelDetails = cJSON_GetObjectItem(item, "labelDetails"); + cJSON *labelTitle = cJSON_GetObjectItem(item, "labelTitle"); + cJSON *timestamp = cJSON_GetObjectItem(item, "timestamp"); + + // 检查必要字段是否存在 + if (!isRead || !cJSON_IsBool(isRead) || !timestamp || + !cJSON_IsNumber(timestamp)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Invalid message format at index %d", i); + cJSON_Delete(root); + return false; // 找到无效数据格式,直接返回 + } + + // 如果所有必要字段有效,则解析并构造 MessageData + MessageData data; + data.isRead = cJSON_IsTrue(isRead); + + // 允许 labelDetails 和 labelTitle 字段为空字符串 + data.labelDetails = (labelDetails && cJSON_IsString(labelDetails)) + ? labelDetails->valuestring + : ""; + data.labelTitle = (labelTitle && cJSON_IsString(labelTitle)) + ? labelTitle->valuestring + : ""; + data.timestamp = timestamp->valuedouble; + + // 处理时间字符串 + char labelTime[20]; + if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', + DATE_Y_M_D_H_M) != ERRCODE_SUCC) { + data.labelTime = std::string("--"); + } else { + data.labelTime = std::string(labelTime); + } + + MessageVector.push_back(data); + } + + cJSON_Delete(root); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Messages loaded from storage successfully"); + return true; // 所有消息成功加载 +} +// 保存Message文件 +bool MessageModel::SaveMessagesToStorage() { + // 消息过滤文件保存 + // filtration_file_save(); + if (MessageVector.empty()) { + // 清空文件 + std::ofstream file(MESSAGE_JSON_FILE, + std::ofstream::out | std::ofstream::trunc); + if (file.is_open()) { + file.close(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MessageVector is empty, existing file was cleared"); + return true; + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "MessageVector is empty,Failed to open file for writing"); + return false; + } + } + + cJSON *root = cJSON_CreateObject(); + cJSON *messageArray = cJSON_CreateArray(); + + for (const auto &data : MessageVector) { + cJSON *item = cJSON_CreateObject(); + cJSON_AddBoolToObject(item, "isRead", data.isRead); + cJSON_AddStringToObject(item, "labelDetails", data.labelDetails.c_str()); + cJSON_AddStringToObject(item, "labelTitle", data.labelTitle.c_str()); + cJSON_AddNumberToObject(item, "timestamp", data.timestamp); + + cJSON_AddItemToArray(messageArray, item); + } + + cJSON_AddItemToObject(root, "messages", messageArray); + + std::ofstream file(MESSAGE_JSON_FILE, + std::ofstream::out | std::ofstream::trunc); + if (!file.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing"); + cJSON_Delete(root); + return false; + } + + char *jsonData = cJSON_Print(root); + file << jsonData << std::endl; + file.close(); + cJSON_free(jsonData); + cJSON_Delete(root); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Messages saved to storage successfully"); + return true; +} +// 初始化列表 +void MessageModel::InitMessageListItems() { + bool unread_state = false; // 初始化未读状态 + numberOfItems = MessageVector.size(); // 获取 MessageVector 的大小 + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前的项数是 %d", numberOfItems); + if (numberOfItems == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageVector is empty"); + return; + } + // 从 MessageVector 的末尾开始迭代 + for (int i = numberOfItems - 1, count = 0; + i >= 0 && count < MaxMessageListCount; i--, count++) { + const auto &msg = MessageVector[i]; // 使用引用避免复制 + + // 检查消息是否已读 + if (!msg.isRead) + unread_state = true; + + // 填充 Messages 数组 + Messages[count] = {count, msg.isRead, msg.labelTitle, msg.labelDetails, + msg.labelTime}; + } + + // 更新未读状态 + ConfigModel::GetInstance()->set_condigData_Bool( + ConfigModel::CONFIGMODEL_ITEM_MESSAGE_UNREAD, unread_state); +} +// 设置当前项[数组下标] +void MessageModel::SetCurrentIndex(uint8_t index) { + if (index < 0 || index > MaxMessageListCount) + return; + numberOfItems = MessageVector.size(); + currentIndex_ = numberOfItems - index - 1; +} + +// 获取当前项[数组下标] +uint8_t MessageModel::GetCurrentIndex() { return currentIndex_; } + +// 增加消息项[添加数组项] +// void MessageModel::AddMessageData(ancs_data_info_t *messageInfo) { +// if (messageInfo == nullptr) { +// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo is null"); +// return; +// } + +// // 创建并填充 MessageData +// MessageData data; +// data.isRead = messageInfo->read; +// data.labelDetails = messageInfo->msg ? messageInfo->msg : ""; +// data.labelTitle = messageInfo->title ? messageInfo->title : ""; +// data.timestamp = messageInfo->time; + +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, +// "AddMessageData data.isRead is %d, data.labelDetails is %s, " +// "data.labelTitle is %s, data.timestamp is %u", +// data.isRead, data.labelDetails.c_str(), data.labelTitle.c_str(), +// data.timestamp); + +// // 处理时间字符串 +// char labelTime[20]; +// if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != +// ERRCODE_SUCC) { +// data.labelTime = "--"; // 默认值 +// } else { +// data.labelTime = labelTime; // 直接使用 labelTime +// } + +// // 添加数据到消息向量 +// MessageVector.push_back(data); + +// // 删除多余的数据 +// if (MessageVector.size() > MaxMessageListCount) { +// MessageVector.erase(MessageVector.begin(), +// MessageVector.begin() + +// (MessageVector.size() - MaxMessageListCount)); +// } + +// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo add is ok"); +// } + +// 获取目前的项 +MessageData *MessageModel::GetCurrentMessageData() { + if (currentIndex_ < MessageVector.size()) { + return &MessageVector[currentIndex_]; + } + return nullptr; +} + +// 设置当前项已读 +bool MessageModel::SetMessageAsRead() { + if (currentIndex_ < MessageVector.size()) { + MessageVector[currentIndex_].isRead = true; + return true; + } + return false; +} + +// 删除当前项[删除数组的当前项] +bool MessageModel::DeleteCurrentMessage() { + if (currentIndex_ < MessageVector.size()) { + MessageVector.erase(MessageVector.begin() + currentIndex_); + return true; + } + return false; +} + +// 删除所有数据[清空数组] +bool MessageModel::ClearAllMessages() { + MessageVector.clear(); + return true; +} + +// 获取最新信息[数组的最后一个] +MessageData *MessageModel::GetNewMessage() { + if (!MessageVector.empty()) { + return &MessageVector.back(); + } + return nullptr; +} +// 判断数组是否存在数据 +bool MessageModel::HasDataVector() { + // 检查 MessageVector 是否为空 + bool hasData = !MessageVector.empty(); + + // 如果没有数据,更新未读状态为 false + if (!hasData) { + ConfigModel::GetInstance()->set_condigData_Bool( + ConfigModel::CONFIGMODEL_ITEM_MESSAGE_UNREAD, false); + } + + return hasData; // 返回是否有数据 +} + +// 设置弹窗状态 +void MessageModel::SetPopupViewState(bool state) { popupViewState_ = state; } + +// 获取弹窗状态 +bool MessageModel::GetPopupViewState() { return popupViewState_; } +void MessageModel::UpdateMessageView() { + // 更新主界面卡片 + if (MessageControlView::GetInstance() && MainViewSample::GetInstance()) { + // 配置主界面回退界面 + CardId Id = MainViewSample::GetInstance()->GetHorCurrentCard(); + MainModel::GetInstance().SetFromSetCardView(true); + MainModel::GetInstance().SetFromCardId(Id); + + NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); + return; + } + + // 更新Message界面 + auto messageView = MessageView::GetInstance(); + if (messageView) // 检查Message界面实例 + { + NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateListView: MessageView instance is nullptr"); + } +} + +} // namespace OHOS + +#if 0 + uint8_t MessageModel::GetMessageCount() const + { + return (numberOfItems != 0 ? numberOfItems : MaxMessageListCount); + } + /* -------------------------------------------------------------------------- */ + void MessageModel::PrintData(MessageData messagedata) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Title: %s", (messagedata.labelTitle).c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Details: %s", (messagedata.labelDetails).c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Time: %s", (messagedata.labelTime).c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Read: %d", messagedata.isRead); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------"); + } + /*打印文件名数组*/ + void PrintFileName(const std::vector &filenames) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Filenames:"); + for (const auto &filename : filenames) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s", filename.c_str()); + } + } + + /*打印message数组*/ + void PrintMessageData(const std::vector &MessageVector) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageVector:"); + for (const auto &message : MessageVector) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title: %s", message.labelTitle.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Details: %s", message.labelDetails.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timestamp: %d", message.timestamp); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IsRead: %d", message.isRead); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, ""); + } + } + /*打印map*/ + void PrintMessageMap(const std::map &messageMap) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMap:"); + for (const auto &pair : messageMap) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Key: %d, Value: %s", pair.first, pair.second.c_str()); + } + } + /* -------------------------------------------------------------------------- */ + /*检查是否存在数据*/ + bool MessageModel::HasDataJson() + { + // 打开消息数据目录 + DIR *dir = opendir(MESSAGE_JSON_DIR); + if (dir == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open MESSAGE_JSON_DIR"); + jsonDataExists = false; + return false; + } + + // 在作用域结束时自动关闭目录 + struct DirCloser + { + void operator()(DIR *d) const + { + if (d) + closedir(d); + } + }; + std::unique_ptr dirPtr(dir); + + // 检查目录是否为空 + struct dirent *ent; + // 是否存在文件标志位 + bool isEmpty = true; + while ((ent = readdir(dir)) != nullptr) + { + // 过滤掉当前目录和上级目录 + if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) + { + continue; + } + // 普通文件 + if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) + { + isEmpty = false; + break; + } + } + + if (isEmpty) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No data files found in MESSAGE_JSON_DIR"); + jsonDataExists = false; + return false; + } + + jsonDataExists = true; + return true; + } + + /*加载json函数*/ + /* + 加载messagejson文件夹 MESSAGE_JSON_DIR + 文件夹里面的文件[一条数据]一个文件 按序号命名,0.json 1.json 2.json... + 需要建立一个文件名和数组下标对应的map ->方便进行对文件操作? + 最多加载10条数据(先按序号排序??) + 如果还有多余的遍历删除序号最小的文件(消息最早的) + 获取到一个 MessageData 数组返回 + + 1.遍历文件夹的每一个文件 排序 + 2.先加载? + 3.每次加载一个文件 更新一下map + 4.超过10条。后面的文件直接删除 + 5.返回数组 + */ + + /*遍历文件夹*/ + std::vector GetFileNamesInDirectory(const std::string &directory) + { + std::vector filenames; + DIR *dir; + struct dirent *ent; + if ((dir = opendir(directory.c_str())) != nullptr) + { + while ((ent = readdir(dir)) != nullptr) + { + std::string fileName = ent->d_name; + if (fileName != "." && fileName != "..") + { + // 2.遍历文件夹里面的文件名生成文件名数组 + if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) // 普通文件 + { + fileName = directory + fileName; + filenames.push_back(fileName); + // printf("GetFileNamesInDirectory:%s\r\n", fileName.c_str()); + } + else if (ent->d_type == DT_DIR) // 目录 + { + continue; + } + } + } + closedir(dir); + return filenames; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s is null!", directory.c_str()); + return filenames; + } + + /*文件名数组 删除多余项*/ + void MessageModel::DeleteExcessFiles(std::vector &filenames) + { + if (filenames.size() > MaxMessageListCount) + { + int numFilesToDelete = filenames.size() - MaxMessageListCount; + for (int i = 0; i < numFilesToDelete; i++) + { + std::remove(filenames[i].c_str()); // 删除文件 + filenames.erase(filenames.begin() + i); // 从数组中删除相应的文件名 + } + } + } + + /*message json 加载*/ + std::vector MessageModel::LoadMessageData() + { + std::vector MessageVector; // 返回的数据列表 + std::vector filenames; // 文件名数组 + + // 1.检查消息目录是否存在 + filenames = GetFileNamesInDirectory(MESSAGE_JSON_DIR); + // 3.检查文件夹是否为空 + if (filenames.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message directory is empty"); + return MessageVector; + } + + // 4.文件名排序 + // std::sort(filenames.begin(), filenames.end()); + + // 5.文件数量超出限制删除多余文件 + DeleteExcessFiles(filenames); // 删除多余文件 + + // 6.解析json + for (int i = 0; i < filenames.size(); i++) + { + std::ifstream file((filenames[i])); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open file %s ", filenames[i].c_str()); + continue; // 跳过当前文件 + } + + std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + cJSON *root = cJSON_Parse(jsonData.c_str()); + if (root == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file %s ", filenames[i].c_str()); + continue; // 跳过当前文件 + } + + MessageData messagedata; + + messagedata.labelTitle = cJSON_GetObjectItem(root, "title")->valuestring; + messagedata.labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring; + messagedata.isRead = cJSON_GetObjectItem(root, "read")->valueint; + + // 获取时间 + uint32 timestamp = cJSON_GetObjectItem(root, "time")->valueint; + messagedata.timestamp = timestamp; + char labelTime[20]; + if (uapi_get_TIME_STR(timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC) + { + messagedata.labelTime = std::string("2024.1.1 00:00"); + } + else + { + messagedata.labelTime = std::string(labelTime); + } + + // 生成json数组数组 + MessageVector.push_back(messagedata); + // 维护map 映射文件名和数组下标 + fileIndexMap[i] = filenames[i]; + cJSON_Delete(root); + } + +#if PRINTFDATA + PrintFileName(filenames); + PrintMessageData(MessageVector); + PrintMessageMap(fileIndexMap); +#endif + return MessageVector; + } + + void MessageModel::InitMessageListItems() + { + // 读取json数据 + std::vector messageVector = LoadMessageData(); + if (!messageVector.empty()) + { + numberOfItems = messageVector.size(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "the numberOfItems is %d", numberOfItems); + for (int i = numberOfItems - 1, count = 0; i >= 0 && count < MaxMessageListCount; i--, count++) + { + MessageData messageData; + messageData.isRead = messageVector[i].isRead; + messageData.labelTitle = messageVector[i].labelTitle; + messageData.labelDetails = messageVector[i].labelDetails; + messageData.labelTime = messageVector[i].labelTime; + // PrintData(messageData); + // 获取是否读取 来信 信息内容 时间 + Messages[count] = {count, messageData.isRead, messageData.labelTitle, messageData.labelDetails, messageData.labelTime}; + } + } + } + + const MessageListItem *MessageModel::GetMessageListItems() const + { + return Messages; + } + + bool MessageModel::GetJsonLoadStatus() + { + return jsonDataExists; + } + + // 设置当前界面 + void MessageModel::SetPopupViewState(bool state) + { + popupViewState = state; + } + + // 获取当前界面 0:没有记录 | 1:有记录 + bool MessageModel::GetPopupViewState() + { + return popupViewState; + } + + /*保存json数据*/ + void MessageModel::SaveMessageData(const MessageData data, const int index) + { + cJSON *root = cJSON_CreateObject(); + + cJSON *item = cJSON_CreateObject(); + cJSON_AddStringToObject(item, "title", data.labelTitle.c_str()); + cJSON_AddStringToObject(item, "msg", data.labelDetails.c_str()); + cJSON_AddNumberToObject(item, "time", data.timestamp); + cJSON_AddNumberToObject(item, "read", data.isRead); + + std::string jsonString = cJSON_Print(root); + cJSON_Delete(root); + + std::ofstream file(fileIndexMap[index]); + if (file.is_open()) + { + file << jsonString; + file.close(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveMessageData is ok"); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing"); + } + } + + // 获取目前的message + MessageData *MessageModel::GetCurrentMessageData() + { + PrintData(message_); + return &message_; + } + + // 设置目前的message + void MessageModel::SetCurrentMessageData(MessageData *data) + { + if (data != nullptr) + { + message_.labelDetails = data->labelDetails; + message_.labelTime = data->labelTime; + message_.labelTitle = data->labelTitle; + message_.isRead = data->isRead; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetMessageData is ok"); + } + } + + // 清除所有数据[删除文件夹内所有文件] + bool MessageModel::ClearAllData() + { + // 遍历fileIndexMap并删除对应文件 + for (auto it = fileIndexMap.begin(); it != fileIndexMap.end(); ++it) + { + std::string filePath = it->second; + uapi_delete_files(filePath.c_str()); + } + + // 清空fileIndexMap + fileIndexMap.clear(); + + return true; // 表示清除操作成功 + } + + // 删除单个项 [通过 map 删除] + bool MessageModel::DeleteSingleItem(int currentIndex) + { + if (currentIndex < 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid index for deletion: Index is less than 0"); + return false; + } + + auto it = std::next(fileIndexMap.begin(), currentIndex); + if (it == fileIndexMap.end()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Item at index not found"); + return false; + } + + // 删除文件 + uapi_delete_files(it->second.c_str()); + + // 删除对应项 + fileIndexMap.erase(it); + + return true; + } + // 设置当前项已读 + bool MessageModel::SetMessageIsread() + { + // 1.找到对应的项文件 + if (fileIndexMap.find(indexCurrent) == fileIndexMap.end()) + { + // 检查索引是否存在于map中 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Index not found in fileIndexMap"); + return false; + } + std::ofstream file(fileIndexMap[indexCurrent]); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "filename is error"); + return false; + } + + // 2.获取文件内容 + std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + if (jsonData.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData is null"); + return false; + } + + // 3.设置属性已读 + cJSON *root = cJSON_Parse(jsonData.c_str()); + if (root == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file"); + return false; + } + + // 4.更新数据并保存文件 + cJSON_ReplaceItemInObject(root, "isRead", cJSON_CreateNumber(1)); // 将"isRead"属性值设为1,表示已读 + + // 5.重新生成 JSON 字符串 + char *updatedJsonData = cJSON_Print(root); + + // 6.打开文件以写入更新后的数据 + outFile.open(fileIndexMap[indexCurrent]); + if (outFile.is_open()) + { + outFile << updatedJsonData; // 将更新后的 JSON 数据写入文件 + outFile.close(); + cJSON_free(updatedJsonData); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file for writing"); + cJSON_free(updatedJsonData); + cJSON_Delete(root); + return false; + } + // 释放 JSON 对象内存 + cJSON_Delete(root); + return true; + } + // 获取最新消息项 + MessageData *MessageModel::GetNewestData(int index) + { + // 打开文件 + std::string filename = MESSAGE_JSON_DIR + std::to_string(index) + ".json"; + std::ifstream file(filename); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file"); + return nullptr; + } + + // 获取文件内容 + std::string jsonData((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + if (jsonData.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: File is empty"); + return nullptr; + } + + // 解析JSON数据 + cJSON *root = cJSON_Parse(jsonData.c_str()); + if (root == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file"); + return nullptr; + } + + // 创建MessageData对象并设置属性 + MessageData *data = new MessageData(); + data->labelTitle = cJSON_GetObjectItem(root, "title")->valuestring; + data->labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring; + data->isRead = cJSON_GetObjectItem(root, "read")->valueint; + data->timestamp = cJSON_GetObjectItem(root, "time")->valueint; + + // 释放资源并返回数据 + cJSON_Delete(root); + return data; + } + // 设置当前项 + void MessageModel::SetCurrentIndex(uint8_t index) + { + indexCurrent = index; + } + // 获取当前项 + uint8_t MessageModel::GetCurrentIndex() + { + return indexCurrent; + } +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp new file mode 100644 index 000000000..dee2b4868 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp @@ -0,0 +1,155 @@ + + +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" + +#include "message/include/MessagePresenter.h" +#include "message/include/MessageAdapter.h" +#include "message/include/MessageItemView.h" +#include "components/ui_abstract_scroll_bar.h" +#include "gfx_utils/graphic_log.h" +#include "wearable_log.h" +#include "NativeAbility.h" +#include "common/key_code.h" +#include "KeyInputListener.h" +#include "custom_utils.h" +#include "gfx_utils/mem_check.h" + +#include "NativeRegisterManager.h" +namespace OHOS +{ + + REGIST_MENU_PRO(VIEW_MESSAGE, MessageView, MessagePresenter, + PNG_APPLIST_MESSAGE_IMAGE_BIG, PNG_APPLIST_MESSAGE_IMAGE,PNG_APPLIST_MESSAGE_IMAGE, "消息通知", STR_MESSAGE_NOTIFICATION); + + // 当前Presenter属性实例化的内存指针 + static MessagePresenter *g_pMessagePresenter = nullptr; + + MessagePresenter::MessagePresenter() + { + model = &MessageModel::GetInstance(); + g_pMessagePresenter = this; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(true); +#endif + } + + MessagePresenter::~MessagePresenter() + { + g_pMessagePresenter = nullptr; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(false); +#endif + } + + MessagePresenter *MessagePresenter::GetInstance() + { + return g_pMessagePresenter; + } + + void MessagePresenter::OnStart() + { + model->InitMessageListItems(); + Presenter::OnStart(); + } + + void MessagePresenter::OnPause(void) + { + Presenter::OnPause(); + } + void MessagePresenter::OnResume(void) + { + if (view_ == nullptr) + { + return; + } + + if (model->GetPopupViewState()) + { + const MessageListItem *itemInfo = model->GetMessageListItems(); + for (int i = 0; i < model->GetMessageCount(); i++) + { + view_->AddMessageToList(itemInfo[i]); + } + } + + Presenter::OnResume(); + } + + void MessagePresenter::OnStop(void) + { + Presenter::OnStop(); + } + + bool MessagePresenter::OnDrag(UIView &view, const DragEvent &event) + { + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && + (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY())))) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + if(event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) + { + NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); + } + return true; + } + + bool MessagePresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(event); + if (MessageModel::GetInstance().GetPopupViewState()) + { + if (!(model->HasDataVector())) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Vector data not loaded."); + return false; + } + + if (strcmp(view.GetViewId(), DELETEALLDATA) == 0) + { + // 执行全部删除操作 + model->ClearAllMessages(); + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + return true; + } + + // 获取 MessageItemView 并检查索引 + MessageItemView *pMessageItemView = dynamic_cast(&view); + if (!pMessageItemView) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error: Invalid view type for view ID %s.", view.GetViewId()); + return false; + } + + int index = pMessageItemView->GetMessageListIndex(); + int messageCount = model->GetMessageCount(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Clicked message index: %d, Total messages: %d", index, messageCount); + + if (index >= 0 && index < messageCount) + { + model->SetCurrentIndex(index); + model->SetMessageAsRead(); + NativeAbility::GetInstance().EnterSlice(VIEW_MESSAGE_SHOW); // 切换到详情界面 + return true; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error: Index %d is out of bounds.", index); + } + + return false; + } + + bool MessagePresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + unsigned short keyID = event.GetKeyId(); + unsigned short keyState = event.GetState(); + // 如果是power键,且是亮屏状态,按键释放就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } + +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp new file mode 100644 index 000000000..33cb8be31 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp @@ -0,0 +1,101 @@ +/*** + * @Date: 2024-06-17 19:39:36 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-03 14:19:43 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageShowPresenter.cpp + */ + +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "NativeAbility.h" +#include "message/include/MessageShowPresenter.h" +#include "components/ui_abstract_scroll_bar.h" +#include "gfx_utils/graphic_log.h" +#include "wearable_log.h" + +#include "common/key_code.h" +#include "KeyInputListener.h" +#include "custom_utils.h" +#include "NativeRegisterManager.h" + +namespace OHOS +{ + REGIST_SLICE(VIEW_MESSAGE_SHOW, MessageShowView, MessageShowPresenter); + + // 当前Presenter属性实例化的内存指针 + static MessageShowPresenter *g_pMessageShowPresenter = nullptr; + + MessageShowPresenter::MessageShowPresenter() + { + g_pMessageShowPresenter = this; + } + + MessageShowPresenter::~MessageShowPresenter() + { + g_pMessageShowPresenter = nullptr; + } + + MessageShowPresenter *MessageShowPresenter::GetInstance() + { + return g_pMessageShowPresenter; + } + + void MessageShowPresenter::OnStart() + { + Presenter::OnStart(); + } + + void MessageShowPresenter::OnPause(void) + { + Presenter::OnPause(); + } + + void MessageShowPresenter::OnResume(void) + { + Presenter::OnResume(); + } + + void MessageShowPresenter::OnStop(void) + { + Presenter::OnStop(); + } + + bool MessageShowPresenter::OnDrag(UIView &view, const DragEvent &event) + { + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && + (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY())))) + { + // NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE); + NativeAbility::GetInstance().Back(); + } + return true; + } + + bool MessageShowPresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(event); + if (strcmp(view.GetViewId(), DELETEBUTTON) == 0) + { + // 删除当前项 + MessageModel::GetInstance().DeleteCurrentMessage(); + + // NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE); + NativeAbility::GetInstance().Back(); + } + return true; + } + + bool MessageShowPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + unsigned short keyID = event.GetKeyId(); + unsigned short keyState = event.GetState(); + // 如果是power键,且是亮屏状态,按键释放就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp new file mode 100644 index 000000000..49e8c5680 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp @@ -0,0 +1,282 @@ +/*** + * @Date: 2024-06-17 19:40:11 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-17 20:20:46 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageShowView.cpp + */ + +#include "message/include/MessageShowView.h" +#include "message/include/MessageShowPresenter.h" +#include "message/include/MessageModel.h" + +#include "UiConfig.h" +#include "wearable_log.h" +#include "uicomponents/UIComponents.h" +#include "string" +namespace OHOS +{ + // 定义按键颜色宏 +#define DEFAULT_BACKGROUND_COLOR 0xff191919 +#define PRESSED_BACKGROUND_COLOR 0xff249115 +#define PRESSED_BORDER_COLOR 0xff0b1928 + + static MessageShowView *g_pMessageShowView{nullptr}; + static constexpr const int kTitlePosX = 73; + static constexpr const int kTitlePosY = 60; + static constexpr const int kTitleWidth = 320; + static constexpr const int kTitleHeight = 35; + static constexpr const int kTitleFontSize = 30; + static constexpr const char *kTitleViewId = "title"; + // static constexpr const Color kTitleTextColor = Color::White(); + + static constexpr const int kTimePosX = 73; + static constexpr const int kTimePosY = 104; + static constexpr const int kTimeWidth = 320; + static constexpr const int kTimeHeight = 33; + static constexpr const int kTimeFontSize = 28; + static constexpr const char *kTimeViewId = "time"; + + // 配置默认值 + static constexpr const int defaultRectWidth = 100; + static constexpr const int defaultLabelWidth = 40; + // static constexpr const Color kTimeTextColor = Color::Gray(); +#if 0 + std::string titleStr = "12306中国高速铁路"; + std::string timeStr = "2023.12.26 17:23"; + std::string messageStr = "【铁路12306】系统已自动为您生成订单EC09828333,04月23日G2231次,深圳北站13:31开。请您在2小时内完成支付。您可通过以下链接进行支付。https://www.12306.cn/index/"; +#endif + + MessageShowView::MessageShowView() + { + g_pMessageShowView = this; + } + + MessageShowView::~MessageShowView() + { + if (viewInitStatus == true) + { + DeInitView(); + } + g_pMessageShowView = nullptr; + } + + MessageShowView *MessageShowView::GetInstance() + { + return g_pMessageShowView; + } + void MessageShowView::DeInitView() + { + if(scrollView_) + { + scrollView_->RemoveAll(); + } + + delete title; + title = nullptr; + + delete time; + time = nullptr; + + delete messageButton; + messageButton = nullptr; + + delete deleteButton; + deleteButton = nullptr; + + delete background; + background = nullptr; + + delete backgroundtop; + backgroundtop = nullptr; + } + + void MessageShowView::InitializeLabel(UILabel *label, int posX, int posY, int width, int height, const char *viewId, int fontSize) + { + label = new UILabel(); + if (label == nullptr) + { + return; // 内存分配失败,返回 + } + label->SetPosition(posX, posY); + label->Resize(width, height); + label->SetViewId(viewId); + label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, fontSize); + label->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + label->SetVisible(true); + } + void MessageShowView::InitializeButton(UILabelButton *&button, int left, int top, int width, int height, const char *viewId) + { + button = new UILabelButton(); + if (button == nullptr) + { + return; // 内存分配失败,返回 + } + button->SetPosition(left, top); + button->Resize(width, height); + button->SetViewId(viewId); + button->SetStyle(STYLE_BACKGROUND_COLOR, DEFAULT_BACKGROUND_COLOR); + button->SetStyleForState(STYLE_BACKGROUND_COLOR, DEFAULT_BACKGROUND_COLOR, UIButton::PRESSED); + button->SetStyleForState(STYLE_BORDER_COLOR, PRESSED_BORDER_COLOR, UIButton::PRESSED); + button->SetVisible(true); + } + void MessageShowView::UpdateShowConfig() + { + // 默认配置: 矩形和标签的初始宽度 + const int maxCharsPerLine = 39; + const int baseRectWidth = defaultRectWidth; + const int baseLabelWidth = defaultLabelWidth; + const int extraRectWidthPerLine = 30; + const int extraLabelWidthPerLine = 50; + + // 计算行数 + int totalChars = messageStr.size(); + int lines = (totalChars / maxCharsPerLine) + (totalChars % maxCharsPerLine ? 1 : 0); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateShowConfig lines %d", lines); + + // 小于等于2行时,无需更新 + if (lines <= 2) + return; + + // 计算更新后的宽度 + int additionalLines = lines - 1; // 增加一行预备 + int updatedRectWidth = baseRectWidth + (additionalLines * extraRectWidthPerLine); + int updatedLabelWidth = baseLabelWidth + (additionalLines * extraLabelWidthPerLine); + + // 输出配置结果 + messageButton->SetPosition(33, 157, 380, updatedRectWidth); + deleteButton->SetPosition(43, 157 + updatedRectWidth + 20, 380, 100); + + /*加载空白*/ + CreateLine(background, 43, deleteButton->GetY() + deleteButton->GetHeight() + 40, 380, 100, + "line"); + background->SetVisible(false); + scrollView_->Add(background); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "updatedRectWidth %d updatedLabelWidth %d lines %d \r\n", updatedRectWidth, updatedLabelWidth, lines); + } + void MessageShowView::InitView() + { + /* -------------------------------------------------------------------------- */ + + CreateLine(backgroundtop, 0, 0, 100, 60, "line"); + backgroundtop->SetVisible(false); + scrollView_->Add(backgroundtop); + + title = new UILabel(); + if (title == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "title:: new UILabel fail"); + return; // 内存分配失败,返回 + } + title->SetPosition(83, 60, 300, 35); + title->SetText(titleStr.c_str()); + title->SetStyle(STYLE_TEXT_FONT, 30); + title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); // 来回滚动属性 + title->SetRollSpeed(23); + title->SetVisible(true); + /* -------------------------------------------------------------------------- */ + time = new UILabel(); + if (time == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "time:: new UILabel fail"); + return; // 内存分配失败,返回 + } + time->SetPosition(73, 104, 320, 33); + time->SetViewId("time"); + time->SetText(timeStr.c_str()); + time->SetTextColor(Color::Gray()); + time->SetStyle(STYLE_TEXT_FONT, 28); + time->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28); + time->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + time->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + time->SetVisible(true); + /* -------------------------------------------------------------------------- */ + /*初始化消息内容*/ + InitializeButton(messageButton, 33, 157, 380, defaultRectWidth, "message"); + messageButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); + messageButton->SetStyle(STYLE_BORDER_RADIUS, 20); + messageButton->SetStyle(STYLE_PADDING_LEFT, 15); + messageButton->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff)); + messageButton->SetAlign(TEXT_ALIGNMENT_LEFT); + messageButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + messageButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); + messageButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + messageButton->SetStyleForState(STYLE_BORDER_RADIUS, 20, UIButton::PRESSED); + messageButton->SetTouchable(false); + messageButton->SetText(messageStr.c_str()); + // messageButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------------------------------------------------------- */ + /*加载清除按键*/ + InitButtonExt(deleteButton, 43, 157 + defaultRectWidth + 20, 380, 100, DELETEBUTTON, STR_CLEAN, 30); + deleteButton->SetOnClickListener(static_cast(MessageShowPresenter::GetInstance())); + /* -------------------------------------------------------------------------- */ + scrollView_->Add(title); + scrollView_->Add(time); + scrollView_->Add(messageButton); + scrollView_->Add(deleteButton); + /* -------------------------------------------------------------------------- */ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitView is ok!"); + + // UpdateMessage(); + } + + void MessageShowView::UpdateMessage() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateMessage"); + MessageData *data = MessageModel::GetInstance().GetCurrentMessageData(); + if (data == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateMessage is error"); + return; + } + titleStr = data->labelTitle; + timeStr = data->labelTime; + messageStr = data->labelDetails; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateMessage title %s time %s message %s", titleStr.c_str(), timeStr.c_str(), messageStr.c_str()); + } + void MessageShowView::PreLoad(void) + { + if (!viewInitStatus) + { + UpdateMessage(); + InitView(); + viewInitStatus = true; + } + } + + void MessageShowView::OnStart() + { + View::OnStart(); + + scrollView_ = new UIScrollView(); + if (scrollView_ == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "scrollView_ new fail"); + return; + } + scrollView_->SetPosition(0, 0); + scrollView_->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + // scrollView_->SetScrollBlankSize(20); + // scrollView_->SetReboundSize(50); + scrollView_->SetHorizontalScrollState(false); // 设置水平滚动失效 + scrollView_->SetDirection(1); + + scrollView_->SetOnDragListener(presenter_); + scrollView_->SetTouchable(true); + scrollView_->SetDraggable(true); + // scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, BACK_GROUND_COLOR); + scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + + PreLoad(); + + UpdateShowConfig(); + + AddViewToRootContainer(scrollView_); + + // scrollView_->SetOnKeyActListener(presenter_); + } + +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp new file mode 100644 index 000000000..f43360030 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp @@ -0,0 +1,223 @@ +/*** + * @Date: 2024-07-12 11:19:45 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-09 14:03:51 + * @FilePath: + * /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageView.cpp + */ + +#include "message/include/MessageView.h" +#include "message/include/MessageModel.h" +#include "message/include/MessagePresenter.h" + +#include "UiConfig.h" +#include "uicomponents/UIComponents.h" +#include "wearable_log.h" +namespace OHOS { +static constexpr char *lineimagePath = "/user/res/message/Line.bin"; +static constexpr char *messageimagePath = "/user/res/message/message.bin"; +static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6; +static constexpr int16_t More_LIST_POSITION_X = 43; +static constexpr int16_t More_LIST_POSITION_Y = 120; +static constexpr int16_t More_SCROLLBLANKSIZE = + 35; // 设置此滚动视图的空白大小。 +static constexpr int16 MAX_SCR_DIS = 1000; +static constexpr int16 LIST_POS = 20; +static constexpr int16 SNUM_2 = 2; +static constexpr uint8_t NUM_2 = 2; + +static MessageView *g_pMessageView{nullptr}; + +MessageView::MessageView() { g_pMessageView = this; } + +MessageView::~MessageView() { + g_pMessageView = nullptr; + DeInitView(); +} + +MessageView *MessageView::GetInstance() { return g_pMessageView; } +void MessageView::InitView() { + // 展示界面 + if (MessageModel::GetInstance().HasDataVector()) { + // printf("存在数据!\r\n"); + SetPopupViewStatus(PopupMessage::MessagePopup, true); + } else { + // printf("不存在数据!\r\n"); + SetPopupViewStatus(PopupMessage::LackPopup, true); + } +} +void MessageView::DeInitView() { + if (lackView) { + lackView->RemoveAll(); + if (labeltitle) { + delete labeltitle; + labeltitle = nullptr; + } + if (labelmeage) { + delete labelmeage; + labelmeage = nullptr; + } + if (imageline) { + delete imageline; + imageline = nullptr; + } + if (imagemeage) { + delete imagemeage; + imagemeage = nullptr; + } + delete lackView; + lackView = nullptr; + } + if (messageView) { + messageView->RemoveAll(); + if (p_MessageListAdapter) { + delete p_MessageListAdapter; + p_MessageListAdapter = nullptr; + } + if (MessageList) { + delete MessageList; + MessageList = nullptr; + } + if (imageline2) { + delete imageline2; + imageline2 = nullptr; + } + delete messageView; + messageView = nullptr; + } +} + +void MessageView::PreLoad(void) { + if (!viewInitStatus) { + InitView(); + viewInitStatus = true; + } +} + +/*无数据界面*/ +void MessageView::ShowLackView() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowLackView start"); + if (lackView == nullptr) { + lackView = new UIScrollView(); + if (lackView == nullptr) { + return; + } + } + lackView->SetPosition(0, 0); + lackView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + lackView->SetScrollBlankSize(20); + lackView->SetReboundSize(50); + lackView->SetDirection(1); + lackView->SetViewId("lackView"); + + /*初始化label*/ + InitRollLabel(labeltitle, 83, 50, 300, 35, "labletitle", + STR_MESSAGE_NOTIFICATION, DEFAULT_VECTOR_FONT_FILENAME, 30); + InitRollLabel(labelmeage, 53, 276, 360, 40, "labelMessage", STR_MESSAGENO, + DEFAULT_VECTOR_FONT_FILENAME, 30); + labelmeage->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff)); + /*初始化image*/ + InitImageView(imageline, 193, 30, 365, 35, "image", lineimagePath); + InitImageView(imagemeage, 183, 156, 100, 100, "image", messageimagePath); + + lackView->Add(imageline); + lackView->Add(imagemeage); + lackView->Add(labeltitle); + lackView->Add(labelmeage); + + AddViewToRootContainer(lackView); + lackView->SetDraggable(true); + lackView->SetTouchable(true); + + lackView->SetOnDragListener(presenter_); + + lackView->SetVisible(false); // 界面隐藏 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowLackView end"); +} + +/*数据界面*/ +void MessageView::ShowMessageView() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowmessageView start"); + if (messageView == nullptr) { + messageView = new UIScrollView(); + if (messageView == nullptr) { + return; + } + } + messageView->SetPosition(0, 0); + messageView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + messageView->SetHorizontalScrollState(false); // 设置横向不可以滚动 + messageView->SetDirection(0); + messageView->SetVerticalScrollState(false); // 禁止垂直滑动 + messageView->SetViewId("messageView"); + + InitImageView(imageline2, 193, 30, 80, 8, "image", lineimagePath); + messageView->Add(imageline2); + + // UIList 的适配器 + if (p_MessageListAdapter == nullptr) { + p_MessageListAdapter = new MessageListAdapter(); + } + + p_MessageListAdapter->SetItemClickListener(presenter_); + if (MessageList == nullptr) { + MessageList = new UIList(); + } + MessageList->SetPosition(43, 95, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + MessageList->SetScrollStateListener(this); + MessageList->SetThrowDrag(true); + MessageList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + MessageList->SetMaxScrollDistance(1000); + MessageList->SetSwipeACCLevel(200); + MessageList->SetDragACCLevel(5); + MessageList->SetIntercept(true); + + MessageList->SetOnClickListener(presenter_); + messageView->SetOnDragListener(presenter_); + + messageView->Add(MessageList); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageList is add"); + AddViewToRootContainer(messageView); + + messageView->SetVisible(false); // 隐藏界面 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowmessageView end"); +} + +/*控制显示界面*/ +void MessageView::SetPopupViewStatus(PopupMessage view, bool status) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d", view); + + if (view == PopupMessage::LackPopup) { + MessageModel::GetInstance().SetPopupViewState(false); // 设置状态为无消息 + lackView->SetVisible(true); // 隐藏界面 + messageView->SetVisible(false); // 隐藏界面 + } else if (view == PopupMessage::MessagePopup) { + MessageModel::GetInstance().SetPopupViewState(true); // 设置状态为有消息 + lackView->SetVisible(false); // 隐藏界面 + messageView->SetVisible(true); // 隐藏界面 + } +} + +/// @brief 页面启动时需要执行的代码逻辑 +void MessageView::OnStart() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStart"); + View::OnStart(); + + ShowMessageView(); + ShowLackView(); + PreLoad(); + + if (MessageModel::GetInstance().HasDataVector()) { + if (p_MessageListAdapter) { + MessageList->SetAdapter(p_MessageListAdapter); + } + } +} +void MessageView::AddMessageToList(const MessageListItem &item) { + p_MessageListAdapter->AddListItem(item); +} +// 获取列表 +UIList *MessageView::GetList() { return MessageList; } +/// @brief 创建页面的视图 + +} // namespace OHOS \ No newline at end of file -- 2.17.1