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