• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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