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