buildscript {
    repositories {
        mavenCentral()
        google()
    }
    dependencies {
        classpath GRADLE_CLASS_PATH
        classpath PROTOBUF_CLASS_PATH
    }
}

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'

android {
    compileSdkVersion COMPILE_SDK.toInteger()
    buildToolsVersion BUILD_TOOLS_VERSION

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        debug {
            minifyEnabled false
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    flavorDimensions "default"

    productFlavors {
        aosp {
            dimension "default"
            applicationId 'com.android.launcher3'
            testApplicationId 'com.android.launcher3.tests'
        }

        l3go {
            dimension "default"
            applicationId 'com.android.launcher3'
            testApplicationId 'com.android.launcher3.tests'
        }

        quickstep {
            dimension "default"
            applicationId 'com.android.launcher3'
            testApplicationId 'com.android.launcher3.tests'

            minSdkVersion 28
        }
    }

    // Disable release builds for now
    android.variantFilter { variant ->
        if (variant.buildType.name.endsWith('release')) {
            variant.setIgnore(true);
        }
    }

    sourceSets {
        main {
            res.srcDirs = ['res']
            java.srcDirs = ['src', 'src_shortcuts_overrides']
            manifest.srcFile 'AndroidManifest-common.xml'
            proto {
                srcDir 'protos/'
                srcDir 'proto_overrides/'
            }
        }

        debug {
            manifest.srcFile "AndroidManifest.xml"
        }

        androidTest {
            res.srcDirs = ['tests/res']
            java.srcDirs = ['tests/src', 'tests/tapl']
            manifest.srcFile "tests/AndroidManifest-common.xml"
        }

        androidTestDebug {
            manifest.srcFile "tests/AndroidManifest.xml"
        }

        aosp {
            java.srcDirs = ['src_flags', "src_ui_overrides"]
        }

        l3go {
            res.srcDirs = ['go/res']
            java.srcDirs = ['go/src', "src_ui_overrides"]
            manifest.srcFile "go/AndroidManifest.xml"
        }

        quickstep {
            res.srcDirs = ['quickstep/res']
            java.srcDirs = ['src_flags', 'quickstep/src']
            manifest.srcFile "quickstep/AndroidManifest.xml"
        }
    }
}

repositories {
    maven { url "../../../prebuilts/fullsdk-darwin/extras/android/m2repository" }
    maven { url "../../../prebuilts/fullsdk-linux/extras/android/m2repository" }
    mavenCentral()
    google()
}

dependencies {
    implementation "androidx.dynamicanimation:dynamicanimation:${ANDROID_X_VERSION}"
    implementation "androidx.recyclerview:recyclerview:${ANDROID_X_VERSION}"
    implementation "androidx.preference:preference:${ANDROID_X_VERSION}"
    implementation PROTOBUF_DEPENDENCY
    implementation project(':IconLoader')

    // This is already included in sysui_shared
    aospImplementation fileTree(dir: "libs", include: 'plugin_core.jar')
    l3goImplementation fileTree(dir: "libs", include: 'plugin_core.jar')

    quickstepImplementation fileTree(dir: "quickstep/libs", include: 'sysui_shared.jar')

    testImplementation 'junit:junit:4.12'
    androidTestImplementation "org.mockito:mockito-core:1.9.5"
    androidTestImplementation 'com.google.dexmaker:dexmaker:1.2'
    androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.0'
    androidTestImplementation 'com.android.support.test:rules:1.0.0'
    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
    androidTestImplementation "androidx.annotation:annotation:${ANDROID_X_VERSION}"
}

protobuf {
    // Configure the protoc executable
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'

        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    remove java
                    javanano {
                        option "java_package=launcher_log_extension.proto|com.android.launcher3.userevent.nano"
                        option "java_package=launcher_log.proto|com.android.launcher3.userevent.nano"
                        option "java_package=launcher_dump.proto|com.android.launcher3.model.nano"
                        option "enum_style=java"
                    }
                }
            }
        }
    }
}
