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