Home | History | Annotate | Download | only in virtual_keyboard
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "athena/virtual_keyboard/public/virtual_keyboard_manager.h"
      6 
      7 #include "athena/screen/public/screen_manager.h"
      8 #include "athena/util/container_priorities.h"
      9 #include "athena/util/fill_layout_manager.h"
     10 #include "base/bind.h"
     11 #include "base/memory/singleton.h"
     12 #include "base/values.h"
     13 #include "content/public/browser/browser_context.h"
     14 #include "ui/aura/client/aura_constants.h"
     15 #include "ui/aura/layout_manager.h"
     16 #include "ui/aura/window.h"
     17 #include "ui/keyboard/keyboard.h"
     18 #include "ui/keyboard/keyboard_constants.h"
     19 #include "ui/keyboard/keyboard_controller.h"
     20 #include "ui/keyboard/keyboard_controller_proxy.h"
     21 #include "ui/keyboard/keyboard_util.h"
     22 
     23 namespace athena {
     24 
     25 namespace {
     26 
     27 VirtualKeyboardManager* instance;
     28 
     29 // A very basic and simple implementation of KeyboardControllerProxy.
     30 class BasicKeyboardControllerProxy : public keyboard::KeyboardControllerProxy {
     31  public:
     32   BasicKeyboardControllerProxy(content::BrowserContext* context,
     33                                aura::Window* root_window)
     34       : browser_context_(context), root_window_(root_window) {}
     35   virtual ~BasicKeyboardControllerProxy() {}
     36 
     37   // keyboard::KeyboardControllerProxy:
     38   virtual ui::InputMethod* GetInputMethod() OVERRIDE {
     39     ui::InputMethod* input_method =
     40         root_window_->GetProperty(aura::client::kRootWindowInputMethodKey);
     41     return input_method;
     42   }
     43 
     44   virtual void RequestAudioInput(
     45       content::WebContents* web_contents,
     46       const content::MediaStreamRequest& request,
     47       const content::MediaResponseCallback& callback) OVERRIDE {}
     48 
     49   virtual content::BrowserContext* GetBrowserContext() OVERRIDE {
     50     return browser_context_;
     51   }
     52 
     53   virtual void SetUpdateInputType(ui::TextInputType type) OVERRIDE {}
     54 
     55  private:
     56   content::BrowserContext* browser_context_;
     57   aura::Window* root_window_;
     58 
     59   DISALLOW_COPY_AND_ASSIGN(BasicKeyboardControllerProxy);
     60 };
     61 
     62 class VirtualKeyboardManagerImpl : public VirtualKeyboardManager {
     63  public:
     64   explicit VirtualKeyboardManagerImpl(content::BrowserContext* browser_context)
     65       : browser_context_(browser_context),
     66         container_(NULL) {
     67     CHECK(!instance);
     68     instance = this;
     69     Init();
     70   }
     71 
     72   virtual ~VirtualKeyboardManagerImpl() {
     73     CHECK_EQ(this, instance);
     74     instance = NULL;
     75 
     76     keyboard::KeyboardController::ResetInstance(NULL);
     77   }
     78 
     79  private:
     80   void Init() {
     81     athena::ScreenManager::ContainerParams params("VirtualKeyboardContainer",
     82                                                   CP_VIRTUAL_KEYBOARD);
     83     container_ = athena::ScreenManager::Get()->CreateContainer(params);
     84     container_->SetLayoutManager(new FillLayoutManager(container_));
     85 
     86     keyboard::KeyboardController* controller = new keyboard::KeyboardController(
     87         new BasicKeyboardControllerProxy(browser_context_,
     88                                          container_->GetRootWindow()));
     89     // ResetInstance takes ownership.
     90     keyboard::KeyboardController::ResetInstance(controller);
     91     aura::Window* kb_container = controller->GetContainerWindow();
     92     container_->AddChild(kb_container);
     93     kb_container->Show();
     94   }
     95 
     96   content::BrowserContext* browser_context_;
     97   aura::Window* container_;
     98 
     99   DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardManagerImpl);
    100 };
    101 
    102 }  // namespace
    103 
    104 // static
    105 VirtualKeyboardManager* VirtualKeyboardManager::Create(
    106     content::BrowserContext* browser_context) {
    107   CHECK(!instance);
    108   keyboard::InitializeKeyboard();
    109   keyboard::SetTouchKeyboardEnabled(true);
    110   keyboard::InitializeWebUIBindings();
    111 
    112   new VirtualKeyboardManagerImpl(browser_context);
    113   CHECK(instance);
    114   return instance;
    115 }
    116 
    117 VirtualKeyboardManager* VirtualKeyboardManager::Get() {
    118   return instance;
    119 }
    120 
    121 void VirtualKeyboardManager::Shutdown() {
    122   CHECK(instance);
    123   delete instance;
    124   CHECK(!instance);
    125 }
    126 
    127 }  // namespace athena
    128