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