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_manager_lite.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include <algorithm> 19e0dac50fSopenharmony_ci#include <cinttypes> 20e0dac50fSopenharmony_ci 21e0dac50fSopenharmony_ci#include "marshalling_helper.h" 22e0dac50fSopenharmony_ci#include "window_adapter_lite.h" 23e0dac50fSopenharmony_ci#include "window_manager_agent_lite.h" 24e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 25e0dac50fSopenharmony_ci#include "wm_common.h" 26e0dac50fSopenharmony_ci 27e0dac50fSopenharmony_cinamespace OHOS { 28e0dac50fSopenharmony_cinamespace Rosen { 29e0dac50fSopenharmony_cinamespace { 30e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManagerLite"}; 31e0dac50fSopenharmony_ci} 32e0dac50fSopenharmony_ci 33e0dac50fSopenharmony_ciWM_IMPLEMENT_SINGLE_INSTANCE(WindowManagerLite) 34e0dac50fSopenharmony_ci 35e0dac50fSopenharmony_ciclass WindowManagerLite::Impl { 36e0dac50fSopenharmony_cipublic: 37e0dac50fSopenharmony_ci explicit Impl(std::recursive_mutex& mutex) : mutex_(mutex) {} 38e0dac50fSopenharmony_ci void NotifyFocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken, 39e0dac50fSopenharmony_ci WindowType windowType, DisplayId displayId); 40e0dac50fSopenharmony_ci void NotifyUnfocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken, 41e0dac50fSopenharmony_ci WindowType windowType, DisplayId displayId); 42e0dac50fSopenharmony_ci void NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo); 43e0dac50fSopenharmony_ci void NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo); 44e0dac50fSopenharmony_ci void NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos); 45e0dac50fSopenharmony_ci void NotifyWindowDrawingContentInfoChanged(const std::vector<sptr<WindowDrawingContentInfo>>& 46e0dac50fSopenharmony_ci windowDrawingContentInfos); 47e0dac50fSopenharmony_ci void NotifyWindowModeChange(WindowModeType type); 48e0dac50fSopenharmony_ci void UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing); 49e0dac50fSopenharmony_ci void NotifyWMSConnected(int32_t userId, int32_t screenId); 50e0dac50fSopenharmony_ci void NotifyWMSDisconnected(int32_t userId, int32_t screenId); 51e0dac50fSopenharmony_ci void NotifyWindowStyleChange(WindowStyleType type); 52e0dac50fSopenharmony_ci void UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground); 53e0dac50fSopenharmony_ci void NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos, 54e0dac50fSopenharmony_ci WindowUpdateType type); 55e0dac50fSopenharmony_ci 56e0dac50fSopenharmony_ci static inline SingletonDelegator<WindowManagerLite> delegator_; 57e0dac50fSopenharmony_ci 58e0dac50fSopenharmony_ci std::recursive_mutex& mutex_; 59e0dac50fSopenharmony_ci std::vector<sptr<IFocusChangedListener>> focusChangedListeners_; 60e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> focusChangedListenerAgent_; 61e0dac50fSopenharmony_ci std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners_; 62e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> windowUpdateListenerAgent_; 63e0dac50fSopenharmony_ci std::vector<sptr<IVisibilityChangedListener>> windowVisibilityListeners_; 64e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> windowVisibilityListenerAgent_; 65e0dac50fSopenharmony_ci std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentListeners_; 66e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> windowDrawingContentListenerAgent_; 67e0dac50fSopenharmony_ci std::vector<sptr<IWindowModeChangedListener>> windowModeListeners_; 68e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> windowModeListenerAgent_; 69e0dac50fSopenharmony_ci std::vector<sptr<ICameraWindowChangedListener>> cameraWindowChangedListeners_; 70e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> cameraWindowChangedListenerAgent_; 71e0dac50fSopenharmony_ci sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener_; 72e0dac50fSopenharmony_ci std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners_; 73e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> windowStyleListenerAgent_; 74e0dac50fSopenharmony_ci std::vector<sptr<IPiPStateChangedListener>> pipStateChangedListeners_; 75e0dac50fSopenharmony_ci sptr<WindowManagerAgentLite> pipStateChangedListenerAgent_; 76e0dac50fSopenharmony_ci}; 77e0dac50fSopenharmony_ci 78e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWMSConnected(int32_t userId, int32_t screenId) 79e0dac50fSopenharmony_ci{ 80e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "WMS connected [userId:%{public}d; screenId:%{public}d]", userId, screenId); 81e0dac50fSopenharmony_ci sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener; 82e0dac50fSopenharmony_ci { 83e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 84e0dac50fSopenharmony_ci wmsConnectionChangedListener = wmsConnectionChangedListener_; 85e0dac50fSopenharmony_ci } 86e0dac50fSopenharmony_ci if (wmsConnectionChangedListener != nullptr) { 87e0dac50fSopenharmony_ci wmsConnectionChangedListener->OnConnected(userId, screenId); 88e0dac50fSopenharmony_ci } 89e0dac50fSopenharmony_ci} 90e0dac50fSopenharmony_ci 91e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWMSDisconnected(int32_t userId, int32_t screenId) 92e0dac50fSopenharmony_ci{ 93e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "WMS disconnected [userId:%{public}d; screenId:%{public}d]", userId, screenId); 94e0dac50fSopenharmony_ci sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener; 95e0dac50fSopenharmony_ci { 96e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 97e0dac50fSopenharmony_ci wmsConnectionChangedListener = wmsConnectionChangedListener_; 98e0dac50fSopenharmony_ci } 99e0dac50fSopenharmony_ci if (wmsConnectionChangedListener != nullptr) { 100e0dac50fSopenharmony_ci wmsConnectionChangedListener->OnDisconnected(userId, screenId); 101e0dac50fSopenharmony_ci } 102e0dac50fSopenharmony_ci} 103e0dac50fSopenharmony_ci 104e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo) 105e0dac50fSopenharmony_ci{ 106e0dac50fSopenharmony_ci if (focusChangeInfo == nullptr) { 107e0dac50fSopenharmony_ci return; 108e0dac50fSopenharmony_ci } 109e0dac50fSopenharmony_ci WLOGFD("[WMSFocus]NotifyFocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]", 110e0dac50fSopenharmony_ci focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_, 111e0dac50fSopenharmony_ci static_cast<uint32_t>(focusChangeInfo->windowType_)); 112e0dac50fSopenharmony_ci 113e0dac50fSopenharmony_ci std::vector<sptr<IFocusChangedListener>> focusChangeListeners; 114e0dac50fSopenharmony_ci { 115e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 116e0dac50fSopenharmony_ci focusChangeListeners = focusChangedListeners_; 117e0dac50fSopenharmony_ci } 118e0dac50fSopenharmony_ci WLOGFD("NotifyFocused listeners: %{public}zu", focusChangeListeners.size()); 119e0dac50fSopenharmony_ci for (auto& listener : focusChangeListeners) { 120e0dac50fSopenharmony_ci if (listener == nullptr) { 121e0dac50fSopenharmony_ci continue; 122e0dac50fSopenharmony_ci } 123e0dac50fSopenharmony_ci listener->OnFocused(focusChangeInfo); 124e0dac50fSopenharmony_ci } 125e0dac50fSopenharmony_ci} 126e0dac50fSopenharmony_ci 127e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo) 128e0dac50fSopenharmony_ci{ 129e0dac50fSopenharmony_ci if (focusChangeInfo == nullptr) { 130e0dac50fSopenharmony_ci return; 131e0dac50fSopenharmony_ci } 132e0dac50fSopenharmony_ci WLOGFD("[WMSFocus]NotifyUnfocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]", 133e0dac50fSopenharmony_ci focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_, 134e0dac50fSopenharmony_ci static_cast<uint32_t>(focusChangeInfo->windowType_)); 135e0dac50fSopenharmony_ci 136e0dac50fSopenharmony_ci std::vector<sptr<IFocusChangedListener>> focusChangeListeners; 137e0dac50fSopenharmony_ci { 138e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 139e0dac50fSopenharmony_ci focusChangeListeners = focusChangedListeners_; 140e0dac50fSopenharmony_ci } 141e0dac50fSopenharmony_ci WLOGFD("NotifyUnfocused listeners: %{public}zu", focusChangeListeners.size()); 142e0dac50fSopenharmony_ci for (auto& listener : focusChangeListeners) { 143e0dac50fSopenharmony_ci if (listener == nullptr) { 144e0dac50fSopenharmony_ci continue; 145e0dac50fSopenharmony_ci } 146e0dac50fSopenharmony_ci listener->OnUnfocused(focusChangeInfo); 147e0dac50fSopenharmony_ci } 148e0dac50fSopenharmony_ci} 149e0dac50fSopenharmony_ci 150e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowVisibilityInfoChanged( 151e0dac50fSopenharmony_ci const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos) 152e0dac50fSopenharmony_ci{ 153e0dac50fSopenharmony_ci std::vector<sptr<IVisibilityChangedListener>> visibilityChangeListeners; 154e0dac50fSopenharmony_ci { 155e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 156e0dac50fSopenharmony_ci visibilityChangeListeners = windowVisibilityListeners_; 157e0dac50fSopenharmony_ci } 158e0dac50fSopenharmony_ci for (auto& listener : visibilityChangeListeners) { 159e0dac50fSopenharmony_ci if (listener == nullptr) { 160e0dac50fSopenharmony_ci continue; 161e0dac50fSopenharmony_ci } 162e0dac50fSopenharmony_ci listener->OnWindowVisibilityChanged(windowVisibilityInfos); 163e0dac50fSopenharmony_ci } 164e0dac50fSopenharmony_ci} 165e0dac50fSopenharmony_ci 166e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowDrawingContentInfoChanged( 167e0dac50fSopenharmony_ci const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos) 168e0dac50fSopenharmony_ci{ 169e0dac50fSopenharmony_ci std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentChangeListeners; 170e0dac50fSopenharmony_ci { 171e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 172e0dac50fSopenharmony_ci windowDrawingContentChangeListeners = windowDrawingContentListeners_; 173e0dac50fSopenharmony_ci } 174e0dac50fSopenharmony_ci for (auto& listener : windowDrawingContentChangeListeners) { 175e0dac50fSopenharmony_ci if (listener == nullptr) { 176e0dac50fSopenharmony_ci continue; 177e0dac50fSopenharmony_ci } 178e0dac50fSopenharmony_ci listener->OnWindowDrawingContentChanged(windowDrawingContentInfos); 179e0dac50fSopenharmony_ci } 180e0dac50fSopenharmony_ci} 181e0dac50fSopenharmony_ci 182e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowModeChange(WindowModeType type) 183e0dac50fSopenharmony_ci{ 184e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "WindowManager::Impl UpdateWindowModeTypeInfo type: %{public}d", 185e0dac50fSopenharmony_ci static_cast<uint8_t>(type)); 186e0dac50fSopenharmony_ci std::vector<sptr<IWindowModeChangedListener>> windowModeListeners; 187e0dac50fSopenharmony_ci { 188e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 189e0dac50fSopenharmony_ci windowModeListeners = windowModeListeners_; 190e0dac50fSopenharmony_ci } 191e0dac50fSopenharmony_ci for (auto &listener : windowModeListeners) { 192e0dac50fSopenharmony_ci listener->OnWindowModeUpdate(type); 193e0dac50fSopenharmony_ci } 194e0dac50fSopenharmony_ci} 195e0dac50fSopenharmony_ci 196e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos, 197e0dac50fSopenharmony_ci WindowUpdateType type) 198e0dac50fSopenharmony_ci{ 199e0dac50fSopenharmony_ci if (infos.empty()) { 200e0dac50fSopenharmony_ci WLOGFE("infos is empty"); 201e0dac50fSopenharmony_ci return; 202e0dac50fSopenharmony_ci } 203e0dac50fSopenharmony_ci for (auto& info : infos) { 204e0dac50fSopenharmony_ci if (info == nullptr) { 205e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_MAIN, "info is nullptr"); 206e0dac50fSopenharmony_ci continue; 207e0dac50fSopenharmony_ci } 208e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_MAIN, "wid[%{public}u], innerWid[%{public}u], " 209e0dac50fSopenharmony_ci "uiNodeId[%{public}u], rect[%{public}d %{public}d %{public}d %{public}d], " 210e0dac50fSopenharmony_ci "isFocused[%{public}d], isDecorEnable[%{public}d], displayId[%{public}" PRIu64 "], layer[%{public}u], " 211e0dac50fSopenharmony_ci "mode[%{public}u], type[%{public}u, updateType[%{public}d], bundle[%{public}s]", 212e0dac50fSopenharmony_ci info->wid_, info->innerWid_, info->uiNodeId_, info->windowRect_.width_, info->windowRect_.height_, 213e0dac50fSopenharmony_ci info->windowRect_.posX_, info->windowRect_.posY_, info->focused_, info->isDecorEnable_, info->displayId_, 214e0dac50fSopenharmony_ci info->layer_, info->mode_, info->type_, type, info->bundleName_.c_str()); 215e0dac50fSopenharmony_ci for (const auto& rect : info->touchHotAreas_) { 216e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_MAIN, "window touch hot areas rect[x=%{public}d, y=%{public}d, " 217e0dac50fSopenharmony_ci "w=%{public}d, h=%{public}d]", rect.posX_, rect.posY_, rect.width_, rect.height_); 218e0dac50fSopenharmony_ci } 219e0dac50fSopenharmony_ci } 220e0dac50fSopenharmony_ci 221e0dac50fSopenharmony_ci std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners; 222e0dac50fSopenharmony_ci { 223e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 224e0dac50fSopenharmony_ci windowUpdateListeners = windowUpdateListeners_; 225e0dac50fSopenharmony_ci } 226e0dac50fSopenharmony_ci for (auto& listener : windowUpdateListeners) { 227e0dac50fSopenharmony_ci listener->OnWindowUpdate(infos, type); 228e0dac50fSopenharmony_ci } 229e0dac50fSopenharmony_ci} 230e0dac50fSopenharmony_ci 231e0dac50fSopenharmony_civoid WindowManagerLite::Impl::UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing) 232e0dac50fSopenharmony_ci{ 233e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "Camera window, accessTokenId = %{public}u, isShowing = %{public}u", 234e0dac50fSopenharmony_ci accessTokenId, isShowing); 235e0dac50fSopenharmony_ci std::vector<sptr<ICameraWindowChangedListener>> cameraWindowChangeListeners; 236e0dac50fSopenharmony_ci { 237e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 238e0dac50fSopenharmony_ci cameraWindowChangeListeners = cameraWindowChangedListeners_; 239e0dac50fSopenharmony_ci } 240e0dac50fSopenharmony_ci for (auto& listener : cameraWindowChangeListeners) { 241e0dac50fSopenharmony_ci listener->OnCameraWindowChange(accessTokenId, isShowing); 242e0dac50fSopenharmony_ci } 243e0dac50fSopenharmony_ci} 244e0dac50fSopenharmony_ci 245e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowStyleChange(WindowStyleType type) 246e0dac50fSopenharmony_ci{ 247e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "WindowStyleChange: %{public}d", 248e0dac50fSopenharmony_ci static_cast<uint8_t>(type)); 249e0dac50fSopenharmony_ci std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners; 250e0dac50fSopenharmony_ci { 251e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 252e0dac50fSopenharmony_ci windowStyleListeners = windowStyleListeners_; 253e0dac50fSopenharmony_ci } 254e0dac50fSopenharmony_ci for (auto &listener : windowStyleListeners) { 255e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "real WindowStyleChange type: %{public}d", 256e0dac50fSopenharmony_ci static_cast<uint8_t>(type)); 257e0dac50fSopenharmony_ci listener->OnWindowStyleUpdate(type); 258e0dac50fSopenharmony_ci } 259e0dac50fSopenharmony_ci} 260e0dac50fSopenharmony_ci 261e0dac50fSopenharmony_civoid WindowManagerLite::Impl::UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground) 262e0dac50fSopenharmony_ci{ 263e0dac50fSopenharmony_ci std::vector<sptr<IPiPStateChangedListener>> pipStateChangedListeners; 264e0dac50fSopenharmony_ci { 265e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 266e0dac50fSopenharmony_ci pipStateChangedListeners = pipStateChangedListeners_; 267e0dac50fSopenharmony_ci } 268e0dac50fSopenharmony_ci for (auto& listener : pipStateChangedListeners) { 269e0dac50fSopenharmony_ci if (listener == nullptr) { 270e0dac50fSopenharmony_ci continue; 271e0dac50fSopenharmony_ci } 272e0dac50fSopenharmony_ci listener->OnPiPStateChanged(bundleName, isForeground); 273e0dac50fSopenharmony_ci } 274e0dac50fSopenharmony_ci} 275e0dac50fSopenharmony_ci 276e0dac50fSopenharmony_ciWindowManagerLite::WindowManagerLite() : pImpl_(std::make_unique<Impl>(mutex_)) 277e0dac50fSopenharmony_ci{ 278e0dac50fSopenharmony_ci} 279e0dac50fSopenharmony_ci 280e0dac50fSopenharmony_ciWindowManagerLite::~WindowManagerLite() 281e0dac50fSopenharmony_ci{ 282e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 283e0dac50fSopenharmony_ci destroyed_ = true; 284e0dac50fSopenharmony_ci} 285e0dac50fSopenharmony_ci 286e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterFocusChangedListener(const sptr<IFocusChangedListener>& listener) 287e0dac50fSopenharmony_ci{ 288e0dac50fSopenharmony_ci if (listener == nullptr) { 289e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 290e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 291e0dac50fSopenharmony_ci } 292e0dac50fSopenharmony_ci 293e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 294e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 295e0dac50fSopenharmony_ci if (pImpl_->focusChangedListenerAgent_ == nullptr) { 296e0dac50fSopenharmony_ci pImpl_->focusChangedListenerAgent_ = new (std::nothrow) WindowManagerAgentLite(); 297e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 298e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_); 299e0dac50fSopenharmony_ci } 300e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 301e0dac50fSopenharmony_ci WLOGFW("RegisterWindowManagerAgent failed !"); 302e0dac50fSopenharmony_ci pImpl_->focusChangedListenerAgent_ = nullptr; 303e0dac50fSopenharmony_ci } else { 304e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener); 305e0dac50fSopenharmony_ci if (iter != pImpl_->focusChangedListeners_.end()) { 306e0dac50fSopenharmony_ci WLOGFW("Listener is already registered."); 307e0dac50fSopenharmony_ci return WMError::WM_OK; 308e0dac50fSopenharmony_ci } 309e0dac50fSopenharmony_ci pImpl_->focusChangedListeners_.push_back(listener); 310e0dac50fSopenharmony_ci } 311e0dac50fSopenharmony_ci return ret; 312e0dac50fSopenharmony_ci} 313e0dac50fSopenharmony_ci 314e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterFocusChangedListener(const sptr<IFocusChangedListener>& listener) 315e0dac50fSopenharmony_ci{ 316e0dac50fSopenharmony_ci if (listener == nullptr) { 317e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 318e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 319e0dac50fSopenharmony_ci } 320e0dac50fSopenharmony_ci 321e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 322e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener); 323e0dac50fSopenharmony_ci if (iter == pImpl_->focusChangedListeners_.end()) { 324e0dac50fSopenharmony_ci WLOGFE("could not find this listener"); 325e0dac50fSopenharmony_ci return WMError::WM_OK; 326e0dac50fSopenharmony_ci } 327e0dac50fSopenharmony_ci pImpl_->focusChangedListeners_.erase(iter); 328e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 329e0dac50fSopenharmony_ci if (pImpl_->focusChangedListeners_.empty() && pImpl_->focusChangedListenerAgent_ != nullptr) { 330e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 331e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_); 332e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 333e0dac50fSopenharmony_ci pImpl_->focusChangedListenerAgent_ = nullptr; 334e0dac50fSopenharmony_ci } 335e0dac50fSopenharmony_ci } 336e0dac50fSopenharmony_ci return ret; 337e0dac50fSopenharmony_ci} 338e0dac50fSopenharmony_ci 339e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener) 340e0dac50fSopenharmony_ci{ 341e0dac50fSopenharmony_ci if (listener == nullptr) { 342e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 343e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 344e0dac50fSopenharmony_ci } 345e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 346e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 347e0dac50fSopenharmony_ci if (pImpl_->windowVisibilityListenerAgent_ == nullptr) { 348e0dac50fSopenharmony_ci pImpl_->windowVisibilityListenerAgent_ = new (std::nothrow) WindowManagerAgentLite(); 349e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 350e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY, 351e0dac50fSopenharmony_ci pImpl_->windowVisibilityListenerAgent_); 352e0dac50fSopenharmony_ci } 353e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 354e0dac50fSopenharmony_ci WLOGFW("RegisterWindowManagerAgent failed !"); 355e0dac50fSopenharmony_ci pImpl_->windowVisibilityListenerAgent_ = nullptr; 356e0dac50fSopenharmony_ci } else { 357e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowVisibilityListeners_.begin(), pImpl_->windowVisibilityListeners_.end(), 358e0dac50fSopenharmony_ci listener); 359e0dac50fSopenharmony_ci if (iter != pImpl_->windowVisibilityListeners_.end()) { 360e0dac50fSopenharmony_ci WLOGFW("Listener is already registered."); 361e0dac50fSopenharmony_ci return WMError::WM_OK; 362e0dac50fSopenharmony_ci } 363e0dac50fSopenharmony_ci pImpl_->windowVisibilityListeners_.emplace_back(listener); 364e0dac50fSopenharmony_ci } 365e0dac50fSopenharmony_ci return ret; 366e0dac50fSopenharmony_ci} 367e0dac50fSopenharmony_ci 368e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener) 369e0dac50fSopenharmony_ci{ 370e0dac50fSopenharmony_ci if (listener == nullptr) { 371e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 372e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 373e0dac50fSopenharmony_ci } 374e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 375e0dac50fSopenharmony_ci pImpl_->windowVisibilityListeners_.erase(std::remove_if(pImpl_->windowVisibilityListeners_.begin(), 376e0dac50fSopenharmony_ci pImpl_->windowVisibilityListeners_.end(), [listener](sptr<IVisibilityChangedListener> registeredListener) { 377e0dac50fSopenharmony_ci return registeredListener == listener; 378e0dac50fSopenharmony_ci }), pImpl_->windowVisibilityListeners_.end()); 379e0dac50fSopenharmony_ci 380e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 381e0dac50fSopenharmony_ci if (pImpl_->windowVisibilityListeners_.empty() && pImpl_->windowVisibilityListenerAgent_ != nullptr) { 382e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 383e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY, 384e0dac50fSopenharmony_ci pImpl_->windowVisibilityListenerAgent_); 385e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 386e0dac50fSopenharmony_ci pImpl_->windowVisibilityListenerAgent_ = nullptr; 387e0dac50fSopenharmony_ci } 388e0dac50fSopenharmony_ci } 389e0dac50fSopenharmony_ci return ret; 390e0dac50fSopenharmony_ci} 391e0dac50fSopenharmony_ci 392e0dac50fSopenharmony_civoid WindowManagerLite::GetFocusWindowInfo(FocusChangeInfo& focusInfo) 393e0dac50fSopenharmony_ci{ 394e0dac50fSopenharmony_ci WLOGFD("In"); 395e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapterLite>().GetFocusWindowInfo(focusInfo); 396e0dac50fSopenharmony_ci} 397e0dac50fSopenharmony_ci 398e0dac50fSopenharmony_civoid WindowManagerLite::UpdateFocusChangeInfo(const sptr<FocusChangeInfo>& focusChangeInfo, bool focused) const 399e0dac50fSopenharmony_ci{ 400e0dac50fSopenharmony_ci if (focusChangeInfo == nullptr) { 401e0dac50fSopenharmony_ci WLOGFE("focusChangeInfo is nullptr."); 402e0dac50fSopenharmony_ci return; 403e0dac50fSopenharmony_ci } 404e0dac50fSopenharmony_ci WLOGFD("[WMSFocus]window focus change: %{public}d, id: %{public}u", focused, focusChangeInfo->windowId_); 405e0dac50fSopenharmony_ci if (focused) { 406e0dac50fSopenharmony_ci pImpl_->NotifyFocused(focusChangeInfo); 407e0dac50fSopenharmony_ci } else { 408e0dac50fSopenharmony_ci pImpl_->NotifyUnfocused(focusChangeInfo); 409e0dac50fSopenharmony_ci } 410e0dac50fSopenharmony_ci} 411e0dac50fSopenharmony_ci 412e0dac50fSopenharmony_civoid WindowManagerLite::UpdateWindowVisibilityInfo( 413e0dac50fSopenharmony_ci const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos) const 414e0dac50fSopenharmony_ci{ 415e0dac50fSopenharmony_ci pImpl_->NotifyWindowVisibilityInfoChanged(windowVisibilityInfos); 416e0dac50fSopenharmony_ci} 417e0dac50fSopenharmony_ci 418e0dac50fSopenharmony_ciWMError WindowManagerLite::GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos) const 419e0dac50fSopenharmony_ci{ 420e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetVisibilityWindowInfo(infos); 421e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 422e0dac50fSopenharmony_ci WLOGFE("get window visibility info failed"); 423e0dac50fSopenharmony_ci } 424e0dac50fSopenharmony_ci return ret; 425e0dac50fSopenharmony_ci} 426e0dac50fSopenharmony_ci 427e0dac50fSopenharmony_civoid WindowManagerLite::UpdateWindowDrawingContentInfo( 428e0dac50fSopenharmony_ci const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos) const 429e0dac50fSopenharmony_ci{ 430e0dac50fSopenharmony_ci pImpl_->NotifyWindowDrawingContentInfoChanged(windowDrawingContentInfos); 431e0dac50fSopenharmony_ci} 432e0dac50fSopenharmony_ci 433e0dac50fSopenharmony_civoid WindowManagerLite::UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing) const 434e0dac50fSopenharmony_ci{ 435e0dac50fSopenharmony_ci pImpl_->UpdateCameraWindowStatus(accessTokenId, isShowing); 436e0dac50fSopenharmony_ci} 437e0dac50fSopenharmony_ci 438e0dac50fSopenharmony_civoid WindowManagerLite::OnRemoteDied() 439e0dac50fSopenharmony_ci{ 440e0dac50fSopenharmony_ci WLOGI("wms is died"); 441e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 442e0dac50fSopenharmony_ci if (destroyed_) { 443e0dac50fSopenharmony_ci WLOGE("Already destroyed"); 444e0dac50fSopenharmony_ci return; 445e0dac50fSopenharmony_ci } 446e0dac50fSopenharmony_ci pImpl_->focusChangedListenerAgent_ = nullptr; 447e0dac50fSopenharmony_ci pImpl_->windowUpdateListenerAgent_ = nullptr; 448e0dac50fSopenharmony_ci pImpl_->windowVisibilityListenerAgent_ = nullptr; 449e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListenerAgent_ = nullptr; 450e0dac50fSopenharmony_ci} 451e0dac50fSopenharmony_ci 452e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener) 453e0dac50fSopenharmony_ci{ 454e0dac50fSopenharmony_ci if (listener == nullptr) { 455e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 456e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 457e0dac50fSopenharmony_ci } 458e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 459e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 460e0dac50fSopenharmony_ci if (pImpl_->windowDrawingContentListenerAgent_ == nullptr) { 461e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListenerAgent_ = new (std::nothrow) WindowManagerAgentLite(); 462e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 463e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE, 464e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListenerAgent_); 465e0dac50fSopenharmony_ci } 466e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 467e0dac50fSopenharmony_ci WLOGFW("RegisterWindowManagerAgent failed !"); 468e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListenerAgent_ = nullptr; 469e0dac50fSopenharmony_ci } else { 470e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowDrawingContentListeners_.begin(), 471e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListeners_.end(), listener); 472e0dac50fSopenharmony_ci if (iter != pImpl_->windowDrawingContentListeners_.end()) { 473e0dac50fSopenharmony_ci WLOGFW("Listener is already registered."); 474e0dac50fSopenharmony_ci return WMError::WM_OK; 475e0dac50fSopenharmony_ci } 476e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListeners_.emplace_back(listener); 477e0dac50fSopenharmony_ci } 478e0dac50fSopenharmony_ci return ret; 479e0dac50fSopenharmony_ci} 480e0dac50fSopenharmony_ci 481e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener) 482e0dac50fSopenharmony_ci{ 483e0dac50fSopenharmony_ci if (listener == nullptr) { 484e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 485e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 486e0dac50fSopenharmony_ci } 487e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 488e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListeners_.erase(std::remove_if(pImpl_->windowDrawingContentListeners_.begin(), 489e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListeners_.end(), 490e0dac50fSopenharmony_ci [listener](sptr<IDrawingContentChangedListener> registeredListener) { return registeredListener == listener; }), 491e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListeners_.end()); 492e0dac50fSopenharmony_ci 493e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 494e0dac50fSopenharmony_ci if (pImpl_->windowDrawingContentListeners_.empty() && pImpl_->windowDrawingContentListenerAgent_ != nullptr) { 495e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 496e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE, 497e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListenerAgent_); 498e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 499e0dac50fSopenharmony_ci pImpl_->windowDrawingContentListenerAgent_ = nullptr; 500e0dac50fSopenharmony_ci } 501e0dac50fSopenharmony_ci } 502e0dac50fSopenharmony_ci return ret; 503e0dac50fSopenharmony_ci} 504e0dac50fSopenharmony_ci 505e0dac50fSopenharmony_civoid WindowManagerLite::UpdateWindowModeTypeInfo(WindowModeType type) const 506e0dac50fSopenharmony_ci{ 507e0dac50fSopenharmony_ci pImpl_->NotifyWindowModeChange(type); 508e0dac50fSopenharmony_ci} 509e0dac50fSopenharmony_ci 510e0dac50fSopenharmony_civoid WindowManagerLite::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos, 511e0dac50fSopenharmony_ci WindowUpdateType type) const 512e0dac50fSopenharmony_ci{ 513e0dac50fSopenharmony_ci pImpl_->NotifyAccessibilityWindowInfo(infos, type); 514e0dac50fSopenharmony_ci} 515e0dac50fSopenharmony_ci 516e0dac50fSopenharmony_ciWMError WindowManagerLite::GetWindowModeType(WindowModeType& windowModeType) const 517e0dac50fSopenharmony_ci{ 518e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetWindowModeType(windowModeType); 519e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 520e0dac50fSopenharmony_ci WLOGFE("get window visibility info failed"); 521e0dac50fSopenharmony_ci } 522e0dac50fSopenharmony_ci return ret; 523e0dac50fSopenharmony_ci} 524e0dac50fSopenharmony_ci 525e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener) 526e0dac50fSopenharmony_ci{ 527e0dac50fSopenharmony_ci if (listener == nullptr) { 528e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null"); 529e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 530e0dac50fSopenharmony_ci } 531e0dac50fSopenharmony_ci 532e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 533e0dac50fSopenharmony_ci if (pImpl_->windowModeListenerAgent_ == nullptr) { 534e0dac50fSopenharmony_ci pImpl_->windowModeListenerAgent_ = new (std::nothrow) WindowManagerAgentLite(); 535e0dac50fSopenharmony_ci } 536e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 537e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_); 538e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 539e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!"); 540e0dac50fSopenharmony_ci pImpl_->windowModeListenerAgent_ = nullptr; 541e0dac50fSopenharmony_ci return ret; 542e0dac50fSopenharmony_ci } 543e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener); 544e0dac50fSopenharmony_ci if (iter != pImpl_->windowModeListeners_.end()) { 545e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered."); 546e0dac50fSopenharmony_ci return WMError::WM_OK; 547e0dac50fSopenharmony_ci } 548e0dac50fSopenharmony_ci pImpl_->windowModeListeners_.push_back(listener); 549e0dac50fSopenharmony_ci return ret; 550e0dac50fSopenharmony_ci} 551e0dac50fSopenharmony_ci 552e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener) 553e0dac50fSopenharmony_ci{ 554e0dac50fSopenharmony_ci if (listener == nullptr) { 555e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null"); 556e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 557e0dac50fSopenharmony_ci } 558e0dac50fSopenharmony_ci 559e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 560e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener); 561e0dac50fSopenharmony_ci if (iter == pImpl_->windowModeListeners_.end()) { 562e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener"); 563e0dac50fSopenharmony_ci return WMError::WM_OK; 564e0dac50fSopenharmony_ci } 565e0dac50fSopenharmony_ci pImpl_->windowModeListeners_.erase(iter); 566e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 567e0dac50fSopenharmony_ci if (pImpl_->windowModeListeners_.empty() && pImpl_->windowModeListenerAgent_ != nullptr) { 568e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 569e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_); 570e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 571e0dac50fSopenharmony_ci pImpl_->windowModeListenerAgent_ = nullptr; 572e0dac50fSopenharmony_ci } 573e0dac50fSopenharmony_ci } 574e0dac50fSopenharmony_ci return ret; 575e0dac50fSopenharmony_ci} 576e0dac50fSopenharmony_ci 577e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener>& listener) 578e0dac50fSopenharmony_ci{ 579e0dac50fSopenharmony_ci if (listener == nullptr) { 580e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "listener could not be null"); 581e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 582e0dac50fSopenharmony_ci } 583e0dac50fSopenharmony_ci 584e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 585e0dac50fSopenharmony_ci if (pImpl_->cameraWindowChangedListenerAgent_ == nullptr) { 586e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListenerAgent_ = new WindowManagerAgentLite(); 587e0dac50fSopenharmony_ci } 588e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 589e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_WINDOW, pImpl_->cameraWindowChangedListenerAgent_); 590e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 591e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SYSTEM, "RegisterWindowManagerAgent failed!"); 592e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListenerAgent_ = nullptr; 593e0dac50fSopenharmony_ci } else { 594e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->cameraWindowChangedListeners_.begin(), 595e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListeners_.end(), listener); 596e0dac50fSopenharmony_ci if (iter != pImpl_->cameraWindowChangedListeners_.end()) { 597e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SYSTEM, "Listener is already registered."); 598e0dac50fSopenharmony_ci return WMError::WM_OK; 599e0dac50fSopenharmony_ci } 600e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListeners_.push_back(listener); 601e0dac50fSopenharmony_ci } 602e0dac50fSopenharmony_ci return ret; 603e0dac50fSopenharmony_ci} 604e0dac50fSopenharmony_ci 605e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener>& listener) 606e0dac50fSopenharmony_ci{ 607e0dac50fSopenharmony_ci if (listener == nullptr) { 608e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "listener could not be null"); 609e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 610e0dac50fSopenharmony_ci } 611e0dac50fSopenharmony_ci 612e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 613e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->cameraWindowChangedListeners_.begin(), 614e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListeners_.end(), listener); 615e0dac50fSopenharmony_ci if (iter == pImpl_->cameraWindowChangedListeners_.end()) { 616e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "could not find this listener"); 617e0dac50fSopenharmony_ci return WMError::WM_OK; 618e0dac50fSopenharmony_ci } 619e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListeners_.erase(iter); 620e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 621e0dac50fSopenharmony_ci if (pImpl_->cameraWindowChangedListeners_.empty() && 622e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListenerAgent_ != nullptr) { 623e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 624e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_WINDOW, 625e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListenerAgent_); 626e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 627e0dac50fSopenharmony_ci pImpl_->cameraWindowChangedListenerAgent_ = nullptr; 628e0dac50fSopenharmony_ci } 629e0dac50fSopenharmony_ci } 630e0dac50fSopenharmony_ci return ret; 631e0dac50fSopenharmony_ci} 632e0dac50fSopenharmony_ci 633e0dac50fSopenharmony_ciWMError WindowManagerLite::GetMainWindowInfos(int32_t topNum, std::vector<MainWindowInfo>& topNInfo) 634e0dac50fSopenharmony_ci{ 635e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "Get main window info lite"); 636e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().GetMainWindowInfos(topNum, topNInfo); 637e0dac50fSopenharmony_ci} 638e0dac50fSopenharmony_ci 639e0dac50fSopenharmony_ciWMError WindowManagerLite::GetAllMainWindowInfos(std::vector<MainWindowInfo>& infos) const 640e0dac50fSopenharmony_ci{ 641e0dac50fSopenharmony_ci if (!infos.empty()) { 642e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "infos is not empty."); 643e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 644e0dac50fSopenharmony_ci } 645e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().GetAllMainWindowInfos(infos); 646e0dac50fSopenharmony_ci} 647e0dac50fSopenharmony_ci 648e0dac50fSopenharmony_ciWMError WindowManagerLite::ClearMainSessions(const std::vector<int32_t>& persistentIds) 649e0dac50fSopenharmony_ci{ 650e0dac50fSopenharmony_ci if (persistentIds.empty()) { 651e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MAIN, "Clear main Session failed, persistentIds is empty."); 652e0dac50fSopenharmony_ci return WMError::WM_OK; 653e0dac50fSopenharmony_ci } 654e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().ClearMainSessions(persistentIds); 655e0dac50fSopenharmony_ci} 656e0dac50fSopenharmony_ci 657e0dac50fSopenharmony_ciWMError WindowManagerLite::ClearMainSessions(const std::vector<int32_t>& persistentIds, 658e0dac50fSopenharmony_ci std::vector<int32_t>& clearFailedIds) 659e0dac50fSopenharmony_ci{ 660e0dac50fSopenharmony_ci if (persistentIds.empty()) { 661e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MAIN, "Clear main Session failed, persistentIds is empty."); 662e0dac50fSopenharmony_ci return WMError::WM_OK; 663e0dac50fSopenharmony_ci } 664e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().ClearMainSessions(persistentIds, clearFailedIds); 665e0dac50fSopenharmony_ci} 666e0dac50fSopenharmony_ci 667e0dac50fSopenharmony_ciWMError WindowManagerLite::RaiseWindowToTop(int32_t persistentId) 668e0dac50fSopenharmony_ci{ 669e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().RaiseWindowToTop(persistentId); 670e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 671e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "raise window to top failed."); 672e0dac50fSopenharmony_ci } 673e0dac50fSopenharmony_ci return ret; 674e0dac50fSopenharmony_ci} 675e0dac50fSopenharmony_ci 676e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWMSConnectionChangedListener(const sptr<IWMSConnectionChangedListener>& listener) 677e0dac50fSopenharmony_ci{ 678e0dac50fSopenharmony_ci int32_t clientUserId = GetUserIdByUid(getuid()); 679e0dac50fSopenharmony_ci if (clientUserId != SYSTEM_USERID) { 680e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MULTI_USER, "Not u0 user, permission denied"); 681e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PERMISSION; 682e0dac50fSopenharmony_ci } 683e0dac50fSopenharmony_ci if (listener == nullptr) { 684e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MULTI_USER, "WMS connection changed listener registered could not be null"); 685e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 686e0dac50fSopenharmony_ci } 687e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "Register enter"); 688e0dac50fSopenharmony_ci { 689e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 690e0dac50fSopenharmony_ci if (pImpl_->wmsConnectionChangedListener_) { 691e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "wmsConnectionChangedListener is already registered, do nothing"); 692e0dac50fSopenharmony_ci return WMError::WM_OK; 693e0dac50fSopenharmony_ci } 694e0dac50fSopenharmony_ci pImpl_->wmsConnectionChangedListener_ = listener; 695e0dac50fSopenharmony_ci } 696e0dac50fSopenharmony_ci auto ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWMSConnectionChangedListener( 697e0dac50fSopenharmony_ci std::bind(&WindowManagerLite::OnWMSConnectionChanged, this, std::placeholders::_1, std::placeholders::_2, 698e0dac50fSopenharmony_ci std::placeholders::_3)); 699e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 700e0dac50fSopenharmony_ci pImpl_->wmsConnectionChangedListener_ = nullptr; 701e0dac50fSopenharmony_ci } 702e0dac50fSopenharmony_ci return ret; 703e0dac50fSopenharmony_ci} 704e0dac50fSopenharmony_ci 705e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWMSConnectionChangedListener() 706e0dac50fSopenharmony_ci{ 707e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "Unregister enter"); 708e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 709e0dac50fSopenharmony_ci pImpl_->wmsConnectionChangedListener_ = nullptr; 710e0dac50fSopenharmony_ci return WMError::WM_OK; 711e0dac50fSopenharmony_ci} 712e0dac50fSopenharmony_ci 713e0dac50fSopenharmony_civoid WindowManagerLite::OnWMSConnectionChanged(int32_t userId, int32_t screenId, bool isConnected) const 714e0dac50fSopenharmony_ci{ 715e0dac50fSopenharmony_ci if (isConnected) { 716e0dac50fSopenharmony_ci pImpl_->NotifyWMSConnected(userId, screenId); 717e0dac50fSopenharmony_ci } else { 718e0dac50fSopenharmony_ci pImpl_->NotifyWMSDisconnected(userId, screenId); 719e0dac50fSopenharmony_ci } 720e0dac50fSopenharmony_ci} 721e0dac50fSopenharmony_ci 722e0dac50fSopenharmony_ciWMError WindowManagerLite::NotifyWindowStyleChange(WindowStyleType type) 723e0dac50fSopenharmony_ci{ 724e0dac50fSopenharmony_ci pImpl_->NotifyWindowStyleChange(type); 725e0dac50fSopenharmony_ci return WMError::WM_OK; 726e0dac50fSopenharmony_ci} 727e0dac50fSopenharmony_ci 728e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener) 729e0dac50fSopenharmony_ci{ 730e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "start register windowStyleChangedListener"); 731e0dac50fSopenharmony_ci if (listener == nullptr) { 732e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null"); 733e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 734e0dac50fSopenharmony_ci } 735e0dac50fSopenharmony_ci { 736e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 737e0dac50fSopenharmony_ci if (pImpl_->windowStyleListenerAgent_ == nullptr) { 738e0dac50fSopenharmony_ci pImpl_->windowStyleListenerAgent_ = new WindowManagerAgentLite(); 739e0dac50fSopenharmony_ci } 740e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener); 741e0dac50fSopenharmony_ci if (iter != pImpl_->windowStyleListeners_.end()) { 742e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered."); 743e0dac50fSopenharmony_ci return WMError::WM_OK; 744e0dac50fSopenharmony_ci } 745e0dac50fSopenharmony_ci pImpl_->windowStyleListeners_.push_back(listener); 746e0dac50fSopenharmony_ci } 747e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 748e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 749e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_); 750e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 751e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!"); 752e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 753e0dac50fSopenharmony_ci pImpl_->windowStyleListenerAgent_ = nullptr; 754e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener); 755e0dac50fSopenharmony_ci if (iter != pImpl_->windowStyleListeners_.end()) { 756e0dac50fSopenharmony_ci pImpl_->windowStyleListeners_.erase(iter); 757e0dac50fSopenharmony_ci } 758e0dac50fSopenharmony_ci } 759e0dac50fSopenharmony_ci return ret; 760e0dac50fSopenharmony_ci} 761e0dac50fSopenharmony_ci 762e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener) 763e0dac50fSopenharmony_ci{ 764e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "start unregister windowStyleChangedListener"); 765e0dac50fSopenharmony_ci if (listener == nullptr) { 766e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null"); 767e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 768e0dac50fSopenharmony_ci } 769e0dac50fSopenharmony_ci { 770e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 771e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener); 772e0dac50fSopenharmony_ci if (iter == pImpl_->windowStyleListeners_.end()) { 773e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener"); 774e0dac50fSopenharmony_ci return WMError::WM_OK; 775e0dac50fSopenharmony_ci } 776e0dac50fSopenharmony_ci pImpl_->windowStyleListeners_.erase(iter); 777e0dac50fSopenharmony_ci } 778e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 779e0dac50fSopenharmony_ci if (pImpl_->windowStyleListeners_.empty() && pImpl_->windowStyleListenerAgent_ != nullptr) { 780e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 781e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_); 782e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 783e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 784e0dac50fSopenharmony_ci pImpl_->windowStyleListenerAgent_ = nullptr; 785e0dac50fSopenharmony_ci } 786e0dac50fSopenharmony_ci } 787e0dac50fSopenharmony_ci return ret; 788e0dac50fSopenharmony_ci} 789e0dac50fSopenharmony_ci 790e0dac50fSopenharmony_ciWindowStyleType WindowManagerLite::GetWindowStyleType() 791e0dac50fSopenharmony_ci{ 792e0dac50fSopenharmony_ci WindowStyleType styleType; 793e0dac50fSopenharmony_ci if (SingletonContainer::Get<WindowAdapterLite>().GetWindowStyleType(styleType) == WMError::WM_OK) { 794e0dac50fSopenharmony_ci return styleType; 795e0dac50fSopenharmony_ci } 796e0dac50fSopenharmony_ci return styleType; 797e0dac50fSopenharmony_ci} 798e0dac50fSopenharmony_ci 799e0dac50fSopenharmony_ci 800e0dac50fSopenharmony_ciWMError WindowManagerLite::TerminateSessionByPersistentId(int32_t persistentId) 801e0dac50fSopenharmony_ci{ 802e0dac50fSopenharmony_ci if (persistentId == INVALID_SESSION_ID) { 803e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "persistentId is invalid."); 804e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 805e0dac50fSopenharmony_ci } 806e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().TerminateSessionByPersistentId(persistentId); 807e0dac50fSopenharmony_ci} 808e0dac50fSopenharmony_ci 809e0dac50fSopenharmony_ciWMError WindowManagerLite::CloseTargetFloatWindow(const std::string& bundleName) 810e0dac50fSopenharmony_ci{ 811e0dac50fSopenharmony_ci if (bundleName.empty()) { 812e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "bundleName is empty."); 813e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 814e0dac50fSopenharmony_ci } 815e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().CloseTargetFloatWindow(bundleName); 816e0dac50fSopenharmony_ci} 817e0dac50fSopenharmony_ci 818e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterPiPStateChangedListener(const sptr<IPiPStateChangedListener>& listener) 819e0dac50fSopenharmony_ci{ 820e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_PIP, "in"); 821e0dac50fSopenharmony_ci if (listener == nullptr) { 822e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "listener could not be null"); 823e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 824e0dac50fSopenharmony_ci } 825e0dac50fSopenharmony_ci 826e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 827e0dac50fSopenharmony_ci if (pImpl_->pipStateChangedListenerAgent_ == nullptr) { 828e0dac50fSopenharmony_ci pImpl_->pipStateChangedListenerAgent_ = new WindowManagerAgentLite(); 829e0dac50fSopenharmony_ci } 830e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 831e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_PIP, pImpl_->pipStateChangedListenerAgent_); 832e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 833e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_PIP, "RegisterWindowManagerAgent failed!"); 834e0dac50fSopenharmony_ci pImpl_->pipStateChangedListenerAgent_ = nullptr; 835e0dac50fSopenharmony_ci } else { 836e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->pipStateChangedListeners_.begin(), 837e0dac50fSopenharmony_ci pImpl_->pipStateChangedListeners_.end(), listener); 838e0dac50fSopenharmony_ci if (iter != pImpl_->pipStateChangedListeners_.end()) { 839e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_PIP, "Listener is already registered."); 840e0dac50fSopenharmony_ci return WMError::WM_OK; 841e0dac50fSopenharmony_ci } 842e0dac50fSopenharmony_ci pImpl_->pipStateChangedListeners_.push_back(listener); 843e0dac50fSopenharmony_ci } 844e0dac50fSopenharmony_ci return ret; 845e0dac50fSopenharmony_ci} 846e0dac50fSopenharmony_ci 847e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterPiPStateChangedListener(const sptr<IPiPStateChangedListener>& listener) 848e0dac50fSopenharmony_ci{ 849e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_PIP, "in"); 850e0dac50fSopenharmony_ci if (listener == nullptr) { 851e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "listener could not be null"); 852e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 853e0dac50fSopenharmony_ci } 854e0dac50fSopenharmony_ci 855e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 856e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->pipStateChangedListeners_.begin(), 857e0dac50fSopenharmony_ci pImpl_->pipStateChangedListeners_.end(), listener); 858e0dac50fSopenharmony_ci if (iter == pImpl_->pipStateChangedListeners_.end()) { 859e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "could not find this listener"); 860e0dac50fSopenharmony_ci return WMError::WM_OK; 861e0dac50fSopenharmony_ci } 862e0dac50fSopenharmony_ci pImpl_->pipStateChangedListeners_.erase(iter); 863e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 864e0dac50fSopenharmony_ci if (pImpl_->pipStateChangedListeners_.empty() && 865e0dac50fSopenharmony_ci pImpl_->pipStateChangedListenerAgent_ != nullptr) { 866e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 867e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_PIP, 868e0dac50fSopenharmony_ci pImpl_->pipStateChangedListenerAgent_); 869e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 870e0dac50fSopenharmony_ci pImpl_->pipStateChangedListenerAgent_ = nullptr; 871e0dac50fSopenharmony_ci } 872e0dac50fSopenharmony_ci } 873e0dac50fSopenharmony_ci return ret; 874e0dac50fSopenharmony_ci} 875e0dac50fSopenharmony_ci 876e0dac50fSopenharmony_ciWMError WindowManagerLite::CloseTargetPiPWindow(const std::string& bundleName) 877e0dac50fSopenharmony_ci{ 878e0dac50fSopenharmony_ci if (bundleName.empty()) { 879e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "bundleName is empty."); 880e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 881e0dac50fSopenharmony_ci } 882e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_PIP, "bundleName:%{public}s", bundleName.c_str()); 883e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().CloseTargetPiPWindow(bundleName); 884e0dac50fSopenharmony_ci} 885e0dac50fSopenharmony_ci 886e0dac50fSopenharmony_ciWMError WindowManagerLite::GetCurrentPiPWindowInfo(std::string& bundleName) 887e0dac50fSopenharmony_ci{ 888e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapterLite>().GetCurrentPiPWindowInfo(bundleName); 889e0dac50fSopenharmony_ci} 890e0dac50fSopenharmony_ci 891e0dac50fSopenharmony_civoid WindowManagerLite::UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground) const 892e0dac50fSopenharmony_ci{ 893e0dac50fSopenharmony_ci pImpl_->UpdatePiPWindowStateChanged(bundleName, isForeground); 894e0dac50fSopenharmony_ci} 895e0dac50fSopenharmony_ci 896e0dac50fSopenharmony_ciWMError WindowManagerLite::GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>>& infos) const 897e0dac50fSopenharmony_ci{ 898e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetAccessibilityWindowInfo(infos); 899e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 900e0dac50fSopenharmony_ci WLOGFE("get window info failed"); 901e0dac50fSopenharmony_ci } 902e0dac50fSopenharmony_ci return ret; 903e0dac50fSopenharmony_ci} 904e0dac50fSopenharmony_ci 905e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener) 906e0dac50fSopenharmony_ci{ 907e0dac50fSopenharmony_ci if (listener == nullptr) { 908e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 909e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 910e0dac50fSopenharmony_ci } 911e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 912e0dac50fSopenharmony_ci if (pImpl_->windowUpdateListenerAgent_ == nullptr) { 913e0dac50fSopenharmony_ci pImpl_->windowUpdateListenerAgent_ = new WindowManagerAgentLite(); 914e0dac50fSopenharmony_ci } 915e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent( 916e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_); 917e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 918e0dac50fSopenharmony_ci WLOGFW("RegisterWindowManagerAgent failed!"); 919e0dac50fSopenharmony_ci pImpl_->windowUpdateListenerAgent_ = nullptr; 920e0dac50fSopenharmony_ci } else { 921e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener); 922e0dac50fSopenharmony_ci if (iter != pImpl_->windowUpdateListeners_.end()) { 923e0dac50fSopenharmony_ci WLOGI("Listener is already registered."); 924e0dac50fSopenharmony_ci return WMError::WM_OK; 925e0dac50fSopenharmony_ci } 926e0dac50fSopenharmony_ci pImpl_->windowUpdateListeners_.emplace_back(listener); 927e0dac50fSopenharmony_ci } 928e0dac50fSopenharmony_ci return ret; 929e0dac50fSopenharmony_ci} 930e0dac50fSopenharmony_ci 931e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener) 932e0dac50fSopenharmony_ci{ 933e0dac50fSopenharmony_ci if (listener == nullptr) { 934e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 935e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 936e0dac50fSopenharmony_ci } 937e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_); 938e0dac50fSopenharmony_ci auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener); 939e0dac50fSopenharmony_ci if (iter == pImpl_->windowUpdateListeners_.end()) { 940e0dac50fSopenharmony_ci WLOGFE("could not find this listener"); 941e0dac50fSopenharmony_ci return WMError::WM_OK; 942e0dac50fSopenharmony_ci } 943e0dac50fSopenharmony_ci pImpl_->windowUpdateListeners_.erase(iter); 944e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 945e0dac50fSopenharmony_ci if (pImpl_->windowUpdateListeners_.empty() && pImpl_->windowUpdateListenerAgent_ != nullptr) { 946e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent( 947e0dac50fSopenharmony_ci WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_); 948e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 949e0dac50fSopenharmony_ci pImpl_->windowUpdateListenerAgent_ = nullptr; 950e0dac50fSopenharmony_ci } 951e0dac50fSopenharmony_ci } 952e0dac50fSopenharmony_ci return ret; 953e0dac50fSopenharmony_ci} 954e0dac50fSopenharmony_ci} // namespace Rosen 955e0dac50fSopenharmony_ci} // namespace OHOS 956