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 23namespace athena { 24 25namespace { 26 27VirtualKeyboardManager* instance; 28 29// A very basic and simple implementation of KeyboardControllerProxy. 30class 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 62class 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 105VirtualKeyboardManager* 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 117VirtualKeyboardManager* VirtualKeyboardManager::Get() { 118 return instance; 119} 120 121void VirtualKeyboardManager::Shutdown() { 122 CHECK(instance); 123 delete instance; 124 CHECK(!instance); 125} 126 127} // namespace athena 128