• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2024 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 NETWORK_SEARCH_INCLUDE_NETWORK_SEARCH_MANAGER_H
17 #define NETWORK_SEARCH_INCLUDE_NETWORK_SEARCH_MANAGER_H
18 
19 #include <any>
20 #include <cinttypes>
21 #include <list>
22 #include <map>
23 #include <mutex>
24 #include <string>
25 #include <tuple>
26 
27 #include "device_state_handler.h"
28 #include "device_state_observer.h"
29 #include "i_network_search.h"
30 #include "i_sim_manager.h"
31 #include "i_tel_ril_manager.h"
32 #include "iremote_stub.h"
33 #include "network_search_handler.h"
34 #include "network_search_notify.h"
35 #include "network_search_result.h"
36 #include "network_search_state.h"
37 #include "network_utils.h"
38 #include "observer_handler.h"
39 #include "radio_event.h"
40 #include "setting_utils.h"
41 
42 namespace OHOS {
43 namespace Telephony {
44 enum class HandleRunningState { STATE_NOT_START, STATE_RUNNING };
45 /**
46  * @brief inner objects for network search manager
47  *
48  */
49 struct NetworkSearchManagerInner {
50     static const int32_t MSG_NUM = 3;
51     int32_t msgNum_ = MSG_NUM;
52     static const int32_t DEFAULT_RAF = 0xffff;
53     static const int64_t SERIAL_NUMBER_DEFAULT = -1;
54     static const int64_t SERIAL_NUMBER_THRESHOLD = 1000;
55     static const int64_t SERIAL_NUMBER_EXEMPT = 1100;
56     std::shared_ptr<NetworkSearchState> networkSearchState_ = nullptr;
57     std::shared_ptr<NetworkSearchHandler> networkSearchHandler_ = nullptr;
58     std::unique_ptr<ObserverHandler> observerHandler_ = nullptr;
59     std::shared_ptr<DeviceStateHandler> deviceStateHandler_ = nullptr;
60     std::shared_ptr<DeviceStateObserver> deviceStateObserver_ = nullptr;
61     sptr<AutoTimeObserver> settingAutoTimeObserver_ = nullptr;
62     sptr<AutoTimezoneObserver> settingAutoTimezoneObserver_ = nullptr;
63     sptr<AirplaneModeObserver> airplaneModeObserver_ = nullptr;
64     HandleRunningState state_ = HandleRunningState::STATE_NOT_START;
65     std::unique_ptr<NetworkSearchResult> networkSearchResult_ = nullptr;
66     SelectionMode selection_ = SelectionMode::MODE_TYPE_UNKNOWN;
67     ModemPowerState radioState_ = ModemPowerState::CORE_SERVICE_POWER_OFF;
68     std::u16string imei_ = u"";
69     std::u16string meid_ = u"";
70     std::string basebandVersion_ = "";
71     NrMode nrMode_ = NrMode::NR_MODE_UNKNOWN;
72     int32_t rrcConnectionStatus_ = 0;
73     FrequencyType freqType_ = FrequencyType::FREQ_TYPE_UNKNOWN;
74     std::mutex mutex_;
75     bool isRadioFirstPowerOn_ = true;
76     bool airplaneMode_ = false;
77     int32_t preferredNetworkValue_ = 0;
78     int64_t serialNum_ = SERIAL_NUMBER_DEFAULT;
79     std::mutex msgNumMutex_;
80     std::mutex serialNumMutex_;
81     bool hasCall_ = false;
82 
83     bool RegisterSetting();
84     bool UnRegisterSetting();
85     bool RegisterDeviceStateObserver();
86     bool UnRegisterDeviceStateObserver();
InitNetworkSearchManagerInner87     bool Init()
88     {
89         if (networkSearchState_ != nullptr) {
90             if (!networkSearchState_->Init()) {
91                 return false;
92             }
93         }
94         if (networkSearchHandler_ != nullptr) {
95             if (!networkSearchHandler_->Init()) {
96                 return false;
97             }
98             if (!RegisterSetting()) {
99                 return false;
100             }
101         }
102         if (deviceStateHandler_ != nullptr) {
103             if (!RegisterDeviceStateObserver()) {
104                 return false;
105             }
106         }
107         state_ = HandleRunningState::STATE_RUNNING;
108         return true;
109     }
InitMsgNumNetworkSearchManagerInner110     inline void InitMsgNum()
111     {
112         std::lock_guard<std::mutex> lock(msgNumMutex_);
113         msgNum_ = MSG_NUM;
114     }
CheckIsNeedNotifyNetworkSearchManagerInner115     inline bool CheckIsNeedNotify()
116     {
117         std::lock_guard<std::mutex> lock(msgNumMutex_);
118         return msgNum_ == 0 ? true : false;
119     }
decMsgNumNetworkSearchManagerInner120     inline void decMsgNum()
121     {
122         std::lock_guard<std::mutex> lock(msgNumMutex_);
123         msgNum_--;
124     }
IncreaseSerialNumNetworkSearchManagerInner125     inline int64_t IncreaseSerialNum()
126     {
127         std::lock_guard<std::mutex> lock(serialNumMutex_);
128         if (serialNum_ >= SERIAL_NUMBER_THRESHOLD) {
129             // recycle the serial number.
130             serialNum_ = SERIAL_NUMBER_DEFAULT;
131         }
132         return ++serialNum_;
133     }
GetSerialNumNetworkSearchManagerInner134     inline int64_t GetSerialNum()
135     {
136         std::lock_guard<std::mutex> lock(serialNumMutex_);
137         return serialNum_;
138     }
139 };
140 
141 /**
142  * @brief manager class of network search module .The main entrance to the module.
143  *
144  */
145 class NetworkSearchManager : public INetworkSearch, public std::enable_shared_from_this<NetworkSearchManager> {
146 public:
147     NetworkSearchManager(std::shared_ptr<ITelRilManager> telRilManager, std::shared_ptr<ISimManager> simManager);
148     virtual ~NetworkSearchManager();
149 
150     bool OnInit() override;
151     void SetRadioState(int32_t slotId, bool isOn, int32_t rst) override;
152     int32_t SetRadioState(int32_t slotId, bool isOn, int32_t rst, NSCALLBACK &callback) override;
153     int32_t GetRadioState(int32_t slotId) override;
154     int32_t GetRadioState(int32_t slotId, NSCALLBACK &callback) override;
155     int32_t GetPsRadioTech(int32_t slotId, int32_t &psRadioTech) override;
156     int32_t GetCsRadioTech(int32_t slotId, int32_t &csRadioTech) override;
157     std::u16string GetOperatorNumeric(int32_t slotId) override;
158     int32_t GetOperatorName(int32_t slotId, std::u16string &operatorName) override;
159     int32_t GetNetworkStatus(int32_t slotId, sptr<NetworkState> &networkState) override;
160     int32_t GetSignalInfoList(int32_t slotId, std::vector<sptr<SignalInformation>> &signals) override;
161     void RegisterCoreNotify(int32_t slotId, HANDLE &handler, int32_t what) override;
162     void UnRegisterCoreNotify(int32_t slotId, HANDLE &handler, int32_t what) override;
163     void RegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> &callback) override;
164     void UnRegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> &callback) override;
165     void RegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> &callback) override;
166     void UnRegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> &callback) override;
167     int32_t GetNetworkSearchInformation(int32_t slotId, NSCALLBACK &callback) override;
168     int32_t GetNetworkSelectionMode(int32_t slotId, NSCALLBACK &callback) override;
169     int32_t SetNetworkSelectionMode(int32_t slotId, int32_t selectMode,
170         const sptr<NetworkInformation> &networkInformation, bool resumeSelection, NSCALLBACK &callback) override;
171     int32_t GetPreferredNetwork(int32_t slotId, NSCALLBACK &callback) override;
172     int32_t SetPreferredNetwork(int32_t slotId, int32_t networkMode, NSCALLBACK &callback) override;
173     int32_t GetIsoCountryCodeForNetwork(int32_t slotId, std::u16string &countryCode) override;
174     int32_t GetImei(int32_t slotId, std::u16string &imei) override;
175     int32_t GetPsRegState(int32_t slotId) override;
176     int32_t GetCsRegState(int32_t slotId) override;
177     int32_t GetPsRoamingState(int32_t slotId) override;
178     int32_t GetCellInfoList(int32_t slotId, std::vector<sptr<CellInformation>> &cellInfo) override;
179     int32_t SendUpdateCellLocationRequest(int32_t slotId) override;
180     sptr<CellLocation> GetCellLocation(int32_t slotId) override;
181     int32_t GetImsRegStatus(int32_t slotId, ImsServiceType imsSrvType, ImsRegInfo &info) override;
182     PhoneType GetPhoneType(int32_t slotId) override;
183     int32_t GetMeid(int32_t slotId, std::u16string &meid) override;
184     int32_t GetUniqueDeviceId(int32_t slotId, std::u16string &deviceId) override;
185     bool IsNrSupported(int32_t slotId) override;
186     bool IsSatelliteEnabled() override;
187     FrequencyType GetFrequencyType(int32_t slotId) override;
188     NrState GetNrState(int32_t slotId) override;
189     void DcPhysicalLinkActiveUpdate(int32_t slotId, bool isActive) override;
190     int32_t NotifyCallStatusToNetworkSearch(int32_t slotId, int32_t callStatus) override;
191     int32_t HandleNotifyStateChangeWithDelay(int32_t slotId, bool isNeedDelay) override;
192     bool IsNeedDelayNotify(int32_t slotId);
193     int32_t SetNrOptionMode(int32_t slotId, int32_t mode);
194     int32_t SetNrOptionMode(int32_t slotId, int32_t mode, NSCALLBACK &callback) override;
195     int32_t GetNrOptionMode(int32_t slotId, NrMode &mode) override;
196     int32_t GetNrOptionMode(int32_t slotId, NSCALLBACK &callback) override;
197     int32_t RegisterImsRegInfoCallback(int32_t slotId, ImsServiceType imsSrvType, const std::string &bundleName,
198         const sptr<ImsRegInfoCallback> &callback) override;
199     int32_t UnregisterImsRegInfoCallback(
200         int32_t slotId, ImsServiceType imsSrvType, const std::string &bundleName) override;
201     int32_t GetNetworkCapability(
202         int32_t slotId, int32_t networkCapabilityType, int32_t &networkCapabilityState) override;
203     int32_t SetNetworkCapability(
204         int32_t slotId, int32_t networkCapabilityType, int32_t networkCapabilityState) override;
205     int32_t FactoryReset(int32_t slotId) override;
206 
207     void NotifyPsRoamingOpenChanged(int32_t slotId);
208     void NotifyPsRoamingCloseChanged(int32_t slotId);
209     void NotifyPsConnectionAttachedChanged(int32_t slotId);
210     void NotifyPsConnectionDetachedChanged(int32_t slotId);
211     void NotifyPsRatChanged(int32_t slotId);
212     void NotifyEmergencyOpenChanged(int32_t slotId);
213     void NotifyEmergencyCloseChanged(int32_t slotId);
214     void NotifyNrStateChanged(int32_t slotId);
215     void NotifyNrFrequencyChanged(int32_t slotId);
216     void NotifyFactoryReset(int32_t slotId);
217     std::shared_ptr<NetworkSearchState> GetNetworkSearchState(int32_t slotId);
218     void TriggerSimRefresh(int32_t slotId);
219     void TriggerTimezoneRefresh(int32_t slotId);
220     void SetNetworkSearchResultValue(
221         int32_t slotId, int32_t listSize, const std::vector<NetworkInformation> &operatorInfo);
222     sptr<NetworkSearchResult> GetNetworkSearchInformationValue(int32_t slotId);
223     int32_t GetNetworkSelectionMode(int32_t slotId);
224     bool SetNetworkSelectionMode(
225         int32_t slotId, int32_t selectMode, const sptr<NetworkInformation> &networkInformation, bool resumeSelection);
226     void SetRadioStateValue(int32_t slotId, ModemPowerState radioState);
227     void SetNetworkSelectionValue(int32_t slotId, SelectionMode selection);
228     int32_t GetPreferredNetwork(int32_t slotId);
229     int32_t SetCachePreferredNetworkValue(int32_t slotId, int32_t networkMode);
230     int32_t GetCachePreferredNetworkValue(int32_t slotId, int32_t &networkMode);
231     bool SetPreferredNetwork(int32_t slotId, int32_t networkMode);
232     void SavePreferredNetworkValue(int32_t slotId, int32_t networkMode);
233     int32_t GetPreferredNetworkValue(int32_t slotId) const;
234     void UpdatePhone(int32_t slotId, RadioTech csRadioTech, const RadioTech &psRadioTech);
235     void SetImei(int32_t slotId, std::u16string imei);
236     void UpdateCellLocation(int32_t slotId, int32_t techType, int32_t cellId, int32_t lac);
237     void SetMeid(int32_t slotId, std::u16string meid);
238     void SetFrequencyType(int32_t slotId, FrequencyType type);
239     void GetVoiceTech(int32_t slotId);
240     std::shared_ptr<NetworkSearchManagerInner> FindManagerInner(int32_t slotId);
241     void SetLocateUpdate(int32_t slotId);
242     int32_t GetAirplaneMode(bool &airplaneMode) override;
243     int32_t ProcessNotifyStateChangeEvent(int32_t slotId);
244     bool IsRadioFirstPowerOn(int32_t slotId);
245     void SetRadioFirstPowerOn(int32_t slotId, bool isFirstPowerOn);
246     void NotifyImsRegInfoChanged(int32_t slotId, ImsServiceType imsSrvType, const ImsRegInfo &info);
247     void InitSimRadioProtocol(int32_t slotId);
248     int32_t SetLocalAirplaneMode(int32_t slotId, bool state);
249     int32_t GetLocalAirplaneMode(int32_t slotId, bool &state);
250     void SetBasebandVersion(int32_t slotId, std::string version);
251     int32_t GetBasebandVersion(int32_t slotId, std::string &version) override;
252     int32_t UpdateNrOptionMode(int32_t slotId, NrMode mode);
253     int32_t UpdateRadioOn(int32_t slotId) override;
254     int32_t HandleRrcStateChanged(int32_t slotId, int32_t status);
255     int32_t GetRrcConnectionState(int32_t slotId, int32_t &status) override;
256     int32_t UpdateRrcConnectionState(int32_t slotId, int32_t &status);
257     int32_t GetNrSsbId(int32_t slotId, const std::shared_ptr<NrSsbInformation> &nrSsbInformation) override;
258 
InitMsgNum(int32_t slotId)259     inline void InitMsgNum(int32_t slotId)
260     {
261         auto inner = FindManagerInner(slotId);
262         if (inner != nullptr) {
263             inner->InitMsgNum();
264         }
265     }
CheckIsNeedNotify(int32_t slotId)266     inline bool CheckIsNeedNotify(int32_t slotId)
267     {
268         auto inner = FindManagerInner(slotId);
269         if (inner != nullptr) {
270             return inner->CheckIsNeedNotify();
271         }
272         return false;
273     }
decMsgNum(int32_t slotId)274     inline void decMsgNum(int32_t slotId)
275     {
276         auto inner = FindManagerInner(slotId);
277         if (inner != nullptr) {
278             inner->decMsgNum();
279         }
280     }
IncreaseSerialNum(int32_t slotId)281     inline int64_t IncreaseSerialNum(int32_t slotId)
282     {
283         auto inner = FindManagerInner(slotId);
284         if (inner != nullptr) {
285             return inner->IncreaseSerialNum();
286         }
287         return NetworkSearchManagerInner::SERIAL_NUMBER_DEFAULT;
288     }
GetSerialNum(int32_t slotId)289     inline int64_t GetSerialNum(int32_t slotId)
290     {
291         auto inner = FindManagerInner(slotId);
292         if (inner != nullptr) {
293             return inner->GetSerialNum();
294         }
295         return NetworkSearchManagerInner::SERIAL_NUMBER_DEFAULT;
296     }
GetCellularDataCallBack()297     inline sptr<NetworkSearchCallBackBase> GetCellularDataCallBack()
298     {
299         return cellularDataCallBack_;
300     }
GetCellularCallCallBack()301     inline sptr<NetworkSearchCallBackBase> GetCellularCallCallBack()
302     {
303         return cellularCallCallBack_;
304     }
GetSimManager()305     inline std::shared_ptr<ISimManager> GetSimManager() const
306     {
307         return simManager_;
308     }
309 
310 public:
311     static std::mutex ctx_;
312     static bool ssbResponseReady_;
313     static std::condition_variable cv_;
314 
315 private:
316     bool InitPointer(std::shared_ptr<NetworkSearchManagerInner> &inner, int32_t slotId);
317     void ClearManagerInner();
318     void AddManagerInner(int32_t slotId, const std::shared_ptr<NetworkSearchManagerInner> &inner);
319     bool RemoveManagerInner(int32_t slotId);
320     int32_t GetDelayNotifyTime();
321     int32_t RevertLastTechnology(int32_t slotId);
322     int32_t ConvertNetworkModeToCapabilityType(int32_t preferredNetwork);
323 
324 private:
325     struct ImsRegInfoCallbackRecord {
326         int32_t slotId;
327         ImsServiceType imsSrvType;
328         std::string bundleName;
329         sptr<ImsRegInfoCallback> imsCallback;
330     };
331 
332     sptr<NetworkSearchCallBackBase> cellularDataCallBack_ = nullptr;
333     sptr<NetworkSearchCallBackBase> cellularCallCallBack_ = nullptr;
334     std::shared_ptr<ITelRilManager> telRilManager_ = nullptr;
335     std::shared_ptr<ISimManager> simManager_ = nullptr;
336     std::unique_ptr<EventSender> eventSender_ = nullptr;
337     std::map<int32_t, std::shared_ptr<NetworkSearchManagerInner>> mapManagerInner_;
338     std::list<ImsRegInfoCallbackRecord> listImsRegInfoCallbackRecord_;
339     std::mutex mutexInner_;
340     std::mutex mutexIms_;
341     int32_t delayTime_ = 0;
342 };
343 } // namespace Telephony
344 } // namespace OHOS
345 #endif // NETWORK_SEARCH_INCLUDE_NETWORK_SEARCH_MANAGER_H
346