• 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 #include "network_search_manager.h"
17 
18 #include <cinttypes>
19 #include <parameters.h>
20 #include <securec.h>
21 #include <string_ex.h>
22 
23 #include "core_service_errors.h"
24 #include "core_service_hisysevent.h"
25 #include "enum_convert.h"
26 #include "mcc_pool.h"
27 #include "network_search_types.h"
28 #include "operator_name_utils.h"
29 #include "parameter.h"
30 #include "satellite_service_client.h"
31 #include "telephony_common_utils.h"
32 #include "telephony_config.h"
33 #include "telephony_errors.h"
34 #include "telephony_ext_wrapper.h"
35 #include "telephony_log_wrapper.h"
36 #include "telephony_ext_wrapper.h"
37 
38 namespace OHOS {
39 namespace Telephony {
40 const size_t MCC_LEN = 3;
41 const int32_t SERVICE_TYPE_UNKNOWN = -1;
42 const int32_t SERVICE_TYPE_LTE = 0;
43 const int32_t SERVICE_TYPE_NR = 1;
44 const int32_t SERVICE_ABILITY_OFF = 0;
45 const int32_t SERVICE_ABILITY_ON = 1;
46 const int32_t SYS_PARAMETER_SIZE = 256;
47 const int32_t INVALID_DELAY_TIME = 0;
48 const int32_t SLOT_0 = 0;
49 const int32_t SLOT_1 = 1;
50 
51 constexpr const char *NO_DELAY_TIME__CONFIG = "0";
52 constexpr const char *CFG_TECH_UPDATE_TIME = "persist.radio.cfg.update.time";
53 constexpr static const int32_t GET_SSB_WAIT_TIME_SECOND = 5;
54 
NetworkSearchManager(std::shared_ptr<ITelRilManager> telRilManager,std::shared_ptr<ISimManager> simManager)55 NetworkSearchManager::NetworkSearchManager(
56     std::shared_ptr<ITelRilManager> telRilManager, std::shared_ptr<ISimManager> simManager)
57     : telRilManager_(telRilManager), simManager_(simManager)
58 {
59     TELEPHONY_LOGI("NetworkSearchManager");
60 }
61 
~NetworkSearchManager()62 NetworkSearchManager::~NetworkSearchManager()
63 {
64     for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; slotId++) {
65         std::shared_ptr<NetworkSearchManagerInner> inner = FindManagerInner(slotId);
66         if (inner != nullptr) {
67             inner->UnRegisterDeviceStateObserver();
68         }
69     }
70 }
71 
InitPointer(std::shared_ptr<NetworkSearchManagerInner> & inner,int32_t slotId)72 bool NetworkSearchManager::InitPointer(std::shared_ptr<NetworkSearchManagerInner> &inner, int32_t slotId)
73 {
74     if (inner == nullptr) {
75         TELEPHONY_LOGE("NetworkSearchManager::InitPointer failed . inner is null");
76         return false;
77     }
78     inner->observerHandler_ = std::make_unique<ObserverHandler>();
79     if (inner->observerHandler_ == nullptr) {
80         TELEPHONY_LOGE("failed to create new ObserverHandler slotId:%{public}d", slotId);
81         return false;
82     }
83     inner->networkSearchState_ = std::make_shared<NetworkSearchState>(shared_from_this(), slotId);
84     if (inner->networkSearchState_ == nullptr) {
85         TELEPHONY_LOGE("failed to create new NetworkSearchState slotId:%{public}d", slotId);
86         return false;
87     }
88     inner->networkSearchHandler_ =
89         std::make_shared<NetworkSearchHandler>(shared_from_this(), telRilManager_, simManager_, slotId);
90     if (inner->networkSearchHandler_ == nullptr) {
91         TELEPHONY_LOGE("failed to create new NetworkSearchHandler slotId:%{public}d", slotId);
92         return false;
93     }
94     inner->networkSearchResult_ = std::make_unique<NetworkSearchResult>();
95     if (inner->networkSearchResult_ == nullptr) {
96         TELEPHONY_LOGE("failed to create new NetworkSearchResult slotId:%{public}d", slotId);
97         return false;
98     }
99     inner->deviceStateHandler_ = std::make_shared<DeviceStateHandler>(shared_from_this(), telRilManager_, slotId);
100     if (inner->deviceStateHandler_ == nullptr) {
101         TELEPHONY_LOGE("failed to create new DeviceStateHandler slotId:%{public}d", slotId);
102         return false;
103     }
104 
105     return true;
106 }
107 
RegisterSetting()108 bool NetworkSearchManagerInner::RegisterSetting()
109 {
110     settingAutoTimeObserver_ = new AutoTimeObserver(networkSearchHandler_);
111     airplaneModeObserver_ = new AirplaneModeObserver(networkSearchHandler_);
112     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
113     if (settingAutoTimeObserver_ == nullptr || airplaneModeObserver_ == nullptr || settingHelper == nullptr) {
114         TELEPHONY_LOGE("NetworkSearchManager::RegisterSetting is null.");
115         return false;
116     }
117 
118     Uri autoTimeUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIME_URI);
119     Uri airplaneModeUri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
120     settingHelper->RegisterSettingsObserver(autoTimeUri, settingAutoTimeObserver_);
121     settingHelper->RegisterSettingsObserver(airplaneModeUri, airplaneModeObserver_);
122     if (TELEPHONY_EXT_WRAPPER.updateCountryCodeExt_ == nullptr) {
123         settingAutoTimezoneObserver_ = new AutoTimezoneObserver(networkSearchHandler_);
124         if (settingAutoTimezoneObserver_ == nullptr) {
125             TELEPHONY_LOGE("NetworkSearchManager::RegisterSetting is null.");
126             return false;
127         }
128         Uri autoTimezoneUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIMEZONE_URI);
129         settingHelper->RegisterSettingsObserver(autoTimezoneUri, settingAutoTimezoneObserver_);
130     }
131     return true;
132 }
133 
UnRegisterSetting()134 bool NetworkSearchManagerInner::UnRegisterSetting()
135 {
136     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
137     if (settingHelper == nullptr) {
138         TELEPHONY_LOGE("NetworkSearchManager::UnRegisterSetting is null.");
139         return false;
140     }
141 
142     Uri autoTimeUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIME_URI);
143     Uri airplaneModeUri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
144     settingHelper->UnRegisterSettingsObserver(autoTimeUri, settingAutoTimeObserver_);
145     settingHelper->UnRegisterSettingsObserver(airplaneModeUri, airplaneModeObserver_);
146     if (settingAutoTimezoneObserver_ != nullptr) {
147         Uri autoTimezoneUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIMEZONE_URI);
148         settingHelper->UnRegisterSettingsObserver(autoTimezoneUri, settingAutoTimezoneObserver_);
149     }
150     return true;
151 }
152 
RegisterDeviceStateObserver()153 bool NetworkSearchManagerInner::RegisterDeviceStateObserver()
154 {
155     deviceStateObserver_ = std::make_shared<DeviceStateObserver>();
156     deviceStateObserver_->StartEventSubscriber(deviceStateHandler_);
157     return true;
158 }
159 
UnRegisterDeviceStateObserver()160 bool NetworkSearchManagerInner::UnRegisterDeviceStateObserver()
161 {
162     if (deviceStateObserver_ == nullptr) {
163         TELEPHONY_LOGE("NetworkSearchManager::UnRegisterDeviceStateObserver deviceStateObserver_ is null.");
164         return false;
165     }
166     deviceStateObserver_->StopEventSubscriber();
167     return true;
168 }
169 
OnInit()170 bool NetworkSearchManager::OnInit()
171 {
172     TELEPHONY_LOGI("NetworkSearchManager::Init");
173     if (telRilManager_ == nullptr) {
174         TELEPHONY_LOGE("NetworkSearchManager::Init telRilManager_ is null.");
175         return false;
176     }
177     if (simManager_ == nullptr) {
178         TELEPHONY_LOGE("NetworkSearchManager::Init simManager_ is null.");
179         return false;
180     }
181     eventSender_ = std::make_unique<EventSender>(telRilManager_, shared_from_this());
182     if (eventSender_ == nullptr) {
183         TELEPHONY_LOGE("failed to create new EventSender");
184         return false;
185     }
186     ClearManagerInner();
187     for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; slotId++) {
188         InitModuleBySlotId(slotId);
189     }
190     delayTime_ = GetDelayNotifyTime();
191     TELEPHONY_LOGI("NetworkSearchManager::Init success");
192     return true;
193 }
194 
InitTelExtraModule(int32_t slotId)195 int32_t NetworkSearchManager::InitTelExtraModule(int32_t slotId)
196 {
197     return InitModuleBySlotId(slotId);
198 }
199 
InitModuleBySlotId(int32_t slotId)200 int32_t NetworkSearchManager::InitModuleBySlotId(int32_t slotId)
201 {
202     if (slotId < 0 || slotId > SIM_SLOT_COUNT) {
203         return TELEPHONY_ERROR;
204     }
205     std::shared_ptr<NetworkSearchManagerInner> inner = FindManagerInner(slotId);
206     if (inner == nullptr) {
207         inner = std::make_shared<NetworkSearchManagerInner>();
208         AddManagerInner(slotId, inner);
209     } else {
210         return TELEPHONY_SUCCESS; // has been added
211     }
212     if (inner != nullptr && eventSender_ != nullptr) {
213         if (inner->state_ == HandleRunningState::STATE_RUNNING) {
214             TELEPHONY_LOGE("NetworkSearchManager::Init HandleRunningState is running. slotId:%{public}d", slotId);
215             return TELEPHONY_ERROR;
216         }
217         if (!InitPointer(inner, slotId)) {
218             ClearManagerInner();
219             return TELEPHONY_ERROR;
220         }
221         if (!inner->Init()) {
222             ClearManagerInner();
223             return TELEPHONY_ERROR;
224         }
225         // Prevent running crash and query the radio status at startup
226         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_STATUS);
227         return TELEPHONY_SUCCESS;
228     }
229     return TELEPHONY_ERROR;
230 }
231 
GetNetworkSearchState(int32_t slotId)232 std::shared_ptr<NetworkSearchState> NetworkSearchManager::GetNetworkSearchState(int32_t slotId)
233 {
234     auto inner = FindManagerInner(slotId);
235     if (inner != nullptr) {
236         TELEPHONY_LOGD("NetworkSearchManager::GetNetworkSearchState slotId:%{public}d", slotId);
237         return inner->networkSearchState_;
238     }
239     return nullptr;
240 }
241 
SetRadioState(int32_t slotId,bool isOn,int32_t rst)242 void NetworkSearchManager::SetRadioState(int32_t slotId, bool isOn, int32_t rst)
243 {
244     TELEPHONY_LOGD("NetworkSearchManager SetRadioState isOn:%{public}d slotId:%{public}d", isOn, slotId);
245     if (eventSender_ == nullptr) {
246         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
247         return;
248     }
249     int32_t fun = static_cast<int32_t>(isOn);
250     eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_STATUS, fun, rst);
251 }
252 
SetRadioState(int32_t slotId,bool isOn,int32_t rst,NSCALLBACK & callback)253 int32_t NetworkSearchManager::SetRadioState(int32_t slotId, bool isOn, int32_t rst, NSCALLBACK &callback)
254 {
255     TELEPHONY_LOGD("NetworkSearchManager SetRadioState isOn:%{public}d slotId:%{public}d", isOn, slotId);
256     if (eventSender_ == nullptr) {
257         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
258         return TELEPHONY_ERR_LOCAL_PTR_NULL;
259     }
260     int32_t fun = static_cast<int32_t>(isOn);
261     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_SET_STATUS, &callback, fun, rst)) {
262         TELEPHONY_LOGE("slotId:%{public}d SetRadioState SendCallback failed.", slotId);
263         return CORE_SERVICE_SEND_CALLBACK_FAILED;
264     }
265     return TELEPHONY_ERR_SUCCESS;
266 }
267 
RegisterCoreNotify(int32_t slotId,HANDLE & handler,int32_t what)268 void NetworkSearchManager::RegisterCoreNotify(int32_t slotId, HANDLE &handler, int32_t what)
269 {
270     TELEPHONY_LOGD("NetworkSearchManager::RegisterCoreNotify %{public}d slotId:%{public}d", what, slotId);
271     auto inner = FindManagerInner(slotId);
272     if (inner != nullptr) {
273         if (inner->observerHandler_ != nullptr) {
274             inner->observerHandler_->RegObserver(what, handler);
275         }
276     }
277 }
278 
UnRegisterCoreNotify(int32_t slotId,HANDLE & handler,int32_t what)279 void NetworkSearchManager::UnRegisterCoreNotify(int32_t slotId, HANDLE &handler, int32_t what)
280 {
281     TELEPHONY_LOGD("NetworkSearchManager::UnRegisterCoreNotify %{public}d slotId:%{public}d", what, slotId);
282     auto inner = FindManagerInner(slotId);
283     if (inner != nullptr) {
284         if (inner->observerHandler_ != nullptr) {
285             inner->observerHandler_->Remove(what, handler);
286         }
287     }
288 }
289 
RegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> & callback)290 void NetworkSearchManager::RegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> &callback)
291 {
292     cellularDataCallBack_ = callback;
293 }
294 
UnRegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> & callback)295 void NetworkSearchManager::UnRegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> &callback)
296 {
297     cellularDataCallBack_ = nullptr;
298 }
299 
RegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> & callback)300 void NetworkSearchManager::RegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> &callback)
301 {
302     cellularCallCallBack_ = callback;
303 }
304 
UnRegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> & callback)305 void NetworkSearchManager::UnRegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> &callback)
306 {
307     cellularCallCallBack_ = nullptr;
308 }
309 
NotifyPsRoamingOpenChanged(int32_t slotId)310 void NetworkSearchManager::NotifyPsRoamingOpenChanged(int32_t slotId)
311 {
312     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsRoamingOpenChanged slotId:%{public}d", slotId);
313     auto inner = FindManagerInner(slotId);
314     if (inner != nullptr) {
315         if (inner->observerHandler_ != nullptr) {
316             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_ROAMING_OPEN);
317         }
318     }
319 }
320 
NotifyPsRoamingCloseChanged(int32_t slotId)321 void NetworkSearchManager::NotifyPsRoamingCloseChanged(int32_t slotId)
322 {
323     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsRoamingCloseChanged slotId:%{public}d", slotId);
324     auto inner = FindManagerInner(slotId);
325     if (inner != nullptr) {
326         if (inner->observerHandler_ != nullptr) {
327             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_ROAMING_CLOSE);
328         }
329     }
330 }
331 
NotifyEmergencyOpenChanged(int32_t slotId)332 void NetworkSearchManager::NotifyEmergencyOpenChanged(int32_t slotId)
333 {
334     TELEPHONY_LOGD("NetworkSearchManager::NotifyEmergencyOpenChanged slotId:%{public}d", slotId);
335     auto inner = FindManagerInner(slotId);
336     if (inner != nullptr) {
337         if (inner->observerHandler_ != nullptr) {
338             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_EMERGENCY_STATE_OPEN);
339         }
340     }
341 }
342 
NotifyEmergencyCloseChanged(int32_t slotId)343 void NetworkSearchManager::NotifyEmergencyCloseChanged(int32_t slotId)
344 {
345     TELEPHONY_LOGD("NetworkSearchManager::NotifyEmergencyCloseChanged slotId:%{public}d", slotId);
346     auto inner = FindManagerInner(slotId);
347     if (inner != nullptr) {
348         if (inner->observerHandler_ != nullptr) {
349             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_EMERGENCY_STATE_CLOSE);
350         }
351     }
352 }
353 
NotifyPsRatChanged(int32_t slotId)354 void NetworkSearchManager::NotifyPsRatChanged(int32_t slotId)
355 {
356     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsRatChanged slotId:%{public}d", slotId);
357     auto inner = FindManagerInner(slotId);
358     if (inner != nullptr) {
359         if (inner->observerHandler_ != nullptr) {
360             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_RAT_CHANGED);
361         }
362     }
363 }
364 
NotifyPsConnectionAttachedChanged(int32_t slotId)365 void NetworkSearchManager::NotifyPsConnectionAttachedChanged(int32_t slotId)
366 {
367     auto inner = FindManagerInner(slotId);
368     if (inner != nullptr) {
369         if (inner->observerHandler_ != nullptr) {
370             TELEPHONY_LOGI("NetworkSearchManager::NotifyPsConnectionAttachedChanged slotId:%{public}d", slotId);
371             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_CONNECTION_ATTACHED);
372         }
373     }
374 }
375 
NotifyPsConnectionDetachedChanged(int32_t slotId)376 void NetworkSearchManager::NotifyPsConnectionDetachedChanged(int32_t slotId)
377 {
378     auto inner = FindManagerInner(slotId);
379     if (inner != nullptr) {
380         if (inner->observerHandler_ != nullptr) {
381             TELEPHONY_LOGI("NetworkSearchManager::NotifyPsConnectionDetachedChanged slotId:%{public}d", slotId);
382             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_CONNECTION_DETACHED);
383         }
384     }
385 }
386 
NotifyNrStateChanged(int32_t slotId)387 void NetworkSearchManager::NotifyNrStateChanged(int32_t slotId)
388 {
389     TELEPHONY_LOGD("NetworkSearchManager::NotifyNrStateChanged slotId:%{public}d", slotId);
390     auto inner = FindManagerInner(slotId);
391     if (inner != nullptr) {
392         if (inner->observerHandler_ != nullptr) {
393             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_NR_STATE_CHANGED);
394         }
395     }
396 }
397 
NotifyNrFrequencyChanged(int32_t slotId)398 void NetworkSearchManager::NotifyNrFrequencyChanged(int32_t slotId)
399 {
400     TELEPHONY_LOGD("NetworkSearchManager::NotifyNrFrequencyChanged slotId:%{public}d", slotId);
401     auto inner = FindManagerInner(slotId);
402     if (inner != nullptr) {
403         if (inner->observerHandler_ != nullptr) {
404             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_NR_FREQUENCY_CHANGED);
405         }
406     }
407 }
408 
NotifyFactoryReset(int32_t slotId)409 void NetworkSearchManager::NotifyFactoryReset(int32_t slotId)
410 {
411     TELEPHONY_LOGD("NotifyFactoryReset slotId:%{public}d", slotId);
412     auto inner = FindManagerInner(slotId);
413     if (inner != nullptr) {
414         if (inner->observerHandler_ != nullptr) {
415             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_FACTORY_RESET);
416         }
417     }
418 }
419 
GetPsRadioTech(int32_t slotId,int32_t & psRadioTech)420 int32_t NetworkSearchManager::GetPsRadioTech(int32_t slotId, int32_t &psRadioTech)
421 {
422     auto inner = FindManagerInner(slotId);
423     if (inner == nullptr) {
424         TELEPHONY_LOGE("NetworkSearchManager::GetPsRadioTech Failed slotId:%{public}d", slotId);
425         return TELEPHONY_ERR_LOCAL_PTR_NULL;
426     }
427     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
428         TELEPHONY_LOGE("NetworkSearchManager::GetPsRadioTech failed due to nullptr!");
429         return TELEPHONY_ERR_LOCAL_PTR_NULL;
430     }
431     psRadioTech = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetPsRadioTech());
432     if (TELEPHONY_EXT_WRAPPER.getRadioTechExt_ != nullptr) {
433         TELEPHONY_EXT_WRAPPER.getRadioTechExt_(slotId, psRadioTech);
434     }
435     TELEPHONY_LOGD("NetworkSearchManager::GetPsRadioTech result=%{public}d slotId:%{public}d", psRadioTech, slotId);
436     return TELEPHONY_ERR_SUCCESS;
437 }
438 
GetCsRadioTech(int32_t slotId,int32_t & csRadioTech)439 int32_t NetworkSearchManager::GetCsRadioTech(int32_t slotId, int32_t &csRadioTech)
440 {
441     auto inner = FindManagerInner(slotId);
442     if (inner == nullptr) {
443         TELEPHONY_LOGE("NetworkSearchManager::GetCsRadioTech Failed slotId:%{public}d", slotId);
444         return TELEPHONY_ERR_LOCAL_PTR_NULL;
445     }
446     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
447         TELEPHONY_LOGE("NetworkSearchManager::GetCsRadioTech failed due to nullptr!");
448         return TELEPHONY_ERR_LOCAL_PTR_NULL;
449     }
450     csRadioTech = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetCsRadioTech());
451     if (TELEPHONY_EXT_WRAPPER.getRadioTechExt_ != nullptr) {
452         TELEPHONY_EXT_WRAPPER.getRadioTechExt_(slotId, csRadioTech);
453     }
454     TELEPHONY_LOGD("NetworkSearchManager::GetCsRadioTech result=%{public}d slotId:%{public}d", csRadioTech, slotId);
455     return TELEPHONY_ERR_SUCCESS;
456 }
457 
GetPsRegState(int32_t slotId)458 int32_t NetworkSearchManager::GetPsRegState(int32_t slotId)
459 {
460     auto inner = FindManagerInner(slotId);
461     if (inner != nullptr) {
462         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
463             auto event = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetPsRegStatus());
464             auto iter = regServiceStateMap_.find(event);
465             TELEPHONY_LOGD("NetworkSearchManager::GetPsRegState regState=%{public}s(%{public}d) slotId:%{public}d",
466                 iter->second.c_str(), event, slotId);
467             return event;
468         }
469         TELEPHONY_LOGE("NetworkSearchManager::GetPsRegState failed due to nullptr!");
470     }
471     TELEPHONY_LOGE("NetworkSearchManager::GetPsRegState Failed slotId:%{public}d", slotId);
472     return TELEPHONY_ERROR;
473 }
474 
GetCsRegState(int32_t slotId)475 int32_t NetworkSearchManager::GetCsRegState(int32_t slotId)
476 {
477     auto inner = FindManagerInner(slotId);
478     if (inner != nullptr) {
479         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
480             auto event = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetCsRegStatus());
481             auto iter = regServiceStateMap_.find(event);
482             TELEPHONY_LOGD("NetworkSearchManager::GetCsRegState regState=%{public}s(%{public}d) slotId:%{public}d",
483                 iter->second.c_str(), event, slotId);
484             return event;
485         }
486         TELEPHONY_LOGE("NetworkSearchManager::GetCsRegState failed due to nullptr!");
487     }
488     TELEPHONY_LOGE("NetworkSearchManager::GetCsRegState Failed slotId:%{public}d", slotId);
489     return TELEPHONY_ERROR;
490 }
491 
GetPsRoamingState(int32_t slotId)492 int32_t NetworkSearchManager::GetPsRoamingState(int32_t slotId)
493 {
494     auto inner = FindManagerInner(slotId);
495     if (inner != nullptr) {
496         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
497             auto event = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetPsRoamingStatus());
498             TELEPHONY_LOGD(
499                 "NetworkSearchManager::GetPsRoamingState result=%{public}d slotId:%{public}d", event, slotId);
500             return event;
501         }
502         TELEPHONY_LOGE("NetworkSearchManager::GetPsRoamingState failed due to nullptr!");
503     }
504     TELEPHONY_LOGE("NetworkSearchManager::GetPsRoamingState Failed slotId:%{public}d", slotId);
505     return TELEPHONY_ERROR;
506 }
507 
GetOperatorNumeric(int32_t slotId)508 std::u16string NetworkSearchManager::GetOperatorNumeric(int32_t slotId)
509 {
510     TELEPHONY_LOGD("NetworkSearchManager::GetOperatorNumeric start slotId:%{public}d", slotId);
511     std::u16string str;
512     auto inner = FindManagerInner(slotId);
513     if (inner != nullptr) {
514         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
515             auto event = inner->networkSearchState_->GetNetworkStatus()->GetPlmnNumeric();
516             str = Str8ToStr16(event);
517             TELEPHONY_LOGD(
518                 "NetworkSearchManager::GetOperatorNumeric result=%{public}s slotId:%{public}d", event.c_str(), slotId);
519         }
520     }
521     return str;
522 }
523 
GetOperatorName(int32_t slotId,std::u16string & operatorName)524 int32_t NetworkSearchManager::GetOperatorName(int32_t slotId, std::u16string &operatorName)
525 {
526     operatorName = u"";
527     auto inner = FindManagerInner(slotId);
528     if (inner == nullptr) {
529         return TELEPHONY_ERR_SLOTID_INVALID;
530     }
531     if (inner->networkSearchState_ == nullptr) {
532         return TELEPHONY_ERR_SLOTID_INVALID;
533     }
534     if (inner->networkSearchState_->GetNetworkStatus() == nullptr) {
535         return TELEPHONY_ERR_SLOTID_INVALID;
536     }
537     auto longOperatorName = inner->networkSearchState_->GetNetworkStatus()->GetLongOperatorName();
538     operatorName = Str8ToStr16(longOperatorName);
539     TELEPHONY_LOGD("NetworkSearchManager::GetOperatorName result:%{public}s slotId:%{public}d",
540         longOperatorName.c_str(), slotId);
541     return TELEPHONY_ERR_SUCCESS;
542 }
543 
GetNetworkStatus(int32_t slotId,sptr<NetworkState> & networkState)544 int32_t NetworkSearchManager::GetNetworkStatus(int32_t slotId, sptr<NetworkState> &networkState)
545 {
546     auto inner = FindManagerInner(slotId);
547     if (inner != nullptr) {
548         if (inner->networkSearchState_ != nullptr) {
549             networkState = inner->networkSearchState_->GetNetworkStatus().release();
550             if (TELEPHONY_EXT_WRAPPER.getNetworkStatusExt_ != nullptr) {
551                 TELEPHONY_EXT_WRAPPER.getNetworkStatusExt_(slotId, networkState);
552             }
553             return TELEPHONY_ERR_SUCCESS;
554         }
555     }
556     return TELEPHONY_ERR_SLOTID_INVALID;
557 }
558 
SetRadioStateValue(int32_t slotId,ModemPowerState radioState)559 void NetworkSearchManager::SetRadioStateValue(int32_t slotId, ModemPowerState radioState)
560 {
561     auto inner = FindManagerInner(slotId);
562     if (inner != nullptr) {
563         ModemPowerState radioStateOld = inner->radioState_;
564         inner->radioState_ = radioState;
565         if (radioStateOld != radioState) {
566             CoreServiceHiSysEvent::WriteRadioStateBehaviorEvent(slotId, static_cast<int32_t>(radioState));
567         }
568     }
569 }
570 
SetNetworkSelectionValue(int32_t slotId,SelectionMode selection)571 void NetworkSearchManager::SetNetworkSelectionValue(int32_t slotId, SelectionMode selection)
572 {
573     auto inner = FindManagerInner(slotId);
574     if (inner != nullptr) {
575         inner->selection_ = selection;
576     }
577 }
578 
GetRadioState(int32_t slotId)579 int32_t NetworkSearchManager::GetRadioState(int32_t slotId)
580 {
581     auto inner = FindManagerInner(slotId);
582     if (inner != nullptr) {
583         return inner->radioState_;
584     }
585     return ModemPowerState::CORE_SERVICE_POWER_NOT_AVAILABLE;
586 }
587 
GetRadioState(int32_t slotId,NSCALLBACK & callback)588 int32_t NetworkSearchManager::GetRadioState(int32_t slotId, NSCALLBACK &callback)
589 {
590     TELEPHONY_LOGD("NetworkSearchManager::GetRadioState... slotId:%{public}d", slotId);
591     if (eventSender_ == nullptr) {
592         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
593         return TELEPHONY_ERR_LOCAL_PTR_NULL;
594     }
595     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_GET_STATUS, &callback)) {
596         TELEPHONY_LOGE("slotId:%{public}d GetRadioState SendCallback failed.", slotId);
597         return CORE_SERVICE_SEND_CALLBACK_FAILED;
598     }
599     return TELEPHONY_ERR_SUCCESS;
600 }
601 
GetSignalInfoList(int32_t slotId,std::vector<sptr<SignalInformation>> & signals)602 int32_t NetworkSearchManager::GetSignalInfoList(int32_t slotId, std::vector<sptr<SignalInformation>> &signals)
603 {
604     auto inner = FindManagerInner(slotId);
605     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
606         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
607         return TELEPHONY_ERR_LOCAL_PTR_NULL;
608     }
609     inner->networkSearchHandler_->GetSignalInfo(signals);
610     if (signals.empty()) {
611         return TELEPHONY_ERR_SUCCESS;
612     }
613     if (TELEPHONY_EXT_WRAPPER.getSignalInfoListExt_ != nullptr) {
614         TELEPHONY_EXT_WRAPPER.getSignalInfoListExt_(slotId, signals);
615     }
616     if (TELEPHONY_EXT_WRAPPER.sortSignalInfoListExt_ != nullptr) {
617         TELEPHONY_EXT_WRAPPER.sortSignalInfoListExt_(slotId, signals);
618     }
619     return TELEPHONY_ERR_SUCCESS;
620 }
621 
GetNetworkSearchInformation(int32_t slotId,NSCALLBACK & callback)622 int32_t NetworkSearchManager::GetNetworkSearchInformation(int32_t slotId, NSCALLBACK &callback)
623 {
624     if (eventSender_ == nullptr) {
625         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
626         return TELEPHONY_ERR_LOCAL_PTR_NULL;
627     }
628     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_NETWORK_SEARCH_RESULT, &callback)) {
629         TELEPHONY_LOGE("slotId:%{public}d GetNetworkSearchInformation SendCallback failed.", slotId);
630         return CORE_SERVICE_SEND_CALLBACK_FAILED;
631     }
632     return TELEPHONY_ERR_SUCCESS;
633 }
634 
SetNetworkSearchResultValue(int32_t slotId,int32_t listSize,const std::vector<NetworkInformation> & operatorInfo)635 void NetworkSearchManager::SetNetworkSearchResultValue(
636     int32_t slotId, int32_t listSize, const std::vector<NetworkInformation> &operatorInfo)
637 {
638     auto inner = FindManagerInner(slotId);
639     if (inner != nullptr) {
640         if (inner->networkSearchResult_ != nullptr) {
641             inner->networkSearchResult_->SetNetworkSearchResultValue(listSize, operatorInfo);
642         }
643     }
644 }
645 
GetNetworkSearchInformationValue(int32_t slotId)646 sptr<NetworkSearchResult> NetworkSearchManager::GetNetworkSearchInformationValue(int32_t slotId)
647 {
648     sptr<NetworkSearchResult> networkSearchResult = new (std::nothrow) NetworkSearchResult;
649     if (networkSearchResult == nullptr) {
650         TELEPHONY_LOGE(
651             "GetNetworkSearchInformationValue failed to create new NetWorkSearchResult slotId:%{public}d", slotId);
652         return nullptr;
653     }
654 
655     auto inner = FindManagerInner(slotId);
656     if (inner != nullptr) {
657         if (inner->networkSearchResult_ == nullptr) {
658             TELEPHONY_LOGE("GetNetworkSearchInformationValue networkSearchResult_ is null slotId:%{public}d", slotId);
659             return nullptr;
660         }
661 
662         int32_t listSize = inner->networkSearchResult_->GetNetworkSearchInformationSize();
663         std::vector<NetworkInformation> operatorInfoList = inner->networkSearchResult_->GetNetworkSearchInformation();
664         networkSearchResult->SetNetworkSearchResultValue(listSize, operatorInfoList);
665         return networkSearchResult;
666     }
667     return nullptr;
668 }
669 
GetNetworkSelectionMode(int32_t slotId)670 int32_t NetworkSearchManager::GetNetworkSelectionMode(int32_t slotId)
671 {
672     auto inner = FindManagerInner(slotId);
673     if (inner != nullptr && eventSender_ != nullptr) {
674         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_NETWORK_SELECTION_MODE);
675         return static_cast<int32_t>(inner->selection_);
676     }
677     return static_cast<int32_t>(SelectionMode::MODE_TYPE_UNKNOWN);
678 }
679 
GetNetworkSelectionMode(int32_t slotId,NSCALLBACK & callback)680 int32_t NetworkSearchManager::GetNetworkSelectionMode(int32_t slotId, NSCALLBACK &callback)
681 {
682     if (eventSender_ == nullptr) {
683         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
684         return TELEPHONY_ERR_LOCAL_PTR_NULL;
685     }
686 
687     bool ret = eventSender_->SendCallback(slotId, RadioEvent::RADIO_GET_NETWORK_SELECTION_MODE, &callback);
688     if (!ret) {
689         TELEPHONY_LOGE("slotId:%{public}d GetNetworkSelectionMode SendCallback failed.", slotId);
690         return CORE_SERVICE_SEND_CALLBACK_FAILED;
691     }
692     return TELEPHONY_ERR_SUCCESS;
693 }
694 
SetNetworkSelectionMode(int32_t slotId,int32_t selectMode,const sptr<NetworkInformation> & networkInformation,bool resumeSelection)695 bool NetworkSearchManager::SetNetworkSelectionMode(
696     int32_t slotId, int32_t selectMode, const sptr<NetworkInformation> &networkInformation, bool resumeSelection)
697 {
698     TELEPHONY_LOGD(
699         "NetworkSearchManager SetNetworkSelectionMode selectMode:%{public}d slotId:%{public}d", selectMode, slotId);
700     if (eventSender_ == nullptr) {
701         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
702         return false;
703     }
704     std::string plmnNumeric = "";
705     std::string operatorCurrentRadio = "";
706     std::string operatorInfo = "";
707     if (networkInformation != nullptr) {
708         plmnNumeric = networkInformation->GetOperatorNumeric();
709         operatorCurrentRadio = std::to_string(networkInformation->GetRadioTech());
710         operatorInfo = plmnNumeric + "," + operatorCurrentRadio;
711     }
712     return eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_NETWORK_SELECTION_MODE, selectMode, operatorInfo);
713 }
714 
SetNetworkSelectionMode(int32_t slotId,int32_t selectMode,const sptr<NetworkInformation> & networkInformation,bool resumeSelection,NSCALLBACK & callback)715 int32_t NetworkSearchManager::SetNetworkSelectionMode(int32_t slotId, int32_t selectMode,
716     const sptr<NetworkInformation> &networkInformation, bool resumeSelection, NSCALLBACK &callback)
717 {
718     TELEPHONY_LOGD(
719         "NetworkSearchManager SetNetworkSelectionMode selectMode:%{public}d slotId:%{public}d", selectMode, slotId);
720     if (eventSender_ == nullptr) {
721         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
722         return TELEPHONY_ERR_LOCAL_PTR_NULL;
723     }
724     std::string plmnNumeric = "";
725     std::string operatorCurrentRadio = "";
726     std::string operatorInfo = "";
727     if (networkInformation != nullptr) {
728         plmnNumeric = networkInformation->GetOperatorNumeric();
729         operatorCurrentRadio = std::to_string(networkInformation->GetRadioTech());
730         operatorInfo = plmnNumeric + "," + operatorCurrentRadio;
731     }
732     bool ret = eventSender_->SendCallback(
733         slotId, RadioEvent::RADIO_SET_NETWORK_SELECTION_MODE, &callback, selectMode, operatorInfo);
734     if (!ret) {
735         TELEPHONY_LOGE("slotId:%{public}d SetNetworkSelectionMode SendCallback failed.", slotId);
736         return CORE_SERVICE_SEND_CALLBACK_FAILED;
737     }
738     return TELEPHONY_ERR_SUCCESS;
739 }
740 
GetIsoCountryCodeForNetwork(int32_t slotId,std::u16string & countryCode)741 int32_t NetworkSearchManager::GetIsoCountryCodeForNetwork(int32_t slotId, std::u16string &countryCode)
742 {
743     std::string iso = "";
744     countryCode = u"";
745     auto inner = FindManagerInner(slotId);
746     if ((inner == nullptr) || (inner->networkSearchHandler_ == nullptr)) {
747         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
748         return TELEPHONY_ERR_LOCAL_PTR_NULL;
749     }
750 
751     if (inner->networkSearchState_ == nullptr || inner->networkSearchState_->GetNetworkStatus() == nullptr) {
752         TELEPHONY_LOGE(
753             "NetworkSearchManager::GetIsoCountryCodeForNetwork Failed due to nullptr, slotId:%{public}d", slotId);
754         return TELEPHONY_ERR_LOCAL_PTR_NULL;
755     }
756     std::string plmn = inner->networkSearchState_->GetNetworkStatus()->GetPlmnNumeric();
757     size_t len = plmn.length();
758     if (len >= MCC_LEN) {
759         std::string mcc = plmn.substr(0, MCC_LEN);
760         int32_t value = 0;
761         bool succ = StrToInt(mcc, value);
762         if (succ) {
763             iso = MccPool::MccCountryCode(value);
764         } else {
765             TELEPHONY_LOGE("GetIsoCountryCodeForNetwork parse Failed!! slotId:%{public}d", slotId);
766         }
767         TELEPHONY_LOGD(
768             "NetworkSearchManager::GetIsoCountryCodeForNetwork mcc=%{public}s code=%{public}d slotId:%{public}d",
769             mcc.c_str(), value, slotId);
770     }
771 
772     countryCode = Str8ToStr16(iso);
773     return TELEPHONY_ERR_SUCCESS;
774 }
775 
GetPreferredNetwork(int32_t slotId,NSCALLBACK & callback)776 int32_t NetworkSearchManager::GetPreferredNetwork(int32_t slotId, NSCALLBACK &callback)
777 {
778     if (eventSender_ == nullptr) {
779         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
780         return TELEPHONY_ERR_LOCAL_PTR_NULL;
781     }
782     bool isChipsetNetworkExtSupported = true;
783     if (TELEPHONY_EXT_WRAPPER.isChipsetNetworkExtSupported_ != nullptr) {
784         isChipsetNetworkExtSupported = TELEPHONY_EXT_WRAPPER.isChipsetNetworkExtSupported_();
785     }
786     if (!eventSender_->SendCallbackNetworkExt(slotId, RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE, &callback,
787         isChipsetNetworkExtSupported)) {
788         TELEPHONY_LOGE("slotId:%{public}d GetPreferredNetwork SendCallback failed.", slotId);
789         return CORE_SERVICE_SEND_CALLBACK_FAILED;
790     }
791     return TELEPHONY_ERR_SUCCESS;
792 }
793 
SetPreferredNetwork(int32_t slotId,int32_t networkMode,NSCALLBACK & callback)794 int32_t NetworkSearchManager::SetPreferredNetwork(int32_t slotId, int32_t networkMode, NSCALLBACK &callback)
795 {
796     if (simManager_ == nullptr) {
797         TELEPHONY_LOGE("SetPreferredNetwork simManager_ is nullptr");
798         return TELEPHONY_ERR_LOCAL_PTR_NULL;
799     }
800     if (eventSender_ == nullptr) {
801         TELEPHONY_LOGE("eventSender_ is nullptr");
802         return TELEPHONY_ERR_LOCAL_PTR_NULL;
803     }
804 
805     int32_t modemRaf = simManager_->GetRadioProtocolTech(slotId);
806     int32_t raf = NetworkUtils::GetRafFromNetworkMode(static_cast<PreferredNetworkMode>(networkMode));
807     if (modemRaf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
808         TELEPHONY_LOGE("SetPreferredNetwork failed modemRaf:%{public}d slotId:%{public}d", modemRaf, slotId);
809         return CORE_SERVICE_RADIO_PROTOCOL_TECH_UNKNOWN;
810     }
811     if (raf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
812         TELEPHONY_LOGE("SetPreferredNetwork failed raf:%{public}d slotId:%{public}d", raf, slotId);
813         return TELEPHONY_ERR_ARGUMENT_INVALID;
814     }
815     int32_t filterMode = static_cast<int32_t>(NetworkUtils::GetNetworkModeFromRaf(modemRaf & raf));
816     TELEPHONY_LOGI("filterMode:%{public}d slotId:%{public}d", filterMode, slotId);
817     SetCachePreferredNetworkValue(slotId, filterMode);
818     if (!eventSender_->SendCallbackEx(slotId, RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, &callback, filterMode)) {
819         TELEPHONY_LOGE("slotId:%{public}d SetPreferredNetwork SendCallback failed.", slotId);
820         return CORE_SERVICE_SEND_CALLBACK_FAILED;
821     }
822     return TELEPHONY_ERR_SUCCESS;
823 }
824 
GetPreferredNetwork(int32_t slotId)825 int32_t NetworkSearchManager::GetPreferredNetwork(int32_t slotId)
826 {
827     TELEPHONY_LOGD("NetworkSearchManager GetPreferredNetwork slotId:%{public}d", slotId);
828     if (eventSender_ == nullptr) {
829         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
830         return TELEPHONY_ERR_LOCAL_PTR_NULL;
831     }
832     if (!eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE)) {
833         TELEPHONY_LOGE("slotId:%{public}d GetPreferredNetwork SendCallback failed.", slotId);
834         return CORE_SERVICE_SEND_CALLBACK_FAILED;
835     }
836     return TELEPHONY_ERR_SUCCESS;
837 }
838 
SetCachePreferredNetworkValue(int32_t slotId,int32_t networkMode)839 int32_t NetworkSearchManager::SetCachePreferredNetworkValue(int32_t slotId, int32_t networkMode)
840 {
841     TELEPHONY_LOGD("SetCachePreferredNetworkValue slotId:%{public}d", slotId);
842     auto inner = FindManagerInner(slotId);
843     if (inner == nullptr) {
844         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
845         return TELEPHONY_ERR_LOCAL_PTR_NULL;
846     }
847     inner->preferredNetworkValue_ = networkMode;
848     return TELEPHONY_ERR_SUCCESS;
849 }
850 
GetCachePreferredNetworkValue(int32_t slotId,int32_t & networkMode)851 int32_t NetworkSearchManager::GetCachePreferredNetworkValue(int32_t slotId, int32_t &networkMode)
852 {
853     TELEPHONY_LOGD("GetCachePreferredNetworkValue slotId:%{public}d", slotId);
854     auto inner = FindManagerInner(slotId);
855     if (inner == nullptr) {
856         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
857         return TELEPHONY_ERR_LOCAL_PTR_NULL;
858     }
859     networkMode = inner->preferredNetworkValue_;
860     return TELEPHONY_ERR_SUCCESS;
861 }
862 
SetPreferredNetwork(int32_t slotId,int32_t networkMode)863 bool NetworkSearchManager::SetPreferredNetwork(int32_t slotId, int32_t networkMode)
864 {
865     if (simManager_ == nullptr || eventSender_ == nullptr) {
866         TELEPHONY_LOGE("simManager_ or eventSender_ is nullptr");
867         return false;
868     }
869 
870     int32_t modemRaf = simManager_->GetRadioProtocolTech(slotId);
871     int32_t raf = NetworkUtils::GetRafFromNetworkMode(static_cast<PreferredNetworkMode>(networkMode));
872     if (modemRaf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN) ||
873         raf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
874         TELEPHONY_LOGE(
875             "SetPreferredNetwork failed modemRaf:%{public}d raf:%{public}d slotId:%{public}d", modemRaf, raf, slotId);
876         return false;
877     }
878     int32_t filterMode = static_cast<int32_t>(NetworkUtils::GetNetworkModeFromRaf(modemRaf & raf));
879     TELEPHONY_LOGI("modemRaf:%{public}d, raf:%{public}d, filterMode:%{public}d slotId:%{public}d", modemRaf, raf,
880         filterMode, slotId);
881     SetCachePreferredNetworkValue(slotId, filterMode);
882     return eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, filterMode);
883 }
884 
SetForcePreferredNetwork(int32_t slotId,int32_t networkMode)885 bool NetworkSearchManager::SetForcePreferredNetwork(int32_t slotId, int32_t networkMode)
886 {
887     if (slotId < 0 || slotId > SIM_SLOT_COUNT) {
888         return false;
889     }
890     if (eventSender_ == nullptr) {
891         return false;
892     }
893     int32_t raf = NetworkUtils::GetRafFromNetworkMode(static_cast<PreferredNetworkMode>(networkMode));
894     if (raf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
895         return false;
896     }
897     TELEPHONY_LOGI("raf: %{public}d, networkMode: %{public}d slotId: %{public}d", raf, networkMode, slotId);
898     SetCachePreferredNetworkValue(slotId, networkMode);
899     return eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, networkMode);
900 }
901 
SavePreferredNetworkValue(int32_t slotId,int32_t networkMode)902 void NetworkSearchManager::SavePreferredNetworkValue(int32_t slotId, int32_t networkMode)
903 {
904     TELEPHONY_LOGD("NetworkSearchManager SavePreferredNetworkValue slotId:%{public}d, networkMode:%{public}d", slotId,
905         networkMode);
906     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
907     if (settingHelper == nullptr) {
908         TELEPHONY_LOGE("settingHelper is null");
909         return;
910     }
911 
912     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_PREFERRED_NETWORK_MODE_URI);
913     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_PREFERRED_NETWORK_MODE + "_" + std::to_string(slotId);
914     std::string value = std::to_string(networkMode);
915     if (settingHelper->Update(uri, key, value) != TELEPHONY_SUCCESS) {
916         TELEPHONY_LOGE("Update %{public}s fail", key.c_str());
917     }
918 }
919 
UpdateRadioOn(int32_t slotId)920 int32_t NetworkSearchManager::UpdateRadioOn(int32_t slotId)
921 {
922     if (slotId < 0 || slotId > SIM_SLOT_COUNT) {
923         return TELEPHONY_ERROR;
924     }
925     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
926     if (settingHelper == nullptr) {
927         TELEPHONY_LOGE("settingHelper is null");
928         return TELEPHONY_ERR_LOCAL_PTR_NULL;
929     }
930 
931     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
932     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_AIRPLANE_MODE;
933     int32_t airplaneModeOff = 0;
934     std::string value = std::to_string(airplaneModeOff);
935     int32_t ret = settingHelper->Update(uri, key, value);
936     if (ret != TELEPHONY_SUCCESS) {
937         TELEPHONY_LOGE("NetworkSearchManager::UpdateRadioOn Update fail");
938         return ret;
939     }
940     SetRadioState(slotId, CORE_SERVICE_POWER_ON, 0);
941     AAFwk::Want want;
942     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_AIRPLANE_MODE_CHANGED);
943     want.SetParam("state", false);
944     EventFwk::CommonEventData data;
945     data.SetWant(want);
946     EventFwk::CommonEventPublishInfo publishInfo;
947     if (!EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr)) {
948         TELEPHONY_LOGE("PublishCommonEvent fail");
949         return TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL;
950     }
951     return TELEPHONY_SUCCESS;
952 }
953 
GetPreferredNetworkValue(int32_t slotId) const954 int32_t NetworkSearchManager::GetPreferredNetworkValue(int32_t slotId) const
955 {
956     int32_t networkMode = PREFERRED_NETWORK_TYPE;
957     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
958     if (settingHelper == nullptr) {
959         TELEPHONY_LOGE("settingHelper is null");
960         return networkMode;
961     }
962 
963     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_PREFERRED_NETWORK_MODE_URI);
964     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_PREFERRED_NETWORK_MODE + "_" + std::to_string(slotId);
965     std::string value = "";
966     if (settingHelper->Query(uri, key, value) != TELEPHONY_SUCCESS) {
967         TELEPHONY_LOGI("Query %{public}s fail", key.c_str());
968         return networkMode;
969     }
970 
971     bool succ = StrToInt(value, networkMode);
972     TELEPHONY_LOGD("NetworkSearchManager GetPreferredNetworkValue succ:%{public}d, slotId:%{public}d, "
973                    "networkMode:%{public}d",
974         slotId, succ, networkMode);
975     return networkMode;
976 }
977 
UpdatePhone(int32_t slotId,RadioTech csRadioTech,const RadioTech & psRadioTech)978 void NetworkSearchManager::UpdatePhone(int32_t slotId, RadioTech csRadioTech, const RadioTech &psRadioTech)
979 {
980     auto inner = FindManagerInner(slotId);
981     if (inner != nullptr) {
982         if (inner->networkSearchHandler_ != nullptr) {
983             inner->networkSearchHandler_->UpdatePhone(csRadioTech, psRadioTech);
984         }
985     }
986 }
987 
GetImsRegStatus(int32_t slotId,ImsServiceType imsSrvType,ImsRegInfo & info)988 int32_t NetworkSearchManager::GetImsRegStatus(int32_t slotId, ImsServiceType imsSrvType, ImsRegInfo &info)
989 {
990     TELEPHONY_LOGD("slotId:%{public}d, imsSrvType:%{public}d", slotId, imsSrvType);
991     auto inner = FindManagerInner(slotId);
992     if (inner == nullptr) {
993         TELEPHONY_LOGE("NetworkSearchManagerInner is nullptr!");
994         return TELEPHONY_ERR_LOCAL_PTR_NULL;
995     }
996     if (inner->networkSearchState_ == nullptr) {
997         TELEPHONY_LOGE("networkSearchState is nullptr!");
998         return TELEPHONY_ERR_LOCAL_PTR_NULL;
999     }
1000     return inner->networkSearchState_->GetImsStatus(imsSrvType, info);
1001 }
1002 
SetImei(int32_t slotId,std::u16string imei)1003 void NetworkSearchManager::SetImei(int32_t slotId, std::u16string imei)
1004 {
1005     auto inner = FindManagerInner(slotId);
1006     if (inner != nullptr) {
1007         inner->imei_ = imei;
1008     }
1009 }
1010 
SetImeiSv(int32_t slotId,std::u16string imeiSv)1011 void NetworkSearchManager::SetImeiSv(int32_t slotId, std::u16string imeiSv)
1012 {
1013     auto inner = FindManagerInner(slotId);
1014     if (inner != nullptr) {
1015         inner->imeiSv_ = imeiSv;
1016     }
1017 }
1018 
GetImei(int32_t slotId,std::u16string & imei)1019 int32_t NetworkSearchManager::GetImei(int32_t slotId, std::u16string &imei)
1020 {
1021     TELEPHONY_LOGD("NetworkSearchManager::GetImei start slotId:%{public}d", slotId);
1022     imei = u"";
1023     auto inner = FindManagerInner(slotId);
1024     if (inner == nullptr || eventSender_ == nullptr) {
1025         TELEPHONY_LOGE("slotId:%{public}d inner or eventSender_ is null", slotId);
1026         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1027     }
1028     std::shared_ptr<SatelliteServiceClient> satelliteClient = DelayedSingleton<SatelliteServiceClient>::GetInstance();
1029     if (IsSatelliteEnabled()) {
1030         imei = Str8ToStr16(satelliteClient->GetImei());
1031         return TELEPHONY_ERR_SUCCESS;
1032     }
1033     if (inner->imei_.empty()) {
1034         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_IMEI);
1035         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1036     }
1037     imei = inner->imei_;
1038     if (imei.empty()) {
1039         TELEPHONY_LOGI("imei is empty");
1040         return TELEPHONY_ERR_SUCCESS;
1041     }
1042     int32_t otherSlotId = slotId == SLOT_0 ? SLOT_1 : SLOT_0;
1043     if (otherSlotId < static_cast<int32_t>(mapManagerInner_.size())) {
1044         auto otherInner = FindManagerInner(otherSlotId);
1045         if (otherInner != nullptr) {
1046             std::u16string otherImei = otherInner->imei_;
1047             if (otherImei.empty()) {
1048                 TELEPHONY_LOGI("otherImei is empty");
1049             } else if (otherImei == imei) {
1050                 TELEPHONY_LOGI("slotId:%{public}d, otherSlotId:%{public}d, imei is same", slotId, otherSlotId);
1051             } else {
1052                 TELEPHONY_LOGI("slotId:%{public}d, otherSlotId:%{public}d, imei is different", slotId, otherSlotId);
1053             }
1054         }
1055     }
1056     return TELEPHONY_ERR_SUCCESS;
1057 }
1058 
GetImeiSv(int32_t slotId,std::u16string & imeiSv)1059 int32_t NetworkSearchManager::GetImeiSv(int32_t slotId, std::u16string &imeiSv)
1060 {
1061     TELEPHONY_LOGD("NetworkSearchManager::GetImeiSv start slotId:%{public}d", slotId);
1062     imeiSv = u"";
1063     auto inner = FindManagerInner(slotId);
1064     if (inner == nullptr || eventSender_ == nullptr) {
1065         TELEPHONY_LOGE("slotId:%{public}d inner or eventSender_ is null", slotId);
1066         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1067     }
1068     if (inner->imeiSv_.empty()) {
1069         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_IMEISV);
1070         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1071     }
1072     imeiSv = inner->imeiSv_;
1073     return TELEPHONY_ERR_SUCCESS;
1074 }
1075 
GetCellInfoList(int32_t slotId,std::vector<sptr<CellInformation>> & cellInfo)1076 int32_t NetworkSearchManager::GetCellInfoList(int32_t slotId, std::vector<sptr<CellInformation>> &cellInfo)
1077 {
1078     auto inner = FindManagerInner(slotId);
1079     if (inner != nullptr) {
1080         if (inner->networkSearchHandler_ != nullptr) {
1081             inner->networkSearchHandler_->GetCellInfoList(cellInfo);
1082             if (TELEPHONY_EXT_WRAPPER.getCellInfoList_ != nullptr) {
1083                 TELEPHONY_EXT_WRAPPER.getCellInfoList_(slotId, cellInfo);
1084             }
1085             return TELEPHONY_ERR_SUCCESS;
1086         }
1087     }
1088     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1089 }
1090 
GetNeighboringCellInfoList(int32_t slotId,std::vector<sptr<CellInformation>> & cellInfo)1091 int32_t NetworkSearchManager::GetNeighboringCellInfoList(int32_t slotId, std::vector<sptr<CellInformation>> &cellInfo)
1092 {
1093     auto inner = FindManagerInner(slotId);
1094     if (inner != nullptr) {
1095         if (inner->networkSearchHandler_ != nullptr) {
1096             inner->networkSearchHandler_->GetNeighboringCellInfoList(cellInfo);
1097             if (TELEPHONY_EXT_WRAPPER.getCellInfoList_ != nullptr) {
1098                 TELEPHONY_EXT_WRAPPER.getCellInfoList_(slotId, cellInfo);
1099             }
1100             return TELEPHONY_ERR_SUCCESS;
1101         }
1102     }
1103     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1104 }
1105 
SendUpdateCellLocationRequest(int32_t slotId)1106 int32_t NetworkSearchManager::SendUpdateCellLocationRequest(int32_t slotId)
1107 {
1108     auto inner = FindManagerInner(slotId);
1109     if (inner != nullptr) {
1110         if (inner->networkSearchHandler_ == nullptr || GetRadioState(slotId) == CORE_SERVICE_POWER_OFF) {
1111             return TELEPHONY_ERR_LOCAL_PTR_NULL;
1112         }
1113         return inner->networkSearchHandler_->SendUpdateCellLocationRequest();
1114     }
1115     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1116 }
1117 
UpdateCellLocation(int32_t slotId,int32_t techType,int32_t cellId,int32_t lac)1118 void NetworkSearchManager::UpdateCellLocation(int32_t slotId, int32_t techType, int32_t cellId, int32_t lac)
1119 {
1120     auto inner = FindManagerInner(slotId);
1121     if (inner != nullptr) {
1122         if (inner->networkSearchHandler_ != nullptr) {
1123             inner->networkSearchHandler_->UpdateCellLocation(techType, cellId, lac);
1124         }
1125     }
1126 }
1127 
GetCellLocation(int32_t slotId)1128 sptr<CellLocation> NetworkSearchManager::GetCellLocation(int32_t slotId)
1129 {
1130     auto inner = FindManagerInner(slotId);
1131     if (inner != nullptr) {
1132         if (inner->networkSearchHandler_ != nullptr) {
1133             return inner->networkSearchHandler_->GetCellLocation();
1134         }
1135     }
1136     return nullptr;
1137 }
1138 
SetMeid(int32_t slotId,std::u16string meid)1139 void NetworkSearchManager::SetMeid(int32_t slotId, std::u16string meid)
1140 {
1141     auto inner = FindManagerInner(slotId);
1142     if (inner != nullptr) {
1143         inner->meid_ = meid;
1144     }
1145 }
1146 
GetMeid(int32_t slotId,std::u16string & meid)1147 int32_t NetworkSearchManager::GetMeid(int32_t slotId, std::u16string &meid)
1148 {
1149     TELEPHONY_LOGD("NetworkSearchManager::GetMeid start slotId:%{public}d", slotId);
1150     meid = u"";
1151     auto inner = FindManagerInner(slotId);
1152     if (inner == nullptr || eventSender_ == nullptr) {
1153         TELEPHONY_LOGE("slotId:%{public}d inner or eventSender_ is null", slotId);
1154         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1155     }
1156     if (inner->meid_.empty()) {
1157         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_MEID);
1158         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1159     }
1160     meid = inner->meid_;
1161     return TELEPHONY_ERR_SUCCESS;
1162 }
1163 
SetLocateUpdate(int32_t slotId)1164 void NetworkSearchManager::SetLocateUpdate(int32_t slotId)
1165 {
1166     TELEPHONY_LOGD("NetworkSearchManager::SetLocateUpdate start slotId:%{public}d", slotId);
1167     auto inner = FindManagerInner(slotId);
1168     if (inner == nullptr) {
1169         TELEPHONY_LOGI("NetworkSearchManager::SetLocateUpdate inner null slotId:%{public}d", slotId);
1170         return;
1171     }
1172 
1173     auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_SET_LOCATION_UPDATE);
1174     if (event != nullptr && inner->networkSearchHandler_ != nullptr) {
1175         event->SetOwner(inner->networkSearchHandler_);
1176         telRilManager_->SetLocateUpdates(slotId, RegNotifyMode::REG_NOTIFY_STAT_LAC_CELLID, event);
1177     }
1178 }
1179 
GetUniqueDeviceId(int32_t slotId,std::u16string & deviceId)1180 int32_t NetworkSearchManager::GetUniqueDeviceId(int32_t slotId, std::u16string &deviceId)
1181 {
1182     TELEPHONY_LOGD("NetworkSearchManager::GetUniqueDeviceId start slotId:%{public}d", slotId);
1183     deviceId = u"";
1184     auto inner = FindManagerInner(slotId);
1185     if (inner == nullptr) {
1186         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1187         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1188     }
1189     if (GetPhoneType(slotId) == PhoneType::PHONE_TYPE_IS_GSM) {
1190         if (!inner->imei_.empty()) {
1191             deviceId = inner->imei_;
1192             return TELEPHONY_ERR_SUCCESS;
1193         }
1194         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1195     } else {
1196         if (!inner->meid_.empty()) {
1197             deviceId = inner->meid_;
1198             return TELEPHONY_ERR_SUCCESS;
1199         }
1200         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1201     }
1202 }
1203 
FactoryReset(int32_t slotId)1204 int32_t NetworkSearchManager::FactoryReset(int32_t slotId)
1205 {
1206     bool ret = SetNetworkSelectionMode(slotId, static_cast<int32_t>(SelectionMode::MODE_TYPE_AUTO), nullptr, true);
1207     if (!ret) {
1208         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1209     }
1210     int32_t networkMode = PREFERRED_NETWORK_TYPE;
1211     ret = SetPreferredNetwork(slotId, networkMode);
1212     if (!ret) {
1213         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1214     }
1215     NotifyFactoryReset(slotId);
1216     return TELEPHONY_ERR_SUCCESS;
1217 }
1218 
GetPhoneType(int32_t slotId)1219 PhoneType NetworkSearchManager::GetPhoneType(int32_t slotId)
1220 {
1221     PhoneType phoneType = PhoneType::PHONE_TYPE_IS_NONE;
1222     auto inner = FindManagerInner(slotId);
1223     if (inner != nullptr) {
1224         if (inner->networkSearchHandler_ != nullptr) {
1225             phoneType = inner->networkSearchHandler_->GetPhoneType();
1226         }
1227     }
1228     TELEPHONY_LOGD("NetworkSearchManager::GetPhoneType type:%{public}d start slotId:%{public}d", phoneType, slotId);
1229     return phoneType;
1230 }
1231 
GetVoiceTech(int32_t slotId)1232 void NetworkSearchManager::GetVoiceTech(int32_t slotId)
1233 {
1234     if (eventSender_ == nullptr) {
1235         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
1236         return;
1237     }
1238     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_VOICE_TECH);
1239     eventSender_->SendCallback(
1240         slotId, RadioEvent::RADIO_OPERATOR, nullptr, NetworkSearchManagerInner::SERIAL_NUMBER_EXEMPT);
1241 }
1242 
IsNrSupported(int32_t slotId)1243 bool NetworkSearchManager::IsNrSupported(int32_t slotId)
1244 {
1245     if (simManager_ == nullptr) {
1246         TELEPHONY_LOGE("simManager_ is nullptr");
1247         return false;
1248     }
1249     int32_t modemRaf = simManager_->GetRadioProtocolTech(slotId);
1250     if (TELEPHONY_EXT_WRAPPER.isNrSupportedNative_ != nullptr) {
1251         return TELEPHONY_EXT_WRAPPER.isNrSupportedNative_(modemRaf);
1252     }
1253     return (static_cast<uint32_t>(modemRaf) & static_cast<uint32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_NR)) ==
1254         static_cast<uint32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_NR);
1255 }
1256 
IsSatelliteEnabled()1257 bool NetworkSearchManager::IsSatelliteEnabled()
1258 {
1259     std::shared_ptr<SatelliteServiceClient> satelliteClient = DelayedSingleton<SatelliteServiceClient>::GetInstance();
1260     if (satelliteClient == nullptr) {
1261         TELEPHONY_LOGE("satelliteClient is nullptr");
1262         return false;
1263     }
1264     return satelliteClient->IsSatelliteEnabled();
1265 }
1266 
HandleRrcStateChanged(int32_t slotId,int32_t status)1267 int32_t NetworkSearchManager::HandleRrcStateChanged(int32_t slotId, int32_t status)
1268 {
1269     auto inner = FindManagerInner(slotId);
1270     if (inner == nullptr) {
1271         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1272         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1273     }
1274     if (inner->rrcConnectionStatus_ == status) {
1275         TELEPHONY_LOGI("slotId:%{public}d rrc state is not change.", slotId);
1276         return TELEPHONY_ERR_FAIL;
1277     }
1278     inner->rrcConnectionStatus_ = status;
1279     if (status == RRC_CONNECTED_STATUS || status == RRC_IDLE_STATUS) {
1280         inner->networkSearchHandler_->HandleRrcStateChanged(status);
1281     }
1282     return TELEPHONY_ERR_SUCCESS;
1283 }
1284 
RevertLastTechnology(int32_t slotId)1285 int32_t NetworkSearchManager::RevertLastTechnology(int32_t slotId)
1286 {
1287     auto inner = FindManagerInner(slotId);
1288     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
1289         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1290         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1291     }
1292     return inner->networkSearchHandler_->RevertLastTechnology();
1293 }
1294 
GetRrcConnectionState(int32_t slotId,int32_t & status)1295 int32_t NetworkSearchManager::GetRrcConnectionState(int32_t slotId, int32_t &status)
1296 {
1297     auto inner = FindManagerInner(slotId);
1298     if (inner == nullptr || eventSender_ == nullptr) {
1299         TELEPHONY_LOGE("slotId:%{public}d inner or eventSender_ is null", slotId);
1300         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1301     }
1302     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_RRC_CONNECTION_STATE);
1303     status = inner->rrcConnectionStatus_;
1304     return TELEPHONY_ERR_SUCCESS;
1305 }
1306 
UpdateRrcConnectionState(int32_t slotId,int32_t & status)1307 int32_t NetworkSearchManager::UpdateRrcConnectionState(int32_t slotId, int32_t &status)
1308 {
1309     auto inner = FindManagerInner(slotId);
1310     if (inner == nullptr) {
1311         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1312         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1313     }
1314     status = inner->rrcConnectionStatus_;
1315     return TELEPHONY_ERR_SUCCESS;
1316 }
1317 
GetNrOptionMode(int32_t slotId,NrMode & mode)1318 int32_t NetworkSearchManager::GetNrOptionMode(int32_t slotId, NrMode &mode)
1319 {
1320     auto inner = FindManagerInner(slotId);
1321     if (inner == nullptr || eventSender_ == nullptr) {
1322         TELEPHONY_LOGE("slotId:%{public}d inner or eventSender_ is null", slotId);
1323         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1324     }
1325     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_NR_OPTION_MODE);
1326     mode = inner->nrMode_;
1327     if (TELEPHONY_EXT_WRAPPER.getNrOptionModeExtend_ != nullptr) {
1328         TELEPHONY_EXT_WRAPPER.getNrOptionModeExtend_(slotId, mode);
1329     }
1330     return TELEPHONY_ERR_SUCCESS;
1331 }
1332 
GetNrOptionMode(int32_t slotId,NSCALLBACK & callback)1333 int32_t NetworkSearchManager::GetNrOptionMode(int32_t slotId, NSCALLBACK &callback)
1334 {
1335     if (eventSender_ == nullptr) {
1336         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
1337         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1338     }
1339     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_GET_NR_OPTION_MODE, &callback)) {
1340         TELEPHONY_LOGE("slotId:%{public}d GetNrOptionMode SendCallback failed.", slotId);
1341         return CORE_SERVICE_SEND_CALLBACK_FAILED;
1342     }
1343     return TELEPHONY_ERR_SUCCESS;
1344 }
1345 
UpdateNrOptionMode(int32_t slotId,NrMode mode)1346 int32_t NetworkSearchManager::UpdateNrOptionMode(int32_t slotId, NrMode mode)
1347 {
1348     auto inner = FindManagerInner(slotId);
1349     if (inner == nullptr) {
1350         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1351         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1352     }
1353     inner->nrMode_ = mode;
1354     return TELEPHONY_ERR_SUCCESS;
1355 }
1356 
SetNrOptionMode(int32_t slotId,int32_t mode)1357 int32_t NetworkSearchManager::SetNrOptionMode(int32_t slotId, int32_t mode)
1358 {
1359     TELEPHONY_LOGD("NetworkSearchManager SetNrOptionMode mode:%{public}d slotId:%{public}d", mode, slotId);
1360     if (mode < static_cast<int32_t>(NrMode::NR_MODE_UNKNOWN) ||
1361         mode > static_cast<int32_t>(NrMode::NR_MODE_NSA_AND_SA)) {
1362         return TELEPHONY_ERR_ARGUMENT_INVALID;
1363     }
1364     if (eventSender_ == nullptr) {
1365         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
1366         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1367     }
1368     eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_NR_OPTION_MODE, mode);
1369     return TELEPHONY_ERR_SUCCESS;
1370 }
1371 
SetNrOptionMode(int32_t slotId,int32_t mode,NSCALLBACK & callback)1372 int32_t NetworkSearchManager::SetNrOptionMode(int32_t slotId, int32_t mode, NSCALLBACK &callback)
1373 {
1374     TELEPHONY_LOGD("NetworkSearchManager SetNrOptionMode mode:%{public}d slotId:%{public}d", mode, slotId);
1375     if (mode < static_cast<int32_t>(NrMode::NR_MODE_UNKNOWN) ||
1376         mode > static_cast<int32_t>(NrMode::NR_MODE_NSA_AND_SA)) {
1377         return TELEPHONY_ERR_ARGUMENT_INVALID;
1378     }
1379     int32_t errCode = TELEPHONY_ERR_SUCCESS;
1380     int32_t masterSlotId = -1;
1381     if (simManager_ != nullptr) {
1382         simManager_->GetPrimarySlotId(masterSlotId);
1383     }
1384     if (TELEPHONY_EXT_WRAPPER.setNrOptionModeExt_ != nullptr &&
1385         TELEPHONY_EXT_WRAPPER.setNrOptionModeExt_(slotId, masterSlotId, mode, errCode)) {
1386         return errCode;
1387     }
1388     if (eventSender_ == nullptr) {
1389         TELEPHONY_LOGE("slotId:%{public}d eventSender_ is null", slotId);
1390         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1391     }
1392     if (!eventSender_->SendCallbackEx(slotId, RadioEvent::RADIO_SET_NR_OPTION_MODE, &callback, mode)) {
1393         TELEPHONY_LOGE("slotId:%{public}d SetNrOptionMode SendCallback failed.", slotId);
1394         return CORE_SERVICE_SEND_CALLBACK_FAILED;
1395     }
1396     return TELEPHONY_ERR_SUCCESS;
1397 }
1398 
SetFrequencyType(int32_t slotId,FrequencyType type)1399 void NetworkSearchManager::SetFrequencyType(int32_t slotId, FrequencyType type)
1400 {
1401     auto inner = FindManagerInner(slotId);
1402     if (inner != nullptr) {
1403         std::lock_guard<std::mutex> lock(inner->mutex_);
1404         inner->freqType_ = type;
1405     }
1406 }
1407 
GetFrequencyType(int32_t slotId)1408 FrequencyType NetworkSearchManager::GetFrequencyType(int32_t slotId)
1409 {
1410     auto inner = FindManagerInner(slotId);
1411     if (inner != nullptr) {
1412         std::lock_guard<std::mutex> lock(inner->mutex_);
1413         return inner->freqType_;
1414     }
1415     return FrequencyType::FREQ_TYPE_UNKNOWN;
1416 }
1417 
GetNrState(int32_t slotId)1418 NrState NetworkSearchManager::GetNrState(int32_t slotId)
1419 {
1420     auto inner = FindManagerInner(slotId);
1421     if (inner != nullptr) {
1422         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
1423             auto event = inner->networkSearchState_->GetNetworkStatus()->GetNrState();
1424             TELEPHONY_LOGI("NetworkSearchManager::GetNrState result=%{public}d slotId:%{public}d", event, slotId);
1425             return event;
1426         }
1427         TELEPHONY_LOGE("NetworkSearchManager::GetNrState failed due to nullptr!");
1428     }
1429     TELEPHONY_LOGE("NetworkSearchManager::GetNrState Failed slotId:%{public}d", slotId);
1430     return NrState::NR_STATE_NOT_SUPPORT;
1431 }
1432 
DcPhysicalLinkActiveUpdate(int32_t slotId,bool isActive)1433 void NetworkSearchManager::DcPhysicalLinkActiveUpdate(int32_t slotId, bool isActive)
1434 {
1435     auto inner = FindManagerInner(slotId);
1436     if (inner != nullptr) {
1437         if (inner->networkSearchHandler_ != nullptr) {
1438             int active = isActive ? 1 : 0;
1439             auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_SET_DATA_CONNECT_ACTIVE, active);
1440             inner->networkSearchHandler_->SendEvent(event);
1441         }
1442     }
1443 }
1444 
NotifyCallStatusToNetworkSearch(int32_t slotId,int32_t callStatus)1445 int32_t NetworkSearchManager::NotifyCallStatusToNetworkSearch(int32_t slotId, int32_t callStatus)
1446 {
1447     auto inner = FindManagerInner(slotId);
1448     if (inner == nullptr) {
1449         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1450         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1451     }
1452     switch (callStatus) {
1453         case static_cast<int32_t>(TelephonyCallState::CALL_STATUS_ACTIVE):
1454         case static_cast<int32_t>(TelephonyCallState::CALL_STATUS_HOLDING):
1455         case static_cast<int32_t>(TelephonyCallState::CALL_STATUS_DIALING):
1456         case static_cast<int32_t>(TelephonyCallState::CALL_STATUS_INCOMING):
1457         case static_cast<int32_t>(TelephonyCallState::CALL_STATUS_WAITING):
1458             inner->hasCall_ = true;
1459             break;
1460         default:
1461             inner->hasCall_ = false;
1462             break;
1463     }
1464     TELEPHONY_LOGI("slotId:%{public}d callStatus:%{public}d hasCall:%{public}d", slotId, callStatus, inner->hasCall_);
1465     return TELEPHONY_ERR_SUCCESS;
1466 }
1467 
GetDelayNotifyTime()1468 int32_t NetworkSearchManager::GetDelayNotifyTime()
1469 {
1470     char param[SYS_PARAMETER_SIZE] = { 0 };
1471     int32_t delayTime = 0;
1472     int32_t code = GetParameter(CFG_TECH_UPDATE_TIME, NO_DELAY_TIME__CONFIG, param, SYS_PARAMETER_SIZE);
1473     std::string time = param;
1474     if (code <= 0 || !IsValidDecValue(time)) {
1475         delayTime = std::stoi(NO_DELAY_TIME__CONFIG);
1476     } else {
1477         delayTime = std::stoi(time);
1478     }
1479     return delayTime;
1480 }
1481 
HandleNotifyStateChangeWithDelay(int32_t slotId,bool isNeedDelay)1482 int32_t NetworkSearchManager::HandleNotifyStateChangeWithDelay(int32_t slotId, bool isNeedDelay)
1483 {
1484     auto inner = FindManagerInner(slotId);
1485     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
1486         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1487         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1488     }
1489 
1490     auto delayEvent = AppExecFwk::InnerEvent::Get(RadioEvent::DELAY_NOTIFY_STATE_CHANGE);
1491     uint32_t delayEventId = static_cast<uint32_t>(RadioEvent::DELAY_NOTIFY_STATE_CHANGE);
1492     if (isNeedDelay) {
1493         if (inner->networkSearchHandler_->HasInnerEvent(delayEventId)) {
1494             TELEPHONY_LOGI("Has delay event, return. slotId:%{public}d", slotId);
1495         } else {
1496             inner->networkSearchHandler_->SendEvent(delayEvent, delayTime_);
1497             TELEPHONY_LOGI("Need delay, delayTime:%{public}d slotId:%{public}d", delayTime_, slotId);
1498         }
1499     } else {
1500         TELEPHONY_LOGI("Do not need delay, slotId:%{public}d", slotId);
1501         if (inner->networkSearchHandler_->HasInnerEvent(delayEventId)) {
1502             TELEPHONY_LOGI("Remove delay event, slotId:%{public}d", slotId);
1503             inner->networkSearchHandler_->RemoveEvent(delayEventId);
1504         }
1505         auto event = AppExecFwk::InnerEvent::Get(RadioEvent::NOTIFY_STATE_CHANGE);
1506         inner->networkSearchHandler_->SendEvent(event);
1507     }
1508     return TELEPHONY_ERR_SUCCESS;
1509 }
1510 
IsNeedDelayNotify(int32_t slotId)1511 bool NetworkSearchManager::IsNeedDelayNotify(int32_t slotId)
1512 {
1513     auto inner = FindManagerInner(slotId);
1514     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
1515         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1516         return false;
1517     }
1518     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
1519         TELEPHONY_LOGE("NetworkSearchManager::IsNeedDelayNotify failed due to nullptr!");
1520         return false;
1521     }
1522     if (delayTime_ <= INVALID_DELAY_TIME) {
1523         TELEPHONY_LOGD("The system properties are not configured with a valid delay time.");
1524         return false;
1525     }
1526     int32_t networkCapabilityState = 0;
1527     GetNetworkCapability(slotId, SERVICE_TYPE_NR, networkCapabilityState);
1528     if (networkCapabilityState == SERVICE_ABILITY_OFF) {
1529         TELEPHONY_LOGI("The NR switch is closed.");
1530         return false;
1531     }
1532     RegServiceState regState = inner->networkSearchState_->GetNetworkStatus()->GetRegStatus();
1533     if (regState == RegServiceState::REG_STATE_NO_SERVICE) {
1534         TELEPHONY_LOGI("The reg state is no service.");
1535         return false;
1536     }
1537     RadioTech cfgTech = inner->networkSearchState_->GetNetworkStatus()->GetCfgTech();
1538     if ((cfgTech != RadioTech::RADIO_TECHNOLOGY_LTE) && (cfgTech != RadioTech::RADIO_TECHNOLOGY_LTE_CA)) {
1539         TELEPHONY_LOGI("The cfgTech[%{public}d] is not LTE, slotId:%{public}d", cfgTech, slotId);
1540         return false;
1541     }
1542     if (inner->hasCall_) {
1543         TELEPHONY_LOGI("Has call, slotId:%{public}d", slotId);
1544         return false;
1545     }
1546     RadioTech lastCfgTech = inner->networkSearchState_->GetNetworkStatus()->GetLastCfgTech();
1547     RadioTech lastPsRadioTech = inner->networkSearchState_->GetNetworkStatus()->GetLastPsRadioTech();
1548     if ((lastCfgTech == RadioTech::RADIO_TECHNOLOGY_NR) && (lastPsRadioTech != RadioTech::RADIO_TECHNOLOGY_NR) &&
1549         (cfgTech == RadioTech::RADIO_TECHNOLOGY_LTE || (cfgTech == RadioTech::RADIO_TECHNOLOGY_LTE_CA))) {
1550         TELEPHONY_LOGI(
1551             "lastCfgTech:%{public}d lastPsTech:%{public}d slotId:%{public}d", lastCfgTech, lastPsRadioTech, slotId);
1552         return true;
1553     }
1554     return false;
1555 }
1556 
ProcessNotifyStateChangeEvent(int32_t slotId)1557 int32_t NetworkSearchManager::ProcessNotifyStateChangeEvent(int32_t slotId)
1558 {
1559     TELEPHONY_LOGI("Start process network state notify event, slotId:%{public}d", slotId);
1560     auto inner = FindManagerInner(slotId);
1561     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
1562         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1563         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1564     }
1565     bool isNeedDelay = IsNeedDelayNotify(slotId);
1566     if (isNeedDelay) {
1567         TELEPHONY_LOGI("revert last tech. slotId:%{public}d", slotId);
1568         inner->networkSearchHandler_->RevertLastTechnology();
1569     }
1570     return HandleNotifyStateChangeWithDelay(slotId, isNeedDelay);
1571 }
1572 
IsRadioFirstPowerOn(int32_t slotId)1573 bool NetworkSearchManager::IsRadioFirstPowerOn(int32_t slotId)
1574 {
1575     auto inner = FindManagerInner(slotId);
1576     if (inner != nullptr) {
1577         std::lock_guard<std::mutex> lock(inner->mutex_);
1578         return inner->isRadioFirstPowerOn_;
1579     }
1580     return false;
1581 }
1582 
SetRadioFirstPowerOn(int32_t slotId,bool isFirstPowerOn)1583 void NetworkSearchManager::SetRadioFirstPowerOn(int32_t slotId, bool isFirstPowerOn)
1584 {
1585     auto inner = FindManagerInner(slotId);
1586     if (inner != nullptr) {
1587         std::lock_guard<std::mutex> lock(inner->mutex_);
1588         inner->isRadioFirstPowerOn_ = isFirstPowerOn;
1589     }
1590 }
1591 
FindManagerInner(int32_t slotId)1592 std::shared_ptr<NetworkSearchManagerInner> NetworkSearchManager::FindManagerInner(int32_t slotId)
1593 {
1594     {
1595         std::lock_guard<std::mutex> lock(mutexInner_);
1596         auto iter = mapManagerInner_.find(slotId);
1597         if (iter != mapManagerInner_.end()) {
1598             return iter->second;
1599         }
1600     }
1601     TELEPHONY_LOGE("NetworkSearchManager::FindManagerInner not find inner object. slotId:%{public}d", slotId);
1602     return nullptr;
1603 }
1604 
ClearManagerInner()1605 void NetworkSearchManager::ClearManagerInner()
1606 {
1607     for (int32_t slotId = 0; slotId < static_cast<int32_t>(mapManagerInner_.size()); slotId++) {
1608         auto inner = FindManagerInner(slotId);
1609         if (inner != nullptr) {
1610             std::lock_guard<std::mutex> lock(inner->mutex_);
1611             inner->networkSearchHandler_->UnregisterEvents();
1612         }
1613     }
1614     std::lock_guard<std::mutex> lock(mutexInner_);
1615     mapManagerInner_.clear();
1616 }
1617 
AddManagerInner(int32_t slotId,const std::shared_ptr<NetworkSearchManagerInner> & inner)1618 void NetworkSearchManager::AddManagerInner(int32_t slotId, const std::shared_ptr<NetworkSearchManagerInner> &inner)
1619 {
1620     if (inner != nullptr) {
1621         std::lock_guard<std::mutex> lock(mutexInner_);
1622         mapManagerInner_.emplace(slotId, inner);
1623         TELEPHONY_LOGE("NetworkSearchManager::AddManagerInner %{public}d %{public}zu", slotId, mapManagerInner_.size());
1624     }
1625 }
1626 
RemoveManagerInner(int32_t slotId)1627 bool NetworkSearchManager::RemoveManagerInner(int32_t slotId)
1628 {
1629     std::lock_guard<std::mutex> lock(mutexInner_);
1630     bool ret = (mapManagerInner_.erase(slotId) != 0);
1631     TELEPHONY_LOGE("NetworkSearchManager::RemoveManagerInner %{public}d %{public}zu", slotId, mapManagerInner_.size());
1632     return ret;
1633 }
1634 
TriggerSimRefresh(int32_t slotId)1635 void NetworkSearchManager::TriggerSimRefresh(int32_t slotId)
1636 {
1637     TELEPHONY_LOGD("NetworkSearchManager::TriggerSimRefresh  %{public}d", slotId);
1638     auto inner = FindManagerInner(slotId);
1639     if (inner != nullptr && simManager_ != nullptr) {
1640         if (inner->networkSearchHandler_ != nullptr) {
1641             simManager_->RegisterCoreNotify(slotId, inner->networkSearchHandler_, RadioEvent::RADIO_IMSI_LOADED_READY);
1642         }
1643     }
1644 }
1645 
TriggerTimezoneRefresh(int32_t slotId)1646 void NetworkSearchManager::TriggerTimezoneRefresh(int32_t slotId)
1647 {
1648     auto inner = FindManagerInner(slotId);
1649     if (inner != nullptr) {
1650         if (inner->networkSearchHandler_ != nullptr) {
1651             inner->networkSearchHandler_->TimezoneRefresh();
1652         }
1653     }
1654     TELEPHONY_LOGD("NetworkSearchManager::TriggerTimezoneRefresh slotId:%{public}d", slotId);
1655 }
1656 
InitAirplaneMode(int32_t slotId)1657 void NetworkSearchManager::InitAirplaneMode(int32_t slotId)
1658 {
1659     if (slotId < 0 || slotId > SIM_SLOT_COUNT) {
1660         return;
1661     }
1662     bool mode = false;
1663     if (GetAirplaneMode(mode) != TELEPHONY_SUCCESS) {
1664         TELEPHONY_LOGE("NetworkSearchManager::Init GetAirplaneMode fail");
1665         return;
1666     }
1667     SetLocalAirplaneMode(slotId, mode);
1668     TELEPHONY_LOGI("NetworkSearchManager::Init airplaneMode:%{public}d slotId:%{public}d", mode, slotId);
1669 }
1670 
GetAirplaneMode(bool & airplaneMode)1671 int32_t NetworkSearchManager::GetAirplaneMode(bool &airplaneMode)
1672 {
1673     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
1674     if (settingHelper == nullptr) {
1675         TELEPHONY_LOGI("settingHelper is null");
1676         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1677     }
1678 
1679     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
1680     std::string value = "";
1681     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_AIRPLANE_MODE;
1682     if (settingHelper->Query(uri, key, value) != TELEPHONY_SUCCESS) {
1683         TELEPHONY_LOGI("Query airplane mode fail");
1684         return TELEPHONY_ERR_DATABASE_READ_FAIL;
1685     }
1686     airplaneMode = value == "1";
1687     TELEPHONY_LOGI("Get airplane mode:%{public}d", airplaneMode);
1688     return TELEPHONY_SUCCESS;
1689 }
1690 
RegisterImsRegInfoCallback(int32_t slotId,ImsServiceType imsSrvType,const int32_t tokenId,const sptr<ImsRegInfoCallback> & callback)1691 int32_t NetworkSearchManager::RegisterImsRegInfoCallback(
1692     int32_t slotId, ImsServiceType imsSrvType, const int32_t tokenId, const sptr<ImsRegInfoCallback> &callback)
1693 {
1694     if (callback == nullptr) {
1695         TELEPHONY_LOGE("[slot%{public}d] callback is nullptr", slotId);
1696         return TELEPHONY_ERR_ARGUMENT_NULL;
1697     }
1698     std::lock_guard<std::mutex> lock(mutexIms_);
1699     auto iter = listImsRegInfoCallbackRecord_.begin();
1700     for (; iter != listImsRegInfoCallbackRecord_.end(); ++iter) {
1701         if ((iter->slotId == slotId) && (iter->imsSrvType == imsSrvType) && (iter->tokenId == tokenId)) {
1702             listImsRegInfoCallbackRecord_.erase(iter);
1703             TELEPHONY_LOGI("[slot%{public}d] callback is existent, delete old callback", slotId);
1704             break;
1705         }
1706     }
1707 
1708     ImsRegInfoCallbackRecord imsRecord;
1709     imsRecord.slotId = slotId;
1710     imsRecord.imsSrvType = imsSrvType;
1711     imsRecord.tokenId = tokenId;
1712     imsRecord.imsCallback = callback;
1713     listImsRegInfoCallbackRecord_.push_back(imsRecord);
1714     TELEPHONY_LOGD("[slot%{public}d] Register successfully, callback list size is %{public}zu", slotId,
1715         listImsRegInfoCallbackRecord_.size());
1716     return TELEPHONY_SUCCESS;
1717 }
1718 
UnregisterImsRegInfoCallback(int32_t slotId,ImsServiceType imsSrvType,const int32_t tokenId)1719 int32_t NetworkSearchManager::UnregisterImsRegInfoCallback(
1720     int32_t slotId, ImsServiceType imsSrvType, const int32_t tokenId)
1721 {
1722     bool isSuccess = false;
1723     std::lock_guard<std::mutex> lock(mutexIms_);
1724     auto iter = listImsRegInfoCallbackRecord_.begin();
1725     for (; iter != listImsRegInfoCallbackRecord_.end(); ++iter) {
1726         if ((iter->slotId == slotId) && (iter->imsSrvType == imsSrvType) && (iter->tokenId == tokenId)) {
1727             listImsRegInfoCallbackRecord_.erase(iter);
1728             isSuccess = true;
1729             break;
1730         }
1731     }
1732     if (!isSuccess) {
1733         TELEPHONY_LOGI("[slot%{public}d] Ignore unregister action, since callback is nonexistent", slotId);
1734         return TELEPHONY_SUCCESS;
1735     }
1736     TELEPHONY_LOGD("[slot%{public}d] Unregister successfully, callback list size is  %{public}zu", slotId,
1737         listImsRegInfoCallbackRecord_.size());
1738     return TELEPHONY_SUCCESS;
1739 }
1740 
NotifyImsRegInfoChanged(int32_t slotId,ImsServiceType imsSrvType,const ImsRegInfo & info)1741 void NetworkSearchManager::NotifyImsRegInfoChanged(int32_t slotId, ImsServiceType imsSrvType, const ImsRegInfo &info)
1742 {
1743     TELEPHONY_LOGI("slotId:%{public}d, imsSrvType:%{public}d, ImsRegState:%{public}d, ImsRegTech:%{public}d",
1744         slotId, imsSrvType, info.imsRegState, info.imsRegTech);
1745     int32_t callbackCounts = 0;
1746     std::lock_guard<std::mutex> lock(mutexIms_);
1747     for (auto iter : listImsRegInfoCallbackRecord_) {
1748         if ((iter.slotId == slotId) && (iter.imsSrvType == imsSrvType)) {
1749             if (iter.imsCallback == nullptr) {
1750                 TELEPHONY_LOGE("imsCallback is nullptr from listImsRegInfoCallbackRecord_");
1751                 continue;
1752             }
1753             iter.imsCallback->OnImsRegInfoChanged(slotId, imsSrvType, info);
1754             callbackCounts++;
1755         }
1756     }
1757     TELEPHONY_LOGI(
1758         "slotId:%{public}d, ImsServiceType:%{public}d, CallbackListSzie=%{public}zu, callbackCoutns:%{public}d",
1759         slotId, imsSrvType, listImsRegInfoCallbackRecord_.size(), callbackCounts);
1760 }
1761 
InitSimRadioProtocol(int32_t slotId)1762 void NetworkSearchManager::InitSimRadioProtocol(int32_t slotId)
1763 {
1764     if (simManager_ == nullptr) {
1765         TELEPHONY_LOGE("NetworkSearchManager::InitSimRadioProtocol simManager_ is nullptr");
1766         return;
1767     }
1768     simManager_->GetRadioProtocol(slotId);
1769 }
1770 
SetLocalAirplaneMode(int32_t slotId,bool state)1771 int32_t NetworkSearchManager::SetLocalAirplaneMode(int32_t slotId, bool state)
1772 {
1773     auto inner = FindManagerInner(slotId);
1774     if (inner == nullptr) {
1775         TELEPHONY_LOGE("SetLocalAirplaneMode inner is nullptr, slotId:%{public}d", slotId);
1776         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1777     }
1778     inner->airplaneMode_ = state;
1779     TELEPHONY_LOGD("SetLocalAirplaneMode slotId:%{public}d state:%{public}d", slotId, state);
1780     return TELEPHONY_SUCCESS;
1781 }
1782 
GetLocalAirplaneMode(int32_t slotId,bool & state)1783 int32_t NetworkSearchManager::GetLocalAirplaneMode(int32_t slotId, bool &state)
1784 {
1785     auto inner = FindManagerInner(slotId);
1786     if (inner == nullptr) {
1787         TELEPHONY_LOGE("GetLocalAirplaneMode inner is nullptr, slotId:%{public}d", slotId);
1788         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1789     }
1790     state = inner->airplaneMode_;
1791     TELEPHONY_LOGD("GetLocalAirplaneMode slotId:%{public}d state:%{public}d", slotId, state);
1792     return TELEPHONY_ERR_SUCCESS;
1793 }
1794 
SetBasebandVersion(int32_t slotId,std::string version)1795 void NetworkSearchManager::SetBasebandVersion(int32_t slotId, std::string version)
1796 {
1797     auto inner = FindManagerInner(slotId);
1798     if (inner == nullptr) {
1799         TELEPHONY_LOGE("NetworkSearchManager::SetBasebandVersion slotId:%{public}d", slotId);
1800         return;
1801     }
1802     inner->basebandVersion_ = version;
1803 }
1804 
GetBasebandVersion(int32_t slotId,std::string & version)1805 int32_t NetworkSearchManager::GetBasebandVersion(int32_t slotId, std::string &version)
1806 {
1807     TELEPHONY_LOGI("NetworkSearchManager::GetBasebandVersion start slotId:%{public}d", slotId);
1808     auto inner = FindManagerInner(slotId);
1809     if (inner == nullptr || eventSender_ == nullptr) {
1810         TELEPHONY_LOGE("slotId:%{public}d inner or eventSender_ is null", slotId);
1811         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1812     }
1813     if (inner->basebandVersion_.empty()) {
1814         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_BASEBAND_VERSION);
1815         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1816     }
1817     version = inner->basebandVersion_;
1818     return TELEPHONY_ERR_SUCCESS;
1819 }
1820 
GetNetworkCapability(int32_t slotId,int32_t networkCapabilityType,int32_t & networkCapabilityState)1821 int32_t NetworkSearchManager::GetNetworkCapability(
1822     int32_t slotId, int32_t networkCapabilityType, int32_t &networkCapabilityState)
1823 {
1824     TelephonyConfig telephonyConfig;
1825     bool isNrSupported =
1826         telephonyConfig.IsCapabilitySupport(static_cast<int32_t>(TelephonyConfig::ConfigType::MODEM_CAP_SUPPORT_NR));
1827     if (networkCapabilityType == SERVICE_TYPE_NR && !isNrSupported) {
1828         TELEPHONY_LOGE(
1829             "switch type and nr capability no match, networkCapabilityType:%{public}d isNrSupported:%{public}d",
1830             networkCapabilityType, isNrSupported);
1831         return TELEPHONY_ERR_FAIL;
1832     }
1833     int32_t preferredNetwork = PREFERRED_NETWORK_TYPE;
1834     GetCachePreferredNetworkValue(slotId, preferredNetwork);
1835     int32_t convertedType = ConvertNetworkModeToCapabilityType(preferredNetwork);
1836     if (networkCapabilityType == SERVICE_TYPE_NR && convertedType == SERVICE_TYPE_NR) {
1837         networkCapabilityState = SERVICE_ABILITY_ON;
1838     } else if (networkCapabilityType == SERVICE_TYPE_LTE &&
1839                (convertedType == SERVICE_TYPE_NR || convertedType == SERVICE_TYPE_LTE)) {
1840         networkCapabilityState = SERVICE_ABILITY_ON;
1841     } else {
1842         networkCapabilityState = SERVICE_ABILITY_OFF;
1843     }
1844     if (TELEPHONY_EXT_WRAPPER.getNetworkCapabilityExt_ != nullptr) {
1845         TELEPHONY_EXT_WRAPPER.getNetworkCapabilityExt_(slotId, networkCapabilityType, networkCapabilityState);
1846         return TELEPHONY_ERR_SUCCESS;
1847     }
1848     return TELEPHONY_ERR_SUCCESS;
1849 }
1850 
SetNetworkCapability(int32_t slotId,int32_t networkCapabilityType,int32_t networkCapabilityState)1851 int32_t NetworkSearchManager::SetNetworkCapability(
1852     int32_t slotId, int32_t networkCapabilityType, int32_t networkCapabilityState)
1853 {
1854     TelephonyConfig telephonyConfig;
1855     bool isNrSupported =
1856         telephonyConfig.IsCapabilitySupport(static_cast<int32_t>(TelephonyConfig::ConfigType::MODEM_CAP_SUPPORT_NR));
1857     if (networkCapabilityType == SERVICE_TYPE_NR && !isNrSupported) {
1858         TELEPHONY_LOGE(
1859             "switch type and nr capability no match, networkCapabilityType:%{public}d isNrSupported:%{public}d",
1860             networkCapabilityType, isNrSupported);
1861         return TELEPHONY_ERR_FAIL;
1862     }
1863     bool ret = false;
1864     if ((networkCapabilityType == SERVICE_TYPE_LTE && networkCapabilityState == SERVICE_ABILITY_ON) ||
1865         (networkCapabilityType == SERVICE_TYPE_NR && networkCapabilityState == SERVICE_ABILITY_OFF)) {
1866         ret = SetPreferredNetwork(
1867             slotId, static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_WCDMA_GSM));
1868     } else if (networkCapabilityType == SERVICE_TYPE_NR && networkCapabilityState == SERVICE_ABILITY_ON) {
1869         ret = SetPreferredNetwork(
1870             slotId, static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_WCDMA_GSM));
1871     } else if (networkCapabilityType == SERVICE_TYPE_LTE && networkCapabilityState == SERVICE_ABILITY_OFF) {
1872         ret = SetPreferredNetwork(
1873             slotId, static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_TDSCDMA_WCDMA_GSM_EVDO_CDMA));
1874     }
1875     if (!ret) {
1876         TELEPHONY_LOGE(
1877             "set preferred Network failed, networkCapabilityType:%{public}d networkCapabilityState:%{public}d",
1878             networkCapabilityType, networkCapabilityState);
1879         return TELEPHONY_ERR_FAIL;
1880     }
1881     return TELEPHONY_ERR_SUCCESS;
1882 }
1883 
ConvertNetworkModeToCapabilityType(int32_t preferredNetwork)1884 int32_t NetworkSearchManager::ConvertNetworkModeToCapabilityType(int32_t preferredNetwork)
1885 {
1886     int32_t capabilityType = SERVICE_TYPE_UNKNOWN;
1887     switch (preferredNetwork) {
1888         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE):
1889         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_WCDMA):
1890         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_WCDMA_GSM):
1891         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_EVDO_CDMA):
1892         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_WCDMA_GSM_EVDO_CDMA):
1893         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_TDSCDMA):
1894         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_TDSCDMA_GSM):
1895         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_TDSCDMA_WCDMA):
1896         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_TDSCDMA_WCDMA_GSM):
1897         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_LTE_TDSCDMA_WCDMA_GSM_EVDO_CDMA):
1898             capabilityType = SERVICE_TYPE_LTE;
1899             break;
1900         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR):
1901         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE):
1902         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_WCDMA):
1903         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_WCDMA_GSM):
1904         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_EVDO_CDMA):
1905         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_WCDMA_GSM_EVDO_CDMA):
1906         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_TDSCDMA):
1907         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_TDSCDMA_GSM):
1908         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_TDSCDMA_WCDMA):
1909         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_TDSCDMA_WCDMA_GSM):
1910         case static_cast<int32_t>(PreferredNetworkMode::CORE_NETWORK_MODE_NR_LTE_TDSCDMA_WCDMA_GSM_EVDO_CDMA):
1911             capabilityType = SERVICE_TYPE_NR;
1912             break;
1913         default:
1914             break;
1915     }
1916     return capabilityType;
1917 }
1918 
GetNrSsbId(int32_t slotId,const std::shared_ptr<NrSsbInformation> & nrSsbInformation)1919 int32_t NetworkSearchManager::GetNrSsbId(int32_t slotId, const std::shared_ptr<NrSsbInformation> &nrSsbInformation)
1920 {
1921     TELEPHONY_LOGD("Start slotId:%{public}d", slotId);
1922     auto inner = FindManagerInner(slotId);
1923     if (inner == nullptr) {
1924         TELEPHONY_LOGE("inner is null");
1925         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1926     }
1927     std::unique_lock<std::mutex> lck(ctx_);
1928     ssbResponseReady_ = false;
1929     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_NR_SSBID_INFO);
1930     while (!ssbResponseReady_) {
1931         TELEPHONY_LOGD("Wait(), response = false");
1932         if (cv_.wait_for(lck, std::chrono::seconds(GET_SSB_WAIT_TIME_SECOND)) == std::cv_status::timeout) {
1933             break;
1934         }
1935     }
1936     if (!ssbResponseReady_) {
1937         TELEPHONY_LOGE("Wait() is timeout");
1938         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1939     }
1940     if (inner->networkSearchHandler_ != nullptr) {
1941         TELEPHONY_LOGE("Start to get ssbid's response");
1942         inner->networkSearchHandler_->GetNrSsbId(nrSsbInformation);
1943         return TELEPHONY_ERR_SUCCESS;
1944     }
1945     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1946 }
1947 
IsGsm(int32_t slotId,bool & isGsm)1948 int32_t NetworkSearchManager::IsGsm(int32_t slotId, bool &isGsm)
1949 {
1950     auto inner = FindManagerInner(slotId);
1951     if (inner == nullptr) {
1952         TELEPHONY_LOGE("NetworkSearchManager::IsGsm Failed slotId:%{public}d", slotId);
1953         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1954     }
1955     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
1956         TELEPHONY_LOGE("NetworkSearchManager::IsGsm failed due to nullptr!");
1957         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1958     }
1959     isGsm = inner->networkSearchState_->GetNetworkStatus()->IsGsm();
1960     TELEPHONY_LOGD("NetworkSearchManager::IsGsm result=%{public}d slotId:%{public}d", isGsm, slotId);
1961     return TELEPHONY_ERR_SUCCESS;
1962 }
1963 
IsCdma(int32_t slotId,bool & isCdma)1964 int32_t NetworkSearchManager::IsCdma(int32_t slotId, bool &isCdma)
1965 {
1966     auto inner = FindManagerInner(slotId);
1967     if (inner == nullptr) {
1968         TELEPHONY_LOGE("NetworkSearchManager::IsCdma Failed slotId:%{public}d", slotId);
1969         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1970     }
1971     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
1972         TELEPHONY_LOGE("NetworkSearchManager::IsCdma failed due to nullptr!");
1973         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1974     }
1975     isCdma = inner->networkSearchState_->GetNetworkStatus()->IsCdma();
1976     TELEPHONY_LOGD("NetworkSearchManager::IsCdma result=%{public}d slotId:%{public}d", isCdma, slotId);
1977     return TELEPHONY_ERR_SUCCESS;
1978 }
1979 
SetResidentNetworkNumeric(int32_t slotId,std::string residentNetworkNumeric)1980 void NetworkSearchManager::SetResidentNetworkNumeric(int32_t slotId, std::string residentNetworkNumeric)
1981 {
1982     auto inner = FindManagerInner(slotId);
1983     if (inner != nullptr) {
1984         inner->residentNetworkNumeric_ = residentNetworkNumeric;
1985     }
1986 }
1987 
GetResidentNetworkNumeric(int32_t slotId)1988 std::string NetworkSearchManager::GetResidentNetworkNumeric(int32_t slotId)
1989 {
1990     auto inner = FindManagerInner(slotId);
1991     if (inner == nullptr) {
1992         TELEPHONY_LOGE("inner is null");
1993         return "";
1994     }
1995     return inner->residentNetworkNumeric_;
1996 }
1997 
ProcessSignalIntensity(int32_t slotId,const Rssi & signalIntensity)1998 int32_t NetworkSearchManager::ProcessSignalIntensity(int32_t slotId, const Rssi &signalIntensity)
1999 {
2000     auto inner = FindManagerInner(slotId);
2001     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
2002         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
2003         return TELEPHONY_ERR_LOCAL_PTR_NULL;
2004     }
2005     inner->networkSearchHandler_->ProcessSignalIntensity(slotId, signalIntensity);
2006     return TELEPHONY_ERR_SUCCESS;
2007 }
2008 
StartRadioOnState(int32_t slotId)2009 int32_t NetworkSearchManager::StartRadioOnState(int32_t slotId)
2010 {
2011     auto inner = FindManagerInner(slotId);
2012     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
2013         TELEPHONY_LOGE("NetworkSearchManager::StartRadioOnState slotId:%{public}d inner is null", slotId);
2014         return TELEPHONY_ERR_LOCAL_PTR_NULL;
2015     }
2016     inner->networkSearchHandler_->RadioOnState();
2017     return TELEPHONY_ERR_SUCCESS;
2018 }
2019 
StartGetRilSignalIntensity(int32_t slotId)2020 int32_t NetworkSearchManager::StartGetRilSignalIntensity(int32_t slotId)
2021 {
2022     auto inner = FindManagerInner(slotId);
2023     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
2024         TELEPHONY_LOGE("NetworkSearchManager::StartGetRilSignalIntensity slotId:%{public}d inner is null", slotId);
2025         return TELEPHONY_ERR_LOCAL_PTR_NULL;
2026     }
2027     inner->networkSearchHandler_->GetRilSignalIntensity(false);
2028     return TELEPHONY_ERR_SUCCESS;
2029 }
2030 
UpdateOperatorName(int32_t slotId)2031 int32_t NetworkSearchManager::UpdateOperatorName(int32_t slotId)
2032 {
2033     auto inner = FindManagerInner(slotId);
2034     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
2035         TELEPHONY_LOGE("NetworkSearchManager::UpdateOperatorName slotId:%{public}d inner is null", slotId);
2036         return TELEPHONY_ERR_LOCAL_PTR_NULL;
2037     }
2038     inner->networkSearchHandler_->UpdateOperatorName();
2039     return TELEPHONY_ERR_SUCCESS;
2040 }
2041 
UpdateDeviceId(int32_t slotId)2042 void NetworkSearchManager::UpdateDeviceId(int32_t slotId)
2043 {
2044     auto inner = FindManagerInner(slotId);
2045     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
2046         TELEPHONY_LOGE("NetworkSearchManager::UpdateOperatorName slotId:%{public}d inner is null", slotId);
2047     }
2048     if (eventSender_==nullptr) {
2049         TELEPHONY_LOGE("NetworSearchManager::UpdateDeviceId eventSender_ is null");
2050         return;
2051     }
2052     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_IMEI);
2053     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_IMEISV);
2054     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_MEID);
2055     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_BASEBAND_VERSION);
2056 }
2057 } // namespace Telephony
2058 } // namespace OHOS
2059