Initial native keyboard proof of concept.

The mojo:keyboard_native service is written in C++ to be platform agnostic (as opposed to the mojo:keyboard service which is currently only  a java wrapper around the Android IME).

mojo:keyboard_client serves as a client to the mojo:keyboard_native service testing its implementation of the keyboard mojom APIs.

R=jamesr@chromium.org

Review URL: https://codereview.chromium.org/1139453002
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
index 52c3e4e..1a70140 100644
--- a/examples/BUILD.gn
+++ b/examples/BUILD.gn
@@ -24,6 +24,7 @@
     "//examples/ganesh_app",
     "//examples/http_handler",
     "//examples/indirect_service",
+    "//examples/keyboard_client",
     "//examples/nesting_app",
     "//examples/png_viewer",
     "//examples/recursive_content_handler",
diff --git a/examples/keyboard_client/BUILD.gn b/examples/keyboard_client/BUILD.gn
new file mode 100644
index 0000000..f8f7f3b
--- /dev/null
+++ b/examples/keyboard_client/BUILD.gn
@@ -0,0 +1,17 @@
+# 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.
+
+import("//mojo/public/mojo_application.gni")
+
+mojo_native_application("keyboard_client") {
+  sources = [
+    "keyboard_client.cc",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/public/cpp/application:standalone",
+    "//mojo/services/keyboard/public/interfaces",
+  ]
+}
diff --git a/examples/keyboard_client/keyboard_client.cc b/examples/keyboard_client/keyboard_client.cc
new file mode 100644
index 0000000..5496138
--- /dev/null
+++ b/examples/keyboard_client/keyboard_client.cc
@@ -0,0 +1,62 @@
+// 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.
+
+#include "base/macros.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_runner.h"
+#include "mojo/services/keyboard/public/interfaces/keyboard.mojom.h"
+
+namespace examples {
+
+class KeyboardDelegate : public mojo::ApplicationDelegate,
+                         public keyboard::KeyboardClient {
+ public:
+  KeyboardDelegate() : binding_(this) {}
+
+  ~KeyboardDelegate() override {}
+
+  // mojo::ApplicationDelegate implementation.
+  void Initialize(mojo::ApplicationImpl* app) override {
+    app->ConnectToService("mojo:keyboard_native", &keyboard_);
+    keyboard_->ShowByRequest();
+    keyboard_->Hide();
+
+    keyboard::KeyboardClientPtr keyboard_client;
+    auto request = mojo::GetProxy(&keyboard_client);
+    binding_.Bind(request.Pass());
+    keyboard_->Show(keyboard_client.Pass());
+  }
+
+  // keyboard::KeyboardClient implementation.
+  void CommitCompletion(keyboard::CompletionDataPtr completion) override {}
+
+  void CommitCorrection(keyboard::CorrectionDataPtr correction) override {}
+
+  void CommitText(const mojo::String& text,
+                  int32_t new_cursor_position) override {}
+
+  void DeleteSurroundingText(int32_t before_length,
+                             int32_t after_length) override {}
+
+  void SetComposingRegion(int32_t start, int32_t end) override {}
+
+  void SetComposingText(const mojo::String& text,
+                        int32_t new_cursor_position) override {}
+
+  void SetSelection(int32_t start, int32_t end) override {}
+
+ private:
+  mojo::Binding<keyboard::KeyboardClient> binding_;
+  keyboard::KeyboardServicePtr keyboard_;
+
+  DISALLOW_COPY_AND_ASSIGN(KeyboardDelegate);
+};
+
+}  // namespace examples
+
+MojoResult MojoMain(MojoHandle application_request) {
+  mojo::ApplicationRunner runner(new examples::KeyboardDelegate);
+  return runner.Run(application_request);
+}
diff --git a/services/BUILD.gn b/services/BUILD.gn
index ef45031..c01bf91 100644
--- a/services/BUILD.gn
+++ b/services/BUILD.gn
@@ -13,6 +13,7 @@
     "//services/gles2:lib",
     "//services/http_server",
     "//services/icu_data",
+    "//services/keyboard_native",
     "//services/kiosk_wm",
     "//services/native_viewport",
     "//services/reaper",
