# Copyright (c) 2022-2026 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build/ohos.gni")
import("//foundation/arkui/ace_engine/ace_config.gni")
import(
    "//foundation/arkui/ace_engine/adapter/android/capability/java/capability.gni")
import("//build_plugins/version.gni")

template("ace_android_jni_source_set") {
  forward_variables_from(invoker, "*")

  ohos_source_set(target_name) {
    defines += invoker.defines
    configs = [ "$ace_root:ace_config" ]

    sources = [
      "$ace_root/adapter/android/entrance/java/jni/ace_platform_plugin_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/jni_weak_global_ref.cpp",
      "$ace_root/adapter/android/entrance/java/jni/window_view_jni.cpp",
    ]

    include_dirs =
        [ "//foundation/graphic/graphic_surface/interfaces/inner_api/surface" ]

    deps = [ "$ace_root/frameworks/core/components/theme:build_theme_code" ]

    if (defined(config.enable_rosen_backend) && config.enable_rosen_backend) {
      deps += [ "//foundation/graphic/graphic_2d/rosen/modules/render_service_client:librender_service_client_static" ]
      deps += [ "//foundation/arkui/napi:ace_napi" ]
    }
  }
}

# build platform sources
template("ace_common_jni_source_set") {
  forward_variables_from(invoker, "*")

  ohos_source_set(target_name) {
    defines += invoker.defines
    configs = [
      "$ace_root:ace_config",
      "//foundation/appframework/ability/ability_runtime/cross_platform/interfaces/kits/native/ability:abilitykit_native_config",
      "//foundation/appframework/ability/ability_runtime/cross_platform/interfaces/inner_api/hilog:ability_cross_platform_hilog_config",
      "//foundation/appframework/ability/ability_runtime/cross_platform/interfaces/kits/native/appkit:appkit_native_config",
      "//foundation/appframework/ability/ability_runtime/cross_platform/interfaces/inner_api/jsruntime:jsruntime_config",
    ]

    sources = [
      "$ace_root/adapter/android/entrance/java/jni/ace_application_info_impl.cpp",
      "$ace_root/adapter/android/entrance/java/jni/ace_env_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/ace_resource_register.cpp",
      "$ace_root/adapter/android/entrance/java/jni/ace_translate_manager.cpp",
      "$ace_root/adapter/android/entrance/java/jni/display_info.cpp",
      "$ace_root/adapter/android/entrance/java/jni/display_info_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/display_manager_agent.cpp",
      "$ace_root/adapter/android/entrance/java/jni/display_manager_agent_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/download_manager.cpp",
      "$ace_root/adapter/android/entrance/java/jni/download_manager_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/dump_helper_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/foldable_window_android.cpp",
      "$ace_root/adapter/android/entrance/java/jni/html/html_to_span.cpp",
      "$ace_root/adapter/android/entrance/java/jni/html/span_to_html.cpp",
      "$ace_root/adapter/android/entrance/java/jni/interaction/interaction_impl.cpp",
      "$ace_root/adapter/android/entrance/java/jni/jni_app_mode_config.cpp",
      "$ace_root/adapter/android/entrance/java/jni/jni_environment.cpp",
      "$ace_root/adapter/android/entrance/java/jni/jni_load.cpp",
      "$ace_root/adapter/android/entrance/java/jni/jni_registry.cpp",
      "$ace_root/adapter/android/entrance/java/jni/js_accessibility_manager_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/log_interface_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/mmi_event_convertor.cpp",
      "$ace_root/adapter/android/entrance/java/jni/pack_asset_provider.cpp",
      "$ace_root/adapter/android/entrance/java/jni/picker/picker_haptic_factory.cpp",
      "$ace_root/adapter/android/entrance/java/jni/picker/picker_haptic_impl.cpp",
      "$ace_root/adapter/android/entrance/java/jni/picker/picker_haptic_controller.cpp",
      "$ace_root/adapter/android/entrance/java/jni/report/reporter_impl.cpp",
      "$ace_root/adapter/android/entrance/java/jni/setting_data_manager_impl.cpp",
      "$ace_root/adapter/android/entrance/java/jni/subwindow_manager_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/touch_event.cpp",
      "$ace_root/adapter/android/entrance/java/jni/touch_event_convertor.cpp",
      "$ace_root/adapter/android/entrance/java/jni/udmf/udmf_impl.cpp",
      "$ace_root/adapter/android/entrance/java/jni/ui_session/ui_session_json_util.cpp",
      "$ace_root/adapter/android/entrance/java/jni/ui_session/ui_session_manager_android.cpp",
      "$ace_root/adapter/android/entrance/java/jni/vibrator/vibrator_utils.cpp",
      "$ace_root/adapter/android/entrance/java/jni/web_adapter_jni.cpp",
      "$ace_root/adapter/android/entrance/java/jni/xcollie/xcollieInterface_impl.cpp",
    ]

    include_dirs = [
      "//base/global/resource_management/interfaces/inner_api/include",
      "//foundation/appframework/window_manager/interfaces/innerkits/wm",
      "//foundation/appframework/window_manager/interfaces/innerkits/dm",
      "//foundation/appframework/window_manager/dm/include",
      "//foundation/appframework/window_manager/utils/include",
      "//foundation/arkui/ace_engine/adapter/android/osal/mock",
      "//foundation/graphic/graphic_surface/interfaces/inner_api/surface",
      "//foundation/appframework/ability/ability_runtime/cross_platform/interfaces/inner_api/base",
      "//foundation/appframework/arkui",
      "//base/hiviewdfx/hilog/interfaces/native/innerkits/include",
      "$ace_root/adapter/android/capability/java/jni/texture",
    ]

    if (defined(config.use_curl_download) && config.use_curl_download) {
      sources -=
          [ "$ace_root/adapter/android/entrance/java/jni/download_manager.cpp" ]
    }

    sources += capability_cpp_files

    if (target_cpu == "arm64") {
      defines += [ "_ARM64_" ]
    }

    if (target_os == "ios") {
      defines += [ "IOS_PLATFORM" ]
    } else if (target_os == "android") {
      defines += [ "ANDROID_PLATFORM" ]
    }

    if (is_arkui_x) {
      defines += [ "CROSS_PLATFORM" ]
      libs = [ "mediandk" ]
    }

    defines += ["ARKUI_X_VERSION=\"$arkuix_sdk_version\""]

    deps = [
      ":ace_android_jni_$platform",
      "//foundation/appframework/arkui/uicontent:ace_uicontent_interface",
      "//foundation/distributeddatamgr/udmf/adapter:arkui_x_udmf_data_napi",
      "//third_party/libxml2:static_libxml2",
    ]

    if (defined(config.enable_rosen_backend) && config.enable_rosen_backend) {
      deps += [ "//foundation/graphic/graphic_2d/rosen/modules/render_service_client:librender_service_client_static" ]
      include_dirs +=
          [ "//foundation/graphic/graphic_2d/rosen/modules/2d_graphics/src" ]
      sources += [
        "$ace_root/adapter/android/entrance/java/jni/virtual_rs_window.cpp",
      ]
      deps += [ "//foundation/arkui/napi:ace_napi" ]
    }

    deps += [ "//foundation/multimodalinput/input/frameworks/proxy:libmmi-client-crossplatform" ]

    if (defined(config.enable_drag_framework) && config.enable_drag_framework) {
      deps += [ "//base/msdp/device_status/services/interaction/drag:interaction_client_crossplatform" ]
      defines += [ "OHOS_BUILD_ENABLE_ARKUI_X" ]
    }
  }
}

foreach(item, ace_platforms) {
  platform = item.name
  if (platform == "android") {
    ace_android_jni_source_set("ace_android_jni_" + item.name) {
      defines = []
      config = {
      }

      if (defined(item.config)) {
        config = item.config
      }
      if (defined(config.defines)) {
        defines = config.defines
      }
    }
    ace_common_jni_source_set("ace_common_jni_" + item.name) {
      platform = item.name
      defines = []
      config = {
      }

      if (defined(item.config)) {
        config = item.config
      }
      if (defined(config.defines)) {
        defines = config.defines
      }
    }
  }
}