blob: 9516e2871d0fd3381d5e4f827dfa51ff4aae8815 [file]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.examples.android;
import android.content.Context;
import android.util.Log;
import org.chromium.mojo.bindings.Interface;
import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.Core;
import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojo.system.MojoException;
import org.chromium.mojo.system.RunLoop;
import org.chromium.mojom.mojo.Application;
import org.chromium.mojom.mojo.ExampleService;
import org.chromium.mojom.mojo.ServiceProvider;
import org.chromium.mojom.mojo.Shell;
import java.util.HashMap;
import java.util.Map;
/**
* App holds all the code for this example application.
*/
class App {
private static String TAG = "ExampleServiceApp";
public static class ApplicationImpl implements Application {
private final Core mCore;
private Shell mShell;
public ApplicationImpl(Core core, MessagePipeHandle applicationRequest) {
ApplicationImpl.MANAGER.bind(this, applicationRequest);
mCore = core;
}
@Override
public void initialize(Shell shell, String[] args, String url) {
mShell = shell;
}
@Override
public void acceptConnection(String requestorUrl,
InterfaceRequest<ServiceProvider> services, ServiceProvider exposedServices) {
ServiceProviderImpl serviceProvider = new ServiceProviderImpl();
serviceProvider.addService(new ServiceFactoryBinder<ExampleService>() {
@Override
public void bindNewInstanceToMessagePipe(MessagePipeHandle pipe) {
ExampleService.MANAGER.bind(new ExampleServiceImpl(), pipe);
}
@Override
public String getInterfaceName() {
return ExampleService.MANAGER.getName();
}
});
ServiceProvider.MANAGER.bind(serviceProvider, services);
if (exposedServices != null) {
exposedServices.close();
}
}
@Override
public void requestQuit() {
mCore.getCurrentRunLoop().quit();
}
@Override
public void close() {
if (mShell != null) {
mShell.close();
}
}
@Override
public void onConnectionError(MojoException e) {}
}
/**
* ServiceFactoryBinder holds the necessary information to bind a service interface to a message
* pipe.
*/
private static interface ServiceFactoryBinder<T extends Interface> {
public void bindNewInstanceToMessagePipe(MessagePipeHandle pipe);
public String getInterfaceName();
}
public static class ServiceProviderImpl implements ServiceProvider {
private Map<String, ServiceFactoryBinder<? extends Interface>> mNameToServiceMap =
new HashMap<String, ServiceFactoryBinder<? extends Interface>>();
public ServiceProviderImpl() {}
/**
* AddService adds a new service to the list of services provided by this application.
*/
public void addService(ServiceFactoryBinder<? extends Interface> binder) {
mNameToServiceMap.put(binder.getInterfaceName(), binder);
}
@Override
public void connectToService(String interfaceName, MessagePipeHandle pipe) {
if (mNameToServiceMap.containsKey(interfaceName)) {
mNameToServiceMap.get(interfaceName).bindNewInstanceToMessagePipe(pipe);
} else {
pipe.close();
}
}
@Override
public void close() {}
@Override
public void onConnectionError(MojoException e) {}
}
public static class ExampleServiceImpl implements ExampleService {
public ExampleServiceImpl() {}
@Override
public void ping(short pingValue, ExampleService.PingResponse callback) {
callback.call(pingValue);
}
@Override
public void close() {}
@Override
public void onConnectionError(MojoException e) {}
}
public static void mojoMain(@SuppressWarnings("unused") Context context, Core core,
MessagePipeHandle applicationRequestHandle) {
Log.i(TAG, "App.MojoMain called");
try (RunLoop runLoop = core.createDefaultRunLoop()) {
Log.i(TAG, "Run loop created");
try (ApplicationImpl application =
new ApplicationImpl(core, applicationRequestHandle)) {
Log.i(TAG, "Setup done, starting run loop");
runLoop.run();
Log.i(TAG, "Run loop exited");
}
}
}
}