diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp b/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp index a314c16d525b42de632f1fad273f6940e1d6b1ef..eac8b1b09b06e9784a6f1f86657b29e5f96054ae 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window_utils.cpp @@ -233,6 +233,10 @@ napi_value WindowStageEventTypeInit(napi_env env) static_cast(LifeCycleEventType::INACTIVE))); napi_set_named_property(env, objValue, "HIDDEN", CreateJsValue(env, static_cast(LifeCycleEventType::BACKGROUND))); + napi_set_named_property(env, objValue, "RESUMED", CreateJsValue(env, + static_cast(LifeCycleEventType::RESUMED))); + napi_set_named_property(env, objValue, "PAUSED", CreateJsValue(env, + static_cast(LifeCycleEventType::PAUSED))); return objValue; } diff --git a/test/common/mock/mock_IWindow.h b/test/common/mock/mock_IWindow.h index 9e71f725e801723bcecd2e316bd55da15590244d..6ca5f432d96eda0e4ba8a42023b65345d6a80443 100644 --- a/test/common/mock/mock_IWindow.h +++ b/test/common/mock/mock_IWindow.h @@ -53,6 +53,7 @@ public: MOCK_METHOD2(UpdateZoomTransform, WMError(const Transform& trans, bool isDisplayZoomOn)); MOCK_METHOD1(RestoreSplitWindowMode, WMError(uint32_t mode)); MOCK_METHOD1(ConsumeKeyEvent, void(std::shared_ptr event)); + MOCK_METHOD1(NotifyForegroundInteractiveStatus, void(bool interactive)); sptr AsObject() override { return nullptr; diff --git a/wm/include/window_agent.h b/wm/include/window_agent.h index 5712c474c0669ac4d924fc98e252dbceb847d3ca..e34e9848cc018fbba2db0e9ee7dc8786dcef6e31 100644 --- a/wm/include/window_agent.h +++ b/wm/include/window_agent.h @@ -52,6 +52,8 @@ public: WMError UpdateZoomTransform(const Transform& trans, bool isDisplayZoomOn) override; WMError RestoreSplitWindowMode(uint32_t mode) override; void ConsumeKeyEvent(std::shared_ptr event) override; + void NotifyForegroundInteractiveStatus(bool interactive) override; + private: sptr window_; }; diff --git a/wm/include/window_impl.h b/wm/include/window_impl.h index 5a37682e05e88fff55d997fdde767bd430ebccad..394a2e4621bc5f8205d29959b1ac5116e05c1960 100644 --- a/wm/include/window_impl.h +++ b/wm/include/window_impl.h @@ -261,6 +261,7 @@ public: void NotifyBackground(); void UpdateZoomTransform(const Transform& trans, bool isDisplayZoomOn); void PerformBack() override; + void NotifyForegroundInteractiveStatus(bool interactive); virtual WMError SetUIContent(const std::string& contentInfo, NativeEngine* engine, NativeValue* storage, bool isdistributed, AppExecFwk::Ability* ability) override; @@ -454,6 +455,16 @@ private: CALL_UI_CONTENT(UnFocus); } } + inline void NotifyAfterResumed() + { + auto lifecycleListeners = GetListeners(); + CALL_LIFECYCLE_LISTENER(AfterResumed, lifecycleListeners); + } + inline void NotifyAfterPaused() + { + auto lifecycleListeners = GetListeners(); + CALL_LIFECYCLE_LISTENER(AfterPaused, lifecycleListeners); + } inline void NotifyBeforeDestroy(std::string windowName) { std::lock_guard lock(mutex_); diff --git a/wm/include/zidl/window_interface.h b/wm/include/zidl/window_interface.h index f413807bedc35cd23c5ef7c8be29626a643ed592..6719eb75abb708f65a2dca4023b649e989b93ceb 100644 --- a/wm/include/zidl/window_interface.h +++ b/wm/include/zidl/window_interface.h @@ -52,6 +52,7 @@ public: TRANS_ID_UPDATE_ZOOM_TRANSFORM, TRANS_ID_RESTORE_SPLIT_WINDOW_MODE, TRANS_ID_CONSUME_KEY_EVENT, + TRANS_ID_NOTIFY_FOREGROUND_INTERACTIVE_STATUS, }; virtual WMError UpdateWindowRect(const struct Rect& rect, bool decoStatus, WindowSizeChangeReason reason, @@ -79,6 +80,7 @@ public: virtual void ConsumeKeyEvent(std::shared_ptr event) = 0; virtual WMError UpdateOccupiedAreaAndRect(const sptr& info, const Rect& rect, const std::shared_ptr& rsTransaction = nullptr) = 0; + virtual void NotifyForegroundInteractiveStatus(bool interactive) = 0; }; } // namespace Rosen } // namespace OHOS diff --git a/wm/include/zidl/window_proxy.h b/wm/include/zidl/window_proxy.h index 09fc535907ce45198c7b6980ae8fa918f61fd72a..b2b81aca06a96d7fe667dda8a8490f4d5cc632d5 100644 --- a/wm/include/zidl/window_proxy.h +++ b/wm/include/zidl/window_proxy.h @@ -54,6 +54,8 @@ public: WMError UpdateZoomTransform(const Transform& trans, bool isDisplayZoomOn) override; WMError RestoreSplitWindowMode(uint32_t mode) override; void ConsumeKeyEvent(std::shared_ptr event) override; + void NotifyForegroundInteractiveStatus(bool interactive) override; + private: static inline BrokerDelegator delegator_; }; diff --git a/wm/src/window_agent.cpp b/wm/src/window_agent.cpp index f6421f0b927782b548e424ee17c1395892fa5bc4..93185dcef2958760997c0e1d3ff943c30fd490e5 100644 --- a/wm/src/window_agent.cpp +++ b/wm/src/window_agent.cpp @@ -255,5 +255,15 @@ void WindowAgent::ConsumeKeyEvent(std::shared_ptr event) } window_->ConsumeKeyEvent(event); } + +void WindowAgent::NotifyForegroundInteractiveStatus(bool interactive) +{ + if (window_ == nullptr) { + WLOGFE("window_ is nullptr"); + return; + } + window_->NotifyForegroundInteractiveStatus(interactive); +} + } // namespace Rosen } // namespace OHOS diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 8da8ecc6044683bf86ab8c996b9573aa9a35b8e4..e25f7380e9ae652c638ea247e53c82f8ef876fb5 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -3244,6 +3244,19 @@ void WindowImpl::NotifyBackground() NotifyAfterBackground(); } +void WindowImpl::NotifyForegroundInteractiveStatus(bool interactive) +{ + WLOGFI("NotifyForegroundInteractiveStatus %{public}d", interactive); + if (!IsWindowValid() || state_ != WindowState::STATE_SHOWN) { + return; + } + if (interactive) { + NotifyAfterResumed(); + } else { + NotifyAfterPaused(); + } +} + void WindowImpl::TransformSurfaceNode(const Transform& trans) { if (surfaceNode_ == nullptr) { diff --git a/wm/src/zidl/window_proxy.cpp b/wm/src/zidl/window_proxy.cpp index 984e97e3a351a486fb78a6cef8addebafaf4c8a5..7fdabdf026b86f515a4f70268244cda03f3cea0c 100644 --- a/wm/src/zidl/window_proxy.cpp +++ b/wm/src/zidl/window_proxy.cpp @@ -548,6 +548,27 @@ void WindowProxy::ConsumeKeyEvent(std::shared_ptr event) return; } } + +void WindowProxy::NotifyForegroundInteractiveStatus(bool interactive) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return; + } + if (!data.WriteBool(interactive)) { + WLOGFE("Write Focus failed"); + return; + } + + if (Remote()->SendRequest(static_cast(WindowMessage::TRANS_ID_NOTIFY_FOREGROUND_INTERACTIVE_STATUS), + data, reply, option) != ERR_NONE) { + WLOGFE("SendRequest failed"); + } +} + } // namespace Rosen } // namespace OHOS diff --git a/wm/src/zidl/window_stub.cpp b/wm/src/zidl/window_stub.cpp index eadf28944fb14af9019424a8658b2a9afeb56d94..b1ed03aaf44a27402cf66b9b1cee3a868fda9b22 100644 --- a/wm/src/zidl/window_stub.cpp +++ b/wm/src/zidl/window_stub.cpp @@ -200,6 +200,11 @@ int WindowStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParce ConsumeKeyEvent(event); break; } + case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND_INTERACTIVE_STATUS: { + bool interactive = data.ReadBool(); + NotifyForegroundInteractiveStatus(interactive); + break; + } default: WLOGFW("unknown transaction code %{public}d", code); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); diff --git a/wmserver/src/window_root.cpp b/wmserver/src/window_root.cpp index 0c7dc2c7c11b429b7d05d9002c86e69ce8e050d0..9c7a51b90c993238464be47210c7984d33ad0281 100644 --- a/wmserver/src/window_root.cpp +++ b/wmserver/src/window_root.cpp @@ -571,6 +571,18 @@ WMError WindowRoot::PostProcessAddWindowNode(sptr& node, sptrSetDisplayOrientationFromWindow(node, true); } } + + if (node->GetWindowType() == WindowType::WINDOW_TYPE_LAUNCHER_RECENT) { + std::vector> windowNodes; + container->TraverseContainer(windowNodes); + for (auto& winNode : windowNodes) { + if (winNode && WindowHelper::IsMainWindow(winNode->GetWindowType()) && + winNode->isVisible_ && winNode->GetWindowToken()) { + winNode->GetWindowToken()->NotifyForegroundInteractiveStatus(false); + } + } + } + return WMError::WM_OK; } @@ -780,6 +792,18 @@ WMError WindowRoot::RemoveWindowNode(uint32_t windowId, bool fromAnimation) } HandleKeepScreenOn(windowId, false); } + + if (node->GetWindowType() == WindowType::WINDOW_TYPE_LAUNCHER_RECENT) { + std::vector> windowNodes; + container->TraverseContainer(windowNodes); + for (auto& winNode : windowNodes) { + if (winNode && WindowHelper::IsMainWindow(winNode->GetWindowType()) && + winNode->isVisible_ && winNode->GetWindowToken()) { + winNode->GetWindowToken()->NotifyForegroundInteractiveStatus(true); + } + } + } + return res; } diff --git a/wmserver/test/unittest/avoid_area_controller_test.cpp b/wmserver/test/unittest/avoid_area_controller_test.cpp index 385e0e78a6f4aad8b6385e59e0e0b9081c228bcb..3d928abc6b3c684c0c1859a0d6b9396c18074f82 100644 --- a/wmserver/test/unittest/avoid_area_controller_test.cpp +++ b/wmserver/test/unittest/avoid_area_controller_test.cpp @@ -158,6 +158,7 @@ public: return nullptr; } void ConsumeKeyEvent(std::shared_ptr event) override {} + void NotifyForegroundInteractiveStatus(bool interactive) override {} }; void AvoidAreaControllerTest::SetUpTestCase() diff --git a/wmserver/test/unittest/window_node_test.cpp b/wmserver/test/unittest/window_node_test.cpp index 0b00d86d043499dab388032013cbe61ff83f83f7..27dee58625b13b9482f18521a6722c2287670c26 100644 --- a/wmserver/test/unittest/window_node_test.cpp +++ b/wmserver/test/unittest/window_node_test.cpp @@ -144,6 +144,7 @@ public: return nullptr; }; void ConsumeKeyEvent(std::shared_ptr event) override {} + void NotifyForegroundInteractiveStatus(bool interactive) override {} }; sptr CreateWindowProperty(uint32_t windowId, const std::string& windowName)