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