From ef11af6e0b3a574fdcfd112ded3410041688880d Mon Sep 17 00:00:00 2001 From: Andre K Date: Sun, 27 Aug 2023 06:31:27 -0300 Subject: [PATCH] refactor(map): remove fixed zoom level for offline downloads (#694) --- .../mesh/model/map/CustomOverlayManager.kt | 25 ------ .../com/geeksville/mesh/ui/map/MapFragment.kt | 50 ++++++------ .../mesh/ui/map/components/CacheLayout.kt | 76 ++----------------- app/src/main/res/values-bg/strings.xml | 3 - app/src/main/res/values-cs/strings.xml | 3 - app/src/main/res/values-de/strings.xml | 3 - app/src/main/res/values-el/strings.xml | 3 - app/src/main/res/values-fr/strings.xml | 3 - app/src/main/res/values-hu/strings.xml | 3 - app/src/main/res/values-is/strings.xml | 3 - app/src/main/res/values-it/strings.xml | 3 - app/src/main/res/values-ja/strings.xml | 3 - app/src/main/res/values-ko/strings.xml | 3 - app/src/main/res/values-nb/strings.xml | 3 - app/src/main/res/values-pl/strings.xml | 3 - app/src/main/res/values-pt-rBR/strings.xml | 3 - app/src/main/res/values-pt/strings.xml | 3 - app/src/main/res/values-ru/strings.xml | 3 - app/src/main/res/values-uk/strings.xml | 3 - app/src/main/res/values-zh/strings.xml | 3 - app/src/main/res/values/strings.xml | 3 - 21 files changed, 30 insertions(+), 175 deletions(-) delete mode 100644 app/src/main/java/com/geeksville/mesh/model/map/CustomOverlayManager.kt diff --git a/app/src/main/java/com/geeksville/mesh/model/map/CustomOverlayManager.kt b/app/src/main/java/com/geeksville/mesh/model/map/CustomOverlayManager.kt deleted file mode 100644 index 157ebc647..000000000 --- a/app/src/main/java/com/geeksville/mesh/model/map/CustomOverlayManager.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.geeksville.mesh.model.map - -import android.view.MotionEvent -import org.osmdroid.views.MapView -import org.osmdroid.views.overlay.DefaultOverlayManager -import org.osmdroid.views.overlay.TilesOverlay - -/** - * CustomOverlayManager with disabled double taps events - */ -class CustomOverlayManager(tilesOverlay: TilesOverlay?) : DefaultOverlayManager(tilesOverlay) { - /** - * Override event & do nothing - */ - override fun onDoubleTap(e: MotionEvent?, pMapView: MapView?): Boolean { - return true - } - - /** - * Override event & do nothing - */ - override fun onDoubleTapEvent(e: MotionEvent?, pMapView: MapView?): Boolean { - return true - } -} \ No newline at end of file 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 087052e12..4a039ea02 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 @@ -49,7 +49,6 @@ import com.geeksville.mesh.android.hasLocationPermission import com.geeksville.mesh.copy import com.geeksville.mesh.database.entity.Packet import com.geeksville.mesh.model.UIViewModel -import com.geeksville.mesh.model.map.CustomOverlayManager import com.geeksville.mesh.model.map.CustomTileSource import com.geeksville.mesh.model.map.MarkerWithLabel import com.geeksville.mesh.ui.ScreenFragment @@ -69,6 +68,9 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import org.osmdroid.config.Configuration import org.osmdroid.events.MapEventsReceiver +import org.osmdroid.events.MapListener +import org.osmdroid.events.ScrollEvent +import org.osmdroid.events.ZoomEvent import org.osmdroid.tileprovider.cachemanager.CacheManager import org.osmdroid.tileprovider.modules.SqliteArchiveTileWriter import org.osmdroid.tileprovider.tilesource.ITileSource @@ -119,16 +121,9 @@ fun MapView(model: UIViewModel = viewModel()) { var cacheEstimate by remember { mutableStateOf("") } // constants - val defaultMinZoom = 1.5 - val defaultMaxZoom = 18.0 val prefsName = "org.geeksville.osm.prefs" val mapStyleId = "map_style_id" - // Distance of bottom corner to top corner of bounding box - val zoomLevelLowest = 13.0 // approx 5 miles long - val zoomLevelMiddle = 12.25 // approx 10 miles long - val zoomLevelHighest = 11.5 // approx 15 miles long - var zoomLevelMin = 0.0 var zoomLevelMax = 0.0 @@ -488,6 +483,7 @@ fun MapView(model: UIViewModel = viewModel()) { val id = mPrefs.getInt(mapStyleId, 1) debug("mapStyleId from prefs: $id") return CustomTileSource.getTileSource(id).also { + map.maxZoomLevel = it.maximumZoomLevel.toDouble() showDownloadButton = if (it is OnlineTileSourceBase) it.tileSourcePolicy.acceptsBulkDownload() else false } @@ -496,18 +492,11 @@ fun MapView(model: UIViewModel = viewModel()) { /** * Creates Box overlay showing what area can be downloaded */ - fun MapView.generateBoxOverlay(zoomLevel: Double) { - if (overlayManager !is CustomOverlayManager) { - overlayManager = CustomOverlayManager(TilesOverlay(tileProvider, context)) - setMultiTouchControls(false) - zoomLevelMax = tileProvider.tileSource.maximumZoomLevel.toDouble() - drawOverlays() - } else { - overlays.removeAll(overlays.filterIsInstance()) - } + fun MapView.generateBoxOverlay() { + overlays.removeAll(overlays.filterIsInstance()) val zoomFactor = 1.3 // zoom difference between view and download area polygon - controller.setZoom(zoomLevel - zoomFactor) - zoomLevelMin = zoomLevel + zoomLevelMax = maxZoomLevel + zoomLevelMin = maxOf(zoomLevelDouble, maxZoomLevel) downloadRegionBoundingBox = boundingBox.zoomIn(zoomFactor) val polygon = Polygon().apply { points = Polygon.pointsAsRect(downloadRegionBoundingBox).map { @@ -518,7 +507,7 @@ fun MapView(model: UIViewModel = viewModel()) { val tileCount: Int = CacheManager(this).possibleTilesInArea( downloadRegionBoundingBox, zoomLevelMin.toInt(), - zoomLevelMax.toInt() + zoomLevelMax.toInt(), ) cacheEstimate = context.getString(R.string.map_cache_tiles, tileCount) } @@ -577,7 +566,7 @@ fun MapView(model: UIViewModel = viewModel()) { when (which) { 0 -> showCurrentCacheInfo = true 1 -> { - map.generateBoxOverlay(zoomLevelHighest) + map.generateBoxOverlay() dialog.dismiss() } @@ -615,17 +604,25 @@ fun MapView(model: UIViewModel = viewModel()) { // scales the map tiles to the display density of the screen isTilesScaledToDpi = true // sets the minimum zoom level (the furthest out you can zoom) - minZoomLevel = defaultMinZoom - maxZoomLevel = defaultMaxZoom + minZoomLevel = 1.5 // Disables default +/- button for zooming zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER) + addMapListener(object : MapListener { + override fun onScroll(event: ScrollEvent): Boolean { + if (downloadRegionBoundingBox != null) generateBoxOverlay() + return true + } + + override fun onZoom(event: ZoomEvent): Boolean { + return false + } + }) zoomToNodes() } }, modifier = Modifier.fillMaxSize(), update = { map -> if (downloadRegionBoundingBox == null) map.drawOverlays() - else map.generateBoxOverlay(zoomLevelMin) }, ) if (downloadRegionBoundingBox != null) CacheLayout( @@ -633,10 +630,7 @@ fun MapView(model: UIViewModel = viewModel()) { onExecuteJob = { startDownload() }, onCancelDownload = { downloadRegionBoundingBox = null - map.apply { - overlayManager = DefaultOverlayManager(TilesOverlay(tileProvider, context)) - setMultiTouchControls(true) - } + map.overlays.removeAll(map.overlays.filterIsInstance()) }, modifier = Modifier.align(Alignment.BottomCenter) ) else Column( diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt b/app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt index f33164eeb..1ebffafdc 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt @@ -8,23 +8,16 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.material.Button -import androidx.compose.material.ButtonDefaults import androidx.compose.material.ContentAlpha import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.geeksville.mesh.R @@ -36,8 +29,6 @@ fun CacheLayout( onCancelDownload: () -> Unit, modifier: Modifier = Modifier, ) { - var selectedDistance by remember { mutableStateOf(5) } - Column( modifier = modifier .fillMaxWidth() @@ -50,106 +41,55 @@ fun CacheLayout( modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = MaterialTheme.typography.h5, - color = MaterialTheme.colors.onBackground.copy(alpha = ContentAlpha.medium) + color = MaterialTheme.colors.onBackground.copy(alpha = ContentAlpha.medium), ) Spacer(modifier = Modifier.height(8.dp)) - val distances = listOf(5, 10, 15) - val selectedDistanceIndex = distances.indexOf(selectedDistance) - -// ToggleButton( -// options = distances.map { it.toString() }, -// selectedOptionIndex = selectedDistanceIndex, -// onOptionSelected = { selectedDistance = distances[it] }, -// ) - -// Spacer(modifier = Modifier.height(16.dp)) - Text( text = stringResource(R.string.map_tile_download_estimate) + " " + cacheEstimate, modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = MaterialTheme.typography.body1, - color = MaterialTheme.colors.onBackground.copy(alpha = ContentAlpha.medium) + color = MaterialTheme.colors.onBackground.copy(alpha = ContentAlpha.medium), ) Row( modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { Button( onClick = onCancelDownload, modifier = Modifier .weight(1f) - .padding(start = 8.dp) + .padding(start = 8.dp), ) { Text( text = stringResource(id = R.string.cancel), - color = MaterialTheme.colors.onPrimary + color = MaterialTheme.colors.onPrimary, ) } Button( onClick = onExecuteJob, modifier = Modifier .weight(1f) - .padding(end = 8.dp) + .padding(end = 8.dp), ) { Text( text = stringResource(id = R.string.map_start_download), - color = MaterialTheme.colors.onPrimary + color = MaterialTheme.colors.onPrimary, ) } } } } -@Composable -fun ToggleButton( - options: List, - selectedOptionIndex: Int, - onOptionSelected: (Int) -> Unit -) { - val backgroundColor = MaterialTheme.colors.background - val selectedColor = MaterialTheme.colors.primary - val textColor = MaterialTheme.colors.onBackground.copy(alpha = ContentAlpha.medium) - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - options.forEachIndexed { index, option -> - val isSelected = index == selectedOptionIndex - - Button( - onClick = { onOptionSelected(index) }, - colors = ButtonDefaults.buttonColors( - backgroundColor = if (isSelected) selectedColor else backgroundColor, - contentColor = textColor - ), - modifier = Modifier.weight(1f) - ) { - Text( - text = option, - textAlign = TextAlign.Center, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - - if (index != options.lastIndex) { - Spacer(modifier = Modifier.width(8.dp)) - } - } - } -} - @Preview(showBackground = true) @Composable private fun CacheLayoutPreview() { CacheLayout( cacheEstimate = "100 tiles", onExecuteJob = { }, - onCancelDownload = { } + onCancelDownload = { }, ) } diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 556e74a28..58cc46f1c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -138,9 +138,6 @@ Нулиране на базата данни с възли Това ще изчисти всички възли от този списък. Избор на регион за сваляне - 5 мили - 10 мили - 15 мили Прогноза за изтегляне на картинки: Започни свалянето Поискване на позиция diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 9fbebbf27..fada38792 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -141,9 +141,6 @@ Reset NodeDB Tímto vymažete všechny uzly z tohoto seznamu. Vyberte oblast stahování - 5 mil - 10 mil - 15 mil Odhad stažení dlaždic: Zahájit stahování Vyžádat pozici diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5c1a67c54..b7bfea54f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -139,9 +139,6 @@ Node-Datenbank zurücksetzen Dies löscht alle Knoten von dieser Liste. Herunterlade-Region auswählen - 5 Meilen/8 km - 10 Meilen/15 km - 15 Meilen/24 km Kachel-Herunterladen-Schätzung: Herunterladen starten Position anfordern diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index aa1143827..d368a9dbb 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -140,9 +140,6 @@ NodeDB reset Αυτό θα καθαρίσει όλους τους κόμβους από αυτήν τη λίστα. Επιλογή περιοχής λήψης - 5 Μίλια - 10 μίλια - 15 μίλια Tile download estimate: Εκκίνηση Λήψης Αίτηση θέσης diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a0078ae03..853aeb072 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -137,9 +137,6 @@ Reconfiguration de NodeDB Ceci effacera tous les nœuds de cette liste. Sélectionnez la région de téléchargement - 8 kilomètres - 16 kilomètres - 24 kilomètres Estimation du téléchargement de tuiles : Commencer le téléchargement Demander la position diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ead227aa1..b97eb301f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -139,9 +139,6 @@ NodeDB törlése Ezzel minden állomást törölni fogsz erről listáról. Válassz letöltési régiót - 5 mérföld - 10 mérföld - 15 mérföld Csempe letöltés számítása: Letöltés indítása Pozíció kérése diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index e0990ee91..81d2bd5ad 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -137,9 +137,6 @@ Endurræsa NodeDB Þetta mun hreinsa út allar nóður af listanum. Veldu svæði til að niðurhala - 8 kílómetrar - 16 kílómetrar - 24 kílómetrar Áætlaður niðurhalstími reits: Hefja niðurhal Óska eftir staðsetningu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1560cb452..f1e74b872 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -137,9 +137,6 @@ NodeDB reset Questo cancellerà tutti i nodi da questo elenco. Seleziona regione di download - 5 Miles - 10 miles - 15 miles Tile stima download: Inizia download Richiedi posizione diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2aee8992d..0b33c9a37 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -136,9 +136,6 @@ NodeDBをリセット このノードリストをクリアします。 ダウンロードリージョンを選択する - 5 マイル - 10 マイル - 15 マイル タイルダウンロードの見積もり: ダウンロード開始 位置を求める diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 0c33c76c4..e4d03d642 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -130,9 +130,6 @@ NodeDB 리셋 이 목록의 모든 노드가 지워집니다. 다운로드 지역 선택 - 8 Km - 16 Km - 24 Km 타일 다운로드 예상: 다운로드 시작 위치 요청 diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 2c5a21fb4..1e45cf25f 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -131,9 +131,6 @@ NodeDB reset This will clear all nodes from this list. Select download region - 5 Miles - 10 miles - 15 miles Tile download estimate: Start Download Request position diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 23a652f62..ed4072dac 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -141,9 +141,6 @@ NodeDB reset To spowoduje usunięcie wszystkich węzłów z listy. Wybierz region do pobrania - 5 mil - 10 mil - 15 mil Szacowany czas pobrania: Rozpocznij pobieranie Poproś o pozycję diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 623a80a6d..606f3ec9a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -137,9 +137,6 @@ Redefinir NodeDB Isto limpará todos os dispositivos desta lista. Selecione a região para download - 5 milhas - 10 milhas - 15 milhas Estimativa de download do bloco: Iniciar download Solicitar posição diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 6415eb29e..b9548eafc 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -137,9 +137,6 @@ Redefinir NodeDB Isto limpará todos os dispositivos desta lista. Selecione a região para download - 5 milhas - 10 milhas - 15 milhas Estimativa de download do bloco: Iniciar download Solicitar posição diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ed52876cc..d4f09837c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -141,9 +141,6 @@ Очистка списка узлов сети Это очистит все узлы из этого списка. Выберите регион загрузки - 5 Миль - 10 миль - 15 миль Предполагаемое время загрузки файла: Начать скачивание Запросить позицию diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index cedc96e40..ad5d9dcd7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -141,9 +141,6 @@ Очищення бази вузлів Це очистить усі вузли зі списку. Оберіть регіон завантаження - 5 миль - 10 миль - 15 миль Час завантаження фрагментів: Почати завантаження Запит місцезнаходження diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 36b7b924d..40e574d48 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -136,9 +136,6 @@ 节点数据库重置 这将从该列表中清除所有节点。 选择下载地区 - 5英里 - 10英里 - 15英里 瓷砖下载估计: 开始下载 要求位置 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bde0781e0..c99c9849d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -154,9 +154,6 @@ Add \'%s\' to ignore list? Your radio will reboot after making this change. Remove \'%s\' from ignore list? Your radio will reboot after making this change. Select download region - 5 Miles - 10 miles - 15 miles Tile download estimate: Start Download Request position