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 }