16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file.
46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "athena/virtual_keyboard/public/virtual_keyboard_manager.h"
66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "athena/screen/public/screen_manager.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/util/container_priorities.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/util/fill_layout_manager.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/bind.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/memory/singleton.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/values.h"
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/public/browser/browser_context.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/aura/layout_manager.h"
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/aura/window.h"
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard.h"
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard_constants.h"
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard_controller.h"
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard_controller_proxy.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/keyboard/keyboard_util.h"
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace athena {
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VirtualKeyboardManager* instance;
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// A very basic and simple implementation of KeyboardControllerProxy.
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class BasicKeyboardControllerProxy : public keyboard::KeyboardControllerProxy {
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) public:
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BasicKeyboardControllerProxy(content::BrowserContext* context,
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                               aura::Window* root_window)
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      : browser_context_(context), root_window_(root_window) {}
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual ~BasicKeyboardControllerProxy() {}
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // keyboard::KeyboardControllerProxy:
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual ui::InputMethod* GetInputMethod() OVERRIDE {
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ui::InputMethod* input_method =
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        root_window_->GetProperty(aura::client::kRootWindowInputMethodKey);
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return input_method;
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void RequestAudioInput(
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      content::WebContents* web_contents,
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const content::MediaStreamRequest& request,
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      const content::MediaResponseCallback& callback) OVERRIDE {}
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual content::BrowserContext* GetBrowserContext() OVERRIDE {
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return browser_context_;
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetUpdateInputType(ui::TextInputType type) OVERRIDE {}
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::BrowserContext* browser_context_;
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  aura::Window* root_window_;
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BasicKeyboardControllerProxy);
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class VirtualKeyboardManagerImpl : public VirtualKeyboardManager {
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) public:
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  explicit VirtualKeyboardManagerImpl(content::BrowserContext* browser_context)
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      : browser_context_(browser_context),
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        container_(NULL) {
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CHECK(!instance);
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    instance = this;
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    Init();
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual ~VirtualKeyboardManagerImpl() {
736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CHECK_EQ(this, instance);
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    instance = NULL;
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    keyboard::KeyboardController::ResetInstance(NULL);
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void Init() {
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    athena::ScreenManager::ContainerParams params("VirtualKeyboardContainer",
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  CP_VIRTUAL_KEYBOARD);
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    container_ = athena::ScreenManager::Get()->CreateContainer(params);
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    container_->SetLayoutManager(new FillLayoutManager(container_));
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    keyboard::KeyboardController* controller = new keyboard::KeyboardController(
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        new BasicKeyboardControllerProxy(browser_context_,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         container_->GetRootWindow()));
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // ResetInstance takes ownership.
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    keyboard::KeyboardController::ResetInstance(controller);
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    aura::Window* kb_container = controller->GetContainerWindow();
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    container_->AddChild(kb_container);
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    kb_container->Show();
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::BrowserContext* browser_context_;
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  aura::Window* container_;
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardManagerImpl);
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// static
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VirtualKeyboardManager* VirtualKeyboardManager::Create(
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::BrowserContext* browser_context) {
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(!instance);
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  keyboard::InitializeKeyboard();
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  keyboard::SetTouchKeyboardEnabled(true);
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  keyboard::InitializeWebUIBindings();
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  new VirtualKeyboardManagerImpl(browser_context);
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(instance);
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return instance;
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VirtualKeyboardManager* VirtualKeyboardManager::Get() {
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return instance;
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void VirtualKeyboardManager::Shutdown() {
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(instance);
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  delete instance;
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(!instance);
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace athena
128