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/common/fill_layout_manager.h"
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "athena/screen/public/screen_manager.h"
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "athena/virtual_keyboard/vk_webui_controller.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)
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::BrowserContext* browser_context_;
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  aura::Window* root_window_;
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BasicKeyboardControllerProxy);
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class VirtualKeyboardManagerImpl : public VirtualKeyboardManager {
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) public:
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  explicit VirtualKeyboardManagerImpl(content::BrowserContext* browser_context)
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      : browser_context_(browser_context),
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        container_(NULL) {
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CHECK(!instance);
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    instance = this;
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    Init();
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual ~VirtualKeyboardManagerImpl() {
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CHECK_EQ(this, instance);
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    instance = NULL;
736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    keyboard::KeyboardController::ResetInstance(NULL);
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void Init() {
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    container_ = athena::ScreenManager::Get()->CreateContainer(
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "VirtualKeyboardContainer");
816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    container_->SetLayoutManager(new FillLayoutManager(container_));
826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    keyboard::SetOverrideContentUrl(GURL(keyboard::kKeyboardURL));
836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    keyboard_controller_.reset(new keyboard::KeyboardController(
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        new BasicKeyboardControllerProxy(browser_context_,
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                         container_->GetRootWindow())));
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    keyboard::KeyboardController::ResetInstance(keyboard_controller_.get());
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    aura::Window* kb_container = keyboard_controller_->GetContainerWindow();
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    container_->AddChild(kb_container);
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    kb_container->Show();
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::WebUIControllerFactory::RegisterFactory(
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        VKWebUIControllerFactory::GetInstance());
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  content::BrowserContext* browser_context_;
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  aura::Window* container_;
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<keyboard::KeyboardController> keyboard_controller_;
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardManagerImpl);
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// static
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VirtualKeyboardManager* VirtualKeyboardManager::Create(
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    content::BrowserContext* browser_context) {
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(!instance);
1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  keyboard::InitializeKeyboard();
1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  new VirtualKeyboardManagerImpl(browser_context);
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(instance);
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return instance;
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)VirtualKeyboardManager* VirtualKeyboardManager::Get() {
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return instance;
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void VirtualKeyboardManager::Shutdown() {
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(instance);
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  delete instance;
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK(!instance);
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace athena
126