• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &regState)
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