blob: 2660f8bd94f6f471536bcf99c0450beaa9708122 [file] [log] [blame]
// Copyright 2014 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 "ui/app_list/views/suggestions_container_view.h"
#include "ui/app_list/app_list_constants.h"
#include "ui/app_list/app_list_features.h"
#include "ui/app_list/views/all_apps_tile_item_view.h"
#include "ui/app_list/views/app_list_main_view.h"
#include "ui/app_list/views/contents_view.h"
#include "ui/app_list/views/search_result_tile_item_view.h"
#include "ui/views/background.h"
#include "ui/views/layout/grid_layout.h"
namespace app_list {
namespace {
constexpr int kTileSpacing = 7;
constexpr int kNumTilesCols = 5;
constexpr int kTilesHorizontalMarginLeft = 145;
} // namespace
SuggestionsContainerView::SuggestionsContainerView(
ContentsView* contents_view,
AllAppsTileItemView* all_apps_button,
PaginationModel* pagination_model)
: contents_view_(contents_view),
all_apps_button_(all_apps_button),
pagination_model_(pagination_model),
is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()) {
SetPaintToLayer();
layer()->SetFillsBoundsOpaquely(false);
DCHECK(contents_view);
view_delegate_ = contents_view_->app_list_main_view()->view_delegate();
SetBackground(views::CreateSolidBackground(kLabelBackgroundColor));
if (all_apps_button_) {
all_apps_button_->SetHoverStyle(TileItemView::HOVER_STYLE_ANIMATE_SHADOW);
all_apps_button_->SetParentBackgroundColor(kLabelBackgroundColor);
}
CreateAppsGrid(is_fullscreen_app_list_enabled_ ? kNumStartPageTilesFullscreen
: kNumStartPageTiles);
}
SuggestionsContainerView::~SuggestionsContainerView() = default;
TileItemView* SuggestionsContainerView::GetTileItemView(int index) {
DCHECK_GT(num_results(), index);
if (all_apps_button_ && index == num_results() - 1)
return all_apps_button_;
return search_result_tile_views_[index];
}
int SuggestionsContainerView::DoUpdate() {
// Ignore updates and disable buttons when suggestions container view is not
// shown. For bubble launcher, that is not on STATE_START state; for
// fullscreen launcher, that is not on STATE_START and STATE_APPS state.
const AppListModel::State state = contents_view_->GetActiveState();
if (state != AppListModel::STATE_START &&
(!is_fullscreen_app_list_enabled_ || state != AppListModel::STATE_APPS)) {
for (auto* view : search_result_tile_views_)
view->SetEnabled(false);
return num_results();
}
std::vector<SearchResult*> display_results =
AppListModel::FilterSearchResultsByDisplayType(
results(), SearchResult::DISPLAY_RECOMMENDATION,
is_fullscreen_app_list_enabled_ ? kNumStartPageTilesFullscreen
: kNumStartPageTiles);
if (display_results.size() != search_result_tile_views_.size()) {
// We should recreate the grid layout in this case.
for (size_t i = 0; i < search_result_tile_views_.size(); ++i)
delete search_result_tile_views_[i];
search_result_tile_views_.clear();
if (all_apps_button_)
RemoveChildView(all_apps_button_);
CreateAppsGrid(is_fullscreen_app_list_enabled_
? kNumStartPageTilesFullscreen
: std::min(kNumStartPageTiles, display_results.size()));
}
// Update the tile item results.
for (size_t i = 0; i < search_result_tile_views_.size(); ++i) {
SearchResult* item = nullptr;
if (i < display_results.size())
item = display_results[i];
search_result_tile_views_[i]->SetSearchResult(item);
search_result_tile_views_[i]->SetEnabled(true);
// Notify text change after accessible name is updated and the tile view
// is re-enabled, so that ChromeVox will announce the updated text.
search_result_tile_views_[i]->NotifyAccessibilityEvent(
ui::AX_EVENT_TEXT_CHANGED, true);
}
parent()->Layout();
// If |is_fullscreen_app_list_enabled_| is not enabled, add 1 to the results
// size to account for the all apps button.
return is_fullscreen_app_list_enabled_ ? display_results.size()
: display_results.size() + 1;
}
void SuggestionsContainerView::UpdateSelectedIndex(int old_selected,
int new_selected) {
if (old_selected >= 0 && old_selected < num_results())
GetTileItemView(old_selected)->SetSelected(false);
if (new_selected >= 0 && new_selected < num_results())
GetTileItemView(new_selected)->SetSelected(true);
}
void SuggestionsContainerView::OnContainerSelected(
bool /*from_bottom*/,
bool /*directional_movement*/) {
NOTREACHED();
}
void SuggestionsContainerView::NotifyFirstResultYIndex(int /*y_index*/) {
NOTREACHED();
}
int SuggestionsContainerView::GetYSize() {
NOTREACHED();
return 0;
}
views::View* SuggestionsContainerView::GetSelectedView() const {
return IsValidSelectionIndex(selected_index())
? search_result_tile_views_[selected_index()]
: nullptr;
}
views::View* SuggestionsContainerView::SetFirstResultSelected(bool selected) {
return nullptr;
}
void SuggestionsContainerView::CreateAppsGrid(int apps_num) {
DCHECK(search_result_tile_views_.empty());
views::GridLayout* tiles_layout_manager =
views::GridLayout::CreateAndInstall(this);
SetLayoutManager(tiles_layout_manager);
views::ColumnSet* column_set = tiles_layout_manager->AddColumnSet(0);
if (!is_fullscreen_app_list_enabled_)
column_set->AddPaddingColumn(0, kTilesHorizontalMarginLeft);
for (int col = 0; col < kNumTilesCols; ++col) {
column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0,
views::GridLayout::USE_PREF, 0, 0);
column_set->AddPaddingColumn(
0, is_fullscreen_app_list_enabled_ ? kGridTileSpacing : kTileSpacing);
}
// Add SearchResultTileItemViews to the container.
int i = 0;
search_result_tile_views_.reserve(apps_num);
const bool is_fullscreen_app_list_enabled =
features::IsFullscreenAppListEnabled();
const bool is_play_store_app_search_enabled =
features::IsPlayStoreAppSearchEnabled();
for (; i < apps_num; ++i) {
SearchResultTileItemView* tile_item = new SearchResultTileItemView(
this, view_delegate_, pagination_model_, true,
is_fullscreen_app_list_enabled, is_play_store_app_search_enabled);
if (i % kNumTilesCols == 0)
tiles_layout_manager->StartRow(0, 0);
tiles_layout_manager->AddView(tile_item);
AddChildView(tile_item);
tile_item->SetParentBackgroundColor(kLabelBackgroundColor);
tile_item->SetHoverStyle(TileItemView::HOVER_STYLE_ANIMATE_SHADOW);
search_result_tile_views_.emplace_back(tile_item);
}
if (all_apps_button_ && !is_fullscreen_app_list_enabled_) {
all_apps_button_->UpdateIcon();
// Also add a special "all apps" button to the end of the next row of the
// container.
if (i % kNumTilesCols == 0)
tiles_layout_manager->StartRow(0, 0);
tiles_layout_manager->AddView(all_apps_button_);
AddChildView(all_apps_button_);
}
}
} // namespace app_list