import io.gitlab.arturbosch.detekt.Detekt import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.FileInputStream import java.util.Properties plugins { id("com.android.application") id("org.jetbrains.kotlin.android") kotlin("plugin.serialization") id("com.google.devtools.ksp") id("io.gitlab.arturbosch.detekt") } val keystorePropertiesFile: File = rootProject.file("keystore.properties") val keystoreProperties = Properties().apply { load(FileInputStream(keystorePropertiesFile)) } android { namespace = "jp.juggler.subwaytooter" compileSdk = Vers.stCompileSdkVersion buildToolsVersion = Vers.stBuildToolsVersion defaultConfig { targetSdk = Vers.stTargetSdkVersion minSdk = Vers.stMinSdkVersion versionCode = 545 versionName = "5.545" applicationId = "jp.juggler.subwaytooter" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } buildFeatures { viewBinding = true } // exoPlayer 2.9.0 以降は Java 8 compiler support を要求する compileOptions { sourceCompatibility = Vers.javaSourceCompatibility targetCompatibility = Vers.javaTargetCompatibility isCoreLibraryDesugaringEnabled = true } kotlinOptions { jvmTarget = Vers.kotlinJvmTarget freeCompilerArgs = listOf( "-opt-in=kotlin.ExperimentalStdlibApi", "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", "-opt-in=kotlinx.serialization.ExperimentalSerializationApi", "-opt-in=androidx.media3.common.util.UnstableApi", // "-Xopt-in=androidx.compose.foundation.ExperimentalFoundationApi", // "-Xopt-in=androidx.compose.animation.ExperimentalAnimationApi", ) } // kotlin 1.6.0にすると This version (1.0.5) of the Compose Compiler requires Kotlin version 1.5.31 but you appear to be using Kotlin version 1.6.0 which is not known to be compatible. と怒られる // buildFeatures { // compose true // } // composeOptions { // kotlinCompilerExtensionVersion compose_version // } signingConfigs { create("release") { storeFile = file(keystoreProperties["storeFile"] as String) storePassword = keystoreProperties["storePassword"] as String keyAlias = keystoreProperties["keyAlias"] as String keyPassword = keystoreProperties["keyPassword"] as String } } buildTypes { release { isMinifyEnabled = false isShrinkResources = false proguardFiles( getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro", ) signingConfig = signingConfigs.getByName("release") } debug { } } // Specifies comma-separated list of flavor dimensions. flavorDimensions += "fcmType" productFlavors { create("nofcm") { dimension = "fcmType" versionNameSuffix = "-noFcm" applicationIdSuffix = ".noFcm" manifestPlaceholders["customScheme"] = "subwaytooternofcm" } create("fcm") { dimension = "fcmType" manifestPlaceholders["customScheme"] = "subwaytooter" } } // https://github.com/tateisu/SubwayTooter/issues/229 // splits { // abi { // enable true // reset() // include "arm64-v8a", "x86", "x86_64" // universalApk true // } // } packaging { resources { excludes.addAll( listOf( "/META-INF/{AL2.0,LGPL2.1}", "META-INF/DEPENDENCIES", ) ) // https://github.com/Kotlin/kotlinx.coroutines/issues/1064 pickFirsts.addAll( listOf( "META-INF/atomicfu.kotlin_module", ) ) } } useLibrary("android.test.base") useLibrary("android.test.mock") lint { warning += "DuplicatePlatformClasses" disable += "MissingTranslation" } kotlin { jvmToolchain(Vers.kotlinJvmToolchain) } kotlinOptions { jvmTarget = Vers.kotlinJvmTarget } tasks.withType().configureEach { kotlinOptions { jvmTarget = Vers.kotlinJvmTarget } } } dependencies { // desugar_jdk_libs 2.0.0 は AGP 7.4.0-alpha10 以降を要求する //noinspection GradleDependency coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:${Vers.desugarLibVersion}") implementation(project(":base")) implementation(project(":colorpicker")) implementation(project(":emoji")) implementation(project(":apng_android")) implementation(project(":anko")) implementation(fileTree(mapOf("dir" to "src/main/libs", "include" to arrayOf("*.aar")))) "fcmImplementation"("com.google.firebase:firebase-messaging:23.4.1") "fcmImplementation"("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:${Vers.kotlinxCoroutinesVersion}") implementation("androidx.core:core-splashscreen:1.0.1") // implementation "org.conscrypt:conscrypt-android:$conscryptVersion" api("org.conscrypt:conscrypt-android:${Vers.conscryptVersion}") implementation("com.github.UnifiedPush:android-connector:2.1.1") implementation("jp.wasabeef:glide-transformations:4.3.0") // implementation("com.github.androidmads:QRGenerator:1.0.1") implementation("com.github.alexzhirkevich:custom-qr-generator:1.6.2") val apng4AndroidVersion = "2.25.0" implementation("com.github.penfeizhou.android.animation:apng:$apng4AndroidVersion") ksp("com.github.bumptech.glide:ksp:${Vers.glideVersion}") detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:${Vers.detektVersion}") testImplementation(project(":base")) androidTestImplementation(project(":base")) androidTestApi("androidx.test.espresso:espresso-core:${Vers.androidxTestEspressoCoreVersion}") androidTestApi("androidx.test.ext:junit-ktx:1.1.5") androidTestApi("androidx.test.ext:junit:${Vers.androidxTestExtJunitVersion}") androidTestApi("androidx.test.ext:truth:1.5.0") androidTestApi("androidx.test:core-ktx:${Vers.testKtxVersion}") androidTestApi("androidx.test:core:${Vers.androidxTestVersion}") androidTestApi("androidx.test:runner:1.5.2") androidTestApi("org.jetbrains.kotlin:kotlin-test:${Vers.kotlinTestVersion}") androidTestApi("org.jetbrains.kotlinx:kotlinx-coroutines-test:${Vers.kotlinxCoroutinesVersion}") testApi("androidx.arch.core:core-testing:${Vers.archVersion}") testApi("junit:junit:${Vers.junitVersion}") testApi("org.jetbrains.kotlin:kotlin-test:${Vers.kotlinTestVersion}") testApi("org.jetbrains.kotlinx:kotlinx-coroutines-test:${Vers.kotlinxCoroutinesVersion}") // To use android test orchestrator androidTestUtil("androidx.test:orchestrator:1.4.2") testApi("com.squareup.okhttp3:mockwebserver:${Vers.okhttpVersion}") { exclude("com.squareup.okio", "okio") exclude("com.squareup.okhttp3", "okhttp") exclude("org.jetbrains.kotlin", "kotlin-stdlib-common") exclude("org.jetbrains.kotlin", "kotlin-stdlib") exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") } androidTestApi("com.squareup.okhttp3:mockwebserver:${Vers.okhttpVersion}") { exclude("com.squareup.okio", "okio") exclude("com.squareup.okhttp3", "okhttp") exclude("org.jetbrains.kotlin", "kotlin-stdlib-common") exclude("org.jetbrains.kotlin", "kotlin-stdlib") exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") } } repositories { mavenCentral() } fun willApplyGoogleService(): Boolean { val taskRequestsString = gradle.startParameter.taskRequests.toString() val isMatch = """(assemble|generate|connected)Fcm""".toRegex() .find(taskRequestsString) != null println("willApplyGoogleService=$isMatch. $taskRequestsString") return isMatch } if (willApplyGoogleService()) apply(plugin = "com.google.gms.google-services") tasks.register("detektAll") { description = "Custom DETEKT build for all modules" // activate all available (even unstable) rules. allRules = false // a way of suppressing issues before introducing detekt // baseline = file("$rootDir/config/detekt/baseline.xml") parallel = true ignoreFailures = false autoCorrect = false // preconfigure defaults buildUponDefaultConfig = true val configFile = files("$rootDir/config/detekt/config.yml") config.setFrom(configFile) val baselineFile = file("$rootDir/config/detekt/baseline.xml") if (baselineFile.isFile) { baseline.set(baselineFile) } setSource( files( "$rootDir/anko/src", "$rootDir/apng/src", "$rootDir/apng_android/src", "$rootDir/app/src", "$rootDir/base/src", "$rootDir/colorpicker/src", "$rootDir/emoji/src", "$rootDir/icon_material_symbols/src", "$rootDir/sample_apng/src", ) ) val resourceFiles = "**/resources/**" val buildFiles = "**/build/**" exclude(resourceFiles, buildFiles) reports { fun reportLocationByExt(ext: String) = layout.buildDirectory .file("reports/detekt/st-${name}.$ext") .get() .asFile txt.required.set(true) txt.outputLocation.set(reportLocationByExt("txt")) html.required.set(true) html.outputLocation.set(reportLocationByExt("html")) xml.required.set(false) xml.outputLocation.set(reportLocationByExt("xml")) sarif.required.set(false) sarif.outputLocation.set(reportLocationByExt("sarif")) } }