# 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.

import("//build/config/ui.gni")
import("//testing/test.gni")

component("app_list") {
  sources = [
    "app_list_constants.cc",
    "app_list_constants.h",
    "app_list_export.h",
    "app_list_features.cc",
    "app_list_features.h",
    "app_list_folder_item.cc",
    "app_list_folder_item.h",
    "app_list_item.cc",
    "app_list_item.h",
    "app_list_item_list.cc",
    "app_list_item_list.h",
    "app_list_item_list_observer.h",
    "app_list_item_observer.h",
    "app_list_model.cc",
    "app_list_model.h",
    "app_list_model_observer.h",
    "app_list_switches.cc",
    "app_list_switches.h",
    "app_list_view_delegate.h",
    "folder_image.cc",
    "folder_image.h",
    "pagination_controller.cc",
    "pagination_controller.h",
    "pagination_model.cc",
    "pagination_model.h",
    "pagination_model_observer.h",
    "search/dictionary_data_store.cc",
    "search/dictionary_data_store.h",
    "search/history.cc",
    "search/history.h",
    "search/history_data.cc",
    "search/history_data.h",
    "search/history_data_observer.h",
    "search/history_data_store.cc",
    "search/history_data_store.h",
    "search/history_types.h",
    "search/mixer.cc",
    "search/mixer.h",
    "search/term_break_iterator.cc",
    "search/term_break_iterator.h",
    "search/tokenized_string.cc",
    "search/tokenized_string.h",
    "search/tokenized_string_char_iterator.cc",
    "search/tokenized_string_char_iterator.h",
    "search/tokenized_string_match.cc",
    "search/tokenized_string_match.h",
    "search_box_model.cc",
    "search_box_model.h",
    "search_box_model_observer.h",
    "search_controller.cc",
    "search_controller.h",
    "search_provider.cc",
    "search_provider.h",
    "search_result.cc",
    "search_result.h",
    "search_result_observer.h",
    "speech_ui_model.cc",
    "speech_ui_model.h",
    "speech_ui_model_observer.h",
  ]

  defines = [ "APP_LIST_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//components/keyed_service/core",
    "//components/sync",
    "//skia",
    "//third_party/icu",
    "//ui/accessibility",
    "//ui/app_list/resources",
    "//ui/base",
    "//ui/base/ime",
    "//ui/compositor",
    "//ui/display",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/resources",
    "//ui/strings",
  ]

  if (use_aura) {
    deps += [
      "//ui/aura",
      "//ui/wm",
    ]
  }

  if (toolkit_views) {
    sources += [
      "views/all_apps_tile_item_view.cc",
      "views/all_apps_tile_item_view.h",
      "views/app_list_drag_and_drop_host.h",
      "views/app_list_folder_view.cc",
      "views/app_list_folder_view.h",
      "views/app_list_item_view.cc",
      "views/app_list_item_view.h",
      "views/app_list_main_view.cc",
      "views/app_list_main_view.h",
      "views/app_list_page.cc",
      "views/app_list_page.h",
      "views/app_list_view.cc",
      "views/app_list_view.h",
      "views/apps_container_view.cc",
      "views/apps_container_view.h",
      "views/apps_grid_view.cc",
      "views/apps_grid_view.h",
      "views/apps_grid_view_delegate.h",
      "views/apps_grid_view_folder_delegate.h",
      "views/contents_view.cc",
      "views/contents_view.h",
      "views/custom_launcher_page_view.cc",
      "views/custom_launcher_page_view.h",
      "views/folder_background_view.cc",
      "views/folder_background_view.h",
      "views/folder_header_view.cc",
      "views/folder_header_view.h",
      "views/folder_header_view_delegate.h",
      "views/image_shadow_animator.cc",
      "views/image_shadow_animator.h",
      "views/page_switcher.cc",
      "views/page_switcher.h",
      "views/pulsing_block_view.cc",
      "views/pulsing_block_view.h",
      "views/search_box_view.cc",
      "views/search_box_view.h",
      "views/search_box_view_delegate.h",
      "views/search_result_actions_view.cc",
      "views/search_result_actions_view.h",
      "views/search_result_actions_view_delegate.h",
      "views/search_result_container_view.cc",
      "views/search_result_container_view.h",
      "views/search_result_list_view.cc",
      "views/search_result_list_view.h",
      "views/search_result_list_view_delegate.h",
      "views/search_result_page_view.cc",
      "views/search_result_page_view.h",
      "views/search_result_tile_item_list_view.cc",
      "views/search_result_tile_item_list_view.h",
      "views/search_result_tile_item_view.cc",
      "views/search_result_tile_item_view.h",
      "views/search_result_view.cc",
      "views/search_result_view.h",
      "views/speech_view.cc",
      "views/speech_view.h",
      "views/start_page_view.cc",
      "views/start_page_view.h",
      "views/tile_item_view.cc",
      "views/tile_item_view.h",
      "views/top_icon_animation_view.cc",
      "views/top_icon_animation_view.h",
    ]
    deps += [
      "//ui/events",
      "//ui/views",
    ]

    public_deps = [
      "//ui/views",
    ]
  }
}

