app_list_test_helper.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  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/test/app_list_test_helper.h"
  5. #include <string>
  6. #include <utility>
  7. #include "ash/app_list/app_list_bubble_presenter.h"
  8. #include "ash/app_list/app_list_controller_impl.h"
  9. #include "ash/app_list/app_list_model_provider.h"
  10. #include "ash/app_list/app_list_presenter_impl.h"
  11. #include "ash/app_list/model/app_list_item.h"
  12. #include "ash/app_list/model/app_list_test_model.h"
  13. #include "ash/app_list/model/search/test_search_result.h"
  14. #include "ash/app_list/views/app_list_bubble_apps_page.h"
  15. #include "ash/app_list/views/app_list_bubble_search_page.h"
  16. #include "ash/app_list/views/app_list_bubble_view.h"
  17. #include "ash/app_list/views/app_list_folder_view.h"
  18. #include "ash/app_list/views/app_list_main_view.h"
  19. #include "ash/app_list/views/app_list_toast_container_view.h"
  20. #include "ash/app_list/views/app_list_view.h"
  21. #include "ash/app_list/views/apps_container_view.h"
  22. #include "ash/app_list/views/contents_view.h"
  23. #include "ash/app_list/views/continue_section_view.h"
  24. #include "ash/app_list/views/productivity_launcher_search_view.h"
  25. #include "ash/app_list/views/search_result_page_dialog_controller.h"
  26. #include "ash/app_list/views/search_result_page_view.h"
  27. #include "ash/constants/ash_features.h"
  28. #include "ash/shell.h"
  29. #include "ash/test/ash_test_util.h"
  30. #include "base/guid.h"
  31. #include "base/run_loop.h"
  32. #include "testing/gtest/include/gtest/gtest.h"
  33. #include "ui/gfx/animation/tween.h"
  34. namespace ash {
  35. namespace {
  36. // The size of the app list item solid-colored icons.
  37. constexpr gfx::Size kIconImageSize(56, 56);
  38. // An app list should be either a bubble app list or a fullscreen app list.
  39. // Returns true if a bubble app list should be used under the current mode.
  40. bool ShouldUseBubbleAppList() {
  41. // A bubble app list should be used only when:
  42. // (1) It is in clamshell mode; and
  43. // (2) The productivity launcher flag is enabled.
  44. return !Shell::Get()->IsInTabletMode() &&
  45. features::IsProductivityLauncherEnabled();
  46. }
  47. } // namespace
  48. AppListTestHelper::AppListTestHelper() {
  49. // The app list controller is ready after Shell is created.
  50. app_list_controller_ = Shell::Get()->app_list_controller();
  51. DCHECK(app_list_controller_);
  52. // Use a new app list client for each test
  53. app_list_client_ = std::make_unique<TestAppListClient>();
  54. app_list_controller_->SetClient(app_list_client_.get());
  55. app_list_controller_->SetActiveModel(/*profile_id=*/1, &model_,
  56. &search_model_);
  57. // Disable app list nudge as default.
  58. DisableAppListNudge(true);
  59. AppListNudgeController::SetPrivacyNoticeAcceptedForTest(true);
  60. }
  61. AppListTestHelper::~AppListTestHelper() {
  62. app_list_controller_->ClearActiveModel();
  63. app_list_controller_->SetClient(nullptr);
  64. }
  65. void AppListTestHelper::WaitUntilIdle() {
  66. base::RunLoop().RunUntilIdle();
  67. }
  68. void AppListTestHelper::WaitForFolderAnimation() {
  69. AppListFolderView* folder_view = nullptr;
  70. if (!Shell::Get()->IsInTabletMode() &&
  71. features::IsProductivityLauncherEnabled()) {
  72. folder_view = GetBubbleFolderView();
  73. } else {
  74. folder_view = GetFullscreenFolderView();
  75. }
  76. if (!folder_view || !folder_view->IsAnimationRunning())
  77. return;
  78. base::RunLoop run_loop;
  79. folder_view->SetAnimationDoneTestCallback(run_loop.QuitClosure());
  80. run_loop.Run();
  81. }
  82. void AppListTestHelper::ShowAppList() {
  83. app_list_controller_->ShowAppList();
  84. }
  85. void AppListTestHelper::ShowAndRunLoop(uint64_t display_id) {
  86. ShowAndRunLoop(display_id, AppListShowSource::kSearchKey);
  87. }
  88. void AppListTestHelper::Show(uint64_t display_id) {
  89. ShowAndRunLoop(display_id, AppListShowSource::kSearchKey);
  90. }
  91. void AppListTestHelper::ShowAndRunLoop(uint64_t display_id,
  92. AppListShowSource show_source) {
  93. app_list_controller_->Show(display_id, show_source, base::TimeTicks());
  94. WaitUntilIdle();
  95. }
  96. void AppListTestHelper::DismissAndRunLoop() {
  97. app_list_controller_->DismissAppList();
  98. WaitUntilIdle();
  99. }
  100. void AppListTestHelper::Dismiss() {
  101. app_list_controller_->DismissAppList();
  102. }
  103. void AppListTestHelper::ToggleAndRunLoop(uint64_t display_id) {
  104. ToggleAndRunLoop(display_id, AppListShowSource::kSearchKey);
  105. }
  106. void AppListTestHelper::ToggleAndRunLoop(uint64_t display_id,
  107. AppListShowSource show_source) {
  108. app_list_controller_->ToggleAppList(display_id, show_source,
  109. base::TimeTicks());
  110. WaitUntilIdle();
  111. }
  112. void AppListTestHelper::StartSlideAnimationOnBubbleAppsPage(
  113. views::View* view,
  114. int vertical_offset,
  115. base::TimeDelta duration,
  116. gfx::Tween::Type tween_type) {
  117. GetBubbleAppsPage()->SlideViewIntoPosition(view, vertical_offset, duration,
  118. tween_type);
  119. }
  120. void AppListTestHelper::CheckVisibility(bool visible) {
  121. EXPECT_EQ(visible, app_list_controller_->IsVisible());
  122. EXPECT_EQ(visible, app_list_controller_->GetTargetVisibility(absl::nullopt));
  123. }
  124. void AppListTestHelper::CheckState(AppListViewState state) {
  125. EXPECT_EQ(state, app_list_controller_->GetAppListViewState());
  126. }
  127. void AppListTestHelper::AddAppItems(int num_apps) {
  128. AddAppItemsWithColorAndName(num_apps, IconColorType::kNotSet,
  129. /*set_name=*/false);
  130. }
  131. void AppListTestHelper::AddAppItemsWithColorAndName(int num_apps,
  132. IconColorType color_type,
  133. bool set_name) {
  134. AppListModel* const model = AppListModelProvider::Get()->model();
  135. const int num_apps_already_added = model->top_level_item_list()->item_count();
  136. for (int i = 0; i < num_apps; i++) {
  137. const std::string id(
  138. test::AppListTestModel::GetItemName(i + num_apps_already_added));
  139. auto item = std::make_unique<AppListItem>(id);
  140. absl::optional<SkColor> solid_color;
  141. switch (color_type) {
  142. case IconColorType::kDefaultColor:
  143. solid_color = icon_color_generator_.default_color();
  144. break;
  145. case IconColorType::kAlternativeColor:
  146. solid_color = icon_color_generator_.GetAlternativeColor();
  147. break;
  148. case IconColorType::kNotSet:
  149. break;
  150. }
  151. if (solid_color) {
  152. // Skip the calculation of the icon color from the generated solid-colored
  153. // icon to save some time.
  154. item->SetDefaultIconAndColor(
  155. CreateSolidColorTestImage(kIconImageSize, *solid_color), IconColor());
  156. }
  157. auto* item_ptr = item.get();
  158. model->AddItem(std::move(item));
  159. if (set_name)
  160. model->SetItemName(item_ptr, id);
  161. }
  162. }
  163. void AppListTestHelper::AddPageBreakItem() {
  164. auto page_break_item = std::make_unique<AppListItem>(base::GenerateGUID());
  165. page_break_item->set_is_page_break(true);
  166. AppListModelProvider::Get()->model()->AddItem(std::move(page_break_item));
  167. }
  168. void AppListTestHelper::AddContinueSuggestionResults(int num_results) {
  169. for (int i = 0; i < num_results; i++) {
  170. auto result = std::make_unique<TestSearchResult>();
  171. result->set_result_id(base::NumberToString(i));
  172. result->set_result_type(AppListSearchResultType::kZeroStateFile);
  173. result->set_display_type(SearchResultDisplayType::kContinue);
  174. GetSearchResults()->Add(std::move(result));
  175. }
  176. }
  177. void AppListTestHelper::AddRecentApps(int num_apps) {
  178. for (int i = 0; i < num_apps; i++) {
  179. auto result = std::make_unique<TestSearchResult>();
  180. // Use the same "Item #" convention as AppListTestModel uses. The search
  181. // result IDs must match app item IDs in the app list data model.
  182. result->set_result_id(test::AppListTestModel::GetItemName(i));
  183. result->set_result_type(AppListSearchResultType::kInstalledApp);
  184. result->set_display_type(SearchResultDisplayType::kRecentApps);
  185. GetSearchResults()->Add(std::move(result));
  186. }
  187. }
  188. bool AppListTestHelper::IsInFolderView() {
  189. if (ShouldUseBubbleAppList())
  190. return GetBubbleView()->showing_folder_for_test();
  191. return GetAppListView()
  192. ->app_list_main_view()
  193. ->contents_view()
  194. ->apps_container_view()
  195. ->IsInFolderView();
  196. }
  197. void AppListTestHelper::DisableAppListNudge(bool disable) {
  198. AppListNudgeController::SetReorderNudgeDisabledForTest(disable);
  199. }
  200. AppListView* AppListTestHelper::GetAppListView() {
  201. return app_list_controller_->fullscreen_presenter()->GetView();
  202. }
  203. SearchBoxView* AppListTestHelper::GetSearchBoxView() {
  204. if (ShouldUseBubbleAppList())
  205. return GetBubbleView()->search_box_view_for_test();
  206. return GetAppListView()->search_box_view();
  207. }
  208. AppsContainerView* AppListTestHelper::GetAppsContainerView() {
  209. return GetAppListView()
  210. ->app_list_main_view()
  211. ->contents_view()
  212. ->apps_container_view();
  213. }
  214. AppListFolderView* AppListTestHelper::GetFullscreenFolderView() {
  215. return GetAppsContainerView()->app_list_folder_view();
  216. }
  217. RecentAppsView* AppListTestHelper::GetFullscreenRecentAppsView() {
  218. return GetAppsContainerView()->GetRecentAppsView();
  219. }
  220. ContinueSectionView* AppListTestHelper::GetFullscreenContinueSectionView() {
  221. return GetAppsContainerView()->GetContinueSectionView();
  222. }
  223. PagedAppsGridView* AppListTestHelper::GetRootPagedAppsGridView() {
  224. return GetAppsContainerView()->apps_grid_view();
  225. }
  226. views::View* AppListTestHelper::GetFullscreenLauncherAppsSeparatorView() {
  227. return GetAppsContainerView()->separator();
  228. }
  229. SearchResultPageView* AppListTestHelper::GetFullscreenSearchResultPageView() {
  230. return GetAppListView()
  231. ->app_list_main_view()
  232. ->contents_view()
  233. ->search_result_page_view();
  234. }
  235. bool AppListTestHelper::IsShowingFullscreenSearchResults() {
  236. return GetAppListView()
  237. ->app_list_main_view()
  238. ->contents_view()
  239. ->IsShowingSearchResults();
  240. }
  241. SearchResultPageAnchoredDialog*
  242. AppListTestHelper::GetFullscreenSearchPageDialog() {
  243. if (IsShowingFullscreenSearchResults())
  244. return GetFullscreenSearchResultPageView()->dialog_for_test();
  245. return GetAppsContainerView()->dialog_for_test();
  246. }
  247. AppListBubbleView* AppListTestHelper::GetBubbleView() {
  248. return app_list_controller_->bubble_presenter_for_test()
  249. ->bubble_view_for_test();
  250. }
  251. SearchBoxView* AppListTestHelper::GetBubbleSearchBoxView() {
  252. return app_list_controller_->bubble_presenter_for_test()
  253. ->bubble_view_for_test()
  254. ->search_box_view_;
  255. }
  256. AppListFolderView* AppListTestHelper::GetBubbleFolderView() {
  257. return app_list_controller_->bubble_presenter_for_test()
  258. ->bubble_view_for_test()
  259. ->folder_view_;
  260. }
  261. AppListBubbleAppsPage* AppListTestHelper::GetBubbleAppsPage() {
  262. return app_list_controller_->bubble_presenter_for_test()
  263. ->bubble_view_for_test()
  264. ->apps_page_;
  265. }
  266. ContinueSectionView* AppListTestHelper::GetBubbleContinueSectionView() {
  267. return GetBubbleAppsPage()->continue_section_;
  268. }
  269. RecentAppsView* AppListTestHelper::GetBubbleRecentAppsView() {
  270. return GetBubbleAppsPage()->recent_apps_;
  271. }
  272. ScrollableAppsGridView* AppListTestHelper::GetScrollableAppsGridView() {
  273. return GetBubbleAppsPage()->scrollable_apps_grid_view_;
  274. }
  275. AppListBubbleSearchPage* AppListTestHelper::GetBubbleSearchPage() {
  276. return app_list_controller_->bubble_presenter_for_test()
  277. ->bubble_view_for_test()
  278. ->search_page_;
  279. }
  280. SearchResultPageAnchoredDialog* AppListTestHelper::GetBubbleSearchPageDialog() {
  281. return app_list_controller_->bubble_presenter_for_test()
  282. ->bubble_view_for_test()
  283. ->search_page_dialog_controller_->dialog();
  284. }
  285. AppListBubbleAssistantPage* AppListTestHelper::GetBubbleAssistantPage() {
  286. return app_list_controller_->bubble_presenter_for_test()
  287. ->bubble_view_for_test()
  288. ->assistant_page_;
  289. }
  290. SearchModel::SearchResults* AppListTestHelper::GetSearchResults() {
  291. return AppListModelProvider::Get()->search_model()->results();
  292. }
  293. std::vector<ash::AppListSearchResultCategory>*
  294. AppListTestHelper::GetOrderedResultCategories() {
  295. return AppListModelProvider::Get()->search_model()->ordered_categories();
  296. }
  297. ProductivityLauncherSearchView*
  298. AppListTestHelper::GetProductivityLauncherSearchView() {
  299. return app_list_controller_->bubble_presenter_for_test()
  300. ->bubble_view_for_test()
  301. ->search_page_->search_view();
  302. }
  303. views::View* AppListTestHelper::GetBubbleLauncherAppsSeparatorView() {
  304. return GetBubbleAppsPage()->separator_for_test();
  305. }
  306. } // namespace ash