Commit 8acebcb1 authored by Megumi Hattori's avatar Megumi Hattori Committed by Commit Bot

Enable reply button on the right of the textfield in the inline reply.

This CL enable the reply button on the right of the textfield in the inline reply.
So, the message in the textfield can be submitted not only by pressing enter key but also clicking the reply button.

TEST=message_center_unittests
Bug=803759

Change-Id: I6e7518d0fabd329d52d589b2024357869aca2fa2
Reviewed-on: https://chromium-review.googlesource.com/885693
Commit-Queue: Megumi Hattori <megumihattori@google.com>
Reviewed-by: default avatarYoshiki Iguchi <yoshiki@chromium.org>
Reviewed-by: default avatarTetsui Ohkubo <tetsui@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532345}
parent 09ef7a92
...@@ -428,31 +428,36 @@ void NotificationInputTextfieldMD::set_placeholder( ...@@ -428,31 +428,36 @@ void NotificationInputTextfieldMD::set_placeholder(
// NotificationInputReplyButtonMD ////////////////////////////////////////////// // NotificationInputReplyButtonMD //////////////////////////////////////////////
NotificationInputReplyButtonMD::NotificationInputReplyButtonMD() { NotificationInputReplyButtonMD::NotificationInputReplyButtonMD(
views::ButtonListener* listener)
: views::ImageButton(listener) {
SetPlaceholderImage(); SetPlaceholderImage();
SetBorder(views::CreateEmptyBorder(kInputReplyButtonPadding)); SetBorder(views::CreateEmptyBorder(kInputReplyButtonPadding));
SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
} }
NotificationInputReplyButtonMD::~NotificationInputReplyButtonMD() = default; NotificationInputReplyButtonMD::~NotificationInputReplyButtonMD() = default;
void NotificationInputReplyButtonMD::SetNormalImage() { void NotificationInputReplyButtonMD::SetNormalImage() {
SetImage(gfx::CreateVectorIcon(kNotificationInlineReplyIcon, SetImage(STATE_NORMAL, gfx::CreateVectorIcon(kNotificationInlineReplyIcon,
kInputReplyButtonSize, kInputReplyButtonSize,
kInputReplyButtonColor)); kInputReplyButtonColor));
} }
void NotificationInputReplyButtonMD::SetPlaceholderImage() { void NotificationInputReplyButtonMD::SetPlaceholderImage() {
SetImage(gfx::CreateVectorIcon(kNotificationInlineReplyIcon, SetImage(
kInputReplyButtonSize, STATE_NORMAL,
kInputReplyButtonPlaceholderColor)); gfx::CreateVectorIcon(kNotificationInlineReplyIcon, kInputReplyButtonSize,
kInputReplyButtonPlaceholderColor));
} }
// NotificationInputContainerMD //////////////////////////////////////////////// // NotificationInputContainerMD ////////////////////////////////////////////////
NotificationInputContainerMD::NotificationInputContainerMD( NotificationInputContainerMD::NotificationInputContainerMD(
NotificationInputDelegate* delegate) NotificationInputDelegate* delegate)
: textfield_(new NotificationInputTextfieldMD(delegate)), : delegate_(delegate),
button_(new NotificationInputReplyButtonMD()) { textfield_(new NotificationInputTextfieldMD(delegate)),
button_(new NotificationInputReplyButtonMD(this)) {
auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::kHorizontal, gfx::Insets(), 0)); views::BoxLayout::kHorizontal, gfx::Insets(), 0));
SetBackground(views::CreateSolidBackground(kInputContainerBackgroundColor)); SetBackground(views::CreateSolidBackground(kInputContainerBackgroundColor));
...@@ -463,6 +468,14 @@ NotificationInputContainerMD::NotificationInputContainerMD( ...@@ -463,6 +468,14 @@ NotificationInputContainerMD::NotificationInputContainerMD(
AddChildView(button_); AddChildView(button_);
} }
void NotificationInputContainerMD::ButtonPressed(views::Button* sender,
const ui::Event& event) {
if (sender == button_) {
delegate_->OnNotificationInputSubmit(textfield_->index(),
textfield_->text());
}
}
NotificationInputContainerMD::~NotificationInputContainerMD() = default; NotificationInputContainerMD::~NotificationInputContainerMD() = default;
// InlineSettingsRadioButton /////////////////////////////////////////////////// // InlineSettingsRadioButton ///////////////////////////////////////////////////
......
...@@ -12,12 +12,14 @@ ...@@ -12,12 +12,14 @@
#include "ui/message_center/message_center_export.h" #include "ui/message_center/message_center_export.h"
#include "ui/message_center/views/message_view.h" #include "ui/message_center/views/message_view.h"
#include "ui/views/controls/button/button.h" #include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/textfield/textfield.h" #include "ui/views/controls/textfield/textfield.h"
#include "ui/views/controls/textfield/textfield_controller.h" #include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/view_targeter_delegate.h" #include "ui/views/view_targeter_delegate.h"
namespace views { namespace views {
class ImageButton;
class Label; class Label;
class LabelButton; class LabelButton;
class ProgressBar; class ProgressBar;
...@@ -161,6 +163,8 @@ class NotificationInputTextfieldMD : public views::Textfield, ...@@ -161,6 +163,8 @@ class NotificationInputTextfieldMD : public views::Textfield,
void set_index(size_t index) { index_ = index; } void set_index(size_t index) { index_ = index; }
void set_placeholder(const base::string16& placeholder); void set_placeholder(const base::string16& placeholder);
size_t index() const { return index_; };
private: private:
NotificationInputDelegate* const delegate_; NotificationInputDelegate* const delegate_;
...@@ -173,9 +177,9 @@ class NotificationInputTextfieldMD : public views::Textfield, ...@@ -173,9 +177,9 @@ class NotificationInputTextfieldMD : public views::Textfield,
DISALLOW_COPY_AND_ASSIGN(NotificationInputTextfieldMD); DISALLOW_COPY_AND_ASSIGN(NotificationInputTextfieldMD);
}; };
class NotificationInputReplyButtonMD : public views::ImageView { class NotificationInputReplyButtonMD : public views::ImageButton {
public: public:
NotificationInputReplyButtonMD(); NotificationInputReplyButtonMD(views::ButtonListener* listener);
~NotificationInputReplyButtonMD() override; ~NotificationInputReplyButtonMD() override;
void SetNormalImage(); void SetNormalImage();
...@@ -185,15 +189,20 @@ class NotificationInputReplyButtonMD : public views::ImageView { ...@@ -185,15 +189,20 @@ class NotificationInputReplyButtonMD : public views::ImageView {
DISALLOW_COPY_AND_ASSIGN(NotificationInputReplyButtonMD); DISALLOW_COPY_AND_ASSIGN(NotificationInputReplyButtonMD);
}; };
class NotificationInputContainerMD : public views::View { class NotificationInputContainerMD : public views::View,
public views::ButtonListener {
public: public:
NotificationInputContainerMD(NotificationInputDelegate* delegate); NotificationInputContainerMD(NotificationInputDelegate* delegate);
~NotificationInputContainerMD() override; ~NotificationInputContainerMD() override;
void ButtonPressed(views::Button* sender, const ui::Event& event) override;
NotificationInputTextfieldMD* textfield() const { return textfield_; }; NotificationInputTextfieldMD* textfield() const { return textfield_; };
NotificationInputReplyButtonMD* button() const { return button_; }; NotificationInputReplyButtonMD* button() const { return button_; };
private: private:
NotificationInputDelegate* const delegate_;
NotificationInputTextfieldMD* const textfield_; NotificationInputTextfieldMD* const textfield_;
NotificationInputReplyButtonMD* const button_; NotificationInputReplyButtonMD* const button_;
......
...@@ -54,6 +54,11 @@ class NotificationTestDelegate : public NotificationDelegate { ...@@ -54,6 +54,11 @@ class NotificationTestDelegate : public NotificationDelegate {
submitted_reply_string_ = reply; submitted_reply_string_ = reply;
} }
void Reset() {
clicked_button_index_ = -1;
submitted_reply_string_ = base::EmptyString16();
}
void DisableNotification() override { disable_notification_called_ = true; } void DisableNotification() override { disable_notification_called_ = true; }
int clicked_button_index() const { return clicked_button_index_; } int clicked_button_index() const { return clicked_button_index_; }
...@@ -504,15 +509,50 @@ TEST_F(NotificationViewMDTest, TestInlineReply) { ...@@ -504,15 +509,50 @@ TEST_F(NotificationViewMDTest, TestInlineReply) {
EXPECT_TRUE(notification_view()->inline_reply_->textfield()->visible()); EXPECT_TRUE(notification_view()->inline_reply_->textfield()->visible());
EXPECT_TRUE(notification_view()->inline_reply_->textfield()->HasFocus()); EXPECT_TRUE(notification_view()->inline_reply_->textfield()->HasFocus());
// Type the text and submit. // Type the text.
ui::KeyboardCode keycodes[] = {ui::VKEY_T, ui::VKEY_E, ui::VKEY_S, ui::VKEY_T, ui::KeyboardCode keycodes[] = {ui::VKEY_T, ui::VKEY_E, ui::VKEY_S,
ui::VKEY_RETURN}; ui::VKEY_T};
for (ui::KeyboardCode keycode : keycodes) {
generator.PressKey(keycode, ui::EF_NONE);
generator.ReleaseKey(keycode, ui::EF_NONE);
}
// Submit by typing RETURN key.
generator.PressKey(ui::VKEY_RETURN, ui::EF_NONE);
generator.ReleaseKey(ui::VKEY_RETURN, ui::EF_NONE);
EXPECT_EQ(1, delegate_->clicked_button_index());
EXPECT_EQ(base::ASCIIToUTF16("test"), delegate_->submitted_reply_string());
// Reset values.
delegate_->Reset();
// Now construct a mouse click event 1 pixel inside the boundary of the action
// button.
cursor_location = gfx::Point(1, 1);
views::View::ConvertPointToScreen(notification_view()->action_buttons_[1],
&cursor_location);
generator.MoveMouseTo(cursor_location);
generator.ClickLeftButton();
// Nothing should be submitted at this point.
EXPECT_EQ(-1, delegate_->clicked_button_index());
EXPECT_EQ(base::EmptyString16(), delegate_->submitted_reply_string());
// Click the button again and focus on the inline textfield.
generator.ClickLeftButton();
// Type the text.
for (ui::KeyboardCode keycode : keycodes) { for (ui::KeyboardCode keycode : keycodes) {
generator.PressKey(keycode, ui::EF_NONE); generator.PressKey(keycode, ui::EF_NONE);
generator.ReleaseKey(keycode, ui::EF_NONE); generator.ReleaseKey(keycode, ui::EF_NONE);
} }
// Submit by clicking the reply button.
cursor_location = gfx::Point(1, 1);
views::View::ConvertPointToScreen(
notification_view()->inline_reply_->button(), &cursor_location);
generator.MoveMouseTo(cursor_location);
generator.ClickLeftButton();
EXPECT_EQ(1, delegate_->clicked_button_index()); EXPECT_EQ(1, delegate_->clicked_button_index());
EXPECT_EQ(base::ASCIIToUTF16("test"), delegate_->submitted_reply_string()); EXPECT_EQ(base::ASCIIToUTF16("test"), delegate_->submitted_reply_string());
} }
......
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