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