# Copyright 2019 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("linux/buildflags/buildflags.gni")

config("media_player_weak_link") {
  ldflags = [
    "-weak_framework",
    "MediaPlayer",
  ]

  visibility = [ ":system_media_controls" ]
}

component("system_media_controls") {
  friend = [ ":unit_tests" ]

  public = [
    "system_media_controls.h",
    "system_media_controls_observer.h",
  ]

  defines = [ "IS_SYSTEM_MEDIA_CONTROLS_IMPL" ]

  deps = [
    "//base",
    "//ui/gfx",
  ]

  public_deps = [
    "//skia",
  ]

  # TODO(https://crbug.com/949596): Move MPRIS and Now Playing here.
  if (is_win) {
    sources = [
      "win/system_media_controls_win.cc",
      "win/system_media_controls_win.h",
    ]
  } else if (use_mpris) {
    sources = [
      "linux/system_media_controls_linux.cc",
      "linux/system_media_controls_linux.h",
    ]
    deps += [
      "//build:branding_buildflags",
      "//components/dbus/properties",
      "//components/dbus/thread_linux",
      "//dbus",
    ]
  } else if (is_mac) {
    sources = [
      "mac/now_playing_info_center_delegate.h",
      "mac/now_playing_info_center_delegate.mm",
      "mac/now_playing_info_center_delegate_cocoa.h",
      "mac/now_playing_info_center_delegate_cocoa.mm",
      "mac/remote_command_center_delegate.h",
      "mac/remote_command_center_delegate.mm",
      "mac/remote_command_center_delegate_cocoa.h",
      "mac/remote_command_center_delegate_cocoa.mm",
      "mac/system_media_controls_mac.h",
      "mac/system_media_controls_mac.mm",
    ]
    deps += [ "//build:branding_buildflags" ]
    libs = [ "Foundation.framework" ]

    # MediaPlayer.framework is only available on macOS 10.12 and higher. In a
    # release build, component() is a static_library, which does not
    # transitively carry weak_link information. Ensure that all targets that
    # directly or indirectly carry the weak_link on the framework.
    all_dependent_configs = [ ":media_player_weak_link" ]
  } else {
    sources = [
      "system_media_controls_stub.cc",
    ]
  }
}

source_set("unit_tests") {
  testonly = true

  if (use_mpris) {
    sources = [
      "linux/system_media_controls_linux_unittest.cc",
    ]
    deps = [
      ":system_media_controls",
      "//base",
      "//base/test:test_support",
      "//components/dbus/thread_linux",
      "//dbus",
      "//dbus:test_support",
      "//testing/gmock",
      "//testing/gtest",
    ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "mock_system_media_controls.cc",
    "mock_system_media_controls.h",
  ]

  deps = [
    ":system_media_controls",
    "//base",
    "//testing/gmock",
  ]
}
