Commit 0007c935 authored by Sarah Hu's avatar Sarah Hu Committed by Commit Bot

Reland: Support feedback keyboard shortcut in views login screen

This CL supports alt+shift+i to open the feedback dialog in views login
screen.

TBR=tsepez@chromium.org

Bug: 852242
Change-Id: I5d124422ade0f1b8f2698520c2cafd7cd7d27382
Reviewed-on: https://chromium-review.googlesource.com/1102035Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarJacob Dufault <jdufault@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Xiaoyin Hu <xiaoyinh@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#567829}
Reviewed-on: https://chromium-review.googlesource.com/1104895
Cr-Commit-Position: refs/heads/master@{#568135}
parent 9526eeed
......@@ -219,6 +219,12 @@ void LoginScreenController::RequestPublicSessionKeyboardLayouts(
login_screen_client_->RequestPublicSessionKeyboardLayouts(account_id, locale);
}
void LoginScreenController::ShowFeedback() {
if (!login_screen_client_)
return;
login_screen_client_->ShowFeedback();
}
void LoginScreenController::AddObserver(
LoginScreenControllerObserver* observer) {
observers_.AddObserver(observer);
......
......@@ -77,6 +77,7 @@ class ASH_EXPORT LoginScreenController : public mojom::LoginScreen {
const std::string& input_method);
void RequestPublicSessionKeyboardLayouts(const AccountId& account_id,
const std::string& locale);
void ShowFeedback();
// Add or remove an observer.
void AddObserver(LoginScreenControllerObserver* observer);
......
......@@ -66,6 +66,7 @@ class MockLoginScreenClient : public mojom::LoginScreenClient {
const std::string& input_method));
MOCK_METHOD2(RequestPublicSessionKeyboardLayouts,
void(const AccountId& account_id, const std::string& locale));
MOCK_METHOD0(ShowFeedback, void());
private:
bool authenticate_user_callback_result_ = true;
......
......@@ -8,6 +8,7 @@
#include <memory>
#include <utility>
#include "ash/accelerators/accelerator_controller.h"
#include "ash/detachable_base/detachable_base_pairing_status.h"
#include "ash/focus_cycler.h"
#include "ash/ime/ime_controller.h"
......@@ -76,7 +77,7 @@ constexpr int kMediumDensityMarginLeftOfAuthUserPortraitDp = 0;
constexpr int kMediumDensityDistanceBetweenAuthUserAndUsersLandscapeDp = 220;
constexpr int kMediumDensityDistanceBetweenAuthUserAndUsersPortraitDp = 84;
constexpr const char kLockContentsViewName[] = "LockContentsView";
constexpr char kLockContentsViewName[] = "LockContentsView";
// A view which stores two preferred sizes. The embedder can control which one
// is used.
......@@ -303,9 +304,11 @@ LockContentsView::LockContentsView(
OnLockScreenNoteStateChanged(initial_note_action_state);
chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
this);
RegisterAccelerators();
}
LockContentsView::~LockContentsView() {
Shell::Get()->accelerator_controller()->UnregisterAll(this);
data_dispatcher_->RemoveObserver(this);
Shell::Get()->login_screen_controller()->RemoveObserver(this);
keyboard::KeyboardController::Get()->RemoveObserver(this);
......@@ -373,6 +376,15 @@ void LockContentsView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->SetNameExplicitlyEmpty();
}
bool LockContentsView::AcceleratorPressed(const ui::Accelerator& accelerator) {
auto entry = accel_map_.find(accelerator);
if (entry == accel_map_.end())
return false;
PerformAction(entry->second);
return true;
}
void LockContentsView::OnUsersChanged(
const std::vector<mojom::LoginUserInfoPtr>& users) {
// The debug view will potentially call this method many times. Make sure to
......@@ -1322,4 +1334,24 @@ void LockContentsView::DisableLockScreenNote() {
OnLockScreenNoteStateChanged(mojom::TrayActionState::kNotAvailable);
}
void LockContentsView::RegisterAccelerators() {
// TODO: Add more accelerators that are applicable to login screen.
accel_map_[ui::Accelerator(ui::VKEY_I, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN)] =
AcceleratorAction::kShowFeedback;
AcceleratorController* controller = Shell::Get()->accelerator_controller();
for (const auto& item : accel_map_)
controller->Register({item.first}, this);
}
void LockContentsView::PerformAction(AcceleratorAction action) {
switch (action) {
case AcceleratorAction::kShowFeedback:
Shell::Get()->login_screen_controller()->ShowFeedback();
return;
default:
NOTREACHED();
}
}
} // namespace ash
......@@ -5,6 +5,7 @@
#ifndef ASH_LOGIN_UI_LOCK_CONTENTS_VIEW_H_
#define ASH_LOGIN_UI_LOCK_CONTENTS_VIEW_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
......@@ -99,6 +100,10 @@ class ASH_EXPORT LockContentsView
kExclusivePublicAccountExpandedView,
};
enum class AcceleratorAction {
kShowFeedback,
};
// Number of login attempts before a login dialog is shown. For example, if
// this value is 4 then the user can submit their password 4 times, and on the
// 4th bad attempt the login dialog is shown. This only applies to the login
......@@ -118,6 +123,7 @@ class ASH_EXPORT LockContentsView
void OnFocus() override;
void AboutToRequestFocusFromTabTraversal(bool reverse) override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
// LoginScreenController::Observer:
void SetAvatarForUser(const AccountId& account_id,
......@@ -331,6 +337,12 @@ class ASH_EXPORT LockContentsView
// All the subsequent calls of |OnLockScreenNoteStateChanged| will be ignored.
void DisableLockScreenNote();
// Register accelerators used in login screen.
void RegisterAccelerators();
// Performs the specified accelerator action.
void PerformAction(AcceleratorAction action);
const LockScreen::ScreenType screen_type_;
std::vector<UserState> users_;
......@@ -392,6 +404,9 @@ class ASH_EXPORT LockContentsView
// KeyboardControllerState::HIDDEN.
bool keyboard_shown_ = false;
// Accelerators handled by login screen.
std::map<ui::Accelerator, AcceleratorAction> accel_map_;
DISALLOW_COPY_AND_ASSIGN(LockContentsView);
};
......
......@@ -213,4 +213,7 @@ interface LoginScreenClient {
// locale.
RequestPublicSessionKeyboardLayouts(signin.mojom.AccountId account_id,
string locale);
// Request to show a feedback report dialog in chrome.
ShowFeedback();
};
......@@ -132,4 +132,6 @@ void FakeLoginDisplayHost::MigrateUserData(const std::string& old_password) {}
void FakeLoginDisplayHost::ResyncUserData() {}
void FakeLoginDisplayHost::ShowFeedback() {}
} // namespace chromeos
......@@ -62,6 +62,7 @@ class FakeLoginDisplayHost : public LoginDisplayHost {
void CancelPasswordChangedFlow() override;
void MigrateUserData(const std::string& old_password) override;
void ResyncUserData() override;
void ShowFeedback() override;
private:
class FakeBaseScreen;
......
......@@ -178,6 +178,9 @@ class LoginDisplayHost {
// user data.
virtual void ResyncUserData() = 0;
// Shows a feedback report dialog.
virtual void ShowFeedback() = 0;
protected:
LoginDisplayHost();
virtual ~LoginDisplayHost();
......
......@@ -24,7 +24,10 @@
namespace chromeos {
namespace {
constexpr char kLoginDisplay[] = "login";
constexpr char kAccelSendFeedback[] = "send_feedback";
} // namespace
LoginDisplayHostMojo::LoginDisplayHostMojo()
......@@ -242,6 +245,12 @@ const user_manager::UserList LoginDisplayHostMojo::GetUsers() {
return users_;
}
void LoginDisplayHostMojo::ShowFeedback() {
DCHECK(GetOobeUI());
GetOobeUI()->web_ui()->CallJavascriptFunctionUnsafe(
"cr.ui.Oobe.handleAccelerator", base::Value(kAccelSendFeedback));
}
void LoginDisplayHostMojo::CancelPasswordChangedFlow() {
// Close the Oobe UI dialog.
UpdateGaiaDialogVisibility(false /*visible*/, true /*can_close*/,
......
......@@ -89,6 +89,7 @@ class LoginDisplayHostMojo : public LoginDisplayHostCommon,
void UpdateGaiaDialogSize(int width, int height) override;
const user_manager::UserList GetUsers() override;
void CancelPasswordChangedFlow() override;
void ShowFeedback() override;
// LoginScreenClient::Delegate:
void HandleAuthenticateUser(const AccountId& account_id,
......
......@@ -1164,6 +1164,10 @@ const user_manager::UserList LoginDisplayHostWebUI::GetUsers() {
return user_manager::UserList();
}
void LoginDisplayHostWebUI::ShowFeedback() {
NOTREACHED();
}
////////////////////////////////////////////////////////////////////////////////
// external
......
......@@ -77,6 +77,7 @@ class LoginDisplayHostWebUI : public LoginDisplayHostCommon,
const base::Optional<AccountId>& prefilled_account) override;
void UpdateGaiaDialogSize(int width, int height) override;
const user_manager::UserList GetUsers() override;
void ShowFeedback() override;
// Creates WizardController instance.
WizardController* CreateWizardController();
......
......@@ -69,6 +69,7 @@ class MockLoginDisplayHost : public LoginDisplayHost {
MOCK_METHOD0(CancelPasswordChangedFlow, void());
MOCK_METHOD1(MigrateUserData, void(const std::string&));
MOCK_METHOD0(ResyncUserData, void());
MOCK_METHOD0(ShowFeedback, void());
private:
DISALLOW_COPY_AND_ASSIGN(MockLoginDisplayHost);
......
......@@ -146,6 +146,11 @@ void LoginScreenClient::RequestPublicSessionKeyboardLayouts(
locale);
}
void LoginScreenClient::ShowFeedback() {
if (chromeos::LoginDisplayHost::default_host())
chromeos::LoginDisplayHost::default_host()->ShowFeedback();
}
void LoginScreenClient::LoadWallpaper(const AccountId& account_id) {
WallpaperControllerClient::Get()->ShowUserWallpaper(account_id);
}
......
......@@ -82,6 +82,7 @@ class LoginScreenClient : public ash::mojom::LoginScreenClient {
const std::string& input_method) override;
void RequestPublicSessionKeyboardLayouts(const AccountId& account_id,
const std::string& locale) override;
void ShowFeedback() override;
private:
void SetPublicSessionKeyboardLayout(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment