Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "ash/shelf/back_button.h" |
| 6 | |
Sammie Quon | 6970d57 | 2020-03-13 23:18:40 | [diff] [blame] | 7 | #include "ash/keyboard/keyboard_util.h" |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 8 | #include "ash/resources/vector_icons/vector_icons.h" |
Manu Cornet | d9d5b6c | 2019-07-22 19:01:45 | [diff] [blame] | 9 | #include "ash/shelf/shelf.h" |
| 10 | #include "ash/shelf/shelf_focus_cycler.h" |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 11 | #include "ash/strings/grit/ash_strings.h" |
Yulun Wu | 0ff6393 | 2020-08-27 00:27:27 | [diff] [blame] | 12 | #include "ash/style/ash_color_provider.h" |
minch | a0be3874 | 2019-11-12 19:18:23 | [diff] [blame] | 13 | #include "ash/wm/window_state.h" |
Sammie Quon | 6970d57 | 2020-03-13 23:18:40 | [diff] [blame] | 14 | #include "ash/wm/window_util.h" |
Andrew Xu | a903f92 | 2019-11-07 20:39:44 | [diff] [blame] | 15 | #include "base/metrics/user_metrics.h" |
| 16 | #include "base/metrics/user_metrics_action.h" |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 17 | #include "ui/aura/window.h" |
| 18 | #include "ui/aura/window_tree_host.h" |
| 19 | #include "ui/base/l10n/l10n_util.h" |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 20 | #include "ui/gfx/canvas.h" |
| 21 | #include "ui/gfx/paint_vector_icon.h" |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 22 | #include "ui/views/widget/widget.h" |
| 23 | |
| 24 | namespace ash { |
| 25 | |
Manu Cornet | c006633 | 2019-02-20 19:26:03 | [diff] [blame] | 26 | // static |
| 27 | const char BackButton::kViewClassName[] = "ash/BackButton"; |
| 28 | |
Manu Cornet | d9d5b6c | 2019-07-22 19:01:45 | [diff] [blame] | 29 | BackButton::BackButton(Shelf* shelf) : ShelfControlButton(shelf, this) { |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 30 | SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_BACK_BUTTON_TITLE)); |
Allen Bauer | eac9b92 | 2020-10-23 22:56:54 | [diff] [blame] | 31 | SetFlipCanvasOnPaintForRTLUI(true); |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 32 | } |
| 33 | |
Alex Newcomer | 4601bb0 | 2019-10-31 00:37:39 | [diff] [blame] | 34 | BackButton::~BackButton() {} |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 35 | |
Toni Barzic | 71ebb6fd | 2020-05-29 17:16:53 | [diff] [blame] | 36 | void BackButton::HandleLocaleChange() { |
| 37 | SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_BACK_BUTTON_TITLE)); |
| 38 | TooltipTextChanged(); |
| 39 | } |
| 40 | |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 41 | void BackButton::PaintButtonContents(gfx::Canvas* canvas) { |
| 42 | // Use PaintButtonContents instead of SetImage so the icon gets drawn at |
| 43 | // |GetCenterPoint| coordinates instead of always in the center. |
Yulun Wu | 0ff6393 | 2020-08-27 00:27:27 | [diff] [blame] | 44 | gfx::ImageSkia img = CreateVectorIcon( |
Yulun Wu | 687f929 | 2021-02-09 22:43:28 | [diff] [blame] | 45 | kShelfBackIcon, |
| 46 | AshColorProvider::Get()->GetContentLayerColor( |
| 47 | AshColorProvider::ContentLayerType::kButtonIconColor)); |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 48 | canvas->DrawImageInt(img, GetCenterPoint().x() - img.width() / 2, |
| 49 | GetCenterPoint().y() - img.height() / 2); |
| 50 | } |
| 51 | |
Manu Cornet | c006633 | 2019-02-20 19:26:03 | [diff] [blame] | 52 | const char* BackButton::GetClassName() const { |
| 53 | return kViewClassName; |
| 54 | } |
| 55 | |
Jan Wilken Dörrie | 85285b0 | 2021-03-11 23:38:47 | [diff] [blame^] | 56 | std::u16string BackButton::GetTooltipText(const gfx::Point& p) const { |
Manu Cornet | e11c3c35 | 2019-07-31 06:13:41 | [diff] [blame] | 57 | return GetAccessibleName(); |
| 58 | } |
| 59 | |
Manu Cornet | d9d5b6c | 2019-07-22 19:01:45 | [diff] [blame] | 60 | void BackButton::OnShelfButtonAboutToRequestFocusFromTabTraversal( |
| 61 | ShelfButton* button, |
| 62 | bool reverse) { |
| 63 | DCHECK_EQ(button, this); |
| 64 | if (!reverse) { |
| 65 | // We're trying to focus this button by advancing from the last view of |
| 66 | // the shelf. Let the focus manager advance to the status area instead. |
Manu Cornet | e11c3c35 | 2019-07-31 06:13:41 | [diff] [blame] | 67 | shelf()->shelf_focus_cycler()->FocusOut(reverse, |
| 68 | SourceView::kShelfNavigationView); |
Manu Cornet | d9d5b6c | 2019-07-22 19:01:45 | [diff] [blame] | 69 | } |
| 70 | } |
| 71 | |
| 72 | void BackButton::ButtonPressed(views::Button* sender, |
| 73 | const ui::Event& event, |
| 74 | views::InkDrop* ink_drop) { |
Andrew Xu | a903f92 | 2019-11-07 20:39:44 | [diff] [blame] | 75 | base::RecordAction(base::UserMetricsAction("AppList_BackButtonPressed")); |
| 76 | |
Sammie Quon | 6970d57 | 2020-03-13 23:18:40 | [diff] [blame] | 77 | if (keyboard_util::CloseKeyboardIfActive()) |
| 78 | return; |
| 79 | |
| 80 | if (window_util::ShouldMinimizeTopWindowOnBack()) { |
| 81 | auto* top_window = window_util::GetTopWindow(); |
| 82 | DCHECK(top_window); |
| 83 | WindowState::Get(top_window)->Minimize(); |
| 84 | return; |
minch | a0be3874 | 2019-11-12 19:18:23 | [diff] [blame] | 85 | } |
Sammie Quon | 6970d57 | 2020-03-13 23:18:40 | [diff] [blame] | 86 | |
| 87 | window_util::SendBackKeyEvent( |
| 88 | GetWidget()->GetNativeWindow()->GetRootWindow()); |
Manu Cornet | d9d5b6c | 2019-07-22 19:01:45 | [diff] [blame] | 89 | } |
| 90 | |
Yulun Wu | 8924cebb | 2021-01-12 20:23:28 | [diff] [blame] | 91 | void BackButton::OnThemeChanged() { |
| 92 | ShelfControlButton::OnThemeChanged(); |
| 93 | SchedulePaint(); |
| 94 | } |
| 95 | |
Sammie Quon | 9b911f2f | 2017-12-15 02:53:15 | [diff] [blame] | 96 | } // namespace ash |