diff --git a/packages/flutter/lib/services.dart b/packages/flutter/lib/services.dart index 27e62eff90..acfc2dc5be 100644 --- a/packages/flutter/lib/services.dart +++ b/packages/flutter/lib/services.dart @@ -12,6 +12,7 @@ library services; export 'src/services/activity.dart'; +export 'src/services/app_messages.dart'; export 'src/services/assertions.dart'; export 'src/services/asset_bundle.dart'; export 'src/services/binding.dart'; diff --git a/packages/flutter/lib/src/services/app_messages.dart b/packages/flutter/lib/src/services/app_messages.dart new file mode 100644 index 0000000000..f1f0c6072c --- /dev/null +++ b/packages/flutter/lib/src/services/app_messages.dart @@ -0,0 +1,59 @@ +// Copyright 2016 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. + +import 'dart:async'; + +import 'package:flutter/shell.dart'; +import 'package:mojo/core.dart' as core; +import 'package:sky_services/flutter/platform/app_messages.mojom.dart'; + +// APIs for exchanging messages with the host application. + +ApplicationMessagesProxy _initHostAppMessagesProxy() { + ApplicationMessagesProxy proxy = new ApplicationMessagesProxy.unbound(); + shell.connectToViewAssociatedService(proxy); + return proxy; +} + +final ApplicationMessagesProxy _hostAppMessagesProxy = _initHostAppMessagesProxy(); + +typedef Future HostMessageCallback(String message); +typedef Object _SendStringResponseFactory(String response); + +class _ApplicationMessagesImpl extends ApplicationMessages { + final Map handlers = {}; + + _ApplicationMessagesImpl() { + shell.provideService(ApplicationMessages.serviceName, + (core.MojoMessagePipeEndpoint endpoint) { + ApplicationMessagesStub stub = new ApplicationMessagesStub.fromEndpoint(endpoint); + stub.impl = this; + } + ); + } + + @override + dynamic sendString(String messageName, String message, [_SendStringResponseFactory responseFactory]) { + HostMessageCallback callback = handlers[messageName]; + if (callback == null) + return responseFactory(null); + + return callback(message).then((String s) => responseFactory(s)); + } +} + +final _ApplicationMessagesImpl _appMessages = new _ApplicationMessagesImpl(); + +class HostMessages { + /// Send a message to the host application. + static Future sendToHost(String messageName, String message) async { + return (await _hostAppMessagesProxy.ptr.sendString(messageName, message)).reply; + } + + /// Register a callback for messages received from the host application. + /// The callback function must return a String, Future, or null. + static void addMessageHandler(String messageName, HostMessageCallback callback) { + _appMessages.handlers[messageName] = callback; + } +}