14dfc7d99Sopenharmony_ci/* 24dfc7d99Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 34dfc7d99Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44dfc7d99Sopenharmony_ci * you may not use this file except in compliance with the License. 54dfc7d99Sopenharmony_ci * You may obtain a copy of the License at 64dfc7d99Sopenharmony_ci * 74dfc7d99Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84dfc7d99Sopenharmony_ci * 94dfc7d99Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104dfc7d99Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114dfc7d99Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124dfc7d99Sopenharmony_ci * See the License for the specific language governing permissions and 134dfc7d99Sopenharmony_ci * limitations under the License. 144dfc7d99Sopenharmony_ci */ 154dfc7d99Sopenharmony_ci 164dfc7d99Sopenharmony_ci#include "oobe_datashare_utils.h" 174dfc7d99Sopenharmony_ci#include "res_sched_log.h" 184dfc7d99Sopenharmony_ci#include "oobe_manager.h" 194dfc7d99Sopenharmony_ci#include <functional> 204dfc7d99Sopenharmony_ci#include <vector> 214dfc7d99Sopenharmony_ci#include "ipc_skeleton.h" 224dfc7d99Sopenharmony_ci 234dfc7d99Sopenharmony_cinamespace OHOS { 244dfc7d99Sopenharmony_cinamespace ResourceSchedule { 254dfc7d99Sopenharmony_cistd::recursive_mutex OOBEManager::mutex_; 264dfc7d99Sopenharmony_cistd::vector<std::shared_ptr<IOOBETask>> OOBEManager::oobeTasks_; 274dfc7d99Sopenharmony_cistd::vector<std::function<void()>> OOBEManager::dataShareFunctions_; 284dfc7d99Sopenharmony_cisptr<OOBEManager::ResDataAbilityObserver> OOBEManager::observer_ = nullptr; 294dfc7d99Sopenharmony_cinamespace { 304dfc7d99Sopenharmony_ciconst std::string KEYWORD = "basic_statement_agreed"; 314dfc7d99Sopenharmony_ci} // namespace 324dfc7d99Sopenharmony_ci 334dfc7d99Sopenharmony_ciOOBEManager::OOBEManager() 344dfc7d99Sopenharmony_ci{ 354dfc7d99Sopenharmony_ci Initialize(); 364dfc7d99Sopenharmony_ci} 374dfc7d99Sopenharmony_ci 384dfc7d99Sopenharmony_ciOOBEManager::~OOBEManager() 394dfc7d99Sopenharmony_ci{ 404dfc7d99Sopenharmony_ci RESSCHED_LOGI("OOBEManager has been deconstructed"); 414dfc7d99Sopenharmony_ci} 424dfc7d99Sopenharmony_ci 434dfc7d99Sopenharmony_ciOOBEManager& OOBEManager::GetInstance() 444dfc7d99Sopenharmony_ci{ 454dfc7d99Sopenharmony_ci static OOBEManager instance; 464dfc7d99Sopenharmony_ci return instance; 474dfc7d99Sopenharmony_ci} 484dfc7d99Sopenharmony_ci 494dfc7d99Sopenharmony_cibool OOBEManager::GetOOBValue() 504dfc7d99Sopenharmony_ci{ 514dfc7d99Sopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 524dfc7d99Sopenharmony_ci return g_oobeValue; 534dfc7d99Sopenharmony_ci} 544dfc7d99Sopenharmony_ci 554dfc7d99Sopenharmony_ciErrCode OOBEManager::RegisterObserver(const std::string& key, const ResDataAbilityObserver::UpdateFunc& func) 564dfc7d99Sopenharmony_ci{ 574dfc7d99Sopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 584dfc7d99Sopenharmony_ci if (!DataShareUtils::GetInstance().GetDataShareReadyFlag()) { 594dfc7d99Sopenharmony_ci RESSCHED_LOGE("RegisterObserver: dataShare is not ready!"); 604dfc7d99Sopenharmony_ci std::function dataShareFunction = [key, func, this]() { 614dfc7d99Sopenharmony_ci ReRegisterObserver(key, func); 624dfc7d99Sopenharmony_ci }; 634dfc7d99Sopenharmony_ci dataShareFunctions_.push_back(dataShareFunction); 644dfc7d99Sopenharmony_ci return ERR_NO_INIT; 654dfc7d99Sopenharmony_ci } 664dfc7d99Sopenharmony_ci 674dfc7d99Sopenharmony_ci std::string callingIdentity = IPCSkeleton::ResetCallingIdentity(); 684dfc7d99Sopenharmony_ci auto uri = DataShareUtils::GetInstance().AssembleUri(key); 694dfc7d99Sopenharmony_ci auto helper = DataShareUtils::GetInstance().CreateDataShareHelper(); 704dfc7d99Sopenharmony_ci if (helper == nullptr) { 714dfc7d99Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 724dfc7d99Sopenharmony_ci RESSCHED_LOGE("RegisterObserver: helper does not created!"); 734dfc7d99Sopenharmony_ci return ERR_NO_INIT; 744dfc7d99Sopenharmony_ci } 754dfc7d99Sopenharmony_ci if (observer_ != nullptr) { 764dfc7d99Sopenharmony_ci RESSCHED_LOGE("Secondary RegisterObserver!"); 774dfc7d99Sopenharmony_ci UnregisterObserver(); 784dfc7d99Sopenharmony_ci } 794dfc7d99Sopenharmony_ci observer_ = new (std::nothrow)ResDataAbilityObserver(); 804dfc7d99Sopenharmony_ci if (observer_ == nullptr) { 814dfc7d99Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 824dfc7d99Sopenharmony_ci return ERR_INVALID_OPERATION; 834dfc7d99Sopenharmony_ci } 844dfc7d99Sopenharmony_ci observer_->SetUpdateFunc(func); 854dfc7d99Sopenharmony_ci helper->RegisterObserver(uri, observer_); 864dfc7d99Sopenharmony_ci DataShareUtils::GetInstance().ReleaseDataShareHelper(helper); 874dfc7d99Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 884dfc7d99Sopenharmony_ci RESSCHED_LOGI("succeed to register observer of uri=%{public}s", uri.ToString().c_str()); 894dfc7d99Sopenharmony_ci return ERR_OK; 904dfc7d99Sopenharmony_ci} 914dfc7d99Sopenharmony_ci 924dfc7d99Sopenharmony_civoid OOBEManager::ReRegisterObserver(const std::string& key, const ResDataAbilityObserver::UpdateFunc& func) 934dfc7d99Sopenharmony_ci{ 944dfc7d99Sopenharmony_ci int resultValue = 0; 954dfc7d99Sopenharmony_ci ResourceSchedule::DataShareUtils::GetInstance().GetValue(key, resultValue); 964dfc7d99Sopenharmony_ci if (resultValue != 0) { 974dfc7d99Sopenharmony_ci func(); 984dfc7d99Sopenharmony_ci return; 994dfc7d99Sopenharmony_ci } 1004dfc7d99Sopenharmony_ci RegisterObserver(key, func); 1014dfc7d99Sopenharmony_ci} 1024dfc7d99Sopenharmony_ci 1034dfc7d99Sopenharmony_ciErrCode OOBEManager::UnregisterObserver() 1044dfc7d99Sopenharmony_ci{ 1054dfc7d99Sopenharmony_ci std::string callingIdentity = IPCSkeleton::ResetCallingIdentity(); 1064dfc7d99Sopenharmony_ci auto uri = DataShareUtils::GetInstance().AssembleUri(KEYWORD); 1074dfc7d99Sopenharmony_ci auto helper = DataShareUtils::GetInstance().CreateDataShareHelper(); 1084dfc7d99Sopenharmony_ci if (helper == nullptr) { 1094dfc7d99Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 1104dfc7d99Sopenharmony_ci RESSCHED_LOGE("UnregisterObserver: helper does not created!"); 1114dfc7d99Sopenharmony_ci return ERR_NO_INIT; 1124dfc7d99Sopenharmony_ci } 1134dfc7d99Sopenharmony_ci helper->UnregisterObserver(uri, observer_); 1144dfc7d99Sopenharmony_ci DataShareUtils::GetInstance().ReleaseDataShareHelper(helper); 1154dfc7d99Sopenharmony_ci observer_ = nullptr; 1164dfc7d99Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 1174dfc7d99Sopenharmony_ci RESSCHED_LOGI("succeed to register observer of uri=%{public}s", uri.ToString().c_str()); 1184dfc7d99Sopenharmony_ci return ERR_OK; 1194dfc7d99Sopenharmony_ci} 1204dfc7d99Sopenharmony_ci 1214dfc7d99Sopenharmony_civoid OOBEManager::ResDataAbilityObserver::OnChange() 1224dfc7d99Sopenharmony_ci{ 1234dfc7d99Sopenharmony_ci if (update_) { 1244dfc7d99Sopenharmony_ci update_(); 1254dfc7d99Sopenharmony_ci } 1264dfc7d99Sopenharmony_ci} 1274dfc7d99Sopenharmony_ci 1284dfc7d99Sopenharmony_civoid OOBEManager::ResDataAbilityObserver::SetUpdateFunc(const UpdateFunc& func) 1294dfc7d99Sopenharmony_ci{ 1304dfc7d99Sopenharmony_ci update_ = func; 1314dfc7d99Sopenharmony_ci} 1324dfc7d99Sopenharmony_ci 1334dfc7d99Sopenharmony_civoid OOBEManager::Initialize() 1344dfc7d99Sopenharmony_ci{ 1354dfc7d99Sopenharmony_ci int resultValue = 0; 1364dfc7d99Sopenharmony_ci ResourceSchedule::DataShareUtils::GetInstance().GetValue(KEYWORD, resultValue); 1374dfc7d99Sopenharmony_ci if (resultValue != 0) { 1384dfc7d99Sopenharmony_ci g_oobeValue = true; 1394dfc7d99Sopenharmony_ci } 1404dfc7d99Sopenharmony_ci} 1414dfc7d99Sopenharmony_ci 1424dfc7d99Sopenharmony_cibool OOBEManager::SubmitTask(const std::shared_ptr<IOOBETask>& task) 1434dfc7d99Sopenharmony_ci{ 1444dfc7d99Sopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 1454dfc7d99Sopenharmony_ci if (task == nullptr) { 1464dfc7d99Sopenharmony_ci RESSCHED_LOGE("Bad task passed!"); 1474dfc7d99Sopenharmony_ci return false; 1484dfc7d99Sopenharmony_ci } 1494dfc7d99Sopenharmony_ci if (g_oobeValue) { 1504dfc7d99Sopenharmony_ci task->ExcutingTask(); 1514dfc7d99Sopenharmony_ci return true; 1524dfc7d99Sopenharmony_ci } 1534dfc7d99Sopenharmony_ci oobeTasks_.push_back(task); 1544dfc7d99Sopenharmony_ci return true; 1554dfc7d99Sopenharmony_ci} 1564dfc7d99Sopenharmony_ci 1574dfc7d99Sopenharmony_civoid OOBEManager::StartListen() 1584dfc7d99Sopenharmony_ci{ 1594dfc7d99Sopenharmony_ci int resultValue = 0; 1604dfc7d99Sopenharmony_ci ResourceSchedule::DataShareUtils::GetInstance().GetValue(KEYWORD, resultValue); 1614dfc7d99Sopenharmony_ci if (resultValue != 0) { 1624dfc7d99Sopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 1634dfc7d99Sopenharmony_ci g_oobeValue = true; 1644dfc7d99Sopenharmony_ci for (auto task : oobeTasks_) { 1654dfc7d99Sopenharmony_ci task->ExcutingTask(); 1664dfc7d99Sopenharmony_ci } 1674dfc7d99Sopenharmony_ci return; 1684dfc7d99Sopenharmony_ci } 1694dfc7d99Sopenharmony_ci OOBEManager::ResDataAbilityObserver::UpdateFunc updateFunc = [&]() { 1704dfc7d99Sopenharmony_ci int result = 0; 1714dfc7d99Sopenharmony_ci ResourceSchedule::DataShareUtils::GetInstance().GetValue(KEYWORD, result); 1724dfc7d99Sopenharmony_ci if (result != 0) { 1734dfc7d99Sopenharmony_ci RESSCHED_LOGI("User consent authorization!"); 1744dfc7d99Sopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 1754dfc7d99Sopenharmony_ci g_oobeValue = true; 1764dfc7d99Sopenharmony_ci for (auto task : oobeTasks_) { 1774dfc7d99Sopenharmony_ci task->ExcutingTask(); 1784dfc7d99Sopenharmony_ci } 1794dfc7d99Sopenharmony_ci } else { 1804dfc7d99Sopenharmony_ci RESSCHED_LOGI("User does not consent authorization!"); 1814dfc7d99Sopenharmony_ci g_oobeValue = false; 1824dfc7d99Sopenharmony_ci } 1834dfc7d99Sopenharmony_ci }; 1844dfc7d99Sopenharmony_ci RegisterObserver(KEYWORD, updateFunc); 1854dfc7d99Sopenharmony_ci} 1864dfc7d99Sopenharmony_ci 1874dfc7d99Sopenharmony_civoid OOBEManager::OnReceiveDataShareReadyCallBack() 1884dfc7d99Sopenharmony_ci{ 1894dfc7d99Sopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 1904dfc7d99Sopenharmony_ci for (auto function : dataShareFunctions_) { 1914dfc7d99Sopenharmony_ci function(); 1924dfc7d99Sopenharmony_ci } 1934dfc7d99Sopenharmony_ci dataShareFunctions_.clear(); 1944dfc7d99Sopenharmony_ci} 1954dfc7d99Sopenharmony_ci} // namespace ResourceSchedule 1964dfc7d99Sopenharmony_ci} // namespace OHOS 197