plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.ksp) alias(libs.plugins.hilt) } android { namespace = "dev.privacyllc.period" // compileSdk and targetSdk are deliberately different. compileSdk 37 is what // the current AndroidX libraries require to compile against; targetSdk 36 is // Google Play's floor for new apps from 2026-08-31 and is what the app opts // into at runtime. Raising targetSdk opts in to behaviour changes and is a // tested decision, not a build fix. compileSdk = 37 defaultConfig { applicationId = "dev.privacyllc.period" minSdk = 26 // Google Play requires API 36 for new apps and updates from 2026-08-31. // Confirm the current requirement at submission time rather than here. // Lint warns (OldTargetApi) that 37 exists. Staying at 36 is the // decision: it is Play's floor, and raising targetSdk opts the app into // runtime behaviour changes that nothing here has been tested against. // Revisit with a QA round, not with a lint fix. targetSdk = 36 versionCode = 1 versionName = "0.1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } debug { applicationIdSuffix = ".debug" } } buildFeatures { compose = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } packaging { resources.excludes += "/META-INF/{AL2.0,LGPL2.1}" } } dependencies { implementation(project(":core:designsystem")) implementation(project(":core:data")) implementation(project(":core:datastore")) implementation(project(":core:notifications")) implementation(project(":core:security")) implementation(project(":domain:cycle")) implementation(project(":domain:prediction")) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.activity.compose) implementation(libs.androidx.navigation.compose) implementation(libs.kotlinx.coroutines.core) implementation(platform(libs.compose.bom)) implementation(libs.compose.ui) implementation(libs.compose.ui.graphics) implementation(libs.compose.ui.tooling.preview) implementation(libs.compose.material3) implementation(libs.compose.material.icons.extended) debugImplementation(libs.compose.ui.tooling) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) implementation(libs.androidx.hilt.work) implementation(libs.androidx.work.runtime) implementation(libs.androidx.biometric) // Pinned so MainActivity's FragmentActivity comes from a current fragment // rather than the 1.5.1 that androidx.biometric 1.1.0's graph settles on. implementation(libs.androidx.fragment) ksp(libs.hilt.compiler) ksp(libs.androidx.hilt.compiler) testImplementation(libs.junit) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.robolectric) testImplementation(libs.androidx.test.core) androidTestImplementation(libs.androidx.test.junit) androidTestImplementation(libs.androidx.espresso.core) }