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