diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.cpp index 26f7bcbe8dea06937d39413ba6b9930985c79142..b45704f0795c47b1ebd1653dbc206aa554e68f90 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.cpp @@ -32,6 +32,8 @@ NetworkSelectorFactory::NetworkSelectorFactory() &NetworkSelectorFactory::CreateWifi2WifiQoeSlowNetworkSelector; handleFuncMap[static_cast(NetworkSelectType::USER_CONNECT)] = &NetworkSelectorFactory::CreateAutoConnectNetworkSelector; + handleFuncMap[static_cast(NetworkSelectType::WIFI2WIFI_PORTAL)] = + &NetworkSelectorFactory::CreateWifi2WifiNoNetNetworkSelector; } std::optional> NetworkSelectorFactory::GetNetworkSelector( diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.h index 5e462cc716d04f2f24b4a0ae23aa90e3220b8c87..44ff81c434aaf1669874c8ea8c477083b2d93e53 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/network_select/network_selector_factory.h @@ -28,6 +28,7 @@ enum class NetworkSelectType { WIFI2WIFI_NONET, WIFI2WIFI_QOE_BAD, USER_CONNECT, + WIFI2WIFI_PORTAL }; class NetworkSelectorFactory { diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_common.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_common.h index e87ff44d51ace980616dab48fb1ce3ecf4877456..60091637e9b6ad5b175976991dc67e605f09a55a 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_common.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_common.h @@ -77,6 +77,8 @@ enum WifiSwitchReason { WIFI_SWITCH_REASON_BACKGROUND_CHECK_AVAILABLE_WIFI = 5, // current ap triggers wifi switch because of appqoe slow WIFI_SWITCH_REASON_APP_QOE_SLOW = 6, + // current ap triggers wifi switch because of portal + WIFI_SWITCH_REASON_PORTAL = 7 }; // current state in wifiPro diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.cpp index ed5ebc24c03495dd2b851d6bc9036c9101885dbf..9e7f62ef6356fde3a485f30df232f0d37c2d6773 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.cpp @@ -47,6 +47,9 @@ constexpr int64_t DEFAULT_NET_DISABLE_DETECT_COUNT = 2; constexpr int64_t MIN_TCP_TX = 2; constexpr int64_t MIN_DNS_FAILED_CNT = 2; constexpr int32_t WIFI_PRO_DETECT_TIMEOUT = 16 * 1000; // ms +constexpr int64_t MAX_INTERVAL_TIME = 120 * 1000 * 1000; +constexpr int64_t SCREEN_ON_DURATIONSECS = 30 * 1000 * 1000; +constexpr int64_t DEFAULT_SCAN_INTERVAL_TIME = 20 * 1000 * 1000; // show reason std::map g_switchReason = { {WIFI_SWITCH_REASON_NO_INTERNET, "NO_INTERNET"}, @@ -405,6 +408,8 @@ bool WifiProStateMachine::SelectNetwork(NetworkSelectionResult &networkSelection mNetworkSelectType = NetworkSelectType::WIFI2WIFI_QOE_BAD; } else if (wifiSwitchReason_ == WIFI_SWITCH_REASON_NO_INTERNET) { mNetworkSelectType = NetworkSelectType::WIFI2WIFI_NONET; + } else if (wifiSwitchReason_ == WIFI_SWITCH_REASON_PORTAL) { + mNetworkSelectType = NetworkSelectType::WIFI2WIFI_PORTAL; } else { mNetworkSelectType = NetworkSelectType::WIFI2WIFI; } @@ -1428,13 +1433,24 @@ WifiProStateMachine::WifiPortalState::~WifiPortalState() {} void WifiProStateMachine::WifiPortalState::GoInState() { WIFI_LOGI("WifiPortalState GoInState function."); + pWifiProStateMachine_->isWifi2WifiSwitching_ = false; pWifiProStateMachine_->currentState_ = WifiProState::WIFI_PORTAL; pWifiProStateMachine_->perf5gHandoverService_.NetworkStatusChanged(NetworkStatus::PORTAL); + pWifiProStateMachine_->SetSwitchReason(WIFI_SWITCH_REASON_PORTAL); + + if (WifiConfigCenter::GetInstance().GetScreenState() == MODE_STATE_OPEN) { + screenOnTimeStamp_ = GetElapsedMicrosecondsSinceBoot(); + } else { + screenOnTimeStamp_ = 0; + } } void WifiProStateMachine::WifiPortalState::GoOutState() { WIFI_LOGI("WifiPortalState GoOutState function."); + scanIntervalTime_ = DEFAULT_SCAN_INTERVAL_TIME; + lastScanTimeStamp_ = 0; + WifiConfigCenter::GetInstance().SetBrowserState(false); } bool WifiProStateMachine::WifiPortalState::ExecuteStateMsg(InternalMessagePtr msg) @@ -1442,14 +1458,98 @@ bool WifiProStateMachine::WifiPortalState::ExecuteStateMsg(InternalMessagePtr ms if (msg == nullptr) { return false; } + bool ret = NOT_EXECUTED; WIFI_LOGD("WifiPortalState-msgCode=%{public}d is received.", msg->GetMessageName()); switch (msg->GetMessageName()) { case EVENT_HANDLE_SCAN_RESULT: + HandleWifiScanResultInPortal(msg); + ret = EXECUTED; + break; + case EVENT_CHECK_WIFI_INTERNET_RESULT: + ret = HandleHttpResultInPortal(msg); break; default: - return false; + return ret; } - return true; + return ret; +} + +void WifiProStateMachine::WifiPortalState::HandleWifiScanResultInPortal(const InternalMessagePtr msg) +{ + if (msg == nullptr) { + WIFI_LOGI("HandleWifiScanResultInPortal: msg is nullptr."); + return; + } + std::vector scanInfos; + msg->GetMessageObj(scanInfos); + if (pWifiProStateMachine_->isWifi2WifiSwitching_) { + WIFI_LOGI("HandleWifiScanResultInPortal: Wifi2WifiSwitching."); + return; + } + + if (WifiConfigCenter::GetInstance().GetBrowserState() || + WifiConfigCenter::GetInstance().GetScreenState() == MODE_STATE_CLOSE) { + WIFI_LOGI("HandleWifiScanResultInPortal: browser opened just now or screen off, cannot switch"); + return; + } + + if (screenOnTimeStamp_ != 0) { + auto currentTime = GetElapsedMicrosecondsSinceBoot(); + if ((currentTime - screenOnTimeStamp_) < SCREEN_ON_DURATIONSECS) { + WIFI_LOGI("HandleWifiScanResultInPortal: screen-on is not enough."); + return; + } + } + + if (!pWifiProStateMachine_->SelectNetwork(pWifiProStateMachine_->networkSelectionResult_, scanInfos)) { + WIFI_LOGI("Portal: select network fail."); + return; + } + + if (!pWifiProStateMachine_->IsSatisfiedWifi2WifiCondition()) { + WIFI_LOGI("HandleWifiScanResultInPortal: don't meet wifi2wifi condition."); + return; + } + + if (!pWifiProStateMachine_->TryWifi2Wifi(pWifiProStateMachine_->networkSelectionResult_)) { + WIFI_LOGI("PortalSwitch step X: TryWifi2Wifi Failed."); + pWifiProStateMachine_->Wifi2WifiFinish(); + } +} + +bool WifiProStateMachine::WifiPortalState::HandleHttpResultInPortal(const InternalMessagePtr msg) +{ + if (msg == nullptr) { + WIFI_LOGI("ReuqestScanInPortal, msg is nullptr."); + return EXECUTED; + } + int32_t state = msg->GetParam1(); + if (state == static_cast(OperateResState::CONNECT_CHECK_PORTAL)) { + if (WifiConfigCenter::GetInstance().GetScreenState() == MODE_STATE_CLOSE || + WifiConfigCenter::GetInstance().GetBrowserState()) { + WIFI_LOGI("IsNotAllowedToScan: screen state off or open browser."); + return EXECUTED; + } + + if (screenOnTimeStamp_ != 0) { + auto currentTime = GetElapsedMicrosecondsSinceBoot(); + if ((currentTime - screenOnTimeStamp_) < SCREEN_ON_DURATIONSECS) { + WIFI_LOGI("HandleHttpResultInPortal: screen-on is not enough."); + return EXECUTED; + } + } + + auto checkTimeStamp = GetElapsedMicrosecondsSinceBoot(); + if (lastScanTimeStamp_ == 0 || (checkTimeStamp - lastScanTimeStamp_) > scanIntervalTime_) { + pWifiProStateMachine_->FullScan(); + lastScanTimeStamp_ = GetElapsedMicrosecondsSinceBoot(); + scanIntervalTime_ = std::min(scanIntervalTime_ + scanIntervalTime_, MAX_INTERVAL_TIME); + WIFI_LOGI("HandleHttpResultInPortal:: FullScan executed."); + return EXECUTED; + } + return EXECUTED; + } + return NOT_EXECUTED; } } // namespace Wifi diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.h b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.h index 933f87b2d12931a639d33385ef4e459980c2c6f0..d1861aa1c36955b0b87beab31509bf1633be7355 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.h @@ -176,6 +176,11 @@ public: bool ExecuteStateMsg(InternalMessagePtr msg) override; private: WifiProStateMachine *pWifiProStateMachine_ { nullptr }; + int64_t screenOnTimeStamp_ = 0; + int64_t lastScanTimeStamp_ = 0; + int64_t scanIntervalTime_ = 20 * 1000 * 1000; + void HandleWifiScanResultInPortal(const InternalMessagePtr msg); + bool HandleHttpResultInPortal(const InternalMessagePtr msg); }; ErrCode Initialize(); diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp index 29b9387655ad383ffaadd5737db993d6219f96bf..c998194ed7deaf785ad3ff753f6a30ee372c8767 100755 --- a/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp @@ -2102,6 +2102,7 @@ void StaStateMachine::HandlePortalNetworkPorcess() } #endif #endif + WifiConfigCenter::GetInstance.SetBrowserState(err == ERR_OK); } void StaStateMachine::SetPortalBrowserFlag(bool flag) diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.cpp b/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.cpp index c6497543cc3249b4ba53ec0853b60d47061c0367..3ff0de7bec7927a23847150be26c7565eb4984a1 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.cpp +++ b/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.cpp @@ -1583,6 +1583,16 @@ WifiNetworkControlInfo WifiConfigCenter::GetNetworkControlInfo() return networkControlInfoRecord; } +void WifiConfigCenter::SetBrowserState(bool browser) +{ + browserOn_ = browser; +} + +bool WifiConfigCenter::GetBrowserState() +{ + return browserOn_; +} + #ifndef OHOS_ARCH_LITE void WifiConfigCenter::SetScreenDispalyState(int32_t orientation) { diff --git a/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.h b/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.h index 84e3b0d55ce6bcdf31e416f90eec65003ec3e292..316e2525d2a2b0b8aad6e268b3823e4f16aba361 100644 --- a/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.h +++ b/wifi/services/wifi_standard/wifi_framework/wifi_toolkit/config/wifi_config_center.h @@ -282,6 +282,10 @@ public: int GetScreenState() const; + void SetBrowserState(bool browser); + + bool GetBrowserState(); + void SetWlanPage(bool isWlanPage); bool IsWlanPage() const; @@ -501,6 +505,7 @@ private: std::map mP2pCurrentgroupMacAddrPair; int systemMode_ = SystemMode::M_DEFAULT; int mDeviceType = ProductDeviceType::DEFAULT; + std::atomic browserOn_ {false}; }; } // namespace Wifi } // namespace OHOS diff --git a/wifi/test/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine_test.cpp b/wifi/test/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine_test.cpp index 0abfd212191b6f82f78f9ff6a1ebc28f24fa5b4f..12a3d34a017d4dab0c473602af73ba436f7eef91 100644 --- a/wifi/test/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine_test.cpp +++ b/wifi/test/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine_test.cpp @@ -730,5 +730,42 @@ HWTEST_F(WifiProStateMachineTest, WifiPortalStateExecuteStateMsgTest04, TestSize EXPECT_EQ(wifiPortalState_->ExecuteStateMsg(msg), false); } +HWTEST_F(WifiProStateMachineTest, wifiPortalStateHandleHttpResultInPortalTest05, TestSize.Level1) +{ + InternalMessagePtr msg = std::make_shared(); + msg->SetMessageName(EVENT_CHECK_WIFI_INTERNET_RESULT); + msg->SetParam1(20); + pWifiProStateMachine_->pWifiPortalState_->HandleHttpResultInPortal(msg); + EXPECT_EQ(wifiPortalState_->pWifiProStateMachine_->isWifi2WifiSwitching_, false); +} + +HWTEST_F(WifiProStateMachineTest, wifiPortalStateHandleHttpResultInPortalTest06, TestSize.Level1) +{ + InternalMessagePtr msg = std::make_shared(); + msg->SetMessageName(EVENT_CHECK_WIFI_INTERNET_RESULT); + msg->SetParam1(19); + pWifiProStateMachine_->pWifiPortalState_->HandleHttpResultInPortal(msg); + EXPECT_EQ(wifiPortalState_->pWifiProStateMachine_->isWifi2WifiSwitching_, false); +} + +HWTEST_F(WifiProStateMachineTest, wifiPortalStateHandleHttpResultInPortalTest07, TestSize.Level1) +{ + InternalMessagePtr msg = nullptr; + EXPECT_EQ(wifiPortalState_->HandleHttpResultInPortal(msg), true); +} + +HWTEST_F(WifiProStateMachineTest, wifiPortalStateExecuteStateMsgTest08, TestSize.Level1) +{ + InternalMessagePtr msg = nullptr; + EXPECT_EQ(wifiPortalState_->ExecuteStateMsg(msg), false); +} + +HWTEST_F(WifiProStateMachineTest, wifiPortalStateExecuteStateMsgTest09, TestSize.Level1) +{ + InternalMessagePtr msg = std::make_shared(); + msg->SetMessageName(EVENT_REQUEST_SCAN_DELAY); + EXPECT_EQ(wifiPortalState_->ExecuteStateMsg(msg), false); +} + } // namespace Wifi } // namespace OHOS diff --git a/wifi/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.h b/wifi/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.h index 5289c854ff3a0d644d55397251cabe0796c9498e..e19600a59c1cef4a33fe38bdf4cc3c51661e8e12 100644 --- a/wifi/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.h +++ b/wifi/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.h @@ -103,6 +103,8 @@ public: virtual bool GetCoexSupport() const = 0; virtual void SetScreenState(const int &state) = 0; virtual int GetScreenState() const = 0; + virtual void SetBrowserState(bool browser) = 0; + virtual bool GetBrowserState() = 0; virtual void SetWlanPage(bool isWlanPage) = 0; virtual bool IsWlanPage() const = 0; virtual void SetThermalLevel(const int &level) = 0; @@ -264,6 +266,8 @@ public: MOCK_METHOD1(SetCoexSupport, void(bool isSupport)); MOCK_CONST_METHOD0(GetCoexSupport, bool()); MOCK_METHOD1(SetScreenState, void(const int &state)); + MOCK_METHOD1(SetBrowserState, void(bool)); + MOCK_METHOD0(GetBrowserState, bool()); MOCK_CONST_METHOD0(GetScreenState, int()); MOCK_METHOD1(SetWlanPage, void(bool isWlanPage)); MOCK_CONST_METHOD0(IsWlanPage, bool());