From 757783534c3853278268b109ba8d3f5bb09e8604 Mon Sep 17 00:00:00 2001 From: soraefir Date: Sat, 23 May 2026 11:20:16 +0200 Subject: [PATCH] Fix build, errors and spring cleaning --- app/build.gradle | 21 +++------- .../helcel/beans/activity/SettingsScreen.kt | 38 ++++++++++++------- .../helcel/beans/activity/StatsActivity.kt | 7 ++-- .../beans/activity/sub/EditPlaceScreen.kt | 29 +++++++------- .../beans/activity/sub/LicenseScreen.kt | 10 +++-- .../java/net/helcel/beans/countries/Group.kt | 1 + .../java/net/helcel/beans/helper/Groups.kt | 28 +++++++------- .../res/mipmap-anydpi/ic_launcher_round.xml | 1 + gradle.properties | 27 +------------ 9 files changed, 70 insertions(+), 92 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5573df7..246fdf7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,27 +1,25 @@ plugins { id 'com.android.application' - id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.plugin.serialization' version '2.3.21' id 'org.jetbrains.kotlin.plugin.compose' version '2.3.21' id 'com.mikepenz.aboutlibraries.plugin' version '14.2.0' } - android { namespace 'net.helcel.beans' - compileSdk 37 + compileSdk = 37 defaultConfig { buildConfigField("String", "APP_NAME", "\"Beans\"") manifestPlaceholders["APP_NAME"] = "Beans" applicationId 'net.helcel.beans' - minSdk 28 - targetSdk 36 + minSdk = 28 + targetSdk = 37 versionCode 4 versionName "1.1a" } signingConfigs { - create("release") { + register("release") { try { def keystorePropertiesFile = rootProject.file("app/keystore.properties") def keystoreProperties = new Properties() @@ -36,20 +34,18 @@ android { } } } - - buildTypes { debug { debuggable true } release { minifyEnabled true - shrinkResources false + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } signedRelease { minifyEnabled true - shrinkResources false + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig = signingConfigs.getByName("release") } @@ -78,10 +74,6 @@ android { kotlinCompilerExtensionVersion = "2.2.20" } - kotlin { - jvmToolchain(21) - } - lint { disable 'UsingMaterialAndMaterial3Libraries' } @@ -91,7 +83,6 @@ aboutLibraries { library { exclusionPatterns = [~"androidx.*", ~"com.google.android.*", ~"org.jetbrains.*"] } - excludeFields = ["generated"] } dependencies { diff --git a/app/src/main/java/net/helcel/beans/activity/SettingsScreen.kt b/app/src/main/java/net/helcel/beans/activity/SettingsScreen.kt index 50a6b85..3af4eb5 100644 --- a/app/src/main/java/net/helcel/beans/activity/SettingsScreen.kt +++ b/app/src/main/java/net/helcel/beans/activity/SettingsScreen.kt @@ -152,11 +152,17 @@ fun SettingsMainScreen(onExit: ()->Unit = {}) { fun SettingsScreen(navController: NavHostController = settingsNav()) { val context = LocalContext.current val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val keyTheme = stringResource(R.string.key_theme) + val defaultTheme = stringResource(R.string.system) + val keyProjection = stringResource(R.string.key_projection) + val keyGroup = stringResource(R.string.key_group) + val offString = stringResource(R.string.off) + var showEdit by remember { mutableStateOf(false) } - var theme by remember { mutableStateOf(prefs.getString(context.getString(R.string.key_theme), context.getString(R.string.system))!!) } - var projection by remember { mutableStateOf(prefs.getString(context.getString(R.string.key_projection), "default")!!) } - var groups by remember { mutableStateOf(prefs.getString(context.getString(R.string.key_group), context.getString(R.string.off))!!) } + var theme by remember { mutableStateOf(prefs.getString(keyTheme, defaultTheme)!!) } + var projection by remember { mutableStateOf(prefs.getString(keyProjection, "default")!!) } + var groups by remember { mutableStateOf(prefs.getString(keyGroup,offString)!!) } if(showEdit) EditPlaceDialog(true) { @@ -179,7 +185,7 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) { ) MultiPreference(arrayOf(stringResource(R.string.system),stringResource(R.string.light),stringResource(R.string.dark)), theme) { newTheme -> theme = newTheme - prefs.edit { putString(context.getString(R.string.key_theme), newTheme) } + prefs.edit { putString(keyTheme, newTheme) } } HorizontalDivider() } @@ -192,7 +198,7 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) { ) MultiPreference(arrayOf(stringResource(R.string.mercator), stringResource(R.string.azimuthalequidistant)), projection) { newProj -> projection = newProj - prefs.edit { putString(context.getString(R.string.key_projection), newProj) } + prefs.edit { putString(keyProjection, newProj) } Settings.refreshProjection() } HorizontalDivider() @@ -219,11 +225,11 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) { arrayOf(stringResource(R.string.on), stringResource(R.string.off)), groups ) { key -> - if (key == context.getString(R.string.off)) { + if (key == offString) { showDialog=true } groups = key - prefs.edit { putString(context.getString(R.string.key_group), key) } + prefs.edit { putString(keyGroup, key) } } HorizontalDivider() } @@ -283,9 +289,13 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) { @Composable fun RegionalScreen() { val context = LocalContext.current + + val keyRegional = stringResource(R.string.key_regional) + val offString = stringResource(R.string.off) + val onString = stringResource(R.string.on) val prefs = PreferenceManager.getDefaultSharedPreferences(context) - var selected by remember { mutableStateOf(prefs.getString(context.getString(R.string.key_regional),context.getString(R.string.off))!!)} - var regional by remember{ mutableStateOf(prefs.getString(context.getString(R.string.key_regional), context.getString(R.string.off))!!)} + var selected by remember { mutableStateOf(prefs.getString(keyRegional, offString)!!)} + var regional by remember{ mutableStateOf(prefs.getString(keyRegional, offString)!!)} var showDialog by remember{mutableStateOf(false)} var showLoad by remember{mutableStateOf(false)} @@ -305,7 +315,7 @@ fun RegionalScreen() { regional= selected prefs.edit { putString( - context.getString(R.string.key_regional), + keyRegional, regional ) } @@ -332,12 +342,12 @@ fun RegionalScreen() { val scope = rememberCoroutineScope() MultiPreference(arrayOf(stringResource(R.string.on),stringResource(R.string.off)),regional) { key -> when (key) { - context.getString(R.string.off) -> { showDialog=true + offString -> { showDialog=true selected=key } - context.getString(R.string.on) -> { + onString -> { regional = key - prefs.edit { putString(context.getString(R.string.key_regional), key) } + prefs.edit { putString(keyRegional, key) } showLoad=true scope.launch { withContext(Dispatchers.IO) { @@ -354,7 +364,7 @@ fun RegionalScreen() { @Composable fun MultiPreference(list: Array, selected: String, onSelected: (String) -> Unit) { Column(Modifier.padding(2.dp)) { - list.map { value -> + list.forEach { value -> Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier diff --git a/app/src/main/java/net/helcel/beans/activity/StatsActivity.kt b/app/src/main/java/net/helcel/beans/activity/StatsActivity.kt index 0f01c2d..f883246 100644 --- a/app/src/main/java/net/helcel/beans/activity/StatsActivity.kt +++ b/app/src/main/java/net/helcel/beans/activity/StatsActivity.kt @@ -115,7 +115,6 @@ fun StatsList(activeMode: LocType, countMode: Boolean) { @Composable fun StatsRow(group: Groups.Group, activeMode: LocType, countMode: Boolean) { - val context = LocalContext.current val visited = remember(group, activeMode) { Data.visits.getVisitedByValue(group.key) @@ -124,18 +123,18 @@ fun StatsRow(group: Groups.Group, activeMode: LocType, countMode: Boolean) { val count = when (activeMode) { LocType.WORLD -> World.WWW.children.filter { it.code in visited }.size LocType.COUNTRY -> World.WWW.children.flatMap { it.children.filter { c -> c.code in visited } }.size - LocType.STATE -> World.WWW.children.flatMap { itc->itc.children.flatMap { it.children.filter { it.code in visited } } }.size + LocType.STATE -> World.WWW.children.flatMap { a->a.children.flatMap { b->b.children.filter { c->c.code in visited } } }.size else -> 0 } val area = when (activeMode) { LocType.WORLD -> World.WWW.children.filter { it.code in visited }.sumOf { it.area } LocType.COUNTRY -> World.WWW.children.flatMap { it.children.filter { c -> c.code in visited } }.sumOf { it.area } - LocType.STATE -> World.WWW.children.flatMap { it.children.flatMap { it.children.filter { it.code in visited } } }.sumOf { it.area } + LocType.STATE -> World.WWW.children.flatMap { a->a.children.flatMap { b->b.children.filter { c->c.code in visited } } }.sumOf { it.area } else -> 0 } - val displayValue = if (countMode) count.toString() else context.getString(R.string.number_with_unit, area, "km²") + val displayValue = if (countMode) count.toString() else stringResource(R.string.number_with_unit, area, "km²") val backgroundColor = group.color.color val textColor = getContrastColor(backgroundColor) diff --git a/app/src/main/java/net/helcel/beans/activity/sub/EditPlaceScreen.kt b/app/src/main/java/net/helcel/beans/activity/sub/EditPlaceScreen.kt index 6c249ea..e82f94c 100644 --- a/app/src/main/java/net/helcel/beans/activity/sub/EditPlaceScreen.kt +++ b/app/src/main/java/net/helcel/beans/activity/sub/EditPlaceScreen.kt @@ -58,7 +58,7 @@ fun syncVisited(loc: GeoLoc?=World.WWW){ loc?.children?.forEach { tt -> tt.children.forEach {itc-> if(Data.visits.getVisited(itc) in listOf(AUTO_GROUP,NO_GROUP)) { - if(itc.children.any { itcc -> Data.visits.getVisited(itcc) != NO_GROUP }) + if(itc.children.any { c -> Data.visits.getVisited(c) != NO_GROUP }) Data.visits.setVisited(itc, AUTO_GROUP) else Data.visits.setVisited(itc, NO_GROUP) @@ -111,21 +111,20 @@ fun EditPlaceScreen(loc: GeoLoc, onExit:()->Unit={}) { Column { val currentTab = tabs.getOrNull(selectedTab) ?: return@Column - TabRow( - selectedTabIndex = min(tabs.lastIndex, selectedTab), - ) { - tabs.forEachIndexed { index, tab -> - Tab( - selected = selectedTab == index, - onClick = { - while (tabs.size > index + 1) - tabs.removeAt(tabs.lastIndex) - }, - text = { Text(tab.fullName) } - ) - } + TabRow( + selectedTabIndex = min(tabs.lastIndex, selectedTab), + ) { + tabs.forEachIndexed { index, tab -> + Tab( + selected = selectedTab == index, + onClick = { + while (tabs.size > index + 1) + tabs.removeAt(tabs.lastIndex) + }, + text = { Text(tab.fullName) } + ) } - + } LazyColumn( modifier = Modifier.fillMaxSize() diff --git a/app/src/main/java/net/helcel/beans/activity/sub/LicenseScreen.kt b/app/src/main/java/net/helcel/beans/activity/sub/LicenseScreen.kt index 36b1b71..3c6dbb8 100644 --- a/app/src/main/java/net/helcel/beans/activity/sub/LicenseScreen.kt +++ b/app/src/main/java/net/helcel/beans/activity/sub/LicenseScreen.kt @@ -7,7 +7,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.mikepenz.aboutlibraries.ui.compose.DefaultChipColors import com.mikepenz.aboutlibraries.ui.compose.DefaultLibraryColors -import com.mikepenz.aboutlibraries.ui.compose.android.rememberLibraries +import com.mikepenz.aboutlibraries.ui.compose.android.produceLibraries import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer import net.helcel.beans.R import net.helcel.beans.activity.SysTheme @@ -16,14 +16,14 @@ import net.helcel.beans.activity.SysTheme @Preview @Composable fun LicenseScreen() { - val libraries = rememberLibraries(R.raw.aboutlibraries) + val libraries = produceLibraries(R.raw.aboutlibraries) SysTheme { LibrariesContainer( libraries = libraries.value, modifier = Modifier.fillMaxSize(), colors = DefaultLibraryColors( - backgroundColor = MaterialTheme.colors.background, - contentColor = MaterialTheme.colors.onBackground, + libraryBackgroundColor = MaterialTheme.colors.background, + libraryContentColor = MaterialTheme.colors.onBackground, licenseChipColors = DefaultChipColors( containerColor = MaterialTheme.colors.primary, contentColor = MaterialTheme.colors.onPrimary, @@ -37,6 +37,8 @@ fun LicenseScreen() { contentColor = MaterialTheme.colors.onSecondary, ), dialogConfirmButtonColor = MaterialTheme.colors.primary, + dialogBackgroundColor = MaterialTheme.colors.onPrimary, + dialogContentColor = MaterialTheme.colors.primary, ) ) } diff --git a/app/src/main/java/net/helcel/beans/countries/Group.kt b/app/src/main/java/net/helcel/beans/countries/Group.kt index dcef839..d3b5fc7 100644 --- a/app/src/main/java/net/helcel/beans/countries/Group.kt +++ b/app/src/main/java/net/helcel/beans/countries/Group.kt @@ -2,6 +2,7 @@ package net.helcel.beans.countries import net.helcel.beans.countries.Country.* +@Suppress("RedundantSuppression", "SpellCheckingInspection", "unused") enum class Group(override val fullName: String, override val children: Set) : GeoLoc { EEE( diff --git a/app/src/main/java/net/helcel/beans/helper/Groups.kt b/app/src/main/java/net/helcel/beans/helper/Groups.kt index 8f11d7c..08e8080 100644 --- a/app/src/main/java/net/helcel/beans/helper/Groups.kt +++ b/app/src/main/java/net/helcel/beans/helper/Groups.kt @@ -24,53 +24,53 @@ const val AUTO_GROUP = -1 @Serializable -class Groups(val id: Int, private val grps: HashMap) { +class Groups(val id: Int, private val groups: HashMap) { @kotlinx.serialization.Transient - private val _groupsFlow = MutableStateFlow>(grps.values.toList()) + private val _groupsFlow = MutableStateFlow>(groups.values.toList()) @kotlinx.serialization.Transient val groupsFlow: StateFlow> = _groupsFlow.asStateFlow() fun setGroup(key: Int, name: String, col: ColorDrawable) { - grps[key] = Group(key, name, col) - _groupsFlow.value = grps.values.toList() + groups[key] = Group(key, name, col) + _groupsFlow.value = groups.values.toList() } fun deleteGroup(key: Int) { - grps.remove(key) - _groupsFlow.value = grps.values.toList() + groups.remove(key) + _groupsFlow.value = groups.values.toList() } fun getGroupFromKey(key: Int): Group { - return grps.getOrDefault(key, EmptyGroup()) + return groups.getOrDefault(key, EmptyGroup()) } fun genKey(): Int { val key = rnd.nextInt() - if (grps.containsKey(key) || key in listOf(NO_GROUP, DEFAULT_GROUP, AUTO_GROUP)) return genKey() + if (groups.containsKey(key) || key in listOf(NO_GROUP, DEFAULT_GROUP, AUTO_GROUP)) return genKey() return key } fun size(): Int { - return grps.size + return groups.size } fun getUniqueEntry(): Group? { assert(size() == 1) - return if (grps.size == 1) { - grps[grps.keys.first()] + return if (groups.size == 1) { + groups[groups.keys.first()] } else { null } } fun getGroupFromPos(pos: Int): Pair { - if(grps.keys.isEmpty()) return Pair(NO_GROUP,Group(NO_GROUP,"-")) - val key = grps.keys.toList()[pos] + if(groups.keys.isEmpty()) return Pair(NO_GROUP,Group(NO_GROUP,"-")) + val key = groups.keys.toList()[pos] return Pair(key, getGroupFromKey(key)) } fun findGroupPos(key: Int): Int { - return grps.keys.toList().indexOf(key) + return groups.keys.toList().indexOf(key) } class EmptyGroup : Group(0, "") diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml index bbd3e02..50ec886 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 33d248f..a1c62e8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,34 +1,9 @@ # Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true android.enableJetifier=false -# Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library android.nonTransitiveRClass=true -android.defaults.buildfeatures.resvalues=true -android.sdk.defaultTargetSdkToCompileSdkIfUnset=false -android.enableAppCompileTimeRClass=false -android.usesSdkInManifest.disallowed=false android.uniquePackageNames=false -android.dependency.useConstraints=true +android.dependency.useConstraints=false android.r8.strictFullModeForKeepRules=false -android.r8.optimizedResourceShrinking=false -android.builtInKotlin=false -android.newDsl=false \ No newline at end of file