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