plugins { id("com.android.application") id("org.jetbrains.kotlin.android") version "2.1.0" id("org.jetbrains.kotlin.plugin.compose") version "2.1.0" } android { namespace = "ma.tkgraph.xtreamtv" compileSdk = 36 defaultConfig { applicationId = "ma.tkgraph.xtreamtv" minSdk = 30 targetSdk = 36 versionCode = 23 versionName = "2.0.23-login-success-nav" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { debug { isMinifyEnabled = false buildConfigField("boolean", "ENABLE_LOGGING", "true") } release { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) buildConfigField("boolean", "ENABLE_LOGGING", "false") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } } buildFeatures { compose = true buildConfig = true } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { // --- Compose / TV --- val composeBom = platform("androidx.compose:compose-bom:2024.12.01") implementation(composeBom) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") implementation("androidx.compose.material:material-icons-extended") implementation("androidx.tv:tv-material:1.0.0") implementation("androidx.tv:tv-foundation:1.0.0") // --- Activity / Lifecycle --- implementation("androidx.activity:activity-compose:1.9.3") implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7") // --- Media3 ExoPlayer --- implementation("androidx.media3:media3-exoplayer:1.5.1") implementation("androidx.media3:media3-exoplayer-hls:1.5.1") implementation("androidx.media3:media3-exoplayer-dash:1.5.1") implementation("androidx.media3:media3-ui:1.5.1") implementation("androidx.media3:media3-session:1.5.1") // --- Network --- implementation("com.squareup.retrofit2:retrofit:2.11.0") implementation("com.squareup.retrofit2:converter-gson:2.11.0") implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") // --- Images --- implementation("io.coil-kt.coil3:coil-compose:3.0.4") implementation("io.coil-kt.coil3:coil-network-okhttp:3.0.4") // --- Security (EncryptedSharedPreferences) --- implementation("androidx.security:security-crypto:1.1.0-alpha06") // --- EPG Cache (Room) --- implementation("androidx.room:room-runtime:2.6.1") implementation("androidx.room:room-ktx:2.6.1") annotationProcessor("androidx.room:room-compiler:2.6.1") // --- Logging --- implementation("com.jakewharton.timber:timber:5.0.1") // --- Core --- implementation("androidx.core:core-ktx:1.15.0") implementation("androidx.leanback:leanback:1.2.0-alpha04") // ========== TESTS ========== // Unit tests testImplementation("org.junit.jupiter:junit-jupiter:5.11.4") testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0") testImplementation("io.mockk:mockk:1.13.14") testImplementation("app.cash.turbine:turbine:1.2.0") // Android / UI tests androidTestImplementation(composeBom) androidTestImplementation("androidx.compose.ui:ui-test-junit4") androidTestImplementation("androidx.test.ext:junit:1.2.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") androidTestImplementation("androidx.test:runner:1.6.2") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") }