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