From a2925bdc4c324c344bac84f106561e1a189fcdca Mon Sep 17 00:00:00 2001 From: gaojiaqi Date: Tue, 1 Jul 2025 19:33:28 +0800 Subject: [PATCH] update Signed-off-by: gaojiaqi --- interfaces/inner_api/reminder_request.h | 1 + .../reminder/include/reminder_data_manager.h | 5 +- .../include/reminder_datashare_helper.h | 7 +- .../reminder/src/reminder_data_manager.cpp | 22 +++++-- .../src/reminder_data_manager_inner.cpp | 65 +++++++++++++++---- .../src/reminder_datashare_helper.cpp | 45 +++++++++++-- .../unittest/reminder_data_manager_test.cpp | 3 +- .../reminderdatamanager_fuzzer.cpp | 1 - .../reminderdatasharehelper_fuzzer.cpp | 3 +- 9 files changed, 119 insertions(+), 33 deletions(-) diff --git a/interfaces/inner_api/reminder_request.h b/interfaces/inner_api/reminder_request.h index 871350ba7..8ab25fc6d 100644 --- a/interfaces/inner_api/reminder_request.h +++ b/interfaces/inner_api/reminder_request.h @@ -206,6 +206,7 @@ public: enum class RingChannel : uint8_t { ALARM, MEDIA, + NOTIFICATION, // for calendar }; struct ButtonWantAgent { diff --git a/services/reminder/include/reminder_data_manager.h b/services/reminder/include/reminder_data_manager.h index dd25ea52b..efe1cfeb4 100644 --- a/services/reminder/include/reminder_data_manager.h +++ b/services/reminder/include/reminder_data_manager.h @@ -426,8 +426,6 @@ private: void InitTimerInfo(std::shared_ptr &timerInfo, const sptr &reminderRequest, TimerType reminderType) const; - void GetImmediatelyShowRemindersLocked(std::vector> &reminders) const; - /** * Find the reminder from reminderVector_ by reminder id. * @@ -688,6 +686,9 @@ private: */ void LoadShareReminders(); + int32_t ConvertRingChannel(ReminderRequest::RingChannel channel); + bool CheckSoundConfig(const sptr reminder); + /** * @brief Load reminder from datashare. */ diff --git a/services/reminder/include/reminder_datashare_helper.h b/services/reminder/include/reminder_datashare_helper.h index 0e2745d95..fa66dfa7d 100644 --- a/services/reminder/include/reminder_datashare_helper.h +++ b/services/reminder/include/reminder_datashare_helper.h @@ -45,6 +45,11 @@ public: */ bool Query(std::map>& reminders); + /** + * @brief Search value from uri. + */ + bool Query(Uri& uri, const std::string& key, std::string& value); + /** * @brief Update the reminder state. * state is ReminderCalendarShareTable::STATE_* @@ -97,7 +102,7 @@ private: * @brief Build datasharehelper, need to release it after use, * call ReleaseDataShareHelper. */ - std::shared_ptr CreateDataShareHelper(); + std::shared_ptr CreateDataShareHelper(const std::string& uriStr); bool ReleaseDataShareHelper(const std::shared_ptr& helper); /** diff --git a/services/reminder/src/reminder_data_manager.cpp b/services/reminder/src/reminder_data_manager.cpp index b7d644a88..d3b0509f1 100644 --- a/services/reminder/src/reminder_data_manager.cpp +++ b/services/reminder/src/reminder_data_manager.cpp @@ -1288,6 +1288,7 @@ void ReminderDataManager::HandleImmediatelyShow( bool isAlerting = false; std::unordered_map limits; int32_t totalCount = 0; + sptr playSoundReminder = nullptr; for (auto it = showImmediately.begin(); it != showImmediately.end(); ++it) { if ((*it)->IsShowing()) { continue; @@ -1300,13 +1301,17 @@ void ReminderDataManager::HandleImmediatelyShow( } if (((*it)->GetRingDuration() > 0) && !isAlerting) { std::lock_guard lock(ReminderDataManager::MUTEX); - ShowReminder((*it), true, false, isSysTimeChanged, true, true); + playSoundReminder = (*it); isAlerting = true; } else { std::lock_guard lock(ReminderDataManager::MUTEX); ShowReminder((*it), false, false, isSysTimeChanged, false, isAlerting); } } + if (playSoundReminder != nullptr) { + std::lock_guard lock(ReminderDataManager::MUTEX); + ShowReminder(playSoundReminder, true, false, isSysTimeChanged, true, true); + } } void ReminderDataManager::HandleExtensionReminder(std::vector>& extensionReminders, @@ -1605,9 +1610,7 @@ void ReminderDataManager::SetPlayerParam(const sptr reminder) } ANSR_LOGI("Play custom sound, reminderId:[%{public}d].", reminder->GetReminderId()); } - int32_t STREAM_ALARM = reminder->GetRingChannel() == ReminderRequest::RingChannel::MEDIA ? - static_cast(AudioStandard::StreamUsage::STREAM_USAGE_MEDIA) : - static_cast(AudioStandard::StreamUsage::STREAM_USAGE_ALARM); + int32_t STREAM_ALARM = ConvertRingChannel(reminder->GetRingChannel()); constexpr int32_t DEFAULT_VALUE = 0; // CONTENT_UNKNOWN Media::Format format; (void)format.PutIntValue(Media::PlayerKeys::CONTENT_TYPE, DEFAULT_VALUE); @@ -1641,8 +1644,15 @@ void ReminderDataManager::PlaySoundAndVibration(const sptr &rem audioManager->ActivateAudioSession(strategy); } SetPlayerParam(reminder); - soundPlayer_->PrepareAsync(); - soundPlayer_->Play(); + if (reminder->IsShare()) { + if (CheckSoundConfig(reminder)) { + soundPlayer_->PrepareAsync(); + soundPlayer_->Play(); + } + } else { + soundPlayer_->PrepareAsync(); + soundPlayer_->Play(); + } #endif SetAlertingReminder(reminder); } diff --git a/services/reminder/src/reminder_data_manager_inner.cpp b/services/reminder/src/reminder_data_manager_inner.cpp index ef22c3521..36f130e40 100644 --- a/services/reminder/src/reminder_data_manager_inner.cpp +++ b/services/reminder/src/reminder_data_manager_inner.cpp @@ -42,6 +42,7 @@ #include "config_policy_utils.h" #include "hitrace_meter_adapter.h" #include "notification_helper.h" +#include "reminder_datashare_helper.h" #ifdef HAS_HISYSEVENT_PART #include #include "hisysevent.h" @@ -60,6 +61,10 @@ constexpr int32_t TOTAL_MAX_NUMBER_SHOW_AT_ONCE = 500; // The maximun number of system that can be start extension count constexpr int32_t TOTAL_MAX_NUMBER_START_EXTENSION = 100; constexpr int32_t CONNECT_EXTENSION_INTERVAL = 100; +static constexpr const char* USER_SETINGS_DATA_SECURE_URI = + "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_"; +static constexpr const char* FOCUS_MODE_ENABLE_URI = "?Proxy=true&key=focus_mode_enable"; +static constexpr const char* FOCUS_MODE_ENABLE = "focus_mode_enable"; } static uint64_t GetRemainPartitionSize(const std::string& partitionName) @@ -415,20 +420,6 @@ ErrCode ReminderDataManager::CancelReminderToDb(const int32_t reminderId, const return ERR_OK; } -void ReminderDataManager::GetImmediatelyShowRemindersLocked(std::vector> &reminders) const -{ - std::lock_guard lock(ReminderDataManager::MUTEX); - for (auto reminderSptr : reminderVector_) { - if (!(reminderSptr->ShouldShowImmediately())) { - break; - } - if (reminderSptr->GetReminderType() != ReminderRequest::ReminderType::TIMER) { - reminderSptr->SetSnoozeTimesDynamic(0); - } - reminders.push_back(reminderSptr); - } -} - bool ReminderDataManager::IsAllowedNotify(const sptr &reminder) const { if (reminder == nullptr) { @@ -479,5 +470,51 @@ void ReminderDataManager::ReportUserDataSizeEvent() "FILE_OR_FOLDER_SIZE", folderSize); #endif } + +bool ReminderDataManager::CheckSoundConfig(const sptr reminder) +{ +#ifdef PLAYER_FRAMEWORK_ENABLE + NotificationBundleOption option; + option.SetBundleName(reminder->GetBundleName()); + option.SetUid(reminder->GetUid()); + uint32_t slotFlags; + ErrCode err = NotificationHelper::GetNotificationSlotFlagsAsBundle(option, slotFlags); + if (err != ERR_OK) { + ANSR_LOGE("GetNotificationSlotFlagsAsBundle failed."); + return false; + } + if (!(slotFlags & 1)) { + return false; + } + std::string uriStr = USER_SETINGS_DATA_SECURE_URI + std::to_string(reminder->GetUserId()) + + FOCUS_MODE_ENABLE_URI; + Uri enableUri(uriStr); + std::string enable; + bool ret = ReminderDataShareHelper::GetInstance().Query(enableUri, FOCUS_MODE_ENABLE, enable); + if (!ret) { + ANSR_LOGE("Query focus mode enable failed."); + return false; + } + if (enable.compare("1") == 0) { + ANSR_LOGI("Currently not is do not disurb mode."); + return false; + } +#endif + return true; +} + +int32_t ReminderDataManager::ConvertRingChannel(ReminderRequest::RingChannel channel) +{ + switch (channel) { + case ReminderRequest::RingChannel::ALARM: + return static_cast(AudioStandard::StreamUsage::STREAM_USAGE_ALARM); + case ReminderRequest::RingChannel::MEDIA: + return static_cast(AudioStandard::StreamUsage::STREAM_USAGE_MEDIA); + case ReminderRequest::RingChannel::NOTIFICATION: + return static_cast(AudioStandard::StreamUsage::STREAM_USAGE_NOTIFICATION); + default: + return static_cast(AudioStandard::StreamUsage::STREAM_USAGE_ALARM); + } +} } } diff --git a/services/reminder/src/reminder_datashare_helper.cpp b/services/reminder/src/reminder_datashare_helper.cpp index d6a51beba..0657fff90 100644 --- a/services/reminder/src/reminder_datashare_helper.cpp +++ b/services/reminder/src/reminder_datashare_helper.cpp @@ -73,7 +73,7 @@ bool ReminderDataShareHelper::RegisterObserver() if (observer_ != nullptr) { return true; } - auto helper = CreateDataShareHelper(); + auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY); if (helper == nullptr) { ANSR_LOGE("null helper"); return false; @@ -91,7 +91,7 @@ bool ReminderDataShareHelper::UnRegisterObserver() if (observer_ == nullptr) { return true; } - auto helper = CreateDataShareHelper(); + auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY); if (helper == nullptr) { ANSR_LOGE("null helper"); return false; @@ -105,7 +105,7 @@ bool ReminderDataShareHelper::UnRegisterObserver() bool ReminderDataShareHelper::Query(std::map>& reminders) { - auto helper = CreateDataShareHelper(); + auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY); if (helper == nullptr) { ANSR_LOGE("null helper"); return false; @@ -151,9 +151,41 @@ bool ReminderDataShareHelper::Query(std::map> return true; } +bool ReminderDataShareHelper::Query(Uri& uri, const std::string& key, std::string& value) +{ + static constexpr const char* SETTINGS_DATA_EXT_URI = "datashare::///com.ohos.settingsdata.DataAbility"; + static constexpr const char* DATA_COLUMN_KEYWORD = "KEYWORD"; + static constexpr const char* DATA_COLUMN_VALUE = "VALUE"; + auto helper = CreateDataShareHelper(SETTINGS_DATA_EXT_URI); + if (helper == nullptr) { + ANSR_LOGE("null helper"); + return false; + } + DataShare::DataSharePredicates predicates; + std::vector columns; + predicates.EqualTo(DATA_COLUMN_KEYWORD, key); + auto result = helper->Query(uri, predicates, columns); + if (result == nullptr) { + ANSR_LOGE("Query failed, result is null"); + return false; + } + if (result->GoToFirstRow() != DataShare::E_OK) { + ANSR_LOGE("GoToFirstRow failed."); + result->Close(); + helper->Release(); + return false; + } + int32_t columnIndex; + result->GetColumnIndex(DATA_COLUMN_VALUE, columnIndex); + result->GetString(columnIndex, value); + result->Close(); + helper->Release(); + return true; +} + bool ReminderDataShareHelper::Update(const int32_t reminderId, const int32_t state) { - auto helper = CreateDataShareHelper(); + auto helper = CreateDataShareHelper(ReminderCalendarShareTable::PROXY); if (helper == nullptr) { ANSR_LOGE("null helper"); return false; @@ -276,7 +308,7 @@ void ReminderDataShareHelper::OnDataUpdate(const DataShare::DataShareObserver::C } } -std::shared_ptr ReminderDataShareHelper::CreateDataShareHelper() +std::shared_ptr ReminderDataShareHelper::CreateDataShareHelper(const std::string& uriStr) { sptr manager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); if (manager == nullptr) { @@ -289,7 +321,7 @@ std::shared_ptr ReminderDataShareHelper::CreateDataS return nullptr; } - std::string proxy = ReminderCalendarShareTable::PROXY; + std::string proxy = uriStr; proxy.append("?user=").append(std::to_string(curUserId_)); std::pair> ret = DataShare::DataShareHelper::Create(remoteObj, proxy, ""); @@ -431,6 +463,7 @@ void ReminderDataShareHelper::InitNormalInfo(sptr& reminder) { reminder->SetRingDuration(0); reminder->SetRingLoop(false); + reminder->SetRingChannel(ReminderRequest::RingChannel::NOTIFICATION); reminder->InitUserId(curUserId_); reminder->InitUid(uid_); reminder->InitCreatorUid(dataUid_); diff --git a/services/reminder/test/unittest/reminder_data_manager_test.cpp b/services/reminder/test/unittest/reminder_data_manager_test.cpp index 590ac881b..f402208a1 100644 --- a/services/reminder/test/unittest/reminder_data_manager_test.cpp +++ b/services/reminder/test/unittest/reminder_data_manager_test.cpp @@ -433,7 +433,6 @@ HWTEST_F(ReminderDataManagerTest, ReminderDataManagerTest_015, Level1) manager->HandleSameNotificationIdShowing(reminder); manager->Init(); manager->InitUserId(); - manager->GetImmediatelyShowRemindersLocked(vec); manager->IsAllowedNotify(reminder); manager->IsAllowedNotify(nullptr); manager->IsReminderAgentReady(); @@ -1052,7 +1051,7 @@ HWTEST_F(ReminderDataManagerTest, ReminderDataManagerTest_021, Level1) ReminderDataShareHelper::GetInstance().OnDataUpdate(info); ReminderDataShareHelper::GetInstance().UnRegisterObserver(); ReminderDataShareHelper::GetInstance().UnRegisterObserver(); - auto helper = ReminderDataShareHelper::GetInstance().CreateDataShareHelper(); + auto helper = ReminderDataShareHelper::GetInstance().CreateDataShareHelper(ReminderCalendarShareTable::PROXY); ReminderDataShareHelper::GetInstance().ReleaseDataShareHelper(helper); ReminderDataShareHelper::ReminderDataObserver observer; diff --git a/test/fuzztest/reminderdatamanager_fuzzer/reminderdatamanager_fuzzer.cpp b/test/fuzztest/reminderdatamanager_fuzzer/reminderdatamanager_fuzzer.cpp index 8acda4034..3a0adab43 100644 --- a/test/fuzztest/reminderdatamanager_fuzzer/reminderdatamanager_fuzzer.cpp +++ b/test/fuzztest/reminderdatamanager_fuzzer/reminderdatamanager_fuzzer.cpp @@ -94,7 +94,6 @@ namespace OHOS { manager->CancelNotification(reminder); manager->CheckReminderLimitExceededLocked(callingUid, reminder); std::vector> reminders; - manager->GetImmediatelyShowRemindersLocked(reminders); manager->AddToShowedReminders(reminder); manager->IsAllowedNotify(reminder); diff --git a/test/fuzztest/reminderdatasharehelper_fuzzer/reminderdatasharehelper_fuzzer.cpp b/test/fuzztest/reminderdatasharehelper_fuzzer/reminderdatasharehelper_fuzzer.cpp index c4c1f5a1b..8ae449ce8 100644 --- a/test/fuzztest/reminderdatasharehelper_fuzzer/reminderdatasharehelper_fuzzer.cpp +++ b/test/fuzztest/reminderdatasharehelper_fuzzer/reminderdatasharehelper_fuzzer.cpp @@ -15,6 +15,7 @@ #include "reminder_request_timer.h" #include "reminder_datashare_helper.h" +#include "reminder_calendar_share_table.h" #include "reminderdatasharehelper_fuzzer.h" #include @@ -40,7 +41,7 @@ namespace OHOS { helper.OnDataInsertOrDelete(); DataShare::DataShareObserver::ChangeInfo info; helper.OnDataUpdate(info); - auto result = helper.CreateDataShareHelper(); + auto result = helper.CreateDataShareHelper(ReminderCalendarShareTable::PROXY); helper.ReleaseDataShareHelper(result); helper.GetColumns(); helper.CreateReminder(info); -- Gitee