Chromium Code Reviews| Index: shell/android/mojo_main.cc |
| diff --git a/shell/android/mojo_main.cc b/shell/android/mojo_main.cc |
| index b8bada579f5a3bf3b9474099e8476532600bcd96..f75772e52ea5db94dceb840c47e0becbef025be8 100644 |
| --- a/shell/android/mojo_main.cc |
| +++ b/shell/android/mojo_main.cc |
| @@ -19,6 +19,11 @@ |
| #include "jni/MojoMain_jni.h" |
| #include "mojo/application_manager/application_loader.h" |
| #include "mojo/application_manager/application_manager.h" |
| +#include "mojo/application_manager/background_shell_application_loader.h" |
|
qsr
2014/12/16 09:20:49
You might not want to do this here, but this class
|
| +#include "services/gles2/gpu_impl.h" |
| +#include "services/native_viewport/native_viewport_impl.h" |
| +#include "shell/android/android_handler_loader.h" |
| +#include "shell/android/ui_application_loader_android.h" |
| #include "shell/context.h" |
| #include "shell/init.h" |
| #include "ui/gl/gl_surface_egl.h" |
| @@ -26,21 +31,86 @@ |
| using base::LazyInstance; |
| namespace mojo { |
| +namespace shell { |
| namespace { |
| LazyInstance<scoped_ptr<base::MessageLoop>> g_java_message_loop = |
| LAZY_INSTANCE_INITIALIZER; |
| -LazyInstance<scoped_ptr<shell::Context>> g_context = LAZY_INSTANCE_INITIALIZER; |
| +LazyInstance<scoped_ptr<Context>> g_context = LAZY_INSTANCE_INITIALIZER; |
| LazyInstance<scoped_ptr<base::android::JavaHandlerThread>> g_shell_thread = |
| LAZY_INSTANCE_INITIALIZER; |
| +class NativeViewportApplicationLoader : public ApplicationLoader, |
|
qsr
2014/12/16 09:20:49
You might also not want to do this here, but this
|
| + public ApplicationDelegate, |
| + public InterfaceFactory<NativeViewport>, |
| + public InterfaceFactory<Gpu> { |
| + public: |
| + NativeViewportApplicationLoader() : gpu_state_(new gles2::GpuImpl::State) {} |
| + ~NativeViewportApplicationLoader() override {} |
| + |
| + private: |
| + // ApplicationLoader implementation. |
| + void Load(ApplicationManager* manager, |
| + const GURL& url, |
| + ScopedMessagePipeHandle shell_handle, |
| + LoadCallback callback) override { |
| + DCHECK(shell_handle.is_valid()); |
| + app_.reset(new ApplicationImpl(this, shell_handle.Pass())); |
| + } |
| + |
| + void OnApplicationError(ApplicationManager* manager, |
| + const GURL& url) override {} |
| + |
| + // ApplicationDelegate implementation. |
| + bool ConfigureIncomingConnection( |
| + mojo::ApplicationConnection* connection) override { |
| + connection->AddService<NativeViewport>(this); |
| + connection->AddService<Gpu>(this); |
| + return true; |
| + } |
| + |
| + // InterfaceFactory<NativeViewport> implementation. |
| + void Create(ApplicationConnection* connection, |
| + InterfaceRequest<NativeViewport> request) override { |
| + BindToRequest(new NativeViewportImpl(app_.get(), false), &request); |
| + } |
| + |
| + // InterfaceFactory<Gpu> implementation. |
| + void Create(ApplicationConnection* connection, |
| + InterfaceRequest<Gpu> request) override { |
| + new gles2::GpuImpl(request.Pass(), gpu_state_); |
| + } |
| + |
| + scoped_refptr<gles2::GpuImpl::State> gpu_state_; |
| + scoped_ptr<ApplicationImpl> app_; |
| + DISALLOW_COPY_AND_ASSIGN(NativeViewportApplicationLoader); |
| +}; |
| + |
| +void ConfigureAndroidServices(Context* context) { |
| + context->application_manager()->SetLoaderForURL( |
| + make_scoped_ptr(new UIApplicationLoader( |
| + make_scoped_ptr(new NativeViewportApplicationLoader()), |
| + g_java_message_loop.Get().get())), |
| + GURL("mojo:native_viewport_service")); |
| + |
| + // Android handler is bundled with the Mojo shell, because it uses the |
| + // MojoShell application as the JNI bridge to bootstrap execution of other |
| + // Android Mojo apps that need JNI. |
| + scoped_ptr<BackgroundShellApplicationLoader> loader( |
| + new BackgroundShellApplicationLoader( |
| + make_scoped_ptr(new AndroidHandlerLoader()), "android_handler", |
| + base::MessageLoop::TYPE_DEFAULT)); |
| + context->application_manager()->SetLoaderForURL(loader.Pass(), |
|
qsr
2014/12/16 09:20:49
I know this is a refactoring, but any reason t use
sky
2014/12/16 16:30:17
Done.
|
| + GURL("mojo:android_handler")); |
| +} |
| + |
| void RunShell(std::vector<GURL> app_urls) { |
| - shell::Context* context = g_context.Pointer()->get(); |
| + Context* context = g_context.Pointer()->get(); |
| context->Init(); |
| - context->set_ui_loop(g_java_message_loop.Get().get()); |
| + ConfigureAndroidServices(context); |
| for (std::vector<GURL>::const_iterator it = app_urls.begin(); |
| it != app_urls.end(); ++it) { |
| context->Run(*it); |
| @@ -62,12 +132,12 @@ static void Init(JNIEnv* env, |
| base::FilePath mojo_shell_file_path( |
| base::android::ConvertJavaStringToUTF8(env, mojo_shell_path)); |
| base::CommandLine::ForCurrentProcess()->SetProgram(mojo_shell_file_path); |
| - mojo::shell::InitializeLogging(); |
| + InitializeLogging(); |
| // We want ~MessageLoop to happen prior to ~Context. Initializing |
| // LazyInstances is akin to stack-allocating objects; their destructors |
| // will be invoked first-in-last-out. |
| - shell::Context* shell_context = new shell::Context(); |
| + Context* shell_context = new Context(); |
| shell_context->mojo_url_resolver()->SetLocalAppsPath(base::FilePath( |
| base::android::ConvertJavaStringToUTF8(env, j_local_apps_directory))); |
| g_context.Get().reset(shell_context); |
| @@ -103,4 +173,5 @@ bool RegisterMojoMain(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |
| +} // namespace shell |
| } // namespace mojo |