static_library("test_support") {
  sources = [
    "test/app_list_test_model.cc",
    "test/app_list_test_model.h",
    "test/app_list_test_view_delegate.cc",
    "test/app_list_test_view_delegate.h",
    "test/test_search_result.cc",
    "test/test_search_result.h",
    "views/test/app_list_view_test_api.cc",
    "views/test/app_list_view_test_api.h",
  ]

  deps = [
    ":app_list",
    "//base",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]
}

if (toolkit_views) {
  executable("app_list_demo") {
    testonly = true

    sources = [
      "demo/app_list_demo_views.cc",
    ]

    deps = [
      ":app_list",
      ":test_support",
      "//base",
      "//build/config:exe_and_shlib_deps",
      "//build/win:default_exe_manifest",
      "//content",
      "//content/public/browser",
      "//skia",
      "//ui/base",
      "//ui/events",
      "//ui/resources",
      "//ui/resources:ui_test_pak",
      "//ui/views",
      "//ui/views/controls/webview",
      "//ui/views_content_client",
      "//url",
    ]
  }
}

test("app_list_unittests") {
  sources = [
    "app_list_item_list_unittest.cc",
    "app_list_model_unittest.cc",
    "folder_image_unittest.cc",
    "pagination_model_unittest.cc",
    "search/history_data_store_unittest.cc",
    "search/mixer_unittest.cc",
    "search/term_break_iterator_unittest.cc",
    "search/tokenized_string_char_iterator_unittest.cc",
    "search/tokenized_string_match_unittest.cc",
    "search/tokenized_string_unittest.cc",
    "test/run_all_unittests.cc",
  ]

  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  deps = [
    ":app_list",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//ui/base",
    "//ui/compositor",
    "//ui/events:test_support",
    "//ui/gfx:test_support",
    "//ui/gl:test_support",
    "//ui/resources",
  ]

  data_deps = [
    "//third_party/mesa:osmesa",
    "//ui/resources:ui_test_pak_data",
  ]

  if (toolkit_views) {
    sources += [
      "views/app_list_main_view_unittest.cc",
      "views/app_list_view_unittest.cc",
      "views/apps_grid_view_unittest.cc",
      "views/folder_header_view_unittest.cc",
      "views/image_shadow_animator_unittest.cc",
      "views/search_box_view_unittest.cc",
      "views/search_result_list_view_unittest.cc",
      "views/search_result_page_view_unittest.cc",
      "views/speech_view_unittest.cc",
      "views/test/apps_grid_view_test_api.cc",
      "views/test/apps_grid_view_test_api.h",
    ]
    deps += [
      "//ui/views",
      "//ui/views:test_support",
    ]
  }
}
