input_method_persistence.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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_persistence.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/language_preferences.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace input_method {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PersistSystemInputMethod(const std::string& input_method) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!g_browser_process || !g_browser_process->local_state())
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  g_browser_process->local_state()->SetString(
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        language_prefs::kPreferredKeyboardLayout, input_method);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PersistUserInputMethod(const std::string& input_method) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* user_prefs = NULL;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile = ProfileManager::GetDefaultProfile();
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    user_prefs = profile->GetPrefs();
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!user_prefs)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string current_input_method_on_pref =
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_prefs->GetString(prefs::kLanguageCurrentInputMethod);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_input_method_on_pref == input_method)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_prefs->SetString(prefs::kLanguagePreviousInputMethod,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        current_input_method_on_pref);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_prefs->SetString(prefs::kLanguageCurrentInputMethod,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        input_method);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InputMethodPersistence::InputMethodPersistence(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InputMethodManager* input_method_manager)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : input_method_manager_(input_method_manager),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_(InputMethodManager::STATE_LOGIN_SCREEN) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  input_method_manager_->AddObserver(this);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InputMethodPersistence::~InputMethodPersistence() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  input_method_manager_->RemoveObserver(this);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InputMethodPersistence::InputMethodChanged(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InputMethodManager* manager, bool show_message) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(input_method_manager_, manager);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string current_input_method =
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager->GetCurrentInputMethod().id();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Save the new input method id depending on the current browser state.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (state_) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case InputMethodManager::STATE_LOGIN_SCREEN:
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!InputMethodUtil::IsKeyboardLayout(current_input_method)) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DVLOG(1) << "Only keyboard layouts are supported: "
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 << current_input_method;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PersistSystemInputMethod(current_input_method);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case InputMethodManager::STATE_BROWSER_SCREEN:
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PersistUserInputMethod(current_input_method);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case InputMethodManager::STATE_LOCK_SCREEN:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // We use a special set of input methods on the screen. Do not update.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case InputMethodManager::STATE_TERMINATING:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InputMethodPersistence::InputMethodPropertyChanged(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InputMethodManager* manager) {}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InputMethodPersistence::OnSessionStateChange(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InputMethodManager::State new_state) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  state_ = new_state;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace input_method
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
97