# Copyright (c) 2021 Project CHIP Authors
#
# 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 logging
import os
import shlex
from enum import Enum, auto

from runner.runner import Runner

from .builder import Builder, BuilderOutput, BuildProfile, OutDirLock, lock_output_dir

log = logging.getLogger(__name__)


class AndroidBoard(Enum):
    ARM = auto()
    ARM64 = auto()
    X64 = auto()
    X86 = auto()
    AndroidStudio_ARM = auto()
    AndroidStudio_ARM64 = auto()
    AndroidStudio_X64 = auto()
    AndroidStudio_X86 = auto()

    def TargetCpuName(self):
        if self == AndroidBoard.ARM or self == AndroidBoard.AndroidStudio_ARM:
            return "arm"
        if self == AndroidBoard.ARM64 or self == AndroidBoard.AndroidStudio_ARM64:
            return "arm64"
        if self == AndroidBoard.X64 or self == AndroidBoard.AndroidStudio_X64:
            return "x64"
        if self == AndroidBoard.X86 or self == AndroidBoard.AndroidStudio_X86:
            return "x86"
        raise Exception("Unknown board type: %r" % self)

    def AbiName(self):
        if self.TargetCpuName() == "arm":
            return "armeabi-v7a"
        if self.TargetCpuName() == "arm64":
            return "arm64-v8a"
        if self.TargetCpuName() == "x64":
            return "x86_64"
        if self.TargetCpuName() == "x86":
            return "x86"
        raise Exception("Unknown board type: %r" % self)

    def IsIde(self):
        return (self == AndroidBoard.AndroidStudio_ARM
                or self == AndroidBoard.AndroidStudio_ARM64
                or self == AndroidBoard.AndroidStudio_X64
                or self == AndroidBoard.AndroidStudio_X86)


class AndroidApp(Enum):
    CHIP_TOOL = auto()
    CHIP_TEST = auto()
    TV_SERVER = auto()
    TV_CASTING_APP = auto()
    VIRTUAL_DEVICE_APP = auto()

    def AppName(self):
        if self == AndroidApp.CHIP_TOOL:
            return "CHIPTool"
        if self == AndroidApp.CHIP_TEST:
            return "CHIPTest"
        if self == AndroidApp.TV_SERVER:
            return "tv-server"
        if self == AndroidApp.TV_CASTING_APP:
            return "tv-casting"
        if self == AndroidApp.VIRTUAL_DEVICE_APP:
            return "virtual-device-app"
        raise Exception("Unknown app type: %r" % self)

    def AppGnArgs(self):
        gn_args = {}

        if self == AndroidApp.TV_SERVER:
            gn_args["chip_config_network_layer_ble"] = False
        elif self == AndroidApp.TV_CASTING_APP:
            gn_args["chip_config_network_layer_ble"] = False
        elif self == AndroidApp.VIRTUAL_DEVICE_APP:
            gn_args["chip_config_network_layer_ble"] = True
        elif self == AndroidApp.CHIP_TOOL:
            gn_args["chip_enable_nfc_based_commissioning"] = True
            gn_args["chip_build_controller_dynamic_server"] = True
        return gn_args

    def ExampleName(self):
        if self == AndroidApp.TV_SERVER:
            return "tv-app"
        if self == AndroidApp.TV_CASTING_APP:
            return "tv-casting-app"
        if self == AndroidApp.VIRTUAL_DEVICE_APP:
            return "virtual-device-app"
        if self == AndroidApp.CHIP_TEST:
            return "chip-test"
        return None

    def Modules(self):
        if self == AndroidApp.TV_SERVER:
            return ["platform-app", "content-app"]
        return None

    def BuildRoot(self, root):
        if self == AndroidApp.CHIP_TEST:
            return os.path.join(root, 'examples/android/CHIPTest')
        return None


