Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(746)

Unified Diff: chrome/browser/chromeos/login/lock_screen_utils.cc

Issue 2923773003: Adding mojo calls for several lock screen related operations. (Closed)
Patch Set: comments and rebase Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/login/lock_screen_utils.h ('k') | chrome/browser/ui/ash/lock_screen_client.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..6b681bd9b7e36eb8962b5d0738fcb52699c95f78
--- /dev/null
+++ b/chrome/browser/chromeos/login/lock_screen_utils.cc
@@ -0,0 +1,148 @@
+// 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: 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: no kUsersLastInputMethod";
+ return std::string();
+ }
+
+ std::string input_method;
+
+ if (!users_last_input_methods->GetStringWithoutPathExpansion(username,
+ &input_method)) {
+ DVLOG(0) << "GetUserLastInputMethod: 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: 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)
+ users_last_input_methods->SetStringWithoutPathExpansion(username, "");
+ return false;
+ }
+ if (!base::ContainsValue(ime_state->GetActiveInputMethodIds(),
+ user_input_method)) {
+ if (!ime_state->EnableInputMethod(user_input_method)) {
+ DLOG(ERROR) << "SetUserInputMethod: 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);
+}
+
+} // namespace lock_screen_utils
+} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/login/lock_screen_utils.h ('k') | chrome/browser/ui/ash/lock_screen_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698