buildscript {
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.0.4'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

tasks.register("updateGradleWrapper", Wrapper) {
    // https://docs.gradle.org/current/release-notes.html
    // https://github.com/gradle/gradle/releases
    gradleVersion = '7.3.3'
    distributionUrl = "https://services.gradle.org/distributions/gradle-${gradleVersion}-all.zip"
}

//==================================================================================================

apply plugin: 'com.android.application'

android {
    compileSdkVersion 31

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "org.lineageos.eleven"

        minSdkVersion 28
        targetSdkVersion 31

        versionCode 411
        versionName '4.1.1'
    }

    buildTypes {
        debug {
            applicationIdSuffix ".dev"

            debuggable true
            minifyEnabled false
            shrinkResources false
            zipAlignEnabled false
        }
        debugProguard {
            applicationIdSuffix ".dev"

            debuggable true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
            minifyEnabled true
            shrinkResources true
            zipAlignEnabled true
        }
        release {
            debuggable false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
            minifyEnabled true
            shrinkResources true
            zipAlignEnabled true
        }
    }

    lintOptions {
        baseline file("lint-baseline.xml")

        abortOnError true
        checkAllWarnings true
        showAll true

        warningsAsErrors true

        // HTML report is enough (can be found inside build/reports/)
        xmlReport false

        // do not warn about translations
        disable 'MissingTranslation', 'ExtraTranslation'
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude '.readme'
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'

            aidl.srcDirs = ['src']
            assets.srcDirs = ['assets']
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            resources.srcDirs = ['res']
        }
    }
}

dependencies {
    // AndroidX - https://developer.android.com/jetpack/androidx/releases

    // see https://developer.android.com/jetpack/androidx/releases/appcompat
    implementation "androidx.appcompat:appcompat:1.4.0"

    // see https://developer.android.com/jetpack/androidx/releases/cardview
    implementation "androidx.cardview:cardview:1.0.0"

    // see https://developer.android.com/jetpack/androidx/releases/palette
    implementation "androidx.palette:palette:1.0.0"

    // see https://developer.android.com/jetpack/androidx/releases/preference
    implementation "androidx.preference:preference:1.1.1"

    // see https://developer.android.com/jetpack/androidx/releases/recyclerview
    implementation "androidx.recyclerview:recyclerview:1.2.1"

    // see https://developer.android.com/jetpack/androidx/releases/constraintlayout
    implementation "androidx.constraintlayout:constraintlayout:2.1.2"

    // see https://github.com/material-components/material-components-android/releases
    implementation "com.google.android.material:material:1.4.0"
}
