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