Commit 6c37d9bc authored by Xiaohui Chen's avatar Xiaohui Chen Committed by Commit Bot

Make assistant main view buttons focusable

Create a utility method to unify the way we create image buttons. This
turns on default ink drop click and focus styles and make them focusable.

Test: manually build and test
Bug: b:112925587
Change-Id: I70c72e033fae2dbad39034d716483c77ea578161
Reviewed-on: https://chromium-review.googlesource.com/1186137
Commit-Queue: Xiaohui Chen <xiaohuic@chromium.org>
Reviewed-by: default avatarMuyuan Li <muyuanli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586068}
parent cc619c2d
...@@ -232,6 +232,8 @@ component("ash") { ...@@ -232,6 +232,8 @@ component("ash") {
"assistant/util/animation_util.h", "assistant/util/animation_util.h",
"assistant/util/deep_link_util.cc", "assistant/util/deep_link_util.cc",
"assistant/util/deep_link_util.h", "assistant/util/deep_link_util.h",
"assistant/util/views_util.cc",
"assistant/util/views_util.h",
"autoclick/autoclick_controller.cc", "autoclick/autoclick_controller.cc",
"autoclick/autoclick_controller.h", "autoclick/autoclick_controller.h",
"cancel_mode.cc", "cancel_mode.cc",
......
...@@ -1703,6 +1703,15 @@ This file contains the strings for ash. ...@@ -1703,6 +1703,15 @@ This file contains the strings for ash.
<message name="IDS_ASH_ASSISTANT_DIALOG_PLATE_HINT" desc="Message shown as a placeholder in Assistant's input textfield when empty."> <message name="IDS_ASH_ASSISTANT_DIALOG_PLATE_HINT" desc="Message shown as a placeholder in Assistant's input textfield when empty.">
Type a message Type a message
</message> </message>
<message name="IDS_ASH_ASSISTANT_DIALOG_PLATE_KEYBOARD_ACCNAME" desc="Accessibility name for a keyboard image button when clicked shows an input textfield for user to type in queries.">
Start a text query
</message>
<message name="IDS_ASH_ASSISTANT_DIALOG_PLATE_MIC_ACCNAME" desc="Accessibility name for a microphone image button when clicked starts listening for user's voice queries.">
Start a voice query
</message>
<message name="IDS_ASH_ASSISTANT_DIALOG_PLATE_SETTINGS_ACCNAME" desc="Accessibility name for a settings image button when clicked shows Assistant settings.">
Assistant Settings
</message>
<message name="IDS_ASH_ASSISTANT_ERROR_GENERIC" desc="Generic message shown when Assistant is in an error state."> <message name="IDS_ASH_ASSISTANT_ERROR_GENERIC" desc="Generic message shown when Assistant is in an error state.">
Something went wrong. Try again in a few seconds. Something went wrong. Try again in a few seconds.
</message> </message>
......
...@@ -7,10 +7,12 @@ ...@@ -7,10 +7,12 @@
#include <memory> #include <memory>
#include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_ui_constants.h"
#include "ash/assistant/util/views_util.h"
#include "ash/public/cpp/vector_icons/vector_icons.h" #include "ash/public/cpp/vector_icons/vector_icons.h"
#include "ash/resources/vector_icons/vector_icons.h" #include "ash/resources/vector_icons/vector_icons.h"
#include "ui/gfx/color_palette.h" #include "ui/gfx/color_palette.h"
#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/paint_vector_icon.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/background.h" #include "ui/views/background.h"
#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button.h"
#include "ui/views/layout/box_layout.h" #include "ui/views/layout/box_layout.h"
...@@ -27,27 +29,13 @@ constexpr int kVectorIconSizeDip = 12; ...@@ -27,27 +29,13 @@ constexpr int kVectorIconSizeDip = 12;
// CaptionButton --------------------------------------------------------------- // CaptionButton ---------------------------------------------------------------
class CaptionButton : public views::ImageButton { views::ImageButton* CreateCaptionButton(const gfx::VectorIcon& icon,
public: int accessible_name_id,
explicit CaptionButton(const gfx::VectorIcon& icon, views::ButtonListener* listener) {
views::ButtonListener* listener) return assistant::util::CreateImageButton(
: views::ImageButton(listener) { listener, icon, kCaptionButtonSizeDip, kVectorIconSizeDip,
SetImage( accessible_name_id, gfx::kGoogleGrey700);
views::Button::ButtonState::STATE_NORMAL, }
gfx::CreateVectorIcon(icon, kVectorIconSizeDip, gfx::kGoogleGrey700));
SetImageAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
}
~CaptionButton() override = default;
// views::View:
gfx::Size CalculatePreferredSize() const override {
return gfx::Size(kCaptionButtonSizeDip, kCaptionButtonSizeDip);
}
private:
DISALLOW_COPY_AND_ASSIGN(CaptionButton);
};
} // namespace } // namespace
...@@ -77,7 +65,8 @@ void CaptionBar::InitLayout() { ...@@ -77,7 +65,8 @@ void CaptionBar::InitLayout() {
views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER); views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER);
// Back. // Back.
CaptionButton* back_button = new CaptionButton(kWindowControlBackIcon, this); auto* back_button =
CreateCaptionButton(kWindowControlBackIcon, IDS_APP_LIST_BACK, this);
back_button->set_id(static_cast<int>(CaptionButtonId::kBack)); back_button->set_id(static_cast<int>(CaptionButtonId::kBack));
AddChildView(back_button); AddChildView(back_button);
...@@ -88,14 +77,14 @@ void CaptionBar::InitLayout() { ...@@ -88,14 +77,14 @@ void CaptionBar::InitLayout() {
layout_manager->SetFlexForView(spacer, 1); layout_manager->SetFlexForView(spacer, 1);
// Minimize. // Minimize.
CaptionButton* minimize_button = auto* minimize_button = CreateCaptionButton(kWindowControlMinimizeIcon,
new CaptionButton(kWindowControlMinimizeIcon, this); IDS_APP_ACCNAME_MINIMIZE, this);
minimize_button->set_id(static_cast<int>(CaptionButtonId::kMinimize)); minimize_button->set_id(static_cast<int>(CaptionButtonId::kMinimize));
AddChildView(minimize_button); AddChildView(minimize_button);
// Close. // Close.
CaptionButton* close_button = auto* close_button =
new CaptionButton(kWindowControlCloseIcon, this); CreateCaptionButton(kWindowControlCloseIcon, IDS_APP_ACCNAME_CLOSE, this);
close_button->set_id(static_cast<int>(CaptionButtonId::kClose)); close_button->set_id(static_cast<int>(CaptionButtonId::kClose));
AddChildView(close_button); AddChildView(close_button);
} }
......
...@@ -21,6 +21,10 @@ namespace ui { ...@@ -21,6 +21,10 @@ namespace ui {
class CallbackLayerAnimationObserver; class CallbackLayerAnimationObserver;
} // namespace ui } // namespace ui
namespace views {
class ImageButton;
} // namespace views
namespace ash { namespace ash {
class AssistantController; class AssistantController;
...@@ -93,19 +97,23 @@ class DialogPlate : public views::View, ...@@ -93,19 +97,23 @@ class DialogPlate : public views::View,
private: private:
void InitLayout(); void InitLayout();
void InitKeyboardLayoutContainer( void InitKeyboardLayoutContainer();
views::View* input_modality_layout_container); void InitVoiceLayoutContainer();
void InitVoiceLayoutContainer(views::View* input_modality_layout_container);
void OnButtonPressed(DialogPlateButtonId id); void OnButtonPressed(DialogPlateButtonId id);
void OnAnimationStarted(const ui::CallbackLayerAnimationObserver& observer); void OnAnimationStarted(const ui::CallbackLayerAnimationObserver& observer);
bool OnAnimationEnded(const ui::CallbackLayerAnimationObserver& observer); bool OnAnimationEnded(const ui::CallbackLayerAnimationObserver& observer);
void SetFocusMode(InputModality modality);
AssistantController* const assistant_controller_; // Owned by Shell. AssistantController* const assistant_controller_; // Owned by Shell.
views::View* input_modality_layout_container_; // Owned by view hierarchy.
views::View* keyboard_layout_container_; // Owned by view hierarchy. views::View* keyboard_layout_container_; // Owned by view hierarchy.
views::View* voice_layout_container_; // Owned by view hierarchy. views::View* voice_layout_container_; // Owned by view hierarchy.
views::ImageButton* keyboard_input_toggle_; // Owned by view hierarchy.
views::ImageButton* voice_input_toggle_; // Owned by view hierarchy.
views::ImageButton* settings_button_; // Owned by view hierarchy.
views::Textfield* textfield_; // Owned by view hierarchy. views::Textfield* textfield_; // Owned by view hierarchy.
std::unique_ptr<ui::CallbackLayerAnimationObserver> animation_observer_; std::unique_ptr<ui::CallbackLayerAnimationObserver> animation_observer_;
......
// Copyright 2018 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 "ash/assistant/util/views_util.h"
#include <memory>
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
#include "ui/views/animation/ink_drop_impl.h"
#include "ui/views/animation/ink_drop_mask.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/layout/layout_provider.h"
#include "ui/views/painter.h"
namespace ash {
namespace assistant {
namespace util {
namespace {
constexpr float kHighlightOpacity = 0.08f;
constexpr int kInkDropInset = 2;
// Helpers ---------------------------------------------------------------------
class DefaultImageButton : public views::ImageButton {
public:
explicit DefaultImageButton(views::ButtonListener* listener)
: views::ImageButton(listener) {}
~DefaultImageButton() override = default;
// views::View:
std::unique_ptr<views::InkDrop> CreateInkDrop() override {
std::unique_ptr<views::InkDropImpl> ink_drop =
std::make_unique<views::InkDropImpl>(this, size());
ink_drop->SetAutoHighlightMode(
views::InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE);
ink_drop->SetShowHighlightOnHover(true);
return ink_drop;
}
std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight()
const override {
return std::make_unique<views::InkDropHighlight>(
gfx::PointF(GetLocalBounds().CenterPoint()),
std::make_unique<views::CircleLayerDelegate>(
SkColorSetA(GetInkDropBaseColor(), 0xff * kHighlightOpacity),
size().width() / 2 - kInkDropInset));
}
std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override {
return std::make_unique<views::RoundRectInkDropMask>(
size(), gfx::Insets(kInkDropInset), size().width() / 2);
}
std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override {
return std::make_unique<views::FloodFillInkDropRipple>(
size(), gfx::Insets(kInkDropInset), GetInkDropCenterBasedOnLastEvent(),
GetInkDropBaseColor(), ink_drop_visible_opacity());
}
};
} // namespace
views::ImageButton* CreateImageButton(views::ButtonListener* listener,
const gfx::VectorIcon& icon,
int size_in_dip,
int icon_size_in_dip,
int accessible_name_id,
SkColor icon_color) {
constexpr SkColor kInkDropBaseColor = SK_ColorBLACK;
constexpr float kInkDropVisibleOpacity = 0.06f;
auto* button = new DefaultImageButton(listener);
button->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
views::ImageButton::ALIGN_MIDDLE);
button->SetImage(views::Button::STATE_NORMAL,
gfx::CreateVectorIcon(icon, icon_size_in_dip, icon_color));
button->SetInkDropMode(views::Button::InkDropMode::ON);
button->set_has_ink_drop_action_on_click(true);
button->set_ink_drop_base_color(kInkDropBaseColor);
button->set_ink_drop_visible_opacity(kInkDropVisibleOpacity);
button->SetPreferredSize(gfx::Size(size_in_dip, size_in_dip));
button->SetFocusForPlatform();
button->SetFocusPainter(views::Painter::CreateSolidRoundRectPainter(
SkColorSetA(kInkDropBaseColor, 0xff * kHighlightOpacity),
size_in_dip / 2 - kInkDropInset, gfx::Insets(kInkDropInset)));
button->SetAccessibleName(l10n_util::GetStringUTF16(accessible_name_id));
return button;
}
} // namespace util
} // namespace assistant
} // namespace ash
// Copyright 2018 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 ASH_ASSISTANT_UTIL_VIEWS_UTIL_H_
#define ASH_ASSISTANT_UTIL_VIEWS_UTIL_H_
#include "third_party/skia/include/core/SkColor.h"
namespace gfx {
struct VectorIcon;
} // namespace gfx
namespace views {
class ButtonListener;
class ImageButton;
} // namespace views
namespace ash {
namespace assistant {
namespace util {
// Creates an ImageButton with the default Assistant styles.
views::ImageButton* CreateImageButton(views::ButtonListener* listener,
const gfx::VectorIcon& icon,
int size_in_dip,
int icon_size_in_dip,
int accessible_name_id,
SkColor icon_color);
} // namespace util
} // namespace assistant
} // namespace ash
#endif // ASH_ASSISTANT_UTIL_VIEWS_UTIL_H_
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