1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "setting_datashare.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <thread>
19c29fa5a6Sopenharmony_ci
20c29fa5a6Sopenharmony_ci#include "datashare_predicates.h"
21c29fa5a6Sopenharmony_ci#include "datashare_result_set.h"
22c29fa5a6Sopenharmony_ci#include "datashare_values_bucket.h"
23c29fa5a6Sopenharmony_ci#include "ipc_skeleton.h"
24c29fa5a6Sopenharmony_ci#include "iservice_registry.h"
25c29fa5a6Sopenharmony_ci#include "mmi_log.h"
26c29fa5a6Sopenharmony_ci#include "rdb_errno.h"
27c29fa5a6Sopenharmony_ci#include "result_set.h"
28c29fa5a6Sopenharmony_ci#include "system_ability_definition.h"
29c29fa5a6Sopenharmony_ci#include "uri.h"
30c29fa5a6Sopenharmony_ci
31c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN
32c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_HANDLER
33c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
34c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "setting_DataShare"
35c29fa5a6Sopenharmony_ci
36c29fa5a6Sopenharmony_cinamespace OHOS {
37c29fa5a6Sopenharmony_cinamespace MMI {
38c29fa5a6Sopenharmony_cistd::shared_ptr<SettingDataShare> SettingDataShare::instance_ = nullptr;
39c29fa5a6Sopenharmony_cistd::mutex SettingDataShare::mutex_;
40c29fa5a6Sopenharmony_cisptr<IRemoteObject> SettingDataShare::remoteObj_;
41c29fa5a6Sopenharmony_cinamespace {
42c29fa5a6Sopenharmony_ciconst std::string SETTING_COLUMN_KEYWORD { "KEYWORD" };
43c29fa5a6Sopenharmony_ciconst std::string SETTING_COLUMN_VALUE { "VALUE" };
44c29fa5a6Sopenharmony_ciconst std::string SETTING_URI_PROXY { "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true" };
45c29fa5a6Sopenharmony_ciconst std::string SETTING_URI_USER_PROXY {
46c29fa5a6Sopenharmony_ci    "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_100?Proxy=true" };
47c29fa5a6Sopenharmony_ciconst std::string SETTINGS_DATA_EXT_URI { "datashare:///com.ohos.settingsdata.DataAbility" };
48c29fa5a6Sopenharmony_ciconstexpr int32_t DECIMAL_BASE { 10 };
49c29fa5a6Sopenharmony_ciconstexpr const int32_t E_OK{ 0 };
50c29fa5a6Sopenharmony_ciconstexpr const int32_t E_DATA_SHARE_NOT_READY { 1055 };
51c29fa5a6Sopenharmony_ci} // namespace
52c29fa5a6Sopenharmony_ci
53c29fa5a6Sopenharmony_ciSettingDataShare::~SettingDataShare() {}
54c29fa5a6Sopenharmony_ci
55c29fa5a6Sopenharmony_ciSettingDataShare& SettingDataShare::GetInstance(int32_t systemAbilityId)
56c29fa5a6Sopenharmony_ci{
57c29fa5a6Sopenharmony_ci    if (instance_ == nullptr) {
58c29fa5a6Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
59c29fa5a6Sopenharmony_ci        if (instance_ == nullptr) {
60c29fa5a6Sopenharmony_ci            instance_ = std::make_shared<SettingDataShare>();
61c29fa5a6Sopenharmony_ci        }
62c29fa5a6Sopenharmony_ci    }
63c29fa5a6Sopenharmony_ci    return *instance_;
64c29fa5a6Sopenharmony_ci}
65c29fa5a6Sopenharmony_ci
66c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetIntValue(const std::string& key, int32_t& value, const std::string &strUri)
67c29fa5a6Sopenharmony_ci{
68c29fa5a6Sopenharmony_ci    int64_t valueLong;
69c29fa5a6Sopenharmony_ci    ErrCode ret = GetLongValue(key, valueLong, strUri);
70c29fa5a6Sopenharmony_ci    if (ret != ERR_OK) {
71c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get int value fail");
72c29fa5a6Sopenharmony_ci        return ret;
73c29fa5a6Sopenharmony_ci    }
74c29fa5a6Sopenharmony_ci    value = static_cast<int32_t>(valueLong);
75c29fa5a6Sopenharmony_ci    return ERR_OK;
76c29fa5a6Sopenharmony_ci}
77c29fa5a6Sopenharmony_ci
78c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetLongValue(const std::string& key, int64_t& value, const std::string &strUri)
79c29fa5a6Sopenharmony_ci{
80c29fa5a6Sopenharmony_ci    std::string valueStr;
81c29fa5a6Sopenharmony_ci    ErrCode ret = GetStringValue(key, valueStr, strUri);
82c29fa5a6Sopenharmony_ci    if (ret == ERR_NAME_NOT_FOUND) {
83c29fa5a6Sopenharmony_ci        MMI_HILOGW("Not found this property");
84c29fa5a6Sopenharmony_ci        return ERR_OK;
85c29fa5a6Sopenharmony_ci    }
86c29fa5a6Sopenharmony_ci    if (ret != ERR_OK) {
87c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get long value fail, ret:%{public}d", ret);
88c29fa5a6Sopenharmony_ci        return ret;
89c29fa5a6Sopenharmony_ci    }
90c29fa5a6Sopenharmony_ci    value = static_cast<int64_t>(strtoll(valueStr.c_str(), nullptr, DECIMAL_BASE));
91c29fa5a6Sopenharmony_ci    return ERR_OK;
92c29fa5a6Sopenharmony_ci}
93c29fa5a6Sopenharmony_ci
94c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetBoolValue(const std::string& key, bool& value, const std::string &strUri)
95c29fa5a6Sopenharmony_ci{
96c29fa5a6Sopenharmony_ci    std::string valueStr;
97c29fa5a6Sopenharmony_ci    ErrCode ret = GetStringValue(key, valueStr, strUri);
98c29fa5a6Sopenharmony_ci    if (ret == ERR_NAME_NOT_FOUND) {
99c29fa5a6Sopenharmony_ci        MMI_HILOGW("Not found this property");
100c29fa5a6Sopenharmony_ci        return ERR_OK;
101c29fa5a6Sopenharmony_ci    }
102c29fa5a6Sopenharmony_ci    if (ret != ERR_OK) {
103c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get bool value fail, ret:%{public}d", ret);
104c29fa5a6Sopenharmony_ci        return ret;
105c29fa5a6Sopenharmony_ci    }
106c29fa5a6Sopenharmony_ci    value = ((valueStr == "true") || (valueStr == "1"));
107c29fa5a6Sopenharmony_ci    return ERR_OK;
108c29fa5a6Sopenharmony_ci}
109c29fa5a6Sopenharmony_ci
110c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutIntValue(
111c29fa5a6Sopenharmony_ci    const std::string& key, int32_t value, bool needNotify, const std::string &strUri)
112c29fa5a6Sopenharmony_ci{
113c29fa5a6Sopenharmony_ci    return PutStringValue(key, std::to_string(value), needNotify, strUri);
114c29fa5a6Sopenharmony_ci}
115c29fa5a6Sopenharmony_ci
116c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutLongValue(
117c29fa5a6Sopenharmony_ci    const std::string& key, int64_t value, bool needNotify, const std::string &strUri)
118c29fa5a6Sopenharmony_ci{
119c29fa5a6Sopenharmony_ci    return PutStringValue(key, std::to_string(value), needNotify, strUri);
120c29fa5a6Sopenharmony_ci}
121c29fa5a6Sopenharmony_ci
122c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutBoolValue(
123c29fa5a6Sopenharmony_ci    const std::string& key, bool value, bool needNotify, const std::string &strUri)
124c29fa5a6Sopenharmony_ci{
125c29fa5a6Sopenharmony_ci    std::string valueStr = value ? "true" : "false";
126c29fa5a6Sopenharmony_ci    return PutStringValue(key, valueStr, needNotify, strUri);
127c29fa5a6Sopenharmony_ci}
128c29fa5a6Sopenharmony_ci
129c29fa5a6Sopenharmony_cibool SettingDataShare::IsValidKey(const std::string& key, const std::string &strUri)
130c29fa5a6Sopenharmony_ci{
131c29fa5a6Sopenharmony_ci    std::string value;
132c29fa5a6Sopenharmony_ci    ErrCode ret = GetStringValue(key, value, strUri);
133c29fa5a6Sopenharmony_ci    return (ret != ERR_NAME_NOT_FOUND) && (!value.empty());
134c29fa5a6Sopenharmony_ci}
135c29fa5a6Sopenharmony_ci
136c29fa5a6Sopenharmony_cisptr<SettingObserver> SettingDataShare::CreateObserver(const std::string& key, SettingObserver::UpdateFunc& func)
137c29fa5a6Sopenharmony_ci{
138c29fa5a6Sopenharmony_ci    sptr<SettingObserver> observer = new (std::nothrow) SettingObserver();
139c29fa5a6Sopenharmony_ci    CHKPP(observer);
140c29fa5a6Sopenharmony_ci    observer->SetKey(key);
141c29fa5a6Sopenharmony_ci    observer->SetUpdateFunc(func);
142c29fa5a6Sopenharmony_ci    return observer;
143c29fa5a6Sopenharmony_ci}
144c29fa5a6Sopenharmony_ci
145c29fa5a6Sopenharmony_civoid SettingDataShare::ExecRegisterCb(const sptr<SettingObserver>& observer)
146c29fa5a6Sopenharmony_ci{
147c29fa5a6Sopenharmony_ci    CHKPV(observer);
148c29fa5a6Sopenharmony_ci    observer->OnChange();
149c29fa5a6Sopenharmony_ci}
150c29fa5a6Sopenharmony_ci
151c29fa5a6Sopenharmony_ciErrCode SettingDataShare::RegisterObserver(const sptr<SettingObserver>& observer, const std::string &strUri)
152c29fa5a6Sopenharmony_ci{
153c29fa5a6Sopenharmony_ci    if (!isDataShareReady_) {
154c29fa5a6Sopenharmony_ci        MMI_HILOGI("Data share not ready!");
155c29fa5a6Sopenharmony_ci        return RET_ERR;
156c29fa5a6Sopenharmony_ci    }
157c29fa5a6Sopenharmony_ci    CHKPR(observer, RET_ERR);
158c29fa5a6Sopenharmony_ci    std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
159c29fa5a6Sopenharmony_ci    auto uri = AssembleUri(observer->GetKey(), strUri);
160c29fa5a6Sopenharmony_ci    auto helper = CreateDataShareHelper(strUri);
161c29fa5a6Sopenharmony_ci    if (helper == nullptr) {
162c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
163c29fa5a6Sopenharmony_ci        return ERR_NO_INIT;
164c29fa5a6Sopenharmony_ci    }
165c29fa5a6Sopenharmony_ci    helper->RegisterObserver(uri, observer);
166c29fa5a6Sopenharmony_ci    helper->NotifyChange(uri);
167c29fa5a6Sopenharmony_ci    std::thread execCb([this, observer] { this->ExecRegisterCb(observer); });
168c29fa5a6Sopenharmony_ci    execCb.detach();
169c29fa5a6Sopenharmony_ci    ReleaseDataShareHelper(helper);
170c29fa5a6Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(callingIdentity);
171c29fa5a6Sopenharmony_ci    return ERR_OK;
172c29fa5a6Sopenharmony_ci}
173c29fa5a6Sopenharmony_ci
174c29fa5a6Sopenharmony_ciErrCode SettingDataShare::UnregisterObserver(const sptr<SettingObserver>& observer, const std::string &strUri)
175c29fa5a6Sopenharmony_ci{
176c29fa5a6Sopenharmony_ci    if (!isDataShareReady_) {
177c29fa5a6Sopenharmony_ci        MMI_HILOGI("Data share not ready!");
178c29fa5a6Sopenharmony_ci        return RET_ERR;
179c29fa5a6Sopenharmony_ci    }
180c29fa5a6Sopenharmony_ci    CHKPR(observer, RET_ERR);
181c29fa5a6Sopenharmony_ci    std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
182c29fa5a6Sopenharmony_ci    auto uri = AssembleUri(observer->GetKey(), strUri);
183c29fa5a6Sopenharmony_ci    auto helper = CreateDataShareHelper(strUri);
184c29fa5a6Sopenharmony_ci    if (helper == nullptr) {
185c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
186c29fa5a6Sopenharmony_ci        return ERR_NO_INIT;
187c29fa5a6Sopenharmony_ci    }
188c29fa5a6Sopenharmony_ci    helper->UnregisterObserver(uri, observer);
189c29fa5a6Sopenharmony_ci    ReleaseDataShareHelper(helper);
190c29fa5a6Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(callingIdentity);
191c29fa5a6Sopenharmony_ci    return ERR_OK;
192c29fa5a6Sopenharmony_ci}
193c29fa5a6Sopenharmony_ci
194c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetStringValue(const std::string& key, std::string& value, const std::string &strUri)
195c29fa5a6Sopenharmony_ci{
196c29fa5a6Sopenharmony_ci    if (!isDataShareReady_) {
197c29fa5a6Sopenharmony_ci        MMI_HILOGI("Data share not ready!");
198c29fa5a6Sopenharmony_ci        return RET_ERR;
199c29fa5a6Sopenharmony_ci    }
200c29fa5a6Sopenharmony_ci    std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
201c29fa5a6Sopenharmony_ci    auto helper = CreateDataShareHelper(strUri);
202c29fa5a6Sopenharmony_ci    if (helper == nullptr) {
203c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
204c29fa5a6Sopenharmony_ci        return ERR_NO_INIT;
205c29fa5a6Sopenharmony_ci    }
206c29fa5a6Sopenharmony_ci    std::vector<std::string> columns = {SETTING_COLUMN_VALUE};
207c29fa5a6Sopenharmony_ci    DataShare::DataSharePredicates predicates;
208c29fa5a6Sopenharmony_ci    predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
209c29fa5a6Sopenharmony_ci    Uri uri(AssembleUri(key, strUri));
210c29fa5a6Sopenharmony_ci    auto resultSet = helper->Query(uri, predicates, columns);
211c29fa5a6Sopenharmony_ci    ReleaseDataShareHelper(helper);
212c29fa5a6Sopenharmony_ci    if (resultSet == nullptr) {
213c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
214c29fa5a6Sopenharmony_ci        return ERR_INVALID_OPERATION;
215c29fa5a6Sopenharmony_ci    }
216c29fa5a6Sopenharmony_ci    int32_t count = 0;
217c29fa5a6Sopenharmony_ci    resultSet->GetRowCount(count);
218c29fa5a6Sopenharmony_ci    if (count == 0) {
219c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
220c29fa5a6Sopenharmony_ci        return ERR_NAME_NOT_FOUND;
221c29fa5a6Sopenharmony_ci    }
222c29fa5a6Sopenharmony_ci    const int32_t tmpRow = 0;
223c29fa5a6Sopenharmony_ci    resultSet->GoToRow(tmpRow);
224c29fa5a6Sopenharmony_ci    int32_t ret = resultSet->GetString(tmpRow, value);
225c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
226c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
227c29fa5a6Sopenharmony_ci        return ERR_INVALID_VALUE;
228c29fa5a6Sopenharmony_ci    }
229c29fa5a6Sopenharmony_ci    resultSet->Close();
230c29fa5a6Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(callingIdentity);
231c29fa5a6Sopenharmony_ci    return ERR_OK;
232c29fa5a6Sopenharmony_ci}
233c29fa5a6Sopenharmony_ci
234c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutStringValue(
235c29fa5a6Sopenharmony_ci    const std::string& key, const std::string& value, bool needNotify, const std::string &strUri)
236c29fa5a6Sopenharmony_ci{
237c29fa5a6Sopenharmony_ci    if (!isDataShareReady_) {
238c29fa5a6Sopenharmony_ci        MMI_HILOGI("Data share not ready!");
239c29fa5a6Sopenharmony_ci        return RET_ERR;
240c29fa5a6Sopenharmony_ci    }
241c29fa5a6Sopenharmony_ci    std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
242c29fa5a6Sopenharmony_ci    auto helper = CreateDataShareHelper(strUri);
243c29fa5a6Sopenharmony_ci    if (helper == nullptr) {
244c29fa5a6Sopenharmony_ci        IPCSkeleton::SetCallingIdentity(callingIdentity);
245c29fa5a6Sopenharmony_ci        return ERR_NO_INIT;
246c29fa5a6Sopenharmony_ci    }
247c29fa5a6Sopenharmony_ci    DataShare::DataShareValueObject keyObj(key);
248c29fa5a6Sopenharmony_ci    DataShare::DataShareValueObject valueObj(value);
249c29fa5a6Sopenharmony_ci    DataShare::DataShareValuesBucket bucket;
250c29fa5a6Sopenharmony_ci    bucket.Put(SETTING_COLUMN_KEYWORD, keyObj);
251c29fa5a6Sopenharmony_ci    bucket.Put(SETTING_COLUMN_VALUE, valueObj);
252c29fa5a6Sopenharmony_ci    DataShare::DataSharePredicates predicates;
253c29fa5a6Sopenharmony_ci    predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
254c29fa5a6Sopenharmony_ci    Uri uri(AssembleUri(key, strUri));
255c29fa5a6Sopenharmony_ci    if (helper->Update(uri, predicates, bucket) <= 0) {
256c29fa5a6Sopenharmony_ci        helper->Insert(uri, bucket);
257c29fa5a6Sopenharmony_ci    }
258c29fa5a6Sopenharmony_ci    if (needNotify) {
259c29fa5a6Sopenharmony_ci        helper->NotifyChange(AssembleUri(key, strUri));
260c29fa5a6Sopenharmony_ci    }
261c29fa5a6Sopenharmony_ci    ReleaseDataShareHelper(helper);
262c29fa5a6Sopenharmony_ci    IPCSkeleton::SetCallingIdentity(callingIdentity);
263c29fa5a6Sopenharmony_ci    return ERR_OK;
264c29fa5a6Sopenharmony_ci}
265c29fa5a6Sopenharmony_ci
266c29fa5a6Sopenharmony_cistd::shared_ptr<DataShare::DataShareHelper> SettingDataShare::CreateDataShareHelper(const std::string &strUri)
267c29fa5a6Sopenharmony_ci{
268c29fa5a6Sopenharmony_ci    if (remoteObj_ == nullptr) {
269c29fa5a6Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
270c29fa5a6Sopenharmony_ci        if (remoteObj_ == nullptr) {
271c29fa5a6Sopenharmony_ci            auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
272c29fa5a6Sopenharmony_ci            CHKPP(sam);
273c29fa5a6Sopenharmony_ci            remoteObj_ = sam->CheckSystemAbility(MULTIMODAL_INPUT_SERVICE_ID);
274c29fa5a6Sopenharmony_ci        }
275c29fa5a6Sopenharmony_ci    }
276c29fa5a6Sopenharmony_ci    std::pair<int, std::shared_ptr<DataShare::DataShareHelper>> ret;
277c29fa5a6Sopenharmony_ci    if (strUri.empty()) {
278c29fa5a6Sopenharmony_ci        ret = DataShare::DataShareHelper::Create(remoteObj_, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI.c_str());
279c29fa5a6Sopenharmony_ci    } else {
280c29fa5a6Sopenharmony_ci        ret = DataShare::DataShareHelper::Create(remoteObj_, strUri, "");
281c29fa5a6Sopenharmony_ci    }
282c29fa5a6Sopenharmony_ci    return ret.second;
283c29fa5a6Sopenharmony_ci}
284c29fa5a6Sopenharmony_ci
285c29fa5a6Sopenharmony_cibool SettingDataShare::ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper>& helper)
286c29fa5a6Sopenharmony_ci{
287c29fa5a6Sopenharmony_ci    if (!helper->Release()) {
288c29fa5a6Sopenharmony_ci        return false;
289c29fa5a6Sopenharmony_ci    }
290c29fa5a6Sopenharmony_ci    return true;
291c29fa5a6Sopenharmony_ci}
292c29fa5a6Sopenharmony_ci
293c29fa5a6Sopenharmony_ciUri SettingDataShare::AssembleUri(const std::string& key, const std::string &strUri)
294c29fa5a6Sopenharmony_ci{
295c29fa5a6Sopenharmony_ci    if (strUri.empty()) {
296c29fa5a6Sopenharmony_ci        if (key == "close_fingerprint_nav_event_key" || key == "close_fingerprint_event_key") {
297c29fa5a6Sopenharmony_ci            return Uri(SETTING_URI_USER_PROXY + "&key=" + key);
298c29fa5a6Sopenharmony_ci        }
299c29fa5a6Sopenharmony_ci        return Uri(SETTING_URI_PROXY + "&key=" + key);
300c29fa5a6Sopenharmony_ci    } else {
301c29fa5a6Sopenharmony_ci        return Uri(strUri + "&key=" + key);
302c29fa5a6Sopenharmony_ci    }
303c29fa5a6Sopenharmony_ci}
304c29fa5a6Sopenharmony_ci
305c29fa5a6Sopenharmony_cibool SettingDataShare::CheckIfSettingsDataReady()
306c29fa5a6Sopenharmony_ci{
307c29fa5a6Sopenharmony_ci    if (isDataShareReady_) {
308c29fa5a6Sopenharmony_ci        return true;
309c29fa5a6Sopenharmony_ci    }
310c29fa5a6Sopenharmony_ci    if (remoteObj_ == nullptr) {
311c29fa5a6Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
312c29fa5a6Sopenharmony_ci        if (remoteObj_ == nullptr) {
313c29fa5a6Sopenharmony_ci            auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
314c29fa5a6Sopenharmony_ci            CHKPF(sam);
315c29fa5a6Sopenharmony_ci            remoteObj_ = sam->CheckSystemAbility(MULTIMODAL_INPUT_SERVICE_ID);
316c29fa5a6Sopenharmony_ci        }
317c29fa5a6Sopenharmony_ci    }
318c29fa5a6Sopenharmony_ci    CHKPF(remoteObj_);
319c29fa5a6Sopenharmony_ci    std::pair<int, std::shared_ptr<DataShare::DataShareHelper>> ret =
320c29fa5a6Sopenharmony_ci            DataShare::DataShareHelper::Create(remoteObj_, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI);
321c29fa5a6Sopenharmony_ci    MMI_HILOGD("Create data_share helper, ret=%{public}d", ret.first);
322c29fa5a6Sopenharmony_ci    if (ret.first == E_OK) {
323c29fa5a6Sopenharmony_ci        MMI_HILOGD("Create data_share helper success");
324c29fa5a6Sopenharmony_ci        auto helper = ret.second;
325c29fa5a6Sopenharmony_ci        if (helper != nullptr) {
326c29fa5a6Sopenharmony_ci            bool releaseRet = helper->Release();
327c29fa5a6Sopenharmony_ci            MMI_HILOGD("Release data_share helper, releaseRet=%{public}d", releaseRet);
328c29fa5a6Sopenharmony_ci        }
329c29fa5a6Sopenharmony_ci        isDataShareReady_ = true;
330c29fa5a6Sopenharmony_ci        return true;
331c29fa5a6Sopenharmony_ci    } else if (ret.first == E_DATA_SHARE_NOT_READY) {
332c29fa5a6Sopenharmony_ci        MMI_HILOGE("Create data_share helper failed");
333c29fa5a6Sopenharmony_ci        isDataShareReady_ = false;
334c29fa5a6Sopenharmony_ci        return false;
335c29fa5a6Sopenharmony_ci    }
336c29fa5a6Sopenharmony_ci    MMI_HILOGE("data_share unknown");
337c29fa5a6Sopenharmony_ci    return true;
338c29fa5a6Sopenharmony_ci}
339c29fa5a6Sopenharmony_ci}
340c29fa5a6Sopenharmony_ci} // namespace OHOS