1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef BASE_NOTIFICATION_DISTRIBUTED_NOTIFICATION_SERVICE_INTERFACES_INNER_API_REMINDER_REQUEST_H
17 #define BASE_NOTIFICATION_DISTRIBUTED_NOTIFICATION_SERVICE_INTERFACES_INNER_API_REMINDER_REQUEST_H
18 
19 #include <map>
20 #include <string>
21 
22 #include "notification_bundle_option.h"
23 #include "notification_constant.h"
24 #include "notification_request.h"
25 #include "want_params.h"
26 
27 namespace OHOS {
28 namespace Notification {
29 
30 #define READ_STRING_RETURN_FALSE_LOG(parcel, value, msg) \
31     if (!((parcel).ReadString(value))) {                 \
32         ANSR_LOGE("Failed to read %s", msg);             \
33         return false;                                    \
34     }                                                    \
35 
36 #define READ_BOOL_RETURN_FALSE_LOG(parcel, value, msg) \
37     if (!((parcel).ReadBool(value))) {                 \
38         ANSR_LOGE("Failed to read %s", msg);           \
39         return false;                                  \
40     }                                                  \
41 
42 #define READ_INT64_RETURN_FALSE_LOG(parcel, value, msg) \
43     if (!((parcel).ReadInt64(value))) {                 \
44         ANSR_LOGE("Failed to read %s", msg);            \
45         return false;                                   \
46     }                                                   \
47 
48 #define READ_INT32_RETURN_FALSE_LOG(parcel, value, msg) \
49     if (!((parcel).ReadInt32(value))) {                 \
50         ANSR_LOGE("Failed to read %s", msg);            \
51         return false;                                   \
52     }                                                   \
53 
54 #define READ_UINT64_RETURN_FALSE_LOG(parcel, value, msg) \
55     if (!((parcel).ReadUint64(value))) {                 \
56         ANSR_LOGE("Failed to read %s", msg);             \
57         return false;                                    \
58     }                                                    \
59 
60 #define READ_UINT32_RETURN_FALSE_LOG(parcel, value, msg) \
61     if (!((parcel).ReadUint32(value))) {                 \
62         ANSR_LOGE("Failed to read %s", msg);             \
63         return false;                                    \
64     }                                                    \
65 
66 #define READ_UINT16_RETURN_FALSE_LOG(parcel, value, msg) \
67     if (!((parcel).ReadUint16(value))) {                 \
68         ANSR_LOGE("Failed to read %s", msg);             \
69         return false;                                    \
70     }                                                    \
71 
72 #define READ_UINT8_RETURN_FALSE_LOG(parcel, value, msg) \
73     if (!((parcel).ReadUint8(value))) {                 \
74         ANSR_LOGE("Failed to read %s", msg);            \
75         return false;                                   \
76     }                                                   \
77 
78 #define WRITE_STRING_RETURN_FALSE_LOG(parcel, value, msg) \
79     if (!((parcel).WriteString(value))) {                 \
80         ANSR_LOGE("Failed to write %s", msg);             \
81         return false;                                     \
82     }                                                     \
83 
84 #define WRITE_BOOL_RETURN_FALSE_LOG(parcel, value, msg) \
85     if (!((parcel).WriteBool(value))) {                 \
86         ANSR_LOGE("Failed to write %s", msg);           \
87         return false;                                   \
88     }                                                   \
89 
90 #define WRITE_INT64_RETURN_FALSE_LOG(parcel, value, msg) \
91     if (!((parcel).WriteInt64(value))) {                 \
92         ANSR_LOGE("Failed to write %s", msg);            \
93         return false;                                    \
94     }                                                    \
95 
96 #define WRITE_INT32_RETURN_FALSE_LOG(parcel, value, msg) \
97     if (!((parcel).WriteInt32(value))) {                 \
98         ANSR_LOGE("Failed to write %s", msg);            \
99         return false;                                    \
100     }                                                    \
101 
102 #define WRITE_UINT64_RETURN_FALSE_LOG(parcel, value, msg) \
103     if (!((parcel).WriteUint64(value))) {                 \
104         ANSR_LOGE("Failed to write %s", msg);             \
105         return false;                                     \
106     }                                                     \
107 
108 #define WRITE_UINT32_RETURN_FALSE_LOG(parcel, value, msg) \
109     if (!((parcel).WriteUint32(value))) {                 \
110         ANSR_LOGE("Failed to write %s", msg);             \
111         return false;                                     \
112     }                                                     \
113 
114 #define WRITE_UINT16_RETURN_FALSE_LOG(parcel, value, msg) \
115     if (!((parcel).WriteUint16(value))) {                 \
116         ANSR_LOGE("Failed to write %s", msg);             \
117         return false;                                     \
118     }                                                     \
119 
120 #define WRITE_UINT8_RETURN_FALSE_LOG(parcel, value, msg) \
121     if (!((parcel).WriteUint8(value))) {                 \
122         ANSR_LOGE("Failed to write %s", msg);            \
123         return false;                                    \
124     }                                                    \
125 
126 class ReminderRequest : public Parcelable {
127 public:
128     /**
129      * @brief Supported reminder type.
130      */
131     enum class ReminderType : uint8_t {
132         /**
133          * Indicates the classification of reminder for timer.
134          */
135         TIMER,
136 
137         /**
138          * Indicates the classification of reminder for calendar.
139          */
140         CALENDAR,
141 
142         /**
143          * Indicates the classification of reminder for alarm.
144          */
145         ALARM,
146         INVALID
147     };
148 
149     /**
150      * @brief Supported action button type.
151      */
152     enum class ActionButtonType : uint8_t {
153         /**
154          * @brief Indicates that this action button is used to close reminder's notification.
155          * It always works well, whether the application is running at the time.
156          *
157          */
158         CLOSE,
159 
160         /**
161          * @brief Indicates that this action button is used to snooze reminder.
162          * It always work well, whether the application is running at the time.
163          *
164          */
165         SNOOZE,
166 
167         /**
168          * @brief Indicates that this action button is custom.
169          *
170          */
171         CUSTOM,
172         INVALID
173     };
174 
175     /**
176      * @brief Supported notification update type.
177      */
178     enum class UpdateNotificationType : uint8_t {
179         COMMON,
180         REMOVAL_WANT_AGENT,
181         WANT_AGENT,
182         MAX_SCREEN_WANT_AGENT,
183         BUNDLE_INFO,
184         CONTENT
185     };
186 
187     /**
188      * @brief Enumerates the Time type for converting between c time and acture time.
189      */
190     enum class TimeTransferType : uint8_t {
191         YEAR,
192         MONTH,
193         WEEK
194     };
195 
196     /**
197      * @brief Enumerates the Time format for print.
198      */
199     enum class TimeFormat : uint8_t {
200         YMDHMS,
201         HM
202     };
203 
204     struct ButtonWantAgent {
205         std::string pkgName = "";
206         std::string abilityName = "";
207     };
208 
209     struct ButtonDataShareUpdate {
210         std::string uri = "";
211         std::string equalTo = "";
212         std::string valuesBucket = "";
213     };
214     /**
215      * @brief Attributes of action button.
216      */
217     struct ActionButtonInfo {
218         /**
219          * Type of the button.
220          */
221         ActionButtonType type;
222 
223         /**
224          * Content show on the button.
225          */
226         std::string title = "";
227 
228         /**
229          * resource key(for language)
230          */
231         std::string resource = "";
232 
233         /**
234          * The ability that is redirected to when the button is clicked.
235          */
236         std::shared_ptr<ButtonWantAgent> wantAgent;
237 
238         /**
239          * The ability that is updata App rdb.
240          */
241         std::shared_ptr<ButtonDataShareUpdate> dataShareUpdate;
242     };
243 
244     /**
245      * @brief Want agent information. Indicates the package and the ability to switch to.
246      */
247     struct WantAgentInfo {
248         std::string pkgName = "";
249         std::string abilityName = "";
250         std::string uri = "";
251         AAFwk::WantParams parameters;
252     };
253 
254     struct MaxScreenAgentInfo {
255         std::string pkgName = "";
256         std::string abilityName = "";
257     };
258 
259     /**
260      * @brief Copy construct from an exist reminder.
261      *
262      * @param Indicates the exist reminder.
263      */
264     explicit ReminderRequest(const ReminderRequest &other);
265 
266     /**
267      * @brief This constructor should only be used in background proxy service process
268      * when reminder instance recovery from database.
269      *
270      * @param reminderId Indicates reminder id.
271      */
272     explicit ReminderRequest(int32_t reminderId);
273     ReminderRequest& operator = (const ReminderRequest &other);
~ReminderRequest()274     virtual ~ReminderRequest() override {};
275 
276     /**
277      * @brief Marshal a NotificationRequest object into a Parcel.
278      *
279      * @param parcel the object into the parcel
280      */
281     virtual bool Marshalling(Parcel &parcel) const override;
282 
283     /**
284      * @brief Unmarshal object from a Parcel.
285      *
286      * @return the NotificationRequest
287      */
288     static ReminderRequest *Unmarshalling(Parcel &parcel);
289     virtual bool ReadFromParcel(Parcel &parcel);
290 
291     /**
292      * @brief If the reminder is showing on the notification panel, it should not be removed automatically.
293      *
294      * @return true if it can be removed automatically.
295      */
296     bool CanRemove() const;
297 
298     bool CanShow() const;
299 
300     /**
301      * @brief Obtains all the information of the reminder.
302      *
303      * @return Information of the reminder.
304      */
305     std::string Dump() const;
306 
307     /**
308      * @brief Obtains the configured action buttons.
309      *
310      * @return map of action buttons.
311      */
312     std::map<ActionButtonType, ActionButtonInfo> GetActionButtons() const;
313 
314     /**
315      * @brief Obtains creator bundle name
316      *
317      * @return creator bundle name
318      */
319     std::string GetCreatorBundleName() const;
320 
321     /**
322      * @brief Obtains creator uid
323      *
324      * @return creator uid
325      */
326     int32_t GetCreatorUid() const;
327 
328     /**
329      * @brief Obtains the configured content.
330      *
331      * @return content text.
332      */
333     std::string GetContent() const;
334 
335     /**
336      * @brief Obtains the configured expired content.
337      *
338      * @return expired content text.
339      */
340     std::string GetExpiredContent() const;
341 
342     std::shared_ptr<MaxScreenAgentInfo> GetMaxScreenWantAgentInfo() const;
343 
344     /**
345      * @brief Obtains notification id.
346      *
347      * @return notification id.
348      */
349     int32_t GetNotificationId() const;
350 
351     /**
352      * @brief Obtains group id.
353      *
354      * @return group id.
355      */
356     std::string GetGroupId() const;
357 
358     /**
359      * @brief Obtains notification request.
360      *
361      * @return notification request instance.
362      */
363     sptr<NotificationRequest> GetNotificationRequest() const;
364 
365     /**
366      * @brief Obtains reminder id.
367      *
368      * @return reminder id.
369      */
370     int32_t GetReminderId() const;
371 
372     uint64_t GetReminderTimeInMilli() const;
373 
374     /**
375      * @brief Obtains reminder type.
376      *
377      * @return reminder type.
378      */
379     ReminderType GetReminderType() const;
380 
381     /**
382      * @brief Obtains the ringing or vibration duration configured for this reminder.
383      *
384      * @return uint16_t The ringing or vibration duration in seconds.
385      */
386     uint16_t GetRingDuration() const;
387 
388     /**
389      * @brief Obtains slot type.
390      *
391      * @return slot type.
392      */
393     NotificationConstant::SlotType GetSlotType() const;
394 
395     /**
396      * @brief Obtains snoozeSlot type.
397      *
398      * @return snoozeSlot type.
399      */
400     NotificationConstant::SlotType GetSnoozeSlotType() const;
401 
402     std::string GetSnoozeContent() const;
403     uint8_t GetSnoozeTimes() const;
404     uint8_t GetSnoozeTimesDynamic() const;
405     uint8_t GetState() const;
406 
407     /**
408      * @brief Obtains the Time Interval in seconds.
409      *
410      * @return uint64_t Time Interval in seconds.
411      */
412     uint64_t GetTimeInterval() const;
413 
414     /**
415      * @brief Obtains title.
416      *
417      * @return title.
418      */
419     std::string GetTitle() const;
420 
421     /**
422      * @brief Obtains trigger time in milli.
423      *
424      * @return trigger time.
425      */
426     uint64_t GetTriggerTimeInMilli() const;
427 
428     int32_t GetUserId() const;
429     int32_t GetUid() const;
430 
431     /**
432      * @brief Obtains bundle name
433      *
434      * @return bundle name
435      */
436     std::string GetBundleName() const;
437 
438     /**
439      * @brief Set the reminder type.
440      *
441      * @param reminderType the reminder type.
442      */
443     void SetReminderType(const ReminderType type);
444 
445     /**
446      * @brief Set the reminder state.
447      *
448      * @param state the reminder state.
449      */
450     void SetState(const uint8_t state);
451 
452     /**
453      * @brief Set the reminder repeat days of week.
454      *
455      * @param state the reminder repeat days of week.
456      */
457     void SetRepeatDaysOfWeek(const uint8_t repeatDaysOfWeek);
458 
459     /**
460      * @brief Set the app system.
461      *
462      */
463     void SetSystemApp(bool isSystem);
464 
465     /**
466      * @brief Check the app is system or not.
467      *
468      * @return true is the app is system.
469      */
470     bool IsSystemApp() const;
471 
472     /**
473      * @brief Obtains want agent information.
474      *
475      * @return want agent information.
476      */
477     std::shared_ptr<WantAgentInfo> GetWantAgentInfo() const;
478 
479     /**
480      * @brief Inites reminder creator bundle name when publish reminder success.
481      *
482      * @param creatorBundleName Indicates the creator bundle name which the reminder belong to
483      */
484     void InitCreatorBundleName(const std::string &creatorBundleName);
485 
486     /**
487      * @brief Inites reminder creator uid when publish reminder success.
488      *
489      * @param uid Indicates the creator uid which the reminder belong to
490      */
491     void InitCreatorUid(const int32_t creatorUid);
492 
493     /**
494      * @brief Inits reminder id when publish reminder success.
495      * Assign a unique reminder id for each reminder.
496      */
497     void InitReminderId();
498 
499     /**
500      * @brief Inits reminder userId when publish reminder success.
501      *
502      * When package remove, user id is sended by wantAgent, but we cannot get the uid according user id as the
503      * package has been removed, and the bundleOption can not be create with correct uid. so we need to record
504      * the user id, and use it to judge which user the reminder belong to.
505      *
506      * @param userId Indicates the userId which the reminder belong to.
507      */
508     void InitUserId(const int32_t &userId);
509 
510     /**
511      * @brief Inites reminder uid when publish reminder success.
512      *
513      * When system reboot and recovery from database, we cannot get the uid according user id as BMS has not be
514      * ready. So we need to record the uid in order to create correct bundleOption.
515      *
516      * @param uid Indicates the uid which the reminder belong to.
517      */
518     void InitUid(const int32_t &uid);
519 
520     /**
521      * @brief Inites reminder bundle name when publish reminder success.
522      *
523      * @param bundleName Indicates the bundle name which the reminder belong to
524      */
525     void InitBundleName(const std::string &bundleName);
526 
527     /**
528      * @brief Check the reminder is alerting or not.
529      *
530      * @return true if the reminder is playing sound or vibrating.
531      */
532     bool IsAlerting() const;
533 
534     /**
535      * @brief Check the reminder is expired or not.
536      *
537      * @return true is the reminder is expired.
538      */
539     bool IsExpired() const;
540 
541     /**
542      * @brief Check the reminder is showing on the panel.
543      *
544      * @return true if the reminder is showing on the panel.
545      */
546     bool IsShowing() const;
547 
548     /**
549      * @brief Closes the reminder by manual.
550      *
551      * 1) Resets the state of "Alering/Showing/Snooze"
552      * 2) Resets snoozeTimesDynamic_ if update to next trigger time, otherwise set reminder to expired.
553      *
554      * @param updateNext Whether to update to next reminder.
555      */
556     void OnClose(bool updateNext);
557 
558     /**
559      * @brief When date/time change, reminder need to refresh next trigger time.
560      *
561      * @return true if need to show reminder immediately.
562      */
563     virtual bool OnDateTimeChange();
564 
565     /**
566      * When shown notification is covered by a new notification with the same id, we should remove
567      * the state of showing, so that the reminder can be removed automatically when it is expired.
568      */
569     void OnSameNotificationIdCovered();
570 
571     /**
572      * Set the reminder state is InActive, so that it will be removed when expired
573      */
574     void SetStateToInActive();
575 
576     /**
577      * @brief Shows the reminder on panel. TriggerTime will be updated to next.
578      *
579      * @param isPlaySoundOrVibration true means it is play sound or vibration.
580      * @param isSysTimeChanged true means it is called when the system time is changed by user, otherwise false.
581      * @param allowToNotify true means that the notification will be shown as normal, otherwise false.
582      */
583     void OnShow(bool isPlaySoundOrVibration, bool isSysTimeChanged, bool allowToNotify);
584 
585     /**
586      * @brief Reset the state of "Showing" when the reminder is shown failed.
587      */
588     void OnShowFail();
589 
590     /**
591      * @brief Snooze the reminder by manual.
592      *
593      * 1) Updates the trigger time to the next one.
594      * 2) Updates the notification content for "Snooze".
595      * 3) Switches the state from "Showing[, Alerting]" to "Snooze".
596      */
597     bool OnSnooze();
598 
599     /**
600      * @brief Starts the reminder
601      *
602      * Sets the state from "Inactive" to "Active".
603      */
604     void OnStart();
605 
606     /**
607      * @brief Stops the reminder.
608      *
609      * Sets the state from "Active" to "Inactive".
610      */
611     void OnStop();
612 
613     /**
614      * @brief Terminate the alerting reminder, which is executed when the ring duration is over.
615      *
616      * 1) Disables the state of "Alerting".
617      * 2) Updates the notification content for "Alert".
618      *
619      * @return false if alerting state has already been set false before calling the method.
620      */
621     bool OnTerminate();
622 
623     /**
624      * @brief When timezone change, reminder need to refresh next trigger time.
625      *
626      * @return true if need to show reminder immediately.
627      */
628     virtual bool OnTimeZoneChange();
629 
630     /**
631      * @brief Sets action button.
632      *
633      * @param title Indicates the title of the button.
634      * @param type Indicates the type of the button.
635      * @param resource Indicates the resource of the button.
636      * @return Current reminder self.
637      */
638     ReminderRequest& SetActionButton(const std::string &title, const ActionButtonType &type,
639         const std::string &resource, const std::shared_ptr<ButtonWantAgent> &buttonWantAgent = nullptr,
640         const std::shared_ptr<ButtonDataShareUpdate> &buttonDataShareUpdate = nullptr);
641 
642     /**
643      * @brief Sets reminder content.
644      *
645      * @param content Indicates content text.
646      * @return Current reminder self.
647      */
648     ReminderRequest& SetContent(const std::string &content);
649 
650     /**
651      * @brief Sets reminder is expired or not.
652      *
653      * @param isExpired Indicates the reminder is expired or not.
654      */
655     void SetExpired(bool isExpired);
656 
657     /**
658      * @brief Sets expired content.
659      *
660      * @param expiredContent Indicates expired content.
661      * @return Current reminder self.
662      */
663     ReminderRequest& SetExpiredContent(const std::string &expiredContent);
664 
665     ReminderRequest& SetMaxScreenWantAgentInfo(const std::shared_ptr<MaxScreenAgentInfo> &maxScreenWantAgentInfo);
666 
667     /**
668      * @brief Sets notification id.
669      *
670      * @param notificationId Indicates notification id.
671      * @return Current reminder self.
672      */
673     ReminderRequest& SetNotificationId(int32_t notificationId);
674 
675     /**
676      * @brief Sets group id.
677      *
678      * @param notificationId Indicates group id.
679      * @return Current reminder self.
680      */
681     ReminderRequest& SetGroupId(const std::string &groupId);
682 
683     /**
684      * @brief Sets reminder id.
685      *
686      * @param reminderId Indicates reminder id.
687      */
688     void SetReminderId(int32_t reminderId);
689 
690     void SetReminderTimeInMilli(const uint64_t reminderTimeInMilli);
691 
692     /**
693      * @brief Sets the ringing or vibration duration for this reminder, in seconds.
694      *
695      * @param ringDurationInSeconds Indicates the duration. The default is 1 second.
696      * @return Current reminder self.
697      */
698     ReminderRequest& SetRingDuration(const uint64_t ringDurationInSeconds);
699 
700     /**
701      * @brief Sets slot type.
702      *
703      * @param slotType Indicates slot type.
704      * @return Current reminder self.
705      */
706     ReminderRequest& SetSlotType(const NotificationConstant::SlotType &slotType);
707     ReminderRequest& SetSnoozeSlotType(const NotificationConstant::SlotType &snoozeSlotType);
708     ReminderRequest& SetSnoozeContent(const std::string &snoozeContent);
709 
710     /**
711      * @brief Set the number of snooze times for this reminder.
712      *
713      * @note If the value of snoozeTimes is less than or equals to 0, this reminder is a one-shot
714      * reminder and will not be snoozed.
715      *
716      * It the value of snoozeTimes is greater than 0, for example, snoozeTimes=3, this reminder
717      * will be snoozed three times after the first alarm, that is, this reminder will be triggered
718      * for four times.
719      *
720      * This method does not take affect on the reminders for countdown timers.
721      *
722      * @param snoozeTimes Indicates the number of times that the reminder will be snoozed.
723      * @return ReminderRequest& Current reminder self.
724      */
725     ReminderRequest& SetSnoozeTimes(const uint8_t snoozeTimes);
726 
727     ReminderRequest& SetSnoozeTimesDynamic(const uint8_t snooziTimes);
728 
729     /**
730      * @brief Sets the Time Interval for this reminder, in seconds. The default value is 0.
731      *
732      * @note The minimum snooze interval is 5 minute. If the snooze interval is set to a value greater
733      * than 0 and less than 5 minutes, the system converts it to 5 minutes by default.
734      *
735      * This method does not take effect on the reminders for countdown timers.
736      *
737      * @param timeIntervalInSeconds Indicates the snooze interval to set. If the value is less or equals to 0,
738      * the reminder will not be snoozed.
739      * @return ReminderRequest& Current reminder self.
740      */
741     ReminderRequest& SetTimeInterval(const uint64_t timeIntervalInSeconds);
742 
743     /**
744      * @brief Sets title.
745      *
746      * @param title Indicates title.
747      * @return Current reminder self.
748      */
749     ReminderRequest& SetTitle(const std::string &title);
750 
751     /**
752      * @brief Sets trigger time.
753      *
754      * @param triggerTimeInMilli Indicates trigger time in milli.
755      */
756     void SetTriggerTimeInMilli(uint64_t triggerTimeInMilli);
757 
758     /**
759      * @brief Sets want agent information.
760      *
761      * @param wantAgentInfo Indicates want agent information.
762      * @return Current reminder self.
763      */
764     ReminderRequest& SetWantAgentInfo(const std::shared_ptr<WantAgentInfo> &wantAgentInfo);
765 
766     bool ShouldShowImmediately() const;
767 
768     /**
769      * @brief Updates {@link triggerTimeInMilli_} to next.
770      * @note If next trigger time not exist, {@link isExpired_} flag will be set with true.
771      *
772      * @return true if next trigger time exist and set success.
773      */
774     virtual bool UpdateNextReminder();
775     virtual bool SetNextTriggerTime();
776 
777     /**
778      * @brief Check reminder request is repeat
779      */
IsRepeat()780     virtual bool IsRepeat() const
781     {
782         return false;
783     }
784 
785     /**
786      * @brief Check reminder request is in exclude date
787      */
CheckExcludeDate()788     virtual bool CheckExcludeDate()
789     {
790         return false;
791     }
792 
793     /**
794      * @brief Check rrule want agent, pull up service extension
795      *
796      * @return true if need pull up service extension
797      */
IsPullUpService()798     virtual bool IsPullUpService()
799     {
800         return false;
801     }
802 
803     /**
804      * @brief Check need notification reminder. due to system timer.
805      * When change system time to later, more than the trigger time, system timer must trigger.
806      */
IsNeedNotification()807     virtual bool IsNeedNotification()
808     {
809         return true;
810     }
811 
812     void SetWantAgentStr(const std::string& wantStr);
813     std::string GetWantAgentStr();
814     void SetMaxWantAgentStr(const std::string& maxWantStr);
815     std::string GetMaxWantAgentStr();
816 
817     /**
818      * @brief Sets tapDismissed.
819      *
820      * @param tapDismissed Indicates tapDismissed.
821      */
822     void SetTapDismissed(bool tapDismissed);
823 
824     /**
825      * @brief Gets tapDismissed.
826      *
827      * @return True if tapDismissed.
828      */
829     bool IsTapDismissed() const;
830 
831     /**
832      * @brief Sets autoDeletedTime.
833      *
834      * @param autoDeletedTime Indicates autoDeletedTime.
835      */
836     void SetAutoDeletedTime(int64_t autoDeletedTime);
837 
838     /**
839      * @brief Gets autoDeletedTime.
840      *
841      * @return AutoDeletedTime.
842      */
843     int64_t GetAutoDeletedTime() const;
844 
845     /**
846      * @brief Sets custom button uri.
847      *
848      * @param uri Indicates uri.
849      */
850     void SetCustomButtonUri(const std::string &uri);
851 
852     /**
853      * @brief Gets custom button uri.
854      *
855      * @return custom button uri.
856      */
857     std::string GetCustomButtonUri() const;
858 
859     /**
860      * @brief Gets custom ring uri.
861      *
862      * @return custom ring uri.
863      */
864     std::string GetCustomRingUri() const;
865 
866      /**
867      * @brief Sets custom ring uri.
868      *
869      * @param uri Indicates uri.
870      */
871     void SetCustomRingUri(const std::string &uri);
872 
873     /**
874      * @brief Gets notification bundle option.
875      */
876     sptr<NotificationBundleOption> GetNotificationBundleOption() const;
877 
878     /**
879      * @brief Sets notification bundle option.
880      */
881     void SetNotificationBundleOption(const sptr<NotificationBundleOption>& option);
882 
883     /**
884      * @brief Update notification attributes.
885      *
886      * Some attributes need to be updated after the reminder published or before the notification publish.
887      * For example, action button should not init until the reminder is published successfully, as the reminder id is
888      * assigned after that.
889      *
890      * @param type Indicates the update type.
891      * @param extra Indicates the extra content.
892      */
893     void UpdateNotificationRequest(UpdateNotificationType type, std::string extra);
894 
895     /**
896      * @brief Get repeated days of the week.
897      *
898      * @return  Array of the int type.
899      */
900     std::vector<int32_t> GetDaysOfWeek() const;
901 
902     /**
903      * @brief Create notification request struct when recover from rdb or
904      * recv reminder info from ipc.
905      */
906     bool InitNotificationRequest();
907 
908     /**
909      * @brief Gets repeat days of week
910      */
911     uint8_t GetRepeatDaysOfWeek() const;
912 
913     /**
914      * @brief When system language change, will call this function.
915      *     need load resource to update button title
916      * @param resMgr Indicates the resource manager for get button title
917      */
918     void OnLanguageChange(const std::shared_ptr<Global::Resource::ResourceManager> &resMgr);
919 
920 public:
921     /**
922      * @brief Serialize want agent info and max want agent info to string.
923      * Persist to the rdb.
924      */
925     void SerializeWantAgent(std::string& wantInfoStr, std::string& maxWantInfoStr);
926 
927     /**
928      * @brief Deserialize want agent info and max want agent info from string.
929      * Recover from the rdb.
930      */
931     void DeserializeWantAgent(const std::string& wantAgentInfo, const uint8_t type);
932 
933     /**
934      * @brief Serialize action button info to string.
935      * Persist to the rdb.
936      */
937     std::string SerializeButtonInfo() const;
938 
939     /**
940      * @brief Deserialize action button info from string.
941      * Recover from the rdb.
942      */
943     void DeserializeButtonInfo(const std::string& buttonInfoStr);
944 
945     static int32_t GetActualTime(const TimeTransferType &type, int32_t cTime);
946     static int32_t GetCTime(const TimeTransferType &type, int32_t actualTime);
947     static uint64_t GetDurationSinceEpochInMilli(const time_t target);
948     static std::vector<std::string> StringSplit(std::string source, const std::string &split);
949 
950     static int32_t GLOBAL_ID;
951     static const uint64_t INVALID_LONG_LONG_VALUE;
952     static const uint16_t INVALID_U16_VALUE;
953     static const uint8_t INVALID_U8_VALUE;
954     static const uint16_t MILLI_SECONDS;
955     static const uint16_t SAME_TIME_DISTINGUISH_MILLISECONDS;
956     static const std::string NOTIFICATION_LABEL;
957     static const uint8_t MONDAY;
958     static const uint8_t SUNDAY;
959     static const uint8_t DAYS_PER_WEEK;
960     static const uint8_t HOURS_PER_DAY;
961     static const uint16_t SECONDS_PER_HOUR;
962     static const uint8_t MINUTES_PER_HOUR;
963     /**
964      * @brief Show the reminder with a notification.
965      */
966     static const std::string REMINDER_EVENT_ALARM_ALERT;
967 
968     /**
969      * @brief Close the reminder when click the close button of notification.
970      */
971     static const std::string REMINDER_EVENT_CLOSE_ALERT;
972 
973     /**
974      * @brief Snooze the reminder when click the snooze button of notification.
975      */
976     static const std::string REMINDER_EVENT_SNOOZE_ALERT;
977 
978     static const std::string REMINDER_EVENT_CUSTOM_ALERT;
979 
980     /**
981      * @biref Close the reminder when click the notification, not button.
982      */
983     static const std::string REMINDER_EVENT_CLICK_ALERT;
984 
985     /**
986      * @brief Used to control ring duration.
987      */
988     static const std::string REMINDER_EVENT_ALERT_TIMEOUT;
989 
990     /**
991      * @brief Update the reminder when remove notification from the systemUI.
992      */
993     static const std::string REMINDER_EVENT_REMOVE_NOTIFICATION;
994     static const std::string PARAM_REMINDER_ID;
995     static const uint8_t REMINDER_STATUS_INACTIVE;
996     static const uint8_t REMINDER_STATUS_ACTIVE;
997     static const uint8_t REMINDER_STATUS_ALERTING;
998     static const uint8_t REMINDER_STATUS_SHOWING;
999     static const uint8_t REMINDER_STATUS_SNOOZE;
1000     static const uint8_t TIME_HOUR_OFFSET;
1001 
1002     // For ActionButtonDataShare.
1003     static const std::string SEP_BUTTON_VALUE_TYPE;
1004     static const std::string SEP_BUTTON_VALUE;
1005     static const std::string SEP_BUTTON_VALUE_BLOB;
1006 
1007     // no object in parcel
1008     static constexpr int32_t VALUE_NULL = -1;
1009     // object exist in parcel
1010     static constexpr int32_t VALUE_OBJECT = 1;
1011     // wantAgent flag
1012     static constexpr int32_t WANT_AGENT_FLAG = 0;
1013     // maxWantAgent flag
1014     static constexpr int32_t MAX_WANT_AGENT_FLAG = 1;
1015 
1016     // max ring duration
1017     static constexpr uint64_t MAX_RING_DURATION = 30 * 60 * 1000;  // 30 min
1018 
1019 protected:
1020     enum class DbRecoveryType : uint8_t {
1021         INT,
1022         LONG
1023     };
1024     ReminderRequest();
1025     explicit ReminderRequest(ReminderType reminderType);
1026     std::string GetDateTimeInfo(const time_t &timeInSecond) const;
PreGetNextTriggerTimeIgnoreSnooze(bool ignoreRepeat,bool forceToGetNext)1027     virtual uint64_t PreGetNextTriggerTimeIgnoreSnooze(bool ignoreRepeat, bool forceToGetNext)
1028     {
1029         return INVALID_LONG_LONG_VALUE;
1030     }
1031 
1032     uint8_t repeatDaysOfWeek_{0};
1033 
1034     /**
1035      * Obtains the next triggerTime if it is a week repeat.
1036      *
1037      * @param now Indicates current time.
1038      * @param now Indicatet target time.
1039      * @return nextTriggerTime.
1040      */
1041     int64_t GetNextDaysOfWeek(const time_t now, const time_t target) const;
1042     void SetRepeatDaysOfWeek(bool set, const std::vector<uint8_t> &daysOfWeek);
1043     time_t GetTriggerTimeWithDST(const time_t now, const time_t nextTriggerTime) const;
1044     uint64_t GetTriggerTime(const time_t now, const time_t nextTriggerTime) const;
1045     uint64_t GetNowInstantMilli() const;
1046 
1047 private:
1048     void AddActionButtons(const bool includeSnooze);
1049     void AddRemovalWantAgent();
1050     std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> CreateWantAgent(AppExecFwk::ElementName &element) const;
1051     std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> CreateMaxWantAgent(AppExecFwk::ElementName &element) const;
1052     std::string GetShowTime(const uint64_t showTime) const;
1053     std::string GetTimeInfoInner(const time_t &timeInSecond, const TimeFormat &format, bool keep24Hour) const;
1054     std::string GetState(const uint8_t state) const;
1055     bool HandleSysTimeChange(uint64_t oriTriggerTime, uint64_t optTriggerTime);
1056     bool HandleTimeZoneChange(uint64_t oldZoneTriggerTime, uint64_t newZoneTriggerTime, uint64_t optTriggerTime);
1057     void InitServerObj();
1058     void SetMaxScreenWantAgent(AppExecFwk::ElementName &element);
1059     void SetState(bool deSet, const uint8_t newState, std::string function);
1060     void SetWantAgent(AppExecFwk::ElementName &element);
1061     void SetExtraInfo(const AAFwk::WantParams& params);
1062     void UpdateActionButtons(const bool &setSnooze);
1063     bool UpdateNextReminder(const bool &force);
1064     void UpdateNotificationContent(const bool &setSnooze);
1065     void UpdateNotificationCommon(bool isSnooze);
1066 
1067     /**
1068      * @brief Determine whether it is repeated every week.
1069      *
1070      * @return  True if repeate.
1071      */
1072     bool IsRepeatDaysOfWeek(int32_t day) const;
1073 
1074     /**
1075      * @brief Used for reminder recovery from database.
1076      *
1077      * @param bundleName Indicates the third part bundle name.
1078      */
1079     void UpdateNotificationBundleInfo();
1080 
1081     /**
1082      * @brief Update the notification, which will be shown for the "Alerting" reminder.
1083      * 1. Update the notification label/content.
1084      * 2. Restore the snooze action button.
1085      */
1086     void UpdateNotificationStateForAlert();
1087 
1088     /**
1089      * @brief Update the notification, which will be shown when user do a snooze.
1090      * 1. Update the notification label/content.
1091      * 2. Remove the snooze action button.
1092      */
1093     void UpdateNotificationStateForSnooze();
1094 
1095     bool MarshallingWantParameters(Parcel& parcel, const AAFwk::WantParams& params) const;
1096     bool MarshallingActionButton(Parcel& parcel) const;
1097     bool ReadWantParametersFromParcel(Parcel& parcel, AAFwk::WantParams& wantParams);
1098     bool ReadActionButtonFromParcel(Parcel& parcel);
1099 
1100     void RecoverActionButtonJsonMode(const std::string& jsonString);
1101     void RecoverWantAgentByJson(const std::string& wantAgentInfo, const uint8_t& type);
1102 
1103     static const uint32_t MIN_TIME_INTERVAL_IN_MILLI;
1104     static const std::string SEP_BUTTON_SINGLE;
1105     static const std::string SEP_BUTTON_MULTI;
1106     static const std::string SEP_WANT_AGENT;
1107 
1108     std::string content_ {};
1109     std::string expiredContent_ {};
1110     std::string snoozeContent_ {};
1111     std::string displayContent_ {};
1112     std::string title_ {};
1113     std::string bundleName_ {};
1114     bool isExpired_ {false};
1115     uint8_t snoozeTimes_ {0};
1116     uint8_t snoozeTimesDynamic_ {0};
1117     uint8_t state_ {0};
1118     int32_t notificationId_ {0};
1119     std::string groupId_ {};
1120     int32_t reminderId_ {-1};
1121     int32_t userId_ {-1};
1122     int32_t uid_ {-1};
1123     bool isSystemApp_ {false};
1124     bool tapDismissed_ {true};
1125     int64_t autoDeletedTime_ {0};
1126     std::string customButtonUri_ {};
1127     std::string customRingUri_ {};
1128     std::string creatorBundleName_ {};
1129     int32_t creatorUid_ {-1};
1130 
1131     // Indicates the reminder has been shown in the past time.
1132     // When the reminder has been created but not showed, it is equals to 0.
1133     uint64_t reminderTimeInMilli_ {0};
1134     uint64_t ringDurationInMilli_ {MILLI_SECONDS};
1135     uint64_t triggerTimeInMilli_ {0};
1136     uint64_t timeIntervalInMilli_ {0};
1137     ReminderType reminderType_ {ReminderType::INVALID};
1138     NotificationConstant::SlotType slotType_ {NotificationConstant::SlotType::SOCIAL_COMMUNICATION};
1139     NotificationConstant::SlotType snoozeSlotType_ {NotificationConstant::SlotType::OTHER};
1140     sptr<NotificationRequest> notificationRequest_ = nullptr;
1141     std::shared_ptr<WantAgentInfo> wantAgentInfo_ = nullptr;
1142     std::shared_ptr<MaxScreenAgentInfo> maxScreenWantAgentInfo_ = nullptr;
1143     std::map<ActionButtonType, ActionButtonInfo> actionButtonMap_ {};
1144 
1145     std::string wantAgentStr_{};
1146     std::string maxWantAgentStr_{};
1147 
1148     sptr<NotificationBundleOption> notificationOption_ {nullptr};
1149 };
1150 }  // namespace Reminder
1151 }  // namespace OHOS
1152 #endif  // BASE_NOTIFICATION_DISTRIBUTED_NOTIFICATION_SERVICE_INTERFACES_INNER_API_REMINDER_REQUEST_H