diff --git a/services/network_search/include/network_search_handler.h b/services/network_search/include/network_search_handler.h index 3e180f03b..6fb09b4fa 100644 --- a/services/network_search/include/network_search_handler.h +++ b/services/network_search/include/network_search_handler.h @@ -104,6 +104,7 @@ public: private: void RadioOffOrUnavailableState(int32_t radioState) const; void SetRadioOffWhenAirplaneIsOn(); + void SetRadioOffWhenSimDeactive(); void GetRadioStateResponse(const AppExecFwk::InnerEvent::Pointer &event); void SetRadioStateResponse(const AppExecFwk::InnerEvent::Pointer &event); void SimStateChange(const AppExecFwk::InnerEvent::Pointer &); diff --git a/services/network_search/src/network_search_handler.cpp b/services/network_search/src/network_search_handler.cpp index ebca81709..3e0379e05 100644 --- a/services/network_search/src/network_search_handler.cpp +++ b/services/network_search/src/network_search_handler.cpp @@ -500,7 +500,6 @@ void NetworkSearchHandler::SimRecordsLoaded(const AppExecFwk::InnerEvent::Pointe void NetworkSearchHandler::RadioStateChange(const AppExecFwk::InnerEvent::Pointer &event) { if (event == nullptr) { - TELEPHONY_LOGE("NetworkSearchHandler::RadioStateChange event is nullptr!"); return; } std::shared_ptr object = event->GetSharedObject(); @@ -525,6 +524,7 @@ void NetworkSearchHandler::RadioStateChange(const AppExecFwk::InnerEvent::Pointe firstInit_ = false; InitGetNetworkSelectionMode(); SetRadioOffWhenAirplaneIsOn(); + SetRadioOffWhenSimDeactive(); RadioOnState(); break; } @@ -562,6 +562,29 @@ void NetworkSearchHandler::SetRadioOffWhenAirplaneIsOn() } } +void NetworkSearchHandler::SetRadioOffWhenSimDeactive() +{ + auto networkSearchManager = networkSearchManager_.lock(); + if (networkSearchManager == nullptr) { + TELEPHONY_LOGE("NetworkSearchHandler::SetRadioOffWhenSimDeactive failed to get NetworkSearchManager"); + return; + } + auto simManager = networkSearchManager->GetSimManager(); + if (simManager == nullptr) { + return; + } + bool hasSim = false; + simManager->HasSimCard(slotId_, hasSim); + TELEPHONY_LOGD("SetRadioOffWhenSimDeactive slotId: %{public}d, IsSetActiveSimInProgress: %{public}d, IsSimActive:" + " %{public}d, IsPowerOnPrimaryRadioWhenNoSim: %{public}d", + slotId_, simManager->IsSetActiveSimInProgress(slotId_), + simManager->IsSimActive(slotId_), IsPowerOnPrimaryRadioWhenNoSim()); + if (hasSim && !IsPowerOnPrimaryRadioWhenNoSim() + && !simManager->IsSetActiveSimInProgress(slotId_) && !simManager->IsSimActive(slotId_)) { + networkSearchManager->SetRadioState(slotId_, static_cast(ModemPowerState::CORE_SERVICE_POWER_OFF), 0); + } +} + void NetworkSearchHandler::RadioRestrictedState(const AppExecFwk::InnerEvent::Pointer &event) { if (event == nullptr) { @@ -759,8 +782,15 @@ void NetworkSearchHandler::RadioOnWhenHasSim(std::shared_ptrHasSimCard(slotId_, hasSim); - if (!isAirplaneMode && (hasSim || IsPowerOnPrimaryRadioWhenNoSim()) && radioState == CORE_SERVICE_POWER_OFF && - !IsSatelliteOn()) { + TELEPHONY_LOGD("soltid: %{public}d, IsSimActive: %{public}d, hasSim: %{public}d, isAirplaneMode: " + "%{public}d, IsSetActiveSimInProgress: %{public}d, IsPowerOnPrimaryRadioWhenNoSim: %{public}d", + slotId_, simManager->IsSimActive(slotId_), hasSim, isAirplaneMode, + simManager->IsSetActiveSimInProgress(slotId_), IsPowerOnPrimaryRadioWhenNoSim()); + bool hasSimAndActive = + (hasSim && (!simManager->IsSetActiveSimInProgress(slotId_) && simManager->IsSimActive(slotId_))); + bool primarySimNoSim = (!hasSim && IsPowerOnPrimaryRadioWhenNoSim()); + if (!isAirplaneMode && (hasSimAndActive || primarySimNoSim) + && radioState == CORE_SERVICE_POWER_OFF && !IsSatelliteOn()) { networkSearchManager->SetRadioState(slotId_, static_cast(ModemPowerState::CORE_SERVICE_POWER_ON), 0); } } diff --git a/test/unittest/core_service_gtest/zero_branch_test.cpp b/test/unittest/core_service_gtest/zero_branch_test.cpp index 643fd11eb..16b010026 100644 --- a/test/unittest/core_service_gtest/zero_branch_test.cpp +++ b/test/unittest/core_service_gtest/zero_branch_test.cpp @@ -2465,6 +2465,7 @@ HWTEST_F(BranchTest, Telephony_NetworkSearchHandler_003, Function | MediumTest | networkSearchHandler->NetworkSearchResult(event); event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_GET_NEIGHBORING_CELL_INFO); networkSearchHandler->RadioGetNeighboringCellInfo(event); + networkSearchHandler->SetRadioOffWhenSimDeactive(); EXPECT_EQ(networkSearchHandler->HandleRrcStateChanged(status), TELEPHONY_ERR_SUCCESS); EXPECT_EQ(networkSearchHandler->RevertLastTechnology(), TELEPHONY_ERR_SUCCESS); networkSearchHandler->IsPowerOnPrimaryRadioWhenNoSim();