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