12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/accessibility.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/browser_state_monitor.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_delegate_impl.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_manager_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_persistence.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ime/chromeos/ime_bridge.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace input_method {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OnSessionStateChange(InputMethodManagerImpl* input_method_manager_impl,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          InputMethodPersistence* input_method_persistence,
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          InputMethodManager::UISessionState new_ui_session) {
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  input_method_persistence->OnSessionStateChange(new_ui_session);
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  input_method_manager_impl->SetUISessionState(new_ui_session);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool g_disable_extension_loading = false;
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class InputMethodConfiguration {
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InputMethodConfiguration() {}
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~InputMethodConfiguration() {}
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Initialize() {
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IMEBridge::Initialize();
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InputMethodManagerImpl* impl = new InputMethodManagerImpl(
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        scoped_ptr<InputMethodDelegate>(new InputMethodDelegateImpl),
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        !g_disable_extension_loading);
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InputMethodManager::Initialize(impl);
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(InputMethodManager::Get());
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    accessibility_.reset(new Accessibility(impl));
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    input_method_persistence_.reset(new InputMethodPersistence(impl));
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    browser_state_monitor_.reset(new BrowserStateMonitor(
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&OnSessionStateChange,
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   impl,
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   input_method_persistence_.get())));
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DVLOG(1) << "InputMethodManager initialized";
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void InitializeForTesting(InputMethodManager* mock_manager) {
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InputMethodManager::Initialize(mock_manager);
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DVLOG(1) << "InputMethodManager for testing initialized";
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Shutdown() {
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    accessibility_.reset();
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    browser_state_monitor_.reset();
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    input_method_persistence_.reset();
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InputMethodManager::Shutdown();
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IMEBridge::Shutdown();
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DVLOG(1) << "InputMethodManager shutdown";
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<Accessibility> accessibility_;
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<BrowserStateMonitor> browser_state_monitor_;
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<InputMethodPersistence> input_method_persistence_;
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InputMethodConfiguration* g_input_method_configuration = NULL;
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Initialize() {
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!g_input_method_configuration)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    g_input_method_configuration = new InputMethodConfiguration();
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  g_input_method_configuration->Initialize();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InitializeForTesting(InputMethodManager* mock_manager) {
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!g_input_method_configuration)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    g_input_method_configuration = new InputMethodConfiguration();
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  g_input_method_configuration->InitializeForTesting(mock_manager);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void DisableExtensionLoading() {
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  g_disable_extension_loading = true;
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shutdown() {
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!g_input_method_configuration)
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  g_input_method_configuration->Shutdown();
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  delete g_input_method_configuration;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  g_input_method_configuration = NULL;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace input_method
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
109