/* * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FOUNDATION_ACE_ADAPTER_OHOS_CPP_ACE_CONTAINER_H #define FOUNDATION_ACE_ADAPTER_OHOS_CPP_ACE_CONTAINER_H #include #include #include #include #include "display_manager.h" #include "dm_common.h" #include "interfaces/inner_api/ace/arkui_rect.h" #include "native_engine/native_reference.h" #include "native_engine/native_value.h" #include "adapter/ohos/entrance/ace_ability.h" #include "adapter/ohos/entrance/platform_event_callback.h" #include "base/memory/ace_type.h" #include "base/resource/asset_manager.h" #include "base/thread/task_executor.h" #include "base/utils/noncopyable.h" #include "base/utils/utils.h" #include "base/view_data/view_data_wrap.h" #include "base/view_data/hint_to_type_wrap.h" #include "core/common/ace_view.h" #include "core/common/container.h" #include "core/common/display_info.h" #include "core/common/font_manager.h" #include "core/common/js_message_dispatcher.h" #include "core/common/render_boundary_manager.h" #include "core/common/resource/resource_configuration.h" #include "core/common/router_recover_record.h" #include "core/components/common/layout/constants.h" #include "core/pipeline/pipeline_context.h" namespace OHOS::Accessibility { class AccessibilityElementInfo; } namespace OHOS::Ace { class FontManager; } namespace OHOS::Ace::Platform { using UIEnvCallback = std::function& context)>; using SharePanelCallback = std::function; struct ParsedConfig { std::string colorMode; std::string deviceAccess; std::string languageTag; std::string direction; std::string densitydpi; std::string themeTag; std::string fontFamily; std::string fontScale; std::string fontWeightScale; std::string colorModeIsSetByApp; std::string mcc; std::string mnc; std::string preferredLanguage; bool IsValid() const { return !(colorMode.empty() && deviceAccess.empty() && languageTag.empty() && direction.empty() && densitydpi.empty() && themeTag.empty() && fontScale.empty() && fontWeightScale.empty() && colorModeIsSetByApp.empty() && mcc.empty() && mnc.empty() && fontFamily.empty() && preferredLanguage.empty()); } }; using ConfigurationChangedCallback = std::function; class ACE_FORCE_EXPORT AceContainer : public Container, public JsMessageDispatcher { DECLARE_ACE_TYPE(AceContainer, Container, JsMessageDispatcher); public: AceContainer(int32_t instanceId, FrontendType type, std::shared_ptr aceAbility, std::unique_ptr callback, bool useCurrentEventRunner = false, bool useNewPipeline = false); AceContainer(int32_t instanceId, FrontendType type, std::weak_ptr runtimeContext, std::weak_ptr abilityInfo, std::unique_ptr callback, bool useCurrentEventRunner = false, bool isSubContainer = false, bool useNewPipeline = false); AceContainer(int32_t instanceId, FrontendType type, std::weak_ptr runtimeContext, std::weak_ptr abilityInfo, std::unique_ptr callback, std::shared_ptr taskWrapper, bool useCurrentEventRunner = false, bool isSubContainer = false, bool useNewPipeline = false); ~AceContainer() override; bool UpdatePopupUIExtension(const RefPtr& node, uint32_t autoFillSessionId, bool isNative = true) override; bool ClosePopupUIExtension(uint32_t autoFillSessionId) override; void Initialize() override; void Destroy() override; bool IsKeyboard() override; void DestroyView() override; static bool Register(); int32_t GetInstanceId() const override { if (aceView_) { return aceView_->GetInstanceId(); } return -1; } RefPtr GetFrontend() const override { std::lock_guard lock(frontendMutex_); return frontend_; } void SetCardFrontend(WeakPtr frontend, int64_t cardId) override { std::lock_guard lock(cardFrontMutex_); cardFrontendMap_.try_emplace(cardId, frontend); } WeakPtr GetCardFrontend(int64_t cardId) const override { std::lock_guard lock(cardFrontMutex_); auto it = cardFrontendMap_.find(cardId); if (it != cardFrontendMap_.end()) { return it->second; } return nullptr; } void SetCardPipeline(WeakPtr pipeline, int64_t cardId) override { std::lock_guard lock(cardPipelineMutex_); cardPipelineMap_.try_emplace(cardId, pipeline); } WeakPtr GetCardPipeline(int64_t cardId) const override { std::lock_guard lock(cardPipelineMutex_); auto it = cardPipelineMap_.find(cardId); if (it == cardPipelineMap_.end()) { return nullptr; } return it->second; } RefPtr GetTaskExecutor() const override { return taskExecutor_; } void SetAssetManager(const RefPtr& assetManager) { assetManager_ = assetManager; if (frontend_) { frontend_->SetAssetManager(assetManager); } } RefPtr GetAssetManager() const override { return assetManager_; } RefPtr GetPlatformResRegister() const override { return resRegister_; } RefPtr GetPipelineContext() const override { std::lock_guard lock(pipelineMutex_); return pipelineContext_; } int32_t GetViewWidth() const override { return aceView_ ? aceView_->GetWidth() : 0; } int32_t GetViewHeight() const override { return aceView_ ? aceView_->GetHeight() : 0; } int32_t GetViewPosX() const override { return aceView_ ? aceView_->GetPosX() : 0; } int32_t GetViewPosY() const override { return aceView_ ? aceView_->GetPosY() : 0; } RefPtr GetAceView() const override { std::lock_guard lock(viewMutex_); return aceView_; } void* GetView() const override { std::lock_guard lock(viewMutex_); return static_cast(AceType::RawPtr(aceView_)); } void SetWindowModal(WindowModal windowModal) { windowModal_ = windowModal; } void SetInstallationFree(bool installationFree) { installationFree_ = installationFree; } void SetSharePanelCallback(SharePanelCallback&& callback) { sharePanelCallback_ = std::move(callback); } void SetColorScheme(ColorScheme colorScheme) { colorScheme_ = colorScheme; } ResourceConfiguration GetResourceConfiguration() const { return resourceInfo_.GetResourceConfiguration(); } void SetResourceConfiguration(const ResourceConfiguration& config) { resourceInfo_.SetResourceConfiguration(config); } std::string GetPackagePathStr() const { return resourceInfo_.GetPackagePath(); } void SetPackagePathStr(const std::string& packagePath) { resourceInfo_.SetPackagePath(packagePath); } std::string GetHapPath() const override { return resourceInfo_.GetHapPath(); } const ResourceInfo& GetResourceInfo() const { return resourceInfo_; } void SetOrientation(Orientation orientation) override { CHECK_NULL_VOID(uiWindow_); auto dmOrientation = static_cast(static_cast(orientation)); uiWindow_->SetRequestedOrientation(dmOrientation); } Orientation GetOrientation() override { CHECK_NULL_RETURN(uiWindow_, Orientation::UNSPECIFIED); auto dmOrientation = uiWindow_->GetRequestedOrientation(); return static_cast(static_cast(dmOrientation)); } void SetHapPath(const std::string& hapPath); void Dispatch( const std::string& group, std::vector&& data, int32_t id, bool replyToComponent) const override; void DispatchSync( const std::string& group, std::vector&& data, uint8_t** resData, int64_t& position) const override {} void DispatchPluginError(int32_t callbackId, int32_t errorCode, std::string&& errorMessage) const override; bool Dump(const std::vector& params, std::vector& info) override; bool DumpInfo(const std::vector& params); bool OnDumpInfo(const std::vector& params); void TriggerGarbageCollection() override; void DumpHeapSnapshot(bool isPrivate) override; void DestroyHeapProfiler() override; void ForceFullGC() override; void SetLocalStorage(NativeReference* storage, const std::shared_ptr& context); void CheckAndSetFontFamily() override; void OnFinish() { if (platformEventCallback_) { platformEventCallback_->OnFinish(); } } void OnStartAbility(const std::string& address) { if (platformEventCallback_) { platformEventCallback_->OnStartAbility(address); } } int32_t GeneratePageId() { return pageId_++; } std::string GetHostClassName() const override { return ""; } void SetSharedRuntime(void* runtime) override { sharedRuntime_ = runtime; } void SetPageProfile(const std::string& pageProfile) { pageProfile_ = pageProfile; } bool IsSubContainer() const override { return isSubContainer_; } bool IsFormRender() const override { return isFormRender_; } void* GetSharedRuntime() override { return sharedRuntime_; } void SetParentId(int32_t parentId) { parentId_ = parentId; } void SetWindowScale(float windowScale) override { windowScale_ = windowScale; } float GetWindowScale() const override { return windowScale_; } double GetWindowDensity() const { if (!uiWindow_) { return 1.0; } return static_cast(uiWindow_->GetVirtualPixelRatio()); } int32_t GetParentId() const { return parentId_; } void SetFocusWindowId(uint32_t focusWindowId) { if (pipelineContext_) { pipelineContext_->SetFocusWindowId(focusWindowId); } } void SetRealHostWindowId(uint32_t realHostWindowId) { if (pipelineContext_) { pipelineContext_->SetRealHostWindowId(realHostWindowId); } } bool IsUseCustomBg() const { return isUseCustomBg_; } void SetIsUseCustomBg(bool isUseCustomBg) { isUseCustomBg_ = isUseCustomBg; } bool IsTransparentBg() const; static void CreateContainer(int32_t instanceId, FrontendType type, const std::string& instanceName, std::shared_ptr aceAbility, std::unique_ptr callback, bool useCurrentEventRunner = false, bool useNewPipeline = false); static void DestroyContainer(int32_t instanceId, const std::function& destroyCallback = nullptr); static UIContentErrorCode RunPage( int32_t instanceId, const std::string& content, const std::string& params, bool isNamedRouter = false); static UIContentErrorCode RunPage( int32_t instanceId, const std::shared_ptr>& content, const std::string& params); static bool PushPage(int32_t instanceId, const std::string& content, const std::string& params); static bool RunDynamicPage( int32_t instanceId, const std::string& content, const std::string& params, const std::string& entryPoint); static bool OnBackPressed(int32_t instanceId); static void OnShow(int32_t instanceId); static void OnHide(int32_t instanceId); static void OnActive(int32_t instanceId); static void OnInactive(int32_t instanceId); static void OnNewWant(int32_t instanceId, const std::string& data); static bool OnStartContinuation(int32_t instanceId); static std::string OnSaveData(int32_t instanceId); static bool OnRestoreData(int32_t instanceId, const std::string& data); static void OnCompleteContinuation(int32_t instanceId, int result); static void OnRemoteTerminated(int32_t instanceId); static void OnConfigurationUpdated(int32_t instanceId, const std::string& configuration); static void OnNewRequest(int32_t instanceId, const std::string& data); static void AddAssetPath(int32_t instanceId, const std::string& packagePath, const std::string& hapPath, const std::vector& paths); static void AddLibPath(int32_t instanceId, const std::vector& libPath); static void SetView(const RefPtr& view, double density, int32_t width, int32_t height, sptr rsWindow, UIEnvCallback callback = nullptr); static UIContentErrorCode SetViewNew( const RefPtr& view, double density, float width, float height, sptr rsWindow); static void SetUIWindow(int32_t instanceId, sptr uiWindow); static sptr GetUIWindow(int32_t instanceId); static OHOS::AppExecFwk::Ability* GetAbility(int32_t instanceId); static OHOS::AbilityRuntime::Context* GetRuntimeContext(int32_t instanceId); static void SetWindowStyle(int32_t instanceId, WindowModal windowModal, ColorScheme colorScheme); static std::pair RestoreRouterStack( int32_t instanceId, const std::string& contentInfo, ContentInfoType type); static std::string GetContentInfo(int32_t instanceId, ContentInfoType type); static RefPtr GetContainer(int32_t instanceId); static bool UpdatePage(int32_t instanceId, int32_t pageId, const std::string& content); static bool RemoveOverlayBySubwindowManager(int32_t instanceId); // ArkTsCard static std::shared_ptr GetFormSurfaceNode(int32_t instanceId); void SetWindowName(const std::string& name) { windowName_ = name; } std::string& GetWindowName() { return windowName_; } void SetWindowId(uint32_t windowId) override { windowId_ = windowId; } uint32_t GetWindowId() const override { return windowId_; } bool WindowIsShow() const override { if (!uiWindow_) { return false; } return uiWindow_->GetWindowState() == Rosen::WindowState::STATE_SHOWN; } void SetWindowPos(int32_t left, int32_t top); void SetIsSubContainer(bool isSubContainer) { isSubContainer_ = isSubContainer; } void SetIsFormRender(bool isFormRender) override { isFormRender_ = isFormRender; } void InitializeSubContainer(int32_t parentContainerId); static void SetDialogCallback(int32_t instanceId, FrontendDialogCallback callback); std::shared_ptr GetAbilityContextByModule( const std::string& bundle, const std::string& module); void UpdateConfiguration(const ParsedConfig& parsedConfig, const std::string& configuration); void NotifyConfigurationChange( bool needReloadTransition, const ConfigurationChange& configurationChange = { false, false }) override; void AddOnConfigurationChange(int32_t instanceId, ConfigurationChangedCallback &&callback) { configurationChangedCallbacks_.emplace(instanceId, std::move(callback)); } void RemoveOnConfigurationChange(int32_t instanceId) { configurationChangedCallbacks_.erase(instanceId_); } void HotReload() override; bool IsUseStageModel() const override { return useStageModel_; } void GetCardFrontendMap(std::unordered_map>& cardFrontendMap) const override { cardFrontendMap = cardFrontendMap_; } void SetToken(sptr& token); sptr GetToken(); void SetParentToken(sptr& token); sptr GetParentToken(); uint32_t GetParentWindowType() const; uint32_t GetWindowType() const; std::string GetWebHapPath() const override { return webHapPath_; } NG::SafeAreaInsets GetViewSafeAreaByType(OHOS::Rosen::AvoidAreaType type); NG::SafeAreaInsets GetKeyboardSafeArea() override; Rect GetSessionAvoidAreaByType(uint32_t safeAreaType) override; Rosen::AvoidArea GetAvoidAreaByType(Rosen::AvoidAreaType type); // ArkTSCard void UpdateFormData(const std::string& data); void UpdateFormSharedImage(const std::map>& imageDataMap); void UpdateResource(); void GetNamesOfSharedImage(std::vector& picNameArray); void UpdateSharedImage(std::vector& picNameArray, std::vector& byteLenArray, std::vector& fileDescriptorArray); void GetImageDataFromAshmem( const std::string& picName, Ashmem& ashmem, const RefPtr& pipelineContext, int len); bool IsLauncherContainer() override; bool IsScenceBoardWindow() override; bool IsUIExtensionWindow() override; bool IsSceneBoardEnabled() override; bool IsMainWindow() const override; bool IsSubWindow() const override; bool IsDialogWindow() const override; bool IsSystemWindow() const override; bool IsHostMainWindow() const override; bool IsHostSubWindow() const override; bool IsHostDialogWindow() const override; bool IsHostSystemWindow() const override; bool IsHostSceneBoardWindow() const override; uint32_t GetParentMainWindowId(uint32_t currentWindowId) const override; void SetCurPointerEvent(const std::shared_ptr& currentEvent); bool GetCurPointerEventInfo(int32_t& pointerId, int32_t& globalX, int32_t& globalY, int32_t& sourceType, int32_t& sourceTool, StopDragCallback&& stopDragCallback) override; bool GetCurPointerEventSourceType(int32_t& sourceType) override; bool RequestAutoFill(const RefPtr& node, AceAutoFillType autoFillType, bool isNewPassWord, bool& isPopup, uint32_t& autoFillSessionId, bool isNative = true) override; bool IsNeedToCreatePopupWindow(const AceAutoFillType& autoFillType) override; bool RequestAutoSave(const RefPtr& node, const std::function& onFinish, const std::function& onUIExtNodeBindingCompleted, bool isNative = true, int32_t instanceId = -1) override; std::shared_ptr GetNavigationController(const std::string& navigationId) override; void OverwritePageNodeInfo(const RefPtr& frameNode, AbilityBase::ViewData& viewData); HintToTypeWrap PlaceHolderToType(const std::string& onePlaceHolder) override; void SearchElementInfoByAccessibilityIdNG( int64_t elementId, int32_t mode, int64_t baseParent, std::list& output); void SearchElementInfosByTextNG( int64_t elementId, const std::string& text, int64_t baseParent, std::list& output); void FindFocusedElementInfoNG( int64_t elementId, int32_t focusType, int64_t baseParent, Accessibility::AccessibilityElementInfo& output); void FocusMoveSearchNG( int64_t elementId, int32_t direction, int64_t baseParent, Accessibility::AccessibilityElementInfo& output); bool NotifyExecuteAction( int64_t elementId, const std::map& actionArguments, int32_t action, int64_t offset); void HandleAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, int32_t eventType, int64_t timeMs); void TerminateUIExtension() override; void SetUIExtensionSubWindow(bool isUIExtensionSubWindow) { isUIExtensionSubWindow_ = isUIExtensionSubWindow; } bool IsUIExtensionSubWindow() { return isUIExtensionSubWindow_; } void SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess) { isUIExtensionAbilityProcess_ = isUIExtensionAbilityProcess; } bool IsUIExtensionAbilityProcess() { return isUIExtensionAbilityProcess_; } void SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost) { isUIExtensionAbilityHost_ = isUIExtensionAbilityHost; } bool IsUIExtensionAbilityHost() { return isUIExtensionAbilityHost_; } void RecordResAdapter(const std::string& key) { resAdapterRecord_.emplace(key); } std::vector GetOverlayNodePositions(); void RegisterOverlayNodePositionsUpdateCallback( const std::function)>&& callback); OHOS::Rosen::WMError RegisterAvoidAreaChangeListener(sptr& listener); OHOS::Rosen::WMError UnregisterAvoidAreaChangeListener(sptr& listener); bool NeedFullUpdate(uint32_t limitKey); void NotifyDensityUpdate(); void NotifyDirectionUpdate(); void SetRegisterComponents(const std::vector& registerComponents) { registerComponents_ = registerComponents; } std::vector GetRegisterComponents() override { return registerComponents_; } void RenderLayoutBoundary(bool isDebugBoundary); void AddWatchSystemParameter(); void RemoveWatchSystemParameter(); const std::vector& GetUieParams() const { return paramUie_; } void UpdateResourceOrientation(int32_t orientation); void UpdateResourceDensity(double density); bool IsFreeMultiWindow() const override { CHECK_NULL_RETURN(uiWindow_, false); return uiWindow_->GetFreeMultiWindowModeEnabledState(); } Rect GetUIExtensionHostWindowRect(int32_t instanceId) override { CHECK_NULL_RETURN(IsUIExtensionWindow(), Rect()); auto rect = uiWindow_->GetHostWindowRect(instanceId); return Rect(rect.posX_, rect.posY_, rect.width_, rect.height_); } private: virtual bool MaybeRelease() override; void InitializeFrontend(); void InitializeCallback(); void InitializeTask(std::shared_ptr taskWrapper = nullptr); void InitWindowCallback(); void AttachView(std::shared_ptr window, const RefPtr& view, double density, float width, float height, uint32_t windowId, UIEnvCallback callback = nullptr); void SetUIWindowInner(sptr uiWindow); sptr GetUIWindowInner() const; std::weak_ptr GetAbilityInner() const; std::weak_ptr GetRuntimeContextInner() const; void RegisterStopDragCallback(int32_t pointerId, StopDragCallback&& stopDragCallback); void SetFontScaleAndWeightScale(const ParsedConfig& parsedConfig, ConfigurationChange& configurationChange); void ReleaseResourceAdapter(); void FillAutoFillViewData(const RefPtr &node, RefPtr &viewDataWrap); void NotifyConfigToSubContainers(const ParsedConfig& parsedConfig, const std::string& configuration); void ProcessThemeUpdate(const ParsedConfig& parsedConfig, ConfigurationChange& configurationChange); DeviceOrientation ProcessDirectionUpdate( const ParsedConfig& parsedConfig, ConfigurationChange& configurationChange); void InitDragEventCallback(); int32_t instanceId_ = 0; RefPtr aceView_; RefPtr taskExecutor_; RefPtr assetManager_; RefPtr resRegister_; RefPtr pipelineContext_; RefPtr frontend_; std::unordered_map> cardFrontendMap_; std::unordered_map> cardPipelineMap_; FrontendType type_ = FrontendType::JS; std::unique_ptr platformEventCallback_; WindowModal windowModal_ { WindowModal::NORMAL }; ColorScheme colorScheme_ { ColorScheme::FIRST_VALUE }; ResourceInfo resourceInfo_; std::weak_ptr aceAbility_; std::weak_ptr runtimeContext_; std::weak_ptr abilityInfo_; void* sharedRuntime_ = nullptr; std::string pageProfile_; int32_t pageId_ = 0; bool useCurrentEventRunner_ = false; sptr uiWindow_ = nullptr; std::string windowName_; uint32_t windowId_ = OHOS::Rosen::INVALID_WINDOW_ID; float windowScale_ = 1.0f; sptr token_; sptr parentToken_; bool isSubContainer_ = false; bool isFormRender_ = false; int32_t parentId_ = 0; bool useStageModel_ = false; bool isUIExtensionSubWindow_ = false; bool isUIExtensionAbilityProcess_ = false; bool isUIExtensionAbilityHost_ = false; bool isUseCustomBg_ = false; DeviceOrientation orientation_ = DeviceOrientation::ORIENTATION_UNDEFINED; // for other AceContainer subscribe configuration from host AceContaier // key is instanceId, value is callback function std::unordered_map configurationChangedCallbacks_; std::vector registerComponents_; std::unordered_set resAdapterRecord_; mutable std::mutex frontendMutex_; mutable std::mutex pipelineMutex_; mutable std::mutex destructMutex_; mutable std::mutex viewMutex_; mutable std::mutex cardFrontMutex_; mutable std::mutex cardPipelineMutex_; mutable std::mutex cardTokensMutex_; std::string webHapPath_; bool installationFree_ = false; SharePanelCallback sharePanelCallback_ = nullptr; std::atomic_flag isDumping_ = ATOMIC_FLAG_INIT; // For custom drag event std::mutex pointerEventMutex_; std::shared_ptr currentPointerEvent_; std::unordered_map> stopDragCallbackMap_; std::map> currentEvents_; ACE_DISALLOW_COPY_AND_MOVE(AceContainer); RefPtr renderBoundaryManager_ = Referenced::MakeRefPtr(); // for Ui Extension dump param get std::vector paramUie_; }; } // namespace OHOS::Ace::Platform #endif // FOUNDATION_ACE_ADAPTER_OHOS_CPP_ACE_CONTAINER_H