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 @@
#include "ash/login/resources/grit/login_resources.h"
#include "ash/login/ui/horizontal_image_sequence_animation_decoder.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/non_accessible_view.h"
#include "ash/login/ui/views_utils.h"
......@@ -254,8 +255,10 @@ class AuthDialogContentsView::FingerprintView : public views::View {
base::OneShotTimer reset_state_;
};
AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods)
: auth_methods_(auth_methods) {
AuthDialogContentsView::AuthDialogContentsView(
uint32_t auth_methods,
const AuthMethodsMetadata& auth_metadata)
: auth_methods_(auth_methods), auth_metadata_(auth_metadata) {
DCHECK(auth_methods_ & kAuthPassword);
SetLayoutManager(std::make_unique<views::FillLayout>());
......@@ -274,8 +277,18 @@ AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods)
AddTitleView();
AddVerticalSpacing(kSpacingAfterTitle);
AddPasswordView();
AddPinView();
if (auth_methods_ & kAuthPin) {
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) {
fingerprint_view_ =
......@@ -285,9 +298,6 @@ AuthDialogContentsView::AuthDialogContentsView(uint32_t auth_methods)
AddVerticalSpacing(kSpacingBeforeButtons);
AddActionButtonsView();
// Deferred because it needs the pin_view_ pointer.
InitPasswordView();
}
AuthDialogContentsView::~AuthDialogContentsView() = default;
......@@ -323,44 +333,63 @@ void AuthDialogContentsView::AddTitleView() {
title_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
}
void AuthDialogContentsView::AddPasswordView() {
password_view_ = container_->AddChildView(
std::make_unique<LoginPasswordView>(CreateInSessionAuthPalette()));
void AuthDialogContentsView::AddPinTextInputView() {
pin_text_input_view_ =
container_->AddChildView(std::make_unique<LoginPasswordView>(palette_));
password_view_->SetPaintToLayer();
password_view_->layer()->SetFillsBoundsOpaquely(false);
password_view_->SetDisplayPasswordButtonVisible(true);
password_view_->SetEnabled(true);
password_view_->SetEnabledOnEmptyPassword(false);
password_view_->SetFocusEnabledForChildViews(true);
password_view_->SetVisible(true);
pin_text_input_view_->SetPaintToLayer();
pin_text_input_view_->layer()->SetFillsBoundsOpaquely(false);
pin_text_input_view_->SetDisplayPasswordButtonVisible(true);
pin_text_input_view_->SetEnabled(true);
pin_text_input_view_->SetEnabledOnEmptyPassword(false);
pin_text_input_view_->SetFocusEnabledForChildViews(true);
pin_text_input_view_->SetVisible(true);
password_view_->SetPlaceholderText(
pin_text_input_view_->SetPlaceholderText(
(auth_methods_ & kAuthPin)
? l10n_util::GetStringUTF16(
IDS_ASH_LOGIN_POD_PASSWORD_PIN_PLACEHOLDER)
: l10n_util::GetStringUTF16(IDS_ASH_LOGIN_POD_PASSWORD_PLACEHOLDER));
}
void AuthDialogContentsView::AddPinView() {
pin_view_ = container_->AddChildView(std::make_unique<LoginPinView>(
LoginPinView::Style::kAlphanumeric, CreateInSessionAuthPalette(),
base::BindRepeating(&LoginPasswordView::InsertNumber,
base::Unretained(password_view_)),
base::BindRepeating(&LoginPasswordView::Backspace,
base::Unretained(password_view_)),
base::BindRepeating(&LoginPasswordView::SubmitPassword,
base::Unretained(password_view_))));
pin_view_->SetVisible(auth_methods_ & kAuthPin);
void AuthDialogContentsView::AddPinDigitInputView() {
pin_digit_input_view_ =
container_->AddChildView(std::make_unique<LoginPinInputView>(palette_));
pin_digit_input_view_->UpdateLength(auth_metadata_.autosubmit_pin_length);
pin_digit_input_view_->SetVisible(true);
}
void AuthDialogContentsView::InitPasswordView() {
password_view_->Init(
base::BindRepeating(&AuthDialogContentsView::OnAuthSubmit,
base::Unretained(this)),
base::BindRepeating(&LoginPinView::OnPasswordTextChanged,
base::Unretained(pin_view_)),
base::DoNothing(), views::Button::PressedCallback());
void AuthDialogContentsView::AddPinPadView() {
DCHECK(auth_methods_ & kAuthPin);
if (pin_autosubmit_on_) {
pin_pad_view_ = container_->AddChildView(std::make_unique<LoginPinView>(
LoginPinView::Style::kAlphanumeric, palette_,
base::BindRepeating(&LoginPinInputView::InsertDigit,
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) {
......
......@@ -7,6 +7,7 @@
#include <string>
#include "ash/login/ui/login_palette.h"
#include "ash/public/cpp/login_types.h"
#include "ui/views/view.h"
......@@ -19,6 +20,7 @@ namespace ash {
class LoginPasswordView;
class LoginPinView;
class LoginPinInputView;
// Contains the debug views that allows the developer to interact with the
// AuthDialogController.
......@@ -32,7 +34,14 @@ class AuthDialogContentsView : public views::View {
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& operator=(const AuthDialogContentsView&) = delete;
~AuthDialogContentsView() override;
......@@ -54,11 +63,14 @@ class AuthDialogContentsView : public views::View {
// Add a view for the prompt message.
void AddPromptView();
// Add a view for password input field.
void AddPasswordView();
// Add a view for entering PIN (if autosubmit is off).
void AddPinTextInputView();
// 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.
void InitPasswordView();
......@@ -91,17 +103,28 @@ class AuthDialogContentsView : public views::View {
// Prompt message to the user.
views::Label* prompt_ = nullptr;
// Password input field for password and PIN.
LoginPasswordView* password_view_ = nullptr;
// Whether PIN can be auto submitted.
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.
LoginPinView* pin_view_ = nullptr;
LoginPinView* pin_pad_view_ = nullptr;
FingerprintView* fingerprint_view_ = nullptr;
// Flags of auth methods that should be visible.
uint32_t auth_methods_ = 0u;
// Extra parameters to control the UI.
AuthMethodsMetadata auth_metadata_;
LoginPalette palette_ = CreateInSessionAuthPalette();
// Container which holds action buttons.
views::View* action_view_container_ = nullptr;
......
......@@ -4,7 +4,6 @@
#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 "base/command_line.h"
#include "ui/aura/window.h"
......@@ -47,11 +46,14 @@ std::unique_ptr<views::Widget> CreateAuthDialogWidget(
} // namespace
InSessionAuthDialog::InSessionAuthDialog(uint32_t auth_methods,
aura::Window* parent_window)
InSessionAuthDialog::InSessionAuthDialog(
uint32_t auth_methods,
aura::Window* parent_window,
const AuthDialogContentsView::AuthMethodsMetadata& auth_metadata)
: auth_methods_(auth_methods) {
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::Size preferred_size = widget_->GetContentsView()->GetPreferredSize();
int horizontal_inset_dp = (bounds.width() - preferred_size.width()) / 2;
......
......@@ -8,6 +8,7 @@
#include <memory>
#include "ash/ash_export.h"
#include "ash/in_session_auth/auth_dialog_contents_view.h"
namespace aura {
class Window;
......@@ -26,7 +27,10 @@ class RoundedCornerDecorator;
// completed.
class InSessionAuthDialog {
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& operator=(const InSessionAuthDialog&) = delete;
~InSessionAuthDialog();
......
......@@ -12,6 +12,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/strings/string_util.h"
#include "components/user_manager/known_user.h"
#include "ui/aura/window.h"
#include "ui/views/widget/widget.h"
#include "ui/wm/core/focus_controller.h"
......@@ -97,9 +98,15 @@ void InSessionAuthDialogControllerImpl::OnPinCanAuthenticate(
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);
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() {
......
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