From e72b046c5370a27f727c11e56bf1c3f79a391b0f Mon Sep 17 00:00:00 2001 From: andrekir Date: Mon, 4 Sep 2023 18:40:21 -0300 Subject: [PATCH] refactor: convert `gpsString` to `Position` extension --- .../main/java/com/geeksville/mesh/NodeInfo.kt | 9 +++++++++ .../java/com/geeksville/mesh/model/UIState.kt | 12 ------------ .../mesh/service/MeshServiceNotifications.kt | 6 +++--- .../com/geeksville/mesh/ui/UsersFragment.kt | 7 +++++-- .../com/geeksville/mesh/ui/map/MapFragment.kt | 18 ++++++++++-------- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/NodeInfo.kt b/app/src/main/java/com/geeksville/mesh/NodeInfo.kt index 49fdc2d8..e1b864d7 100644 --- a/app/src/main/java/com/geeksville/mesh/NodeInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/NodeInfo.kt @@ -3,6 +3,7 @@ package com.geeksville.mesh import android.graphics.Color import android.os.Parcelable import com.geeksville.mesh.MeshProtos.User +import com.geeksville.mesh.util.GPSFormat import com.geeksville.mesh.util.bearing import com.geeksville.mesh.util.latLongToMeter import com.geeksville.mesh.util.anonymize @@ -79,6 +80,14 @@ data class Position( (longitude >= -180 && longitude <= 180) } + fun gpsString(gpsFormat: Int): String = when (gpsFormat) { + ConfigProtos.Config.DisplayConfig.GpsCoordinateFormat.DEC_VALUE -> GPSFormat.DEC(this) + ConfigProtos.Config.DisplayConfig.GpsCoordinateFormat.DMS_VALUE -> GPSFormat.DMS(this) + ConfigProtos.Config.DisplayConfig.GpsCoordinateFormat.UTM_VALUE -> GPSFormat.UTM(this) + ConfigProtos.Config.DisplayConfig.GpsCoordinateFormat.MGRS_VALUE -> GPSFormat.MGRS(this) + else -> GPSFormat.DEC(this) + } + override fun toString(): String { return "Position(lat=${latitude.anonymize}, lon=${longitude.anonymize}, alt=${altitude.anonymize}, time=${time})" } diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index a8066694..ee963959 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -7,7 +7,6 @@ import android.net.Uri import android.os.RemoteException import android.view.Menu import androidx.core.content.edit -import androidx.lifecycle.asFlow import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -31,7 +30,6 @@ import com.geeksville.mesh.database.PacketRepository import com.geeksville.mesh.repository.datastore.RadioConfigRepository import com.geeksville.mesh.repository.radio.RadioInterfaceService import com.geeksville.mesh.service.MeshService -import com.geeksville.mesh.util.GPSFormat import com.geeksville.mesh.util.positionToMeter import com.google.protobuf.MessageLite import dagger.hilt.android.lifecycle.HiltViewModel @@ -403,16 +401,6 @@ class UIViewModel @Inject constructor( } } - fun gpsString(p: Position): String { - return when (config.display.gpsFormat) { - Config.DisplayConfig.GpsCoordinateFormat.DEC -> GPSFormat.DEC(p) - Config.DisplayConfig.GpsCoordinateFormat.DMS -> GPSFormat.DMS(p) - Config.DisplayConfig.GpsCoordinateFormat.UTM -> GPSFormat.UTM(p) - Config.DisplayConfig.GpsCoordinateFormat.MGRS -> GPSFormat.MGRS(p) - else -> GPSFormat.DEC(p) - } - } - // managed mode disables all access to configuration val isManaged: Boolean get() = config.device.isManaged diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt index e473c1e1..922890ad 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt @@ -14,7 +14,7 @@ import android.os.Build import androidx.annotation.RequiresApi import androidx.appcompat.content.res.AppCompatResources import androidx.core.app.NotificationCompat -import androidx.core.graphics.drawable.toBitmap +import androidx.core.graphics.drawable.toBitmapOrNull import com.geeksville.mesh.MainActivity import com.geeksville.mesh.R import com.geeksville.mesh.android.notificationManager @@ -116,10 +116,10 @@ class MeshServiceNotifications( /** * Generate a bitmap from a vector drawable (even on old builds) - * https://stackoverflow.com/questions/33696488/getting-bitmap-from-vector-drawable + * https://stackoverflow.com/questions/33696488/getting-bitmap-from-vector-drawable/#51742167 */ private fun getBitmapFromVectorDrawable(drawableId: Int): Bitmap? = - AppCompatResources.getDrawable(context, drawableId)?.toBitmap() + AppCompatResources.getDrawable(context, drawableId)?.toBitmapOrNull() private fun commonBuilder(channel: String): NotificationCompat.Builder { val builder = NotificationCompat.Builder(context, channel) diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt index 57e53971..c2aa1066 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -58,6 +58,9 @@ class UsersFragment : ScreenFragment("Users"), Logging { private var nodes = arrayOf() val ignoreIncomingList: MutableList = mutableListOf() + private val gpsFormat by lazy { model.config.display.gpsFormat.number } + private val displayUnits by lazy { model.config.display.units.number } + private fun CharSequence.strike() = SpannableString(this).apply { setSpan(StrikethroughSpan(), 0, this.length, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE) } @@ -215,7 +218,7 @@ class UsersFragment : ScreenFragment("Users"), Logging { if (pos != null) { val html = "${model.gpsString(pos)}" + }'>${pos.gpsString(gpsFormat)}" holder.coordsView.text = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY) holder.coordsView.movementMethod = LinkMovementMethod.getInstance() holder.coordsView.visibility = View.VISIBLE @@ -224,7 +227,7 @@ class UsersFragment : ScreenFragment("Users"), Logging { } val ourNodeInfo = model.ourNodeInfo.value - val distance = ourNodeInfo?.distanceStr(n, model.config.display.units.number) + val distance = ourNodeInfo?.distanceStr(n, displayUnits) if (distance != null) { holder.distanceView.text = distance holder.distanceView.visibility = View.VISIBLE diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/MapFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/map/MapFragment.kt index cf35248f..72b55a90 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/map/MapFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/map/MapFragment.kt @@ -81,11 +81,9 @@ import org.osmdroid.util.GeoPoint import org.osmdroid.views.CustomZoomButtonsController import org.osmdroid.views.MapView import org.osmdroid.views.overlay.CopyrightOverlay -import org.osmdroid.views.overlay.DefaultOverlayManager import org.osmdroid.views.overlay.MapEventsOverlay import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.Polygon -import org.osmdroid.views.overlay.TilesOverlay import org.osmdroid.views.overlay.gridlines.LatLonGridlineOverlay2 import org.osmdroid.views.overlay.infowindow.InfoWindow import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay @@ -188,23 +186,28 @@ fun MapView(model: UIViewModel = viewModel()) { var showEditWaypointDialog by remember { mutableStateOf(null) } var showCurrentCacheInfo by remember { mutableStateOf(false) } + val markerIcon by lazy { + AppCompatResources.getDrawable(context, R.drawable.ic_baseline_location_on_24) + } + fun MapView.onNodesChanged(nodes: Collection): List { val nodesWithPosition = nodes.filter { it.validPosition != null } - val ic = ContextCompat.getDrawable(context, R.drawable.ic_baseline_location_on_24) val ourNode = model.ourNodeInfo.value + val gpsFormat = model.config.display.gpsFormat.number + val displayUnits = model.config.display.units.number return nodesWithPosition.map { node -> val (p, u) = node.position!! to node.user!! - MarkerWithLabel(this, "${u.longName} ${formatAgo(p.time)}").apply { + MarkerWithLabel(this, "${u.shortName} ${formatAgo(p.time)}").apply { id = u.id title = "${u.longName} ${node.batteryStr}" - snippet = model.gpsString(p) - ourNode?.distanceStr(node, model.config.display.units.number)?.let { dist -> + snippet = p.gpsString(gpsFormat) + ourNode?.distanceStr(node, displayUnits)?.let { dist -> subDescription = context.getString(R.string.map_subDescription, ourNode.bearing(node), dist) } setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) position = GeoPoint(p.latitude, p.longitude) - icon = ic + icon = markerIcon } } } @@ -594,7 +597,6 @@ fun MapView(model: UIViewModel = viewModel()) { setTileSource(loadOnlineTileSourceBase()) setDestroyMode(false) // keeps map instance alive when in the background isVerticalMapRepetitionEnabled = false // disables map repetition - overlayManager = DefaultOverlayManager(TilesOverlay(tileProvider, context)) setMultiTouchControls(true) setScrollableAreaLimitLatitude( // bounds scrollable map overlayManager.tilesOverlay.bounds.actualNorth,