From 2bb9a7aa637954bc5e467f62889d6d469bb7adc5 Mon Sep 17 00:00:00 2001 From: ZhangYu Date: Fri, 21 Apr 2023 08:13:29 +0000 Subject: [PATCH] Reduce the dependency of previewer on third-party Flutter. Signed-off-by: ZhangYu Change-Id: Ic34f522cbf5e89aaee874752d9d83c135ea5fd02 --- adapter/preview/entrance/BUILD.gn | 13 +- adapter/preview/entrance/ace_ability.cpp | 53 +++--- adapter/preview/entrance/ace_ability.h | 13 +- adapter/preview/entrance/ace_container.cpp | 61 +++--- adapter/preview/entrance/ace_container.h | 38 ++-- ...tter_ace_view.cpp => ace_view_preview.cpp} | 98 +++------- .../{rs_ace_view.h => ace_view_preview.h} | 170 ++++++++++------- adapter/preview/entrance/event_dispatcher.cpp | 7 +- adapter/preview/entrance/event_dispatcher.h | 13 +- adapter/preview/entrance/flutter_ace_view.h | 180 ------------------ adapter/preview/entrance/rs_ace_view.cpp | 128 ------------- adapter/preview/external/BUILD.gn | 8 + .../external/flutter/main_event_loop.cpp | 72 +++++++ .../external/flutter/main_event_loop.h | 48 +++++ .../external/flutter/platform_task_runner.cpp | 27 +++ .../external/flutter/platform_task_runner.h | 31 +++ .../flutter/platform_task_runner_adapter.cpp | 55 ++++++ .../flutter/platform_task_runner_adapter.h | 40 ++++ .../preview/external/window/window_preview.h | 9 +- .../bridge/js_frontend/engine/jsi/BUILD.gn | 3 + .../common/flutter/flutter_task_executor.cpp | 4 +- .../common/flutter/flutter_thread_model.cpp | 4 +- .../render/adapter/rosen_window.h | 2 +- 23 files changed, 516 insertions(+), 561 deletions(-) rename adapter/preview/entrance/{flutter_ace_view.cpp => ace_view_preview.cpp} (51%) rename adapter/preview/entrance/{rs_ace_view.h => ace_view_preview.h} (59%) delete mode 100644 adapter/preview/entrance/flutter_ace_view.h delete mode 100644 adapter/preview/entrance/rs_ace_view.cpp create mode 100644 adapter/preview/external/flutter/main_event_loop.cpp create mode 100644 adapter/preview/external/flutter/main_event_loop.h create mode 100644 adapter/preview/external/flutter/platform_task_runner.cpp create mode 100644 adapter/preview/external/flutter/platform_task_runner.h create mode 100644 adapter/preview/external/flutter/platform_task_runner_adapter.cpp create mode 100644 adapter/preview/external/flutter/platform_task_runner_adapter.h rename frameworks/core/components_ng/render/adapter/window_prviewer.h => adapter/preview/external/window/window_preview.h (90%) diff --git a/adapter/preview/entrance/BUILD.gn b/adapter/preview/entrance/BUILD.gn index 59ad69869a4..af8beb1c8c4 100644 --- a/adapter/preview/entrance/BUILD.gn +++ b/adapter/preview/entrance/BUILD.gn @@ -43,27 +43,30 @@ ohos_source_set("preview_entrance_source") { "ace_application_info.cpp", "ace_container.cpp", "ace_resource_register.cpp", + "ace_view_preview.cpp", "clipboard/clipboard_impl.cpp", "clipboard/clipboard_proxy_impl.cpp", "editing/text_input_client_mgr.cpp", "editing/text_input_connection_impl.cpp", "editing/text_input_impl.cpp", "event_dispatcher.cpp", - "flutter_ace_view.cpp", "subwindow_preview.cpp", ] deps = [ - "$ace_flutter_engine_root/glfw:flutter_glfw_preview_$platform", - "$ace_flutter_engine_root/skia:ace_skia_$platform", "$ace_napi:ace_napi", "$ace_root/frameworks/core/components/theme:build_theme_code", ] + include_dirs = [ "$flutter_root/engine" ] + if (defined(config.enable_rosen_backend) && config.enable_rosen_backend) { - sources -= [ "flutter_ace_view.cpp" ] - sources += [ "rs_ace_view.cpp" ] deps += [ "//foundation/graphic/graphic_2d/rosen/modules/render_service_client:librender_service_client" ] + } else { + deps += [ + "$ace_flutter_engine_root/glfw:flutter_glfw_preview_$platform", + "$ace_flutter_engine_root/skia:ace_skia_$platform", + ] } if (!is_cross_platform_build) { diff --git a/adapter/preview/entrance/ace_ability.cpp b/adapter/preview/entrance/ace_ability.cpp index a7dfd7bba30..d693ce905e1 100644 --- a/adapter/preview/entrance/ace_ability.cpp +++ b/adapter/preview/entrance/ace_ability.cpp @@ -30,6 +30,8 @@ #ifndef ENABLE_ROSEN_BACKEND #include "frameworks/core/components/common/painter/flutter_svg_painter.h" +#else +#include "adapter/preview/external/flutter/main_event_loop.h" #endif namespace OHOS::Ace::Platform { @@ -217,27 +219,21 @@ std::unique_ptr AceAbility::CreateInstance(AceRunArgs& runArgs) { DumpAceRunArgs(runArgs); LOGI("Start create AceAbility instance"); - bool initSucceeded = FlutterDesktopInit(); - if (!initSucceeded) { + const auto& ctx = OHOS::Rosen::GlfwRenderContext::GetGlobal(); + if (!ctx->Init()) { LOGE("Could not create window; AceDesktopInit failed."); return nullptr; } +#ifdef USE_GLFW_WINDOW + ctx->CreateWindow(runArgs.deviceWidth, runArgs.deviceHeight, true); +#else + ctx->CreateWindow(runArgs.deviceWidth, runArgs.deviceHeight, false); +#endif AceApplicationInfo::GetInstance().SetLocale(runArgs.language, runArgs.region, runArgs.script, ""); - SetFontMgrConfig(runArgs.containerSdkPath); - - auto controller = FlutterDesktopCreateWindow( - runArgs.deviceWidth, runArgs.deviceHeight, runArgs.windowTitle.c_str(), runArgs.onRender); - - const auto& ctx = OHOS::Rosen::GlfwRenderContext::GetGlobal(); - if (ctx != nullptr) { - ctx->InitFrom(FlutterDesktopGetWindow(controller)); - } - EventDispatcher::GetInstance().Initialize(); auto aceAbility = std::make_unique(runArgs); aceAbility->SetGlfwWindowController(ctx); - aceAbility->SetFlutterWindowControllerRef(controller); return aceAbility; } #endif @@ -274,7 +270,7 @@ void AceAbility::InitEnv() AceContainer::SetResourcesPathAndThemeStyle(ACE_INSTANCE_ID, runArgs_.systemResourcesPath, runArgs_.appResourcesPath, runArgs_.themeId, runArgs_.deviceConfig.colorMode); - auto view = new FlutterAceView(ACE_INSTANCE_ID); + auto view = new AceViewPreview(ACE_INSTANCE_ID, nullptr); if (runArgs_.aceVersion == AceVersion::ACE_2_0) { AceContainer::SetView(view, runArgs_.deviceConfig.density, runArgs_.deviceWidth, runArgs_.deviceHeight); AceContainer::RunPage(ACE_INSTANCE_ID, UNUSED_PAGE_ID, runArgs_.url, ""); @@ -327,13 +323,15 @@ void AceAbility::InitEnv() AceContainer::SetResourcesPathAndThemeStyle(ACE_INSTANCE_ID, runArgs_.systemResourcesPath, runArgs_.appResourcesPath, runArgs_.themeId, runArgs_.deviceConfig.colorMode); - auto view = new RSAceView(ACE_INSTANCE_ID); + auto view = AceViewPreview::CreateView(ACE_INSTANCE_ID); if (runArgs_.aceVersion == AceVersion::ACE_2_0) { - AceContainer::SetView(view, runArgs_.deviceConfig.density, runArgs_.deviceWidth, runArgs_.deviceHeight, runArgs_.onRender); + AceContainer::SetView( + view, runArgs_.deviceConfig.density, runArgs_.deviceWidth, runArgs_.deviceHeight, runArgs_.onRender); AceContainer::RunPage(ACE_INSTANCE_ID, UNUSED_PAGE_ID, runArgs_.url, ""); } else { AceContainer::RunPage(ACE_INSTANCE_ID, UNUSED_PAGE_ID, runArgs_.url, ""); - AceContainer::SetView(view, runArgs_.deviceConfig.density, runArgs_.deviceWidth, runArgs_.deviceHeight, runArgs_.onRender); + AceContainer::SetView( + view, runArgs_.deviceConfig.density, runArgs_.deviceWidth, runArgs_.deviceHeight, runArgs_.onRender); } if (runArgs_.projectModel == ProjectModel::STAGE) { container->InitializeStageAppConfig(runArgs_.assetPath, runArgs_.formsEnabled); @@ -409,10 +407,8 @@ void AceAbility::RunEventLoop() void AceAbility::RunEventLoop() { while (controller_ != nullptr && !controller_->WindowShouldClose() && loopRunning_) { - if (windowControllerRef_) { - FlutterDesktopWaitForEvents(windowControllerRef_); - } - controller_->PollEvents(); + // Execute all tasks in the platform thread + flutter::MainEventLoop::GetInstance().Run(); #ifdef USE_GLFW_WINDOW int32_t width; @@ -424,11 +420,14 @@ void AceAbility::RunEventLoop() } #endif + // Drive the native engine. auto container = AceContainer::GetContainerInstance(ACE_INSTANCE_ID); if (container) { container->RunNativeEngineLoop(); } + // Process the event of glfw + controller_->PollEvents(); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } loopRunning_ = true; @@ -599,9 +598,9 @@ std::string AceAbility::GetJSONTree() CHECK_NULL_RETURN(container, ""); auto taskExecutor = container->GetTaskExecutor(); CHECK_NULL_RETURN(taskExecutor, ""); - taskExecutor->PostSyncTask([&jsonTreeStr] { - OHOS::Ace::Framework::InspectorClient::GetInstance().AssembleJSONTreeStr(jsonTreeStr); - }, TaskExecutor::TaskType::UI); + taskExecutor->PostSyncTask( + [&jsonTreeStr] { OHOS::Ace::Framework::InspectorClient::GetInstance().AssembleJSONTreeStr(jsonTreeStr); }, + TaskExecutor::TaskType::UI); return jsonTreeStr; } @@ -612,9 +611,11 @@ std::string AceAbility::GetDefaultJSONTree() CHECK_NULL_RETURN(container, ""); auto taskExecutor = container->GetTaskExecutor(); CHECK_NULL_RETURN(taskExecutor, ""); - taskExecutor->PostSyncTask([&defaultJsonTreeStr] { + taskExecutor->PostSyncTask( + [&defaultJsonTreeStr] { OHOS::Ace::Framework::InspectorClient::GetInstance().AssembleDefaultJSONTreeStr(defaultJsonTreeStr); - }, TaskExecutor::TaskType::UI); + }, + TaskExecutor::TaskType::UI); return defaultJsonTreeStr; } diff --git a/adapter/preview/entrance/ace_ability.h b/adapter/preview/entrance/ace_ability.h index 1c00cc505e6..6a0d1628476 100644 --- a/adapter/preview/entrance/ace_ability.h +++ b/adapter/preview/entrance/ace_ability.h @@ -18,9 +18,10 @@ #include -#include "flutter/shell/platform/glfw/public/flutter_glfw.h" #ifdef ENABLE_ROSEN_BACKEND #include "glfw_render_context.h" +#else +#include "flutter/shell/platform/glfw/public/flutter_glfw.h" #endif #include "adapter/preview/entrance/ace_run_args.h" @@ -91,18 +92,8 @@ private: controller_ = controller; } -#ifdef ENABLE_ROSEN_BACKEND - void SetFlutterWindowControllerRef(const FlutterDesktopWindowControllerRef &controller) - { - windowControllerRef_ = controller; - } - - FlutterDesktopWindowControllerRef windowControllerRef_ = nullptr; -#endif - // flag indicating if the glfw message loop should be running. static std::atomic loopRunning_; - AceRunArgs runArgs_; ConfigChanges configChanges_; GlfwController controller_ = nullptr; diff --git a/adapter/preview/entrance/ace_container.cpp b/adapter/preview/entrance/ace_container.cpp index 0c7045191fe..6c141ce2644 100644 --- a/adapter/preview/entrance/ace_container.cpp +++ b/adapter/preview/entrance/ace_container.cpp @@ -27,13 +27,14 @@ #include #include -#include "flutter/lib/ui/ui_dart_state.h" #include "adapter/preview/entrance/rs_dir_asset_provider.h" -#include "core/common/rosen/rosen_asset_manager.h" #include "core/common/flutter/flutter_task_executor.h" +#include "core/common/rosen/rosen_asset_manager.h" #endif +#include "adapter/ohos/entrance/ace_new_pipe_judgement.h" #include "adapter/preview/entrance/ace_application_info.h" +#include "adapter/preview/external/window/window_preview.h" #include "adapter/preview/osal/stage_card_parser.h" #include "base/log/ace_trace.h" #include "base/log/event_report.h" @@ -59,11 +60,9 @@ #include "core/components/theme/theme_manager_impl.h" #include "core/components_ng/pattern/text_field/text_field_manager.h" #include "core/components_ng/render/adapter/rosen_window.h" -#include "core/components_ng/render/adapter/window_prviewer.h" #include "core/pipeline/base/element.h" #include "core/pipeline/pipeline_context.h" #include "core/pipeline_ng/pipeline_context.h" -#include "adapter/ohos/entrance/ace_new_pipe_judgement.h" namespace OHOS::Ace::Platform { namespace { @@ -78,17 +77,27 @@ const char LOCALE_KEY[] = "locale"; std::once_flag AceContainer::onceFlag_; -AceContainer::AceContainer(int32_t instanceId, FrontendType type, RefPtr context) +AceContainer::AceContainer(int32_t instanceId, FrontendType type, RefPtr context, bool useCurrentEventRunner) : instanceId_(instanceId), messageBridge_(AceType::MakeRefPtr()), type_(type), context_(context) { ThemeConstants::InitDeviceType(); - +#ifndef ENABLE_ROSEN_BACKEND auto state = flutter::UIDartState::Current()->GetStateById(instanceId); - auto taskExecutor = Referenced::MakeRefPtr(state->GetTaskRunners()); + auto flutterTaskExecutor = Referenced::MakeRefPtr(state->GetTaskRunners()); + if (type_ != FrontendType::DECLARATIVE_JS && type_ != FrontendType::ETS_CARD) { + flutterTaskExecutor->InitJsThread(); + } +#else + auto flutterTaskExecutor = Referenced::MakeRefPtr(); + flutterTaskExecutor->InitPlatformThread(useCurrentEventRunner); + // No need to create JS Thread for DECLARATIVE_JS if (type_ != FrontendType::DECLARATIVE_JS && type_ != FrontendType::ETS_CARD) { - taskExecutor->InitJsThread(); + flutterTaskExecutor->InitJsThread(); + } else { + GetSettings().useUIAsJSThread = true; } - taskExecutor_ = taskExecutor; +#endif + taskExecutor_ = flutterTaskExecutor; } void AceContainer::Initialize() @@ -113,8 +122,8 @@ void AceContainer::Initialize() if (type_ == FrontendType::DECLARATIVE_JS) { installationFree_ = appInfo->IsInstallationFree(); } - useNewPipe = AceNewPipeJudgement::QueryAceNewPipeEnabledStage("", compatibleVersion, targetVersion, - releaseType, !enablePartialUpdate); + useNewPipe = AceNewPipeJudgement::QueryAceNewPipeEnabledStage( + "", compatibleVersion, targetVersion, releaseType, !enablePartialUpdate); } else if (faContext) { auto appInfo = faContext->GetAppInfo(); CHECK_NULL_VOID(appInfo); @@ -376,8 +385,8 @@ void AceContainer::InitializeCallback() }; aceView_->RegisterCardViewAccessibilityParamsCallback(cardViewParamsCallback); - auto&& viewChangeCallback = [weak, id = instanceId_](int32_t width, int32_t height, - WindowSizeChangeReason type, const std::shared_ptr& rsTransaction) { + auto&& viewChangeCallback = [weak, id = instanceId_](int32_t width, int32_t height, WindowSizeChangeReason type, + const std::shared_ptr& rsTransaction) { ContainerScope scope(id); auto context = weak.Upgrade(); if (context == nullptr) { @@ -445,13 +454,14 @@ void AceContainer::InitializeCallback() aceView_->RegisterIdleCallback(idleCallback); } -void AceContainer::CreateContainer(int32_t instanceId, FrontendType type, const AceRunArgs& runArgs) +void AceContainer::CreateContainer( + int32_t instanceId, FrontendType type, const AceRunArgs& runArgs, bool useCurrentEventRunner) { // for ohos container use newPipeline SystemProperties::SetExtSurfaceEnabled(!runArgs.containerSdkPath.empty()); auto context = Context::CreateContext(runArgs.projectModel == ProjectModel::STAGE, runArgs.appResourcesPath); - auto aceContainer = AceType::MakeRefPtr(instanceId, type, context); + auto aceContainer = AceType::MakeRefPtr(instanceId, type, context, useCurrentEventRunner); AceEngine::Get().AddContainer(aceContainer->GetInstanceId(), aceContainer); aceContainer->Initialize(); ContainerScope scope(instanceId); @@ -774,7 +784,7 @@ void AceContainer::UpdateDeviceConfig(const DeviceConfig& deviceConfig) } #ifndef ENABLE_ROSEN_BACKEND -void AceContainer::SetView(FlutterAceView* view, double density, int32_t width, int32_t height) +void AceContainer::SetView(AceViewPreview* view, double density, int32_t width, int32_t height) { if (view == nullptr) { return; @@ -795,7 +805,7 @@ void AceContainer::SetView(FlutterAceView* view, double density, int32_t width, } #else void AceContainer::SetView( - RSAceView* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender) + AceViewPreview* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender) { CHECK_NULL_VOID(view); auto container = AceType::DynamicCast(AceEngine::Get().GetContainer(view->GetInstanceId())); @@ -810,7 +820,7 @@ void AceContainer::SetView( #ifndef ENABLE_ROSEN_BACKEND void AceContainer::AttachView( - std::unique_ptr window, FlutterAceView* view, double density, int32_t width, int32_t height) + std::unique_ptr window, AceViewPreview* view, double density, int32_t width, int32_t height) { ContainerScope scope(instanceId_); aceView_ = view; @@ -894,24 +904,19 @@ void AceContainer::AttachView( AceEngine::Get().RegisterToWatchDog(instanceId, taskExecutor_, GetSettings().useUIAsJSThread); } #else -void AceContainer::AttachView(std::unique_ptr window, RSAceView* view, double density, int32_t width, +void AceContainer::AttachView(std::unique_ptr window, AceViewPreview* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender) { ContainerScope scope(instanceId_); aceView_ = view; auto instanceId = aceView_->GetInstanceId(); - auto state = flutter::UIDartState::Current()->GetStateById(instanceId); - ACE_DCHECK(state != nullptr); - auto rsTaskExecutor = AceType::DynamicCast(taskExecutor_); - if (!rsTaskExecutor) { - LOGI("RsTaskExecutor is nullptr!"); - return; - } - rsTaskExecutor->InitOtherThreads(state->GetTaskRunners()); + auto flutterTaskExecutor = AceType::DynamicCast(taskExecutor_); + CHECK_NULL_VOID(flutterTaskExecutor); + flutterTaskExecutor->InitOtherThreads(aceView_->GetThreadModel()); if (type_ == FrontendType::DECLARATIVE_JS || type_ == FrontendType::ETS_CARD) { // For DECLARATIVE_JS frontend display UI in JS thread temporarily. - rsTaskExecutor->InitJsThread(false); + flutterTaskExecutor->InitJsThread(false); InitializeFrontend(); auto front = GetFrontend(); if (front) { diff --git a/adapter/preview/entrance/ace_container.h b/adapter/preview/entrance/ace_container.h index 5a15b2ae8f8..caa64fb2181 100644 --- a/adapter/preview/entrance/ace_container.h +++ b/adapter/preview/entrance/ace_container.h @@ -35,11 +35,7 @@ #include "adapter/preview/external/ability/fa/fa_context.h" #include "adapter/preview/external/ability/stage/stage_context.h" -#ifndef ENABLE_ROSEN_BACKEND -#include "adapter/preview/entrance/flutter_ace_view.h" -#else -#include "adapter/preview/entrance/rs_ace_view.h" -#endif +#include "adapter/preview/entrance/ace_view_preview.h" namespace OHOS::Ace::Platform { @@ -56,7 +52,8 @@ class AceContainer : public Container, public JsMessageDispatcher { DECLARE_ACE_TYPE(AceContainer, Container, JsMessageDispatcher); public: - static void CreateContainer(int32_t instanceId, FrontendType type, const AceRunArgs& runArgs); + static void CreateContainer( + int32_t instanceId, FrontendType type, const AceRunArgs& runArgs, bool useCurrentEventRunner = false); static void DestroyContainer(int32_t instanceId); static void AddAssetPath(int32_t instanceId, const std::string& packagePath, const std::vector& paths); @@ -64,9 +61,10 @@ public: const std::string& appResourcesPath, const int32_t& themeId, const ColorMode& colorMode); #ifndef ENABLE_ROSEN_BACKEND - static void SetView(FlutterAceView* view, double density, int32_t width, int32_t height); + static void SetView(AceViewPreview* view, double density, int32_t width, int32_t height); #else - static void SetView(RSAceView* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender); + static void SetView( + AceViewPreview* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender); #endif static void InitDeviceInfo(int32_t instanceId, const AceRunArgs& runArgs); @@ -75,7 +73,7 @@ public: static void AddRouterChangeCallback(int32_t instanceId, const OnRouterChangeCallback& onRouterChangeCallback); static void NativeOnConfigurationUpdated(int32_t instanceId); - AceContainer(int32_t instanceId, FrontendType type, RefPtr context); + AceContainer(int32_t instanceId, FrontendType type, RefPtr context, bool useCurrentEventRunner = false); ~AceContainer() override = default; void Initialize() override; @@ -151,17 +149,10 @@ public: void SetWindowId(uint32_t windowId) override {} -#ifndef ENABLE_ROSEN_BACKEND - FlutterAceView* GetAceView() const - { - return aceView_; - } -#else - RSAceView* GetAceView() const + AceViewPreview* GetAceView() const { return aceView_; } -#endif void* GetView() const override { @@ -266,18 +257,13 @@ private: #ifndef ENABLE_ROSEN_BACKEND void AttachView( - std::unique_ptr window, FlutterAceView* view, double density, int32_t width, int32_t height); -#else - void AttachView( - std::unique_ptr window, RSAceView* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender); -#endif - -#ifndef ENABLE_ROSEN_BACKEND - FlutterAceView* aceView_ = nullptr; + std::unique_ptr window, AceViewPreview* view, double density, int32_t width, int32_t height); #else - RSAceView* aceView_ = nullptr; + void AttachView(std::unique_ptr window, + AceViewPreview* view, double density, int32_t width, int32_t height, SendRenderDataCallback onRender); #endif + AceViewPreview* aceView_ = nullptr; int32_t instanceId_; RefPtr taskExecutor_; RefPtr assetManager_; diff --git a/adapter/preview/entrance/flutter_ace_view.cpp b/adapter/preview/entrance/ace_view_preview.cpp similarity index 51% rename from adapter/preview/entrance/flutter_ace_view.cpp rename to adapter/preview/entrance/ace_view_preview.cpp index 0b4a1fec89a..4e963f5a771 100644 --- a/adapter/preview/entrance/flutter_ace_view.cpp +++ b/adapter/preview/entrance/ace_view_preview.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2023 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 @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "adapter/preview/entrance/flutter_ace_view.h" +#include "adapter/preview/entrance/ace_view_preview.h" #include "base/log/dump_log.h" #include "base/log/event_report.h" @@ -26,86 +26,51 @@ #include "core/event/mouse_event.h" #include "core/event/touch_event.h" #include "core/image/image_cache.h" -#include "core/pipeline/layers/flutter_scene_builder.h" namespace OHOS::Ace::Platform { - -void FlutterAceView::RegisterTouchEventCallback(TouchEventCallback&& callback) -{ - ACE_DCHECK(callback); - touchEventCallback_ = std::move(callback); -} - -void FlutterAceView::RegisterKeyEventCallback(KeyEventCallback&& callback) -{ - ACE_DCHECK(callback); - keyEventCallback_ = std::move(callback); -} - -void FlutterAceView::RegisterMouseEventCallback(MouseEventCallback&& callback) -{ - ACE_DCHECK(callback); - mouseEventCallback_ = std::move(callback); -} - -void FlutterAceView::RegisterAxisEventCallback(AxisEventCallback&& callback) +AceViewPreview* AceViewPreview::CreateView(int32_t instanceId, bool useCurrentEventRunner, bool usePlatformThread) { - ACE_DCHECK(callback); - axisEventCallback_ = std::move(callback); + auto* aceView = new AceViewPreview(instanceId, FlutterThreadModel::CreateThreadModel( + useCurrentEventRunner, !usePlatformThread, !SystemProperties::GetRosenBackendEnabled())); + if (aceView != nullptr) { + aceView->IncRefCount(); + } + return aceView; } -void FlutterAceView::RegisterRotationEventCallback(RotationEventCallBack&& callback) -{ - ACE_DCHECK(callback); - rotationEventCallBack_ = std::move(callback); -} +AceViewPreview::AceViewPreview(int32_t instanceId, std::unique_ptr threadModel) + : instanceId_(instanceId), threadModel_(std::move(threadModel)) +{} -void FlutterAceView::Launch() +void AceViewPreview::NotifySurfaceChanged(int32_t width, int32_t height, + WindowSizeChangeReason type, const std::shared_ptr& rsTransaction) { + width_ = width; + height_ = height; + CHECK_NULL_VOID(viewChangeCallback_); + viewChangeCallback_(width, height, type, rsTransaction); } -bool FlutterAceView::Dump(const std::vector& params) -{ - return false; -} - -void FlutterAceView::ProcessIdleEvent(int64_t deadline) -{ - if (idleCallback_) { - idleCallback_(deadline); - } -} - -bool FlutterAceView::HandleTouchEvent(const TouchEvent& touchEvent) +bool AceViewPreview::HandleTouchEvent(const TouchEvent& touchEvent) { + LOGD("Event: [x, y, size] = [%{public}lf, %{public}lf, %{public}lf]", touchEvent.x, touchEvent.y, touchEvent.size); if (touchEvent.type == TouchType::UNKNOWN) { LOGW("Unknown event."); return false; } - - LOGD("HandleTouchEvent touchEvent.x: %lf, touchEvent.y: %lf, touchEvent.size: %lf", - touchEvent.x, touchEvent.y, touchEvent.size); + CHECK_NULL_RETURN(touchEventCallback_, true); auto event = touchEvent.UpdatePointers(); - if (touchEventCallback_) { - touchEventCallback_(event, nullptr); - } - + touchEventCallback_(event, nullptr); return true; } -bool FlutterAceView::HandleKeyEvent(const KeyEvent& keyEvent) -{ - if (!keyEventCallback_) { - return false; - } - - return keyEventCallback_(keyEvent); -} - -std::unique_ptr FlutterAceView::GetDrawDelegate() +std::unique_ptr AceViewPreview::GetDrawDelegate() { auto drawDelegate = std::make_unique(); +#ifdef ENABLE_ROSEN_BACKEND + drawDelegate->SetDrawRSFrameCallback([](std::shared_ptr& node, const Rect& rect) {}); +#else drawDelegate->SetDrawFrameCallback([this](RefPtr& layer, const Rect& dirty) { if (!layer) { return; @@ -122,17 +87,8 @@ std::unique_ptr FlutterAceView::GetDrawDelegate() window->client()->Render(scene_.get()); } }); +#endif return drawDelegate; } - -std::unique_ptr FlutterAceView::GetPlatformWindow() -{ - return nullptr; -} - -const void* FlutterAceView::GetNativeWindowById(uint64_t textureId) -{ - return nullptr; -} } // namespace OHOS::Ace::Platform diff --git a/adapter/preview/entrance/rs_ace_view.h b/adapter/preview/entrance/ace_view_preview.h similarity index 59% rename from adapter/preview/entrance/rs_ace_view.h rename to adapter/preview/entrance/ace_view_preview.h index ecebc8b64e8..38dfbaae84d 100644 --- a/adapter/preview/entrance/rs_ace_view.h +++ b/adapter/preview/entrance/ace_view_preview.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef FOUNDATION_ACE_ADAPTER_PREVIEW_RS_ACE_VIEW_H -#define FOUNDATION_ACE_ADAPTER_PREVIEW_RS_ACE_VIEW_H +#ifndef FOUNDATION_ACE_ADAPTER_PREVIEW_ENTRANCE_ACE_VIEW_OHOS_H +#define FOUNDATION_ACE_ADAPTER_PREVIEW_ENTRANCE_ACE_VIEW_OHOS_H #include @@ -23,136 +23,164 @@ #include "base/utils/noncopyable.h" #include "core/common/ace_view.h" #include "core/event/key_event_recognizer.h" +#include "core/common/flutter/flutter_thread_model.h" namespace OHOS::Ace::Platform { - using ReleaseCallback = std::function; -class RSAceView : public AceView, public Referenced { +class AceViewPreview : public AceView, public Referenced { public: - explicit RSAceView(int32_t instanceId) : instanceId_(instanceId) {} - ~RSAceView() override = default; - - void RegisterTouchEventCallback(TouchEventCallback&& callback) override; - void RegisterKeyEventCallback(KeyEventCallback&& callback) override; - void RegisterMouseEventCallback(MouseEventCallback&& callback) override; - void RegisterAxisEventCallback(AxisEventCallback&& callback) override; - void RegisterRotationEventCallback(RotationEventCallBack&& callback) override; - void RegisterDragEventCallback(DragEventCallBack&& callback) override {} - - void Launch() override; + AceViewPreview(int32_t instanceId, std::unique_ptr threadModel); + ~AceViewPreview() override = default; + static AceViewPreview* CreateView( + int32_t instanceId, bool useCurrentEventRunner = false, bool usePlatformThread = false); + void Launch() override {} int32_t GetInstanceId() const override { return instanceId_; } + void RegisterTouchEventCallback(TouchEventCallback&& callback) override + { + ACE_DCHECK(callback); + touchEventCallback_ = std::move(callback); + } + + void RegisterKeyEventCallback(KeyEventCallback&& callback) override + { + ACE_DCHECK(callback); + keyEventCallback_ = std::move(callback); + } + + void RegisterMouseEventCallback(MouseEventCallback&& callback) override + { + ACE_DCHECK(callback); + mouseEventCallback_ = std::move(callback); + } + + void RegisterAxisEventCallback(AxisEventCallback&& callback) override + { + ACE_DCHECK(callback); + axisEventCallback_ = std::move(callback); + } + + void RegisterRotationEventCallback(RotationEventCallBack&& callback) override + { + ACE_DCHECK(callback); + rotationEventCallBack_ = std::move(callback); + } + + void RegisterDragEventCallback(DragEventCallBack&& callback) override {} + void RegisterCardViewPositionCallback(CardViewPositionCallBack&& callback) override { - if (callback) { - cardViewPositionCallBack_ = std::move(callback); - } + ACE_DCHECK(callback); + cardViewPositionCallBack_ = std::move(callback); } void RegisterCardViewAccessibilityParamsCallback(CardViewAccessibilityParamsCallback&& callback) override { - if (callback) { - cardViewAccessibilityParamsCallback_ = std::move(callback); - } + ACE_DCHECK(callback); + cardViewAccessibilityParamsCallback_ = std::move(callback); } void RegisterViewChangeCallback(ViewChangeCallback&& callback) override { - if (callback) { - viewChangeCallback_ = std::move(callback); - } + ACE_DCHECK(callback); + viewChangeCallback_ = std::move(callback); } void RegisterViewPositionChangeCallback(ViewPositionChangeCallback&& callback) override {} void RegisterDensityChangeCallback(DensityChangeCallback&& callback) override { - if (callback) { - densityChangeCallback_ = std::move(callback); - } + ACE_DCHECK(callback); + densityChangeCallback_ = std::move(callback); } void RegisterSystemBarHeightChangeCallback(SystemBarHeightChangeCallback&& callback) override { - if (callback) { - systemBarHeightChangeCallback_ = std::move(callback); - } + ACE_DCHECK(callback); + systemBarHeightChangeCallback_ = std::move(callback); } void RegisterSurfaceDestroyCallback(SurfaceDestroyCallback&& callback) override { - if (callback) { - surfaceDestroyCallback_ = std::move(callback); - } + ACE_DCHECK(callback); + surfaceDestroyCallback_ = std::move(callback); } void RegisterIdleCallback(IdleCallback&& callback) override { - if (callback) { - idleCallback_ = std::move(callback); - } + ACE_DCHECK(callback); + idleCallback_ = std::move(callback); } - const RefPtr& GetPlatformResRegister() const override + void NotifyDensityChanged(double density) const { - return resRegister_; + CHECK_NULL_VOID(densityChangeCallback_); + densityChangeCallback_(density); } - bool Dump(const std::vector& params) override; - - void ProcessIdleEvent(int64_t deadline); - - void NotifySurfaceChanged( - int32_t width, int32_t height, WindowSizeChangeReason type = WindowSizeChangeReason::UNDEFINED, - const std::shared_ptr& rsTransaction = nullptr) + void NotifySystemBarHeightChanged(double statusBar, double navigationBar) const { - width_ = width; - height_ = height; - if (viewChangeCallback_) { - viewChangeCallback_(width, height, type, rsTransaction); - } + CHECK_NULL_VOID(systemBarHeightChangeCallback_); + systemBarHeightChangeCallback_(statusBar, navigationBar); } - void NotifyDensityChanged(double density) const + void NotifySurfaceDestroyed() const { - if (densityChangeCallback_) { - densityChangeCallback_(density); - } + CHECK_NULL_VOID(surfaceDestroyCallback_); + surfaceDestroyCallback_(); } - void NotifySystemBarHeightChanged(double statusBar, double navigationBar) const + bool HandleKeyEvent(const KeyEvent& keyEvent) override { - if (systemBarHeightChangeCallback_) { - systemBarHeightChangeCallback_(statusBar, navigationBar); - } + return keyEventCallback_ && keyEventCallback_(keyEvent); } - void NotifySurfaceDestroyed() const + const RefPtr& GetPlatformResRegister() const override { - if (surfaceDestroyCallback_) { - surfaceDestroyCallback_(); - } + return resRegister_; } - // Use to receive event from pc previewer - bool HandleTouchEvent(const TouchEvent& touchEvent) override; + bool Dump(const std::vector& params) override + { + return false; + } - // Use to receive event from pc previewer - bool HandleKeyEvent(const KeyEvent& keyEvent) override; + void ProcessIdleEvent(int64_t deadline) + { + CHECK_NULL_VOID(idleCallback_); + idleCallback_(deadline); + } ViewType GetViewType() const override { return AceView::ViewType::SURFACE_VIEW; } + std::unique_ptr GetPlatformWindow() override + { + return nullptr; + } + + const void* GetNativeWindowById(uint64_t textureId) override + { + return nullptr; + } + + FlutterThreadModel* GetThreadModel() const + { + return threadModel_.get(); + } + + void NotifySurfaceChanged( + int32_t width, int32_t height, WindowSizeChangeReason type = WindowSizeChangeReason::UNDEFINED, + const std::shared_ptr& rsTransaction = nullptr); + bool HandleTouchEvent(const TouchEvent& touchEvent) override; std::unique_ptr GetDrawDelegate() override; - std::unique_ptr GetPlatformWindow() override; - const void* GetNativeWindowById(uint64_t textureId) override; private: int32_t instanceId_ = 0; @@ -171,10 +199,10 @@ private: IdleCallback idleCallback_; KeyEventCallback keyEventCallback_; KeyEventRecognizer keyEventRecognizer_; + std::unique_ptr threadModel_; - ACE_DISALLOW_COPY_AND_MOVE(RSAceView); + ACE_DISALLOW_COPY_AND_MOVE(AceViewPreview); }; - } // namespace OHOS::Ace::Platform -#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_RS_ACE_VIEW_H +#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_ENTRANCE_ACE_VIEW_OHOS_H diff --git a/adapter/preview/entrance/event_dispatcher.cpp b/adapter/preview/entrance/event_dispatcher.cpp index 0c0626c13c2..1599a740624 100644 --- a/adapter/preview/entrance/event_dispatcher.cpp +++ b/adapter/preview/entrance/event_dispatcher.cpp @@ -22,7 +22,7 @@ #include "core/common/container_scope.h" #include "adapter/preview/entrance/ace_container.h" #include "adapter/preview/entrance/editing/text_input_client_mgr.h" -#include "adapter/preview/entrance/flutter_ace_view.h" +#include "adapter/preview/entrance/ace_view_preview.h" namespace OHOS::Ace::Platform { namespace { @@ -74,11 +74,6 @@ EventDispatcher::EventDispatcher() EventDispatcher::~EventDispatcher() = default; -void EventDispatcher::SetGlfwWindowController(const FlutterDesktopWindowControllerRef& controller) -{ - controller_ = controller; -} - void EventDispatcher::Initialize() { LOGI("Initialize event dispatcher"); diff --git a/adapter/preview/entrance/event_dispatcher.h b/adapter/preview/entrance/event_dispatcher.h index 4afffbd4d02..83489cbf0fa 100644 --- a/adapter/preview/entrance/event_dispatcher.h +++ b/adapter/preview/entrance/event_dispatcher.h @@ -22,7 +22,9 @@ #include "core/event/key_event.h" #include "core/event/touch_event.h" #include "core/common/clipboard/clipboard_proxy.h" +#ifndef ENABLE_ROSEN_BACKEND #include "flutter/shell/platform/glfw/public/flutter_glfw.h" +#endif namespace OHOS::Ace::Platform { @@ -32,7 +34,6 @@ class ACE_FORCE_EXPORT_WITH_PREVIEW EventDispatcher : public Singleton - -#include "adapter/preview/entrance/ace_resource_register.h" -#include "base/utils/noncopyable.h" -#include "core/common/ace_view.h" -#include "core/event/key_event_recognizer.h" - -namespace OHOS::Ace::Platform { - -using ReleaseCallback = std::function; - -class FlutterAceView : public AceView, public Referenced { -public: - explicit FlutterAceView(int32_t instanceId) : instanceId_(instanceId) {} - ~FlutterAceView() override = default; - - void RegisterTouchEventCallback(TouchEventCallback&& callback) override; - void RegisterKeyEventCallback(KeyEventCallback&& callback) override; - void RegisterMouseEventCallback(MouseEventCallback&& callback) override; - void RegisterAxisEventCallback(AxisEventCallback&& callback) override; - void RegisterRotationEventCallback(RotationEventCallBack&& callback) override; - void RegisterDragEventCallback(DragEventCallBack&& callback) override {} - - void Launch() override; - - int32_t GetInstanceId() const override - { - return instanceId_; - } - - void RegisterCardViewPositionCallback(CardViewPositionCallBack&& callback) override - { - if (callback) { - cardViewPositionCallBack_ = std::move(callback); - } - } - - void RegisterCardViewAccessibilityParamsCallback(CardViewAccessibilityParamsCallback&& callback) override - { - if (callback) { - cardViewAccessibilityParamsCallback_ = std::move(callback); - } - } - - void RegisterViewChangeCallback(ViewChangeCallback&& callback) override - { - if (callback) { - viewChangeCallback_ = std::move(callback); - } - } - - void RegisterViewPositionChangeCallback(ViewPositionChangeCallback&& callback) override {} - - void RegisterDensityChangeCallback(DensityChangeCallback&& callback) override - { - if (callback) { - densityChangeCallback_ = std::move(callback); - } - } - - void RegisterSystemBarHeightChangeCallback(SystemBarHeightChangeCallback&& callback) override - { - if (callback) { - systemBarHeightChangeCallback_ = std::move(callback); - } - } - - void RegisterSurfaceDestroyCallback(SurfaceDestroyCallback&& callback) override - { - if (callback) { - surfaceDestroyCallback_ = std::move(callback); - } - } - - void RegisterIdleCallback(IdleCallback&& callback) override - { - if (callback) { - idleCallback_ = std::move(callback); - } - } - - const RefPtr& GetPlatformResRegister() const override - { - return resRegister_; - } - - bool Dump(const std::vector& params) override; - - void ProcessIdleEvent(int64_t deadline); - - void NotifySurfaceChanged( - int32_t width, int32_t height, WindowSizeChangeReason type = WindowSizeChangeReason::UNDEFINED, - const std::shared_ptr& rsTransaction = nullptr) - { - width_ = width; - height_ = height; - if (viewChangeCallback_) { - viewChangeCallback_(width, height, type, rsTransaction); - } - } - - void NotifyDensityChanged(double density) const - { - if (densityChangeCallback_) { - densityChangeCallback_(density); - } - } - - void NotifySystemBarHeightChanged(double statusBar, double navigationBar) const - { - if (systemBarHeightChangeCallback_) { - systemBarHeightChangeCallback_(statusBar, navigationBar); - } - } - - void NotifySurfaceDestroyed() const - { - if (surfaceDestroyCallback_) { - surfaceDestroyCallback_(); - } - } - - // Use to receive event from pc previewer - bool HandleTouchEvent(const TouchEvent& touchEvent) override; - - // Use to receive event from pc previewer - bool HandleKeyEvent(const KeyEvent& keyEvent) override; - - ViewType GetViewType() const override - { - return AceView::ViewType::SURFACE_VIEW; - } - - std::unique_ptr GetDrawDelegate() override; - std::unique_ptr GetPlatformWindow() override; - const void* GetNativeWindowById(uint64_t textureId) override; - -private: - int32_t instanceId_ = 0; - RefPtr resRegister_ = Referenced::MakeRefPtr(); - - TouchEventCallback touchEventCallback_; - MouseEventCallback mouseEventCallback_; - AxisEventCallback axisEventCallback_; - RotationEventCallBack rotationEventCallBack_; - CardViewPositionCallBack cardViewPositionCallBack_; - CardViewAccessibilityParamsCallback cardViewAccessibilityParamsCallback_; - ViewChangeCallback viewChangeCallback_; - DensityChangeCallback densityChangeCallback_; - SystemBarHeightChangeCallback systemBarHeightChangeCallback_; - SurfaceDestroyCallback surfaceDestroyCallback_; - IdleCallback idleCallback_; - KeyEventCallback keyEventCallback_; - KeyEventRecognizer keyEventRecognizer_; - - ACE_DISALLOW_COPY_AND_MOVE(FlutterAceView); -}; - -} // namespace OHOS::Ace::Platform - -#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_FLUTTER_ACE_VIEW_H diff --git a/adapter/preview/entrance/rs_ace_view.cpp b/adapter/preview/entrance/rs_ace_view.cpp deleted file mode 100644 index 57623f60099..00000000000 --- a/adapter/preview/entrance/rs_ace_view.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2023 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. - */ - -#include "adapter/preview/entrance/rs_ace_view.h" - -#include - -#include "base/log/dump_log.h" -#include "base/log/event_report.h" -#include "base/log/log.h" -#include "base/utils/macros.h" -#include "base/utils/system_properties.h" -#include "base/utils/utils.h" -#include "core/common/ace_engine.h" -#include "core/components/theme/theme_manager.h" -#include "core/event/mouse_event.h" -#include "core/event/touch_event.h" -#include "core/image/image_cache.h" - -namespace OHOS::Ace::Platform { -void RSAceView::RegisterTouchEventCallback(TouchEventCallback&& callback) -{ - ACE_DCHECK(callback); - touchEventCallback_ = std::move(callback); -} - -void RSAceView::RegisterKeyEventCallback(KeyEventCallback&& callback) -{ - ACE_DCHECK(callback); - keyEventCallback_ = std::move(callback); -} - -void RSAceView::RegisterMouseEventCallback(MouseEventCallback&& callback) -{ - ACE_DCHECK(callback); - mouseEventCallback_ = std::move(callback); -} - -void RSAceView::RegisterAxisEventCallback(AxisEventCallback&& callback) -{ - ACE_DCHECK(callback); - axisEventCallback_ = std::move(callback); -} - -void RSAceView::RegisterRotationEventCallback(RotationEventCallBack&& callback) -{ - ACE_DCHECK(callback); - rotationEventCallBack_ = std::move(callback); -} - -void RSAceView::Launch() -{ -} - -bool RSAceView::Dump(const std::vector& params) -{ - return false; -} - -void RSAceView::ProcessIdleEvent(int64_t deadline) -{ - if (idleCallback_) { - idleCallback_(deadline); - } -} - -bool RSAceView::HandleTouchEvent(const TouchEvent& touchEvent) -{ - if (touchEvent.type == TouchType::UNKNOWN) { - LOGW("Unknown event."); - return false; - } - - LOGD("HandleTouchEvent touchEvent.x: %{public}lf, touchEvent.y: %{public}lf, touchEvent.size: %{public}lf", - touchEvent.x, touchEvent.y, touchEvent.size); - auto event = touchEvent.UpdatePointers(); - if (touchEventCallback_) { - touchEventCallback_(event, nullptr); - } - - return true; -} - -bool RSAceView::HandleKeyEvent(const KeyEvent& keyEvent) -{ - if (!keyEventCallback_) { - return false; - } - - return keyEventCallback_(keyEvent); -} - -std::unique_ptr RSAceView::GetDrawDelegate() -{ - auto drawDelegate = std::make_unique(); - - drawDelegate->SetDrawRSFrameCallback([this](std::shared_ptr& node, const Rect& rect) { - if (!node) { - return; - } - LOGD("DrawRSFrameCallback called!!"); - }); - - return drawDelegate; -} - -std::unique_ptr RSAceView::GetPlatformWindow() -{ - return nullptr; -} - -const void* RSAceView::GetNativeWindowById(uint64_t textureId) -{ - return nullptr; -} -} // namespace OHOS::Ace::Platform diff --git a/adapter/preview/external/BUILD.gn b/adapter/preview/external/BUILD.gn index bf65daa6819..ffe361063ba 100644 --- a/adapter/preview/external/BUILD.gn +++ b/adapter/preview/external/BUILD.gn @@ -34,6 +34,7 @@ ohos_source_set("preview_external_source") { configs = [ "$ace_root:ace_config" ] sources = [ + # mock ability "ability/context.cpp", "ability/fa/fa_app_info.cpp", "ability/fa/fa_context.cpp", @@ -41,6 +42,13 @@ ohos_source_set("preview_external_source") { "ability/stage/stage_app_info.cpp", "ability/stage/stage_context.cpp", "ability/stage/stage_hap_module_info.cpp", + + # mock event_loop + "flutter/main_event_loop.cpp", + "flutter/platform_task_runner.cpp", + "flutter/platform_task_runner_adapter.cpp", ] + + include_dirs = [ "//third_party/flutter/engine" ] } } diff --git a/adapter/preview/external/flutter/main_event_loop.cpp b/adapter/preview/external/flutter/main_event_loop.cpp new file mode 100644 index 00000000000..b233c2cf3d3 --- /dev/null +++ b/adapter/preview/external/flutter/main_event_loop.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2023 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. + */ + +#include "adapter/preview/external/flutter/main_event_loop.h" + +namespace flutter { + +MainEventLoop& MainEventLoop::GetInstance() +{ + static MainEventLoop eventLoop(std::this_thread::get_id()); + return eventLoop; +} + +MainEventLoop::MainEventLoop(std::thread::id mainThreadId) : mainThreadId_(mainThreadId) {} + +MainEventLoop::~MainEventLoop() = default; + +bool MainEventLoop::RunsTasksOnCurrentThread() const +{ + return std::this_thread::get_id() == mainThreadId_; +} + +void MainEventLoop::Run() +{ + const auto now = fml::TimePoint::Now(); + std::vector expiredTasks; + + // Process expired tasks. + { + std::lock_guard lock(taskQueueMutex_); + while (!taskQueue_.empty()) { + const auto& top = taskQueue_.top(); + // If the task at the top of task queue has not yet expired, there is nothing more to do. + if (top.GetTargetTime() > now) { + break; + } + + // Only record tasks without executing them when the task queue mutex is hold. + expiredTasks.push_back(top.GetTask()); + taskQueue_.pop(); + } + } + + { + // Flushing tasks here without holing onto the task queue mutex. + for (const auto& task : expiredTasks) { + task(); + } + } +} + +void MainEventLoop::PostTask(fml::closure task, fml::TimePoint targetTime) +{ + static size_t globalTaskOrder = 0; + std::lock_guard lock(taskQueueMutex_); + size_t order = globalTaskOrder++; + taskQueue_.push({ order, std::move(task), targetTime }); +} + +} // namespace flutter diff --git a/adapter/preview/external/flutter/main_event_loop.h b/adapter/preview/external/flutter/main_event_loop.h new file mode 100644 index 00000000000..448a6f4659d --- /dev/null +++ b/adapter/preview/external/flutter/main_event_loop.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023 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_PREVIEW_EXTERNAL_EVENT_LOOP_MAIN_EVENT_LOOP_H +#define FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_EVENT_LOOP_MAIN_EVENT_LOOP_H + +#include +#include +#include + +#include "flutter/fml/delayed_task.h" + +namespace flutter { +class MainEventLoop { +public: + static MainEventLoop& GetInstance(); + ~MainEventLoop(); + // Determine whether the thread that post the task is the same as the thread where the event loop is located. + bool RunsTasksOnCurrentThread() const; + // Post a tasks to the event loop. + void PostTask(fml::closure task, fml::TimePoint targetTime); + // Execute all tasks in the task queue + void Run(); + +private: + MainEventLoop(std::thread::id mainThreadId); + MainEventLoop(const MainEventLoop&) = delete; + MainEventLoop& operator=(const MainEventLoop&) = delete; + std::thread::id mainThreadId_; + std::mutex taskQueueMutex_; + fml::DelayedTaskQueue taskQueue_; +}; + +} // namespace flutter + +#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_EVENT_LOOP_MAIN_EVENT_LOOP_H diff --git a/adapter/preview/external/flutter/platform_task_runner.cpp b/adapter/preview/external/flutter/platform_task_runner.cpp new file mode 100644 index 00000000000..92dca0b827c --- /dev/null +++ b/adapter/preview/external/flutter/platform_task_runner.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 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. + */ + +#include "adapter/preview/external/flutter/platform_task_runner.h" + +#include "adapter/preview/external/flutter/platform_task_runner_adapter.h" + +namespace flutter { + +fml::RefPtr PlatformTaskRunner::CurrentTaskRunner(bool useCurrentEventRunner) +{ + return PlatformTaskRunnerAdapter::CurrentTaskRunner(useCurrentEventRunner); +} + +} // namespace flutter diff --git a/adapter/preview/external/flutter/platform_task_runner.h b/adapter/preview/external/flutter/platform_task_runner.h new file mode 100644 index 00000000000..69423e85804 --- /dev/null +++ b/adapter/preview/external/flutter/platform_task_runner.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023 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_PREVIEW_EXTERNAL_EVENT_LOOP_PLATFORM_TASK_RUNNER_H +#define FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_EVENT_LOOP_PLATFORM_TASK_RUNNER_H + +#include "flutter/fml/message_loop_impl.h" +#include "flutter/fml/message_loop_task_queues.h" + +namespace flutter { + +class PlatformTaskRunner { +public: + static fml::RefPtr CurrentTaskRunner(bool useCurrentEventRunner = false); +}; + +} // namespace flutter + +#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_EVENT_LOOP_PLATFORM_TASK_RUNNER_H diff --git a/adapter/preview/external/flutter/platform_task_runner_adapter.cpp b/adapter/preview/external/flutter/platform_task_runner_adapter.cpp new file mode 100644 index 00000000000..5b337b2437c --- /dev/null +++ b/adapter/preview/external/flutter/platform_task_runner_adapter.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 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. + */ + +#include "adapter/preview/external/flutter/platform_task_runner_adapter.h" + +#include "flutter/fml/time/time_point.h" +namespace flutter { + +PlatformTaskRunnerAdapter::PlatformTaskRunnerAdapter(bool useCurrentEventRunner) : fml::TaskRunner(nullptr) {} + +void PlatformTaskRunnerAdapter::PostTask(fml::closure task) +{ + MainEventLoop::GetInstance().PostTask(std::move(task), fml::TimePoint::Now()); +} + +void PlatformTaskRunnerAdapter::PostTaskForTime(fml::closure task, fml::TimePoint target_time) +{ + MainEventLoop::GetInstance().PostTask(std::move(task), target_time); +} + +void PlatformTaskRunnerAdapter::PostDelayedTask(fml::closure task, fml::TimeDelta delay) +{ + MainEventLoop::GetInstance().PostTask(std::move(task), fml::TimePoint::Now() + delay); +} + +bool PlatformTaskRunnerAdapter::RunsTasksOnCurrentThread() +{ + return MainEventLoop::GetInstance().RunsTasksOnCurrentThread(); +} + +fml::TaskQueueId PlatformTaskRunnerAdapter::GetTaskQueueId() +{ + return fml::_kUnmerged; +} + +fml::RefPtr PlatformTaskRunnerAdapter::CurrentTaskRunner(bool useCurrentEventRunner) +{ + static fml::RefPtr taskRunner_ = + fml::MakeRefCounted(useCurrentEventRunner); + return taskRunner_; +} + +} // namespace flutter diff --git a/adapter/preview/external/flutter/platform_task_runner_adapter.h b/adapter/preview/external/flutter/platform_task_runner_adapter.h new file mode 100644 index 00000000000..770eb03df67 --- /dev/null +++ b/adapter/preview/external/flutter/platform_task_runner_adapter.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023 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_PREVIEW_EXTERNAL_EVENT_LOOP_PLATFORM_TASK_RUNNER_ADAPTER_H +#define FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_EVENT_LOOP_PLATFORM_TASK_RUNNER_ADAPTER_H + +#include "flutter/fml/message_loop_impl.h" +#include "flutter/fml/message_loop_task_queues.h" + +#include "adapter/preview/external/flutter/main_event_loop.h" + +namespace flutter { + +class PlatformTaskRunnerAdapter : public fml::TaskRunner { +public: + explicit PlatformTaskRunnerAdapter(bool useCurrentEventRunner); + ~PlatformTaskRunnerAdapter() = default; + void PostTask(fml::closure task) override; + void PostTaskForTime(fml::closure task, fml::TimePoint target_time) override; + void PostDelayedTask(fml::closure task, fml::TimeDelta delay) override; + bool RunsTasksOnCurrentThread() override; + fml::TaskQueueId GetTaskQueueId() override; + static fml::RefPtr CurrentTaskRunner(bool useCurrentEventRunner = false); +}; + +} // namespace flutter + +#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_EVENT_LOOP_PLATFORM_TASK_RUNNER_ADAPTER_H diff --git a/frameworks/core/components_ng/render/adapter/window_prviewer.h b/adapter/preview/external/window/window_preview.h similarity index 90% rename from frameworks/core/components_ng/render/adapter/window_prviewer.h rename to adapter/preview/external/window/window_preview.h index 2ee5f55f2ba..b0c8ff192be 100644 --- a/frameworks/core/components_ng/render/adapter/window_prviewer.h +++ b/adapter/preview/external/window/window_preview.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_WINDOW_PREVIEWER_H -#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_WINDOW_PREVIEWER_H +#ifndef FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_WINDOW_WINDOW_PREVIEWER_H +#define FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_WINDOW_WINDOW_PREVIEWER_H #include #include @@ -26,7 +26,6 @@ #include #include -#include "adapter/preview/entrance/rs_ace_view.h" #include "base/thread/sem_queue.h" #include "base/utils/time_util.h" #include "core/common/window.h" @@ -95,6 +94,8 @@ public: vsyncCallbacks_.clear(); } } + +private: std::shared_ptr surfaceNode_; std::vector> vsyncCallbacks_; std::vector> pendingVsyncCallbacks_; @@ -105,4 +106,4 @@ public: } // namespace Rosen } // namespace OHOS -#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_WINDOW_PREVIEWER_H +#endif // FOUNDATION_ACE_ADAPTER_PREVIEW_EXTERNAL_WINDOW_WINDOW_PREVIEWER_H diff --git a/frameworks/bridge/js_frontend/engine/jsi/BUILD.gn b/frameworks/bridge/js_frontend/engine/jsi/BUILD.gn index 25451273a13..0a8dd518a1b 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/BUILD.gn +++ b/frameworks/bridge/js_frontend/engine/jsi/BUILD.gn @@ -73,6 +73,9 @@ template("js_engine_ark") { "jsi_stepper_bridge.cpp", ] + include_dirs = [ "$flutter_root/engine" ] + cflags_cc = [ "-Wno-thread-safety-attributes" ] + # xcomponent components supports phone, TV and wearable except PC Preview if (defined(config.xcomponent_components_support) && config.xcomponent_components_support) { diff --git a/frameworks/core/common/flutter/flutter_task_executor.cpp b/frameworks/core/common/flutter/flutter_task_executor.cpp index 66849829f3d..69f7d410778 100644 --- a/frameworks/core/common/flutter/flutter_task_executor.cpp +++ b/frameworks/core/common/flutter/flutter_task_executor.cpp @@ -33,6 +33,8 @@ #include "flutter/fml/message_loop.h" #if defined(OHOS_STANDARD_SYSTEM) || defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM) #include "flutter/shell/platform/ohos/platform_task_runner.h" +#elif defined(PREVIEW) +#include "adapter/preview/external/flutter/platform_task_runner.h" #endif #include "base/log/log.h" @@ -134,7 +136,7 @@ FlutterTaskExecutor::~FlutterTaskExecutor() void FlutterTaskExecutor::InitPlatformThread(bool useCurrentEventRunner, bool isStageModel) { -#ifdef OHOS_STANDARD_SYSTEM +#if defined(OHOS_STANDARD_SYSTEM) || defined(PREVIEW) platformRunner_ = flutter::PlatformTaskRunner::CurrentTaskRunner(useCurrentEventRunner); #else #if defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM) diff --git a/frameworks/core/common/flutter/flutter_thread_model.cpp b/frameworks/core/common/flutter/flutter_thread_model.cpp index 3aa1ac986f4..093914072d6 100644 --- a/frameworks/core/common/flutter/flutter_thread_model.cpp +++ b/frameworks/core/common/flutter/flutter_thread_model.cpp @@ -26,6 +26,8 @@ #include "flutter/fml/message_loop.h" #if defined(OHOS_PLATFORM) || defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM) #include "flutter/shell/platform/ohos/platform_task_runner_adapter.h" +#elif defined(PREVIEW) +#include "adapter/preview/external/flutter/platform_task_runner_adapter.h" #endif #include "shell/common/thread_host.h" @@ -53,7 +55,7 @@ std::unique_ptr FlutterThreadModel::CreateThreadModel( fml::RefPtr gpuRunner; fml::RefPtr uiRunner; -#ifdef OHOS_PLATFORM +#if defined(OHOS_PLATFORM) || defined(PREVIEW) fml::RefPtr platformRunner = flutter::PlatformTaskRunnerAdapter::CurrentTaskRunner(useCurrentEventRunner); #else diff --git a/frameworks/core/components_ng/render/adapter/rosen_window.h b/frameworks/core/components_ng/render/adapter/rosen_window.h index f22e80b8b2d..f66740e3281 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_window.h +++ b/frameworks/core/components_ng/render/adapter/rosen_window.h @@ -29,7 +29,7 @@ #include "adapter/android/entrance/java/jni/virtual_rs_window.h" #endif #else -#include "window_prviewer.h" +#include "adapter/preview/external/window/window_preview.h" #endif #include "base/thread/task_executor.h" -- Gitee