Re-land "Buffer lifecycle in WindowData" (flutter/engine#8032)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -217,6 +217,18 @@ void Window::UpdateUserSettingsData(const std::string& data) {
|
||||
}));
|
||||
}
|
||||
|
||||
void Window::UpdateLifecycleState(const std::string& data) {
|
||||
std::shared_ptr<tonic::DartState> 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<tonic::DartState> dart_state = library_.dart_state().lock();
|
||||
if (!dart_state)
|
||||
|
||||
@@ -65,6 +65,7 @@ class Window final {
|
||||
void UpdateWindowMetrics(const ViewportMetrics& metrics);
|
||||
void UpdateLocales(const std::vector<std::string>& 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<PlatformMessage> message);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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<std::string> 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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user