Commit 8758810d authored by Melissa Zhang's avatar Melissa Zhang Committed by Commit Bot

[Sharesheet] Keyboard Scrolling

Bug: 1134069
Change-Id: I72639a41bac3c6d09274d724054e8e0bbe2e8176
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2440334Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Auto-Submit: Melissa Zhang <melzhang@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#813207}
parent 4646621f
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "base/i18n/rtl.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sharesheet/sharesheet_metrics.h" #include "chrome/browser/sharesheet/sharesheet_metrics.h"
...@@ -79,6 +80,11 @@ void SetUpTargetColumnSet(views::GridLayout* layout) { ...@@ -79,6 +80,11 @@ void SetUpTargetColumnSet(views::GridLayout* layout) {
} }
} }
bool IsKeyboardCodeArrow(ui::KeyboardCode key_code) {
return key_code == ui::VKEY_UP || key_code == ui::VKEY_DOWN ||
key_code == ui::VKEY_RIGHT || key_code == ui::VKEY_LEFT;
}
} // namespace } // namespace
SharesheetBubbleView::SharesheetBubbleView( SharesheetBubbleView::SharesheetBubbleView(
...@@ -140,6 +146,9 @@ void SharesheetBubbleView::ShowBubble( ...@@ -140,6 +146,9 @@ void SharesheetBubbleView::ShowBubble(
main_layout->AddView(std::make_unique<SharesheetExpandButton>(this)); main_layout->AddView(std::make_unique<SharesheetExpandButton>(this));
main_layout->AddPaddingRow(views::GridLayout::kFixedSize, kShortSpacing); main_layout->AddPaddingRow(views::GridLayout::kFixedSize, kShortSpacing);
main_view_->SetFocusBehavior(View::FocusBehavior::ALWAYS);
main_view_->RequestFocus();
views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(this); views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(this);
GetWidget()->GetRootView()->Layout(); GetWidget()->GetRootView()->Layout();
widget->Show(); widget->Show();
...@@ -147,6 +156,7 @@ void SharesheetBubbleView::ShowBubble( ...@@ -147,6 +156,7 @@ void SharesheetBubbleView::ShowBubble(
if (targets_.size() <= (kMaxRowsForDefaultView * kMaxTargetsPerRow)) { if (targets_.size() <= (kMaxRowsForDefaultView * kMaxTargetsPerRow)) {
width_ = kDefaultBubbleWidth; width_ = kDefaultBubbleWidth;
height_ = kNoExtensionBubbleHeight; height_ = kNoExtensionBubbleHeight;
expand_button_->SetVisible(false);
} else { } else {
SetToDefaultBubbleSizing(); SetToDefaultBubbleSizing();
} }
...@@ -195,7 +205,7 @@ std::unique_ptr<views::View> SharesheetBubbleView::MakeScrollableTargetView() { ...@@ -195,7 +205,7 @@ std::unique_ptr<views::View> SharesheetBubbleView::MakeScrollableTargetView() {
scrollable_view->SetLayoutManager(std::make_unique<views::BoxLayout>( scrollable_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical)); views::BoxLayout::Orientation::kVertical));
layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kCenter); layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kCenter);
scrollable_view->AddChildView(std::move(default_view)); default_view_ = scrollable_view->AddChildView(std::move(default_view));
expanded_view_ = scrollable_view->AddChildView(std::move(expanded_view)); expanded_view_ = scrollable_view->AddChildView(std::move(expanded_view));
// Expanded view is not visible by default. // Expanded view is not visible by default.
...@@ -258,9 +268,62 @@ void SharesheetBubbleView::CloseBubble() { ...@@ -258,9 +268,62 @@ void SharesheetBubbleView::CloseBubble() {
targets_.clear(); targets_.clear();
active_target_ = base::string16(); active_target_ = base::string16();
intent_.reset(); intent_.reset();
keyboard_highlighted_target_ = 0;
SetToDefaultBubbleSizing(); SetToDefaultBubbleSizing();
} }
void SharesheetBubbleView::OnKeyEvent(ui::KeyEvent* event) {
if (!IsKeyboardCodeArrow(event->key_code()) ||
event->type() != ui::ET_KEY_RELEASED) {
return;
}
int delta = 0;
switch (event->key_code()) {
case ui::VKEY_UP:
delta = -kMaxTargetsPerRow;
break;
case ui::VKEY_DOWN:
delta = kMaxTargetsPerRow;
break;
case ui::VKEY_LEFT:
delta = base::i18n::IsRTL() ? 1 : -1;
break;
case ui::VKEY_RIGHT:
delta = base::i18n::IsRTL() ? -1 : 1;
break;
default:
NOTREACHED();
break;
}
keyboard_highlighted_target_ += delta;
int default_view_max = kMaxTargetsPerRow * kMaxRowsForDefaultView - 1;
int max_target_index = targets_.size() - 1;
if ((!show_expanded_view_) && (max_target_index > default_view_max)) {
max_target_index = default_view_max;
}
if (keyboard_highlighted_target_ > max_target_index) {
keyboard_highlighted_target_ = max_target_index;
} else if (keyboard_highlighted_target_ < 0) {
keyboard_highlighted_target_ = 0;
}
if (keyboard_highlighted_target_ <= default_view_max) {
default_view_->children()[keyboard_highlighted_target_]->RequestFocus();
} else {
DCHECK_LT(keyboard_highlighted_target_ - default_view_max,
expanded_view_->children().size());
DCHECK(show_expanded_view_);
expanded_view_->children()[keyboard_highlighted_target_ - default_view_max]
->RequestFocus();
}
View::OnKeyEvent(event);
}
void SharesheetBubbleView::ButtonPressed(views::Button* sender, void SharesheetBubbleView::ButtonPressed(views::Button* sender,
const ui::Event& event) { const ui::Event& event) {
if (sender == expand_button_) { if (sender == expand_button_) {
......
...@@ -48,6 +48,9 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView, ...@@ -48,6 +48,9 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView,
void CloseBubble(); void CloseBubble();
private: private:
// ui::EventHandler overrides:
void OnKeyEvent(ui::KeyEvent* event) override;
// views::ButtonListener overrides // views::ButtonListener overrides
void ButtonPressed(views::Button* sender, const ui::Event& event) override; void ButtonPressed(views::Button* sender, const ui::Event& event) override;
...@@ -79,8 +82,11 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView, ...@@ -79,8 +82,11 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView,
bool user_cancelled_ = true; bool user_cancelled_ = true;
bool show_expanded_view_ = false; bool show_expanded_view_ = false;
int keyboard_highlighted_target_ = 0;
views::View* root_view_ = nullptr; views::View* root_view_ = nullptr;
views::View* main_view_ = nullptr; views::View* main_view_ = nullptr;
views::View* default_view_ = nullptr;
views::View* expanded_view_ = nullptr; views::View* expanded_view_ = nullptr;
views::View* share_action_view_ = nullptr; views::View* share_action_view_ = nullptr;
views::View* parent_view_ = nullptr; views::View* parent_view_ = nullptr;
......
...@@ -41,6 +41,7 @@ SharesheetExpandButton::SharesheetExpandButton(views::ButtonListener* listener) ...@@ -41,6 +41,7 @@ SharesheetExpandButton::SharesheetExpandButton(views::ButtonListener* listener)
label_->SetLineHeight(kLineHeight); label_->SetLineHeight(kLineHeight);
label_->SetEnabledColor(kLabelColor); label_->SetEnabledColor(kLabelColor);
SetFocusBehavior(View::FocusBehavior::ALWAYS);
SetDefaultView(); SetDefaultView();
} }
......
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