1  /*
2   * Copyright (c) 2021-2024 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  #include "notification_request.h"
17  
18  #include "ans_const_define.h"
19  #include "ans_inner_errors.h"
20  #include "ans_image_util.h"
21  #include "ans_log_wrapper.h"
22  #include "errors.h"
23  #include "notification_live_view_content.h"
24  #include "refbase.h"
25  #include "want_agent_helper.h"
26  #include "want_params_wrapper.h"
27  #include <memory>
28  
29  namespace OHOS {
30  namespace Notification {
31  const std::string NotificationRequest::CLASSIFICATION_ALARM {"alarm"};
32  const std::string NotificationRequest::CLASSIFICATION_CALL {"call"};
33  const std::string NotificationRequest::CLASSIFICATION_EMAIL {"email"};
34  const std::string NotificationRequest::CLASSIFICATION_ERROR {"err"};
35  const std::string NotificationRequest::CLASSIFICATION_EVENT {"event"};
36  const std::string NotificationRequest::CLASSIFICATION_MESSAGE {"msg"};
37  const std::string NotificationRequest::CLASSIFICATION_NAVIGATION {"navigation"};
38  const std::string NotificationRequest::CLASSIFICATION_PROGRESS {"progress"};
39  const std::string NotificationRequest::CLASSIFICATION_PROMO {"promo"};
40  const std::string NotificationRequest::CLASSIFICATION_RECOMMENDATION {"recommendation"};
41  const std::string NotificationRequest::CLASSIFICATION_REMINDER {"reminder"};
42  const std::string NotificationRequest::CLASSIFICATION_SERVICE {"service"};
43  const std::string NotificationRequest::CLASSIFICATION_SOCIAL {"social"};
44  const std::string NotificationRequest::CLASSIFICATION_STATUS {"status"};
45  const std::string NotificationRequest::CLASSIFICATION_SYSTEM {"sys"};
46  const std::string NotificationRequest::CLASSIFICATION_TRANSPORT {"transport"};
47  
48  const uint32_t NotificationRequest::COLOR_DEFAULT {0};
49  
50  const uint32_t NotificationRequest::COLOR_MASK {0xFF000000};
51  const std::size_t NotificationRequest::MAX_USER_INPUT_HISTORY {5};
52  const std::size_t NotificationRequest::MAX_ACTION_BUTTONS {3};
53  const std::size_t NotificationRequest::MAX_MESSAGE_USERS {1000};
54  
55  constexpr int32_t MAX_MAP_SIZE = 1000;
56  
NotificationRequest(int32_t notificationId)57  NotificationRequest::NotificationRequest(int32_t notificationId) : notificationId_(notificationId)
58  {
59      createTime_ = GetNowSysTime();
60      deliveryTime_ = GetNowSysTime();
61  }
62  
NotificationRequest(const NotificationRequest & other)63  NotificationRequest::NotificationRequest(const NotificationRequest &other)
64  {
65      CopyBase(other);
66      CopyOther(other);
67  }
68  
operator =(const NotificationRequest & other)69  NotificationRequest &NotificationRequest::operator=(const NotificationRequest &other)
70  {
71      CopyBase(other);
72      CopyOther(other);
73  
74      return *this;
75  }
76  
~NotificationRequest()77  NotificationRequest::~NotificationRequest()
78  {}
79  
IsInProgress() const80  bool NotificationRequest::IsInProgress() const
81  {
82      return inProgress_;
83  }
84  
SetInProgress(bool isOngoing)85  void NotificationRequest::SetInProgress(bool isOngoing)
86  {
87      inProgress_ = isOngoing;
88  }
89  
IsUnremovable() const90  bool NotificationRequest::IsUnremovable() const
91  {
92      return unremovable_;
93  }
94  
SetUnremovable(bool isUnremovable)95  void NotificationRequest::SetUnremovable(bool isUnremovable)
96  {
97      unremovable_ = isUnremovable;
98  }
99  
SetBadgeNumber(uint32_t number)100  void NotificationRequest::SetBadgeNumber(uint32_t number)
101  {
102      badgeNumber_ = number;
103  }
104  
GetBadgeNumber() const105  uint32_t NotificationRequest::GetBadgeNumber() const
106  {
107      return badgeNumber_;
108  }
109  
SetNotificationControlFlags(uint32_t notificationControlFlags)110  void NotificationRequest::SetNotificationControlFlags(uint32_t notificationControlFlags)
111  {
112      notificationControlFlags_ = notificationControlFlags;
113  }
114  
GetNotificationControlFlags() const115  uint32_t NotificationRequest::GetNotificationControlFlags() const
116  {
117      return notificationControlFlags_;
118  }
119  
SetNotificationId(int32_t notificationId)120  void NotificationRequest::SetNotificationId(int32_t notificationId)
121  {
122      notificationId_ = notificationId;
123  }
124  
GetNotificationId() const125  int32_t NotificationRequest::GetNotificationId() const
126  {
127      return notificationId_;
128  }
129  
SetWantAgent(const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> & wantAgent)130  void NotificationRequest::SetWantAgent(const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> &wantAgent)
131  {
132      wantAgent_ = wantAgent;
133  }
134  
GetWantAgent() const135  const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> NotificationRequest::GetWantAgent() const
136  {
137      return wantAgent_;
138  }
139  
SetRemovalWantAgent(const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> & wantAgent)140  void NotificationRequest::SetRemovalWantAgent(const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> &wantAgent)
141  {
142      removalWantAgent_ = wantAgent;
143  }
144  
GetRemovalWantAgent() const145  const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> NotificationRequest::GetRemovalWantAgent() const
146  {
147      return removalWantAgent_;
148  }
149  
SetMaxScreenWantAgent(const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> & wantAgent)150  void NotificationRequest::SetMaxScreenWantAgent(const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> &wantAgent)
151  {
152      maxScreenWantAgent_ = wantAgent;
153  }
154  
GetMaxScreenWantAgent() const155  const std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> NotificationRequest::GetMaxScreenWantAgent() const
156  {
157      return maxScreenWantAgent_;
158  }
159  
SetAdditionalData(const std::shared_ptr<AAFwk::WantParams> & extras)160  void NotificationRequest::SetAdditionalData(const std::shared_ptr<AAFwk::WantParams> &extras)
161  {
162      additionalParams_ = extras;
163  }
164  
GetAdditionalData() const165  const std::shared_ptr<AAFwk::WantParams> NotificationRequest::GetAdditionalData() const
166  {
167      return additionalParams_;
168  }
169  
SetDeliveryTime(int64_t deliveryTime)170  void NotificationRequest::SetDeliveryTime(int64_t deliveryTime)
171  {
172      deliveryTime_ = deliveryTime;
173  }
174  
GetDeliveryTime() const175  int64_t NotificationRequest::GetDeliveryTime() const
176  {
177      return deliveryTime_;
178  }
179  
IsShowDeliveryTime() const180  bool NotificationRequest::IsShowDeliveryTime() const
181  {
182      return (deliveryTime_ != 0) && showDeliveryTime_;
183  }
184  
SetShowDeliveryTime(bool showDeliveryTime)185  void NotificationRequest::SetShowDeliveryTime(bool showDeliveryTime)
186  {
187      showDeliveryTime_ = showDeliveryTime;
188  }
189  
AddActionButton(const std::shared_ptr<NotificationActionButton> & actionButton)190  void NotificationRequest::AddActionButton(const std::shared_ptr<NotificationActionButton> &actionButton)
191  {
192      if (!actionButton) {
193          ANS_LOGW("actionButton can not be null");
194          return;
195      }
196  
197      if (actionButtons_.size() >= NotificationRequest::MAX_ACTION_BUTTONS) {
198          ANS_LOGW("three action buttons have been already added");
199          return;
200      }
201  
202      actionButtons_.emplace_back(actionButton);
203  }
204  
GetActionButtons() const205  const std::vector<std::shared_ptr<NotificationActionButton>> NotificationRequest::GetActionButtons() const
206  {
207      return actionButtons_;
208  }
209  
ClearActionButtons()210  void NotificationRequest::ClearActionButtons()
211  {
212      actionButtons_.clear();
213  }
214  
IsPermitSystemGeneratedContextualActionButtons() const215  bool NotificationRequest::IsPermitSystemGeneratedContextualActionButtons() const
216  {
217      return permitted_;
218  }
219  
SetPermitSystemGeneratedContextualActionButtons(bool permitted)220  void NotificationRequest::SetPermitSystemGeneratedContextualActionButtons(bool permitted)
221  {
222      permitted_ = permitted;
223  }
224  
IsAgentNotification() const225  bool NotificationRequest::IsAgentNotification() const
226  {
227      return isAgent_;
228  }
229  
SetIsAgentNotification(bool isAgent)230  void NotificationRequest::SetIsAgentNotification(bool isAgent)
231  {
232      isAgent_ = isAgent;
233  }
234  
AddMessageUser(const std::shared_ptr<MessageUser> & messageUser)235  void NotificationRequest::AddMessageUser(const std::shared_ptr<MessageUser> &messageUser)
236  {
237      if (!messageUser) {
238          ANS_LOGI("messageUser can not be null");
239          return;
240      }
241  
242      messageUsers_.emplace_back(messageUser);
243  }
244  
GetMessageUsers() const245  const std::vector<std::shared_ptr<MessageUser>> NotificationRequest::GetMessageUsers() const
246  {
247      return messageUsers_;
248  }
249  
IsAlertOneTime() const250  bool NotificationRequest::IsAlertOneTime() const
251  {
252      return alertOneTime_;
253  }
254  
SetAlertOneTime(bool isAlertOnce)255  void NotificationRequest::SetAlertOneTime(bool isAlertOnce)
256  {
257      alertOneTime_ = isAlertOnce;
258  }
259  
SetAutoDeletedTime(int64_t deletedTime)260  void NotificationRequest::SetAutoDeletedTime(int64_t deletedTime)
261  {
262      autoDeletedTime_ = deletedTime;
263  }
264  
GetAutoDeletedTime() const265  int64_t NotificationRequest::GetAutoDeletedTime() const
266  {
267      return autoDeletedTime_;
268  }
269  
SetUpdateDeadLine(int64_t updateDeadLine)270  void NotificationRequest::SetUpdateDeadLine(int64_t updateDeadLine)
271  {
272      updateDeadLine_ = updateDeadLine;
273  }
274  
GetUpdateDeadLine() const275  int64_t NotificationRequest::GetUpdateDeadLine() const
276  {
277      return updateDeadLine_;
278  }
279  
SetFinishDeadLine(int64_t finishDeadLine)280  void NotificationRequest::SetFinishDeadLine(int64_t finishDeadLine)
281  {
282      finishDeadLine_ = finishDeadLine;
283  }
284  
GetFinishDeadLine() const285  int64_t NotificationRequest::GetFinishDeadLine() const
286  {
287      return finishDeadLine_;
288  }
289  
SetArchiveDeadLine(int64_t archiveDeadLine)290  void NotificationRequest::SetArchiveDeadLine(int64_t archiveDeadLine)
291  {
292      archiveDeadLine_ = archiveDeadLine;
293  }
294  
GetArchiveDeadLine() const295  int64_t NotificationRequest::GetArchiveDeadLine() const
296  {
297      return archiveDeadLine_;
298  }
299  
SetLittleIcon(const std::shared_ptr<Media::PixelMap> & littleIcon)300  void NotificationRequest::SetLittleIcon(const std::shared_ptr<Media::PixelMap> &littleIcon)
301  {
302      littleIcon_ = littleIcon;
303  }
304  
GetLittleIcon() const305  const std::shared_ptr<Media::PixelMap> NotificationRequest::GetLittleIcon() const
306  {
307      return littleIcon_;
308  }
309  
SetBigIcon(const std::shared_ptr<Media::PixelMap> & bigIcon)310  void NotificationRequest::SetBigIcon(const std::shared_ptr<Media::PixelMap> &bigIcon)
311  {
312      bigIcon_ = bigIcon;
313  }
314  
ResetBigIcon() const315  void NotificationRequest::ResetBigIcon() const
316  {
317      bigIcon_ = nullptr;
318  }
319  
GetBigIcon() const320  const std::shared_ptr<Media::PixelMap> NotificationRequest::GetBigIcon() const
321  {
322      return bigIcon_;
323  }
324  
SetOverlayIcon(const std::shared_ptr<Media::PixelMap> & overlayIcon)325  void NotificationRequest::SetOverlayIcon(const std::shared_ptr<Media::PixelMap> &overlayIcon)
326  {
327      overlayIcon_ = overlayIcon;
328  }
329  
GetOverlayIcon() const330  const std::shared_ptr<Media::PixelMap> NotificationRequest::GetOverlayIcon() const
331  {
332      return overlayIcon_;
333  }
334  
SetClassification(const std::string & classification)335  void NotificationRequest::SetClassification(const std::string &classification)
336  {
337      classification_ = classification;
338  }
339  
GetClassification() const340  std::string NotificationRequest::GetClassification() const
341  {
342      return classification_;
343  }
344  
SetColor(uint32_t color)345  void NotificationRequest::SetColor(uint32_t color)
346  {
347      color_ = color;
348      if (NotificationRequest::COLOR_DEFAULT != color_) {
349          color_ = color_ | NotificationRequest::COLOR_MASK;
350      }
351  }
352  
GetColor() const353  uint32_t NotificationRequest::GetColor() const
354  {
355      return color_;
356  }
357  
IsColorEnabled() const358  bool NotificationRequest::IsColorEnabled() const
359  {
360      if (!colorEnabled_) {
361          return false;
362      }
363  
364      // no valid content
365      if (!notificationContent_) {
366          ANS_LOGI("no valid notification content");
367          return false;
368      }
369  
370      // not a media content
371      if (NotificationContent::Type::MEDIA != notificationContentType_) {
372          ANS_LOGI("not a media notification content");
373          return false;
374      }
375  
376      auto basicContent = notificationContent_->GetNotificationContent();
377      auto mediaContent = std::static_pointer_cast<NotificationMediaContent>(basicContent);
378      if (!mediaContent->GetAVToken()) {
379          ANS_LOGI("AVToken has not been attached");
380          return false;
381      }
382  
383      return true;
384  }
385  
SetColorEnabled(bool colorEnabled)386  void NotificationRequest::SetColorEnabled(bool colorEnabled)
387  {
388      colorEnabled_ = colorEnabled;
389  }
390  
SetContent(const std::shared_ptr<NotificationContent> & content)391  void NotificationRequest::SetContent(const std::shared_ptr<NotificationContent> &content)
392  {
393      notificationContent_ = content;
394  
395      if (notificationContent_) {
396          notificationContentType_ = notificationContent_->GetContentType();
397          return;
398      }
399  
400      notificationContentType_ = NotificationContent::Type::NONE;
401  }
402  
GetContent() const403  const std::shared_ptr<NotificationContent> NotificationRequest::GetContent() const
404  {
405      return notificationContent_;
406  }
407  
GetNotificationType() const408  NotificationContent::Type NotificationRequest::GetNotificationType() const
409  {
410      return notificationContentType_;
411  }
412  
IsCountdownTimer() const413  bool NotificationRequest::IsCountdownTimer() const
414  {
415      return isCountdown_;
416  }
417  
SetCountdownTimer(bool isCountDown)418  void NotificationRequest::SetCountdownTimer(bool isCountDown)
419  {
420      isCountdown_ = isCountDown;
421  }
422  
SetGroupAlertType(NotificationRequest::GroupAlertType type)423  void NotificationRequest::SetGroupAlertType(NotificationRequest::GroupAlertType type)
424  {
425      groupAlertType_ = type;
426  }
427  
GetGroupAlertType() const428  NotificationRequest::GroupAlertType NotificationRequest::GetGroupAlertType() const
429  {
430      return groupAlertType_;
431  }
432  
IsGroupOverview() const433  bool NotificationRequest::IsGroupOverview() const
434  {
435      return groupOverview_;
436  }
437  
SetGroupOverview(bool overView)438  void NotificationRequest::SetGroupOverview(bool overView)
439  {
440      groupOverview_ = overView;
441  }
442  
SetGroupName(const std::string & groupName)443  void NotificationRequest::SetGroupName(const std::string &groupName)
444  {
445      groupName_ = groupName;
446  }
447  
GetGroupName() const448  std::string NotificationRequest::GetGroupName() const
449  {
450      return groupName_;
451  }
452  
IsOnlyLocal() const453  bool NotificationRequest::IsOnlyLocal() const
454  {
455      return onlyLocal_;
456  }
457  
SetOnlyLocal(bool flag)458  void NotificationRequest::SetOnlyLocal(bool flag)
459  {
460      onlyLocal_ = flag;
461  }
462  
SetSettingsText(const std::string & text)463  void NotificationRequest::SetSettingsText(const std::string &text)
464  {
465      if ((NotificationContent::Type::LONG_TEXT == notificationContentType_) ||
466          (NotificationContent::Type::PICTURE == notificationContentType_)) {
467          ANS_LOGW("This method is invalid if the notification content type has been set to LONG_TEXT or PICTURE.");
468          return;
469      }
470  
471      settingsText_ = text;
472  }
473  
GetSettingsText() const474  std::string NotificationRequest::GetSettingsText() const
475  {
476      return settingsText_;
477  }
478  
GetCreateTime() const479  int64_t NotificationRequest::GetCreateTime() const
480  {
481      return createTime_;
482  }
483  
SetCreateTime(int64_t createTime)484  void NotificationRequest::SetCreateTime(int64_t createTime)
485  {
486      createTime_ = createTime;
487  }
488  
IsShowStopwatch() const489  bool NotificationRequest::IsShowStopwatch() const
490  {
491      return showStopwatch_;
492  }
493  
SetShowStopwatch(bool isShow)494  void NotificationRequest::SetShowStopwatch(bool isShow)
495  {
496      showStopwatch_ = isShow;
497  }
498  
SetSlotType(NotificationConstant::SlotType slotType)499  void NotificationRequest::SetSlotType(NotificationConstant::SlotType slotType)
500  {
501      slotType_ = slotType;
502  }
503  
GetSlotType() const504  NotificationConstant::SlotType NotificationRequest::GetSlotType() const
505  {
506      return slotType_;
507  }
508  
SetSortingKey(const std::string & key)509  void NotificationRequest::SetSortingKey(const std::string &key)
510  {
511      sortingKey_ = key;
512  }
513  
GetSortingKey() const514  std::string NotificationRequest::GetSortingKey() const
515  {
516      return sortingKey_;
517  }
518  
SetStatusBarText(const std::string & text)519  void NotificationRequest::SetStatusBarText(const std::string &text)
520  {
521      statusBarText_ = text;
522  }
523  
GetStatusBarText() const524  std::string NotificationRequest::GetStatusBarText() const
525  {
526      return statusBarText_;
527  }
528  
IsTapDismissed() const529  bool NotificationRequest::IsTapDismissed() const
530  {
531      return tapDismissed_;
532  }
533  
SetTapDismissed(bool isDismissed)534  void NotificationRequest::SetTapDismissed(bool isDismissed)
535  {
536      tapDismissed_ = isDismissed;
537  }
538  
SetVisibleness(NotificationConstant::VisiblenessType type)539  void NotificationRequest::SetVisibleness(NotificationConstant::VisiblenessType type)
540  {
541      visiblenessType_ = type;
542  }
543  
GetVisibleness() const544  NotificationConstant::VisiblenessType NotificationRequest::GetVisibleness() const
545  {
546      return visiblenessType_;
547  }
548  
SetBadgeIconStyle(NotificationRequest::BadgeStyle style)549  void NotificationRequest::SetBadgeIconStyle(NotificationRequest::BadgeStyle style)
550  {
551      badgeStyle_ = style;
552  }
553  
GetBadgeIconStyle() const554  NotificationRequest::BadgeStyle NotificationRequest::GetBadgeIconStyle() const
555  {
556      return badgeStyle_;
557  }
558  
SetShortcutId(const std::string & shortcutId)559  void NotificationRequest::SetShortcutId(const std::string &shortcutId)
560  {
561      shortcutId_ = shortcutId;
562  }
563  
GetShortcutId() const564  std::string NotificationRequest::GetShortcutId() const
565  {
566      return shortcutId_;
567  }
568  
SetFloatingIcon(bool floatingIcon)569  void NotificationRequest::SetFloatingIcon(bool floatingIcon)
570  {
571      floatingIcon_ = floatingIcon;
572  }
573  
IsFloatingIcon() const574  bool NotificationRequest::IsFloatingIcon() const
575  {
576      return floatingIcon_;
577  }
578  
SetProgressBar(int32_t progress,int32_t progressMax,bool indeterminate)579  void NotificationRequest::SetProgressBar(int32_t progress, int32_t progressMax, bool indeterminate)
580  {
581      progressValue_ = progress;
582      progressMax_ = progressMax;
583      progressIndeterminate_ = indeterminate;
584  }
585  
GetProgressMax() const586  int32_t NotificationRequest::GetProgressMax() const
587  {
588      return progressMax_;
589  }
590  
GetProgressValue() const591  int32_t NotificationRequest::GetProgressValue() const
592  {
593      return progressValue_;
594  }
595  
IsProgressIndeterminate() const596  bool NotificationRequest::IsProgressIndeterminate() const
597  {
598      return progressIndeterminate_;
599  }
600  
SetNotificationUserInputHistory(const std::vector<std::string> & text)601  void NotificationRequest::SetNotificationUserInputHistory(const std::vector<std::string> &text)
602  {
603      if (text.empty()) {
604          userInputHistory_.clear();
605          return;
606      }
607  
608      auto vsize = std::min(NotificationRequest::MAX_USER_INPUT_HISTORY, text.size());
609      userInputHistory_.assign(text.begin(), text.begin() + vsize);
610  }
611  
GetNotificationUserInputHistory() const612  std::vector<std::string> NotificationRequest::GetNotificationUserInputHistory() const
613  {
614      return userInputHistory_;
615  }
616  
GetNotificationHashCode() const617  std::string NotificationRequest::GetNotificationHashCode() const
618  {
619      if (creatorBundleName_.empty() || (creatorUid_ == 0) || ownerBundleName_.empty()) {
620          return "";
621      }
622  
623      return std::to_string(notificationId_) + "_" + creatorBundleName_ + "_" + std::to_string(creatorUid_) + "_" +
624             ownerBundleName_;
625  }
626  
SetOwnerBundleName(const std::string & ownerName)627  void NotificationRequest::SetOwnerBundleName(const std::string &ownerName)
628  {
629      ownerBundleName_ = ownerName;
630  }
631  
GetOwnerBundleName() const632  std::string NotificationRequest::GetOwnerBundleName() const
633  {
634      return ownerBundleName_;
635  }
636  
SetCreatorBundleName(const std::string & creatorName)637  void NotificationRequest::SetCreatorBundleName(const std::string &creatorName)
638  {
639      creatorBundleName_ = creatorName;
640  }
641  
GetCreatorBundleName() const642  std::string NotificationRequest::GetCreatorBundleName() const
643  {
644      return creatorBundleName_;
645  }
646  
SetCreatorPid(pid_t pid)647  void NotificationRequest::SetCreatorPid(pid_t pid)
648  {
649      creatorPid_ = pid;
650  }
651  
GetCreatorPid() const652  pid_t NotificationRequest::GetCreatorPid() const
653  {
654      return creatorPid_;
655  }
656  
SetCreatorUid(int32_t uid)657  void NotificationRequest::SetCreatorUid(int32_t uid)
658  {
659      creatorUid_ = uid;
660  }
661  
GetCreatorUid() const662  int32_t NotificationRequest::GetCreatorUid() const
663  {
664      return creatorUid_;
665  }
666  
SetOwnerUid(int32_t uid)667  void NotificationRequest::SetOwnerUid(int32_t uid)
668  {
669      ownerUid_ = uid;
670  }
671  
GetOwnerUid() const672  int32_t NotificationRequest::GetOwnerUid() const
673  {
674      return ownerUid_;
675  }
676  
SetLabel(const std::string & label)677  void NotificationRequest::SetLabel(const std::string &label)
678  {
679      label_ = label;
680  }
681  
GetLabel() const682  std::string NotificationRequest::GetLabel() const
683  {
684      return label_;
685  }
686  
SetDistributed(bool distribute)687  void NotificationRequest::SetDistributed(bool distribute)
688  {
689      distributedOptions_.SetDistributed(distribute);
690  }
691  
SetDevicesSupportDisplay(const std::vector<std::string> & devices)692  void NotificationRequest::SetDevicesSupportDisplay(const std::vector<std::string> &devices)
693  {
694      distributedOptions_.SetDevicesSupportDisplay(devices);
695  }
696  
SetDevicesSupportOperate(const std::vector<std::string> & devices)697  void NotificationRequest::SetDevicesSupportOperate(const std::vector<std::string> &devices)
698  {
699      distributedOptions_.SetDevicesSupportOperate(devices);
700  }
701  
GetNotificationDistributedOptions() const702  NotificationDistributedOptions NotificationRequest::GetNotificationDistributedOptions() const
703  {
704      return distributedOptions_;
705  }
706  
SetCreatorUserId(int32_t userId)707  void NotificationRequest::SetCreatorUserId(int32_t userId)
708  {
709      creatorUserId_ = userId;
710  }
711  
GetCreatorUserId() const712  int32_t NotificationRequest::GetCreatorUserId() const
713  {
714      return creatorUserId_;
715  }
716  
SetCreatorInstanceKey(int32_t key)717  void NotificationRequest::SetCreatorInstanceKey(int32_t key)
718  {
719      creatorInstanceKey_ = key;
720  }
721  
GetCreatorInstanceKey() const722  int32_t NotificationRequest::GetCreatorInstanceKey() const
723  {
724      return creatorInstanceKey_;
725  }
726  
SetOwnerUserId(int32_t userId)727  void NotificationRequest::SetOwnerUserId(int32_t userId)
728  {
729      ownerUserId_ = userId;
730  }
731  
GetOwnerUserId() const732  int32_t NotificationRequest::GetOwnerUserId() const
733  {
734      return ownerUserId_;
735  }
736  
Dump()737  std::string NotificationRequest::Dump()
738  {
739      return "NotificationRequest{ "
740              "notificationId = " + std::to_string(notificationId_) +
741              ", slotType = " + std::to_string(static_cast<int32_t>(slotType_)) +
742              ", createTime = " + std::to_string(createTime_) + ", deliveryTime = " + std::to_string(deliveryTime_) +
743              ", autoDeletedTime = " + std::to_string(autoDeletedTime_) + ", settingsText = " + settingsText_ +
744              ", creatorBundleName = " + creatorBundleName_ +
745              ", creatorPid = " + std::to_string(static_cast<int32_t>(creatorPid_)) +
746              ", creatorUid = " + std::to_string(static_cast<int32_t>(creatorUid_)) +
747              ", ownerBundleName = " + ownerBundleName_ +
748              ", ownerUid = " + std::to_string(static_cast<int32_t>(ownerUid_)) +
749              ", groupName = " + groupName_ + ", statusBarText = " + statusBarText_ + ", label = " + label_ +
750              ", shortcutId = " + shortcutId_ + ", sortingKey = " + sortingKey_ +
751              ", groupAlertType = " + std::to_string(static_cast<int32_t>(groupAlertType_)) +
752              ", color = " + std::to_string(color_) + ", badgeNumber = " + std::to_string(badgeNumber_) +
753              ", visiblenessType = " + std::to_string(static_cast<int32_t>(visiblenessType_)) +
754              ", progressValue = " + std::to_string(progressValue_) + ", progressMax = " + std::to_string(progressMax_) +
755              ", badgeStyle = " + std::to_string(static_cast<int32_t>(badgeStyle_)) +
756              ", classification = " + classification_ +
757              ", notificationContentType = " + std::to_string(static_cast<int32_t>(notificationContentType_)) +
758              ", notificationControlFlags = " + std::to_string(notificationControlFlags_) +
759              ", showDeliveryTime = " + (showDeliveryTime_ ? "true" : "false") +
760              ", tapDismissed = " + (tapDismissed_ ? "true" : "false") +
761              ", colorEnabled = " + (colorEnabled_ ? "true" : "false") +
762              ", alertOneTime = " + (alertOneTime_ ? "true" : "false") +
763              ", showStopwatch = " + (showStopwatch_ ? "true" : "false") +
764              ", isCountdown = " + (isCountdown_ ? "true" : "false") +
765              ", inProgress = " + (inProgress_ ? "true" : "false") +
766              ", groupOverview = " + (groupOverview_ ? "true" : "false") +
767              ", isRemoveAllowed = " + (isRemoveAllowed_ ? "true" : "false") +
768              ", progressIndeterminate = " + (progressIndeterminate_ ? "true" : "false") +
769              ", unremovable = " + (unremovable_ ? "true" : "false") +
770              ", floatingIcon = " + (floatingIcon_ ? "true" : "false") +
771              ", onlyLocal = " + (onlyLocal_ ? "true" : "false") + ", permitted = " + (permitted_ ? "true" : "false") +
772              ", isAgent = " + (isAgent_ ? "true" : "false") +
773              ", removalWantAgent = " + (removalWantAgent_ ? "not null" : "null") +
774              ", maxScreenWantAgent = " + (maxScreenWantAgent_ ? "not null" : "null") +
775              ", additionalParams = " + (additionalParams_ ? "not null" : "null") +
776              ", littleIcon = " + (littleIcon_ ? "not null" : "null") +
777              ", bigIcon = " + (bigIcon_ ? "not null" : "null") +
778              ", overlayIcon = " + (overlayIcon_ ? "not null" : "null") +
779              ", notificationContent = " + (notificationContent_ ? notificationContent_->Dump() : "null") +
780              ", notificationTemplate = " + (notificationTemplate_ ? "not null" : "null") +
781              ", actionButtons = " + (!actionButtons_.empty() ? actionButtons_.at(0)->Dump() : "empty") +
782              ", messageUsers = " + (!messageUsers_.empty() ? messageUsers_.at(0)->Dump() : "empty") +
783              ", userInputHistory = " + (!userInputHistory_.empty() ? userInputHistory_.at(0) : "empty") +
784              ", distributedOptions = " + distributedOptions_.Dump() +
785              ", notificationFlags = " + (notificationFlags_ ? "not null" : "null") +
786              ", notificationFlagsOfDevices = " + (notificationFlagsOfDevices_ ? "not null" : "null") +
787              ", notificationBundleOption = " + (notificationBundleOption_ != nullptr ? "not null" : "null") +
788              ", agentBundle = " + (agentBundle_ != nullptr ? "not null" : "null") +
789              ", creatorUserId = " + std::to_string(creatorUserId_) + ", ownerUserId = " + std::to_string(ownerUserId_) +
790              ", receiverUserId = " + std::to_string(receiverUserId_) + ", updateDeadLine = " +
791              std::to_string(updateDeadLine_) + ", finishDeadLine = " + std::to_string(finishDeadLine_) +
792              ", sound = " + sound_ + ", unifiedGroupInfo_ = " +
793              (unifiedGroupInfo_ ? unifiedGroupInfo_->Dump() : "null")+ " }";
794  }
795  
ToJson(nlohmann::json & jsonObject) const796  bool NotificationRequest::ToJson(nlohmann::json &jsonObject) const
797  {
798      jsonObject["version"]         = 1;
799  
800      jsonObject["id"]              = notificationId_;
801      jsonObject["color"]           = color_;
802      jsonObject["deliveryTime"]    = deliveryTime_;
803      jsonObject["autoDeletedTime"] = autoDeletedTime_;
804  
805      jsonObject["creatorBundleName"] = creatorBundleName_;
806      jsonObject["ownerBundleName"]   = ownerBundleName_;
807      jsonObject["groupName"]         = groupName_;
808      jsonObject["label"]             = label_;
809      jsonObject["classification"]    = classification_;
810  
811      jsonObject["slotType"]       = static_cast<int32_t>(slotType_);
812      jsonObject["notificationSlotType"] = static_cast<int32_t>(slotType_);
813      jsonObject["badgeIconStyle"] = static_cast<int32_t>(badgeStyle_);
814      jsonObject["notificationContentType"] = static_cast<int32_t>(notificationContentType_);
815  
816      jsonObject["showDeliveryTime"] = showDeliveryTime_;
817      jsonObject["tapDismissed"]     = tapDismissed_;
818      jsonObject["colorEnabled"]     = colorEnabled_;
819      jsonObject["isOngoing"]        = inProgress_;
820      jsonObject["isAlertOnce"]      = alertOneTime_;
821      jsonObject["isStopwatch"]      = showStopwatch_;
822      jsonObject["isCountdown"]      = isCountdown_;
823      jsonObject["isUnremovable"]    = unremovable_;
824      jsonObject["isAgent"]          = isAgent_;
825      jsonObject["isFloatingIcon"]   = floatingIcon_;
826  
827      jsonObject["creatorBundleName"] = creatorBundleName_;
828      jsonObject["creatorUid"]        = creatorUid_;
829      jsonObject["creatorPid"]        = creatorPid_;
830      jsonObject["creatorUserId"]     = creatorUserId_;
831      jsonObject["ownerUserId"]       = ownerUserId_;
832      jsonObject["ownerUid"]          = ownerUid_;
833      jsonObject["receiverUserId"]    = receiverUserId_;
834      jsonObject["creatorInstanceKey"]    = creatorInstanceKey_;
835      jsonObject["notificationControlFlags"] = notificationControlFlags_;
836      jsonObject["updateDeadLine"]     = updateDeadLine_;
837      jsonObject["finishDeadLine"]     = finishDeadLine_;
838  
839      if (!ConvertObjectsToJson(jsonObject)) {
840          ANS_LOGE("Cannot convert objects to JSON");
841          return false;
842      }
843  
844      return true;
845  }
846  
FromJson(const nlohmann::json & jsonObject)847  NotificationRequest *NotificationRequest::FromJson(const nlohmann::json &jsonObject)
848  {
849      if (jsonObject.is_null() or !jsonObject.is_object()) {
850          ANS_LOGE("Invalid JSON object");
851          return nullptr;
852      }
853  
854      auto pRequest = new (std::nothrow) NotificationRequest();
855      if (pRequest == nullptr) {
856          ANS_LOGE("Failed to create request instance");
857          return nullptr;
858      }
859  
860      const auto &jsonEnd = jsonObject.cend();
861      if (jsonObject.find("version") != jsonEnd && jsonObject.at("version").is_number_integer()) {
862          jsonObject.at("version").get<int32_t>();
863      }
864  
865      ConvertJsonToNum(pRequest, jsonObject);
866  
867      ConvertJsonToString(pRequest, jsonObject);
868  
869      ConvertJsonToEnum(pRequest, jsonObject);
870  
871      ConvertJsonToBool(pRequest, jsonObject);
872  
873      if (jsonObject.find("wantAgent") != jsonEnd && jsonObject.at("wantAgent").is_string()) {
874          auto wantAgentValue  = jsonObject.at("wantAgent").get<std::string>();
875          int32_t targetUid = -1;
876          if (pRequest->GetOwnerUid() != DEFAULT_UID) {
877              targetUid = pRequest->GetOwnerUid();
878          }
879          ANS_LOGI("wantAgent Fromjson, uid = %{public}d ", targetUid);
880          pRequest->wantAgent_ = AbilityRuntime::WantAgent::WantAgentHelper::FromString(wantAgentValue, targetUid);
881      }
882  
883      if (!ConvertJsonToNotificationContent(pRequest, jsonObject)) {
884          delete pRequest;
885          pRequest = nullptr;
886          return nullptr;
887      }
888  
889      if (!ConvertJsonToNotificationActionButton(pRequest, jsonObject)) {
890          delete pRequest;
891          pRequest = nullptr;
892          return nullptr;
893      }
894  
895      if (jsonObject.find("extraInfo") != jsonEnd && jsonObject.at("extraInfo").is_string()) {
896          auto extraInfoStr = jsonObject.at("extraInfo").get<std::string>();
897          if (!extraInfoStr.empty()) {
898              AAFwk::WantParams params    = AAFwk::WantParamWrapper::ParseWantParams(extraInfoStr);
899              pRequest->additionalParams_ = std::make_shared<AAFwk::WantParams>(params);
900          }
901      }
902  
903      ConvertJsonToPixelMap(pRequest, jsonObject);
904  
905      if (!ConvertJsonToNotificationDistributedOptions(pRequest, jsonObject)) {
906          delete pRequest;
907          pRequest = nullptr;
908          return nullptr;
909      }
910  
911      if (!ConvertJsonToNotificationFlags(pRequest, jsonObject)) {
912          delete pRequest;
913          pRequest = nullptr;
914          return nullptr;
915      }
916  
917      if (!ConvertJsonToNotificationBundleOption(pRequest, jsonObject)) {
918          delete pRequest;
919          pRequest = nullptr;
920          return nullptr;
921      }
922  
923      ConvertJsonToAgentBundle(pRequest, jsonObject);
924  
925      return pRequest;
926  }
927  
Marshalling(Parcel & parcel) const928  bool NotificationRequest::Marshalling(Parcel &parcel) const
929  {
930      // write int
931      if (!parcel.WriteInt32(notificationId_)) {
932          ANS_LOGE("Failed to write notification Id");
933          return false;
934      }
935  
936      if (!parcel.WriteUint32(color_)) {
937          ANS_LOGE("Failed to write color");
938          return false;
939      }
940  
941      if (!parcel.WriteUint32(badgeNumber_)) {
942          ANS_LOGE("Failed to write badge number");
943          return false;
944      }
945  
946      if (!parcel.WriteInt32(progressValue_)) {
947          ANS_LOGE("Failed to write progress value");
948          return false;
949      }
950  
951      if (!parcel.WriteInt32(progressMax_)) {
952          ANS_LOGE("Failed to write progress max");
953          return false;
954      }
955  
956      if (!parcel.WriteInt64(createTime_)) {
957          ANS_LOGE("Failed to write create time");
958          return false;
959      }
960  
961      if (!parcel.WriteInt64(deliveryTime_)) {
962          ANS_LOGE("Failed to write delivery time");
963          return false;
964      }
965  
966      if (!parcel.WriteInt64(autoDeletedTime_)) {
967          ANS_LOGE("Failed to write auto deleted time");
968          return false;
969      }
970  
971      if (!parcel.WriteInt32(static_cast<int32_t>(creatorPid_))) {
972          ANS_LOGE("Failed to write creator pid");
973          return false;
974      }
975  
976      if (!parcel.WriteInt32(static_cast<int32_t>(creatorUid_))) {
977          ANS_LOGE("Failed to write creator uid");
978          return false;
979      }
980  
981      if (!parcel.WriteInt32(static_cast<int32_t>(ownerUid_))) {
982          ANS_LOGE("Failed to write owner uid");
983          return false;
984      }
985  
986      if (!parcel.WriteInt32(static_cast<int32_t>(creatorUserId_))) {
987          ANS_LOGE("Failed to write creator userId");
988          return false;
989      }
990  
991      if (!parcel.WriteInt32(static_cast<int32_t>(ownerUserId_))) {
992          ANS_LOGE("Failed to write owner userId");
993          return false;
994      }
995  
996      if (!parcel.WriteInt32(static_cast<int32_t>(receiverUserId_))) {
997          ANS_LOGE("Failed to write receiver userId");
998          return false;
999      }
1000  
1001      if (!parcel.WriteInt32(static_cast<int32_t>(creatorInstanceKey_))) {
1002          ANS_LOGE("Failed to write creator instance key");
1003          return false;
1004      }
1005  
1006      if (!parcel.WriteUint32(notificationControlFlags_)) {
1007          ANS_LOGE("Failed to write notification control flags.");
1008          return false;
1009      }
1010  
1011      if (!parcel.WriteUint32(publishDelayTime_)) {
1012          ANS_LOGE("Failed to write publish delay time");
1013          return false;
1014      }
1015  
1016      // write std::string
1017      if (!parcel.WriteString(settingsText_)) {
1018          ANS_LOGE("Failed to write settings text");
1019          return false;
1020      }
1021  
1022      if (!parcel.WriteString(creatorBundleName_)) {
1023          ANS_LOGE("Failed to write creator bundle name");
1024          return false;
1025      }
1026  
1027      if (!parcel.WriteString(ownerBundleName_)) {
1028          ANS_LOGE("Failed to write owner bundle name");
1029          return false;
1030      }
1031  
1032      if (!parcel.WriteString(groupName_)) {
1033          ANS_LOGE("Failed to write group name");
1034          return false;
1035      }
1036  
1037      if (!parcel.WriteString(statusBarText_)) {
1038          ANS_LOGE("Failed to write status bar text");
1039          return false;
1040      }
1041  
1042      if (!parcel.WriteString(label_)) {
1043          ANS_LOGE("Failed to write label");
1044          return false;
1045      }
1046  
1047      if (!parcel.WriteString(shortcutId_)) {
1048          ANS_LOGE("Failed to write shortcut Id");
1049          return false;
1050      }
1051  
1052      if (!parcel.WriteString(sortingKey_)) {
1053          ANS_LOGE("Failed to write sorting key");
1054          return false;
1055      }
1056  
1057      if (!parcel.WriteString(classification_)) {
1058          ANS_LOGE("Failed to write classification");
1059          return false;
1060      }
1061  
1062      if (!parcel.WriteString(appMessageId_)) {
1063          ANS_LOGE("Failed to write appMessageId");
1064          return false;
1065      }
1066  
1067      if (!parcel.WriteString(sound_)) {
1068          ANS_LOGE("Failed to write sound");
1069          return false;
1070      }
1071  
1072      // write enum
1073      if (!parcel.WriteInt32(static_cast<int32_t>(slotType_))) {
1074          ANS_LOGE("Failed to write slot type");
1075          return false;
1076      }
1077  
1078      if (!parcel.WriteInt32(static_cast<int32_t>(groupAlertType_))) {
1079          ANS_LOGE("Failed to write group alert type");
1080          return false;
1081      }
1082  
1083      if (!parcel.WriteInt32(static_cast<int32_t>(visiblenessType_))) {
1084          ANS_LOGE("Failed to write visibleness type");
1085          return false;
1086      }
1087  
1088      if (!parcel.WriteInt32(static_cast<int32_t>(badgeStyle_))) {
1089          ANS_LOGE("Failed to write badge type");
1090          return false;
1091      }
1092  
1093      if (!parcel.WriteInt32(static_cast<int32_t>(notificationContentType_))) {
1094          ANS_LOGE("Failed to write notification content type");
1095          return false;
1096      }
1097  
1098      // write bool
1099      if (!parcel.WriteBool(showDeliveryTime_)) {
1100          ANS_LOGE("Failed to write flag indicating whether to show delivery time");
1101          return false;
1102      }
1103  
1104      if (!parcel.WriteBool(tapDismissed_)) {
1105          ANS_LOGE("Failed to write flag tap dismissed");
1106          return false;
1107      }
1108  
1109      if (!parcel.WriteBool(colorEnabled_)) {
1110          ANS_LOGE("Failed to write flag indicating whether to enable background color");
1111          return false;
1112      }
1113  
1114      if (!parcel.WriteBool(alertOneTime_)) {
1115          ANS_LOGE("Failed to write flag indicating whether to have this notification alert only once");
1116          return false;
1117      }
1118  
1119      if (!parcel.WriteBool(showStopwatch_)) {
1120          ANS_LOGE("Failed to write flag show stop watch");
1121          return false;
1122      }
1123  
1124      if (!parcel.WriteBool(isCountdown_)) {
1125          ANS_LOGE("Failed to write flag indicating whether to show the notification creation time as a countdown timer");
1126          return false;
1127      }
1128  
1129      if (!parcel.WriteBool(inProgress_)) {
1130          ANS_LOGE("Failed to write flag indicating whether in progress");
1131          return false;
1132      }
1133  
1134      if (!parcel.WriteBool(groupOverview_)) {
1135          ANS_LOGE("Failed to write flag indicating whether to use this notification as the overview of its group");
1136          return false;
1137      }
1138  
1139      if (!parcel.WriteBool(progressIndeterminate_)) {
1140          ANS_LOGE("Failed to write progress indeterminate");
1141          return false;
1142      }
1143  
1144      if (!parcel.WriteBool(unremovable_)) {
1145          ANS_LOGE("Failed to write flag indicating whether unremovable");
1146          return false;
1147      }
1148  
1149      if (!parcel.WriteBool(floatingIcon_)) {
1150          ANS_LOGE("Failed to write flag floating icon");
1151          return false;
1152      }
1153  
1154      if (!parcel.WriteBool(onlyLocal_)) {
1155          ANS_LOGE("Failed to write flag only local");
1156          return false;
1157      }
1158  
1159      if (!parcel.WriteBool(permitted_)) {
1160          ANS_LOGE("Failed to write flag indicating whether to allow the platform to \
1161              generate contextual NotificationActionButton objects");
1162          return false;
1163      }
1164  
1165      if (!parcel.WriteBool(isAgent_)) {
1166          ANS_LOGE("Failed to write flag indicating whether an agent notification");
1167          return false;
1168      }
1169  
1170      if (!parcel.WriteBool(isRemoveAllowed_)) {
1171          ANS_LOGE("Failed to write flag isRemoveAllowed");
1172          return false;
1173      }
1174  
1175      // write objects which managed by std::shared_ptr
1176      bool valid {false};
1177  
1178      valid = wantAgent_ ? true : false;
1179      if (!parcel.WriteBool(valid)) {
1180          ANS_LOGE("Failed to write the flag which indicate whether wantAgent is null");
1181          return false;
1182      }
1183  
1184      if (valid) {
1185          if (!parcel.WriteParcelable(wantAgent_.get())) {
1186              ANS_LOGE("Failed to write wantAgent");
1187              return false;
1188          }
1189      }
1190  
1191      valid = removalWantAgent_ ? true : false;
1192      if (!parcel.WriteBool(valid)) {
1193          ANS_LOGE("Failed to write the flag which indicate whether removalWantAgent is null");
1194          return false;
1195      }
1196  
1197      if (valid) {
1198          if (!parcel.WriteParcelable(removalWantAgent_.get())) {
1199              ANS_LOGE("Failed to write removalWantAgent");
1200              return false;
1201          }
1202      }
1203  
1204      valid = maxScreenWantAgent_ ? true : false;
1205      if (!parcel.WriteBool(valid)) {
1206          ANS_LOGE("Failed to write the flag which indicate whether maxScreenWantAgent is null");
1207          return false;
1208      }
1209  
1210      if (valid) {
1211          if (!parcel.WriteParcelable(maxScreenWantAgent_.get())) {
1212              ANS_LOGE("Failed to write maxScreenWantAgent");
1213              return false;
1214          }
1215      }
1216  
1217      valid = additionalParams_ ? true : false;
1218      if (!parcel.WriteBool(valid)) {
1219          ANS_LOGE("Failed to write the flag which indicate whether additionalParams is null");
1220          return false;
1221      }
1222  
1223      if (valid) {
1224          if (!parcel.WriteParcelable(additionalParams_.get())) {
1225              ANS_LOGE("Failed to write additionalParams");
1226              return false;
1227          }
1228      }
1229  
1230      valid = littleIcon_ ? true : false;
1231      if (!parcel.WriteBool(valid)) {
1232          ANS_LOGE("Failed to write the flag which indicate whether littleIcon is null");
1233          return false;
1234      }
1235  
1236      if (valid) {
1237          if (!parcel.WriteParcelable(littleIcon_.get())) {
1238              ANS_LOGE("Failed to write littleIcon");
1239              return false;
1240          }
1241      }
1242  
1243      valid = bigIcon_ ? true : false;
1244      if (!parcel.WriteBool(valid)) {
1245          ANS_LOGE("Failed to write the flag which indicate whether bigIcon is null");
1246          return false;
1247      }
1248  
1249      if (valid) {
1250          if (!parcel.WriteParcelable(bigIcon_.get())) {
1251              ANS_LOGE("Failed to write bigIcon");
1252              return false;
1253          }
1254      }
1255  
1256      valid = overlayIcon_ ? true : false;
1257      if (!parcel.WriteBool(valid)) {
1258          ANS_LOGE("Failed to write the flag which indicate whether overlayIcon is null");
1259          return false;
1260      }
1261  
1262      if (valid) {
1263          if (!parcel.WriteParcelable(overlayIcon_.get())) {
1264              ANS_LOGE("Failed to write overlayIcon");
1265              return false;
1266          }
1267      }
1268  
1269      valid = notificationContent_ ? true : false;
1270      if (!parcel.WriteBool(valid)) {
1271          ANS_LOGE("Failed to write the flag which indicate whether notificationContent is null");
1272          return false;
1273      }
1274  
1275      if (valid) {
1276          if (!parcel.WriteParcelable(notificationContent_.get())) {
1277              ANS_LOGE("Failed to write notificationContent");
1278              return false;
1279          }
1280      }
1281  
1282      // write std::vector
1283      if (!parcel.WriteUint64(actionButtons_.size())) {
1284          ANS_LOGE("Failed to write the size of actionButtons");
1285          return false;
1286      }
1287  
1288      for (auto it = actionButtons_.begin(); it != actionButtons_.end(); ++it) {
1289          if (!parcel.WriteParcelable(it->get())) {
1290              ANS_LOGE("Failed to write actionButton");
1291              return false;
1292          }
1293      }
1294  
1295      if (!parcel.WriteBool(isCoverActionButtons_)) {
1296          ANS_LOGE("Failed to write isCoverActionButtons_");
1297          return false;
1298      }
1299  
1300      if (!parcel.WriteBool(isUpdateByOwnerAllowed_)) {
1301          ANS_LOGE("Failed to write isUpdateByOwnerAllowed_");
1302          return false;
1303      }
1304  
1305      if (!parcel.WriteUint64(messageUsers_.size())) {
1306          ANS_LOGE("Failed to write the size of messageUsers");
1307          return false;
1308      }
1309  
1310      for (auto it = messageUsers_.begin(); it != messageUsers_.end(); ++it) {
1311          if (!parcel.WriteParcelable(it->get())) {
1312              ANS_LOGE("Failed to write messageUser");
1313              return false;
1314          }
1315      }
1316  
1317      if (!parcel.WriteStringVector(userInputHistory_)) {
1318          ANS_LOGE("Failed to write userInputHistory");
1319          return false;
1320      }
1321  
1322      if (!parcel.WriteParcelable(&distributedOptions_)) {
1323          ANS_LOGE("Failed to write distributedOptions");
1324          return false;
1325      }
1326  
1327      valid = notificationTemplate_ ? true : false;
1328      if (!parcel.WriteBool(valid)) {
1329          ANS_LOGE("Failed to write the flag which indicate whether publicNotification is null");
1330          return false;
1331      }
1332  
1333      if (valid) {
1334          if (!parcel.WriteParcelable(notificationTemplate_.get())) {
1335              ANS_LOGE("Failed to write notificationTemplate");
1336              return false;
1337          }
1338      }
1339  
1340      valid = notificationFlags_ ? true : false;
1341      if (!parcel.WriteBool(valid)) {
1342          ANS_LOGE("Failed to write flags for the notification");
1343          return false;
1344      }
1345  
1346      if (valid) {
1347          if (!parcel.WriteParcelable(notificationFlags_.get())) {
1348              ANS_LOGE("Failed to write notification flags");
1349              return false;
1350          }
1351      }
1352  
1353      valid = notificationFlagsOfDevices_ ? true : false;
1354      if (!parcel.WriteBool(valid)) {
1355          ANS_LOGE("Failed to write notification device flags cause invalid sptr");
1356          return false;
1357      }
1358  
1359      if (valid) {
1360          if (!parcel.WriteInt32(static_cast<int32_t>(notificationFlagsOfDevices_->size()))) {
1361              ANS_LOGE("Failed to write notification devices flags size");
1362              return false;
1363          }
1364          for (auto deviceFlag : *notificationFlagsOfDevices_) {
1365              if (!parcel.WriteString(deviceFlag.first)) {
1366                  ANS_LOGE("Failed to write notification devices flags key");
1367                  return false;
1368              }
1369              if (!parcel.WriteParcelable(deviceFlag.second.get())) {
1370                  ANS_LOGE("Failed to write notification devices flags value");
1371                  return false;
1372              }
1373          }
1374      }
1375  
1376      valid = unifiedGroupInfo_ ? true : false;
1377      if (!parcel.WriteBool(valid)) {
1378          ANS_LOGE("Failed to write unifiedGroupInfo for the notification");
1379          return false;
1380      }
1381  
1382      if (valid) {
1383          if (!parcel.WriteParcelable(unifiedGroupInfo_.get())) {
1384              ANS_LOGE("Failed to write notification unifiedGroupInfo");
1385              return false;
1386          }
1387      }
1388  
1389      valid = notificationBundleOption_ != nullptr ? true : false;
1390      if (!parcel.WriteBool(valid)) {
1391          ANS_LOGE("Failed to write bundleOption for the notification");
1392          return false;
1393      }
1394  
1395      if (valid) {
1396          if (!parcel.WriteParcelable(notificationBundleOption_.get())) {
1397              ANS_LOGE("Failed to write notification bundleOption");
1398              return false;
1399          }
1400      }
1401  
1402      valid = agentBundle_ != nullptr ? true : false;
1403      if (!parcel.WriteBool(valid)) {
1404          ANS_LOGE("Failed to write agentBundle for the notification");
1405          return false;
1406      }
1407  
1408      if (valid) {
1409          if (!parcel.WriteParcelable(agentBundle_.get())) {
1410              ANS_LOGE("Failed to write notification agentBundle");
1411              return false;
1412          }
1413      }
1414  
1415      if (!parcel.WriteInt64(updateDeadLine_)) {
1416          ANS_LOGE("Failed to write max update time");
1417          return false;
1418      }
1419  
1420      if (!parcel.WriteInt64(finishDeadLine_)) {
1421          ANS_LOGE("Failed to write max finish time");
1422          return false;
1423      }
1424  
1425      return true;
1426  }
1427  
Unmarshalling(Parcel & parcel)1428  NotificationRequest *NotificationRequest::Unmarshalling(Parcel &parcel)
1429  {
1430      auto objptr = new (std::nothrow) NotificationRequest();
1431      if ((objptr != nullptr) && !objptr->ReadFromParcel(parcel)) {
1432          delete objptr;
1433          objptr = nullptr;
1434      }
1435  
1436      return objptr;
1437  }
1438  
ReadFromParcel(Parcel & parcel)1439  bool NotificationRequest::ReadFromParcel(Parcel &parcel)
1440  {
1441      notificationId_ = parcel.ReadInt32();
1442      color_ = parcel.ReadUint32();
1443      badgeNumber_ = parcel.ReadUint32();
1444      progressValue_ = parcel.ReadInt32();
1445      progressMax_ = parcel.ReadInt32();
1446      createTime_ = parcel.ReadInt64();
1447      deliveryTime_ = parcel.ReadInt64();
1448      autoDeletedTime_ = parcel.ReadInt64();
1449  
1450      creatorPid_ = static_cast<pid_t>(parcel.ReadInt32());
1451      creatorUid_ = parcel.ReadInt32();
1452      ownerUid_ = parcel.ReadInt32();
1453      creatorUserId_ = parcel.ReadInt32();
1454      ownerUserId_ = parcel.ReadInt32();
1455      receiverUserId_ = parcel.ReadInt32();
1456      creatorInstanceKey_ = parcel.ReadInt32();
1457      notificationControlFlags_ = parcel.ReadUint32();
1458      publishDelayTime_ = parcel.ReadUint32();
1459  
1460      if (!parcel.ReadString(settingsText_)) {
1461          ANS_LOGE("Failed to read settings text");
1462          return false;
1463      }
1464  
1465      if (!parcel.ReadString(creatorBundleName_)) {
1466          ANS_LOGE("Failed to read creator bundle name");
1467          return false;
1468      }
1469  
1470      if (!parcel.ReadString(ownerBundleName_)) {
1471          ANS_LOGE("Failed to read owner bundle name");
1472          return false;
1473      }
1474  
1475      if (!parcel.ReadString(groupName_)) {
1476          ANS_LOGE("Failed to read group name");
1477          return false;
1478      }
1479  
1480      if (!parcel.ReadString(statusBarText_)) {
1481          ANS_LOGE("Failed to read status bar text");
1482          return false;
1483      }
1484  
1485      if (!parcel.ReadString(label_)) {
1486          ANS_LOGE("Failed to read label");
1487          return false;
1488      }
1489  
1490      if (!parcel.ReadString(shortcutId_)) {
1491          ANS_LOGE("Failed to read shortcut Id");
1492          return false;
1493      }
1494  
1495      if (!parcel.ReadString(sortingKey_)) {
1496          ANS_LOGE("Failed to read sorting key");
1497          return false;
1498      }
1499  
1500      if (!parcel.ReadString(classification_)) {
1501          ANS_LOGE("Failed to read classification");
1502          return false;
1503      }
1504  
1505      if (!parcel.ReadString(appMessageId_)) {
1506          ANS_LOGE("Failed to read appMessageId");
1507          return false;
1508      }
1509  
1510      if (!parcel.ReadString(sound_)) {
1511          ANS_LOGE("Failed to read sound");
1512          return false;
1513      }
1514  
1515      int32_t slotTypeValue = parcel.ReadInt32();
1516      if (slotTypeValue < 0 ||
1517          slotTypeValue >= static_cast<int>(NotificationConstant::SlotType::ILLEGAL_TYPE)) {
1518          ANS_LOGE("Invalid slot type value :%{public}d. It should be in [0 , %{public}d).",
1519              slotTypeValue, static_cast<int>(NotificationConstant::SlotType::ILLEGAL_TYPE));
1520          return false;
1521      }
1522      slotType_ = static_cast<NotificationConstant::SlotType>(slotTypeValue);
1523      int32_t groupAlertTypeValue = parcel.ReadInt32();
1524      if (groupAlertTypeValue < 0 ||
1525          groupAlertTypeValue >= static_cast<int>(NotificationRequest::GroupAlertType::ILLEGAL_TYPE)) {
1526          ANS_LOGE("Invalid groupAlert type value :%{public}d. It should be in [0 , %{public}d).",
1527              groupAlertTypeValue, static_cast<int>(NotificationRequest::GroupAlertType::ILLEGAL_TYPE));
1528          return false;
1529      }
1530      groupAlertType_ = static_cast<NotificationRequest::GroupAlertType>(groupAlertTypeValue);
1531      int32_t visiblenessTypeValue = parcel.ReadInt32();
1532      if (visiblenessTypeValue < 0 ||
1533          visiblenessTypeValue >= static_cast<int>(NotificationConstant::VisiblenessType::ILLEGAL_TYPE)) {
1534          ANS_LOGE("Invalid visibleness type value :%{public}d. It should be in [0 , %{public}d).",
1535              visiblenessTypeValue, static_cast<int>(NotificationConstant::VisiblenessType::ILLEGAL_TYPE));
1536          return false;
1537      }
1538      visiblenessType_ = static_cast<NotificationConstant::VisiblenessType>(visiblenessTypeValue);
1539      int32_t badgeStyleValue = parcel.ReadInt32();
1540      if (badgeStyleValue < 0) {
1541          ANS_LOGE("Invalid badge style value :%{public}d. It should be greater than 0.", badgeStyleValue);
1542          return false;
1543      }
1544      if (badgeStyleValue >= static_cast<int>(NotificationRequest::BadgeStyle::ILLEGAL_TYPE)) {
1545          badgeStyleValue = static_cast<int>(NotificationRequest::BadgeStyle::NONE);
1546          ANS_LOGE("The badge style value is too large, set it to the default enumeration value: %{public}d.",
1547              static_cast<int>(NotificationRequest::BadgeStyle::NONE));
1548      }
1549      badgeStyle_ = static_cast<NotificationRequest::BadgeStyle>(badgeStyleValue);
1550      int32_t notificationContentTypeValue = parcel.ReadInt32();
1551      if (notificationContentTypeValue <= static_cast<int>(NotificationContent::Type::NONE) ||
1552          notificationContentTypeValue >= static_cast<int>(NotificationContent::Type::ILLEGAL_TYPE)) {
1553          ANS_LOGE("Invalid notification content type value :%{public}d. It should be in (%{public}d , %{public}d)",
1554              notificationContentTypeValue, static_cast<int>(NotificationContent::Type::NONE),
1555              static_cast<int>(NotificationContent::Type::ILLEGAL_TYPE));
1556          return false;
1557      }
1558      notificationContentType_ = static_cast<NotificationContent::Type>(notificationContentTypeValue);
1559  
1560      showDeliveryTime_ = parcel.ReadBool();
1561      tapDismissed_ = parcel.ReadBool();
1562      colorEnabled_ = parcel.ReadBool();
1563      alertOneTime_ = parcel.ReadBool();
1564      showStopwatch_ = parcel.ReadBool();
1565      isCountdown_ = parcel.ReadBool();
1566      inProgress_ = parcel.ReadBool();
1567      groupOverview_ = parcel.ReadBool();
1568      progressIndeterminate_ = parcel.ReadBool();
1569      unremovable_ = parcel.ReadBool();
1570      floatingIcon_ = parcel.ReadBool();
1571      onlyLocal_ = parcel.ReadBool();
1572      permitted_ = parcel.ReadBool();
1573      isAgent_ = parcel.ReadBool();
1574      isRemoveAllowed_ = parcel.ReadBool();
1575  
1576      bool valid {false};
1577  
1578      valid = parcel.ReadBool();
1579      if (valid) {
1580          wantAgent_ = std::shared_ptr<AbilityRuntime::WantAgent::WantAgent>(
1581              parcel.ReadParcelable<AbilityRuntime::WantAgent::WantAgent>());
1582          if (!wantAgent_) {
1583              ANS_LOGE("Failed to read wantAgent");
1584              return false;
1585          }
1586      }
1587  
1588      valid = parcel.ReadBool();
1589      if (valid) {
1590          removalWantAgent_ = std::shared_ptr<AbilityRuntime::WantAgent::WantAgent>(
1591              parcel.ReadParcelable<AbilityRuntime::WantAgent::WantAgent>());
1592          if (!removalWantAgent_) {
1593              ANS_LOGE("Failed to read removalWantAgent");
1594              return false;
1595          }
1596      }
1597  
1598      valid = parcel.ReadBool();
1599      if (valid) {
1600          maxScreenWantAgent_ = std::shared_ptr<AbilityRuntime::WantAgent::WantAgent>(
1601              parcel.ReadParcelable<AbilityRuntime::WantAgent::WantAgent>());
1602          if (!maxScreenWantAgent_) {
1603              ANS_LOGE("Failed to read maxScreenWantAgent");
1604              return false;
1605          }
1606      }
1607  
1608      valid = parcel.ReadBool();
1609      if (valid) {
1610          additionalParams_ = std::shared_ptr<AAFwk::WantParams>(parcel.ReadParcelable<AAFwk::WantParams>());
1611          if (!additionalParams_) {
1612              ANS_LOGE("Failed to read additionalParams");
1613              return false;
1614          }
1615      }
1616  
1617      valid = parcel.ReadBool();
1618      if (valid) {
1619          littleIcon_ = std::shared_ptr<Media::PixelMap>(parcel.ReadParcelable<Media::PixelMap>());
1620      }
1621  
1622      valid = parcel.ReadBool();
1623      if (valid) {
1624          bigIcon_ = std::shared_ptr<Media::PixelMap>(parcel.ReadParcelable<Media::PixelMap>());
1625          if (!bigIcon_) {
1626              ANS_LOGE("Failed to read bigIcon");
1627              return false;
1628          }
1629      }
1630  
1631      valid = parcel.ReadBool();
1632      if (valid) {
1633          overlayIcon_ = std::shared_ptr<Media::PixelMap>(parcel.ReadParcelable<Media::PixelMap>());
1634          if (!overlayIcon_) {
1635              ANS_LOGE("Failed to read overlayIcon");
1636              return false;
1637          }
1638      }
1639  
1640      valid = parcel.ReadBool();
1641      if (valid) {
1642          notificationContent_ = std::shared_ptr<NotificationContent>(parcel.ReadParcelable<NotificationContent>());
1643          if (!notificationContent_) {
1644              ANS_LOGE("Failed to read notificationContent");
1645              return false;
1646          }
1647      }
1648  
1649      auto vsize = parcel.ReadUint64();
1650      vsize = (vsize < NotificationRequest::MAX_ACTION_BUTTONS) ? vsize : NotificationRequest::MAX_ACTION_BUTTONS;
1651      for (uint64_t it = 0; it < vsize; ++it) {
1652          auto member = std::shared_ptr<NotificationActionButton>(parcel.ReadParcelable<NotificationActionButton>());
1653          if (member == nullptr) {
1654              actionButtons_.clear();
1655              ANS_LOGE("Failed to read actionButton");
1656              return false;
1657          }
1658  
1659          actionButtons_.emplace_back(member);
1660      }
1661  
1662      isCoverActionButtons_ = parcel.ReadBool();
1663      isUpdateByOwnerAllowed_ = parcel.ReadBool();
1664  
1665      vsize = parcel.ReadUint64();
1666      vsize = (vsize < NotificationRequest::MAX_MESSAGE_USERS) ? vsize : NotificationRequest::MAX_MESSAGE_USERS;
1667      for (uint64_t it = 0; it < vsize; ++it) {
1668          auto member = std::shared_ptr<MessageUser>(parcel.ReadParcelable<MessageUser>());
1669          if (member == nullptr) {
1670              ANS_LOGE("Failed to read messageUser");
1671              messageUsers_.clear();
1672              return false;
1673          }
1674  
1675          messageUsers_.emplace_back(member);
1676      }
1677  
1678      if (!parcel.ReadStringVector(&userInputHistory_)) {
1679          ANS_LOGE("Failed to read userInputHistory");
1680          return false;
1681      }
1682  
1683      auto pOpt = parcel.ReadParcelable<NotificationDistributedOptions>();
1684      if (pOpt == nullptr) {
1685          ANS_LOGE("Failed to read distributedOptions");
1686          return false;
1687      }
1688      distributedOptions_ = *pOpt;
1689      delete pOpt;
1690      pOpt = nullptr;
1691  
1692      valid = parcel.ReadBool();
1693      if (valid) {
1694          notificationTemplate_ = std::shared_ptr<NotificationTemplate>(parcel.ReadParcelable<NotificationTemplate>());
1695          if (!notificationTemplate_) {
1696              ANS_LOGE("Failed to read notificationTemplate");
1697              return false;
1698          }
1699      }
1700  
1701      valid = parcel.ReadBool();
1702      if (valid) {
1703          notificationFlags_ = std::shared_ptr<NotificationFlags>(parcel.ReadParcelable<NotificationFlags>());
1704          if (!notificationFlags_) {
1705              ANS_LOGE("Failed to read notificationFlags");
1706              return false;
1707          }
1708      }
1709  
1710      valid = parcel.ReadBool();
1711      if (valid) {
1712          notificationFlagsOfDevices_ = std::make_shared<std::map<std::string, std::shared_ptr<NotificationFlags>>>();
1713          int32_t mapSize = parcel.ReadInt32();
1714          mapSize = (mapSize < MAX_MAP_SIZE) ? mapSize : MAX_MAP_SIZE;
1715          for (int32_t seq = 0; seq < mapSize; seq++) {
1716              std::string deviceType = parcel.ReadString();
1717              std::shared_ptr<NotificationFlags> notificationFlags =
1718                  std::shared_ptr<NotificationFlags>(parcel.ReadParcelable<NotificationFlags>());
1719              (*notificationFlagsOfDevices_)[deviceType] = notificationFlags;
1720          }
1721      }
1722  
1723      valid = parcel.ReadBool();
1724      if (valid) {
1725          unifiedGroupInfo_ =
1726              std::shared_ptr<NotificationUnifiedGroupInfo>(parcel.ReadParcelable<NotificationUnifiedGroupInfo>());
1727          if (!unifiedGroupInfo_) {
1728              ANS_LOGE("Failed to read unifiedGroupInfo+");
1729              return false;
1730          }
1731      }
1732  
1733      valid = parcel.ReadBool();
1734      if (valid) {
1735          notificationBundleOption_ =
1736              std::shared_ptr<NotificationBundleOption>(parcel.ReadParcelable<NotificationBundleOption>());
1737          if (!notificationBundleOption_) {
1738              ANS_LOGE("Failed to read notificationBundleOption");
1739              return false;
1740          }
1741      }
1742  
1743      valid = parcel.ReadBool();
1744      if (valid) {
1745          agentBundle_ =
1746              std::shared_ptr<NotificationBundleOption>(parcel.ReadParcelable<NotificationBundleOption>());
1747          if (!agentBundle_) {
1748              ANS_LOGE("Failed to read agentBundle");
1749              return false;
1750          }
1751      }
1752  
1753      updateDeadLine_ = parcel.ReadInt64();
1754      finishDeadLine_ = parcel.ReadInt64();
1755  
1756      return true;
1757  }
1758  
GetNowSysTime()1759  int64_t NotificationRequest::GetNowSysTime()
1760  {
1761      std::chrono::time_point<std::chrono::system_clock> nowSys = std::chrono::system_clock::now();
1762      auto epoch = nowSys.time_since_epoch();
1763      auto value = std::chrono::duration_cast<std::chrono::milliseconds>(epoch);
1764      int64_t duration = value.count();
1765      return duration;
1766  }
1767  
SetTemplate(const std::shared_ptr<NotificationTemplate> & templ)1768  void NotificationRequest::SetTemplate(const std::shared_ptr<NotificationTemplate> &templ)
1769  {
1770      notificationTemplate_ = templ;
1771  }
1772  
GetTemplate() const1773  std::shared_ptr<NotificationTemplate> NotificationRequest::GetTemplate() const
1774  {
1775      return notificationTemplate_;
1776  }
1777  
SetFlags(const std::shared_ptr<NotificationFlags> & flags)1778  void NotificationRequest::SetFlags(const std::shared_ptr<NotificationFlags> &flags)
1779  {
1780      notificationFlags_ = flags;
1781  }
1782  
GetFlags() const1783  std::shared_ptr<NotificationFlags> NotificationRequest::GetFlags() const
1784  {
1785      return notificationFlags_;
1786  }
1787  
SetDeviceFlags(const std::shared_ptr<std::map<std::string,std::shared_ptr<NotificationFlags>>> & mapFlags)1788  void NotificationRequest::SetDeviceFlags(
1789      const std::shared_ptr<std::map<std::string, std::shared_ptr<NotificationFlags>>> &mapFlags)
1790  {
1791      notificationFlagsOfDevices_ = mapFlags;
1792  }
1793  
GetDeviceFlags() const1794  std::shared_ptr<std::map<std::string, std::shared_ptr<NotificationFlags>>> NotificationRequest::GetDeviceFlags() const
1795  {
1796      return notificationFlagsOfDevices_;
1797  }
1798  
1799  
SetBundleOption(const std::shared_ptr<NotificationBundleOption> & bundleOption)1800  void NotificationRequest::SetBundleOption(const std::shared_ptr<NotificationBundleOption> &bundleOption)
1801  {
1802      notificationBundleOption_ = bundleOption;
1803  }
1804  
GetBundleOption() const1805  std::shared_ptr<NotificationBundleOption> NotificationRequest::GetBundleOption() const
1806  {
1807      return notificationBundleOption_;
1808  }
1809  
SetAgentBundle(const std::shared_ptr<NotificationBundleOption> & agentBundle)1810  void NotificationRequest::SetAgentBundle(const std::shared_ptr<NotificationBundleOption> &agentBundle)
1811  {
1812      agentBundle_ = agentBundle;
1813  }
1814  
GetAgentBundle() const1815  std::shared_ptr<NotificationBundleOption> NotificationRequest::GetAgentBundle() const
1816  {
1817      return agentBundle_;
1818  }
1819  
SetReceiverUserId(int32_t userId)1820  void NotificationRequest::SetReceiverUserId(int32_t userId)
1821  {
1822      receiverUserId_ = userId;
1823  }
1824  
GetReceiverUserId() const1825  int32_t NotificationRequest::GetReceiverUserId() const
1826  {
1827      if (receiverUserId_ == SUBSCRIBE_USER_INIT) {
1828          if (ownerUserId_ == SUBSCRIBE_USER_INIT) {
1829              return creatorUserId_;
1830          }
1831          return ownerUserId_;
1832      }
1833      return receiverUserId_;
1834  }
1835  
IsRemoveAllowed() const1836  bool NotificationRequest::IsRemoveAllowed() const
1837  {
1838      return isRemoveAllowed_;
1839  }
1840  
SetRemoveAllowed(bool isRemoveAllowed)1841  void NotificationRequest::SetRemoveAllowed(bool isRemoveAllowed)
1842  {
1843      isRemoveAllowed_ = isRemoveAllowed;
1844  }
1845  
CopyBase(const NotificationRequest & other)1846  void NotificationRequest::CopyBase(const NotificationRequest &other)
1847  {
1848      this->notificationId_ = other.notificationId_;
1849      this->color_ = other.color_;
1850      this->badgeNumber_ = other.badgeNumber_;
1851      this->notificationControlFlags_ = other.notificationControlFlags_;
1852      this->progressValue_ = other.progressValue_;
1853      this->progressMax_ = other.progressMax_;
1854      this->createTime_ = other.createTime_;
1855      this->deliveryTime_ = other.deliveryTime_;
1856      this->autoDeletedTime_ = other.autoDeletedTime_;
1857      this->updateDeadLine_ = other.updateDeadLine_;
1858      this->finishDeadLine_ = other.finishDeadLine_;
1859  
1860      this->creatorPid_ = other.creatorPid_;
1861      this->creatorUid_ = other.creatorUid_;
1862      this->ownerUid_ = other.ownerUid_;
1863      this->creatorUserId_ = other.creatorUserId_;
1864      this->ownerUserId_ = other.ownerUserId_;
1865      this->receiverUserId_ = other.receiverUserId_;
1866      this->creatorInstanceKey_ = other.creatorInstanceKey_;
1867      this->isAgent_ = other.isAgent_;
1868      this->isRemoveAllowed_ = other.isRemoveAllowed_;
1869      this->isCoverActionButtons_ = other.isCoverActionButtons_;
1870      this->isUpdateByOwnerAllowed_ = other.isUpdateByOwnerAllowed_;
1871  
1872      this->slotType_ = other.slotType_;
1873      this->settingsText_ = other.settingsText_;
1874      this->creatorBundleName_ = other.creatorBundleName_;
1875      this->ownerBundleName_ = other.ownerBundleName_;
1876      this->groupName_ = other.groupName_;
1877      this->statusBarText_ = other.statusBarText_;
1878      this->label_ = other.label_;
1879      this->shortcutId_ = other.shortcutId_;
1880      this->sortingKey_ = other.sortingKey_;
1881      this->classification_ = other.classification_;
1882      this->appMessageId_ = other.appMessageId_;
1883      this->sound_ = other.sound_;
1884  
1885      this->groupAlertType_ = other.groupAlertType_;
1886      this->visiblenessType_ = other.visiblenessType_;
1887      this->badgeStyle_ = other.badgeStyle_;
1888      this->notificationContentType_ = other.notificationContentType_;
1889  }
1890  
CopyOther(const NotificationRequest & other)1891  void NotificationRequest::CopyOther(const NotificationRequest &other)
1892  {
1893      this->showDeliveryTime_ = other.showDeliveryTime_;
1894      this->tapDismissed_ = other.tapDismissed_;
1895      this->colorEnabled_ = other.colorEnabled_;
1896      this->alertOneTime_ = other.alertOneTime_;
1897      this->showStopwatch_ = other.showStopwatch_;
1898      this->isCountdown_ = other.isCountdown_;
1899      this->inProgress_ = other.inProgress_;
1900      this->groupOverview_ = other.groupOverview_;
1901      this->progressIndeterminate_ = other.progressIndeterminate_;
1902      this->unremovable_ = other.unremovable_;
1903      this->floatingIcon_ = other.floatingIcon_;
1904      this->onlyLocal_ = other.onlyLocal_;
1905      this->permitted_ = other.permitted_;
1906  
1907      this->wantAgent_ = other.wantAgent_;
1908      this->removalWantAgent_ = other.removalWantAgent_;
1909      this->maxScreenWantAgent_ = other.maxScreenWantAgent_;
1910      this->additionalParams_ = other.additionalParams_;
1911      this->littleIcon_ = other.littleIcon_;
1912      this->bigIcon_ = other.bigIcon_;
1913      this->overlayIcon_ = other.overlayIcon_;
1914      this->notificationContent_ = other.notificationContent_;
1915  
1916      this->actionButtons_ = other.actionButtons_;
1917      this->messageUsers_ = other.messageUsers_;
1918      this->userInputHistory_ = other.userInputHistory_;
1919  
1920      this->distributedOptions_ = other.distributedOptions_;
1921  
1922      this->notificationTemplate_ = other.notificationTemplate_;
1923      this->notificationFlags_ = other.notificationFlags_;
1924      this->agentBundle_ = other.agentBundle_;
1925      this->unifiedGroupInfo_ = other.unifiedGroupInfo_;
1926      this->notificationBundleOption_ = other.notificationBundleOption_;
1927      this->notificationFlagsOfDevices_ = other.notificationFlagsOfDevices_;
1928      this->publishDelayTime_ = other.publishDelayTime_;
1929  }
1930  
ConvertObjectsToJson(nlohmann::json & jsonObject) const1931  bool NotificationRequest::ConvertObjectsToJson(nlohmann::json &jsonObject) const
1932  {
1933      jsonObject["wantAgent"] = wantAgent_ ? AbilityRuntime::WantAgent::WantAgentHelper::ToString(wantAgent_) : "";
1934  
1935      nlohmann::json contentObj;
1936      if (notificationContent_) {
1937          if (!NotificationJsonConverter::ConvertToJson(notificationContent_.get(), contentObj)) {
1938              ANS_LOGE("Cannot convert notificationContent to JSON");
1939              return false;
1940          }
1941      }
1942      jsonObject["content"] = contentObj;
1943  
1944      nlohmann::json buttonsArr = nlohmann::json::array();
1945      for (auto &btn : actionButtons_) {
1946          if (!btn) {
1947              continue;
1948          }
1949  
1950          nlohmann::json btnObj;
1951          if (!NotificationJsonConverter::ConvertToJson(btn.get(), btnObj)) {
1952              ANS_LOGE("Cannot convert actionButton to JSON");
1953              return false;
1954          }
1955  
1956          buttonsArr.emplace_back(btnObj);
1957      }
1958      jsonObject["actionButtons"] = buttonsArr;
1959  
1960      std::string extraInfoStr;
1961      if (additionalParams_) {
1962          AAFwk::WantParamWrapper wWrapper(*additionalParams_);
1963          extraInfoStr = wWrapper.ToString();
1964      }
1965      jsonObject["extraInfo"] = extraInfoStr;
1966      jsonObject["smallIcon"] = AnsImageUtil::PackImage(littleIcon_);
1967      jsonObject["largeIcon"] = AnsImageUtil::PackImage(bigIcon_);
1968      jsonObject["overlayIcon"] = overlayIcon_ ? AnsImageUtil::PackImage(overlayIcon_) : "";
1969  
1970      nlohmann::json optObj;
1971      if (!NotificationJsonConverter::ConvertToJson(&distributedOptions_, optObj)) {
1972          ANS_LOGE("Cannot convert distributedOptions to JSON");
1973          return false;
1974      }
1975      jsonObject["distributedOptions"] = optObj;
1976  
1977      if (notificationFlags_) {
1978          nlohmann::json flagsObj;
1979          if (!NotificationJsonConverter::ConvertToJson(notificationFlags_.get(), flagsObj)) {
1980              ANS_LOGE("Cannot convert notificationFlags to JSON");
1981              return false;
1982          }
1983          jsonObject["notificationFlags"] = flagsObj;
1984      }
1985  
1986      if (notificationBundleOption_ != nullptr) {
1987          nlohmann::json bundleOptionObj;
1988          if (!NotificationJsonConverter::ConvertToJson(notificationBundleOption_.get(), bundleOptionObj)) {
1989              ANS_LOGE("Cannot convert notificationBundleOption to JSON.");
1990              return false;
1991          }
1992          jsonObject["notificationBundleOption"] = bundleOptionObj;
1993      }
1994  
1995      if (agentBundle_ != nullptr) {
1996          nlohmann::json bundleOptionObj;
1997          if (!NotificationJsonConverter::ConvertToJson(agentBundle_.get(), bundleOptionObj)) {
1998              ANS_LOGE("Cannot convert agentBundle to JSON.");
1999              return false;
2000          }
2001          jsonObject["agentBundle"] = bundleOptionObj;
2002      }
2003  
2004      return true;
2005  }
2006  
ConvertJsonToNumExt(NotificationRequest * target,const nlohmann::json & jsonObject)2007  void NotificationRequest::ConvertJsonToNumExt(
2008      NotificationRequest *target, const nlohmann::json &jsonObject)
2009  {
2010      const auto &jsonEnd = jsonObject.cend();
2011  
2012      if (jsonObject.find("updateDeadLine") != jsonEnd && jsonObject.at("updateDeadLine").is_number_integer()) {
2013          target->updateDeadLine_ = jsonObject.at("updateDeadLine").get<int64_t>();
2014      }
2015  
2016      if (jsonObject.find("finishDeadLine") != jsonEnd && jsonObject.at("finishDeadLine").is_number_integer()) {
2017          target->finishDeadLine_ = jsonObject.at("finishDeadLine").get<int64_t>();
2018      }
2019  
2020      if (jsonObject.find("ownerUserId") != jsonEnd && jsonObject.at("ownerUserId").is_number_integer()) {
2021          target->ownerUserId_ = jsonObject.at("ownerUserId").get<int32_t>();
2022      }
2023  
2024      if (jsonObject.find("ownerUid") != jsonEnd && jsonObject.at("ownerUid").is_number_integer()) {
2025          target->ownerUid_ = jsonObject.at("ownerUid").get<int32_t>();
2026      }
2027  
2028      if (jsonObject.find("notificationControlFlags") != jsonEnd &&
2029          jsonObject.at("notificationControlFlags").is_number_integer()) {
2030          target->notificationControlFlags_ = jsonObject.at("notificationControlFlags").get<uint32_t>();
2031      }
2032  }
2033  
ConvertJsonToNum(NotificationRequest * target,const nlohmann::json & jsonObject)2034  void NotificationRequest::ConvertJsonToNum(NotificationRequest *target, const nlohmann::json &jsonObject)
2035  {
2036      if (target == nullptr) {
2037          ANS_LOGE("Invalid input parameter");
2038          return;
2039      }
2040  
2041      const auto &jsonEnd = jsonObject.cend();
2042  
2043      if (jsonObject.find("id") != jsonEnd && jsonObject.at("id").is_number_integer()) {
2044          target->notificationId_ = jsonObject.at("id").get<int32_t>();
2045      }
2046  
2047      if (jsonObject.find("color") != jsonEnd && jsonObject.at("color").is_number_integer()) {
2048          target->color_ = jsonObject.at("color").get<uint32_t>();
2049      }
2050  
2051      if (jsonObject.find("deliveryTime") != jsonEnd && jsonObject.at("deliveryTime").is_number_integer()) {
2052          target->deliveryTime_ = jsonObject.at("deliveryTime").get<int64_t>();
2053      }
2054  
2055      if (jsonObject.find("autoDeletedTime") != jsonEnd && jsonObject.at("autoDeletedTime").is_number_integer()) {
2056          target->autoDeletedTime_ = jsonObject.at("autoDeletedTime").get<int64_t>();
2057      }
2058  
2059      if (jsonObject.find("creatorUid") != jsonEnd && jsonObject.at("creatorUid").is_number_integer()) {
2060          target->creatorUid_ = jsonObject.at("creatorUid").get<int32_t>();
2061      }
2062  
2063      if (jsonObject.find("creatorPid") != jsonEnd && jsonObject.at("creatorPid").is_number_integer()) {
2064          target->creatorPid_ = jsonObject.at("creatorPid").get<int32_t>();
2065      }
2066  
2067      if (jsonObject.find("creatorUserId") != jsonEnd && jsonObject.at("creatorUserId").is_number_integer()) {
2068          target->creatorUserId_ = jsonObject.at("creatorUserId").get<int32_t>();
2069      }
2070  
2071      if (jsonObject.find("receiverUserId") != jsonEnd && jsonObject.at("receiverUserId").is_number_integer()) {
2072          target->receiverUserId_ = jsonObject.at("receiverUserId").get<int32_t>();
2073      }
2074  
2075      if (jsonObject.find("creatorInstanceKey") != jsonEnd && jsonObject.at("creatorInstanceKey").is_number_integer()) {
2076          target->creatorInstanceKey_ = jsonObject.at("creatorInstanceKey").get<int32_t>();
2077      }
2078  
2079      if (jsonObject.find("badgeNumber") != jsonEnd && jsonObject.at("badgeNumber").is_number_integer()) {
2080          target->badgeNumber_ = jsonObject.at("badgeNumber").get<uint32_t>();
2081      }
2082  
2083      ConvertJsonToNumExt(target, jsonObject);
2084  }
2085  
ConvertJsonToString(NotificationRequest * target,const nlohmann::json & jsonObject)2086  void NotificationRequest::ConvertJsonToString(NotificationRequest *target, const nlohmann::json &jsonObject)
2087  {
2088      if (target == nullptr) {
2089          ANS_LOGE("Invalid input parameter");
2090          return;
2091      }
2092  
2093      const auto &jsonEnd = jsonObject.cend();
2094  
2095      if (jsonObject.find("creatorBundleName") != jsonEnd && jsonObject.at("creatorBundleName").is_string()) {
2096          target->creatorBundleName_ = jsonObject.at("creatorBundleName").get<std::string>();
2097      }
2098  
2099      if (jsonObject.find("ownerBundleName") != jsonEnd && jsonObject.at("ownerBundleName").is_string()) {
2100          target->ownerBundleName_ = jsonObject.at("ownerBundleName").get<std::string>();
2101      }
2102  
2103      if (jsonObject.find("groupName") != jsonEnd && jsonObject.at("groupName").is_string()) {
2104          target->groupName_ = jsonObject.at("groupName").get<std::string>();
2105      }
2106  
2107      if (jsonObject.find("label") != jsonEnd && jsonObject.at("label").is_string()) {
2108          target->label_ = jsonObject.at("label").get<std::string>();
2109      }
2110  
2111      if (jsonObject.find("classification") != jsonEnd && jsonObject.at("classification").is_string()) {
2112          target->classification_ = jsonObject.at("classification").get<std::string>();
2113      }
2114  
2115      if (jsonObject.find("creatorBundleName") != jsonEnd && jsonObject.at("creatorBundleName").is_string()) {
2116          target->creatorBundleName_ = jsonObject.at("creatorBundleName").get<std::string>();
2117      }
2118  }
2119  
ConvertJsonToEnum(NotificationRequest * target,const nlohmann::json & jsonObject)2120  void NotificationRequest::ConvertJsonToEnum(NotificationRequest *target, const nlohmann::json &jsonObject)
2121  {
2122      if (target == nullptr) {
2123          ANS_LOGE("Invalid input parameter");
2124          return;
2125      }
2126  
2127      const auto &jsonEnd = jsonObject.cend();
2128  
2129      if (jsonObject.find("slotType") != jsonEnd && jsonObject.at("slotType").is_number_integer()) {
2130          auto slotTypeValue  = jsonObject.at("slotType").get<int32_t>();
2131          target->slotType_ = static_cast<NotificationConstant::SlotType>(slotTypeValue);
2132      }
2133  
2134      if (jsonObject.find("badgeIconStyle") != jsonEnd && jsonObject.at("badgeIconStyle").is_number_integer()) {
2135          auto badgeStyleValue  = jsonObject.at("badgeIconStyle").get<int32_t>();
2136          target->badgeStyle_ = static_cast<NotificationRequest::BadgeStyle>(badgeStyleValue);
2137      }
2138  
2139      if (jsonObject.find("notificationContentType") != jsonEnd &&
2140          jsonObject.at("notificationContentType").is_number_integer()) {
2141          auto notificationContentType = jsonObject.at("notificationContentType").get<int32_t>();
2142          target->notificationContentType_ = static_cast<NotificationContent::Type>(notificationContentType);
2143      }
2144  }
2145  
ConvertJsonToBool(NotificationRequest * target,const nlohmann::json & jsonObject)2146  void NotificationRequest::ConvertJsonToBool(NotificationRequest *target, const nlohmann::json &jsonObject)
2147  {
2148      if (target == nullptr) {
2149          ANS_LOGE("Invalid input parameter");
2150          return;
2151      }
2152  
2153      const auto &jsonEnd = jsonObject.cend();
2154  
2155      if (jsonObject.find("showDeliveryTime") != jsonEnd && jsonObject.at("showDeliveryTime").is_boolean()) {
2156          target->showDeliveryTime_ = jsonObject.at("showDeliveryTime").get<bool>();
2157      }
2158  
2159      if (jsonObject.find("tapDismissed") != jsonEnd && jsonObject.at("tapDismissed").is_boolean()) {
2160          target->tapDismissed_ = jsonObject.at("tapDismissed").get<bool>();
2161      }
2162  
2163      if (jsonObject.find("colorEnabled") != jsonEnd && jsonObject.at("colorEnabled").is_boolean()) {
2164          target->colorEnabled_ = jsonObject.at("colorEnabled").get<bool>();
2165      }
2166  
2167      if (jsonObject.find("isOngoing") != jsonEnd && jsonObject.at("isOngoing").is_boolean()) {
2168          target->inProgress_ = jsonObject.at("isOngoing").get<bool>();
2169      }
2170  
2171      if (jsonObject.find("isAlertOnce") != jsonEnd && jsonObject.at("isAlertOnce").is_boolean()) {
2172          target->alertOneTime_ = jsonObject.at("isAlertOnce").get<bool>();
2173      }
2174  
2175      if (jsonObject.find("isStopwatch") != jsonEnd && jsonObject.at("isStopwatch").is_boolean()) {
2176          target->showStopwatch_ = jsonObject.at("isStopwatch").get<bool>();
2177      }
2178  
2179      if (jsonObject.find("isCountdown") != jsonEnd && jsonObject.at("isCountdown").is_boolean()) {
2180          target->isCountdown_ = jsonObject.at("isCountdown").get<bool>();
2181      }
2182  
2183      if (jsonObject.find("isUnremovable") != jsonEnd && jsonObject.at("isUnremovable").is_boolean()) {
2184          target->unremovable_ = jsonObject.at("isUnremovable").get<bool>();
2185      }
2186  
2187      if (jsonObject.find("isFloatingIcon") != jsonEnd && jsonObject.at("isFloatingIcon").is_boolean()) {
2188          target->floatingIcon_ = jsonObject.at("isFloatingIcon").get<bool>();
2189      }
2190  
2191      ConvertJsonToBoolExt(target, jsonObject);
2192  }
2193  
ConvertJsonToBoolExt(NotificationRequest * target,const nlohmann::json & jsonObject)2194  void NotificationRequest::ConvertJsonToBoolExt(NotificationRequest *target, const nlohmann::json &jsonObject)
2195  {
2196      const auto &jsonEnd = jsonObject.cend();
2197  
2198      if (jsonObject.find("isAgent") != jsonEnd && jsonObject.at("isAgent").is_boolean()) {
2199          target->isAgent_ = jsonObject.at("isAgent").get<bool>();
2200      }
2201  }
2202  
ConvertJsonToPixelMap(NotificationRequest * target,const nlohmann::json & jsonObject)2203  void NotificationRequest::ConvertJsonToPixelMap(NotificationRequest *target, const nlohmann::json &jsonObject)
2204  {
2205      if (target == nullptr) {
2206          ANS_LOGE("Invalid input parameter");
2207          return;
2208      }
2209  
2210      const auto &jsonEnd = jsonObject.cend();
2211  
2212      if (jsonObject.find("smallIcon") != jsonEnd && jsonObject.at("smallIcon").is_string()) {
2213          auto littleIconStr = jsonObject.at("smallIcon").get<std::string>();
2214          target->littleIcon_ = AnsImageUtil::UnPackImage(littleIconStr);
2215      }
2216  
2217      if (jsonObject.find("largeIcon") != jsonEnd && jsonObject.at("largeIcon").is_string()) {
2218          auto bigIconStr    = jsonObject.at("largeIcon").get<std::string>();
2219          target->bigIcon_ = AnsImageUtil::UnPackImage(bigIconStr);
2220      }
2221  
2222      if (jsonObject.find("overlayIcon") != jsonEnd && jsonObject.at("overlayIcon").is_string()) {
2223          auto overlayIconStr    = jsonObject.at("overlayIcon").get<std::string>();
2224          target->overlayIcon_ = AnsImageUtil::UnPackImage(overlayIconStr);
2225      }
2226  }
2227  
ConvertJsonToNotificationContent(NotificationRequest * target,const nlohmann::json & jsonObject)2228  bool NotificationRequest::ConvertJsonToNotificationContent(
2229      NotificationRequest *target, const nlohmann::json &jsonObject)
2230  {
2231      if (target == nullptr) {
2232          ANS_LOGE("Invalid input parameter");
2233          return false;
2234      }
2235  
2236      const auto &jsonEnd = jsonObject.cend();
2237  
2238      if (jsonObject.find("content") != jsonEnd) {
2239          auto contentObj = jsonObject.at("content");
2240          if (!contentObj.is_null()) {
2241              auto pContent = NotificationJsonConverter::ConvertFromJson<NotificationContent>(contentObj);
2242              if (pContent == nullptr) {
2243                  ANS_LOGE("Failed to parse notification content!");
2244                  return false;
2245              }
2246  
2247              target->notificationContent_ = std::shared_ptr<NotificationContent>(pContent);
2248          }
2249      }
2250  
2251      return true;
2252  }
2253  
ConvertJsonToNotificationActionButton(NotificationRequest * target,const nlohmann::json & jsonObject)2254  bool NotificationRequest::ConvertJsonToNotificationActionButton(
2255      NotificationRequest *target, const nlohmann::json &jsonObject)
2256  {
2257      if (target == nullptr) {
2258          ANS_LOGE("Invalid input parameter");
2259          return false;
2260      }
2261  
2262      const auto &jsonEnd = jsonObject.cend();
2263  
2264      if (jsonObject.find("actionButtons") != jsonEnd) {
2265          auto buttonArr = jsonObject.at("actionButtons");
2266          for (auto &btnObj : buttonArr) {
2267              auto pBtn = NotificationJsonConverter::ConvertFromJson<NotificationActionButton>(btnObj);
2268              if (pBtn == nullptr) {
2269                  ANS_LOGE("Failed to parse actionButton!");
2270                  return false;
2271              }
2272  
2273              target->actionButtons_.emplace_back(pBtn);
2274          }
2275      }
2276  
2277      return true;
2278  }
2279  
ConvertJsonToNotificationDistributedOptions(NotificationRequest * target,const nlohmann::json & jsonObject)2280  bool NotificationRequest::ConvertJsonToNotificationDistributedOptions(
2281      NotificationRequest *target, const nlohmann::json &jsonObject)
2282  {
2283      if (target == nullptr) {
2284          ANS_LOGE("Invalid input parameter");
2285          return false;
2286      }
2287  
2288      const auto &jsonEnd = jsonObject.cend();
2289  
2290      if (jsonObject.find("distributedOptions") != jsonEnd) {
2291          auto optObj = jsonObject.at("distributedOptions");
2292          if (!optObj.is_null()) {
2293              auto *pOpt = NotificationJsonConverter::ConvertFromJson<NotificationDistributedOptions>(optObj);
2294              if (pOpt == nullptr) {
2295                  ANS_LOGE("Failed to parse distributedOptions!");
2296                  return false;
2297              }
2298  
2299              target->distributedOptions_ = *pOpt;
2300              delete pOpt;
2301          }
2302      }
2303  
2304      return true;
2305  }
2306  
ConvertJsonToNotificationFlags(NotificationRequest * target,const nlohmann::json & jsonObject)2307  bool NotificationRequest::ConvertJsonToNotificationFlags(
2308      NotificationRequest *target, const nlohmann::json &jsonObject)
2309  {
2310      if (target == nullptr) {
2311          ANS_LOGE("Invalid input parameter");
2312          return false;
2313      }
2314  
2315      const auto &jsonEnd = jsonObject.cend();
2316  
2317      if (jsonObject.find("notificationFlags") != jsonEnd) {
2318          auto flagsObj = jsonObject.at("notificationFlags");
2319          if (!flagsObj.is_null()) {
2320              auto *pFlags = NotificationJsonConverter::ConvertFromJson<NotificationFlags>(flagsObj);
2321              if (pFlags == nullptr) {
2322                  ANS_LOGE("Failed to parse notificationFlags!");
2323                  return false;
2324              }
2325  
2326              target->notificationFlags_ = std::shared_ptr<NotificationFlags>(pFlags);
2327          }
2328      }
2329  
2330      return true;
2331  }
2332  
ConvertJsonToNotificationBundleOption(NotificationRequest * target,const nlohmann::json & jsonObject)2333  bool NotificationRequest::ConvertJsonToNotificationBundleOption(
2334      NotificationRequest *target, const nlohmann::json &jsonObject)
2335  {
2336      if (target == nullptr) {
2337          ANS_LOGE("Invalid input parameter.");
2338          return false;
2339      }
2340  
2341      const auto &jsonEnd = jsonObject.cend();
2342  
2343      if (jsonObject.find("notificationBundleOption") != jsonEnd) {
2344          auto bundleOptionObj = jsonObject.at("notificationBundleOption");
2345          if (!bundleOptionObj.is_null()) {
2346              auto *pBundleOption = NotificationJsonConverter::ConvertFromJson<NotificationBundleOption>(bundleOptionObj);
2347              if (pBundleOption == nullptr) {
2348                  ANS_LOGE("Failed to parse notificationBundleOption!");
2349                  return false;
2350              }
2351  
2352              target->notificationBundleOption_ = std::shared_ptr<NotificationBundleOption>(pBundleOption);
2353          }
2354      }
2355  
2356      return true;
2357  }
2358  
ConvertJsonToAgentBundle(NotificationRequest * target,const nlohmann::json & jsonObject)2359  bool NotificationRequest::ConvertJsonToAgentBundle(
2360      NotificationRequest *target, const nlohmann::json &jsonObject)
2361  {
2362      if (target == nullptr) {
2363          ANS_LOGE("Invalid input parameter.");
2364          return false;
2365      }
2366  
2367      const auto &jsonEnd = jsonObject.cend();
2368  
2369      if (jsonObject.find("agentBundle") != jsonEnd) {
2370          auto bundleOptionObj = jsonObject.at("agentBundle");
2371          if (!bundleOptionObj.is_null()) {
2372              auto *pBundleOption = NotificationJsonConverter::ConvertFromJson<NotificationBundleOption>(bundleOptionObj);
2373              if (pBundleOption == nullptr) {
2374                  ANS_LOGE("Failed to parse agentBundle!");
2375                  return false;
2376              }
2377  
2378              target->agentBundle_ = std::shared_ptr<NotificationBundleOption>(pBundleOption);
2379          }
2380      }
2381  
2382      return true;
2383  }
2384  
IsCommonLiveView() const2385  bool NotificationRequest::IsCommonLiveView() const
2386  {
2387      return (slotType_ == NotificationConstant::SlotType::LIVE_VIEW) &&
2388          (notificationContentType_ == NotificationContent::Type::LIVE_VIEW);
2389  }
2390  
IsSystemLiveView() const2391  bool NotificationRequest::IsSystemLiveView() const
2392  {
2393      return (slotType_ == NotificationConstant::SlotType::LIVE_VIEW) &&
2394          (notificationContentType_ == NotificationContent::Type::LOCAL_LIVE_VIEW);
2395  }
2396  
CheckVersion(const sptr<NotificationRequest> & oldRequest) const2397  ErrCode NotificationRequest::CheckVersion(const sptr<NotificationRequest> &oldRequest) const
2398  {
2399      auto content = notificationContent_->GetNotificationContent();
2400      auto liveView = std::static_pointer_cast<NotificationLiveViewContent>(content);
2401      auto oldContent = oldRequest->GetContent()->GetNotificationContent();
2402      auto oldLiveView = std::static_pointer_cast<NotificationLiveViewContent>(oldContent);
2403  
2404      if (oldLiveView->GetVersion() == NotificationLiveViewContent::MAX_VERSION) {
2405          return ERR_OK;
2406      }
2407      if (liveView->GetVersion() == NotificationLiveViewContent::MAX_VERSION) {
2408          ANS_LOGE("Invalid version, creator bundle name %{public}s, id %{public}d, "
2409              "old version %{public}u, new version %{public}u.", GetCreatorBundleName().c_str(),
2410              GetNotificationId(), oldLiveView->GetVersion(), liveView->GetVersion());
2411          return ERR_ANS_EXPIRED_NOTIFICATION;
2412      }
2413      if (oldLiveView->GetVersion() >= liveView->GetVersion()) {
2414          ANS_LOGE("Live view has finished, creator bundle name %{public}s, id %{public}d, "
2415              "old version %{public}u, new version %{public}u.", GetCreatorBundleName().c_str(),
2416              GetNotificationId(), oldLiveView->GetVersion(), liveView->GetVersion());
2417          return ERR_ANS_EXPIRED_NOTIFICATION;
2418      }
2419      return ERR_OK;
2420  }
2421  
CheckNotificationRequest(const sptr<NotificationRequest> & oldRequest) const2422  ErrCode NotificationRequest::CheckNotificationRequest(const sptr<NotificationRequest> &oldRequest) const
2423  {
2424      if (!IsCommonLiveView()) {
2425          if ((oldRequest != nullptr) && oldRequest->IsCommonLiveView()) {
2426              ANS_LOGE("Invalid new request param, slot type %{public}d, content type %{public}d.",
2427                  GetSlotType(), GetNotificationType());
2428              return ERR_ANS_INVALID_PARAM;
2429          }
2430          return ERR_OK;
2431      }
2432  
2433      using StatusType = NotificationLiveViewContent::LiveViewStatus;
2434      auto content = notificationContent_->GetNotificationContent();
2435      auto liveView = std::static_pointer_cast<NotificationLiveViewContent>(content);
2436      auto status = liveView->GetLiveViewStatus();
2437      if (oldRequest == nullptr) {
2438          if (status != StatusType::LIVE_VIEW_CREATE) {
2439              ANS_LOGE("Doesn't exist live view, bundle name %{public}s, id %{public}d.",
2440                  GetCreatorBundleName().c_str(), GetNotificationId());
2441              return ERR_ANS_NOTIFICATION_NOT_EXISTS;
2442          }
2443          return ERR_OK;
2444      }
2445  
2446      if (!oldRequest->IsCommonLiveView()) {
2447          ANS_LOGE("Invalid old request param, slot type %{public}d, content type %{public}d.",
2448              oldRequest->GetSlotType(), oldRequest->GetNotificationType());
2449          return ERR_ANS_INVALID_PARAM;
2450      }
2451  
2452      if (status == StatusType::LIVE_VIEW_CREATE) {
2453          ANS_LOGW("Repeat create live view, bundle name %{public}s, id %{public}d.",
2454              GetCreatorBundleName().c_str(), GetNotificationId());
2455          return ERR_ANS_REPEAT_CREATE;
2456      }
2457  
2458      auto oldContent = oldRequest->GetContent()->GetNotificationContent();
2459      auto oldLiveView = std::static_pointer_cast<NotificationLiveViewContent>(oldContent);
2460      auto oldStatus = oldLiveView->GetLiveViewStatus();
2461      if (oldStatus == StatusType::LIVE_VIEW_END) {
2462          ANS_LOGW("Live view has finished, bundle name %{public}s, id %{public}d.",
2463              GetCreatorBundleName().c_str(), GetNotificationId());
2464          return ERR_ANS_END_NOTIFICATION;
2465      }
2466  
2467      return CheckVersion(oldRequest);
2468  }
2469  
FillMissingParameters(const sptr<NotificationRequest> & oldRequest)2470  void NotificationRequest::FillMissingParameters(const sptr<NotificationRequest> &oldRequest)
2471  {
2472      if (!IsCommonLiveView() || (oldRequest == nullptr)) {
2473          return;
2474      }
2475  
2476      updateDeadLine_ = oldRequest->updateDeadLine_;
2477      finishDeadLine_ = oldRequest->finishDeadLine_;
2478      if (autoDeletedTime_ == NotificationConstant::INVALID_AUTO_DELETE_TIME) {
2479          autoDeletedTime_ = oldRequest->autoDeletedTime_;
2480      }
2481      if (wantAgent_ == nullptr) {
2482          wantAgent_ = oldRequest->wantAgent_;
2483      }
2484  
2485      auto content = notificationContent_->GetNotificationContent();
2486      auto newLiveViewContent = std::static_pointer_cast<NotificationLiveViewContent>(content);
2487      if (newLiveViewContent->GetLiveViewStatus() ==
2488          NotificationLiveViewContent::LiveViewStatus::LIVE_VIEW_FULL_UPDATE) {
2489          return;
2490      }
2491      auto newExtraInfo = newLiveViewContent->GetExtraInfo();
2492      auto oldContent = oldRequest->GetContent()->GetNotificationContent();
2493      auto oldLiveViewContent = std::static_pointer_cast<NotificationLiveViewContent>(oldContent);
2494      auto oldExtraInfo = oldLiveViewContent->GetExtraInfo();
2495      if (newExtraInfo == nullptr) {
2496          newLiveViewContent->SetExtraInfo(oldExtraInfo);
2497      } else if (oldExtraInfo != nullptr) {
2498          auto oldKeySet = oldExtraInfo->KeySet();
2499          for (const auto &key : oldKeySet) {
2500              if (!newExtraInfo->HasParam(key)) {
2501                  newExtraInfo->SetParam(key, oldExtraInfo->GetParam(key));
2502              }
2503          }
2504      }
2505  
2506      auto oldIsOnlyLocalUpdate = oldLiveViewContent->GetIsOnlyLocalUpdate();
2507      if (oldIsOnlyLocalUpdate!= newLiveViewContent->GetIsOnlyLocalUpdate()) {
2508          newLiveViewContent->SetIsOnlyLocalUpdate(oldIsOnlyLocalUpdate);
2509      }
2510  
2511      auto newPicture = newLiveViewContent->GetPicture();
2512      auto oldPicture = oldLiveViewContent->GetPicture();
2513      bool isSet = false;
2514      for (const auto &pictureRecord : oldPicture) {
2515          if (newPicture.find(pictureRecord.first) != newPicture.end()) {
2516              continue;
2517          }
2518          newPicture[pictureRecord.first] = pictureRecord.second;
2519          isSet = true;
2520      }
2521      if (isSet) {
2522          newLiveViewContent->SetPicture(newPicture);
2523      }
2524  }
2525  
GetBaseKey(const std::string & deviceId)2526  std::string NotificationRequest::GetBaseKey(const std::string &deviceId)
2527  {
2528      const char *keySpliter = "_";
2529  
2530      std::stringstream stream;
2531      if (IsAgentNotification()) {
2532          stream << deviceId << keySpliter << ownerUserId_ << keySpliter <<
2533              ownerUid_ << keySpliter << ownerBundleName_ << keySpliter <<
2534              label_ << keySpliter << notificationId_;
2535      } else {
2536          stream << deviceId << keySpliter << creatorUserId_ << keySpliter <<
2537              creatorUid_ << keySpliter << creatorBundleName_ << keySpliter <<
2538              label_ << keySpliter << notificationId_;
2539      }
2540      return stream.str();
2541  }
2542  
GetKey()2543  std::string NotificationRequest::GetKey()
2544  {
2545      std::stringstream stream;
2546      const char *keySpliter = "_";
2547      stream << REQUEST_STORAGE_KEY_PREFIX << keySpliter << GetBaseKey("");
2548      return stream.str();
2549  }
2550  
GetSecureKey()2551  std::string NotificationRequest::GetSecureKey()
2552  {
2553      std::stringstream stream;
2554      const char *keySpliter = "_";
2555      stream << REQUEST_STORAGE_SECURE_KEY_PREFIX << keySpliter << GetBaseKey("");
2556      return stream.str();
2557  }
2558  
CheckImageOverSizeForPixelMap(const std::shared_ptr<Media::PixelMap> & pixelMap,uint32_t maxSize)2559  bool NotificationRequest::CheckImageOverSizeForPixelMap(
2560      const std::shared_ptr<Media::PixelMap> &pixelMap, uint32_t maxSize)
2561  {
2562      if (pixelMap == nullptr) {
2563          return false;
2564      }
2565  
2566      auto size = static_cast<uint32_t>(pixelMap->GetByteCount());
2567      return size > maxSize;
2568  }
2569  
CheckImageSizeForConverSation(std::shared_ptr<NotificationBasicContent> & content)2570  ErrCode NotificationRequest::CheckImageSizeForConverSation(std::shared_ptr<NotificationBasicContent> &content)
2571  {
2572      auto conversationalContent = std::static_pointer_cast<NotificationConversationalContent>(content);
2573      auto picture = conversationalContent->GetMessageUser().GetPixelMap();
2574      if (CheckImageOverSizeForPixelMap(picture, MAX_ICON_SIZE)) {
2575          ANS_LOGE("The size of picture in ConversationalContent's message user exceeds limit");
2576          return ERR_ANS_ICON_OVER_SIZE;
2577      }
2578  
2579      auto messages = conversationalContent->GetAllConversationalMessages();
2580      for (auto &msg : messages) {
2581          if (!msg) {
2582              continue;
2583          }
2584          auto img = msg->GetSender().GetPixelMap();
2585          if (CheckImageOverSizeForPixelMap(img, MAX_ICON_SIZE)) {
2586              ANS_LOGE("The size of picture in ConversationalContent's message exceeds limit");
2587              return ERR_ANS_ICON_OVER_SIZE;
2588          }
2589      }
2590      return ERR_OK;
2591  }
2592  
CheckImageSizeForPicture(std::shared_ptr<NotificationBasicContent> & content)2593  ErrCode NotificationRequest::CheckImageSizeForPicture(std::shared_ptr<NotificationBasicContent> &content)
2594  {
2595      auto pictureContent = std::static_pointer_cast<NotificationPictureContent>(content);
2596      auto bigPicture = pictureContent->GetBigPicture();
2597      if (CheckImageOverSizeForPixelMap(bigPicture, MAX_PICTURE_SIZE)) {
2598          ANS_LOGE("The size of big picture in PictureContent exceeds limit");
2599          return ERR_ANS_PICTURE_OVER_SIZE;
2600      }
2601      return ERR_OK;
2602  }
2603  
CheckImageSizeForLiveView(std::shared_ptr<NotificationBasicContent> & content)2604  ErrCode NotificationRequest::CheckImageSizeForLiveView(std::shared_ptr<NotificationBasicContent> &content)
2605  {
2606      auto liveViewContent = std::static_pointer_cast<NotificationLiveViewContent>(content);
2607      auto pictureMap = liveViewContent->GetPicture();
2608      for (const auto &pixelMapRecord : pictureMap) {
2609          if (pixelMapRecord.second.empty()) {
2610              ANS_LOGE("Picture key exist, but picture content is empty.");
2611              return ERR_ANS_INVALID_PARAM;
2612          }
2613          if (pixelMapRecord.second.size() > MAX_LIVE_VIEW_ICON_NUM) {
2614              ANS_LOGE("Picture key exist, but picture content count exceeds limit.");
2615              return ERR_ANS_INVALID_PARAM;
2616          }
2617          for (const auto &pixelMap : pixelMapRecord.second) {
2618              if (CheckImageOverSizeForPixelMap(pixelMap, MAX_ICON_SIZE)) {
2619                  ANS_LOGE("The size of big picture in PictureContent exceeds limit.");
2620                  return ERR_ANS_ICON_OVER_SIZE;
2621              }
2622          }
2623      }
2624      return ERR_OK;
2625  }
2626  
CheckImageSizeForContent() const2627  ErrCode NotificationRequest::CheckImageSizeForContent() const
2628  {
2629      auto content = GetContent();
2630      if (content == nullptr) {
2631          ANS_LOGE("Invalid content in NotificationRequest");
2632          return ERR_OK;
2633      }
2634  
2635      auto basicContent = GetContent()->GetNotificationContent();
2636      if (basicContent == nullptr) {
2637          ANS_LOGE("Invalid content in NotificationRequest");
2638          return ERR_OK;
2639      }
2640  
2641      if (GetSlotType() == NotificationConstant::SlotType::LIVE_VIEW) {
2642          auto result = CheckLockScreenPictureSizeForLiveView(basicContent);
2643          if (result != ERR_OK) {
2644              return result;
2645          }
2646      }
2647  
2648      auto contentType = GetNotificationType();
2649      switch (contentType) {
2650          case NotificationContent::Type::CONVERSATION:
2651              return CheckImageSizeForConverSation(basicContent);
2652          case NotificationContent::Type::PICTURE:
2653              return CheckImageSizeForPicture(basicContent);
2654          case NotificationContent::Type::LIVE_VIEW:
2655              return CheckImageSizeForLiveView(basicContent);
2656          default:
2657              return ERR_OK;
2658      }
2659  }
2660  
SetIsCoverActionButtons(bool isCoverActionButtons)2661  void NotificationRequest::SetIsCoverActionButtons(bool isCoverActionButtons)
2662  {
2663      isCoverActionButtons_ = isCoverActionButtons;
2664  }
2665  
IsCoverActionButtons() const2666  bool NotificationRequest::IsCoverActionButtons() const
2667  {
2668      return isCoverActionButtons_;
2669  }
2670  
SetAppMessageId(const std::string & appMessageId)2671  void NotificationRequest::SetAppMessageId(const std::string &appMessageId)
2672  {
2673      appMessageId_ = appMessageId;
2674  }
2675  
GetAppMessageId() const2676  std::string NotificationRequest::GetAppMessageId() const
2677  {
2678      return appMessageId_;
2679  }
2680  
SetSound(const std::string & sound)2681  void NotificationRequest::SetSound(const std::string &sound)
2682  {
2683      sound_ = sound;
2684  }
2685  
GetSound() const2686  std::string NotificationRequest::GetSound() const
2687  {
2688      return sound_;
2689  }
2690  
GenerateUniqueKey()2691  std::string NotificationRequest::GenerateUniqueKey()
2692  {
2693      const char *keySpliter = "_";
2694      int typeFlag = 0;
2695      if (GetSlotType() == NotificationConstant::SlotType::LIVE_VIEW) {
2696          typeFlag = 1;
2697      }
2698  
2699      std::stringstream stream;
2700      if (IsAgentNotification()) {
2701          stream << ownerUid_ << keySpliter << ownerBundleName_ << keySpliter << ownerUserId_ << keySpliter <<
2702              typeFlag << keySpliter << appMessageId_;
2703      } else {
2704          stream << creatorUid_ << keySpliter << creatorBundleName_ << keySpliter << creatorUserId_ << keySpliter <<
2705              typeFlag << keySpliter << appMessageId_;
2706      }
2707      return stream.str();
2708  }
2709  
SetUnifiedGroupInfo(const std::shared_ptr<NotificationUnifiedGroupInfo> & unifiedGroupInfo)2710  void NotificationRequest::SetUnifiedGroupInfo(const std::shared_ptr<NotificationUnifiedGroupInfo> &unifiedGroupInfo)
2711  {
2712      unifiedGroupInfo_ = unifiedGroupInfo;
2713  }
2714  
GetUnifiedGroupInfo() const2715  std::shared_ptr<NotificationUnifiedGroupInfo> NotificationRequest::GetUnifiedGroupInfo() const
2716  {
2717      return unifiedGroupInfo_;
2718  }
2719  
CheckLockScreenPictureSizeForLiveView(std::shared_ptr<NotificationBasicContent> & content)2720  ErrCode NotificationRequest::CheckLockScreenPictureSizeForLiveView(std::shared_ptr<NotificationBasicContent> &content)
2721  {
2722      auto lockScreenPicture = content->GetLockScreenPicture();
2723      if (CheckImageOverSizeForPixelMap(lockScreenPicture, MAX_PICTURE_SIZE)) {
2724          ANS_LOGE("The size of lockScreen picture in live view exceeds limit");
2725          return ERR_ANS_PICTURE_OVER_SIZE;
2726      }
2727      return ERR_OK;
2728  }
2729  
SetPublishDelayTime(uint32_t delayTime)2730  void NotificationRequest::SetPublishDelayTime(uint32_t delayTime)
2731  {
2732      publishDelayTime_ = delayTime;
2733  }
2734  
GetPublishDelayTime() const2735  uint32_t NotificationRequest::GetPublishDelayTime() const
2736  {
2737      return publishDelayTime_;
2738  }
2739  
SetUpdateByOwnerAllowed(bool isUpdateByOwnerAllowed)2740  void NotificationRequest::SetUpdateByOwnerAllowed(bool isUpdateByOwnerAllowed)
2741  {
2742      isUpdateByOwnerAllowed_ = isUpdateByOwnerAllowed;
2743  }
2744  
IsUpdateByOwnerAllowed() const2745  bool NotificationRequest::IsUpdateByOwnerAllowed() const
2746  {
2747      return isUpdateByOwnerAllowed_;
2748  }
2749  
GetLittleIconType() const2750  const std::string NotificationRequest::GetLittleIconType() const
2751  {
2752      return littleIconType_;
2753  }
2754  }  // namespace Notification
2755  }  // namespace OHOS
2756