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