12d43be4eSopenharmony_ci/*
22d43be4eSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
32d43be4eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
42d43be4eSopenharmony_ci * you may not use this file except in compliance with the License.
52d43be4eSopenharmony_ci * You may obtain a copy of the License at
62d43be4eSopenharmony_ci *
72d43be4eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
82d43be4eSopenharmony_ci *
92d43be4eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
102d43be4eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
112d43be4eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122d43be4eSopenharmony_ci * See the License for the specific language governing permissions and
132d43be4eSopenharmony_ci * limitations under the License.
142d43be4eSopenharmony_ci */
152d43be4eSopenharmony_ci
162d43be4eSopenharmony_ci#include "data_switch_settings.h"
172d43be4eSopenharmony_ci
182d43be4eSopenharmony_ci#include "cellular_data_constant.h"
192d43be4eSopenharmony_ci#include "cellular_data_error.h"
202d43be4eSopenharmony_ci#include "cellular_data_settings_rdb_helper.h"
212d43be4eSopenharmony_ci#include "core_manager_inner.h"
222d43be4eSopenharmony_ci#include "telephony_log_wrapper.h"
232d43be4eSopenharmony_ci
242d43be4eSopenharmony_cinamespace OHOS {
252d43be4eSopenharmony_cinamespace Telephony {
262d43be4eSopenharmony_ciDataSwitchSettings::DataSwitchSettings(int32_t slotId) : slotId_(slotId) {}
272d43be4eSopenharmony_ci
282d43be4eSopenharmony_civoid DataSwitchSettings::LoadSwitchValue()
292d43be4eSopenharmony_ci{
302d43be4eSopenharmony_ci    bool dataEnabled = false;
312d43be4eSopenharmony_ci    bool dataRoamingEnabled = false;
322d43be4eSopenharmony_ci    QueryUserDataStatus(dataEnabled);
332d43be4eSopenharmony_ci    QueryUserDataRoamingStatus(dataRoamingEnabled);
342d43be4eSopenharmony_ci    TELEPHONY_LOGI("slotId:%{public}d userDataOn_:%{public}d userDataRoaming_:%{public}d policyDataOn_:%{public}d",
352d43be4eSopenharmony_ci        slotId_, userDataOn_, userDataRoaming_, policyDataOn_);
362d43be4eSopenharmony_ci}
372d43be4eSopenharmony_ci
382d43be4eSopenharmony_cibool DataSwitchSettings::IsInternalDataOn() const
392d43be4eSopenharmony_ci{
402d43be4eSopenharmony_ci    return internalDataOn_;
412d43be4eSopenharmony_ci}
422d43be4eSopenharmony_ci
432d43be4eSopenharmony_civoid DataSwitchSettings::SetInternalDataOn(bool internalDataOn)
442d43be4eSopenharmony_ci{
452d43be4eSopenharmony_ci    internalDataOn_ = internalDataOn;
462d43be4eSopenharmony_ci}
472d43be4eSopenharmony_ci
482d43be4eSopenharmony_ciint32_t DataSwitchSettings::SetUserDataOn(bool userDataOn)
492d43be4eSopenharmony_ci{
502d43be4eSopenharmony_ci    // For the VSIM card, no need to save switch state.
512d43be4eSopenharmony_ci    if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
522d43be4eSopenharmony_ci        TELEPHONY_LOGI("SetUserDataOn, no need for slot %{public}d", slotId_);
532d43be4eSopenharmony_ci        return TELEPHONY_ERR_SUCCESS;
542d43be4eSopenharmony_ci    }
552d43be4eSopenharmony_ci    std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
562d43be4eSopenharmony_ci    if (settingsRdbHelper == nullptr) {
572d43be4eSopenharmony_ci        TELEPHONY_LOGE("settingsRdbHelper == nullptr!");
582d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
592d43be4eSopenharmony_ci    }
602d43be4eSopenharmony_ci    int value = (userDataOn ? static_cast<int>(DataSwitchCode::CELLULAR_DATA_ENABLED)
612d43be4eSopenharmony_ci                            : static_cast<int>(DataSwitchCode::CELLULAR_DATA_DISABLED));
622d43be4eSopenharmony_ci    TELEPHONY_LOGI("value:%{public}d", value);
632d43be4eSopenharmony_ci    Uri userDataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
642d43be4eSopenharmony_ci    int32_t result = settingsRdbHelper->PutValue(userDataEnableUri, CELLULAR_DATA_COLUMN_ENABLE, value);
652d43be4eSopenharmony_ci    if (result == TELEPHONY_ERR_SUCCESS) {
662d43be4eSopenharmony_ci        userDataOn_ = userDataOn;
672d43be4eSopenharmony_ci    }
682d43be4eSopenharmony_ci    return result;
692d43be4eSopenharmony_ci}
702d43be4eSopenharmony_ci
712d43be4eSopenharmony_ciint32_t DataSwitchSettings::SetIntelliSwitchOn(bool userSwitchOn)
722d43be4eSopenharmony_ci{
732d43be4eSopenharmony_ci    std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
742d43be4eSopenharmony_ci    if (settingsRdbHelper == nullptr) {
752d43be4eSopenharmony_ci        TELEPHONY_LOGE("settingsRdbHelper == nullptr!");
762d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
772d43be4eSopenharmony_ci    }
782d43be4eSopenharmony_ci    int value = (userSwitchOn ? static_cast<int>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_ENABLED)
792d43be4eSopenharmony_ci                            : static_cast<int>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_DISABLED));
802d43be4eSopenharmony_ci    TELEPHONY_LOGI("value:%{public}d", value);
812d43be4eSopenharmony_ci    Uri intelliSwitchEnableUri(CELLULAR_DATA_SETTING_INTELLIGENCE_SWITCH_URI);
822d43be4eSopenharmony_ci    int32_t result = settingsRdbHelper->PutValue(intelliSwitchEnableUri, INTELLIGENCE_SWITCH_COLUMN_ENABLE, value);
832d43be4eSopenharmony_ci    if (result == TELEPHONY_ERR_SUCCESS) {
842d43be4eSopenharmony_ci        intelliSwitchOn_ = userSwitchOn;
852d43be4eSopenharmony_ci    }
862d43be4eSopenharmony_ci    return result;
872d43be4eSopenharmony_ci}
882d43be4eSopenharmony_ci
892d43be4eSopenharmony_ciint32_t DataSwitchSettings::QueryUserDataStatus(bool &dataEnabled)
902d43be4eSopenharmony_ci{
912d43be4eSopenharmony_ci    // For the VSIM card, the cellular data switch is always ON.
922d43be4eSopenharmony_ci    if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
932d43be4eSopenharmony_ci        userDataOn_ = true;
942d43be4eSopenharmony_ci        dataEnabled = true;
952d43be4eSopenharmony_ci        return TELEPHONY_ERR_SUCCESS;
962d43be4eSopenharmony_ci    }
972d43be4eSopenharmony_ci    std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
982d43be4eSopenharmony_ci    if (settingsRdbHelper == nullptr) {
992d43be4eSopenharmony_ci        TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
1002d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
1012d43be4eSopenharmony_ci    }
1022d43be4eSopenharmony_ci    Uri userDataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
1032d43be4eSopenharmony_ci    int32_t userDataEnable = static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED);
1042d43be4eSopenharmony_ci    int32_t ret = settingsRdbHelper->GetValue(userDataEnableUri, CELLULAR_DATA_COLUMN_ENABLE, userDataEnable);
1052d43be4eSopenharmony_ci    if (ret != TELEPHONY_ERR_SUCCESS) {
1062d43be4eSopenharmony_ci        TELEPHONY_LOGE("Slot%{public}d: Get data Value failed!", slotId_);
1072d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
1082d43be4eSopenharmony_ci    }
1092d43be4eSopenharmony_ci    userDataOn_ = (userDataEnable == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED));
1102d43be4eSopenharmony_ci    dataEnabled = userDataOn_;
1112d43be4eSopenharmony_ci    return TELEPHONY_ERR_SUCCESS;
1122d43be4eSopenharmony_ci}
1132d43be4eSopenharmony_ci
1142d43be4eSopenharmony_ciint32_t DataSwitchSettings::QueryIntelligenceSwitchStatus(bool &switchEnabled)
1152d43be4eSopenharmony_ci{
1162d43be4eSopenharmony_ci    std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
1172d43be4eSopenharmony_ci    if (settingsRdbHelper == nullptr) {
1182d43be4eSopenharmony_ci        TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
1192d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
1202d43be4eSopenharmony_ci    }
1212d43be4eSopenharmony_ci    Uri intelliSwitchEnableUri(CELLULAR_DATA_SETTING_INTELLIGENCE_SWITCH_URI);
1222d43be4eSopenharmony_ci    int32_t intelliSwitchEnable = static_cast<int32_t>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_DISABLED);
1232d43be4eSopenharmony_ci    int32_t ret = settingsRdbHelper->GetValue(intelliSwitchEnableUri,
1242d43be4eSopenharmony_ci        INTELLIGENCE_SWITCH_COLUMN_ENABLE, intelliSwitchEnable);
1252d43be4eSopenharmony_ci    if (ret != TELEPHONY_ERR_SUCCESS) {
1262d43be4eSopenharmony_ci        TELEPHONY_LOGE("GetValue failed!");
1272d43be4eSopenharmony_ci    }
1282d43be4eSopenharmony_ci    intelliSwitchOn_ =
1292d43be4eSopenharmony_ci        (intelliSwitchEnable == static_cast<int32_t>(IntelligenceSwitchCode::INTELLIGENCE_SWITCH_ENABLED));
1302d43be4eSopenharmony_ci    switchEnabled = intelliSwitchOn_;
1312d43be4eSopenharmony_ci    return TELEPHONY_ERR_SUCCESS;
1322d43be4eSopenharmony_ci}
1332d43be4eSopenharmony_ci
1342d43be4eSopenharmony_ciint32_t DataSwitchSettings::SetUserDataRoamingOn(bool dataRoamingEnabled)
1352d43be4eSopenharmony_ci{
1362d43be4eSopenharmony_ci    // For the VSIM card, no need to save switch state.
1372d43be4eSopenharmony_ci    if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
1382d43be4eSopenharmony_ci        TELEPHONY_LOGI("SetUserDataRoamingOn, no need for slot %{public}d", slotId_);
1392d43be4eSopenharmony_ci        return TELEPHONY_ERR_SUCCESS;
1402d43be4eSopenharmony_ci    }
1412d43be4eSopenharmony_ci    std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
1422d43be4eSopenharmony_ci    if (settingsRdbHelper == nullptr) {
1432d43be4eSopenharmony_ci        TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
1442d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
1452d43be4eSopenharmony_ci    }
1462d43be4eSopenharmony_ci    int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
1472d43be4eSopenharmony_ci    if (simId <= INVALID_SIM_ID) {
1482d43be4eSopenharmony_ci        TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
1492d43be4eSopenharmony_ci        return TELEPHONY_ERR_SLOTID_INVALID;
1502d43be4eSopenharmony_ci    }
1512d43be4eSopenharmony_ci    int value = (dataRoamingEnabled ? static_cast<int>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED)
1522d43be4eSopenharmony_ci                                    : static_cast<int>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED));
1532d43be4eSopenharmony_ci    TELEPHONY_LOGI("value:%{public}d", value);
1542d43be4eSopenharmony_ci    Uri userDataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
1552d43be4eSopenharmony_ci    int32_t result = settingsRdbHelper->PutValue(
1562d43be4eSopenharmony_ci        userDataRoamingUri, std::string(CELLULAR_DATA_COLUMN_ROAMING) + std::to_string(simId), value);
1572d43be4eSopenharmony_ci    if (result == TELEPHONY_ERR_SUCCESS) {
1582d43be4eSopenharmony_ci        userDataRoaming_ = dataRoamingEnabled;
1592d43be4eSopenharmony_ci    }
1602d43be4eSopenharmony_ci    return result;
1612d43be4eSopenharmony_ci}
1622d43be4eSopenharmony_ci
1632d43be4eSopenharmony_ciint32_t DataSwitchSettings::QueryUserDataRoamingStatus(bool &dataRoamingEnabled)
1642d43be4eSopenharmony_ci{
1652d43be4eSopenharmony_ci    // For the VSIM card, the cellular data roaming switch is always ON.
1662d43be4eSopenharmony_ci    if (slotId_ == CELLULAR_DATA_VSIM_SLOT_ID) {
1672d43be4eSopenharmony_ci        userDataRoaming_ = true;
1682d43be4eSopenharmony_ci        dataRoamingEnabled = true;
1692d43be4eSopenharmony_ci        return TELEPHONY_ERR_SUCCESS;
1702d43be4eSopenharmony_ci    }
1712d43be4eSopenharmony_ci    std::shared_ptr<CellularDataSettingsRdbHelper> settingsRdbHelper = CellularDataSettingsRdbHelper::GetInstance();
1722d43be4eSopenharmony_ci    if (settingsRdbHelper == nullptr) {
1732d43be4eSopenharmony_ci        TELEPHONY_LOGE("settingsRdbHelper is nullptr!");
1742d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
1752d43be4eSopenharmony_ci    }
1762d43be4eSopenharmony_ci    int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
1772d43be4eSopenharmony_ci    if (simId <= INVALID_SIM_ID) {
1782d43be4eSopenharmony_ci        TELEPHONY_LOGE("Slot%{public}d: invalid sim id %{public}d", slotId_, simId);
1792d43be4eSopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
1802d43be4eSopenharmony_ci    }
1812d43be4eSopenharmony_ci    Uri userDataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
1822d43be4eSopenharmony_ci    int32_t userDataRoamingValue = static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED);
1832d43be4eSopenharmony_ci    int32_t ret = settingsRdbHelper->GetValue(
1842d43be4eSopenharmony_ci        userDataRoamingUri, std::string(CELLULAR_DATA_COLUMN_ROAMING) + std::to_string(simId), userDataRoamingValue);
1852d43be4eSopenharmony_ci    if (ret != TELEPHONY_ERR_SUCCESS) {
1862d43be4eSopenharmony_ci        TELEPHONY_LOGE("GetValue failed!");
1872d43be4eSopenharmony_ci        return ret;
1882d43be4eSopenharmony_ci    }
1892d43be4eSopenharmony_ci    userDataRoaming_ = (userDataRoamingValue == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED));
1902d43be4eSopenharmony_ci    dataRoamingEnabled = userDataRoaming_;
1912d43be4eSopenharmony_ci    return TELEPHONY_ERR_SUCCESS;
1922d43be4eSopenharmony_ci}
1932d43be4eSopenharmony_ci
1942d43be4eSopenharmony_cibool DataSwitchSettings::IsPolicyDataOn() const
1952d43be4eSopenharmony_ci{
1962d43be4eSopenharmony_ci    return policyDataOn_;
1972d43be4eSopenharmony_ci}
1982d43be4eSopenharmony_ci
1992d43be4eSopenharmony_civoid DataSwitchSettings::SetPolicyDataOn(bool policyDataOn)
2002d43be4eSopenharmony_ci{
2012d43be4eSopenharmony_ci    policyDataOn_ = policyDataOn;
2022d43be4eSopenharmony_ci}
2032d43be4eSopenharmony_ci
2042d43be4eSopenharmony_cibool DataSwitchSettings::IsCarrierDataOn() const
2052d43be4eSopenharmony_ci{
2062d43be4eSopenharmony_ci    return carrierDataOn_;
2072d43be4eSopenharmony_ci}
2082d43be4eSopenharmony_ci
2092d43be4eSopenharmony_civoid DataSwitchSettings::SetCarrierDataOn(bool carrierDataOn)
2102d43be4eSopenharmony_ci{
2112d43be4eSopenharmony_ci    carrierDataOn_ = carrierDataOn;
2122d43be4eSopenharmony_ci}
2132d43be4eSopenharmony_ci
2142d43be4eSopenharmony_cibool DataSwitchSettings::IsAllowActiveData() const
2152d43be4eSopenharmony_ci{
2162d43be4eSopenharmony_ci    if (userDataOn_ && policyDataOn_ && internalDataOn_) {
2172d43be4eSopenharmony_ci        return true;
2182d43be4eSopenharmony_ci    } else {
2192d43be4eSopenharmony_ci        TELEPHONY_LOGD("Activation not allowed[user:%{public}d policy:%{public}d internal:%{public}d]", userDataOn_,
2202d43be4eSopenharmony_ci            policyDataOn_, internalDataOn_);
2212d43be4eSopenharmony_ci        return false;
2222d43be4eSopenharmony_ci    }
2232d43be4eSopenharmony_ci}
2242d43be4eSopenharmony_ci
2252d43be4eSopenharmony_cibool DataSwitchSettings::IsUserDataOn()
2262d43be4eSopenharmony_ci{
2272d43be4eSopenharmony_ci    return userDataOn_;
2282d43be4eSopenharmony_ci}
2292d43be4eSopenharmony_ci
2302d43be4eSopenharmony_cibool DataSwitchSettings::IsUserDataRoamingOn()
2312d43be4eSopenharmony_ci{
2322d43be4eSopenharmony_ci    return userDataRoaming_;
2332d43be4eSopenharmony_ci}
2342d43be4eSopenharmony_ci
2352d43be4eSopenharmony_civoid DataSwitchSettings::UpdateUserDataRoamingOn(bool dataRoaming)
2362d43be4eSopenharmony_ci{
2372d43be4eSopenharmony_ci    userDataRoaming_ = dataRoaming;
2382d43be4eSopenharmony_ci}
2392d43be4eSopenharmony_ci} // namespace Telephony
2402d43be4eSopenharmony_ci} // namespace OHOS