d604fa5a172aa9bdfe4e9248efab41ea39fbc8d7
[mirrors/FD230.git] /
1 #include "notification_manager.h"
2 #include "wearable_log.h"
3 #include "components/ui_button.h"
4 #include "components/ui_image_view.h"
5 #include "components/ui_label_ext.h"
6 #include "components/ui_scroll_view.h"
7 #include "ui_resource_string.h"
8 #include "uicomponents/UIComponents.h"
9 #include <cmsis_os2.h>
10 #include <broadcast_feature.h>
11 #include <service/graphic_service.h>
12 #include <thread>
13 #include "ConfigModel.h"
14 #include "uiservice/include/ui_service.h"
15 #include "vibrator_service.h"
16 #include "custom_runtime.h"
17 #include "system/include/SystemLogModel.h"
18 #include <custom_utils.h>
19 #include "sedentaryReminder_notification.h"
20
21 namespace OHOS
22 {
23
24     UIViewGroup *SedentaryReminderGroupView{nullptr};
25     UIScrollView *SedentaryReminderScrollView{nullptr};
26     UILabelExt *SedentaryReminderTitleLabel{nullptr}; // 标题: 久坐提醒
27     UIImageView *SedentaryReminderImage{nullptr};
28     UILabelExt *SedentaryReminderNoteLabel{nullptr}; // 久坐提醒note
29     UILabelExt *SedentaryReminderLabel{nullptr};
30     UIButton *SedentaryReminderButton{nullptr};
31
32     static constexpr const int X_DRAG_OFFSET = 20;
33     static constexpr const int DOUBLES = 2;
34
35     static constexpr const char *SEDENTARY_REMINDER_GROUPVIEWID = "sedentary_reminder_groupviewid";
36     static constexpr const char *SEDENTARY_REMINDER_BUTTONVIEWID = "sedentary_reminder_buttonviewid";
37
38     SedentaryReminderViewEventListener::SedentaryReminderViewEventListener()
39     {
40         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SedentaryReminderViewEventListener::SedentaryReminderViewEventListener");
41     }
42
43     SedentaryReminderViewEventListener::~SedentaryReminderViewEventListener()
44     {
45         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SedentaryReminderViewEventListener::~SedentaryReminderViewEventListener");
46     }
47
48     SedentaryReminderViewEventListener &SedentaryReminderViewEventListener::GetInstance()
49     {
50         static SedentaryReminderViewEventListener instance;
51         return instance;
52     }
53
54     bool SedentaryReminderViewEventListener::OnRelease(UIView &view, const ReleaseEvent &event)
55     {
56         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SedentaryReminderViewEventListener::OnRelease");
57         UNUSED(event);
58         std::string viewId = view.GetViewId();
59         if (viewId == SEDENTARY_REMINDER_BUTTONVIEWID)
60         {
61             NotificationManager::GetInstance()->StopNotify();
62         }
63
64         return true;
65     }
66
67     bool SedentaryReminderViewEventListener::OnDrag(UIView &view, const DragEvent &event)
68     {
69         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SedentaryReminderViewEventListener::OnDrag");
70         UNUSED(view);
71         if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动
72         {
73             SedentaryReminderViewEventListener::X_DRAG_FLAG = true;
74         }
75         return true;
76     }
77
78     bool SedentaryReminderViewEventListener::OnDragEnd(UIView &view, const DragEvent &event)
79     {
80         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SedentaryReminderViewEventListener::OnDragEnd");
81         std::string viewId = view.GetViewId();
82         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && SedentaryReminderViewEventListener::X_DRAG_FLAG)
83         {
84             if (viewId == SEDENTARY_REMINDER_GROUPVIEWID)
85             {
86                 NotificationManager::GetInstance()->StopNotify();
87             }
88             SedentaryReminderViewEventListener::X_DRAG_FLAG = false;
89         }
90         return true;
91     }
92
93     // 记录久坐提醒日志
94     void SedentaryReminderViewEventListener::record_sedentary_reminder_log(void)
95     {
96         // popup_windows_log_data systemlog;
97         // systemlog.timestamp = SystemLogModel::GetInstance()->GetCurrentTime();
98         // systemlog.type = popup_windows_type::SEDENTARY_REMINDER;
99         // SystemLogModel::GetInstance()->save_popup_windows_log(systemlog);
100         uint8_t type =  2;
101         do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_POPUP_WINDOWS_DATA_LIST, &type, sizeof(type));
102     }
103
104     static std::string UpdateNoteLabelText(UILabelExt *&label, const std::string &newText, int id)
105     {
106         if (label == nullptr)
107         {
108             return nullptr;
109         }
110         /*取Id对应的字符串*/
111         UILabelExt *labelext = new UILabelExt();
112         labelext->SetTextId(id);
113         std::string text = labelext->GetText();
114
115         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateLabel:%s->%s\r\n", text.c_str(), newText.c_str());
116
117         // 找到标志"XX"在字符串中的位置
118         size_t pos = text.find("XX");
119         if (pos != std::string::npos)
120         {
121             // 替换标志"XX"为更新字符串
122             text.replace(pos, 2, newText); // 2 是标志"XX"的长度
123             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "newText:%s\r\n", text.c_str());
124             label->SetText(text.c_str());
125         }
126         else
127         {
128             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "找不到变量标志位XX,请注意是否已经被修改!");
129         }
130
131         delete labelext;
132         return text;
133     }
134
135     /*设置喝水提醒note上的提醒时间*/
136     void SedentaryReminderViewEventListener::SetSedentaryReminderNoteIntervalTime(int interval)
137     {
138         UpdateNoteLabelText(SedentaryReminderNoteLabel, std::to_string(interval), STR_SEDENTARY_REMINDER_NOTE);
139     }
140
141     // 获取久坐提醒时间间隔
142     int SedentaryReminderViewEventListener::GetIntervalTime()
143     {
144         interval = ConfigModel::GetInstance()->GetSedentaryInterval();
145         return interval;
146     }
147
148     /*创建久坐提醒视图*/
149     UIViewGroup *CreateSedentaryReminderView(void)
150     {
151         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CreateSedentaryReminderView(void)");
152         if (SedentaryReminderGroupView == nullptr)
153         {
154             SedentaryReminderGroupView = new UIViewGroup();
155             if (SedentaryReminderGroupView == nullptr)
156             {
157                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] SedentaryReminderGroupView new fail!!");
158                 return nullptr;
159             }
160             SedentaryReminderGroupView->SetPosition(0, 0, 466, 466);
161             SedentaryReminderGroupView->SetViewId(SEDENTARY_REMINDER_GROUPVIEWID);
162             SedentaryReminderGroupView->SetTouchable(true);
163             SedentaryReminderGroupView->SetDraggable(true);
164             UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(&SedentaryReminderViewEventListener::GetInstance());
165             if (dragListener == nullptr)
166             {
167                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] dragListener new fail!!");
168                 return nullptr;
169             }
170             SedentaryReminderGroupView->SetOnDragListener(dragListener);
171             /* -------------------------------------------------------------------------- */
172             if (SedentaryReminderScrollView == nullptr)
173             {
174                 SedentaryReminderScrollView = new UIScrollView();
175                 if (SedentaryReminderScrollView == nullptr)
176                 {
177                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SedentaryReminderScrollView new fail");
178                     return nullptr;
179                 }
180             }
181             SedentaryReminderScrollView->SetPosition(0, 0, 466, 466);
182             SedentaryReminderScrollView->SetThrowDrag(true);
183             SedentaryReminderScrollView->SetDraggable(true);
184             SedentaryReminderScrollView->SetTouchable(true);
185             SedentaryReminderScrollView->SetReboundSize(30);
186             SedentaryReminderScrollView->SetScrollBlankSize(30);
187             SedentaryReminderScrollView->SetSwipeACCLevel(200); // 800: compensation distance
188             SedentaryReminderScrollView->SetDragACCLevel(5);    // 5: drag acceleration
189             SedentaryReminderScrollView->SetMaxScrollDistance(1000);
190             SedentaryReminderScrollView->SetDirection(UIScrollView::VERTICAL);
191             SedentaryReminderScrollView->RequestFocus();
192             SedentaryReminderScrollView->SetRotateFactor(1.0);
193             /* ------------------------- SedentaryReminderTitleLabel ------------------------ */
194             SedentaryReminderTitleLabel = new UILabelExt();
195             if (SedentaryReminderTitleLabel == nullptr)
196             {
197                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] SedentaryReminderTitleLabel new fail!!");
198                 return nullptr;
199             }
200             SedentaryReminderTitleLabel->SetPosition(83, 52, 300, 35);
201             SedentaryReminderTitleLabel->SetStyle(STYLE_TEXT_FONT, 30);
202             SedentaryReminderTitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
203 #ifdef CUSTOM_ZHIHUI
204             SedentaryReminderTitleLabel->SetTextId(STR_SEDENTARY_REMINDER);
205 #else
206             SedentaryReminderTitleLabel->SetText("久坐提醒");
207 #endif
208             SedentaryReminderTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
209             SedentaryReminderTitleLabel->SetRollSpeed(23);
210             SedentaryReminderTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
211             SedentaryReminderTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
212             /* --------------------------- SedentaryReminderImage --------------------------- */
213             SedentaryReminderImage = new UIImageView();
214             if (SedentaryReminderImage == nullptr)
215             {
216                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] SedentaryReminderImage new fail!!");
217                 return nullptr;
218             }
219             SedentaryReminderImage->SetPosition(193, 130, 80, 80);
220             SedentaryReminderImage->SetSrc("/user/res/SedentaryReminder/SedentaryReminder.bin");
221             /* ------------------------- SedentaryReminderNoteLabel ------------------------- */
222             SedentaryReminderNoteLabel = new UILabelExt();
223             if (SedentaryReminderNoteLabel == nullptr)
224             {
225                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] SedentaryReminderNoteLabel new fail!!");
226                 return nullptr;
227             }
228             SedentaryReminderNoteLabel->SetPosition(53, 248, 360, 70);
229             SedentaryReminderNoteLabel->SetStyle(STYLE_TEXT_FONT, 30);
230             SedentaryReminderNoteLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
231 #ifdef CUSTOM_ZHIHUI
232             // SetLabelId(SedentaryReminderNoteLabel, STR_SEDENTARY_REMINDER_NOTE);
233             SedentaryReminderNoteLabel->SetTextId(STR_SEDENTARY_REMINDER_NOTE);
234 #endif
235             // UpdateLabel(SedentaryReminderNoteLabel,"1",STR_SEDENTARY_REMINDER_NOTE);
236             SedentaryReminderViewEventListener::GetInstance().SetSedentaryReminderNoteIntervalTime(SedentaryReminderViewEventListener::GetInstance().GetIntervalTime());
237             SedentaryReminderNoteLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
238             SedentaryReminderNoteLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
239             SedentaryReminderNoteLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
240             /* --------------------------- SedentaryReminderButton -------------------------- */
241             SedentaryReminderButton = new UIButton();
242             if (SedentaryReminderButton == nullptr)
243             {
244                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] SedentaryReminderButton new fail!!");
245                 return nullptr;
246             }
247             SedentaryReminderButton->SetPosition(0, 366, 466, 100);
248             SedentaryReminderButton->SetViewId(SEDENTARY_REMINDER_BUTTONVIEWID);
249             const char *buttonImgSrc = "/user/res/466x100button.bin";
250             SedentaryReminderButton->SetImageSrc(buttonImgSrc, buttonImgSrc);
251             SedentaryReminderButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff0b1928, UIButton::PRESSED);
252             UIView::OnTouchListener *TouchListener = static_cast<UIView::OnTouchListener *>(&SedentaryReminderViewEventListener::GetInstance());
253             if (TouchListener == nullptr)
254             {
255                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] TouchListener new fail!!");
256                 return nullptr;
257             }
258             SedentaryReminderButton->SetOnTouchListener(TouchListener);
259             /* --------------------------- SedentaryReminderLabel --------------------------- */
260             SedentaryReminderLabel = new UILabelExt();
261             if (SedentaryReminderLabel == nullptr)
262             {
263                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateSedentaryReminderView] SedentaryReminderLabel new fail!!");
264                 return nullptr;
265             }
266             SedentaryReminderLabel->SetPosition(133, 399, 200, 35);
267             SedentaryReminderLabel->SetStyle(STYLE_TEXT_FONT, 30);
268             SedentaryReminderLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
269 #ifdef CUSTOM_ZHIHUI
270             SedentaryReminderLabel->SetTextId(STR_KONW);
271 #else
272             SedentaryReminderLabel->SetText("知道了");
273 #endif
274             SedentaryReminderLabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
275             SedentaryReminderLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
276             SedentaryReminderLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
277             /* ----------------------------------- Add ---------------------------------- */
278             SedentaryReminderScrollView->Add(SedentaryReminderTitleLabel);
279             SedentaryReminderScrollView->Add(SedentaryReminderImage);
280             SedentaryReminderScrollView->Add(SedentaryReminderNoteLabel);
281             SedentaryReminderScrollView->Add(SedentaryReminderButton);
282             SedentaryReminderScrollView->Add(SedentaryReminderLabel);
283             SedentaryReminderGroupView->Add(SedentaryReminderScrollView);
284
285             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Create SedentaryReminderView succeed!!");
286         }
287         /* -------------------------------------------------------------------------- */
288         ScreenTurnOn(10 * 1000); // 显示时长10s
289         if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
290         {
291             custom_VibratorFunc_int(5);
292         }
293         /* -------------------------------------------------------------------------- */
294         NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeSedentaryReminderView);
295         return SedentaryReminderGroupView;
296     }
297
298     /*释放久坐提醒视图*/
299     void FreeSedentaryReminderView(void)
300     {
301         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FreeSedentaryReminderView(void)");
302         if (SedentaryReminderGroupView != nullptr)
303         {
304             SedentaryReminderGroupView->RemoveAll();
305             if (SedentaryReminderScrollView != nullptr)
306             {
307                 SedentaryReminderScrollView->RemoveAll();
308                 delete SedentaryReminderTitleLabel;
309                 SedentaryReminderTitleLabel = nullptr;
310
311                 delete SedentaryReminderImage;
312                 SedentaryReminderImage = nullptr;
313
314                 delete SedentaryReminderNoteLabel;
315                 SedentaryReminderNoteLabel = nullptr;
316
317                 delete SedentaryReminderButton;
318                 SedentaryReminderButton = nullptr;
319
320                 delete SedentaryReminderLabel;
321                 SedentaryReminderLabel = nullptr;
322
323                 SedentaryReminderScrollView->ClearFocus();
324                 delete SedentaryReminderScrollView;
325                 SedentaryReminderScrollView = nullptr;
326             }
327             RootView::GetInstance()->Remove(SedentaryReminderGroupView);
328             delete SedentaryReminderGroupView;
329             SedentaryReminderGroupView = nullptr;
330             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Free SedentaryReminderView succeed!!");
331             ScreenTurnOff();
332         }
333         return;
334     }
335
336 }