chromium/components/webxr/android/BUILD.gn

# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/rules.gni")
import("//device/vr/buildflags/buildflags.gni")
import("//third_party/jni_zero/jni_zero.gni")

source_set("android_utils") {
  sources = [
    "webxr_utils.cc",
    "webxr_utils.h",
  ]

  deps = [
    "//base",
    "//content/public/browser",
  ]
}

android_resources("cardboard_java_resources") {
  sources = [
    "java/res/layout/cardboard_ui.xml",
    "java/res/menu/settings_menu.xml",
    "java/res/values/dimens.xml",
    "java/res/values/styles.xml",
  ]

  deps = [
    # Required to get the 3 dots image for the settings button.
    "//components/browser_ui/widget/android:java_resources",
    "//components/strings:components_strings_grd",
  ]
}
source_set("android") {
  # TODO(crbug.com/40899237): Investigate why this cannot simply be an
  # assert(enable_vr).
  if (enable_vr) {
    sources = [
      "xr_activity_listener.cc",
      "xr_activity_listener.h",
      "xr_session_coordinator.cc",
      "xr_session_coordinator.h",
    ]

    if (enable_arcore) {
      sources += [
        "ar_compositor_delegate_provider.cc",
        "ar_compositor_delegate_provider.h",
        "arcore_device_provider.cc",
        "arcore_device_provider.h",
        "arcore_install_helper.cc",
        "arcore_install_helper.h",
      ]
    }

    if (enable_cardboard) {
      sources += [
        "cardboard_device_provider.cc",
        "cardboard_device_provider.h",
        "cardboard_utils.cc",
        "vr_compositor_delegate_provider.cc",
        "vr_compositor_delegate_provider.h",
      ]
    }

    if (enable_openxr) {
      sources += [
        "openxr_device_provider.cc",
        "openxr_device_provider.h",
        "openxr_platform_helper_android.cc",
        "openxr_platform_helper_android.h",
      ]
    }

    deps = [
      ":android_utils",
      ":features",
      ":xr_jni_headers",
      "//base",
      "//components/messages/android",
      "//components/resources:android_resources",
      "//components/strings",
      "//components/webxr:webxr",
      "//content/public/browser",
      "//device/vr/android:vr_android",
      "//ui/android",
      "//ui/base",
    ]

    if (enable_arcore) {
      deps += [ "//device/vr/android/arcore" ]
    }

    if (enable_cardboard) {
      deps += [ "//device/vr/android/cardboard:vr_cardboard" ]
    }

    if (enable_openxr) {
      deps += [
        "//device/vr",
        "//third_party/openxr:openxr_headers",
      ]

      public_configs = [ "//third_party/openxr:config" ]
    }

    libs = [ "android" ]
  }
}

# Does not cause the necessary .so files to be bundled.
# Look for "libarcore_sdk_c.so" for examples of how to add it in.
android_library("xr_java") {
  # Contains interfaces that should be permanently, and publicly, available and
  # can thus be depended on outside of this directory, regardless of whether xr
  # is enabled or not.
  sources = [
    "//components/webxr/android/java/src/org/chromium/components/webxr/XrDelegate.java",
    "//components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateProvider.java",
  ]

  deps = [
    "//base:base_java",
    "//build/android:build_java",
    "//components/browser_ui/widget/android:java",
    "//device/vr/public:java",
  ]

  public_deps = []

  # Contains the interfaces that are present if any runtimes are enabled.
  # These are essentially the implementations of the above, interfaces those
  # classes need to talk to, or other common classes that more than one runtime
  # leverages.
  if (enable_arcore || enable_cardboard || enable_openxr) {
    sources += [
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegate.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegateProvider.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/VrCompositorDelegate.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/VrCompositorDelegateProvider.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/XrActivityListener.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/XrHostActivity.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/XrImmersiveOverlay.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/XrSessionTypeSupplier.java",
    ]

    deps += [
      "//content/public/android:content_java",
      "//third_party/androidx:androidx_annotation_annotation_java",
      "//third_party/jni_zero:jni_zero_java",
      "//ui/android:ui_no_recycler_view_java",
    ]
  }

  # Contains the ARCore-specific implementations of the above interfaces and any
  # and all classes that they need to talk to that aren't shared with the other
  # runtime implementations.
  if (enable_arcore) {
    sources += [
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArClassProvider.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShimImpl.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/ArOverlayDelegate.java",
    ]

    # We have to use the bundle templates to include some of the native ARCore
    # code, rather than just including things in our deps here; but that means
    # that the include of the Java code needs to be a public_dep so that those
    # targets can see and rely on this.
    public_deps +=
        [ "//third_party/arcore-android-sdk-client:com_google_ar_core_java" ]

    srcjar_deps = [
      ":webxr_ar_android_enums",
      ":xr_jni_headers",
    ]
  } else if (enable_cardboard || enable_openxr) {
    # These stub classes are needed for the general Xr infrastructure code, but
    # are not needed for the more broad always-available code. So we check that
    # the non-arcore parts of the "general xr" sources are still true before
    # we attempt to compile these bits in.
    sources += [ "//components/webxr/android/stubs/java/src/org/chromium/components/webxr/ArClassProvider.java" ]
  }

  # Contains the cardboard specific implementations of the above interfaces and
  # any and all classes that they need to talk to that aren't shared with the
  # other runtime implementations.
  # Also includes any cardboard-specific java runtime dependencies that the
  # native files in this folder may depend upon.
  if (enable_cardboard) {
    sources += [
      "//components/webxr/android/java/src/org/chromium/components/webxr/CardboardClassProvider.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java",
      "//components/webxr/android/java/src/org/chromium/components/webxr/CardboardUtils.java",
    ]
    deps += [
      ":cardboard_java_resources",
      "//third_party/cardboard:cardboard_java",
    ]
  } else if (enable_arcore || enable_openxr) {
    # These stub classes are needed for the general Xr infrastructure code, but
    # are not needed for the more broad always-available code. So we check that
    # the non-cardboard parts of the "general xr" sources are still true before
    # we attempt to compile these bits in.
    sources += [ "//components/webxr/android/stubs/java/src/org/chromium/components/webxr/CardboardClassProvider.java" ]
  }

  resources_package = "org.chromium.components.webxr"
}

generate_jni("xr_jni_headers") {
  sources = [
    "//components/webxr/android/java/src/org/chromium/components/webxr/XrActivityListener.java",
    "//components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java",
  ]

  if (enable_arcore) {
    sources += [ "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java" ]
  }

  if (enable_cardboard) {
    sources += [ "//components/webxr/android/java/src/org/chromium/components/webxr/CardboardUtils.java" ]
  }
}

if (enable_arcore) {
  java_cpp_enum("webxr_ar_android_enums") {
    sources = [ "arcore_install_helper.h" ]
  }
}

generate_jni("features_jni") {
  sources =
      [ "java/src/org/chromium/components/webxr/WebXrAndroidFeatureMap.java" ]
}

android_library("features_java") {
  srcjar_deps = [ ":features_jni" ]
  sources =
      [ "java/src/org/chromium/components/webxr/WebXrAndroidFeatureMap.java" ]
  deps = [
    "//third_party/androidx:androidx_core_core_java",
    "//third_party/jni_zero:jni_zero_java",
  ]

  deps += [ "//device/vr/public:java" ]
}

component("features") {
  sources = [ "webxr_android_feature_map.cc" ]

  deps = [
    ":features_jni",
    "//base",
    "//device/vr/buildflags",
  ]

  if (enable_vr) {
    deps += [ "//device/vr/public/cpp:features" ]
  }
}