21 Commits

Author SHA1 Message Date
Renovate Bot
9190a3cfa2 Update dependency com.mikepenz:aboutlibraries-compose-m3 to v14.2.1 2026-05-27 02:02:00 +00:00
bot
4114185a73 Merge pull request 'Update plugin com.mikepenz.aboutlibraries.plugin to v14.2.1' (#506) from renovate/com.mikepenz.aboutlibraries.plugin-14.x into main 2026-05-26 04:01:40 +02:00
bot
24fe56c02a Merge pull request 'Update dependency com.mikepenz:aboutlibraries-core to v14.2.1' (#505) from renovate/com.mikepenz-aboutlibraries-core-14.x into main 2026-05-26 04:01:35 +02:00
Renovate Bot
d83234cf5b Update plugin com.mikepenz.aboutlibraries.plugin to v14.2.1 2026-05-26 02:01:33 +00:00
Renovate Bot
e608b22c0c Update dependency com.mikepenz:aboutlibraries-core to v14.2.1 2026-05-26 02:01:31 +00:00
soraefir
f8ed30cd73 Fix Top bar padding on android16+ 2026-05-25 15:20:41 +02:00
soraefir
c50933908c Fix crash due to rename 2026-05-25 14:14:42 +02:00
bot
77edae3585 Merge pull request 'Update dependency com.mikepenz:aboutlibraries to v14.2.1' (#503) from renovate/com.mikepenz-aboutlibraries-14.x into main 2026-05-25 04:01:29 +02:00
Renovate Bot
50c152084e Update dependency com.mikepenz:aboutlibraries to v14.2.1 2026-05-25 02:01:22 +00:00
b0a107c749 Update README.md 2026-05-24 11:58:56 +02:00
bot
91050826b2 Merge pull request 'Lock file maintenance' (#502) from renovate/lock-file-maintenance into main 2026-05-24 04:04:58 +02:00
Renovate Bot
1004119fed Lock file maintenance 2026-05-24 02:04:55 +00:00
d262331d1b Update .github/workflows/build.yml 2026-05-23 14:45:03 +02:00
7440e85987 Update app/build.gradle 2026-05-23 14:42:40 +02:00
2351512af8 Update app/build.gradle 2026-05-23 14:42:30 +02:00
ae2cde3545 Update app/build.gradle 2026-05-23 14:06:23 +02:00
soraefir
1000319b8f Bump java version workflow to 21 2026-05-23 11:45:32 +02:00
soraefir
8c4c5e16e0 Fix build error with backuprules 2026-05-23 11:42:03 +02:00
soraefir
0ce1e604a8 Update node deps 2026-05-23 11:39:04 +02:00
soraefir
757783534c Fix build, errors and spring cleaning 2026-05-23 11:35:02 +02:00
soraefir
3eba48ea7d WIP
# Conflicts:
#	build.gradle
#	gradle/wrapper/gradle-wrapper.properties
2026-05-23 10:53:36 +02:00
17 changed files with 175 additions and 125 deletions

View File

@@ -24,7 +24,9 @@ jobs:
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: set up secrets
run: |
echo "${{ secrets.RELEASE_KEYSTORE }}" > keystore.asc
@@ -42,14 +44,16 @@ jobs:
- name: set up JDK
uses: actions/setup-java@v5
with:
java-version: 17
java-version: 21
distribution: "temurin"
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build APK
run: ./gradlew assembleSignedRelease
run: |
VERSION_CODE=$(git rev-list --count HEAD)
./gradlew assembleSignedRelease -PVERSION_CODE=$VERSION_CODE
- name: Release
uses: softprops/action-gh-release@v3

View File

@@ -5,6 +5,8 @@
<p>A virtual scratchmap of the world</p>
<a href="https://ko-fi.com/I2I615VP5M"><img src="https://ko-fi.com/img/githubbutton_sm.svg" alt="ko-fi"></a>
<br>
<img src="https://forthebadge.com/images/badges/built-for-android.svg" alt="Built for Android">
<img src="https://forthebadge.com/images/badges/built-with-love.svg" alt="Built with love">
<br>

View File

@@ -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'
id 'com.mikepenz.aboutlibraries.plugin' version '14.2.1'
}
android {
namespace 'net.helcel.beans'
compileSdk 36
compileSdk = 37
defaultConfig {
buildConfigField("String", "APP_NAME", "\"Beans\"")
manifestPlaceholders["APP_NAME"] = "Beans"
applicationId 'net.helcel.beans'
minSdk 28
targetSdk 36
versionCode 4
versionName "1.1a"
minSdk = 28
targetSdk = 37
versionName "1.3"
versionCode project.hasProperty('VERSION_CODE') ? project.property('VERSION_CODE').toInteger() : 1
}
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 {
@@ -114,9 +105,9 @@ dependencies {
implementation 'com.caverock:androidsvg-aar:1.4'
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'com.mikepenz:aboutlibraries:14.2.0'
implementation 'com.mikepenz:aboutlibraries-compose-m3:14.2.0'
implementation 'com.mikepenz:aboutlibraries-core:14.2.0'
implementation 'com.mikepenz:aboutlibraries:14.2.1'
implementation 'com.mikepenz:aboutlibraries-compose-m3:14.2.1'
implementation 'com.mikepenz:aboutlibraries-core:14.2.1'
implementation platform('androidx.compose:compose-bom:2026.05.01')

View File

@@ -8,8 +8,7 @@
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher_round"
android:label="${APP_NAME}"
android:supportsRtl="true"
tools:replace="android:allowBackup">
android:supportsRtl="true">
<activity
android:name=".activity.MainScreen"
android:exported="true">

View File

@@ -9,20 +9,23 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Percent
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
@@ -52,7 +55,7 @@ class MainScreen : ComponentActivity() {
setContent {
SysTheme {
Box(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background)) {
Box(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background).statusBarsPadding(),) {
AppNavHost(psvg, css)
}
}

View File

@@ -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<String>, selected: String, onSelected: (String) -> Unit) {
Column(Modifier.padding(2.dp)) {
list.map { value ->
list.forEach { value ->
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier

View File

@@ -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)

View File

@@ -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()

View File

@@ -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,
)
)
}

View File

@@ -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>) : GeoLoc {
EEE(

View File

@@ -3,6 +3,7 @@ package net.helcel.beans.helper
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Serializer
import kotlinx.serialization.json.Json
@@ -24,53 +25,53 @@ const val AUTO_GROUP = -1
@Serializable
class Groups(val id: Int, private val grps: HashMap<Int, Group>) {
class Groups(val id: Int, @SerialName("grps") private val groups: HashMap<Int, Group>) {
@kotlinx.serialization.Transient
private val _groupsFlow = MutableStateFlow<List<Group>>(grps.values.toList())
private val _groupsFlow = MutableStateFlow<List<Group>>(groups.values.toList())
@kotlinx.serialization.Transient
val groupsFlow: StateFlow<List<Group>> = _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<Int, Group> {
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, "")

View File

@@ -0,0 +1,50 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="128"
android:viewportHeight="128">
<group android:scaleX="0.8918919"
android:scaleY="0.8918919"
android:translateX="6.918919"
android:translateY="6.918919">
<group
android:scaleX="1.5"
android:scaleY="1.5"
android:translateX="10"
android:translateY="10">
<path
android:pathData="M36,36m-28,0a28,28 0,1 1,56 0a28,28 0,1 1,-56 0"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="@color/blue"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
</group>
<group
android:scaleX="1.25"
android:scaleY="1.25"
android:translateX="18"
android:translateY="18">
<path
android:pathData="M56.803,45.75c0.599,-0.299 1.157,-0.672 1.663,-1.11 0.804,-0.698 1.463,-1.546 1.94,-2.497 0.599,-1.303 0.883,-2.728 0.829,-4.161 0.034,-1.498 -0.154,-2.994 -0.558,-4.437 -0.451,-1.645 -1.104,-3.229 -1.944,-4.714 -0.967,-2.141 -2.28,-4.108 -3.887,-5.822 -1.242,-1.326 -2.757,-2.366 -4.44,-3.048 -0.877,-0.372 -1.821,-0.56 -2.774,-0.553 -1.402,0.074 -2.729,0.697 -3.882,1.389 -1.285,0.81 -2.244,1.735 -2.771,3.053 -0.739,2.362 0.827,4.821 1.113,5.269 0.003,0.005 0.187,0.281 0.555,0.832 1.512,2.264 1.589,2.358 1.666,2.495 0.646,1.221 1.114,2.528 1.389,3.882 1.043,4.001 1.565,6.001 2.223,6.932 1.208,1.71 3.455,3.414 5.826,3.325 1.059,-0.088 2.093,-0.371 3.05,-0.835Z"
android:strokeWidth="2"
android:fillColor="@color/white"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M22,41c-1.54,0.554 -2.83,1.642 -3.636,3.066 -0.714,1.365 -0.957,2.928 -0.693,4.445 0.178,1.247 0.632,2.439 1.329,3.488 2.032,3.228 5.383,4.423 7,5 1.613,0.561 3.295,0.897 5,1 2.387,0.205 6.923,0.535 11,-2 1.287,-0.665 2.335,-1.713 3,-3 0.661,-1.601 0.661,-3.399 0,-5 -0.389,-1.156 -1.121,-2.165 -2.099,-2.894 -0.919,-0.599 -1.974,-0.956 -3.069,-1.039 -2.057,-0.313 -2.756,0.139 -5.014,0.057 -1.271,-0.019 -2.534,-0.214 -3.753,-0.577 -3.036,-0.95 -3.33,-2.457 -5.889,-2.829 -1.066,-0.158 -2.155,-0.061 -3.177,0.282Z"
android:strokeWidth="2"
android:fillColor="@color/white"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M12.7,26.975c1.758,-3.604 5.311,-3.191 9.58,-7.091 2.701,-2.469 2.858,-4.078 5.613,-5.202 1.407,-0.644 2.984,-0.819 4.498,-0.5 2.053,0.475 3.761,1.891 4.61,3.819 1.116,2.742 -0.314,5.437 -1.398,7.482 -0.951,1.689 -2.167,3.215 -3.602,4.518 -1.479,1.552 -3.161,2.898 -5,4 -2.629,1.541 -6.332,3.711 -9.989,2.43 -1.481,-0.548 -2.768,-1.521 -3.699,-2.796 -1.496,-1.906 -1.735,-4.512 -0.612,-6.659Z"
android:strokeWidth="2"
android:fillColor="@color/white"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
</group>
</group>
</vector>

View File

@@ -2,4 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -1,24 +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.nonTransitiveRClass=true
android.uniquePackageNames=false
android.dependency.useConstraints=false
android.r8.strictFullModeForKeepRules=false

View File

@@ -1,9 +1,9 @@
{
"dependencies": {
"@turf/area": "^7.0.0",
"@turf/turf": "^7.0.0",
"jsdom": "^29.0.0",
"mapshaper": "^0.7.0"
"@turf/area": "^7.3.5",
"@turf/turf": "^7.3.5",
"jsdom": "^29.1.1",
"mapshaper": "^0.7.19"
},
"type": "module"
}

View File

@@ -6,6 +6,9 @@ pluginManagement {
maven { url 'https://jitpack.io' }
}
}
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {

View File

@@ -200,7 +200,7 @@
"@types/geojson" "^7946.0.10"
tslib "^2.8.1"
"@turf/area@7.3.5", "@turf/area@^7.0.0":
"@turf/area@7.3.5", "@turf/area@^7.3.5":
version "7.3.5"
resolved "https://registry.yarnpkg.com/@turf/area/-/area-7.3.5.tgz#97e3c94305a5f1674b542855ddfb9871cb0a5de2"
integrity sha512-sSn80wPT7XfBIDN3vurCPxhk9W4U8ozS/XImSqeLN8qveTICOxzZkhsGDMp0CuncaN+plWut4a2TdNM7mzZB6Q==
@@ -1668,7 +1668,7 @@
"@types/geojson" "^7946.0.10"
tslib "^2.8.1"
"@turf/turf@^7.0.0":
"@turf/turf@^7.3.5":
version "7.3.5"
resolved "https://registry.yarnpkg.com/@turf/turf/-/turf-7.3.5.tgz#a98b79933f03f2c2748582424b9fcd42f8257aef"
integrity sha512-l5Z1ZFEizN9p5GxX3mzUGf+i4t7AP3YpWcNdf9+kIzJcQD3eYuGBabj2hLrfrluqFJ+uxsuo4RgPtortQ9Dwpg==
@@ -2449,9 +2449,9 @@ hyparquet@1.25.6:
integrity sha512-Q9W5IjkVch3ZMnYd4qFv2q8suu5Jc36yt7J+zUNM9grwnP1S189icp0jdEQKM5HJvQkTVy8NMiQ8n/dM5QAt1A==
hyparquet@^1.25.6:
version "1.25.8"
resolved "https://registry.yarnpkg.com/hyparquet/-/hyparquet-1.25.8.tgz#9d81d9b8aea1347de3701ca619fe2e1def8dcf10"
integrity sha512-KYRKZCHBgEY9FOuqTe9m+zdrKBcTo9ZcaIUqG7SdZygv5hwrGD3C6wuTrGt07cbEkgO71UIih+KbojLKf3ENbg==
version "1.26.0"
resolved "https://registry.yarnpkg.com/hyparquet/-/hyparquet-1.26.0.tgz#65b147befb99932e38c2bb1dd007eb7da0d7a0dc"
integrity sha512-yxUiViPZ+z5h+xdX4rA1G+k30jXoEsG9I2xEpjaM84imGznbKjZzxuZFsdzqg6C4LxNnnAlDFvzpk4uxQWTbTQ==
hysnappy@1.0.0:
version "1.0.0"
@@ -2557,7 +2557,7 @@ jpeg-js@^0.4.4:
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa"
integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==
jsdom@^29.0.0:
jsdom@^29.1.1:
version "29.1.1"
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-29.1.1.tgz#5b9704906f3cd510c34aa941ae2f8f7f8179df01"
integrity sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==
@@ -2631,10 +2631,10 @@ map-stream@0.0.7:
resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8"
integrity sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==
mapshaper@^0.7.0:
version "0.7.19"
resolved "https://registry.yarnpkg.com/mapshaper/-/mapshaper-0.7.19.tgz#52db581df39d79064b6a4ab42857523e669f1ff5"
integrity sha512-G2SQjdyKCICdxv/gNee0W07TZNfh6f0SJVwnkP9RtUmo3xyFc98SDS/wBMyBoBrpnf8kdmNXllqJLerAfVV6WQ==
mapshaper@^0.7.19:
version "0.7.20"
resolved "https://registry.yarnpkg.com/mapshaper/-/mapshaper-0.7.20.tgz#0b1643d89bdaf7d347e6abea97a3c890ada0799a"
integrity sha512-YmH1Q0hh4G+zNBxQdkaPyvKnIkGPZwtTGSrGme6QcyhXb1B1NXzzJqTE/YdhmGOWKjR2ZTn+wQSYjFilYudegw==
dependencies:
"@bokuweb/zstd-wasm" "^0.0.27"
"@ngageoint/geopackage" "^4.2.6"
@@ -2663,7 +2663,7 @@ mapshaper@^0.7.0:
idb-keyval "^6.2.0"
jpeg-js "^0.4.4"
kdbush "^3.0.0"
mproj "0.1.2"
mproj "0.1.3"
msgpackr "^1.10.1"
open "^11.0.0"
pngjs "^7.0.0"
@@ -2702,10 +2702,10 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
mproj@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/mproj/-/mproj-0.1.2.tgz#9827ed5ff6a171a9be7dbd9d767c4615d969ec50"
integrity sha512-kl38Oi47W7XMmA3jh1xPMiGpxpWJG5UdwJpa/yhVtQshFrxY6MnCWSupYrMmeYylp1shUvpGWPEBY7TfgqfWqw==
mproj@0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/mproj/-/mproj-0.1.3.tgz#295b990970a80380dac85b29d605a5f4f66b25ff"
integrity sha512-XPxty3HPv1j5eXfxId1FSGX7JB8+KgozVOyCu5l40u/I0pW7gpWTaxouA8MNKHfEXN5oE8r9eowkM+0LuQduIQ==
dependencies:
geographiclib "1.48.0"
rw "~1.3.2"
@@ -3271,17 +3271,17 @@ tinyqueue@^2.0.0, tinyqueue@^2.0.3:
resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08"
integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==
tldts-core@^7.0.30:
version "7.0.30"
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.30.tgz#c495dba27778f2220bea94f3f6399005c7aca61c"
integrity sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==
tldts-core@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.1.0.tgz#62dd1a0faa96d10a8ee52546215c741943f33714"
integrity sha512-Ou+YJ467tR700sk2mZBB1/uFah6LDeH/VKO0N4xfjFOXE0hJkZgiOgXj16gEi1wQ4L6334UTKjxF6gum8ftZzQ==
tldts@^7.0.5:
version "7.0.30"
resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.30.tgz#497cea8d610953222f9dcb3ceb07c7207efcd816"
integrity sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==
version "7.1.0"
resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.1.0.tgz#b271856a7bd507fa67d9a063b877a2c72eb944c6"
integrity sha512-Y+iRHtDrPOlNH9ZZpqpIogonv7jwSPHIt3Gpe+kRvYJlBaK+QGNXu+xooJY0QEmb62/ERo3GF3zCxRMbMtKEEA==
dependencies:
tldts-core "^7.0.30"
tldts-core "^7.1.0"
tmp@^0.0.33:
version "0.0.33"