Compare commits
91 commits
fm/tv-cond
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f37ad0f0fe | |||
| 92c5661be0 | |||
| b9ea593735 | |||
| 711dbebf28 | |||
| 6e0f9952cf | |||
| c17447c528 | |||
| 9e15dbee8c | |||
| 53b8358317 | |||
| 5a84666074 | |||
| 22850632ec | |||
| afff383b75 | |||
| d401ebc355 | |||
| e794dec253 | |||
| 4e6377b628 | |||
| e9a92eba49 | |||
| 81073c410d | |||
| 04b1bdd6aa | |||
| bfe3dbbb16 | |||
| ec32346c71 | |||
| 34ea983a51 | |||
| 09f1d72f30 | |||
| 78322f588a | |||
| a00db96dc8 | |||
| 71a055987c | |||
| 844530404d | |||
| 59c2728d9c | |||
| f53defad90 | |||
| abec496305 | |||
| a01c0a78fb | |||
| cd625b4227 | |||
| fc02ce8646 | |||
| 2fdd459037 | |||
| 9dd321f07e | |||
| 061670848f | |||
| 575103ce98 | |||
| e243894a20 | |||
| 86d3432fb0 | |||
| 43ae716157 | |||
| 5033c171cb | |||
| 130697c2eb | |||
| 4cd75cfa26 | |||
| bfd4002dd1 | |||
| 1c77f21df3 | |||
| a8951827ba | |||
| e99ed2d394 | |||
| 924c90a9e0 | |||
| 1299034991 | |||
| 9c8fceb18c | |||
| b8d5d8a124 | |||
| 14a74ac43b | |||
| d9578ac405 | |||
| 4e62aad638 | |||
| b1b15b384b | |||
| c1559e2513 | |||
| 3bfb8cd779 | |||
| 439eea3ff8 | |||
| fc7eb94cc1 | |||
| 03ff22ea86 | |||
| 5b0703aec5 | |||
| 96538f3c7a | |||
| b54bcc148c | |||
| 0ca13e684f | |||
| 6d7df0fb19 | |||
| 321f2d41bb | |||
| 90e956b157 | |||
| 2b65ee7b53 | |||
| 60a0da13a2 | |||
| 5a0497c9ec | |||
| 6f430439a6 | |||
| 4b28b4f044 | |||
| 3b7249888f | |||
| e5bb4ec47f | |||
| 7a878b2d81 | |||
| b24c404cc8 | |||
| a6dd04f390 | |||
| 74033ee1da | |||
| 7e8e232d47 | |||
| c534ea75c2 | |||
| 6a02887dc9 | |||
| 0c94e8f910 | |||
| c07bb2ca1d | |||
| 0db05174b1 | |||
| 0fd0ec035d | |||
| 3da635b4cb | |||
| 27fd174aed | |||
| 2ea9301069 | |||
| 380c423376 | |||
| 4b89a73908 | |||
| 9be55c570a | |||
| f60a22e435 | |||
| 2be4e30826 |
|
|
@ -1,3 +1,4 @@
|
||||||
|
import com.android.build.api.artifact.SingleArtifact
|
||||||
import com.android.build.api.dsl.ApplicationExtension
|
import com.android.build.api.dsl.ApplicationExtension
|
||||||
import com.android.build.api.dsl.ProductFlavor
|
import com.android.build.api.dsl.ProductFlavor
|
||||||
import com.android.build.api.variant.FilterConfiguration
|
import com.android.build.api.variant.FilterConfiguration
|
||||||
|
|
@ -5,6 +6,7 @@ import com.google.protobuf.gradle.id
|
||||||
import com.mikepenz.aboutlibraries.plugin.DuplicateMode
|
import com.mikepenz.aboutlibraries.plugin.DuplicateMode
|
||||||
import com.mikepenz.aboutlibraries.plugin.DuplicateRule
|
import com.mikepenz.aboutlibraries.plugin.DuplicateRule
|
||||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||||
|
import java.io.File
|
||||||
import java.util.Base64
|
import java.util.Base64
|
||||||
import java.util.Properties
|
import java.util.Properties
|
||||||
|
|
||||||
|
|
@ -80,6 +82,7 @@ configure<ApplicationExtension> {
|
||||||
testInstrumentationRunner = "com.github.damontecres.wholphin.test.WholphinTestRunner"
|
testInstrumentationRunner = "com.github.damontecres.wholphin.test.WholphinTestRunner"
|
||||||
|
|
||||||
buildConfigField("long", "BUILD_TIME", System.currentTimeMillis().toString())
|
buildConfigField("long", "BUILD_TIME", System.currentTimeMillis().toString())
|
||||||
|
buildConfigField("String", "CONDUCTARR_BASE_URL", "\"https://wolfskin-tv.justinvisser.org\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
|
|
@ -194,6 +197,7 @@ configure<ApplicationExtension> {
|
||||||
sourceSets {
|
sourceSets {
|
||||||
getByName("main") {
|
getByName("main") {
|
||||||
kotlin.directories += "$buildDir/generated/seerr_api/src/main/kotlin"
|
kotlin.directories += "$buildDir/generated/seerr_api/src/main/kotlin"
|
||||||
|
kotlin.directories += "src/wolfskin/java"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -224,6 +228,47 @@ androidComponents {
|
||||||
"Wholphin-${variant.flavorName}-${variant.buildType}-${output.versionName.get()}-${output.versionCode.get()}$abi.apk"
|
"Wholphin-${variant.flavorName}-${variant.buildType}-${output.versionName.get()}-${output.versionCode.get()}$abi.apk"
|
||||||
output.outputFileName = outputFileName
|
output.outputFileName = outputFileName
|
||||||
}
|
}
|
||||||
|
if (variant.name == "defaultDebug") {
|
||||||
|
val packagedApks = variant.artifacts.get(SingleArtifact.APK)
|
||||||
|
val artifactLoader = variant.artifacts.getBuiltArtifactsLoader()
|
||||||
|
val aapt2 = sdkComponents.aapt2.flatMap { it.executable }
|
||||||
|
val checkWolfskinBranding = tasks.register("checkWolfskinBranding") {
|
||||||
|
inputs.dir(packagedApks)
|
||||||
|
inputs.file(aapt2)
|
||||||
|
doLast {
|
||||||
|
val artifacts = checkNotNull(artifactLoader.load(packagedApks.get())) {
|
||||||
|
"Packaged default/debug APK metadata was not found; branding is unverified"
|
||||||
|
}.elements
|
||||||
|
check(artifacts.isNotEmpty()) { "No default/debug APKs were found; branding is unverified" }
|
||||||
|
val header = Regex("""^\s*resource 0x[\da-fA-F]+ (?:[^\s:]+:)?([^\s/]+)/([^\s]+)""")
|
||||||
|
val visibleTypes = setOf("string", "plurals", "array")
|
||||||
|
// Upstream legal attribution and its project URL must survive the branding cutover.
|
||||||
|
val legalNames = setOf("wolfskin_upstream_credit", "wolfskin_upstream_url")
|
||||||
|
val violations = sortedSetOf<String>()
|
||||||
|
artifacts.forEach { artifact ->
|
||||||
|
val dump = providers.exec {
|
||||||
|
commandLine(aapt2.get().asFile, "dump", "resources", artifact.outputFile)
|
||||||
|
}.standardOutput.asText.get()
|
||||||
|
var currentName: String? = null
|
||||||
|
var inspected = 0
|
||||||
|
dump.lineSequence().forEach { line ->
|
||||||
|
val resource = header.find(line)
|
||||||
|
if (resource != null) {
|
||||||
|
currentName = resource.groupValues[2].takeIf { resource.groupValues[1] in visibleTypes }
|
||||||
|
if (currentName != null) inspected++
|
||||||
|
} else if (currentName != null && currentName !in legalNames && line.contains("Wholphin", ignoreCase = true)) {
|
||||||
|
violations += "${File(artifact.outputFile).name}:$currentName"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
check(inspected > 0) { "No packaged string resources were decoded; branding is unverified" }
|
||||||
|
logger.lifecycle("Inspected $inspected string/plural/array resources in ${File(artifact.outputFile).name}")
|
||||||
|
}
|
||||||
|
check(violations.isEmpty()) { "User-visible upstream branding remains: ${violations.joinToString()}" }
|
||||||
|
logger.lifecycle("Wolfskin branding check passed (${artifacts.size} packaged debug APKs; legal attribution preserved)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tasks.matching { it.name == "assembleDefaultDebug" }.configureEach { dependsOn(checkWolfskinBranding) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -288,6 +333,7 @@ tasks.named("preBuild") {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(":wolfskin-design"))
|
||||||
implementation(project(":conductarr-client"))
|
implementation(project(":conductarr-client"))
|
||||||
implementation(libs.androidx.core.ktx)
|
implementation(libs.androidx.core.ktx)
|
||||||
implementation(libs.androidx.appcompat)
|
implementation(libs.androidx.appcompat)
|
||||||
|
|
@ -403,12 +449,23 @@ dependencies {
|
||||||
testImplementation(libs.mockk.android)
|
testImplementation(libs.mockk.android)
|
||||||
testImplementation(libs.mockk.agent)
|
testImplementation(libs.mockk.agent)
|
||||||
testImplementation(libs.kotlinx.coroutines.test)
|
testImplementation(libs.kotlinx.coroutines.test)
|
||||||
|
testImplementation("com.squareup.okhttp3:mockwebserver3")
|
||||||
testImplementation(libs.androidx.core.testing)
|
testImplementation(libs.androidx.core.testing)
|
||||||
testImplementation(libs.robolectric)
|
testImplementation(libs.robolectric)
|
||||||
testImplementation(libs.hilt.android.testing)
|
testImplementation(libs.hilt.android.testing)
|
||||||
testImplementation(libs.androidx.compose.ui.test.junit4)
|
testImplementation(libs.androidx.compose.ui.test.junit4)
|
||||||
|
testImplementation("io.github.takahirom.roborazzi:roborazzi:1.77.0")
|
||||||
|
testImplementation("io.github.takahirom.roborazzi:roborazzi-compose:1.77.0")
|
||||||
androidTestImplementation(platform(libs.androidx.compose.bom))
|
androidTestImplementation(platform(libs.androidx.compose.bom))
|
||||||
androidTestImplementation(libs.mockk.android)
|
androidTestImplementation(libs.mockk.android)
|
||||||
androidTestImplementation(libs.hilt.android.testing)
|
androidTestImplementation(libs.hilt.android.testing)
|
||||||
androidTestImplementation(libs.androidx.compose.ui.test.manifest)
|
androidTestImplementation(libs.androidx.compose.ui.test.manifest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.withType<Test>().configureEach {
|
||||||
|
dependsOn(":wolfskin-design:testDebugUnitTest")
|
||||||
|
systemProperty("robolectric.dependency.dir", project(":wolfskin-design").layout.buildDirectory.dir("robolectric-sdk").get().asFile.absolutePath)
|
||||||
|
systemProperty("robolectric.offline", "true")
|
||||||
|
systemProperty("roborazzi.test.record", "true")
|
||||||
|
systemProperty("wolfskin.captureDirectory", rootProject.layout.buildDirectory.dir("wolfskin-captures").get().asFile.absolutePath)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 37 KiB |
BIN
app/src/debug/assets/library/assets/movie-awake-2007-poster.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 27 KiB |
BIN
app/src/debug/assets/library/assets/movie-blame-2017-poster.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 18 KiB |
BIN
app/src/debug/assets/library/assets/movie-drop-2025-poster.jpg
Normal file
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
app/src/debug/assets/library/assets/movie-easy-a-2010-poster.jpg
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 18 KiB |
BIN
app/src/debug/assets/library/assets/movie-faces-1968-poster.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
app/src/debug/assets/library/assets/movie-fatale-2020-poster.jpg
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 22 KiB |
BIN
app/src/debug/assets/library/assets/movie-locke-2014-poster.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 26 KiB |
BIN
app/src/debug/assets/library/assets/movie-mercy-2026-poster.jpg
Normal file
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 39 KiB |
BIN
app/src/debug/assets/library/assets/movie-normal-2026-poster.jpg
Normal file
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 15 KiB |
BIN
app/src/debug/assets/library/assets/movie-ponyo-2008-poster.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 28 KiB |
BIN
app/src/debug/assets/library/assets/movie-shaft-2000-poster.jpg
Normal file
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 28 KiB |