1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "setting_provider.h"
17 #include <thread>
18 #include "datashare_predicates.h"
19 #include "datashare_result_set.h"
20 #include "datashare_values_bucket.h"
21 #include "ipc_skeleton.h"
22 #include "iservice_registry.h"
23 #include "window_manager_hilog.h"
24 #include "rdb_errno.h"
25 #include "result_set.h"
26 #include "uri.h"
27 #include "screen_session_manager/include/screen_session_manager.h"
28
29 namespace OHOS {
30 namespace Rosen {
31 sptr<SettingProvider> SettingProvider::instance_ = nullptr;
32 std::mutex SettingProvider::instanceMutex_;
33 sptr<IRemoteObject> SettingProvider::remoteObj_ = nullptr;
34 namespace {
35 const std::string SETTING_COLUMN_KEYWORD = "KEYWORD";
36 const std::string SETTING_COLUMN_VALUE = "VALUE";
37 const std::string SETTING_URI_PROXY = "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
38 const std::string WALL_KEY = "wallpaperAodDisplay";
39 const std::string DURING_CALL_KEY = "during_call_state";
40 const std::string SETTING_MULTI_USER_URI = "datashare:///com.ohos.settingsdata/entry/settingsdata/";
41 const std::string SETTING_MULTI_USER_TABLE = "USER_SETTINGSDATA_";
42 const std::string SETTING_SECURE_MULTI_USER_TABLE = "USER_SETTINGSDATA_SECURE_";
43 const std::string SETTING_MULTI_USER_PROXY = "?Proxy=true";
44 constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
45 constexpr int32_t PARAM_NUM_TEN = 10;
46 } // namespace
47
GetInstance(int32_t systemAbilityId)48 SettingProvider& SettingProvider::GetInstance(int32_t systemAbilityId)
49 {
50 if (instance_ == nullptr) {
51 std::lock_guard<std::mutex> lock(instanceMutex_);
52 if (instance_ == nullptr) {
53 instance_ = sptr<SettingProvider>::MakeSptr();
54 Initialize(systemAbilityId);
55 }
56 }
57 return *instance_;
58 }
59
GetIntValue(const std::string & key,int32_t & value)60 ErrCode SettingProvider::GetIntValue(const std::string& key, int32_t& value)
61 {
62 int64_t valueLong;
63 ErrCode ret = GetLongValue(key, valueLong);
64 if (ret != ERR_OK) {
65 return ret;
66 }
67 value = static_cast<int32_t>(valueLong);
68 return ERR_OK;
69 }
70
GetLongValue(const std::string & key,int64_t & value)71 ErrCode SettingProvider::GetLongValue(const std::string& key, int64_t& value)
72 {
73 std::string valueStr;
74 ErrCode ret = GetStringValue(key, valueStr);
75 if (ret != ERR_OK) {
76 return ret;
77 }
78 value = static_cast<int64_t>(strtoll(valueStr.c_str(), nullptr, PARAM_NUM_TEN));
79 return ERR_OK;
80 }
81
GetBoolValue(const std::string & key,bool & value)82 ErrCode SettingProvider::GetBoolValue(const std::string& key, bool& value)
83 {
84 std::string valueStr;
85 ErrCode ret = GetStringValue(key, valueStr);
86 if (ret != ERR_OK) {
87 return ret;
88 }
89 value = (valueStr == "true");
90 return ERR_OK;
91 }
92
PutIntValue(const std::string & key,int32_t value,bool needNotify)93 ErrCode SettingProvider::PutIntValue(const std::string& key, int32_t value, bool needNotify)
94 {
95 return PutStringValue(key, std::to_string(value), needNotify);
96 }
97
PutLongValue(const std::string & key,int64_t value,bool needNotify)98 ErrCode SettingProvider::PutLongValue(const std::string& key, int64_t value, bool needNotify)
99 {
100 return PutStringValue(key, std::to_string(value), needNotify);
101 }
102
PutBoolValue(const std::string & key,bool value,bool needNotify)103 ErrCode SettingProvider::PutBoolValue(const std::string& key, bool value, bool needNotify)
104 {
105 std::string valueStr = value ? "true" : "false";
106 return PutStringValue(key, valueStr, needNotify);
107 }
108
IsValidKey(const std::string & key)109 bool SettingProvider::IsValidKey(const std::string& key)
110 {
111 std::string value;
112 ErrCode ret = GetStringValue(key, value);
113 return (ret != ERR_NAME_NOT_FOUND) && (!value.empty());
114 }
115
CreateObserver(const std::string & key,SettingObserver::UpdateFunc & func)116 sptr<SettingObserver> SettingProvider::CreateObserver(const std::string& key, SettingObserver::UpdateFunc& func)
117 {
118 sptr<SettingObserver> observer = new SettingObserver();
119 observer->SetKey(key);
120 observer->SetUpdateFunc(func);
121 return observer;
122 }
123
ExecRegisterCb(const sptr<SettingObserver> & observer)124 void SettingProvider::ExecRegisterCb(const sptr<SettingObserver>& observer)
125 {
126 if (observer == nullptr) {
127 TLOGE(WmsLogTag::DMS, "observer is nullptr");
128 return;
129 }
130 observer->OnChange();
131 }
132
RegisterObserver(const sptr<SettingObserver> & observer)133 ErrCode SettingProvider::RegisterObserver(const sptr<SettingObserver>& observer)
134 {
135 if (observer == nullptr) {
136 return ERR_NO_INIT;
137 }
138 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
139 Uri uri = (observer->GetKey() == DURING_CALL_KEY) ?
140 AssembleUriMultiUser(observer->GetKey()) : AssembleUri(observer->GetKey());
141 auto helper = CreateDataShareHelper();
142 if (helper == nullptr) {
143 IPCSkeleton::SetCallingIdentity(callingIdentity);
144 return ERR_NO_INIT;
145 }
146 helper->RegisterObserver(uri, observer);
147 helper->NotifyChange(uri);
148 std::thread execCb(SettingProvider::ExecRegisterCb, observer);
149 execCb.detach();
150 ReleaseDataShareHelper(helper);
151 IPCSkeleton::SetCallingIdentity(callingIdentity);
152 TLOGD(WmsLogTag::DMS, "succeed to register observer of uri=%{public}s", uri.ToString().c_str());
153 return ERR_OK;
154 }
155
UnregisterObserver(const sptr<SettingObserver> & observer)156 ErrCode SettingProvider::UnregisterObserver(const sptr<SettingObserver>& observer)
157 {
158 if (observer == nullptr) {
159 return ERR_NO_INIT;
160 }
161 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
162 auto uri = AssembleUri(observer->GetKey());
163 auto helper = CreateDataShareHelper();
164 if (helper == nullptr) {
165 IPCSkeleton::SetCallingIdentity(callingIdentity);
166 return ERR_NO_INIT;
167 }
168 helper->UnregisterObserver(uri, observer);
169 ReleaseDataShareHelper(helper);
170 IPCSkeleton::SetCallingIdentity(callingIdentity);
171 TLOGD(WmsLogTag::DMS, "succeed to unregister observer of uri=%{public}s", uri.ToString().c_str());
172 return ERR_OK;
173 }
174
Initialize(int32_t systemAbilityId)175 void SettingProvider::Initialize(int32_t systemAbilityId)
176 {
177 auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
178 if (sam == nullptr) {
179 TLOGE(WmsLogTag::DMS, "GetSystemAbilityManager return nullptr");
180 return;
181 }
182 auto remoteObj = sam->GetSystemAbility(systemAbilityId);
183 if (remoteObj == nullptr) {
184 TLOGE(WmsLogTag::DMS, "GetSystemAbility return nullptr, systemAbilityId=%{public}d", systemAbilityId);
185 return;
186 }
187 remoteObj_ = remoteObj;
188 }
189
GetStringValue(const std::string & key,std::string & value)190 ErrCode SettingProvider::GetStringValue(const std::string& key, std::string& value)
191 {
192 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
193 auto helper = CreateDataShareHelper();
194 if (helper == nullptr) {
195 IPCSkeleton::SetCallingIdentity(callingIdentity);
196 return ERR_NO_INIT;
197 }
198 std::vector<std::string> columns = {SETTING_COLUMN_VALUE};
199 DataShare::DataSharePredicates predicates;
200 predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
201 Uri uri = (key == WALL_KEY || key == DURING_CALL_KEY) ? AssembleUriMultiUser(key) : AssembleUri(key);
202 auto resultSet = helper->Query(uri, predicates, columns);
203 ReleaseDataShareHelper(helper);
204 if (resultSet == nullptr) {
205 TLOGE(WmsLogTag::DMS, "helper->Query return nullptr");
206 IPCSkeleton::SetCallingIdentity(callingIdentity);
207 return ERR_INVALID_OPERATION;
208 }
209 int32_t count;
210 resultSet->GetRowCount(count);
211 if (count == 0) {
212 TLOGW(WmsLogTag::DMS, "not found value, key=%{public}s, count=%{public}d", key.c_str(), count);
213 IPCSkeleton::SetCallingIdentity(callingIdentity);
214 resultSet->Close();
215 return ERR_NAME_NOT_FOUND;
216 }
217 const int32_t INDEX = 0;
218 resultSet->GoToRow(INDEX);
219 int32_t ret = resultSet->GetString(INDEX, value);
220 if (ret != NativeRdb::E_OK) {
221 TLOGW(WmsLogTag::DMS, "resultSet->GetString return not ok, ret=%{public}d", ret);
222 IPCSkeleton::SetCallingIdentity(callingIdentity);
223 resultSet->Close();
224 return ERR_INVALID_VALUE;
225 }
226 resultSet->Close();
227 IPCSkeleton::SetCallingIdentity(callingIdentity);
228 return ERR_OK;
229 }
230
GetStringValueMultiUser(const std::string & key,std::string & value)231 ErrCode SettingProvider::GetStringValueMultiUser(const std::string& key, std::string& value)
232 {
233 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
234 auto helper = CreateDataShareHelperMultiUser();
235 if (helper == nullptr) {
236 IPCSkeleton::SetCallingIdentity(callingIdentity);
237 return ERR_NO_INIT;
238 }
239 std::vector<std::string> columns = {SETTING_COLUMN_VALUE};
240 DataShare::DataSharePredicates predicates;
241 predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
242 Uri uri(AssembleUriMultiUser(key));
243 auto resultSet = helper->Query(uri, predicates, columns);
244 ReleaseDataShareHelper(helper);
245 if (resultSet == nullptr) {
246 TLOGE(WmsLogTag::DMS, "helper->Query return nullptr");
247 IPCSkeleton::SetCallingIdentity(callingIdentity);
248 return ERR_INVALID_OPERATION;
249 }
250 int32_t count;
251 resultSet->GetRowCount(count);
252 if (count == 0) {
253 TLOGW(WmsLogTag::DMS, "not found value, key=%{public}s, count=%{public}d", key.c_str(), count);
254 IPCSkeleton::SetCallingIdentity(callingIdentity);
255 resultSet->Close();
256 return ERR_NAME_NOT_FOUND;
257 }
258 const int32_t INDEX = 0;
259 resultSet->GoToRow(INDEX);
260 int32_t ret = resultSet->GetString(INDEX, value);
261 if (ret != NativeRdb::E_OK) {
262 TLOGW(WmsLogTag::DMS, "resultSet->GetString return not ok, ret=%{public}d", ret);
263 IPCSkeleton::SetCallingIdentity(callingIdentity);
264 resultSet->Close();
265 return ERR_INVALID_VALUE;
266 }
267 resultSet->Close();
268 IPCSkeleton::SetCallingIdentity(callingIdentity);
269 return ERR_OK;
270 }
271
PutStringValue(const std::string & key,const std::string & value,bool needNotify)272 ErrCode SettingProvider::PutStringValue(const std::string& key, const std::string& value, bool needNotify)
273 {
274 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
275 auto helper = CreateDataShareHelper();
276 if (helper == nullptr) {
277 IPCSkeleton::SetCallingIdentity(callingIdentity);
278 return ERR_NO_INIT;
279 }
280 DataShare::DataShareValueObject keyObj(key);
281 DataShare::DataShareValueObject valueObj(value);
282 DataShare::DataShareValuesBucket bucket;
283 bucket.Put(SETTING_COLUMN_KEYWORD, keyObj);
284 bucket.Put(SETTING_COLUMN_VALUE, valueObj);
285 DataShare::DataSharePredicates predicates;
286 predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
287 Uri uri = (key == DURING_CALL_KEY) ? AssembleUriMultiUser(key) : AssembleUri(key);
288 if (helper->Update(uri, predicates, bucket) <= 0) {
289 TLOGD(WmsLogTag::DMS, "no data exist, insert one row");
290 helper->Insert(uri, bucket);
291 }
292 if (needNotify) {
293 helper->NotifyChange(AssembleUri(key));
294 }
295 ReleaseDataShareHelper(helper);
296 IPCSkeleton::SetCallingIdentity(callingIdentity);
297 return ERR_OK;
298 }
299
CreateDataShareHelper()300 std::shared_ptr<DataShare::DataShareHelper> SettingProvider::CreateDataShareHelper()
301 {
302 auto helper = DataShare::DataShareHelper::Creator(remoteObj_, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI);
303 if (helper == nullptr) {
304 TLOGW(WmsLogTag::DMS, "helper is nullptr, uri=%{public}s", SETTING_URI_PROXY.c_str());
305 return nullptr;
306 }
307 return helper;
308 }
309
CreateDataShareHelperMultiUser()310 std::shared_ptr<DataShare::DataShareHelper> SettingProvider::CreateDataShareHelperMultiUser()
311 {
312 std::string uriString = "";
313 int32_t userId = ScreenSessionManager::GetInstance().GetCurrentUserId();
314 if (userId > 0) {
315 TLOGI(WmsLogTag::DMS, "current userId: %{public}d", userId);
316 std::string userIdString = std::to_string(userId);
317 uriString = SETTING_MULTI_USER_URI + SETTING_MULTI_USER_TABLE + userIdString +
318 SETTING_MULTI_USER_PROXY;
319 } else {
320 TLOGE(WmsLogTag::DMS, "invalid userId: %{public}d, use default uri", userId);
321 uriString = SETTING_URI_PROXY;
322 }
323 auto helper = DataShare::DataShareHelper::Creator(remoteObj_, uriString, SETTINGS_DATA_EXT_URI);
324 if (helper == nullptr) {
325 TLOGW(WmsLogTag::DMS, "helper is nullptr, uri=%{public}s", uriString.c_str());
326 return nullptr;
327 }
328 return helper;
329 }
330
ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper> & helper)331 bool SettingProvider::ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper>& helper)
332 {
333 if (!helper->Release()) {
334 TLOGW(WmsLogTag::DMS, "release helper fail");
335 return false;
336 }
337 return true;
338 }
339
AssembleUri(const std::string & key)340 Uri SettingProvider::AssembleUri(const std::string& key)
341 {
342 Uri uri(SETTING_URI_PROXY + "&key=" + key);
343 return uri;
344 }
345
AssembleUriMultiUser(const std::string & key)346 Uri SettingProvider::AssembleUriMultiUser(const std::string& key)
347 {
348 std::string uriString = "";
349 int32_t userId = ScreenSessionManager::GetInstance().GetCurrentUserId();
350 if (userId > 0) {
351 TLOGI(WmsLogTag::DMS, "current userId: %{public}d", userId);
352 std::string userIdString = std::to_string(userId);
353 uriString = SETTING_MULTI_USER_URI + SETTING_MULTI_USER_TABLE + userIdString +
354 SETTING_MULTI_USER_PROXY + "&key=" + key;
355 if (key == WALL_KEY || key == DURING_CALL_KEY) {
356 uriString = SETTING_MULTI_USER_URI + SETTING_SECURE_MULTI_USER_TABLE +
357 userIdString + SETTING_MULTI_USER_PROXY + "&key=" + key;
358 }
359 } else {
360 TLOGE(WmsLogTag::DMS, "invalid userId: %{public}d, use default uri", userId);
361 uriString = SETTING_URI_PROXY + "&key=" + key;
362 }
363 Uri uri(uriString);
364 return uri;
365 }
366
RegisterObserverByTable(const sptr<SettingObserver> & observer,std::string tableName)367 ErrCode SettingProvider::RegisterObserverByTable(const sptr<SettingObserver>& observer, std::string tableName)
368 {
369 if (observer == nullptr) {
370 return ERR_NO_INIT;
371 }
372 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
373 auto uri = AssembleUriMultiUserByTable(observer->GetKey(), tableName);
374 auto helper = CreateDataShareHelperMultiUserByTable(tableName);
375 if (helper == nullptr) {
376 IPCSkeleton::SetCallingIdentity(callingIdentity);
377 return ERR_NO_INIT;
378 }
379 helper->RegisterObserver(uri, observer);
380 helper->NotifyChange(uri);
381 std::thread execCb(SettingProvider::ExecRegisterCb, observer);
382 execCb.detach();
383 ReleaseDataShareHelper(helper);
384 IPCSkeleton::SetCallingIdentity(callingIdentity);
385 TLOGD(WmsLogTag::DMS, "succeed to register observer of uri=%{public}s", uri.ToString().c_str());
386 return ERR_OK;
387 }
388
UnregisterObserverByTable(const sptr<SettingObserver> & observer,std::string tableName)389 ErrCode SettingProvider::UnregisterObserverByTable(const sptr<SettingObserver>& observer, std::string tableName)
390 {
391 if (observer == nullptr) {
392 return ERR_NO_INIT;
393 }
394 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
395 auto uri = AssembleUriMultiUserByTable(observer->GetKey(), tableName);
396 auto helper = CreateDataShareHelperMultiUserByTable(tableName);
397 if (helper == nullptr) {
398 IPCSkeleton::SetCallingIdentity(callingIdentity);
399 return ERR_NO_INIT;
400 }
401 helper->UnregisterObserver(uri, observer);
402 ReleaseDataShareHelper(helper);
403 IPCSkeleton::SetCallingIdentity(callingIdentity);
404 TLOGD(WmsLogTag::DMS, "succeed to unregister observer of uri=%{public}s", uri.ToString().c_str());
405 return ERR_OK;
406 }
407
GetIntValueMultiUserByTable(const std::string & key,int32_t & value,std::string tableName)408 ErrCode SettingProvider::GetIntValueMultiUserByTable(const std::string& key, int32_t& value, std::string tableName)
409 {
410 int64_t result = 0;
411 ErrCode ret = GetLongValueMultiUserByTable(key, result, tableName);
412 if (ret != ERR_OK) {
413 return ret;
414 }
415 value = static_cast<int32_t>(result);
416 return ERR_OK;
417 }
418
GetLongValueMultiUserByTable(const std::string & key,int64_t & value,std::string tableName)419 ErrCode SettingProvider::GetLongValueMultiUserByTable(const std::string& key, int64_t& value, std::string tableName)
420 {
421 std::string result = "";
422 ErrCode ret = GetStringValueMultiUserByTable(key, result, tableName);
423 if (ret != ERR_OK) {
424 return ret;
425 }
426 value = static_cast<int64_t>(strtoll(result.c_str(), nullptr, PARAM_NUM_TEN));
427 return ERR_OK;
428 }
429
GetStringValueMultiUserByTable(const std::string & key,std::string & value,std::string tableName)430 ErrCode SettingProvider::GetStringValueMultiUserByTable(const std::string& key,
431 std::string& value, std::string tableName)
432 {
433 std::string callingIdentity = IPCSkeleton::ResetCallingIdentity();
434 auto helper = CreateDataShareHelperMultiUserByTable(tableName);
435 if (helper == nullptr) {
436 IPCSkeleton::SetCallingIdentity(callingIdentity);
437 return ERR_NO_INIT;
438 }
439 std::vector<std::string> columns = {SETTING_COLUMN_VALUE};
440 DataShare::DataSharePredicates predicates;
441 predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
442 Uri uri(AssembleUriMultiUserByTable(key, tableName));
443 auto resultSet = helper->Query(uri, predicates, columns);
444 ReleaseDataShareHelper(helper);
445 if (resultSet == nullptr) {
446 TLOGE(WmsLogTag::DMS, "helper->Query return nullptr");
447 IPCSkeleton::SetCallingIdentity(callingIdentity);
448 return ERR_INVALID_OPERATION;
449 }
450 int32_t count;
451 resultSet->GetRowCount(count);
452 if (count == 0) {
453 TLOGW(WmsLogTag::DMS, "not found value, key=%{public}s, count=%{public}d", key.c_str(), count);
454 IPCSkeleton::SetCallingIdentity(callingIdentity);
455 resultSet->Close();
456 return ERR_NAME_NOT_FOUND;
457 }
458 const int32_t INDEX = 0;
459 resultSet->GoToRow(INDEX);
460 int32_t ret = resultSet->GetString(INDEX, value);
461 if (ret != NativeRdb::E_OK) {
462 TLOGW(WmsLogTag::DMS, "resultSet->GetString return not ok, ret=%{public}d", ret);
463 IPCSkeleton::SetCallingIdentity(callingIdentity);
464 resultSet->Close();
465 return ERR_INVALID_VALUE;
466 }
467 resultSet->Close();
468 IPCSkeleton::SetCallingIdentity(callingIdentity);
469 return ERR_OK;
470 }
471
CreateDataShareHelperMultiUserByTable(std::string tableName)472 std::shared_ptr<DataShare::DataShareHelper> SettingProvider::CreateDataShareHelperMultiUserByTable(
473 std::string tableName)
474 {
475 std::string address = "";
476 int32_t userId = ScreenSessionManager::GetInstance().GetCurrentUserId();
477 if (userId > 0) {
478 TLOGD(WmsLogTag::DMS, "current userId: %{public}d", userId);
479 std::string userIdString = std::to_string(userId);
480 address = SETTING_MULTI_USER_URI + tableName + userIdString +
481 SETTING_MULTI_USER_PROXY;
482 } else {
483 TLOGE(WmsLogTag::DMS, "invalid userId: %{public}d, use default uri", userId);
484 address = SETTING_URI_PROXY;
485 }
486 auto helper = DataShare::DataShareHelper::Creator(remoteObj_, address, SETTINGS_DATA_EXT_URI);
487 if (helper == nullptr) {
488 TLOGW(WmsLogTag::DMS, "helper is nullptr, uri=%{public}s", address.c_str());
489 return nullptr;
490 }
491 return helper;
492 }
493
AssembleUriMultiUserByTable(const std::string & key,std::string tableName)494 Uri SettingProvider::AssembleUriMultiUserByTable(const std::string& key, std::string tableName)
495 {
496 std::string address = "";
497 int32_t userId = ScreenSessionManager::GetInstance().GetCurrentUserId();
498 if (userId > 0) {
499 TLOGD(WmsLogTag::DMS, "current userId: %{public}d", userId);
500 std::string userIdString = std::to_string(userId);
501 address = SETTING_MULTI_USER_URI + tableName + userIdString +
502 SETTING_MULTI_USER_PROXY + "&key=" + key;
503 } else {
504 TLOGE(WmsLogTag::DMS, "invalid userId: %{public}d, use default uri", userId);
505 address = SETTING_URI_PROXY + "&key=" + key;
506 }
507 Uri uri(address);
508 return uri;
509 }
510 } // namespace Rosen
511 } // namespace OHOS