# 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/features.gni")
import("//build/config/ui.gni")

component("message_center") {
  deps = [
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//skia",
    "//ui/accessibility",
    "//ui/base",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/native_theme",
    "//ui/resources",
    "//ui/strings",
    "//url",
  ]

  defines = [ "MESSAGE_CENTER_IMPLEMENTATION" ]

  if (enable_notifications && !is_android) {
    sources = [
      "cocoa/notification_controller.h",
      "cocoa/notification_controller.mm",
      "cocoa/opaque_views.h",
      "cocoa/opaque_views.mm",
      "cocoa/popup_collection.h",
      "cocoa/popup_collection.mm",
      "cocoa/popup_controller.h",
      "cocoa/popup_controller.mm",
      "cocoa/settings_controller.h",
      "cocoa/settings_controller.mm",
      "cocoa/settings_entry_view.h",
      "cocoa/settings_entry_view.mm",
      "cocoa/status_item_view.h",
      "cocoa/status_item_view.mm",
      "cocoa/tray_controller.h",
      "cocoa/tray_controller.mm",
      "cocoa/tray_view_controller.h",
      "cocoa/tray_view_controller.mm",
      "message_center.cc",
      "message_center.h",
      "message_center_export.h",
      "notification_delegate.cc",
      "notification_delegate.h",
      "message_center_impl.cc",
      "message_center_impl.h",
      "message_center_observer.h",
      "message_center_style.cc",
      "message_center_style.h",
      "message_center_tray.cc",
      "message_center_tray.h",
      "message_center_tray_delegate.h",
      "message_center_types.h",
      "message_center_switches.h",
      "message_center_switches.cc",
      "notification.cc",
      "notification.h",
      "notification_blocker.cc",
      "notification_blocker.h",
      "notification_list.cc",
      "notification_list.h",
      "notification_types.cc",
      "notification_types.h",
      "notifier_settings.cc",
      "notifier_settings.h",
    ]

    if (is_win) {
      # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
      cflags = [ "/wd4267" ]
      deps += [ "//ui/aura" ]
    }

    # On Mac, toolkit-views builds still use the Cocoa UI. Keep this in sync
    # with message_center_unittests below.
    if (toolkit_views && !is_mac) {
      sources += [
        "views/bounded_label.cc",
        "views/bounded_label.h",
        "views/constants.h",
        "views/desktop_popup_alignment_delegate.cc",
        "views/desktop_popup_alignment_delegate.h",
        "views/message_center_controller.h",
        "views/message_center_button_bar.cc",
        "views/message_center_button_bar.h",
        "views/message_center_view.cc",
        "views/message_center_view.h",
        "views/message_popup_collection.cc",
        "views/message_popup_collection.h",
        "views/message_view.cc",
        "views/message_view.h",
        "views/message_view_context_menu_controller.cc",
        "views/message_view_context_menu_controller.h",
        "views/notifier_settings_view.cc",
        "views/notifier_settings_view.h",
        "views/notification_button.cc",
        "views/notification_button.h",
        "views/notification_view.cc",
        "views/notification_view.h",
        "views/padded_button.cc",
        "views/padded_button.h",
        "views/popup_alignment_delegate.cc",
        "views/popup_alignment_delegate.h",
        "views/proportional_image_view.cc",
        "views/proportional_image_view.h",
        "views/toast_contents_view.cc",
        "views/toast_contents_view.h",
      ]
      deps += [
        "//ui/events",
        "//ui/views",
        "//ui/compositor",
      ]
    }

    if (use_ash) {
      sources += [
        "views/message_bubble_base.cc",
        "views/message_bubble_base.h",
        "views/message_center_bubble.cc",
        "views/message_center_bubble.h",
      ]
    }

  } else {
    # Notification service disabled.
    sources = [
      "dummy_message_center.cc",
      "notification_delegate.cc",
      "notification_delegate.h",
    ]
    # Android implements its own notification UI manager instead of deferring to
    # the message center (when notifications are enabled). Include a minimal
    # set of files required for notifications on Android.
    if (is_android) {
      sources += [
        "notification.cc",
        "notification.h",
        "notifier_settings.cc",
        "notifier_settings.h",
      ]
    }
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "fake_message_center.h",
    "fake_message_center.cc",
    "fake_message_center_tray_delegate.h",
    "fake_message_center_tray_delegate.cc",
    "fake_notifier_settings_provider.h",
    "fake_notifier_settings_provider.cc",
  ]

  public_deps = [
    ":message_center",
  ]

  deps = [
    "//base",
    "//base/test:test_support",
    "//skia",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]
}

test("message_center_unittests") {
  sources = [
    "test/run_all_unittests.cc",
  ]

  deps = [
    ":message_center",
    ":test_support",
    "//base",
    "//base/allocator",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//ui/base",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    "//ui/resources",
    "//ui/resources:ui_test_pak",
    "//url",
  ]

  if (enable_notifications && !is_android) {
    sources += [
      "cocoa/notification_controller_unittest.mm",
      "cocoa/popup_collection_unittest.mm",
      "cocoa/popup_controller_unittest.mm",
      "cocoa/settings_controller_unittest.mm",
      "cocoa/status_item_view_unittest.mm",
      "cocoa/tray_controller_unittest.mm",
      "cocoa/tray_view_controller_unittest.mm",
      "message_center_tray_unittest.cc",
      "message_center_impl_unittest.cc",
      "notification_delegate_unittest.cc",
      "notification_list_unittest.cc",
    ]

    if (is_mac) {
      deps += [ "//ui/gfx:test_support" ]
    }

    if (toolkit_views && !is_mac) {
      sources += [
        "views/bounded_label_unittest.cc",
        "views/message_center_view_unittest.cc",
        "views/message_popup_collection_unittest.cc",
        "views/notification_view_unittest.cc",
        "views/notifier_settings_view_unittest.cc",
      ]
      deps += [
        # Compositor is needed by message_center_view_unittest.cc and for the
        # fonts used by bounded_label_unittest.cc.
        "//ui/compositor",
        "//ui/views",
        "//ui/views:test_support",
      ]
    }
  }  # enable_notifications && !is_android
}
