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)
/*增加手表状态图标*/
InitImageView(dialstateicon_, 213, 2, 40, 40, "disturbicon", DISTURBICON);
- // dialstateicon_->SetVisible(false);
+ dialstateicon_->SetVisible(false);
/*增加未读图标*/
InitImageView(messageicon_, 223, 444, 20, 20, "messageicon_", MESSAGEICON);
#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"
// BloodCardView *bloodView{nullptr};
// SleepCardView *sleepView{nullptr};
// Training_CardView *traingView{nullptr};
- // MessageControlView *messageView{nullptr};
+ MessageControlView *messageView{nullptr};
SetMainView *setmainView{nullptr};
WeatherControlView *weatherControlView{nullptr};
// 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};
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();
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
}
{
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");
}
--- /dev/null
+/***
+ * @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 <list>
+#include <string>
+#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<MessageListItem> &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<MessageListItem> listData;
+ UIView::OnClickListener *itemClickListener{nullptr};
+ UILabelButtonExt *DeleteButton{nullptr};
+ };
+}
+
+#endif
\ No newline at end of file
--- /dev/null
+
+
+#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
--- /dev/null
+/***
+ * @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
--- /dev/null
+/***
+ * @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
--- /dev/null
+/***
+ * @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
--- /dev/null
+/***
+ * @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
--- /dev/null
+
+#ifndef MESSAGE_MODEL_H
+#define MESSAGE_MODEL_H
+
+
+// #include "bletest.h"
+
+#include "message/include/MessagePresenter.h"
+#include <cstdint>
+#include <map>
+#include <vector>
+
+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<MessageData> MessageVector;
+
+ bool popupViewState_{false}; // 弹出视图状态
+};
+} // namespace OHOS
+
+#endif
+
+#if 0
+ bool HasDataJson(); // 判断是否存在数据Json
+ bool GetJsonLoadStatus(); // 获取Json加载状态
+ std::vector<MessageData> 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<std::string> &filenames); // 删除文件
+ void SaveMessageData(const MessageData data, const int index); // 保存json数据
+#endif
--- /dev/null
+
+
+#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<MessageView>,
+ 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
--- /dev/null
+/***
+ * @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<MessageShowView>,
+ 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
--- /dev/null
+
+
+#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<MessageShowPresenter>
+ {
+
+ 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
--- /dev/null
+
+
+#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<MessagePresenter>, 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
--- /dev/null
+/***
+ * @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<MessageListItem> &data) {
+ if (!listData.empty()) {
+ listData.clear();
+ }
+ std::list<MessageListItem>::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<MessageItemView *>(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<MessageListItem>::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<MessageItemView *>(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
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: MessageCardView.cpp
+ * Author:
+ * Create: 2021-12-21
+ */
+
+#include <string>
+#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;
+ }
+}
--- /dev/null
+/***
+ * @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<MessageItemView *>(&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
--- /dev/null
+
+#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
--- /dev/null
+#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
--- /dev/null
+/***
+ * @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;
+ }
+
+}
--- /dev/null
+/*
+ * @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 <algorithm>
+#include <chrono>
+#include <cstring>
+#include <dirent.h>
+#include <filesystem>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <map>
+#include <service/graphic_service.h>
+#include <sstream>
+#include <stdlib.h>
+#include <string>
+#include <thread>
+#include <vector>
+
+#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<char>(file)),
+ std::istreambuf_iterator<char>());
+ 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<std::string> &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<MessageData> &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<int, std::string> &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<DIR, DirCloser> 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<std::string> GetFileNamesInDirectory(const std::string &directory)
+ {
+ std::vector<std::string> 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<std::string> &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<MessageData> MessageModel::LoadMessageData()
+ {
+ std::vector<MessageData> MessageVector; // 返回的数据列表
+ std::vector<std::string> 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<char>(file)), std::istreambuf_iterator<char>());
+ 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<MessageData> 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<char>(file)), std::istreambuf_iterator<char>());
+ 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<char>(file)), std::istreambuf_iterator<char>());
+ 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
--- /dev/null
+
+
+#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<MessageView>::OnStart();
+ }
+
+ void MessagePresenter::OnPause(void)
+ {
+ Presenter<MessageView>::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<MessageView>::OnResume();
+ }
+
+ void MessagePresenter::OnStop(void)
+ {
+ Presenter<MessageView>::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<MessageItemView *>(&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<uint16_t>(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
--- /dev/null
+/***
+ * @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<MessageShowView>::OnStart();
+ }
+
+ void MessageShowPresenter::OnPause(void)
+ {
+ Presenter<MessageShowView>::OnPause();
+ }
+
+ void MessageShowPresenter::OnResume(void)
+ {
+ Presenter<MessageShowView>::OnResume();
+ }
+
+ void MessageShowPresenter::OnStop(void)
+ {
+ Presenter<MessageShowView>::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<uint16_t>(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
--- /dev/null
+/***
+ * @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<UIView::OnClickListener *>(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<MessageShowPresenter>::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
--- /dev/null
+/***
+ * @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<MessagePresenter>::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