1 /*
2 * Copyright (C) 2021 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 "data_switch_settings.h"
17
18 #include "cellular_data_constant.h"
19 #include "cellular_data_error.h"
20 #include "cellular_data_settings_rdb_helper.h"
21 #include "core_manager_inner.h"
22 #include "telephony_log_wrapper.h"
23
24 namespace OHOS {
25 namespace Telephony {
DataSwitchSettings(int32_t slotId)26 DataSwitchSettings::DataSwitchSettings(int32_t slotId) : slotId_(slotId) {}
27
LoadSwitchValue()28 void DataSwitchSettings::LoadSwitchValue()
29 {
30 bool dataEnabled = false;
31 bool dataRoamingEnabled = false;
32 QueryUserDataStatus(dataEnabled);
33 QueryUserDataRoamingStatus(dataRoamingEnabled);
34 TELEPHONY_LOGI("slotId:%{public}d userDataOn_:%{public}d userDataRoaming_:%{public}d policyDataOn_:%{public}d",
35 slotId_, userDataOn_, userDataRoaming_, policyDataOn_);
36 }
37
IsInternalDataOn() const38 bool DataSwitchSettings::IsInternalDataOn() const
39 {
40 return internalDataOn_;
41 }
42
SetInternalDataOn(bool internalDataOn)43 void DataSwitchSettings::SetInternalDataOn(bool internalDataOn)
44 {
45 internalDataOn_ = internalDataOn;
46 }
47
SetUserDataOn(bool userDataOn)48 int32_t DataSwitchSettings::SetUserDataOn(bool userDataOn)
49 {
50 // For the VSIM card, no need to save switch state.
51 if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
52 TELEPHONY_LOGI("SetUserDataOn, no need for slot %{public}d", slotId_);
53 return TELEPHONY_ERR_SUCCESS;
54 }
55 std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
56 if (settingsRdbHelper == nullptr) {
57 TELEPHONY_LOGE("settingsRdbHelper == nullptr!");
58 return TELEPHONY_ERR_LOCAL_PTR_NULL;
59 }
60 int value = (userDataOn ? static_cast<int>(DataSwitchCode::CELLULAR_DATA_ENABLED)
61 : static_cast<int>(DataSwitchCode::CELLULAR_DATA_DISABLED));
62 TELEPHONY_LOGI("value:%{public}d", value);
63 Uri userDataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
64 int32_t result = settingsRdbHelper->PutValue(userDataEnableUri, CELLULAR_DATA_COLUMN_ENABLE, value);
65 if (result == TELEPHONY_ERR_SUCCESS) {
66 userDataOn_ = userDataOn;
67 }
68 return result;
69 }
70
SetIntelliSwitchOn(bool userSwitchOn)71 int32_t DataSwitchSettings::SetIntelliSwitchOn(bool userSwitchOn)
72 {
73 std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
74 if (settingsRdbHelper == nullptr) {
75 TELEPHONY_LOGE("settingsRdbHelper == nullptr!");
76 return TELEPHONY_ERR_LOCAL_PTR_NULL;
77 }
78 int value = (userSwitchOn ? static_cast<int>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_ENABLED)
79 : static_cast<int>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_DISABLED));
80 TELEPHONY_LOGI("value:%{public}d", value);
81 Uri intelliSwitchEnableUri(CELLULAR_DATA_SETTING_INTELLIGENCE_SWITCH_URI);
82 int32_t result = settingsRdbHelper->PutValue(intelliSwitchEnableUri, INTELLIGENCE_SWITCH_COLUMN_ENABLE, value);
83 if (result == TELEPHONY_ERR_SUCCESS) {
84 intelliSwitchOn_ = userSwitchOn;
85 }
86 return result;
87 }
88
QueryUserDataStatus(bool & dataEnabled)89 int32_t DataSwitchSettings::QueryUserDataStatus(bool &dataEnabled)
90 {
91 // For the VSIM card, the cellular data switch is always ON.
92 if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
93 userDataOn_ = true;
94 dataEnabled = true;
95 return TELEPHONY_ERR_SUCCESS;
96 }
97 std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
98 if (settingsRdbHelper == nullptr) {
99 TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
100 return TELEPHONY_ERR_LOCAL_PTR_NULL;
101 }
102 Uri userDataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
103 int32_t userDataEnable = static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED);
104 int32_t ret = settingsRdbHelper->GetValue(userDataEnableUri, CELLULAR_DATA_COLUMN_ENABLE, userDataEnable);
105 if (ret != TELEPHONY_ERR_SUCCESS) {
106 TELEPHONY_LOGE("Slot%{public}d: Get data Value failed!", slotId_);
107 return TELEPHONY_ERR_LOCAL_PTR_NULL;
108 }
109 userDataOn_ = (userDataEnable == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED));
110 dataEnabled = userDataOn_;
111 return TELEPHONY_ERR_SUCCESS;
112 }
113
QueryIntelligenceSwitchStatus(bool & switchEnabled)114 int32_t DataSwitchSettings::QueryIntelligenceSwitchStatus(bool &switchEnabled)
115 {
116 std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
117 if (settingsRdbHelper == nullptr) {
118 TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
119 return TELEPHONY_ERR_LOCAL_PTR_NULL;
120 }
121 Uri intelliSwitchEnableUri(CELLULAR_DATA_SETTING_INTELLIGENCE_SWITCH_URI);
122 int32_t intelliSwitchEnable = static_cast<int32_t>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_DISABLED);
123 int32_t ret = settingsRdbHelper->GetValue(intelliSwitchEnableUri,
124 INTELLIGENCE_SWITCH_COLUMN_ENABLE, intelliSwitchEnable);
125 if (ret != TELEPHONY_ERR_SUCCESS) {
126 TELEPHONY_LOGE("GetValue failed!");
127 }
128 intelliSwitchOn_ =
129 (intelliSwitchEnable == static_cast<int32_t>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_ENABLED));
130 switchEnabled = intelliSwitchOn_;
131 return TELEPHONY_ERR_SUCCESS;
132 }
133
SetUserDataRoamingOn(bool dataRoamingEnabled)134 int32_t DataSwitchSettings::SetUserDataRoamingOn(bool dataRoamingEnabled)
135 {
136 // For the VSIM card, no need to save switch state.
137 if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
138 TELEPHONY_LOGI("SetUserDataRoamingOn, no need for slot %{public}d", slotId_);
139 return TELEPHONY_ERR_SUCCESS;
140 }
141 std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
142 if (settingsRdbHelper == nullptr) {
143 TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
144 return TELEPHONY_ERR_LOCAL_PTR_NULL;
145 }
146 int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
147 if (simId <= INVALID_SIM_ID) {
148 TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
149 return TELEPHONY_ERR_SLOTID_INVALID;
150 }
151 int value = (dataRoamingEnabled ? static_cast<int>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED)
152 : static_cast<int>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED));
153 TELEPHONY_LOGI("value:%{public}d", value);
154 Uri userDataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
155 int32_t result = settingsRdbHelper->PutValue(
156 userDataRoamingUri, std::string(CELLULAR_DATA_COLUMN_ROAMING) + std::to_string(simId), value);
157 if (result == TELEPHONY_ERR_SUCCESS) {
158 userDataRoaming_ = dataRoamingEnabled;
159 }
160 return result;
161 }
162
QueryUserDataRoamingStatus(bool & dataRoamingEnabled)163 int32_t DataSwitchSettings::QueryUserDataRoamingStatus(bool &dataRoamingEnabled)
164 {
165 // For the VSIM card, the cellular data roaming switch is always ON.
166 if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
167 userDataRoaming_ = true;
168 dataRoamingEnabled = true;
169 return TELEPHONY_ERR_SUCCESS;
170 }
171 std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
172 if (settingsRdbHelper == nullptr) {
173 TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
174 return TELEPHONY_ERR_LOCAL_PTR_NULL;
175 }
176 int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
177 if (simId <= INVALID_SIM_ID) {
178 TELEPHONY_LOGE("Slot%{public}d: invalid sim id %{public}d", slotId_, simId);
179 return TELEPHONY_ERR_LOCAL_PTR_NULL;
180 }
181 Uri userDataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
182 int32_t userDataRoamingValue = static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED);
183 int32_t ret = settingsRdbHelper->GetValue(
184 userDataRoamingUri, std::string(CELLULAR_DATA_COLUMN_ROAMING) + std::to_string(simId), userDataRoamingValue);
185 if (ret != TELEPHONY_ERR_SUCCESS) {
186 TELEPHONY_LOGE("GetValue failed!");
187 return ret;
188 }
189 userDataRoaming_ = (userDataRoamingValue == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED));
190 dataRoamingEnabled = userDataRoaming_;
191 return TELEPHONY_ERR_SUCCESS;
192 }
193
IsPolicyDataOn() const194 bool DataSwitchSettings::IsPolicyDataOn() const
195 {
196 return policyDataOn_;
197 }
198
SetPolicyDataOn(bool policyDataOn)199 void DataSwitchSettings::SetPolicyDataOn(bool policyDataOn)
200 {
201 policyDataOn_ = policyDataOn;
202 }
203
IsCarrierDataOn() const204 bool DataSwitchSettings::IsCarrierDataOn() const
205 {
206 return carrierDataOn_;
207 }
208
SetCarrierDataOn(bool carrierDataOn)209 void DataSwitchSettings::SetCarrierDataOn(bool carrierDataOn)
210 {
211 carrierDataOn_ = carrierDataOn;
212 }
213
IsAllowActiveData() const214 bool DataSwitchSettings::IsAllowActiveData() const
215 {
216 if (userDataOn_ && policyDataOn_ && internalDataOn_) {
217 return true;
218 } else {
219 TELEPHONY_LOGD("Activation not allowed[user:%{public}d policy:%{public}d internal:%{public}d]", userDataOn_,
220 policyDataOn_, internalDataOn_);
221 return false;
222 }
223 }
224
IsUserDataOn()225 bool DataSwitchSettings::IsUserDataOn()
226 {
227 return userDataOn_;
228 }
229
IsUserDataRoamingOn()230 bool DataSwitchSettings::IsUserDataRoamingOn()
231 {
232 return userDataRoaming_;
233 }
234
UpdateUserDataRoamingOn(bool dataRoaming)235 void DataSwitchSettings::UpdateUserDataRoamingOn(bool dataRoaming)
236 {
237 userDataRoaming_ = dataRoaming;
238 }
239 } // namespace Telephony
240 } // namespace OHOS