From 80bc6d25c90491e00f5d4fed6ef56aebcb8480c6 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Thu, 1 Jun 2017 21:55:02 +0200 Subject: [PATCH 1/3] Add setInitialRoute on FlutterView. --- lib/ui/hooks.dart | 18 ------------------ lib/ui/window.dart | 4 ++-- lib/ui/window/window.cc | 6 ++++++ lib/ui/window/window.h | 1 + runtime/runtime_controller.cc | 4 ++++ runtime/runtime_controller.h | 1 + runtime/runtime_delegate.h | 1 + shell/common/engine.cc | 12 ++++++++++++ shell/common/engine.h | 2 ++ .../android/io/flutter/view/FlutterView.java | 4 ++++ 10 files changed, 33 insertions(+), 20 deletions(-) diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index b2a481eed5f76..9967529e5bdec 100644 --- a/lib/ui/hooks.dart +++ b/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/lib/ui/window.dart b/lib/ui/window.dart index eceef0df62ecd..be76bba91d037 100644 --- a/lib/ui/window.dart +++ b/lib/ui/window.dart @@ -205,8 +205,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/lib/ui/window/window.cc b/lib/ui/window/window.cc index 16418b7060b3b..037c277b25e86 100644 --- a/lib/ui/window/window.cc +++ b/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, Dart_NewStringFromCString(routeName.c_str())); +} + 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/lib/ui/window/window.h b/lib/ui/window/window.h index 7e76ba7b42c69..e875f09082f1d 100644 --- a/lib/ui/window/window.h +++ b/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/runtime/runtime_controller.cc b/runtime/runtime_controller.cc index bf9586ef1a442..cf27b74ec111d 100644 --- a/runtime/runtime_controller.cc +++ b/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/runtime/runtime_controller.h b/runtime/runtime_controller.h index 7f2fadf0dff9d..6d8f9f96c96fa 100644 --- a/runtime/runtime_controller.h +++ b/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/runtime/runtime_delegate.h b/runtime/runtime_delegate.h index 5c3125fbb4d49..e9c8d15c6f4b8 100644 --- a/runtime/runtime_delegate.h +++ b/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/shell/common/engine.cc b/shell/common/engine.cc index 55a658bfb6327..57db61a34339f 100644 --- a/shell/common/engine.cc +++ b/shell/common/engine.cc @@ -341,6 +341,11 @@ bool Engine::HandleNavigationPlatformMessage( return false; auto root = document.GetObject(); auto method = root.FindMember("method"); + if (method->value == "setInitialRoute") { + auto route = root.FindMember("args"); + initial_route_ = std::move(route->value.GetString()); + return false; + } if (method == root.MemberEnd() || method->value != "pushRoute") return false; @@ -450,6 +455,13 @@ void Engine::StartAnimatorIfPossible() { animator_->Start(); } +std::string Engine::DefaultRouteName() { + if (!initial_route_.empty()) { + return initial_route_; + } + return std::string("/"); +} + void Engine::ScheduleFrame() { animator_->RequestFrame(); } diff --git a/shell/common/engine.h b/shell/common/engine.h index 832b684a19840..dc5d0169e1d57 100644 --- a/shell/common/engine.h +++ b/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; @@ -99,6 +100,7 @@ class Engine : public blink::RuntimeDelegate { 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/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index aa2af85b7a584..b10e5c381a0b1 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -246,6 +246,10 @@ public void onMemoryPressure() { mFlutterSystemChannel.send(message); } + public void setInitialRoute(String route) { + mFlutterNavigationChannel.invokeMethod("setInitialRoute", route); + } + public void pushRoute(String route) { mFlutterNavigationChannel.invokeMethod("pushRoute", route); } From 22e9f9bbbd996807fbbc5db2f24510a36b9c5eb8 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Fri, 2 Jun 2017 13:37:04 +0200 Subject: [PATCH 2/3] some cleanup --- shell/common/engine.cc | 15 ++++----------- shell/common/engine.h | 1 - 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/shell/common/engine.cc b/shell/common/engine.cc index 57db61a34339f..5dc3eb055e374 100644 --- a/shell/common/engine.cc +++ b/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,15 +341,10 @@ bool Engine::HandleNavigationPlatformMessage( return false; auto root = document.GetObject(); auto method = root.FindMember("method"); - if (method->value == "setInitialRoute") { - auto route = root.FindMember("args"); - initial_route_ = std::move(route->value.GetString()); + if (method->value != "setInitialRoute") return false; - } - if (method == root.MemberEnd() || method->value != "pushRoute") - return false; - - pending_push_route_message_ = std::move(message); + auto route = root.FindMember("args"); + initial_route_ = std::move(route->value.GetString()); return true; } @@ -432,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) { diff --git a/shell/common/engine.h b/shell/common/engine.h index dc5d0169e1d57..daefa1b52529f 100644 --- a/shell/common/engine.h +++ b/shell/common/engine.h @@ -99,7 +99,6 @@ 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_; From 2fc8eb9978bd05854df684f1bc3132be86ab38c4 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Tue, 6 Jun 2017 10:48:02 +0200 Subject: [PATCH 3/3] comments --- lib/ui/window/window.cc | 4 ++-- shell/common/engine.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ui/window/window.cc b/lib/ui/window/window.cc index 037c277b25e86..88bb4d0ddc502 100644 --- a/lib/ui/window/window.cc +++ b/lib/ui/window/window.cc @@ -40,8 +40,8 @@ Dart_Handle ToByteData(const std::vector& buffer) { } void DefaultRouteName(Dart_NativeArguments args) { - std::string routeName = UIDartState::Current()->window()->client()->DefaultRouteName(); - Dart_SetReturnValue(args, Dart_NewStringFromCString(routeName.c_str())); + std::string routeName = UIDartState::Current()->window()->client()->DefaultRouteName(); + Dart_SetReturnValue(args, StdStringToDart(routeName)); } void ScheduleFrame(Dart_NativeArguments args) { diff --git a/shell/common/engine.cc b/shell/common/engine.cc index 5dc3eb055e374..a85b1c651df62 100644 --- a/shell/common/engine.cc +++ b/shell/common/engine.cc @@ -452,7 +452,7 @@ std::string Engine::DefaultRouteName() { if (!initial_route_.empty()) { return initial_route_; } - return std::string("/"); + return "/"; } void Engine::ScheduleFrame() {