1686862fbSopenharmony_ci/* 2686862fbSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3686862fbSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4686862fbSopenharmony_ci * you may not use this file except in compliance with the License. 5686862fbSopenharmony_ci * You may obtain a copy of the License at 6686862fbSopenharmony_ci * 7686862fbSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8686862fbSopenharmony_ci * 9686862fbSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10686862fbSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11686862fbSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12686862fbSopenharmony_ci * See the License for the specific language governing permissions and 13686862fbSopenharmony_ci * limitations under the License. 14686862fbSopenharmony_ci */ 15686862fbSopenharmony_ci 16686862fbSopenharmony_ci#include "datashare_manager.h" 17686862fbSopenharmony_ci 18686862fbSopenharmony_ci#include "distributed_sched_utils.h" 19686862fbSopenharmony_ci#include "dsched_continue_manager.h" 20686862fbSopenharmony_ci#include "dtbschedmgr_log.h" 21686862fbSopenharmony_ci#include "mission/dms_continue_recv_manager.h" 22686862fbSopenharmony_ci#include "mission/dms_continue_send_manager.h" 23686862fbSopenharmony_ci#include "os_account_manager.h" 24686862fbSopenharmony_ci#include "switch_status_dependency.h" 25686862fbSopenharmony_ci 26686862fbSopenharmony_cinamespace OHOS { 27686862fbSopenharmony_cinamespace DistributedSchedule { 28686862fbSopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(DataShareManager); 29686862fbSopenharmony_cinamespace { 30686862fbSopenharmony_ciconst std::string TAG = "DMSDataShareManager"; 31686862fbSopenharmony_ciconstexpr static int32_t INVALID_ACCOUNT_ID = -1; 32686862fbSopenharmony_ci} 33686862fbSopenharmony_ciSettingObserver::SettingObserver() = default; 34686862fbSopenharmony_ciSettingObserver::~SettingObserver() = default; 35686862fbSopenharmony_ci 36686862fbSopenharmony_civoid SettingObserver::OnChange() 37686862fbSopenharmony_ci{ 38686862fbSopenharmony_ci HILOGI("DataShareRegisterObserver OnChange start"); 39686862fbSopenharmony_ci if (observerCallback_ != nullptr) { 40686862fbSopenharmony_ci observerCallback_(); 41686862fbSopenharmony_ci } 42686862fbSopenharmony_ci HILOGI("DataShareRegisterObserver OnChange done"); 43686862fbSopenharmony_ci} 44686862fbSopenharmony_ci 45686862fbSopenharmony_civoid SettingObserver::SetObserverCallback(ObserverCallback &observerCallback) 46686862fbSopenharmony_ci{ 47686862fbSopenharmony_ci observerCallback_ = observerCallback; 48686862fbSopenharmony_ci} 49686862fbSopenharmony_ci 50686862fbSopenharmony_cisptr<SettingObserver> DataShareManager::GetSettingObserver(const std::string &key) 51686862fbSopenharmony_ci{ 52686862fbSopenharmony_ci HILOGI("GetSettingObserver with key is %{public}s", key.c_str()); 53686862fbSopenharmony_ci std::lock_guard<std::mutex> lockGuard(observerMapMutex_); 54686862fbSopenharmony_ci if (settingObserverMap_.find(key) != settingObserverMap_.end()) { 55686862fbSopenharmony_ci return settingObserverMap_.find(key)->second; 56686862fbSopenharmony_ci } 57686862fbSopenharmony_ci return nullptr; 58686862fbSopenharmony_ci} 59686862fbSopenharmony_ci 60686862fbSopenharmony_cistd::shared_ptr<DataShare::DataShareHelper> DataShareManager::CreateDataShareHelper() 61686862fbSopenharmony_ci{ 62686862fbSopenharmony_ci HILOGI("DataShareManager CreateDataShareHelper start"); 63686862fbSopenharmony_ci DataShare::CreateOptions options; 64686862fbSopenharmony_ci options.isProxy_ = true; 65686862fbSopenharmony_ci return DataShare::DataShareHelper::Creator(SwitchStatusDependency::SETTINGS_USER_SECURE_URI, options); 66686862fbSopenharmony_ci} 67686862fbSopenharmony_ci 68686862fbSopenharmony_civoid DataShareManager::RegisterObserver(const std::string &key, SettingObserver::ObserverCallback &observerCallback) 69686862fbSopenharmony_ci{ 70686862fbSopenharmony_ci HILOGI("DataShareManager RegisterObserver start"); 71686862fbSopenharmony_ci sptr<SettingObserver> observer = GetSettingObserver(key); 72686862fbSopenharmony_ci if (observer != nullptr) { 73686862fbSopenharmony_ci HILOGI("Observer is already registered with key is %{public}s", key.c_str()); 74686862fbSopenharmony_ci UnregisterObserver(key); 75686862fbSopenharmony_ci } 76686862fbSopenharmony_ci std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(); 77686862fbSopenharmony_ci if (dataShareHelper == nullptr) { 78686862fbSopenharmony_ci HILOGE("Register observer failed, dataShareHelper is null"); 79686862fbSopenharmony_ci return; 80686862fbSopenharmony_ci } 81686862fbSopenharmony_ci int32_t userId = GetLocalAccountId(); 82686862fbSopenharmony_ci Uri uri(AssembleUserSecureUri(userId, key)); 83686862fbSopenharmony_ci sptr<SettingObserver> newObserver(new SettingObserver()); 84686862fbSopenharmony_ci observer = newObserver; 85686862fbSopenharmony_ci if (observer == nullptr) { 86686862fbSopenharmony_ci HILOGE("Register observer failed, observer is null"); 87686862fbSopenharmony_ci return; 88686862fbSopenharmony_ci } 89686862fbSopenharmony_ci observer->SetObserverCallback(observerCallback); 90686862fbSopenharmony_ci dataShareHelper->RegisterObserver(uri, observer); 91686862fbSopenharmony_ci dataShareHelper->Release(); 92686862fbSopenharmony_ci 93686862fbSopenharmony_ci std::lock_guard<std::mutex> lockGuard(observerMapMutex_); 94686862fbSopenharmony_ci settingObserverMap_[key] = observer; 95686862fbSopenharmony_ci HILOGI("DataShareManager RegisterObserver success with key is %{public}s", key.c_str()); 96686862fbSopenharmony_ci} 97686862fbSopenharmony_ci 98686862fbSopenharmony_civoid DataShareManager::UnregisterObserver(const std::string &key) 99686862fbSopenharmony_ci{ 100686862fbSopenharmony_ci HILOGI("DataShareManager UnregisterObserver start"); 101686862fbSopenharmony_ci sptr<SettingObserver> observer = GetSettingObserver(key); 102686862fbSopenharmony_ci if (observer == nullptr) { 103686862fbSopenharmony_ci HILOGI("UnregisterObserver, observer is nullptr with key is %{public}s", key.c_str()); 104686862fbSopenharmony_ci return; 105686862fbSopenharmony_ci } 106686862fbSopenharmony_ci std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(); 107686862fbSopenharmony_ci if (dataShareHelper == nullptr) { 108686862fbSopenharmony_ci HILOGE("Unregister observer failed with key is %{public}s", key.c_str()); 109686862fbSopenharmony_ci return; 110686862fbSopenharmony_ci } 111686862fbSopenharmony_ci int32_t userId = GetLocalAccountId(); 112686862fbSopenharmony_ci Uri uri(AssembleUserSecureUri(userId, key)); 113686862fbSopenharmony_ci dataShareHelper->UnregisterObserver(uri, observer); 114686862fbSopenharmony_ci dataShareHelper->Release(); 115686862fbSopenharmony_ci 116686862fbSopenharmony_ci std::lock_guard<std::mutex> lockGuard(observerMapMutex_); 117686862fbSopenharmony_ci settingObserverMap_.erase(key); 118686862fbSopenharmony_ci HILOGI("DataShareManager UnregisterObserver success with key is %{public}s", key.c_str()); 119686862fbSopenharmony_ci} 120686862fbSopenharmony_ci 121686862fbSopenharmony_ciUri DataShareManager::AssembleUserSecureUri(int userId, const std::string &key) 122686862fbSopenharmony_ci{ 123686862fbSopenharmony_ci Uri uri(SwitchStatusDependency::SETTINGS_USER_SECURE_URI + "_" + std::to_string(userId) + "?Proxy=true&key=" + key); 124686862fbSopenharmony_ci return uri; 125686862fbSopenharmony_ci} 126686862fbSopenharmony_ci 127686862fbSopenharmony_ciint32_t DataShareManager::GetLocalAccountId() 128686862fbSopenharmony_ci{ 129686862fbSopenharmony_ci int32_t id = INVALID_ACCOUNT_ID; 130686862fbSopenharmony_ci ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountLocalId(id); 131686862fbSopenharmony_ci if (err != ERR_OK || id == INVALID_ACCOUNT_ID) { 132686862fbSopenharmony_ci HILOGE("GetLocalAccountId passing param invalid or return error!, err : %{public}d", err); 133686862fbSopenharmony_ci return INVALID_PARAMETERS_ERR; 134686862fbSopenharmony_ci } 135686862fbSopenharmony_ci return id; 136686862fbSopenharmony_ci} 137686862fbSopenharmony_ci 138686862fbSopenharmony_civoid DataShareManager::UpdateSwitchStatus(const std::string &key, const std::string &value) 139686862fbSopenharmony_ci{ 140686862fbSopenharmony_ci HILOGI("Start UpdateSwitchStatus"); 141686862fbSopenharmony_ci std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(); 142686862fbSopenharmony_ci if (dataShareHelper == nullptr) { 143686862fbSopenharmony_ci HILOGE("dataShareHelper is null, key is %{public}s", key.c_str()); 144686862fbSopenharmony_ci return; 145686862fbSopenharmony_ci } 146686862fbSopenharmony_ci 147686862fbSopenharmony_ci HILOGD("UpdateSwitchStatus key = %{public}s", key.c_str()); 148686862fbSopenharmony_ci int32_t userId = GetLocalAccountId(); 149686862fbSopenharmony_ci Uri uri(AssembleUserSecureUri(userId, key)); 150686862fbSopenharmony_ci DataShare::DataSharePredicates predicates; 151686862fbSopenharmony_ci predicates.EqualTo(SwitchStatusDependency::SETTINGS_DATA_FIELD_KEY, key); 152686862fbSopenharmony_ci 153686862fbSopenharmony_ci DataShare::DataShareValuesBucket bucket; 154686862fbSopenharmony_ci bucket.Put(SwitchStatusDependency::SETTINGS_DATA_FIELD_KEY, key); 155686862fbSopenharmony_ci bucket.Put(SwitchStatusDependency::SETTINGS_DATA_FIELD_VAL, value); 156686862fbSopenharmony_ci 157686862fbSopenharmony_ci auto result = dataShareHelper->UpdateEx(uri, predicates, bucket); 158686862fbSopenharmony_ci dataShareHelper->Release(); 159686862fbSopenharmony_ci if (result.first != ERR_OK) { 160686862fbSopenharmony_ci HILOGE("Update status failed: %{public}d", result.first); 161686862fbSopenharmony_ci } 162686862fbSopenharmony_ci HILOGI("Finish UpdateSwitchStatus, Updata status success: %{public}d", result.first); 163686862fbSopenharmony_ci return; 164686862fbSopenharmony_ci} 165686862fbSopenharmony_ci 166686862fbSopenharmony_cibool DataShareManager::IsCurrentContinueSwitchOn() 167686862fbSopenharmony_ci{ 168686862fbSopenharmony_ci HILOGD("IsCurrentContinueSwitchOn start"); 169686862fbSopenharmony_ci return isCurrentContinueSwitchOn_.load(); 170686862fbSopenharmony_ci} 171686862fbSopenharmony_ci 172686862fbSopenharmony_civoid DataShareManager::SetCurrentContinueSwitch(bool status) 173686862fbSopenharmony_ci{ 174686862fbSopenharmony_ci HILOGD("SetCurrentContinueSwitch start, status : %{public}d", status); 175686862fbSopenharmony_ci isCurrentContinueSwitchOn_.store(status); 176686862fbSopenharmony_ci} 177686862fbSopenharmony_ci} // namespace DistributedSchedule 178686862fbSopenharmony_ci} // namespace OHOS