• 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_EXTENSION_SESSION_IMPL_H
17 #define OHOS_ROSEN_WINDOW_EXTENSION_SESSION_IMPL_H
18 
19 #include "window_session_impl.h"
20 
21 #include <optional>
22 
23 #include "accessibility_element_info.h"
24 #include "extension_data_handler.h"
25 #include "extension/extension_business_info.h"
26 
27 namespace OHOS {
28 namespace Rosen {
29 struct AccessibilityChildTreeInfo {
30     uint32_t windowId = 0;
31     int32_t treeId = -1;
32     int64_t accessibilityId = -1;
33 };
34 
35 class WindowExtensionSessionImpl : public WindowSessionImpl {
36 public:
37     explicit WindowExtensionSessionImpl(const sptr<WindowOption>& option);
38     ~WindowExtensionSessionImpl();
39 
40     WMError Create(const std::shared_ptr<AbilityRuntime::Context>& context,
41         const sptr<Rosen::ISession>& iSession, const std::string& identityToken = "",
42         bool isModuleAbilityHookEnd = false) override;
43     WMError MoveTo(int32_t x, int32_t y, bool isMoveToGlobal = false,
44         MoveConfiguration moveConfiguration = {}) override;
45     WMError Resize(uint32_t width, uint32_t height, const RectAnimationConfig& rectAnimationConfig = {}) override;
46     WMError TransferAbilityResult(uint32_t resultCode, const AAFwk::Want& want) override;
47     WMError TransferExtensionData(const AAFwk::WantParams& wantParams) override;
48     WSError NotifyTransferComponentData(const AAFwk::WantParams& wantParams) override;
49     void RegisterTransferComponentDataListener(const NotifyTransferComponentDataFunc& func) override;
50     WSErrorCode NotifyTransferComponentDataSync(
51         const AAFwk::WantParams& wantParams, AAFwk::WantParams& reWantParams) override;
52     void RegisterTransferComponentDataForResultListener(
53         const NotifyTransferComponentDataForResultFunc& func) override;
54     WMError RegisterHostWindowRectChangeListener(const sptr<IWindowRectChangeListener>& listener) override;
55     WMError UnregisterHostWindowRectChangeListener(const sptr<IWindowRectChangeListener>& listener) override;
56     WMError RegisterKeyboardDidShowListener(const sptr<IKeyboardDidShowListener>& listener) override;
57     WMError UnregisterKeyboardDidShowListener(const sptr<IKeyboardDidShowListener>& listener) override;
58     WMError RegisterKeyboardDidHideListener(const sptr<IKeyboardDidHideListener>& listener) override;
59     WMError UnregisterKeyboardDidHideListener(const sptr<IKeyboardDidHideListener>& listener) override;
60     void TriggerBindModalUIExtension() override;
61     std::shared_ptr<IDataHandler> GetExtensionDataHandler() const override;
62     WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) override;
63     WindowMode GetWindowMode() const override;
64     WMError SetWindowMode(WindowMode mode) override;
65 
66     /*
67      * Window Privacy
68      */
69     WMError SetPrivacyMode(bool isPrivacyMode) override;
70     WMError HidePrivacyContentForHost(bool needHide) override;
71 
72     std::unique_ptr<Ace::UIContent> UIContentCreate(AppExecFwk::Ability* ability, void* env, int isAni);
73     WMError NapiSetUIContentInner(const std::string& contentInfo, void* env, void* storage,
74         BackupAndRestoreType type, sptr<IRemoteObject> token, AppExecFwk::Ability* ability, int isAni);
75     WMError NapiSetUIContent(const std::string& contentInfo, ani_env* env, ani_object storage,
76         BackupAndRestoreType type, sptr<IRemoteObject> token, AppExecFwk::Ability* ability) override;
77     WMError NapiSetUIContent(const std::string& contentInfo, napi_env env, napi_value storage,
78         BackupAndRestoreType type, sptr<IRemoteObject> token, AppExecFwk::Ability* ability) override;
79     WMError NapiSetUIContentByName(const std::string& contentName, napi_env env, napi_value storage,
80         BackupAndRestoreType type, sptr<IRemoteObject> token, AppExecFwk::Ability* ability) override;
SetUniqueVirtualPixelRatio(bool useUniqueDensity,float virtualPixelRatio)81     void SetUniqueVirtualPixelRatio(bool useUniqueDensity, float virtualPixelRatio) override {}
82     WSError UpdateRect(const WSRect& rect, SizeChangeReason reason,
83         const SceneAnimationConfig& config = { nullptr, ROTATE_ANIMATION_DURATION },
84         const std::map<AvoidAreaType, AvoidArea>& avoidAreas = {}) override;
85 
86     WMError GetAvoidAreaByType(AvoidAreaType type, AvoidArea& avoidArea, const Rect& rect = Rect::EMPTY_RECT,
87         int32_t apiVersion = API_VERSION_INVALID) override;
88     WSError NotifyAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, int32_t eventType,
89         int64_t timeMs) override;
90     WSError NotifyAccessibilityChildTreeRegister(
91         uint32_t windowId, int32_t treeId, int64_t accessibilityId) override;
92     WSError NotifyAccessibilityChildTreeUnregister() override;
93     WSError NotifyAccessibilityDumpChildInfo(
94         const std::vector<std::string>& params, std::vector<std::string>& info) override;
95     WMError TransferAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info,
96         int64_t uiExtensionIdLevel) override;
97     WMError Destroy(bool needNotifyServer, bool needClearListener = true,
98         uint32_t reason = static_cast<uint32_t>(WindowStateChangeReason::NORMAL)) override;
99 
100     WMError RegisterAvoidAreaChangeListener(const sptr<IAvoidAreaChangedListener>& listener) override;
101     WMError UnregisterAvoidAreaChangeListener(const sptr<IAvoidAreaChangedListener>& listener) override;
102     void ConsumePointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) override;
103     void NotifyPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) override;
104     void ProcessPointerEventWithHostWindowDelayRaise(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
105         bool isHitTargetDraggable) const;
106 
107     void NotifyFocusActiveEvent(bool isFocusActive) override;
108     void NotifyFocusStateEvent(bool focusState) override;
109     void NotifyBackpressedEvent(bool& isConsumed) override;
110     void NotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool& isConsumed,
111         bool notifyInputMethod = true) override;
112     void NotifySessionForeground(uint32_t reason, bool withAnimation) override;
113     void NotifySessionBackground(uint32_t reason, bool withAnimation, bool isFromInnerkits) override;
114     void NotifyOccupiedAreaChangeInfo(sptr<OccupiedAreaChangeInfo> info,
115         const std::shared_ptr<RSTransaction>& rsTransaction, const Rect& callingSessionRect,
116         const std::map<AvoidAreaType, AvoidArea>& avoidAreas) override;
117     void NotifyKeyboardDidShow(const KeyboardPanelInfo& keyboardPanelInfo) override;
118     void NotifyKeyboardDidHide(const KeyboardPanelInfo& keyboardPanelInfo) override;
119     void NotifyOccupiedAreaChange(sptr<OccupiedAreaChangeInfo> info);
120     WMError RegisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) override;
121     WMError UnregisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) override;
122     void UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration) override;
123     void UpdateConfigurationForSpecified(const std::shared_ptr<AppExecFwk::Configuration>& configuration,
124         const std::shared_ptr<Global::Resource::ResourceManager>& resourceManager) override;
125     static void UpdateConfigurationForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration,
126         const std::vector<std::shared_ptr<AbilityRuntime::Context>>& ignoreWindowContexts = {});
127     WMError Show(uint32_t reason = 0, bool withAnimation = false, bool withFocus = true) override;
128     WMError Show(uint32_t reason, bool withAnimation, bool withFocus, bool waitAttach) override;
129     WMError Hide(uint32_t reason, bool withAnimation, bool isFromInnerkits) override;
130     WMError Hide(uint32_t reason, bool withAnimation, bool isFromInnerkits, bool waitDetach) override;
131     WSError NotifyDensityFollowHost(bool isFollowHost, float densityValue) override;
132     float GetVirtualPixelRatio(const sptr<DisplayInfo>& displayInfo) override;
133     float GetDefaultDensity(const sptr<DisplayInfo>& displayInfo);
134     WMError HideNonSecureWindows(bool shouldHide) override;
135     WMError SetWaterMarkFlag(bool isEnable) override;
136     Rect GetHostWindowRect(int32_t hostWindowId) override;
137     WMError GetGlobalScaledRect(Rect& globalScaledRect) override;
138     bool IsComponentFocused() const override;
139 
140     /*
141      * Gesture Back
142      */
143     WMError GetGestureBackEnabled(bool& enable) const override;
144     WMError SetGestureBackEnabled(bool enable) override;
145 
146     /*
147      * Immersive
148      */
149     WMError SetLayoutFullScreen(bool status) override;
150     WMError SetImmersiveModeEnabledState(bool enable) override;
151     bool GetImmersiveModeEnabledState() const override;
152     WMError UpdateSystemBarProperties(const std::unordered_map<WindowType, SystemBarProperty>& systemBarProperties,
153         const std::unordered_map<WindowType, SystemBarPropertyFlag>& systemBarPropertyFlags) override;
154     WMError UpdateHostSpecificSystemBarEnabled(const std::string& name, bool enable, bool enableAnimation) override;
155 
156     /*
157      * Free Multi Window
158      */
159     bool GetFreeMultiWindowModeEnabledState() override;
160 
161     bool PreNotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) override;
162     void NotifyExtensionTimeout(int32_t errorCode) override;
163     int32_t GetRealParentId() const override;
164     WindowType GetParentWindowType() const override;
165     void NotifyModalUIExtensionMayBeCovered(bool byLoadContent) override;
166     WSError UpdateSessionViewportConfig(const SessionViewportConfig& config) override;
167     void NotifyExtensionEventAsync(uint32_t notifyEvent) override;
168     WSError NotifyDumpInfo(const std::vector<std::string>& params, std::vector<std::string>& info) override;
169 
170     /*
171      * PC Window
172      */
173     bool IsPcWindow() const override;
174     bool IsPcOrPadFreeMultiWindowMode() const override;
175     WMError UseImplicitAnimation(bool useImplicit) override;
176 
177     /*
178      * Window Property
179      */
180     static void UpdateConfigurationSyncForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration);
181     void UpdateConfigurationSync(const std::shared_ptr<AppExecFwk::Configuration>& configuration) override;
182     CrossAxisState GetCrossAxisState() override;
183     WMError ExtensionSetKeepScreenOn(bool keepScreenOn) override;
184     WMError ExtensionSetBrightness(float brightness) override;
185     void UpdateExtensionConfig(const std::shared_ptr<AAFwk::Want>& want) override;
186     WMError SendExtensionMessageToHost(uint32_t code, const AAFwk::Want& data) const;
187     WMError OnExtensionMessage(uint32_t code, int32_t persistentId, const AAFwk::Want& data) override;
188     WMError HandleHostWindowRaise(uint32_t code, int32_t persistentId, const AAFwk::Want& data) override;
189     WMError HandleRegisterHostWindowRectChangeListener(uint32_t code, int32_t persistentId,
190         const AAFwk::Want& data) override;
191     WMError HandleUnregisterHostWindowRectChangeListener(uint32_t code, int32_t persistentId,
192         const AAFwk::Want& data) override;
193     uint32_t GetHostStatusBarContentColor() const override;
194 
195 protected:
196     NotifyTransferComponentDataFunc notifyTransferComponentDataFunc_;
197     NotifyTransferComponentDataForResultFunc notifyTransferComponentDataForResultFunc_;
198 
199 private:
200     void InputMethodKeyEventResultCallback(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool consumed,
201         std::shared_ptr<std::promise<bool>> isConsumedPromise, std::shared_ptr<bool> isTimeout);
202     void AddExtensionWindowStageToSCB(bool isConstrainedModal = false);
203     void RemoveExtensionWindowStageFromSCB(bool isConstrainedModal = false);
204     void CheckAndAddExtWindowFlags();
205     void CheckAndRemoveExtWindowFlags();
206     WMError UpdateExtWindowFlags(const ExtensionWindowFlags& flags, const ExtensionWindowFlags& actions);
207     void UpdateRectForRotation(const Rect& wmRect, const Rect& preRect, WindowSizeChangeReason wmReason,
208         const std::shared_ptr<RSTransaction>& rsTransaction = nullptr,
209         const std::map<AvoidAreaType, AvoidArea>& avoidAreas = {});
210     void UpdateRectForOtherReason(const Rect& wmRect, WindowSizeChangeReason wmReason,
211         const std::map<AvoidAreaType, AvoidArea>& avoidAreas = {});
212     WMError GetSystemViewportConfig(SessionViewportConfig& config);
213     void UpdateSystemViewportConfig();
214     void UpdateExtensionDensity(SessionViewportConfig& config);
215     void NotifyDisplayInfoChange(const SessionViewportConfig& config);
216     WSError UpdateSessionViewportConfigInner(const SessionViewportConfig& config);
217     void UpdateAccessibilityTreeInfo();
218     void ArkUIFrameworkSupport();
219     WMError CheckHideNonSecureWindowsPermission(bool shouldHide);
220     void ReportModalUIExtensionMayBeCovered(bool byLoadContent) const;
221     WMError SetUIContentInner(const std::string& contentInfo, void* env, void* storage,
222         sptr<IRemoteObject> token, AppExecFwk::Ability* ability, bool initByName = false, int isAni = 0);
223     void RegisterDataConsumer();
224     void RegisterConsumer(Extension::Businesscode code,
225         const std::function<WMError(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply)>& func);
226     WMError OnCrossAxisStateChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
227     WMError OnResyncExtensionConfig(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
228     WMError OnGestureBackEnabledChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
229     WMError OnImmersiveModeEnabledChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
230     WMError OnHostWindowDelayRaiseStateChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
231     WMError OnHostWindowRectChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
232     WMError OnScreenshot(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
233     WMError OnExtensionSecureLimitChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
234     WMError OnKeyboardDidShow(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
235     WMError OnKeyboardDidHide(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
236     WMError OnHostStatusBarContentColorChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
237 
238     /*
239      * Compatible Mode
240      */
241     WMError OnHostWindowCompatInfoChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
242     WMError SetCompatInfo(const AAFwk::WantParams& configParam);
243 
244     std::shared_ptr<Extension::DataHandler> dataHandler_;
245     std::unordered_map<uint32_t, DataConsumeCallback> dataConsumers_;  // Read only after init
246     sptr<IRemoteObject> abilityToken_ { nullptr };
247     std::atomic<bool> isDensityFollowHost_ { false };
248     std::optional<std::atomic<float>> hostDensityValue_ = std::nullopt;
249     std::optional<std::atomic<bool>> focusState_ = std::nullopt;
250     std::optional<AccessibilityChildTreeInfo> accessibilityChildTreeInfo_ = std::nullopt;
251     ExtensionWindowFlags extensionWindowFlags_ { 0 };
252     bool modalUIExtensionMayBeCovered_ { false };
253     bool modalUIExtensionSelfLoadContent_ { false };
254     float lastDensity_ { 0.0f };
255     int32_t lastOrientation_ { 0 };
256     uint64_t lastDisplayId_ { 0 };
257     AAFwk::WantParams extensionConfig_ {};
258     bool hostGestureBackEnabled_ { true };
259     bool hostImmersiveModeEnabled_ { false };
260     std::mutex hostWindowRectChangeListenerMutex_;
261     std::mutex keyboardDidShowListenerMutex_;
262     std::mutex keyboardDidHideListenerMutex_;
263     std::mutex occupiedAreaChangeListenerMutex_;
264     std::vector<sptr<IWindowRectChangeListener>> hostWindowRectChangeListener_;
265     std::vector<sptr<IKeyboardDidShowListener>> keyboardDidShowListenerList_;
266     std::vector<sptr<IKeyboardDidHideListener>> keyboardDidHideListenerList_;
267     std::vector<sptr<IOccupiedAreaChangeListener>> occupiedAreaChangeListenerList_;
268     uint32_t hostStatusBarContentColor_ { 0 };
269 
270     /*
271      * PC Fold Screen
272      */
273     WMError OnWaterfallModeChange(AAFwk::Want&& data, std::optional<AAFwk::Want>& reply);
274 
275     /*
276      * Window Rotation
277      */
278     void UpdateRotateDuration(WindowSizeChangeReason& reason, int32_t& duration,
279         const std::shared_ptr<RSTransaction>& rsTransaction);
280 };
281 } // namespace Rosen
282 } // namespace OHOS
283 
284 #endif // OHOS_ROSEN_WINDOW_EXTENSION_SESSION_IMPL_H
285