# Copyright (c) 2022-2025 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("../config.gni")

config("ohos_adapter_public_interface") {
  include_dirs = [ "${target_gen_dir}/interfaces" ]
  include_dirs += [ "interfaces" ]
}

ohos_shared_library("nweb_ohos_adapter") {
  if (target_cpu == "arm64") {
    branch_protector_ret = "pac_ret"
  }

  if (target_cpu == "arm") {
    libs = [
      "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libbundle_ndk.z.so",
      "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libasset_ndk.z.so",
      "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_drawing.so",
    ]
  } else if (target_cpu == "arm64") {
    libs = [
      "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libbundle_ndk.z.so",
      "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libasset_ndk.z.so",
      "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_drawing.so",
    ]
  } else if (target_cpu == "x86_64") {
    libs = [
      "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libbundle_ndk.z.so",
      "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libasset_ndk.z.so",
      "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_drawing.so",
    ]
  }

  defines = [
    "HILOG_TAG=\"webadapter\"",
    "WEBVIEW_PACKAGE_NAME=\"${webview_package_name}\"",
    "WEBVIEW_SANDBOX_LIB_PATH=\"${webview_sandbox_lib_path}\"",
    "LEGACY_WEBVIEW_SANDBOX_LIB_PATH=\"${legacy_webview_sandbox_lib_path}\"",
    "WEBVIEW_CRASHPAD_HANDLER_SO=\"${webview_crashpad_handler_so}\"",
    "WEBVIEW_SANDBOX_RELATIVE_LIB_PATH=\"${webview_sandbox_relative_lib_path}\"",
    "WEBVIEW_ENGINE_SO=\"${webview_engine_so}\"",
    "WEBVIEW_SANDBOX_HAP_PATH=\"${webview_sandbox_hap_path}\"",
    "WEBVIEW_APP_HAP_PATH=\"${webview_app_hap_path}\"",
    "WEBVIEW_APP_HAP_PATH2=\"${webview_app_hap_path2}\"",
    "WEBVIEW_HAP_PATH=\"${webview_hap_path}\"",
    "WEBVIEW_SANDBOX_PATH=\"${webview_sandbox_path}\"",
  ]

  if (use_hwasan) {
    defines += [
      "WEBVIEW_SANDBOX_LIB_PATH_ASAN=\"${asan_webview_sandbox_lib_path}\"",
    ]
  }
  sources = [
    "aafwk_adapter/src/aafwk_app_mgr_client_adapter_impl.cpp",
    "aafwk_adapter/src/aafwk_browser_client_adapter_impl.cpp",
    "aafwk_adapter/src/aafwk_browser_host_impl.cpp",
    "aafwk_adapter/src/aafwk_render_scheduler_impl.cpp",
    "access_token_adapter/src/access_token_adapter_impl.cpp",
    "background_task_adapter/src/background_task_impl.cpp",
    "cert_mgr_adapter/src/cert_mgr_adapter_impl.cpp",
    "datashare_adapter/src/datashare_adapter_impl.cpp",
    "date_time_format_adapter/src/date_time_format_adapter_impl.cpp",
    "display_manager_adapter/src/display_manager_adapter_impl.cpp",
    "distributeddatamgr_adapter/webdatabase/src/ohos_web_data_base_adapter_impl.cpp",
    "distributeddatamgr_adapter/webdatabase/src/ohos_web_permission_data_base_adapter_impl.cpp",
    "drawing_text_adapter/src/ohos_drawing_text_adapter_impl.cpp",
    "enterprise_device_management_adapter/src/enterprise_device_management_adapter_impl.cpp",
    "event_handler_adapter/src/event_handler_adapter_impl.cpp",
    "flowbuffer_adapter/src/flowbuffer_adapter_impl.cpp",
    "graphic_adapter/src/ashmem_adapter_impl.cpp",
    "graphic_adapter/src/native_image_adapter_impl.cpp",
    "graphic_adapter/src/surface_adapter_impl.cpp",
    "graphic_adapter/src/vsync_adapter_impl.cpp",
    "graphic_adapter/src/window_adapter_impl.cpp",
    "hiviewdfx_adapter/src/hilog_adapter.cpp",
    "hiviewdfx_adapter/src/hisysevent_adapter_impl.cpp",
    "hiviewdfx_adapter/src/hitrace_adapter_impl.cpp",
    "inputmethodframework_adapter/src/imf_adapter_impl.cpp",
    "keystore_adapter/src/keystore_adapter_impl.cpp",
    "migration_manager_adapter/src/migration_manager_adapter_impl.cpp",
    "multimodalinput_adapter/src/mmi_adapter_impl.cpp",
    "net_proxy_adapter/src/net_proxy_adapter_impl.cpp",
    "ohos_adapter_helper/src/ohos_adapter_helper_impl.cpp",
    "ohos_image_adapter/src/ohos_image_decoder_adapter_impl.cpp",
    "ohos_init_web_adapter/src/ohos_init_web_adapter_impl.cpp",
    "ohos_native_buffer_adapter/src/ohos_native_buffer_adapter_impl.cpp",
    "ohos_resource_adapter/src/ohos_resource_adapter_impl.cpp",
    "pasteboard_adapter/src/pasteboard_client_adapter_impl.cpp",
    "print_manager_adapter/src/print_manager_adapter_impl.cpp",
    "res_sched_adapter/src/res_sched_client_adapter_impl.cpp",
    "screenlock_mgr_adapter/src/screenlock_manager_adapter_impl.cpp",
    "soc_perf_adapter/src/soc_perf_client_adapter_impl.cpp",
    "system_properties_adapter/src/system_properties_adapter_impl.cpp",
  ]

  cflags = [
    "-Wall",
    "-Werror",
    "-g3",
  ]

  include_dirs = [
    "${target_gen_dir}/../ohos_nweb/include",
    "../ohos_nweb/include",
    "../ohos_interface/include/ohos_nweb",
    "../ohos_interface/include/ohos_adapter",
    "aafwk_adapter/include",
    "access_token_adapter/include",
    "audio_adapter/include",
    "battery_mgr_adapter/include",
    "camera_adapter/include",
    "cert_mgr_adapter/include",
    "datashare_adapter/include",
    "date_time_format_adapter/include",
    "display_manager_adapter/include",
    "migration_manager_adapter/include",
    "distributeddatamgr_adapter/webdatabase/include",
    "drawing_text_adapter/include",
    "enterprise_device_management_adapter/include",
    "event_handler_adapter/include",
    "flowbuffer_adapter/include",
    "graphic_adapter/include",
    "hiviewdfx_adapter/include",
    "inputmethodframework_adapter/include",
    "keystore_adapter/include",
    "location_adapter/include",
    "media_adapter/include",
    "multimodalinput_adapter/include",
    "net_connect_adapter/include",
    "net_proxy_adapter/include",
    "ohos_adapter_helper/include",
    "ohos_image_adapter/include",
    "ohos_init_web_adapter/include",
    "ohos_native_buffer_adapter/include",
    "ohos_resource_adapter/include",
    "pasteboard_adapter/include",
    "power_mgr_adapter/include",
    "print_manager_adapter/include",
    "screen_capture_adapter/include",
    "screenlock_mgr_adapter/include",
    "soc_perf_adapter/include",
    "system_properties_adapter/include",
    "sensor_adapter/include",
    "background_task_adapter/include",
  ]

  if (target_cpu == "arm" || target_cpu == "arm64" || target_cpu == "x86_64") {
    include_dirs += [
      "${current_sdk_home}/native/sysroot/usr/include/bundle",
      "${current_sdk_home}/native/sysroot/usr/include/asset",
      "${current_sdk_home}/native/sysroot/usr/include/native_drawing",
    ]
  }

  public_configs = [ ":ohos_adapter_public_interface" ]

  external_deps = [
    "ability_base:extractortool",
    "ability_base:zuri",
    "ability_runtime:ability_connect_callback_stub",
    "ability_runtime:ability_manager",
    "ability_runtime:abilitykit_native",
    "ability_runtime:app_context",
    "ability_runtime:app_manager",
    "access_token:libaccesstoken_sdk",
    "app_file_service:fileuri_native",
    "background_task_mgr:bgtaskmgr_innerkits",
    "bundle_framework:appexecfwk_base",
    "bundle_framework:appexecfwk_core",
    "c_utils:utils",
    "cJSON:cjson",
    "certificate_manager:cert_manager_sdk",
    "common_event_service:cesfwk_innerkits",
    "data_share:datashare_common",
    "data_share:datashare_consumer",
    "drivers_interface_display:libdisplay_composer_proxy_1.0",
    "drivers_peripheral_display:hdi_gralloc_client",
    "eventhandler:libeventhandler",
    "file_api:remote_uri_native",
    "graphic_2d:libcomposer",
    "graphic_2d:libnative_image",
    "graphic_2d:librender_service_base",
    "graphic_2d:librender_service_client",
    "graphic_surface:surface",
    "hilog:libhilog",
    "hisysevent:libhisysevent",
    "hitrace:hitrace_meter",
    "huks:libhukssdk",
    "i18n:intl_util",
    "image_framework:image_native",
    "imf:inputmethod_client",
    "init:libbeget_proxy",
    "init:libbegetutil",
    "input:libmmi-client",
    "ipc:ipc_core",
    "napi:ace_napi",
    "netmanager_base:net_conn_manager_if",
    "netmanager_base:net_security_config_if",
    "openssl:libssl_shared",
    "pasteboard:pasteboard_client",
    "pasteboard:pasteboard_data",
    "relational_store:native_rdb",
    "resource_schedule_service:ressched_client",
    "samgr:samgr_proxy",
    "screenlock_mgr:screenlock_client",
    "time_service:time_client",
    "udmf:udmf_client",
    "window_manager:libdm",
    "window_manager:libdm_ndk",
    "libxml2:libxml2",
  ]
  external_deps += [ "ability_base:want" ]

  if (webview_soc_perf_enable) {
    external_deps += [ "soc_perf:socperf_client" ]
    defines += [ "NWEB_SOC_PERF" ]
  }

  if (webview_audio_enable) {
    sources += [
      "audio_adapter/src/audio_capturer_adapter_impl.cpp",
      "audio_adapter/src/audio_device_desc_adapter_impl.cpp",
      "audio_adapter/src/audio_renderer_adapter_impl.cpp",
      "audio_adapter/src/audio_system_manager_adapter_impl.cpp",
    ]
    external_deps += [
      "audio_framework:audio_capturer",
      "audio_framework:audio_client",
      "audio_framework:audio_foundation",
      "audio_framework:audio_renderer",
    ]
    defines += [ "NWEB_AUDIO_ENABLE" ]
  } else {
    sources += [
      "audio_adapter/src/audio_capturer_adapter_mock.cpp",
      "audio_adapter/src/audio_device_desc_adapter_mock.cpp",
      "audio_adapter/src/audio_renderer_adapter_mock.cpp",
      "audio_adapter/src/audio_system_manager_adapter_mock.cpp",
    ]
  }

  if (webview_location_enable) {
    sources += [
      "location_adapter/src/location_callback_adapter_impl.cpp",
      "location_adapter/src/location_instance_impl.cpp",
      "location_adapter/src/location_proxy_adapter_impl.cpp",
    ]
    external_deps += [
      "location:lbsservice_common",
      "location:locator_sdk",
    ]
    defines += [ "NWEB_LOCATION_ENABLE" ]
  } else {
    sources += [ "location_adapter/src/location_proxy_adapter_mock.cpp" ]
  }

  if (webview_avcodec_enable) {
    sources += [
      "media_adapter/src/buffer_info_adapter_impl.cpp",
      "media_adapter/src/capability_data_adapter_impl.cpp",
      "media_adapter/src/codec_format_adapter_impl.cpp",
      "media_adapter/src/media_codec_decoder_adapter_impl.cpp",
      "media_adapter/src/media_codec_encoder_adapter_impl.cpp",
      "media_adapter/src/media_codec_list_adapter_impl.cpp",
      "media_adapter/src/ohos_buffer_adapter_impl.cpp",
    ]
    if (target_cpu == "arm") {
      libs += [
        "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_media_vdec.so",
        "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_media_codecbase.so",
        "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_buffer.so",
        "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_media_core.so",
        "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_window.so",
      ]
    } else if (target_cpu == "arm64") {
      libs += [
        "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_media_vdec.so",
        "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_media_codecbase.so",
        "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_buffer.so",
        "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_media_core.so",
        "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_window.so",
      ]
    } else if (target_cpu == "x86_64") {
      libs += [
        "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_media_vdec.so",
        "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_media_codecbase.so",
        "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_buffer.so",
        "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_media_core.so",
        "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_window.so",
      ]
    }
    external_deps += [
      "av_codec:av_codec_client",
      "media_foundation:media_foundation",
    ]
    if (webview_drm_enable) {
      sources += [
        "media_adapter/src/audio_cenc_info_adapter_impl.cpp",
        "media_adapter/src/audio_codec_decoder_adapter_impl.cpp",
        "media_adapter/src/drm_adapter_impl.cpp",
      ]
      external_deps += [ "drm_framework:native_drm" ]
      if (target_cpu == "arm") {
        libs += [
          "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_media_acodec.so",
          "${current_sdk_home}/native/sysroot/usr/lib/arm-linux-ohos/libnative_media_avcencinfo.so",
        ]
      } else if (target_cpu == "arm64") {
        libs += [
          "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_media_acodec.so",
          "${current_sdk_home}/native/sysroot/usr/lib/aarch64-linux-ohos/libnative_media_avcencinfo.so",
        ]
      } else if (target_cpu == "x86_64") {
        libs += [
          "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_media_acodec.so",
          "${current_sdk_home}/native/sysroot/usr/lib/x86_64-linux-ohos/libnative_media_avcencinfo.so",
        ]
      }
      defines += [ "NWEB_AUDIO_DRM_ENABLE" ]
    }
    defines += [ "NWEB_MEDIA_AVCODEC_ENABLE" ]
  } else {
    sources += [ "media_adapter/src/media_codec_list_adapter_mock.cpp" ]
  }

  if (webview_media_player_enable) {
    sources += [ "media_adapter/src/player_framework_adapter_impl.cpp" ]
    external_deps += [ "player_framework:media_client" ]
    defines += [ "NWEB_MEDIA_PLAYER_ENABLE" ]
  }

  if (webview_camera_enable) {
    sources += [
      "camera_adapter/src/camera_manager_adapter_impl.cpp",
      "camera_adapter/src/camera_rotation_info_adapter_impl.cpp",
      "camera_adapter/src/format_adapter_impl.cpp",
      "camera_adapter/src/video_capture_range_adapter_impl.cpp",
      "camera_adapter/src/video_control_support_adapter_impl.cpp",
      "camera_adapter/src/video_device_descriptor_adapter_impl.cpp",
      "screen_capture_adapter/src/screen_capture_adapter_impl.cpp",
    ]
    external_deps += [ "camera_framework:camera_framework" ]
    defines += [ "NWEB_CAMERA_ENABLE" ]
  } else {
    sources += [
      "camera_adapter/src/camera_manager_adapter_mock.cpp",
      "camera_adapter/src/camera_rotation_info_adapter_mock.cpp",
      "camera_adapter/src/format_adapter_mock.cpp",
      "camera_adapter/src/video_capture_range_adapter_mock.cpp",
      "camera_adapter/src/video_control_support_adapter_mock.cpp",
      "camera_adapter/src/video_device_descriptor_adapter_mock.cpp",
    ]
  }

  if (webview_telephony_enable) {
    sources += [
      "net_connect_adapter/src/net_capabilities_adapter_impl.cpp",
      "net_connect_adapter/src/net_connect_adapter_impl.cpp",
      "net_connect_adapter/src/net_connect_callback_impl.cpp",
      "net_connect_adapter/src/net_connect_utils.cpp",
      "net_connect_adapter/src/net_connection_properties_adapter_impl.cpp",
    ]
    external_deps += [
      "cellular_data:tel_cellular_data_api",
      "core_service:tel_core_service_api",
    ]
    defines += [ "NWEB_TEL_ENABLE" ]
  }

  if (webview_battery_manager_enable) {
    sources += [ "battery_mgr_adapter/src/battery_mgr_client_adapter_impl.cpp" ]
    external_deps += [ "battery_manager:batterysrv_client" ]
    defines += [ "NWEB_BATTERY_MANAGER_ENABLE" ]
  }

  if (webview_power_manager_enable) {
    sources += [ "power_mgr_adapter/src/power_mgr_client_adapter_impl.cpp" ]
    external_deps += [ "power_manager:powermgr_client" ]
    defines += [ "NWEB_POWER_MANAGER_ENABLE" ]
  }

  if (webview_print_enable) {
    external_deps += [
      "print_fwk:print_client",
      "print_fwk:print_helper",
      "print_fwk:print_models",
    ]
    defines += [ "NWEB_PRINT_ENABLE" ]
  }

  if (webview_enterprise_device_manager_enable) {
    external_deps += [ "enterprise_device_management:edmservice_kits" ]
    defines += [ "NWEB_ENTERPRISE_DEVICE_MANAGER_ENABLE" ]
  }

  if (webview_media_avsession_enable) {
    sources += [ "media_adapter/src/media_avsession_adapter_impl.cpp" ]
    external_deps += [ "av_session:avsession_client" ]
    defines += [ "NWEB_MEDIA_AVSESSION_ENABLE" ]
  }

  if (webview_sensors_sensor_enable) {
    sources += [ "sensor_adapter/src/sensor_adapter_impl.cpp" ]
    external_deps += [ "sensor:sensor_interface_native" ]
    defines += [ "NWEB_SENSORS_SENSOR_ENABLE" ]
  }

  innerapi_tags = [ "platformsdk" ]
  part_name = "webview"
  subsystem_name = "web"

  deps = [
    "../ohos_nweb:web_configs",
    "//base/web/webview/arkweb_utils:libarkweb_utils",
    "../ohos_glue:ohos_base_glue_source",
  ]

  if (webview_histogram_metrics_enable) {
    defines += [ "ARKWEB_HISTOGRAM_METRICS_ENABLE" ]
  }
}