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