diff --git a/services/keyboard_native/BUILD.gn b/services/keyboard_native/BUILD.gn
new file mode 100644
index 0000000..c827642
--- /dev/null
+++ b/services/keyboard_native/BUILD.gn
@@ -0,0 +1,20 @@
+# 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.
+
+import("//mojo/public/mojo_application.gni")
+
+mojo_native_application("keyboard_native") {
+  sources = [
+    "keyboard_service_impl.cc",
+    "keyboard_service_impl.h",
+    "main.cc",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/public/cpp/application:standalone",
+    "//mojo/public/cpp/bindings",
+    "//mojo/services/keyboard/public/interfaces",
+  ]
+}
diff --git a/services/keyboard_native/keyboard_service_impl.cc b/services/keyboard_native/keyboard_service_impl.cc
new file mode 100644
index 0000000..d01970f
--- /dev/null
+++ b/services/keyboard_native/keyboard_service_impl.cc
@@ -0,0 +1,42 @@
+// 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.
+
+#include "services/keyboard_native/keyboard_service_impl.h"
+
+namespace keyboard {
+
+KeyboardServiceImpl::KeyboardServiceImpl(
+    mojo::InterfaceRequest<KeyboardService> request)
+    : strong_binding_(this, request.Pass()) {
+}
+
+KeyboardServiceImpl::~KeyboardServiceImpl() {
+}
+
+// KeyboardService implementation.
+void KeyboardServiceImpl::Show(KeyboardClientPtr client) {
+  keyboard::CompletionData completion_data;
+  completion_data.text = "blah";
+  completion_data.label = "blahblah";
+  client->CommitCompletion(completion_data.Clone());
+
+  keyboard::CorrectionData correction_data;
+  correction_data.old_text = "old text";
+  correction_data.new_text = "new text";
+  client->CommitCorrection(correction_data.Clone());
+
+  client->CommitText("", 0);
+  client->DeleteSurroundingText(0, 0);
+  client->SetComposingRegion(0, 0);
+  client->SetComposingText("", 0);
+  client->SetSelection(0, 1);
+}
+
+void KeyboardServiceImpl::ShowByRequest() {
+}
+
+void KeyboardServiceImpl::Hide() {
+}
+
+}  // namespace keyboard
diff --git a/services/keyboard_native/keyboard_service_impl.h b/services/keyboard_native/keyboard_service_impl.h
new file mode 100644
index 0000000..5ffbe70
--- /dev/null
+++ b/services/keyboard_native/keyboard_service_impl.h
@@ -0,0 +1,28 @@
+// 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.
+
+#include "base/macros.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/services/keyboard/public/interfaces/keyboard.mojom.h"
+
+namespace keyboard {
+
+class KeyboardServiceImpl : public KeyboardService {
+ public:
+  explicit KeyboardServiceImpl(mojo::InterfaceRequest<KeyboardService> request);
+  ~KeyboardServiceImpl() override;
+
+  // KeyboardService implementation.
+  void Show(KeyboardClientPtr client) override;
+  void ShowByRequest() override;
+  void Hide() override;
+
+ private:
+  mojo::StrongBinding<KeyboardService> strong_binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(KeyboardServiceImpl);
+};
+
+}  // namespace keyboard
diff --git a/services/keyboard_native/main.cc b/services/keyboard_native/main.cc
new file mode 100644
index 0000000..0d08e63
--- /dev/null
+++ b/services/keyboard_native/main.cc
@@ -0,0 +1,42 @@
+// 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.
+
+#include "mojo/public/cpp/application/application_connection.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_runner.h"
+#include "mojo/public/cpp/application/interface_factory.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "services/keyboard_native/keyboard_service_impl.h"
+
+namespace keyboard {
+
+class KeyboardServiceDelegate : public mojo::ApplicationDelegate,
+                                public mojo::InterfaceFactory<KeyboardService> {
+ public:
+  KeyboardServiceDelegate() {}
+  ~KeyboardServiceDelegate() override {}
+
+  // ApplicationDelegate implementation.
+  bool ConfigureIncomingConnection(
+      mojo::ApplicationConnection* connection) override {
+    connection->AddService<KeyboardService>(this);
+    return true;
+  }
+
+  // InterfaceFactory<KeyboardService> implementation.
+  void Create(mojo::ApplicationConnection* connection,
+              mojo::InterfaceRequest<KeyboardService> request) override {
+    new KeyboardServiceImpl(request.Pass());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(KeyboardServiceDelegate);
+};
+
+}  // namespace keyboard
+
+MojoResult MojoMain(MojoHandle application_request) {
+  mojo::ApplicationRunner runner(new keyboard::KeyboardServiceDelegate());
+  return runner.Run(application_request);
+}