• 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 #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