提交 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
dart:ui,::,_getScheduleMicrotaskClosure
dart:ui,::,_popRoute
dart:ui,::,_pushRoute
dart:ui,::,_updateLocale
dart:ui,::,_updateWindowMetrics
dart:ui,Canvas,Canvas.
dart:ui,Drawable,Drawable.
......
......@@ -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;
......
......@@ -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;
......
......@@ -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)
......
......@@ -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);
......
......@@ -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,
......
......@@ -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<DartController> dart_controller_;
std::unique_ptr<sky::compositor::LayerTree> layer_tree_;
......
......@@ -36,6 +36,7 @@ interface SkyEngine {
OnActivityResumed();
OnViewportMetricsChanged(ViewportMetrics metrics);
OnLocaleChanged(string language_code, string country_code);
OnPointerPacket(pointer.PointerPacket packet);
PushRoute(string route);
......
......@@ -11,7 +11,7 @@
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="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:launchMode="standard"
android:name="SkyActivity"
......
......@@ -6,6 +6,7 @@ package org.domokit.sky.shell;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
......@@ -20,6 +21,8 @@ import org.domokit.activity.ActivityImpl;
import java.io.File;
import java.util.ArrayList;
import java.util.Locale;
/**
* Base class for activities that use Sky.
......@@ -124,6 +127,10 @@ public class SkyActivity extends Activity {
protected void onSkyReady() {
TraceEvent.instant("SkyActivity.onSkyReady");
Locale locale = getResources().getConfiguration().locale;
mView.getEngine().onLocaleChanged(locale.getLanguage(),
locale.getCountry());
if (loadIntent(getIntent())) {
return;
}
......@@ -162,4 +169,12 @@ public class SkyActivity extends Activity {
mView.getEngine().runFromBundle(bundle.getPath());
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) {
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) {
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_);
}
......
......@@ -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<SkyEngine> binding_;
// 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.
先完成此消息的编辑!
想要评论请 注册