 Chromium Code Reviews
 Chromium Code Reviews Issue 2923773003:
  Adding mojo calls for several lock screen related operations.  (Closed)
    
  
    Issue 2923773003:
  Adding mojo calls for several lock screen related operations.  (Closed) 
  | Index: chrome/browser/chromeos/login/lock_screen_utils.cc | 
| diff --git a/chrome/browser/chromeos/login/lock_screen_utils.cc b/chrome/browser/chromeos/login/lock_screen_utils.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..3d3d37b4bb5871c20318f76390c360185697a8fe | 
| --- /dev/null | 
| +++ b/chrome/browser/chromeos/login/lock_screen_utils.cc | 
| @@ -0,0 +1,156 @@ | 
| +// Copyright 2017 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 "chrome/browser/chromeos/login/lock_screen_utils.h" | 
| + | 
| +#include "chrome/browser/browser_process.h" | 
| +#include "chrome/browser/chromeos/language_preferences.h" | 
| +#include "chrome/browser/chromeos/settings/cros_settings.h" | 
| +#include "chrome/common/pref_names.h" | 
| +#include "components/prefs/scoped_user_pref_update.h" | 
| +#include "components/signin/core/account_id/account_id.h" | 
| +#include "components/user_manager/known_user.h" | 
| +#include "ui/base/ime/chromeos/ime_keyboard.h" | 
| + | 
| +namespace chromeos { | 
| +namespace lock_screen_utils { | 
| + | 
| +void SetUserInputMethod(const std::string& username, | 
| + input_method::InputMethodManager::State* ime_state) { | 
| + bool succeed = false; | 
| + | 
| + const std::string input_method = GetUserLastInputMethod(username); | 
| + | 
| + EnforcePolicyInputMethods(input_method); | 
| + | 
| + if (!input_method.empty()) | 
| + succeed = SetUserInputMethodImpl(username, input_method, ime_state); | 
| + | 
| + // This is also a case when last layout is set only for a few local users, | 
| + // thus others need to be switched to default locale. | 
| + // Otherwise they will end up using another user's locale to log in. | 
| + if (!succeed) { | 
| + DVLOG(0) << "SetUserInputMethod('" << username | 
| 
jdufault
2017/06/08 21:12:06
I don't think we should be logging username (PII)
 
xiaoyinh(OOO Sep 11-29)
2017/06/09 00:47:11
Removed, thanks!
 | 
| + << "'): failed to set user layout. Switching to default."; | 
| + | 
| + ime_state->SetInputMethodLoginDefault(); | 
| + } | 
| +} | 
| + | 
| +std::string GetUserLastInputMethod(const std::string& username) { | 
| + PrefService* const local_state = g_browser_process->local_state(); | 
| + const base::DictionaryValue* users_last_input_methods = | 
| + local_state->GetDictionary(prefs::kUsersLastInputMethod); | 
| + | 
| + if (!users_last_input_methods) { | 
| + DLOG(WARNING) << "GetUserLastInputMethod('" << username | 
| + << "'): no kUsersLastInputMethod"; | 
| + return std::string(); | 
| + } | 
| + | 
| + std::string input_method; | 
| + | 
| + if (!users_last_input_methods->GetStringWithoutPathExpansion(username, | 
| + &input_method)) { | 
| + DVLOG(0) << "GetUserLastInputMethod('" << username | 
| + << "'): no input method for this user"; | 
| + return std::string(); | 
| + } | 
| + | 
| + return input_method; | 
| +} | 
| + | 
| +bool SetUserInputMethodImpl( | 
| + const std::string& username, | 
| + const std::string& user_input_method, | 
| + input_method::InputMethodManager::State* ime_state) { | 
| + if (!chromeos::input_method::InputMethodManager::Get()->IsLoginKeyboard( | 
| + user_input_method)) { | 
| + LOG(WARNING) << "SetUserInputMethod('" << username | 
| + << "'): stored user last input method '" << user_input_method | 
| + << "' is no longer Full Latin Keyboard Language" | 
| + << " (entry dropped). Use hardware default instead."; | 
| + | 
| + PrefService* const local_state = g_browser_process->local_state(); | 
| + DictionaryPrefUpdate updater(local_state, prefs::kUsersLastInputMethod); | 
| + | 
| + base::DictionaryValue* const users_last_input_methods = updater.Get(); | 
| + if (users_last_input_methods != nullptr) { | 
| 
jdufault
2017/06/08 21:12:06
drop != nullptr
drop {}
 
xiaoyinh(OOO Sep 11-29)
2017/06/09 00:47:11
Done.
 | 
| + users_last_input_methods->SetStringWithoutPathExpansion(username, ""); | 
| + } | 
| + return false; | 
| + } | 
| + if (!Contains(ime_state->GetActiveInputMethodIds(), user_input_method)) { | 
| + if (!ime_state->EnableInputMethod(user_input_method)) { | 
| + DLOG(ERROR) << "SigninScreenHandler::SetUserInputMethod('" << username | 
| + << "'): user input method '" << user_input_method | 
| + << "' is not enabled and enabling failed (ignored!)."; | 
| + } | 
| + } | 
| + ime_state->ChangeInputMethod(user_input_method, false /* show_message */); | 
| + | 
| + return true; | 
| +} | 
| + | 
| +void EnforcePolicyInputMethods(std::string user_input_method) { | 
| + chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get(); | 
| + const base::ListValue* login_screen_input_methods = nullptr; | 
| + if (!cros_settings->GetList(chromeos::kDeviceLoginScreenInputMethods, | 
| + &login_screen_input_methods)) { | 
| + return; | 
| + } | 
| + | 
| + std::vector<std::string> allowed_input_methods; | 
| + | 
| + // Add user's input method first so it is pre-selected. | 
| + if (!user_input_method.empty()) { | 
| + allowed_input_methods.push_back(user_input_method); | 
| + } | 
| + | 
| + std::string input_method; | 
| + for (const auto& input_method_entry : *login_screen_input_methods) { | 
| + if (input_method_entry.GetAsString(&input_method)) | 
| + allowed_input_methods.push_back(input_method); | 
| + } | 
| + chromeos::input_method::InputMethodManager* imm = | 
| + chromeos::input_method::InputMethodManager::Get(); | 
| + imm->GetActiveIMEState()->SetAllowedInputMethods(allowed_input_methods); | 
| +} | 
| + | 
| +void SetKeyboardSettings(const AccountId& account_id) { | 
| + bool auto_repeat_enabled = language_prefs::kXkbAutoRepeatEnabled; | 
| + if (user_manager::known_user::GetBooleanPref( | 
| + account_id, prefs::kLanguageXkbAutoRepeatEnabled, | 
| + &auto_repeat_enabled) && | 
| + !auto_repeat_enabled) { | 
| + input_method::InputMethodManager::Get() | 
| + ->GetImeKeyboard() | 
| + ->SetAutoRepeatEnabled(false); | 
| + return; | 
| + } | 
| + | 
| + int auto_repeat_delay = language_prefs::kXkbAutoRepeatDelayInMs; | 
| + int auto_repeat_interval = language_prefs::kXkbAutoRepeatIntervalInMs; | 
| + user_manager::known_user::GetIntegerPref( | 
| + account_id, prefs::kLanguageXkbAutoRepeatDelay, &auto_repeat_delay); | 
| + user_manager::known_user::GetIntegerPref( | 
| + account_id, prefs::kLanguageXkbAutoRepeatInterval, &auto_repeat_interval); | 
| + input_method::AutoRepeatRate rate; | 
| + rate.initial_delay_in_ms = auto_repeat_delay; | 
| + rate.repeat_interval_in_ms = auto_repeat_interval; | 
| + input_method::InputMethodManager::Get() | 
| + ->GetImeKeyboard() | 
| + ->SetAutoRepeatEnabled(true); | 
| + input_method::InputMethodManager::Get()->GetImeKeyboard()->SetAutoRepeatRate( | 
| + rate); | 
| +} | 
| + | 
| +bool Contains(const std::vector<std::string>& container, | 
| + const std::string& value) { | 
| + return std::find(container.begin(), container.end(), value) != | 
| + container.end(); | 
| +} | 
| + | 
| +} // namespace lock_screen_utils | 
| +} // namespace chromeos |