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