From 9e4f796784c1fd39f8cedcccde641eddd94f1ba4 Mon Sep 17 00:00:00 2001 From: merkulova Date: Wed, 3 Sep 2014 04:09:24 -0700 Subject: [PATCH] Single pod autofocus disabled for touch view mode. Delegate class created for ash interactions. BUG=370929 TBR=skuhne@chromium.org Review URL: https://codereview.chromium.org/471973002 Cr-Commit-Position: refs/heads/master@{#293117} --- .../webui/chromeos/login/signin_screen_handler.cc | 20 +++++++++ .../webui/chromeos/login/signin_screen_handler.h | 12 ++++- .../chromeos/touch_view_controller_delegate.cc | 41 +++++++++++++++++ .../chromeos/touch_view_controller_delegate.h | 52 ++++++++++++++++++++++ .../ui/webui/signin/user_manager_screen_handler.cc | 1 + chrome/chrome_browser_ui.gypi | 2 + ui/login/account_picker/screen_account_picker.js | 10 +++++ ui/login/account_picker/user_pod_row.js | 19 +++++++- 8 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc create mode 100644 chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.h diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index 5151a9a92556..5eeff9c7d255 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc @@ -299,6 +299,9 @@ SigninScreenHandler::SigninScreenHandler( if (keyboard) keyboard->AddObserver(this); + max_mode_delegate_.reset(new TouchViewControllerDelegate()); + max_mode_delegate_->AddObserver(this); + policy::ConsumerManagementService* consumer_management = g_browser_process->platform_part()->browser_policy_connector_chromeos()-> GetConsumerManagementService(); @@ -317,6 +320,8 @@ SigninScreenHandler::~SigninScreenHandler() { if (delegate_) delegate_->SetWebUIHandler(NULL); network_state_informer_->RemoveObserver(this); + max_mode_delegate_->RemoveObserver(this); + max_mode_delegate_.reset(NULL); ScreenlockBridge::Get()->SetLockHandler(NULL); } @@ -771,6 +776,8 @@ void SigninScreenHandler::RegisterMessages() { &SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts); AddCallback("cancelConsumerManagementEnrollment", &SigninScreenHandler::HandleCancelConsumerManagementEnrollment); + AddCallback("getTouchViewState", + &SigninScreenHandler::HandleGetTouchViewState); // This message is sent by the kiosk app menu, but is handled here @@ -971,6 +978,14 @@ void SigninScreenHandler::Unlock(const std::string& user_email) { ScreenLocker::Hide(); } +void SigninScreenHandler::OnMaximizeModeStarted() { + CallJS("login.AccountPickerScreen.setTouchViewState", true); +} + +void SigninScreenHandler::OnMaximizeModeEnded() { + CallJS("login.AccountPickerScreen.setTouchViewState", false); +} + bool SigninScreenHandler::ShouldLoadGaia() const { // Fetching of the extension is not started before account picker page is // loaded because it can affect the loading speed. @@ -1368,6 +1383,11 @@ void SigninScreenHandler::HandleCancelConsumerManagementEnrollment() { ShowImpl(); } +void SigninScreenHandler::HandleGetTouchViewState() { + CallJS("login.AccountPickerScreen.setTouchViewState", + max_mode_delegate_->IsMaximizeModeEnabled()); +} + bool SigninScreenHandler::AllWhitelistedUsersPresent() { CrosSettings* cros_settings = CrosSettings::Get(); bool allow_new_user = false; diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index 4656185be3f2..2cc7bd5b0ed9 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h @@ -26,6 +26,7 @@ #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" +#include "chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.h" #include "chromeos/ime/ime_keyboard.h" #include "chromeos/network/portal_detector/network_portal_detector.h" #include "components/user_manager/user_manager.h" @@ -211,7 +212,8 @@ class SigninScreenHandler public content::NotificationObserver, public ScreenlockBridge::LockHandler, public NetworkStateInformer::NetworkStateInformerObserver, - public input_method::ImeKeyboard::Observer { + public input_method::ImeKeyboard::Observer, + public TouchViewControllerDelegate::Observer { public: SigninScreenHandler( const scoped_refptr& network_state_informer, @@ -325,6 +327,10 @@ class SigninScreenHandler const std::string& username) const OVERRIDE; virtual void Unlock(const std::string& user_email) OVERRIDE; + // TouchViewControllerDelegate::Observer implementation: + virtual void OnMaximizeModeStarted() OVERRIDE; + virtual void OnMaximizeModeEnded() OVERRIDE; + // Updates authentication extension. Called when device settings that affect // sign-in (allow BWSI and allow whitelist) are changed. void UserSettingsChanged(); @@ -376,6 +382,7 @@ class SigninScreenHandler void HandleGetPublicSessionKeyboardLayouts(const std::string& user_id, const std::string& locale); void HandleCancelConsumerManagementEnrollment(); + void HandleGetTouchViewState(); // Sends the list of |keyboard_layouts| available for the |locale| that is // currently selected for the public session identified by |user_id|. @@ -488,6 +495,9 @@ class SigninScreenHandler // Helper that retrieves the authenticated user's e-mail address. scoped_ptr email_retriever_; + // Maximized mode controller delegate. + scoped_ptr max_mode_delegate_; + // Whether consumer management enrollment is in progress. bool is_enrolling_consumer_management_; diff --git a/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc b/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc new file mode 100644 index 000000000000..f36a848c8702 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.cc @@ -0,0 +1,41 @@ +// 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 "chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.h" + +#include "ash/shell.h" +#include "ash/wm/maximize_mode/maximize_mode_controller.h" + +namespace chromeos { + +TouchViewControllerDelegate::TouchViewControllerDelegate() { + ash::Shell::GetInstance()->AddShellObserver(this); +} + +TouchViewControllerDelegate::~TouchViewControllerDelegate() { + ash::Shell::GetInstance()->RemoveShellObserver(this); +} + +void TouchViewControllerDelegate::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void TouchViewControllerDelegate::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +bool TouchViewControllerDelegate::IsMaximizeModeEnabled() const { + return ash::Shell::GetInstance()->maximize_mode_controller()-> + IsMaximizeModeWindowManagerEnabled(); +} + +void TouchViewControllerDelegate::OnMaximizeModeStarted() { + FOR_EACH_OBSERVER(Observer, observers_, OnMaximizeModeStarted()); +} + +void TouchViewControllerDelegate::OnMaximizeModeEnded() { + FOR_EACH_OBSERVER(Observer, observers_, OnMaximizeModeEnded()); +} + +} // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.h b/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.h new file mode 100644 index 000000000000..58050a1dd793 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/touch_view_controller_delegate.h @@ -0,0 +1,52 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_TOUCH_VIEW_CONTROLLER_DELEGATE_H_ +#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_TOUCH_VIEW_CONTROLLER_DELEGATE_H_ + +#include "ash/shell_observer.h" +#include "base/observer_list.h" + +namespace chromeos { + +// An interface for ash::MaximizeModeController. +class TouchViewControllerDelegate : public ash::ShellObserver { + public: + // Observer that reports changes to the state of MaximizeModeController's + // rotation lock. + class Observer { + public: + // Invoked when maximize mode started/ended. + virtual void OnMaximizeModeStarted() {} + virtual void OnMaximizeModeEnded() {} + + protected: + virtual ~Observer() {} + }; + + TouchViewControllerDelegate(); + virtual ~TouchViewControllerDelegate(); + + // Add/Remove observers. + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + // Test if the Maximize Mode is enabled or not. + bool IsMaximizeModeEnabled() const; + + + private: + // ash::ShellObserver implementation: + virtual void OnMaximizeModeStarted() OVERRIDE; + virtual void OnMaximizeModeEnded() OVERRIDE; + + // Mode state change observers. + ObserverList observers_; + + DISALLOW_COPY_AND_ASSIGN(TouchViewControllerDelegate); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_TOUCH_VIEW_CONTROLLER_DELEGATE_H_ diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc index e5048d3470c2..5bd6b0626995 100644 --- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc +++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc @@ -495,6 +495,7 @@ void UserManagerScreenHandler::RegisterMessages() { web_ui()->RegisterMessageCallback("accountPickerReady", kDoNothingCallback); web_ui()->RegisterMessageCallback("loginUIStateChanged", kDoNothingCallback); web_ui()->RegisterMessageCallback("hideCaptivePortal", kDoNothingCallback); + web_ui()->RegisterMessageCallback("getTouchViewState", kDoNothingCallback); // Unused callbacks from display_manager.js web_ui()->RegisterMessageCallback("showAddUser", kDoNothingCallback); web_ui()->RegisterMessageCallback("loadWallpaper", kDoNothingCallback); diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index e92ed1bb1949..0d0723aa3955 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi @@ -1016,6 +1016,8 @@ 'browser/ui/webui/chromeos/login/user_image_screen_handler.h', 'browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc', 'browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h', + 'browser/ui/webui/chromeos/touch_view_controller_delegate.cc', + 'browser/ui/webui/chromeos/touch_view_controller_delegate.h', 'browser/ui/webui/chromeos/mobile_setup_dialog.cc', 'browser/ui/webui/chromeos/mobile_setup_dialog.h', 'browser/ui/webui/chromeos/mobile_setup_ui.cc', diff --git a/ui/login/account_picker/screen_account_picker.js b/ui/login/account_picker/screen_account_picker.js index e1dbd6664256..fc87cc438e8d 100644 --- a/ui/login/account_picker/screen_account_picker.js +++ b/ui/login/account_picker/screen_account_picker.js @@ -29,6 +29,7 @@ login.createScreen('AccountPickerScreen', 'account-picker', function() { 'showUserPodCustomIcon', 'hideUserPodCustomIcon', 'setAuthType', + 'setTouchViewState', 'setPublicSessionDisplayName', 'setPublicSessionLocales', 'setPublicSessionKeyboardLayouts', @@ -113,6 +114,7 @@ login.createScreen('AccountPickerScreen', 'account-picker', function() { * Event handler invoked when the page is shown and ready. */ onShow: function() { + chrome.send('getTouchViewState'); if (!this.firstShown_) return; this.firstShown_ = false; @@ -304,6 +306,14 @@ login.createScreen('AccountPickerScreen', 'account-picker', function() { }, /** + * Sets the state of touch view mode. + * @param {boolean} isTouchViewEnabled true if the mode is on. + */ + setTouchViewState: function(isTouchViewEnabled) { + $('pod-row').setTouchViewState(isTouchViewEnabled); + }, + + /** * Updates the display name shown on a public session pod. * @param {string} userID The user ID of the public session * @param {string} displayName The new display name diff --git a/ui/login/account_picker/user_pod_row.js b/ui/login/account_picker/user_pod_row.js index 6828093a94a1..356a1a61fd81 100644 --- a/ui/login/account_picker/user_pod_row.js +++ b/ui/login/account_picker/user_pod_row.js @@ -2005,6 +2005,10 @@ cr.define('login', function() { // Array of users that are shown (public/supervised/regular). users_: [], + // If we're disabling single pod autofocus for Touch View. + touchViewSinglePodExperimentOn_: true, + + /** @override */ decorate: function() { // Event listeners that are installed for the time period during which @@ -2034,14 +2038,17 @@ cr.define('login', function() { /** * Return true if user pod row has only single user pod in it, which should - * always be focused. + * always be focused except desktop and touch view modes. * @type {boolean} */ get alwaysFocusSinglePod() { var isDesktopUserManager = Oobe.getInstance().displayType == DISPLAY_TYPE.DESKTOP_USER_MANAGER; - return isDesktopUserManager ? false : this.children.length == 1; + return (isDesktopUserManager || + (this.touchViewSinglePodExperimentOn_ && + this.touchViewEnabled_)) ? + false : this.children.length == 1; }, /** @@ -2372,6 +2379,14 @@ cr.define('login', function() { }, /** + * Sets the state of touch view mode. + * @param {boolean} isTouchViewEnabled true if the mode is on. + */ + setTouchViewState: function(isTouchViewEnabled) { + this.touchViewEnabled_ = isTouchViewEnabled; + }, + + /** * Updates the display name shown on a public session pod. * @param {string} userID The user ID of the public session * @param {string} displayName The new display name -- 2.11.4.GIT