From 074564eec350ae483ceba5b343b677606ef58e78 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Wed, 16 Mar 2016 17:02:10 -0700 Subject: [PATCH] Provide APIs for exchanging messages with the host application --- packages/flutter/lib/services.dart | 1 + .../lib/src/services/app_messages.dart | 59 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 packages/flutter/lib/src/services/app_messages.dart 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; + } +}