• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "reminder_datashare_helper.h"
17 
18 #include "ans_log_wrapper.h"
19 #include "iservice_registry.h"
20 #include "reminder_calendar_share_table.h"
21 #include "system_ability_definition.h"
22 #include "reminder_request_calendar.h"
23 #include "reminder_data_manager.h"
24 #include "ability_manager_client.h"
25 #include "in_process_call_wrapper.h"
26 #include "reminder_bundle_manager_helper.h"
27 #include "reminder_utils.h"
28 
29 namespace OHOS::Notification {
30 namespace {
31 constexpr int64_t DURATION_PRELOAD_TIME = 10 * 60 * 60 * 1000;  // 10h, millisecond
32 constexpr int64_t DURATION_DELAY_TASK = 1 * 1000 * 1000;  // 1s, microsecond
33 constexpr int64_t CYCLE_DATASHARE_TASK = 1;  // 1s
34 constexpr int64_t DURATION_ONE_SECOND = 1000;  // 1s, millisecond
35 }
36 
37 template<typename T>
GetRdbValue(const std::shared_ptr<DataShare::DataShareResultSet> & resultSet,const std::string & name,T & value)38 void GetRdbValue(const std::shared_ptr<DataShare::DataShareResultSet>& resultSet,
39     const std::string& name, T& value)
40 {
41     value = T();
42     int32_t columnIndex = -1;
43     resultSet->GetColumnIndex(name, columnIndex);
44     if (columnIndex == -1) {
45         ANSR_LOGE("the column %{public}s does not exsit.", name.c_str());
46         return;
47     }
48 
49     if constexpr (std::is_same_v<T, std::string>) {
50         resultSet->GetString(columnIndex, value);
51     } else if constexpr (std::is_same_v<T, int64_t>) {
52         resultSet->GetLong(columnIndex, value);
53     } else if constexpr (std::is_same_v<T, uint64_t>) {
54         int64_t t = 0;
55         resultSet->GetLong(columnIndex, t);
56         value = static_cast<uint64_t>(t);
57     } else if constexpr (std::is_integral_v<T>) {
58         int32_t t = 0;
59         resultSet->GetInt(columnIndex, t);
60         value = static_cast<T>(t);
61     }
62 }
63 
GetInstance()64 ReminderDataShareHelper& ReminderDataShareHelper::GetInstance()
65 {
66     static ReminderDataShareHelper helper;
67     return helper;
68 }
69 
RegisterObserver()70 bool ReminderDataShareHelper::RegisterObserver()
71 {
72     std::lock_guard<std::mutex> locker(mutex_);
73     if (observer_ != nullptr) {
74         return true;
75     }
76     auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY);
77     if (helper == nullptr) {
78         ANSR_LOGE("null helper");
79         return false;
80     }
81     observer_ = std::make_shared<ReminderDataObserver>();
82     Uri uri(ReminderCalendarShareTable::PROXY);
83     helper->RegisterObserverExt(uri, observer_, false);
84     ReleaseDataShareHelper(helper);
85     return true;
86 }
87 
UnRegisterObserver()88 bool ReminderDataShareHelper::UnRegisterObserver()
89 {
90     std::lock_guard<std::mutex> locker(mutex_);
91     if (observer_ == nullptr) {
92         return true;
93     }
94     auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY);
95     if (helper == nullptr) {
96         ANSR_LOGE("null helper");
97         return false;
98     }
99     Uri uri(ReminderCalendarShareTable::PROXY);
100     helper->UnregisterObserverExt(uri, observer_);
101     ReleaseDataShareHelper(helper);
102     observer_ = nullptr;
103     return true;
104 }
105 
Query(std::map<std::string,sptr<ReminderRequest>> & reminders)106 bool ReminderDataShareHelper::Query(std::map<std::string, sptr<ReminderRequest>>& reminders)
107 {
108     auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY);
109     if (helper == nullptr) {
110         ANSR_LOGE("null helper");
111         return false;
112     }
113     int64_t timestamp = GetCurrentTime();
114     int64_t targetTimestamp = timestamp + DURATION_PRELOAD_TIME;
115 
116     std::string proxy = ReminderCalendarShareTable::PROXY;
117     proxy.append("?user=").append(std::to_string(curUserId_));
118     Uri uri(proxy);
119     std::vector<std::string> columns = GetColumns();
120     DataShare::DataSharePredicates predicates;
121     predicates.NotEqualTo(ReminderCalendarShareTable::STATE, ReminderCalendarShareTable::STATE_DISMISSED);
122     predicates.And();
123     predicates.BeginWrap();
124     predicates.BeginWrap();
125     predicates.LessThanOrEqualTo(ReminderCalendarShareTable::ALARM_TIME, timestamp);
126     predicates.And();
127     predicates.GreaterThanOrEqualTo(ReminderCalendarShareTable::END, timestamp);
128     predicates.EndWrap();
129     predicates.Or();
130     predicates.BeginWrap();
131     predicates.GreaterThanOrEqualTo(ReminderCalendarShareTable::ALARM_TIME, timestamp);
132     predicates.And();
133     predicates.LessThanOrEqualTo(ReminderCalendarShareTable::ALARM_TIME, targetTimestamp);
134     predicates.EndWrap();
135     predicates.EndWrap();
136     auto resultSet = helper->Query(uri, predicates, columns);
137     if (resultSet == nullptr) {
138         ReleaseDataShareHelper(helper);
139         return false;
140     }
141 
142     while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
143         sptr<ReminderRequest> reminder = CreateReminder(resultSet);
144         if (reminder == nullptr) {
145             continue;
146         }
147         reminders[reminder->GetIdentifier()] = reminder;
148     }
149     ReleaseDataShareHelper(helper);
150     ANSR_LOGD("Query size: %{public}d.", static_cast<int32_t>(reminders.size()));
151     return true;
152 }
153 
Query(Uri & uri,const std::string & key,std::string & value)154 bool ReminderDataShareHelper::Query(Uri& uri, const std::string& key, std::string& value)
155 {
156     static constexpr const char* SETTINGS_DATA_EXT_URI = "datashare::///com.ohos.settingsdata.DataAbility";
157     static constexpr const char* DATA_COLUMN_KEYWORD = "KEYWORD";
158     static constexpr const char* DATA_COLUMN_VALUE = "VALUE";
159     auto helper = CreateDataShareHelper(SETTINGS_DATA_EXT_URI);
160     if (helper == nullptr) {
161         ANSR_LOGE("null helper");
162         return false;
163     }
164     DataShare::DataSharePredicates predicates;
165     std::vector<std::string> columns;
166     predicates.EqualTo(DATA_COLUMN_KEYWORD, key);
167     auto result = helper->Query(uri, predicates, columns);
168     if (result == nullptr) {
169         ANSR_LOGE("Query failed, result is null");
170         return false;
171     }
172     if (result->GoToFirstRow() != DataShare::E_OK) {
173         ANSR_LOGE("GoToFirstRow failed.");
174         result->Close();
175         helper->Release();
176         return false;
177     }
178     int32_t columnIndex;
179     result->GetColumnIndex(DATA_COLUMN_VALUE, columnIndex);
180     result->GetString(columnIndex, value);
181     result->Close();
182     helper->Release();
183     return true;
184 }
185 
Update(const int32_t reminderId,const int32_t state)186 bool ReminderDataShareHelper::Update(const int32_t reminderId, const int32_t state)
187 {
188     auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY);
189     if (helper == nullptr) {
190         ANSR_LOGE("null helper");
191         return false;
192     }
193     std::string proxy = ReminderCalendarShareTable::PROXY;
194     proxy.append("?user=").append(std::to_string(curUserId_));
195     Uri uri(proxy);
196 
197     DataShare::DataSharePredicates predicates;
198     predicates.EqualTo(ReminderCalendarShareTable::ID, reminderId);
199     DataShare::DataShareValuesBucket valuesBucket;
200     valuesBucket.Put(ReminderCalendarShareTable::STATE, state);
201     helper->UpdateEx(uri, predicates, valuesBucket);
202     ReleaseDataShareHelper(helper);
203     return true;
204 }
205 
StartDataExtension(const int32_t reason)206 void ReminderDataShareHelper::StartDataExtension(const int32_t reason)
207 {
208     AAFwk::Want want;
209     want.SetElementName(ReminderCalendarShareTable::DATA_NAME, ReminderCalendarShareTable::ENTRY);
210     want.SetParam(ReminderCalendarShareTable::PARAM_CALLBACK_TYPE, reason);
211     IN_PROCESS_CALL_WITHOUT_RET(AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(want, nullptr));
212 }
213 
UpdateCalendarUid()214 void ReminderDataShareHelper::UpdateCalendarUid()
215 {
216     uid_ = ReminderBundleManagerHelper::GetInstance().GetDefaultUidByBundleName(ReminderCalendarShareTable::NAME,
217         curUserId_);
218     dataUid_ = ReminderBundleManagerHelper::GetInstance().GetDefaultUidByBundleName(
219         ReminderCalendarShareTable::DATA_NAME, curUserId_);
220     AppExecFwk::BundleInfo bundleInfo;
221     if (!ReminderBundleManagerHelper::GetInstance().GetBundleInfo(ReminderCalendarShareTable::DATA_NAME,
222         AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO, dataUid_, bundleInfo)) {
223         ANSR_LOGE("GetBundleInfo failed.");
224         return;
225     }
226     for (const auto& moduleInfo : bundleInfo.hapModuleInfos) {
227         for (const auto& metaData : moduleInfo.metadata) {
228             if (metaData.name == "hmos.calendardata.reminderDbVersion") {
229                 isNewRdbVer_ = true;
230                 ANSR_LOGE("New calendar rdb version");
231                 return;
232             }
233         }
234     }
235 }
236 
GetCacheReminders()237 std::map<std::string, sptr<ReminderRequest>> ReminderDataShareHelper::GetCacheReminders()
238 {
239     std::map<std::string, sptr<ReminderRequest>> results;
240     {
241         std::lock_guard<std::mutex> locker(cacheMutex_);
242         results = std::move(cache_);
243     }
244     return results;
245 }
246 
InsertCacheReminders(const std::map<std::string,sptr<ReminderRequest>> & reminders)247 void ReminderDataShareHelper::InsertCacheReminders(const std::map<std::string, sptr<ReminderRequest>>& reminders)
248 {
249     std::lock_guard<std::mutex> locker(cacheMutex_);
250     for (auto& each : reminders) {
251         cache_[each.first] = each.second;
252     }
253 }
254 
OnDataInsertOrDelete()255 void ReminderDataShareHelper::OnDataInsertOrDelete()
256 {
257     auto func = []() {
258         auto manager = ReminderDataManager::GetInstance();
259         if (manager == nullptr) {
260             ANSR_LOGE("null manager");
261             return;
262         }
263         manager->OnDataShareInsertOrDelete();
264     };
265     int64_t timestamp =
266         std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
267     if (timestamp - insertTime_ > CYCLE_DATASHARE_TASK) {
268         insertTime_ = timestamp;
269         insertTask_ = false;
270         queue_->submit(func);
271     } else {
272         bool expected = false;
273         if (insertTask_.compare_exchange_strong(expected, true)) {
274             ffrt::task_attr taskAttr;
275             taskAttr.delay(DURATION_DELAY_TASK);
276             queue_->submit(func, taskAttr);
277         }
278     }
279 }
280 
OnDataUpdate(const DataShare::DataShareObserver::ChangeInfo & info)281 void ReminderDataShareHelper::OnDataUpdate(const DataShare::DataShareObserver::ChangeInfo& info)
282 {
283     auto func = []() {
284         auto manager = ReminderDataManager::GetInstance();
285         if (manager == nullptr) {
286             ANSR_LOGE("null manager");
287             return;
288         }
289         auto reminders = ReminderDataShareHelper::GetInstance().GetCacheReminders();
290         manager->OnDataShareUpdate(reminders);
291     };
292 
293     std::map<std::string, sptr<ReminderRequest>> reminders = CreateReminder(info);
294     InsertCacheReminders(reminders);
295     int64_t timestamp =
296         std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
297     if (timestamp - updateTime_ > CYCLE_DATASHARE_TASK) {
298         updateTime_ = timestamp;
299         updateTask_ = false;
300         queue_->submit(func);
301     } else {
302         bool expected = false;
303         if (updateTask_.compare_exchange_strong(expected, true)) {
304             ffrt::task_attr taskAttr;
305             taskAttr.delay(DURATION_DELAY_TASK);
306             queue_->submit(func, taskAttr);
307         }
308     }
309 }
310 
CreateDataShareHelper(const std::string & uriStr)311 std::shared_ptr<DataShare::DataShareHelper> ReminderDataShareHelper::CreateDataShareHelper(const std::string& uriStr)
312 {
313     sptr<ISystemAbilityManager> manager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
314     if (manager == nullptr) {
315         ANSR_LOGE("null manager");
316         return nullptr;
317     }
318     sptr<IRemoteObject> remoteObj = manager->GetSystemAbility(ADVANCED_NOTIFICATION_SERVICE_ABILITY_ID);
319     if (remoteObj == nullptr) {
320         ANSR_LOGE("null remoteObj");
321         return nullptr;
322     }
323 
324     std::string proxy = uriStr;
325     proxy.append("?user=").append(std::to_string(curUserId_));
326     std::pair<int, std::shared_ptr<DataShare::DataShareHelper>> ret =
327         DataShare::DataShareHelper::Create(remoteObj, proxy, "");
328     if (ret.first == 0 && ret.second != nullptr) {
329         return ret.second;
330     } else {
331         ANSR_LOGE("Create DataShareHelper failed.");
332         return nullptr;
333     }
334 }
335 
ReleaseDataShareHelper(const std::shared_ptr<DataShare::DataShareHelper> & helper)336 bool ReminderDataShareHelper::ReleaseDataShareHelper(const std::shared_ptr<DataShare::DataShareHelper>& helper)
337 {
338     if (helper == nullptr) {
339         ANSR_LOGE("null helper");
340         return false;
341     }
342     return helper->Release();
343 }
344 
GetColumns() const345 std::vector<std::string> ReminderDataShareHelper::GetColumns() const
346 {
347     if (isNewRdbVer_) {
348         return std::vector<std::string> {
349             ReminderCalendarShareTable::ID, ReminderCalendarShareTable::EVENT_ID,
350             ReminderCalendarShareTable::END, ReminderCalendarShareTable::ALARM_TIME,
351             ReminderCalendarShareTable::STATE, ReminderCalendarShareTable::TITLE,
352             ReminderCalendarShareTable::CONTENT, ReminderCalendarShareTable::WANT_AGENT,
353             ReminderCalendarShareTable::BUTTONS, ReminderCalendarShareTable::SLOT_TYPE,
354             ReminderCalendarShareTable::IDENTIFIER, ReminderCalendarShareTable::TIME_INTERVAL,
355             ReminderCalendarShareTable::SNOOZE_TIMES, ReminderCalendarShareTable::RING_DURATION,
356             ReminderCalendarShareTable::SNOOZE_SLOT_TYPE, ReminderCalendarShareTable::SNOOZE_CONTENT,
357             ReminderCalendarShareTable::EXPIRED_CONTENT, ReminderCalendarShareTable::MAX_SCREEN_WANT_AGENT,
358             ReminderCalendarShareTable::CUSTOM_RING_URI
359         };
360     } else {
361         return std::vector<std::string> {
362             ReminderCalendarShareTable::ID, ReminderCalendarShareTable::EVENT_ID,
363             ReminderCalendarShareTable::END, ReminderCalendarShareTable::ALARM_TIME,
364             ReminderCalendarShareTable::STATE, ReminderCalendarShareTable::TITLE,
365             ReminderCalendarShareTable::CONTENT, ReminderCalendarShareTable::WANT_AGENT,
366             ReminderCalendarShareTable::BUTTONS, ReminderCalendarShareTable::SLOT_TYPE,
367             ReminderCalendarShareTable::IDENTIFIER
368         };
369     }
370 }
371 
CreateReminder(const std::shared_ptr<DataShare::DataShareResultSet> & result)372 sptr<ReminderRequest> ReminderDataShareHelper::CreateReminder(
373     const std::shared_ptr<DataShare::DataShareResultSet>& result)
374 {
375     sptr<ReminderRequest> reminder = sptr<ReminderRequestCalendar>::MakeSptr();
376     InitNormalInfo(reminder);
377     BuildReminderV1(result, reminder);
378     uint64_t triggerTime = 0;
379     GetRdbValue<uint64_t>(result, ReminderCalendarShareTable::ALARM_TIME, triggerTime);
380     reminder->SetTriggerTimeInMilli(triggerTime);
381 
382     int32_t reminderId = 0;
383     GetRdbValue<int32_t>(result, ReminderCalendarShareTable::ID, reminderId);
384     reminder->SetReminderId(reminderId);
385     int32_t notificationId = 0;
386     GetRdbValue<int32_t>(result, ReminderCalendarShareTable::EVENT_ID, notificationId);
387     reminder->SetNotificationId(notificationId);
388 
389     int32_t slotType = 0;
390     GetRdbValue<int32_t>(result, ReminderCalendarShareTable::SLOT_TYPE, slotType);
391     reminder->SetSlotType(NotificationConstant::SlotType(slotType));
392 
393     std::string strValue;
394     GetRdbValue<std::string>(result, ReminderCalendarShareTable::TITLE, strValue);
395     reminder->SetTitle(strValue);
396     GetRdbValue<std::string>(result, ReminderCalendarShareTable::CONTENT, strValue);
397     reminder->SetContent(strValue);
398     GetRdbValue<std::string>(result, ReminderCalendarShareTable::BUTTONS, strValue);
399     reminder->DeserializeButtonInfoFromJson(strValue);
400     GetRdbValue<std::string>(result, ReminderCalendarShareTable::WANT_AGENT, strValue);
401     reminder->DeserializeWantAgent(strValue, 0);
402     GetRdbValue<std::string>(result, ReminderCalendarShareTable::IDENTIFIER, strValue);
403     reminder->SetIdentifier(strValue);
404     uint64_t endDateTime = 0;
405     GetRdbValue<uint64_t>(result, ReminderCalendarShareTable::END, endDateTime);
406     reminder->SetAutoDeletedTime(endDateTime);
407 
408     ReminderRequestCalendar* calendar = static_cast<ReminderRequestCalendar*>(reminder.GetRefPtr());
409     calendar->SetDateTime(triggerTime);
410     calendar->SetEndDateTime(endDateTime);
411 
412     time_t now = static_cast<time_t>(triggerTime / DURATION_ONE_SECOND);
413     struct tm nowTime;
414     (void)localtime_r(&now, &nowTime);
415     calendar->SetFirstDesignateYear(static_cast<uint16_t>(ReminderRequest::GetActualTime(
416         ReminderRequest::TimeTransferType::YEAR, nowTime.tm_year)));
417     calendar->SetFirstDesignageMonth(static_cast<uint16_t>(ReminderRequest::GetActualTime(
418         ReminderRequest::TimeTransferType::MONTH, nowTime.tm_mon)));
419     calendar->SetFirstDesignateDay(nowTime.tm_mday);
420     return reminder;
421 }
422 
CreateReminder(const DataShare::DataShareObserver::ChangeInfo & info)423 std::map<std::string, sptr<ReminderRequest>> ReminderDataShareHelper::CreateReminder(
424     const DataShare::DataShareObserver::ChangeInfo& info)
425 {
426     std::map<std::string, sptr<ReminderRequest>> reminders;
427     for (auto& values : info.valueBuckets_) {
428         sptr<ReminderRequest> reminder = sptr<ReminderRequestCalendar>::MakeSptr();
429         InitNormalInfo(reminder);
430         uint64_t triggerTime = 0;
431         auto iter = values.find(ReminderCalendarShareTable::ALARM_TIME);
432         if (iter != values.end()) {
433             triggerTime = static_cast<uint64_t>(std::get<double>(iter->second));
434             reminder->SetTriggerTimeInMilli(triggerTime);
435         }
436         InitBaseInfo(values, reminder);
437         BuildReminderV1(values, reminder);
438         uint64_t endDateTime = 0;
439         iter = values.find(ReminderCalendarShareTable::END);
440         if (iter != values.end()) {
441             endDateTime = static_cast<uint64_t>(std::get<double>(iter->second));
442             reminder->SetAutoDeletedTime(endDateTime);
443         }
444 
445         ReminderRequestCalendar* calendar = static_cast<ReminderRequestCalendar*>(reminder.GetRefPtr());
446         calendar->SetDateTime(triggerTime);
447         calendar->SetEndDateTime(endDateTime);
448 
449         time_t now = static_cast<time_t>(calendar->GetDateTime() / DURATION_ONE_SECOND);
450         struct tm nowTime;
451         (void)localtime_r(&now, &nowTime);
452         calendar->SetFirstDesignateYear(static_cast<uint16_t>(ReminderRequest::GetActualTime(
453             ReminderRequest::TimeTransferType::YEAR, nowTime.tm_year)));
454         calendar->SetFirstDesignageMonth(static_cast<uint16_t>(ReminderRequest::GetActualTime(
455             ReminderRequest::TimeTransferType::MONTH, nowTime.tm_mon)));
456         calendar->SetFirstDesignateDay(nowTime.tm_mday);
457         reminders[reminder->GetIdentifier()] = reminder;
458     }
459     return reminders;
460 }
461 
InitNormalInfo(sptr<ReminderRequest> & reminder)462 void ReminderDataShareHelper::InitNormalInfo(sptr<ReminderRequest>& reminder)
463 {
464     reminder->SetRingDuration(0);
465     reminder->SetRingLoop(false);
466     reminder->SetRingChannel(ReminderRequest::RingChannel::NOTIFICATION);
467     reminder->InitUserId(curUserId_);
468     reminder->InitUid(uid_);
469     reminder->InitCreatorUid(dataUid_);
470     reminder->SetShare(true);
471     reminder->InitBundleName(ReminderCalendarShareTable::NAME);
472     reminder->InitCreatorBundleName(ReminderCalendarShareTable::DATA_NAME);
473     reminder->SetSystemApp(true);
474     reminder->SetTapDismissed(true);
475 }
476 
InitBaseInfo(const DataShare::DataShareObserver::ChangeInfo::VBucket & info,sptr<ReminderRequest> & reminder)477 void ReminderDataShareHelper::InitBaseInfo(const DataShare::DataShareObserver::ChangeInfo::VBucket& info,
478     sptr<ReminderRequest>& reminder)
479 {
480     auto iter = info.find(ReminderCalendarShareTable::ID);
481     if (iter != info.end()) {
482         reminder->SetReminderId(static_cast<int32_t>(std::get<double>(iter->second)));
483     }
484     iter = info.find(ReminderCalendarShareTable::EVENT_ID);
485     if (iter != info.end()) {
486         reminder->SetNotificationId(static_cast<int32_t>(std::get<double>(iter->second)));
487     }
488     iter = info.find(ReminderCalendarShareTable::SLOT_TYPE);
489     if (iter != info.end()) {
490         reminder->SetSlotType(
491             NotificationConstant::SlotType(static_cast<int32_t>(std::get<double>(iter->second))));
492     }
493     iter = info.find(ReminderCalendarShareTable::TITLE);
494     if (iter != info.end()) {
495         reminder->SetTitle(std::get<std::string>(iter->second));
496     }
497     iter = info.find(ReminderCalendarShareTable::CONTENT);
498     if (iter != info.end()) {
499         reminder->SetContent(std::get<std::string>(iter->second));
500     }
501     iter = info.find(ReminderCalendarShareTable::BUTTONS);
502     if (iter != info.end()) {
503         reminder->DeserializeButtonInfoFromJson(std::get<std::string>(iter->second));
504     }
505     iter = info.find(ReminderCalendarShareTable::WANT_AGENT);
506     if (iter != info.end()) {
507         reminder->DeserializeWantAgent(std::get<std::string>(iter->second), 0);
508     }
509     iter = info.find(ReminderCalendarShareTable::IDENTIFIER);
510     if (iter != info.end()) {
511         reminder->SetIdentifier(std::get<std::string>(iter->second));
512     }
513 }
514 
BuildReminderV1(const std::shared_ptr<DataShare::DataShareResultSet> & result,sptr<ReminderRequest> & reminder)515 void ReminderDataShareHelper::BuildReminderV1(const std::shared_ptr<DataShare::DataShareResultSet>& result,
516     sptr<ReminderRequest>& reminder)
517 {
518     if (!isNewRdbVer_) {
519         return;
520     }
521     uint64_t timeInterval = 0;
522     GetRdbValue<uint64_t>(result, ReminderCalendarShareTable::TIME_INTERVAL, timeInterval);
523     reminder->SetTimeInterval(timeInterval);
524     uint8_t snoozeTimes = 0;
525     GetRdbValue<uint8_t>(result, ReminderCalendarShareTable::SNOOZE_TIMES, snoozeTimes);
526     reminder->SetSnoozeTimes(snoozeTimes);
527     uint64_t ringDuration = 0;
528     GetRdbValue<uint64_t>(result, ReminderCalendarShareTable::RING_DURATION, ringDuration);
529     reminder->SetRingDuration(ringDuration);
530     int32_t snoozeSlotType = 0;
531     GetRdbValue<int32_t>(result, ReminderCalendarShareTable::SNOOZE_SLOT_TYPE, snoozeSlotType);
532     reminder->SetSnoozeSlotType(NotificationConstant::SlotType(snoozeSlotType));
533     std::string snoozeContent;
534     GetRdbValue<std::string>(result, ReminderCalendarShareTable::SNOOZE_CONTENT, snoozeContent);
535     reminder->SetSnoozeContent(snoozeContent);
536     std::string expiredContent;
537     GetRdbValue<std::string>(result, ReminderCalendarShareTable::EXPIRED_CONTENT, expiredContent);
538     reminder->SetExpiredContent(expiredContent);
539     std::string maxScreenWantAgent;
540     GetRdbValue<std::string>(result, ReminderCalendarShareTable::MAX_SCREEN_WANT_AGENT, maxScreenWantAgent);
541     reminder->DeserializeWantAgent(maxScreenWantAgent, 1);
542     std::string customRingUri;
543     GetRdbValue<std::string>(result, ReminderCalendarShareTable::CUSTOM_RING_URI, customRingUri);
544     reminder->SetCustomRingUri(customRingUri);
545 }
546 
BuildReminderV1(const DataShare::DataShareObserver::ChangeInfo::VBucket & info,sptr<ReminderRequest> & reminder)547 void ReminderDataShareHelper::BuildReminderV1(const DataShare::DataShareObserver::ChangeInfo::VBucket& info,
548     sptr<ReminderRequest>& reminder)
549 {
550     if (!isNewRdbVer_) {
551         return;
552     }
553     auto iter = info.find(ReminderCalendarShareTable::TIME_INTERVAL);
554     if (iter != info.end()) {
555         reminder->SetTimeInterval(static_cast<uint64_t>(std::get<double>(iter->second)));
556     }
557     iter = info.find(ReminderCalendarShareTable::SNOOZE_TIMES);
558     if (iter != info.end()) {
559         reminder->SetSnoozeTimes(static_cast<uint8_t>(std::get<double>(iter->second)));
560     }
561     iter = info.find(ReminderCalendarShareTable::RING_DURATION);
562     if (iter != info.end()) {
563         reminder->SetRingDuration(static_cast<uint64_t>(std::get<double>(iter->second)));
564     }
565     iter = info.find(ReminderCalendarShareTable::SNOOZE_SLOT_TYPE);
566     if (iter != info.end()) {
567         reminder->SetSnoozeSlotType(
568             NotificationConstant::SlotType(static_cast<int32_t>(std::get<double>(iter->second))));
569     }
570     iter = info.find(ReminderCalendarShareTable::SNOOZE_CONTENT);
571     if (iter != info.end()) {
572         reminder->SetSnoozeContent(std::get<std::string>(iter->second));
573     }
574     iter = info.find(ReminderCalendarShareTable::EXPIRED_CONTENT);
575     if (iter != info.end()) {
576         reminder->SetExpiredContent(std::get<std::string>(iter->second));
577     }
578     iter = info.find(ReminderCalendarShareTable::MAX_SCREEN_WANT_AGENT);
579     if (iter != info.end()) {
580         reminder->DeserializeWantAgent(std::get<std::string>(iter->second), 1);
581     }
582     iter = info.find(ReminderCalendarShareTable::CUSTOM_RING_URI);
583     if (iter != info.end()) {
584         reminder->SetCustomRingUri(std::get<std::string>(iter->second));
585     }
586 }
587 
ReminderDataShareHelper()588 ReminderDataShareHelper::ReminderDataShareHelper()
589 {
590     queue_ = std::make_shared<ffrt::queue>("ReminderDataShareHelper");
591     insertTime_ =
592         std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
593     updateTime_.store(insertTime_.load());
594 }
595 
OnChange(const ChangeInfo & info)596 void ReminderDataShareHelper::ReminderDataObserver::OnChange(const ChangeInfo& info)
597 {
598     switch (info.changeType_) {
599         case DataShare::DataShareObserver::ChangeType::INSERT: {
600             ANSR_LOGI("DataShare insert.");
601             ReminderDataShareHelper::GetInstance().OnDataInsertOrDelete();
602             break;
603         }
604         case DataShare::DataShareObserver::ChangeType::UPDATE: {
605             ANSR_LOGI("DataShare update.");
606             ReminderDataShareHelper::GetInstance().OnDataUpdate(info);
607             break;
608         }
609         case DataShare::DataShareObserver::ChangeType::DELETE: {
610             ANSR_LOGI("DataShare delete.");
611             ReminderDataShareHelper::GetInstance().OnDataInsertOrDelete();
612             break;
613         }
614         default: {
615             break;
616         }
617     }
618 }
619 }