From 688d03ba8bc0d4ce8fc5d6ea6f9e4a336d7c35c5 Mon Sep 17 00:00:00 2001 From: Michatec Date: Thu, 9 Apr 2026 13:34:45 +0200 Subject: [PATCH] - Migrate build system to Kotlin DSL (`build.gradle.kts`, `settings.gradle.kts`) - Upgrade `compileSdk` and `targetSdk` to 36 - Add German (`de`) localization and string resources - Add Michachatz F-Droid repository to default list - Update dependencies and plugins in `libs.versions.toml` - Remove manual signing configuration from README.md - Refactor code to use non-deprecated `alpha` property and context-based string retrieval - Clean up `buildConfig` and locale filtering logic --- .gitignore | 4 +- README.md | 9 - build.gradle | 113 ------------ build.gradle.kts | 80 +++++++++ gradle/libs.versions.toml | 7 +- settings.gradle | 5 - settings.gradle.kts | 24 +++ .../com/michatec/store/entity/Repository.kt | 6 + .../store/graphics/DrawableWrapper.kt | 2 +- .../michatec/store/screen/ProductAdapter.kt | 7 +- .../com/michatec/store/utility/Utils.kt | 5 +- src/main/res/values-de/strings.xml | 164 ++++++++++++++++++ src/main/res/values/strings.xml | 1 + 13 files changed, 287 insertions(+), 140 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts create mode 100644 src/main/res/values-de/strings.xml diff --git a/.gitignore b/.gitignore index a1286d8..f5e5414 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ /* !/.gitignore -!/build.gradle -!/settings.gradle +!/build.gradle.kts +!/settings.gradle.kts !/COPYING !/extra !/gradle diff --git a/README.md b/README.md index cdddf61..55dcd7e 100644 --- a/README.md +++ b/README.md @@ -34,15 +34,6 @@ or sharing local repositories nearby. Specify your Android SDK path either using the `ANDROID_HOME` environment variable, or by filling out the `sdk.dir` property in `local.properties`. -Signing can be done automatically using `keystore.properties` as follows: - -```properties -store.file=/path/to/keystore -store.password=key-store-password -key.alias=key-alias -key.password=key-password -``` - Run `./gradlew assembleRelease` to build the package, which can be installed using the Android package manager. ## License diff --git a/build.gradle b/build.gradle deleted file mode 100644 index b5f03bf..0000000 --- a/build.gradle +++ /dev/null @@ -1,113 +0,0 @@ -buildscript { - repositories { - google() - mavenCentral() - maven { url 'https://jitpack.io' } - } - - dependencies { - classpath libs.gradle - classpath libs.kotlin.gradle.plugin - } -} - -apply plugin: 'com.android.application' - -android { - namespace 'com.michatec.store' - compileSdk 36 - - defaultConfig { - applicationId 'com.michatec.store' - minSdk 30 - targetSdk 36 - versionCode 17 - versionName '1.7' - - def languages = [ 'en' ] - buildConfigField 'String[]', 'LANGUAGES', '{ "' + languages.join('", "') + '" }' - resConfigs languages - } - - buildFeatures { - buildConfig = true - } - - sourceSets { - main { - java.srcDirs += 'src/main/kotlin' - } - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - - flavorDimensions "distributor" - productFlavors { - michas { - dimension "distributor" - buildConfigField "boolean", "FLAVOR_FDROID", "false" - } - fdroid { - dimension "distributor" - buildConfigField "boolean", "FLAVOR_FDROID", "true" - } - } - - buildTypes { - debug { - minifyEnabled false - shrinkResources false - } - release { - minifyEnabled true - shrinkResources false - } - } - - def keystorePropertiesFile = rootProject.file('keystore.properties') - if (keystorePropertiesFile.exists()) { - def keystoreProperties = new Properties() - keystoreProperties.load(keystorePropertiesFile.newDataInputStream()) - - def signing = [ - storeFile: keystoreProperties['store.file'], - storePassword: keystoreProperties['store.password'], - keyAlias: keystoreProperties['key.alias'], - keyPassword: keystoreProperties['key.password'] - ] - - if (!signing.any { _, v -> v == null }) { - signingConfigs { - primary { - storeFile file(signing.storeFile) - storePassword signing.storePassword - keyAlias signing.keyAlias - keyPassword signing.keyPassword - enableV2Signing false - } - } - } - } -} - -repositories { - google() - mavenCentral() - maven { url 'https://jitpack.io' } -} - -dependencies { - implementation libs.kotlin.stdlib - implementation libs.fragment.ktx - implementation libs.viewpager2 - implementation libs.vectordrawable - implementation libs.okhttp - implementation libs.rxjava - implementation libs.rxandroid - implementation libs.jackson.core - implementation libs.picasso - implementation libs.freedroidwarn -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..dcafe3f --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,80 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "com.michatec.store" + compileSdk = 36 + + defaultConfig { + applicationId = "com.michatec.store" + minSdk = 30 + targetSdk = 36 + versionCode = 18 + versionName = "1.8" + + val languages = listOf("en", "de") + buildConfigField("String[]", "LANGUAGES", "{ \"${languages.joinToString("\", \"")}\" }") + + @Suppress("UnstableApiUsage") + androidResources { + localeFilters += languages + } + } + + buildFeatures { + buildConfig = true + } + + sourceSets { + getByName("main") { + kotlin.directories += "src/main/kotlin" + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + flavorDimensions += "distributor" + productFlavors { + create("michas") { + dimension = "distributor" + buildConfigField("boolean", "FLAVOR_FDROID", "false") + } + create("fdroid") { + dimension = "distributor" + buildConfigField("boolean", "FLAVOR_FDROID", "true") + } + } + + buildTypes { + getByName("debug") { + isMinifyEnabled = false + isShrinkResources = false + } + getByName("release") { + isMinifyEnabled = true + isShrinkResources = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard.pro" + ) + } + } +} + +dependencies { + implementation(libs.kotlin.stdlib) + implementation(libs.core.ktx) + implementation(libs.fragment.ktx) + implementation(libs.viewpager2) + implementation(libs.vectordrawable) + implementation(libs.okhttp) + implementation(libs.rxjava) + implementation(libs.rxandroid) + implementation(libs.jackson.core) + implementation(libs.picasso) + implementation(libs.freedroidwarn) +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9ea8768..97a5a30 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] +core-ktx = "1.18.0" fragment-ktx = "1.8.9" freedroidwarn = "V1.10" gradle = "9.1.0" -gradle-toolchains-foojay-resolver-convention = "1.0.0" jackson-core = "2.21.2" kotlin = "2.3.20" okhttp = "5.3.2" @@ -13,11 +13,10 @@ vectordrawable = "1.2.0" viewpager2 = "1.1.0" [libraries] +core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment-ktx" } freedroidwarn = { group = "com.github.woheller69", name = "FreeDroidWarn", version.ref = "freedroidwarn" } -gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } jackson-core = { group = "com.fasterxml.jackson.core", name = "jackson-core", version.ref = "jackson-core" } -kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } picasso = { group = "com.squareup.picasso", name = "picasso", version.ref = "picasso" } @@ -27,4 +26,4 @@ vectordrawable = { group = "androidx.vectordrawable", name = "vectordrawable", v viewpager2 = { group = "androidx.viewpager2", name = "viewpager2", version.ref = "viewpager2" } [plugins] -foojay = { id = "org.gradle.toolchains.foojay-resolver-convention", version.ref = "gradle-toolchains-foojay-resolver-convention" } +android-application = { id = "com.android.application", version.ref = "gradle" } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 6cf5f51..0000000 --- a/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -plugins { - id "org.gradle.toolchains.foojay-resolver-convention" version "1.0.0" -} -rootProject.name = "michas-droid" -include ':' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..27a81ac --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} + +@Suppress("UnstableApiUsage") +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url = uri("https://jitpack.io") } + } +} + +rootProject.name = "michas-droid" +include(":") diff --git a/src/main/kotlin/com/michatec/store/entity/Repository.kt b/src/main/kotlin/com/michatec/store/entity/Repository.kt index 51e9c57..fdf34e0 100644 --- a/src/main/kotlin/com/michatec/store/entity/Repository.kt +++ b/src/main/kotlin/com/michatec/store/entity/Repository.kt @@ -89,6 +89,12 @@ data class Repository( "Michachatz official repository. Everything in this repository is always built from the source code.", 21, true, "3546DCBDD900F280EE2161CC163C1156BE2C2F3EB810415115039E0C7D3242C0", "" ), + if (isFdroid) null else defaultRepository( + "https://repo.dgplayser.duckdns.org/fdroid/archive", + "Michachatz F-Droid Repo", + "Michachatz official repository. Everything in this repository is always built from the source code.", + 21, true, "3546DCBDD900F280EE2161CC163C1156BE2C2F3EB810415115039E0C7D3242C0 ", "" + ), defaultRepository( "https://f-droid.org/repo", "F-Droid", diff --git a/src/main/kotlin/com/michatec/store/graphics/DrawableWrapper.kt b/src/main/kotlin/com/michatec/store/graphics/DrawableWrapper.kt index 9a9e212..1e6926c 100644 --- a/src/main/kotlin/com/michatec/store/graphics/DrawableWrapper.kt +++ b/src/main/kotlin/com/michatec/store/graphics/DrawableWrapper.kt @@ -39,7 +39,7 @@ open class DrawableWrapper(val drawable: Drawable): Drawable() { } override fun getAlpha(): Int { - return DrawableCompat.getAlpha(drawable) + return drawable.alpha } override fun setAlpha(alpha: Int) { diff --git a/src/main/kotlin/com/michatec/store/screen/ProductAdapter.kt b/src/main/kotlin/com/michatec/store/screen/ProductAdapter.kt index 533d9b6..06d65df 100644 --- a/src/main/kotlin/com/michatec/store/screen/ProductAdapter.kt +++ b/src/main/kotlin/com/michatec/store/screen/ProductAdapter.kt @@ -35,6 +35,7 @@ import android.widget.ProgressBar import android.widget.Switch import android.widget.TextView import android.widget.Toast +import androidx.core.content.ContextCompat.getString import androidx.core.graphics.ColorUtils import androidx.core.text.HtmlCompat import androidx.core.text.util.LinkifyCompat @@ -373,7 +374,6 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) } } - @SuppressLint("SetTextI18n") private class LinkViewHolder(itemView: View): OverlappingViewHolder(itemView) { companion object { private val measurement = Measurement() @@ -385,7 +385,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) init { val margin = measurement.invalidate(itemView.resources) { - text.text = "measure" + text.text = itemView.context.getString(R.string.measure) link.visibility = View.GONE measurement.measure(itemView) ((itemView.measuredHeight - icon.measuredHeight) / 2f).roundToInt() @@ -397,7 +397,6 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) } } - @SuppressLint("SetTextI18n") private class PermissionsViewHolder(itemView: View): OverlappingViewHolder(itemView) { companion object { private val measurement = Measurement() @@ -408,7 +407,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) init { val margin = measurement.invalidate(itemView.resources) { - text.text = "measure" + text.text = itemView.context.getString(R.string.measure) measurement.measure(itemView) ((itemView.measuredHeight - icon.measuredHeight) / 2f).roundToInt() } diff --git a/src/main/kotlin/com/michatec/store/utility/Utils.kt b/src/main/kotlin/com/michatec/store/utility/Utils.kt index 9146604..6141009 100644 --- a/src/main/kotlin/com/michatec/store/utility/Utils.kt +++ b/src/main/kotlin/com/michatec/store/utility/Utils.kt @@ -75,8 +75,9 @@ object Utils { .filter { it.language in supportedLanguages } .let { it.ifEmpty { listOf(Locale.US) } } Locale.setDefault(compatibleLocales.first()) - val newConfiguration = Configuration(configuration) - newConfiguration.setLocales(LocaleList(*compatibleLocales.toTypedArray())) + val newConfiguration = Configuration(configuration).apply { + setLocales(LocaleList(*compatibleLocales.toTypedArray())) + } return context.createConfigurationContext(newConfiguration) } diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..3c7d0c1 --- /dev/null +++ b/src/main/res/values-de/strings.xml @@ -0,0 +1,164 @@ + + + + Aktion fehlgeschlagen + Repository hinzufügen + Adresse + Alle Anwendungen + Alle Anwendungen sind aktuell + Existiert bereits + Immer + Anti-Funktionen + Anwendung + Anwendung nicht gefunden + E-Mail des Autors + Website des Autors + Verfügbar + Fehlerverfolgung + Abbrechen + Repository kann nicht bearbeitet werden, da es gerade synchronisiert wird. + Änderungsprotokoll + Änderungen + Repository wird überprüft + Für Debugging kompiliert + Bestätigung + Verbinden + Enthält nicht-freie Medien + Konnte %s nicht herunterladen + Konnte %s nicht synchronisieren + Konnte %s nicht validieren + Dunkel + Hinzugefügt am + Löschen + Möchtest du das Repository wirklich löschen? + Beschreibung + Details + Spenden + Heruntergeladen: %s + Wird heruntergeladen + Lade %s herunter + Repository bearbeiten + Ungültiges Dateiformat. + Fingerabdruck + Enthält Werbung + Hat nicht-freie Abhängigkeiten + Hat Sicherheitslücken + Ungültige Serverantwort. + HTTP-Proxy + Alle Updates ignorieren + Dieses Update ignorieren + Dein %1$s (API-Version %2$d) wird nicht unterstützt. %3$s + Maximale API-Version ist %d. + Minimale API-Version ist %d. + Fehlende Funktionen. + Diese Version ist älter als die auf deinem Gerät installierte. Bitte deinstalliere diese zuerst. + Deine %1$s-Plattform wird nicht unterstützt. Unterstützte Plattformen: %2$s. + Diese Version wurde mit einem anderen Zertifikat signiert als die auf deinem Gerät installierte. Bitte deinstalliere diese zuerst. + Inkompatible Version + Inkompatible Versionen + Zeige Versionen, die nicht mit dem Gerät kompatibel sind + Nicht kompatibel mit %s + Installieren + Installiert + Integrität konnte nicht überprüft werden. + Ungültige Adresse + Ungültiges Fingerabdruckformat + Ungültige Metadaten. + Ungültige Berechtigungen. + Ungültige Signatur. + Ungültiges Benutzername-Format + Letztes Update + Starten + Lizenz + Lizenz %s + Hell + Link in die Zwischenablage kopiert + Links + Füge %s zusammen + Name + Netzwerkfehler. + Nie + Neue Updates verfügbar + + %d neues Update. + %d neue Updates. + + Keine Anwendungen verfügbar + Keine Anwendungen installiert + Keine Beschreibung verfügbar. + Keine passenden Anwendungen gefunden + Kein Proxy + Über Updates benachrichtigen + Benachrichtigung anzeigen, wenn Updates verfügbar sind + Anzahl der Anwendungen + OK + Nur kompatibel mit %s + Nur über WLAN + %s öffnen? + Andere + Indexdatei konnte nicht verarbeitet werden. + Passwort + Passwort fehlt + Berechtigungen + +%d mehr + Einstellungen + Verarbeite %1$s + Projekt-Website + Fördert nicht-freie Netzwerkdienste + Fördert nicht-freie Software + Bereitgestellt von %s + Proxy + Proxy-Host + Proxy-Port + Proxy-Typ + Repositories + Repository + Dieses Repository wurde noch nicht verwendet. Du musst es aktivieren, um die Anwendungen zu sehen. + Nicht signiert. Die Anwendungsliste konnte nicht verifiziert werden. Sei vorsichtig beim Herunterladen. + Benötigt %s + Speichern + Speichere Details + Screenshots + Suchen + Mirror auswählen + Mehr anzeigen + Ältere Versionen anzeigen + Signatur %s + Mit unsicherem Algorithmus signiert + Überspringen + SOCKS-Proxy + Sortierreihenfolge + Quellcode + Quellcode nicht mehr verfügbar + Empfohlen + Repositories synchronisieren + Repositories automatisch synchronisieren + Synchronisiere + Synchronisiere %s + System + Tippen zum Installieren. + Design + Verfolgt oder meldet deine Aktivitäten + Deinstallieren + Unbekannt + Unbekannter Fehler. + Unbekannt: %s + Nicht signiert + Instabile Updates + Instabile Versionen vorschlagen + Nicht verifiziert + Aktualisieren + Updates + Quellcode ist nicht frei verfügbar + Benutzername + Benutzername fehlt + Index konnte nicht validiert werden. + Version %s + Versionen + Warte auf Start des Downloads + Website + Die Repository-Adresse wurde zu %s weitergeleitet. Möchtest du diese verwenden? + Credits an Michatec + Dies ist ein Fork von github.com/kitsunyan/foxy-droid. + + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 75624d1..e7d6f4a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -166,5 +166,6 @@ The repository address was redirected to %s. Do you want to use it instead? Credits to Michatec This is a fork from github.com/kitsunyan/foxy-droid. + measure