// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef FLUTTER_RUNTIME_RUNTIME_CONTROLLER_H_ #define FLUTTER_RUNTIME_RUNTIME_CONTROLLER_H_ #include #include #include "flutter/common/task_runners.h" #include "flutter/flow/layers/layer_tree.h" #include "flutter/fml/macros.h" #include "flutter/lib/ui/io_manager.h" #include "flutter/lib/ui/text/font_collection.h" #include "flutter/lib/ui/ui_dart_state.h" #include "flutter/lib/ui/window/pointer_data_packet.h" #include "flutter/lib/ui/window/window.h" #include "flutter/runtime/dart_vm.h" #include "flutter/runtime/window_data.h" #include "rapidjson/document.h" #include "rapidjson/stringbuffer.h" namespace flutter { class Scene; class RuntimeDelegate; class View; class Window; class RuntimeController final : public WindowClient { public: RuntimeController( RuntimeDelegate& client, DartVM* vm, fml::RefPtr isolate_snapshot, TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, fml::RefPtr unref_queue, fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, const std::function& idle_notification_callback, const WindowData& data, const fml::closure& isolate_create_callback, const fml::closure& isolate_shutdown_callback, std::shared_ptr persistent_isolate_data); ~RuntimeController() override; std::unique_ptr Clone() const; bool SetViewportMetrics(const ViewportMetrics& metrics); bool SetLocales(const std::vector& locale_data); bool SetUserSettingsData(const std::string& data); bool SetLifecycleState(const std::string& data); bool SetSemanticsEnabled(bool enabled); bool SetAccessibilityFeatures(int32_t flags); bool BeginFrame(fml::TimePoint frame_time); bool ReportTimings(std::vector timings); bool NotifyIdle(int64_t deadline); bool IsRootIsolateRunning() const; bool DispatchPlatformMessage(fml::RefPtr message); bool DispatchPointerDataPacket(const PointerDataPacket& packet); bool DispatchSemanticsAction(int32_t id, SemanticsAction action, std::vector args); Dart_Port GetMainPort(); std::string GetIsolateName(); bool HasLivePorts(); tonic::DartErrorHandleType GetLastError(); std::weak_ptr GetRootIsolate(); std::pair GetRootIsolateReturnCode(); private: struct Locale { Locale(std::string language_code_, std::string country_code_, std::string script_code_, std::string variant_code_); ~Locale(); std::string language_code; std::string country_code; std::string script_code; std::string variant_code; }; RuntimeDelegate& client_; DartVM* const vm_; fml::RefPtr isolate_snapshot_; TaskRunners task_runners_; fml::WeakPtr snapshot_delegate_; fml::WeakPtr io_manager_; fml::RefPtr unref_queue_; fml::WeakPtr image_decoder_; std::string advisory_script_uri_; std::string advisory_script_entrypoint_; std::function idle_notification_callback_; WindowData window_data_; std::weak_ptr root_isolate_; std::pair root_isolate_return_code_ = {false, 0}; const fml::closure isolate_create_callback_; const fml::closure isolate_shutdown_callback_; std::shared_ptr persistent_isolate_data_; Window* GetWindowIfAvailable(); bool FlushRuntimeStateToIsolate(); // |WindowClient| std::string DefaultRouteName() override; // |WindowClient| void ScheduleFrame() override; // |WindowClient| void Render(Scene* scene) override; // |WindowClient| void UpdateSemantics(SemanticsUpdate* update) override; // |WindowClient| void HandlePlatformMessage(fml::RefPtr message) override; // |WindowClient| FontCollection& GetFontCollection() override; // |WindowClient| void UpdateIsolateDescription(const std::string isolate_name, int64_t isolate_port) override; // |WindowClient| void SetNeedsReportTimings(bool value) override; // |WindowClient| std::shared_ptr GetPersistentIsolateData() override; FML_DISALLOW_COPY_AND_ASSIGN(RuntimeController); }; } // namespace flutter #endif // FLUTTER_RUNTIME_RUNTIME_CONTROLLER_H_