Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ Lib: Fix issue with failed tile downloads
Lib: Use two decimal precision for average speed
Android: Fix sensor scanning state handling for internal and Ble sensors.
Android: Fix handling of unpaired power meters
GTK: Add support for Nominatim reverse
1 change: 1 addition & 0 deletions aat-gtk/src/main/kotlin/ch/bailu/aat_gtk/config/Strings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ object Strings {
const val ACTION_LOCATION_COPY = "locationCopy"
const val ACTION_LOCATION_PASTE = "locationPaste"
const val ACTION_LOCATION_REVERSE = "locationReverse"
const val ACTION_LOCATION_REVERSE_CENTER = "locationReverseCenter"
const val ACTION_LOCATION_CM = "locationCM"

// Custom widgets
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,61 @@
package ch.bailu.aat_gtk.view.menu.provider

import ch.bailu.aat_gtk.app.GtkAppContext
import ch.bailu.aat_gtk.config.Strings
import ch.bailu.aat_gtk.controller.ClipboardController
import ch.bailu.aat_gtk.controller.UiControllerInterface
import ch.bailu.aat_gtk.view.map.GtkCustomMapView
import ch.bailu.aat_gtk.view.menu.MenuHelper
import ch.bailu.aat_lib.api.cm.CmApi
import ch.bailu.aat_lib.api.nominatim.NominatimReverseApi
import ch.bailu.aat_lib.app.AppContext
import ch.bailu.aat_lib.dispatcher.DispatcherInterface
import ch.bailu.aat_lib.gpx.GpxPointNode
import ch.bailu.aat_lib.gpx.attributes.GpxAttributes
import ch.bailu.aat_lib.gpx.attributes.Keys
import ch.bailu.aat_lib.gpx.information.GpxInformation
import ch.bailu.aat_lib.gpx.information.InfoID
import ch.bailu.aat_lib.logger.AppLog
import ch.bailu.aat_lib.preferences.StorageInterface
import ch.bailu.aat_lib.preferences.map.SolidMapGrid
import ch.bailu.aat_lib.preferences.map.overlay.SolidNominatimReverseOverlay
import ch.bailu.aat_lib.preferences.system.SolidDataDirectory
import ch.bailu.aat_lib.resources.Res
import ch.bailu.aat_lib.resources.ToDo
import ch.bailu.gtk.gdk.Display
import ch.bailu.gtk.gio.Menu
import ch.bailu.gtk.gtk.Application
import ch.bailu.gtk.type.Str
import org.mapsforge.map.view.MapView
import kotlin.text.ifEmpty

class LocationMenu : MenuProviderInterface {
override fun createMenu(): Menu {
return Menu().apply {
append(Res.str().clipboard_copy(), MenuHelper.toAppAction(Strings.ACTION_LOCATION_COPY))
append(Res.str().clipboard_paste(), MenuHelper.toAppAction(Strings.ACTION_LOCATION_PASTE))
appendSection(Str.NULL, Menu().apply {
append(ToDo.translate("About location"), MenuHelper.toAppAction(Strings.ACTION_LOCATION_REVERSE))
append(ToDo.translate("CM locations"), MenuHelper.toAppAction(Strings.ACTION_LOCATION_CM))
append(
Res.str().clipboard_paste(),
MenuHelper.toAppAction(Strings.ACTION_LOCATION_PASTE)
)
appendSection(ToDo.translate("Reverse Nominatim"), Menu().apply {
append(
ToDo.translate("Query"),
MenuHelper.toAppAction(Strings.ACTION_LOCATION_REVERSE)
)
append(
ToDo.translate("Center"),
MenuHelper.toAppAction(Strings.ACTION_LOCATION_REVERSE_CENTER)
)
})

if (CmApi.ENABLED) {
appendSection(Str.NULL, Menu().apply {
append(
ToDo.translate("CM locations"),
MenuHelper.toAppAction(Strings.ACTION_LOCATION_CM)
)
})
}
}
}

Expand All @@ -38,9 +70,31 @@ class LocationMenu : MenuProviderInterface {
override fun updateActionValues(app: Application) {}

companion object {
fun createActions(storageInterface: StorageInterface, app: Application, display: Display, uiController: UiControllerInterface) {
val clipboard = ClipboardController(display)
/**
* Independent closure for handling menu actions
*/
fun createActions(
app: Application,
appContext: AppContext,
display: Display,
mapView: MapView,
dispatcher: DispatcherInterface,
uiController: UiControllerInterface
) {

createActionsClipboard(app, appContext.storage, display, uiController)
createActionsNominatimReverse(app, appContext, mapView, uiController, dispatcher)
createActionsCm(app, appContext.dataDirectory)

}

private fun createActionsClipboard(
app: Application,
storage: StorageInterface,
display: Display,
uiController: UiControllerInterface
) {
val clipboard = ClipboardController(display)
MenuHelper.setAction(app, Strings.ACTION_LOCATION_PASTE) {
clipboard.getLatLong {
AppLog.i(this, it.toString())
Expand All @@ -49,19 +103,69 @@ class LocationMenu : MenuProviderInterface {
}

MenuHelper.setAction(app, Strings.ACTION_LOCATION_COPY) {
val sgrid = SolidMapGrid(storageInterface, GtkCustomMapView.DEFAULT_KEY)
val text = sgrid.getCode(uiController.getMapBounding().center.toLatLong()).toString()
val sgrid = SolidMapGrid(storage, GtkCustomMapView.DEFAULT_KEY)
val text =
sgrid.getCode(uiController.getMapBounding().center.toLatLong()).toString()

AppLog.i(this, text)
clipboard.setText(sgrid.getCode(uiController.getMapBounding().center.toLatLong()).toString())
clipboard.setText(
sgrid.getCode(uiController.getMapBounding().center.toLatLong()).toString()
)
}
}

private fun createActionsCm(app: Application, dataDirectory: SolidDataDirectory) {
val cmApi = CmApi(dataDirectory)
MenuHelper.setAction(app, Strings.ACTION_LOCATION_CM) {
cmApi.startTask(GtkAppContext)
}

}

private fun createActionsNominatimReverse(
app: Application,
appContext: AppContext,
mapView: MapView,
uiController: UiControllerInterface,
dispatcher: DispatcherInterface
) {
val soverlay = SolidNominatimReverseOverlay(appContext.dataDirectory)
val reverseApi = NominatimReverseApi(soverlay)
var isUpdated = false

MenuHelper.setAction(app, Strings.ACTION_LOCATION_REVERSE) {
AppLog.d(this,uiController.getMapBounding().center.toLatLong().toString() + " -> query/nominatim-reverse.json")
if (!reverseApi.isTaskRunning(GtkAppContext.services)) {
reverseApi.startTask(
GtkAppContext,
uiController.getMapBounding().center,
mapView.model.mapViewPosition.zoomLevel.toInt()
)
soverlay.setEnabled(true)
isUpdated = true
}
}

MenuHelper.setAction(app, Strings.ACTION_LOCATION_CM) {
AppLog.d(this, "https://api-gw.criticalmaps.net/locations -> query/cm.json")
MenuHelper.setAction(app, Strings.ACTION_LOCATION_REVERSE_CENTER) {
uiController.centerInMap(soverlay.getIID())
}


dispatcher.addTarget({ iid: Int, info: GpxInformation ->
if (isUpdated) {
val firstNode = info.getGpxList().pointList.first
if (firstNode is GpxPointNode) {
AppLog.i(this, getMessage(firstNode.getAttributes()))
}
isUpdated = false
}
}, InfoID.NOMINATIM_REVERSE)
}

private fun getMessage(attributes: GpxAttributes): String {
return attributes[Keys.toIndex("name")].ifEmpty {
attributes[Keys.toIndex("city")].ifEmpty {
attributes[Keys.toIndex("label")]
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import ch.bailu.aat_gtk.util.GtkTimer
import ch.bailu.aat_gtk.view.dialog.FileChangedDialog
import ch.bailu.aat_gtk.view.dialog.PreferencesDialog
import ch.bailu.aat_gtk.view.map.GtkCustomMapView
import ch.bailu.aat_gtk.view.menu.provider.LocationMenu
import ch.bailu.aat_gtk.view.messages.MessageOverlay
import ch.bailu.aat_gtk.view.search.PoiPage
import ch.bailu.aat_gtk.view.toplevel.navigation.NavigationView
Expand All @@ -33,8 +32,8 @@ import ch.bailu.aat_lib.dispatcher.usage.UsageTrackers
import ch.bailu.aat_lib.gpx.information.GpxInformation
import ch.bailu.aat_lib.gpx.information.InfoID
import ch.bailu.aat_lib.gpx.information.InformationUtil
import ch.bailu.aat_lib.preferences.map.overlay.SolidOverlayFileEnabled
import ch.bailu.aat_lib.preferences.map.SolidPositionLock
import ch.bailu.aat_lib.preferences.map.overlay.SolidOverlayFileEnabled
import ch.bailu.aat_lib.resources.Res
import ch.bailu.foc.Foc
import ch.bailu.gtk.adw.Application
Expand Down Expand Up @@ -116,8 +115,6 @@ class MainWindow(private val app: Application, private val appContext: AppContex
window.onDestroy {
exit(dispatcher, 0)
}

LocationMenu.createActions(appContext.storage, app, window.display, this)
}

private fun clearEditor(onCleared: ()->Unit) {
Expand Down Expand Up @@ -255,6 +252,8 @@ class MainWindow(private val app: Application, private val appContext: AppContex
dispatcher.addOverlaySources(appContext, usageTrackers)
dispatcher.addSource(FixedOverlaySource.createDraftSource(appContext, usageTrackers))
dispatcher.addSource(FixedOverlaySource.createPoiSource(appContext, usageTrackers))
dispatcher.addSource(FixedOverlaySource.createCmSource(appContext, usageTrackers))
dispatcher.addSource(FixedOverlaySource.createNominatimReverseSource(appContext, usageTrackers))
dispatcher.addSource(editorSource)
dispatcher.addTarget(metaInfoCollector, InfoID.ALL)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import ch.bailu.aat_gtk.view.map.control.InfoBar
import ch.bailu.aat_gtk.view.map.control.MainBar
import ch.bailu.aat_gtk.view.map.control.NavigationBar
import ch.bailu.aat_gtk.view.map.control.NodeInfo
import ch.bailu.aat_gtk.view.menu.provider.LocationMenu
import ch.bailu.aat_gtk.view.toplevel.navigation.NavigationView
import ch.bailu.aat_lib.app.AppContext
import ch.bailu.aat_lib.dispatcher.DispatcherInterface
Expand Down Expand Up @@ -147,6 +148,8 @@ class MapMainView(
overlay.addOverlay(statusLabel.box)

showMainBar()

LocationMenu.createActions(app, appContext, window.display, map, dispatcher, uiController)
}

private fun addBar(bar: Bar) {
Expand Down
4 changes: 4 additions & 0 deletions aat-lib/src/main/java/ch/bailu/aat_lib/api/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import ch.bailu.aat_lib.service.ServicesInterface
import ch.bailu.aat_lib.service.background.FileTask
import ch.bailu.foc.Foc

/**
* Abstract base class for all APIs
* startTask uses individual implementations
*/
abstract class Api(private val overlay: SolidOverlayInterface) {
val apiName: String
get() = overlay.getLabel()
Expand Down
3 changes: 3 additions & 0 deletions aat-lib/src/main/java/ch/bailu/aat_lib/api/cm/CmApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@ class CmApi(baseDirectory: SolidDataDirectory) : Api(SolidCriticalMapOverlay(bas
background.process(task)
}
}
companion object {
const val ENABLED = false // TODO handle as experimental feature and enable via env variable
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ package ch.bailu.aat_lib.dispatcher.source

import ch.bailu.aat_lib.app.AppContext
import ch.bailu.aat_lib.dispatcher.usage.UsageTrackerInterface
import ch.bailu.aat_lib.gpx.information.InfoID
import ch.bailu.aat_lib.preferences.StorageInterface
import ch.bailu.aat_lib.util.fs.AppDirectory
import ch.bailu.aat_lib.preferences.map.overlay.SolidCriticalMapOverlay
import ch.bailu.aat_lib.preferences.map.overlay.SolidDraftOverlay
import ch.bailu.aat_lib.preferences.map.overlay.SolidFixedOverlay
import ch.bailu.aat_lib.preferences.map.overlay.SolidNominatimReverseOverlay
import ch.bailu.aat_lib.preferences.map.overlay.SolidPoiOverlay

class FixedOverlaySource(context: AppContext, usageTracker: UsageTrackerInterface, private val directory: String, private val file: String, iid: Int):
FileSource(context, iid, usageTracker) {
class FixedOverlaySource(context: AppContext, usageTracker: UsageTrackerInterface, private val overlay: SolidFixedOverlay):
FileSource(context, overlay.getIID(), usageTracker) {

private val dataDirectory = context.dataDirectory

Expand All @@ -18,7 +21,7 @@ class FixedOverlaySource(context: AppContext, usageTracker: UsageTrackerInterfac
}

private fun onPreferencesChanged() {
setFile(dataDirectory.getValueAsFile().descendant(directory).child(file))
setFile(overlay.getValueAsFile())
}

override fun onResumeWithService() {
Expand All @@ -34,11 +37,23 @@ class FixedOverlaySource(context: AppContext, usageTracker: UsageTrackerInterfac

companion object {
fun createPoiSource(context: AppContext, usageTracker: UsageTrackerInterface): FileSource {
return FixedOverlaySource(context, usageTracker, AppDirectory.DIR_POI, AppDirectory.FILE_POI, InfoID.POI)
val overlay = SolidPoiOverlay(context.dataDirectory)
return FixedOverlaySource(context, usageTracker, overlay)
}

fun createDraftSource(context: AppContext, usageTracker: UsageTrackerInterface): FileSource {
return FixedOverlaySource(context, usageTracker, AppDirectory.DIR_EDIT, AppDirectory.FILE_DRAFT, InfoID.EDITOR_DRAFT)
val overlay = SolidDraftOverlay(context.dataDirectory)
return FixedOverlaySource(context, usageTracker, overlay)
}

fun createNominatimReverseSource(context: AppContext, usageTracker: UsageTrackerInterface): FileSource {
val overlay = SolidNominatimReverseOverlay(context.dataDirectory)
return FixedOverlaySource(context, usageTracker, overlay)
}

fun createCmSource(context: AppContext, usageTracker: UsageTrackerInterface): FileSource {
val overlay = SolidCriticalMapOverlay(context.dataDirectory)
return FixedOverlaySource(context, usageTracker, overlay)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package ch.bailu.aat_lib.gpx.information

import ch.bailu.aat_lib.api.cm.CmApi
import ch.bailu.aat_lib.preferences.map.overlay.SolidCustomOverlayList
import ch.bailu.aat_lib.resources.Res
import ch.bailu.aat_lib.resources.ToDo

object InformationUtil {

fun defaultName(iid: Int): String {
// TODO: use enum for this
when(iid) {
InfoID.POI -> return Res.str().p_mapsforge_poi()
InfoID.EDITOR_DRAFT -> return ToDo.translate("Draft")
Expand Down Expand Up @@ -45,6 +45,10 @@ object InformationUtil {
add(InfoID.EDITOR_OVERLAY)
add(InfoID.TRACKER)
add(InfoID.LIST_SUMMARY)
add(InfoID.NOMINATIM_REVERSE)
if (CmApi.ENABLED) {
add(InfoID.CRITICAL_MAP)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ class SolidBrouterOverlay(baseDirectory: SolidDataDirectory) :
SolidFixedOverlay(baseDirectory,
InfoID.BROUTER,
AppDirectory.DIR_QUERY,
AppDirectory.FILE_BROUTER)
AppDirectory.FILE_BROUTER)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ch.bailu.aat_lib.preferences.map.overlay

import ch.bailu.aat_lib.gpx.information.InfoID
import ch.bailu.aat_lib.preferences.system.SolidDataDirectory
import ch.bailu.aat_lib.util.fs.AppDirectory

class SolidDraftOverlay(baseDirectory: SolidDataDirectory) :
SolidFixedOverlay(baseDirectory,
InfoID.EDITOR_DRAFT,
AppDirectory.DIR_EDIT,
AppDirectory.FILE_DRAFT)
Loading