1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_ROSEN_WINDOW_SESSION_IMPL_H 17 #define OHOS_ROSEN_WINDOW_SESSION_IMPL_H 18 19 #include <atomic> 20 #include <optional> 21 #include <shared_mutex> 22 #include <ability_context.h> 23 #include <event_handler.h> 24 #include <i_input_event_consumer.h> 25 #include <refbase.h> 26 #include <ui_content.h> 27 #include <ui/rs_surface_node.h> 28 #include "display_manager.h" 29 #include "singleton_container.h" 30 31 #include "common/include/window_session_property.h" 32 #include "interfaces/include/ws_common_inner.h" 33 #include "session/container/include/zidl/session_stage_stub.h" 34 #include "session/host/include/zidl/session_interface.h" 35 #include "window.h" 36 #include "window_option.h" 37 #include "wm_common.h" 38 39 40 namespace OHOS { 41 namespace Rosen { 42 namespace { 43 template<typename T1, typename T2, typename Ret> 44 using EnableIfSame = typename std::enable_if<std::is_same_v<T1, T2>, Ret>::type; 45 } 46 class WindowSessionImpl : public Window, public virtual SessionStageStub { 47 public: 48 explicit WindowSessionImpl(const sptr<WindowOption>& option); 49 ~WindowSessionImpl(); 50 void ConsumePointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) override; 51 void ConsumeKeyEvent(std::shared_ptr<MMI::KeyEvent>& inputEvent) override; 52 static sptr<Window> Find(const std::string& name); 53 static std::vector<sptr<Window>> GetSubWindow(int parentId); 54 // inherits from window 55 virtual WMError Create(const std::shared_ptr<AbilityRuntime::Context>& context, 56 const sptr<Rosen::ISession>& iSession); 57 WMError Show(uint32_t reason = 0, bool withAnimation = false) override; 58 WMError Hide(uint32_t reason = 0, bool withAnimation = false, bool isFromInnerkits = true) override; 59 WMError SetTextFieldAvoidInfo(double textFieldPositionY, double textFieldHeight) override; 60 WMError Destroy() override; 61 virtual WMError Destroy(bool needNotifyServer, bool needClearListener = true); 62 WMError NapiSetUIContent(const std::string& contentInfo, napi_env env, 63 napi_value storage, bool isdistributed, sptr<IRemoteObject> token, AppExecFwk::Ability* ability) override; 64 WMError SetUIContentByName(const std::string& contentInfo, napi_env env, napi_value storage, 65 AppExecFwk::Ability* ability) override; 66 WMError SetUIContentByAbc(const std::string& abcPath, napi_env env, napi_value storage, 67 AppExecFwk::Ability* ability) override; 68 std::shared_ptr<RSSurfaceNode> GetSurfaceNode() const override; 69 const std::shared_ptr<AbilityRuntime::Context> GetContext() const override; 70 Rect GetRequestRect() const override; 71 WindowType GetType() const override; 72 const std::string& GetWindowName() const override; 73 WindowState GetWindowState() const override; 74 WindowState GetRequestWindowState() const; 75 WMError SetFocusable(bool isFocusable) override; 76 WMError SetTouchable(bool isTouchable) override; 77 WMError SetResizeByDragEnabled(bool dragEnabled) override; 78 WMError SetRaiseByClickEnabled(bool raiseEnabled) override; 79 WMError HideNonSystemFloatingWindows(bool shouldHide) override; 80 WMError SetSingleFrameComposerEnabled(bool enable) override; 81 bool IsFloatingWindowAppType() const override; 82 WMError SetWindowType(WindowType type) override; 83 WMError SetBrightness(float brightness) override; 84 virtual float GetBrightness() const override; 85 void SetRequestedOrientation(Orientation orientation) override; 86 bool GetTouchable() const override; 87 uint32_t GetWindowId() const override; 88 Rect GetRect() const override; 89 bool GetFocusable() const override; 90 std::string GetContentInfo() override; 91 Ace::UIContent* GetUIContent() const override; 92 void OnNewWant(const AAFwk::Want& want) override; 93 WMError SetAPPWindowLabel(const std::string& label) override; 94 WMError SetAPPWindowIcon(const std::shared_ptr<Media::PixelMap>& icon) override; 95 void RequestVsync(const std::shared_ptr<VsyncCallback>& vsyncCallback) override; 96 int64_t GetVSyncPeriod() override; 97 void FlushFrameRate(uint32_t rate) override; 98 // inherits from session stage 99 WSError SetActive(bool active) override; 100 WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, 101 const std::shared_ptr<RSTransaction>& rsTransaction = nullptr) override; 102 void UpdateDensity() override; 103 WSError UpdateFocus(bool focus) override; 104 bool IsFocused() const override; 105 WMError RequestFocus() const override; 106 WSError UpdateWindowMode(WindowMode mode) override; HandleBackEvent()107 WSError HandleBackEvent() override { return WSError::WS_OK; } 108 WMError SetWindowGravity(WindowGravity gravity, uint32_t percent) override; 109 WMError SetSystemBarProperty(WindowType type, const SystemBarProperty& property) override; 110 KeyboardAnimationConfig GetKeyboardAnimationConfig() override; 111 112 void NotifyPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) override; 113 void NotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool& isConsumed, 114 bool notifyInputMethod = true) override; 115 void NotifyOccupiedAreaChangeInfo(sptr<OccupiedAreaChangeInfo> info) override; 116 void NotifyForegroundInteractiveStatus(bool interactive) override; 117 118 WMError RegisterLifeCycleListener(const sptr<IWindowLifeCycle>& listener) override; 119 WMError UnregisterLifeCycleListener(const sptr<IWindowLifeCycle>& listener) override; 120 WMError RegisterWindowChangeListener(const sptr<IWindowChangeListener>& listener) override; 121 WMError UnregisterWindowChangeListener(const sptr<IWindowChangeListener>& listener) override; 122 WMError RegisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener) override; 123 WMError UnregisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener) override; 124 void RegisterDialogDeathRecipientListener(const sptr<IDialogDeathRecipientListener>& listener) override; 125 void UnregisterDialogDeathRecipientListener(const sptr<IDialogDeathRecipientListener>& listener) override; 126 WMError RegisterDialogTargetTouchListener(const sptr<IDialogTargetTouchListener>& listener) override; 127 WMError UnregisterDialogTargetTouchListener(const sptr<IDialogTargetTouchListener>& listener) override; 128 WMError RegisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) override; 129 WMError UnregisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) override; 130 WMError RegisterTouchOutsideListener(const sptr<ITouchOutsideListener>& listener) override; 131 WMError UnregisterTouchOutsideListener(const sptr<ITouchOutsideListener>& listener) override; 132 WMError RegisterWindowVisibilityChangeListener(const IWindowVisibilityListenerSptr& listener) override; 133 WMError UnregisterWindowVisibilityChangeListener(const IWindowVisibilityListenerSptr& listener) override; 134 void RegisterWindowDestroyedListener(const NotifyNativeWinDestroyFunc& func) override; 135 WMError RegisterScreenshotListener(const sptr<IScreenshotListener>& listener) override; 136 WMError UnregisterScreenshotListener(const sptr<IScreenshotListener>& listener) override; 137 void SetAceAbilityHandler(const sptr<IAceAbilityHandler>& handler) override; 138 void SetInputEventConsumer(const std::shared_ptr<IInputEventConsumer>& inputEventConsumer) override; 139 140 WMError SetBackgroundColor(const std::string& color) override; 141 virtual Orientation GetRequestedOrientation() override; 142 143 int32_t GetParentId() const; 144 int32_t GetPersistentId() const override; 145 sptr<WindowSessionProperty> GetProperty() const; 146 SystemSessionConfig GetSystemSessionConfig() const; 147 sptr<ISession> GetHostSession() const; 148 int32_t GetFloatingWindowParentId(); 149 void NotifyAfterForeground(bool needNotifyListeners = true, bool needNotifyUiContent = true); 150 void NotifyAfterBackground(bool needNotifyListeners = true, bool needNotifyUiContent = true); 151 void NotifyForegroundFailed(WMError ret); 152 void NotifyBackgroundFailed(WMError ret); 153 WSError MarkProcessed(int32_t eventId) override; 154 void UpdateWindowSizeLimits(); 155 void UpdateTitleButtonVisibility(); 156 WSError NotifyDestroy() override; 157 WSError NotifyCloseExistPipWindow() override; 158 void NotifyAvoidAreaChange(const sptr<AvoidArea>& avoidArea, AvoidAreaType type); 159 WSError UpdateAvoidArea(const sptr<AvoidArea>& avoidArea, AvoidAreaType type) override; 160 void NotifyTouchDialogTarget(int32_t posX = 0, int32_t posY = 0) override; 161 void NotifyScreenshot() override; 162 void DumpSessionElementInfo(const std::vector<std::string>& params) override; 163 // colorspace, gamut 164 virtual bool IsSupportWideGamut() override; 165 virtual void SetColorSpace(ColorSpace colorSpace) override; 166 virtual ColorSpace GetColorSpace() override; 167 WSError NotifyTouchOutside() override; 168 WSError NotifyWindowVisibility(bool isVisible) override; 169 WMError TransferAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info, 170 int64_t uiExtensionIdLevel) override; 171 WindowState state_ { WindowState::STATE_INITIAL }; 172 WindowState requestState_ { WindowState::STATE_INITIAL }; 173 WSError UpdateMaximizeMode(MaximizeMode mode) override; 174 void NotifySessionForeground(uint32_t reason, bool withAnimation) override; 175 void NotifySessionBackground(uint32_t reason, bool withAnimation, bool isFromInnerkits) override; 176 WSError UpdateTitleInTargetPos(bool isShow, int32_t height) override; 177 bool IsMainHandlerAvailable() const override; 178 179 void UpdatePiPRect(const uint32_t width, const uint32_t height, PiPRectUpdateReason reason) override; 180 void SetDrawingContentState(bool drawingContentState); 181 WMError RegisterWindowStatusChangeListener(const sptr<IWindowStatusChangeListener>& listener) override; 182 WMError UnregisterWindowStatusChangeListener(const sptr<IWindowStatusChangeListener>& listener) override; 183 WMError SetSpecificBarProperty(WindowType type, const SystemBarProperty& property) override; 184 virtual WMError SetDecorVisible(bool isVisible) override; 185 virtual WMError SetDecorHeight(int32_t decorHeight) override; 186 virtual WMError GetDecorHeight(int32_t& height) override; 187 virtual WMError GetTitleButtonArea(TitleButtonRect& titleButtonRect) override; 188 virtual WMError RegisterWindowTitleButtonRectChangeListener( 189 const sptr<IWindowTitleButtonRectChangedListener>& listener) override; 190 virtual WMError UnregisterWindowTitleButtonRectChangeListener( 191 const sptr<IWindowTitleButtonRectChangedListener>& listener) override; 192 void NotifyWindowTitleButtonRectChange(TitleButtonRect titleButtonRect); 193 void RecoverSessionListener(); 194 void SetDefaultDisplayIdIfNeed(); 195 WMError HideNonSecureWindows(bool shouldHide) override; 196 protected: 197 WMError Connect(); 198 bool IsWindowSessionInvalid() const; 199 void NotifyAfterActive(); 200 void NotifyAfterInactive(); 201 void NotifyBeforeDestroy(std::string windowName); 202 void NotifyAfterDestroy(); 203 void ClearListenersById(int32_t persistentId); 204 WMError WindowSessionCreateCheck(); 205 void UpdateDecorEnableToAce(bool isDecorEnable); 206 void UpdateDecorEnable(bool needNotify = false, WindowMode mode = WindowMode::WINDOW_MODE_UNDEFINED); 207 void NotifyModeChange(WindowMode mode, bool hasDeco = true); 208 WMError UpdateProperty(WSPropertyChangeAction action); 209 WMError SetBackgroundColor(uint32_t color); 210 uint32_t GetBackgroundColor() const; 211 virtual WMError SetLayoutFullScreenByApiVersion(bool status); 212 void UpdateViewportConfig(const Rect& rect, WindowSizeChangeReason reason, 213 const std::shared_ptr<RSTransaction>& rsTransaction = nullptr); 214 void NotifySizeChange(Rect rect, WindowSizeChangeReason reason); 215 void NotifyWindowStatusChange(WindowMode mode); 216 static sptr<Window> FindWindowById(uint32_t winId); 217 void NotifyTransformChange(const Transform& transForm) override; 218 219 WMError RegisterExtensionAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener); 220 WMError UnregisterExtensionAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener); 221 222 sptr<ISession> hostSession_; 223 std::unique_ptr<Ace::UIContent> uiContent_; 224 std::shared_ptr<AbilityRuntime::Context> context_; 225 std::shared_ptr<RSSurfaceNode> surfaceNode_; 226 227 sptr<WindowSessionProperty> property_; 228 SystemSessionConfig windowSystemConfig_; 229 NotifyNativeWinDestroyFunc notifyNativeFunc_; 230 231 std::recursive_mutex mutex_; 232 static std::map<std::string, std::pair<int32_t, sptr<WindowSessionImpl>>> windowSessionMap_; 233 // protect windowSessionMap_ 234 static std::shared_mutex windowSessionMutex_; 235 static std::map<int32_t, std::vector<sptr<WindowSessionImpl>>> subWindowSessionMap_; 236 bool isSystembarPropertiesSet_ = false; 237 bool isIgnoreSafeAreaNeedNotify_ = false; 238 bool isIgnoreSafeArea_ = false; 239 bool isFocused_ { false }; 240 std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr; 241 bool shouldReNotifyFocus_ = false; 242 std::shared_ptr<IInputEventConsumer> inputEventConsumer_; 243 bool needRemoveWindowInputChannel_ = false; 244 float virtualPixelRatio_ { 1.0f }; 245 bool escKeyEventTriggered_ = false; 246 247 private: 248 //Trans between colorGamut and colorSpace 249 static ColorSpace GetColorSpaceFromSurfaceGamut(GraphicColorGamut colorGamut); 250 static GraphicColorGamut GetSurfaceGamutFromColorSpace(ColorSpace colorSpace); 251 252 template<typename T> WMError RegisterListener(std::vector<sptr<T>>& holder, const sptr<T>& listener); 253 template<typename T> WMError UnregisterListener(std::vector<sptr<T>>& holder, const sptr<T>& listener); 254 template<typename T> EnableIfSame<T, IWindowLifeCycle, std::vector<sptr<IWindowLifeCycle>>> GetListeners(); 255 template<typename T> 256 EnableIfSame<T, IWindowChangeListener, std::vector<sptr<IWindowChangeListener>>> GetListeners(); 257 template<typename T> 258 EnableIfSame<T, IAvoidAreaChangedListener, std::vector<sptr<IAvoidAreaChangedListener>>> GetListeners(); 259 template<typename T> 260 EnableIfSame<T, IDialogDeathRecipientListener, std::vector<sptr<IDialogDeathRecipientListener>>> GetListeners(); 261 template<typename T> 262 EnableIfSame<T, IDialogTargetTouchListener, std::vector<sptr<IDialogTargetTouchListener>>> GetListeners(); 263 template<typename T> 264 EnableIfSame<T, IOccupiedAreaChangeListener, std::vector<sptr<IOccupiedAreaChangeListener>>> GetListeners(); 265 template<typename T> 266 EnableIfSame<T, IScreenshotListener, std::vector<sptr<IScreenshotListener>>> GetListeners(); 267 template<typename T> 268 EnableIfSame<T, ITouchOutsideListener, std::vector<sptr<ITouchOutsideListener>>> GetListeners(); 269 template<typename T> 270 EnableIfSame<T, IWindowVisibilityChangedListener, std::vector<IWindowVisibilityListenerSptr>> GetListeners(); 271 template<typename T> 272 EnableIfSame<T, IWindowTitleButtonRectChangedListener, 273 std::vector<sptr<IWindowTitleButtonRectChangedListener>>> GetListeners(); 274 template<typename T> void ClearUselessListeners(std::map<int32_t, T>& listeners, int32_t persistentId); 275 RSSurfaceNode::SharedPtr CreateSurfaceNode(std::string name, WindowType type); 276 template<typename T> 277 EnableIfSame<T, IWindowStatusChangeListener, std::vector<sptr<IWindowStatusChangeListener>>> GetListeners(); 278 void DispatchKeyEventCallback(std::shared_ptr<MMI::KeyEvent>& keyEvent); 279 void NotifyAfterFocused(); 280 void NotifyUIContentFocusStatus(); 281 void NotifyAfterUnfocused(bool needNotifyUiContent = true); 282 void NotifyAfterResumed(); 283 void NotifyAfterPaused(); 284 285 WMError SetUIContentInner(const std::string& contentInfo, napi_env env, napi_value storage, 286 WindowSetUIContentType type, AppExecFwk::Ability* ability); 287 std::shared_ptr<std::vector<uint8_t>> GetAbcContent(const std::string& abcPath); 288 289 bool IsKeyboardEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) const; 290 void UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason, 291 const std::shared_ptr<RSTransaction>& rsTransaction = nullptr); 292 void NotifyRotationAnimationEnd(); 293 294 static std::recursive_mutex lifeCycleListenerMutex_; 295 static std::recursive_mutex windowChangeListenerMutex_; 296 static std::recursive_mutex avoidAreaChangeListenerMutex_; 297 static std::recursive_mutex dialogDeathRecipientListenerMutex_; 298 static std::recursive_mutex dialogTargetTouchListenerMutex_; 299 static std::recursive_mutex occupiedAreaChangeListenerMutex_; 300 static std::recursive_mutex screenshotListenerMutex_; 301 static std::recursive_mutex touchOutsideListenerMutex_; 302 static std::recursive_mutex windowVisibilityChangeListenerMutex_; 303 static std::recursive_mutex windowStatusChangeListenerMutex_; 304 static std::recursive_mutex windowTitleButtonRectChangeListenerMutex_; 305 static std::map<int32_t, std::vector<sptr<IWindowLifeCycle>>> lifecycleListeners_; 306 static std::map<int32_t, std::vector<sptr<IWindowChangeListener>>> windowChangeListeners_; 307 static std::map<int32_t, std::vector<sptr<IAvoidAreaChangedListener>>> avoidAreaChangeListeners_; 308 static std::map<int32_t, std::vector<sptr<IDialogDeathRecipientListener>>> dialogDeathRecipientListeners_; 309 static std::map<int32_t, std::vector<sptr<IDialogTargetTouchListener>>> dialogTargetTouchListener_; 310 static std::map<int32_t, std::vector<sptr<IOccupiedAreaChangeListener>>> occupiedAreaChangeListeners_; 311 static std::map<int32_t, std::vector<sptr<IScreenshotListener>>> screenshotListeners_; 312 static std::map<int32_t, std::vector<sptr<ITouchOutsideListener>>> touchOutsideListeners_; 313 static std::map<int32_t, std::vector<IWindowVisibilityListenerSptr>> windowVisibilityChangeListeners_; 314 static std::map<int32_t, std::vector<sptr<IWindowStatusChangeListener>>> windowStatusChangeListeners_; 315 static std::map<int32_t, std::vector<sptr<IWindowTitleButtonRectChangedListener>>> 316 windowTitleButtonRectChangeListeners_; 317 318 // FA only 319 sptr<IAceAbilityHandler> aceAbilityHandler_; 320 321 WindowSizeChangeReason lastSizeChangeReason_ = WindowSizeChangeReason::END; 322 bool postTaskDone_ = false; 323 int16_t rotationAnimationCount_ { 0 }; 324 bool isMainHandlerAvailable_ = true; 325 326 std::string subWindowTitle_ = { "" }; 327 }; 328 } // namespace Rosen 329 } // namespace OHOS 330 331 #endif // OHOS_ROSEN_WINDOW_SESSION_IMPL_H 332