blob: 511253152dd1607f99a51655baa2fbda2152c538 [file] [log] [blame]
// Copyright 2020 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/public/cpp/test/app_list_test_api.h"
#include <string>
#include <vector>
#include "ash/app_list/app_list_controller_impl.h"
#include "ash/app_list/app_list_presenter_impl.h"
#include "ash/app_list/model/app_list_folder_item.h"
#include "ash/app_list/model/app_list_item.h"
#include "ash/app_list/model/app_list_model.h"
#include "ash/app_list/views/app_list_item_view.h"
#include "ash/app_list/views/app_list_view.h"
#include "ash/app_list/views/apps_grid_view.h"
#include "ash/shell.h"
#include "ui/views/view_model.h"
namespace ash {
namespace {
AppsGridView* GetAppsGridView() {
AppListView* app_list_view =
Shell::Get()->app_list_controller()->presenter()->GetView();
return AppListView::TestApi(app_list_view).GetRootAppsGridView();
}
AppListModel* GetAppListModel() {
return Shell::Get()->app_list_controller()->GetModel();
}
} // namespace
AppListTestApi::AppListTestApi() = default;
AppListTestApi::~AppListTestApi() = default;
bool AppListTestApi::HasApp(const std::string& app_id) {
return GetAppListModel()->FindItem(app_id);
}
std::vector<std::string> AppListTestApi::GetTopLevelViewIdList() {
std::vector<std::string> id_list;
auto* view_model = GetAppsGridView()->view_model();
for (int i = 0; i < view_model->view_size(); ++i) {
AppListItem* app_list_item = view_model->view_at(i)->item();
if (app_list_item) {
id_list.push_back(app_list_item->id());
}
}
return id_list;
}
std::string AppListTestApi::CreateFolderWithApps(
const std::vector<std::string>& apps) {
// Only create a folder if there are two or more apps.
DCHECK_GE(apps.size(), 2u);
AppListModel* model = GetAppListModel();
// Create a folder using the first two apps, and add the others to the folder
// iteratively.
std::string folder_id = model->MergeItems(apps[0], apps[1]);
// Return early if MergeItems failed.
if (folder_id.empty())
return "";
for (size_t i = 2; i < apps.size(); ++i)
model->MergeItems(folder_id, apps[i]);
return folder_id;
}
std::string AppListTestApi::GetFolderId(const std::string& app_id) {
return GetAppListModel()->FindItem(app_id)->folder_id();
}
std::vector<std::string> AppListTestApi::GetAppIdsInFolder(
const std::string& folder_id) {
AppListItem* folder_item = GetAppListModel()->FindItem(folder_id);
DCHECK(folder_item->is_folder());
AppListItemList* folder_list =
static_cast<AppListFolderItem*>(folder_item)->item_list();
std::vector<std::string> id_list;
for (size_t i = 0; i < folder_list->item_count(); ++i)
id_list.push_back(folder_list->item_at(i)->id());
return id_list;
}
void AppListTestApi::MoveItemToPosition(const std::string& item_id,
const size_t to_index) {
AppListItem* app_item = GetAppListModel()->FindItem(item_id);
const std::string folder_id = app_item->folder_id();
AppListItemList* item_list;
std::vector<std::string> top_level_id_list = GetTopLevelViewIdList();
// The app should be either at the top level or in a folder.
if (folder_id.empty()) {
// The app is at the top level.
item_list = GetAppListModel()->top_level_item_list();
} else {
// The app is in the folder with |folder_id|.
item_list = GetAppListModel()->FindFolderItem(folder_id)->item_list();
}
size_t from_index = 0;
item_list->FindItemIndex(item_id, &from_index);
item_list->MoveItem(from_index, to_index);
}
void AppListTestApi::AddPageBreakItemAfterId(const std::string& item_id) {
auto* model = GetAppListModel();
model->AddPageBreakItemAfter(model->FindItem(item_id));
}
int AppListTestApi::GetTopListItemCount() {
return GetAppListModel()->top_level_item_list()->item_count();
}
PaginationModel* AppListTestApi::GetPaginationModel() {
return GetAppsGridView()->pagination_model();
}
void AppListTestApi::UpdatePagedViewStructure() {
GetAppsGridView()->UpdatePagedViewStructure();
}
} // namespace ash