• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 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 "mcc_pool.h"
25 #include "network_search_types.h"
26 #include "telephony_errors.h"
27 #include "telephony_log_wrapper.h"
28 
29 namespace OHOS {
30 namespace Telephony {
31 namespace {
32 const std::string KEY_DEFAULT_PREFERRED_NETWORK_MODE = "preferred_network_mode";
33 const int32_t AIRPLANE_MODE_UNSUPPORT = 0;
34 const int32_t AIRPLANE_MODE_SUPPORT = 1;
35 const std::string SUPPORT_AIRPLANE_MODE_PARAM = "persist.sys.support_air_plane_mode";
36 const int32_t IS_SUPPORT_AIRPLANE_MODE = system::GetIntParameter(SUPPORT_AIRPLANE_MODE_PARAM, AIRPLANE_MODE_UNSUPPORT);
37 const size_t MCC_LEN = 3;
38 } // namespace
39 
NetworkSearchManager(std::shared_ptr<ITelRilManager> telRilManager,std::shared_ptr<ISimManager> simManager)40 NetworkSearchManager::NetworkSearchManager(
41     std::shared_ptr<ITelRilManager> telRilManager, std::shared_ptr<ISimManager> simManager)
42     : telRilManager_(telRilManager), simManager_(simManager)
43 {
44     TELEPHONY_LOGI("NetworkSearchManager");
45 }
46 
~NetworkSearchManager()47 NetworkSearchManager::~NetworkSearchManager()
48 {
49     for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; slotId++) {
50         std::shared_ptr<NetworkSearchManagerInner> inner = FindManagerInner(slotId);
51         if (inner != nullptr) {
52             inner->UnRegisterSetting();
53             inner->UnRegisterDeviceStateObserver();
54         }
55     }
56 }
57 
InitPointer(std::shared_ptr<NetworkSearchManagerInner> & inner,int32_t slotId)58 bool NetworkSearchManager::InitPointer(std::shared_ptr<NetworkSearchManagerInner> &inner, int32_t slotId)
59 {
60     if (inner == nullptr) {
61         TELEPHONY_LOGE("NetworkSearchManager::InitPointer failed . inner is null");
62         return false;
63     }
64     std::string name = "NetworkSearchManager_";
65     name.append(std::to_string(slotId));
66     inner->eventLoop_ = AppExecFwk::EventRunner::Create(name.c_str());
67     if (inner->eventLoop_.get() == nullptr) {
68         TELEPHONY_LOGE("NetworkSearchManager failed to create EventRunner slotId:%{public}d", slotId);
69         return false;
70     }
71     inner->observerHandler_ = std::make_unique<ObserverHandler>();
72     if (inner->observerHandler_ == nullptr) {
73         TELEPHONY_LOGE("failed to create new ObserverHandler slotId:%{public}d", slotId);
74         return false;
75     }
76     inner->networkSearchState_ = std::make_shared<NetworkSearchState>(shared_from_this(), slotId);
77     if (inner->networkSearchState_ == nullptr) {
78         TELEPHONY_LOGE("failed to create new NetworkSearchState slotId:%{public}d", slotId);
79         return false;
80     }
81     inner->networkSearchHandler_ = std::make_shared<NetworkSearchHandler>(
82         inner->eventLoop_, shared_from_this(), telRilManager_, simManager_, slotId);
83     if (inner->networkSearchHandler_ == nullptr) {
84         TELEPHONY_LOGE("failed to create new NetworkSearchHandler slotId:%{public}d", slotId);
85         return false;
86     }
87     inner->networkSearchResult_ = std::make_unique<NetworkSearchResult>();
88     if (inner->networkSearchResult_ == nullptr) {
89         TELEPHONY_LOGE("failed to create new NetworkSearchResult slotId:%{public}d", slotId);
90         return false;
91     }
92     inner->deviceStateHandler_ = std::make_shared<DeviceStateHandler>(shared_from_this(), telRilManager_, slotId);
93     if (inner->deviceStateHandler_ == nullptr) {
94         TELEPHONY_LOGE("failed to create new DeviceStateHandler slotId:%{public}d", slotId);
95         return false;
96     }
97 
98     return true;
99 }
100 
RegisterSetting()101 bool NetworkSearchManagerInner::RegisterSetting()
102 {
103     settingAutoTimeObserver_ = new AutoTimeObserver(networkSearchHandler_);
104     settingAutoTimezoneObserver_ = new AutoTimezoneObserver(networkSearchHandler_);
105     airplaneModeObserver_ = new AirplaneModeObserver(networkSearchHandler_);
106     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
107     if (settingAutoTimeObserver_ == nullptr || settingAutoTimezoneObserver_ == nullptr ||
108         airplaneModeObserver_ == nullptr || settingHelper == nullptr) {
109         TELEPHONY_LOGE("NetworkSearchManager::RegisterSetting is null.");
110         return false;
111     }
112 
113     Uri autoTimeUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIME_URI);
114     Uri autoTimezoneUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIMEZONE_URI);
115     Uri airplaneModeUri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
116     settingHelper->RegisterSettingsObserver(autoTimeUri, settingAutoTimeObserver_);
117     settingHelper->RegisterSettingsObserver(autoTimezoneUri, settingAutoTimezoneObserver_);
118     settingHelper->RegisterSettingsObserver(airplaneModeUri, airplaneModeObserver_);
119     return true;
120 }
121 
UnRegisterSetting()122 bool NetworkSearchManagerInner::UnRegisterSetting()
123 {
124     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
125     if (settingHelper == nullptr) {
126         TELEPHONY_LOGE("NetworkSearchManager::UnRegisterSetting is null.");
127         return false;
128     }
129 
130     Uri autoTimeUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIME_URI);
131     Uri autoTimezoneUri(SettingUtils::NETWORK_SEARCH_SETTING_AUTO_TIMEZONE_URI);
132     Uri airplaneModeUri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
133     settingHelper->UnRegisterSettingsObserver(autoTimeUri, settingAutoTimeObserver_);
134     settingHelper->UnRegisterSettingsObserver(autoTimezoneUri, settingAutoTimezoneObserver_);
135     settingHelper->UnRegisterSettingsObserver(airplaneModeUri, airplaneModeObserver_);
136     return true;
137 }
138 
RegisterDeviceStateObserver()139 bool NetworkSearchManagerInner::RegisterDeviceStateObserver()
140 {
141     deviceStateObserver_ = std::make_shared<DeviceStateObserver>();
142     deviceStateObserver_->StartEventSubscriber(deviceStateHandler_);
143     return true;
144 }
145 
UnRegisterDeviceStateObserver()146 bool NetworkSearchManagerInner::UnRegisterDeviceStateObserver()
147 {
148     if (deviceStateObserver_ == nullptr) {
149         TELEPHONY_LOGE("NetworkSearchManager::UnRegisterDeviceStateObserver deviceStateObserver_ is null.");
150         return false;
151     }
152     deviceStateObserver_->StopEventSubscriber();
153     return true;
154 }
155 
OnInit()156 bool NetworkSearchManager::OnInit()
157 {
158     TELEPHONY_LOGI("NetworkSearchManager::Init");
159     if (telRilManager_ == nullptr) {
160         TELEPHONY_LOGE("NetworkSearchManager::Init telRilManager_ is null.");
161         return false;
162     }
163     if (simManager_ == nullptr) {
164         TELEPHONY_LOGE("NetworkSearchManager::Init simManager_ is null.");
165         return false;
166     }
167     eventSender_ = std::make_unique<EventSender>(telRilManager_, shared_from_this());
168     if (eventSender_ == nullptr) {
169         TELEPHONY_LOGE("failed to create new EventSender");
170         return false;
171     }
172     ClearManagerInner();
173     for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; slotId++) {
174         std::shared_ptr<NetworkSearchManagerInner> inner = FindManagerInner(slotId);
175         if (inner == nullptr) {
176             inner = std::make_shared<NetworkSearchManagerInner>();
177             AddManagerInner(slotId, inner);
178         }
179         if (inner != nullptr) {
180             if (inner->state_ == HandleRunningState::STATE_RUNNING) {
181                 TELEPHONY_LOGE("NetworkSearchManager::Init HandleRunningState is running. slotId:%{public}d", slotId);
182                 continue;
183             }
184             if (!InitPointer(inner, slotId)) {
185                 ClearManagerInner();
186                 return false;
187             }
188             if (!inner->Init()) {
189                 ClearManagerInner();
190                 return false;
191             }
192             TELEPHONY_LOGI("NetworkSearchManager::Init inner init slotId:%{public}d", slotId);
193             // Prevent running crash and query the radio status at startup
194             eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_STATUS);
195         }
196     }
197     TELEPHONY_LOGI("NetworkSearchManager::Init success");
198     return true;
199 }
200 
GetNetworkSearchState(int32_t slotId)201 std::shared_ptr<NetworkSearchState> NetworkSearchManager::GetNetworkSearchState(int32_t slotId)
202 {
203     auto inner = FindManagerInner(slotId);
204     if (inner != nullptr) {
205         TELEPHONY_LOGD("NetworkSearchManager::GetNetworkSearchState slotId:%{public}d", slotId);
206         return inner->networkSearchState_;
207     }
208     return nullptr;
209 }
210 
SetRadioState(int32_t slotId,bool isOn,int32_t rst)211 void NetworkSearchManager::SetRadioState(int32_t slotId, bool isOn, int32_t rst)
212 {
213     TELEPHONY_LOGD("NetworkSearchManager SetRadioState isOn:%{public}d slotId:%{public}d", isOn, slotId);
214     auto inner = FindManagerInner(slotId);
215     if (inner == nullptr) {
216         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
217         return;
218     }
219     int32_t fun = static_cast<int32_t>(isOn);
220     eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_STATUS, fun, rst);
221 }
222 
SetRadioState(int32_t slotId,bool isOn,int32_t rst,NSCALLBACK & callback)223 int32_t NetworkSearchManager::SetRadioState(int32_t slotId, bool isOn, int32_t rst, NSCALLBACK &callback)
224 {
225     TELEPHONY_LOGD("NetworkSearchManager SetRadioState isOn:%{public}d slotId:%{public}d", isOn, slotId);
226     auto inner = FindManagerInner(slotId);
227     if (inner == nullptr) {
228         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
229         return TELEPHONY_ERR_LOCAL_PTR_NULL;
230     }
231     AirplaneMode_ = isOn ? false : true;
232     int32_t fun = static_cast<int32_t>(isOn);
233     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_SET_STATUS, &callback, fun, rst)) {
234         TELEPHONY_LOGE("slotId:%{public}d SetRadioState SendCallback failed.", slotId);
235         return CORE_SERVICE_SEND_CALLBACK_FAILED;
236     }
237     return TELEPHONY_ERR_SUCCESS;
238 }
239 
RegisterCoreNotify(int32_t slotId,HANDLE & handler,int32_t what)240 void NetworkSearchManager::RegisterCoreNotify(int32_t slotId, HANDLE &handler, int32_t what)
241 {
242     TELEPHONY_LOGD("NetworkSearchManager::RegisterCoreNotify %{public}d slotId:%{public}d", what, slotId);
243     auto inner = FindManagerInner(slotId);
244     if (inner != nullptr) {
245         if (inner->observerHandler_ != nullptr) {
246             inner->observerHandler_->RegObserver(what, handler);
247         }
248     }
249 }
250 
UnRegisterCoreNotify(int32_t slotId,HANDLE & handler,int32_t what)251 void NetworkSearchManager::UnRegisterCoreNotify(int32_t slotId, HANDLE &handler, int32_t what)
252 {
253     TELEPHONY_LOGD("NetworkSearchManager::UnRegisterCoreNotify %{public}d slotId:%{public}d", what, slotId);
254     auto inner = FindManagerInner(slotId);
255     if (inner != nullptr) {
256         if (inner->observerHandler_ != nullptr) {
257             inner->observerHandler_->Remove(what, handler);
258         }
259     }
260 }
261 
RegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> & callback)262 void NetworkSearchManager::RegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> &callback)
263 {
264     cellularDataCallBack_ = callback;
265 }
266 
UnRegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> & callback)267 void NetworkSearchManager::UnRegisterCellularDataObject(const sptr<NetworkSearchCallBackBase> &callback)
268 {
269     cellularDataCallBack_ = nullptr;
270 }
271 
RegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> & callback)272 void NetworkSearchManager::RegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> &callback)
273 {
274     cellularCallCallBack_ = callback;
275 }
276 
UnRegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> & callback)277 void NetworkSearchManager::UnRegisterCellularCallObject(const sptr<NetworkSearchCallBackBase> &callback)
278 {
279     cellularCallCallBack_ = nullptr;
280 }
281 
NotifyPsRoamingOpenChanged(int32_t slotId)282 void NetworkSearchManager::NotifyPsRoamingOpenChanged(int32_t slotId)
283 {
284     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsRoamingOpenChanged slotId:%{public}d", slotId);
285     auto inner = FindManagerInner(slotId);
286     if (inner != nullptr) {
287         if (inner->observerHandler_ != nullptr) {
288             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_ROAMING_OPEN);
289         }
290     }
291 }
292 
NotifyPsRoamingCloseChanged(int32_t slotId)293 void NetworkSearchManager::NotifyPsRoamingCloseChanged(int32_t slotId)
294 {
295     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsRoamingCloseChanged slotId:%{public}d", slotId);
296     auto inner = FindManagerInner(slotId);
297     if (inner != nullptr) {
298         if (inner->observerHandler_ != nullptr) {
299             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_ROAMING_CLOSE);
300         }
301     }
302 }
303 
NotifyEmergencyOpenChanged(int32_t slotId)304 void NetworkSearchManager::NotifyEmergencyOpenChanged(int32_t slotId)
305 {
306     TELEPHONY_LOGD("NetworkSearchManager::NotifyEmergencyOpenChanged slotId:%{public}d", slotId);
307     auto inner = FindManagerInner(slotId);
308     if (inner != nullptr) {
309         if (inner->observerHandler_ != nullptr) {
310             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_EMERGENCY_STATE_OPEN);
311         }
312     }
313 }
314 
NotifyEmergencyCloseChanged(int32_t slotId)315 void NetworkSearchManager::NotifyEmergencyCloseChanged(int32_t slotId)
316 {
317     TELEPHONY_LOGD("NetworkSearchManager::NotifyEmergencyCloseChanged slotId:%{public}d", slotId);
318     auto inner = FindManagerInner(slotId);
319     if (inner != nullptr) {
320         if (inner->observerHandler_ != nullptr) {
321             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_EMERGENCY_STATE_CLOSE);
322         }
323     }
324 }
325 
NotifyPsRatChanged(int32_t slotId)326 void NetworkSearchManager::NotifyPsRatChanged(int32_t slotId)
327 {
328     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsRatChanged slotId:%{public}d", slotId);
329     auto inner = FindManagerInner(slotId);
330     if (inner != nullptr) {
331         if (inner->observerHandler_ != nullptr) {
332             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_RAT_CHANGED);
333         }
334     }
335 }
336 
NotifyPsConnectionAttachedChanged(int32_t slotId)337 void NetworkSearchManager::NotifyPsConnectionAttachedChanged(int32_t slotId)
338 {
339     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsConnectionAttachedChanged slotId:%{public}d", slotId);
340     auto inner = FindManagerInner(slotId);
341     if (inner != nullptr) {
342         if (inner->observerHandler_ != nullptr) {
343             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_CONNECTION_ATTACHED);
344         }
345     }
346 }
347 
NotifyPsConnectionDetachedChanged(int32_t slotId)348 void NetworkSearchManager::NotifyPsConnectionDetachedChanged(int32_t slotId)
349 {
350     TELEPHONY_LOGD("NetworkSearchManager::NotifyPsConnectionDetachedChanged slotId:%{public}d", slotId);
351     auto inner = FindManagerInner(slotId);
352     if (inner != nullptr) {
353         if (inner->observerHandler_ != nullptr) {
354             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_PS_CONNECTION_DETACHED);
355         }
356     }
357 }
358 
NotifyNrStateChanged(int32_t slotId)359 void NetworkSearchManager::NotifyNrStateChanged(int32_t slotId)
360 {
361     TELEPHONY_LOGD("NetworkSearchManager::NotifyNrStateChanged slotId:%{public}d", slotId);
362     auto inner = FindManagerInner(slotId);
363     if (inner != nullptr) {
364         if (inner->observerHandler_ != nullptr) {
365             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_NR_STATE_CHANGED);
366         }
367     }
368 }
369 
NotifyNrFrequencyChanged(int32_t slotId)370 void NetworkSearchManager::NotifyNrFrequencyChanged(int32_t slotId)
371 {
372     TELEPHONY_LOGD("NetworkSearchManager::NotifyNrFrequencyChanged slotId:%{public}d", slotId);
373     auto inner = FindManagerInner(slotId);
374     if (inner != nullptr) {
375         if (inner->observerHandler_ != nullptr) {
376             inner->observerHandler_->NotifyObserver(RadioEvent::RADIO_NR_FREQUENCY_CHANGED);
377         }
378     }
379 }
380 
GetPsRadioTech(int32_t slotId,int32_t & psRadioTech)381 int32_t NetworkSearchManager::GetPsRadioTech(int32_t slotId, int32_t &psRadioTech)
382 {
383     auto inner = FindManagerInner(slotId);
384     if (inner == nullptr) {
385         TELEPHONY_LOGE("NetworkSearchManager::GetPsRadioTech Failed slotId:%{public}d", slotId);
386         return TELEPHONY_ERR_LOCAL_PTR_NULL;
387     }
388     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
389         TELEPHONY_LOGE("NetworkSearchManager::GetPsRadioTech failed due to nullptr!");
390         return TELEPHONY_ERR_LOCAL_PTR_NULL;
391     }
392     psRadioTech = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetPsRadioTech());
393     TELEPHONY_LOGD("NetworkSearchManager::GetPsRadioTech result=%{public}d slotId:%{public}d", psRadioTech, slotId);
394     return TELEPHONY_ERR_SUCCESS;
395 }
396 
GetCsRadioTech(int32_t slotId,int32_t & csRadioTech)397 int32_t NetworkSearchManager::GetCsRadioTech(int32_t slotId, int32_t &csRadioTech)
398 {
399     auto inner = FindManagerInner(slotId);
400     if (inner == nullptr) {
401         TELEPHONY_LOGE("NetworkSearchManager::GetCsRadioTech Failed slotId:%{public}d", slotId);
402         return TELEPHONY_ERR_LOCAL_PTR_NULL;
403     }
404     if ((inner->networkSearchState_ == nullptr) || (inner->networkSearchState_->GetNetworkStatus() == nullptr)) {
405         TELEPHONY_LOGE("NetworkSearchManager::GetCsRadioTech failed due to nullptr!");
406         return TELEPHONY_ERR_LOCAL_PTR_NULL;
407     }
408     csRadioTech = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetCsRadioTech());
409     TELEPHONY_LOGD("NetworkSearchManager::GetCsRadioTech result=%{public}d slotId:%{public}d", csRadioTech, slotId);
410     return TELEPHONY_ERR_SUCCESS;
411 }
412 
GetPsRegState(int32_t slotId)413 int32_t NetworkSearchManager::GetPsRegState(int32_t slotId)
414 {
415     auto inner = FindManagerInner(slotId);
416     if (inner != nullptr) {
417         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
418             auto event = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetPsRegStatus());
419             TELEPHONY_LOGD("NetworkSearchManager::GetPsRegState result=%{public}d slotId:%{public}d", event, slotId);
420             return event;
421         }
422         TELEPHONY_LOGE("NetworkSearchManager::GetPsRegState failed due to nullptr!");
423     }
424     TELEPHONY_LOGE("NetworkSearchManager::GetPsRegState Failed slotId:%{public}d", slotId);
425     return TELEPHONY_ERROR;
426 }
427 
GetCsRegState(int32_t slotId)428 int32_t NetworkSearchManager::GetCsRegState(int32_t slotId)
429 {
430     auto inner = FindManagerInner(slotId);
431     if (inner != nullptr) {
432         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
433             auto event = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetCsRegStatus());
434             TELEPHONY_LOGD("NetworkSearchManager::GetCsRegState result=%{public}d slotId:%{public}d", event, slotId);
435             return event;
436         }
437         TELEPHONY_LOGE("NetworkSearchManager::GetCsRegState failed due to nullptr!");
438     }
439     TELEPHONY_LOGE("NetworkSearchManager::GetCsRegState Failed slotId:%{public}d", slotId);
440     return TELEPHONY_ERROR;
441 }
442 
GetPsRoamingState(int32_t slotId)443 int32_t NetworkSearchManager::GetPsRoamingState(int32_t slotId)
444 {
445     auto inner = FindManagerInner(slotId);
446     if (inner != nullptr) {
447         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
448             auto event = static_cast<int32_t>(inner->networkSearchState_->GetNetworkStatus()->GetPsRoamingStatus());
449             TELEPHONY_LOGD(
450                 "NetworkSearchManager::GetPsRoamingState result=%{public}d slotId:%{public}d", event, slotId);
451             return event;
452         }
453         TELEPHONY_LOGE("NetworkSearchManager::GetPsRoamingState failed due to nullptr!");
454     }
455     TELEPHONY_LOGE("NetworkSearchManager::GetPsRoamingState Failed slotId:%{public}d", slotId);
456     return TELEPHONY_ERROR;
457 }
458 
GetOperatorNumeric(int32_t slotId)459 std::u16string NetworkSearchManager::GetOperatorNumeric(int32_t slotId)
460 {
461     TELEPHONY_LOGD("NetworkSearchManager::GetOperatorNumeric start slotId:%{public}d", slotId);
462     std::u16string str;
463     auto inner = FindManagerInner(slotId);
464     if (inner != nullptr) {
465         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
466             auto event = inner->networkSearchState_->GetNetworkStatus()->GetPlmnNumeric();
467             str = Str8ToStr16(event);
468             TELEPHONY_LOGD(
469                 "NetworkSearchManager::GetOperatorNumeric result=%{public}s slotId:%{public}d", event.c_str(), slotId);
470         }
471     }
472     return str;
473 }
474 
GetOperatorName(int32_t slotId,std::u16string & operatorName)475 int32_t NetworkSearchManager::GetOperatorName(int32_t slotId, std::u16string &operatorName)
476 {
477     operatorName = u"";
478     auto inner = FindManagerInner(slotId);
479     if (inner != nullptr) {
480         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
481             auto longOperatorName = inner->networkSearchState_->GetNetworkStatus()->GetLongOperatorName();
482             operatorName = Str8ToStr16(longOperatorName);
483             TELEPHONY_LOGD("NetworkSearchManager::GetOperatorName result:%{public}s slotId:%{public}d",
484                 longOperatorName.c_str(), slotId);
485             return TELEPHONY_ERR_SUCCESS;
486         }
487     }
488     return TELEPHONY_ERR_SLOTID_INVALID;
489 }
490 
GetNetworkStatus(int32_t slotId,sptr<NetworkState> & networkState)491 int32_t NetworkSearchManager::GetNetworkStatus(int32_t slotId, sptr<NetworkState> &networkState)
492 {
493     auto inner = FindManagerInner(slotId);
494     if (inner != nullptr) {
495         if (inner->networkSearchState_ != nullptr) {
496             networkState = inner->networkSearchState_->GetNetworkStatus().release();
497             return TELEPHONY_ERR_SUCCESS;
498         }
499     }
500     return TELEPHONY_ERR_SLOTID_INVALID;
501 }
502 
SetRadioStateValue(int32_t slotId,ModemPowerState radioState)503 void NetworkSearchManager::SetRadioStateValue(int32_t slotId, ModemPowerState radioState)
504 {
505     auto inner = FindManagerInner(slotId);
506     if (inner != nullptr) {
507         inner->radioState_ = radioState;
508     }
509 }
510 
SetNetworkSelectionValue(int32_t slotId,SelectionMode selection)511 void NetworkSearchManager::SetNetworkSelectionValue(int32_t slotId, SelectionMode selection)
512 {
513     auto inner = FindManagerInner(slotId);
514     if (inner != nullptr) {
515         inner->selection_ = selection;
516     }
517 }
518 
GetRadioState(int32_t slotId)519 int32_t NetworkSearchManager::GetRadioState(int32_t slotId)
520 {
521     auto inner = FindManagerInner(slotId);
522     if (inner != nullptr) {
523         return inner->radioState_;
524     }
525     return ModemPowerState::CORE_SERVICE_POWER_NOT_AVAILABLE;
526 }
527 
GetRadioState(int32_t slotId,NSCALLBACK & callback)528 int32_t NetworkSearchManager::GetRadioState(int32_t slotId, NSCALLBACK &callback)
529 {
530     TELEPHONY_LOGD("NetworkSearchManager::GetRadioState... slotId:%{public}d", slotId);
531     auto inner = FindManagerInner(slotId);
532     if (inner == nullptr) {
533         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
534         return TELEPHONY_ERR_LOCAL_PTR_NULL;
535     }
536     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_GET_STATUS, &callback)) {
537         TELEPHONY_LOGE("slotId:%{public}d GetRadioState SendCallback failed.", slotId);
538         return CORE_SERVICE_SEND_CALLBACK_FAILED;
539     }
540     return TELEPHONY_ERR_SUCCESS;
541 }
542 
GetSignalInfoList(int32_t slotId,std::vector<sptr<SignalInformation>> & signals)543 int32_t NetworkSearchManager::GetSignalInfoList(int32_t slotId, std::vector<sptr<SignalInformation>> &signals)
544 {
545     auto inner = FindManagerInner(slotId);
546     if (inner == nullptr || inner->networkSearchHandler_ == nullptr) {
547         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
548         return TELEPHONY_ERR_LOCAL_PTR_NULL;
549     }
550     inner->networkSearchHandler_->GetSignalInfo(signals);
551     return TELEPHONY_ERR_SUCCESS;
552 }
553 
GetNetworkSearchInformation(int32_t slotId,NSCALLBACK & callback)554 int32_t NetworkSearchManager::GetNetworkSearchInformation(int32_t slotId, NSCALLBACK &callback)
555 {
556     auto inner = FindManagerInner(slotId);
557     if (inner == nullptr) {
558         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
559         return TELEPHONY_ERR_LOCAL_PTR_NULL;
560     }
561     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_NETWORK_SEARCH_RESULT, &callback)) {
562         TELEPHONY_LOGE("slotId:%{public}d GetNetworkSearchInformation SendCallback failed.", slotId);
563         return CORE_SERVICE_SEND_CALLBACK_FAILED;
564     }
565     return TELEPHONY_ERR_SUCCESS;
566 }
567 
SetNetworkSearchResultValue(int32_t slotId,int32_t listSize,const std::vector<NetworkInformation> & operatorInfo)568 void NetworkSearchManager::SetNetworkSearchResultValue(
569     int32_t slotId, int32_t listSize, const std::vector<NetworkInformation> &operatorInfo)
570 {
571     auto inner = FindManagerInner(slotId);
572     if (inner != nullptr) {
573         if (inner->networkSearchResult_ != nullptr) {
574             inner->networkSearchResult_->SetNetworkSearchResultValue(listSize, operatorInfo);
575         }
576     }
577 }
578 
GetNetworkSearchInformationValue(int32_t slotId)579 sptr<NetworkSearchResult> NetworkSearchManager::GetNetworkSearchInformationValue(int32_t slotId)
580 {
581     sptr<NetworkSearchResult> networkSearchResult = new (std::nothrow) NetworkSearchResult;
582     if (networkSearchResult == nullptr) {
583         TELEPHONY_LOGE(
584             "GetNetworkSearchInformationValue failed to create new NetWorkSearchResult slotId:%{public}d", slotId);
585         return nullptr;
586     }
587 
588     auto inner = FindManagerInner(slotId);
589     if (inner != nullptr) {
590         if (inner->networkSearchResult_ == nullptr) {
591             TELEPHONY_LOGE("GetNetworkSearchInformationValue networkSearchResult_ is null slotId:%{public}d", slotId);
592             return nullptr;
593         }
594 
595         int32_t listSize = inner->networkSearchResult_->GetNetworkSearchInformationSize();
596         std::vector<NetworkInformation> operatorInfoList = inner->networkSearchResult_->GetNetworkSearchInformation();
597         networkSearchResult->SetNetworkSearchResultValue(listSize, operatorInfoList);
598         return networkSearchResult;
599     }
600     return nullptr;
601 }
602 
GetNetworkSelectionMode(int32_t slotId)603 int32_t NetworkSearchManager::GetNetworkSelectionMode(int32_t slotId)
604 {
605     auto inner = FindManagerInner(slotId);
606     if (inner != nullptr) {
607         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_NETWORK_SELECTION_MODE);
608         return static_cast<int32_t>(inner->selection_);
609     }
610     return static_cast<int32_t>(SelectionMode::MODE_TYPE_UNKNOWN);
611 }
612 
GetNetworkSelectionMode(int32_t slotId,NSCALLBACK & callback)613 int32_t NetworkSearchManager::GetNetworkSelectionMode(int32_t slotId, NSCALLBACK &callback)
614 {
615     auto inner = FindManagerInner(slotId);
616     if (inner == nullptr) {
617         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
618         return TELEPHONY_ERR_LOCAL_PTR_NULL;
619     }
620 
621     bool ret = eventSender_->SendCallback(slotId, RadioEvent::RADIO_GET_NETWORK_SELECTION_MODE, &callback);
622     if (!ret) {
623         TELEPHONY_LOGE("slotId:%{public}d GetNetworkSelectionMode SendCallback failed.", slotId);
624         return CORE_SERVICE_SEND_CALLBACK_FAILED;
625     }
626     return TELEPHONY_ERR_SUCCESS;
627 }
628 
SetNetworkSelectionMode(int32_t slotId,int32_t selectMode,const sptr<NetworkInformation> & networkInformation,bool resumeSelection)629 bool NetworkSearchManager::SetNetworkSelectionMode(
630     int32_t slotId, int32_t selectMode, const sptr<NetworkInformation> &networkInformation, bool resumeSelection)
631 {
632     TELEPHONY_LOGD(
633         "NetworkSearchManager SetNetworkSelectionMode selectMode:%{public}d slotId:%{public}d", selectMode, slotId);
634     auto inner = FindManagerInner(slotId);
635     if (inner == nullptr) {
636         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
637         return false;
638     }
639     std::string plmnNumeric = "";
640     if (networkInformation != nullptr) {
641         plmnNumeric = networkInformation->GetOperatorNumeric();
642     }
643     return eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_NETWORK_SELECTION_MODE, selectMode, plmnNumeric);
644 }
645 
SetNetworkSelectionMode(int32_t slotId,int32_t selectMode,const sptr<NetworkInformation> & networkInformation,bool resumeSelection,NSCALLBACK & callback)646 int32_t NetworkSearchManager::SetNetworkSelectionMode(int32_t slotId, int32_t selectMode,
647     const sptr<NetworkInformation> &networkInformation, bool resumeSelection, NSCALLBACK &callback)
648 {
649     TELEPHONY_LOGD(
650         "NetworkSearchManager SetNetworkSelectionMode selectMode:%{public}d slotId:%{public}d", selectMode, slotId);
651     auto inner = FindManagerInner(slotId);
652     if (inner == nullptr) {
653         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
654         return TELEPHONY_ERR_LOCAL_PTR_NULL;
655     }
656     std::string plmnNumeric = "";
657     if (networkInformation != nullptr) {
658         plmnNumeric = networkInformation->GetOperatorNumeric();
659     }
660     bool ret = eventSender_->SendCallback(
661         slotId, RadioEvent::RADIO_SET_NETWORK_SELECTION_MODE, &callback, selectMode, plmnNumeric);
662     if (!ret) {
663         TELEPHONY_LOGE("slotId:%{public}d SetPreferredNetwork SendCallback failed.", slotId);
664         return CORE_SERVICE_SEND_CALLBACK_FAILED;
665     }
666     return TELEPHONY_ERR_SUCCESS;
667 }
668 
GetIsoCountryCodeForNetwork(int32_t slotId,std::u16string & countryCode)669 int32_t NetworkSearchManager::GetIsoCountryCodeForNetwork(int32_t slotId, std::u16string &countryCode)
670 {
671     std::string iso = "";
672     countryCode = u"";
673     auto inner = FindManagerInner(slotId);
674     if ((inner == nullptr) || (inner->networkSearchHandler_ == nullptr)) {
675         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
676         return TELEPHONY_ERR_LOCAL_PTR_NULL;
677     }
678 
679     if (inner->networkSearchState_ == nullptr || inner->networkSearchState_->GetNetworkStatus() == nullptr) {
680         TELEPHONY_LOGE(
681             "NetworkSearchManager::GetIsoCountryCodeForNetwork Failed due to nullptr, slotId:%{public}d", slotId);
682         return TELEPHONY_ERR_LOCAL_PTR_NULL;
683     }
684     std::string plmn = inner->networkSearchState_->GetNetworkStatus()->GetPlmnNumeric();
685     size_t len = plmn.length();
686     if (len >= MCC_LEN) {
687         std::string mcc = plmn.substr(0, MCC_LEN);
688         int32_t value = 0;
689         bool succ = StrToInt(mcc, value);
690         if (succ) {
691             iso = MccPool::MccCountryCode(value);
692         } else {
693             TELEPHONY_LOGE("GetIsoCountryCodeForNetwork parse Failed!! slotId:%{public}d", slotId);
694         }
695         TELEPHONY_LOGD(
696             "NetworkSearchManager::GetIsoCountryCodeForNetwork mcc=%{public}s code=%{public}d slotId:%{public}d",
697             mcc.c_str(), value, slotId);
698     }
699 
700     countryCode = Str8ToStr16(iso);
701     return TELEPHONY_ERR_SUCCESS;
702 }
703 
GetPreferredNetwork(int32_t slotId,NSCALLBACK & callback)704 int32_t NetworkSearchManager::GetPreferredNetwork(int32_t slotId, NSCALLBACK &callback)
705 {
706     auto inner = FindManagerInner(slotId);
707     if (inner == nullptr) {
708         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
709         return TELEPHONY_ERR_LOCAL_PTR_NULL;
710     }
711     if (!eventSender_->SendCallback(slotId, RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE, &callback)) {
712         TELEPHONY_LOGE("slotId:%{public}d GetPreferredNetwork SendCallback failed.", slotId);
713         return CORE_SERVICE_SEND_CALLBACK_FAILED;
714     }
715     return TELEPHONY_ERR_SUCCESS;
716 }
717 
SetPreferredNetwork(int32_t slotId,int32_t networkMode,NSCALLBACK & callback)718 int32_t NetworkSearchManager::SetPreferredNetwork(int32_t slotId, int32_t networkMode, NSCALLBACK &callback)
719 {
720     if (simManager_ == nullptr) {
721         TELEPHONY_LOGE("SetPreferredNetwork simManager_ is nullptr");
722         return TELEPHONY_ERR_LOCAL_PTR_NULL;
723     }
724     auto inner = FindManagerInner(slotId);
725     if (inner == nullptr) {
726         TELEPHONY_LOGE("SetPreferredNetwork inner is nullptr");
727         return TELEPHONY_ERR_LOCAL_PTR_NULL;
728     }
729 
730     int32_t modemRaf = simManager_->GetRadioProtocolTech(slotId);
731     int32_t raf = NetworkUtils::GetRafFromNetworkMode(static_cast<PreferredNetworkMode>(networkMode));
732     if (modemRaf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
733         TELEPHONY_LOGE("SetPreferredNetwork failed modemRaf:%{public}d slotId:%{public}d", modemRaf, slotId);
734         return CORE_SERVICE_RADIO_PROTOCOL_TECH_UNKNOWN;
735     }
736     if (raf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
737         TELEPHONY_LOGE("SetPreferredNetwork failed raf:%{public}d slotId:%{public}d", raf, slotId);
738         return TELEPHONY_ERR_ARGUMENT_INVALID;
739     }
740     int32_t filterMode = static_cast<int32_t>(NetworkUtils::GetNetworkModeFromRaf(modemRaf & raf));
741     TELEPHONY_LOGD("SetPreferredNetwork filterMode:%{public}d slotId:%{public}d", filterMode, slotId);
742     if (!eventSender_->SendCallbackEx(slotId, RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, &callback, filterMode)) {
743         TELEPHONY_LOGE("slotId:%{public}d SetPreferredNetwork SendCallback failed.", slotId);
744         return CORE_SERVICE_SEND_CALLBACK_FAILED;
745     }
746     return TELEPHONY_ERR_SUCCESS;
747 }
748 
GetPreferredNetwork(int32_t slotId)749 bool NetworkSearchManager::GetPreferredNetwork(int32_t slotId)
750 {
751     TELEPHONY_LOGD("NetworkSearchManager GetPreferredNetwork slotId:%{public}d", slotId);
752     auto inner = FindManagerInner(slotId);
753     if (inner == nullptr) {
754         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
755         return TELEPHONY_ERR_LOCAL_PTR_NULL;
756     }
757     if (!eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE)) {
758         TELEPHONY_LOGE("slotId:%{public}d GetPreferredNetwork SendCallback failed.", slotId);
759         return CORE_SERVICE_SEND_CALLBACK_FAILED;
760     }
761     return TELEPHONY_ERR_SUCCESS;
762 }
763 
SetPreferredNetwork(int32_t slotId,int32_t networkMode)764 bool NetworkSearchManager::SetPreferredNetwork(int32_t slotId, int32_t networkMode)
765 {
766     if (simManager_ == nullptr) {
767         TELEPHONY_LOGE("SetPreferredNetwork simManager_ is nullptr");
768         return false;
769     }
770     auto inner = FindManagerInner(slotId);
771     if (inner == nullptr) {
772         TELEPHONY_LOGE("SetPreferredNetwork inner is nullptr");
773         return false;
774     }
775 
776     int32_t modemRaf = simManager_->GetRadioProtocolTech(slotId);
777     int32_t raf = NetworkUtils::GetRafFromNetworkMode(static_cast<PreferredNetworkMode>(networkMode));
778     if (modemRaf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN) ||
779         raf == static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN)) {
780         TELEPHONY_LOGE(
781             "SetPreferredNetwork failed modemRaf:%{public}d raf:%{public}d slotId:%{public}d", modemRaf, raf, slotId);
782         return false;
783     }
784     int32_t filterMode = static_cast<int32_t>(NetworkUtils::GetNetworkModeFromRaf(modemRaf & raf));
785     TELEPHONY_LOGD("SetPreferredNetwork filterMode:%{public}d slotId:%{public}d", filterMode, slotId);
786     return eventSender_->SendBase(slotId, RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, filterMode);
787 }
788 
SavePreferredNetworkValue(int32_t slotId,int32_t networkMode)789 void NetworkSearchManager::SavePreferredNetworkValue(int32_t slotId, int32_t networkMode)
790 {
791     TELEPHONY_LOGD("NetworkSearchManager SavePreferredNetworkValue slotId:%{public}d, networkMode:%{public}d", slotId,
792         networkMode);
793     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
794     if (settingHelper == nullptr) {
795         TELEPHONY_LOGE("settingHelper is null");
796         return;
797     }
798 
799     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_PREFERRED_NETWORK_MODE_URI);
800     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_PREFERRED_NETWORK_MODE + "_" + std::to_string(slotId);
801     std::string value = std::to_string(networkMode);
802     if (!settingHelper->Update(uri, key, value)) {
803         TELEPHONY_LOGE("Update %{public}s fail", key.c_str());
804     }
805 }
806 
GetPreferredNetworkValue(int32_t slotId) const807 int32_t NetworkSearchManager::GetPreferredNetworkValue(int32_t slotId) const
808 {
809     int32_t networkMode = PREFERRED_NETWORK_TYPE;
810     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
811     if (settingHelper == nullptr) {
812         TELEPHONY_LOGE("settingHelper is null");
813         return networkMode;
814     }
815 
816     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_PREFERRED_NETWORK_MODE_URI);
817     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_PREFERRED_NETWORK_MODE + "_" + std::to_string(slotId);
818     std::string value = "";
819     if (!settingHelper->Query(uri, key, value)) {
820         TELEPHONY_LOGI("Query %{public}s fail", key.c_str());
821         return networkMode;
822     }
823 
824     bool succ = StrToInt(value, networkMode);
825     TELEPHONY_LOGD("NetworkSearchManager GetPreferredNetworkValue succ:%{public}d, slotId:%{public}d, "
826                    "networkMode:%{public}d",
827         slotId, succ, networkMode);
828     return networkMode;
829 }
830 
UpdatePhone(int32_t slotId,RadioTech csRadioTech,const RadioTech & psRadioTech)831 void NetworkSearchManager::UpdatePhone(int32_t slotId, RadioTech csRadioTech, const RadioTech &psRadioTech)
832 {
833     auto inner = FindManagerInner(slotId);
834     if (inner != nullptr) {
835         if (inner->networkSearchHandler_ != nullptr) {
836             inner->networkSearchHandler_->UpdatePhone(csRadioTech, psRadioTech);
837         }
838     }
839 }
840 
GetImsRegStatus(int32_t slotId,ImsServiceType imsSrvType,ImsRegInfo & info)841 int32_t NetworkSearchManager::GetImsRegStatus(int32_t slotId, ImsServiceType imsSrvType, ImsRegInfo &info)
842 {
843     TELEPHONY_LOGD("slotId:%{public}d, imsSrvType:%{public}d", slotId, imsSrvType);
844     auto inner = FindManagerInner(slotId);
845     if (inner == nullptr) {
846         TELEPHONY_LOGE("NetworkSearchManagerInner is nullptr!");
847         return TELEPHONY_ERR_LOCAL_PTR_NULL;
848     }
849     if (inner->networkSearchState_ == nullptr) {
850         TELEPHONY_LOGE("networkSearchState is nullptr!");
851         return TELEPHONY_ERR_LOCAL_PTR_NULL;
852     }
853     return inner->networkSearchState_->GetImsStatus(imsSrvType, info);
854 }
855 
SetImei(int32_t slotId,std::u16string imei)856 void NetworkSearchManager::SetImei(int32_t slotId, std::u16string imei)
857 {
858     auto inner = FindManagerInner(slotId);
859     if (inner != nullptr) {
860         inner->imei_ = imei;
861     }
862 }
863 
GetImei(int32_t slotId,std::u16string & imei)864 int32_t NetworkSearchManager::GetImei(int32_t slotId, std::u16string &imei)
865 {
866     TELEPHONY_LOGD("NetworkSearchManager::GetImei start slotId:%{public}d", slotId);
867     imei = u"";
868     auto inner = FindManagerInner(slotId);
869     if (inner == nullptr) {
870         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
871         return TELEPHONY_ERR_LOCAL_PTR_NULL;
872     }
873     if (inner->imei_.empty()) {
874         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_IMEI);
875         return TELEPHONY_ERR_LOCAL_PTR_NULL;
876     }
877     imei = inner->imei_;
878     return TELEPHONY_ERR_SUCCESS;
879 }
880 
GetCellInfoList(int32_t slotId,std::vector<sptr<CellInformation>> & cellInfo)881 int32_t NetworkSearchManager::GetCellInfoList(int32_t slotId, std::vector<sptr<CellInformation>> &cellInfo)
882 {
883     auto inner = FindManagerInner(slotId);
884     if (inner != nullptr) {
885         if (inner->networkSearchHandler_ != nullptr) {
886             inner->networkSearchHandler_->GetCellInfoList(cellInfo);
887             return TELEPHONY_ERR_SUCCESS;
888         }
889     }
890     return TELEPHONY_ERR_LOCAL_PTR_NULL;
891 }
892 
SendUpdateCellLocationRequest(int32_t slotId)893 int32_t NetworkSearchManager::SendUpdateCellLocationRequest(int32_t slotId)
894 {
895     auto inner = FindManagerInner(slotId);
896     if (inner != nullptr) {
897         if (inner->networkSearchHandler_ == nullptr || GetRadioState(slotId) == CORE_SERVICE_POWER_OFF) {
898             return TELEPHONY_ERR_LOCAL_PTR_NULL;
899         }
900         return inner->networkSearchHandler_->SendUpdateCellLocationRequest();
901     }
902     return TELEPHONY_ERR_LOCAL_PTR_NULL;
903 }
904 
UpdateCellLocation(int32_t slotId,int32_t techType,int32_t cellId,int32_t lac)905 void NetworkSearchManager::UpdateCellLocation(int32_t slotId, int32_t techType, int32_t cellId, int32_t lac)
906 {
907     auto inner = FindManagerInner(slotId);
908     if (inner != nullptr) {
909         if (inner->networkSearchHandler_ != nullptr) {
910             inner->networkSearchHandler_->UpdateCellLocation(techType, cellId, lac);
911         }
912     }
913 }
914 
GetCellLocation(int32_t slotId)915 sptr<CellLocation> NetworkSearchManager::GetCellLocation(int32_t slotId)
916 {
917     auto inner = FindManagerInner(slotId);
918     if (inner != nullptr) {
919         if (inner->networkSearchHandler_ != nullptr) {
920             return inner->networkSearchHandler_->GetCellLocation();
921         }
922     }
923     return nullptr;
924 }
925 
SetMeid(int32_t slotId,std::u16string meid)926 void NetworkSearchManager::SetMeid(int32_t slotId, std::u16string meid)
927 {
928     auto inner = FindManagerInner(slotId);
929     if (inner != nullptr) {
930         inner->meid_ = meid;
931     }
932 }
933 
GetMeid(int32_t slotId,std::u16string & meid)934 int32_t NetworkSearchManager::GetMeid(int32_t slotId, std::u16string &meid)
935 {
936     TELEPHONY_LOGD("NetworkSearchManager::GetMeid start slotId:%{public}d", slotId);
937     meid = u"";
938     auto inner = FindManagerInner(slotId);
939     if (inner == nullptr) {
940         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
941         return TELEPHONY_ERR_LOCAL_PTR_NULL;
942     }
943     if (inner->meid_.empty()) {
944         eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_MEID);
945         return TELEPHONY_ERR_LOCAL_PTR_NULL;
946     }
947     meid = inner->meid_;
948     return TELEPHONY_ERR_SUCCESS;
949 }
950 
SetLocateUpdate(int32_t slotId)951 void NetworkSearchManager::SetLocateUpdate(int32_t slotId)
952 {
953     TELEPHONY_LOGD("NetworkSearchManager::SetLocateUpdate start slotId:%{public}d", slotId);
954     auto inner = FindManagerInner(slotId);
955     if (inner == nullptr) {
956         TELEPHONY_LOGI("NetworkSearchManager::SetLocateUpdate inner null slotId:%{public}d", slotId);
957         return;
958     }
959 
960     auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_SET_LOCATION_UPDATE);
961     if (event != nullptr && inner->networkSearchHandler_ != nullptr) {
962         event->SetOwner(inner->networkSearchHandler_);
963         telRilManager_->SetLocateUpdates(slotId, HRilRegNotifyMode::REG_NOTIFY_STAT_LAC_CELLID, event);
964     }
965 }
966 
GetUniqueDeviceId(int32_t slotId,std::u16string & deviceId)967 int32_t NetworkSearchManager::GetUniqueDeviceId(int32_t slotId, std::u16string &deviceId)
968 {
969     TELEPHONY_LOGD("NetworkSearchManager::GetUniqueDeviceId start slotId:%{public}d", slotId);
970     deviceId = u"";
971     auto inner = FindManagerInner(slotId);
972     if (inner == nullptr) {
973         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
974         return TELEPHONY_ERR_LOCAL_PTR_NULL;
975     }
976     if (GetPhoneType(slotId) == PhoneType::PHONE_TYPE_IS_GSM) {
977         if (!inner->imei_.empty()) {
978             deviceId = inner->imei_;
979             return TELEPHONY_ERR_SUCCESS;
980         }
981         return TELEPHONY_ERR_LOCAL_PTR_NULL;
982     } else {
983         if (!inner->meid_.empty()) {
984             deviceId = inner->meid_;
985             return TELEPHONY_ERR_SUCCESS;
986         }
987         return TELEPHONY_ERR_LOCAL_PTR_NULL;
988     }
989 }
990 
GetPhoneType(int32_t slotId)991 PhoneType NetworkSearchManager::GetPhoneType(int32_t slotId)
992 {
993     PhoneType phoneType = PhoneType::PHONE_TYPE_IS_NONE;
994     auto inner = FindManagerInner(slotId);
995     if (inner != nullptr) {
996         if (inner->networkSearchHandler_ != nullptr) {
997             phoneType = inner->networkSearchHandler_->GetPhoneType();
998         }
999     }
1000     TELEPHONY_LOGI("NetworkSearchManager::GetPhoneType type:%{public}d start slotId:%{public}d", phoneType, slotId);
1001     return phoneType;
1002 }
1003 
GetVoiceTech(int32_t slotId)1004 void NetworkSearchManager::GetVoiceTech(int32_t slotId)
1005 {
1006     auto inner = FindManagerInner(slotId);
1007     if (inner == nullptr) {
1008         TELEPHONY_LOGE("slotId:%{public}d inner is null", slotId);
1009         return;
1010     }
1011     eventSender_->SendBase(slotId, RadioEvent::RADIO_GET_VOICE_TECH);
1012     eventSender_->SendBase(slotId, RadioEvent::RADIO_OPERATOR);
1013 }
1014 
IsNrSupported(int32_t slotId)1015 bool NetworkSearchManager::IsNrSupported(int32_t slotId)
1016 {
1017     if (simManager_ == nullptr) {
1018         TELEPHONY_LOGE("simManager_ is nullptr");
1019         return false;
1020     }
1021     int32_t modemRaf = simManager_->GetRadioProtocolTech(slotId);
1022     return (static_cast<uint32_t>(modemRaf) & static_cast<uint32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_NR)) ==
1023         static_cast<uint32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_NR);
1024 }
1025 
GetNrOptionMode(int32_t slotId,NrMode & mode)1026 int32_t NetworkSearchManager::GetNrOptionMode(int32_t slotId, NrMode &mode)
1027 {
1028     auto inner = FindManagerInner(slotId);
1029     if (inner != nullptr) {
1030         std::lock_guard<std::mutex> lock(inner->mutex_);
1031         mode = inner->nrMode_;
1032         return TELEPHONY_ERR_SUCCESS;
1033     }
1034     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1035 }
1036 
SetNrOptionMode(int32_t slotId,NrMode mode)1037 void NetworkSearchManager::SetNrOptionMode(int32_t slotId, NrMode mode)
1038 {
1039     auto inner = FindManagerInner(slotId);
1040     if (inner != nullptr) {
1041         std::lock_guard<std::mutex> lock(inner->mutex_);
1042         inner->nrMode_ = mode;
1043     }
1044 }
1045 
SetFrequencyType(int32_t slotId,FrequencyType type)1046 void NetworkSearchManager::SetFrequencyType(int32_t slotId, FrequencyType type)
1047 {
1048     auto inner = FindManagerInner(slotId);
1049     if (inner != nullptr) {
1050         std::lock_guard<std::mutex> lock(inner->mutex_);
1051         inner->freqType_ = type;
1052     }
1053 }
1054 
GetFrequencyType(int32_t slotId)1055 FrequencyType NetworkSearchManager::GetFrequencyType(int32_t slotId)
1056 {
1057     auto inner = FindManagerInner(slotId);
1058     if (inner != nullptr) {
1059         std::lock_guard<std::mutex> lock(inner->mutex_);
1060         return inner->freqType_;
1061     }
1062     return FrequencyType::FREQ_TYPE_UNKNOWN;
1063 }
1064 
GetNrState(int32_t slotId)1065 NrState NetworkSearchManager::GetNrState(int32_t slotId)
1066 {
1067     auto inner = FindManagerInner(slotId);
1068     if (inner != nullptr) {
1069         if (inner->networkSearchState_ != nullptr && inner->networkSearchState_->GetNetworkStatus() != nullptr) {
1070             auto event = inner->networkSearchState_->GetNetworkStatus()->GetNrState();
1071             TELEPHONY_LOGI("NetworkSearchManager::GetNrState result=%{public}d slotId:%{public}d", event, slotId);
1072             return event;
1073         }
1074         TELEPHONY_LOGE("NetworkSearchManager::GetNrState failed due to nullptr!");
1075     }
1076     TELEPHONY_LOGE("NetworkSearchManager::GetNrState Failed slotId:%{public}d", slotId);
1077     return NrState::NR_STATE_NOT_SUPPORT;
1078 }
1079 
DcPhysicalLinkActiveUpdate(int32_t slotId,bool isActive)1080 void NetworkSearchManager::DcPhysicalLinkActiveUpdate(int32_t slotId, bool isActive)
1081 {
1082     auto inner = FindManagerInner(slotId);
1083     if (inner != nullptr) {
1084         if (inner->networkSearchHandler_ != nullptr) {
1085             int active = isActive ? 1 : 0;
1086             auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_SET_DATA_CONNECT_ACTIVE, active);
1087             inner->networkSearchHandler_->SendEvent(event);
1088         }
1089     }
1090 }
1091 
IsRadioFirstPowerOn(int32_t slotId)1092 bool NetworkSearchManager::IsRadioFirstPowerOn(int32_t slotId)
1093 {
1094     auto inner = FindManagerInner(slotId);
1095     if (inner != nullptr) {
1096         std::lock_guard<std::mutex> lock(inner->mutex_);
1097         return inner->isRadioFirstPowerOn_;
1098     }
1099     return false;
1100 }
1101 
SetRadioFirstPowerOn(int32_t slotId,bool isFirstPowerOn)1102 void NetworkSearchManager::SetRadioFirstPowerOn(int32_t slotId, bool isFirstPowerOn)
1103 {
1104     auto inner = FindManagerInner(slotId);
1105     if (inner != nullptr) {
1106         std::lock_guard<std::mutex> lock(inner->mutex_);
1107         inner->isRadioFirstPowerOn_ = isFirstPowerOn;
1108     }
1109 }
1110 
FindManagerInner(int32_t slotId)1111 std::shared_ptr<NetworkSearchManagerInner> NetworkSearchManager::FindManagerInner(int32_t slotId)
1112 {
1113     {
1114         std::lock_guard<std::mutex> lock(mutexInner_);
1115         auto iter = mapManagerInner_.find(slotId);
1116         if (iter != mapManagerInner_.end()) {
1117             return iter->second;
1118         }
1119     }
1120     TELEPHONY_LOGE("NetworkSearchManager::FindManagerInner not find inner object. slotId:%{public}d", slotId);
1121     return nullptr;
1122 }
1123 
ClearManagerInner()1124 void NetworkSearchManager::ClearManagerInner()
1125 {
1126     for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; slotId++) {
1127         auto inner = FindManagerInner(slotId);
1128         if (inner != nullptr) {
1129             std::lock_guard<std::mutex> lock(inner->mutex_);
1130             inner->networkSearchHandler_->UnregisterEvents();
1131         }
1132     }
1133     std::lock_guard<std::mutex> lock(mutexInner_);
1134     mapManagerInner_.clear();
1135 }
1136 
AddManagerInner(int32_t slotId,const std::shared_ptr<NetworkSearchManagerInner> & inner)1137 void NetworkSearchManager::AddManagerInner(int32_t slotId, const std::shared_ptr<NetworkSearchManagerInner> &inner)
1138 {
1139     if (inner != nullptr) {
1140         std::lock_guard<std::mutex> lock(mutexInner_);
1141         mapManagerInner_.emplace(slotId, inner);
1142         TELEPHONY_LOGE("NetworkSearchManager::AddManagerInner %{public}d %{public}zu", slotId, mapManagerInner_.size());
1143     }
1144 }
1145 
RemoveManagerInner(int32_t slotId)1146 bool NetworkSearchManager::RemoveManagerInner(int32_t slotId)
1147 {
1148     std::lock_guard<std::mutex> lock(mutexInner_);
1149     bool ret = (mapManagerInner_.erase(slotId) != 0);
1150     TELEPHONY_LOGE("NetworkSearchManager::RemoveManagerInner %{public}d %{public}zu", slotId, mapManagerInner_.size());
1151     return ret;
1152 }
1153 
TriggerSimRefresh(int32_t slotId)1154 void NetworkSearchManager::TriggerSimRefresh(int32_t slotId)
1155 {
1156     TELEPHONY_LOGD("NetworkSearchManager::TriggerSimRefresh  %{public}d", slotId);
1157     auto inner = FindManagerInner(slotId);
1158     if (inner != nullptr && simManager_ != nullptr) {
1159         if (inner->networkSearchHandler_ != nullptr) {
1160             simManager_->RegisterCoreNotify(slotId, inner->networkSearchHandler_, RadioEvent::RADIO_IMSI_LOADED_READY);
1161         }
1162     }
1163 }
1164 
TriggerTimezoneRefresh(int32_t slotId)1165 void NetworkSearchManager::TriggerTimezoneRefresh(int32_t slotId)
1166 {
1167     auto inner = FindManagerInner(slotId);
1168     if (inner != nullptr) {
1169         if (inner->networkSearchHandler_ != nullptr) {
1170             inner->networkSearchHandler_->TimezoneRefresh();
1171         }
1172     }
1173     TELEPHONY_LOGE("NetworkSearchManager::TriggerTimezoneRefresh slotId:%{public}d", slotId);
1174 }
1175 
GetAirplaneMode()1176 bool NetworkSearchManager::GetAirplaneMode()
1177 {
1178     if (IS_SUPPORT_AIRPLANE_MODE == AIRPLANE_MODE_SUPPORT) {
1179         TELEPHONY_LOGI("support airplane mode, return true");
1180         return true;
1181     }
1182     std::shared_ptr<SettingUtils> settingHelper = SettingUtils::GetInstance();
1183     if (settingHelper == nullptr) {
1184         TELEPHONY_LOGI("settingHelper is null");
1185         return false;
1186     }
1187 
1188     Uri uri(SettingUtils::NETWORK_SEARCH_SETTING_AIRPLANE_MODE_URI);
1189     std::string value = "";
1190     std::string key = SettingUtils::SETTINGS_NETWORK_SEARCH_AIRPLANE_MODE;
1191     if (!settingHelper->Query(uri, key, value)) {
1192         TELEPHONY_LOGI("Query airplane mode fail");
1193         return false;
1194     }
1195     bool airplaneMode = value == "1";
1196     TELEPHONY_LOGI("Get airplane mode:%{public}d", airplaneMode);
1197     return airplaneMode;
1198 }
1199 
RegisterImsRegInfoCallback(int32_t slotId,ImsServiceType imsSrvType,const std::string & bundleName,const sptr<ImsRegInfoCallback> & callback)1200 int32_t NetworkSearchManager::RegisterImsRegInfoCallback(
1201     int32_t slotId, ImsServiceType imsSrvType, const std::string &bundleName, const sptr<ImsRegInfoCallback> &callback)
1202 {
1203     if (callback == nullptr) {
1204         TELEPHONY_LOGE("[slot%{public}d] callback is nullptr", slotId);
1205         return TELEPHONY_ERR_ARGUMENT_NULL;
1206     }
1207     bool isExisted = false;
1208     std::lock_guard<std::mutex> lock(mutexInner_);
1209     for (auto iter : listImsRegInfoCallbackRecord_) {
1210         if ((iter.slotId == slotId) && (iter.imsSrvType == imsSrvType) && (iter.bundleName == bundleName)) {
1211             isExisted = true;
1212             break;
1213         }
1214     }
1215     if (isExisted) {
1216         TELEPHONY_LOGI("[slot%{public}d] Ignore register action, since callback is existent", slotId);
1217         return TELEPHONY_SUCCESS;
1218     }
1219 
1220     ImsRegInfoCallbackRecord imsRecord;
1221     imsRecord.slotId = slotId;
1222     imsRecord.imsSrvType = imsSrvType;
1223     imsRecord.bundleName = bundleName;
1224     imsRecord.imsCallback = callback;
1225     listImsRegInfoCallbackRecord_.push_back(imsRecord);
1226     TELEPHONY_LOGD("[slot%{public}d] Register successfully, callback list size is %{public}zu", slotId,
1227         listImsRegInfoCallbackRecord_.size());
1228     return TELEPHONY_SUCCESS;
1229 }
1230 
UnregisterImsRegInfoCallback(int32_t slotId,ImsServiceType imsSrvType,const std::string & bundleName)1231 int32_t NetworkSearchManager::UnregisterImsRegInfoCallback(
1232     int32_t slotId, ImsServiceType imsSrvType, const std::string &bundleName)
1233 {
1234     bool isSuccess = false;
1235     std::lock_guard<std::mutex> lock(mutexInner_);
1236     auto iter = listImsRegInfoCallbackRecord_.begin();
1237     for (; iter != listImsRegInfoCallbackRecord_.end(); ++iter) {
1238         if ((iter->slotId == slotId) && (iter->imsSrvType == imsSrvType) && (iter->bundleName == bundleName)) {
1239             listImsRegInfoCallbackRecord_.erase(iter);
1240             isSuccess = true;
1241             break;
1242         }
1243     }
1244     if (!isSuccess) {
1245         TELEPHONY_LOGI("[slot%{public}d] Ignore unregister action, since callback is nonexistent", slotId);
1246         return TELEPHONY_SUCCESS;
1247     }
1248     TELEPHONY_LOGD("[slot%{public}d] Unregister successfully, callback list size is  %{public}zu", slotId,
1249         listImsRegInfoCallbackRecord_.size());
1250     return TELEPHONY_SUCCESS;
1251 }
1252 
NotifyImsRegInfoChanged(int32_t slotId,ImsServiceType imsSrvType,const ImsRegInfo & info)1253 void NetworkSearchManager::NotifyImsRegInfoChanged(int32_t slotId, ImsServiceType imsSrvType, const ImsRegInfo &info)
1254 {
1255     TELEPHONY_LOGD(
1256         "slotId:%{public}d, ImsRegState:%{public}d,  ImsRegTech:%{public}d", slotId, info.imsRegState, info.imsRegTech);
1257     bool isExisted = false;
1258     std::lock_guard<std::mutex> lock(mutexInner_);
1259     for (auto iter : listImsRegInfoCallbackRecord_) {
1260         if ((iter.slotId == slotId) && (iter.imsSrvType == imsSrvType)) {
1261             if (iter.imsCallback == nullptr) {
1262                 TELEPHONY_LOGE("imsCallback is nullptr from listImsRegInfoCallbackRecord_");
1263                 return;
1264             }
1265             iter.imsCallback->OnImsRegInfoChanged(slotId, imsSrvType, info);
1266             isExisted = true;
1267             break;
1268         }
1269     }
1270     if (!isExisted) {
1271         TELEPHONY_LOGI("this slot id %{public}d, ims service type %{public}d is not registered", slotId, imsSrvType);
1272     }
1273 }
1274 
InitSimRadioProtocol(int32_t slotId)1275 void NetworkSearchManager::InitSimRadioProtocol(int32_t slotId)
1276 {
1277     if (simManager_ == nullptr) {
1278         TELEPHONY_LOGE("NetworkSearchManager::InitSimRadioProtocol simManager_ is nullptr");
1279         return;
1280     }
1281     simManager_->GetRadioProtocol(slotId);
1282 }
1283 } // namespace Telephony
1284 } // namespace OHOS
1285