From 3661d5e43b83106498e3a4ce2226f976cebed021 Mon Sep 17 00:00:00 2001 From: Gary Qian Date: Wed, 6 Mar 2019 15:38:34 -0800 Subject: [PATCH] Re-land "Buffer lifecycle in WindowData" (#8032) --- lib/stub_ui/hooks.dart | 4 ++++ lib/stub_ui/window.dart | 9 +++++++++ lib/ui/hooks.dart | 7 +++++++ lib/ui/window.dart | 9 +++++++++ lib/ui/window/window.cc | 12 ++++++++++++ lib/ui/window/window.h | 1 + runtime/runtime_controller.cc | 14 +++++++++++++- runtime/runtime_controller.h | 3 +++ shell/common/engine.cc | 2 ++ 9 files changed, 60 insertions(+), 1 deletion(-) diff --git a/lib/stub_ui/hooks.dart b/lib/stub_ui/hooks.dart index 6e08208329..4ea381bfb8 100644 --- a/lib/stub_ui/hooks.dart +++ b/lib/stub_ui/hooks.dart @@ -84,6 +84,10 @@ void _updateUserSettingsData(String jsonData) { _updateAlwaysUse24HourFormat(data['alwaysUse24HourFormat']); } +void _updateLifecycleState(String state) { + window._initialLifecycleState ??= state; +} + void _updateTextScaleFactor(double textScaleFactor) { window._textScaleFactor = textScaleFactor; _invoke(window.onTextScaleFactorChanged, window._onTextScaleFactorChangedZone); diff --git a/lib/stub_ui/window.dart b/lib/stub_ui/window.dart index bc08ca95c3..f3dedc6428 100644 --- a/lib/stub_ui/window.dart +++ b/lib/stub_ui/window.dart @@ -551,6 +551,15 @@ class Window { _onLocaleChangedZone = Zone.current; } + /// The lifecycle state immediately after dart isolate initialization. + /// + /// This property will not be updated as the lifecycle changes. + /// + /// It is used to initialize [SchedulerBinding.lifecycleState] at startup + /// with any buffered lifecycle state events. + String get initialLifecycleState => _initialLifecycleState; + String _initialLifecycleState; + /// The setting indicating the current brightness mode of the host platform. /// If the platform has no preference, [platformBrightness] defaults to [Brightness.light]. Brightness get platformBrightness => _platformBrightness; diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index e88580a95c..4d299c91a2 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -89,6 +89,13 @@ void _updateUserSettingsData(String jsonData) { _updatePlatformBrightness(data['platformBrightness']); } +@pragma('vm:entry-point') +// ignore: unused_element +void _updateLifecycleState(String state) { + window._initialLifecycleState ??= state; +} + + void _updateTextScaleFactor(double textScaleFactor) { window._textScaleFactor = textScaleFactor; _invoke(window.onTextScaleFactorChanged, window._onTextScaleFactorChangedZone); diff --git a/lib/ui/window.dart b/lib/ui/window.dart index d89b668b70..6abceceb02 100644 --- a/lib/ui/window.dart +++ b/lib/ui/window.dart @@ -556,6 +556,15 @@ class Window { _onLocaleChangedZone = Zone.current; } + /// The lifecycle state immediately after dart isolate initialization. + /// + /// This property will not be updated as the lifecycle changes. + /// + /// It is used to initialize [SchedulerBinding.lifecycleState] at startup + /// with any buffered lifecycle state events. + String get initialLifecycleState => _initialLifecycleState; + String _initialLifecycleState; + /// The system-reported text scale. /// /// This establishes the text scaling factor to use when rendering text, diff --git a/lib/ui/window/window.cc b/lib/ui/window/window.cc index 0a90d6fcbf..bfeb86cef6 100644 --- a/lib/ui/window/window.cc +++ b/lib/ui/window/window.cc @@ -217,6 +217,18 @@ void Window::UpdateUserSettingsData(const std::string& data) { })); } +void Window::UpdateLifecycleState(const std::string& data) { + std::shared_ptr dart_state = library_.dart_state().lock(); + if (!dart_state) + return; + tonic::DartState::Scope scope(dart_state); + tonic::LogIfError(tonic::DartInvokeField(library_.value(), + "_updateLifecycleState", + { + tonic::StdStringToDart(data), + })); +} + void Window::UpdateSemanticsEnabled(bool enabled) { std::shared_ptr dart_state = library_.dart_state().lock(); if (!dart_state) diff --git a/lib/ui/window/window.h b/lib/ui/window/window.h index 94a506fb5f..f5624e4bad 100644 --- a/lib/ui/window/window.h +++ b/lib/ui/window/window.h @@ -65,6 +65,7 @@ class Window final { void UpdateWindowMetrics(const ViewportMetrics& metrics); void UpdateLocales(const std::vector& locales); void UpdateUserSettingsData(const std::string& data); + void UpdateLifecycleState(const std::string& data); void UpdateSemanticsEnabled(bool enabled); void UpdateAccessibilityFeatures(int32_t flags); void DispatchPlatformMessage(fml::RefPtr message); diff --git a/runtime/runtime_controller.cc b/runtime/runtime_controller.cc index b57f2232ac..83a848e879 100644 --- a/runtime/runtime_controller.cc +++ b/runtime/runtime_controller.cc @@ -128,7 +128,8 @@ bool RuntimeController::FlushRuntimeStateToIsolate() { SetLocales(window_data_.locale_data) && SetSemanticsEnabled(window_data_.semantics_enabled) && SetAccessibilityFeatures(window_data_.accessibility_feature_flags_) && - SetUserSettingsData(window_data_.user_settings_data); + SetUserSettingsData(window_data_.user_settings_data) && + SetLifecycleState(window_data_.lifecycle_state); } bool RuntimeController::SetViewportMetrics(const ViewportMetrics& metrics) { @@ -164,6 +165,17 @@ bool RuntimeController::SetUserSettingsData(const std::string& data) { return false; } +bool RuntimeController::SetLifecycleState(const std::string& data) { + window_data_.lifecycle_state = data; + + if (auto* window = GetWindowIfAvailable()) { + window->UpdateLifecycleState(window_data_.lifecycle_state); + return true; + } + + return false; +} + bool RuntimeController::SetSemanticsEnabled(bool enabled) { window_data_.semantics_enabled = enabled; diff --git a/runtime/runtime_controller.h b/runtime/runtime_controller.h index c913795b8e..03f1389d8c 100644 --- a/runtime/runtime_controller.h +++ b/runtime/runtime_controller.h @@ -49,6 +49,8 @@ class RuntimeController final : public WindowClient { bool SetUserSettingsData(const std::string& data); + bool SetLifecycleState(const std::string& data); + bool SetSemanticsEnabled(bool enabled); bool SetAccessibilityFeatures(int32_t flags); @@ -111,6 +113,7 @@ class RuntimeController final : public WindowClient { std::string variant_code; std::vector locale_data; std::string user_settings_data = "{}"; + std::string lifecycle_state; bool semantics_enabled = false; bool assistive_technology_enabled = false; int32_t accessibility_feature_flags_ = 0; diff --git a/shell/common/engine.cc b/shell/common/engine.cc index 084216072e..5b2d5a5c3d 100644 --- a/shell/common/engine.cc +++ b/shell/common/engine.cc @@ -291,6 +291,8 @@ bool Engine::HandleLifecyclePlatformMessage(blink::PlatformMessage* message) { if (state == "AppLifecycleState.resumed" && have_surface_) { ScheduleFrame(); } + runtime_controller_->SetLifecycleState(state); + // Always forward these messages to the framework by returning false. return false; } -- GitLab