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