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") {
"assistant/util/animation_util.h",
"assistant/util/deep_link_util.cc",
"assistant/util/deep_link_util.h",
"assistant/util/views_util.cc",
"assistant/util/views_util.h",
"autoclick/autoclick_controller.cc",
"autoclick/autoclick_controller.h",
"cancel_mode.cc",
......
......@@ -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.">
Type a 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.">
Something went wrong. Try again in a few seconds.
</message>
......
......@@ -7,10 +7,12 @@
#include <memory>
#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/resources/vector_icons/vector_icons.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/background.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/layout/box_layout.h"
......@@ -27,27 +29,13 @@ constexpr int kVectorIconSizeDip = 12;
// CaptionButton ---------------------------------------------------------------
class CaptionButton : public views::ImageButton {
public:
explicit CaptionButton(const gfx::VectorIcon& icon,
views::ButtonListener* listener)
: views::ImageButton(listener) {
SetImage(
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);
};
views::ImageButton* CreateCaptionButton(const gfx::VectorIcon& icon,
int accessible_name_id,
views::ButtonListener* listener) {
return assistant::util::CreateImageButton(
listener, icon, kCaptionButtonSizeDip, kVectorIconSizeDip,
accessible_name_id, gfx::kGoogleGrey700);
}
} // namespace
......@@ -77,7 +65,8 @@ void CaptionBar::InitLayout() {
views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER);
// 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));
AddChildView(back_button);
......@@ -88,14 +77,14 @@ void CaptionBar::InitLayout() {
layout_manager->SetFlexForView(spacer, 1);
// Minimize.
CaptionButton* minimize_button =
new CaptionButton(kWindowControlMinimizeIcon, this);
auto* minimize_button = CreateCaptionButton(kWindowControlMinimizeIcon,
IDS_APP_ACCNAME_MINIMIZE, this);
minimize_button->set_id(static_cast<int>(CaptionButtonId::kMinimize));
AddChildView(minimize_button);
// Close.
CaptionButton* close_button =
new CaptionButton(kWindowControlCloseIcon, this);
auto* close_button =
CreateCaptionButton(kWindowControlCloseIcon, IDS_APP_ACCNAME_CLOSE, this);
close_button->set_id(static_cast<int>(CaptionButtonId::kClose));
AddChildView(close_button);
}
......
......@@ -21,6 +21,10 @@ namespace ui {
class CallbackLayerAnimationObserver;
} // namespace ui
namespace views {
class ImageButton;
} // namespace views
namespace ash {
class AssistantController;
......@@ -93,19 +97,23 @@ class DialogPlate : public views::View,
private:
void InitLayout();
void InitKeyboardLayoutContainer(
views::View* input_modality_layout_container);
void InitVoiceLayoutContainer(views::View* input_modality_layout_container);
void InitKeyboardLayoutContainer();
void InitVoiceLayoutContainer();
void OnButtonPressed(DialogPlateButtonId id);
void OnAnimationStarted(const ui::CallbackLayerAnimationObserver& observer);
bool OnAnimationEnded(const ui::CallbackLayerAnimationObserver& observer);
void SetFocusMode(InputModality modality);
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* 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.
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