# Copyright 2015 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/buildflag_header.gni")
import("//build/config/features.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
import("//chromecast/build/tests/cast_test.gni")
import("//chromecast/chromecast.gni")
import("//media/media_options.gni")
import("//tools/grit/repack.gni")
import("//ui/ozone/ozone.gni")
import("//v8/gni/v8.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

declare_args() {
  cast_test_extra_flags = ""
}

# Depends on all non-test targets that should be built by the Chromecast
# internal build infrastructure.
group("all") {
  deps = []
  if (is_android && chromecast_branding == "public") {
    deps += [ ":cast_shell_apk" ]
  }
  if (!is_android) {
    deps += [ ":cast_shell" ]
  }
  if (is_linux) {
    deps += [ "//chromecast/tracing" ]
  }
  if (chromecast_branding != "public") {
    deps += [ "//chromecast/internal:all" ]
  }
  if (enable_external_mojo_services) {
    deps += [ "//chromecast/external_mojo/external_service_support:standalone_mojo_broker" ]
  }

  # No other targets should depend on this target, since it's just a convenience
  # target for the Chromecast internal build infrastructure.
  visibility = []
  testonly = true
}

# This is a config which is applied on all cast_* targets (which should be all
# code under chromecast/).
config("cast_config") {
}

# A list of all public test() binaries. This is an organizational target that
# cannot be depended upon or built directly. Build cast_test_lists instead.
cast_test_group("cast_tests") {
  filters = []
  tests = [
    "//base:base_unittests",
    "//cc:cc_unittests",
    "//chromecast/base:cast_base_unittests",
    "//chromecast/base/component:cast_component_unittests",
    "//chromecast/crypto:cast_crypto_unittests",
    "//chromecast/device/bluetooth:cast_bluetooth_unittests",
    "//chromecast/media:cast_media_unittests",
    "//chromecast/net:cast_net_unittests",
    "//chromecast/system/reboot:cast_reboot_unittests",
    "//content/test:content_unittests",
    "//crypto:crypto_unittests",
    "//media:media_unittests",
    "//media/midi:midi_unittests",
    "//net:net_unittests",
    "//sql:sql_unittests",
    "//storage:storage_unittests",
    "//third_party/cacheinvalidation:cacheinvalidation_unittests",
    "//ui/base:ui_base_unittests",
  ]

  if (!is_cast_audio_only) {
    tests += [ "//gpu:gpu_unittests" ]

    if (use_aura) {
      tests += [ "//chromecast/graphics:cast_graphics_unittests" ]
    }
  }

  if (is_linux) {
    tests += [
      "//chromecast/crash:cast_crash_unittests",
      "//components/exo:exo_unittests",
      "//sandbox/linux:sandbox_linux_unittests",
    ]
  }

  if (is_linux || is_fuchsia) {
    tests += [
      "//chromecast/media/cma/backend:cast_audio_backend_unittests",
      "//chromecast/media/cma/backend:cast_av_sync_backend_unittests",
    ]
  }

  if (is_android && is_cast_using_cma_backend) {
    tests += [ "//chromecast/media/cma/backend/android:cast_android_cma_backend_unittests" ]
  }

  if (!is_android) {
    tests += [
      ":cast_shell_browsertests",
      ":cast_shell_unittests",
      "//ipc:ipc_tests",
      "//url:url_unittests",
    ]

    if (!is_fuchsia) {
      tests += [ "//jingle:jingle_unittests" ]
    }

    cast_media_unittests_filter = {
      test_name = "cast_media_unittests"

      # TODO(almasrymina) : Track this test as a separate bug
      #   (internal : b/115400220)
      gtest_excludes = [ "AudioVideoPipelineDeviceTest.Mp4Playback" ]

      # --test-launcher-jobs=1 => so internal code can bind to port
      args = [ "--test-launcher-jobs=1" ]
    }
    filters += [ cast_media_unittests_filter ]

    cast_shell_browsertests_filter = {
      test_name = "cast_shell_browsertests"

      # --enable-local-file-accesses => to load sample media files
      # --test-launcher-jobs=1 => so internal code can bind to port
      args = [
        "--no-sandbox",
        "--enable-local-file-accesses",
        "--test-launcher-jobs=1",
      ]

      gtest_excludes = []

      # TODO(b/112440248): This test was failing:
      #   * On v1 and Cast Audio devices since 2017-03-15.
      #   * On desktop builds since 2018-08-22
      # Also see: b/36238710, b/36239051, hotlist/461351
      gtest_excludes += [ "RendererPrelauncherTest.ReusedRenderer" ]

      if (!is_cast_desktop_build) {
        args += [ "--use-gpu-in-tests" ]

        # TODO(derekjchow): Make these tests pass on Chromecast devices.
        #    Once all of the CastMediaBlockerTest.* have been un-DISABLEd and
        #    are running successfully, revisit these tests and see if they pass
        #    on devices. (crbug/665118, internal b/32023194)
        gtest_excludes += [
          "CastMediaBlockerBrowserTest.Video_BlockUnblock",
          "CastMediaBlockerBrowserTest.Audio_BlockUnblock",
        ]
      }

      if (!is_cast_desktop_build && !is_cast_audio_only && !enable_assistant) {
        # TODO(mbjorge): The VideoPlaybackMp4 test is failing on v1 devices.
        # Temporarily disable it as part of an effort to re-green the unittests.
        # Re-enable once the tests have been fixed. Limitations in the filter
        # system mean this is getting temporarily disabled on all video devices,
        # though it is only failing on v1.
        # b/36723698, hotlist/461351
        gtest_excludes += [ "CastNavigationBrowserTest.VideoPlaybackMp4" ]
      }

      # TODO(mbjorge): Temporarily disable AudioPlaybackWavPcm because it is
      # failing on device. As part of an effort to re-green the unittests,
      # current (2017-03-15) failures are being disabled to get back to a
      # green state. Re-enable once the tests have been fixed.
      # b/36239152, hotlist/461351
      if (enable_assistant && !is_cast_desktop_build) {
        gtest_excludes += [ "CastNavigationBrowserTest.AudioPlaybackWavPcm" ]
      }
    }
    filters += [ cast_shell_browsertests_filter ]

    ipc_tests_filter = {
      test_name = "ipc_tests"

      # --test-launcher-jobs=1 => so internal code can bind to port
      args = [ "--test-launcher-jobs=1" ]
    }
    filters += [ ipc_tests_filter ]

    url_unittests_filter = {
      test_name = "url_unittests"

      if (target_os == "linux" && !is_cast_desktop_build) {
        # DoAppendUTF8Invalid fails because of dcheck_always_on flag in Eng builds
        gtest_excludes = [ "URLCanonTest.DoAppendUTF8Invalid" ]
      }
    }
    filters += [ url_unittests_filter ]
  }

  base_unittests_filter = {
    test_name = "base_unittests"
    gtest_excludes = []
    if (target_os == "linux") {
      if (is_cast_desktop_build) {
        # Disable PartitionAllocDeathTest.* (b/67975693)
        gtest_excludes += [ "PartitionAllocDeathTest.*" ]
      } else {
        # Disable ProcessMetricsTest.GetNumberOfThreads (b/15610509)
        # Disable ProcessUtilTest.* (need to define OS_ANDROID)
        # Disable StackContainer.BufferAlignment (don't support 16-byte alignment)
        # Disable SystemMetrics2Test.GetSystemMemoryInfo (buffers>0 can't be guaranteed)
        # Disable PostTasksViaTaskRunner/* to green up devices (b/62246873)
        # Disable WorkerDetaches to green up devices (b/62246873)
        gtest_excludes += [
          "ProcessMetricsTest.GetNumberOfThreads",
          "ProcessUtilTest.*",
          "StackContainer.BufferAlignment",
          "SystemMetrics2Test.GetSystemMemoryInfo",
          "OneTraitsExecutionModePair/TaskSchedulerImplTest.PostTasksViaTaskRunner/*",
          "TaskSchedulerWorkerTest.WorkerDetaches",
        ]
      }

      if (is_cast_audio_only) {
        # Also disable TimeFormattingTest on audio-only builds, since we don't
        # include the necessary info in icudtl.dat.
        gtest_excludes += [ "TimeFormattingTest.*" ]
      }
    }
  }
  filters += [ base_unittests_filter ]

  cc_unittests_filter = {
    test_name = "cc_unittests"

    # Temporarily disable all test cases (b/113324890)
    gtest_excludes = [ "*" ]

    if (!is_cast_desktop_build) {
      #Disable ToColorSpace/ColorTransformPixelTest*  (b/64346790)
      #Disable ImageBackgroundFilter* (b/64346875)
      #Disable LayerTreeHostTilesTestPartialInvalidation* (b/65844132)
      gtest_excludes += [
        "ToColorSpace/ColorTransformPixelTest.*",
        "ImageBackgroundFilter.*",
        "LayerTreeHostTilesTestPartialInvalidation.*",
      ]
    }
  }
  filters += [ cc_unittests_filter ]

  content_unittests_filter = {
    test_name = "content_unittests"

    # IsSupportedVideoConfig_VP9TransferFunctions fails on all cast builds since
    # the cast IsSupporedVideoConfigs ignore the transfer function parameter.
    # (b/36984215).
    gtest_excludes = [ "*.IsSupportedVideoConfig_VP9TransferFunctions" ]
    if (is_android_things) {
      gtest_excludes +=
          [ "FontUniqueNameLookupTest.TestMatchPostScriptNameTtc" ]
    }
    if (target_os == "linux" && !is_cast_desktop_build) {
      # DesktopCaptureDeviceTest.*: No capture device on Eureka
      # Disable PepperGamepadHostTest.WaitForReply (pepper not supported on Eureka)
      # Disable RenderWidgetHostTest.Background because we disable the
      # blacklist to enable WebGL (b/16142554)
      gtest_excludes += [
        "DOMStorageDatabaseTest.TestCanOpenAndReadWebCoreDatabase",
        "DesktopCaptureDeviceTest.Capture",
        "GamepadProviderTest.PollingAccess",
        "PepperGamepadHostTest.WaitForReply",
        "RenderWidgetHostTest.Background",
      ]
    }
    if (is_cast_audio_only) {
      # No way to display URL's on audio only cast devices.
      gtest_excludes += [ "NavigationEntryTest.NavigationEntryURLs" ]
    }
    if (enable_assistant && !is_cast_desktop_build) {
      # Temporarily disable InvalidUUID and DefaultConstructor on assistant
      # device builds. Cause of failure is unclear, but it's highly likely it's
      # related to them being DEATH tests. These were passing until the
      # is_official_build flag was enabled. These tests are considered
      # non-critical in this context. (b/62469368)
      gtest_excludes += [
        "BluetoothBlocklistTest.InvalidUUID",
        "WebBluetoothDeviceIdTest.DefaultConstructor",
      ]
    }
  }
  filters += [ content_unittests_filter ]

  media_unittests_filter = {
    test_name = "media_unittests"
    if (target_os == "linux" && !is_cast_desktop_build) {
      # Disable VP9 related tests (b/18593324)
      #   PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM
      #   PipelineIntegrationTest.BasicPlayback_VideoOnly_VP9_WebM
      #   PipelineIntegrationTest.BasicPlayback_VP9*
      #   PipelineIntegrationTest.P444_VP9_WebM
      # Disable VP8A tests (b/18593324)
      #   PipelineIntegrationTest.BasicPlayback_VP8A*
      # Disable OpusAudioDecoderTest/AudioDecoderTest.ProduceAudioSamples/0 (unit
      # test fails when Opus decoder uses fixed-point)
      # Due to b/16456550, disable the following four test cases:
      #   AudioOutputControllerTest.PlayDivertSwitchDeviceRevertClose
      #   AudioOutputControllerTest.PlaySwitchDeviceClose
      #   AudioStreamHandlerTest.Play
      #   SoundsManagerTest.Play
      # Disable AudioStreamHandlerTest.ConsecutivePlayRequests (b/16539293)
      gtest_excludes = [
        "AudioOutputControllerTest.PlayDivertSwitchDeviceRevertClose",
        "AudioOutputControllerTest.PlaySwitchDeviceClose",
        "AudioStreamHandlerTest.Play",
        "AudioStreamHandlerTest.ConsecutivePlayRequests",
        "PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM",
        "PipelineIntegrationTest.BasicPlayback_VideoOnly_VP9_WebM",
        "PipelineIntegrationTest.BasicPlayback_VP9*",
        "PipelineIntegrationTest.P444_VP9_WebM",
        "PipelineIntegrationTest.BasicPlayback_VP8A*",
        "OpusAudioDecoderTest/AudioDecoderTest.ProduceAudioSamples/0",
        "SoundsManagerTest.Play",
      ]
    } else if (target_os == "android" || is_cast_desktop_build) {
      # Disable PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM (not supported)
      gtest_excludes =
          [ "PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM" ]
    }
  }
  filters += [ media_unittests_filter ]

  net_unittests_filter = {
    test_name = "net_unittests"
    if (using_sanitizer) {
      # TODO(mbjorge): net_unittests do not complete when run with sanitizers,
      # (in particular, TSAN and UBSAN), resulting in build machines getting stuck
      # for many hours. Disable them for now, since these are getting run on
      # Chromium bots anyway. (internal b/31279943)
      gtest_excludes = [ "*" ]
    } else if (target_os == "linux" && !is_cast_desktop_build) {
      # Run net_unittests first to avoid random failures due to slow python startup
      # URLRequestTestHTTP.GetTest_ManyCookies takes roughly 55s to run. Increase
      # timeout to 90s from 45s to allow it to pass (b/19821476)
      # PacFileFetcherImplTest.HttpMimeType is flaking (b/19848784)
      # Running a batch of net_unittests has high overhead. Run tests in batches of 50 to reduce number of batches (b/23156294).
      gtest_excludes = [ "PacFileFetcherImplTest.HttpMimeType" ]
      args = [
        "--test-launcher-timeout=90000",
        "--test-launcher-batch-limit=50",
      ]
    } else if (is_cast_desktop_build || target_os == "android") {
      # URLRequestTestHTTP.GetTest_ManyCookies takes roughly 55s to run. Increase
      # timeout to 90s from 45s to allow it to pass (b/19821476) (b/29415636).
      # CTLogVerifierTest.VerifiesValidConsistencyProofsFromReferenceGenerator
      # times out occasionally, paricularly on the CQ bots; disable to reduce
      # CQ flakiness (crbug/598406) (b/29415636).
      # Running a batch of net_unittests has high overhead, so
      # run tests in batches of 25 to reduce number of batches (b/23156294).
      gtest_excludes = [ "CTLogVerifierTest.VerifiesValidConsistencyProofsFromReferenceGenerator" ]
      args = [
        "--test-launcher-timeout=90000",
        "--test-launcher-batch-limit=25",
      ]
    }
  }
  filters += [ net_unittests_filter ]
}

# Creates the build and run lists for all test targets.
cast_test_group_list("cast_test_lists") {
  build_list_path = "$root_out_dir/tests/build_test_list.txt"
  runtime_deps_path = "$root_out_dir/tests/runtime_deps.json"
  run_list_path = "$root_out_dir/tests/run_test_list.txt"

  additional_options = [
    "--ozone-platform=headless --test-launcher-bot-mode $cast_test_extra_flags",
  ]

  test_groups = [ ":cast_tests" ]

  if (chromecast_branding != "public") {
    test_groups += [ "//chromecast/internal:internal_cast_tests" ]
  }
}

if (is_android) {
  cast_test_group("cast_junit_tests") {
    test_type = "junit"
    tests = [
      "//base:base_junit_tests",
      "//chromecast/base:cast_base_junit_tests",
      "//chromecast/browser/android:cast_shell_junit_tests",
      "//content/public/android:content_junit_tests",
      "//net/android:net_junit_tests",
      "//testing/android/junit:junit_unit_tests",
      "//ui/android:ui_junit_tests",
    ]
  }

  cast_test_group_list("cast_junit_test_lists") {
    test_type = "junit"
    build_list_path = "$root_out_dir/junit/build_junit_test_list.txt"
    runtime_deps_path = "$root_out_dir/junit/runtime_deps.json"
    run_list_path = "$root_out_dir/junit/run_junit_test_list.txt"
    test_groups = [ ":cast_junit_tests" ]
    if (chromecast_branding != "public") {
      test_groups += [ "//chromecast/internal:internal_cast_junit_tests" ]
    }
  }
}

test("cast_shell_unittests") {
  deps = [
    ":cast_shell_lib",
    "//chromecast/app:test_support",
    "//chromecast/app:unittests",
    "//chromecast/browser:unittests",
    "//ui/gl:test_support",
  ]
}

test("cast_shell_browsertests") {
  deps = [
    ":cast_shell_lib",
    "//chromecast/app:test_support",
    "//chromecast/browser:browsertests",
  ]

  data_deps = [
    ":chromecast_locales_pak",
  ]
}

group("cast_shell_lib") {
  data_deps = [
    ":cast_shell_pak",
  ]

  deps = [
    "//chromecast/app",
    "//chromecast/browser",
    "//chromecast/common",
    "//chromecast/renderer",
  ]

  if (chromecast_branding != "public") {
    deps += [ "//chromecast/internal/shell" ]
  }
}

cast_executable("cast_shell") {
  sources = [
    "app/cast_main.cc",
  ]

  deps = [
    ":cast_shell_lib",
    ":chromecast_locales_pak",
    "//chromecast/app",
    "//content/public/app:both",
  ]
}

if (is_fuchsia) {
  fuchsia_package("cast_shell_pkg") {
    binary = ":cast_shell"
    package_name_override = "cast_shell"
    sandbox_policy = "//chromecast/cast_shell_sandbox_policy"

    if (chromecast_branding != "public") {
      deps = [
        "//chromecast/internal:fuchsia_internal_data_deps",
      ]
    }
  }

  fuchsia_package_runner("cast_shell_fuchsia") {
    package = ":cast_shell_pkg"
    package_name_override = "cast_shell"
  }
}

repack("cast_shell_pak") {
  sources = [
    "$root_gen_dir/chromecast/app/shell_resources.pak",
    "$root_gen_dir/content/app/resources/content_resources_100_percent.pak",
    "$root_gen_dir/content/app/strings/content_strings_en-US.pak",
    "$root_gen_dir/content/content_resources.pak",
    "$root_gen_dir/mojo/public/js/mojo_bindings_resources.pak",
    "$root_gen_dir/net/net_resources.pak",
    "$root_gen_dir/third_party/blink/public/resources/blink_resources.pak",
    "$root_gen_dir/third_party/blink/public/resources/blink_scaled_resources_100_percent.pak",
    "$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
    "$root_gen_dir/ui/resources/webui_resources.pak",
    "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
    "$root_gen_dir/ui/strings/ui_strings_en-US.pak",
  ]

  output = "$root_out_dir/assets/cast_shell.pak"

  deps = [
    "//chromecast/app:resources",
    "//content:resources",
    "//content/app/resources",
    "//content/app/strings",
    "//mojo/public/js:resources",
    "//net:net_resources",
    "//third_party/blink/public:resources",
    "//third_party/blink/public:scaled_resources_100_percent",
    "//ui/resources",
    "//ui/strings",
  ]

  if (enable_chromecast_extensions) {
    sources += [
      "$root_gen_dir/chromecast/renderer/extensions_renderer_resources.pak",
      "$root_gen_dir/extensions/extensions_renderer_resources.pak",
      "$root_gen_dir/extensions/extensions_resources.pak",
      "$root_gen_dir/extensions/shell/app_shell_resources.pak",
    ]
    deps += [
      "//chromecast/renderer:extensions_resources",
      "//extensions:extensions_resources",
      "//extensions/shell:resources",
    ]
  }

  if (chromecast_branding != "public") {
    sources += [ "$root_gen_dir/chromecast/internal/cast_shell_internal.pak" ]

    deps += [ "//chromecast/internal:cast_shell_internal_pak" ]
  }
}

# Intermediate targets that repack grit resources by locale. For each locale
# in |cast_locales| (see //chromecast/chromecast.gni), all resources
# are packed into a single .pak file in an output directory. These targets
# should not be depended on directly; depend on ":chromecast_locales_pak"
# instead.
foreach(locale, cast_locales) {
  repack("_cast_repack_${locale}") {
    visibility = [ ":chromecast_locales_pak" ]
    output = "$root_out_dir/chromecast_locales/${locale}.pak"
    sources = [
      "$root_gen_dir/chromecast/app/chromecast_settings_${locale}.pak",
    ]
    deps = [
      "//chromecast/app:chromecast_settings",
    ]

    if (chromecast_branding != "public") {
      sources += [
        "$root_gen_dir/chromecast/internal/webui/app_strings_${locale}.pak",
      ]
      deps += [ "//chromecast/internal/webui:chromecast_app_strings" ]

      if (enable_chromecast_webui) {
        sources += [ "$root_gen_dir/chromecast/internal/webui/webui_localized_${locale}.pak" ]
        deps += [ "//chromecast/internal/webui:chromecast_webui_localized" ]
      }
    }
  }
}

# A meta-target which repacks resources by locale.
group("chromecast_locales_pak") {
  data_deps = []
  foreach(locale, cast_locales) {
    data_deps += [ ":_cast_repack_${locale}" ]
  }
}

buildflag_header("chromecast_buildflags") {
  header = "chromecast_buildflags.h"
  flags = [
    "DEFAULT_COMMAND_LINE_FLAGS=\"$default_command_line_flags\"",
    "DISABLE_SECURE_FLAC_OPUS_DECODING=$disable_secure_flac_and_opus_decoding",
    "ENABLE_ASSISTANT=$enable_assistant",
    "ENABLE_CAST_FRAGMENT=$enable_cast_fragment",
    "ENABLE_CAST_WAYLAND_SERVER=$enable_cast_wayland_server",
    "ENABLE_CHROMECAST_EXTENSIONS=$enable_chromecast_extensions",
    "ENABLE_EXTERNAL_MOJO_SERVICES=$enable_external_mojo_services",
    "ENABLE_HEADLESS_MUSIC_MODE=$enable_headless_music_mode",
    "ENABLE_PLAYREADY=$enable_playready",
    "ENABLE_VIDEO_CAPTURE_SERVICE=$enable_video_capture_service",
    "ENABLE_VOLUME_TABLES_ACCESS=$enable_volume_tables_access",
    "IS_ANDROID_THINGS=$is_android_things",
    "IS_ANDROID_THINGS_NON_PUBLIC=$is_android_things_non_public",
    "IS_CAST_AUDIO_ONLY=$is_cast_audio_only",
    "IS_CAST_DESKTOP_BUILD=$is_cast_desktop_build",
    "IS_CAST_USING_CMA_BACKEND=$is_cast_using_cma_backend",
    "IS_SINGLE_VOLUME=$is_single_volume",
    "SUPPORTS_MULTIZONE=$supports_multizone",
    "USE_ANDROID_USER_AGENT=$use_android_user_agent",
    "USE_CHROMECAST_CDMS=$use_chromecast_cdms",
    "USE_ANDROID_THINGS_N=$build_for_android_things_n",
  ]
}

if (is_android) {
  generate_jni_registration("cast_shell_jni_registration") {
    target = ":cast_shell_apk"
    header_output = "$root_gen_dir/chromecast/android/${target_name}.h"
  }

  android_assets("cast_shell_apk_assets") {
    assert(v8_use_external_startup_data)

    sources = [
      "$root_out_dir/assets/cast_shell.pak",
    ]

    deps = [
      ":cast_shell_apk_locale_assets",
      ":cast_shell_pak",
      "//third_party/icu:icu_assets",
      "//v8:v8_external_startup_data_assets",
    ]
    disable_compression = true
  }

  android_assets("cast_shell_apk_locale_assets") {
    renaming_sources = []
    renaming_destinations = []

    foreach(locale, cast_locales) {
      renaming_sources += [ "$root_out_dir/chromecast_locales/${locale}.pak" ]
      renaming_destinations += [ "stored-locales/${locale}.pak" ]
    }

    deps = [
      ":chromecast_locales_pak",
    ]

    treat_as_locale_paks = true
    disable_compression = true
  }

  android_apk("cast_shell_apk") {
    apk_name = "CastShell"
    android_manifest = "$root_gen_dir/cast_shell_manifest/AndroidManifest.xml"
    android_manifest_dep = "//chromecast/browser/android:cast_shell_manifest"

    shared_libraries = [ "//chromecast/android:libcast_shell_android" ]

    deps = [
      ":cast_shell_apk_assets",
      "//base:base_java",
      "//chromecast/android:libcast_shell_android",
      "//chromecast/browser/android:cast_shell_java",
      "//third_party/crashpad/crashpad/handler:crashpad_handler_named_as_so",
    ]

    loadable_modules = [ "$root_out_dir/libcrashpad_handler.so" ]

    command_line_flags_file = "castshell-command-line"
    enable_multidex = true
  }
}
