Commit 3f216d6c authored by Yicheng Li's avatar Yicheng Li Committed by Commit Bot

ash: Add PIN autosubmit functionality to in-session auth

Bug: b/156258540
Change-Id: I7fef896b35c3141f4377b90eda34c8925c008c9e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2506242
Commit-Queue: Yicheng Li <yichengli@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#823637}
parent 9b06a10a
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "ash/login/resources/grit/login_resources.h" #include "ash/login/resources/grit/login_resources.h"
#include "ash/login/ui/horizontal_image_sequence_animation_decoder.h" #include "ash/login/ui/horizontal_image_sequence_animation_decoder.h"
#include "ash/login/ui/login_password_view.h" #include "ash/login/ui/login_password_view.h"
#include "ash/login/ui/login_pin_input_view.h"
#include "ash/login/ui/login_pin_view.h" #include "ash/login/ui/login_pin_view.h"
#include "ash/login/ui/non_accessible_view.h" #include "ash/login/ui/non_accessible_view.h"
#include "ash/login/ui/views_utils.h" #include "ash/login/ui/views_utils.h"
...@@ -254,8 +255,10 @@ class AuthDialogContentsView::FingerprintView : public views::View { ...@@ -254,8 +255,10 @@ class AuthDialogContentsView::FingerprintView : public views::View {
base::OneShotTimer reset_state_; base::OneShotTimer reset_state_;
}; };
AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods) AuthDialogContentsView::AuthDialogContentsView(
: auth_methods_(auth_methods) { uint32_t auth_methods,
const AuthMethodsMetadata& auth_metadata)
: auth_methods_(auth_methods), auth_metadata_(auth_metadata) {
DCHECK(auth_methods_ & kAuthPassword); DCHECK(auth_methods_ & kAuthPassword);
SetLayoutManager(std::make_unique<views::FillLayout>()); SetLayoutManager(std::make_unique<views::FillLayout>());
...@@ -274,8 +277,18 @@ AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods) ...@@ -274,8 +277,18 @@ AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods)
AddTitleView(); AddTitleView();
AddVerticalSpacing(kSpacingAfterTitle); AddVerticalSpacing(kSpacingAfterTitle);
AddPasswordView(); if (auth_methods_ & kAuthPin) {
AddPinView(); if (LoginPinInputView::IsAutosubmitSupported(
auth_metadata_.autosubmit_pin_length)) {
pin_autosubmit_on_ = true;
AddPinDigitInputView();
} else {
pin_autosubmit_on_ = false;
AddPinTextInputView();
}
// PIN pad is always visible regardless of PIN autosubmit status.
AddPinPadView();
}
if (auth_methods_ & kAuthFingerprint) { if (auth_methods_ & kAuthFingerprint) {
fingerprint_view_ = fingerprint_view_ =
...@@ -285,9 +298,6 @@ AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods) ...@@ -285,9 +298,6 @@ AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods)
AddVerticalSpacing(kSpacingBeforeButtons); AddVerticalSpacing(kSpacingBeforeButtons);
AddActionButtonsView(); AddActionButtonsView();
// Deferred because it needs the pin_view_ pointer.
InitPasswordView();
} }
AuthDialogContentsView::~AuthDialogContentsView() = default; AuthDialogContentsView::~AuthDialogContentsView() = default;
...@@ -323,44 +333,63 @@ void AuthDialogContentsView::AddTitleView() { ...@@ -323,44 +333,63 @@ void AuthDialogContentsView::AddTitleView() {
title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); title_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
} }
void AuthDialogContentsView::AddPasswordView() { void AuthDialogContentsView::AddPinTextInputView() {
password_view_ = container_->AddChildView( pin_text_input_view_ =
std::make_unique<LoginPasswordView>(CreateInSessionAuthPalette())); container_->AddChildView(std::make_unique<LoginPasswordView>(palette_));
password_view_->SetPaintToLayer(); pin_text_input_view_->SetPaintToLayer();
password_view_->layer()->SetFillsBoundsOpaquely(false); pin_text_input_view_->layer()->SetFillsBoundsOpaquely(false);
password_view_->SetDisplayPasswordButtonVisible(true); pin_text_input_view_->SetDisplayPasswordButtonVisible(true);
password_view_->SetEnabled(true); pin_text_input_view_->SetEnabled(true);
password_view_->SetEnabledOnEmptyPassword(false); pin_text_input_view_->SetEnabledOnEmptyPassword(false);
password_view_->SetFocusEnabledForChildViews(true); pin_text_input_view_->SetFocusEnabledForChildViews(true);
password_view_->SetVisible(true); pin_text_input_view_->SetVisible(true);
password_view_->SetPlaceholderText( pin_text_input_view_->SetPlaceholderText(
(auth_methods_ & kAuthPin) (auth_methods_ & kAuthPin)
? l10n_util::GetStringUTF16( ? l10n_util::GetStringUTF16(
IDS_ASH_LOGIN_POD_PASSWORD_PIN_PLACEHOLDER) IDS_ASH_LOGIN_POD_PASSWORD_PIN_PLACEHOLDER)
: l10n_util::GetStringUTF16(IDS_ASH_LOGIN_POD_PASSWORD_PLACEHOLDER)); : l10n_util::GetStringUTF16(IDS_ASH_LOGIN_POD_PASSWORD_PLACEHOLDER));
} }
void AuthDialogContentsView::AddPinView() { void AuthDialogContentsView::AddPinDigitInputView() {
pin_view_ = container_->AddChildView(std::make_unique<LoginPinView>( pin_digit_input_view_ =
LoginPinView::Style::kAlphanumeric, CreateInSessionAuthPalette(), container_->AddChildView(std::make_unique<LoginPinInputView>(palette_));
base::BindRepeating(&LoginPasswordView::InsertNumber, pin_digit_input_view_->UpdateLength(auth_metadata_.autosubmit_pin_length);
base::Unretained(password_view_)), pin_digit_input_view_->SetVisible(true);
base::BindRepeating(&LoginPasswordView::Backspace,
base::Unretained(password_view_)),
base::BindRepeating(&LoginPasswordView::SubmitPassword,
base::Unretained(password_view_))));
pin_view_->SetVisible(auth_methods_ & kAuthPin);
} }
void AuthDialogContentsView::InitPasswordView() { void AuthDialogContentsView::AddPinPadView() {
password_view_->Init( DCHECK(auth_methods_ & kAuthPin);
base::BindRepeating(&AuthDialogContentsView::OnAuthSubmit, if (pin_autosubmit_on_) {
base::Unretained(this)), pin_pad_view_ = container_->AddChildView(std::make_unique<LoginPinView>(
base::BindRepeating(&LoginPinView::OnPasswordTextChanged, LoginPinView::Style::kAlphanumeric, palette_,
base::Unretained(pin_view_)), base::BindRepeating(&LoginPinInputView::InsertDigit,
base::DoNothing(), views::Button::PressedCallback()); base::Unretained(pin_digit_input_view_)),
base::BindRepeating(&LoginPinInputView::Backspace,
base::Unretained(pin_digit_input_view_))));
pin_digit_input_view_->Init(
base::BindRepeating(&AuthDialogContentsView::OnAuthSubmit,
base::Unretained(this)),
base::BindRepeating(&LoginPinView::OnPasswordTextChanged,
base::Unretained(pin_pad_view_)));
} else {
pin_pad_view_ = container_->AddChildView(std::make_unique<LoginPinView>(
LoginPinView::Style::kAlphanumeric, palette_,
base::BindRepeating(&LoginPasswordView::InsertNumber,
base::Unretained(pin_text_input_view_)),
base::BindRepeating(&LoginPasswordView::Backspace,
base::Unretained(pin_text_input_view_)),
base::BindRepeating(&LoginPasswordView::SubmitPassword,
base::Unretained(pin_text_input_view_))));
pin_text_input_view_->Init(
base::BindRepeating(&AuthDialogContentsView::OnAuthSubmit,
base::Unretained(this)),
base::BindRepeating(&LoginPinView::OnPasswordTextChanged,
base::Unretained(pin_pad_view_)),
base::DoNothing(), views::Button::PressedCallback());
}
pin_pad_view_->SetVisible(true);
} }
void AuthDialogContentsView::AddVerticalSpacing(int height) { void AuthDialogContentsView::AddVerticalSpacing(int height) {
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <string> #include <string>
#include "ash/login/ui/login_palette.h"
#include "ash/public/cpp/login_types.h" #include "ash/public/cpp/login_types.h"
#include "ui/views/view.h" #include "ui/views/view.h"
...@@ -19,6 +20,7 @@ namespace ash { ...@@ -19,6 +20,7 @@ namespace ash {
class LoginPasswordView; class LoginPasswordView;
class LoginPinView; class LoginPinView;
class LoginPinInputView;
// Contains the debug views that allows the developer to interact with the // Contains the debug views that allows the developer to interact with the
// AuthDialogController. // AuthDialogController.
...@@ -32,7 +34,14 @@ class AuthDialogContentsView : public views::View { ...@@ -32,7 +34,14 @@ class AuthDialogContentsView : public views::View {
kAuthFingerprint = 1 << 2, // Use fingerprint to unlock. kAuthFingerprint = 1 << 2, // Use fingerprint to unlock.
}; };
explicit AuthDialogContentsView(uint32_t auth_methods); // Extra control parameters to be passed when setting the auth methods.
struct AuthMethodsMetadata {
// User's pin length to use for autosubmit.
size_t autosubmit_pin_length = 0;
};
AuthDialogContentsView(uint32_t auth_methods,
const AuthMethodsMetadata& auth_metadata);
AuthDialogContentsView(const AuthDialogContentsView&) = delete; AuthDialogContentsView(const AuthDialogContentsView&) = delete;
AuthDialogContentsView& operator=(const AuthDialogContentsView&) = delete; AuthDialogContentsView& operator=(const AuthDialogContentsView&) = delete;
~AuthDialogContentsView() override; ~AuthDialogContentsView() override;
...@@ -54,11 +63,14 @@ class AuthDialogContentsView : public views::View { ...@@ -54,11 +63,14 @@ class AuthDialogContentsView : public views::View {
// Add a view for the prompt message. // Add a view for the prompt message.
void AddPromptView(); void AddPromptView();
// Add a view for password input field. // Add a view for entering PIN (if autosubmit is off).
void AddPasswordView(); void AddPinTextInputView();
// Add a PIN pad view. // Add a PIN pad view.
void AddPinView(); void AddPinPadView();
// Add a PIN input view that automatically submits PIN.
void AddPinDigitInputView();
// Initializes password input field functionality. // Initializes password input field functionality.
void InitPasswordView(); void InitPasswordView();
...@@ -91,17 +103,28 @@ class AuthDialogContentsView : public views::View { ...@@ -91,17 +103,28 @@ class AuthDialogContentsView : public views::View {
// Prompt message to the user. // Prompt message to the user.
views::Label* prompt_ = nullptr; views::Label* prompt_ = nullptr;
// Password input field for password and PIN. // Whether PIN can be auto submitted.
LoginPasswordView* password_view_ = nullptr; bool pin_autosubmit_on_ = false;
// Text input field for PIN if PIN cannot be auto submitted.
LoginPasswordView* pin_text_input_view_ = nullptr;
// PIN input view that's shown if PIN can be auto submitted.
LoginPinInputView* pin_digit_input_view_ = nullptr;
// PIN pad view. // PIN pad view.
LoginPinView* pin_view_ = nullptr; LoginPinView* pin_pad_view_ = nullptr;
FingerprintView* fingerprint_view_ = nullptr; FingerprintView* fingerprint_view_ = nullptr;
// Flags of auth methods that should be visible. // Flags of auth methods that should be visible.
uint32_t auth_methods_ = 0u; uint32_t auth_methods_ = 0u;
// Extra parameters to control the UI.
AuthMethodsMetadata auth_metadata_;
LoginPalette palette_ = CreateInSessionAuthPalette();
// Container which holds action buttons. // Container which holds action buttons.
views::View* action_view_container_ = nullptr; views::View* action_view_container_ = nullptr;
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "ash/in_session_auth/in_session_auth_dialog.h" #include "ash/in_session_auth/in_session_auth_dialog.h"
#include "ash/in_session_auth/auth_dialog_contents_view.h"
#include "ash/public/cpp/rounded_corner_decorator.h" #include "ash/public/cpp/rounded_corner_decorator.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
...@@ -47,11 +46,14 @@ std::unique_ptr<views::Widget> CreateAuthDialogWidget( ...@@ -47,11 +46,14 @@ std::unique_ptr<views::Widget> CreateAuthDialogWidget(
} // namespace } // namespace
InSessionAuthDialog::InSessionAuthDialog(uint32_t auth_methods, InSessionAuthDialog::InSessionAuthDialog(
aura::Window* parent_window) uint32_t auth_methods,
aura::Window* parent_window,
const AuthDialogContentsView::AuthMethodsMetadata& auth_metadata)
: auth_methods_(auth_methods) { : auth_methods_(auth_methods) {
widget_ = CreateAuthDialogWidget( widget_ = CreateAuthDialogWidget(
std::make_unique<AuthDialogContentsView>(auth_methods), parent_window); std::make_unique<AuthDialogContentsView>(auth_methods, auth_metadata),
parent_window);
gfx::Rect bounds = parent_window->GetBoundsInScreen(); gfx::Rect bounds = parent_window->GetBoundsInScreen();
gfx::Size preferred_size = widget_->GetContentsView()->GetPreferredSize(); gfx::Size preferred_size = widget_->GetContentsView()->GetPreferredSize();
int horizontal_inset_dp = (bounds.width() - preferred_size.width()) / 2; int horizontal_inset_dp = (bounds.width() - preferred_size.width()) / 2;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "ash/ash_export.h" #include "ash/ash_export.h"
#include "ash/in_session_auth/auth_dialog_contents_view.h"
namespace aura { namespace aura {
class Window; class Window;
...@@ -26,7 +27,10 @@ class RoundedCornerDecorator; ...@@ -26,7 +27,10 @@ class RoundedCornerDecorator;
// completed. // completed.
class InSessionAuthDialog { class InSessionAuthDialog {
public: public:
InSessionAuthDialog(uint32_t auth_methods, aura::Window* parent_window); InSessionAuthDialog(
uint32_t auth_methods,
aura::Window* parent_window,
const AuthDialogContentsView::AuthMethodsMetadata& auth_metadata);
InSessionAuthDialog(const InSessionAuthDialog&) = delete; InSessionAuthDialog(const InSessionAuthDialog&) = delete;
InSessionAuthDialog& operator=(const InSessionAuthDialog&) = delete; InSessionAuthDialog& operator=(const InSessionAuthDialog&) = delete;
~InSessionAuthDialog(); ~InSessionAuthDialog();
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "components/user_manager/known_user.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/wm/core/focus_controller.h" #include "ui/wm/core/focus_controller.h"
...@@ -97,9 +98,15 @@ void InSessionAuthDialogControllerImpl::OnPinCanAuthenticate( ...@@ -97,9 +98,15 @@ void InSessionAuthDialogControllerImpl::OnPinCanAuthenticate(
return; return;
} }
AccountId account_id =
Shell::Get()->session_controller()->GetActiveAccountId();
AuthDialogContentsView::AuthMethodsMetadata auth_metadata;
auth_metadata.autosubmit_pin_length =
user_manager::known_user::GetUserPinLength(account_id);
window_tracker_.Remove(source_window); window_tracker_.Remove(source_window);
Shell::Get()->focus_controller()->AddObserver(this); Shell::Get()->focus_controller()->AddObserver(this);
dialog_ = std::make_unique<InSessionAuthDialog>(auth_methods, source_window); dialog_ = std::make_unique<InSessionAuthDialog>(auth_methods, source_window,
auth_metadata);
} }
void InSessionAuthDialogControllerImpl::DestroyAuthenticationDialog() { void InSessionAuthDialogControllerImpl::DestroyAuthenticationDialog() {
......
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