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> ¬ification) 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> ¬ification) 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> ¬ification, const sptr<NotificationSortingMap> ¬ificationMap)
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> ¬ification)
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> ¬ification, const sptr<NotificationSortingMap> ¬ificationMap)
170 {
171 return OnConsumed(notification, notificationMap);
172 }
173
OnConsumedWithMaxCapacity(const sptr<Notification> & notification)174 ErrCode NotificationSubscriber::SubscriberImpl::OnConsumedWithMaxCapacity(const sptr<Notification> ¬ification)
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>> ¬ifications,
180 const sptr<NotificationSortingMap> ¬ificationMap)
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>> ¬ifications)
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> ¬ification, const sptr<NotificationSortingMap> ¬ificationMap, 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> ¬ification, 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> ¬ification, const sptr<NotificationSortingMap> ¬ificationMap, 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> ¬ification, 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>> ¬ifications,
227 const sptr<NotificationSortingMap> ¬ificationMap, 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>> ¬ifications,
244 const sptr<NotificationSortingMap> ¬ificationMap, 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>> ¬ifications, 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> ¬ificationMap)
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