1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#include "window_extension_session_impl.h"
17e0dac50fSopenharmony_ci
18e0dac50fSopenharmony_ci#include <transaction/rs_interfaces.h>
19e0dac50fSopenharmony_ci#include <transaction/rs_transaction.h>
20e0dac50fSopenharmony_ci#ifdef IMF_ENABLE
21e0dac50fSopenharmony_ci#include <input_method_controller.h>
22e0dac50fSopenharmony_ci#endif
23e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
24e0dac50fSopenharmony_ci#include "display_info.h"
25e0dac50fSopenharmony_ci#include "parameters.h"
26e0dac50fSopenharmony_ci#include "anr_handler.h"
27e0dac50fSopenharmony_ci#include "hitrace_meter.h"
28e0dac50fSopenharmony_ci#include "perform_reporter.h"
29e0dac50fSopenharmony_ci#include "session_permission.h"
30e0dac50fSopenharmony_ci#include "singleton_container.h"
31e0dac50fSopenharmony_ci#include "window_adapter.h"
32e0dac50fSopenharmony_ci#include "input_transfer_station.h"
33e0dac50fSopenharmony_ci
34e0dac50fSopenharmony_cinamespace OHOS {
35e0dac50fSopenharmony_cinamespace Rosen {
36e0dac50fSopenharmony_cinamespace {
37e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowExtensionSessionImpl"};
38e0dac50fSopenharmony_ciconstexpr int64_t DISPATCH_KEY_EVENT_TIMEOUT_TIME_MS = 1000;
39e0dac50fSopenharmony_ciconstexpr int32_t UIEXTENTION_ROTATION_ANIMATION_TIME = 400;
40e0dac50fSopenharmony_ci}
41e0dac50fSopenharmony_ci
42e0dac50fSopenharmony_ci#define CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession)                         \
43e0dac50fSopenharmony_ci    do {                                                                       \
44e0dac50fSopenharmony_ci        if ((hostSession) == nullptr) {                                        \
45e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::DEFAULT, "hostSession is null");                  \
46e0dac50fSopenharmony_ci            return;                                                            \
47e0dac50fSopenharmony_ci        }                                                                      \
48e0dac50fSopenharmony_ci    } while (false)
49e0dac50fSopenharmony_ci
50e0dac50fSopenharmony_ci#define CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, ret)              \
51e0dac50fSopenharmony_ci    do {                                                                       \
52e0dac50fSopenharmony_ci        if ((hostSession) == nullptr) {                                        \
53e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::DEFAULT, "hostSession is null");                  \
54e0dac50fSopenharmony_ci            return ret;                                                        \
55e0dac50fSopenharmony_ci        }                                                                      \
56e0dac50fSopenharmony_ci    } while (false)
57e0dac50fSopenharmony_ci
58e0dac50fSopenharmony_ciWindowExtensionSessionImpl::WindowExtensionSessionImpl(const sptr<WindowOption>& option) : WindowSessionImpl(option)
59e0dac50fSopenharmony_ci{
60e0dac50fSopenharmony_ci    if (property_->GetUIExtensionUsage() == UIExtensionUsage::MODAL ||
61e0dac50fSopenharmony_ci        property_->GetUIExtensionUsage() == UIExtensionUsage::CONSTRAINED_EMBEDDED) {
62e0dac50fSopenharmony_ci        extensionWindowFlags_.hideNonSecureWindowsFlag = true;
63e0dac50fSopenharmony_ci    }
64e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "UIExtension usage=%{public}u, the default state of hideNonSecureWindows is %{public}d",
65e0dac50fSopenharmony_ci        property_->GetUIExtensionUsage(), extensionWindowFlags_.hideNonSecureWindowsFlag);
66e0dac50fSopenharmony_ci}
67e0dac50fSopenharmony_ci
68e0dac50fSopenharmony_ciWindowExtensionSessionImpl::~WindowExtensionSessionImpl()
69e0dac50fSopenharmony_ci{
70e0dac50fSopenharmony_ci    WLOGFI("[WMSCom] %{public}d, %{public}s", GetPersistentId(), GetWindowName().c_str());
71e0dac50fSopenharmony_ci}
72e0dac50fSopenharmony_ci
73e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::Create(const std::shared_ptr<AbilityRuntime::Context>& context,
74e0dac50fSopenharmony_ci    const sptr<Rosen::ISession>& iSession, const std::string& identityToken)
75e0dac50fSopenharmony_ci{
76e0dac50fSopenharmony_ci    TLOGD(WmsLogTag::WMS_LIFE, "Called.");
77e0dac50fSopenharmony_ci    if (!context || !iSession) {
78e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_LIFE, "context is nullptr: %{public}u or sessionToken is nullptr: %{public}u",
79e0dac50fSopenharmony_ci            context == nullptr, iSession == nullptr);
80e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
81e0dac50fSopenharmony_ci    }
82e0dac50fSopenharmony_ci    if (vsyncStation_ == nullptr || !vsyncStation_->IsVsyncReceiverCreated()) {
83e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
84e0dac50fSopenharmony_ci    }
85e0dac50fSopenharmony_ci    SetDefaultDisplayIdIfNeed();
86e0dac50fSopenharmony_ci    // Since here is init of this window, no other threads will rw it.
87e0dac50fSopenharmony_ci    hostSession_ = iSession;
88e0dac50fSopenharmony_ci    context_ = context;
89e0dac50fSopenharmony_ci    if (context_) {
90e0dac50fSopenharmony_ci        abilityToken_ = context_->GetToken();
91e0dac50fSopenharmony_ci    }
92e0dac50fSopenharmony_ci    AddExtensionWindowStageToSCB();
93e0dac50fSopenharmony_ci    WMError ret = Connect();
94e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
95e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_LIFE, "name:%{public}s %{public}d connect fail. ret:%{public}d",
96e0dac50fSopenharmony_ci            property_->GetWindowName().c_str(), GetPersistentId(), ret);
97e0dac50fSopenharmony_ci        return ret;
98e0dac50fSopenharmony_ci    }
99e0dac50fSopenharmony_ci    MakeSubOrDialogWindowDragableAndMoveble();
100e0dac50fSopenharmony_ci    {
101e0dac50fSopenharmony_ci        std::unique_lock<std::shared_mutex> lock(windowExtensionSessionMutex_);
102e0dac50fSopenharmony_ci        windowExtensionSessionSet_.insert(this);
103e0dac50fSopenharmony_ci    }
104e0dac50fSopenharmony_ci
105e0dac50fSopenharmony_ci    auto usage = property_->GetUIExtensionUsage();
106e0dac50fSopenharmony_ci    if ((usage == UIExtensionUsage::MODAL) || (usage == UIExtensionUsage::CONSTRAINED_EMBEDDED)) {
107e0dac50fSopenharmony_ci        InputTransferStation::GetInstance().AddInputWindow(this);
108e0dac50fSopenharmony_ci    }
109e0dac50fSopenharmony_ci
110e0dac50fSopenharmony_ci    state_ = WindowState::STATE_CREATED;
111e0dac50fSopenharmony_ci    isUIExtensionAbilityProcess_ = true;
112e0dac50fSopenharmony_ci    property_->SetIsUIExtensionAbilityProcess(true);
113e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_LIFE, "Created name:%{public}s %{public}d success.",
114e0dac50fSopenharmony_ci        property_->GetWindowName().c_str(), GetPersistentId());
115e0dac50fSopenharmony_ci    AddSetUIContentTimeoutCheck();
116e0dac50fSopenharmony_ci    return WMError::WM_OK;
117e0dac50fSopenharmony_ci}
118e0dac50fSopenharmony_ci
119e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::AddExtensionWindowStageToSCB()
120e0dac50fSopenharmony_ci{
121e0dac50fSopenharmony_ci    if (!abilityToken_) {
122e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "token is nullptr");
123e0dac50fSopenharmony_ci        return;
124e0dac50fSopenharmony_ci    }
125e0dac50fSopenharmony_ci    if (surfaceNode_ == nullptr) {
126e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "surfaceNode_ is nullptr");
127e0dac50fSopenharmony_ci        return;
128e0dac50fSopenharmony_ci    }
129e0dac50fSopenharmony_ci
130e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowAdapter>().AddExtensionWindowStageToSCB(sptr<ISessionStage>(this), abilityToken_,
131e0dac50fSopenharmony_ci        surfaceNode_->GetId());
132e0dac50fSopenharmony_ci}
133e0dac50fSopenharmony_ci
134e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::RemoveExtensionWindowStageFromSCB()
135e0dac50fSopenharmony_ci{
136e0dac50fSopenharmony_ci    if (!abilityToken_) {
137e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "token is nullptr");
138e0dac50fSopenharmony_ci        return;
139e0dac50fSopenharmony_ci    }
140e0dac50fSopenharmony_ci
141e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowAdapter>().RemoveExtensionWindowStageFromSCB(sptr<ISessionStage>(this),
142e0dac50fSopenharmony_ci        abilityToken_);
143e0dac50fSopenharmony_ci}
144e0dac50fSopenharmony_ci
145e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration)
146e0dac50fSopenharmony_ci{
147e0dac50fSopenharmony_ci    if (auto uiContent = GetUIContentSharedPtr()) {
148e0dac50fSopenharmony_ci        WLOGFD("notify ace winId:%{public}u", GetWindowId());
149e0dac50fSopenharmony_ci        uiContent->UpdateConfiguration(configuration);
150e0dac50fSopenharmony_ci    }
151e0dac50fSopenharmony_ci}
152e0dac50fSopenharmony_ci
153e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateConfigurationForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration)
154e0dac50fSopenharmony_ci{
155e0dac50fSopenharmony_ci    WLOGD("notify scene ace update config");
156e0dac50fSopenharmony_ci    std::unique_lock<std::shared_mutex> lock(windowExtensionSessionMutex_);
157e0dac50fSopenharmony_ci    for (const auto& window : windowExtensionSessionSet_) {
158e0dac50fSopenharmony_ci        window->UpdateConfiguration(configuration);
159e0dac50fSopenharmony_ci    }
160e0dac50fSopenharmony_ci}
161e0dac50fSopenharmony_ci
162e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::Destroy(bool needNotifyServer, bool needClearListener)
163e0dac50fSopenharmony_ci{
164e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_LIFE, "id:%{public}d Destroy, state:%{public}u, needNotifyServer:%{public}d, "
165e0dac50fSopenharmony_ci        "needClearListener:%{public}d", GetPersistentId(), state_, needNotifyServer, needClearListener);
166e0dac50fSopenharmony_ci
167e0dac50fSopenharmony_ci    auto usage = property_->GetUIExtensionUsage();
168e0dac50fSopenharmony_ci    if ((usage == UIExtensionUsage::MODAL) || (usage == UIExtensionUsage::CONSTRAINED_EMBEDDED)) {
169e0dac50fSopenharmony_ci        InputTransferStation::GetInstance().RemoveInputWindow(GetPersistentId());
170e0dac50fSopenharmony_ci    }
171e0dac50fSopenharmony_ci
172e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
173e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_LIFE, "session is invalid");
174e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_WINDOW;
175e0dac50fSopenharmony_ci    }
176e0dac50fSopenharmony_ci    if (auto hostSession = GetHostSession()) {
177e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_LIFE, "Disconnect with host session, id: %{public}d.", GetPersistentId());
178e0dac50fSopenharmony_ci        hostSession->Disconnect();
179e0dac50fSopenharmony_ci    }
180e0dac50fSopenharmony_ci    NotifyBeforeDestroy(GetWindowName());
181e0dac50fSopenharmony_ci    if (needClearListener) {
182e0dac50fSopenharmony_ci        ClearListenersById(GetPersistentId());
183e0dac50fSopenharmony_ci    }
184e0dac50fSopenharmony_ci    {
185e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
186e0dac50fSopenharmony_ci        state_ = WindowState::STATE_DESTROYED;
187e0dac50fSopenharmony_ci        requestState_ = WindowState::STATE_DESTROYED;
188e0dac50fSopenharmony_ci    }
189e0dac50fSopenharmony_ci    DestroySubWindow();
190e0dac50fSopenharmony_ci    {
191e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_LIFE, "Reset state, id: %{public}d.", GetPersistentId());
192e0dac50fSopenharmony_ci        std::lock_guard<std::mutex> lock(hostSessionMutex_);
193e0dac50fSopenharmony_ci        hostSession_ = nullptr;
194e0dac50fSopenharmony_ci    }
195e0dac50fSopenharmony_ci    {
196e0dac50fSopenharmony_ci        std::unique_lock<std::shared_mutex> lock(windowExtensionSessionMutex_);
197e0dac50fSopenharmony_ci        windowExtensionSessionSet_.erase(this);
198e0dac50fSopenharmony_ci    }
199e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_LIFE, "Erase in set, id: %{public}d.", GetPersistentId());
200e0dac50fSopenharmony_ci    if (context_) {
201e0dac50fSopenharmony_ci        context_.reset();
202e0dac50fSopenharmony_ci    }
203e0dac50fSopenharmony_ci    ClearVsyncStation();
204e0dac50fSopenharmony_ci    SetUIContentComplete();
205e0dac50fSopenharmony_ci    RemoveExtensionWindowStageFromSCB();
206e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_LIFE, "Destroyed success, id: %{public}d.", GetPersistentId());
207e0dac50fSopenharmony_ci    return WMError::WM_OK;
208e0dac50fSopenharmony_ci}
209e0dac50fSopenharmony_ci
210e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::MoveTo(int32_t x, int32_t y, bool isMoveToGlobal)
211e0dac50fSopenharmony_ci{
212e0dac50fSopenharmony_ci    WLOGFD("Id:%{public}d xy %{public}d %{public}d", property_->GetPersistentId(), x, y);
213e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
214e0dac50fSopenharmony_ci        WLOGFE("Window session invalid.");
215e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_WINDOW;
216e0dac50fSopenharmony_ci    }
217e0dac50fSopenharmony_ci    const auto& rect = property_->GetWindowRect();
218e0dac50fSopenharmony_ci    WSRect wsRect = { x, y, rect.width_, rect.height_ };
219e0dac50fSopenharmony_ci    WSError error = UpdateRect(wsRect, SizeChangeReason::MOVE);
220e0dac50fSopenharmony_ci    return static_cast<WMError>(error);
221e0dac50fSopenharmony_ci}
222e0dac50fSopenharmony_ci
223e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::Resize(uint32_t width, uint32_t height)
224e0dac50fSopenharmony_ci{
225e0dac50fSopenharmony_ci    WLOGFD("Id:%{public}d wh %{public}u %{public}u", property_->GetPersistentId(), width, height);
226e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
227e0dac50fSopenharmony_ci        WLOGFE("Window session invalid.");
228e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_WINDOW;
229e0dac50fSopenharmony_ci    }
230e0dac50fSopenharmony_ci    const auto& rect = property_->GetWindowRect();
231e0dac50fSopenharmony_ci    WSRect wsRect = { rect.posX_, rect.posY_, width, height };
232e0dac50fSopenharmony_ci    WSError error = UpdateRect(wsRect, SizeChangeReason::RESIZE);
233e0dac50fSopenharmony_ci    return static_cast<WMError>(error);
234e0dac50fSopenharmony_ci}
235e0dac50fSopenharmony_ci
236e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::TransferAbilityResult(uint32_t resultCode, const AAFwk::Want& want)
237e0dac50fSopenharmony_ci{
238e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
239e0dac50fSopenharmony_ci        WLOGFE("Window invalid.");
240e0dac50fSopenharmony_ci        return WMError::WM_ERROR_REPEAT_OPERATION;
241e0dac50fSopenharmony_ci    }
242e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
243e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW);
244e0dac50fSopenharmony_ci    return static_cast<WMError>(hostSession->TransferAbilityResult(resultCode, want));
245e0dac50fSopenharmony_ci}
246e0dac50fSopenharmony_ci
247e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::TransferExtensionData(const AAFwk::WantParams& wantParams)
248e0dac50fSopenharmony_ci{
249e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
250e0dac50fSopenharmony_ci        WLOGFE("Window invalid.");
251e0dac50fSopenharmony_ci        return WMError::WM_ERROR_REPEAT_OPERATION;
252e0dac50fSopenharmony_ci    }
253e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
254e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW);
255e0dac50fSopenharmony_ci    return static_cast<WMError>(hostSession->TransferExtensionData(wantParams));
256e0dac50fSopenharmony_ci}
257e0dac50fSopenharmony_ci
258e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::RegisterTransferComponentDataListener(const NotifyTransferComponentDataFunc& func)
259e0dac50fSopenharmony_ci{
260e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
261e0dac50fSopenharmony_ci        WLOGFE("Window invalid.");
262e0dac50fSopenharmony_ci        return;
263e0dac50fSopenharmony_ci    }
264e0dac50fSopenharmony_ci    notifyTransferComponentDataFunc_ = std::move(func);
265e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
266e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession);
267e0dac50fSopenharmony_ci    hostSession->NotifyAsyncOn();
268e0dac50fSopenharmony_ci}
269e0dac50fSopenharmony_ci
270e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyTransferComponentData(const AAFwk::WantParams& wantParams)
271e0dac50fSopenharmony_ci{
272e0dac50fSopenharmony_ci    TLOGD(WmsLogTag::WMS_UIEXT, "in.");
273e0dac50fSopenharmony_ci    if (notifyTransferComponentDataFunc_) {
274e0dac50fSopenharmony_ci        notifyTransferComponentDataFunc_(wantParams);
275e0dac50fSopenharmony_ci    }
276e0dac50fSopenharmony_ci    return WSError::WS_OK;
277e0dac50fSopenharmony_ci}
278e0dac50fSopenharmony_ci
279e0dac50fSopenharmony_ciWSErrorCode WindowExtensionSessionImpl::NotifyTransferComponentDataSync(
280e0dac50fSopenharmony_ci    const AAFwk::WantParams& wantParams, AAFwk::WantParams& reWantParams)
281e0dac50fSopenharmony_ci{
282e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "in");
283e0dac50fSopenharmony_ci    if (notifyTransferComponentDataForResultFunc_) {
284e0dac50fSopenharmony_ci        reWantParams = notifyTransferComponentDataForResultFunc_(wantParams);
285e0dac50fSopenharmony_ci        return WSErrorCode::WS_OK;
286e0dac50fSopenharmony_ci    }
287e0dac50fSopenharmony_ci    return WSErrorCode::WS_ERROR_NOT_REGISTER_SYNC_CALLBACK;
288e0dac50fSopenharmony_ci}
289e0dac50fSopenharmony_ci
290e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::RegisterTransferComponentDataForResultListener(
291e0dac50fSopenharmony_ci    const NotifyTransferComponentDataForResultFunc& func)
292e0dac50fSopenharmony_ci{
293e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
294e0dac50fSopenharmony_ci        WLOGFE("session invalid.");
295e0dac50fSopenharmony_ci        return;
296e0dac50fSopenharmony_ci    }
297e0dac50fSopenharmony_ci    notifyTransferComponentDataForResultFunc_ = std::move(func);
298e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
299e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession);
300e0dac50fSopenharmony_ci    hostSession->NotifySyncOn();
301e0dac50fSopenharmony_ci}
302e0dac50fSopenharmony_ci
303e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::TriggerBindModalUIExtension()
304e0dac50fSopenharmony_ci{
305e0dac50fSopenharmony_ci    WLOGFD("in");
306e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
307e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession);
308e0dac50fSopenharmony_ci    hostSession->TriggerBindModalUIExtension();
309e0dac50fSopenharmony_ci}
310e0dac50fSopenharmony_ci
311e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::SetPrivacyMode(bool isPrivacyMode)
312e0dac50fSopenharmony_ci{
313e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "Id: %{public}u, isPrivacyMode: %{public}u", GetPersistentId(),
314e0dac50fSopenharmony_ci        isPrivacyMode);
315e0dac50fSopenharmony_ci    if (surfaceNode_ == nullptr) {
316e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "surfaceNode is nullptr");
317e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
318e0dac50fSopenharmony_ci    }
319e0dac50fSopenharmony_ci    surfaceNode_->SetSecurityLayer(isPrivacyMode);
320e0dac50fSopenharmony_ci    RSTransaction::FlushImplicitTransaction();
321e0dac50fSopenharmony_ci
322e0dac50fSopenharmony_ci    if (state_ != WindowState::STATE_SHOWN) {
323e0dac50fSopenharmony_ci        extensionWindowFlags_.privacyModeFlag = isPrivacyMode;
324e0dac50fSopenharmony_ci        return WMError::WM_OK;
325e0dac50fSopenharmony_ci    }
326e0dac50fSopenharmony_ci    if (isPrivacyMode == extensionWindowFlags_.privacyModeFlag) {
327e0dac50fSopenharmony_ci        return WMError::WM_OK;
328e0dac50fSopenharmony_ci    }
329e0dac50fSopenharmony_ci
330e0dac50fSopenharmony_ci    auto updateFlags = extensionWindowFlags_;
331e0dac50fSopenharmony_ci    updateFlags.privacyModeFlag = isPrivacyMode;
332e0dac50fSopenharmony_ci    ExtensionWindowFlags actions(0);
333e0dac50fSopenharmony_ci    actions.privacyModeFlag = true;
334e0dac50fSopenharmony_ci    auto ret = UpdateExtWindowFlags(updateFlags, actions);
335e0dac50fSopenharmony_ci    if (ret == WMError::WM_OK) {
336e0dac50fSopenharmony_ci        extensionWindowFlags_ = updateFlags;
337e0dac50fSopenharmony_ci    }
338e0dac50fSopenharmony_ci    return ret;
339e0dac50fSopenharmony_ci}
340e0dac50fSopenharmony_ci
341e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::HidePrivacyContentForHost(bool needHide)
342e0dac50fSopenharmony_ci{
343e0dac50fSopenharmony_ci    auto persistentId = GetPersistentId();
344e0dac50fSopenharmony_ci    std::stringstream ss;
345e0dac50fSopenharmony_ci    ss << "ID: " << persistentId << ", needHide: " << needHide;
346e0dac50fSopenharmony_ci
347e0dac50fSopenharmony_ci    if (surfaceNode_ == nullptr) {
348e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_UIEXT, "surfaceNode is null, %{public}s", ss.str().c_str());
349e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
350e0dac50fSopenharmony_ci    }
351e0dac50fSopenharmony_ci
352e0dac50fSopenharmony_ci    // Let rs guarantee the security and permissions of the interface
353e0dac50fSopenharmony_ci    auto errCode = surfaceNode_->SetHidePrivacyContent(needHide);
354e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "Notify Render Service client finished, %{public}s, err: %{public}u", ss.str().c_str(),
355e0dac50fSopenharmony_ci          errCode);
356e0dac50fSopenharmony_ci    if (errCode == RSInterfaceErrorCode::NONSYSTEM_CALLING) { // not system app calling
357e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NOT_SYSTEM_APP;
358e0dac50fSopenharmony_ci    } else if (errCode != RSInterfaceErrorCode::NO_ERROR) { // other error
359e0dac50fSopenharmony_ci        return WMError::WM_ERROR_SYSTEM_ABNORMALLY;
360e0dac50fSopenharmony_ci    } else { // notify Render Service ok
361e0dac50fSopenharmony_ci    }
362e0dac50fSopenharmony_ci
363e0dac50fSopenharmony_ci    return WMError::WM_OK;
364e0dac50fSopenharmony_ci}
365e0dac50fSopenharmony_ci
366e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyFocusStateEvent(bool focusState)
367e0dac50fSopenharmony_ci{
368e0dac50fSopenharmony_ci    if (auto uiContent = GetUIContentSharedPtr()) {
369e0dac50fSopenharmony_ci        focusState ? uiContent->Focus() : uiContent->UnFocus();
370e0dac50fSopenharmony_ci    }
371e0dac50fSopenharmony_ci    if (focusState) {
372e0dac50fSopenharmony_ci        NotifyWindowAfterFocused();
373e0dac50fSopenharmony_ci    } else {
374e0dac50fSopenharmony_ci        NotifyWindowAfterUnfocused();
375e0dac50fSopenharmony_ci    }
376e0dac50fSopenharmony_ci    focusState_ = focusState;
377e0dac50fSopenharmony_ci    if (focusState_ != std::nullopt) {
378e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_FOCUS, "persistentId:%{public}d focusState:%{public}d",
379e0dac50fSopenharmony_ci            GetPersistentId(), static_cast<int32_t>(focusState_.value()));
380e0dac50fSopenharmony_ci    }
381e0dac50fSopenharmony_ci}
382e0dac50fSopenharmony_ci
383e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyFocusActiveEvent(bool isFocusActive)
384e0dac50fSopenharmony_ci{
385e0dac50fSopenharmony_ci    if (auto uiContent = GetUIContentSharedPtr()) {
386e0dac50fSopenharmony_ci        uiContent->SetIsFocusActive(isFocusActive);
387e0dac50fSopenharmony_ci    }
388e0dac50fSopenharmony_ci}
389e0dac50fSopenharmony_ci
390e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyBackpressedEvent(bool& isConsumed)
391e0dac50fSopenharmony_ci{
392e0dac50fSopenharmony_ci    if (auto uiContent = GetUIContentSharedPtr()) {
393e0dac50fSopenharmony_ci        WLOGFD("Transfer backpressed event to uiContent");
394e0dac50fSopenharmony_ci        isConsumed = uiContent->ProcessBackPressed();
395e0dac50fSopenharmony_ci    }
396e0dac50fSopenharmony_ci    WLOGFD("Backpressed event is consumed %{public}d", isConsumed);
397e0dac50fSopenharmony_ci}
398e0dac50fSopenharmony_ci
399e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::InputMethodKeyEventResultCallback(const std::shared_ptr<MMI::KeyEvent>& keyEvent,
400e0dac50fSopenharmony_ci    bool consumed, std::shared_ptr<std::promise<bool>> isConsumedPromise, std::shared_ptr<bool> isTimeout)
401e0dac50fSopenharmony_ci{
402e0dac50fSopenharmony_ci    if (keyEvent == nullptr) {
403e0dac50fSopenharmony_ci        WLOGFW("keyEvent is null, consumed:%{public}" PRId32, consumed);
404e0dac50fSopenharmony_ci        if (isConsumedPromise != nullptr) {
405e0dac50fSopenharmony_ci            isConsumedPromise->set_value(consumed);
406e0dac50fSopenharmony_ci        }
407e0dac50fSopenharmony_ci        return;
408e0dac50fSopenharmony_ci    }
409e0dac50fSopenharmony_ci
410e0dac50fSopenharmony_ci    auto id = keyEvent->GetId();
411e0dac50fSopenharmony_ci    if (isConsumedPromise == nullptr || isTimeout == nullptr) {
412e0dac50fSopenharmony_ci        WLOGFW("Shared point isConsumedPromise or isTimeout is null, id:%{public}" PRId32, id);
413e0dac50fSopenharmony_ci        keyEvent->MarkProcessed();
414e0dac50fSopenharmony_ci        return;
415e0dac50fSopenharmony_ci    }
416e0dac50fSopenharmony_ci
417e0dac50fSopenharmony_ci    if (*isTimeout) {
418e0dac50fSopenharmony_ci        WLOGFW("DispatchKeyEvent timeout id:%{public}" PRId32, id);
419e0dac50fSopenharmony_ci        keyEvent->MarkProcessed();
420e0dac50fSopenharmony_ci        return;
421e0dac50fSopenharmony_ci    }
422e0dac50fSopenharmony_ci
423e0dac50fSopenharmony_ci    if (consumed) {
424e0dac50fSopenharmony_ci        isConsumedPromise->set_value(consumed);
425e0dac50fSopenharmony_ci        WLOGD("Input method has processed key event, id:%{public}" PRId32, id);
426e0dac50fSopenharmony_ci        return;
427e0dac50fSopenharmony_ci    }
428e0dac50fSopenharmony_ci
429e0dac50fSopenharmony_ci    bool isConsumed = false;
430e0dac50fSopenharmony_ci    DispatchKeyEventCallback(const_cast<std::shared_ptr<MMI::KeyEvent>&>(keyEvent), isConsumed);
431e0dac50fSopenharmony_ci    isConsumedPromise->set_value(isConsumed);
432e0dac50fSopenharmony_ci}
433e0dac50fSopenharmony_ci
434e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool& isConsumed,
435e0dac50fSopenharmony_ci    bool notifyInputMethod)
436e0dac50fSopenharmony_ci{
437e0dac50fSopenharmony_ci    if (keyEvent == nullptr) {
438e0dac50fSopenharmony_ci        WLOGFE("keyEvent is nullptr");
439e0dac50fSopenharmony_ci        return;
440e0dac50fSopenharmony_ci    }
441e0dac50fSopenharmony_ci
442e0dac50fSopenharmony_ci#ifdef IMF_ENABLE
443e0dac50fSopenharmony_ci    bool isKeyboardEvent = IsKeyboardEvent(keyEvent);
444e0dac50fSopenharmony_ci    if (isKeyboardEvent && notifyInputMethod) {
445e0dac50fSopenharmony_ci        WLOGD("Async dispatch keyEvent to input method, id:%{public}" PRId32, keyEvent->GetId());
446e0dac50fSopenharmony_ci        auto isConsumedPromise = std::make_shared<std::promise<bool>>();
447e0dac50fSopenharmony_ci        auto isConsumedFuture = isConsumedPromise->get_future().share();
448e0dac50fSopenharmony_ci        auto isTimeout = std::make_shared<bool>(false);
449e0dac50fSopenharmony_ci        auto ret = MiscServices::InputMethodController::GetInstance()->DispatchKeyEvent(keyEvent,
450e0dac50fSopenharmony_ci            [weakThis = wptr(this), isConsumedPromise, isTimeout](const std::shared_ptr<MMI::KeyEvent>& keyEvent,
451e0dac50fSopenharmony_ci                bool consumed) {
452e0dac50fSopenharmony_ci                auto window = weakThis.promote();
453e0dac50fSopenharmony_ci                if (window == nullptr) {
454e0dac50fSopenharmony_ci                    TLOGNE(WmsLogTag::WMS_UIEXT, "window is nullptr");
455e0dac50fSopenharmony_ci                    return;
456e0dac50fSopenharmony_ci                }
457e0dac50fSopenharmony_ci                window->InputMethodKeyEventResultCallback(keyEvent, consumed, isConsumedPromise, isTimeout);
458e0dac50fSopenharmony_ci            });
459e0dac50fSopenharmony_ci        if (ret != 0) {
460e0dac50fSopenharmony_ci            WLOGFW("DispatchKeyEvent failed, ret:%{public}" PRId32 ", id:%{public}" PRId32, ret, keyEvent->GetId());
461e0dac50fSopenharmony_ci            DispatchKeyEventCallback(keyEvent, isConsumed);
462e0dac50fSopenharmony_ci            return;
463e0dac50fSopenharmony_ci        }
464e0dac50fSopenharmony_ci        if (isConsumedFuture.wait_for(std::chrono::milliseconds(DISPATCH_KEY_EVENT_TIMEOUT_TIME_MS)) ==
465e0dac50fSopenharmony_ci            std::future_status::timeout) {
466e0dac50fSopenharmony_ci            *isTimeout = true;
467e0dac50fSopenharmony_ci            isConsumed = true;
468e0dac50fSopenharmony_ci            WLOGFE("DispatchKeyEvent timeout, id:%{public}" PRId32, keyEvent->GetId());
469e0dac50fSopenharmony_ci        } else {
470e0dac50fSopenharmony_ci            isConsumed = isConsumedFuture.get();
471e0dac50fSopenharmony_ci        }
472e0dac50fSopenharmony_ci        WLOGFD("Input Method DispatchKeyEvent isConsumed:%{public}" PRId32, isConsumed);
473e0dac50fSopenharmony_ci        return;
474e0dac50fSopenharmony_ci    }
475e0dac50fSopenharmony_ci#endif // IMF_ENABLE
476e0dac50fSopenharmony_ci    DispatchKeyEventCallback(keyEvent, isConsumed);
477e0dac50fSopenharmony_ci}
478e0dac50fSopenharmony_ci
479e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::ArkUIFrameworkSupport()
480e0dac50fSopenharmony_ci{
481e0dac50fSopenharmony_ci    uint32_t version = 0;
482e0dac50fSopenharmony_ci    if ((context_ != nullptr) && (context_->GetApplicationInfo() != nullptr)) {
483e0dac50fSopenharmony_ci        version = context_->GetApplicationInfo()->apiCompatibleVersion;
484e0dac50fSopenharmony_ci    }
485e0dac50fSopenharmony_ci    // 10 ArkUI new framework support after API10
486e0dac50fSopenharmony_ci    if (version < 10) {
487e0dac50fSopenharmony_ci        SetLayoutFullScreenByApiVersion(isIgnoreSafeArea_);
488e0dac50fSopenharmony_ci        if (!isSystembarPropertiesSet_) {
489e0dac50fSopenharmony_ci            SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, SystemBarProperty());
490e0dac50fSopenharmony_ci        }
491e0dac50fSopenharmony_ci    } else if (isIgnoreSafeAreaNeedNotify_) {
492e0dac50fSopenharmony_ci        SetLayoutFullScreenByApiVersion(isIgnoreSafeArea_);
493e0dac50fSopenharmony_ci    }
494e0dac50fSopenharmony_ci}
495e0dac50fSopenharmony_ci
496e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::NapiSetUIContent(const std::string& contentInfo, napi_env env, napi_value storage,
497e0dac50fSopenharmony_ci    BackupAndRestoreType type, sptr<IRemoteObject> token, AppExecFwk::Ability* ability)
498e0dac50fSopenharmony_ci{
499e0dac50fSopenharmony_ci    WLOGFD("%{public}s state:%{public}u", contentInfo.c_str(), state_);
500e0dac50fSopenharmony_ci    if (auto uiContent = GetUIContentSharedPtr()) {
501e0dac50fSopenharmony_ci        uiContent->Destroy();
502e0dac50fSopenharmony_ci    }
503e0dac50fSopenharmony_ci    {
504e0dac50fSopenharmony_ci        std::unique_ptr<Ace::UIContent> uiContent;
505e0dac50fSopenharmony_ci        if (ability != nullptr) {
506e0dac50fSopenharmony_ci            uiContent = Ace::UIContent::Create(ability);
507e0dac50fSopenharmony_ci        } else {
508e0dac50fSopenharmony_ci            uiContent = Ace::UIContent::Create(context_.get(), reinterpret_cast<NativeEngine*>(env));
509e0dac50fSopenharmony_ci        }
510e0dac50fSopenharmony_ci        if (uiContent == nullptr) {
511e0dac50fSopenharmony_ci            WLOGFE("failed, id: %{public}d", GetPersistentId());
512e0dac50fSopenharmony_ci            return WMError::WM_ERROR_NULLPTR;
513e0dac50fSopenharmony_ci        }
514e0dac50fSopenharmony_ci        uiContent->SetParentToken(token);
515e0dac50fSopenharmony_ci        if (property_->GetUIExtensionUsage() == UIExtensionUsage::CONSTRAINED_EMBEDDED) {
516e0dac50fSopenharmony_ci            uiContent->SetUIContentType(Ace::UIContentType::SECURITY_UI_EXTENSION);
517e0dac50fSopenharmony_ci        }
518e0dac50fSopenharmony_ci        uiContent->Initialize(this, contentInfo, storage, property_->GetParentId());
519e0dac50fSopenharmony_ci        // make uiContent available after Initialize/Restore
520e0dac50fSopenharmony_ci        std::unique_lock<std::shared_mutex> lock(uiContentMutex_);
521e0dac50fSopenharmony_ci        uiContent_ = std::move(uiContent);
522e0dac50fSopenharmony_ci    }
523e0dac50fSopenharmony_ci    SetUIContentComplete();
524e0dac50fSopenharmony_ci    NotifyModalUIExtensionMayBeCovered(true);
525e0dac50fSopenharmony_ci
526e0dac50fSopenharmony_ci    UpdateAccessibilityTreeInfo();
527e0dac50fSopenharmony_ci    std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr();
528e0dac50fSopenharmony_ci    if (uiContent == nullptr) {
529e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::DEFAULT, "uiContent is nullptr.");
530e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
531e0dac50fSopenharmony_ci    }
532e0dac50fSopenharmony_ci    if (focusState_ != std::nullopt) {
533e0dac50fSopenharmony_ci        focusState_.value() ? uiContent->Focus() : uiContent->UnFocus();
534e0dac50fSopenharmony_ci    }
535e0dac50fSopenharmony_ci    ArkUIFrameworkSupport();
536e0dac50fSopenharmony_ci    UpdateDecorEnable(true);
537e0dac50fSopenharmony_ci    if (state_ == WindowState::STATE_SHOWN) {
538e0dac50fSopenharmony_ci        // UIContent may be nullptr when show window, need to notify again when window is shown
539e0dac50fSopenharmony_ci        uiContent->Foreground();
540e0dac50fSopenharmony_ci        UpdateTitleButtonVisibility();
541e0dac50fSopenharmony_ci    }
542e0dac50fSopenharmony_ci    UpdateViewportConfig(GetRect(), WindowSizeChangeReason::UNDEFINED);
543e0dac50fSopenharmony_ci    WLOGFD("notify uiContent window size change end");
544e0dac50fSopenharmony_ci    return WMError::WM_OK;
545e0dac50fSopenharmony_ci}
546e0dac50fSopenharmony_ci
547e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::UpdateRect(const WSRect& rect, SizeChangeReason reason,
548e0dac50fSopenharmony_ci    const SceneAnimationConfig& config)
549e0dac50fSopenharmony_ci{
550e0dac50fSopenharmony_ci    auto wmReason = static_cast<WindowSizeChangeReason>(reason);
551e0dac50fSopenharmony_ci    Rect wmRect = {rect.posX_, rect.posY_, rect.width_, rect.height_};
552e0dac50fSopenharmony_ci    auto preRect = GetRect();
553e0dac50fSopenharmony_ci    if (rect.width_ == static_cast<int>(preRect.width_) && rect.height_ == static_cast<int>(preRect.height_)) {
554e0dac50fSopenharmony_ci        WLOGFD("EQ [%{public}d, %{public}d, reason: %{public}d]", rect.width_,
555e0dac50fSopenharmony_ci            rect.height_, static_cast<int>(reason));
556e0dac50fSopenharmony_ci    } else {
557e0dac50fSopenharmony_ci        WLOGFI("[%{public}d, %{public}d, reason: %{public}d]", rect.width_,
558e0dac50fSopenharmony_ci            rect.height_, static_cast<int>(reason));
559e0dac50fSopenharmony_ci    }
560e0dac50fSopenharmony_ci    property_->SetWindowRect(wmRect);
561e0dac50fSopenharmony_ci
562e0dac50fSopenharmony_ci    if (property_->GetUIExtensionUsage() == UIExtensionUsage::MODAL) {
563e0dac50fSopenharmony_ci        if (!abilityToken_) {
564e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "token is nullptr");
565e0dac50fSopenharmony_ci            return WSError::WS_ERROR_NULLPTR;
566e0dac50fSopenharmony_ci        }
567e0dac50fSopenharmony_ci        SingletonContainer::Get<WindowAdapter>().UpdateModalExtensionRect(abilityToken_, wmRect);
568e0dac50fSopenharmony_ci    }
569e0dac50fSopenharmony_ci
570e0dac50fSopenharmony_ci    if (wmReason == WindowSizeChangeReason::ROTATION) {
571e0dac50fSopenharmony_ci        const std::shared_ptr<RSTransaction>& rsTransaction = config.rsTransaction_;
572e0dac50fSopenharmony_ci        UpdateRectForRotation(wmRect, preRect, wmReason, rsTransaction);
573e0dac50fSopenharmony_ci    } else if (handler_ != nullptr) {
574e0dac50fSopenharmony_ci        UpdateRectForOtherReason(wmRect, wmReason);
575e0dac50fSopenharmony_ci    } else {
576e0dac50fSopenharmony_ci        NotifySizeChange(wmRect, wmReason);
577e0dac50fSopenharmony_ci        UpdateViewportConfig(wmRect, wmReason);
578e0dac50fSopenharmony_ci    }
579e0dac50fSopenharmony_ci    return WSError::WS_OK;
580e0dac50fSopenharmony_ci}
581e0dac50fSopenharmony_ci
582e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateRectForRotation(const Rect& wmRect, const Rect& preRect,
583e0dac50fSopenharmony_ci    WindowSizeChangeReason wmReason, const std::shared_ptr<RSTransaction>& rsTransaction)
584e0dac50fSopenharmony_ci{
585e0dac50fSopenharmony_ci    if (!handler_) {
586e0dac50fSopenharmony_ci        return;
587e0dac50fSopenharmony_ci    }
588e0dac50fSopenharmony_ci    auto task = [weak = wptr(this), wmReason, wmRect, preRect, rsTransaction]() mutable {
589e0dac50fSopenharmony_ci        HITRACE_METER_NAME(HITRACE_TAG_WINDOW_MANAGER, "WindowExtensionSessionImpl::UpdateRectForRotation");
590e0dac50fSopenharmony_ci        auto window = weak.promote();
591e0dac50fSopenharmony_ci        if (!window) {
592e0dac50fSopenharmony_ci            return;
593e0dac50fSopenharmony_ci        }
594e0dac50fSopenharmony_ci        int32_t duration = UIEXTENTION_ROTATION_ANIMATION_TIME;
595e0dac50fSopenharmony_ci        bool needSync = false;
596e0dac50fSopenharmony_ci        if (rsTransaction && rsTransaction->GetSyncId() > 0) {
597e0dac50fSopenharmony_ci            // extract high 32 bits of SyncId as pid
598e0dac50fSopenharmony_ci            auto SyncTransactionPid = static_cast<int32_t>(rsTransaction->GetSyncId() >> 32);
599e0dac50fSopenharmony_ci            if (rsTransaction->IsOpenSyncTransaction() || SyncTransactionPid != rsTransaction->GetParentPid()) {
600e0dac50fSopenharmony_ci                needSync = true;
601e0dac50fSopenharmony_ci            }
602e0dac50fSopenharmony_ci        }
603e0dac50fSopenharmony_ci
604e0dac50fSopenharmony_ci        if (needSync) {
605e0dac50fSopenharmony_ci            duration = rsTransaction->GetDuration() ? rsTransaction->GetDuration() : duration;
606e0dac50fSopenharmony_ci            RSTransaction::FlushImplicitTransaction();
607e0dac50fSopenharmony_ci            rsTransaction->Begin();
608e0dac50fSopenharmony_ci        }
609e0dac50fSopenharmony_ci        RSAnimationTimingProtocol protocol;
610e0dac50fSopenharmony_ci        protocol.SetDuration(duration);
611e0dac50fSopenharmony_ci        // animation curve: cubic [0.2, 0.0, 0.2, 1.0]
612e0dac50fSopenharmony_ci        auto curve = RSAnimationTimingCurve::CreateCubicCurve(0.2, 0.0, 0.2, 1.0);
613e0dac50fSopenharmony_ci        RSNode::OpenImplicitAnimation(protocol, curve);
614e0dac50fSopenharmony_ci        if (wmRect != preRect) {
615e0dac50fSopenharmony_ci            window->NotifySizeChange(wmRect, wmReason);
616e0dac50fSopenharmony_ci        }
617e0dac50fSopenharmony_ci        window->UpdateViewportConfig(wmRect, wmReason, rsTransaction);
618e0dac50fSopenharmony_ci        RSNode::CloseImplicitAnimation();
619e0dac50fSopenharmony_ci        if (needSync) {
620e0dac50fSopenharmony_ci            rsTransaction->Commit();
621e0dac50fSopenharmony_ci        } else {
622e0dac50fSopenharmony_ci            RSTransaction::FlushImplicitTransaction();
623e0dac50fSopenharmony_ci        }
624e0dac50fSopenharmony_ci    };
625e0dac50fSopenharmony_ci    handler_->PostTask(task, "WMS_WindowExtensionSessionImpl_UpdateRectForRotation");
626e0dac50fSopenharmony_ci}
627e0dac50fSopenharmony_ci
628e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateRectForOtherReason(const Rect& wmRect, WindowSizeChangeReason wmReason)
629e0dac50fSopenharmony_ci{
630e0dac50fSopenharmony_ci    auto task = [weak = wptr(this), wmReason, wmRect] {
631e0dac50fSopenharmony_ci        auto window = weak.promote();
632e0dac50fSopenharmony_ci        if (!window) {
633e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_LAYOUT, "window is null, updateViewPortConfig failed");
634e0dac50fSopenharmony_ci            return;
635e0dac50fSopenharmony_ci        }
636e0dac50fSopenharmony_ci        window->NotifySizeChange(wmRect, wmReason);
637e0dac50fSopenharmony_ci        window->UpdateViewportConfig(wmRect, wmReason);
638e0dac50fSopenharmony_ci    };
639e0dac50fSopenharmony_ci    if (handler_) {
640e0dac50fSopenharmony_ci        handler_->PostTask(task, "WMS_WindowExtensionSessionImpl_UpdateRectForOtherReason");
641e0dac50fSopenharmony_ci    }
642e0dac50fSopenharmony_ci}
643e0dac50fSopenharmony_ci
644e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::GetSystemViewportConfig(SessionViewportConfig& config)
645e0dac50fSopenharmony_ci{
646e0dac50fSopenharmony_ci    config.displayId_ = property_->GetDisplayId();
647e0dac50fSopenharmony_ci    auto display = SingletonContainer::Get<DisplayManager>().GetDisplayById(config.displayId_);
648e0dac50fSopenharmony_ci    if (display == nullptr) {
649e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "display is null!");
650e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
651e0dac50fSopenharmony_ci    }
652e0dac50fSopenharmony_ci    auto displayInfo = display->GetDisplayInfo();
653e0dac50fSopenharmony_ci    if (displayInfo == nullptr) {
654e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "displayInfo is null");
655e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
656e0dac50fSopenharmony_ci    }
657e0dac50fSopenharmony_ci    config.density_ = displayInfo->GetVirtualPixelRatio();
658e0dac50fSopenharmony_ci    auto rotation = ONE_FOURTH_FULL_CIRCLE_DEGREE * static_cast<uint32_t>(displayInfo->GetRotation());
659e0dac50fSopenharmony_ci    auto deviceRotation = static_cast<uint32_t>(displayInfo->GetDefaultDeviceRotationOffset());
660e0dac50fSopenharmony_ci    config.transform_ = (rotation + deviceRotation) % FULL_CIRCLE_DEGREE;
661e0dac50fSopenharmony_ci    config.orientation_ = static_cast<int32_t>(displayInfo->GetDisplayOrientation());
662e0dac50fSopenharmony_ci    return WMError::WM_OK;
663e0dac50fSopenharmony_ci}
664e0dac50fSopenharmony_ci
665e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateSystemViewportConfig()
666e0dac50fSopenharmony_ci{
667e0dac50fSopenharmony_ci    if (!handler_) {
668e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "handler_ is null");
669e0dac50fSopenharmony_ci        return;
670e0dac50fSopenharmony_ci    }
671e0dac50fSopenharmony_ci    auto task = [weak = wptr(this)]() {
672e0dac50fSopenharmony_ci        auto window = weak.promote();
673e0dac50fSopenharmony_ci        if (!window) {
674e0dac50fSopenharmony_ci            return;
675e0dac50fSopenharmony_ci        }
676e0dac50fSopenharmony_ci        if (window->isDensityFollowHost_) {
677e0dac50fSopenharmony_ci            TLOGW(WmsLogTag::WMS_UIEXT, "UpdateSystemViewportConfig: Density is follow host");
678e0dac50fSopenharmony_ci            return;
679e0dac50fSopenharmony_ci        }
680e0dac50fSopenharmony_ci        SessionViewportConfig config;
681e0dac50fSopenharmony_ci        if (window->GetSystemViewportConfig(config) != WMError::WM_OK) {
682e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "UpdateSystemViewportConfig: Get system viewportConfig failed");
683e0dac50fSopenharmony_ci            return;
684e0dac50fSopenharmony_ci        }
685e0dac50fSopenharmony_ci        if (!MathHelper::NearZero(window->lastDensity_ - config.density_)) {
686e0dac50fSopenharmony_ci            TLOGI(WmsLogTag::WMS_UIEXT, "UpdateSystemViewportConfig: System density is changed");
687e0dac50fSopenharmony_ci            window->UpdateSessionViewportConfig(config);
688e0dac50fSopenharmony_ci        }
689e0dac50fSopenharmony_ci    };
690e0dac50fSopenharmony_ci    handler_->PostTask(task, "UpdateSystemViewportConfig");
691e0dac50fSopenharmony_ci}
692e0dac50fSopenharmony_ci
693e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::UpdateSessionViewportConfig(const SessionViewportConfig& config)
694e0dac50fSopenharmony_ci{
695e0dac50fSopenharmony_ci    if (config.isDensityFollowHost_ && std::islessequal(config.density_, 0.0f)) {
696e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "invalid density_: %{public}f", config.density_);
697e0dac50fSopenharmony_ci        return WSError::WS_ERROR_INVALID_PARAM;
698e0dac50fSopenharmony_ci    }
699e0dac50fSopenharmony_ci    if (!handler_) {
700e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "handler_ is null");
701e0dac50fSopenharmony_ci        return WSError::WS_ERROR_NULLPTR;
702e0dac50fSopenharmony_ci    }
703e0dac50fSopenharmony_ci    auto task = [weak = wptr(this), config]() {
704e0dac50fSopenharmony_ci        auto window = weak.promote();
705e0dac50fSopenharmony_ci        if (!window) {
706e0dac50fSopenharmony_ci            return;
707e0dac50fSopenharmony_ci        }
708e0dac50fSopenharmony_ci        auto viewportConfig = config;
709e0dac50fSopenharmony_ci        window->UpdateExtensionDensity(viewportConfig);
710e0dac50fSopenharmony_ci
711e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_UIEXT, "UpdateSessionViewportConfig: Id:%{public}d, isDensityFollowHost_:%{public}d, "
712e0dac50fSopenharmony_ci            "displayId:%{public}" PRIu64", density:%{public}f, lastDensity:%{public}f, orientation:%{public}d, "
713e0dac50fSopenharmony_ci            "lastOrientation:%{public}d",
714e0dac50fSopenharmony_ci            window->GetPersistentId(), viewportConfig.isDensityFollowHost_, viewportConfig.displayId_,
715e0dac50fSopenharmony_ci            viewportConfig.density_, window->lastDensity_, viewportConfig.orientation_, window->lastOrientation_);
716e0dac50fSopenharmony_ci
717e0dac50fSopenharmony_ci        window->NotifyDisplayInfoChange(viewportConfig);
718e0dac50fSopenharmony_ci        window->property_->SetDisplayId(viewportConfig.displayId_);
719e0dac50fSopenharmony_ci
720e0dac50fSopenharmony_ci        auto ret = window->UpdateSessionViewportConfigInner(viewportConfig);
721e0dac50fSopenharmony_ci        if (ret == WSError::WS_OK) {
722e0dac50fSopenharmony_ci            window->lastDensity_ = viewportConfig.density_;
723e0dac50fSopenharmony_ci            window->lastOrientation_ = viewportConfig.orientation_;
724e0dac50fSopenharmony_ci        }
725e0dac50fSopenharmony_ci    };
726e0dac50fSopenharmony_ci    handler_->PostTask(task, "UpdateSessionViewportConfig");
727e0dac50fSopenharmony_ci    return WSError::WS_OK;
728e0dac50fSopenharmony_ci}
729e0dac50fSopenharmony_ci
730e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateExtensionDensity(SessionViewportConfig& config)
731e0dac50fSopenharmony_ci{
732e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "isFollowHost:%{public}d, densityValue:%{public}f", config.isDensityFollowHost_,
733e0dac50fSopenharmony_ci        config.density_);
734e0dac50fSopenharmony_ci    isDensityFollowHost_ = config.isDensityFollowHost_;
735e0dac50fSopenharmony_ci    if (config.isDensityFollowHost_) {
736e0dac50fSopenharmony_ci        hostDensityValue_ = config.density_;
737e0dac50fSopenharmony_ci        return;
738e0dac50fSopenharmony_ci    }
739e0dac50fSopenharmony_ci    auto display = SingletonContainer::Get<DisplayManager>().GetDisplayById(config.displayId_);
740e0dac50fSopenharmony_ci    if (display == nullptr) {
741e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "display is null!");
742e0dac50fSopenharmony_ci        return;
743e0dac50fSopenharmony_ci    }
744e0dac50fSopenharmony_ci    auto displayInfo = display->GetDisplayInfo();
745e0dac50fSopenharmony_ci    if (displayInfo == nullptr) {
746e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "displayInfo is null");
747e0dac50fSopenharmony_ci        return;
748e0dac50fSopenharmony_ci    }
749e0dac50fSopenharmony_ci    config.density_ = displayInfo->GetVirtualPixelRatio();
750e0dac50fSopenharmony_ci}
751e0dac50fSopenharmony_ci
752e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyDisplayInfoChange(const SessionViewportConfig& config)
753e0dac50fSopenharmony_ci{
754e0dac50fSopenharmony_ci    if (context_ == nullptr) {
755e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "get token of window:%{public}d failed because of context is null.",
756e0dac50fSopenharmony_ci            GetPersistentId());
757e0dac50fSopenharmony_ci        return;
758e0dac50fSopenharmony_ci    }
759e0dac50fSopenharmony_ci    auto token = context_->GetToken();
760e0dac50fSopenharmony_ci    if (token == nullptr) {
761e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "get token of window:%{public}d failed.", GetPersistentId());
762e0dac50fSopenharmony_ci        return;
763e0dac50fSopenharmony_ci    }
764e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowManager>().NotifyDisplayInfoChange(
765e0dac50fSopenharmony_ci        token, config.displayId_, config.density_, static_cast<DisplayOrientation>(config.orientation_));
766e0dac50fSopenharmony_ci}
767e0dac50fSopenharmony_ci
768e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::UpdateSessionViewportConfigInner(const SessionViewportConfig& config)
769e0dac50fSopenharmony_ci{
770e0dac50fSopenharmony_ci    if (NearEqual(lastDensity_, config.density_) && lastOrientation_ == config.orientation_) {
771e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_UIEXT, "No parameters have changed, no need to update");
772e0dac50fSopenharmony_ci        return WSError::WS_DO_NOTHING;
773e0dac50fSopenharmony_ci    }
774e0dac50fSopenharmony_ci    Ace::ViewportConfig viewportConfig;
775e0dac50fSopenharmony_ci    auto rect = GetRect();
776e0dac50fSopenharmony_ci    viewportConfig.SetSize(rect.width_, rect.height_);
777e0dac50fSopenharmony_ci    viewportConfig.SetPosition(rect.posX_, rect.posY_);
778e0dac50fSopenharmony_ci    viewportConfig.SetDensity(config.density_);
779e0dac50fSopenharmony_ci    viewportConfig.SetOrientation(config.orientation_);
780e0dac50fSopenharmony_ci    viewportConfig.SetTransformHint(config.transform_);
781e0dac50fSopenharmony_ci
782e0dac50fSopenharmony_ci    std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr();
783e0dac50fSopenharmony_ci    if (uiContent == nullptr) {
784e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_UIEXT, "uiContent is null!");
785e0dac50fSopenharmony_ci        return WSError::WS_ERROR_NULLPTR;
786e0dac50fSopenharmony_ci    }
787e0dac50fSopenharmony_ci    uiContent->UpdateViewportConfig(viewportConfig, WindowSizeChangeReason::UNDEFINED, nullptr);
788e0dac50fSopenharmony_ci    return WSError::WS_OK;
789e0dac50fSopenharmony_ci}
790e0dac50fSopenharmony_ci
791e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType,
792e0dac50fSopenharmony_ci    int32_t eventType, int64_t timeMs)
793e0dac50fSopenharmony_ci{
794e0dac50fSopenharmony_ci    std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr();
795e0dac50fSopenharmony_ci    if (uiContent == nullptr) {
796e0dac50fSopenharmony_ci        WLOGFE("error, no uiContent");
797e0dac50fSopenharmony_ci        return WSError::WS_ERROR_NO_UI_CONTENT_ERROR;
798e0dac50fSopenharmony_ci    }
799e0dac50fSopenharmony_ci    uiContent->HandleAccessibilityHoverEvent(pointX, pointY, sourceType, eventType, timeMs);
800e0dac50fSopenharmony_ci    return WSError::WS_OK;
801e0dac50fSopenharmony_ci}
802e0dac50fSopenharmony_ci
803e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::TransferAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info,
804e0dac50fSopenharmony_ci    int64_t uiExtensionIdLevel)
805e0dac50fSopenharmony_ci{
806e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
807e0dac50fSopenharmony_ci        WLOGFE("Window session invalid.");
808e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_WINDOW;
809e0dac50fSopenharmony_ci    }
810e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
811e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW);
812e0dac50fSopenharmony_ci    return static_cast<WMError>(hostSession->TransferAccessibilityEvent(info, uiExtensionIdLevel));
813e0dac50fSopenharmony_ci}
814e0dac50fSopenharmony_ci
815e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifySessionForeground(uint32_t reason, bool withAnimation)
816e0dac50fSopenharmony_ci{
817e0dac50fSopenharmony_ci}
818e0dac50fSopenharmony_ci
819e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifySessionBackground(uint32_t reason, bool withAnimation, bool isFromInnerkits)
820e0dac50fSopenharmony_ci{
821e0dac50fSopenharmony_ci}
822e0dac50fSopenharmony_ci
823e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyOccupiedAreaChangeInfo(sptr<OccupiedAreaChangeInfo> info,
824e0dac50fSopenharmony_ci                                                              const std::shared_ptr<RSTransaction>& rsTransaction)
825e0dac50fSopenharmony_ci{
826e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_KEYBOARD, "TextFieldPosY = %{public}f, KeyBoardHeight = %{public}d",
827e0dac50fSopenharmony_ci        info->textFieldPositionY_, info->rect_.height_);
828e0dac50fSopenharmony_ci    if (occupiedAreaChangeListener_) {
829e0dac50fSopenharmony_ci        occupiedAreaChangeListener_->OnSizeChange(info, rsTransaction);
830e0dac50fSopenharmony_ci    }
831e0dac50fSopenharmony_ci}
832e0dac50fSopenharmony_ci
833e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::RegisterOccupiedAreaChangeListener(
834e0dac50fSopenharmony_ci    const sptr<IOccupiedAreaChangeListener>& listener)
835e0dac50fSopenharmony_ci{
836e0dac50fSopenharmony_ci    occupiedAreaChangeListener_ = listener;
837e0dac50fSopenharmony_ci    return WMError::WM_OK;
838e0dac50fSopenharmony_ci}
839e0dac50fSopenharmony_ci
840e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::UnregisterOccupiedAreaChangeListener(
841e0dac50fSopenharmony_ci    const sptr<IOccupiedAreaChangeListener>& listener)
842e0dac50fSopenharmony_ci{
843e0dac50fSopenharmony_ci    occupiedAreaChangeListener_ = nullptr;
844e0dac50fSopenharmony_ci    return WMError::WM_OK;
845e0dac50fSopenharmony_ci}
846e0dac50fSopenharmony_ci
847e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::GetAvoidAreaByType(AvoidAreaType type, AvoidArea& avoidArea)
848e0dac50fSopenharmony_ci{
849e0dac50fSopenharmony_ci    WLOGFI("type %{public}d", type);
850e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
851e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR);
852e0dac50fSopenharmony_ci    avoidArea = hostSession->GetAvoidAreaByType(type);
853e0dac50fSopenharmony_ci    return WMError::WM_OK;
854e0dac50fSopenharmony_ci}
855e0dac50fSopenharmony_ci
856e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::RegisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener)
857e0dac50fSopenharmony_ci{
858e0dac50fSopenharmony_ci    return RegisterExtensionAvoidAreaChangeListener(listener);
859e0dac50fSopenharmony_ci}
860e0dac50fSopenharmony_ci
861e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::UnregisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener)
862e0dac50fSopenharmony_ci{
863e0dac50fSopenharmony_ci    return UnregisterExtensionAvoidAreaChangeListener(listener);
864e0dac50fSopenharmony_ci}
865e0dac50fSopenharmony_ci
866e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::Show(uint32_t reason, bool withAnimation, bool withFocus)
867e0dac50fSopenharmony_ci{
868e0dac50fSopenharmony_ci    CheckAndAddExtWindowFlags();
869e0dac50fSopenharmony_ci    UpdateSystemViewportConfig();
870e0dac50fSopenharmony_ci    return WindowSessionImpl::Show(reason, withAnimation, withFocus);
871e0dac50fSopenharmony_ci}
872e0dac50fSopenharmony_ci
873e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::Hide(uint32_t reason, bool withAnimation, bool isFromInnerkits)
874e0dac50fSopenharmony_ci{
875e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_LIFE, "id:%{public}d Hide, reason:%{public}u, state:%{public}u",
876e0dac50fSopenharmony_ci        GetPersistentId(), reason, state_);
877e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
878e0dac50fSopenharmony_ci        WLOGFE("session invalid");
879e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_WINDOW;
880e0dac50fSopenharmony_ci    }
881e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
882e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW);
883e0dac50fSopenharmony_ci    CheckAndRemoveExtWindowFlags();
884e0dac50fSopenharmony_ci    if (state_ == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) {
885e0dac50fSopenharmony_ci        TLOGD(WmsLogTag::WMS_LIFE, "already hidden [name:%{public}s, id:%{public}d, type: %{public}u]",
886e0dac50fSopenharmony_ci            property_->GetWindowName().c_str(), GetPersistentId(), property_->GetWindowType());
887e0dac50fSopenharmony_ci        NotifyBackgroundFailed(WMError::WM_DO_NOTHING);
888e0dac50fSopenharmony_ci        return WMError::WM_OK;
889e0dac50fSopenharmony_ci    }
890e0dac50fSopenharmony_ci    WSError ret = hostSession->Background();
891e0dac50fSopenharmony_ci    WMError res = static_cast<WMError>(ret);
892e0dac50fSopenharmony_ci    if (res == WMError::WM_OK) {
893e0dac50fSopenharmony_ci        UpdateSubWindowStateAndNotify(GetPersistentId(), WindowState::STATE_HIDDEN);
894e0dac50fSopenharmony_ci        state_ = WindowState::STATE_HIDDEN;
895e0dac50fSopenharmony_ci        requestState_ = WindowState::STATE_HIDDEN;
896e0dac50fSopenharmony_ci        NotifyAfterBackground();
897e0dac50fSopenharmony_ci    } else {
898e0dac50fSopenharmony_ci        TLOGD(WmsLogTag::WMS_LIFE, "window extension session Hide to Background error");
899e0dac50fSopenharmony_ci    }
900e0dac50fSopenharmony_ci    return WMError::WM_OK;
901e0dac50fSopenharmony_ci}
902e0dac50fSopenharmony_ci
903e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyDensityFollowHost(bool isFollowHost, float densityValue)
904e0dac50fSopenharmony_ci{
905e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "isFollowHost:%{public}d densityValue:%{public}f", isFollowHost, densityValue);
906e0dac50fSopenharmony_ci
907e0dac50fSopenharmony_ci    if (!isFollowHost && !isDensityFollowHost_) {
908e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_UIEXT, "isFollowHost is false and not change");
909e0dac50fSopenharmony_ci        return WSError::WS_OK;
910e0dac50fSopenharmony_ci    }
911e0dac50fSopenharmony_ci
912e0dac50fSopenharmony_ci    if (isFollowHost) {
913e0dac50fSopenharmony_ci        if (std::islessequal(densityValue, 0.0f)) {
914e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "densityValue is invalid");
915e0dac50fSopenharmony_ci            return WSError::WS_ERROR_INVALID_PARAM;
916e0dac50fSopenharmony_ci        }
917e0dac50fSopenharmony_ci        if (hostDensityValue_ != std::nullopt &&
918e0dac50fSopenharmony_ci            std::abs(hostDensityValue_->load() - densityValue) < std::numeric_limits<float>::epsilon()) {
919e0dac50fSopenharmony_ci            TLOGI(WmsLogTag::WMS_UIEXT, "densityValue not change");
920e0dac50fSopenharmony_ci            return WSError::WS_OK;
921e0dac50fSopenharmony_ci        }
922e0dac50fSopenharmony_ci        hostDensityValue_ = densityValue;
923e0dac50fSopenharmony_ci    }
924e0dac50fSopenharmony_ci
925e0dac50fSopenharmony_ci    isDensityFollowHost_ = isFollowHost;
926e0dac50fSopenharmony_ci
927e0dac50fSopenharmony_ci    UpdateViewportConfig(GetRect(), WindowSizeChangeReason::UNDEFINED);
928e0dac50fSopenharmony_ci    return WSError::WS_OK;
929e0dac50fSopenharmony_ci}
930e0dac50fSopenharmony_ci
931e0dac50fSopenharmony_cifloat WindowExtensionSessionImpl::GetVirtualPixelRatio(sptr<DisplayInfo> displayInfo)
932e0dac50fSopenharmony_ci{
933e0dac50fSopenharmony_ci    if (isDensityFollowHost_ && hostDensityValue_ != std::nullopt) {
934e0dac50fSopenharmony_ci        return hostDensityValue_->load();
935e0dac50fSopenharmony_ci    }
936e0dac50fSopenharmony_ci    float vpr = 1.0f;
937e0dac50fSopenharmony_ci    if (displayInfo == nullptr) {
938e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "displayInfo is nullptr");
939e0dac50fSopenharmony_ci        return vpr;
940e0dac50fSopenharmony_ci    }
941e0dac50fSopenharmony_ci    return displayInfo->GetVirtualPixelRatio();
942e0dac50fSopenharmony_ci}
943e0dac50fSopenharmony_ci
944e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::CheckHideNonSecureWindowsPermission(bool shouldHide)
945e0dac50fSopenharmony_ci{
946e0dac50fSopenharmony_ci    if ((property_->GetUIExtensionUsage() == UIExtensionUsage::MODAL ||
947e0dac50fSopenharmony_ci         property_->GetUIExtensionUsage() == UIExtensionUsage::CONSTRAINED_EMBEDDED) && !shouldHide) {
948e0dac50fSopenharmony_ci        if (!SessionPermission::VerifyCallingPermission("ohos.permission.ALLOW_SHOW_NON_SECURE_WINDOWS")) {
949e0dac50fSopenharmony_ci            extensionWindowFlags_.hideNonSecureWindowsFlag = true;
950e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "Permission denied in %{public}s UIExtension.",
951e0dac50fSopenharmony_ci                property_->GetUIExtensionUsage() == UIExtensionUsage::MODAL ? "modal" : "constrained embedded");
952e0dac50fSopenharmony_ci            return WMError::WM_ERROR_INVALID_OPERATION;
953e0dac50fSopenharmony_ci        }
954e0dac50fSopenharmony_ci        if (modalUIExtensionMayBeCovered_) {
955e0dac50fSopenharmony_ci            ReportModalUIExtensionMayBeCovered(modalUIExtensionSelfLoadContent_);
956e0dac50fSopenharmony_ci        }
957e0dac50fSopenharmony_ci    }
958e0dac50fSopenharmony_ci    return WMError::WM_OK;
959e0dac50fSopenharmony_ci}
960e0dac50fSopenharmony_ci
961e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::HideNonSecureWindows(bool shouldHide)
962e0dac50fSopenharmony_ci{
963e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "Id: %{public}u, shouldHide: %{public}u", GetPersistentId(), shouldHide);
964e0dac50fSopenharmony_ci    WMError checkRet = CheckHideNonSecureWindowsPermission(shouldHide);
965e0dac50fSopenharmony_ci    if (checkRet != WMError::WM_OK) {
966e0dac50fSopenharmony_ci        return checkRet;
967e0dac50fSopenharmony_ci    }
968e0dac50fSopenharmony_ci
969e0dac50fSopenharmony_ci    if (state_ != WindowState::STATE_SHOWN) {
970e0dac50fSopenharmony_ci        extensionWindowFlags_.hideNonSecureWindowsFlag = shouldHide;
971e0dac50fSopenharmony_ci        return WMError::WM_OK;
972e0dac50fSopenharmony_ci    }
973e0dac50fSopenharmony_ci    if (shouldHide == extensionWindowFlags_.hideNonSecureWindowsFlag) {
974e0dac50fSopenharmony_ci        return WMError::WM_OK;
975e0dac50fSopenharmony_ci    }
976e0dac50fSopenharmony_ci
977e0dac50fSopenharmony_ci    auto updateFlags = extensionWindowFlags_;
978e0dac50fSopenharmony_ci    updateFlags.hideNonSecureWindowsFlag = shouldHide;
979e0dac50fSopenharmony_ci    ExtensionWindowFlags actions(0);
980e0dac50fSopenharmony_ci    actions.hideNonSecureWindowsFlag = true;
981e0dac50fSopenharmony_ci    auto ret = UpdateExtWindowFlags(updateFlags, actions);
982e0dac50fSopenharmony_ci    if (ret == WMError::WM_OK) {
983e0dac50fSopenharmony_ci        extensionWindowFlags_ = updateFlags;
984e0dac50fSopenharmony_ci    }
985e0dac50fSopenharmony_ci    return ret;
986e0dac50fSopenharmony_ci}
987e0dac50fSopenharmony_ci
988e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::SetWaterMarkFlag(bool isEnable)
989e0dac50fSopenharmony_ci{
990e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "Id: %{public}u, isEnable: %{public}u", GetPersistentId(), isEnable);
991e0dac50fSopenharmony_ci    if (state_ != WindowState::STATE_SHOWN) {
992e0dac50fSopenharmony_ci        extensionWindowFlags_.waterMarkFlag = isEnable;
993e0dac50fSopenharmony_ci        return WMError::WM_OK;
994e0dac50fSopenharmony_ci    }
995e0dac50fSopenharmony_ci    if (isEnable == extensionWindowFlags_.waterMarkFlag) {
996e0dac50fSopenharmony_ci        return WMError::WM_OK;
997e0dac50fSopenharmony_ci    }
998e0dac50fSopenharmony_ci
999e0dac50fSopenharmony_ci    auto updateFlags = extensionWindowFlags_;
1000e0dac50fSopenharmony_ci    updateFlags.waterMarkFlag = isEnable;
1001e0dac50fSopenharmony_ci    ExtensionWindowFlags actions(0);
1002e0dac50fSopenharmony_ci    actions.waterMarkFlag = true;
1003e0dac50fSopenharmony_ci    auto ret = UpdateExtWindowFlags(updateFlags, actions);
1004e0dac50fSopenharmony_ci    if (ret == WMError::WM_OK) {
1005e0dac50fSopenharmony_ci        extensionWindowFlags_ = updateFlags;
1006e0dac50fSopenharmony_ci    }
1007e0dac50fSopenharmony_ci    return ret;
1008e0dac50fSopenharmony_ci}
1009e0dac50fSopenharmony_ci
1010e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::CheckAndAddExtWindowFlags()
1011e0dac50fSopenharmony_ci{
1012e0dac50fSopenharmony_ci    if (extensionWindowFlags_.bitData != 0) {
1013e0dac50fSopenharmony_ci        // If flag is true, make it active when foreground
1014e0dac50fSopenharmony_ci        UpdateExtWindowFlags(extensionWindowFlags_, extensionWindowFlags_);
1015e0dac50fSopenharmony_ci    }
1016e0dac50fSopenharmony_ci}
1017e0dac50fSopenharmony_ci
1018e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::CheckAndRemoveExtWindowFlags()
1019e0dac50fSopenharmony_ci{
1020e0dac50fSopenharmony_ci    if (extensionWindowFlags_.bitData != 0) {
1021e0dac50fSopenharmony_ci        // If flag is true, make it inactive when background
1022e0dac50fSopenharmony_ci        UpdateExtWindowFlags(ExtensionWindowFlags(), extensionWindowFlags_);
1023e0dac50fSopenharmony_ci    }
1024e0dac50fSopenharmony_ci}
1025e0dac50fSopenharmony_ci
1026e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyAccessibilityChildTreeRegister(
1027e0dac50fSopenharmony_ci    uint32_t windowId, int32_t treeId, int64_t accessibilityId)
1028e0dac50fSopenharmony_ci{
1029e0dac50fSopenharmony_ci    if (!handler_) {
1030e0dac50fSopenharmony_ci        return WSError::WS_ERROR_INTERNAL_ERROR;
1031e0dac50fSopenharmony_ci    }
1032e0dac50fSopenharmony_ci    auto uiContentSharedPtr = GetUIContentSharedPtr();
1033e0dac50fSopenharmony_ci    if (uiContentSharedPtr == nullptr) {
1034e0dac50fSopenharmony_ci        accessibilityChildTreeInfo_ = {
1035e0dac50fSopenharmony_ci            .windowId = windowId,
1036e0dac50fSopenharmony_ci            .treeId = treeId,
1037e0dac50fSopenharmony_ci            .accessibilityId = accessibilityId
1038e0dac50fSopenharmony_ci        };
1039e0dac50fSopenharmony_ci        TLOGD(WmsLogTag::WMS_UIEXT, "uiContent is null, save the accessibility child tree info.");
1040e0dac50fSopenharmony_ci        return WSError::WS_OK;
1041e0dac50fSopenharmony_ci    }
1042e0dac50fSopenharmony_ci    handler_->PostTask([uiContent = uiContentSharedPtr, windowId, treeId, accessibilityId]() {
1043e0dac50fSopenharmony_ci        if (uiContent == nullptr) {
1044e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "NotifyAccessibilityChildTreeRegister error, no uiContent");
1045e0dac50fSopenharmony_ci            return;
1046e0dac50fSopenharmony_ci        }
1047e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_UIEXT,
1048e0dac50fSopenharmony_ci            "NotifyAccessibilityChildTreeRegister: %{public}d %{public}" PRId64, treeId, accessibilityId);
1049e0dac50fSopenharmony_ci        uiContent->RegisterAccessibilityChildTree(windowId, treeId, accessibilityId);
1050e0dac50fSopenharmony_ci    });
1051e0dac50fSopenharmony_ci    return WSError::WS_OK;
1052e0dac50fSopenharmony_ci}
1053e0dac50fSopenharmony_ci
1054e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyAccessibilityChildTreeUnregister()
1055e0dac50fSopenharmony_ci{
1056e0dac50fSopenharmony_ci    if (!handler_) {
1057e0dac50fSopenharmony_ci        return WSError::WS_ERROR_INTERNAL_ERROR;
1058e0dac50fSopenharmony_ci    }
1059e0dac50fSopenharmony_ci    handler_->PostTask([uiContent = GetUIContentSharedPtr()]() {
1060e0dac50fSopenharmony_ci        if (uiContent == nullptr) {
1061e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "NotifyAccessibilityChildTreeUnregister error, no uiContent");
1062e0dac50fSopenharmony_ci            return;
1063e0dac50fSopenharmony_ci        }
1064e0dac50fSopenharmony_ci        uiContent->DeregisterAccessibilityChildTree();
1065e0dac50fSopenharmony_ci    });
1066e0dac50fSopenharmony_ci    return WSError::WS_OK;
1067e0dac50fSopenharmony_ci}
1068e0dac50fSopenharmony_ci
1069e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyAccessibilityDumpChildInfo(
1070e0dac50fSopenharmony_ci    const std::vector<std::string>& params, std::vector<std::string>& info)
1071e0dac50fSopenharmony_ci{
1072e0dac50fSopenharmony_ci    if (!handler_) {
1073e0dac50fSopenharmony_ci        return WSError::WS_ERROR_INTERNAL_ERROR;
1074e0dac50fSopenharmony_ci    }
1075e0dac50fSopenharmony_ci    handler_->PostSyncTask([uiContent = GetUIContentSharedPtr(), params, &info]() {
1076e0dac50fSopenharmony_ci        if (uiContent == nullptr) {
1077e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "NotifyAccessibilityDumpChildInfo error, no uiContent");
1078e0dac50fSopenharmony_ci            return;
1079e0dac50fSopenharmony_ci        }
1080e0dac50fSopenharmony_ci        uiContent->AccessibilityDumpChildInfo(params, info);
1081e0dac50fSopenharmony_ci    });
1082e0dac50fSopenharmony_ci    return WSError::WS_OK;
1083e0dac50fSopenharmony_ci}
1084e0dac50fSopenharmony_ci
1085e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::UpdateAccessibilityTreeInfo()
1086e0dac50fSopenharmony_ci{
1087e0dac50fSopenharmony_ci    if (accessibilityChildTreeInfo_ == std::nullopt) {
1088e0dac50fSopenharmony_ci        return;
1089e0dac50fSopenharmony_ci    }
1090e0dac50fSopenharmony_ci    std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr();
1091e0dac50fSopenharmony_ci    if (uiContent == nullptr) {
1092e0dac50fSopenharmony_ci        return;
1093e0dac50fSopenharmony_ci    }
1094e0dac50fSopenharmony_ci    uiContent->RegisterAccessibilityChildTree(accessibilityChildTreeInfo_->windowId,
1095e0dac50fSopenharmony_ci        accessibilityChildTreeInfo_->treeId, accessibilityChildTreeInfo_->accessibilityId);
1096e0dac50fSopenharmony_ci    accessibilityChildTreeInfo_.reset();
1097e0dac50fSopenharmony_ci}
1098e0dac50fSopenharmony_ci
1099e0dac50fSopenharmony_ciWMError WindowExtensionSessionImpl::UpdateExtWindowFlags(const ExtensionWindowFlags& flags,
1100e0dac50fSopenharmony_ci    const ExtensionWindowFlags& actions)
1101e0dac50fSopenharmony_ci{
1102e0dac50fSopenharmony_ci    // action is true when the corresponding flag should be updated
1103e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
1104e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_UIEXT, "session is invalid");
1105e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_WINDOW;
1106e0dac50fSopenharmony_ci    }
1107e0dac50fSopenharmony_ci
1108e0dac50fSopenharmony_ci    if (!abilityToken_) {
1109e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "token is nullptr");
1110e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
1111e0dac50fSopenharmony_ci    }
1112e0dac50fSopenharmony_ci
1113e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapter>().UpdateExtWindowFlags(abilityToken_, flags.bitData, actions.bitData);
1114e0dac50fSopenharmony_ci}
1115e0dac50fSopenharmony_ci
1116e0dac50fSopenharmony_ciRect WindowExtensionSessionImpl::GetHostWindowRect(int32_t hostWindowId)
1117e0dac50fSopenharmony_ci{
1118e0dac50fSopenharmony_ci    Rect rect;
1119e0dac50fSopenharmony_ci    if (hostWindowId != property_->GetParentId()) {
1120e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "hostWindowId is invalid");
1121e0dac50fSopenharmony_ci        return rect;
1122e0dac50fSopenharmony_ci    }
1123e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowAdapter>().GetHostWindowRect(hostWindowId, rect);
1124e0dac50fSopenharmony_ci    return rect;
1125e0dac50fSopenharmony_ci}
1126e0dac50fSopenharmony_ci
1127e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::ConsumePointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1128e0dac50fSopenharmony_ci{
1129e0dac50fSopenharmony_ci    if (pointerEvent == nullptr) {
1130e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_EVENT, "PointerEvent is nullptr, windowId: %{public}d", GetWindowId());
1131e0dac50fSopenharmony_ci        return;
1132e0dac50fSopenharmony_ci    }
1133e0dac50fSopenharmony_ci    if (hostSession_ == nullptr) {
1134e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_EVENT, "hostSession is nullptr, windowId: %{public}d", GetWindowId());
1135e0dac50fSopenharmony_ci        pointerEvent->MarkProcessed();
1136e0dac50fSopenharmony_ci        return;
1137e0dac50fSopenharmony_ci    }
1138e0dac50fSopenharmony_ci
1139e0dac50fSopenharmony_ci    MMI::PointerEvent::PointerItem pointerItem;
1140e0dac50fSopenharmony_ci    if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) {
1141e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_EVENT, "invalid pointerEvent, windowId: %{public}d", GetWindowId());
1142e0dac50fSopenharmony_ci        pointerEvent->MarkProcessed();
1143e0dac50fSopenharmony_ci        return;
1144e0dac50fSopenharmony_ci    }
1145e0dac50fSopenharmony_ci    auto action = pointerEvent->GetPointerAction();
1146e0dac50fSopenharmony_ci    bool isPointDown = (action == MMI::PointerEvent::POINTER_ACTION_DOWN ||
1147e0dac50fSopenharmony_ci        action == MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN);
1148e0dac50fSopenharmony_ci    if ((property_->GetUIExtensionUsage() == UIExtensionUsage::MODAL) && isPointDown) {
1149e0dac50fSopenharmony_ci        if (!abilityToken_) {
1150e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_UIEXT, "token is nullptr");
1151e0dac50fSopenharmony_ci            return;
1152e0dac50fSopenharmony_ci        }
1153e0dac50fSopenharmony_ci        SingletonContainer::Get<WindowAdapter>().ProcessModalExtensionPointDown(abilityToken_,
1154e0dac50fSopenharmony_ci            pointerItem.GetDisplayX(), pointerItem.GetDisplayY());
1155e0dac50fSopenharmony_ci    }
1156e0dac50fSopenharmony_ci    if (action != MMI::PointerEvent::POINTER_ACTION_MOVE) {
1157e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_EVENT, "InputTracking id:%{public}d,windowId:%{public}u,"
1158e0dac50fSopenharmony_ci            "pointId:%{public}d,sourceType:%{public}d", pointerEvent->GetId(), GetWindowId(),
1159e0dac50fSopenharmony_ci            pointerEvent->GetPointerId(), pointerEvent->GetSourceType());
1160e0dac50fSopenharmony_ci    }
1161e0dac50fSopenharmony_ci    NotifyPointerEvent(pointerEvent);
1162e0dac50fSopenharmony_ci}
1163e0dac50fSopenharmony_ci
1164e0dac50fSopenharmony_cibool WindowExtensionSessionImpl::PreNotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent)
1165e0dac50fSopenharmony_ci{
1166e0dac50fSopenharmony_ci    if (keyEvent == nullptr) {
1167e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_EVENT, "keyEvent is nullptr");
1168e0dac50fSopenharmony_ci        return false;
1169e0dac50fSopenharmony_ci    }
1170e0dac50fSopenharmony_ci    RefreshNoInteractionTimeoutMonitor();
1171e0dac50fSopenharmony_ci    if (property_->GetUIExtensionUsage() == UIExtensionUsage::CONSTRAINED_EMBEDDED) {
1172e0dac50fSopenharmony_ci        if (focusState_ == std::nullopt) {
1173e0dac50fSopenharmony_ci            TLOGW(WmsLogTag::WMS_EVENT, "focusState is null");
1174e0dac50fSopenharmony_ci            keyEvent->MarkProcessed();
1175e0dac50fSopenharmony_ci            return true;
1176e0dac50fSopenharmony_ci        }
1177e0dac50fSopenharmony_ci        if (!focusState_.value()) {
1178e0dac50fSopenharmony_ci            keyEvent->MarkProcessed();
1179e0dac50fSopenharmony_ci            return true;
1180e0dac50fSopenharmony_ci        }
1181e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_EVENT, "InputTracking:%{public}d wid:%{public}d",
1182e0dac50fSopenharmony_ci            keyEvent->GetId(), keyEvent->GetAgentWindowId());
1183e0dac50fSopenharmony_ci    }
1184e0dac50fSopenharmony_ci    if (auto uiContent = GetUIContentSharedPtr()) {
1185e0dac50fSopenharmony_ci        return uiContent->ProcessKeyEvent(keyEvent, true);
1186e0dac50fSopenharmony_ci    }
1187e0dac50fSopenharmony_ci    return false;
1188e0dac50fSopenharmony_ci}
1189e0dac50fSopenharmony_ci
1190e0dac50fSopenharmony_cibool WindowExtensionSessionImpl::GetFreeMultiWindowModeEnabledState()
1191e0dac50fSopenharmony_ci{
1192e0dac50fSopenharmony_ci    bool enable = false;
1193e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowAdapter>().GetFreeMultiWindowEnableState(enable);
1194e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MULTI_WINDOW, "enable = %{public}u", enable);
1195e0dac50fSopenharmony_ci    return enable;
1196e0dac50fSopenharmony_ci}
1197e0dac50fSopenharmony_ci
1198e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyExtensionTimeout(int32_t errorCode)
1199e0dac50fSopenharmony_ci{
1200e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
1201e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession);
1202e0dac50fSopenharmony_ci    hostSession->NotifyExtensionTimeout(errorCode);
1203e0dac50fSopenharmony_ci}
1204e0dac50fSopenharmony_ci
1205e0dac50fSopenharmony_ciint32_t WindowExtensionSessionImpl::GetRealParentId() const
1206e0dac50fSopenharmony_ci{
1207e0dac50fSopenharmony_ci    return property_->GetRealParentId();
1208e0dac50fSopenharmony_ci}
1209e0dac50fSopenharmony_ci
1210e0dac50fSopenharmony_ciWindowType WindowExtensionSessionImpl::GetParentWindowType() const
1211e0dac50fSopenharmony_ci{
1212e0dac50fSopenharmony_ci    return property_->GetParentWindowType();
1213e0dac50fSopenharmony_ci}
1214e0dac50fSopenharmony_ci
1215e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyModalUIExtensionMayBeCovered(bool byLoadContent)
1216e0dac50fSopenharmony_ci{
1217e0dac50fSopenharmony_ci    if (property_->GetUIExtensionUsage() != UIExtensionUsage::MODAL &&
1218e0dac50fSopenharmony_ci        property_->GetUIExtensionUsage() != UIExtensionUsage::CONSTRAINED_EMBEDDED) {
1219e0dac50fSopenharmony_ci        return;
1220e0dac50fSopenharmony_ci    }
1221e0dac50fSopenharmony_ci
1222e0dac50fSopenharmony_ci    modalUIExtensionMayBeCovered_ = true;
1223e0dac50fSopenharmony_ci    if (byLoadContent) {
1224e0dac50fSopenharmony_ci        modalUIExtensionSelfLoadContent_ = true;
1225e0dac50fSopenharmony_ci    }
1226e0dac50fSopenharmony_ci    if (extensionWindowFlags_.hideNonSecureWindowsFlag) {
1227e0dac50fSopenharmony_ci        return;
1228e0dac50fSopenharmony_ci    }
1229e0dac50fSopenharmony_ci    ReportModalUIExtensionMayBeCovered(byLoadContent);
1230e0dac50fSopenharmony_ci}
1231e0dac50fSopenharmony_ci
1232e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::ReportModalUIExtensionMayBeCovered(bool byLoadContent) const
1233e0dac50fSopenharmony_ci{
1234e0dac50fSopenharmony_ci    TLOGW(WmsLogTag::WMS_UIEXT, "Id=%{public}d", GetPersistentId());
1235e0dac50fSopenharmony_ci    std::ostringstream oss;
1236e0dac50fSopenharmony_ci    oss << "Modal UIExtension may be covered uid: " << getuid();
1237e0dac50fSopenharmony_ci    oss << ", windowName: " << property_->GetWindowName();
1238e0dac50fSopenharmony_ci    if (context_) {
1239e0dac50fSopenharmony_ci        oss << ", bundleName: " << context_->GetBundleName();
1240e0dac50fSopenharmony_ci    }
1241e0dac50fSopenharmony_ci    auto type = byLoadContent ? WindowDFXHelperType::WINDOW_MODAL_UIEXTENSION_UICONTENT_CHECK :
1242e0dac50fSopenharmony_ci        WindowDFXHelperType::WINDOW_MODAL_UIEXTENSION_SUBWINDOW_CHECK;
1243e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowInfoReporter>().ReportWindowException(static_cast<int32_t>(type), getpid(),
1244e0dac50fSopenharmony_ci        oss.str());
1245e0dac50fSopenharmony_ci}
1246e0dac50fSopenharmony_ci
1247e0dac50fSopenharmony_civoid WindowExtensionSessionImpl::NotifyExtensionEventAsync(uint32_t notifyEvent)
1248e0dac50fSopenharmony_ci{
1249e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "notify extension asynchronously, notifyEvent:%{public}d", notifyEvent);
1250e0dac50fSopenharmony_ci    if (IsWindowSessionInvalid()) {
1251e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "Window session invalid.");
1252e0dac50fSopenharmony_ci        return;
1253e0dac50fSopenharmony_ci    }
1254e0dac50fSopenharmony_ci    auto hostSession = GetHostSession();
1255e0dac50fSopenharmony_ci    CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession);
1256e0dac50fSopenharmony_ci    hostSession->NotifyExtensionEventAsync(notifyEvent);
1257e0dac50fSopenharmony_ci}
1258e0dac50fSopenharmony_ci
1259e0dac50fSopenharmony_ciWSError WindowExtensionSessionImpl::NotifyDumpInfo(const std::vector<std::string>& params,
1260e0dac50fSopenharmony_ci    std::vector<std::string>& info)
1261e0dac50fSopenharmony_ci{
1262e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_UIEXT, "Received dump request, persistentId: %{public}d", GetPersistentId());
1263e0dac50fSopenharmony_ci    auto uiContentSharedPtr = GetUIContentSharedPtr();
1264e0dac50fSopenharmony_ci    if (uiContentSharedPtr == nullptr) {
1265e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "uiContent is nullptr");
1266e0dac50fSopenharmony_ci        return WSError::WS_ERROR_NULLPTR;
1267e0dac50fSopenharmony_ci    }
1268e0dac50fSopenharmony_ci    uiContentSharedPtr->DumpInfo(params, info);
1269e0dac50fSopenharmony_ci    if (!SessionPermission::IsBetaVersion()) {
1270e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_UIEXT, "is not beta version, persistentId: %{public}d", GetPersistentId());
1271e0dac50fSopenharmony_ci        info.clear();
1272e0dac50fSopenharmony_ci    }
1273e0dac50fSopenharmony_ci    return WSError::WS_OK;
1274e0dac50fSopenharmony_ci}
1275e0dac50fSopenharmony_ci
1276e0dac50fSopenharmony_cibool WindowExtensionSessionImpl::IsPcOrPadFreeMultiWindowMode() const
1277e0dac50fSopenharmony_ci{
1278e0dac50fSopenharmony_ci    bool isPcOrPadFreeMultiWindowMode = false;
1279e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapter>().IsPcOrPadFreeMultiWindowMode(isPcOrPadFreeMultiWindowMode);
1280e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
1281e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_UIEXT, "cant't find isPcOrPadFreeMultiWindowMode, err: %{public}d",
1282e0dac50fSopenharmony_ci            static_cast<uint32_t>(ret));
1283e0dac50fSopenharmony_ci    }
1284e0dac50fSopenharmony_ci    return isPcOrPadFreeMultiWindowMode;
1285e0dac50fSopenharmony_ci}
1286e0dac50fSopenharmony_ci} // namespace Rosen
1287e0dac50fSopenharmony_ci} // namespace OHOS
1288