From 0dd69f7b077bcde683df73f00a90ecacaa08df28 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Tue, 6 Jun 2017 10:59:41 +0200 Subject: [PATCH] Add setInitialRoute on FlutterView. (flutter/engine#3727) --- engine/src/flutter/lib/ui/hooks.dart | 18 ------------------ engine/src/flutter/lib/ui/window.dart | 4 ++-- engine/src/flutter/lib/ui/window/window.cc | 6 ++++++ engine/src/flutter/lib/ui/window/window.h | 1 + .../src/flutter/runtime/runtime_controller.cc | 4 ++++ .../src/flutter/runtime/runtime_controller.h | 1 + engine/src/flutter/runtime/runtime_delegate.h | 1 + engine/src/flutter/shell/common/engine.cc | 17 +++++++++++------ engine/src/flutter/shell/common/engine.h | 3 ++- .../android/io/flutter/view/FlutterView.java | 4 ++++ 10 files changed, 32 insertions(+), 27 deletions(-) diff --git a/engine/src/flutter/lib/ui/hooks.dart b/engine/src/flutter/lib/ui/hooks.dart index b2a481eed5f..9967529e5bd 100644 --- a/engine/src/flutter/lib/ui/hooks.dart +++ b/engine/src/flutter/lib/ui/hooks.dart @@ -40,25 +40,7 @@ void _updateSemanticsEnabled(bool enabled) { window.onSemanticsEnabledChanged(); } -void _handleNavigationMessage(ByteData data) { - if (window._defaultRouteName != null) - return; - try { - final dynamic message = _decodeJSON(_decodeUTF8(data)); - final dynamic method = message['method']; - if (method != 'pushRoute') - return; - final dynamic args = message['args']; - window._defaultRouteName = args[0]; - } catch (e) { - // We ignore any exception and just let the message be dispatched as usual. - } -} - void _dispatchPlatformMessage(String name, ByteData data, int responseId) { - if (name == 'flutter/navigation') - _handleNavigationMessage(data); - if (window.onPlatformMessage != null) { window.onPlatformMessage(name, data, (ByteData responseData) { window._respondToPlatformMessage(responseId, responseData); diff --git a/engine/src/flutter/lib/ui/window.dart b/engine/src/flutter/lib/ui/window.dart index a1c82c899f8..501dd064e64 100644 --- a/engine/src/flutter/lib/ui/window.dart +++ b/engine/src/flutter/lib/ui/window.dart @@ -275,8 +275,8 @@ class Window { /// The route or path that the operating system requested when the application /// was launched. - String get defaultRouteName => _defaultRouteName; - String _defaultRouteName; + String get defaultRouteName => _defaultRouteName(); + String _defaultRouteName() native "Window_defaultRouteName"; /// Requests that, at the next appropriate opportunity, the [onBeginFrame] /// and [onDrawFrame] callbacks be invoked. diff --git a/engine/src/flutter/lib/ui/window/window.cc b/engine/src/flutter/lib/ui/window/window.cc index 16418b7060b..88bb4d0ddc5 100644 --- a/engine/src/flutter/lib/ui/window/window.cc +++ b/engine/src/flutter/lib/ui/window/window.cc @@ -39,6 +39,11 @@ Dart_Handle ToByteData(const std::vector& buffer) { return data_handle; } +void DefaultRouteName(Dart_NativeArguments args) { + std::string routeName = UIDartState::Current()->window()->client()->DefaultRouteName(); + Dart_SetReturnValue(args, StdStringToDart(routeName)); +} + void ScheduleFrame(Dart_NativeArguments args) { UIDartState::Current()->window()->client()->ScheduleFrame(); } @@ -253,6 +258,7 @@ void Window::CompletePlatformMessageResponse(int response_id, void Window::RegisterNatives(tonic::DartLibraryNatives* natives) { natives->Register({ + {"Window_defaultRouteName", DefaultRouteName, 1, true}, {"Window_scheduleFrame", ScheduleFrame, 1, true}, {"Window_sendPlatformMessage", _SendPlatformMessage, 4, true}, {"Window_respondToPlatformMessage", _RespondToPlatformMessage, 3, true}, diff --git a/engine/src/flutter/lib/ui/window/window.h b/engine/src/flutter/lib/ui/window/window.h index 7e76ba7b42c..e875f09082f 100644 --- a/engine/src/flutter/lib/ui/window/window.h +++ b/engine/src/flutter/lib/ui/window/window.h @@ -23,6 +23,7 @@ class Scene; class WindowClient { public: + virtual std::string DefaultRouteName() = 0; virtual void ScheduleFrame() = 0; virtual void Render(Scene* scene) = 0; virtual void UpdateSemantics(SemanticsUpdate* update) = 0; diff --git a/engine/src/flutter/runtime/runtime_controller.cc b/engine/src/flutter/runtime/runtime_controller.cc index bf9586ef1a4..cf27b74ec11 100644 --- a/engine/src/flutter/runtime/runtime_controller.cc +++ b/engine/src/flutter/runtime/runtime_controller.cc @@ -98,6 +98,10 @@ Window* RuntimeController::GetWindow() { return dart_controller_->dart_state()->window(); } +std::string RuntimeController::DefaultRouteName() { + return client_->DefaultRouteName(); +} + void RuntimeController::ScheduleFrame() { client_->ScheduleFrame(); } diff --git a/engine/src/flutter/runtime/runtime_controller.h b/engine/src/flutter/runtime/runtime_controller.h index 7f2fadf0dff..6d8f9f96c96 100644 --- a/engine/src/flutter/runtime/runtime_controller.h +++ b/engine/src/flutter/runtime/runtime_controller.h @@ -52,6 +52,7 @@ class RuntimeController : public WindowClient, public IsolateClient { Window* GetWindow(); + std::string DefaultRouteName() override; void ScheduleFrame() override; void Render(Scene* scene) override; void UpdateSemantics(SemanticsUpdate* update) override; diff --git a/engine/src/flutter/runtime/runtime_delegate.h b/engine/src/flutter/runtime/runtime_delegate.h index 5c3125fbb4d..e9c8d15c6f4 100644 --- a/engine/src/flutter/runtime/runtime_delegate.h +++ b/engine/src/flutter/runtime/runtime_delegate.h @@ -17,6 +17,7 @@ namespace blink { class RuntimeDelegate { public: + virtual std::string DefaultRouteName() = 0; virtual void ScheduleFrame() = 0; virtual void Render(std::unique_ptr layer_tree) = 0; virtual void UpdateSemantics(std::vector update) = 0; diff --git a/engine/src/flutter/shell/common/engine.cc b/engine/src/flutter/shell/common/engine.cc index 55a658bfb63..a85b1c651df 100644 --- a/engine/src/flutter/shell/common/engine.cc +++ b/engine/src/flutter/shell/common/engine.cc @@ -310,7 +310,7 @@ void Engine::DispatchPlatformMessage( return; } - // If there's no runtime_, we need to buffer some navigation messages. + // If there's no runtime_, we may still need to set the initial route. if (message->channel() == kNavigationChannel) HandleNavigationPlatformMessage(std::move(message)); } @@ -341,10 +341,10 @@ bool Engine::HandleNavigationPlatformMessage( return false; auto root = document.GetObject(); auto method = root.FindMember("method"); - if (method == root.MemberEnd() || method->value != "pushRoute") + if (method->value != "setInitialRoute") return false; - - pending_push_route_message_ = std::move(message); + auto route = root.FindMember("args"); + initial_route_ = std::move(route->value.GetString()); return true; } @@ -427,8 +427,6 @@ void Engine::ConfigureRuntime(const std::string& script_uri) { runtime_->SetViewportMetrics(viewport_metrics_); runtime_->SetLocale(language_code_, country_code_); runtime_->SetSemanticsEnabled(semantics_enabled_); - if (pending_push_route_message_) - runtime_->DispatchPlatformMessage(std::move(pending_push_route_message_)); } void Engine::DidCreateMainIsolate(Dart_Isolate isolate) { @@ -450,6 +448,13 @@ void Engine::StartAnimatorIfPossible() { animator_->Start(); } +std::string Engine::DefaultRouteName() { + if (!initial_route_.empty()) { + return initial_route_; + } + return "/"; +} + void Engine::ScheduleFrame() { animator_->RequestFrame(); } diff --git a/engine/src/flutter/shell/common/engine.h b/engine/src/flutter/shell/common/engine.h index 832b684a198..daefa1b5252 100644 --- a/engine/src/flutter/shell/common/engine.h +++ b/engine/src/flutter/shell/common/engine.h @@ -71,6 +71,7 @@ class Engine : public blink::RuntimeDelegate { private: // RuntimeDelegate methods: + std::string DefaultRouteName() override; void ScheduleFrame() override; void Render(std::unique_ptr layer_tree) override; void UpdateSemantics(std::vector update) override; @@ -98,7 +99,7 @@ class Engine : public blink::RuntimeDelegate { std::unique_ptr animator_; std::unique_ptr runtime_; tonic::DartErrorHandleType load_script_error_; - ftl::RefPtr pending_push_route_message_; + std::string initial_route_; blink::ViewportMetrics viewport_metrics_; std::string language_code_; std::string country_code_; diff --git a/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java b/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java index 8883e05792e..316ff53ec03 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java @@ -241,6 +241,10 @@ public class FlutterView extends SurfaceView mFlutterSystemChannel.send(message); } + public void setInitialRoute(String route) { + mFlutterNavigationChannel.invokeMethod("setInitialRoute", route); + } + public void pushRoute(String route) { mFlutterNavigationChannel.invokeMethod("pushRoute", route); }