class AndroidBuilder(Builder):
    def __init__(self,
                 root: str,
                 runner: Runner,
                 output_dir_lock: OutDirLock, board: AndroidBoard, app: AndroidApp,
                 optimize_size: bool = False):
        super().__init__(root, runner, output_dir_lock)
        self.board = board
        self.app = app
        self.optimize_size = optimize_size

    def _get_sdk_manager_paths(self):
        """Get list of possible SDK manager paths for Android SDK compatibility."""
        paths = []

        # Allow environment variable override for testing purposes - check this first
        test_sdk_manager = os.environ.get("TEST_ANDROID_SDK_MANAGER_PATH")
        if test_sdk_manager:
            paths.append(test_sdk_manager)

        # Standard paths using ANDROID_HOME
        android_home = os.environ.get("ANDROID_HOME", "")
        if android_home:
            paths.extend([
                os.path.join(android_home, "cmdline-tools", "latest", "bin", "sdkmanager"),  # modern Android SDK
                os.path.join(android_home, "cmdline-tools", "10.0", "bin", "sdkmanager"),    # specific version
                os.path.join(android_home, "tools", "bin", "sdkmanager")                     # legacy Android SDK
            ])

        return paths

    def _find_sdk_manager(self, for_purpose="validation"):
        """Find a valid SDK manager executable from possible paths."""
        sdk_manager_paths = self._get_sdk_manager_paths()

        sdk_manager = None
        checked_details = []
        for path in sdk_manager_paths:
            # In test environment, treat TEST_ANDROID_SDK_MANAGER_PATH as valid even if file doesn't exist
            is_test_path = path == os.environ.get("TEST_ANDROID_SDK_MANAGER_PATH")

            if is_test_path:
                # Test environment - assume the path is valid
                sdk_manager = path
                checked_details.append(f"{path} (test environment - assumed valid)")
                log.info("Using SDK manager for %s from test environment: %s", for_purpose, sdk_manager)
                break
            # Real environment - check actual file existence
            exists = os.path.isfile(path)
            executable = os.access(path, os.X_OK)
            checked_details.append(f"{path} (exists: {exists}, executable: {executable})")
            log.debug("Checking SDK manager path for %s: %s - exists: %s, executable: %s", for_purpose, path, exists, executable)

            if exists and executable:
                sdk_manager = path
                log.info("Found SDK manager for %s at: %s", for_purpose, sdk_manager)
                break

        return sdk_manager, checked_details

    def _handle_sdk_license_acceptance(self):
        """Handle SDK manager license acceptance with consistent behavior between dry-run and real execution."""

        # Use the same logic for both dry-run and real execution
        sdk_manager_for_licenses, checked_details = self._find_sdk_manager("license acceptance")

        if sdk_manager_for_licenses:
            self._Execute(
                ["bash", "-c", "yes | %s --licenses >/dev/null" % sdk_manager_for_licenses],
                title="Accepting NDK licenses using: %s" % sdk_manager_for_licenses,
            )
        else:
            log.warning("No SDK manager found for license acceptance - licenses may need to be accepted manually")

    def validate_build_environment(self):
        # Log Android environment paths for debugging
        android_ndk_home = os.environ.get("ANDROID_NDK_HOME", "")
        android_home = os.environ.get("ANDROID_HOME", "")

        log.info("Android environment paths:")
        log.info("  ANDROID_NDK_HOME: %s", android_ndk_home)
        log.info("  ANDROID_HOME: %s", android_home)

        for k in ["ANDROID_NDK_HOME", "ANDROID_HOME"]:
            if k not in os.environ:
                raise Exception(
                    "Environment %s missing, cannot build android libraries" % k
                )

        # SDK manager must be runnable to 'accept licenses'
        # Check multiple possible SDK manager locations for Android SDK compatibility
        sdk_manager, checked_details = self._find_sdk_manager("validation")

        if not sdk_manager:
            log.error("SDK manager not found in any expected location")
            for detail in checked_details:
                log.error("  %s", detail)

            android_home = os.environ["ANDROID_HOME"]
            possible_fixes = [
                f"1. Install Android SDK Command Line Tools in {android_home}",
                f"2. Fix permissions: chmod +x {android_home}/cmdline-tools/*/bin/sdkmanager",
                "3. Verify ANDROID_HOME points to correct SDK directory"
            ]

            raise Exception(
                f"No working SDK manager found. Tried: {len(checked_details)} locations.\n"
                f"Possible fixes:\n" + "\n".join(possible_fixes)
            )

        # In order to accept a license, the licenses folder is updated with the hash of the
        # accepted license
        android_home = os.environ["ANDROID_HOME"]
        licenses = os.path.join(android_home, "licenses")
        if not os.path.exists(licenses):
            # Initial install may not have licenses at all
            if not os.access(android_home, os.W_OK):
                raise Exception(
                    "'%s' is NOT writable by the current user (needed to create licenses folder for accept)"
                    % android_home
                )

        elif not os.access(licenses, os.W_OK):
            raise Exception(
                "'%s' is NOT writable by the current user (needed to accept licenses)"
                % licenses
            )

    def copyToSrcAndroid(self):
        # JNILibs will be copied as long as they reside in src/main/jniLibs/ABI:
        #    https://developer.android.com/studio/projects/gradle-external-native-builds#jniLibs
        # to avoid redefined in IDE mode, copy to another place and add that path in build.gradle

        # We do NOT use python builtins for copy, so that the 'execution commands' are available
        # when using dry run.
        jnilibs_dir = os.path.join(
            self.root,
            "examples/android/",
            self.app.AppName(),
            "app/libs/jniLibs",
            self.board.AbiName(),
        )
        libs_dir = os.path.join(
            self.root, "examples/android/", self.app.AppName(), "app/libs"
        )
        self._Execute(
            ["mkdir", "-p", jnilibs_dir], title="Prepare Native libs " + self.identifier
        )

        # TODO: Runtime dependencies should be computed by the build system rather than hardcoded
        # GN supports getting these dependencies like:
        #   gn desc out/android-x64-chip_tool/ //src/controller/java runtime_deps
        #   gn desc out/android-x64-chip_tool/ //src/setup_payload/java runtime_deps
        # However  this assumes that the output folder has been populated, which will not be
        # the case for `dry-run` executions. Hence this harcoding here.
        #
        #   If we unify the JNI libraries, libc++_shared.so may not be needed anymore, which could
        # be another path of resolving this inconsistency.
        for libName in [
            "libCHIPController.so",
            "libc++_shared.so",
        ]:
            self._Execute(
                [
                    "cp",
                    os.path.join(
                        self.output_dir, "lib", "jni", self.board.AbiName(), libName
                    ),
                    os.path.join(jnilibs_dir, libName),
                ]
            )

        jars = {
            "CHIPController.jar": "src/controller/java/CHIPController.jar",
            "CHIPInteractionModel.jar": "src/controller/java/CHIPInteractionModel.jar",
            "OnboardingPayload.jar": "src/controller/java/OnboardingPayload.jar",
            "AndroidPlatform.jar": "src/platform/android/AndroidPlatform.jar",
            "libMatterJson.jar": "src/controller/java/libMatterJson.jar",
            "libMatterTlv.jar": "src/controller/java/libMatterTlv.jar",
            "CHIPClusters.jar": "src/controller/java/CHIPClusters.jar",
            "CHIPClusterID.jar": "src/controller/java/CHIPClusterID.jar",
        }

        for jarName in jars:
            self._Execute(
                [
                    "cp",
                    os.path.join(self.output_dir, "lib", jars[jarName]),
                    os.path.join(libs_dir, jarName),
                ]
            )

    def copyToExampleApp(self, jnilibs_dir, libs_dir, libs, jars):
        self._Execute(
            ["mkdir", "-p", jnilibs_dir], title="Prepare Native libs " + self.identifier
        )

        for libName in libs:
            self._Execute(
                [
                    "cp",
                    os.path.join(
                        self.output_dir, "lib", "jni", self.board.AbiName(), libName
                    ),
                    os.path.join(jnilibs_dir, libName),
                ]
            )

        for jarName in jars:
            self._Execute(
                [
                    "cp",
                    os.path.join(self.output_dir, "lib", jars[jarName]),
                    os.path.join(libs_dir, jarName),
                ]
            )

    def gradlewBuildSrcAndroid(self):
        # App compilation
        self._Execute(
            [
                "%s/examples/android/%s/gradlew" % (
                    self.root, self.app.AppName()),
                "-p",
                "%s/examples/android/%s" % (self.root, self.app.AppName()),
                "-PmatterBuildSrcDir=%s" % self.output_dir,
                "-PmatterSdkSourceBuild=false",
                "-PbuildDir=%s" % self.output_dir,
                "assembleDebug",
            ],
            title="Building APP " + self.identifier,
        )

    def gradlewBuildExampleAndroid(self):

        # Example compilation
        optimize_flag = "-PoptimizeApkSize=true" if self.optimize_size else "-PoptimizeApkSize=false"

        if self.app.Modules():
            for module in self.app.Modules():
                self._Execute(
                    [
                        "%s/examples/%s/android/App/gradlew"
                        % (self.root, self.app.ExampleName()),
                        "-p",
                        "%s/examples/%s/android/App/"
                        % (self.root, self.app.ExampleName()),
                        "-PmatterBuildSrcDir=%s" % self.output_dir,
                        "-PmatterSdkSourceBuild=false",
                        "-PbuildDir=%s/%s" % (self.output_dir, module),
                        optimize_flag,
                        ":%s:assembleDebug" % module,
                    ],
                    title="Building Example %s, module %s" % (
                        self.identifier, module),
                )
        else:
            self._Execute(
                [
                    "%s/examples/%s/android/App/gradlew"
                    % (self.root, self.app.ExampleName()),
                    "-p",
                    "%s/examples/%s/android/App/" % (self.root,
                                                     self.app.ExampleName()),
                    "-PmatterBuildSrcDir=%s" % self.output_dir,
                    "-PmatterSdkSourceBuild=false",
                    "-PbuildDir=%s" % self.output_dir,
                    optimize_flag,
                    "assembleDebug",
                ],
                title="Building Example " + self.identifier,
            )

    @lock_output_dir
    def generate(self):
        self._Execute(
            ["python3", "third_party/android_deps/set_up_android_deps.py"],
            title="Setting up Android deps through Gradle",
        )

        self._Execute(
            ["third_party/java_deps/set_up_java_deps.sh"],
            title="Setting up Java deps",
        )

        if not os.path.exists(self.output_dir):
            # NRF does a in-place update  of SDK tools
            if not self._runner.dry_run:
                self.validate_build_environment()

            exampleName = self.app.ExampleName()
            gn_args = {}
            gn_args["target_os"] = "android"
            gn_args["target_cpu"] = self.board.TargetCpuName()
            gn_args["android_ndk_root"] = os.environ["ANDROID_NDK_HOME"]
            gn_args["android_sdk_root"] = os.environ["ANDROID_HOME"]
            if exampleName == "chip-test":
                gn_args["chip_build_test_static_libraries"] = False

            match self.options.build_profile:
                # Explicitly treat DEFAULT as DEBUG when building examples.
                case BuildProfile.DEFAULT | BuildProfile.DEBUG:
                    gn_args.update({"is_debug": True, "optimize_debug": False})
                case BuildProfile.DEBUG_OPTIMIZED:
                    gn_args.update({"is_debug": True, "optimize_debug": True})
                case BuildProfile.RELEASE:
                    gn_args.update({"is_debug": False, "optimize_for_size": False})
                case BuildProfile.RELEASE_SIZE:
                    gn_args.update({"is_debug": False, "optimize_for_size": True})

            if self.options.pw_command_launcher:
                gn_args["pw_command_launcher"] = self.options.pw_command_launcher

            if self.options.enable_link_map_file:
                gn_args["chip_generate_link_map_file"] = True

            if exampleName == "chip-test":
                gn_args["chip_build_tests"] = True
            if self.optimize_size:
                gn_args["optimize_apk_size"] = True
                gn_args["is_debug"] = False
                gn_args["matter_enable_tracing_support"] = False
                gn_args["use_static_libcxx"] = True

                # TV Casting App size optimizations: point the build at
                # the override directory containing slim source files
                # (cluster-objects, TLV decoders, accessors, cluster
                # servers) covering only the ~36 casting-relevant
                # clusters.  The build system resolves well-known
                # filenames inside this directory automatically.
                # This must be passed as an explicit GN build arg
                # because args.gni is evaluated inside default_args
                # (before args.gn is applied), so the
                # if (optimize_apk_size) conditional there cannot see
                # the args.gn value.
                if self.app == AndroidApp.TV_CASTING_APP:
                    gn_args["chip_data_model_overrides_dir"] = (
                        "//third_party/connectedhomeip/examples/"
                        "tv-casting-app/tv-casting-common"
                    )
                    gn_args["chip_data_model_extra_logging"] = False
                    gn_args["enable_rtti"] = False
            gn_args.update(self.app.AppGnArgs())

            args_str = ""
            for key, value in gn_args.items():
                if type(value) is bool:
                    if value:
                        args_str += "%s=true " % (key)
                    else:
                        args_str += "%s=false " % (key)
                else:
                    args_str += '%s="%s" ' % (key, shlex.quote(value))
            args = "--args=%s" % (args_str)

            gn_gen = [
                "gn",
                "gen",
                "--check",
                "--fail-on-unused-args",
                self.output_dir,
                args,
            ]

            rootName = self.app.BuildRoot(self.root)
            if rootName is not None:
                gn_gen += ["--root=%s" % rootName]
            elif exampleName is not None:
                gn_gen += ["--root=%s/examples/%s/android/" %
                           (self.root, exampleName)]

            if self.board.IsIde():
                gn_gen += [
                    "--ide=json",
                    "--json-ide-script=//scripts/examples/gn_to_cmakelists.py",
                ]

            self._Execute(gn_gen, title="Generating " + self.identifier)

            # Handle SDK manager license acceptance
            self._handle_sdk_license_acceptance()

    @lock_output_dir
    def stripSymbols(self):
        output_libs_dir = os.path.join(
            self.output_dir,
            "lib",
            "jni",
            self.board.AbiName())
        for lib in os.listdir(output_libs_dir):
            if (lib.endswith(".so")):
                self._Execute(
                    ["llvm-strip",
                     "-s",
                     os.path.join(output_libs_dir, lib)
                     ],
                    "Stripping symbols from " + lib
                )

    @lock_output_dir
    def _build(self):
        if self.board.IsIde():
            # App compilation IDE
            # TODO: Android Gradle with module and -PbuildDir= will caused issue, remove -PbuildDir=
            self._Execute(
                [
                    "%s/examples/android/%s/gradlew" % (
                        self.root, self.app.AppName()),
                    "-p",
                    "%s/examples/android/%s" % (self.root, self.app.AppName()),
                    "-PmatterBuildSrcDir=%s" % self.output_dir,
                    "-PmatterSdkSourceBuild=true",
                    "-PmatterSourceBuildAbiFilters=%s" % self.board.AbiName(),
                    "assembleDebug",
                ],
                title="Building APP " + self.identifier,
            )
        else:
            cmd = ["ninja", "-C", self.output_dir]

            if self.ninja_jobs is not None:
                cmd.append('-j' + str(self.ninja_jobs))

            self._Execute(
                cmd,
                title="Building JNI " + self.identifier,
            )

            exampleName = self.app.ExampleName()
            if exampleName is None:
                self.copyToSrcAndroid()
                self.gradlewBuildSrcAndroid()
            elif exampleName == "tv-casting-app":
                jnilibs_dir = os.path.join(
                    self.root,
                    "examples/",
                    self.app.ExampleName(),
                    "android/App/app/libs/jniLibs",
                    self.board.AbiName(),
                )

                libs_dir = os.path.join(
                    self.root, "examples/", self.app.ExampleName(), "android/App/app/libs"
                )

                # When size-optimized with static libc++, libc++_shared.so is
                # folded into libTvCastingApp.so and doesn't need to be shipped.
                if self.optimize_size:
                    libs = ["libTvCastingApp.so"]
                else:
                    libs = ["libc++_shared.so", "libTvCastingApp.so"]

                jars = {
                    "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar",
                    "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar",
                    "CHIPInteractionModel.jar": "third_party/connectedhomeip/src/controller/java/CHIPInteractionModel.jar",
                    "TvCastingApp.jar": "TvCastingApp.jar",
                }

                self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars)
                self.gradlewBuildExampleAndroid()
            elif exampleName == "tv-app":
                jnilibs_dir = os.path.join(
                    self.root,
                    "examples/",
                    self.app.ExampleName(),
                    "android/App/app/libs/jniLibs",
                    self.board.AbiName(),
                )

                libs_dir = os.path.join(
                    self.root, "examples/", self.app.ExampleName(), "android/App/app/libs"
                )

                libs = ["libc++_shared.so", "libTvApp.so"]

                jars = {
                    "OnboardingPayload.jar": "third_party/connectedhomeip/src/controller/java/OnboardingPayload.jar",
                    "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar",
                    "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar",
                    "TvApp.jar": "TvApp.jar",
                }

                self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars)
                self.gradlewBuildExampleAndroid()
            elif exampleName == "chip-test":
                jnilibs_dir = os.path.join(
                    self.root,
                    "examples/android/CHIPTest/app/libs/jniLibs",
                    self.board.AbiName(),
                )

                libs_dir = os.path.join(
                    self.root, "examples/android/CHIPTest/app/libs"
                )

                libs = ["libc++_shared.so", "libCHIPTest.so"]

                jars = {
                    "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar",
                    "CHIPTest.jar": "CHIPTest.jar",
                }
                self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars)
                self.gradlewBuildSrcAndroid()
            elif exampleName == "virtual-device-app":
                jnilibs_dir = os.path.join(
                    self.root,
                    "examples/",
                    self.app.ExampleName(),
                    "android/App/app/libs/jniLibs",
                    self.board.AbiName(),
                )

                libs_dir = os.path.join(
                    self.root, "examples/", self.app.ExampleName(), "android/App/app/libs"
                )

                libs = ["libc++_shared.so", "libDeviceApp.so"]

                jars = {
                    "OnboardingPayload.jar": "third_party/connectedhomeip/src/controller/java/OnboardingPayload.jar",
                    "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar",
                    "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar",
                    "DeviceApp.jar": "DeviceApp.jar",
                }

                self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars)
                self.gradlewBuildExampleAndroid()

            if self.options.build_profile in [BuildProfile.RELEASE, BuildProfile.RELEASE_SIZE] or self.optimize_size:
                self.stripSymbols()

    @lock_output_dir
    def build_outputs(self):
        if self.board.IsIde():
            yield BuilderOutput(
                os.path.join(
                    self.root,
                    "examples/android",
                    self.app.AppName(),
                    "app/build/outputs/apk/debug/app-debug.apk"),
                self.app.AppName() + "-debug.apk")
        elif self.app.ExampleName() is not None:
            if self.app == AndroidApp.TV_SERVER:
                yield BuilderOutput(
                    os.path.join(self.output_dir, "platform-app",
                                 "outputs", "apk", "debug", "platform-app-debug.apk"),
                    "tv-sever-platform-app-debug.apk")
                yield BuilderOutput(
                    os.path.join(self.output_dir, "content-app",
                                 "outputs", "apk", "debug", "content-app-debug.apk"),
                    "tv-sever-content-app-debug.apk")
            elif self.app == AndroidApp.VIRTUAL_DEVICE_APP:
                yield BuilderOutput(
                    os.path.join(self.output_dir, "VirtualDeviceApp", "app",
                                 "outputs", "apk", "debug", "app-debug.apk"),
                    self.app.AppName() + "app-debug.apk")
            else:
                yield BuilderOutput(
                    os.path.join(self.output_dir,
                                 "outputs", "apk", "debug", "app-debug.apk"),
                    self.app.AppName() + "app-debug.apk")
        else:
            yield BuilderOutput(
                os.path.join(self.output_dir, "outputs", "apk", "debug", "app-debug.apk"),
                self.app.AppName() + "app-debug.apk")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "controller", "java", "CHIPController.jar"),
                "CHIPController.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "controller", "java", "CHIPInteractionModel.jar"),
                "CHIPInteractionModel.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "controller", "java", "libMatterTlv.jar"),
                "libMatterTlv.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "platform", "android", "AndroidPlatform.jar"),
                "AndroidPlatform.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "controller", "java", "OnboardingPayload.jar"),
                "OnboardingPayload.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "controller", "java", "CHIPClusters.jar"),
                "CHIPClusters.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "src", "controller", "java", "CHIPClusterID.jar"),
                "CHIPClusterID.jar")
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "jni", self.board.AbiName(), "libCHIPController.so"),
                "jni/%s/libCHIPController.so" % self.board.AbiName())
            yield BuilderOutput(
                os.path.join(self.output_dir, "lib", "jni", self.board.AbiName(), "libc++_shared.so"),
                "jni/%s/libc++_shared.so" % self.board.AbiName())
