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