• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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_subscriber.h"
17 
18 #include "ans_trace_wrapper.h"
19 #include "notification_constant.h"
20 #include "hitrace_meter_adapter.h"
21 #include "iservice_registry.h"
22 #include "system_ability_definition.h"
23 
24 namespace OHOS {
25 namespace Notification {
NotificationSubscriber()26 NotificationSubscriber::NotificationSubscriber()
27 {
28     impl_ = new (std::nothrow) SubscriberImpl(*this);
29     deviceType_ = NotificationConstant::CURRENT_DEVICE_TYPE;
30 };
31 
~NotificationSubscriber()32 NotificationSubscriber::~NotificationSubscriber()
33 {}
34 
SetDeviceType(const std::string & deviceType)35 void NotificationSubscriber::SetDeviceType(const std::string &deviceType)
36 {
37     deviceType_ = deviceType;
38 }
39 
GetDeviceType() const40 std::string NotificationSubscriber::GetDeviceType() const
41 {
42     return deviceType_;
43 }
44 
SyncLiveViewVoip(const std::string & deviceType,std::shared_ptr<Notification> & notification) const45 bool NotificationSubscriber::SyncLiveViewVoip(
46     const std::string &deviceType, std::shared_ptr<Notification> &notification) const
47 {
48     sptr<NotificationRequest> request = notification->GetNotificationRequestPoint();
49     if (request == nullptr) {
50         ANS_LOGE("No need to consume cause invalid reqeuest.");
51         return false;
52     }
53     if (request->GetClassification() == NotificationConstant::ANS_VOIP &&
54         request->GetSlotType() == NotificationConstant::LIVE_VIEW &&
55         (deviceType == CURRENT_DEVICE_TYPE || deviceType == NotificationConstant::LITEWEARABLE_DEVICE_TYPE ||
56         deviceType == NotificationConstant::HEADSET_DEVICE_TYPE || deviceType ==
57         NotificationConstant::WEARABLE_DEVICE_TYPE)) {
58         return true;
59     }
60     return false;
61 }
62 
63 #ifdef NOTIFICATION_SMART_REMINDER_SUPPORTED
ProcessSyncDecision(const std::string & deviceType,std::shared_ptr<Notification> & notification) const64 bool NotificationSubscriber::ProcessSyncDecision(
65     const std::string &deviceType, std::shared_ptr<Notification> &notification) const
66 {
67     sptr<NotificationRequest> request = notification->GetNotificationRequestPoint();
68     if (request == nullptr) {
69         ANS_LOGE("null request");
70         return false;
71     }
72 
73     auto flagsMap = request->GetDeviceFlags();
74     if (flagsMap == nullptr || flagsMap->size() <= 0) {
75         return true;
76     }
77     auto flagIter = flagsMap->find(deviceType);
78     if (flagIter != flagsMap->end() && flagIter->second != nullptr) {
79         request->SetFlags(flagIter->second);
80         ANS_LOGI("SetFlags-final, notificationKey = %{public}s flags = %{public}d deviceType: %{public}s.",
81             request->GetKey().c_str(), request->GetFlags()->GetReminderFlags(), deviceType.c_str());
82         return true;
83     }
84     if (deviceType.size() <= 0 || deviceType.compare(NotificationConstant::CURRENT_DEVICE_TYPE) == 0) {
85         return true;
86     }
87     ANS_LOGE("Cannot find deviceFlags,notificationKey = %{public}s, deviceType: %{public}s.",
88         request->GetKey().c_str(), deviceType.c_str());
89     return false;
90 }
91 
DowngradeReminder(const NotificationConstant::FlagStatus & oldFlags,const NotificationConstant::FlagStatus & judgeFlags) const92 NotificationConstant::FlagStatus NotificationSubscriber::DowngradeReminder(
93     const NotificationConstant::FlagStatus &oldFlags, const NotificationConstant::FlagStatus &judgeFlags) const
94 {
95     if (judgeFlags == NotificationConstant::FlagStatus::NONE || oldFlags == NotificationConstant::FlagStatus::NONE) {
96         return NotificationConstant::FlagStatus::NONE;
97     }
98     if (judgeFlags > oldFlags) {
99         return judgeFlags;
100     } else {
101         return oldFlags;
102     }
103 }
104 #endif
105 
GetImpl() const106 const sptr<NotificationSubscriber::SubscriberImpl> NotificationSubscriber::GetImpl() const
107 {
108     return impl_;
109 }
110 
SubscriberImpl(NotificationSubscriber & subscriber)111 NotificationSubscriber::SubscriberImpl::SubscriberImpl(NotificationSubscriber &subscriber) : subscriber_(subscriber)
112 {
113     recipient_ = new (std::nothrow) DeathRecipient(*this);
114 };
115 
OnConnected()116 ErrCode NotificationSubscriber::SubscriberImpl::OnConnected()
117 {
118     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
119     sptr<IAnsManager> proxy = GetAnsManagerProxy();
120     if (proxy != nullptr) {
121         proxy->AsObject()->AddDeathRecipient(recipient_);
122         ANS_LOGD("%s, Add death recipient.", __func__);
123     }
124     subscriber_.OnConnected();
125     return ERR_OK;
126 }
127 
OnDisconnected()128 ErrCode NotificationSubscriber::SubscriberImpl::OnDisconnected()
129 {
130     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
131     sptr<IAnsManager> proxy = GetAnsManagerProxy();
132     if (proxy != nullptr) {
133         proxy->AsObject()->RemoveDeathRecipient(recipient_);
134         ANS_LOGD("%s, Remove death recipient.", __func__);
135     }
136     subscriber_.OnDisconnected();
137     return ERR_OK;
138 }
139 
OnConsumed(const sptr<Notification> & notification,const sptr<NotificationSortingMap> & notificationMap)140 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumed(
141     const sptr<Notification> &notification, const sptr<NotificationSortingMap> &notificationMap)
142 {
143     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
144     if (notificationMap == nullptr) {
145         ANS_LOGE("null notificationMap");
146         return ERR_INVALID_DATA;
147     }
148     std::shared_ptr<Notification> sharedNotification = std::make_shared<Notification>(*notification);
149     auto deviceType = subscriber_.GetDeviceType();
150     if (subscriber_.SyncLiveViewVoip(deviceType, sharedNotification)) {
151         ANS_LOGI("Sync LIVE_VIEW VOIP.");
152     }
153 #ifdef NOTIFICATION_SMART_REMINDER_SUPPORTED
154     else if (!subscriber_.ProcessSyncDecision(deviceType, sharedNotification)) {
155         return ERR_OK;
156     }
157 #endif
158     subscriber_.OnConsumed(
159         sharedNotification, std::make_shared<NotificationSortingMap>(*notificationMap));
160     return ERR_OK;
161 }
162 
OnConsumed(const sptr<Notification> & notification)163 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumed(const sptr<Notification> &notification)
164 {
165     return OnConsumed(notification, nullptr);
166 }
167 
OnConsumedWithMaxCapacity(const sptr<Notification> & notification,const sptr<NotificationSortingMap> & notificationMap)168 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumedWithMaxCapacity(
169     const sptr<Notification> &notification, const sptr<NotificationSortingMap> &notificationMap)
170 {
171     return OnConsumed(notification, notificationMap);
172 }
173 
OnConsumedWithMaxCapacity(const sptr<Notification> & notification)174 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumedWithMaxCapacity(const sptr<Notification> &notification)
175 {
176     return OnConsumed(notification, nullptr);
177 }
178 
OnConsumedList(const std::vector<sptr<Notification>> & notifications,const sptr<NotificationSortingMap> & notificationMap)179 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumedList(const std::vector<sptr<Notification>> &notifications,
180     const sptr<NotificationSortingMap> &notificationMap)
181 {
182     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
183     for (auto notification : notifications) {
184         OnConsumed(notification, notificationMap);
185     }
186     return ERR_OK;
187 }
188 
OnConsumedList(const std::vector<sptr<Notification>> & notifications)189 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumedList(const std::vector<sptr<Notification>> &notifications)
190 {
191     return OnConsumedList(notifications, nullptr);
192 }
193 
OnCanceled(const sptr<Notification> & notification,const sptr<NotificationSortingMap> & notificationMap,int32_t deleteReason)194 ErrCode NotificationSubscriber::SubscriberImpl::OnCanceled(
195     const sptr<Notification> &notification, const sptr<NotificationSortingMap> &notificationMap, int32_t deleteReason)
196 {
197     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
198     if (notificationMap == nullptr) {
199         subscriber_.OnCanceled(std::make_shared<Notification>(*notification),
200             std::make_shared<NotificationSortingMap>(), deleteReason);
201     } else {
202         subscriber_.OnCanceled(std::make_shared<Notification>(*notification),
203             std::make_shared<NotificationSortingMap>(*notificationMap), deleteReason);
204     }
205     return ERR_OK;
206 }
207 
OnCanceled(const sptr<Notification> & notification,int32_t deleteReason)208 ErrCode NotificationSubscriber::SubscriberImpl::OnCanceled(
209     const sptr<Notification> &notification, int32_t deleteReason)
210 {
211     return OnCanceled(notification, nullptr, deleteReason);
212 }
213 
OnCanceledWithMaxCapacity(const sptr<Notification> & notification,const sptr<NotificationSortingMap> & notificationMap,int32_t deleteReason)214 ErrCode NotificationSubscriber::SubscriberImpl::OnCanceledWithMaxCapacity(
215     const sptr<Notification> &notification, const sptr<NotificationSortingMap> &notificationMap, int32_t deleteReason)
216 {
217     return OnCanceled(notification, notificationMap, deleteReason);
218 }
219 
OnCanceledWithMaxCapacity(const sptr<Notification> & notification,int32_t deleteReason)220 ErrCode NotificationSubscriber::SubscriberImpl::OnCanceledWithMaxCapacity(
221     const sptr<Notification> &notification, int32_t deleteReason)
222 {
223     return OnCanceled(notification, nullptr, deleteReason);
224 }
225 
OnBatchCanceled(const std::vector<sptr<Notification>> & notifications,const sptr<NotificationSortingMap> & notificationMap,int32_t deleteReason)226 void NotificationSubscriber::SubscriberImpl::OnBatchCanceled(const std::vector<sptr<Notification>> &notifications,
227     const sptr<NotificationSortingMap> &notificationMap, int32_t deleteReason)
228 {
229     std::vector<std::shared_ptr<Notification>> notificationList;
230     for (auto notification : notifications) {
231         notificationList.emplace_back(std::make_shared<Notification>(*notification));
232     }
233     if (notificationMap == nullptr) {
234         subscriber_.OnBatchCanceled(notificationList,
235             std::make_shared<NotificationSortingMap>(), deleteReason);
236     } else {
237         subscriber_.OnBatchCanceled(notificationList,
238             std::make_shared<NotificationSortingMap>(*notificationMap), deleteReason);
239     }
240 }
241 
242 
OnCanceledList(const std::vector<sptr<Notification>> & notifications,const sptr<NotificationSortingMap> & notificationMap,int32_t deleteReason)243 ErrCode NotificationSubscriber::SubscriberImpl::OnCanceledList(const std::vector<sptr<Notification>> &notifications,
244     const sptr<NotificationSortingMap> &notificationMap, int32_t deleteReason)
245 {
246     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
247     if (subscriber_.HasOnBatchCancelCallback()) {
248         OnBatchCanceled(notifications, notificationMap, deleteReason);
249         return ERR_OK;
250     }
251     for (auto notification : notifications) {
252         OnCanceled(notification, notificationMap, deleteReason);
253     }
254     return ERR_OK;
255 }
256 
OnCanceledList(const std::vector<sptr<Notification>> & notifications,int32_t deleteReason)257 ErrCode NotificationSubscriber::SubscriberImpl::OnCanceledList(
258     const std::vector<sptr<Notification>> &notifications, int32_t deleteReason)
259 {
260     return OnCanceledList(notifications, nullptr, deleteReason);
261 }
262 
OnUpdated(const sptr<NotificationSortingMap> & notificationMap)263 ErrCode NotificationSubscriber::SubscriberImpl::OnUpdated(const sptr<NotificationSortingMap> &notificationMap)
264 {
265     subscriber_.OnUpdate(std::make_shared<NotificationSortingMap>(*notificationMap));
266     return ERR_OK;
267 }
268 
OnDoNotDisturbDateChange(const sptr<NotificationDoNotDisturbDate> & date)269 ErrCode NotificationSubscriber::SubscriberImpl::OnDoNotDisturbDateChange(const sptr<NotificationDoNotDisturbDate> &date)
270 {
271     subscriber_.OnDoNotDisturbDateChange(std::make_shared<NotificationDoNotDisturbDate>(*date));
272     return ERR_OK;
273 }
274 
OnEnabledNotificationChanged(const sptr<EnabledNotificationCallbackData> & callbackData)275 ErrCode NotificationSubscriber::SubscriberImpl::OnEnabledNotificationChanged(
276     const sptr<EnabledNotificationCallbackData> &callbackData)
277 {
278     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
279     subscriber_.OnEnabledNotificationChanged(std::make_shared<EnabledNotificationCallbackData>(*callbackData));
280     return ERR_OK;
281 }
282 
OnBadgeChanged(const sptr<BadgeNumberCallbackData> & badgeData)283 ErrCode NotificationSubscriber::SubscriberImpl::OnBadgeChanged(const sptr<BadgeNumberCallbackData> &badgeData)
284 {
285     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
286     subscriber_.OnBadgeChanged(std::make_shared<BadgeNumberCallbackData>(*badgeData));
287     return ERR_OK;
288 }
289 
OnBadgeEnabledChanged(const sptr<EnabledNotificationCallbackData> & callbackData)290 ErrCode NotificationSubscriber::SubscriberImpl::OnBadgeEnabledChanged(
291     const sptr<EnabledNotificationCallbackData> &callbackData)
292 {
293     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
294     subscriber_.OnBadgeEnabledChanged(callbackData);
295     return ERR_OK;
296 }
297 
OnApplicationInfoNeedChanged(const std::string & bundleName)298 ErrCode NotificationSubscriber::SubscriberImpl::OnApplicationInfoNeedChanged(
299     const std::string& bundleName)
300 {
301     NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
302     subscriber_.OnApplicationInfoNeedChanged(bundleName);
303     return ERR_OK;
304 }
305 
OnOperationResponse(const sptr<NotificationOperationInfo> & operationInfo,int32_t & funcResult)306 ErrCode NotificationSubscriber::SubscriberImpl::OnOperationResponse(
307     const sptr<NotificationOperationInfo> &operationInfo, int32_t& funcResult)
308 {
309     return subscriber_.OnOperationResponse(std::make_shared<NotificationOperationInfo>(*operationInfo));
310 }
311 
GetAnsManagerProxy()312 sptr<IAnsManager> NotificationSubscriber::SubscriberImpl::GetAnsManagerProxy()
313 {
314     sptr<ISystemAbilityManager> systemAbilityManager =
315         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
316     if (!systemAbilityManager) {
317         return nullptr;
318     }
319 
320     sptr<IRemoteObject> remoteObject =
321         systemAbilityManager->GetSystemAbility(ADVANCED_NOTIFICATION_SERVICE_ABILITY_ID);
322     if (!remoteObject) {
323         return nullptr;
324     }
325 
326     sptr<IAnsManager> proxy = iface_cast<IAnsManager>(remoteObject);
327     if ((proxy == nullptr) || (proxy->AsObject() == nullptr)) {
328         return nullptr;
329     }
330 
331     return proxy;
332 }
333 
DeathRecipient(SubscriberImpl & subscriberImpl)334 NotificationSubscriber::SubscriberImpl::DeathRecipient::DeathRecipient(SubscriberImpl &subscriberImpl)
335     : subscriberImpl_(subscriberImpl) {};
336 
~DeathRecipient()337 NotificationSubscriber::SubscriberImpl::DeathRecipient::~DeathRecipient() {};
338 
OnRemoteDied(const wptr<IRemoteObject> & object)339 void NotificationSubscriber::SubscriberImpl::DeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
340 {
341     subscriberImpl_.subscriber_.OnDied();
342 }
343 }  // namespace Notification
344 }  // namespace OHOS
345