| Index: shell/android/mojo_main.cc
|
| diff --git a/shell/android/mojo_main.cc b/shell/android/mojo_main.cc
|
| index b8bada579f5a3bf3b9474099e8476532600bcd96..a91ef2f4f28a647eab557d4b2d83fd0ece92d5e9 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"
|
| +#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,
|
| + 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 native_viewport::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.
|
| + context->application_manager()->SetLoaderForURL(
|
| + make_scoped_ptr(new BackgroundShellApplicationLoader(
|
| + make_scoped_ptr(new AndroidHandlerLoader()), "android_handler",
|
| + base::MessageLoop::TYPE_DEFAULT)),
|
| + 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
|
|
|