diff --git a/sky/engine/bindings/dart_vm_entry_points.txt b/sky/engine/bindings/dart_vm_entry_points.txt index eb11fbbb7903439c8626a7e8ebdca7b78fd4f592..04995065b847cdb89d8be8d1ef450c6d0227c181 100644 --- a/sky/engine/bindings/dart_vm_entry_points.txt +++ b/sky/engine/bindings/dart_vm_entry_points.txt @@ -9,6 +9,7 @@ dart:ui,::,_getPrintClosure dart:ui,::,_getScheduleMicrotaskClosure dart:ui,::,_popRoute dart:ui,::,_pushRoute +dart:ui,::,_updateLocale dart:ui,::,_updateWindowMetrics dart:ui,Canvas,Canvas. dart:ui,Drawable,Drawable. diff --git a/sky/engine/core/dart/hooks.dart b/sky/engine/core/dart/hooks.dart index 3c6960b052e4039e70760495c958b4e8b5fcc29d..dff2b9d3cd0e87369dddc537fc91fcf432491c6d 100644 --- a/sky/engine/core/dart/hooks.dart +++ b/sky/engine/core/dart/hooks.dart @@ -20,6 +20,12 @@ void _updateWindowMetrics(double devicePixelRatio, window.onMetricsChanged(); } +void _updateLocale(String languageCode, String countryCode) { + window._locale = new Locale(languageCode, countryCode); + if (window.onLocaleChanged != null) + window.onLocaleChanged(); +} + void _pushRoute(String route) { assert(window.defaultRouteName == null); window.defaultRouteName = route; diff --git a/sky/engine/core/dart/window.dart b/sky/engine/core/dart/window.dart index 10f19c079ebcf48d22f93c4a26aad729563f8020..8ad6544872c98585f29077008c4e9ea074132a2a 100644 --- a/sky/engine/core/dart/window.dart +++ b/sky/engine/core/dart/window.dart @@ -18,6 +18,15 @@ class WindowPadding { final double left; } +class Locale { + Locale(this.languageCode, this.countryCode); + + final String languageCode; + final String countryCode; + + String toString() => '${languageCode}_$countryCode'; +} + class Window { Window._(); @@ -30,10 +39,14 @@ class Window { WindowPadding get padding => _padding; WindowPadding _padding; + Locale get locale => _locale; + Locale _locale; + _FrameCallback onBeginFrame; _EventCallback onEvent; // TODO(abarth): Remove. _PointerPacketCallback onPointerPacket; VoidCallback onMetricsChanged; + VoidCallback onLocaleChanged; String defaultRouteName; VoidCallback onPopRoute; diff --git a/sky/engine/core/window/window.cc b/sky/engine/core/window/window.cc index f78bcce601a74a15cd2121c84ac46df907f3424f..16f2e87c6be2802ad778a1aa67274793478b6771 100644 --- a/sky/engine/core/window/window.cc +++ b/sky/engine/core/window/window.cc @@ -66,6 +66,19 @@ void Window::UpdateWindowMetrics(const SkyDisplayMetrics& metrics) { }); } +void Window::UpdateLocale(const std::string& language_code, + const std::string& country_code) { + DartState* dart_state = library_.dart_state().get(); + if (!dart_state) + return; + DartState::Scope scope(dart_state); + + DartInvokeField(library_.value(), "_updateLocale", { + StdStringToDart(language_code), + StdStringToDart(country_code), + }); +} + void Window::PushRoute(const std::string& route) { DartState* dart_state = library_.dart_state().get(); if (!dart_state) diff --git a/sky/engine/core/window/window.h b/sky/engine/core/window/window.h index 828e793bc5f6736aa0775a884566880d4882c9ba..b50b395948a4d105e4adf840fe6b4c013fffa96e 100644 --- a/sky/engine/core/window/window.h +++ b/sky/engine/core/window/window.h @@ -33,6 +33,8 @@ class Window { void DidCreateIsolate(); void UpdateWindowMetrics(const SkyDisplayMetrics& metrics); + void UpdateLocale(const std::string& language_code, + const std::string& country_code); void DispatchPointerPacket(const pointer::PointerPacketPtr& packet); void BeginFrame(base::TimeTicks frameTime); diff --git a/sky/engine/public/sky/sky_view.cc b/sky/engine/public/sky/sky_view.cc index e6bf1cd814c545206a366fe87307e275281d57df..4649354d0beac7808c3a963e07c0125c522a9c6f 100644 --- a/sky/engine/public/sky/sky_view.cc +++ b/sky/engine/public/sky/sky_view.cc @@ -33,6 +33,16 @@ void SkyView::SetDisplayMetrics(const SkyDisplayMetrics& metrics) { GetWindow()->UpdateWindowMetrics(display_metrics_); } +void SkyView::SetLocale(const std::string& language_code, + const std::string& country_code) { + if (language_code_ == language_code && country_code_ == country_code) + return; + + language_code_ = language_code; + country_code_ = country_code; + GetWindow()->UpdateLocale(language_code_, country_code_); +} + void SkyView::PushRoute(const std::string& route) { GetWindow()->PushRoute(route); } @@ -54,6 +64,7 @@ void SkyView::CreateView(const String& name) { client_->DidCreateIsolate(dart_state->isolate()); GetWindow()->UpdateWindowMetrics(display_metrics_); + GetWindow()->UpdateLocale(language_code_, country_code_); } void SkyView::RunFromLibrary(const WebString& name, diff --git a/sky/engine/public/sky/sky_view.h b/sky/engine/public/sky/sky_view.h index a56a312f8c8a9c110b1029590e9c0318bb0ba976..fae5f4b7bed7b59e58067bfe3388367a3b181427 100644 --- a/sky/engine/public/sky/sky_view.h +++ b/sky/engine/public/sky/sky_view.h @@ -38,6 +38,8 @@ class SkyView : public WindowClient { const SkyDisplayMetrics& display_metrics() const { return display_metrics_; } void SetDisplayMetrics(const SkyDisplayMetrics& metrics); + void SetLocale(const std::string& language_code, + const std::string& country_code); void PushRoute(const std::string& route); void PopRoute(); @@ -64,6 +66,8 @@ class SkyView : public WindowClient { SkyViewClient* client_; SkyDisplayMetrics display_metrics_; + std::string language_code_; + std::string country_code_; std::unique_ptr dart_controller_; std::unique_ptr layer_tree_; diff --git a/sky/services/engine/sky_engine.mojom b/sky/services/engine/sky_engine.mojom index ecaafe9a9ced27671c11be7c3aa7d70b525e0443..b15ea4bd62b8ca68ba96e7e0c43280acd8aedd47 100644 --- a/sky/services/engine/sky_engine.mojom +++ b/sky/services/engine/sky_engine.mojom @@ -36,6 +36,7 @@ interface SkyEngine { OnActivityResumed(); OnViewportMetricsChanged(ViewportMetrics metrics); + OnLocaleChanged(string language_code, string country_code); OnPointerPacket(pointer.PointerPacket packet); PushRoute(string route); diff --git a/sky/shell/platform/android/AndroidManifest.xml b/sky/shell/platform/android/AndroidManifest.xml index ca7cd386000f4f6b41cd4a7831a923299b549edd..6bf2fa8fa5f256a301248eaf59e3e5f4f7787b2c 100644 --- a/sky/shell/platform/android/AndroidManifest.xml +++ b/sky/shell/platform/android/AndroidManifest.xml @@ -11,7 +11,7 @@ - SetDisplayMetrics(display_metrics_); } +void Engine::OnLocaleChanged(const mojo::String& language_code, + const mojo::String& country_code) { + language_code_ = language_code; + country_code_ = country_code; + if (sky_view_) + sky_view_->SetLocale(language_code_, country_code_); +} + void Engine::OnPointerPacket(pointer::PointerPacketPtr packet) { TRACE_EVENT0("flutter", "Engine::OnPointerPacket"); @@ -169,6 +177,7 @@ void Engine::RunFromLibrary(const std::string& name) { sky_view_->RunFromLibrary(blink::WebString::fromUTF8(name), dart_library_provider_.get()); sky_view_->SetDisplayMetrics(display_metrics_); + sky_view_->SetLocale(language_code_, country_code_); if (!initial_route_.empty()) sky_view_->PushRoute(initial_route_); } @@ -181,6 +190,7 @@ void Engine::RunFromSnapshotStream( sky_view_->CreateView(blink::WebString::fromUTF8(name)); sky_view_->RunFromSnapshot(blink::WebString::fromUTF8(name), snapshot.Pass()); sky_view_->SetDisplayMetrics(display_metrics_); + sky_view_->SetLocale(language_code_, country_code_); if (!initial_route_.empty()) sky_view_->PushRoute(initial_route_); } @@ -196,6 +206,7 @@ void Engine::RunFromPrecompiledSnapshot(const mojo::String& bundle_path) { sky_view_->CreateView("http://localhost"); sky_view_->RunFromPrecompiledSnapshot(); sky_view_->SetDisplayMetrics(display_metrics_); + sky_view_->SetLocale(language_code_, country_code_); if (!initial_route_.empty()) sky_view_->PushRoute(initial_route_); } diff --git a/sky/shell/ui/engine.h b/sky/shell/ui/engine.h index ce0355a2e8f4b123bfc157dcbea08be133448f5f..835c7e30724c411152e0f491e6f2543022e6ee69 100644 --- a/sky/shell/ui/engine.h +++ b/sky/shell/ui/engine.h @@ -58,6 +58,8 @@ class Engine : public UIDelegate, // SkyEngine implementation: void SetServices(ServicesDataPtr services) override; void OnViewportMetricsChanged(ViewportMetricsPtr metrics) override; + void OnLocaleChanged(const mojo::String& language_code, + const mojo::String& country_code) override; void OnPointerPacket(pointer::PointerPacketPtr packet) override; void RunFromFile(const mojo::String& main, @@ -94,6 +96,8 @@ class Engine : public UIDelegate, gfx::Size physical_size_; std::string initial_route_; blink::SkyDisplayMetrics display_metrics_; + std::string language_code_; + std::string country_code_; mojo::Binding binding_; // TODO(eseidel): This should move into an AnimatorStateMachine.