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