Index: athena/virtual_keyboard/virtual_keyboard_manager_impl.cc |
diff --git a/athena/virtual_keyboard/virtual_keyboard_manager_impl.cc b/athena/virtual_keyboard/virtual_keyboard_manager_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6a77a47700c6180298973635a0936ff197e4ccd5 |
--- /dev/null |
+++ b/athena/virtual_keyboard/virtual_keyboard_manager_impl.cc |
@@ -0,0 +1,159 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "athena/virtual_keyboard/public/virtual_keyboard_manager.h" |
+ |
+#include "athena/screen/public/screen_manager.h" |
+#include "athena/virtual_keyboard/vk_webui_controller.h" |
+#include "base/bind.h" |
+#include "base/memory/singleton.h" |
+#include "base/values.h" |
+#include "content/public/browser/browser_context.h" |
+#include "ui/aura/client/aura_constants.h" |
+#include "ui/aura/layout_manager.h" |
+#include "ui/aura/window.h" |
+#include "ui/keyboard/keyboard.h" |
+#include "ui/keyboard/keyboard_constants.h" |
+#include "ui/keyboard/keyboard_controller.h" |
+#include "ui/keyboard/keyboard_controller_proxy.h" |
+#include "ui/keyboard/keyboard_util.h" |
+ |
+namespace athena { |
+ |
+namespace { |
+ |
+VirtualKeyboardManager* instance; |
+ |
+class FillLayoutManager : public aura::LayoutManager { |
oshima
2014/06/18 20:14:35
can you move the FillLaout from screen/screen_mana
sadrul
2014/06/18 20:57:53
Done.
|
+ public: |
+ explicit FillLayoutManager(aura::Window* container) : container_(container) { |
+ DCHECK(container_); |
+ } |
+ |
+ // aura::LayoutManager: |
+ virtual void OnWindowResized() OVERRIDE { |
+ gfx::Rect full_bounds = gfx::Rect(container_->bounds().size()); |
+ for (aura::Window::Windows::const_iterator iter = |
+ container_->children().begin(); |
+ iter != container_->children().end(); |
+ ++iter) { |
+ SetChildBoundsDirect(*iter, full_bounds); |
+ } |
+ } |
+ virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE { |
+ SetChildBoundsDirect(child, (gfx::Rect(container_->bounds().size()))); |
+ } |
+ virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {} |
+ virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {} |
+ virtual void OnChildWindowVisibilityChanged(aura::Window* child, |
+ bool visible) OVERRIDE {} |
+ virtual void SetChildBounds(aura::Window* child, |
+ const gfx::Rect& requested_bounds) OVERRIDE { |
+ // Ignore SetBounds request. |
+ } |
+ |
+ private: |
+ aura::Window* container_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FillLayoutManager); |
+}; |
+ |
+// A very basic and simple implementation of KeyboardControllerProxy. |
+class BasicKeyboardControllerProxy : public keyboard::KeyboardControllerProxy { |
+ public: |
+ BasicKeyboardControllerProxy(content::BrowserContext* context, |
+ aura::Window* root_window) |
+ : browser_context_(context), root_window_(root_window) {} |
+ virtual ~BasicKeyboardControllerProxy() {} |
+ |
+ // keyboard::KeyboardControllerProxy: |
+ virtual ui::InputMethod* GetInputMethod() OVERRIDE { |
+ ui::InputMethod* input_method = |
+ root_window_->GetProperty(aura::client::kRootWindowInputMethodKey); |
+ return input_method; |
+ } |
+ |
+ virtual void RequestAudioInput( |
+ content::WebContents* web_contents, |
+ const content::MediaStreamRequest& request, |
+ const content::MediaResponseCallback& callback) OVERRIDE {} |
+ |
+ virtual content::BrowserContext* GetBrowserContext() OVERRIDE { |
+ return browser_context_; |
+ } |
+ |
+ private: |
+ content::BrowserContext* browser_context_; |
+ aura::Window* root_window_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BasicKeyboardControllerProxy); |
+}; |
+ |
+class VirtualKeyboardManagerImpl : public VirtualKeyboardManager { |
+ public: |
+ VirtualKeyboardManagerImpl(aura::Window* window, |
+ content::BrowserContext* browser_context) |
+ : browser_context_(browser_context), |
+ root_window_(window), |
+ container_(NULL) { |
+ CHECK(!instance); |
+ instance = this; |
+ Init(); |
+ } |
+ |
+ virtual ~VirtualKeyboardManagerImpl() { |
+ CHECK_EQ(this, instance); |
+ instance = NULL; |
oshima
2014/06/18 20:14:35
don't you have to do any cleanup where?
sadrul
2014/06/18 20:57:52
What kind of cleanup do you think could be useful
oshima
2014/06/18 21:11:15
Don't you have to do
keyboard::KeyboardController
sadrul
2014/06/18 21:19:10
Yes, good catch! Done. Thanks
|
+ } |
+ |
+ private: |
+ void Init() { |
+ container_ = athena::ScreenManager::Get()->CreateContainer( |
+ "VirtualKeyboardContainer"); |
+ container_->SetLayoutManager(new FillLayoutManager(container_)); |
+ keyboard::SetOverrideContentUrl(GURL(keyboard::kKeyboardURL)); |
+ |
+ keyboard_controller_.reset(new keyboard::KeyboardController( |
+ new BasicKeyboardControllerProxy(browser_context_, root_window_))); |
oshima
2014/06/18 20:14:35
can you simply use container_->GetRootWindow() ins
sadrul
2014/06/18 20:57:52
Done.
|
+ keyboard::KeyboardController::ResetInstance(keyboard_controller_.get()); |
+ aura::Window* kb_container = keyboard_controller_->GetContainerWindow(); |
+ container_->AddChild(kb_container); |
+ kb_container->Show(); |
+ |
+ content::WebUIControllerFactory::RegisterFactory( |
+ VKWebUIControllerFactory::GetInstance()); |
+ } |
+ |
+ content::BrowserContext* browser_context_; |
+ aura::Window* root_window_; |
+ aura::Window* container_; |
+ scoped_ptr<keyboard::KeyboardController> keyboard_controller_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardManagerImpl); |
+}; |
+ |
+} // namespace |
+ |
+// static |
+VirtualKeyboardManager* VirtualKeyboardManager::Create( |
+ aura::Window* root, |
+ content::BrowserContext* browser_context) { |
+ CHECK(!instance); |
+ keyboard::InitializeKeyboard(); |
+ new VirtualKeyboardManagerImpl(root, browser_context); |
+ CHECK(instance); |
+ return instance; |
+} |
+ |
+VirtualKeyboardManager* VirtualKeyboardManager::Get() { |
+ return instance; |
+} |
+ |
+void VirtualKeyboardManager::Shutdown() { |
+ CHECK(instance); |
+ delete instance; |
+ CHECK(!instance); |
+} |
+ |
+} // namespace athena |