search_result_base_view.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2018 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. #include "ash/app_list/views/search_result_base_view.h"
  5. #include "ash/app_list/model/search/search_result.h"
  6. #include "ash/app_list/views/search_result_actions_view.h"
  7. #include "ash/public/cpp/app_list/app_list_features.h"
  8. #include "ash/strings/grit/ash_strings.h"
  9. #include "base/i18n/number_formatting.h"
  10. #include "base/strings/string_util.h"
  11. #include "base/strings/utf_string_conversions.h"
  12. #include "ui/base/l10n/l10n_util.h"
  13. namespace ash {
  14. SearchResultBaseView::SearchResultBaseView() {
  15. SetGroup(kSearchResultViewGroup);
  16. SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
  17. SetInstallFocusRingOnFocus(false);
  18. }
  19. SearchResultBaseView::~SearchResultBaseView() {
  20. if (result_)
  21. result_->RemoveObserver(this);
  22. result_ = nullptr;
  23. }
  24. bool SearchResultBaseView::SkipDefaultKeyEventProcessing(
  25. const ui::KeyEvent& event) {
  26. // Ensure accelerators take priority in the app list. This ensures, e.g., that
  27. // Ctrl+Space will switch input methods rather than activate the button.
  28. return false;
  29. }
  30. const char* SearchResultBaseView::GetClassName() const {
  31. return "SearchResultBaseView";
  32. }
  33. void SearchResultBaseView::SetSelected(bool selected,
  34. absl::optional<bool> reverse_tab_order) {
  35. if (selected_ == selected)
  36. return;
  37. selected_ = selected;
  38. if (selected) {
  39. SelectInitialResultAction(reverse_tab_order.value_or(false));
  40. } else {
  41. ClearSelectedResultAction();
  42. }
  43. SchedulePaint();
  44. }
  45. bool SearchResultBaseView::SelectNextResultAction(bool reverse_tab_order) {
  46. if (!selected() || !actions_view_)
  47. return false;
  48. if (!actions_view_->SelectNextAction(reverse_tab_order))
  49. return false;
  50. SchedulePaint();
  51. return true;
  52. }
  53. views::View* SearchResultBaseView::GetSelectedView() {
  54. if (actions_view_ && actions_view_->HasSelectedAction())
  55. return actions_view_->GetSelectedView();
  56. return this;
  57. }
  58. void SearchResultBaseView::SetResult(SearchResult* result) {
  59. OnResultChanging(result);
  60. ClearResult();
  61. result_ = result;
  62. if (result_)
  63. result_->AddObserver(this);
  64. OnResultChanged();
  65. }
  66. void SearchResultBaseView::OnResultDestroying() {
  67. // Uses |SetResult| to ensure that the |OnResultChanging()| and
  68. // |OnResultChanged()| logic gets run.
  69. SetResult(nullptr);
  70. }
  71. std::u16string SearchResultBaseView::ComputeAccessibleName() const {
  72. if (!result())
  73. return u"";
  74. std::u16string accessible_name;
  75. if (!result()->accessible_name().empty())
  76. return result()->accessible_name();
  77. std::u16string title = result()->title();
  78. if (result()->result_type() == AppListSearchResultType::kPlayStoreApp ||
  79. result()->result_type() == AppListSearchResultType::kInstantApp) {
  80. accessible_name = l10n_util::GetStringFUTF16(
  81. IDS_APP_ACCESSIBILITY_ARC_APP_ANNOUNCEMENT, title);
  82. } else if (result()->result_type() ==
  83. AppListSearchResultType::kPlayStoreReinstallApp) {
  84. accessible_name = l10n_util::GetStringFUTF16(
  85. IDS_APP_ACCESSIBILITY_APP_RECOMMENDATION_ARC, title);
  86. } else if (result()->result_type() ==
  87. AppListSearchResultType::kInstalledApp) {
  88. accessible_name = l10n_util::GetStringFUTF16(
  89. IDS_APP_ACCESSIBILITY_INSTALLED_APP_ANNOUNCEMENT, title);
  90. } else if (result()->result_type() == AppListSearchResultType::kInternalApp) {
  91. accessible_name = l10n_util::GetStringFUTF16(
  92. IDS_APP_ACCESSIBILITY_INTERNAL_APP_ANNOUNCEMENT, title);
  93. } else if (!result()->details().empty()) {
  94. accessible_name = base::JoinString({title, result()->details()}, u", ");
  95. } else {
  96. accessible_name = title;
  97. }
  98. if (result()->rating() && result()->rating() >= 0) {
  99. accessible_name = l10n_util::GetStringFUTF16(
  100. IDS_APP_ACCESSIBILITY_APP_WITH_STAR_RATING_ARC, accessible_name,
  101. base::FormatDouble(result()->rating(), 1));
  102. }
  103. return accessible_name;
  104. }
  105. void SearchResultBaseView::UpdateAccessibleName() {
  106. SetAccessibleName(ComputeAccessibleName());
  107. }
  108. void SearchResultBaseView::ClearResult() {
  109. if (result_)
  110. result_->RemoveObserver(this);
  111. SetSelected(false, absl::nullopt);
  112. result_ = nullptr;
  113. }
  114. void SearchResultBaseView::SelectInitialResultAction(bool reverse_tab_order) {
  115. if (actions_view_)
  116. actions_view_->SelectInitialAction(reverse_tab_order);
  117. }
  118. void SearchResultBaseView::ClearSelectedResultAction() {
  119. if (actions_view_)
  120. actions_view_->ClearSelectedAction();
  121. }
  122. } // namespace ash