buildscript {
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:8.2.2'
    }
}

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

apply plugin: 'com.android.application'

android {
    namespace 'com.android.deskclock'
    compileSdk 34

    defaultConfig {
        minSdkVersion 27
        targetSdkVersion 34
    }

    sourceSets {
        main {
            res.srcDirs = ['res']
            java.srcDirs = ['src']
            assets.srcDirs = ['assets']
            manifest.srcFile 'AndroidManifest.xml'
        }

        test {
            java.srcDirs = ['tests']
        }
    }

    buildFeatures {
        buildConfig true
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

    lint {
        ignore 'ProtectedPermissions', 'ExtraTranslation', 'ImpliedQuantity', 'MissingQuantity', 'MissingTranslation'
    }
}

dependencies {
    implementation 'com.google.android.material:material:1.7.0-alpha03'
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'androidx.preference:preference:1.2.0'
    implementation 'androidx.recyclerview:recyclerview:1.3.0-rc01'
    implementation 'androidx.gridlayout:gridlayout:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
    implementation 'androidx.loader:loader:1.1.0'
    implementation 'androidx.test:core:1.5.0'
    implementation 'androidx.test:rules:1.5.0'
    testImplementation 'junit:junit:4.13.2'
}

tasks.withType(JavaCompile) {
    options.compilerArgs << '-Xlint:unchecked'
//    options.deprecation = true
}
