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_preferences.h"
17 
18 #include <fstream>
19 #include <memory>
20 #include <mutex>
21 
22 #include "access_token_helper.h"
23 #include "ans_const_define.h"
24 #include "ans_inner_errors.h"
25 #include "ans_log_wrapper.h"
26 #include "ans_permission_def.h"
27 #include "bundle_manager_helper.h"
28 #include "hitrace_meter_adapter.h"
29 #include "nlohmann/json.hpp"
30 #include "os_account_manager_helper.h"
31 #include "notification_analytics_util.h"
32 #include "notification_config_parse.h"
33 
34 namespace OHOS {
35 namespace Notification {
36 namespace {
37 const static std::string KEY_BUNDLE_LABEL = "label_ans_bundle_";
38 }
39 std::mutex NotificationPreferences::instanceMutex_;
40 std::shared_ptr<NotificationPreferences> NotificationPreferences::instance_;
41 
NotificationPreferences()42 NotificationPreferences::NotificationPreferences()
43 {
44     preferncesDB_ = std::make_unique<NotificationPreferencesDatabase>();
45     if (preferncesDB_ == nullptr) {
46         HaMetaMessage message = HaMetaMessage(EventSceneId::SCENE_7, EventBranchId::BRANCH_1)
47            .Message("preferncesDB is null.");
48         NotificationAnalyticsUtil::ReportModifyEvent(message);
49     }
50     InitSettingFromDisturbDB();
51 }
52 
GetInstance()53 std::shared_ptr<NotificationPreferences> NotificationPreferences::GetInstance()
54 {
55     if (instance_ == nullptr) {
56         std::lock_guard<std::mutex> lock(instanceMutex_);
57         if (instance_ == nullptr) {
58             auto instance = std::make_shared<NotificationPreferences>();
59             instance_ = instance;
60         }
61     }
62     return instance_;
63 }
64 
AddNotificationSlots( const sptr<NotificationBundleOption> &bundleOption, const std::vector<sptr<NotificationSlot>> &slots)65 ErrCode NotificationPreferences::AddNotificationSlots(
66     const sptr<NotificationBundleOption> &bundleOption, const std::vector<sptr<NotificationSlot>> &slots)
67 {
68     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
69     ANS_LOGD("%{public}s", __FUNCTION__);
70     HaMetaMessage message = HaMetaMessage(EventSceneId::SCENE_5, EventBranchId::BRANCH_1)
71         .BundleName(bundleOption == nullptr ? "" : bundleOption->GetBundleName());
72     if (bundleOption == nullptr || bundleOption->GetBundleName().empty() || slots.empty()) {
73         message.Message("Invalid param.");
74         NotificationAnalyticsUtil::ReportModifyEvent(message);
75         return ERR_ANS_INVALID_PARAM;
76     }
77     std::lock_guard<std::mutex> lock(preferenceMutex_);
78     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
79     ErrCode result = ERR_OK;
80     for (auto slot : slots) {
81         result = CheckSlotForCreateSlot(bundleOption, slot, preferencesInfo);
82         if (result != ERR_OK) {
83             return result;
84         }
85     }
86 
87     ANS_LOGD("ffrt: add slot to db!");
88     if (result == ERR_OK &&
89         (!preferncesDB_->PutSlotsToDisturbeDB(bundleOption->GetBundleName(), bundleOption->GetUid(), slots))) {
90         message.Message("put slot for to db failed.");
91         NotificationAnalyticsUtil::ReportModifyEvent(message);
92         return ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
93     }
94 
95     if (result == ERR_OK) {
96         preferencesInfo_ = preferencesInfo;
97     }
98     return result;
99 }
100 
AddNotificationBundleProperty(const sptr<NotificationBundleOption> &bundleOption)101 ErrCode NotificationPreferences::AddNotificationBundleProperty(const sptr<NotificationBundleOption> &bundleOption)
102 {
103     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
104         return ERR_ANS_INVALID_PARAM;
105     }
106     std::lock_guard<std::mutex> lock(preferenceMutex_);
107     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
108     NotificationPreferencesInfo::BundleInfo bundleInfo;
109     preferencesInfo.SetBundleInfo(bundleInfo);
110     ErrCode result = ERR_OK;
111     if (preferncesDB_->PutBundlePropertyToDisturbeDB(bundleInfo)) {
112         preferencesInfo_ = preferencesInfo;
113     } else {
114         result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
115     }
116     ANS_LOGD("AddNotificationBundleProperty.result: %{public}d", result);
117     return result;
118 }
119 
RemoveNotificationSlot( const sptr<NotificationBundleOption> &bundleOption, const NotificationConstant::SlotType &slotType)120 ErrCode NotificationPreferences::RemoveNotificationSlot(
121     const sptr<NotificationBundleOption> &bundleOption, const NotificationConstant::SlotType &slotType)
122 {
123     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
124     ANS_LOGD("%{public}s", __FUNCTION__);
125     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
126         return ERR_ANS_INVALID_PARAM;
127     }
128     HaMetaMessage message = HaMetaMessage(EventSceneId::SCENE_5, EventBranchId::BRANCH_1)
129         .BundleName(bundleOption->GetBundleName());
130     message.SlotType(static_cast<uint32_t>(slotType));
131     std::lock_guard<std::mutex> lock(preferenceMutex_);
132     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
133     ErrCode result = ERR_OK;
134     result = CheckSlotForRemoveSlot(bundleOption, slotType, preferencesInfo);
135     if (result == ERR_OK &&
136         (!preferncesDB_->RemoveSlotFromDisturbeDB(GenerateBundleKey(bundleOption), slotType, bundleOption->GetUid()))) {
137         message.Message("Remove slot failed: " + std::to_string(result));
138         NotificationAnalyticsUtil::ReportModifyEvent(message);
139         return ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
140     }
141 
142     if (result == ERR_OK) {
143         preferencesInfo_ = preferencesInfo;
144     }
145     message.Message("Remove slot successful");
146     NotificationAnalyticsUtil::ReportModifyEvent(message);
147     return result;
148 }
149 
RemoveNotificationAllSlots(const sptr<NotificationBundleOption> &bundleOption)150 ErrCode NotificationPreferences::RemoveNotificationAllSlots(const sptr<NotificationBundleOption> &bundleOption)
151 {
152     ANS_LOGD("%{public}s", __FUNCTION__);
153     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
154         return ERR_ANS_INVALID_PARAM;
155     }
156     HaMetaMessage message = HaMetaMessage(EventSceneId::SCENE_5, EventBranchId::BRANCH_1)
157         .BundleName(bundleOption->GetBundleName());
158     std::lock_guard<std::mutex> lock(preferenceMutex_);
159     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
160     ErrCode result = ERR_OK;
161     NotificationPreferencesInfo::BundleInfo bundleInfo;
162     if (preferencesInfo.GetBundleInfo(bundleOption, bundleInfo)) {
163         bundleInfo.RemoveAllSlots();
164         preferencesInfo.SetBundleInfo(bundleInfo);
165         if (!preferncesDB_->RemoveAllSlotsFromDisturbeDB(GenerateBundleKey(bundleOption), bundleOption->GetUid())) {
166             result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
167         }
168     } else {
169         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
170     }
171 
172     if (result == ERR_OK) {
173         ANS_LOGD("result is ERR_OK");
174         preferencesInfo_ = preferencesInfo;
175     }
176     message.Message("Remove all slot: " + std::to_string(result));
177     NotificationAnalyticsUtil::ReportModifyEvent(message);
178     return result;
179 }
180 
RemoveNotificationForBundle(const sptr<NotificationBundleOption> &bundleOption)181 ErrCode NotificationPreferences::RemoveNotificationForBundle(const sptr<NotificationBundleOption> &bundleOption)
182 {
183     ANS_LOGD("%{public}s", __FUNCTION__);
184     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
185         return ERR_ANS_INVALID_PARAM;
186     }
187     std::lock_guard<std::mutex> lock(preferenceMutex_);
188     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
189 
190     ErrCode result = ERR_OK;
191     if (preferencesInfo.IsExsitBundleInfo(bundleOption)) {
192         preferencesInfo.RemoveBundleInfo(bundleOption);
193         if (!preferncesDB_->RemoveBundleFromDisturbeDB(GenerateBundleKey(bundleOption), bundleOption->GetUid())) {
194             result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
195         }
196     } else {
197         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
198     }
199 
200     if (result == ERR_OK) {
201         preferencesInfo_ = preferencesInfo;
202     }
203 
204     return result;
205 }
206 
UpdateNotificationSlots( const sptr<NotificationBundleOption> &bundleOption, const std::vector<sptr<NotificationSlot>> &slots)207 ErrCode NotificationPreferences::UpdateNotificationSlots(
208     const sptr<NotificationBundleOption> &bundleOption, const std::vector<sptr<NotificationSlot>> &slots)
209 {
210     ANS_LOGD("%{public}s", __FUNCTION__);
211     if (bundleOption == nullptr || bundleOption->GetBundleName().empty() || slots.empty()) {
212         return ERR_ANS_INVALID_PARAM;
213     }
214     HaMetaMessage message = HaMetaMessage(EventSceneId::SCENE_5, EventBranchId::BRANCH_2)
215         .BundleName(bundleOption->GetBundleName());
216     std::lock_guard<std::mutex> lock(preferenceMutex_);
217     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
218     ErrCode result = ERR_OK;
219     for (auto slotIter : slots) {
220         result = CheckSlotForUpdateSlot(bundleOption, slotIter, preferencesInfo);
221         if (result != ERR_OK) {
222             message.Message("Check slot for update failed." + std::to_string(result));
223             NotificationAnalyticsUtil::ReportModifyEvent(message);
224             return result;
225         }
226     }
227 
228     if ((result == ERR_OK) &&
229         (!preferncesDB_->PutSlotsToDisturbeDB(bundleOption->GetBundleName(), bundleOption->GetUid(), slots))) {
230         message.Message("Update put slot for to db failed.");
231         NotificationAnalyticsUtil::ReportModifyEvent(message);
232         return ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
233     }
234 
235     if (result == ERR_OK) {
236         preferencesInfo_ = preferencesInfo;
237     }
238 
239     return result;
240 }
241 
GetNotificationSlot(const sptr<NotificationBundleOption> &bundleOption, const NotificationConstant::SlotType &type, sptr<NotificationSlot> &slot)242 ErrCode NotificationPreferences::GetNotificationSlot(const sptr<NotificationBundleOption> &bundleOption,
243     const NotificationConstant::SlotType &type, sptr<NotificationSlot> &slot)
244 {
245     ANS_LOGD("%{public}s", __FUNCTION__);
246     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
247         return ERR_ANS_INVALID_PARAM;
248     }
249 
250     ErrCode result = ERR_OK;
251     NotificationPreferencesInfo::BundleInfo bundleInfo;
252     std::lock_guard<std::mutex> lock(preferenceMutex_);
253     if (preferencesInfo_.GetBundleInfo(bundleOption, bundleInfo)) {
254         if (!bundleInfo.GetSlot(type, slot)) {
255             result = ERR_ANS_PREFERENCES_NOTIFICATION_SLOT_TYPE_NOT_EXIST;
256         }
257     } else {
258         ANS_LOGW("bundle not exist");
259         result = ERR_ANS_PREFERENCES_NOTIFICATION_SLOT_TYPE_NOT_EXIST;
260     }
261     ANS_LOGD("%{public}s status  = %{public}d ", __FUNCTION__, result);
262     return result;
263 }
264 
GetNotificationAllSlots( const sptr<NotificationBundleOption> &bundleOption, std::vector<sptr<NotificationSlot>> &slots)265 ErrCode NotificationPreferences::GetNotificationAllSlots(
266     const sptr<NotificationBundleOption> &bundleOption, std::vector<sptr<NotificationSlot>> &slots)
267 {
268     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
269         return ERR_ANS_INVALID_PARAM;
270     }
271 
272     ErrCode result = ERR_OK;
273     NotificationPreferencesInfo::BundleInfo bundleInfo;
274     std::lock_guard<std::mutex> lock(preferenceMutex_);
275     if (preferencesInfo_.GetBundleInfo(bundleOption, bundleInfo)) {
276         bundleInfo.GetAllSlots(slots);
277     } else {
278         ANS_LOGW("Notification bundle does not exsit.");
279         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
280     }
281 
282     return result;
283 }
284 
GetNotificationSlotsNumForBundle( const sptr<NotificationBundleOption> &bundleOption, uint64_t &num)285 ErrCode NotificationPreferences::GetNotificationSlotsNumForBundle(
286     const sptr<NotificationBundleOption> &bundleOption, uint64_t &num)
287 {
288     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
289         return ERR_ANS_INVALID_PARAM;
290     }
291 
292     ErrCode result = ERR_OK;
293     NotificationPreferencesInfo::BundleInfo bundleInfo;
294     std::lock_guard<std::mutex> lock(preferenceMutex_);
295     if (preferencesInfo_.GetBundleInfo(bundleOption, bundleInfo)) {
296         num = static_cast<uint64_t>(bundleInfo.GetAllSlotsSize());
297     } else {
298         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
299     }
300     return result;
301 }
302 
GetNotificationSlotFlagsForBundle( const sptr<NotificationBundleOption> &bundleOption, uint32_t &slotFlags)303 ErrCode NotificationPreferences::GetNotificationSlotFlagsForBundle(
304     const sptr<NotificationBundleOption> &bundleOption, uint32_t &slotFlags)
305 {
306     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
307         return ERR_ANS_INVALID_PARAM;
308     }
309 
310     return GetBundleProperty(bundleOption, BundleType::BUNDLE_SLOTFLGS_TYPE, slotFlags);
311 }
312 
313 
SetNotificationSlotFlagsForBundle( const sptr<NotificationBundleOption> &bundleOption, uint32_t slotFlags)314 ErrCode NotificationPreferences::SetNotificationSlotFlagsForBundle(
315     const sptr<NotificationBundleOption> &bundleOption, uint32_t slotFlags)
316 {
317     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
318         return ERR_ANS_INVALID_PARAM;
319     }
320 
321     std::lock_guard<std::mutex> lock(preferenceMutex_);
322     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
323     ErrCode result = SetBundleProperty(preferencesInfo, bundleOption, BundleType::BUNDLE_SLOTFLGS_TYPE, slotFlags);
324     if (result == ERR_OK) {
325         preferencesInfo_ = preferencesInfo;
326     }
327     return result;
328 }
329 
IsShowBadge(const sptr<NotificationBundleOption> &bundleOption, bool &enable)330 ErrCode NotificationPreferences::IsShowBadge(const sptr<NotificationBundleOption> &bundleOption, bool &enable)
331 {
332     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
333         return ERR_ANS_INVALID_PARAM;
334     }
335     return GetBundleProperty(bundleOption, BundleType::BUNDLE_SHOW_BADGE_TYPE, enable);
336 }
337 
SetShowBadge(const sptr<NotificationBundleOption> &bundleOption, const bool enable)338 ErrCode NotificationPreferences::SetShowBadge(const sptr<NotificationBundleOption> &bundleOption, const bool enable)
339 {
340     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
341         return ERR_ANS_INVALID_PARAM;
342     }
343     std::lock_guard<std::mutex> lock(preferenceMutex_);
344     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
345     ErrCode result = SetBundleProperty(preferencesInfo, bundleOption, BundleType::BUNDLE_SHOW_BADGE_TYPE, enable);
346     if (result == ERR_OK) {
347         preferencesInfo_ = preferencesInfo;
348     }
349     return result;
350 }
351 
GetImportance(const sptr<NotificationBundleOption> &bundleOption, int32_t &importance)352 ErrCode NotificationPreferences::GetImportance(const sptr<NotificationBundleOption> &bundleOption, int32_t &importance)
353 {
354     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
355         return ERR_ANS_INVALID_PARAM;
356     }
357 
358     return GetBundleProperty(bundleOption, BundleType::BUNDLE_IMPORTANCE_TYPE, importance);
359 }
360 
361 
SetImportance( const sptr<NotificationBundleOption> &bundleOption, const int32_t &importance)362 ErrCode NotificationPreferences::SetImportance(
363     const sptr<NotificationBundleOption> &bundleOption, const int32_t &importance)
364 {
365     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
366         return ERR_ANS_INVALID_PARAM;
367     }
368     std::lock_guard<std::mutex> lock(preferenceMutex_);
369     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
370     ErrCode result = SetBundleProperty(preferencesInfo, bundleOption, BundleType::BUNDLE_IMPORTANCE_TYPE, importance);
371     if (result == ERR_OK) {
372         preferencesInfo_ = preferencesInfo;
373     }
374     return result;
375 }
376 
GetTotalBadgeNums( const sptr<NotificationBundleOption> &bundleOption, int32_t &totalBadgeNum)377 ErrCode NotificationPreferences::GetTotalBadgeNums(
378     const sptr<NotificationBundleOption> &bundleOption, int32_t &totalBadgeNum)
379 {
380     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
381         return ERR_ANS_INVALID_PARAM;
382     }
383     return GetBundleProperty(bundleOption, BundleType::BUNDLE_BADGE_TOTAL_NUM_TYPE, totalBadgeNum);
384 }
385 
SetTotalBadgeNums( const sptr<NotificationBundleOption> &bundleOption, const int32_t num)386 ErrCode NotificationPreferences::SetTotalBadgeNums(
387     const sptr<NotificationBundleOption> &bundleOption, const int32_t num)
388 {
389     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
390         return ERR_ANS_INVALID_PARAM;
391     }
392     std::lock_guard<std::mutex> lock(preferenceMutex_);
393     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
394     ErrCode result = SetBundleProperty(preferencesInfo, bundleOption, BundleType::BUNDLE_BADGE_TOTAL_NUM_TYPE, num);
395     if (result == ERR_OK) {
396         preferencesInfo_ = preferencesInfo;
397     }
398     return result;
399 }
400 
GetNotificationsEnabledForBundle( const sptr<NotificationBundleOption> &bundleOption, bool &enabled)401 ErrCode NotificationPreferences::GetNotificationsEnabledForBundle(
402     const sptr<NotificationBundleOption> &bundleOption, bool &enabled)
403 {
404     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
405         return ERR_ANS_INVALID_PARAM;
406     }
407     return GetBundleProperty(bundleOption, BundleType::BUNDLE_ENABLE_NOTIFICATION_TYPE, enabled);
408 }
409 
SetNotificationsEnabledForBundle( const sptr<NotificationBundleOption> &bundleOption, const bool enabled)410 ErrCode NotificationPreferences::SetNotificationsEnabledForBundle(
411     const sptr<NotificationBundleOption> &bundleOption, const bool enabled)
412 {
413     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
414     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
415         return ERR_ANS_INVALID_PARAM;
416     }
417 
418     std::lock_guard<std::mutex> lock(preferenceMutex_);
419     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
420     ErrCode result =
421         SetBundleProperty(preferencesInfo, bundleOption, BundleType::BUNDLE_ENABLE_NOTIFICATION_TYPE, enabled);
422     if (result == ERR_OK) {
423         preferencesInfo_ = preferencesInfo;
424     }
425     return result;
426 }
427 
GetNotificationsEnabled(const int32_t &userId, bool &enabled)428 ErrCode NotificationPreferences::GetNotificationsEnabled(const int32_t &userId, bool &enabled)
429 {
430     if (userId <= SUBSCRIBE_USER_INIT) {
431         return ERR_ANS_INVALID_PARAM;
432     }
433 
434     ErrCode result = ERR_OK;
435     std::lock_guard<std::mutex> lock(preferenceMutex_);
436     if (!preferencesInfo_.GetEnabledAllNotification(userId, enabled)) {
437         result = ERR_ANS_INVALID_PARAM;
438     }
439     return result;
440 }
441 
SetNotificationsEnabled(const int32_t &userId, const bool &enabled)442 ErrCode NotificationPreferences::SetNotificationsEnabled(const int32_t &userId, const bool &enabled)
443 {
444     if (userId <= SUBSCRIBE_USER_INIT) {
445         return ERR_ANS_INVALID_PARAM;
446     }
447     std::lock_guard<std::mutex> lock(preferenceMutex_);
448     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
449     preferencesInfo.SetEnabledAllNotification(userId, enabled);
450     ErrCode result = ERR_OK;
451     if (!preferncesDB_->PutNotificationsEnabled(userId, enabled)) {
452         result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
453     }
454 
455     if (result == ERR_OK) {
456         preferencesInfo_ = preferencesInfo;
457     }
458     return result;
459 }
460 
GetHasPoppedDialog(const sptr<NotificationBundleOption> &bundleOption, bool &hasPopped)461 ErrCode NotificationPreferences::GetHasPoppedDialog(const sptr<NotificationBundleOption> &bundleOption, bool &hasPopped)
462 {
463     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
464         return ERR_ANS_INVALID_PARAM;
465     }
466     return GetBundleProperty(bundleOption, BundleType::BUNDLE_POPPED_DIALOG_TYPE, hasPopped);
467 }
468 
SetHasPoppedDialog(const sptr<NotificationBundleOption> &bundleOption, bool hasPopped)469 ErrCode NotificationPreferences::SetHasPoppedDialog(const sptr<NotificationBundleOption> &bundleOption, bool hasPopped)
470 {
471     if (bundleOption == nullptr) {
472         return ERR_ANS_INVALID_PARAM;
473     }
474     std::lock_guard<std::mutex> lock(preferenceMutex_);
475     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
476     ErrCode result = ERR_OK;
477     result = SetBundleProperty(preferencesInfo, bundleOption, BundleType::BUNDLE_POPPED_DIALOG_TYPE, hasPopped);
478     if (result == ERR_OK) {
479         preferencesInfo_ = preferencesInfo;
480     }
481     return result;
482 }
483 
GetDoNotDisturbDate(const int32_t &userId, sptr<NotificationDoNotDisturbDate> &date)484 ErrCode NotificationPreferences::GetDoNotDisturbDate(const int32_t &userId,
485     sptr<NotificationDoNotDisturbDate> &date)
486 {
487     if (userId <= SUBSCRIBE_USER_INIT) {
488         return ERR_ANS_INVALID_PARAM;
489     }
490 
491     ErrCode result = ERR_OK;
492     std::lock_guard<std::mutex> lock(preferenceMutex_);
493     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
494     if (!preferencesInfo.GetDoNotDisturbDate(userId, date)) {
495         result = ERR_ANS_INVALID_PARAM;
496     }
497     return result;
498 }
499 
SetDoNotDisturbDate(const int32_t &userId, const sptr<NotificationDoNotDisturbDate> date)500 ErrCode NotificationPreferences::SetDoNotDisturbDate(const int32_t &userId,
501     const sptr<NotificationDoNotDisturbDate> date)
502 {
503     ANS_LOGE("enter.");
504     if (userId <= SUBSCRIBE_USER_INIT) {
505         return ERR_ANS_INVALID_PARAM;
506     }
507     std::lock_guard<std::mutex> lock(preferenceMutex_);
508     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
509     preferencesInfo.SetDoNotDisturbDate(userId, date);
510 
511     ErrCode result = ERR_OK;
512     if (!preferncesDB_->PutDoNotDisturbDate(userId, date)) {
513         result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
514     }
515 
516     if (result == ERR_OK) {
517         preferencesInfo_ = preferencesInfo;
518     }
519     return result;
520 }
521 
CheckDoNotDisturbProfileID(int32_t profileId)522 bool NotificationPreferences::CheckDoNotDisturbProfileID(int32_t profileId)
523 {
524     if (profileId < DO_NOT_DISTURB_PROFILE_MIN_ID || profileId > DO_NOT_DISTURB_PROFILE_MAX_ID) {
525         ANS_LOGE("The profile id is out of range.");
526         return false;
527     }
528     return true;
529 }
530 
AddDoNotDisturbProfiles( int32_t userId, std::vector<sptr<NotificationDoNotDisturbProfile>> profiles)531 ErrCode NotificationPreferences::AddDoNotDisturbProfiles(
532     int32_t userId, std::vector<sptr<NotificationDoNotDisturbProfile>> profiles)
533 {
534     ANS_LOGD("Called.");
535     for (auto profile : profiles) {
536         if (profile == nullptr) {
537             ANS_LOGE("The profile is nullptr.");
538             return ERR_ANS_INVALID_PARAM;
539         }
540         if (!CheckDoNotDisturbProfileID(profile->GetProfileId())) {
541             return ERR_ANS_INVALID_PARAM;
542         }
543         auto trustList = profile->GetProfileTrustList();
544         for (auto& bundleInfo : trustList) {
545             int32_t index = BundleManagerHelper::GetInstance()->GetAppIndexByUid(bundleInfo.GetUid());
546             bundleInfo.SetAppIndex(index);
547             ANS_LOGI("Get app index by uid %{public}d %{public}s %{public}d", bundleInfo.GetUid(),
548                 bundleInfo.GetBundleName().c_str(), index);
549         }
550         profile->SetProfileTrustList(trustList);
551     }
552     std::lock_guard<std::mutex> lock(preferenceMutex_);
553     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
554     preferencesInfo.AddDoNotDisturbProfiles(userId, profiles);
555     if (preferncesDB_ == nullptr) {
556         ANS_LOGE("The prefernces db is nullptr.");
557         return ERR_ANS_SERVICE_NOT_READY;
558     }
559     if (!preferncesDB_->AddDoNotDisturbProfiles(userId, profiles)) {
560         return ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
561     }
562     preferencesInfo_ = preferencesInfo;
563     return ERR_OK;
564 }
565 
RemoveDoNotDisturbProfiles( int32_t userId, const std::vector<sptr<NotificationDoNotDisturbProfile>> profiles)566 ErrCode NotificationPreferences::RemoveDoNotDisturbProfiles(
567     int32_t userId, const std::vector<sptr<NotificationDoNotDisturbProfile>> profiles)
568 {
569     ANS_LOGE("Called.");
570     for (auto profile : profiles) {
571         if (profile == nullptr) {
572             ANS_LOGE("The profile is nullptr.");
573             return ERR_ANS_INVALID_PARAM;
574         }
575         if (!CheckDoNotDisturbProfileID(profile->GetProfileId())) {
576             return ERR_ANS_INVALID_PARAM;
577         }
578     }
579     std::lock_guard<std::mutex> lock(preferenceMutex_);
580     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
581     preferencesInfo.RemoveDoNotDisturbProfiles(userId, profiles);
582     if (preferncesDB_ == nullptr) {
583         ANS_LOGE("The prefernces db is nullptr.");
584         return ERR_ANS_SERVICE_NOT_READY;
585     }
586     if (!preferncesDB_->RemoveDoNotDisturbProfiles(userId, profiles)) {
587         return ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
588     }
589     preferencesInfo_ = preferencesInfo;
590     return ERR_OK;
591 }
592 
UpdateProfilesUtil(std::vector<NotificationBundleOption>& trustList, const std::vector<NotificationBundleOption> bundleList)593 void NotificationPreferences::UpdateProfilesUtil(std::vector<NotificationBundleOption>& trustList,
594     const std::vector<NotificationBundleOption> bundleList)
595 {
596     for (auto& item : bundleList) {
597         bool exit = false;
598         for (auto& bundle: trustList) {
599             if (item.GetUid() == bundle.GetUid()) {
600                 exit = true;
601                 break;
602             }
603         }
604         if (!exit) {
605             trustList.push_back(item);
606         }
607     }
608 }
609 
UpdateDoNotDisturbProfiles(int32_t userId, int32_t profileId, const std::string& name, const std::vector<NotificationBundleOption>& bundleList)610 ErrCode NotificationPreferences::UpdateDoNotDisturbProfiles(int32_t userId, int32_t profileId,
611     const std::string& name, const std::vector<NotificationBundleOption>& bundleList)
612 {
613     ANS_LOGI("Called update Profile %{public}d %{public}d %{public}zu.", userId, profileId, bundleList.size());
614     if (!CheckDoNotDisturbProfileID(profileId) || bundleList.empty()) {
615         return ERR_ANS_INVALID_PARAM;
616     }
617 
618     sptr<NotificationDoNotDisturbProfile> profile = new (std::nothrow) NotificationDoNotDisturbProfile();
619     std::lock_guard<std::mutex> lock(preferenceMutex_);
620     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
621     if (preferencesInfo.GetDoNotDisturbProfiles(profileId, userId, profile)) {
622         auto trustList = profile->GetProfileTrustList();
623         UpdateProfilesUtil(trustList, bundleList);
624         profile->SetProfileTrustList(trustList);
625     } else {
626         profile->SetProfileId(profileId);
627         profile->SetProfileName(name);
628         profile->SetProfileTrustList(bundleList);
629     }
630     ANS_LOGI("Update profile %{public}d %{public}d %{public}zu", userId, profile->GetProfileId(),
631         profile->GetProfileTrustList().size());
632     preferencesInfo.AddDoNotDisturbProfiles(userId, {profile});
633     if (preferncesDB_ == nullptr) {
634         ANS_LOGE("The prefernces db is nullptr.");
635         return ERR_ANS_SERVICE_NOT_READY;
636     }
637     if (!preferncesDB_->AddDoNotDisturbProfiles(userId, {profile})) {
638         return ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
639     }
640     preferencesInfo_ = preferencesInfo;
641     return ERR_OK;
642 }
643 
UpdateCloneBundleInfo(int32_t userId, const NotificationCloneBundleInfo& cloneBundleInfo)644 void NotificationPreferences::UpdateCloneBundleInfo(int32_t userId,
645     const NotificationCloneBundleInfo& cloneBundleInfo)
646 {
647     ANS_LOGI("Event bundle update %{public}s.", cloneBundleInfo.Dump().c_str());
648     NotificationPreferencesInfo::BundleInfo bundleInfo;
649     sptr<NotificationBundleOption> bundleOption = new NotificationBundleOption();
650     bundleOption->SetBundleName(cloneBundleInfo.GetBundleName());
651     bundleOption->SetUid(cloneBundleInfo.GetUid());
652     std::lock_guard<std::mutex> lock(preferenceMutex_);
653     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
654     if (!preferencesInfo.GetBundleInfo(bundleOption, bundleInfo)) {
655         bundleInfo.SetBundleName(cloneBundleInfo.GetBundleName());
656         bundleInfo.SetBundleUid(cloneBundleInfo.GetUid());
657     }
658 
659     /* after clone, override these witch */
660     bundleInfo.SetSlotFlags(cloneBundleInfo.GetSlotFlags());
661     bundleInfo.SetIsShowBadge(cloneBundleInfo.GetIsShowBadge());
662     bundleInfo.SetEnableNotification(cloneBundleInfo.GetEnableNotification());
663     /* update property to db */
664     if (!preferncesDB_->UpdateBundlePropertyToDisturbeDB(userId, bundleInfo)) {
665         ANS_LOGW("Clone bundle info failed %{public}s.", cloneBundleInfo.Dump().c_str());
666         return;
667     }
668     preferencesInfo.SetBundleInfo(bundleInfo);
669 
670     /* update slot info */
671     std::vector<sptr<NotificationSlot>> slots;
672     for (auto& cloneSlot : cloneBundleInfo.GetSlotInfo()) {
673         sptr<NotificationSlot> slotInfo = new (std::nothrow) NotificationSlot(cloneSlot.slotType_);
674         uint32_t slotFlags = bundleInfo.GetSlotFlags();
675         auto configSlotReminderMode = DelayedSingleton<NotificationConfigParse>::GetInstance()->
676             GetConfigSlotReminderModeByType(slotInfo->GetType());
677         slotInfo->SetReminderMode(configSlotReminderMode & slotFlags);
678         slotInfo->SetEnable(cloneSlot.enable_);
679         slotInfo->SetForceControl(cloneSlot.isForceControl_);
680         slotInfo->SetAuthorizedStatus(NotificationSlot::AuthorizedStatus::AUTHORIZED);
681         slots.push_back(slotInfo);
682         bundleInfo.SetSlot(slotInfo);
683     }
684 
685     if (!preferncesDB_->UpdateBundleSlotToDisturbeDB(userId, cloneBundleInfo.GetBundleName(),
686         cloneBundleInfo.GetUid(), slots)) {
687         ANS_LOGW("Clone bundle slot failed %{public}s.", cloneBundleInfo.Dump().c_str());
688         preferencesInfo_ = preferencesInfo;
689         return;
690     }
691     preferencesInfo.SetBundleInfo(bundleInfo);
692     preferencesInfo_ = preferencesInfo;
693 }
694 
GetAllCLoneBundlesInfo(int32_t userId, std::vector<NotificationCloneBundleInfo> &cloneBundles)695 void NotificationPreferences::GetAllCLoneBundlesInfo(int32_t userId,
696     std::vector<NotificationCloneBundleInfo> &cloneBundles)
697 {
698     std::lock_guard<std::mutex> lock(preferenceMutex_);
699     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
700     std::unordered_map<std::string, std::string> bundlesMap;
701     if (GetBatchKvsFromDb(KEY_BUNDLE_LABEL, bundlesMap, userId) != ERR_OK) {
702         ANS_LOGE("Get bundle map info failed.");
703         return;
704     }
705     preferencesInfo.GetAllCLoneBundlesInfo(userId, bundlesMap, cloneBundles);
706     preferencesInfo_ = preferencesInfo;
707 }
708 
GetDoNotDisturbProfileListByUserId(int32_t userId, std::vector<sptr<NotificationDoNotDisturbProfile>> &profiles)709 void NotificationPreferences::GetDoNotDisturbProfileListByUserId(int32_t userId,
710     std::vector<sptr<NotificationDoNotDisturbProfile>> &profiles)
711 {
712     std::lock_guard<std::mutex> lock(preferenceMutex_);
713     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
714     preferencesInfo.GetAllDoNotDisturbProfiles(userId, profiles);
715     preferencesInfo_ = preferencesInfo;
716 }
717 
GetAllNotificationEnabledBundles(std::vector<NotificationBundleOption> &bundleOption)718 ErrCode NotificationPreferences::GetAllNotificationEnabledBundles(std::vector<NotificationBundleOption> &bundleOption)
719 {
720     ANS_LOGD("Called.");
721     std::lock_guard<std::mutex> lock(preferenceMutex_);
722     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
723     ErrCode result = ERR_OK;
724     if (preferncesDB_ == nullptr) {
725         return ERR_ANS_SERVICE_NOT_READY;
726     }
727     if (preferncesDB_->GetAllNotificationEnabledBundles(bundleOption)) {
728         preferencesInfo_ = preferencesInfo;
729     } else {
730         result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
731     }
732     return result;
733 }
734 
ClearNotificationInRestoreFactorySettings()735 ErrCode NotificationPreferences::ClearNotificationInRestoreFactorySettings()
736 {
737     ErrCode result = ERR_OK;
738     std::lock_guard<std::mutex> lock(preferenceMutex_);
739     if (!preferncesDB_->RemoveAllDataFromDisturbeDB()) {
740         result = ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
741     }
742 
743     if (result == ERR_OK) {
744         preferencesInfo_ = NotificationPreferencesInfo();
745     }
746     return result;
747 }
748 
GetDoNotDisturbProfile( int32_t profileId, int32_t userId, sptr<NotificationDoNotDisturbProfile> &profile)749 ErrCode NotificationPreferences::GetDoNotDisturbProfile(
750     int32_t profileId, int32_t userId, sptr<NotificationDoNotDisturbProfile> &profile)
751 {
752     if (!CheckDoNotDisturbProfileID(profileId)) {
753         return ERR_ANS_INVALID_PARAM;
754     }
755     std::lock_guard<std::mutex> lock(preferenceMutex_);
756     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
757     if (!preferencesInfo.GetDoNotDisturbProfiles(profileId, userId, profile)) {
758         return ERR_ANS_NO_PROFILE_TEMPLATE;
759     }
760     return ERR_OK;
761 }
762 
RemoveDoNotDisturbProfileTrustList( int32_t userId, const sptr<NotificationBundleOption> &bundleOption)763 void NotificationPreferences::RemoveDoNotDisturbProfileTrustList(
764     int32_t userId, const sptr<NotificationBundleOption> &bundleOption)
765 {
766     if (bundleOption == nullptr) {
767         ANS_LOGE("The bundle option is nullptr.");
768         return;
769     }
770     int32_t uid = bundleOption->GetUid();
771     int32_t appIndex = bundleOption->GetAppIndex();
772     auto bundleName = bundleOption->GetBundleName();
773     ANS_LOGI("Remove %{public}s %{public}d %{public}d.", bundleName.c_str(), uid, appIndex);
774     std::lock_guard<std::mutex> lock(preferenceMutex_);
775     NotificationPreferencesInfo preferencesInfo = preferencesInfo_;
776 
777     std::vector<sptr<NotificationDoNotDisturbProfile>> profiles;
778     preferencesInfo.GetAllDoNotDisturbProfiles(userId, profiles);
779     for (auto profile : profiles) {
780         if (profile == nullptr) {
781             ANS_LOGE("The profile is nullptr.");
782             continue;
783         }
784         auto trustList = profile->GetProfileTrustList();
785         for (auto it = trustList.begin(); it != trustList.end(); it++) {
786             if (it->GetUid() == uid) {
787                 trustList.erase(it);
788                 break;
789             }
790         }
791         profile->SetProfileTrustList(trustList);
792     }
793     preferencesInfo.AddDoNotDisturbProfiles(userId, profiles);
794     if (preferncesDB_ == nullptr) {
795         ANS_LOGE("The prefernces db is nullptr.");
796         return;
797     }
798     if (!preferncesDB_->AddDoNotDisturbProfiles(userId, profiles)) {
799         return;
800     }
801     preferencesInfo_ = preferencesInfo;
802 }
803 
CheckSlotForCreateSlot(const sptr<NotificationBundleOption> &bundleOption, const sptr<NotificationSlot> &slot, NotificationPreferencesInfo &preferencesInfo) const804 ErrCode NotificationPreferences::CheckSlotForCreateSlot(const sptr<NotificationBundleOption> &bundleOption,
805     const sptr<NotificationSlot> &slot, NotificationPreferencesInfo &preferencesInfo) const
806 {
807     if (slot == nullptr) {
808         ANS_LOGE("Notification slot is nullptr.");
809         return ERR_ANS_PREFERENCES_NOTIFICATION_SLOT_NOT_EXIST;
810     }
811 
812     NotificationPreferencesInfo::BundleInfo bundleInfo;
813     if (!preferencesInfo.GetBundleInfo(bundleOption, bundleInfo)) {
814         bundleInfo.SetBundleName(bundleOption->GetBundleName());
815         bundleInfo.SetBundleUid(bundleOption->GetUid());
816         bundleInfo.SetEnableNotification(CheckApiCompatibility(bundleOption));
817     }
818     bundleInfo.SetSlot(slot);
819     preferencesInfo.SetBundleInfo(bundleInfo);
820 
821     return ERR_OK;
822 }
823 
CheckSlotForRemoveSlot(const sptr<NotificationBundleOption> &bundleOption, const NotificationConstant::SlotType &slotType, NotificationPreferencesInfo &preferencesInfo) const824 ErrCode NotificationPreferences::CheckSlotForRemoveSlot(const sptr<NotificationBundleOption> &bundleOption,
825     const NotificationConstant::SlotType &slotType, NotificationPreferencesInfo &preferencesInfo) const
826 {
827     ErrCode result = ERR_OK;
828     NotificationPreferencesInfo::BundleInfo bundleInfo;
829     if (preferencesInfo.GetBundleInfo(bundleOption, bundleInfo)) {
830         if (bundleInfo.IsExsitSlot(slotType)) {
831             bundleInfo.RemoveSlot(slotType);
832             preferencesInfo.SetBundleInfo(bundleInfo);
833         } else {
834             ANS_LOGE("Notification slot type does not exsited.");
835             result = ERR_ANS_PREFERENCES_NOTIFICATION_SLOT_TYPE_NOT_EXIST;
836         }
837     } else {
838         ANS_LOGW("Notification bundle does not exsit.");
839         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
840     }
841     return result;
842 }
843 
CheckSlotForUpdateSlot(const sptr<NotificationBundleOption> &bundleOption, const sptr<NotificationSlot> &slot, NotificationPreferencesInfo &preferencesInfo) const844 ErrCode NotificationPreferences::CheckSlotForUpdateSlot(const sptr<NotificationBundleOption> &bundleOption,
845     const sptr<NotificationSlot> &slot, NotificationPreferencesInfo &preferencesInfo) const
846 {
847     if (slot == nullptr) {
848         ANS_LOGE("Notification slot is nullptr.");
849         return ERR_ANS_INVALID_PARAM;
850     }
851 
852     ErrCode result = ERR_OK;
853     NotificationPreferencesInfo::BundleInfo bundleInfo;
854     if (preferencesInfo.GetBundleInfo(bundleOption, bundleInfo)) {
855         if (bundleInfo.IsExsitSlot(slot->GetType())) {
856             bundleInfo.SetBundleName(bundleOption->GetBundleName());
857             bundleInfo.SetBundleUid(bundleOption->GetUid());
858             bundleInfo.SetSlot(slot);
859             preferencesInfo.SetBundleInfo(bundleInfo);
860         } else {
861             ANS_LOGE("Notification slot type does not exist.");
862             result = ERR_ANS_PREFERENCES_NOTIFICATION_SLOT_TYPE_NOT_EXIST;
863         }
864     } else {
865         ANS_LOGW("Notification bundle does not exsit.");
866         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
867     }
868 
869     return result;
870 }
871 
872 template <typename T>
SetBundleProperty(NotificationPreferencesInfo &preferencesInfo, const sptr<NotificationBundleOption> &bundleOption, const BundleType &type, const T &value)873 ErrCode NotificationPreferences::SetBundleProperty(NotificationPreferencesInfo &preferencesInfo,
874     const sptr<NotificationBundleOption> &bundleOption, const BundleType &type, const T &value)
875 {
876     ErrCode result = ERR_OK;
877     NotificationPreferencesInfo::BundleInfo bundleInfo;
878     if (!preferencesInfo_.GetBundleInfo(bundleOption, bundleInfo)) {
879         bundleInfo.SetBundleName(bundleOption->GetBundleName());
880         bundleInfo.SetBundleUid(bundleOption->GetUid());
881         bundleInfo.SetEnableNotification(CheckApiCompatibility(bundleOption));
882     }
883     result = SaveBundleProperty(bundleInfo, bundleOption, type, value);
884     if (result == ERR_OK) {
885         preferencesInfo.SetBundleInfo(bundleInfo);
886     }
887 
888     return result;
889 }
890 
891 template <typename T>
SaveBundleProperty(NotificationPreferencesInfo::BundleInfo &bundleInfo, const sptr<NotificationBundleOption> &bundleOption, const BundleType &type, const T &value)892 ErrCode NotificationPreferences::SaveBundleProperty(NotificationPreferencesInfo::BundleInfo &bundleInfo,
893     const sptr<NotificationBundleOption> &bundleOption, const BundleType &type, const T &value)
894 {
895     HaMetaMessage message = HaMetaMessage().BundleName(bundleInfo.GetBundleName());
896     bool storeDBResult = true;
897     switch (type) {
898         case BundleType::BUNDLE_IMPORTANCE_TYPE:
899             bundleInfo.SetImportance(value);
900             storeDBResult = preferncesDB_->PutImportance(bundleInfo, value);
901             break;
902         case BundleType::BUNDLE_BADGE_TOTAL_NUM_TYPE:
903             bundleInfo.SetBadgeTotalNum(value);
904             storeDBResult = preferncesDB_->PutTotalBadgeNums(bundleInfo, value);
905             break;
906         case BundleType::BUNDLE_SHOW_BADGE_TYPE:
907             bundleInfo.SetIsShowBadge(value);
908             storeDBResult = preferncesDB_->PutShowBadge(bundleInfo, value);
909             break;
910         case BundleType::BUNDLE_ENABLE_NOTIFICATION_TYPE:
911             bundleInfo.SetEnableNotification(value);
912             storeDBResult = preferncesDB_->PutNotificationsEnabledForBundle(bundleInfo, value);
913             break;
914         case BundleType::BUNDLE_POPPED_DIALOG_TYPE:
915             ANS_LOGI("Into BUNDLE_POPPED_DIALOG_TYPE:SetHasPoppedDialog.");
916             bundleInfo.SetHasPoppedDialog(value);
917             storeDBResult = preferncesDB_->PutHasPoppedDialog(bundleInfo, value);
918             break;
919         case BundleType::BUNDLE_SLOTFLGS_TYPE:
920             ANS_LOGI("Into BUNDLE_SLOTFLGS_TYPE:SetSlotFlags.");
921             bundleInfo.SetSlotFlags(value);
922             storeDBResult = preferncesDB_->PutSlotFlags(bundleInfo, value);
923             break;
924         default:
925             break;
926     }
927     message.Message("Save:" + std::to_string(static_cast<int32_t>(type)) +
928         " : " + std::to_string(value) + " : " + std::to_string(storeDBResult));
929     NotificationAnalyticsUtil::ReportModifyEvent(message);
930     return storeDBResult ? ERR_OK : ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
931 }
932 
933 template <typename T>
GetBundleProperty( const sptr<NotificationBundleOption> &bundleOption, const BundleType &type, T &value)934 ErrCode NotificationPreferences::GetBundleProperty(
935     const sptr<NotificationBundleOption> &bundleOption, const BundleType &type, T &value)
936 {
937     ErrCode result = ERR_OK;
938     NotificationPreferencesInfo::BundleInfo bundleInfo;
939     std::lock_guard<std::mutex> lock(preferenceMutex_);
940     if (preferencesInfo_.GetBundleInfo(bundleOption, bundleInfo)) {
941         switch (type) {
942             case BundleType::BUNDLE_IMPORTANCE_TYPE:
943                 value = bundleInfo.GetImportance();
944                 break;
945             case BundleType::BUNDLE_BADGE_TOTAL_NUM_TYPE:
946                 value = bundleInfo.GetBadgeTotalNum();
947                 break;
948             case BundleType::BUNDLE_SHOW_BADGE_TYPE:
949                 value = bundleInfo.GetIsShowBadge();
950                 break;
951             case BundleType::BUNDLE_ENABLE_NOTIFICATION_TYPE:
952                 value = bundleInfo.GetEnableNotification();
953                 break;
954             case BundleType::BUNDLE_POPPED_DIALOG_TYPE:
955                 ANS_LOGD("Into BUNDLE_POPPED_DIALOG_TYPE:GetHasPoppedDialog.");
956                 value = bundleInfo.GetHasPoppedDialog();
957                 break;
958             case BundleType::BUNDLE_SLOTFLGS_TYPE:
959                 value = bundleInfo.GetSlotFlags();
960                 ANS_LOGD("Into BUNDLE_SLOTFLGS_TYPE:GetSlotFlags.");
961                 break;
962             default:
963                 result = ERR_ANS_INVALID_PARAM;
964                 break;
965         }
966     } else {
967         ANS_LOGW("Notification bundle does not exsit.");
968         result = ERR_ANS_PREFERENCES_NOTIFICATION_BUNDLE_NOT_EXIST;
969     }
970     return result;
971 }
972 
GenerateBundleKey(const sptr<NotificationBundleOption> &bundleOption) const973 std::string NotificationPreferences::GenerateBundleKey(const sptr<NotificationBundleOption> &bundleOption) const
974 {
975     return bundleOption->GetBundleName().append(std::to_string(bundleOption->GetUid()));
976 }
977 
GetTemplateSupported(const std::string& templateName, bool &support)978 ErrCode NotificationPreferences::GetTemplateSupported(const std::string& templateName, bool &support)
979 {
980     if (templateName.length() == 0) {
981         ANS_LOGE("template name is null.");
982         return ERR_ANS_INVALID_PARAM;
983     }
984 
985     std::ifstream inFile;
986     inFile.open(DEFAULT_TEMPLATE_PATH.c_str(), std::ios::in);
987     if (!inFile.is_open()) {
988         ANS_LOGE("read template config error.");
989         return ERR_ANS_PREFERENCES_NOTIFICATION_READ_TEMPLATE_CONFIG_FAILED;
990     }
991 
992     nlohmann::json jsonObj;
993     inFile >> jsonObj;
994     if (jsonObj.is_null() || !jsonObj.is_object()) {
995         ANS_LOGE("Invalid JSON object");
996         return ERR_ANS_PREFERENCES_NOTIFICATION_READ_TEMPLATE_CONFIG_FAILED;
997     }
998     if (jsonObj.is_discarded()) {
999         ANS_LOGE("template json discarded error.");
1000         inFile.close();
1001         return ERR_ANS_PREFERENCES_NOTIFICATION_READ_TEMPLATE_CONFIG_FAILED;
1002     }
1003 
1004     if (jsonObj.contains(templateName)) {
1005         support = true;
1006     }
1007 
1008     jsonObj.clear();
1009     inFile.close();
1010     return ERR_OK;
1011 }
1012 
SetDistributedEnabledByBundle(const sptr<NotificationBundleOption> &bundleOption, const std::string &deviceType, const bool enabled)1013 ErrCode NotificationPreferences::SetDistributedEnabledByBundle(const sptr<NotificationBundleOption> &bundleOption,
1014     const std::string &deviceType, const bool enabled)
1015 {
1016     ANS_LOGD("%{public}s", __FUNCTION__);
1017     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
1018         return ERR_ANS_INVALID_PARAM;
1019     }
1020 
1021     std::lock_guard<std::mutex> lock(preferenceMutex_);
1022     NotificationPreferencesInfo::BundleInfo bundleInfo;
1023     bundleInfo.SetBundleName(bundleOption->GetBundleName());
1024     bundleInfo.SetBundleUid(bundleOption->GetUid());
1025     bundleInfo.SetEnableNotification(CheckApiCompatibility(bundleOption));
1026     bool storeDBResult = true;
1027     storeDBResult = preferncesDB_->PutDistributedEnabledForBundle(deviceType, bundleInfo, enabled);
1028     return storeDBResult ? ERR_OK : ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
1029 }
1030 
IsDistributedEnabledByBundle(const sptr<NotificationBundleOption> &bundleOption, const std::string &deviceType, bool &enabled)1031 ErrCode NotificationPreferences::IsDistributedEnabledByBundle(const sptr<NotificationBundleOption> &bundleOption,
1032     const std::string &deviceType, bool &enabled)
1033 {
1034     ANS_LOGD("%{public}s", __FUNCTION__);
1035     if (bundleOption == nullptr || bundleOption->GetBundleName().empty()) {
1036         return ERR_ANS_INVALID_PARAM;
1037     }
1038 
1039     std::lock_guard<std::mutex> lock(preferenceMutex_);
1040     NotificationPreferencesInfo::BundleInfo bundleInfo;
1041     bundleInfo.SetBundleName(bundleOption->GetBundleName());
1042     bundleInfo.SetBundleUid(bundleOption->GetUid());
1043     bundleInfo.SetEnableNotification(CheckApiCompatibility(bundleOption));
1044     bool storeDBResult = true;
1045     storeDBResult = preferncesDB_->GetDistributedEnabledForBundle(deviceType, bundleInfo, enabled);
1046     return storeDBResult ? ERR_OK : ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
1047 }
1048 
SetSmartReminderEnabled(const std::string &deviceType, const bool enabled)1049 ErrCode NotificationPreferences::SetSmartReminderEnabled(const std::string &deviceType, const bool enabled)
1050 {
1051     ANS_LOGD("%{public}s", __FUNCTION__);
1052     if (deviceType.empty()) {
1053         return ERR_ANS_INVALID_PARAM;
1054     }
1055 
1056     std::lock_guard<std::mutex> lock(preferenceMutex_);
1057     bool storeDBResult = true;
1058     storeDBResult = preferncesDB_->SetSmartReminderEnabled(deviceType, enabled);
1059     return storeDBResult ? ERR_OK : ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
1060 }
1061 
IsSmartReminderEnabled(const std::string &deviceType, bool &enabled)1062 ErrCode NotificationPreferences::IsSmartReminderEnabled(const std::string &deviceType, bool &enabled)
1063 {
1064     ANS_LOGD("%{public}s", __FUNCTION__);
1065     if (deviceType.empty()) {
1066         return ERR_ANS_INVALID_PARAM;
1067     }
1068 
1069     std::lock_guard<std::mutex> lock(preferenceMutex_);
1070     bool storeDBResult = true;
1071     storeDBResult = preferncesDB_->IsSmartReminderEnabled(deviceType, enabled);
1072     return storeDBResult ? ERR_OK : ERR_ANS_PREFERENCES_NOTIFICATION_DB_OPERATION_FAILED;
1073 }
1074 
InitSettingFromDisturbDB(int32_t userId)1075 void NotificationPreferences::InitSettingFromDisturbDB(int32_t userId)
1076 {
1077     ANS_LOGI("%{public}s userId is %{public}d", __FUNCTION__, userId);
1078     std::lock_guard<std::mutex> lock(preferenceMutex_);
1079     if (preferncesDB_ != nullptr) {
1080         preferncesDB_->ParseFromDisturbeDB(preferencesInfo_, userId);
1081     }
1082 }
1083 
RemoveSettings(int32_t userId)1084 void NotificationPreferences::RemoveSettings(int32_t userId)
1085 {
1086     ANS_LOGD("%{public}s", __FUNCTION__);
1087 
1088     {
1089         std::lock_guard<std::mutex> lock(preferenceMutex_);
1090         preferencesInfo_.RemoveNotificationEnable(userId);
1091         preferencesInfo_.RemoveDoNotDisturbDate(userId);
1092     }
1093 
1094     if (preferncesDB_ != nullptr) {
1095         preferncesDB_->RemoveNotificationEnable(userId);
1096         preferncesDB_->RemoveDoNotDisturbDate(userId);
1097         preferncesDB_->DropUserTable(userId);
1098     }
1099 }
1100 
CheckApiCompatibility(const sptr<NotificationBundleOption> &bundleOption) const1101 bool NotificationPreferences::CheckApiCompatibility(const sptr<NotificationBundleOption> &bundleOption) const
1102 {
1103     ANS_LOGD("%{public}s", __FUNCTION__);
1104     std::shared_ptr<BundleManagerHelper> bundleManager = BundleManagerHelper::GetInstance();
1105     if (bundleManager == nullptr) {
1106         return false;
1107     }
1108     return bundleManager->CheckApiCompatibility(bundleOption);
1109 }
1110 
RemoveAnsBundleDbInfo(const sptr<NotificationBundleOption> &bundleOption)1111 void NotificationPreferences::RemoveAnsBundleDbInfo(const sptr<NotificationBundleOption> &bundleOption)
1112 {
1113     ANS_LOGE("%{public}s", __FUNCTION__);
1114     if (preferncesDB_ != nullptr && bundleOption != nullptr) {
1115         preferncesDB_->RemoveAnsBundleDbInfo(bundleOption->GetBundleName(), bundleOption->GetUid());
1116     }
1117 }
1118 
RemoveEnabledDbByBundle(const sptr<NotificationBundleOption> &bundleOption)1119 void NotificationPreferences::RemoveEnabledDbByBundle(const sptr<NotificationBundleOption> &bundleOption)
1120 {
1121     ANS_LOGE("%{public}s", __FUNCTION__);
1122     if (preferncesDB_ != nullptr && bundleOption != nullptr) {
1123         std::lock_guard<std::mutex> lock(preferenceMutex_);
1124         preferncesDB_->RemoveEnabledDbByBundleName(bundleOption->GetBundleName(), bundleOption->GetUid());
1125     }
1126 }
1127 
GetBundleSoundPermission(bool &allPackage, std::set<std::string> &bundleNames)1128 bool NotificationPreferences::GetBundleSoundPermission(bool &allPackage, std::set<std::string> &bundleNames)
1129 {
1130     ANS_LOGD("%{public}s", __FUNCTION__);
1131     std::string value = "";
1132     int32_t userId = -1;
1133     OsAccountManagerHelper::GetInstance().GetCurrentCallingUserId(userId);
1134     if (GetKvFromDb("RING_TRUSTLIST_PKG", value, userId) != ERR_OK) {
1135         ANS_LOGD("Get bundle sound permission failed.");
1136         return false;
1137     }
1138 
1139     ANS_LOGD("The bundle permission is :%{public}s.", value.c_str());
1140     nlohmann::json jsonPermission = nlohmann::json::parse(value, nullptr, false);
1141     if (jsonPermission.is_null() || jsonPermission.empty()) {
1142         ANS_LOGE("Invalid JSON object");
1143         return false;
1144     }
1145     if (jsonPermission.is_discarded() || !jsonPermission.is_array()) {
1146         ANS_LOGE("Parse bundle permission failed due to data is discarded or not array");
1147         return false;
1148     }
1149 
1150     for (const auto &item : jsonPermission) {
1151         bundleNames.insert(item);
1152         if (item == "ALL_PKG") {
1153             allPackage = true;
1154         }
1155     }
1156     return true;
1157 }
1158 
SetKvToDb( const std::string &key, const std::string &value, const int32_t &userId)1159 int32_t NotificationPreferences::SetKvToDb(
1160     const std::string &key, const std::string &value, const int32_t &userId)
1161 {
1162     if (preferncesDB_ == nullptr) {
1163         return ERR_ANS_SERVICE_NOT_READY;
1164     }
1165     return preferncesDB_->SetKvToDb(key, value, userId);
1166 }
1167 
SetByteToDb( const std::string &key, const std::vector<uint8_t> &value, const int32_t &userId)1168 int32_t NotificationPreferences::SetByteToDb(
1169     const std::string &key, const std::vector<uint8_t> &value, const int32_t &userId)
1170 {
1171     if (preferncesDB_ == nullptr) {
1172         return ERR_ANS_SERVICE_NOT_READY;
1173     }
1174     return preferncesDB_->SetByteToDb(key, value, userId);
1175 }
1176 
GetKvFromDb( const std::string &key, std::string &value, const int32_t &userId)1177 int32_t NotificationPreferences::GetKvFromDb(
1178     const std::string &key, std::string &value, const int32_t &userId)
1179 {
1180     if (preferncesDB_ == nullptr) {
1181         return ERR_ANS_SERVICE_NOT_READY;
1182     }
1183     return preferncesDB_->GetKvFromDb(key, value, userId);
1184 }
1185 
GetByteFromDb( const std::string &key, std::vector<uint8_t> &value, const int32_t &userId)1186 int32_t NotificationPreferences::GetByteFromDb(
1187     const std::string &key, std::vector<uint8_t> &value, const int32_t &userId)
1188 {
1189     if (preferncesDB_ == nullptr) {
1190         return ERR_ANS_SERVICE_NOT_READY;
1191     }
1192     return preferncesDB_->GetByteFromDb(key, value, userId);
1193 }
1194 
GetBatchKvsFromDb( const std::string &key, std::unordered_map<std::string, std::string> &values, const int32_t &userId)1195 int32_t NotificationPreferences::GetBatchKvsFromDb(
1196     const std::string &key, std::unordered_map<std::string, std::string> &values, const int32_t &userId)
1197 {
1198     if (preferncesDB_ == nullptr) {
1199         return ERR_ANS_SERVICE_NOT_READY;
1200     }
1201     return preferncesDB_->GetBatchKvsFromDb(key, values, userId);
1202 }
1203 
DeleteKvFromDb(const std::string &key, const int32_t &userId)1204 int32_t NotificationPreferences::DeleteKvFromDb(const std::string &key, const int32_t &userId)
1205 {
1206     if (preferncesDB_ == nullptr) {
1207         return ERR_ANS_SERVICE_NOT_READY;
1208     }
1209     return preferncesDB_->DeleteKvFromDb(key, userId);
1210 }
1211 
IsAgentRelationship(const std::string &agentBundleName, const std::string &sourceBundleName)1212 bool NotificationPreferences::IsAgentRelationship(const std::string &agentBundleName,
1213     const std::string &sourceBundleName)
1214 {
1215     if (AccessTokenHelper::CheckPermission(OHOS_PERMISSION_NOTIFICATION_AGENT_CONTROLLER)) {
1216         ANS_LOGD("Client has agent permission.");
1217         return true;
1218     }
1219 
1220     if (preferncesDB_ == nullptr) {
1221         ANS_LOGD("perferencdDb is null.");
1222         return false;
1223     }
1224 
1225     return preferncesDB_->IsAgentRelationship(agentBundleName, sourceBundleName);
1226 }
1227 
GetAdditionalConfig(const std::string &key)1228 std::string NotificationPreferences::GetAdditionalConfig(const std::string &key)
1229 {
1230     if (preferncesDB_ == nullptr) {
1231         return "";
1232     }
1233     return preferncesDB_->GetAdditionalConfig(key);
1234 }
1235 }  // namespace Notification
1236 }  // namespace OHOS
1237