1 /*
2 * Copyright (C) 2022-2024 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_utils.h"
17
18 #include "rdb_errno.h"
19 #include "telephony_errors.h"
20 #include "telephony_log_wrapper.h"
21
22 namespace OHOS {
23 namespace Telephony {
24 using namespace AppExecFwk;
25
26 const std::string SettingUtils::NETWORK_SEARCH_SETTING_URI =
27 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
28 static const std::string NETWORK_SEARCH_SETTING_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
29 const std::string SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIME_URI =
30 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=auto_time";
31 const std::string SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIMEZONE_URI =
32 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=auto_timezone";
33 const std::string SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI =
34 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=airplane_mode";
35 const std::string SettingUtils::NETWORK_SEARCH_SETTING_PREFERRED_NETWORK_MODE_URI =
36 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=preferred_network_mode";
37
38 const std::string SettingUtils::SETTINGS_NETWORK_SEARCH_AUTO_TIME = "auto_time";
39 const std::string SettingUtils::SETTINGS_NETWORK_SEARCH_AUTO_TIMEZONE = "auto_timezone";
40 const std::string SettingUtils::SETTINGS_NETWORK_SEARCH_AIRPLANE_MODE = "settings.telephony.airplanemode";
41 const std::string SettingUtils::SETTINGS_NETWORK_SEARCH_PREFERRED_NETWORK_MODE =
42 "settings.telephony.preferrednetworkmode";
43
44 SettingUtils::SettingUtils() = default;
45
46 SettingUtils::~SettingUtils() = default;
47
CreateDataShareHelper()48 std::shared_ptr<DataShare::DataShareHelper> SettingUtils::CreateDataShareHelper()
49 {
50 sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
51 if (saManager == nullptr) {
52 TELEPHONY_LOGE("SettingUtils: GetSystemAbilityManager failed.");
53 return nullptr;
54 }
55 sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(TELEPHONY_CORE_SERVICE_SYS_ABILITY_ID);
56 if (remoteObj == nullptr) {
57 TELEPHONY_LOGE("SettingUtils: GetSystemAbility Service Failed.");
58 return nullptr;
59 }
60 return DataShare::DataShareHelper::Creator(remoteObj, NETWORK_SEARCH_SETTING_URI, NETWORK_SEARCH_SETTING_EXT_URI);
61 }
62
UnRegisterSettingsObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)63 bool SettingUtils::UnRegisterSettingsObserver(
64 const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
65 {
66 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
67 if (settingHelper == nullptr) {
68 TELEPHONY_LOGE("settingHelper is null");
69 return false;
70 }
71 settingHelper->UnregisterObserver(uri, dataObserver);
72 settingHelper->Release();
73 TELEPHONY_LOGI("SettingUtils: UnRegisterObserver Success");
74 return true;
75 }
76
RegisterSettingsObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)77 bool SettingUtils::RegisterSettingsObserver(
78 const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
79 {
80 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
81 if (settingHelper == nullptr) {
82 TELEPHONY_LOGE("settingHelper is null");
83 return false;
84 }
85 settingHelper->RegisterObserver(uri, dataObserver);
86 settingHelper->Release();
87 TELEPHONY_LOGI("SettingUtils: RegisterObserver Success");
88 return true;
89 }
90
Query(Uri uri,const std::string & key,std::string & value)91 int32_t SettingUtils::Query(Uri uri, const std::string &key, std::string &value)
92 {
93 TELEPHONY_LOGI("SettingUtils:Query");
94 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
95 if (settingHelper == nullptr) {
96 TELEPHONY_LOGE("settingHelper is null");
97 return TELEPHONY_ERR_LOCAL_PTR_NULL;
98 }
99
100 std::vector<std::string> columns;
101 DataShare::DataSharePredicates predicates;
102 predicates.EqualTo(SETTING_KEY, key);
103 auto result = settingHelper->Query(uri, predicates, columns);
104 if (result == nullptr) {
105 TELEPHONY_LOGE("SettingUtils: query error, result is null");
106 settingHelper->Release();
107 return TELEPHONY_ERR_LOCAL_PTR_NULL;
108 }
109
110 if (result->GoToFirstRow() != DataShare::E_OK) {
111 TELEPHONY_LOGE("SettingUtils: query error, go to first row error");
112 result->Close();
113 settingHelper->Release();
114 return TELEPHONY_ERR_DATABASE_READ_FAIL;
115 }
116
117 int columnIndex = 0;
118 result->GetColumnIndex(SETTING_VALUE, columnIndex);
119 result->GetString(columnIndex, value);
120 result->Close();
121 settingHelper->Release();
122 TELEPHONY_LOGI("SettingUtils: query success");
123 return TELEPHONY_SUCCESS;
124 }
125
Insert(Uri uri,const std::string & key,const std::string & value)126 int32_t SettingUtils::Insert(Uri uri, const std::string &key, const std::string &value)
127 {
128 TELEPHONY_LOGI("SettingUtils: insert start");
129 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
130 if (settingHelper == nullptr) {
131 TELEPHONY_LOGE("settingHelper is null");
132 return TELEPHONY_ERR_LOCAL_PTR_NULL;
133 }
134 DataShare::DataShareValuesBucket valuesBucket;
135 DataShare::DataShareValueObject keyObj(key);
136 DataShare::DataShareValueObject valueObj(value);
137 valuesBucket.Put(SETTING_KEY, keyObj);
138 valuesBucket.Put(SETTING_VALUE, valueObj);
139 int32_t result = settingHelper->Insert(uri, valuesBucket);
140 if (result == RDB_INVALID_VALUE) {
141 settingHelper->Release();
142 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
143 }
144 TELEPHONY_LOGI("SettingUtils: insert success");
145 settingHelper->NotifyChange(uri);
146 settingHelper->Release();
147 return TELEPHONY_SUCCESS;
148 }
149
Update(Uri uri,const std::string & key,const std::string & value)150 int32_t SettingUtils::Update(Uri uri, const std::string &key, const std::string &value)
151 {
152 TELEPHONY_LOGI("SettingUtils:update");
153 std::string queryValue = "";
154 if (Query(uri, key, queryValue) != TELEPHONY_SUCCESS) {
155 return Insert(uri, key, value);
156 }
157 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
158 if (settingHelper == nullptr) {
159 TELEPHONY_LOGE("settingHelper is null");
160 return TELEPHONY_ERR_LOCAL_PTR_NULL;
161 }
162 DataShare::DataShareValuesBucket valuesBucket;
163 DataShare::DataShareValueObject valueObj(value);
164 valuesBucket.Put(SETTING_VALUE, valueObj);
165 DataShare::DataSharePredicates predicates;
166 predicates.EqualTo(SETTING_KEY, key);
167 int32_t result = settingHelper->Update(uri, predicates, valuesBucket);
168 if (result == RDB_INVALID_VALUE) {
169 settingHelper->Release();
170 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
171 }
172 TELEPHONY_LOGI("SettingUtils: update success");
173 settingHelper->NotifyChange(uri);
174 settingHelper->Release();
175 return TELEPHONY_SUCCESS;
176 }
177
AutoTimeObserver(std::shared_ptr<NetworkSearchHandler> & networkSearchHandler)178 AutoTimeObserver::AutoTimeObserver(std::shared_ptr<NetworkSearchHandler> &networkSearchHandler)
179 : networkSearchHandler_(networkSearchHandler)
180 {}
181
OnChange()182 void AutoTimeObserver::OnChange()
183 {
184 TELEPHONY_LOGI("AutoTimeObserver::OnChange");
185 if (networkSearchHandler_ != nullptr) {
186 InnerEvent::Pointer event = InnerEvent::Get(SettingEventCode::MSG_AUTO_TIME);
187 networkSearchHandler_->SendEvent(event);
188 }
189 }
190
AutoTimezoneObserver(std::shared_ptr<NetworkSearchHandler> & networkSearchHandler)191 AutoTimezoneObserver::AutoTimezoneObserver(std::shared_ptr<NetworkSearchHandler> &networkSearchHandler)
192 : networkSearchHandler_(networkSearchHandler)
193 {}
194
OnChange()195 void AutoTimezoneObserver::OnChange()
196 {
197 TELEPHONY_LOGI("AutoTimezoneObserver::OnChange");
198 if (networkSearchHandler_ != nullptr) {
199 InnerEvent::Pointer event = InnerEvent::Get(SettingEventCode::MSG_AUTO_TIMEZONE);
200 networkSearchHandler_->SendEvent(event);
201 }
202 }
203
AirplaneModeObserver(std::shared_ptr<NetworkSearchHandler> & networkSearchHandler)204 AirplaneModeObserver::AirplaneModeObserver(std::shared_ptr<NetworkSearchHandler> &networkSearchHandler)
205 : networkSearchHandler_(networkSearchHandler)
206 {}
207
OnChange()208 void AirplaneModeObserver::OnChange()
209 {
210 TELEPHONY_LOGI("AirplaneModeObserver::OnChange");
211 if (networkSearchHandler_ != nullptr) {
212 InnerEvent::Pointer event = InnerEvent::Get(SettingEventCode::MSG_AUTO_AIRPLANE_MODE);
213 networkSearchHandler_->SendEvent(event);
214 }
215 }
216 } // namespace Telephony
217 } // namespace OHOS
218