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 
5 #ifndef ASH_PUBLIC_CPP_APP_LIST_APP_LIST_CONFIG_H_
6 #define ASH_PUBLIC_CPP_APP_LIST_APP_LIST_CONFIG_H_
7 
8 #include "ash/public/cpp/app_list/app_list_types.h"
9 #include "ash/public/cpp/ash_public_export.h"
10 #include "ui/base/resource/resource_bundle.h"
11 #include "ui/gfx/geometry/insets.h"
12 #include "ui/gfx/geometry/size.h"
13 
14 namespace gfx {
15 class FontList;
16 }
17 
18 namespace ash {
19 
20 // Shared layout type information for app list. Use the instance() method to
21 // obtain the AppListConfig.
22 class ASH_PUBLIC_EXPORT AppListConfig {
23  public:
24   // Constructor for unscaled configurations of the provided type.
25   explicit AppListConfig(AppListConfigType type);
26 
27   // Constructor for scaled app list configuration.
28   // Used only if kScalableAppList feature is not enabled, in which case the
29   // app list configuration for small screens is created by scaling down
30   // AppListConfigType::kShared configuration.
31   //
32   // |scale_x| - The scale at which apps grid tile should be scaled
33   // horizontally.
34   // |scale_y| - The scale at which apps grid tile should be scaled
35   // vertically.
36   // |inner_title_scale_y| - The scale to use to vertically scale dimensions
37   // |min_y_scale| - Whether |scale_y| is the minimum scale allowed.
38   // within the apps grid tile. Different from |scale_y| because tile title
39   // height is not vertically scaled.
40   AppListConfig(const AppListConfig& base_config,
41                 float scale_x,
42                 float scale_y,
43                 float inner_tile_scale_y,
44                 bool min_y_scale);
45   ~AppListConfig();
46 
47   // Gets default app list configuration.
48   static AppListConfig& instance();
49 
type()50   AppListConfigType type() const { return type_; }
scale_x()51   float scale_x() const { return scale_x_; }
scale_y()52   float scale_y() const { return scale_y_; }
grid_tile_width()53   int grid_tile_width() const { return grid_tile_width_; }
grid_tile_height()54   int grid_tile_height() const { return grid_tile_height_; }
grid_tile_spacing()55   int grid_tile_spacing() const { return grid_tile_spacing_; }
grid_icon_dimension()56   int grid_icon_dimension() const { return grid_icon_dimension_; }
grid_icon_bottom_padding()57   int grid_icon_bottom_padding() const { return grid_icon_bottom_padding_; }
grid_title_top_padding()58   int grid_title_top_padding() const { return grid_title_top_padding_; }
grid_title_bottom_padding()59   int grid_title_bottom_padding() const { return grid_title_bottom_padding_; }
grid_title_horizontal_padding()60   int grid_title_horizontal_padding() const {
61     return grid_title_horizontal_padding_;
62   }
grid_title_width()63   int grid_title_width() const { return grid_title_width_; }
grid_focus_dimension()64   int grid_focus_dimension() const { return grid_focus_dimension_; }
grid_focus_corner_radius()65   int grid_focus_corner_radius() const { return grid_focus_corner_radius_; }
grid_title_color()66   SkColor grid_title_color() const { return grid_title_color_; }
grid_fadeout_zone_height()67   int grid_fadeout_zone_height() const { return grid_fadeout_zone_height_; }
grid_fadeout_mask_height()68   int grid_fadeout_mask_height() const { return grid_fadeout_mask_height_; }
grid_to_page_switcher_margin()69   int grid_to_page_switcher_margin() const {
70     return grid_to_page_switcher_margin_;
71   }
page_switcher_end_margin()72   int page_switcher_end_margin() const { return page_switcher_end_margin_; }
search_tile_icon_dimension()73   int search_tile_icon_dimension() const { return search_tile_icon_dimension_; }
search_tile_badge_icon_dimension()74   int search_tile_badge_icon_dimension() const {
75     return search_tile_badge_icon_dimension_;
76   }
search_tile_badge_icon_offset()77   int search_tile_badge_icon_offset() const {
78     return search_tile_badge_icon_offset_;
79   }
search_list_icon_dimension()80   int search_list_icon_dimension() const { return search_list_icon_dimension_; }
search_list_icon_vertical_bar_dimension()81   int search_list_icon_vertical_bar_dimension() const {
82     return search_list_icon_vertical_bar_dimension_;
83   }
search_list_badge_icon_dimension()84   int search_list_badge_icon_dimension() const {
85     return search_list_badge_icon_dimension_;
86   }
suggestion_chip_icon_dimension()87   int suggestion_chip_icon_dimension() const {
88     return suggestion_chip_icon_dimension_;
89   }
suggestion_chip_container_top_margin()90   int suggestion_chip_container_top_margin() const {
91     return suggestion_chip_container_top_margin_;
92   }
suggestion_chip_container_height()93   int suggestion_chip_container_height() const {
94     return suggestion_chip_container_height_;
95   }
app_title_max_line_height()96   int app_title_max_line_height() const { return app_title_max_line_height_; }
app_title_font()97   const gfx::FontList& app_title_font() const { return app_title_font_; }
peeking_app_list_height()98   int peeking_app_list_height() const { return peeking_app_list_height_; }
search_box_closed_top_padding()99   int search_box_closed_top_padding() const {
100     return search_box_closed_top_padding_;
101   }
search_box_peeking_top_padding()102   int search_box_peeking_top_padding() const {
103     return search_box_peeking_top_padding_;
104   }
search_box_fullscreen_top_padding()105   int search_box_fullscreen_top_padding() const {
106     return search_box_fullscreen_top_padding_;
107   }
search_box_height()108   int search_box_height() const { return search_box_height_; }
search_box_height_for_dense_layout()109   int search_box_height_for_dense_layout() const {
110     return search_box_height_for_dense_layout_;
111   }
preferred_cols()112   int preferred_cols() const { return preferred_cols_; }
preferred_rows()113   int preferred_rows() const { return preferred_rows_; }
page_spacing()114   int page_spacing() const { return page_spacing_; }
expand_arrow_tile_height()115   int expand_arrow_tile_height() const { return expand_arrow_tile_height_; }
folder_bubble_radius()116   int folder_bubble_radius() const { return folder_bubble_radius_; }
folder_bubble_y_offset()117   int folder_bubble_y_offset() const { return folder_bubble_y_offset_; }
folder_header_height()118   int folder_header_height() const { return folder_header_height_; }
folder_header_min_width()119   int folder_header_min_width() const { return folder_header_min_width_; }
folder_header_max_width()120   int folder_header_max_width() const { return folder_header_max_width_; }
folder_header_min_tap_width()121   int folder_header_min_tap_width() const {
122     return folder_header_min_tap_width_;
123   }
folder_name_border_radius()124   int folder_name_border_radius() const { return folder_name_border_radius_; }
folder_name_border_thickness()125   int folder_name_border_thickness() const {
126     return folder_name_border_thickness_;
127   }
folder_name_padding()128   int folder_name_padding() const { return folder_name_padding_; }
folder_icon_dimension()129   int folder_icon_dimension() const { return folder_icon_dimension_; }
folder_unclipped_icon_dimension()130   int folder_unclipped_icon_dimension() const {
131     return folder_unclipped_icon_dimension_;
132   }
folder_icon_radius()133   int folder_icon_radius() const { return folder_icon_radius_; }
folder_background_radius()134   int folder_background_radius() const { return folder_background_radius_; }
folder_bubble_color()135   int folder_bubble_color() const { return folder_bubble_color_; }
item_icon_in_folder_icon_dimension()136   int item_icon_in_folder_icon_dimension() const {
137     return item_icon_in_folder_icon_dimension_;
138   }
item_icon_in_folder_icon_margin()139   int item_icon_in_folder_icon_margin() const {
140     return item_icon_in_folder_icon_margin_;
141   }
folder_dropping_circle_radius()142   int folder_dropping_circle_radius() const {
143     return folder_dropping_circle_radius_;
144   }
folder_dropping_delay()145   int folder_dropping_delay() const { return folder_dropping_delay_; }
folder_background_color()146   SkColor folder_background_color() const { return folder_background_color_; }
page_flip_zone_size()147   int page_flip_zone_size() const { return page_flip_zone_size_; }
grid_tile_spacing_in_folder()148   int grid_tile_spacing_in_folder() const {
149     return grid_tile_spacing_in_folder_;
150   }
blur_radius()151   int blur_radius() const { return blur_radius_; }
grid_selected_color()152   SkColor grid_selected_color() const { return grid_selected_color_; }
page_transition_duration()153   base::TimeDelta page_transition_duration() const {
154     return page_transition_duration_;
155   }
overscroll_page_transition_duration()156   base::TimeDelta overscroll_page_transition_duration() const {
157     return overscroll_page_transition_duration_;
158   }
folder_transition_in_duration()159   base::TimeDelta folder_transition_in_duration() const {
160     return folder_transition_in_duration_;
161   }
folder_transition_out_duration()162   base::TimeDelta folder_transition_out_duration() const {
163     return folder_transition_out_duration_;
164   }
num_start_page_tiles()165   size_t num_start_page_tiles() const { return num_start_page_tiles_; }
max_search_results()166   size_t max_search_results() const { return max_search_results_; }
max_folder_pages()167   size_t max_folder_pages() const { return max_folder_pages_; }
max_folder_items_per_page()168   size_t max_folder_items_per_page() const {
169     return max_folder_items_per_page_;
170   }
max_folder_name_chars()171   size_t max_folder_name_chars() const { return max_folder_name_chars_; }
all_apps_opacity_start_px()172   float all_apps_opacity_start_px() const { return all_apps_opacity_start_px_; }
all_apps_opacity_end_px()173   float all_apps_opacity_end_px() const { return all_apps_opacity_end_px_; }
search_result_title_font_style()174   ui::ResourceBundle::FontStyle search_result_title_font_style() const {
175     return search_result_title_font_style_;
176   }
search_tile_height()177   int search_tile_height() const { return search_tile_height_; }
178 
max_search_result_tiles()179   size_t max_search_result_tiles() const { return max_search_result_tiles_; }
180 
max_search_result_list_items()181   size_t max_search_result_list_items() const {
182     return max_search_result_list_items_;
183   }
184 
max_assistant_search_result_list_items()185   size_t max_assistant_search_result_list_items() const {
186     return max_assistant_search_result_list_items_;
187   }
188 
privacy_container_score()189   double privacy_container_score() const { return privacy_container_score_; }
app_tiles_container_score()190   double app_tiles_container_score() const {
191     return app_tiles_container_score_;
192   }
results_list_container_score()193   double results_list_container_score() const {
194     return results_list_container_score_;
195   }
196 
grid_icon_size()197   gfx::Size grid_icon_size() const {
198     return gfx::Size(grid_icon_dimension_, grid_icon_dimension_);
199   }
200 
grid_focus_size()201   gfx::Size grid_focus_size() const {
202     return gfx::Size(grid_focus_dimension_, grid_focus_dimension_);
203   }
204 
search_tile_icon_size()205   gfx::Size search_tile_icon_size() const {
206     return gfx::Size(search_tile_icon_dimension_, search_tile_icon_dimension_);
207   }
208 
search_tile_badge_icon_size()209   gfx::Size search_tile_badge_icon_size() const {
210     return gfx::Size(search_tile_badge_icon_dimension_,
211                      search_tile_badge_icon_dimension_);
212   }
213 
search_list_icon_size()214   gfx::Size search_list_icon_size() const {
215     return gfx::Size(search_list_icon_dimension_, search_list_icon_dimension_);
216   }
217 
search_list_badge_icon_size()218   gfx::Size search_list_badge_icon_size() const {
219     return gfx::Size(search_list_badge_icon_dimension_,
220                      search_list_badge_icon_dimension_);
221   }
222 
folder_icon_size()223   gfx::Size folder_icon_size() const {
224     return gfx::Size(folder_icon_dimension_, folder_icon_dimension_);
225   }
226 
folder_unclipped_icon_size()227   gfx::Size folder_unclipped_icon_size() const {
228     return gfx::Size(folder_unclipped_icon_dimension_,
229                      folder_unclipped_icon_dimension_);
230   }
231 
folder_icon_insets()232   gfx::Insets folder_icon_insets() const {
233     int folder_icon_dimension_diff =
234         folder_unclipped_icon_dimension_ - folder_icon_dimension_;
235     return gfx::Insets(folder_icon_dimension_diff / 2,
236                        folder_icon_dimension_diff / 2,
237                        (folder_icon_dimension_diff + 1) / 2,
238                        (folder_icon_dimension_diff + 1) / 2);
239   }
240 
item_icon_in_folder_icon_size()241   gfx::Size item_icon_in_folder_icon_size() const {
242     return gfx::Size(item_icon_in_folder_icon_dimension_,
243                      item_icon_in_folder_icon_dimension_);
244   }
245 
246   // Returns the dimension at which a result's icon should be displayed.
247   int GetPreferredIconDimension(SearchResultDisplayType display_type) const;
248 
249   // Returns the maximum number of items allowed in specified page in apps grid.
250   int GetMaxNumOfItemsPerPage(int page) const;
251 
252   // The minimal horizontal padding for the apps grid.
253   int GetMinGridHorizontalPadding() const;
254 
255   // Returns the ideal apps container margins for the bounds available for app
256   // list content.
257   int GetIdealHorizontalMargin(const gfx::Rect& abailable_bounds) const;
258   int GetIdealVerticalMargin(const gfx::Rect& abailable_bounds) const;
259 
260   // Returns the color and opacity for the page background.
261   SkColor GetCardifiedBackgroundColor(bool is_active) const;
262 
263  private:
264   const AppListConfigType type_;
265 
266   // Current config scale values - should be different from 1 for
267   // AppListConfigType::kShared only.
268   const float scale_x_;
269   const float scale_y_;
270 
271   // The tile view's width and height of the item in apps grid view.
272   const int grid_tile_width_;
273   const int grid_tile_height_;
274 
275   // The spacing between tile views in apps grid view.
276   const int grid_tile_spacing_;
277 
278   // The icon dimension of tile views in apps grid view.
279   const int grid_icon_dimension_;
280 
281   // The icon bottom padding in tile views in apps grid view.
282   const int grid_icon_bottom_padding_;
283 
284   // The title top, bottom and horizontal padding in tile views in apps grid
285   // view.
286   const int grid_title_top_padding_;
287   const int grid_title_bottom_padding_;
288   const int grid_title_horizontal_padding_;
289 
290   // The title width and color of tile views in apps grid view.
291   const int grid_title_width_;
292   const SkColor grid_title_color_;
293 
294   // The focus dimension and corner radius of tile views in apps grid view.
295   const int grid_focus_dimension_;
296   const int grid_focus_corner_radius_;
297 
298   // The vertical insets in the apps grid reserved for the grid fade out area.
299   const int grid_fadeout_zone_height_;
300 
301   // The height of the masked area in the grid fade out zone.
302   // This is different from |grid_fadeout_zone_height_|, which may include
303   // additional margin outside the fadeout mask.
304   const int grid_fadeout_mask_height_;
305 
306   // Horizontal margin between the apps grid and the page switcher UI.
307   const int grid_to_page_switcher_margin_;
308 
309   // Minimal horizontal page switcher distance from the app list UI edge.
310   const int page_switcher_end_margin_;
311 
312   // The icon dimension of tile views in search result page view.
313   const int search_tile_icon_dimension_;
314 
315   // The badge icon dimension of tile views in search result page view.
316   const int search_tile_badge_icon_dimension_;
317 
318   // The badge icon offset of tile views in search result page view.
319   const int search_tile_badge_icon_offset_;
320 
321   // The icon dimension of list views in search result page view.
322   const int search_list_icon_dimension_;
323 
324   // The vertical bar icon dimension of list views in search result page view.
325   const int search_list_icon_vertical_bar_dimension_;
326 
327   // The badge background corner radius of list views in search result page
328   // view.
329   const int search_list_badge_icon_dimension_;
330 
331   // The suggestion chip icon dimension.
332   const int suggestion_chip_icon_dimension_;
333 
334   // The suggestion chip container top margin.
335   const int suggestion_chip_container_top_margin_;
336 
337   // The suggestion chip container height.
338   const int suggestion_chip_container_height_;
339 
340   // The maximum line height for app title in app list.
341   const int app_title_max_line_height_;
342 
343   // The font for app title in app list.
344   const gfx::FontList app_title_font_;
345 
346   // The height of app list in peeking mode.
347   const int peeking_app_list_height_;
348 
349   // The top padding of search box in closed state.
350   const int search_box_closed_top_padding_;
351 
352   // The top padding of search box in peeking state.
353   const int search_box_peeking_top_padding_;
354 
355   // The top padding of search box in fullscreen state.
356   const int search_box_fullscreen_top_padding_;
357 
358   // The preferred search box height.
359   const int search_box_height_;
360 
361   // The preferred search box height when the vertical app list contents space
362   // is condensed - normally |search_box_height_| would be used.
363   const int search_box_height_for_dense_layout_;
364 
365   // Preferred number of columns and rows in apps grid.
366   const int preferred_cols_;
367   const int preferred_rows_;
368 
369   // The spacing between each page.
370   const int page_spacing_;
371 
372   // The tile height of expand arrow.
373   const int expand_arrow_tile_height_;
374 
375   // The folder image bubble radius.
376   const int folder_bubble_radius_;
377 
378   // The y offset of folder image bubble center.
379   const int folder_bubble_y_offset_;
380 
381   // The height of the in folder name and pagination buttons.
382   const int folder_header_height_;
383 
384   // The min and max widths of the folder name.
385   const int folder_header_min_width_;
386   const int folder_header_max_width_;
387 
388   // The min width of folder name for tap events.
389   const int folder_header_min_tap_width_;
390 
391   // The border radius for folder name.
392   const int folder_name_border_radius_;
393 
394   // The border thickness for folder name.
395   const int folder_name_border_thickness_;
396 
397   // The inner padding for folder name.
398   const int folder_name_padding_;
399 
400   // The icon dimension of folder.
401   const int folder_icon_dimension_;
402 
403   // The unclipped icon dimension of folder.
404   const int folder_unclipped_icon_dimension_;
405 
406   // The corner radius of folder icon.
407   const int folder_icon_radius_;
408 
409   // The corner radius of folder background.
410   const int folder_background_radius_;
411 
412   // The color of folder bubble.
413   const int folder_bubble_color_;
414 
415   // The dimension of the item icon in folder icon.
416   const int item_icon_in_folder_icon_dimension_;
417 
418   // The margin between item icons inside a folder icon.
419   const int item_icon_in_folder_icon_margin_;
420 
421   // Radius of the circle, in which if entered, show folder dropping preview
422   // UI.
423   const int folder_dropping_circle_radius_;
424 
425   // Delays in milliseconds to show folder dropping preview circle.
426   const int folder_dropping_delay_;
427 
428   // The background color of folder.
429   const SkColor folder_background_color_;
430 
431   // Width in pixels of the area on the sides that triggers a page flip.
432   const int page_flip_zone_size_;
433 
434   // The spacing between tile views in folder.
435   const int grid_tile_spacing_in_folder_;
436 
437   // The blur radius used in the app list.
438   const int blur_radius_;
439 
440   // The keyboard select color for grid views, which are on top of a black
441   // shield view for new design (12% white).
442   const SkColor grid_selected_color_;
443 
444   // Duration for page transition.
445   const base::TimeDelta page_transition_duration_;
446 
447   // Duration for over scroll page transition.
448   const base::TimeDelta overscroll_page_transition_duration_;
449 
450   // Duration for fading in the target page when opening
451   // or closing a folder, and the duration for the top folder icon animation
452   // for flying in or out the folder.
453   const base::TimeDelta folder_transition_in_duration_;
454 
455   // Duration for fading out the old page when opening or
456   // closing a folder.
457   const base::TimeDelta folder_transition_out_duration_;
458 
459   // The number of apps shown in the start page app grid.
460   const size_t num_start_page_tiles_;
461 
462   // Maximum number of results to show in the launcher Search UI.
463   const size_t max_search_results_;
464 
465   // Max pages allowed in a folder.
466   const size_t max_folder_pages_;
467 
468   // Max items per page allowed in a folder.
469   const size_t max_folder_items_per_page_;
470 
471   // Maximum length of the folder name in chars.
472   const size_t max_folder_name_chars_;
473 
474   // Range of the height of centerline above screen bottom that all apps should
475   // change opacity. NOTE: this is used to change page switcher's opacity as
476   // well.
477   const float all_apps_opacity_start_px_ = 8.0f;
478   const float all_apps_opacity_end_px_ = 144.0f;
479 
480   // Font style for AppListSearchResultTileItemViews that are not suggested
481   // apps.
482   const ui::ResourceBundle::FontStyle search_result_title_font_style_;
483 
484   // The height of tiles in search result.
485   const int search_tile_height_ = 90;
486 
487   // Max number of search result tiles in the launcher suggestion window.
488   const size_t max_search_result_tiles_ = 6;
489 
490   // Max number of search result list items in the launcher suggestion window.
491   const size_t max_search_result_list_items_ = 5;
492 
493   // Max number of Assistant search result list items in the launcher suggestion
494   // window. Appears in the list after normal search results.
495   const size_t max_assistant_search_result_list_items_ = 1;
496 
497   // Scores for the containers within the search box view. These are displayed
498   // in high-to-low order.
499   // The privacy container is not always visible, but when available it should
500   // always be the first item underneath the search box.
501   const double privacy_container_score_ = 4.0;
502   const double app_tiles_container_score_ = 3.0;
503   const double results_list_container_score_ = 1.0;
504 
505   // Cardified app list background properties
506   const SkColor cardified_background_color_;
507   const SkColor cardified_background_color_active_;
508 
509   DISALLOW_COPY_AND_ASSIGN(AppListConfig);
510 };
511 
512 }  // namespace ash
513 
514 #endif  // ASH_PUBLIC_CPP_APP_LIST_APP_LIST_CONFIG_H_
515