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 #ifndef CELLULAR_DATA_HANDLER_H 17 #define CELLULAR_DATA_HANDLER_H 18 19 #include <atomic> 20 #include <memory> 21 22 #include "apn_manager.h" 23 #include "cellular_data_constant.h" 24 #include "cellular_data_event_code.h" 25 #include "cellular_data_incall_observer.h" 26 #include "cellular_data_rdb_observer.h" 27 #include "cellular_data_roaming_observer.h" 28 #include "cellular_data_setting_observer.h" 29 #include "cellular_data_state_machine.h" 30 #include "common_event_manager.h" 31 #include "data_switch_settings.h" 32 #include "incall_data_state_machine.h" 33 #include "inner_event.h" 34 #include "radio_event.h" 35 #include "state_notification.h" 36 #include "tel_event_handler.h" 37 #include "tel_profile_util.h" 38 #include "tel_ril_data_parcel.h" 39 namespace OHOS { 40 namespace Telephony { 41 class CellularDataHandler : public TelEventHandler, public EventFwk::CommonEventSubscriber { 42 public: 43 explicit CellularDataHandler(const EventFwk::CommonEventSubscribeInfo &sp, int32_t slotId); 44 ~CellularDataHandler(); 45 void Init(); 46 bool ReleaseNet(const NetRequest &request); 47 bool RequestNet(const NetRequest &request); 48 void ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) override; 49 void OnReceiveEvent(const EventFwk::CommonEventData &data) override; 50 int32_t SetCellularDataEnable(bool userDataEnabled); 51 int32_t SetIntelligenceSwitchEnable(bool userDataEnabled); 52 int32_t IsCellularDataEnabled(bool &dataEnabled) const; 53 int32_t IsCellularDataRoamingEnabled(bool &dataRoamingEnabled) const; 54 int32_t SetCellularDataRoamingEnabled(bool dataRoamingEnabled); 55 ApnProfileState GetCellularDataState() const; 56 ApnProfileState GetCellularDataState(const std::string &apnType) const; 57 void ClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason); 58 void EstablishAllApnsIfConnectable(); 59 void ClearAllConnections(DisConnectionReason reason); 60 bool ChangeConnectionForDsds(bool enable); 61 int32_t GetSlotId() const; 62 bool HandleApnChanged(); 63 void HandleApnChanged(const AppExecFwk::InnerEvent::Pointer &event); 64 int32_t GetCellularDataFlowType(); 65 void SetPolicyDataOn(bool enable); 66 bool IsRestrictedMode() const; 67 DisConnectionReason GetDisConnectionReason(); 68 bool HasInternetCapability(const int32_t cid) const; 69 void GetDataConnApnAttr(ApnItem::Attribute &apnAttr) const; 70 std::string GetDataConnIpType() const; 71 int32_t GetDataRecoveryState(); 72 void SetRilAttachApn(); 73 void IsNeedDoRecovery(bool needDoRecovery) const; 74 void RegisterDataSettingObserver(); 75 void UnRegisterDataSettingObserver(); 76 int32_t GetIntelligenceSwitchState(bool &switchState); 77 78 private: 79 std::shared_ptr<CellularDataStateMachine> CreateCellularDataConnect(); 80 std::shared_ptr<CellularDataStateMachine> FindIdleCellularDataConnection() const; 81 bool CheckCellularDataSlotId(sptr<ApnHolder> &apnHolder); 82 bool CheckAttachAndSimState(sptr<ApnHolder> &apnHolder); 83 bool CheckRoamingState(sptr<ApnHolder> &apnHolder); 84 bool CheckApnState(sptr<ApnHolder> &apnHolder); 85 void AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder); 86 bool EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech); 87 void RadioPsConnectionAttached(const AppExecFwk::InnerEvent::Pointer &event); 88 void RadioPsConnectionDetached(const AppExecFwk::InnerEvent::Pointer &event); 89 void RoamingStateOn(const AppExecFwk::InnerEvent::Pointer &event); 90 void RoamingStateOff(const AppExecFwk::InnerEvent::Pointer &event); 91 void PsRadioEmergencyStateOpen(const AppExecFwk::InnerEvent::Pointer &event); 92 void PsRadioEmergencyStateClose(const AppExecFwk::InnerEvent::Pointer &event); 93 void EstablishDataConnectionComplete(const AppExecFwk::InnerEvent::Pointer &event); 94 void DisconnectDataComplete(const AppExecFwk::InnerEvent::Pointer &event); 95 void MsgEstablishDataConnection(const AppExecFwk::InnerEvent::Pointer &event); 96 void MsgRequestNetwork(const AppExecFwk::InnerEvent::Pointer &event); 97 void HandleSettingSwitchChanged(const AppExecFwk::InnerEvent::Pointer &event); 98 void HandleVoiceCallChanged(int32_t state); 99 void HandleDefaultDataSubscriptionChanged(); 100 void HandleSimStateChanged(); 101 void HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer &event); 102 void HandleSimStateOrRecordsChanged(const AppExecFwk::InnerEvent::Pointer &event); 103 void HandleSimAccountLoaded(const AppExecFwk::InnerEvent::Pointer &event); 104 void HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event); 105 void PsDataRatChanged(const AppExecFwk::InnerEvent::Pointer &event); 106 void SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event); 107 bool HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder); 108 void GetConfigurationFor5G(); 109 void GetDefaultConfiguration(); 110 void GetDefaultDataRoamingConfig(); 111 bool ParseOperatorConfig(const std::u16string &configName); 112 void HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event); 113 void HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event); 114 void GetDefaultUpLinkThresholdsConfig(); 115 void GetDefaultDownLinkThresholdsConfig(); 116 void SetRilLinkBandwidths(); 117 void HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event); 118 void HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event); 119 void HandleSortConnection(); 120 void SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event); 121 void SetDataPermitted(int32_t slotId, bool dataPermitted); 122 bool CheckDataPermittedByDsds(); 123 bool SetDataPermittedForMms(bool dataPermittedForMms); 124 std::shared_ptr<IncallDataStateMachine> CreateIncallDataStateMachine(int32_t callState); 125 void HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer &event); 126 void HandleCallChanged(int32_t state); 127 void HandleImsCallChanged(int32_t state); 128 void IncallDataComplete(const AppExecFwk::InnerEvent::Pointer &event); 129 void ResetDataFlowType(); 130 void ClearConnectionIfRequired(); 131 void ReleaseAllNetworkRequest(); 132 bool GetEsmFlagFromOpCfg(); 133 void SetInitApnWithNullDp(); 134 void GetSinglePdpEnabledFromOpCfg(); 135 bool IsSingleConnectionEnabled(int32_t radioTech); 136 void OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer &event); 137 void HandleFactoryReset(const AppExecFwk::InnerEvent::Pointer &event); 138 void OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer &event); 139 void CreateApnItem(); 140 void UpdatePhysicalConnectionState(bool noActiveConnection); 141 bool IsVSimSlotId(int32_t slotId); 142 std::shared_ptr<CellularDataStateMachine> CheckForCompatibleDataConnection(sptr<ApnHolder> &apnHolder); 143 bool IsGsm(); 144 bool IsCdma(); 145 void HandleScreenStateChanged(bool isScreenOn) const; 146 std::shared_ptr<DataShare::DataShareHelper> CreatorDataShareHelper(); 147 bool GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 148 const int32_t simId, int32_t &profileIdValue); 149 int32_t GetCurrentApnId(); 150 151 private: 152 sptr<ApnManager> apnManager_; 153 std::unique_ptr<DataSwitchSettings> dataSwitchSettings_; 154 sptr<DataConnectionManager> connectionManager_; 155 std::u16string lastIccId_; 156 int32_t lastCallState_ = (int32_t)TelCallStatus::CALL_STATUS_IDLE; 157 const int32_t slotId_; 158 DisConnectionReason disconnectionReason_ = DisConnectionReason::REASON_NORMAL; 159 bool unMeteredAllNsaConfig_ = false; 160 bool unMeteredNrNsaMmwaveConfig_ = false; 161 bool unMeteredNrNsaSub6Config_ = false; 162 bool unMeteredAllNrsaConfig_ = false; 163 bool unMeteredNrsaMmwaveConfig_ = false; 164 bool unMeteredNrsaSub6Config_ = false; 165 bool unMeteredRoamingConfig_ = false; 166 int defaultMobileMtuConfig_ = 0; 167 bool defaultPreferApn_ = true; 168 bool physicalConnectionActiveState_ = false; 169 bool multipleConnectionsEnabled_ = false; 170 bool defaultDataRoamingEnable_ = false; 171 bool isSimAccountLoaded_ = false; 172 std::vector<std::string> upLinkThresholds_; 173 std::vector<std::string> downLinkThresholds_; 174 sptr<CellularDataSettingObserver> settingObserver_; 175 sptr<CellularDataRoamingObserver> roamingObserver_; 176 sptr<CellularDataIncallObserver> incallObserver_; 177 sptr<CellularDataRdbObserver> cellularDataRdbObserver_; 178 std::shared_ptr<IncallDataStateMachine> incallDataStateMachine_; 179 180 using Fun = std::function<void(const AppExecFwk::InnerEvent::Pointer &event)>; 181 std::map<uint32_t, Fun> eventIdMap_ { 182 { RadioEvent::RADIO_PS_CONNECTION_ATTACHED, 183 [this](const AppExecFwk::InnerEvent::Pointer &event) { RadioPsConnectionAttached(event); } }, 184 { RadioEvent::RADIO_PS_CONNECTION_DETACHED, 185 [this](const AppExecFwk::InnerEvent::Pointer &event) { RadioPsConnectionDetached(event); } }, 186 { RadioEvent::RADIO_PS_ROAMING_OPEN, 187 [this](const AppExecFwk::InnerEvent::Pointer &event) { RoamingStateOn(event); } }, 188 { RadioEvent::RADIO_PS_ROAMING_CLOSE, 189 [this](const AppExecFwk::InnerEvent::Pointer &event) { RoamingStateOff(event); } }, 190 { RadioEvent::RADIO_EMERGENCY_STATE_OPEN, 191 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsRadioEmergencyStateOpen(event); } }, 192 { RadioEvent::RADIO_EMERGENCY_STATE_CLOSE, 193 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsRadioEmergencyStateClose(event); } }, 194 { CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION_COMPLETE, 195 [this](const AppExecFwk::InnerEvent::Pointer &event) { EstablishDataConnectionComplete(event); } }, 196 { CellularDataEventCode::MSG_DISCONNECT_DATA_COMPLETE, 197 [this](const AppExecFwk::InnerEvent::Pointer &event) { DisconnectDataComplete(event); } }, 198 { CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, 199 [this](const AppExecFwk::InnerEvent::Pointer &event) { MsgEstablishDataConnection(event); } }, 200 { CellularDataEventCode::MSG_SETTING_SWITCH, 201 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSettingSwitchChanged(event); } }, 202 { CellularDataEventCode::MSG_REQUEST_NETWORK, 203 [this](const AppExecFwk::InnerEvent::Pointer &event) { MsgRequestNetwork(event); } }, 204 { RadioEvent::RADIO_STATE_CHANGED, 205 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioStateChanged(event); } }, 206 { RadioEvent::RADIO_DSDS_MODE_CHANGED, 207 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDsdsModeChanged(event); } }, 208 { RadioEvent::RADIO_SIM_STATE_CHANGE, 209 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimStateOrRecordsChanged(event); } }, 210 { RadioEvent::RADIO_SIM_RECORDS_LOADED, 211 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimStateOrRecordsChanged(event); } }, 212 { RadioEvent::RADIO_SIM_ACCOUNT_LOADED, 213 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleSimAccountLoaded(event); } }, 214 { RadioEvent::RADIO_PS_RAT_CHANGED, 215 [this](const AppExecFwk::InnerEvent::Pointer &event) { PsDataRatChanged(event); } }, 216 { CellularDataEventCode::MSG_APN_CHANGED, 217 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleApnChanged(event); } }, 218 { CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, 219 [this](const AppExecFwk::InnerEvent::Pointer &event) { SetRilAttachApnResponse(event); } }, 220 { RadioEvent::RADIO_NR_STATE_CHANGED, 221 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioNrStateChanged(event); } }, 222 { RadioEvent::RADIO_NR_FREQUENCY_CHANGED, 223 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleRadioNrFrequencyChanged(event); } }, 224 { CellularDataEventCode::MSG_DB_SETTING_ENABLE_CHANGED, 225 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingEnableChanged(event); } }, 226 { CellularDataEventCode::MSG_DB_SETTING_ROAMING_CHANGED, 227 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingRoamingChanged(event); } }, 228 { CellularDataEventCode::MSG_DB_SETTING_INCALL_CHANGED, 229 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleDBSettingIncallChanged(event); } }, 230 { CellularDataEventCode::MSG_INCALL_DATA_COMPLETE, 231 [this](const AppExecFwk::InnerEvent::Pointer &event) { IncallDataComplete(event); } }, 232 { RadioEvent::RADIO_RIL_ADAPTER_HOST_DIED, 233 [this](const AppExecFwk::InnerEvent::Pointer &event) { OnRilAdapterHostDied(event); } }, 234 { RadioEvent::RADIO_FACTORY_RESET, 235 [this](const AppExecFwk::InnerEvent::Pointer &event) { HandleFactoryReset(event); } }, 236 { RadioEvent::RADIO_CLEAN_ALL_DATA_CONNECTIONS, 237 [this](const AppExecFwk::InnerEvent::Pointer &event) { OnCleanAllDataConnectionsDone(event); } }, 238 }; 239 }; 240 } // namespace Telephony 241 } // namespace OHOS 242 #endif // CELLULAR_DATA_HANDLER_H 243