提交 4effc3e9 编写于 作者: J Jason Simmons

Merge pull request #2149 from jason-simmons/platform_locale

Tell Flutter about the host platform's locale
...@@ -9,6 +9,7 @@ dart:ui,::,_getPrintClosure ...@@ -9,6 +9,7 @@ dart:ui,::,_getPrintClosure
dart:ui,::,_getScheduleMicrotaskClosure dart:ui,::,_getScheduleMicrotaskClosure
dart:ui,::,_popRoute dart:ui,::,_popRoute
dart:ui,::,_pushRoute dart:ui,::,_pushRoute
dart:ui,::,_updateLocale
dart:ui,::,_updateWindowMetrics dart:ui,::,_updateWindowMetrics
dart:ui,Canvas,Canvas. dart:ui,Canvas,Canvas.
dart:ui,Drawable,Drawable. dart:ui,Drawable,Drawable.
......
...@@ -20,6 +20,12 @@ void _updateWindowMetrics(double devicePixelRatio, ...@@ -20,6 +20,12 @@ void _updateWindowMetrics(double devicePixelRatio,
window.onMetricsChanged(); window.onMetricsChanged();
} }
void _updateLocale(String languageCode, String countryCode) {
window._locale = new Locale(languageCode, countryCode);
if (window.onLocaleChanged != null)
window.onLocaleChanged();
}
void _pushRoute(String route) { void _pushRoute(String route) {
assert(window.defaultRouteName == null); assert(window.defaultRouteName == null);
window.defaultRouteName = route; window.defaultRouteName = route;
......
...@@ -18,6 +18,15 @@ class WindowPadding { ...@@ -18,6 +18,15 @@ class WindowPadding {
final double left; final double left;
} }
class Locale {
Locale(this.languageCode, this.countryCode);
final String languageCode;
final String countryCode;
String toString() => '${languageCode}_$countryCode';
}
class Window { class Window {
Window._(); Window._();
...@@ -30,10 +39,14 @@ class Window { ...@@ -30,10 +39,14 @@ class Window {
WindowPadding get padding => _padding; WindowPadding get padding => _padding;
WindowPadding _padding; WindowPadding _padding;
Locale get locale => _locale;
Locale _locale;
_FrameCallback onBeginFrame; _FrameCallback onBeginFrame;
_EventCallback onEvent; // TODO(abarth): Remove. _EventCallback onEvent; // TODO(abarth): Remove.
_PointerPacketCallback onPointerPacket; _PointerPacketCallback onPointerPacket;
VoidCallback onMetricsChanged; VoidCallback onMetricsChanged;
VoidCallback onLocaleChanged;
String defaultRouteName; String defaultRouteName;
VoidCallback onPopRoute; VoidCallback onPopRoute;
......
...@@ -66,6 +66,19 @@ void Window::UpdateWindowMetrics(const SkyDisplayMetrics& metrics) { ...@@ -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) { void Window::PushRoute(const std::string& route) {
DartState* dart_state = library_.dart_state().get(); DartState* dart_state = library_.dart_state().get();
if (!dart_state) if (!dart_state)
......
...@@ -33,6 +33,8 @@ class Window { ...@@ -33,6 +33,8 @@ class Window {
void DidCreateIsolate(); void DidCreateIsolate();
void UpdateWindowMetrics(const SkyDisplayMetrics& metrics); void UpdateWindowMetrics(const SkyDisplayMetrics& metrics);
void UpdateLocale(const std::string& language_code,
const std::string& country_code);
void DispatchPointerPacket(const pointer::PointerPacketPtr& packet); void DispatchPointerPacket(const pointer::PointerPacketPtr& packet);
void BeginFrame(base::TimeTicks frameTime); void BeginFrame(base::TimeTicks frameTime);
......
...@@ -33,6 +33,16 @@ void SkyView::SetDisplayMetrics(const SkyDisplayMetrics& metrics) { ...@@ -33,6 +33,16 @@ void SkyView::SetDisplayMetrics(const SkyDisplayMetrics& metrics) {
GetWindow()->UpdateWindowMetrics(display_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) { void SkyView::PushRoute(const std::string& route) {
GetWindow()->PushRoute(route); GetWindow()->PushRoute(route);
} }
...@@ -54,6 +64,7 @@ void SkyView::CreateView(const String& name) { ...@@ -54,6 +64,7 @@ void SkyView::CreateView(const String& name) {
client_->DidCreateIsolate(dart_state->isolate()); client_->DidCreateIsolate(dart_state->isolate());
GetWindow()->UpdateWindowMetrics(display_metrics_); GetWindow()->UpdateWindowMetrics(display_metrics_);
GetWindow()->UpdateLocale(language_code_, country_code_);
} }
void SkyView::RunFromLibrary(const WebString& name, void SkyView::RunFromLibrary(const WebString& name,
......
...@@ -38,6 +38,8 @@ class SkyView : public WindowClient { ...@@ -38,6 +38,8 @@ class SkyView : public WindowClient {
const SkyDisplayMetrics& display_metrics() const { return display_metrics_; } const SkyDisplayMetrics& display_metrics() const { return display_metrics_; }
void SetDisplayMetrics(const SkyDisplayMetrics& 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 PushRoute(const std::string& route);
void PopRoute(); void PopRoute();
...@@ -64,6 +66,8 @@ class SkyView : public WindowClient { ...@@ -64,6 +66,8 @@ class SkyView : public WindowClient {
SkyViewClient* client_; SkyViewClient* client_;
SkyDisplayMetrics display_metrics_; SkyDisplayMetrics display_metrics_;
std::string language_code_;
std::string country_code_;
std::unique_ptr<DartController> dart_controller_; std::unique_ptr<DartController> dart_controller_;
std::unique_ptr<sky::compositor::LayerTree> layer_tree_; std::unique_ptr<sky::compositor::LayerTree> layer_tree_;
......
...@@ -36,6 +36,7 @@ interface SkyEngine { ...@@ -36,6 +36,7 @@ interface SkyEngine {
OnActivityResumed(); OnActivityResumed();
OnViewportMetricsChanged(ViewportMetrics metrics); OnViewportMetricsChanged(ViewportMetrics metrics);
OnLocaleChanged(string language_code, string country_code);
OnPointerPacket(pointer.PointerPacket packet); OnPointerPacket(pointer.PointerPacket packet);
PushRoute(string route); PushRoute(string route);
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" /> <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
<application android:label="Sky Shell" android:name="SkyApplication" android:debuggable="true"> <application android:label="Sky Shell" android:name="SkyApplication" android:debuggable="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize" <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:launchMode="standard" android:launchMode="standard"
android:name="SkyActivity" android:name="SkyActivity"
......
...@@ -6,6 +6,7 @@ package org.domokit.sky.shell; ...@@ -6,6 +6,7 @@ package org.domokit.sky.shell;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
...@@ -20,6 +21,8 @@ import org.domokit.activity.ActivityImpl; ...@@ -20,6 +21,8 @@ import org.domokit.activity.ActivityImpl;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale;
/** /**
* Base class for activities that use Sky. * Base class for activities that use Sky.
...@@ -124,6 +127,10 @@ public class SkyActivity extends Activity { ...@@ -124,6 +127,10 @@ public class SkyActivity extends Activity {
protected void onSkyReady() { protected void onSkyReady() {
TraceEvent.instant("SkyActivity.onSkyReady"); TraceEvent.instant("SkyActivity.onSkyReady");
Locale locale = getResources().getConfiguration().locale;
mView.getEngine().onLocaleChanged(locale.getLanguage(),
locale.getCountry());
if (loadIntent(getIntent())) { if (loadIntent(getIntent())) {
return; return;
} }
...@@ -162,4 +169,12 @@ public class SkyActivity extends Activity { ...@@ -162,4 +169,12 @@ public class SkyActivity extends Activity {
mView.getEngine().runFromBundle(bundle.getPath()); mView.getEngine().runFromBundle(bundle.getPath());
return true; return true;
} }
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Locale locale = getResources().getConfiguration().locale;
mView.getEngine().onLocaleChanged(locale.getLanguage(),
locale.getCountry());
}
} }
...@@ -149,6 +149,14 @@ void Engine::OnViewportMetricsChanged(ViewportMetricsPtr metrics) { ...@@ -149,6 +149,14 @@ void Engine::OnViewportMetricsChanged(ViewportMetricsPtr metrics) {
sky_view_->SetDisplayMetrics(display_metrics_); sky_view_->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) { void Engine::OnPointerPacket(pointer::PointerPacketPtr packet) {
TRACE_EVENT0("flutter", "Engine::OnPointerPacket"); TRACE_EVENT0("flutter", "Engine::OnPointerPacket");
...@@ -169,6 +177,7 @@ void Engine::RunFromLibrary(const std::string& name) { ...@@ -169,6 +177,7 @@ void Engine::RunFromLibrary(const std::string& name) {
sky_view_->RunFromLibrary(blink::WebString::fromUTF8(name), sky_view_->RunFromLibrary(blink::WebString::fromUTF8(name),
dart_library_provider_.get()); dart_library_provider_.get());
sky_view_->SetDisplayMetrics(display_metrics_); sky_view_->SetDisplayMetrics(display_metrics_);
sky_view_->SetLocale(language_code_, country_code_);
if (!initial_route_.empty()) if (!initial_route_.empty())
sky_view_->PushRoute(initial_route_); sky_view_->PushRoute(initial_route_);
} }
...@@ -181,6 +190,7 @@ void Engine::RunFromSnapshotStream( ...@@ -181,6 +190,7 @@ void Engine::RunFromSnapshotStream(
sky_view_->CreateView(blink::WebString::fromUTF8(name)); sky_view_->CreateView(blink::WebString::fromUTF8(name));
sky_view_->RunFromSnapshot(blink::WebString::fromUTF8(name), snapshot.Pass()); sky_view_->RunFromSnapshot(blink::WebString::fromUTF8(name), snapshot.Pass());
sky_view_->SetDisplayMetrics(display_metrics_); sky_view_->SetDisplayMetrics(display_metrics_);
sky_view_->SetLocale(language_code_, country_code_);
if (!initial_route_.empty()) if (!initial_route_.empty())
sky_view_->PushRoute(initial_route_); sky_view_->PushRoute(initial_route_);
} }
...@@ -196,6 +206,7 @@ void Engine::RunFromPrecompiledSnapshot(const mojo::String& bundle_path) { ...@@ -196,6 +206,7 @@ void Engine::RunFromPrecompiledSnapshot(const mojo::String& bundle_path) {
sky_view_->CreateView("http://localhost"); sky_view_->CreateView("http://localhost");
sky_view_->RunFromPrecompiledSnapshot(); sky_view_->RunFromPrecompiledSnapshot();
sky_view_->SetDisplayMetrics(display_metrics_); sky_view_->SetDisplayMetrics(display_metrics_);
sky_view_->SetLocale(language_code_, country_code_);
if (!initial_route_.empty()) if (!initial_route_.empty())
sky_view_->PushRoute(initial_route_); sky_view_->PushRoute(initial_route_);
} }
......
...@@ -58,6 +58,8 @@ class Engine : public UIDelegate, ...@@ -58,6 +58,8 @@ class Engine : public UIDelegate,
// SkyEngine implementation: // SkyEngine implementation:
void SetServices(ServicesDataPtr services) override; void SetServices(ServicesDataPtr services) override;
void OnViewportMetricsChanged(ViewportMetricsPtr metrics) 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 OnPointerPacket(pointer::PointerPacketPtr packet) override;
void RunFromFile(const mojo::String& main, void RunFromFile(const mojo::String& main,
...@@ -94,6 +96,8 @@ class Engine : public UIDelegate, ...@@ -94,6 +96,8 @@ class Engine : public UIDelegate,
gfx::Size physical_size_; gfx::Size physical_size_;
std::string initial_route_; std::string initial_route_;
blink::SkyDisplayMetrics display_metrics_; blink::SkyDisplayMetrics display_metrics_;
std::string language_code_;
std::string country_code_;
mojo::Binding<SkyEngine> binding_; mojo::Binding<SkyEngine> binding_;
// TODO(eseidel): This should move into an AnimatorStateMachine. // TODO(eseidel): This should move into an AnimatorStateMachine.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册