From 8b2e1e8b0239dac026d73809aa53c0d768956fc1 Mon Sep 17 00:00:00 2001
From: Phil Oliver <3497406+poliver@users.noreply.github.com>
Date: Fri, 19 Sep 2025 19:12:26 -0400
Subject: [PATCH] Modularize some map-related files (#3154)
---
app/build.gradle.kts | 1 +
.../com/geeksville/mesh/ui/map/MapView.kt | 8 +++---
.../mesh/ui/map/MapViewWithLifecycle.kt | 2 +-
.../mesh/android/ContextExtensions.kt | 19 +++-----------
.../geeksville/mesh/model/MetricsViewModel.kt | 2 +-
build.gradle.kts | 1 +
feature/map/build.gradle.kts | 25 +++++++++++++++++++
.../feature/map/cluster}/MarkerClusterer.java | 4 +--
.../map/cluster}/RadiusMarkerClusterer.java | 4 +--
.../feature/map/cluster}/StaticCluster.java | 4 +--
.../org/meshtastic/feature/map}/MapUtils.kt | 12 ++++++++-
.../feature/map/model}/CustomTileSource.kt | 2 +-
.../feature/map/model}/MarkerWithLabel.kt | 6 ++---
.../feature/map/model}/NOAAWmsTileSource.kt | 2 +-
.../map/model}/OnlineTileSourceAuth.kt | 2 +-
.../feature/map/model}/CustomTileSource.kt | 2 +-
settings.gradle.kts | 2 +-
17 files changed, 62 insertions(+), 36 deletions(-)
create mode 100644 feature/map/build.gradle.kts
rename {app/src/fdroid/java/com/geeksville/mesh/model/map/clustering => feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster}/MarkerClusterer.java (98%)
rename {app/src/fdroid/java/com/geeksville/mesh/model/map/clustering => feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster}/RadiusMarkerClusterer.java (98%)
rename {app/src/fdroid/java/com/geeksville/mesh/model/map/clustering => feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster}/StaticCluster.java (95%)
rename {app/src/fdroid/java/com/geeksville/mesh/util => feature/map/src/fdroid/kotlin/org/meshtastic/feature/map}/MapUtils.kt (86%)
rename {app/src/fdroid/java/com/geeksville/mesh/model/map => feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model}/CustomTileSource.kt (99%)
rename {app/src/fdroid/java/com/geeksville/mesh/model/map => feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model}/MarkerWithLabel.kt (97%)
rename {app/src/fdroid/java/com/geeksville/mesh/model/map => feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model}/NOAAWmsTileSource.kt (99%)
rename {app/src/fdroid/java/com/geeksville/mesh/model/map => feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model}/OnlineTileSourceAuth.kt (97%)
rename {app/src/google/java/com/geeksville/mesh/model/map => feature/map/src/google/kotlin/org/meshtastic/feature/map/model}/CustomTileSource.kt (95%)
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index e01406911..54587f880 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -183,6 +183,7 @@ dependencies {
implementation(projects.core.network)
implementation(projects.core.prefs)
implementation(projects.core.proto)
+ implementation(projects.feature.map)
// Bundles
implementation(libs.bundles.markdown)
diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt
index d17542d10..aa7851763 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt
+++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt
@@ -72,9 +72,6 @@ import com.geeksville.mesh.copy
import com.geeksville.mesh.database.entity.Packet
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.model.map.CustomTileSource
-import com.geeksville.mesh.model.map.MarkerWithLabel
-import com.geeksville.mesh.model.map.clustering.RadiusMarkerClusterer
import com.geeksville.mesh.ui.map.components.CacheLayout
import com.geeksville.mesh.ui.map.components.DownloadButton
import com.geeksville.mesh.ui.map.components.EditWaypointDialog
@@ -84,11 +81,14 @@ import com.geeksville.mesh.util.addCopyright
import com.geeksville.mesh.util.addScaleBarOverlay
import com.geeksville.mesh.util.createLatLongGrid
import com.geeksville.mesh.util.formatAgo
-import com.geeksville.mesh.util.zoomIn
import com.geeksville.mesh.waypoint
import com.google.accompanist.permissions.ExperimentalPermissionsApi // Added for Accompanist
import com.google.accompanist.permissions.rememberMultiplePermissionsState // Added for Accompanist
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import org.meshtastic.feature.map.cluster.RadiusMarkerClusterer
+import org.meshtastic.feature.map.model.CustomTileSource
+import org.meshtastic.feature.map.model.MarkerWithLabel
+import org.meshtastic.feature.map.zoomIn
import org.osmdroid.bonuspack.utils.BonusPackHelper.getBitmapFromVectorDrawable
import org.osmdroid.config.Configuration
import org.osmdroid.events.MapEventsReceiver
diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewWithLifecycle.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewWithLifecycle.kt
index d7ae14cc9..0e400aa2d 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewWithLifecycle.kt
+++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewWithLifecycle.kt
@@ -35,7 +35,7 @@ import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.geeksville.mesh.BuildConfig
import com.geeksville.mesh.android.BuildUtils.errormsg
-import com.geeksville.mesh.util.requiredZoomLevel
+import org.meshtastic.feature.map.requiredZoomLevel
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.ITileSource
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
diff --git a/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt b/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt
index 83ea9b944..b2de39a7e 100644
--- a/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt
+++ b/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt
@@ -19,28 +19,17 @@ package com.geeksville.mesh.android
import android.app.Activity
import android.content.Context
-import android.util.TypedValue
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
-/// show a toast
-fun Context.toast(message: CharSequence) =
- Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
+// / show a toast
+fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
-/// Utility function to hide the soft keyboard per stack overflow
+// / Utility function to hide the soft keyboard per stack overflow
fun Activity.hideKeyboard() {
// Check if no view has focus:
currentFocus?.let { v ->
- val imm =
- getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
+ val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.hideSoftInputFromWindow(v.windowToken, 0)
}
}
-
-// Converts SP to pixels.
-fun Context.spToPx(sp: Float): Int =
- TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, resources.displayMetrics).toInt()
-
-// Converts DP to pixels.
-fun Context.dpToPx(dp: Float): Int =
- TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics).toInt()
diff --git a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt
index 03db586a0..e88918e5c 100644
--- a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt
@@ -41,7 +41,6 @@ import com.geeksville.mesh.android.prefs.MapPrefs
import com.geeksville.mesh.database.MeshLogRepository
import com.geeksville.mesh.database.entity.FirmwareRelease
import com.geeksville.mesh.database.entity.MeshLog
-import com.geeksville.mesh.model.map.CustomTileSource
import com.geeksville.mesh.repository.api.DeviceHardwareRepository
import com.geeksville.mesh.repository.api.FirmwareReleaseRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
@@ -64,6 +63,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.meshtastic.core.model.DeviceHardware
import org.meshtastic.core.navigation.NodesRoutes
+import org.meshtastic.feature.map.model.CustomTileSource
import java.io.BufferedWriter
import java.io.FileNotFoundException
import java.io.FileWriter
diff --git a/build.gradle.kts b/build.gradle.kts
index d02ae2f7b..c27963470 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -83,4 +83,5 @@ dependencies {
kover(projects.core.navigation)
kover(projects.core.network)
kover(projects.core.prefs)
+ kover(projects.feature.map)
}
\ No newline at end of file
diff --git a/feature/map/build.gradle.kts b/feature/map/build.gradle.kts
new file mode 100644
index 000000000..a74b77d2a
--- /dev/null
+++ b/feature/map/build.gradle.kts
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2025 Meshtastic LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+plugins {
+ alias(libs.plugins.kover)
+ alias(libs.plugins.meshtastic.android.library)
+}
+
+android { namespace = "org.meshtastic.feature.map" }
+
+dependencies { implementation(libs.bundles.osm) }
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/MarkerClusterer.java b/feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/MarkerClusterer.java
similarity index 98%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/MarkerClusterer.java
rename to feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/MarkerClusterer.java
index ffb5d9e12..b6c5601c6 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/MarkerClusterer.java
+++ b/feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/MarkerClusterer.java
@@ -15,14 +15,14 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map.clustering;
+package org.meshtastic.feature.map.cluster;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Point;
import android.view.MotionEvent;
-import com.geeksville.mesh.model.map.MarkerWithLabel;
+import org.meshtastic.feature.map.model.MarkerWithLabel;
import org.osmdroid.util.BoundingBox;
import org.osmdroid.views.MapView;
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/RadiusMarkerClusterer.java b/feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/RadiusMarkerClusterer.java
similarity index 98%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/RadiusMarkerClusterer.java
rename to feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/RadiusMarkerClusterer.java
index 2104f1697..48ceeebeb 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/RadiusMarkerClusterer.java
+++ b/feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/RadiusMarkerClusterer.java
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map.clustering;
+package org.meshtastic.feature.map.cluster;
import android.content.Context;
import android.graphics.Bitmap;
@@ -27,7 +27,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
-import com.geeksville.mesh.model.map.MarkerWithLabel;
+import org.meshtastic.feature.map.model.MarkerWithLabel;
import org.osmdroid.bonuspack.R;
import org.osmdroid.util.BoundingBox;
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/StaticCluster.java b/feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/StaticCluster.java
similarity index 95%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/StaticCluster.java
rename to feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/StaticCluster.java
index 894aae57b..b49a33f11 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/clustering/StaticCluster.java
+++ b/feature/map/src/fdroid/java/org/meshtastic/feature/map/cluster/StaticCluster.java
@@ -15,9 +15,9 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map.clustering;
+package org.meshtastic.feature.map.cluster;
-import com.geeksville.mesh.model.map.MarkerWithLabel;
+import org.meshtastic.feature.map.model.MarkerWithLabel;
import org.osmdroid.util.BoundingBox;
import org.osmdroid.util.GeoPoint;
diff --git a/app/src/fdroid/java/com/geeksville/mesh/util/MapUtils.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapUtils.kt
similarity index 86%
rename from app/src/fdroid/java/com/geeksville/mesh/util/MapUtils.kt
rename to feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapUtils.kt
index 385e97190..6bad64d44 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/util/MapUtils.kt
+++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapUtils.kt
@@ -15,8 +15,10 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.util
+package org.meshtastic.feature.map
+import android.content.Context
+import android.util.TypedValue
import org.osmdroid.util.BoundingBox
import org.osmdroid.util.GeoPoint
import kotlin.math.log2
@@ -69,3 +71,11 @@ fun BoundingBox.zoomIn(zoomFactor: Double): BoundingBox {
center.longitude - newLonDiff / 2,
)
}
+
+// Converts SP to pixels.
+fun Context.spToPx(sp: Float): Int =
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, resources.displayMetrics).toInt()
+
+// Converts DP to pixels.
+fun Context.dpToPx(dp: Float): Int =
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics).toInt()
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/CustomTileSource.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/CustomTileSource.kt
similarity index 99%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/CustomTileSource.kt
rename to feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/CustomTileSource.kt
index c30714ed7..6225471fb 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/CustomTileSource.kt
+++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/CustomTileSource.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map
+package org.meshtastic.feature.map.model
import org.osmdroid.tileprovider.tilesource.ITileSource
import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/MarkerWithLabel.kt
similarity index 97%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt
rename to feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/MarkerWithLabel.kt
index d7a0b5fe4..32ff692a2 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt
+++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/MarkerWithLabel.kt
@@ -15,15 +15,15 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map
+package org.meshtastic.feature.map.model
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.view.MotionEvent
-import com.geeksville.mesh.android.dpToPx
-import com.geeksville.mesh.android.spToPx
+import org.meshtastic.feature.map.dpToPx
+import org.meshtastic.feature.map.spToPx
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Marker
import org.osmdroid.views.overlay.Polygon
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/NOAAWmsTileSource.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/NOAAWmsTileSource.kt
similarity index 99%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/NOAAWmsTileSource.kt
rename to feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/NOAAWmsTileSource.kt
index 7d32d4427..40778cea4 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/NOAAWmsTileSource.kt
+++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/NOAAWmsTileSource.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map
+package org.meshtastic.feature.map.model
import android.content.res.Resources
import android.util.Log
diff --git a/app/src/fdroid/java/com/geeksville/mesh/model/map/OnlineTileSourceAuth.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/OnlineTileSourceAuth.kt
similarity index 97%
rename from app/src/fdroid/java/com/geeksville/mesh/model/map/OnlineTileSourceAuth.kt
rename to feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/OnlineTileSourceAuth.kt
index a52ad7536..4ed0f43dc 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/model/map/OnlineTileSourceAuth.kt
+++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/model/OnlineTileSourceAuth.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map
+package org.meshtastic.feature.map.model
import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase
import org.osmdroid.tileprovider.tilesource.TileSourcePolicy
diff --git a/app/src/google/java/com/geeksville/mesh/model/map/CustomTileSource.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/model/CustomTileSource.kt
similarity index 95%
rename from app/src/google/java/com/geeksville/mesh/model/map/CustomTileSource.kt
rename to feature/map/src/google/kotlin/org/meshtastic/feature/map/model/CustomTileSource.kt
index 3b6e6fb46..d9dcc910b 100644
--- a/app/src/google/java/com/geeksville/mesh/model/map/CustomTileSource.kt
+++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/model/CustomTileSource.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model.map
+package org.meshtastic.feature.map.model
class CustomTileSource {
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 492eae87b..159e053c2 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -17,7 +17,7 @@ import org.gradle.kotlin.dsl.maven
* along with this program. If not, see .
*/
-include(":app", ":core:model", ":core:navigation", ":core:network", ":core:prefs", ":core:proto", ":mesh_service_example")
+include(":app", ":core:model", ":core:navigation", ":core:network", ":core:prefs", ":core:proto", ":feature:map", ":mesh_service_example")
rootProject.name = "MeshtasticAndroid"
// https://docs.gradle.org/current/userguide/declaring_dependencies.html#sec:type-safe-project-accessors