# Copyright 2023 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")

template("_androidx_prebuilt") {
  _target_type = invoker.target_type

  # This library was discontinued and deleted at the version chrome relied
  # on. See: https://crbug.com/528459998
  if (target_name == "androidx_interpolator_interpolator_java") {
    _target_type = "java_group"
  }

  target(_target_type, target_name) {
    if (target_name == "androidx_interpolator_interpolator_java") {
      not_needed(invoker, "*")
      public_deps = [ "//third_party/androidx/local_modifications/interpolator:interpolator_java" ]
    } else {
      forward_variables_from(invoker, "*", [ "target_type" ])
    }

    if (target_name == "androidx_annotation_annotation_java") {
      # Ensure this dep is the suggested one when targets are missing it.
      preferred_dep = true
    } else if (target_name == "androidx_annotation_annotation_jvm_java") {
      # https://crbug.com/989505
      jar_excluded_patterns = [ "META-INF/proguard/*" ]
      proguard_configs = [ "androidx_annotations.flags" ]
    } else if (target_name == "androidx_test_espresso_espresso_core_java") {
      jar_excluded_patterns =
          [ "androidx/test/espresso/base/ViewHierarchyExceptionHandler*" ]
    } else if (target_name == "androidx_benchmark_benchmark_common_java") {
      ignore_native_libraries = true
    } else if (target_name == "androidx_benchmark_benchmark_macro_java") {
      # Manually add dep onto DISALLOWED_DEP androidx.profileinstaller.
      deps += [ ":androidx_profileinstaller_profileinstaller_java" ]
    } else if (target_name ==
               "androidx_coordinatorlayout_coordinatorlayout_java") {
      # Reduce binary size. https:crbug.com/954584
      ignore_proguard_configs = true
    } else if (target_name == "androidx_appcompat_appcompat_java") {
      deps += [ ":core_overrides_java" ]
    } else if (target_name == "androidx_core_core_java") {
      # Target has AIDL, but we do not support it yet: http://crbug.com/644439
      ignore_aidl = true

      # Manifest and proguard config have just one entry: Adding (and -keep'ing
      # android:appComponentFactory="androidx.core.app.CoreComponentFactory"
      # Chrome does not use this feature and it causes a scary stack trace to be
      # shown when incremental_install=true.
      ignore_manifest = true
      ignore_proguard_configs = true

      # https://crbug.com/1414452
      jar_excluded_patterns = [
        "androidx/core/os/BuildCompat*",
        "androidx/core/content/res/TypedArrayUtils*",
      ]

      if (enable_chrome_android_internal) {
        jar_excluded_patterns +=
            [ "androidx/core/view/accessibility/AccessibilityNodeInfoCompat*" ]
      }

      public_deps = [ "//third_party/androidx/local_modifications/buildcompat:buildcompat_java" ]

      if (!enable_java_asserts) {
        # Omit the file since we use our own copy.
        jar_excluded_patterns += [ "androidx/core/util/Preconditions.class" ]
        deps += [ "//third_party/android_deps/local_modifications/preconditions:androidx_stub_preconditions_java" ]
      }
    } else if (target_name == "androidx_fragment_fragment_java") {
      deps += [ "//third_party/android_deps/utils:java" ]

      proguard_configs = [ "androidx_fragment.flags" ]
    } else if (target_name == "androidx_lifecycle_lifecycle_process_java") {
      # Only useful for very old SDKs.
      ignore_proguard_configs = true
    } else if (target_name == "androidx_graphics_graphics_core_java") {
      ignore_native_libraries = true
      bytecode_rewriter_target =
          "//build/android/bytecode:system_load_library_remover"
      bytecode_rewriter_args = [ "org.chromium.androidx.GraphicsCoreJniLoader" ]
      deps += [ "//third_party/androidx/local_modifications/graphics_core:graphics_core_java" ]
    } else if (target_name == "androidx_ink_ink_nativeloader_android_java") {
      ignore_native_libraries = true

      # Avoid dep onto //third_party/ink for non-chrome checkouts.
      if (build_with_chromium) {
        bytecode_rewriter_target =
            "//build/android/bytecode:system_load_library_remover"
        bytecode_rewriter_args = [ "org.chromium.androidx.InkJniLoader" ]
        deps += [ "//third_party/androidx/local_modifications/ink:ink_java" ]
        if (defined(visibility)) {
          visibility += [ "//third_party/ink:*" ]
        }
      }
    } else if (filter_include([ target_name ], [ "androidx_ink_*" ]) != []) {
      if (invoker.target_type == "android_aar_prebuilt") {
        ignore_native_libraries = true
      }
      if (defined(visibility) && build_with_chromium) {
        visibility += [ "//third_party/ink:*" ]
      }
    } else if (target_name == "androidx_graphics_graphics_path_java") {
      ignore_native_libraries = true
    } else if (target_name == "androidx_media_media_java") {
      # Target has AIDL, but we do not support it yet: http://crbug.com/644439
      ignore_aidl = true
    } else if (target_name == "androidx_mediarouter_mediarouter_java") {
      # https://crbug.com/1000382
      proguard_configs = [ "androidx_mediarouter.flags" ]
    } else if (target_name == "androidx_preference_preference_java") {
      proguard_configs = [ "androidx_preferences.flags" ]

      # Replace broad library -keep rules with a more limited set in
      # chrome/android/java/proguard.flags instead.
      ignore_proguard_configs = true
    } else if (target_name == "androidx_startup_startup_runtime_java") {
      # Keeps emoji2 code. See http://crbug.com/1205141
      ignore_proguard_configs = true
    } else if (target_name == "androidx_test_uiautomator_uiautomator_java") {
      deps += [ ":androidx_test_runner_java" ]
    } else if (target_name == "androidx_tracing_tracing_android_java") {
      ignore_native_libraries = true
    } else if (target_name == "androidx_tracing_tracing_perfetto_java") {
      # b/280878596
      jar_excluded_patterns = [ "dalvik/*" ]
    } else if (target_name == "androidx_transition_transition_java") {
      # Not specified in the POM, compileOnly dependency not supposed to be used
      # unless the library is present: b/70887421
      deps += [ ":androidx_fragment_fragment_java" ]
    } else if (target_name == "androidx_tracing_tracing_perfetto_binary_java") {
      ignore_native_libraries = true
    } else if (target_name ==
               "androidx_versionedparcelable_versionedparcelable_java") {
      # Target has AIDL, but we do not support it yet: http://crbug.com/644439
      ignore_aidl = true
    } else if (target_name == "androidx_window_window_java") {
      deps += [
        # This library has a <uses-library> to enable some extra OS APIs, so
        # ensure the .jar file is made available to R8 via this dep.
        "//third_party/android_sdk:android_window_extensions_java",

        # Sidecar as a library seems to be gone in Maven, so deps don't exist
        # onto sidecar.
        "//third_party/androidx:androidx_window_sidecar_sidecar_java",
      ]
    } else if (target_name == "androidx_webkit_webkit_java") {
      visibility = [
        "//android_webview/tools/system_webview_shell:*",
        "//third_party/android_deps:*",
        "//third_party/androidx:*",
      ]
    } else if (target_name == "androidx_web_web_java") {
      visibility = [
        "//android_webview/tools/system_webview_shell:*",
        "//third_party/android_deps:*",
      ]
    } else if (target_name == "androidx_datastore_datastore_core_android_java") {
      ignore_native_libraries = true
    } else if (target_name == "androidx_compose_ui_ui_android_java") {
      jar_excluded_patterns = [
        "androidx/compose/ui/graphics/vector/compat/AndroidVectorParser*",
        "androidx/compose/ui/graphics/vector/compat/XmlVectorParser*",
      ]
    } else if (target_name == "androidx_compose_ui_ui_java") {
      public_deps = [ ":compose_ui_overrides_java" ]
    } else if (filter_include([ target_name ], [ "androidx_xr_*" ]) != []) {
      proguard_configs = [ "androidx_xr.flags" ]

      # ChromeXR uses APIs that require the native code.
      extract_native_libraries = true

      # It adds:
      #   <uses-native-library android:name="libopenxr.google.so" android:required="false"/>
      #   <uses-library android:name="com.android.extensions.xr" android:required="false"/>
      # We do not need the uses-native-library, but do need the uses-library.
      # However, we add it via the dep onto android_xr_extensions_java.
      ignore_manifest = true
      deps += [ "//third_party/android_sdk:android_xr_extensions_java" ]

      # The scenecore and arcore AARs contain broad wildcard keep rules (-keep
      # class ...**) that keep thousands of unused methods and fail the size
      # bot. We only want to allow the runtime and openxr AAR proguard files,
      # which contain the specific JNI data models.
      if (target_name != "androidx_xr_runtime_runtime_java" &&
          target_name != "androidx_xr_arcore_arcore_openxr_java") {
        ignore_proguard_configs = true
      }
    }
  }

  # Arbitrarily use this target to add new top-level GN targets.
  if (target_name == "androidx_annotation_annotation_jvm_java") {
    java_group("androidx_window_stubs_java") {
      deps = [ "//third_party/androidx/local_modifications/window:androidx_window_shims_java" ]
    }
  }
}

template("androidx_java_prebuilt") {
  _androidx_prebuilt(target_name) {
    forward_variables_from(invoker, "*")
    target_type = "java_prebuilt"

    # If this target only "supports_android", then it will not be allowed to
    # depend on a target that "requires_android". https://crbug.com/1412551
    if (target_name != "androidx_annotation_annotation_jvm_java") {
      requires_android = true
    }
  }
}

template("androidx_android_aar_prebuilt") {
  _androidx_prebuilt(target_name) {
    forward_variables_from(invoker, "*")
    target_type = "android_aar_prebuilt"

    # The libraries have duplicate resources such as
    # "primary_text_default_material_dark".
    resource_overlay = true

    if (target_name == "androidx_pdf_pdf_viewer_java" ||
        target_name == "androidx_pdf_pdf_document_service_java" ||
        target_name == "androidx_car_app_app_java") {
      # Target has AIDL, which we do not need (and don't support).
      ignore_aidl = true
    }
  }
}

template("androidx_java_group") {
  _androidx_prebuilt(target_name) {
    forward_variables_from(invoker, "*")
    target_type = "java_group"
  }
}
