blob: d4d2dd162056bf12019a9b5353ff933fd21b8adf [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/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 {
AppListTestApi::AppListTestApi() = default;
AppListTestApi::~AppListTestApi() = default;
std::vector<std::string> AppListTestApi::GetTopLevelViewIdList() {
std::vector<std::string> id_list;
AppListView* app_list_view =
Shell::Get()->app_list_controller()->presenter()->GetView();
AppListView::TestApi test_api(app_list_view);
auto* view_model = test_api.GetRootAppsGridView()->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 = Shell::Get()->app_list_controller()->GetModel();
// 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 Shell::Get()
->app_list_controller()
->GetModel()
->FindItem(app_id)
->folder_id();
}
std::vector<std::string> AppListTestApi::GetAppIdsInFolder(
const std::string& folder_id) {
AppListItem* folder_item =
Shell::Get()->app_list_controller()->GetModel()->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 =
Shell::Get()->app_list_controller()->GetModel()->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 =
Shell::Get()->app_list_controller()->GetModel()->top_level_item_list();
} else {
// The app is in the folder with |folder_id|.
item_list = Shell::Get()
->app_list_controller()
->GetModel()
->FindFolderItem(folder_id)
->item_list();
}
size_t from_index = 0;
item_list->FindItemIndex(item_id, &from_index);
item_list->MoveItem(from_index, to_index);
}
} // namespace ash