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_handler.h"
17
18 #include "core_service_errors.h"
19 #include "ims_core_service_client.h"
20 #include "mcc_pool.h"
21 #include "network_search_manager.h"
22 #include "satellite_service_client.h"
23 #include "telephony_ext_wrapper.h"
24 #include "telephony_log_wrapper.h"
25
26 namespace OHOS {
27 namespace Telephony {
28 std::mutex NetworkSearchManager::ctx_;
29 bool NetworkSearchManager::ssbResponseReady_ = false;
30 std::condition_variable NetworkSearchManager::cv_;
31 static const int32_t REQ_INTERVAL = 30;
32 const int32_t SATELLITE_STATUS_ON = 1;
33 const size_t MCC_LEN = 3;
34 const std::map<uint32_t, NetworkSearchHandler::NsHandlerFunc> NetworkSearchHandler::memberFuncMap_ = {
35 { RadioEvent::RADIO_SIM_STATE_CHANGE, &NetworkSearchHandler::SimStateChange },
36 { RadioEvent::RADIO_IMSI_LOADED_READY, &NetworkSearchHandler::ImsiLoadedReady },
37 { RadioEvent::RADIO_SIM_RECORDS_LOADED, &NetworkSearchHandler::SimRecordsLoaded },
38 { RadioEvent::RADIO_STATE_CHANGED, &NetworkSearchHandler::RadioStateChange },
39 { RadioEvent::RADIO_NETWORK_STATE, &NetworkSearchHandler::GetNetworkStateInfo },
40 { RadioEvent::RADIO_RESTRICTED_STATE, &NetworkSearchHandler::RadioRestrictedState },
41 { RadioEvent::RADIO_DATA_REG_STATE, &NetworkSearchHandler::RadioRilDataRegState },
42 { RadioEvent::RADIO_VOICE_REG_STATE, &NetworkSearchHandler::RadioRilVoiceRegState },
43 { RadioEvent::RADIO_GET_SIGNAL_STRENGTH, &NetworkSearchHandler::RadioSignalStrength },
44 { RadioEvent::RADIO_SIGNAL_STRENGTH_UPDATE, &NetworkSearchHandler::RadioSignalStrength },
45 { RadioEvent::RADIO_OPERATOR, &NetworkSearchHandler::RadioRilOperator },
46 { RadioEvent::RADIO_NETWORK_SEARCH_RESULT, &NetworkSearchHandler::NetworkSearchResult },
47 { RadioEvent::RADIO_GET_NETWORK_SELECTION_MODE, &NetworkSearchHandler::GetNetworkSelectionModeResponse },
48 { RadioEvent::RADIO_SET_NETWORK_SELECTION_MODE, &NetworkSearchHandler::SetNetworkSelectionModeResponse },
49 { RadioEvent::RADIO_GET_STATUS, &NetworkSearchHandler::GetRadioStateResponse },
50 { RadioEvent::RADIO_SET_STATUS, &NetworkSearchHandler::SetRadioStateResponse },
51 { RadioEvent::RADIO_SET_PREFERRED_NETWORK_MODE, &NetworkSearchHandler::SetPreferredNetworkResponse },
52 { RadioEvent::RADIO_GET_PREFERRED_NETWORK_MODE, &NetworkSearchHandler::GetPreferredNetworkResponse },
53 { RadioEvent::RADIO_NETWORK_TIME_UPDATE, &NetworkSearchHandler::RadioNitzUpdate },
54 { RadioEvent::RADIO_IMS_SERVICE_STATUS_UPDATE, &NetworkSearchHandler::UpdateImsServiceStatus },
55 { RadioEvent::RADIO_IMS_REGISTER_STATE_UPDATE, &NetworkSearchHandler::UpdateImsRegisterState },
56 { RadioEvent::RADIO_GET_IMEI, &NetworkSearchHandler::RadioGetImei },
57 { RadioEvent::RADIO_GET_MEID, &NetworkSearchHandler::RadioGetMeid },
58 { RadioEvent::RADIO_GET_NEIGHBORING_CELL_INFO, &NetworkSearchHandler::RadioGetNeighboringCellInfo },
59 { RadioEvent::RADIO_GET_CURRENT_CELL_INFO, &NetworkSearchHandler::RadioGetCurrentCellInfo },
60 { RadioEvent::RADIO_CURRENT_CELL_UPDATE, &NetworkSearchHandler::RadioCurrentCellInfoUpdate },
61 { RadioEvent::RADIO_CHANNEL_CONFIG_UPDATE, &NetworkSearchHandler::RadioChannelConfigInfo },
62 { RadioEvent::RADIO_VOICE_TECH_CHANGED, &NetworkSearchHandler::RadioVoiceTechChange },
63 { RadioEvent::RADIO_GET_VOICE_TECH, &NetworkSearchHandler::RadioVoiceTechChange },
64 { RadioEvent::RADIO_SET_DATA_CONNECT_ACTIVE, &NetworkSearchHandler::DcPhysicalLinkActiveUpdate },
65 { RadioEvent::RADIO_GET_BASEBAND_VERSION, &NetworkSearchHandler::RadioGetBasebandVersion },
66 { RadioEvent::RADIO_SET_NR_OPTION_MODE, &NetworkSearchHandler::SetNrOptionModeResponse },
67 { RadioEvent::RADIO_GET_NR_OPTION_MODE, &NetworkSearchHandler::GetNrOptionModeResponse },
68 { RadioEvent::RADIO_GET_RRC_CONNECTION_STATE, &NetworkSearchHandler::RadioGetRrcConnectionState },
69 { RadioEvent::RADIO_RRC_CONNECTION_STATE_UPDATE, &NetworkSearchHandler::RadioGetRrcConnectionState },
70 { RadioEvent::NOTIFY_STATE_CHANGE, &NetworkSearchHandler::NotifyStateChange },
71 { RadioEvent::DELAY_NOTIFY_STATE_CHANGE, &NetworkSearchHandler::HandleDelayNotifyEvent },
72 { RadioEvent::RADIO_RESIDENT_NETWORK_CHANGE, &NetworkSearchHandler::RadioResidentNetworkChange },
73 { RadioEvent::RADIO_GET_NR_SSBID_INFO, &NetworkSearchHandler::GetNrSsbIdResponse },
74 { SettingEventCode::MSG_AUTO_TIME, &NetworkSearchHandler::AutoTimeChange },
75 { SettingEventCode::MSG_AUTO_TIMEZONE, &NetworkSearchHandler::AutoTimeZoneChange },
76 { SettingEventCode::MSG_AUTO_AIRPLANE_MODE, &NetworkSearchHandler::AirplaneModeChange },
77 { RadioEvent::SATELLITE_STATUS_CHANGED, &NetworkSearchHandler::SatelliteStatusChanged }
78 };
79
NetworkSearchHandler(const std::weak_ptr<NetworkSearchManager> & networkSearchManager,const std::weak_ptr<ITelRilManager> & telRilManager,const std::weak_ptr<ISimManager> & simManager,int32_t slotId)80 NetworkSearchHandler::NetworkSearchHandler(const std::weak_ptr<NetworkSearchManager> &networkSearchManager,
81 const std::weak_ptr<ITelRilManager> &telRilManager, const std::weak_ptr<ISimManager> &simManager, int32_t slotId)
82 : TelEventHandler("NetworkSearchManager_" + std::to_string(slotId)), networkSearchManager_(networkSearchManager),
83 telRilManager_(telRilManager), simManager_(simManager), slotId_(slotId)
84 {}
85
~NetworkSearchHandler()86 NetworkSearchHandler::~NetworkSearchHandler()
87 {
88 if (statusChangeListener_ != nullptr) {
89 statusChangeListener_.clear();
90 statusChangeListener_ = nullptr;
91 }
92 }
93
Init()94 bool NetworkSearchHandler::Init()
95 {
96 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
97 if (nsm == nullptr) {
98 TELEPHONY_LOGE("failed to get NetworkSearchManager");
99 return false;
100 }
101 networkRegister_ = std::make_unique<NetworkRegister>(nsm->GetNetworkSearchState(slotId_), nsm, slotId_);
102 if (networkRegister_ == nullptr) {
103 TELEPHONY_LOGE("failed to create new networkRegister slotId:%{public}d", slotId_);
104 return false;
105 }
106 networkRegister_->InitNrConversionConfig();
107 if (!InitOperatorName()) {
108 return false;
109 }
110 radioInfo_ = std::make_unique<RadioInfo>(nsm, slotId_);
111 if (radioInfo_ == nullptr) {
112 TELEPHONY_LOGE("failed to create new radioInfo slotId:%{public}d", slotId_);
113 return false;
114 }
115 signalInfo_ = std::make_unique<SignalInfo>();
116 if (signalInfo_ == nullptr) {
117 TELEPHONY_LOGE("failed to create new signalInfo slotId:%{public}d", slotId_);
118 return false;
119 }
120 networkSelection_ = std::make_unique<NetworkSelection>(networkSearchManager_, slotId_);
121 if (networkSelection_ == nullptr) {
122 TELEPHONY_LOGE("failed to create new networkSelection slotId:%{public}d", slotId_);
123 return false;
124 }
125 networkType_ = std::make_unique<NetworkType>(nsm, slotId_);
126 if (networkType_ == nullptr) {
127 TELEPHONY_LOGE("failed to create new networkType slotId:%{public}d", slotId_);
128 return false;
129 }
130 nitzUpdate_ = std::make_unique<NitzUpdate>(networkSearchManager_, slotId_);
131 if (nitzUpdate_ == nullptr) {
132 TELEPHONY_LOGE("failed to create new nitzUpdate slotId:%{public}d", slotId_);
133 return false;
134 }
135 if (!SubModuleInit()) {
136 return false;
137 }
138 signalInfo_->InitSignalBar();
139 RegisterEvents();
140 return true;
141 }
142
SubModuleInit()143 bool NetworkSearchHandler::SubModuleInit()
144 {
145 cellInfo_ = std::make_unique<CellInfo>(networkSearchManager_, slotId_);
146 if (cellInfo_ == nullptr) {
147 TELEPHONY_LOGE("failed to create new CellInfo slotId:%{public}d", slotId_);
148 return false;
149 }
150 nrSsbInfo_ = std::make_unique<NrSsbInfo>(networkSearchManager_, slotId_);
151 if (nrSsbInfo_ == nullptr) {
152 TELEPHONY_LOGE("failed to create new NrSsbInfo slotId:%{public}d", slotId_);
153 return false;
154 }
155 return true;
156 }
157
InitOperatorName()158 bool NetworkSearchHandler::InitOperatorName()
159 {
160 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
161 EventFwk::MatchingSkills matchingSkills;
162 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED);
163 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_LOCALE_CHANGED);
164 EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
165 subscriberInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
166 operatorName_ = std::make_shared<OperatorName>(
167 subscriberInfo, nsm->GetNetworkSearchState(slotId_), nsm->GetSimManager(), networkSearchManager_, slotId_);
168 if (operatorName_ == nullptr) {
169 TELEPHONY_LOGE("failed to create new operatorName slotId:%{public}d", slotId_);
170 return false;
171 }
172 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
173 statusChangeListener_ = new (std::nothrow) SystemAbilityStatusChangeListener(operatorName_);
174 if (samgrProxy == nullptr || statusChangeListener_ == nullptr) {
175 TELEPHONY_LOGE("InitOperatorName samgrProxy or statusChangeListener_ is nullptr");
176 } else {
177 int32_t ret = samgrProxy->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, statusChangeListener_);
178 TELEPHONY_LOGI("InitOperatorName SubscribeSystemAbility result:%{public}d", ret);
179 }
180 return true;
181 }
182
RegisterEvents()183 void NetworkSearchHandler::RegisterEvents()
184 {
185 TELEPHONY_LOGD("NetworkSearchHandler::RegisterEvents start slotId:%{public}d", slotId_);
186 // Register SIM
187 {
188 std::shared_ptr<ISimManager> simManager = simManager_.lock();
189 if (simManager != nullptr) {
190 simManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_SIM_STATE_CHANGE);
191 simManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_IMSI_LOADED_READY);
192 simManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_SIM_RECORDS_LOADED);
193 }
194 }
195 // unsol RIL
196 {
197 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
198 if (telRilManager != nullptr) {
199 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STATE_CHANGED, nullptr);
200 telRilManager->RegisterCoreNotify(
201 slotId_, shared_from_this(), RadioEvent::RADIO_SIGNAL_STRENGTH_UPDATE, nullptr);
202 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_NETWORK_STATE, nullptr);
203 telRilManager->RegisterCoreNotify(
204 slotId_, shared_from_this(), RadioEvent::RADIO_NETWORK_TIME_UPDATE, nullptr);
205 telRilManager->RegisterCoreNotify(
206 slotId_, shared_from_this(), RadioEvent::RADIO_CHANNEL_CONFIG_UPDATE, nullptr);
207 telRilManager->RegisterCoreNotify(
208 slotId_, shared_from_this(), RadioEvent::RADIO_VOICE_TECH_CHANGED, nullptr);
209 telRilManager->RegisterCoreNotify(
210 slotId_, shared_from_this(), RadioEvent::RADIO_CURRENT_CELL_UPDATE, nullptr);
211 telRilManager->RegisterCoreNotify(
212 slotId_, shared_from_this(), RadioEvent::RADIO_RRC_CONNECTION_STATE_UPDATE, nullptr);
213 telRilManager->RegisterCoreNotify(
214 slotId_, shared_from_this(), RadioEvent::RADIO_RESIDENT_NETWORK_CHANGE, nullptr);
215 }
216 }
217 {
218 if (IsSatelliteSupported() == static_cast<int32_t>(SatelliteValue::SATELLITE_SUPPORTED)) {
219 std::shared_ptr<SatelliteServiceClient> satelliteClient =
220 DelayedSingleton<SatelliteServiceClient>::GetInstance();
221 satelliteClient->AddNetworkHandler(slotId_, std::static_pointer_cast<TelEventHandler>(shared_from_this()));
222 }
223 }
224 // Register IMS
225 {
226 std::shared_ptr<ImsCoreServiceClient> imsCoreServiceClient =
227 DelayedSingleton<ImsCoreServiceClient>::GetInstance();
228 if (imsCoreServiceClient != nullptr) {
229 imsCoreServiceClient->RegisterImsCoreServiceCallbackHandler(slotId_, shared_from_this());
230 }
231 }
232 }
233
RegisterSatelliteCallback()234 void NetworkSearchHandler::RegisterSatelliteCallback()
235 {
236 if (IsSatelliteSupported() == static_cast<int32_t>(SatelliteValue::SATELLITE_SUPPORTED)) {
237 satelliteCallback_ =
238 std::make_unique<SatelliteCoreCallback>(std::static_pointer_cast<TelEventHandler>(shared_from_this()))
239 .release();
240 std::shared_ptr<SatelliteServiceClient> satelliteClient =
241 DelayedSingleton<SatelliteServiceClient>::GetInstance();
242 satelliteClient->RegisterCoreNotify(slotId_, RadioEvent::RADIO_SET_STATUS, satelliteCallback_);
243 satelliteClient->RegisterCoreNotify(slotId_, RadioEvent::RADIO_STATE_CHANGED, satelliteCallback_);
244 satelliteClient->RegisterCoreNotify(slotId_, RadioEvent::SATELLITE_STATUS_CHANGED, satelliteCallback_);
245 }
246 }
247
UnregisterSatelliteCallback()248 void NetworkSearchHandler::UnregisterSatelliteCallback()
249 {
250 if (IsSatelliteSupported() == static_cast<int32_t>(SatelliteValue::SATELLITE_SUPPORTED)) {
251 satelliteCallback_ = nullptr;
252 }
253 }
254
UnregisterEvents()255 void NetworkSearchHandler::UnregisterEvents()
256 {
257 {
258 std::shared_ptr<ISimManager> simManager = simManager_.lock();
259 if (simManager != nullptr) {
260 simManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_SIM_STATE_CHANGE);
261 simManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_IMSI_LOADED_READY);
262 simManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_SIM_RECORDS_LOADED);
263 }
264 }
265 // unsol
266 {
267 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
268 if (telRilManager != nullptr) {
269 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STATE_CHANGED);
270 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_SIGNAL_STRENGTH_UPDATE);
271 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_NETWORK_STATE);
272 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_NETWORK_TIME_UPDATE);
273 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_CHANNEL_CONFIG_UPDATE);
274 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_VOICE_TECH_CHANGED);
275 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_CURRENT_CELL_UPDATE);
276 telRilManager->UnRegisterCoreNotify(
277 slotId_, shared_from_this(), RadioEvent::RADIO_RRC_CONNECTION_STATE_UPDATE);
278 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_RESIDENT_NETWORK_CHANGE);
279 }
280 }
281 if (IsSatelliteSupported() == static_cast<int32_t>(SatelliteValue::SATELLITE_SUPPORTED) &&
282 satelliteCallback_ != nullptr) {
283 std::shared_ptr<SatelliteServiceClient> satelliteClient =
284 DelayedSingleton<SatelliteServiceClient>::GetInstance();
285 satelliteClient->UnRegisterCoreNotify(slotId_, RadioEvent::RADIO_STATE_CHANGED);
286 satelliteClient->UnRegisterCoreNotify(slotId_, RadioEvent::RADIO_SET_STATUS);
287 satelliteClient->UnRegisterCoreNotify(slotId_, RadioEvent::SATELLITE_STATUS_CHANGED);
288 }
289 }
290
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)291 void NetworkSearchHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
292 {
293 if (event == nullptr) {
294 return;
295 }
296 auto msgType = event->GetInnerEventId();
297 TELEPHONY_LOGD(
298 "NetworkSearchHandler::ProcessEvent received event slotId:%{public}d msgType:%{public}d", slotId_, msgType);
299 auto itFunc = memberFuncMap_.find(static_cast<RadioEvent>(msgType));
300 if (itFunc != memberFuncMap_.end()) {
301 auto memberFunc = itFunc->second;
302 if (memberFunc != nullptr) {
303 (this->*memberFunc)(event);
304 }
305 }
306 }
307
SimStateChange(const AppExecFwk::InnerEvent::Pointer &)308 void NetworkSearchHandler::SimStateChange(const AppExecFwk::InnerEvent::Pointer &)
309 {
310 std::shared_ptr<ISimManager> simManager = simManager_.lock();
311 if (simManager != nullptr) {
312 simManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_IMSI_LOADED_READY);
313 simManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_SIM_RECORDS_LOADED);
314 }
315 }
316
ImsiLoadedReady(const AppExecFwk::InnerEvent::Pointer & event)317 void NetworkSearchHandler::ImsiLoadedReady(const AppExecFwk::InnerEvent::Pointer &event)
318 {
319 SendUpdateCellLocationRequest();
320 InitGetNetworkSelectionMode();
321 GetNetworkStateInfo(event);
322 }
323
SimRecordsLoaded(const AppExecFwk::InnerEvent::Pointer &)324 void NetworkSearchHandler::SimRecordsLoaded(const AppExecFwk::InnerEvent::Pointer &)
325 {
326 auto networkSearchManager = networkSearchManager_.lock();
327 if (networkSearchManager != nullptr) {
328 int32_t csRadioTech = 0;
329 int32_t psRadioTech = 0;
330 networkSearchManager->GetCsRadioTech(slotId_, csRadioTech);
331 networkSearchManager->GetPsRadioTech(slotId_, psRadioTech);
332 UpdatePhone(static_cast<RadioTech>(csRadioTech), static_cast<RadioTech>(psRadioTech));
333 }
334
335 if (operatorName_ != nullptr) {
336 operatorName_->NotifySpnChanged();
337 }
338 }
339
RadioStateChange(const AppExecFwk::InnerEvent::Pointer & event)340 void NetworkSearchHandler::RadioStateChange(const AppExecFwk::InnerEvent::Pointer &event)
341 {
342 if (event == nullptr) {
343 TELEPHONY_LOGE("NetworkSearchHandler::RadioStateChange event is nullptr!");
344 return;
345 }
346 std::shared_ptr<HRilInt32Parcel> object = event->GetSharedObject<HRilInt32Parcel>();
347 if (object == nullptr) {
348 TELEPHONY_LOGE("NetworkSearchHandler::RadioStateChange object is nullptr!");
349 return;
350 }
351 auto networkSearchManager = networkSearchManager_.lock();
352 if (networkSearchManager == nullptr) {
353 TELEPHONY_LOGE("NetworkSearchHandler::RadioStateChange failed to get NetworkSearchManager");
354 return;
355 }
356 int32_t radioState = object->data;
357 TELEPHONY_LOGI("NetworkSearchHandler::RadioState change: %{public}d", radioState);
358 switch (radioState) {
359 case CORE_SERVICE_POWER_NOT_AVAILABLE:
360 case CORE_SERVICE_POWER_OFF: {
361 RadioOffOrUnavailableState(radioState);
362 break;
363 }
364 case CORE_SERVICE_POWER_ON: {
365 firstInit_ = false;
366 InitGetNetworkSelectionMode();
367 RadioOnState();
368 break;
369 }
370 default:
371 TELEPHONY_LOGI("Unhandled message with number: %{public}d", radioState);
372 break;
373 }
374 if (radioState == CORE_SERVICE_POWER_ON || radioState == CORE_SERVICE_POWER_OFF) {
375 networkSearchManager->SetRadioStateValue(slotId_, (ModemPowerState)radioState);
376 auto inner = networkSearchManager->FindManagerInner(slotId_);
377 if (inner != nullptr && inner->deviceStateHandler_ != nullptr) {
378 inner->deviceStateHandler_->ProcessRadioState();
379 }
380 networkSearchManager->InitSimRadioProtocol(slotId_);
381 } else {
382 networkSearchManager->SetRadioStateValue(slotId_, CORE_SERVICE_POWER_NOT_AVAILABLE);
383 }
384 if (operatorName_ != nullptr) {
385 operatorName_->NotifySpnChanged();
386 }
387 }
388
RadioRestrictedState(const AppExecFwk::InnerEvent::Pointer & event)389 void NetworkSearchHandler::RadioRestrictedState(const AppExecFwk::InnerEvent::Pointer &event)
390 {
391 if (event == nullptr) {
392 TELEPHONY_LOGE("NetworkSearchHandler::RadioRestrictedState event is nullptr!");
393 return;
394 }
395 if (networkRegister_ != nullptr) {
396 networkRegister_->ProcessRestrictedState(event);
397 }
398 TELEPHONY_LOGD("NetworkSearchHandler::RadioRestrictedState slotId:%{public}d", slotId_);
399 }
400
RadioRilDataRegState(const AppExecFwk::InnerEvent::Pointer & event)401 void NetworkSearchHandler::RadioRilDataRegState(const AppExecFwk::InnerEvent::Pointer &event)
402 {
403 if (event == nullptr) {
404 TELEPHONY_LOGE("NetworkSearchHandler::RadioRilDataRegState event is nullptr!");
405 return;
406 }
407 auto networkSearchManager = networkSearchManager_.lock();
408 if (networkSearchManager == nullptr ||
409 networkSearchManager->GetRadioState(slotId_) == static_cast<int>(ModemPowerState::CORE_SERVICE_POWER_OFF)) {
410 TELEPHONY_LOGI("radio is power off, no need update data reg state");
411 return;
412 }
413 if (networkRegister_ != nullptr) {
414 networkRegister_->ProcessPsRegister(event);
415 }
416 if (operatorName_ != nullptr) {
417 operatorName_->TrySetLongOperatorNameWithTranslation();
418 }
419 TELEPHONY_LOGD("NetworkSearchHandler::RadioRilDataRegState slotId:%{public}d", slotId_);
420 }
421
RadioRilVoiceRegState(const AppExecFwk::InnerEvent::Pointer & event)422 void NetworkSearchHandler::RadioRilVoiceRegState(const AppExecFwk::InnerEvent::Pointer &event)
423 {
424 if (event == nullptr) {
425 TELEPHONY_LOGE("NetworkSearchHandler::RadioRilVoiceRegState event is nullptr!");
426 return;
427 }
428 auto networkSearchManager = networkSearchManager_.lock();
429 if (networkSearchManager == nullptr ||
430 networkSearchManager->GetRadioState(slotId_) == static_cast<int>(ModemPowerState::CORE_SERVICE_POWER_OFF)) {
431 TELEPHONY_LOGI("radio is power off, no need update voice reg state");
432 return;
433 }
434 if (networkRegister_ != nullptr) {
435 networkRegister_->ProcessCsRegister(event);
436 }
437 if (operatorName_ != nullptr) {
438 operatorName_->TrySetLongOperatorNameWithTranslation();
439 }
440 TELEPHONY_LOGD("NetworkSearchHandler::RadioRilVoiceRegState slotId:%{public}d", slotId_);
441 }
442
RadioSignalStrength(const AppExecFwk::InnerEvent::Pointer & event)443 void NetworkSearchHandler::RadioSignalStrength(const AppExecFwk::InnerEvent::Pointer &event)
444 {
445 if (event == nullptr) {
446 TELEPHONY_LOGE("NetworkSearchHandler::RadioSignalStrength event is nullptr!");
447 return;
448 }
449 if (signalInfo_ != nullptr) {
450 signalInfo_->ProcessSignalIntensity(slotId_, event);
451 }
452 TELEPHONY_LOGD("NetworkSearchHandler::RadioSignalStrength slotId:%{public}d", slotId_);
453 }
454
RadioRilOperator(const AppExecFwk::InnerEvent::Pointer & event)455 void NetworkSearchHandler::RadioRilOperator(const AppExecFwk::InnerEvent::Pointer &event)
456 {
457 if (event == nullptr) {
458 TELEPHONY_LOGE("NetworkSearchHandler::RadioRilOperator event is nullptr!");
459 return;
460 }
461 if (operatorName_ != nullptr) {
462 operatorName_->HandleOperatorInfo(event);
463 }
464 TELEPHONY_LOGD("NetworkSearchHandler::RadioRilOperator slotId:%{public}d", slotId_);
465 }
466
GetRilSignalIntensity(bool checkTime)467 void NetworkSearchHandler::GetRilSignalIntensity(bool checkTime)
468 {
469 TELEPHONY_LOGD("NetworkSearchHandler::GetRilSignalIntensity start...... slotId:%{public}d", slotId_);
470 if (!TimeOutCheck(lastTimeSignalReq_, checkTime)) {
471 return;
472 }
473
474 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_GET_SIGNAL_STRENGTH);
475 if (event != nullptr) {
476 event->SetOwner(shared_from_this());
477 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
478 if (telRilManager != nullptr) {
479 telRilManager->GetSignalStrength(slotId_, event);
480 }
481 }
482 }
483
GetNetworkStateInfo(const AppExecFwk::InnerEvent::Pointer &)484 void NetworkSearchHandler::GetNetworkStateInfo(const AppExecFwk::InnerEvent::Pointer &)
485 {
486 auto networkSearchManager = networkSearchManager_.lock();
487 if (networkSearchManager == nullptr) {
488 TELEPHONY_LOGE("failed to get NetworkSearchManager RadioState slotId:%{public}d", slotId_);
489 return;
490 }
491 std::shared_ptr<NetworkSearchState> networkSearchState = networkSearchManager->GetNetworkSearchState(slotId_);
492 if (networkSearchState == nullptr) {
493 TELEPHONY_LOGE("networkSearchState is null slotId:%{public}d", slotId_);
494 return;
495 }
496
497 ModemPowerState radioState = static_cast<ModemPowerState>(networkSearchManager->GetRadioState(slotId_));
498 TELEPHONY_LOGI("NetworkSearchHandler GetRadioState : %{public}d slotId:%{public}d", radioState, slotId_);
499 switch (radioState) {
500 case CORE_SERVICE_POWER_NOT_AVAILABLE:
501 case CORE_SERVICE_POWER_OFF:
502 RadioOffOrUnavailableState(radioState);
503 break;
504 case CORE_SERVICE_POWER_ON: {
505 firstInit_ = false;
506 RadioOnState();
507 break;
508 }
509 default:
510 TELEPHONY_LOGI("Unhandled message with number: %{public}d slotId:%{public}d", radioState, slotId_);
511 break;
512 }
513 }
514
RadioOffOrUnavailableState(int32_t radioState) const515 void NetworkSearchHandler::RadioOffOrUnavailableState(int32_t radioState) const
516 {
517 TELEPHONY_LOGD("RadioOffOrUnavailableState enter... slotId:%{public}d", slotId_);
518 auto networkSearchManager = networkSearchManager_.lock();
519 if (networkSearchManager == nullptr) {
520 TELEPHONY_LOGE("RadioOffOrUnavailableState NetworkSearchHandler is null slotId:%{public}d", slotId_);
521 return;
522 }
523 std::shared_ptr<NetworkSearchState> networkSearchState = networkSearchManager->GetNetworkSearchState(slotId_);
524 if (networkSearchState == nullptr) {
525 TELEPHONY_LOGE("networkSearchState is null slotId:%{public}d", slotId_);
526 return;
527 }
528 networkSearchState->SetInitial();
529 RegServiceState regState = radioState == CORE_SERVICE_POWER_OFF ?
530 RegServiceState::REG_STATE_POWER_OFF : RegServiceState::REG_STATE_NO_SERVICE;
531 networkSearchState->SetNetworkState(regState, DomainType::DOMAIN_TYPE_CS);
532 networkSearchState->SetNetworkState(regState, DomainType::DOMAIN_TYPE_PS);
533 if (signalInfo_ != nullptr) {
534 signalInfo_->Reset();
535 }
536 if (cellInfo_ != nullptr) {
537 cellInfo_->ClearCellInfoList();
538 }
539 networkSearchState->NotifyStateChange();
540 networkSearchManager->UpdateNrOptionMode(slotId_, NrMode::NR_MODE_UNKNOWN);
541 bool isAirplaneModeOn = false;
542 if (networkSearchManager->GetAirplaneMode(isAirplaneModeOn) != TELEPHONY_SUCCESS) {
543 TELEPHONY_LOGE("RadioOffOrUnavailableState GetAirplaneMode fail slotId:%{public}d", slotId_);
544 }
545 auto simManager = networkSearchManager->GetSimManager();
546 if (simManager == nullptr) {
547 return;
548 }
549 bool hasSim = false;
550 simManager->HasSimCard(slotId_, hasSim);
551 if (!isAirplaneModeOn && (hasSim || IsPowerOnPrimaryRadioWhenNoSim()) && radioState == CORE_SERVICE_POWER_OFF) {
552 networkSearchManager->SetRadioState(slotId_, static_cast<bool>(ModemPowerState::CORE_SERVICE_POWER_ON), 0);
553 }
554 sptr<NetworkSearchCallBackBase> cellularData = networkSearchManager->GetCellularDataCallBack();
555 if (cellularData) {
556 cellularData->ClearCellularDataConnections(slotId_);
557 TELEPHONY_LOGD("RadioOffOrUnavailableState ClearCellularDataConnections");
558 }
559 sptr<NetworkSearchCallBackBase> cellularCall = networkSearchManager->GetCellularCallCallBack();
560 if (cellularCall) {
561 cellularCall->ClearCellularCallList(slotId_);
562 TELEPHONY_LOGD("RadioOffOrUnavailableState ClearCellularCallList");
563 }
564 }
565
RadioOnState()566 void NetworkSearchHandler::RadioOnState()
567 {
568 auto networkSearchManager = networkSearchManager_.lock();
569 int64_t serialNum = NetworkSearchManagerInner::SERIAL_NUMBER_DEFAULT;
570 if (networkSearchManager != nullptr) {
571 networkSearchManager->InitMsgNum(slotId_);
572 serialNum = networkSearchManager->IncreaseSerialNum(slotId_);
573 if (serialNum == NetworkSearchManagerInner::SERIAL_NUMBER_DEFAULT) {
574 TELEPHONY_LOGE("Invalid serial number slotId:%{public}d", slotId_);
575 return;
576 }
577 }
578 GetRilOperatorInfo(serialNum, false);
579 GetRilPsRegistration(serialNum, false);
580 GetRilCsRegistration(serialNum, false);
581 SendUpdateCellLocationRequest();
582 GetRilSignalIntensity(false);
583 }
584
GetRadioStateResponse(const AppExecFwk::InnerEvent::Pointer & event)585 void NetworkSearchHandler::GetRadioStateResponse(const AppExecFwk::InnerEvent::Pointer &event)
586 {
587 if (event == nullptr) {
588 TELEPHONY_LOGE("NetworkSearchHandler::GetRadioStateResponse event is nullptr!");
589 return;
590 }
591 if (radioInfo_ == nullptr) {
592 TELEPHONY_LOGE("RadioInfo is null slotId:%{public}d", slotId_);
593 return;
594 }
595 radioInfo_->ProcessGetRadioState(event);
596 }
597
SetRadioStateResponse(const AppExecFwk::InnerEvent::Pointer & event)598 void NetworkSearchHandler::SetRadioStateResponse(const AppExecFwk::InnerEvent::Pointer &event)
599 {
600 if (event == nullptr) {
601 TELEPHONY_LOGE("NetworkSearchHandler::SetRadioStateResponse event is nullptr!");
602 return;
603 }
604 if (radioInfo_ == nullptr) {
605 TELEPHONY_LOGE("RadioInfo is null slotId:%{public}d", slotId_);
606 return;
607 }
608 radioInfo_->ProcessSetRadioState(event);
609 }
610
GetRilOperatorInfo(int64_t serialNum,bool checkTime)611 void NetworkSearchHandler::GetRilOperatorInfo(int64_t serialNum, bool checkTime)
612 {
613 TELEPHONY_LOGD("NetworkSearchHandler::GetOperatorInfo start slotId:%{public}d", slotId_);
614 if (!TimeOutCheck(lastTimeOperatorReq_, checkTime)) {
615 return;
616 }
617
618 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_OPERATOR, serialNum);
619 if (event != nullptr) {
620 event->SetOwner(shared_from_this());
621 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
622 if (telRilManager != nullptr) {
623 telRilManager->GetOperatorInfo(slotId_, event);
624 }
625 }
626 }
627
GetRilPsRegistration(int64_t serialNum,bool checkTime)628 void NetworkSearchHandler::GetRilPsRegistration(int64_t serialNum, bool checkTime)
629 {
630 TELEPHONY_LOGD("NetworkSearchHandler::GetPsRegStatus start slotId:%{public}d", slotId_);
631 if (!TimeOutCheck(lastTimePsRegistrationReq_, checkTime)) {
632 return;
633 }
634
635 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_DATA_REG_STATE, serialNum);
636 if (event != nullptr) {
637 event->SetOwner(shared_from_this());
638 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
639 if (telRilManager != nullptr) {
640 telRilManager->GetPsRegStatus(slotId_, event);
641 }
642 }
643 }
644
InitGetNetworkSelectionMode()645 void NetworkSearchHandler::InitGetNetworkSelectionMode()
646 {
647 auto networkSearchManager = networkSearchManager_.lock();
648 if (networkSearchManager == nullptr) {
649 TELEPHONY_LOGE("InitGetNetworkSelectionMode networkSearchManager is null slotId:%{public}d", slotId_);
650 return;
651 }
652 networkSearchManager->GetNetworkSelectionMode(slotId_);
653 }
654
GetRilCsRegistration(int64_t serialNum,bool checkTime)655 void NetworkSearchHandler::GetRilCsRegistration(int64_t serialNum, bool checkTime)
656 {
657 TELEPHONY_LOGD("NetworkSearchHandler::GetCsRegStatus start slotId:%{public}d", slotId_);
658 if (!TimeOutCheck(lastTimeCsRegistrationReq_, checkTime)) {
659 return;
660 }
661
662 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_VOICE_REG_STATE, serialNum);
663 if (event != nullptr) {
664 event->SetOwner(shared_from_this());
665 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
666 if (telRilManager != nullptr) {
667 telRilManager->GetCsRegStatus(slotId_, event);
668 }
669 }
670 }
671
NetworkSearchResult(const AppExecFwk::InnerEvent::Pointer & event)672 void NetworkSearchHandler::NetworkSearchResult(const AppExecFwk::InnerEvent::Pointer &event)
673 {
674 if (event == nullptr) {
675 TELEPHONY_LOGE("NetworkSearchHandler::NetworkSearchResult event is nullptr!");
676 return;
677 }
678 if (networkSelection_ == nullptr) {
679 TELEPHONY_LOGE("NetworkSearchResult NetworkSelection is null slotId:%{public}d", slotId_);
680 return;
681 }
682 networkSelection_->ProcessNetworkSearchResult(event);
683 }
684
SetNetworkSelectionModeResponse(const AppExecFwk::InnerEvent::Pointer & event)685 void NetworkSearchHandler::SetNetworkSelectionModeResponse(const AppExecFwk::InnerEvent::Pointer &event)
686 {
687 if (event == nullptr) {
688 TELEPHONY_LOGE("NetworkSearchHandler::SetNetworkSelectionModeResponse event is nullptr!");
689 return;
690 }
691 if (networkSelection_ == nullptr) {
692 TELEPHONY_LOGE("SetNetworkSelectionModeResponse NetworkSelection is null slotId:%{public}d", slotId_);
693 return;
694 }
695 networkSelection_->ProcessSetNetworkSelectionMode(event);
696 }
697
GetNetworkSelectionModeResponse(const AppExecFwk::InnerEvent::Pointer & event)698 void NetworkSearchHandler::GetNetworkSelectionModeResponse(const AppExecFwk::InnerEvent::Pointer &event)
699 {
700 if (event == nullptr) {
701 TELEPHONY_LOGE("NetworkSearchHandler::GetNetworkSelectionModeResponse event is nullptr!");
702 return;
703 }
704 if (networkSelection_ == nullptr) {
705 TELEPHONY_LOGE("GetNetworkSelectionModeResponse NetworkSelection is null slotId:%{public}d", slotId_);
706 return;
707 }
708 networkSelection_->ProcessGetNetworkSelectionMode(event);
709 }
710
GetSignalInfo(std::vector<sptr<SignalInformation>> & signals)711 void NetworkSearchHandler::GetSignalInfo(std::vector<sptr<SignalInformation>> &signals)
712 {
713 if (signalInfo_ != nullptr) {
714 signalInfo_->GetSignalInfoList(signals);
715 }
716 }
717
TimeOutCheck(int64_t & lastTime,bool checkTime)718 bool NetworkSearchHandler::TimeOutCheck(int64_t &lastTime, bool checkTime)
719 {
720 int64_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
721 if (!checkTime || (now - lastTime) > REQ_INTERVAL) {
722 lastTime = now;
723 return true;
724 }
725 return false;
726 }
727
GetPreferredNetworkResponse(const AppExecFwk::InnerEvent::Pointer & event)728 void NetworkSearchHandler::GetPreferredNetworkResponse(const AppExecFwk::InnerEvent::Pointer &event)
729 {
730 if (event == nullptr) {
731 TELEPHONY_LOGE("NetworkSearchHandler::GetPreferredNetworkResponse event is nullptr!");
732 return;
733 }
734 if (networkType_ != nullptr) {
735 networkType_->ProcessGetPreferredNetwork(event);
736 } else {
737 TELEPHONY_LOGE("GetPreferredNetworkResponse NetworkType is null slotId:%{public}d", slotId_);
738 }
739 }
740
SetPreferredNetworkResponse(const AppExecFwk::InnerEvent::Pointer & event)741 void NetworkSearchHandler::SetPreferredNetworkResponse(const AppExecFwk::InnerEvent::Pointer &event)
742 {
743 if (event == nullptr) {
744 TELEPHONY_LOGE("NetworkSearchHandler::SetPreferredNetworkResponse event is nullptr!");
745 return;
746 }
747 if (networkType_ != nullptr) {
748 networkType_->ProcessSetPreferredNetwork(event);
749 } else {
750 TELEPHONY_LOGE("SetPreferredNetworkResponse NetworkType is null slotId:%{public}d", slotId_);
751 }
752 }
753
RadioNitzUpdate(const AppExecFwk::InnerEvent::Pointer & event)754 void NetworkSearchHandler::RadioNitzUpdate(const AppExecFwk::InnerEvent::Pointer &event)
755 {
756 if (event == nullptr) {
757 TELEPHONY_LOGE("NetworkSearchHandler::RadioNitzUpdate event is nullptr!");
758 return;
759 }
760 if (nitzUpdate_ != nullptr) {
761 nitzUpdate_->ProcessNitzUpdate(event);
762 } else {
763 TELEPHONY_LOGE("RadioNitzUpdate nitzUpdate is null slotId:%{public}d", slotId_);
764 }
765 }
766
RadioGetImei(const AppExecFwk::InnerEvent::Pointer & event)767 void NetworkSearchHandler::RadioGetImei(const AppExecFwk::InnerEvent::Pointer &event)
768 {
769 if (event == nullptr) {
770 TELEPHONY_LOGE("NetworkSearchHandler::RadioGetImei event is nullptr!");
771 return;
772 }
773 TELEPHONY_LOGD("NetworkSearchHandler::RadioGetImei start slotId:%{public}d", slotId_);
774 if (radioInfo_ != nullptr) {
775 radioInfo_->ProcessGetImei(event);
776 } else {
777 TELEPHONY_LOGE("RadioGetImei radioInfo_ is null slotId:%{public}d", slotId_);
778 }
779 }
780
RadioGetMeid(const AppExecFwk::InnerEvent::Pointer & event)781 void NetworkSearchHandler::RadioGetMeid(const AppExecFwk::InnerEvent::Pointer &event)
782 {
783 TELEPHONY_LOGD("NetworkSearchHandler::RadioGetMeid start slotId:%{public}d", slotId_);
784 if (event == nullptr) {
785 TELEPHONY_LOGE("NetworkSearchHandler::RadioGetMeid event is nullptr!");
786 return;
787 }
788 if (radioInfo_ != nullptr) {
789 radioInfo_->ProcessGetMeid(event);
790 } else {
791 TELEPHONY_LOGE("RadioGetMeid radioInfo_ is null slotId:%{public}d", slotId_);
792 }
793 }
794
UpdatePhone(RadioTech csRadioTech,const RadioTech & psRadioTech) const795 void NetworkSearchHandler::UpdatePhone(RadioTech csRadioTech, const RadioTech &psRadioTech) const
796 {
797 if (radioInfo_ != nullptr) {
798 radioInfo_->UpdatePhone(csRadioTech, psRadioTech);
799 } else {
800 TELEPHONY_LOGE("UpdatePhone networkType is null slotId:%{public}d", slotId_);
801 }
802 }
803
RadioGetCurrentCellInfo(const AppExecFwk::InnerEvent::Pointer & event)804 void NetworkSearchHandler::RadioGetCurrentCellInfo(const AppExecFwk::InnerEvent::Pointer &event)
805 {
806 if (event == nullptr) {
807 TELEPHONY_LOGE("NetworkSearchHandler::RadioGetCurrentCellInfo event is nullptr!");
808 return;
809 }
810 if (cellInfo_ != nullptr) {
811 cellInfo_->ProcessCurrentCellInfo(event);
812 }
813 }
814
RadioCurrentCellInfoUpdate(const AppExecFwk::InnerEvent::Pointer & event)815 void NetworkSearchHandler::RadioCurrentCellInfoUpdate(const AppExecFwk::InnerEvent::Pointer &event)
816 {
817 if (event == nullptr) {
818 TELEPHONY_LOGE("NetworkSearchHandler::RadioCurrentCellInfoUpdate event is nullptr!");
819 return;
820 }
821 if (cellInfo_ != nullptr) {
822 cellInfo_->ProcessCurrentCellInfo(event);
823 }
824 }
825
RadioGetNeighboringCellInfo(const AppExecFwk::InnerEvent::Pointer & event)826 void NetworkSearchHandler::RadioGetNeighboringCellInfo(const AppExecFwk::InnerEvent::Pointer &event)
827 {
828 if (event == nullptr) {
829 TELEPHONY_LOGE("NetworkSearchHandler::RadioGetNeighboringCellInfo event is nullptr!");
830 return;
831 }
832 if (cellInfo_ != nullptr) {
833 cellInfo_->ProcessNeighboringCellInfo(event);
834 }
835 }
836
GetCellInfoList(std::vector<sptr<CellInformation>> & cells)837 int32_t NetworkSearchHandler::GetCellInfoList(std::vector<sptr<CellInformation>> &cells)
838 {
839 TELEPHONY_LOGD("NetworkSearchHandler::GetCellInfoList slotId:%{public}d", slotId_);
840 if (cellInfo_ != nullptr) {
841 cellInfo_->GetCellInfoList(cells);
842 return TELEPHONY_ERR_SUCCESS;
843 }
844 return TELEPHONY_ERR_LOCAL_PTR_NULL;
845 }
846
GetCellLocation()847 sptr<CellLocation> NetworkSearchHandler::GetCellLocation()
848 {
849 TELEPHONY_LOGD("NetworkSearchHandler::GetCellLocation slotId:%{public}d", slotId_);
850 if (cellInfo_ != nullptr) {
851 return cellInfo_->GetCellLocation();
852 }
853 return nullptr;
854 }
855
TimezoneRefresh()856 void NetworkSearchHandler::TimezoneRefresh()
857 {
858 TELEPHONY_LOGD("NetworkSearchHandler::TimezoneRefresh slotId:%{public}d", slotId_);
859 if (nitzUpdate_ != nullptr) {
860 nitzUpdate_->ProcessTimeZone();
861 }
862 }
863
SendUpdateCellLocationRequest()864 int32_t NetworkSearchHandler::SendUpdateCellLocationRequest()
865 {
866 std::vector<sptr<CellInformation>> cells;
867 if (cellInfo_ != nullptr) {
868 cellInfo_->GetCellInfoList(cells);
869 }
870 uint32_t curTime = static_cast<uint32_t>(time(0));
871 if ((curTime < cellRequestMinInterval_ + lastCellRequestTime_) && cells.size() != 0) {
872 TELEPHONY_LOGE("NetworkSearchHandler::SendUpdateCellLocationRequest interval is too short");
873 return TELEPHONY_ERR_SUCCESS;
874 }
875 TELEPHONY_LOGD("NetworkSearchHandler::SendUpdateCellLocationRequest slotId:%{public}d", slotId_);
876 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
877 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_GET_CURRENT_CELL_INFO);
878 if (event != nullptr && telRilManager != nullptr) {
879 lastCellRequestTime_ = curTime;
880 event->SetOwner(shared_from_this());
881 telRilManager->GetCurrentCellInfo(slotId_, event);
882 }
883 return TELEPHONY_ERR_SUCCESS;
884 }
885
UpdateCellLocation(int32_t techType,int32_t cellId,int32_t lac)886 void NetworkSearchHandler::UpdateCellLocation(int32_t techType, int32_t cellId, int32_t lac)
887 {
888 TELEPHONY_LOGD("NetworkSearchHandler::UpdateCellLocation slotId:%{public}d", slotId_);
889 if (cellInfo_ != nullptr) {
890 cellInfo_->UpdateCellLocation(techType, cellId, lac);
891 }
892 }
893
GetPhoneType()894 PhoneType NetworkSearchHandler::GetPhoneType()
895 {
896 TELEPHONY_LOGD("NetworkSearchHandler::GetPhoneType");
897 if (radioInfo_ != nullptr) {
898 return radioInfo_->GetPhoneType();
899 }
900 return PhoneType::PHONE_TYPE_IS_NONE;
901 }
902
RadioChannelConfigInfo(const AppExecFwk::InnerEvent::Pointer & event)903 void NetworkSearchHandler::RadioChannelConfigInfo(const AppExecFwk::InnerEvent::Pointer &event)
904 {
905 if (event == nullptr) {
906 TELEPHONY_LOGE("NetworkSearchHandler::RadioChannelConfigInfo event is nullptr!");
907 return;
908 }
909 if (networkRegister_ != nullptr) {
910 networkRegister_->ProcessChannelConfigInfo(event);
911 }
912 TELEPHONY_LOGD("NetworkSearchHandler::RadioChannelConfigInfo slotId:%{public}d", slotId_);
913 }
914
DcPhysicalLinkActiveUpdate(const AppExecFwk::InnerEvent::Pointer & event)915 void NetworkSearchHandler::DcPhysicalLinkActiveUpdate(const AppExecFwk::InnerEvent::Pointer &event)
916 {
917 if (event == nullptr) {
918 return;
919 }
920 bool isActive = (event->GetParam() == 1);
921 if (networkRegister_ != nullptr) {
922 networkRegister_->DcPhysicalLinkActiveUpdate(isActive);
923 }
924 TELEPHONY_LOGI("NetworkSearchHandler::DcPhysicalLinkActiveUpdate slotId:%{public}d active:%{public}s", slotId_,
925 isActive ? "true" : "false");
926 }
927
NotifyStateChange(const AppExecFwk::InnerEvent::Pointer & event)928 void NetworkSearchHandler::NotifyStateChange(const AppExecFwk::InnerEvent::Pointer &event)
929 {
930 TELEPHONY_LOGI("NetworkSearchHandler::NotifyStateChange slotId:%{public}d", slotId_);
931 if (event == nullptr) {
932 TELEPHONY_LOGE("NetworkSearchHandler::NotifyStateChange event is nullptr!");
933 return;
934 }
935 if (networkRegister_ == nullptr) {
936 TELEPHONY_LOGE("NetworkSearchHandler::NotifyStateChange networkRegister_ is nullptr!");
937 return;
938 }
939 networkRegister_->NotifyStateChange();
940 }
941
HandleDelayNotifyEvent(const AppExecFwk::InnerEvent::Pointer & event)942 void NetworkSearchHandler::HandleDelayNotifyEvent(const AppExecFwk::InnerEvent::Pointer &event)
943 {
944 TELEPHONY_LOGI("NetworkSearchHandler::HandleDelayNotifyEvent slotId:%{public}d", slotId_);
945 if (event == nullptr) {
946 TELEPHONY_LOGE("NetworkSearchHandler::NotifyStateChange event is nullptr!");
947 return;
948 }
949 if (networkRegister_ == nullptr) {
950 TELEPHONY_LOGE("NetworkSearchHandler::NotifyStateChange networkRegister_ is nullptr!");
951 return;
952 }
953 RadioOnState();
954 }
955
GetRegServiceState(RegServiceState & regState)956 int32_t NetworkSearchHandler::GetRegServiceState(RegServiceState ®State)
957 {
958 if (networkRegister_ == nullptr) {
959 TELEPHONY_LOGE("NetworkSearchHandler::GetRegServiceState networkRegister_ is nullptr!");
960 return TELEPHONY_ERR_LOCAL_PTR_NULL;
961 }
962 regState = networkRegister_->GetRegServiceState();
963 return TELEPHONY_ERR_SUCCESS;
964 }
965
HandleRrcStateChanged(int32_t status)966 int32_t NetworkSearchHandler::HandleRrcStateChanged(int32_t status)
967 {
968 TELEPHONY_LOGI("NetworkSearchHandler::HandleRrcStateChanged slotId:%{public}d", slotId_);
969 if (networkRegister_ == nullptr) {
970 TELEPHONY_LOGE("NetworkSearchHandler::HandleRrcStateChanged networkRegister_ is nullptr!");
971 return TELEPHONY_ERR_LOCAL_PTR_NULL;
972 }
973 networkRegister_->HandleRrcStateChanged(status);
974 return TELEPHONY_ERR_SUCCESS;
975 }
976
RevertLastTechnology()977 int32_t NetworkSearchHandler::RevertLastTechnology()
978 {
979 TELEPHONY_LOGI("NetworkSearchHandler::RevertLastTechnology slotId:%{public}d", slotId_);
980 if (networkRegister_ == nullptr) {
981 TELEPHONY_LOGE("NetworkSearchHandler::RevertLastTechnology networkRegister_ is nullptr!");
982 return TELEPHONY_ERR_LOCAL_PTR_NULL;
983 }
984 networkRegister_->RevertLastTechnology();
985 return TELEPHONY_ERR_SUCCESS;
986 }
987
UpdateImsServiceStatus(const AppExecFwk::InnerEvent::Pointer & event)988 void NetworkSearchHandler::UpdateImsServiceStatus(const AppExecFwk::InnerEvent::Pointer &event)
989 {
990 auto networkSearchManager = networkSearchManager_.lock();
991 if (event == nullptr) {
992 TELEPHONY_LOGE("UpdateImsServiceStatus event is null slotId:%{public}d", slotId_);
993 return;
994 }
995 std::shared_ptr<ImsServiceStatus> imsServiceStatus = event->GetSharedObject<ImsServiceStatus>();
996 std::shared_ptr<NetworkSearchState> networkSearchState = networkSearchManager->GetNetworkSearchState(slotId_);
997 if (networkSearchState != nullptr) {
998 networkSearchState->SetImsServiceStatus(*imsServiceStatus);
999 }
1000 TELEPHONY_LOGD("NetworkSearchHandler::UpdateImsServiceStatus slotId:%{public}d", slotId_);
1001 }
1002
UpdateImsRegisterState(const AppExecFwk::InnerEvent::Pointer & event)1003 void NetworkSearchHandler::UpdateImsRegisterState(const AppExecFwk::InnerEvent::Pointer &event)
1004 {
1005 auto networkSearchManager = networkSearchManager_.lock();
1006 if (event == nullptr) {
1007 TELEPHONY_LOGE("UpdateImsRegisterState event is null slotId:%{public}d", slotId_);
1008 return;
1009 }
1010 auto registerInfo = event->GetSharedObject<int32_t>();
1011 bool isRegister = (*registerInfo == 1);
1012 std::shared_ptr<NetworkSearchState> networkSearchState = networkSearchManager->GetNetworkSearchState(slotId_);
1013 if (networkSearchState != nullptr) {
1014 networkSearchState->SetImsStatus(isRegister);
1015 }
1016 TELEPHONY_LOGI("NetworkSearchHandler::UpdateImsRegisterState slotId:%{public}d isRegister:%{public}s", slotId_,
1017 isRegister ? "true" : "false");
1018 }
1019
RadioGetBasebandVersion(const AppExecFwk::InnerEvent::Pointer & event)1020 void NetworkSearchHandler::RadioGetBasebandVersion(const AppExecFwk::InnerEvent::Pointer &event)
1021 {
1022 if (event == nullptr) {
1023 TELEPHONY_LOGE("NetworkSearchHandler::RadioGetBasebandVersion event is nullptr!");
1024 return;
1025 }
1026 TELEPHONY_LOGD("RadioGetBasebandVersion start slotId:%{public}d", slotId_);
1027 if (radioInfo_ == nullptr) {
1028 TELEPHONY_LOGE("RadioGetBasebandVersion RadioInfo is null slotId:%{public}d", slotId_);
1029 return;
1030 }
1031 radioInfo_->ProcessGetBasebandVersion(event);
1032 }
1033
SetNrOptionModeResponse(const AppExecFwk::InnerEvent::Pointer & event)1034 void NetworkSearchHandler::SetNrOptionModeResponse(const AppExecFwk::InnerEvent::Pointer &event)
1035 {
1036 if (event == nullptr) {
1037 TELEPHONY_LOGE("NetworkSearchHandler::SetNrOptionModeResponse event is nullptr!");
1038 return;
1039 }
1040 TELEPHONY_LOGD("SetNrOptionModeResponse start slotId:%{public}d", slotId_);
1041 if (radioInfo_ == nullptr) {
1042 TELEPHONY_LOGE("SetNrOptionModeResponse RadioInfo is null slotId:%{public}d", slotId_);
1043 return;
1044 }
1045 radioInfo_->ProcessSetNrOptionMode(event);
1046 }
1047
GetNrOptionModeResponse(const AppExecFwk::InnerEvent::Pointer & event)1048 void NetworkSearchHandler::GetNrOptionModeResponse(const AppExecFwk::InnerEvent::Pointer &event)
1049 {
1050 if (event == nullptr) {
1051 TELEPHONY_LOGE("NetworkSearchHandler::GetNrOptionModeResponse event is nullptr!");
1052 return;
1053 }
1054 TELEPHONY_LOGD("GetNrOptionModeResponse start slotId:%{public}d", slotId_);
1055 if (radioInfo_ == nullptr) {
1056 TELEPHONY_LOGE("GetNrOptionModeResponse RadioInfo is null slotId:%{public}d", slotId_);
1057 return;
1058 }
1059 radioInfo_->ProcessGetNrOptionMode(event);
1060 }
1061
RadioGetRrcConnectionState(const AppExecFwk::InnerEvent::Pointer & event)1062 void NetworkSearchHandler::RadioGetRrcConnectionState(const AppExecFwk::InnerEvent::Pointer &event)
1063 {
1064 if (event == nullptr) {
1065 TELEPHONY_LOGE("NetworkSearchHandler::RadioGetRrcConnectionState event is nullptr!");
1066 return;
1067 }
1068 TELEPHONY_LOGD("RadioGetRrcConnectionState start slotId:%{public}d", slotId_);
1069 if (radioInfo_ == nullptr) {
1070 TELEPHONY_LOGE("RadioGetRrcConnectionState RadioInfo is null slotId:%{public}d", slotId_);
1071 return;
1072 }
1073 radioInfo_->ProcessGetRrcConnectionState(event);
1074 }
1075
RadioVoiceTechChange(const AppExecFwk::InnerEvent::Pointer & event)1076 void NetworkSearchHandler::RadioVoiceTechChange(const AppExecFwk::InnerEvent::Pointer &event)
1077 {
1078 if (event == nullptr) {
1079 TELEPHONY_LOGE("NetworkSearchHandler::RadioVoiceTechChange event is nullptr!");
1080 return;
1081 }
1082 if (radioInfo_ != nullptr) {
1083 radioInfo_->ProcessVoiceTechChange(event);
1084 }
1085 TELEPHONY_LOGD("NetworkSearchHandler::RadioVoiceTechChange");
1086 }
1087
GetNrSsbIdResponse(const AppExecFwk::InnerEvent::Pointer & event)1088 void NetworkSearchHandler::GetNrSsbIdResponse(const AppExecFwk::InnerEvent::Pointer &event)
1089 {
1090 TELEPHONY_LOGD("Start slotId:%{public}d", slotId_);
1091 if (event == nullptr) {
1092 TELEPHONY_LOGE("Event is nullptr!");
1093 return;
1094 }
1095 if (nrSsbInfo_ == nullptr) {
1096 TELEPHONY_LOGE("NrSsbInfo is null");
1097 return;
1098 }
1099 if (nrSsbInfo_->ProcessGetNrSsbId(event)) {
1100 SyncGetSsbInfoResponse();
1101 }
1102 }
1103
SyncGetSsbInfoResponse()1104 void NetworkSearchHandler::SyncGetSsbInfoResponse()
1105 {
1106 std::unique_lock<std::mutex> lck(NetworkSearchManager::ctx_);
1107 NetworkSearchManager::ssbResponseReady_ = true;
1108 TELEPHONY_LOGD("ssbResponseReady_ = %{public}d", NetworkSearchManager::ssbResponseReady_);
1109 NetworkSearchManager::cv_.notify_one();
1110 }
1111
GetNrSsbId(const std::shared_ptr<NrSsbInformation> & nrCellSsbIdsInfo)1112 int32_t NetworkSearchHandler::GetNrSsbId(const std::shared_ptr<NrSsbInformation> &nrCellSsbIdsInfo)
1113 {
1114 TELEPHONY_LOGI("SlotId:%{public}d", slotId_);
1115 if (nrSsbInfo_ != nullptr) {
1116 if (nrSsbInfo_->FillNrSsbIdInformation(nrCellSsbIdsInfo)) {
1117 return TELEPHONY_ERR_SUCCESS;
1118 }
1119 }
1120 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1121 }
1122
AutoTimeChange(const AppExecFwk::InnerEvent::Pointer &)1123 void NetworkSearchHandler::AutoTimeChange(const AppExecFwk::InnerEvent::Pointer &)
1124 {
1125 TELEPHONY_LOGD("NetworkSearchHandler::AutoTimeChange");
1126 if (nitzUpdate_ != nullptr) {
1127 nitzUpdate_->AutoTimeChange();
1128 }
1129 }
1130
AutoTimeZoneChange(const AppExecFwk::InnerEvent::Pointer &)1131 void NetworkSearchHandler::AutoTimeZoneChange(const AppExecFwk::InnerEvent::Pointer &)
1132 {
1133 TELEPHONY_LOGD("NetworkSearchHandler::AutoTimeZoneChange");
1134 if (nitzUpdate_ != nullptr) {
1135 nitzUpdate_->AutoTimeZoneChange();
1136 }
1137 }
1138
AirplaneModeChange(const AppExecFwk::InnerEvent::Pointer &)1139 void NetworkSearchHandler::AirplaneModeChange(const AppExecFwk::InnerEvent::Pointer &)
1140 {
1141 TELEPHONY_LOGD("NetworkSearchHandler::AirplaneModeChange");
1142 if (radioInfo_ != nullptr) {
1143 radioInfo_->AirplaneModeChange();
1144 }
1145 }
1146
RadioResidentNetworkChange(const AppExecFwk::InnerEvent::Pointer & event)1147 void NetworkSearchHandler::RadioResidentNetworkChange(const AppExecFwk::InnerEvent::Pointer &event)
1148 {
1149 if (event == nullptr) {
1150 TELEPHONY_LOGE("NetworkSearchHandler::RadioResidentNetworkChange event is nullptr!");
1151 return;
1152 }
1153 auto networkSearchManager = networkSearchManager_.lock();
1154 if (networkSearchManager == nullptr) {
1155 TELEPHONY_LOGE("RadioResidentNetworkChange networkSearchManager is nullptr");
1156 return;
1157 }
1158 for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; slotId++) {
1159 if (networkSearchManager->GetCsRegState(slotId) ==
1160 static_cast<int32_t>(RegServiceState::REG_STATE_IN_SERVICE) ||
1161 networkSearchManager->GetPsRegState(slotId) ==
1162 static_cast<int32_t>(RegServiceState::REG_STATE_IN_SERVICE)) {
1163 TELEPHONY_LOGE("RadioResidentNetworkChange RegState is in service");
1164 return;
1165 }
1166 }
1167 auto object = event->GetSharedObject<std::string>();
1168 if (object == nullptr) {
1169 TELEPHONY_LOGE("NetworkSearchHandler::RadioResidentNetworkChange object is nullptr!");
1170 return;
1171 }
1172 std::string plmn = *object;
1173 std::string countryCode = "";
1174 if (plmn.length() >= MCC_LEN) {
1175 std::string mcc = plmn.substr(0, MCC_LEN);
1176 int32_t value = 0;
1177 if (StrToInt(mcc, value)) {
1178 countryCode = MccPool::MccCountryCode(value);
1179 } else {
1180 TELEPHONY_LOGE("RadioResidentNetworkChange parse Failed!! slotId:%{public}d", slotId_);
1181 }
1182 }
1183 if (countryCode.empty()) {
1184 TELEPHONY_LOGE("RadioResidentNetworkChange countryCode is empty");
1185 return;
1186 }
1187 TELEPHONY_LOGI("RadioResidentNetworkChange: update countryCode[%{public}s]", countryCode.c_str());
1188 if (TELEPHONY_EXT_WRAPPER.updateCountryCodeExt_ != nullptr) {
1189 TELEPHONY_EXT_WRAPPER.updateCountryCodeExt_(slotId_, countryCode.c_str());
1190 } else {
1191 if (nitzUpdate_ != nullptr) {
1192 nitzUpdate_->UpdateCountryCode(countryCode);
1193 }
1194 }
1195 }
1196
SatelliteStatusChanged(const AppExecFwk::InnerEvent::Pointer & event)1197 void NetworkSearchHandler::SatelliteStatusChanged(const AppExecFwk::InnerEvent::Pointer &event)
1198 {
1199 if (event == nullptr) {
1200 TELEPHONY_LOGE("NetworkSearchHandler::RadioResidentNetworkChange event is nullptr!");
1201 return;
1202 }
1203 auto satelliteStatus = event->GetSharedObject<SatelliteStatus>();
1204 if (satelliteStatus == nullptr) {
1205 TELEPHONY_LOGE("NetworkSearchHandler::satelliteStatus is nullptr!");
1206 return;
1207 }
1208 if (satelliteStatus->mode == SATELLITE_STATUS_ON) {
1209 std::shared_ptr<SatelliteServiceClient> satelliteClient =
1210 DelayedSingleton<SatelliteServiceClient>::GetInstance();
1211 satelliteClient->SetRadioState(
1212 satelliteStatus->slotId, static_cast<int32_t>(ModemPowerState::CORE_SERVICE_POWER_ON), 0);
1213 }
1214 }
1215
SetCellRequestMinInterval(uint32_t minInterval)1216 void NetworkSearchHandler::SetCellRequestMinInterval(uint32_t minInterval)
1217 {
1218 cellRequestMinInterval_ = minInterval;
1219 }
1220
IsSatelliteSupported()1221 int32_t NetworkSearchHandler::IsSatelliteSupported()
1222 {
1223 char satelliteSupported[SYSPARA_SIZE] = { 0 };
1224 GetParameter(TEL_SATELLITE_SUPPORTED, SATELLITE_DEFAULT_VALUE, satelliteSupported, SYSPARA_SIZE);
1225 TELEPHONY_LOGI("satelliteSupported is %{public}s", satelliteSupported);
1226 return std::atoi(satelliteSupported);
1227 }
1228
SystemAbilityStatusChangeListener(std::shared_ptr<OperatorName> & operatorName)1229 NetworkSearchHandler::SystemAbilityStatusChangeListener::SystemAbilityStatusChangeListener(
1230 std::shared_ptr<OperatorName> &operatorName) : opName_(operatorName)
1231 {}
1232
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1233 void NetworkSearchHandler::SystemAbilityStatusChangeListener::OnAddSystemAbility(
1234 int32_t systemAbilityId, const std::string& deviceId)
1235 {
1236 if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
1237 TELEPHONY_LOGE("systemAbilityId is not COMMON_EVENT_SERVICE_ID");
1238 return;
1239 }
1240 if (opName_ == nullptr) {
1241 TELEPHONY_LOGE("OnAddSystemAbility COMMON_EVENT_SERVICE_ID opName_ is nullptr");
1242 return;
1243 }
1244 bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(opName_);
1245 TELEPHONY_LOGI("NetworkSearchHandler::OnAddSystemAbility subscribeResult = %{public}d", subscribeResult);
1246 }
1247
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1248 void NetworkSearchHandler::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
1249 int32_t systemAbilityId, const std::string& deviceId)
1250 {
1251 if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
1252 TELEPHONY_LOGE("systemAbilityId is not COMMON_EVENT_SERVICE_ID");
1253 return;
1254 }
1255 if (opName_ == nullptr) {
1256 TELEPHONY_LOGE("OnRemoveSystemAbility COMMON_EVENT_SERVICE_ID opName_ is nullptr");
1257 return;
1258 }
1259 bool subscribeResult = CommonEventManager::UnSubscribeCommonEvent(opName_);
1260 TELEPHONY_LOGI("NetworkSearchHandler::OnRemoveSystemAbility subscribeResult = %{public}d", subscribeResult);
1261 }
1262
IsPowerOnPrimaryRadioWhenNoSim() const1263 bool NetworkSearchHandler::IsPowerOnPrimaryRadioWhenNoSim() const
1264 {
1265 TELEPHONY_LOGD("Start to check if power on primary modem's radio when sim slots are empty");
1266 std::shared_ptr<NetworkSearchManager> nsm = networkSearchManager_.lock();
1267 if (nsm == nullptr) {
1268 TELEPHONY_LOGE("get networkSearchManager is failed");
1269 return false;
1270 }
1271 auto simManager = nsm->GetSimManager();
1272 if (simManager == nullptr) {
1273 TELEPHONY_LOGE("get simManager is failed");
1274 return false;
1275 }
1276 int32_t primarySlotId = INVALID_SLOT_ID;
1277 simManager->GetPrimarySlotId(primarySlotId);
1278 if (primarySlotId != INVALID_SLOT_ID && primarySlotId == slotId_) {
1279 TELEPHONY_LOGD("primarySlotId = %{public}d, send radio on request", primarySlotId);
1280 return true;
1281 }
1282 return false;
1283 }
1284 } // namespace Telephony
1285 } // namespace OHOS
1286