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 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 namespace OHOS { 40 namespace Rosen { 41 namespace { 42 template<typename T1, typename T2, typename Ret> 43 using EnableIfSame = typename std::enable_if<std::is_same_v<T1, T2>, Ret>::type; 44 } 45 class WindowSessionImpl : public Window, public virtual SessionStageStub { 46 public: 47 explicit WindowSessionImpl(const sptr<WindowOption>& option); 48 ~WindowSessionImpl(); 49 static sptr<Window> Find(const std::string& name); 50 static std::vector<sptr<Window>> GetSubWindow(int parentId); 51 // inherits from window 52 virtual WMError Create(const std::shared_ptr<AbilityRuntime::Context>& context, 53 const sptr<Rosen::ISession>& iSession); 54 WMError Show(uint32_t reason = 0, bool withAnimation = false) override; 55 WMError Hide(uint32_t reason = 0, bool withAnimation = false, bool isFromInnerkits = true) override; 56 WMError Destroy() override; 57 virtual WMError Destroy(bool needClearListener); 58 WMError SetUIContent(const std::string& contentInfo, NativeEngine* engine, 59 NativeValue* storage, bool isdistributed, AppExecFwk::Ability* ability) override; 60 std::shared_ptr<RSSurfaceNode> GetSurfaceNode() const override; 61 const std::shared_ptr<AbilityRuntime::Context> GetContext() const override; 62 Rect GetRequestRect() const override; 63 WindowType GetType() const override; 64 const std::string& GetWindowName() const override; 65 WindowState GetWindowState() const override; 66 WindowState GetRequestWindowState() const; 67 WMError SetFocusable(bool isFocusable) override; 68 WMError SetTouchable(bool isTouchable) override; 69 WMError SetResizeByDragEnabled(bool dragEnabled) override; 70 WMError SetRaiseByClickEnabled(bool raiseEnabled) override; 71 WMError SetWindowType(WindowType type) override; 72 WMError SetBrightness(float brightness) override; 73 virtual float GetBrightness() const override; 74 void SetRequestedOrientation(Orientation orientation) override; 75 bool GetTouchable() const override; 76 uint32_t GetWindowId() const override; 77 Rect GetRect() const override; 78 bool GetFocusable() const override; 79 std::string GetContentInfo() override; 80 Ace::UIContent* GetUIContent() const override; 81 void OnNewWant(const AAFwk::Want& want) override; 82 WMError SetAPPWindowLabel(const std::string& label) override; 83 WMError SetAPPWindowIcon(const std::shared_ptr<Media::PixelMap>& icon) override; 84 void RequestVsync(const std::shared_ptr<VsyncCallback>& vsyncCallback) override; 85 int64_t GetVSyncPeriod() override; 86 // inherits from session stage 87 WSError SetActive(bool active) override; 88 WSError UpdateRect(const WSRect& rect, SizeChangeReason reason) override; 89 WSError UpdateFocus(bool focus) override; 90 WSError UpdateWindowMode(WindowMode mode) override; HandleBackEvent()91 WSError HandleBackEvent() override { return WSError::WS_OK; } 92 WMError SetWindowGravity(WindowGravity gravity, uint32_t percent) override; 93 WMError SetSystemBarProperty(WindowType type, const SystemBarProperty& property) override; 94 95 void NotifyPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) override; 96 void NotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool& isConsumed) override; 97 void NotifyOccupiedAreaChangeInfo(sptr<OccupiedAreaChangeInfo> info) override; 98 99 WMError RegisterLifeCycleListener(const sptr<IWindowLifeCycle>& listener) override; 100 WMError UnregisterLifeCycleListener(const sptr<IWindowLifeCycle>& listener) override; 101 WMError RegisterWindowChangeListener(const sptr<IWindowChangeListener>& listener) override; 102 WMError UnregisterWindowChangeListener(const sptr<IWindowChangeListener>& listener) override; 103 WMError RegisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener) override; 104 WMError UnregisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener) override; 105 void RegisterDialogDeathRecipientListener(const sptr<IDialogDeathRecipientListener>& listener) override; 106 void UnregisterDialogDeathRecipientListener(const sptr<IDialogDeathRecipientListener>& listener) override; 107 WMError RegisterDialogTargetTouchListener(const sptr<IDialogTargetTouchListener>& listener) override; 108 WMError UnregisterDialogTargetTouchListener(const sptr<IDialogTargetTouchListener>& listener) override; 109 WMError RegisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) override; 110 WMError UnregisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) override; 111 WMError RegisterTouchOutsideListener(const sptr<ITouchOutsideListener>& listener) override; 112 WMError UnregisterTouchOutsideListener(const sptr<ITouchOutsideListener>& listener) override; 113 void RegisterWindowDestroyedListener(const NotifyNativeWinDestroyFunc& func) override; 114 WMError RegisterScreenshotListener(const sptr<IScreenshotListener>& listener) override; 115 WMError UnregisterScreenshotListener(const sptr<IScreenshotListener>& listener) override; 116 void SetAceAbilityHandler(const sptr<IAceAbilityHandler>& handler) override; 117 void SetInputEventConsumer(const std::shared_ptr<IInputEventConsumer>& inputEventConsumer) override; 118 119 WMError SetBackgroundColor(const std::string& color) override; 120 121 int32_t GetParentId() const; 122 int32_t GetPersistentId() const override; 123 sptr<WindowSessionProperty> GetProperty() const; 124 SystemSessionConfig GetSystemSessionConfig() const; 125 sptr<ISession> GetHostSession() const; 126 int32_t GetFloatingWindowParentId(); 127 void NotifyAfterForeground(bool needNotifyListeners = true, bool needNotifyUiContent = true); 128 void NotifyAfterBackground(bool needNotifyListeners = true, bool needNotifyUiContent = true); 129 void NotifyForegroundFailed(WMError ret); 130 void NotifyBackgroundFailed(WMError ret); 131 WSError MarkProcessed(int32_t eventId) override; 132 void UpdateWindowSizeLimits(); 133 void UpdateTitleButtonVisibility(); 134 WSError NotifyDestroy() override; 135 void NotifyAvoidAreaChange(const sptr<AvoidArea>& avoidArea, AvoidAreaType type); 136 WSError UpdateAvoidArea(const sptr<AvoidArea>& avoidArea, AvoidAreaType type) override; 137 void NotifyTouchDialogTarget() override; 138 void NotifyScreenshot() override; 139 void DumpSessionElementInfo(const std::vector<std::string>& params) override; 140 // colorspace, gamut 141 virtual bool IsSupportWideGamut() override; 142 virtual void SetColorSpace(ColorSpace colorSpace) override; 143 virtual ColorSpace GetColorSpace() override; 144 WSError NotifyTouchOutside() override; 145 146 WindowState state_ { WindowState::STATE_INITIAL }; 147 WindowState requestState_ { WindowState::STATE_INITIAL }; 148 149 protected: 150 WMError Connect(); 151 bool IsWindowSessionInvalid() const; 152 void NotifyAfterActive(); 153 void NotifyAfterInactive(); 154 void NotifyBeforeDestroy(std::string windowName); 155 void ClearListenersById(int32_t persistentId); 156 WMError WindowSessionCreateCheck(); 157 void UpdateDecorEnable(bool needNotify = false); 158 void NotifyModeChange(WindowMode mode, bool hasDeco = true); 159 WMError UpdateProperty(WSPropertyChangeAction action); 160 WMError SetBackgroundColor(uint32_t color); 161 uint32_t GetBackgroundColor() const; 162 virtual WMError SetLayoutFullScreenByApiVersion(bool status); 163 void UpdateViewportConfig(const Rect& rect, WindowSizeChangeReason reason); 164 165 sptr<ISession> hostSession_; 166 std::unique_ptr<Ace::UIContent> uiContent_; 167 std::shared_ptr<AbilityRuntime::Context> context_; 168 std::shared_ptr<RSSurfaceNode> surfaceNode_; 169 170 sptr<WindowSessionProperty> property_; 171 SystemSessionConfig windowSystemConfig_; 172 NotifyNativeWinDestroyFunc notifyNativeFunc_; 173 174 std::recursive_mutex mutex_; 175 static std::map<std::string, std::pair<int32_t, sptr<WindowSessionImpl>>> windowSessionMap_; 176 static std::map<int32_t, std::vector<sptr<WindowSessionImpl>>> subWindowSessionMap_; 177 bool isSystembarPropertiesSet_ = false; 178 bool isIgnoreSafeAreaNeedNotify_ = false; 179 bool isIgnoreSafeArea_ = false; 180 std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr; 181 182 private: 183 //Trans between colorGamut and colorSpace 184 static ColorSpace GetColorSpaceFromSurfaceGamut(GraphicColorGamut colorGamut); 185 static GraphicColorGamut GetSurfaceGamutFromColorSpace(ColorSpace colorSpace); 186 static std::unordered_map<ColorSpace, GraphicColorGamut> colorSpaceConvertMap; 187 188 template<typename T> WMError RegisterListener(std::vector<sptr<T>>& holder, const sptr<T>& listener); 189 template<typename T> WMError UnregisterListener(std::vector<sptr<T>>& holder, const sptr<T>& listener); 190 template<typename T> EnableIfSame<T, IWindowLifeCycle, std::vector<sptr<IWindowLifeCycle>>> GetListeners(); 191 template<typename T> 192 EnableIfSame<T, IWindowChangeListener, std::vector<sptr<IWindowChangeListener>>> GetListeners(); 193 template<typename T> 194 EnableIfSame<T, IAvoidAreaChangedListener, std::vector<sptr<IAvoidAreaChangedListener>>> GetListeners(); 195 template<typename T> 196 EnableIfSame<T, IDialogDeathRecipientListener, std::vector<sptr<IDialogDeathRecipientListener>>> GetListeners(); 197 template<typename T> 198 EnableIfSame<T, IDialogTargetTouchListener, std::vector<sptr<IDialogTargetTouchListener>>> GetListeners(); 199 template<typename T> 200 EnableIfSame<T, IOccupiedAreaChangeListener, std::vector<sptr<IOccupiedAreaChangeListener>>> GetListeners(); 201 template<typename T> 202 EnableIfSame<T, IScreenshotListener, std::vector<sptr<IScreenshotListener>>> GetListeners(); 203 template<typename T> 204 EnableIfSame<T, ITouchOutsideListener, std::vector<sptr<ITouchOutsideListener>>> GetListeners(); 205 template<typename T> void ClearUselessListeners(std::map<int32_t, T>& listeners, int32_t persistentId); 206 RSSurfaceNode::SharedPtr CreateSurfaceNode(std::string name, WindowType type); 207 void NotifyAfterFocused(); 208 void NotifyAfterUnfocused(bool needNotifyUiContent = true); 209 210 void NotifySizeChange(Rect rect, WindowSizeChangeReason reason); 211 bool IsKeyboardEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) const; 212 213 static std::recursive_mutex globalMutex_; 214 static std::map<int32_t, std::vector<sptr<IWindowLifeCycle>>> lifecycleListeners_; 215 static std::map<int32_t, std::vector<sptr<IWindowChangeListener>>> windowChangeListeners_; 216 static std::map<int32_t, std::vector<sptr<IAvoidAreaChangedListener>>> avoidAreaChangeListeners_; 217 static std::map<int32_t, std::vector<sptr<IDialogDeathRecipientListener>>> dialogDeathRecipientListeners_; 218 static std::map<int32_t, std::vector<sptr<IDialogTargetTouchListener>>> dialogTargetTouchListener_; 219 static std::map<int32_t, std::vector<sptr<IOccupiedAreaChangeListener>>> occupiedAreaChangeListeners_; 220 static std::map<int32_t, std::vector<sptr<IScreenshotListener>>> screenshotListeners_; 221 std::shared_ptr<IInputEventConsumer> inputEventConsumer_; 222 static std::map<int32_t, std::vector<sptr<ITouchOutsideListener>>> touchOutsideListeners_; 223 224 // FA only 225 sptr<IAceAbilityHandler> aceAbilityHandler_; 226 227 WindowSizeChangeReason lastSizeChangeReason_ = WindowSizeChangeReason::END; 228 bool postTaskDone_ = false; 229 }; 230 } // namespace Rosen 231 } // namespace OHOS 232 #endif // OHOS_ROSEN_WINDOW_SESSION_IMPL_H 233