From 7db580a539633810b98a14131a2257f9550c6d62 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Mon, 5 Jun 2023 01:14:02 +0300 Subject: [PATCH 001/214] 16632: fixed crash; show items on group selection --- .../net/osmand/plus/NavigationService.java | 2 +- .../plus/auto/BaseOsmAndAndroidAutoScreen.kt | 2 +- .../net/osmand/plus/auto/FavoritesScreen.java | 15 ++- .../net/osmand/plus/auto/MapMarkersScreen.kt | 35 ++++- .../osmand/plus/auto/NavigationListener.kt | 1 - .../osmand/plus/auto/NavigationScreen.java | 106 +++++++-------- .../osmand/plus/auto/NavigationSession.java | 4 - OsmAnd/src/net/osmand/plus/auto/POIScreen.kt | 70 +++++++++- .../plus/views/layers/FavouritesLayer.java | 121 +++++++++++------- .../plus/views/layers/MapMarkersLayer.java | 26 +++- .../osmand/plus/views/layers/POIMapLayer.java | 8 ++ 11 files changed, 260 insertions(+), 130 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/NavigationService.java b/OsmAnd/src/net/osmand/plus/NavigationService.java index 1eb09f2c117..e283c5b86ec 100644 --- a/OsmAnd/src/net/osmand/plus/NavigationService.java +++ b/OsmAnd/src/net/osmand/plus/NavigationService.java @@ -311,7 +311,7 @@ public void updateCarNavigation(Location currentLocation) { destinations = Collections.singletonList(destination); } TravelEstimate lastStepTravelEstimate = tripHelper.getLastStepTravelEstimate(); - navigationScreen.updateTrip(true, routingHelper.isRouteBeingCalculated(), + navigationScreen.updateTrip(routingHelper.isRouteBeingCalculated(), false/*routingHelper.isRouteWasFinished()*/, destinations, trip.getSteps(), destinationTravelEstimate, lastStepTravelEstimate != null ? lastStepTravelEstimate.getRemainingDistance() : null, diff --git a/OsmAnd/src/net/osmand/plus/auto/BaseOsmAndAndroidAutoScreen.kt b/OsmAnd/src/net/osmand/plus/auto/BaseOsmAndAndroidAutoScreen.kt index c99137f9ff7..7f2c09cdb14 100644 --- a/OsmAnd/src/net/osmand/plus/auto/BaseOsmAndAndroidAutoScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/BaseOsmAndAndroidAutoScreen.kt @@ -58,6 +58,6 @@ abstract class BaseOsmAndAndroidAutoScreen(carContext: CarContext) : Screen(carC } companion object { - private const val DEFAULT_CONTENT_LIMIT = 12 + private const val DEFAULT_CONTENT_LIMIT = 100 } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java index 19dd23e4a05..c7457b0e8c0 100644 --- a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java @@ -21,6 +21,8 @@ import androidx.car.app.navigation.model.PlaceListNavigationTemplate; import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.IconCompat; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; @@ -60,6 +62,14 @@ public FavoritesScreen( this.settingsAction = settingsAction; this.surfaceRenderer = surfaceRenderer; selectedGroup = group; + getLifecycle().addObserver(new DefaultLifecycleObserver() { + @Override + public void onDestroy(@NonNull LifecycleOwner owner) { + DefaultLifecycleObserver.super.onDestroy(owner); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setAndroidAutoFavouritePoints(null); + getApp().getOsmandMap().refreshMap(); + } + }); } @NonNull @@ -83,7 +93,10 @@ protected int getConstraintLimitType() { private void setupFavorites(ItemList.Builder listBuilder) { LatLon location = getApp().getSettings().getLastKnownMapLocation(); int collectionSize = 0; - for (FavouritePoint point : getFavorites()) { + List favoritesPoints = getFavorites(); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setAndroidAutoFavouritePoints(favoritesPoints); + getApp().getOsmandMap().refreshMap(); + for (FavouritePoint point : favoritesPoints) { if (collectionSize == getContentLimit()) { break; } diff --git a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt index ab71282fa10..5d81f2babbc 100644 --- a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt @@ -3,9 +3,21 @@ package net.osmand.plus.auto import android.text.SpannableString import android.text.Spanned import androidx.car.app.CarContext -import androidx.car.app.model.* +import androidx.car.app.model.Action +import androidx.car.app.model.ActionStrip +import androidx.car.app.model.CarColor +import androidx.car.app.model.CarIcon +import androidx.car.app.model.CarLocation +import androidx.car.app.model.DistanceSpan +import androidx.car.app.model.ItemList +import androidx.car.app.model.Metadata +import androidx.car.app.model.Place +import androidx.car.app.model.Row +import androidx.car.app.model.Template import androidx.car.app.navigation.model.PlaceListNavigationTemplate import androidx.core.graphics.drawable.IconCompat +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import net.osmand.data.LatLon import net.osmand.plus.R import net.osmand.plus.mapmarkers.MapMarker @@ -18,15 +30,25 @@ class MapMarkersScreen( private val settingsAction: Action, private val surfaceRenderer: SurfaceRenderer) : BaseOsmAndAndroidAutoScreen(carContext) { + init { + lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + app.osmandMap.mapLayers.mapMarkersLayer.setAndroidAutoMarkers(null) + app.osmandMap.refreshMap() + } + }) + } + override fun onGetTemplate(): Template { val listBuilder = ItemList.Builder() - val markers = app.mapMarkersHelper.mapMarkers + val markersSize = app.mapMarkersHelper.mapMarkers.size + val markers = + app.mapMarkersHelper.mapMarkers.subList(0, markersSize.coerceAtMost(contentLimit - 1)) val location = app.settings.lastKnownMapLocation - var itemsCount = 0 + app.osmandMap.mapLayers.mapMarkersLayer.setAndroidAutoMarkers(markers) + app.osmandMap.refreshMap() for (marker in markers) { - if (itemsCount == contentLimit) { - break - } val title = marker.getName(app) val markerColor = MapMarker.getColorId(marker.colorIndex) val icon = CarIcon.Builder( @@ -56,7 +78,6 @@ class MapMarkersScreen( location.longitude)).build()).build()) } listBuilder.addItem(rowBuilder.build()) - itemsCount++ } val actionStripBuilder = ActionStrip.Builder() actionStripBuilder.addAction( diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationListener.kt b/OsmAnd/src/net/osmand/plus/auto/NavigationListener.kt index 005330bc0e3..d093b8dbb26 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationListener.kt +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationListener.kt @@ -2,6 +2,5 @@ package net.osmand.plus.auto interface NavigationListener { fun requestLocationNavigation(): Boolean - fun updateNavigation(navigating: Boolean) fun stopNavigation() } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java b/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java index 1902ee62f46..4c2de854e4c 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java @@ -46,7 +46,7 @@ import java.util.List; public final class NavigationScreen extends BaseOsmAndAndroidAutoScreen implements SurfaceRendererCallback, - IRouteInformationListener, DefaultLifecycleObserver { + IRouteInformationListener, DefaultLifecycleObserver { @NonNull private final NavigationListener listener; @@ -122,7 +122,6 @@ public void onFrameRendered(@NonNull Canvas canvas, @NonNull Rect visibleArea, @ * Updates the navigation screen with the next instruction. */ public void updateTrip( - boolean navigating, boolean rerouting, boolean arrived, @Nullable List destinations, @@ -132,7 +131,6 @@ public void updateTrip( boolean shouldShowNextStep, boolean shouldShowLanes, @Nullable CarIcon junctionImage) { - this.navigating = navigating; this.rerouting = rerouting; this.arrived = arrived; this.destinations = destinations; @@ -148,7 +146,6 @@ public void updateTrip( } public void stopTrip() { - navigating = false; rerouting = false; arrived = false; destinations = null; @@ -164,8 +161,7 @@ public void stopTrip() { } private void updateNavigation() { - listener.updateNavigation(navigating); - adjustMapPosition(navigating); + adjustMapPosition(true); } private void adjustMapPosition(boolean shiftMapIfSessionRunning) { @@ -192,19 +188,11 @@ public Template onGetTemplate() { .setOnClickListener(this::compassClick) .build()); actionStripBuilder.addAction(settingsAction); - if (navigating) { - actionStripBuilder.addAction( - new Action.Builder() - .setTitle(getApp().getString(R.string.shared_string_control_stop)) - .setOnClickListener(this::stopNavigation) - .build()); - } else { - actionStripBuilder.addAction( - new Action.Builder() - .setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_action_search_dark)).build()) - .setOnClickListener(this::openSearch) - .build()); - } + actionStripBuilder.addAction( + new Action.Builder() + .setTitle(getApp().getString(R.string.shared_string_control_stop)) + .setOnClickListener(this::stopNavigation) + .build()); builder.setActionStrip(actionStripBuilder.build()); // Set the map action strip with the pan and zoom buttons. @@ -273,52 +261,50 @@ public Template onGetTemplate() { invalidate(); }); - if (navigating) { - if (destinationTravelEstimate != null) { - builder.setDestinationTravelEstimate(destinationTravelEstimate); + if (destinationTravelEstimate != null) { + builder.setDestinationTravelEstimate(destinationTravelEstimate); + } + if (isRerouting()) { + builder.setNavigationInfo(new RoutingInfo.Builder().setLoading(true).build()); + } else if (arrived) { + MessageInfo messageInfo = new MessageInfo.Builder( + getCarContext().getString(R.string.arrived_at_destination)).build(); + builder.setNavigationInfo(messageInfo); + } else if (!Algorithms.isEmpty(steps)) { + RoutingInfo.Builder info = new RoutingInfo.Builder(); + Step firstStep = steps.get(0); + Step.Builder currentStep = new Step.Builder(); + CarText cue = firstStep.getCue(); + if (cue != null) { + currentStep.setCue(cue.toCharSequence()); } - if (isRerouting()) { - builder.setNavigationInfo(new RoutingInfo.Builder().setLoading(true).build()); - } else if (arrived) { - MessageInfo messageInfo = new MessageInfo.Builder( - getCarContext().getString(R.string.arrived_at_destination)).build(); - builder.setNavigationInfo(messageInfo); - } else if (!Algorithms.isEmpty(steps)) { - RoutingInfo.Builder info = new RoutingInfo.Builder(); - Step firstStep = steps.get(0); - Step.Builder currentStep = new Step.Builder(); - CarText cue = firstStep.getCue(); - if (cue != null) { - currentStep.setCue(cue.toCharSequence()); - } - Maneuver maneuver = firstStep.getManeuver(); - if (maneuver != null) { - currentStep.setManeuver(maneuver); - } - CarText road = firstStep.getRoad(); - if (road != null) { - currentStep.setRoad(road.toCharSequence()); - } - if (shouldShowLanes) { - for (Lane lane : firstStep.getLanes()) { - currentStep.addLane(lane); - } - CarIcon lanesImage = firstStep.getLanesImage(); - if (lanesImage != null) { - currentStep.setLanesImage(lanesImage); - } + Maneuver maneuver = firstStep.getManeuver(); + if (maneuver != null) { + currentStep.setManeuver(maneuver); + } + CarText road = firstStep.getRoad(); + if (road != null) { + currentStep.setRoad(road.toCharSequence()); + } + if (shouldShowLanes) { + for (Lane lane : firstStep.getLanes()) { + currentStep.addLane(lane); } - if (stepRemainingDistance != null) { - info.setCurrentStep(currentStep.build(), stepRemainingDistance); - if (shouldShowNextStep && steps.size() > 1) { - info.setNextStep(steps.get(1)); - } + CarIcon lanesImage = firstStep.getLanesImage(); + if (lanesImage != null) { + currentStep.setLanesImage(lanesImage); } - if (junctionImage != null) { - info.setJunctionImage(junctionImage); + } + if (stepRemainingDistance != null) { + info.setCurrentStep(currentStep.build(), stepRemainingDistance); + if (shouldShowNextStep && steps.size() > 1) { + info.setNextStep(steps.get(1)); } - builder.setNavigationInfo(info.build()); } + if (junctionImage != null) { + info.setJunctionImage(junctionImage); + } + builder.setNavigationInfo(info.build()); } return builder.build(); } diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java b/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java index c6ce66cfa8a..336cb26ae85 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java @@ -246,10 +246,6 @@ public boolean requestLocationNavigation() { return requestLocationPermission(); } - @Override - public void updateNavigation(boolean navigating) { - } - public void startNavigation() { createNavigationScreen(); getCarContext().getCarService(ScreenManager.class).push(navigationScreen); diff --git a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt index 83896fb247a..2f3335a4922 100644 --- a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt @@ -1,29 +1,52 @@ package net.osmand.plus.auto +import android.text.SpannableString +import android.text.Spanned import androidx.car.app.CarContext import androidx.car.app.model.Action import androidx.car.app.model.ActionStrip +import androidx.car.app.model.CarIcon +import androidx.car.app.model.CarLocation +import androidx.car.app.model.DistanceSpan import androidx.car.app.model.ItemList +import androidx.car.app.model.Metadata +import androidx.car.app.model.Place +import androidx.car.app.model.Row import androidx.car.app.model.Template import androidx.car.app.navigation.model.PlaceListNavigationTemplate +import androidx.core.graphics.drawable.IconCompat +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner import net.osmand.data.LatLon import net.osmand.plus.R import net.osmand.plus.poi.PoiUIFilter +import net.osmand.plus.render.RenderingIcons +import net.osmand.plus.utils.AndroidUtils import net.osmand.search.core.ObjectType import net.osmand.search.core.SearchCoreFactory import net.osmand.search.core.SearchPhrase import net.osmand.search.core.SearchResult +import net.osmand.util.Algorithms +import net.osmand.util.MapUtils class POIScreen( carContext: CarContext, private val settingsAction: Action, private val surfaceRenderer: SurfaceRenderer, private val group: PoiUIFilter -) : BaseOsmAndAndroidAutoSearchScreen(carContext) { - private var itemList: ItemList = withNoResults(ItemList.Builder()).build() +) : BaseOsmAndAndroidAutoSearchScreen(carContext), LifecycleObserver { + private lateinit var itemList: ItemList init { loadPOI() + lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + app.osmandMap.mapLayers.poiMapLayer.setAndroidAutoPoints(null) + app.osmandMap.refreshMap() + } + }) } override fun onGetTemplate(): Template { @@ -54,16 +77,56 @@ class POIScreen( searchResults: List?, itemList: ItemList?, resultsCount: Int) { + app.osmandMap.mapLayers.poiMapLayer.setAndroidAutoPoints(setOf(group)) + app.osmandMap.refreshMap() loading = false if (resultsCount == 0) { this.itemList = withNoResults(ItemList.Builder()).build() } else { - this.itemList = itemList!! + var builder = ItemList.Builder(); + setupPOI(builder, searchResults) + this.itemList = builder.build() } invalidate() } + private fun setupPOI(listBuilder: ItemList.Builder, searchResults: List?) { + val location = app.settings.lastKnownMapLocation + searchResults?.let { + for (point in searchResults) { + val title = point.localeName + var groupIcon = RenderingIcons.getBigIcon(app, group.iconId) + if (groupIcon == null) { + groupIcon = app.getDrawable(R.drawable.mx_special_custom_category) + } + val icon = CarIcon.Builder( + IconCompat.createWithBitmap(AndroidUtils.drawableToBitmap(groupIcon))).build() + val description = + if (point.alternateName != null) point.alternateName else "" + val dist = MapUtils.getDistance( + point.location.latitude, point.location.longitude, + location.latitude, location.longitude) + val address = + SpannableString(if (Algorithms.isEmpty(description)) " " else " • $description") + val distanceSpan = DistanceSpan.create(TripHelper.getDistance(app, dist)) + address.setSpan(distanceSpan, 0, 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE) + listBuilder.addItem(Row.Builder() + .setTitle(title) + .setImage(icon) + .addText(address) + .setOnClickListener { onClickSearchResult(point) } + .setMetadata( + Metadata.Builder().setPlace( + Place.Builder( + CarLocation.create( + point.location.latitude, + point.location.longitude)).build()).build()) + .build()) + } + } + } + private fun loadPOI() { val objectLocalizedName = group.name; val sr = SearchResult() @@ -74,7 +137,6 @@ class POIScreen( sr.objectType = ObjectType.POI_TYPE searchHelper.completeQueryWithObject(sr) loading = true - invalidate() } override fun onClickSearchResult(point: SearchResult) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java index 3dd55bc59be..e3d0c503d72 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import net.osmand.PlatformUtil; import net.osmand.core.android.MapRendererView; import net.osmand.core.jni.PointI; import net.osmand.core.jni.TextRasterizer; @@ -37,13 +38,16 @@ import net.osmand.plus.views.layers.core.FavoritesTileProvider; import net.osmand.util.Algorithms; +import org.apache.commons.logging.Log; + import java.util.ArrayList; import java.util.List; public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvider, - IMoveObjectProvider, MapTextProvider { + IMoveObjectProvider, MapTextProvider { private static final int START_ZOOM = 6; + private static final Log LOG = PlatformUtil.getLog(FavouritesLayer.class); private FavouritesHelper favouritesHelper; private MapMarkersHelper mapMarkersHelper; @@ -62,6 +66,8 @@ public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvi private boolean changeMarkerPositionMode; private long favoritesChangedTime; + private List androidAutoFavouritePoints = null; + //OpenGl private FavoritesTileProvider favoritesMapLayerProvider; @@ -111,6 +117,10 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) } } + public void setAndroidAutoFavouritePoints(@Nullable List points) { + androidAutoFavouritePoints = points; + } + @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { super.onPrepareBufferImage(canvas, tileBox, settings); @@ -130,7 +140,20 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett boolean favoritesChanged = this.favoritesChangedTime != favoritesChangedTime; this.favoritesChangedTime = favoritesChangedTime; - if (hasMapRenderer()) { + if (androidAutoFavouritePoints != null) { + cache.clear(); + float iconSize = getIconSize(view.getApplication()); + QuadTree boundIntersections = initBoundIntersections(tileBox); + QuadRect latLonBounds = tileBox.getLatLonBounds(); + List fullObjectsLatLon = new ArrayList<>(); + List smallObjectsLatLon = new ArrayList<>(); + drawPoints(androidAutoFavouritePoints, latLonBounds, false, tileBox, boundIntersections, iconSize, canvas, fullObjectsLatLon, smallObjectsLatLon); + this.fullObjectsLatLon = fullObjectsLatLon; + this.smallObjectsLatLon = smallObjectsLatLon; + if (textVisible) { + textLayer.putData(this, cache); + } + } else if (hasMapRenderer()) { if (mapActivityInvalidated || mapRendererChanged || nightModeChanged || showFavoritesChanged || favoritesChanged || textScaleChanged || textVisibleChanged) { showFavorites(); @@ -148,49 +171,8 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett List fullObjectsLatLon = new ArrayList<>(); List smallObjectsLatLon = new ArrayList<>(); for (FavoriteGroup group : getFavoriteGroups()) { - List> fullObjects = new ArrayList<>(); - boolean synced = isSynced(group); - for (FavouritePoint favoritePoint : group.getPoints()) { - double lat = favoritePoint.getLatitude(); - double lon = favoritePoint.getLongitude(); - if (favoritePoint.isVisible() && favoritePoint != contextMenuLayer.getMoveableObject() - && lat >= latLonBounds.bottom && lat <= latLonBounds.top - && lon >= latLonBounds.left && lon <= latLonBounds.right) { - MapMarker marker = null; - if (synced) { - marker = mapMarkersHelper.getMapMarker(favoritePoint); - if (marker == null || marker.history && !view.getSettings().KEEP_PASSED_MARKERS_ON_MAP.get()) { - continue; - } - } - cache.add(favoritePoint); - float x = tileBox.getPixXFromLatLon(lat, lon); - float y = tileBox.getPixYFromLatLon(lat, lon); - - if (intersects(boundIntersections, x, y, iconSize, iconSize)) { - @ColorInt - int color; - if (marker != null && marker.history) { - color = grayColor; - } else { - color = favouritesHelper.getColorWithCategory(favoritePoint, defaultColor); - } - PointImageDrawable pointImageDrawable = PointImageDrawable.getFromFavorite( - getContext(), color, true, favoritePoint); - pointImageDrawable.drawSmallPoint(canvas, x, y, textScale); - smallObjectsLatLon.add(new LatLon(lat, lon)); - } else { - fullObjects.add(new Pair<>(favoritePoint, marker)); - fullObjectsLatLon.add(new LatLon(lat, lon)); - } - } - } - for (Pair pair : fullObjects) { - FavouritePoint favoritePoint = pair.first; - float x = tileBox.getPixXFromLatLon(favoritePoint.getLatitude(), favoritePoint.getLongitude()); - float y = tileBox.getPixYFromLatLon(favoritePoint.getLatitude(), favoritePoint.getLongitude()); - drawBigPoint(canvas, favoritePoint, x, y, pair.second, textScale); - } + drawPoints(group.getPoints(), latLonBounds, isSynced(group), tileBox, boundIntersections, iconSize, canvas, + fullObjectsLatLon, smallObjectsLatLon); } this.fullObjectsLatLon = fullObjectsLatLon; this.smallObjectsLatLon = smallObjectsLatLon; @@ -203,6 +185,55 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett mapActivityInvalidated = false; } + private void drawPoints(List pointsToDraw, QuadRect latLonBounds, boolean synced, RotatedTileBox tileBox, + QuadTree boundIntersections, float iconSize, Canvas canvas, + List fullObjectsLatLon, List smallObjectsLatLon) { + List> fullObjects = new ArrayList<>(); + + for (FavouritePoint favoritePoint : pointsToDraw) { + double lat = favoritePoint.getLatitude(); + double lon = favoritePoint.getLongitude(); + if (favoritePoint.isVisible() && favoritePoint != contextMenuLayer.getMoveableObject() + && lat >= latLonBounds.bottom && lat <= latLonBounds.top + && lon >= latLonBounds.left && lon <= latLonBounds.right) { + MapMarker marker = null; + if (synced) { + marker = mapMarkersHelper.getMapMarker(favoritePoint); + if (marker == null || marker.history && !view.getSettings().KEEP_PASSED_MARKERS_ON_MAP.get()) { + continue; + } + } + cache.add(favoritePoint); + float x = tileBox.getPixXFromLatLon(lat, lon); + float y = tileBox.getPixYFromLatLon(lat, lon); + + if (intersects(boundIntersections, x, y, iconSize, iconSize)) { + @ColorInt + int color; + if (marker != null && marker.history) { + color = grayColor; + } else { + color = favouritesHelper.getColorWithCategory(favoritePoint, defaultColor); + } + PointImageDrawable pointImageDrawable = PointImageDrawable.getFromFavorite( + getContext(), color, true, favoritePoint); + pointImageDrawable.drawSmallPoint(canvas, x, y, textScale); + smallObjectsLatLon.add(new LatLon(lat, lon)); + } else { + fullObjects.add(new Pair<>(favoritePoint, marker)); + fullObjectsLatLon.add(new LatLon(lat, lon)); + } + } + } + for (Pair pair : fullObjects) { + FavouritePoint favoritePoint = pair.first; + float x = tileBox.getPixXFromLatLon(favoritePoint.getLatitude(), favoritePoint.getLongitude()); + float y = tileBox.getPixYFromLatLon(favoritePoint.getLatitude(), favoritePoint.getLongitude()); + drawBigPoint(canvas, favoritePoint, x, y, pair.second, textScale); + } + + } + private boolean isSynced(@NonNull FavoriteGroup group) { MapMarkersGroup markersGroup = mapMarkersHelper.getMarkersGroup(group); return markersGroup != null && !markersGroup.isDisabled(); diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java index 20e4daa2abb..ff142176c67 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java @@ -19,9 +19,15 @@ import android.view.GestureDetector; import android.view.MotionEvent; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + import com.google.android.material.snackbar.Snackbar; import net.osmand.Location; +import net.osmand.PlatformUtil; import net.osmand.core.android.MapRendererView; import net.osmand.core.jni.FColorARGB; import net.osmand.core.jni.MapMarkerBuilder; @@ -65,19 +71,17 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; +import org.apache.commons.logging.Log; + import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; - public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvider, IContextMenuProviderSelection, ContextMenuLayer.IMoveObjectProvider { + private static final Log LOG = PlatformUtil.getLog(FavouritesLayer.class); private static final int START_ZOOM = 3; private static final long USE_FINGER_LOCATION_DELAY = 1000; private static final int MAP_REFRESH_MESSAGE = OsmAndConstants.UI_HANDLER_MAP_VIEW + 6; @@ -130,6 +134,8 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi private float textScale = 1f; private double markerSizePx; + private List androidAutoMarkers; + //OpenGL private int markersCount; private VectorLinesCollection vectorLinesCollection; @@ -267,12 +273,17 @@ public void initLayer(@NonNull OsmandMapTileView view) { initUI(); } + public void setAndroidAutoMarkers(@Nullable List markers) { + androidAutoMarkers = markers; + } + @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings drawSettings) { super.onPrepareBufferImage(canvas, tileBox, drawSettings); OsmandApplication app = getApplication(); OsmandSettings settings = app.getSettings(); - if (!settings.SHOW_MAP_MARKERS.get()) { + if ((!settings.SHOW_MAP_MARKERS.get() && !app.getOsmandMap().getMapView().isCarView()) + || (app.getOsmandMap().getMapView().isCarView() && androidAutoMarkers == null)) { clearMapMarkersCollections(); clearVectorLinesCollections(); resetCachedRenderer(); @@ -281,6 +292,9 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett MapMarkersHelper markersHelper = app.getMapMarkersHelper(); List activeMapMarkers = markersHelper.getMapMarkers(); + if (app.getOsmandMap().getMapView().isCarView()) { + activeMapMarkers = androidAutoMarkers; + } MapRendererView mapRenderer = getMapRenderer(); if (mapRenderer != null) { if (markersCount != activeMapMarkers.size() || mapActivityInvalidated) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java index fdf1f1711f3..b0d3ec61c83 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java @@ -100,6 +100,7 @@ public class POIMapLayer extends OsmandMapLayer implements IContextMenuProvider, private PoiUIFilter routeTrackFilter; private String routeArticlePointsFilterByName; private boolean fileVisibilityChanged; + private Set androidAutoPoiFilters = null; /// cache for displayed POI // Work with cache (for map copied from AmenityIndexRepositoryOdb) @@ -324,10 +325,17 @@ public void fileVisibilityChanged() { this.fileVisibilityChanged = true; } + public void setAndroidAutoPoints(@Nullable Set points){ + androidAutoPoiFilters = points; + } + @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { super.onPrepareBufferImage(canvas, tileBox, settings); Set selectedPoiFilters = app.getPoiFilters().getSelectedPoiFilters(); + if(androidAutoPoiFilters != null && app.getOsmandMap().getMapView().isCarView()){ + selectedPoiFilters = androidAutoPoiFilters; + } boolean showTravel = app.getSettings().SHOW_TRAVEL.get(); boolean routeArticleFilterEnabled = travelRendererHelper.getRouteArticlesProperty().get(); boolean routeArticlePointsFilterEnabled = travelRendererHelper.getRouteArticlePointsProperty().get(); From aa1ccfab81477d89fbe1804aa90bbd5f995a3190 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Mon, 12 Jun 2023 14:15:17 +0300 Subject: [PATCH 002/214] #16632: Implelemted displaying objects on map while selecting group in android auto --- .../router/RouteResultPreparationTest.java | 4 +- .../osmand/plus/auto/FavoriteGroupsScreen.kt | 13 +- .../net/osmand/plus/auto/FavoritesScreen.java | 11 +- .../src/net/osmand/plus/auto/HistoryScreen.kt | 14 +-- .../osmand/plus/auto/POICategoriesScreen.kt | 6 +- OsmAnd/src/net/osmand/plus/auto/POIScreen.kt | 5 +- .../osmand/plus/auto/TracksFoldersScreen.kt | 1 - .../src/net/osmand/plus/auto/TracksScreen.kt | 58 +++++++-- .../osmand/plus/views/layers/GPXLayer.java | 18 ++- .../plus/views/layers/MapMarkersLayer.java | 119 +++++++++--------- 10 files changed, 153 insertions(+), 96 deletions(-) diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java index 1e92281e25f..3813a4705a7 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java @@ -31,7 +31,7 @@ * Created by yurkiss on 04.03.16. */ -@RunWith(Parameterized.class) +//@RunWith(Parameterized.class) public class RouteResultPreparationTest { private final TestEntry te; @@ -73,7 +73,7 @@ public static Collection data() throws IOException { } - @Test +// @Test public void testLanes() throws Exception { NativeLibrary nativeLibrary = null; boolean useNative = isNative() && getNativeLibPath() != null && !te.isIgnoreNative(); diff --git a/OsmAnd/src/net/osmand/plus/auto/FavoriteGroupsScreen.kt b/OsmAnd/src/net/osmand/plus/auto/FavoriteGroupsScreen.kt index c192e72c8f9..5dd873ca542 100644 --- a/OsmAnd/src/net/osmand/plus/auto/FavoriteGroupsScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/FavoriteGroupsScreen.kt @@ -44,11 +44,13 @@ class FavoriteGroupsScreen( .setBrowsable(true) .setOnClickListener { onClickFavoriteGroup(null) } .build()) - var collectionSize = 1 - for (group in favoriteGroups) { - if (collectionSize == contentLimit) { - break - } + if (contentLimit < 2) { + return + } + val favoriteGroupsSize = favoriteGroups.size + val limitedFavoriteGroups = + favoriteGroups.subList(0, favoriteGroupsSize.coerceAtMost(contentLimit - 2)) + for (group in limitedFavoriteGroups) { val title = group.getDisplayName(app) val groupIcon = app.favoritesHelper.getColoredIconForGroup(group.name); val icon = CarIcon.Builder( @@ -60,7 +62,6 @@ class FavoriteGroupsScreen( .setBrowsable(true) .setOnClickListener { onClickFavoriteGroup(group) } .build()) - collectionSize++ } } diff --git a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java index c7457b0e8c0..8368f18f93c 100644 --- a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java @@ -92,14 +92,12 @@ protected int getConstraintLimitType() { private void setupFavorites(ItemList.Builder listBuilder) { LatLon location = getApp().getSettings().getLastKnownMapLocation(); - int collectionSize = 0; List favoritesPoints = getFavorites(); - getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setAndroidAutoFavouritePoints(favoritesPoints); + int favoritesPointsSize = favoritesPoints.size(); + List limitedFavoritesPoints = favoritesPoints.subList(0, Math.min(favoritesPointsSize, getContentLimit() - 1)); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setAndroidAutoFavouritePoints(limitedFavoritesPoints); getApp().getOsmandMap().refreshMap(); - for (FavouritePoint point : favoritesPoints) { - if (collectionSize == getContentLimit()) { - break; - } + for (FavouritePoint point : limitedFavoritesPoints) { String title = point.getDisplayName(getApp()); int color = getApp().getFavoritesHelper().getColorWithCategory(point, ContextCompat.getColor(getApp(), R.color.color_favorite)); CarIcon icon = new CarIcon.Builder(IconCompat.createWithBitmap( @@ -118,7 +116,6 @@ private void setupFavorites(ItemList.Builder listBuilder) { .setMetadata(new Metadata.Builder().setPlace(new Place.Builder( CarLocation.create(point.getLatitude(), point.getLongitude())).build()).build()) .build()); - collectionSize++; } } diff --git a/OsmAnd/src/net/osmand/plus/auto/HistoryScreen.kt b/OsmAnd/src/net/osmand/plus/auto/HistoryScreen.kt index 4ce45064fd1..54a9527b6a8 100644 --- a/OsmAnd/src/net/osmand/plus/auto/HistoryScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/HistoryScreen.kt @@ -28,12 +28,9 @@ class HistoryScreen( val historyHelper = SearchHistoryHelper.getInstance(app) val results = historyHelper.getHistoryEntries(true) val location = app.settings.lastKnownMapLocation - - var collectionSize = 0 - for (result in results) { - if (collectionSize == contentLimit) { - break - } + val resultsSize = results.size + val limitedResults = results.subList(0, resultsSize.coerceAtMost(contentLimit - 1)) + for (result in limitedResults) { val searchResult = SearchHistoryAPI.createSearchResult(app, result, SearchPhrase.emptyPhrase()) val listItem = QuickSearchListItem(app, searchResult) @@ -64,7 +61,6 @@ class HistoryScreen( address.setSpan(distanceSpan, 0, 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE) rowBuilder.addText(address) listBuilder.addItem(rowBuilder.build()) - collectionSize++ } val actionStripBuilder = ActionStrip.Builder() actionStripBuilder.addAction( @@ -75,8 +71,8 @@ class HistoryScreen( carContext, R.drawable.ic_action_search_dark)).build()) .setOnClickListener { openSearch() } .build()) - return PlaceListNavigationTemplate.Builder() - .setItemList(listBuilder.build()) + return ListTemplate.Builder() + .setSingleList(listBuilder.build()) .setTitle(app.getString(R.string.shared_string_history)) .setHeaderAction(Action.BACK) .setActionStrip(actionStripBuilder.build()) diff --git a/OsmAnd/src/net/osmand/plus/auto/POICategoriesScreen.kt b/OsmAnd/src/net/osmand/plus/auto/POICategoriesScreen.kt index 45f897cf5fa..64b26dd917f 100644 --- a/OsmAnd/src/net/osmand/plus/auto/POICategoriesScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/POICategoriesScreen.kt @@ -30,7 +30,11 @@ class POICategoriesScreen( } private fun setupPOICategories(listBuilder: ItemList.Builder) { - for (poiFilter in app.poiFilters.getSortedPoiFilters(false)) { + val poiFilters = app.poiFilters.getSortedPoiFilters(false) + val poiFiltersSize = poiFilters.size + val limitedPOIFilters = app.poiFilters.getSortedPoiFilters(false) + .subList(0, poiFiltersSize.coerceAtMost(contentLimit - 1)) + for (poiFilter in limitedPOIFilters) { val title = poiFilter.name var groupIcon = RenderingIcons.getBigIcon(app, poiFilter.iconId) if (groupIcon == null) { diff --git a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt index 2f3335a4922..f4fb59dda7e 100644 --- a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt @@ -94,7 +94,10 @@ class POIScreen( private fun setupPOI(listBuilder: ItemList.Builder, searchResults: List?) { val location = app.settings.lastKnownMapLocation searchResults?.let { - for (point in searchResults) { + val searchResultsSize = searchResults.size + val limitedSearchResults = + searchResults.subList(0, searchResultsSize.coerceAtMost(contentLimit - 1)) + for (point in limitedSearchResults) { val title = point.localeName var groupIcon = RenderingIcons.getBigIcon(app, group.iconId) if (groupIcon == null) { diff --git a/OsmAnd/src/net/osmand/plus/auto/TracksFoldersScreen.kt b/OsmAnd/src/net/osmand/plus/auto/TracksFoldersScreen.kt index 850e50f5e33..302cbd9a8b8 100644 --- a/OsmAnd/src/net/osmand/plus/auto/TracksFoldersScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/TracksFoldersScreen.kt @@ -113,7 +113,6 @@ class TracksFoldersScreen( settingsAction, surfaceRenderer, trackTab)) { } - finish() } override fun loadTracksFinished(folder: TrackFolder) { diff --git a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt index deb46a9ba98..1a2745201b6 100644 --- a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt @@ -6,6 +6,9 @@ import androidx.car.app.CarContext import androidx.car.app.model.* import androidx.car.app.navigation.model.PlaceListNavigationTemplate import androidx.core.graphics.drawable.IconCompat +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import net.osmand.gpx.GPXUtilities import net.osmand.plus.R import net.osmand.plus.configmap.tracks.TrackItem import net.osmand.plus.configmap.tracks.TrackTab @@ -13,6 +16,7 @@ import net.osmand.plus.configmap.tracks.TrackTabType import net.osmand.plus.track.data.GPXInfo import net.osmand.plus.track.helpers.GPXDatabase.GpxDataItem import net.osmand.plus.track.helpers.GpxDbHelper +import net.osmand.plus.track.helpers.SelectedGpxFile import net.osmand.search.core.ObjectType import net.osmand.search.core.SearchResult import net.osmand.util.Algorithms @@ -25,9 +29,33 @@ class TracksScreen( private val trackTab: TrackTab ) : BaseOsmAndAndroidAutoScreen(carContext) { val gpxDbHelper: GpxDbHelper = app.gpxDbHelper + var isLoading = true + var loadGpxFilesThread: Thread? = null + private val selectedGpxFiles = ArrayList() init { - prepareTrackItems() + lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onCreate(owner: LifecycleOwner) { + super.onCreate(owner) + isLoading = true + loadGpxFilesThread = Thread { + try { + prepareTrackItems() + isLoading = false + invalidate() + } catch (_: Throwable) { + } + } + loadGpxFilesThread?.start() + } + + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + loadGpxFilesThread?.interrupt() + app.osmandMap.mapLayers.gpxLayer.setAndroidAutoDisplayTracks(null) + app.osmandMap.refreshMap() + } + }) } override fun onGetTemplate(): Template { @@ -37,8 +65,10 @@ class TracksScreen( } else { trackTab.getName(app, false) } - templateBuilder.setLoading(false) - setupTracks(templateBuilder) + templateBuilder.setLoading(isLoading) + if (!isLoading) { + setupTracks(templateBuilder) + } return templateBuilder .setTitle(title) @@ -48,14 +78,21 @@ class TracksScreen( } private fun prepareTrackItems() { + selectedGpxFiles.clear() for (track in trackTab.trackItems) { track.file?.let { file -> val item = gpxDbHelper.getItem(file) { updateTrack(track, it) } if (item != null) { track.dataItem = item } + val gpxFile = GPXUtilities.loadGPXFile(file) + val selectedGpxFile = SelectedGpxFile() + selectedGpxFile.setGpxFile(gpxFile, app) + selectedGpxFiles.add(selectedGpxFile) } } + isLoading = false + invalidate() } private fun updateTrack(trackItem: TrackItem, dataItem: GpxDataItem?) { @@ -66,11 +103,10 @@ class TracksScreen( private fun setupTracks(templateBuilder: PlaceListNavigationTemplate.Builder) { val latLon = app.mapViewTrackingUtilities.defaultLocation val listBuilder = ItemList.Builder() - var itemsCount = 0 - for (track in trackTab.trackItems) { - if (itemsCount == contentLimit) { - break - } + val tracksSize = trackTab.trackItems.size + val tracks = + trackTab.trackItems.subList(0, tracksSize.coerceAtMost(contentLimit - 1)) + for (track in tracks) { val title = track.name val icon = CarIcon.Builder( IconCompat.createWithResource(app, R.drawable.ic_action_polygom_dark)) @@ -99,8 +135,12 @@ class TracksScreen( .addText(address) .setOnClickListener { onClickTrack(track) } .build()) - itemsCount++ } + val selectedTracksSize = selectedGpxFiles.size + val selectedTracks = + selectedGpxFiles.subList(0, selectedTracksSize.coerceAtMost(contentLimit - 1)) + app.osmandMap.mapLayers.gpxLayer.setAndroidAutoDisplayTracks(selectedTracks) + app.osmandMap.refreshMap() templateBuilder.setItemList(listBuilder.build()) } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java index c3f0e396897..274572ebe48 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java @@ -78,8 +78,8 @@ import net.osmand.plus.track.helpers.GpxSelectionHelper; import net.osmand.plus.track.helpers.GpxUiHelper; import net.osmand.plus.track.helpers.NetworkRouteSelectionTask; -import net.osmand.plus.track.helpers.save.SaveGpxHelper; import net.osmand.plus.track.helpers.SelectedGpxFile; +import net.osmand.plus.track.helpers.save.SaveGpxHelper; import net.osmand.plus.utils.AndroidUtils; import net.osmand.plus.utils.ColorUtilities; import net.osmand.plus.utils.FileUtils; @@ -164,6 +164,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM private final List pointsCache = new ArrayList<>(); private Map pointFileMap = new HashMap<>(); private MapTextLayer textLayer; + private List androidAutoDisplayTracks; private Paint paintOuterRect; private Paint paintInnerRect; @@ -337,7 +338,16 @@ private void drawMovableWpt(@NonNull Canvas canvas, @NonNull RotatedTileBox tile @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { super.onPrepareBufferImage(canvas, tileBox, settings); - List visibleGPXFiles = new ArrayList<>(selectedGpxHelper.getSelectedGPXFiles()); + List visibleGPXFiles; + if (getMapView().isCarView()) { + if (androidAutoDisplayTracks == null) { + visibleGPXFiles = new ArrayList<>(); + } else { + visibleGPXFiles = androidAutoDisplayTracks; + } + } else { + visibleGPXFiles = new ArrayList<>(selectedGpxHelper.getSelectedGPXFiles()); + } boolean tmpVisibleTrackChanged = updateTmpVisibleTrack(visibleGPXFiles); @@ -1875,4 +1885,8 @@ private void syncGpx(GPXFile gpxFile) { mapMarkersHelper.runSynchronization(group); } } + + public void setAndroidAutoDisplayTracks(@Nullable List tracks) { + androidAutoDisplayTracks = tracks; + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java index ff142176c67..446ddca9c98 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java @@ -384,7 +384,8 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode OsmandApplication app = getApplication(); OsmandSettings settings = app.getSettings(); - if (tileBox.getZoom() < 3 || !settings.SHOW_MAP_MARKERS.get()) { + boolean isCarView = getMapView().isCarView(); + if ((tileBox.getZoom() < 3 || !settings.SHOW_MAP_MARKERS.get()) && !isCarView || isCarView && Algorithms.isEmpty(androidAutoMarkers)) { clearVectorLinesCollections(); return; } @@ -394,8 +395,9 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode MapMarkersHelper markersHelper = app.getMapMarkersHelper(); updateBitmaps(false); + List markers = isCarView ? androidAutoMarkers : markersHelper.getMapMarkers(); if (mapRenderer == null) { - for (MapMarker marker : markersHelper.getMapMarkers()) { + for (MapMarker marker : markers) { if (isMarkerVisible(tileBox, marker) && !overlappedByWaypoint(marker) && !isInMotion(marker) && !isSynced(marker)) { Bitmap bmp = getMapMarkerBitmap(marker.colorIndex); @@ -410,66 +412,67 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode } } - if (settings.SHOW_LINES_TO_FIRST_MARKERS.get() && mapRenderer != null) { - drawLineAndText(canvas, tileBox, nightMode); - } else { - clearVectorLinesCollections(); - } - - if (settings.SHOW_ARROWS_TO_FIRST_MARKERS.get()) { - LatLon loc = tileBox.getCenterLatLon(); - int i = 0; - for (MapMarker marker : markersHelper.getMapMarkers()) { - if (!isLocationVisible(tileBox, marker) && !isInMotion(marker)) { - canvas.save(); - float bearing; - float radiusBearing = DIST_TO_SHOW * tileBox.getDensity(); - float cx; - float cy; - if (mapRenderer != null) { - PointI marker31 = NativeUtilities.getPoint31FromLatLon(marker.getLatitude(), marker.getLongitude()); - PointI center31 = NativeUtilities.get31FromElevatedPixel(mapRenderer, tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); - if (center31 == null) { - continue; - } - Pair line = - NativeUtilities.clipLineInVisibleRect(mapRenderer, tileBox, center31, marker31); - if (line == null) { - continue; + if (!getMapView().isCarView()) { + if (settings.SHOW_LINES_TO_FIRST_MARKERS.get() && mapRenderer != null) { + drawLineAndText(canvas, tileBox, nightMode); + } else { + clearVectorLinesCollections(); + } + if (settings.SHOW_ARROWS_TO_FIRST_MARKERS.get()) { + LatLon loc = tileBox.getCenterLatLon(); + int i = 0; + for (MapMarker marker : markersHelper.getMapMarkers()) { + if (!isLocationVisible(tileBox, marker) && !isInMotion(marker)) { + canvas.save(); + float bearing; + float radiusBearing = DIST_TO_SHOW * tileBox.getDensity(); + float cx; + float cy; + if (mapRenderer != null) { + PointI marker31 = NativeUtilities.getPoint31FromLatLon(marker.getLatitude(), marker.getLongitude()); + PointI center31 = NativeUtilities.get31FromElevatedPixel(mapRenderer, tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); + if (center31 == null) { + continue; + } + Pair line = + NativeUtilities.clipLineInVisibleRect(mapRenderer, tileBox, center31, marker31); + if (line == null) { + continue; + } + PointF centerPixel = new PointF(tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); + cx = centerPixel.x; + cy = centerPixel.y; + bearing = (float) getAngleBetween(centerPixel, line.second) - tileBox.getRotate(); + } else { + QuadPoint cp = tileBox.getCenterPixelPoint(); + cx = cp.x; + cy = cp.y; + net.osmand.Location.distanceBetween(loc.getLatitude(), loc.getLongitude(), + marker.getLatitude(), marker.getLongitude(), calculations); + bearing = calculations[1] - 90; } - PointF centerPixel = new PointF(tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); - cx = centerPixel.x; - cy = centerPixel.y; - bearing = (float) getAngleBetween(centerPixel, line.second) - tileBox.getRotate(); - } else { - QuadPoint cp = tileBox.getCenterPixelPoint(); - cx = cp.x; - cy = cp.y; - net.osmand.Location.distanceBetween(loc.getLatitude(), loc.getLongitude(), - marker.getLatitude(), marker.getLongitude(), calculations); - bearing = calculations[1] - 90; + canvas.rotate(bearing, cx, cy); + canvas.translate(-24 * tileBox.getDensity() + radiusBearing, -22 * tileBox.getDensity()); + canvas.drawBitmap(arrowShadow, cx, cy, bitmapPaint); + canvas.drawBitmap(arrowToDestination, cx, cy, getMarkerDestPaint(marker.colorIndex)); + canvas.drawBitmap(arrowLight, cx, cy, bitmapPaint); + canvas.restore(); + } + i++; + if (i > displayedWidgets - 1) { + break; } - canvas.rotate(bearing, cx, cy); - canvas.translate(-24 * tileBox.getDensity() + radiusBearing, -22 * tileBox.getDensity()); - canvas.drawBitmap(arrowShadow, cx, cy, bitmapPaint); - canvas.drawBitmap(arrowToDestination, cx, cy, getMarkerDestPaint(marker.colorIndex)); - canvas.drawBitmap(arrowLight, cx, cy, bitmapPaint); - canvas.restore(); - } - i++; - if (i > displayedWidgets - 1) { - break; } } - } - Object movableObject = contextMenuLayer.getMoveableObject(); - if (movableObject instanceof MapMarker) { - MapMarker movableMarker = (MapMarker) movableObject; - setMovableObject(movableMarker.getLatitude(), movableMarker.getLongitude()); - drawMovableMarker(canvas, tileBox, (MapMarker) movableObject); - } - if (this.movableObject != null && !contextMenuLayer.isInChangeMarkerPositionMode()) { - cancelMovableObject(); + Object movableObject = contextMenuLayer.getMoveableObject(); + if (movableObject instanceof MapMarker) { + MapMarker movableMarker = (MapMarker) movableObject; + setMovableObject(movableMarker.getLatitude(), movableMarker.getLongitude()); + drawMovableMarker(canvas, tileBox, (MapMarker) movableObject); + } + if (this.movableObject != null && !contextMenuLayer.isInChangeMarkerPositionMode()) { + cancelMovableObject(); + } } } From 906f221d06bf1d05e59023360ee29b7066a6ab15 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Mon, 12 Jun 2023 14:32:12 +0300 Subject: [PATCH 003/214] Enabled tests --- .../java/net/osmand/router/RouteResultPreparationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java index 3813a4705a7..1e92281e25f 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java @@ -31,7 +31,7 @@ * Created by yurkiss on 04.03.16. */ -//@RunWith(Parameterized.class) +@RunWith(Parameterized.class) public class RouteResultPreparationTest { private final TestEntry te; @@ -73,7 +73,7 @@ public static Collection data() throws IOException { } -// @Test + @Test public void testLanes() throws Exception { NativeLibrary nativeLibrary = null; boolean useNative = isNative() && getNativeLibPath() != null && !te.isIgnoreNative(); From d24cea0ddc8fb87a8f103f271cbfbbd525a20713 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 12 Jun 2023 18:16:05 +0300 Subject: [PATCH 004/214] Add 3d relief option --- .../aidlapi/OsmAndCustomizationConstants.java | 1 + OsmAnd/res/layout/list_item_osmpro_icon.xml | 80 +++++++++++++++++++ OsmAnd/res/values/strings.xml | 4 + .../osmand/plus/chooseplan/OsmAndFeature.java | 7 +- .../plus/configmap/ConfigureMapMenu.java | 41 ++++++++++ .../plus/configmap/MapLayerMenuListener.java | 13 +++ .../plus/download/DownloadActivityType.java | 2 +- .../plus/download/DownloadResources.java | 6 -- .../plus/download/ui/ItemViewHolder.java | 7 ++ .../development/OsmandDevelopmentPlugin.java | 2 +- .../plus/settings/backend/OsmandSettings.java | 2 + .../plus/widgets/ctxmenu/ViewCreator.java | 5 +- .../widgets/ctxmenu/data/ContextMenuItem.java | 11 +++ 13 files changed, 169 insertions(+), 12 deletions(-) create mode 100644 OsmAnd/res/layout/list_item_osmpro_icon.xml diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index a00de1b69d6..7605c4a933e 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -50,6 +50,7 @@ public interface OsmAndCustomizationConstants { String WIKIPEDIA_ID = SHOW_ITEMS_ID_SCHEME + "wikipedia"; String MAP_MARKERS_ID = SHOW_ITEMS_ID_SCHEME + "map_markers"; String MAP_SOURCE_ID = SHOW_ITEMS_ID_SCHEME + "map_source"; + String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps"; String MAP_BORDERS_ID = SHOW_ITEMS_ID_SCHEME + "map_borders"; String RECORDING_LAYER = SHOW_ITEMS_ID_SCHEME + "recording_layer"; String DEPTH_CONTOURS = SHOW_ITEMS_ID_SCHEME + "depth_contours"; diff --git a/OsmAnd/res/layout/list_item_osmpro_icon.xml b/OsmAnd/res/layout/list_item_osmpro_icon.xml new file mode 100644 index 00000000000..baed2d17181 --- /dev/null +++ b/OsmAnd/res/layout/list_item_osmpro_icon.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index ac53da22977..27a9c8adb76 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,6 +10,10 @@ - For wording and consistency, please note https://docs.osmand.net/docs/technical/contributions/translating-osmand Thx - Hardy --> + + Terrain map + 3D Relief + Own and observe the scale model of your neighborhood or the whole continent. Close the dialog Allow via ferrata Allow via ferrata paths. diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java b/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java index add37952394..5995cdc38e2 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/OsmAndFeature.java @@ -15,6 +15,7 @@ public enum OsmAndFeature { HOURLY_MAP_UPDATES(R.string.daily_map_updates, R.string.purchases_feature_desc_hourly_map_updates, R.drawable.ic_action_map_updates_colored_day, R.drawable.ic_action_map_updates_colored_night), CROSS_BUY(R.string.shared_string_cross_buy, R.string.purchases_feature_desc_cross_buy, R.drawable.ic_action_cross_buy_colored_day, R.drawable.ic_action_cross_buy_colored_night), WEATHER(R.string.shared_string_weather, R.string.weather_plugin_description, R.drawable.ic_action_umbrella_colored, R.drawable.ic_action_umbrella_colored_night), + RELIEF_3D(R.string.relief_3d, R.string.relief_3d_description, R.drawable.ic_action_3d_relief_colored_day, R.drawable.ic_action_3d_relief_colored_night), MONTHLY_MAP_UPDATES(R.string.monthly_map_updates, R.string.purchases_feature_desc_monthly_map_updates, R.drawable.ic_action_monthly_map_updates_colored_day, R.drawable.ic_action_monthly_map_updates_colored_night), UNLIMITED_MAP_DOWNLOADS(R.string.unlimited_map_downloads, R.string.purchases_feature_desc_unlimited_map_download, R.drawable.ic_action_unlimited_downloads_colored_day, R.drawable.ic_action_unlimited_download_colored_night), ANDROID_AUTO(R.string.android_auto, R.string.purchases_feature_desc_android_auto, R.drawable.ic_action_android_auto_colored, R.drawable.ic_action_android_auto_colored_night), @@ -82,7 +83,8 @@ public boolean isAvailableInMapsPlus() { EXTERNAL_SENSORS_SUPPORT, TERRAIN, NAUTICAL, - WEATHER + WEATHER, + RELIEF_3D ); public static final List OSMAND_PRO_PREVIEW_FEATURES = Arrays.asList( @@ -96,7 +98,8 @@ public boolean isAvailableInMapsPlus() { EXTERNAL_SENSORS_SUPPORT, TERRAIN, NAUTICAL, - WEATHER + WEATHER, + RELIEF_3D ); public static final List MAPS_PLUS_FEATURES = Arrays.asList( diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index 7a2d9918cb9..f36deda6dc4 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -7,6 +7,7 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.GPX_FILES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.HIDE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_BORDERS_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_LANGUAGE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_MAGNIFIER_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_MARKERS_ID; @@ -19,8 +20,10 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROAD_STYLE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID; +import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; import static net.osmand.plus.plugins.openseamaps.NauticalDepthContourFragment.DEPTH_CONTOUR_COLOR_SCHEME; import static net.osmand.plus.plugins.openseamaps.NauticalDepthContourFragment.DEPTH_CONTOUR_WIDTH; import static net.osmand.plus.plugins.osmedit.OsmEditingPlugin.RENDERING_CATEGORY_OSM_ASSISTANT; @@ -51,10 +54,12 @@ import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; +import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DetailsBottomSheet; import net.osmand.plus.dialogs.SelectMapStyleBottomSheetDialogFragment; +import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.render.RendererRegistry; @@ -228,6 +233,8 @@ private void createLayersItems(@NonNull List customRules, PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); app.getAidlApi().registerLayerContextMenu(adapter, activity); + addRelief3DItem(adapter, activity, nightMode, listener); + selected = settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.get(); adapter.addItem(new ContextMenuItem(MAP_BORDERS_ID) .setTitleId(R.string.show_borders_of_downloaded_maps, activity) @@ -238,6 +245,40 @@ private void createLayersItems(@NonNull List customRules, .setListener(listener)); } + private void addRelief3DItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity, + boolean nightMode, + MapLayerMenuListener listener) { + OsmandApplication app = activity.getMyApplication(); + if (app.useOpenGlRenderer()) { + boolean enabled3DMode = app.getSettings().ENABLE_3D_MAPS.get(); + ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) + .setLayout(R.layout.list_item_osmpro_icon) + .setTitleId(R.string.relief_3d, app) + .setIcon(R.drawable.ic_action_3d_relief) + .setUseNaturalSecondIconColor(true) + .setSecondaryIcon(!InAppPurchaseHelper.isOsmAndProAvailable(app) ? (nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day) : INVALID_ID) + .setListener(listener); + + if (!Version.isPaidVersion(app)) { + item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); + } else { + item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); + item.setSelected(enabled3DMode); + item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); + } + + ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); + if (terrainItem == null) { + terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); + } + if (terrainItem != null) { + item.setOrder(terrainItem.getOrder()); + } + adapter.addItem(item); + } + } + private void createRouteAttributeItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java index 51978457ecf..473f2fa34a5 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java +++ b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java @@ -7,14 +7,20 @@ import androidx.annotation.Nullable; import net.osmand.plus.R; +import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.chooseplan.ChoosePlanFragment; +import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.configmap.tracks.TracksFragment; +import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsFragment; import net.osmand.plus.plugins.PluginsHelper; import net.osmand.plus.plugins.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.backend.preferences.BooleanPreference; +import net.osmand.plus.settings.backend.preferences.OsmandPreference; import net.osmand.plus.track.helpers.GpxSelectionHelper; import net.osmand.plus.transport.TransportLinesMenu; import net.osmand.plus.views.MapLayers; @@ -103,6 +109,13 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu return false; } else if (itemId == R.string.show_borders_of_downloaded_maps) { settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.set(isChecked); + } else if (itemId == R.string.relief_3d) { + if (Version.isPaidVersion(mapActivity.getMyApplication())) { + settings.ENABLE_3D_MAPS.set(isChecked); + item.setDescription(mapActivity.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); + } else { + ChoosePlanFragment.showInstance(mapActivity, OsmAndFeature.RELIEF_3D); + } } if (uiAdapter != null) { uiAdapter.onDataSetChanged(); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index cd2d235eddc..810e5975d0f 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -72,7 +72,7 @@ public class DownloadActivityType { public static final DownloadActivityType WEATHER_FORECAST = new DownloadActivityType(R.string.weather_forecast, R.drawable.ic_action_umbrella, "weather", 90); public static final DownloadActivityType GEOTIFF_FILE = - new DownloadActivityType(R.string.download_heightmap_maps, R.drawable.ic_action_altitude, "geotiff", 85); + new DownloadActivityType(R.string.terrain_map, R.drawable.ic_action_altitude, "geotiff", 85); private final int stringResource; private final int iconResource; diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java index 1ca743d8716..e09c62d054a 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -393,12 +393,6 @@ protected boolean prepareData(List resources) { } continue; } - if (ii.getType() == DownloadActivityType.GEOTIFF_FILE) { - OsmandDevelopmentPlugin plugin = PluginsHelper.getPlugin(OsmandDevelopmentPlugin.class); - if (plugin == null || !plugin.isHeightmapEnabled()) { - continue; - } - } if (ii.getType() == DownloadActivityType.HEIGHTMAP_FILE_LEGACY) { // Hide heightmaps of sqlite format continue; diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 2925d879cde..5cb33b84285 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -2,6 +2,7 @@ import static net.osmand.plus.download.DownloadActivityType.DEPTH_CONTOUR_FILE; import static net.osmand.plus.download.DownloadActivityType.DEPTH_MAP_FILE; +import static net.osmand.plus.download.DownloadActivityType.GEOTIFF_FILE; import static net.osmand.plus.download.DownloadActivityType.HILLSHADE_FILE; import static net.osmand.plus.download.DownloadActivityType.SLOPE_FILE; import static net.osmand.plus.download.DownloadActivityType.SRTM_COUNTRY_FILE; @@ -106,6 +107,7 @@ protected enum RightButtonAction { DOWNLOAD, ASK_FOR_SEAMARKS_PLUGIN, ASK_FOR_SRTM_PLUGIN_PURCHASE, + ASK_FOR_RELIEF_3D_PURCHASE, ASK_FOR_SRTM_PLUGIN_ENABLE, ASK_FOR_FULL_VERSION_PURCHASE, ASK_FOR_DEPTH_CONTOURS_PURCHASE, @@ -471,6 +473,8 @@ public RightButtonAction getClickAction(@NonNull DownloadItem item) { action = RightButtonAction.ASK_FOR_FULL_VERSION_PURCHASE; } else if ((item.getType() == DEPTH_CONTOUR_FILE || item.getType() == DEPTH_MAP_FILE) && !depthContoursPurchased) { action = RightButtonAction.ASK_FOR_DEPTH_CONTOURS_PURCHASE; + } else if (type == GEOTIFF_FILE && !Version.isPaidVersion(context.getMyApplication())) { + action = RightButtonAction.ASK_FOR_RELIEF_3D_PURCHASE; } } return action; @@ -493,6 +497,9 @@ public void onClick(View v) { context.getMyApplication().logEvent("in_app_purchase_show_from_weather_context_menu"); ChoosePlanFragment.showInstance(context, OsmAndFeature.WEATHER); break; + case ASK_FOR_RELIEF_3D_PURCHASE: + ChoosePlanFragment.showInstance(context, OsmAndFeature.RELIEF_3D); + break; case ASK_FOR_DEPTH_CONTOURS_PURCHASE: ChoosePlanFragment.showInstance(context, OsmAndFeature.NAUTICAL); break; diff --git a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java index b1926ee5c82..3907ac1ec5d 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java @@ -74,7 +74,7 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { WidgetsAvailabilityHelper.regWidgetVisibility(DEV_TARGET_DISTANCE, noAppMode); ENABLE_HEIGHTMAP = registerBooleanPreference("show_heightmaps", false).makeGlobal().makeShared().cache(); - ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeGlobal().makeShared().cache(); + ENABLE_3D_MAPS = settings.ENABLE_3D_MAPS; DISABLE_VERTEX_HILLSHADE_3D = registerBooleanPreference("disable_vertex_hillshade_3d", true).makeGlobal().makeShared().cache(); GENERATE_SLOPE_FROM_3D_MAPS = registerBooleanPreference("generate_slope_from_3d_maps", true).makeGlobal().makeShared().cache(); GENERATE_HILLSHADE_FROM_3D_MAPS = registerBooleanPreference("generate_hillshade_from_3d_maps", true).makeGlobal().makeShared().cache(); diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 4ee06cea32c..7a012fca791 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -834,6 +834,8 @@ public boolean enablePlugin(String pluginId, boolean enable) { return false; } + public final CommonPreference ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeGlobal().makeShared().cache(); + public final CommonPreference COMPASS_VISIBILITY = new EnumStringPreference(this, "compass_visibility", CompassVisibility.VISIBLE_IF_MAP_ROTATED, CompassVisibility.values()) { @Override diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index a04dc50cbe7..a56dbf84078 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -120,7 +120,7 @@ public View getView(@NonNull ContextMenuItem item, @Nullable View convertView) { ImageView secondaryIcon = convertView.findViewById(R.id.secondary_icon); if (secondaryIcon != null) { - setupSecondaryIcon(secondaryIcon, item.getSecondaryIcon()); + setupSecondaryIcon(secondaryIcon, item.getSecondaryIcon(), item); } CompoundButton toggle = convertView.findViewById(R.id.toggle_item); @@ -335,9 +335,10 @@ private void setupIcon(@NonNull AppCompatImageView icon, @NonNull ContextMenuIte } } - private void setupSecondaryIcon(@NonNull ImageView secondaryIcon, @DrawableRes int secondaryIconId) { + private void setupSecondaryIcon(@NonNull ImageView secondaryIcon, @DrawableRes int secondaryIconId, @NonNull ContextMenuItem item) { if (secondaryIconId != INVALID_ID) { int colorId = ColorUtilities.getDefaultIconColorId(nightMode); + colorId = item.useNaturalSecondIconColor() ? 0 : colorId; Drawable drawable = iconsCache.getIcon(secondaryIconId, colorId); secondaryIcon.setImageDrawable(drawable); if (secondaryIconId == R.drawable.ic_action_additional_option) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index 18ae70bcf29..edf6f4a45ba 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -41,6 +41,7 @@ public class ContextMenuItem { private String secondaryDescription; private boolean useNaturalIconColor; + private boolean useNaturalSecondIconColor; @ColorInt private Integer color; @DrawableRes @@ -130,6 +131,10 @@ public boolean useNaturalIconColor() { return useNaturalIconColor; } + public boolean useNaturalSecondIconColor() { + return useNaturalSecondIconColor; + } + @ColorInt @Nullable public Integer getColor() { @@ -268,6 +273,12 @@ public ContextMenuItem setUseNaturalIconColor(boolean useNaturalIconColor) { return this; } + @NonNull + public ContextMenuItem setUseNaturalSecondIconColor(boolean useNaturalSecondIconColor) { + this.useNaturalSecondIconColor = useNaturalSecondIconColor; + return this; + } + @NonNull public ContextMenuItem setColor(@ColorInt @Nullable Integer color) { this.color = color; From 6d8001adf46d08b45838478a4fa1812a0dca97cc Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Sun, 18 Jun 2023 04:56:59 +0300 Subject: [PATCH 005/214] #16632: Fixes after review --- .../net/osmand/plus/auto/FavoritesScreen.java | 4 +- .../net/osmand/plus/auto/MapMarkersScreen.kt | 4 +- .../osmand/plus/auto/NavigationSession.java | 9 ++ OsmAnd/src/net/osmand/plus/auto/POIScreen.kt | 12 +-- .../src/net/osmand/plus/auto/TracksScreen.kt | 48 +++++----- .../plus/views/layers/FavouritesLayer.java | 88 ++++++++++++------- .../osmand/plus/views/layers/GPXLayer.java | 33 +++---- .../plus/views/layers/MapMarkersLayer.java | 26 +++--- .../osmand/plus/views/layers/POIMapLayer.java | 22 +++-- .../views/layers/base/OsmandMapLayer.java | 17 ++++ 10 files changed, 162 insertions(+), 101 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java index 8368f18f93c..e77bd6fc9bd 100644 --- a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java @@ -66,7 +66,7 @@ public FavoritesScreen( @Override public void onDestroy(@NonNull LifecycleOwner owner) { DefaultLifecycleObserver.super.onDestroy(owner); - getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setAndroidAutoFavouritePoints(null); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setCustomMapObjects(null); getApp().getOsmandMap().refreshMap(); } }); @@ -95,7 +95,7 @@ private void setupFavorites(ItemList.Builder listBuilder) { List favoritesPoints = getFavorites(); int favoritesPointsSize = favoritesPoints.size(); List limitedFavoritesPoints = favoritesPoints.subList(0, Math.min(favoritesPointsSize, getContentLimit() - 1)); - getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setAndroidAutoFavouritePoints(limitedFavoritesPoints); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setCustomMapObjects(limitedFavoritesPoints); getApp().getOsmandMap().refreshMap(); for (FavouritePoint point : limitedFavoritesPoints) { String title = point.getDisplayName(getApp()); diff --git a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt index 5d81f2babbc..0945f5cb8de 100644 --- a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt @@ -34,7 +34,7 @@ class MapMarkersScreen( lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - app.osmandMap.mapLayers.mapMarkersLayer.setAndroidAutoMarkers(null) + app.osmandMap.mapLayers.mapMarkersLayer.setCustomMapObjects(null) app.osmandMap.refreshMap() } }) @@ -46,7 +46,7 @@ class MapMarkersScreen( val markers = app.mapMarkersHelper.mapMarkers.subList(0, markersSize.coerceAtMost(contentLimit - 1)) val location = app.settings.lastKnownMapLocation - app.osmandMap.mapLayers.mapMarkersLayer.setAndroidAutoMarkers(markers) + app.osmandMap.mapLayers.mapMarkersLayer.setCustomMapObjects(markers) app.osmandMap.refreshMap() for (marker in markers) { val title = marker.getName(app) diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java b/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java index 336cb26ae85..afa2b403a82 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java @@ -33,6 +33,7 @@ import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.routing.IRouteInformationListener; import net.osmand.plus.views.OsmandMapTileView; +import net.osmand.plus.views.layers.base.OsmandMapLayer; /** * Session class for the Navigation sample app. @@ -103,11 +104,19 @@ private OsmandApplication getApp() { @Override public void onStart(@NonNull LifecycleOwner owner) { getApp().getRoutingHelper().addListener(this); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + getApp().getOsmandMap().getMapLayers().getGpxLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + getApp().getOsmandMap().getMapLayers().getPoiMapLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + getApp().getOsmandMap().getMapLayers().getMapMarkersLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); } @Override public void onStop(@NonNull LifecycleOwner owner) { getApp().getRoutingHelper().removeListener(this); + getApp().getOsmandMap().getMapLayers().getFavouritesLayer().customObjectsDelegate = null; + getApp().getOsmandMap().getMapLayers().getGpxLayer().customObjectsDelegate = null; + getApp().getOsmandMap().getMapLayers().getPoiMapLayer().customObjectsDelegate = null; + getApp().getOsmandMap().getMapLayers().getMapMarkersLayer().customObjectsDelegate = null; } @Override diff --git a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt index f4fb59dda7e..8719bc0e147 100644 --- a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt @@ -18,6 +18,7 @@ import androidx.core.graphics.drawable.IconCompat import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleOwner +import net.osmand.data.Amenity import net.osmand.data.LatLon import net.osmand.plus.R import net.osmand.plus.poi.PoiUIFilter @@ -43,8 +44,7 @@ class POIScreen( lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - app.osmandMap.mapLayers.poiMapLayer.setAndroidAutoPoints(null) - app.osmandMap.refreshMap() + app.osmandMap.mapLayers.poiMapLayer.setCustomMapObjects(null) } }) } @@ -77,9 +77,6 @@ class POIScreen( searchResults: List?, itemList: ItemList?, resultsCount: Int) { - app.osmandMap.mapLayers.poiMapLayer.setAndroidAutoPoints(setOf(group)) - app.osmandMap.refreshMap() - loading = false if (resultsCount == 0) { this.itemList = withNoResults(ItemList.Builder()).build() @@ -93,11 +90,15 @@ class POIScreen( private fun setupPOI(listBuilder: ItemList.Builder, searchResults: List?) { val location = app.settings.lastKnownMapLocation + val mapPoint = ArrayList() searchResults?.let { val searchResultsSize = searchResults.size val limitedSearchResults = searchResults.subList(0, searchResultsSize.coerceAtMost(contentLimit - 1)) for (point in limitedSearchResults) { + if (point.`object` is Amenity) { + mapPoint.add(point.`object` as Amenity) + } val title = point.localeName var groupIcon = RenderingIcons.getBigIcon(app, group.iconId) if (groupIcon == null) { @@ -128,6 +129,7 @@ class POIScreen( .build()) } } + app.osmandMap.mapLayers.poiMapLayer.setCustomMapObjects(mapPoint) } private fun loadPOI() { diff --git a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt index 1a2745201b6..d81c83571f0 100644 --- a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt @@ -1,5 +1,6 @@ package net.osmand.plus.auto +import android.os.AsyncTask import android.text.SpannableString import android.text.Spanned import androidx.car.app.CarContext @@ -29,35 +30,37 @@ class TracksScreen( private val trackTab: TrackTab ) : BaseOsmAndAndroidAutoScreen(carContext) { val gpxDbHelper: GpxDbHelper = app.gpxDbHelper - var isLoading = true var loadGpxFilesThread: Thread? = null - private val selectedGpxFiles = ArrayList() + private val loadedGpxFiles = HashMap() + private lateinit var loadTracksTask: LoadTracksTask init { lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) - isLoading = true - loadGpxFilesThread = Thread { - try { - prepareTrackItems() - isLoading = false - invalidate() - } catch (_: Throwable) { - } - } - loadGpxFilesThread?.start() + loadTracksTask = LoadTracksTask() + loadTracksTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) } override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) loadGpxFilesThread?.interrupt() - app.osmandMap.mapLayers.gpxLayer.setAndroidAutoDisplayTracks(null) - app.osmandMap.refreshMap() + app.osmandMap.mapLayers.gpxLayer.setCustomMapObjects(null) } }) } + private inner class LoadTracksTask : AsyncTask() { + override fun doInBackground(vararg params: Unit?) { + prepareTrackItems() + } + + override fun onPostExecute(result: Unit?) { + super.onPostExecute(result) + invalidate() + } + } + override fun onGetTemplate(): Template { val templateBuilder = PlaceListNavigationTemplate.Builder() val title = if (trackTab.type == TrackTabType.ALL) { @@ -65,6 +68,7 @@ class TracksScreen( } else { trackTab.getName(app, false) } + val isLoading = loadTracksTask.status != AsyncTask.Status.FINISHED templateBuilder.setLoading(isLoading) if (!isLoading) { setupTracks(templateBuilder) @@ -78,7 +82,7 @@ class TracksScreen( } private fun prepareTrackItems() { - selectedGpxFiles.clear() + loadedGpxFiles.clear() for (track in trackTab.trackItems) { track.file?.let { file -> val item = gpxDbHelper.getItem(file) { updateTrack(track, it) } @@ -88,10 +92,9 @@ class TracksScreen( val gpxFile = GPXUtilities.loadGPXFile(file) val selectedGpxFile = SelectedGpxFile() selectedGpxFile.setGpxFile(gpxFile, app) - selectedGpxFiles.add(selectedGpxFile) + loadedGpxFiles[track] = selectedGpxFile } } - isLoading = false invalidate() } @@ -104,9 +107,14 @@ class TracksScreen( val latLon = app.mapViewTrackingUtilities.defaultLocation val listBuilder = ItemList.Builder() val tracksSize = trackTab.trackItems.size + val selectedGpxFiles = ArrayList() val tracks = trackTab.trackItems.subList(0, tracksSize.coerceAtMost(contentLimit - 1)) for (track in tracks) { + val gpxFile = loadedGpxFiles[track] + gpxFile?.let { + selectedGpxFiles.add(it) + } val title = track.name val icon = CarIcon.Builder( IconCompat.createWithResource(app, R.drawable.ic_action_polygom_dark)) @@ -136,11 +144,7 @@ class TracksScreen( .setOnClickListener { onClickTrack(track) } .build()) } - val selectedTracksSize = selectedGpxFiles.size - val selectedTracks = - selectedGpxFiles.subList(0, selectedTracksSize.coerceAtMost(contentLimit - 1)) - app.osmandMap.mapLayers.gpxLayer.setAndroidAutoDisplayTracks(selectedTracks) - app.osmandMap.refreshMap() + app.osmandMap.mapLayers.gpxLayer.setCustomMapObjects(selectedGpxFiles) templateBuilder.setItemList(listBuilder.build()) } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java index e3d0c503d72..72d19a507c1 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java @@ -66,7 +66,7 @@ public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvi private boolean changeMarkerPositionMode; private long favoritesChangedTime; - private List androidAutoFavouritePoints = null; + public CustomMapObjects customObjectsDelegate; //OpenGl private FavoritesTileProvider favoritesMapLayerProvider; @@ -117,10 +117,6 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) } } - public void setAndroidAutoFavouritePoints(@Nullable List points) { - androidAutoFavouritePoints = points; - } - @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { super.onPrepareBufferImage(canvas, tileBox, settings); @@ -140,18 +136,31 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett boolean favoritesChanged = this.favoritesChangedTime != favoritesChangedTime; this.favoritesChangedTime = favoritesChangedTime; - if (androidAutoFavouritePoints != null) { - cache.clear(); - float iconSize = getIconSize(view.getApplication()); - QuadTree boundIntersections = initBoundIntersections(tileBox); - QuadRect latLonBounds = tileBox.getLatLonBounds(); - List fullObjectsLatLon = new ArrayList<>(); - List smallObjectsLatLon = new ArrayList<>(); - drawPoints(androidAutoFavouritePoints, latLonBounds, false, tileBox, boundIntersections, iconSize, canvas, fullObjectsLatLon, smallObjectsLatLon); - this.fullObjectsLatLon = fullObjectsLatLon; - this.smallObjectsLatLon = smallObjectsLatLon; - if (textVisible) { - textLayer.putData(this, cache); + if (customObjectsDelegate != null) { + MapRendererView mapRenderer = getMapRenderer(); + List points = customObjectsDelegate.getMapObjects(); + if (mapRenderer != null) { + if (mapActivityInvalidated || mapRendererChanged || nightModeChanged || textScaleChanged || textVisibleChanged) { + clearFavorites(); + favoritesMapLayerProvider = new FavoritesTileProvider(getContext(), getPointsOrder(), isTextVisible(), + getTextStyle(textScale), view.getDensity()); + showFavoritePoints(textScale, true, points); + favoritesMapLayerProvider.drawSymbols(mapRenderer); + mapRendererChanged = false; + } + } else { + cache.clear(); + float iconSize = getIconSize(view.getApplication()); + QuadTree boundIntersections = initBoundIntersections(tileBox); + QuadRect latLonBounds = tileBox.getLatLonBounds(); + List fullObjectsLatLon = new ArrayList<>(); + List smallObjectsLatLon = new ArrayList<>(); + drawPoints(points, latLonBounds, false, tileBox, boundIntersections, iconSize, canvas, fullObjectsLatLon, smallObjectsLatLon); + this.fullObjectsLatLon = fullObjectsLatLon; + this.smallObjectsLatLon = smallObjectsLatLon; + if (textVisible) { + textLayer.putData(this, cache); + } } } else if (hasMapRenderer()) { if (mapActivityInvalidated || mapRendererChanged || nightModeChanged || showFavoritesChanged @@ -272,26 +281,30 @@ public synchronized void showFavorites() { for (FavoriteGroup group : getFavoriteGroups()) { boolean synced = isSynced(group); List points = new ArrayList<>(group.getPoints()); - for (FavouritePoint favoritePoint : points) { - if (favoritePoint.isVisible() && favoritePoint != contextMenuLayer.getMoveableObject()) { - MapMarker marker = null; - if (synced) { - marker = mapMarkersHelper.getMapMarker(favoritePoint); - if (marker == null || marker.history && !view.getSettings().KEEP_PASSED_MARKERS_ON_MAP.get()) { - continue; - } - } - int color; - if ((marker != null && marker.history)) { - color = grayColor; - } else { - color = favouritesHelper.getColorWithCategory(favoritePoint, defaultColor); - } - favoritesMapLayerProvider.addToData(favoritePoint, color, true, marker != null, textScale); + showFavoritePoints(textScale, synced, points); + } + favoritesMapLayerProvider.drawSymbols(mapRenderer); + } + } + + private void showFavoritePoints(float textScale, boolean synced, List points) { + for (FavouritePoint favoritePoint : points) { + if (favoritePoint.isVisible() && favoritePoint != contextMenuLayer.getMoveableObject()) { + MapMarker marker = null; + if (synced) { + marker = mapMarkersHelper.getMapMarker(favoritePoint); + if (marker == null || marker.history && !view.getSettings().KEEP_PASSED_MARKERS_ON_MAP.get()) { + continue; } } + int color; + if ((marker != null && marker.history)) { + color = grayColor; + } else { + color = favouritesHelper.getColorWithCategory(favoritePoint, defaultColor); + } + favoritesMapLayerProvider.addToData(favoritePoint, color, true, marker != null, textScale); } - favoritesMapLayerProvider.drawSymbols(mapRenderer); } } @@ -434,6 +447,13 @@ public void applyNewObjectPosition(@NonNull Object o, callback.onApplyMovedObject(result, o); } } + + public void setCustomMapObjects(List favouritePoints) { + if (customObjectsDelegate != null) { + customObjectsDelegate.setCustomMapObjects(favouritePoints); + getApplication().getOsmandMap().refreshMap(); + } + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java index 274572ebe48..8c4476a911a 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java @@ -164,7 +164,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM private final List pointsCache = new ArrayList<>(); private Map pointFileMap = new HashMap<>(); private MapTextLayer textLayer; - private List androidAutoDisplayTracks; + public CustomMapObjects customObjectsDelegate; private Paint paintOuterRect; private Paint paintInnerRect; @@ -339,12 +339,8 @@ private void drawMovableWpt(@NonNull Canvas canvas, @NonNull RotatedTileBox tile public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { super.onPrepareBufferImage(canvas, tileBox, settings); List visibleGPXFiles; - if (getMapView().isCarView()) { - if (androidAutoDisplayTracks == null) { - visibleGPXFiles = new ArrayList<>(); - } else { - visibleGPXFiles = androidAutoDisplayTracks; - } + if (customObjectsDelegate != null) { + visibleGPXFiles = customObjectsDelegate.getMapObjects(); } else { visibleGPXFiles = new ArrayList<>(selectedGpxHelper.getSelectedGPXFiles()); } @@ -821,7 +817,7 @@ private void drawSelectedFilesPoints(@NonNull Canvas canvas, @NonNull RotatedTil List> fullObjects = new ArrayList<>(); int fileColor = getFileColor(g); boolean synced = isSynced(g.getGpxFile()); - boolean selected = GpxSelectionHelper.isGpxFileSelected(app, g.getGpxFile()); + boolean selected = isGpxFileSelected(g.getGpxFile()); for (WptPt wpt : getSelectedFilePoints(g)) { if (wpt.lat >= latLonBounds.bottom && wpt.lat <= latLonBounds.top && wpt.lon >= latLonBounds.left && wpt.lon <= latLonBounds.right @@ -922,7 +918,7 @@ private void drawSelectedFilesPointsOpenGl(@NonNull MapRendererView mapRenderer, for (SelectedGpxFile g : selectedGPXFiles) { int fileColor = getFileColor(g); boolean synced = isSynced(g.getGpxFile()); - boolean selected = GpxSelectionHelper.isGpxFileSelected(app, g.getGpxFile()); + boolean selected = isGpxFileSelected(g.getGpxFile()); for (WptPt wpt : getSelectedFilePoints(g)) { if (wpt != contextMenuLayer.getMoveableObject() && !isPointHidden(g, wpt)) { pointFileMap.put(wpt, g); @@ -1220,7 +1216,7 @@ private float getTrackWidth(String width, float defaultTrackWidth) { private int getTrackColor(GPXFile gpxFile, int defaultColor) { int color = 0; - if (!GpxSelectionHelper.isGpxFileSelected(app, gpxFile)) { + if (!isGpxFileSelected(gpxFile)) { color = ColorUtilities.getColorWithAlpha(disabledColor, 0.5f); } else if (hasTrackDrawInfoForTrack(gpxFile)) { color = trackDrawInfo.getColor(); @@ -1238,7 +1234,7 @@ private int getTrackColor(GPXFile gpxFile, int defaultColor) { private String getAvailableOrDefaultColoringType(SelectedGpxFile selectedGpxFile) { GPXFile gpxFile = selectedGpxFile.getGpxFileToDisplay(); - if (!GpxSelectionHelper.isGpxFileSelected(app, gpxFile)) { + if (!isGpxFileSelected(gpxFile)) { return ColoringType.TRACK_SOLID.getName(null); } if (hasTrackDrawInfoForTrack(gpxFile)) { @@ -1276,6 +1272,10 @@ private String getAvailableOrDefaultColoringType(SelectedGpxFile selectedGpxFile } } + private boolean isGpxFileSelected(GPXFile gpxFile) { + return customObjectsDelegate != null || GpxSelectionHelper.isGpxFileSelected(app, gpxFile); + } + private String getTrackWidthName(GPXFile gpxFile, String defaultWidth) { String width = null; if (hasTrackDrawInfoForTrack(gpxFile)) { @@ -1292,7 +1292,7 @@ private String getTrackWidthName(GPXFile gpxFile, String defaultWidth) { } private boolean isShowArrowsForTrack(@NonNull GPXFile gpxFile) { - if (!GpxSelectionHelper.isGpxFileSelected(app, gpxFile)) { + if (!isGpxFileSelected(gpxFile)) { return false; } else if (hasTrackDrawInfoForTrack(gpxFile)) { return trackDrawInfo.isShowArrows(); @@ -1308,7 +1308,7 @@ private boolean isShowArrowsForTrack(@NonNull GPXFile gpxFile) { } private boolean isShowStartFinishForTrack(@NonNull GPXFile gpxFile) { - if (!GpxSelectionHelper.isGpxFileSelected(app, gpxFile)) { + if (!isGpxFileSelected(gpxFile)) { return false; } else if (hasTrackDrawInfoForTrack(gpxFile)) { return trackDrawInfo.isShowStartFinish(); @@ -1886,7 +1886,10 @@ private void syncGpx(GPXFile gpxFile) { } } - public void setAndroidAutoDisplayTracks(@Nullable List tracks) { - androidAutoDisplayTracks = tracks; + public void setCustomMapObjects(List gpxFiles) { + if (customObjectsDelegate != null) { + customObjectsDelegate.setCustomMapObjects(gpxFiles); + getApplication().getOsmandMap().refreshMap(); + } } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java index 446ddca9c98..d1beeb1a5e0 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java @@ -81,7 +81,6 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvider, IContextMenuProviderSelection, ContextMenuLayer.IMoveObjectProvider { - private static final Log LOG = PlatformUtil.getLog(FavouritesLayer.class); private static final int START_ZOOM = 3; private static final long USE_FINGER_LOCATION_DELAY = 1000; private static final int MAP_REFRESH_MESSAGE = OsmAndConstants.UI_HANDLER_MAP_VIEW + 6; @@ -134,7 +133,7 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi private float textScale = 1f; private double markerSizePx; - private List androidAutoMarkers; + public CustomMapObjects customObjectsDelegate; //OpenGL private int markersCount; @@ -273,17 +272,13 @@ public void initLayer(@NonNull OsmandMapTileView view) { initUI(); } - public void setAndroidAutoMarkers(@Nullable List markers) { - androidAutoMarkers = markers; - } - @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings drawSettings) { super.onPrepareBufferImage(canvas, tileBox, drawSettings); OsmandApplication app = getApplication(); OsmandSettings settings = app.getSettings(); if ((!settings.SHOW_MAP_MARKERS.get() && !app.getOsmandMap().getMapView().isCarView()) - || (app.getOsmandMap().getMapView().isCarView() && androidAutoMarkers == null)) { + || (customObjectsDelegate != null && Algorithms.isEmpty(customObjectsDelegate.getMapObjects()))) { clearMapMarkersCollections(); clearVectorLinesCollections(); resetCachedRenderer(); @@ -292,8 +287,8 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett MapMarkersHelper markersHelper = app.getMapMarkersHelper(); List activeMapMarkers = markersHelper.getMapMarkers(); - if (app.getOsmandMap().getMapView().isCarView()) { - activeMapMarkers = androidAutoMarkers; + if (customObjectsDelegate != null) { + activeMapMarkers = customObjectsDelegate.getMapObjects(); } MapRendererView mapRenderer = getMapRenderer(); if (mapRenderer != null) { @@ -384,8 +379,8 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode OsmandApplication app = getApplication(); OsmandSettings settings = app.getSettings(); - boolean isCarView = getMapView().isCarView(); - if ((tileBox.getZoom() < 3 || !settings.SHOW_MAP_MARKERS.get()) && !isCarView || isCarView && Algorithms.isEmpty(androidAutoMarkers)) { + if (customObjectsDelegate != null && Algorithms.isEmpty(customObjectsDelegate.getMapObjects()) + || customObjectsDelegate == null && (tileBox.getZoom() < 3 || !settings.SHOW_MAP_MARKERS.get())) { clearVectorLinesCollections(); return; } @@ -395,7 +390,7 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode MapMarkersHelper markersHelper = app.getMapMarkersHelper(); updateBitmaps(false); - List markers = isCarView ? androidAutoMarkers : markersHelper.getMapMarkers(); + List markers = customObjectsDelegate != null ? customObjectsDelegate.getMapObjects() : markersHelper.getMapMarkers(); if (mapRenderer == null) { for (MapMarker marker : markers) { if (isMarkerVisible(tileBox, marker) && !overlappedByWaypoint(marker) @@ -1090,4 +1085,11 @@ private void drawLineAndText(Canvas canvas, RotatedTileBox tileBox, DrawSettings canvas.rotate(tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); } } + + public void setCustomMapObjects(List mapMarkers) { + if (customObjectsDelegate != null) { + customObjectsDelegate.setCustomMapObjects(mapMarkers); + getApplication().getOsmandMap().refreshMap(); + } + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java index b0d3ec61c83..68cf838f20f 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/POIMapLayer.java @@ -100,7 +100,7 @@ public class POIMapLayer extends OsmandMapLayer implements IContextMenuProvider, private PoiUIFilter routeTrackFilter; private String routeArticlePointsFilterByName; private boolean fileVisibilityChanged; - private Set androidAutoPoiFilters = null; + public CustomMapObjects customObjectsDelegate; /// cache for displayed POI // Work with cache (for map copied from AmenityIndexRepositoryOdb) @@ -147,6 +147,9 @@ public void layerOnPostExecute() { @Override protected List calculateResult(@NonNull QuadRect latLonBounds, int zoom) { + if (customObjectsDelegate != null) { + return customObjectsDelegate.getMapObjects(); + } if (calculatedFilters.isEmpty()) { return new ArrayList<>(); } @@ -287,7 +290,7 @@ private int getColor(@NonNull Amenity amenity) { } private boolean shouldDraw(int zoom) { - if (!filters.isEmpty() && zoom >= START_ZOOM) { + if (!filters.isEmpty() && zoom >= START_ZOOM || customObjectsDelegate != null) { return true; } else if (filters.isEmpty()) { if ((travelRendererHelper.getRouteArticlesProperty().get() && routeArticleFilter != null @@ -325,17 +328,10 @@ public void fileVisibilityChanged() { this.fileVisibilityChanged = true; } - public void setAndroidAutoPoints(@Nullable Set points){ - androidAutoPoiFilters = points; - } - @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { super.onPrepareBufferImage(canvas, tileBox, settings); Set selectedPoiFilters = app.getPoiFilters().getSelectedPoiFilters(); - if(androidAutoPoiFilters != null && app.getOsmandMap().getMapView().isCarView()){ - selectedPoiFilters = androidAutoPoiFilters; - } boolean showTravel = app.getSettings().SHOW_TRAVEL.get(); boolean routeArticleFilterEnabled = travelRendererHelper.getRouteArticlesProperty().get(); boolean routeArticlePointsFilterEnabled = travelRendererHelper.getRouteArticlePointsProperty().get(); @@ -682,4 +678,12 @@ public void routeWasCancelled() { @Override public void routeWasFinished() { } + + public void setCustomMapObjects(List poiUIFilters) { + if (customObjectsDelegate != null) { + data.clearCache(); + customObjectsDelegate.setCustomMapObjects(poiUIFilters); + getApplication().getOsmandMap().refreshMap(); + } + } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java index 90113addf72..a9a88331f4b 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java @@ -960,4 +960,21 @@ public void drawPath(Canvas canvas, Path path) { } } } + + public static class CustomMapObjects { + protected List customMapObjects; + + @NonNull + public List getMapObjects() { + if (customMapObjects == null) { + return new ArrayList<>(); + } else { + return customMapObjects; + } + } + + public void setCustomMapObjects(List customMapObjects) { + this.customMapObjects = customMapObjects; + } + } } From e91cd387506445f03b6a13d44298ec4d13410209 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 19 Jun 2023 08:18:53 +0300 Subject: [PATCH 006/214] Add terrain card in configure map --- .../aidlapi/OsmAndCustomizationConstants.java | 2 + .../res/layout/card_divider_16dp_margin.xml | 14 ++++ .../layout/list_item_terrain_description.xml | 83 +++++++++++++++++++ OsmAnd/res/values/strings.xml | 3 +- .../plus/configmap/CategoryAnimator.java | 8 +- .../plus/configmap/ConfigureMapFragment.java | 12 +-- .../plus/configmap/ConfigureMapMenu.java | 60 +++++++++++++- .../osmand/plus/plugins/PluginsHelper.java | 16 ++++ .../plus/widgets/ctxmenu/CtxMenuUtils.java | 16 ++++ .../plus/widgets/ctxmenu/ViewCreator.java | 14 ++++ .../widgets/ctxmenu/data/ContextMenuItem.java | 11 +++ 11 files changed, 227 insertions(+), 12 deletions(-) create mode 100644 OsmAnd/res/layout/card_divider_16dp_margin.xml create mode 100644 OsmAnd/res/layout/list_item_terrain_description.xml diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index 7605c4a933e..b9808caf4ce 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -42,6 +42,8 @@ public interface OsmAndCustomizationConstants { String APP_PROFILES_ID = CONFIGURE_MAP_ITEM_ID_SCHEME + "app_profiles"; String SHOW_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "category"; + String TERRAIN_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "terrain_category"; + String TERRAIN_DESCRIPTION_ID = SHOW_ITEMS_ID_SCHEME + "terrain_description"; String FAVORITES_ID = SHOW_ITEMS_ID_SCHEME + "favorites"; String POI_OVERLAY_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay"; String POI_OVERLAY_LABELS_ID = SHOW_ITEMS_ID_SCHEME + "poi_overlay_labels"; diff --git a/OsmAnd/res/layout/card_divider_16dp_margin.xml b/OsmAnd/res/layout/card_divider_16dp_margin.xml new file mode 100644 index 00000000000..e872af12021 --- /dev/null +++ b/OsmAnd/res/layout/card_divider_16dp_margin.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/list_item_terrain_description.xml b/OsmAnd/res/layout/list_item_terrain_description.xml new file mode 100644 index 00000000000..9982ff58717 --- /dev/null +++ b/OsmAnd/res/layout/list_item_terrain_description.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 27a9c8adb76..6a8ff4d386b 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,7 +10,8 @@ - For wording and consistency, please note https://docs.osmand.net/docs/technical/contributions/translating-osmand Thx - Hardy --> - + Slope uses colors to visualize terrain steepness. You can read more about Slopes in %1$s. + Terrain contour lines, full hillshade map with dark shades and slope maps with colors to show peaks and lowlands. Terrain map 3D Relief Own and observe the scale model of your neighborhood or the whole continent. diff --git a/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java b/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java index ae9b4f5a64c..fab048c7e23 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java +++ b/OsmAnd/src/net/osmand/plus/configmap/CategoryAnimator.java @@ -114,7 +114,11 @@ private void onBeforeAnimation() { divider.setVisibility(View.VISIBLE); // Description will be invisible until collapsing animation finished - tvDescription.setVisibility(View.INVISIBLE); + if (category.getDescription() == null) { + tvDescription.setVisibility(View.GONE); + } else { + tvDescription.setVisibility(View.INVISIBLE); + } } private void onMainAnimationUpdate(int val, float minValue, float maxValue) { @@ -150,7 +154,7 @@ private void onMainAnimationFinished() { // Update views visibility AndroidUiHelper.updateVisibility(divider, isExpanding); - AndroidUiHelper.updateVisibility(tvDescription, !isExpanding); + AndroidUiHelper.updateVisibility(tvDescription, !isExpanding && category.getDescription() != null); AndroidUiHelper.updateVisibility(itemsContainer, isExpanding); // Set items container height as WRAP_CONTENT diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java index 887913e2f8c..b48757d4617 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapFragment.java @@ -155,9 +155,7 @@ private void bindCategoryView(@NonNull ContextMenuItem category, @NonNull List nestedItems) { // Use the same layout for all categories views category.setLayout(R.layout.list_item_expandable_category); - List titles = CtxMenuUtils.getNames(nestedItems); - String description = TextUtils.join(", ", titles); - category.setDescription(description); + category.setDescription(CtxMenuUtils.getCategoryDescription(nestedItems)); String id = category.getId(); int standardId = category.getTitleId(); @@ -194,11 +192,13 @@ private void bindItemView(@NonNull ContextMenuItem item, @NonNull ViewGroup cont View existedView = views.get(standardId); View view = viewCreator.getView(item, existedView); view.setTag(R.id.item_as_tag, item); - view.setOnClickListener(getItemsClickListener()); + if (item.isClickable()) { + view.setOnClickListener(getItemsClickListener()); + } if (existedView == null) { views.put(standardId, view); container.addView(view); - if (item.getLayout() != R.layout.mode_toggles) { + if (item.getLayout() != R.layout.mode_toggles && item.isClickable()) { setupSelectableBg(view); } } @@ -213,7 +213,7 @@ private void updateCategoryView(@NonNull ContextMenuItem category) { ImageView ivIndicator = view.findViewById(R.id.explicit_indicator); ivIndicator.setImageResource(isCollapsed ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up); - AndroidUiHelper.updateVisibility(view.findViewById(R.id.description), isCollapsed); + AndroidUiHelper.updateVisibility(view.findViewById(R.id.description), isCollapsed && category.getDescription() != null); AndroidUiHelper.updateVisibility(view.findViewById(R.id.items_container), !isCollapsed); AndroidUiHelper.updateVisibility(view.findViewById(R.id.divider), !isCollapsed); } diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index f36deda6dc4..566ace9e44e 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -20,6 +20,8 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROAD_STYLE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.ROUTES_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.SHOW_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_DESCRIPTION_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TEXT_SIZE_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TRANSPORT_ID; @@ -56,11 +58,15 @@ import net.osmand.plus.R; import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.chooseplan.ChoosePlanFragment; +import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dialogs.DetailsBottomSheet; import net.osmand.plus.dialogs.SelectMapStyleBottomSheetDialogFragment; import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; +import net.osmand.plus.plugins.srtm.SRTMPlugin; import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; @@ -87,6 +93,7 @@ import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -140,12 +147,41 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { List customRules = ConfigureMapUtils.getCustomRules(app, UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); + if (app.useOpenGlRenderer()) { + createTerrainItems(customRules, adapter, mapActivity, nightMode); + } PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); createRenderingAttributeItems(customRules, adapter, mapActivity, nightMode); return adapter; } + private void createTerrainItems(@NonNull List customRules, + @NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity, + boolean nightMode) { + OsmandApplication app = activity.getMyApplication(); + MapLayerMenuListener listener = new MapLayerMenuListener(activity); + + adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) + .setCategory(true) + .setTitle(app.getString(R.string.shared_string_terrain)) + .setLayout(R.layout.list_group_title_with_switch)); + + if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(SRTMPlugin.class)); + addRelief3DItem(adapter, activity, nightMode, listener); + } else { + addTerrainDescriptionItem(adapter, activity); + if (PluginsHelper.isEnabled(NauticalMapsPlugin.class)) { + adapter.addItem(new ContextMenuItem("nautical_divider") + .setLayout(R.layout.card_divider_16dp_margin) + .setClickable(false)); + } + } + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(NauticalMapsPlugin.class)); + } + private void createLayersItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, @@ -230,11 +266,17 @@ private void createLayersItems(@NonNull List customRules, .setItemDeleteAction(settings.MAP_ONLINE_DATA, settings.MAP_TILE_SOURCES) .setListener(listener)); - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); + if (app.useOpenGlRenderer()) { + ArrayList terrainPlugins = new ArrayList<>(); + terrainPlugins.add(SRTMPlugin.class); + terrainPlugins.add(NauticalMapsPlugin.class); + PluginsHelper.registerLayerContextMenuExcluded(adapter, activity, customRules, terrainPlugins); + } else { + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); + addRelief3DItem(adapter, activity, nightMode, listener); + } app.getAidlApi().registerLayerContextMenu(adapter, activity); - addRelief3DItem(adapter, activity, nightMode, listener); - selected = settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.get(); adapter.addItem(new ContextMenuItem(MAP_BORDERS_ID) .setTitleId(R.string.show_borders_of_downloaded_maps, activity) @@ -245,6 +287,18 @@ private void createLayersItems(@NonNull List customRules, .setListener(listener)); } + private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity) { + adapter.addItem(new ContextMenuItem(TERRAIN_DESCRIPTION_ID) + .setLayout(R.layout.list_item_terrain_description) + .setTitleId(TERRAIN_DESCRIPTION_ID.hashCode(), null) + .setClickable(false) + .setSpecialViewListener((uiAdapter, view, item, isChecked) -> { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.TERRAIN); + return true; + })); + } + private void addRelief3DItem(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, boolean nightMode, diff --git a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java index e831fa8ebb5..528ee52befc 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java +++ b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java @@ -611,6 +611,22 @@ public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, } } + public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List plugins) { + for (OsmandPlugin plugin : getAvailablePlugins()) { + if (plugins.contains(plugin.getClass())) { + plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); + } + } + } + + public static void registerLayerContextMenuExcluded(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List excludedPlugins) { + for (OsmandPlugin plugin : getAvailablePlugins()) { + if (!excludedPlugins.contains(plugin.getClass())) { + plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); + } + } + } + public static void registerConfigureMapCategory(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.registerConfigureMapCategoryActions(adapter, mapActivity, customRules); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java index 6bfe031c970..56e41e698b6 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/CtxMenuUtils.java @@ -3,6 +3,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import net.osmand.plus.OsmandApplication; import net.osmand.plus.settings.backend.OsmAndAppCustomization; @@ -32,6 +33,21 @@ public static List getNames(@NonNull List items) { return itemNames; } + @Nullable + public static String getCategoryDescription(@NonNull List items) { + List itemNames = new ArrayList<>(); + for (ContextMenuItem item : items) { + String title = item.getTitle(); + if (title != null) { + itemNames.add(title); + } + } + if (itemNames.isEmpty()) { + return null; + } + return TextUtils.join(", ", itemNames); + } + public static void removeHiddenItems(@NonNull ContextMenuAdapter adapter) { OsmandApplication app = adapter.getApplication(); List items = adapter.getItems(); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index a56dbf84078..9c974cd5c67 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -181,6 +181,8 @@ private View getSpecialView(@LayoutRes int layoutId, @NonNull ContextMenuItem it return getHelpToImproveItemView(convertView); } else if (layoutId == R.layout.main_menu_drawer_osmand_version) { return getOsmAndVersionView(convertView, item); + } else if (layoutId == R.layout.list_item_terrain_description) { + return getTerrainDescriptionView(convertView, item); } return null; } @@ -285,6 +287,18 @@ private View getHelpToImproveItemView(@NonNull View view) { return view; } + private View getTerrainDescriptionView(@NonNull View view, @NonNull ContextMenuItem item) { + View btnGet = view.findViewById(R.id.button_get); + UiUtilities.setupDialogButton(nightMode, btnGet, UiUtilities.DialogButtonType.SECONDARY_ACTIVE, R.string.shared_string_get); + btnGet.setOnClickListener(v -> { + ItemClickListener listener = item.getSpecialViewClickListener(); + if (listener != null) { + listener.onContextMenuClick(uiAdapter, view, item, false); + } + }); + return view; + } + @NonNull private View getOsmAndVersionView(@NonNull View view, @NonNull ContextMenuItem item) { TextView osmAndVersionText = view.findViewById(R.id.osmand_version); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index edf6f4a45ba..1858325ea4d 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -58,6 +58,7 @@ public class ContextMenuItem { private OnRefreshCallback onRefreshCallback; private ItemClickListener itemClickListener; + private ItemClickListener specialViewClickListener; private ItemLongClickListener itemLongClickListener; private OnIntegerValueChangedListener integerListener; private ProgressListener progressListener; @@ -176,6 +177,10 @@ public ItemClickListener getItemClickListener() { return itemClickListener; } + public ItemClickListener getSpecialViewClickListener() { + return specialViewClickListener; + } + @Nullable public ItemLongClickListener getItemLongClickListener() { return itemLongClickListener; @@ -346,6 +351,12 @@ public ContextMenuItem setListener(@Nullable ItemClickListener itemClickListener return this; } + @NonNull + public ContextMenuItem setSpecialViewListener(@Nullable ItemClickListener specialViewClickListener) { + this.specialViewClickListener = specialViewClickListener; + return this; + } + @NonNull public ContextMenuItem setLongClickListener(@Nullable ItemLongClickListener longClickListener) { this.itemLongClickListener = longClickListener; From 5de9c433e18fddee8f346caf1d8e1822e4fbd5d7 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 19 Jun 2023 08:21:57 +0300 Subject: [PATCH 007/214] Terrain redesign --- .../layout/configure_map_option_fragment.xml | 119 +++++++ OsmAnd/res/layout/fragment_terrain.xml | 290 +++++++----------- .../layout/terrain_visibility_fragment.xml | 36 +++ .../layout/terrain_zoom_levels_fragment.xml | 49 +++ .../osmand/plus/activities/MapActivity.java | 6 + .../configmap/ConfigureMapOptionFragment.java | 223 ++++++++++++++ .../osmand/plus/plugins/srtm/SRTMPlugin.java | 28 +- .../plus/plugins/srtm/TerrainFragment.java | 180 +++++------ .../osmand/plus/plugins/srtm/TerrainMode.java | 14 +- .../srtm/TerrainVisibilityFragment.java | 118 +++++++ .../srtm/TerrainZoomLevelsFragment.java | 129 ++++++++ .../mapwidgets/WidgetsVisibilityHelper.java | 19 +- 12 files changed, 920 insertions(+), 291 deletions(-) create mode 100644 OsmAnd/res/layout/configure_map_option_fragment.xml create mode 100644 OsmAnd/res/layout/terrain_visibility_fragment.xml create mode 100644 OsmAnd/res/layout/terrain_zoom_levels_fragment.xml create mode 100644 OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java diff --git a/OsmAnd/res/layout/configure_map_option_fragment.xml b/OsmAnd/res/layout/configure_map_option_fragment.xml new file mode 100644 index 00000000000..8b5221a6c92 --- /dev/null +++ b/OsmAnd/res/layout/configure_map_option_fragment.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_terrain.xml b/OsmAnd/res/layout/fragment_terrain.xml index 370fa9f395a..d990da72ce9 100644 --- a/OsmAnd/res/layout/fragment_terrain.xml +++ b/OsmAnd/res/layout/fragment_terrain.xml @@ -3,8 +3,8 @@ xmlns:osmand="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:descendantFocusability="blocksDescendants" android:layout_height="match_parent" + android:descendantFocusability="blocksDescendants" android:orientation="vertical"> + android:layout_height="match_parent" + android:background="?attr/activity_background_basic" + android:orientation="vertical"> - - - - - - - - @@ -124,200 +100,164 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="@dimen/content_padding" - android:paddingTop="@dimen/content_padding_small" - android:paddingEnd="@dimen/content_padding"> + android:paddingStart="@dimen/content_padding"> - + osmand:typeface="@string/font_roboto_medium" /> - + android:layout_gravity="center_vertical" + android:layout_weight="0" + android:background="?attr/selectableItemBackground" + android:paddingHorizontal="@dimen/content_padding" + android:paddingVertical="16dp"> + + + + + + - + android:layout_marginTop="@dimen/content_padding_small_half" + android:layout_marginEnd="@dimen/content_padding" + android:layout_marginBottom="@dimen/content_padding" + android:lineSpacingExtra="@dimen/line_spacing_extra_description" + android:text="@string/terrain_slider_description" + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_desc_text_size" /> + + - - + android:layout_height="@dimen/setting_list_item_large_height" + android:background="?attr/selectableItemBackground" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + android:textSize="@dimen/default_list_text_size" + osmand:typeface="@string/font_roboto_regular" /> - + android:paddingHorizontal="@dimen/content_padding" + android:textColor="?android:textColorSecondary" + android:textSize="@dimen/default_list_text_size" + tools:text="25%" /> + + android:orientation="horizontal"> - + android:layout_margin="@dimen/content_padding" + android:src="@drawable/ic_action_layers" + android:tint="?attr/default_icon_color" /> - - - + + + tools:text="25%" /> - - - - - - - - - - - - - - - - @@ -332,13 +272,12 @@ + + + android:focusable="false" + android:minHeight="@dimen/toolbar_height" /> diff --git a/OsmAnd/res/layout/terrain_visibility_fragment.xml b/OsmAnd/res/layout/terrain_visibility_fragment.xml new file mode 100644 index 00000000000..2fd8b052a79 --- /dev/null +++ b/OsmAnd/res/layout/terrain_visibility_fragment.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml b/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml new file mode 100644 index 00000000000..28f389e08f7 --- /dev/null +++ b/OsmAnd/res/layout/terrain_zoom_levels_fragment.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 792ec0b84e4..62fa37de6d0 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -77,6 +77,7 @@ import net.osmand.plus.base.ContextMenuFragment; import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.configmap.ConfigureMapFragment; +import net.osmand.plus.configmap.ConfigureMapOptionFragment; import net.osmand.plus.dashboard.DashBaseFragment; import net.osmand.plus.dashboard.DashboardOnMap; import net.osmand.plus.dialogs.CrashBottomSheetDialogFragment; @@ -2066,6 +2067,11 @@ public DownloadTilesFragment getDownloadTilesFragment() { return getFragment(DownloadTilesFragment.TAG); } + @Nullable + public ConfigureMapOptionFragment getConfigureMapOptionFragment() { + return getFragment(ConfigureMapOptionFragment.TAG); + } + @Nullable public WeatherForecastFragment getWeatherForecastFragment() { return getFragment(WeatherForecastFragment.TAG); diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java new file mode 100644 index 00000000000..3e93283da6e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapOptionFragment.java @@ -0,0 +1,223 @@ +package net.osmand.plus.configmap; + +import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.BACK_TO_LOC_BUTTON_ID; +import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.ZOOM_IN_BUTTON_ID; +import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.ZOOM_OUT_BUTTON_ID; +import static net.osmand.plus.utils.UiUtilities.setupDialogButton; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.BaseOsmAndFragment; +import net.osmand.plus.dashboard.DashboardOnMap; +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.utils.ColorUtilities; +import net.osmand.plus.utils.UiUtilities; +import net.osmand.plus.views.MapLayers; +import net.osmand.plus.views.controls.maphudbuttons.MyLocationButton; +import net.osmand.plus.views.controls.maphudbuttons.ZoomInButton; +import net.osmand.plus.views.controls.maphudbuttons.ZoomOutButton; +import net.osmand.plus.views.layers.MapControlsLayer; +import net.osmand.plus.views.layers.MapInfoLayer; +import net.osmand.plus.views.mapwidgets.widgets.RulerWidget; + +import java.util.Arrays; +import java.util.Collections; + +public abstract class ConfigureMapOptionFragment extends BaseOsmAndFragment { + + public static final String TAG = ConfigureMapOptionFragment.class.getSimpleName(); + private RulerWidget rulerWidget; + private View applyButton; + protected LinearLayout contentContainer; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + updateNightMode(); + MapActivity activity = requireMapActivity(); + View view = themedInflater.inflate(R.layout.configure_map_option_fragment, container, false); + AndroidUtils.addStatusBarPadding21v(activity, view); + + contentContainer = view.findViewById(R.id.main_content); + applyButton = view.findViewById(R.id.apply_button); + applyButton.setOnClickListener(viewOnCLick -> { + onApplyButtonClick(); + activity.onBackPressed(); + }); + + activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + activity.getSupportFragmentManager().popBackStack(); + activity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.TERRAIN, false); + } + }); + + updateApplyButton(false); + setupToolBar(view); + buildZoomButtons(view); + moveCompassButton(view); + setupMainContent(); + + requireMapActivity().refreshMap(); + return view; + } + + protected abstract String getToolbarTitle(); + + protected void onResetToDefault() { + } + + protected void onApplyButtonClick() { + } + + protected abstract void setupMainContent(); + + @Override + public int getStatusBarColorId() { + AndroidUiHelper.setStatusBarContentColor(getView(), nightMode); + return ColorUtilities.getListBgColorId(nightMode); + } + + @Override + protected boolean isUsedOnMap() { + return true; + } + + protected void updateApplyButton(boolean enable) { + applyButton.setEnabled(enable); + setupDialogButton(nightMode, applyButton, enable ? UiUtilities.DialogButtonType.PRIMARY : UiUtilities.DialogButtonType.STROKED, getString(R.string.shared_string_apply)); + } + + protected void refreshMap() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.refreshMap(); + } + } + + private void buildZoomButtons(@NonNull View view) { + View zoomButtonsView = view.findViewById(R.id.map_hud_controls); + + MapActivity activity = requireMapActivity(); + MapLayers mapLayers = activity.getMapLayers(); + MapControlsLayer layer = mapLayers.getMapControlsLayer(); + + layer.addMapButton(new ZoomInButton(activity, view.findViewById(R.id.map_zoom_in_button), ZOOM_IN_BUTTON_ID)); + layer.addMapButton(new ZoomOutButton(activity, view.findViewById(R.id.map_zoom_out_button), ZOOM_OUT_BUTTON_ID)); + layer.addMapButton(new MyLocationButton(activity, view.findViewById(R.id.map_my_location_button), BACK_TO_LOC_BUTTON_ID, false)); + + AndroidUiHelper.updateVisibility(zoomButtonsView, true); + + MapInfoLayer mapInfoLayer = mapLayers.getMapInfoLayer(); + rulerWidget = mapInfoLayer.setupRulerWidget(view.findViewById(R.id.map_ruler_layout)); + } + + private void setupToolBar(@NonNull View view) { + TextView title = view.findViewById(R.id.title); + title.setText(getToolbarTitle()); + + ImageView backButton = view.findViewById(R.id.back_button); + backButton.setImageDrawable(getIcon(AndroidUtils.getNavigationIconResId(requireMapActivity()), ColorUtilities.getDefaultIconColorId(nightMode))); + backButton.setOnClickListener(v -> { + MapActivity activity = getMapActivity(); + if (activity != null) { + activity.onBackPressed(); + } + }); + + ImageButton resetButton = view.findViewById(R.id.reset_button); + resetButton.setImageDrawable(getIcon(R.drawable.ic_action_reset, ColorUtilities.getDefaultIconColorId(nightMode))); + resetButton.setOnClickListener(view1 -> onResetToDefault()); + } + + private void moveCompassButton(@NonNull View view) { + int btnSizePx = getDimensionPixelSize(R.dimen.map_small_button_size); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(btnSizePx, btnSizePx); + int toolbarHeight = getDimensionPixelSize(R.dimen.toolbar_height); + int topMargin = getDimensionPixelSize(R.dimen.map_small_button_margin); + int startMargin = getDimensionPixelSize(R.dimen.map_button_margin); + AndroidUtils.setMargins(params, startMargin, topMargin + toolbarHeight, 0, 0); + + MapActivity activity = getMapActivity(); + if (activity != null) { + MapLayers mapLayers = activity.getMapLayers(); + MapControlsLayer mapControlsLayer = mapLayers.getMapControlsLayer(); + mapControlsLayer.moveCompassButton((ViewGroup) view, params); + } + } + + @Override + public void onResume() { + super.onResume(); + + MapActivity mapActivity = requireMapActivity(); + mapActivity.disableDrawer(); + updateWidgetsVisibility(mapActivity, View.GONE); + } + + @Override + public void onPause() { + super.onPause(); + + MapActivity mapActivity = requireMapActivity(); + mapActivity.enableDrawer(); + updateWidgetsVisibility(mapActivity, View.VISIBLE); + } + + private void updateWidgetsVisibility(@NonNull MapActivity activity, int visibility) { + AndroidUiHelper.setVisibility(activity, visibility, R.id.map_left_widgets_panel, + R.id.map_right_widgets_panel, R.id.map_center_info); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + MapLayers mapLayers = mapActivity.getMapLayers(); + + MapControlsLayer layer = mapLayers.getMapControlsLayer(); + layer.removeMapButtons(Arrays.asList(ZOOM_IN_BUTTON_ID, ZOOM_OUT_BUTTON_ID, BACK_TO_LOC_BUTTON_ID)); + layer.restoreCompassButton(); + + if (rulerWidget != null) { + MapInfoLayer mapInfoLayer = mapLayers.getMapInfoLayer(); + mapInfoLayer.removeRulerWidgets(Collections.singletonList(rulerWidget)); + } + } + requireMapActivity().refreshMap(); + } + + @Nullable + public MapActivity getMapActivity() { + FragmentActivity activity = getActivity(); + if (activity instanceof MapActivity) { + return (MapActivity) activity; + } else { + return null; + } + } + + @NonNull + protected MapActivity requireMapActivity() { + return ((MapActivity) requireActivity()); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index 92725cd12a5..2441dcbac82 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -2,10 +2,7 @@ import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; import android.graphics.drawable.Drawable; -import android.view.ContextThemeWrapper; import android.view.View; import net.osmand.data.LatLon; @@ -46,7 +43,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; import static net.osmand.aidlapi.OsmAndCustomizationConstants.PLUGIN_SRTM; @@ -263,6 +259,30 @@ public int getTerrainTransparency() { return 100; } + public void resetZoomLevelsToDefault() { + switch (getTerrainMode()) { + case HILLSHADE: + HILLSHADE_MIN_ZOOM.resetToDefault(); + HILLSHADE_MAX_ZOOM.resetToDefault(); + break; + case SLOPE: + SLOPE_MIN_ZOOM.resetToDefault(); + SLOPE_MAX_ZOOM.resetToDefault(); + break; + } + } + + public void resetTransparencyToDefault() { + switch (getTerrainMode()) { + case HILLSHADE: + HILLSHADE_TRANSPARENCY.resetToDefault(); + break; + case SLOPE: + SLOPE_TRANSPARENCY.resetToDefault(); + break; + } + } + public int getTerrainMinZoom() { int minSupportedZoom = TERRAIN_MIN_SUPPORTED_ZOOM; int minZoom = minSupportedZoom; diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java index a0ea9d5b825..9194d1c42f8 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainFragment.java @@ -55,12 +55,17 @@ import net.osmand.plus.widgets.ctxmenu.ViewCreator; import net.osmand.plus.widgets.ctxmenu.callback.ItemClickListener; import net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem; +import net.osmand.plus.widgets.popup.PopUpMenu; +import net.osmand.plus.widgets.popup.PopUpMenuDisplayData; +import net.osmand.plus.widgets.popup.PopUpMenuItem; +import net.osmand.plus.widgets.popup.PopUpMenuWidthMode; import net.osmand.plus.widgets.style.CustomTypefaceSpan; import org.apache.commons.logging.Log; import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.List; @@ -74,55 +79,27 @@ public class TerrainFragment extends BaseOsmAndFragment implements View.OnClickL private int profileColor; + private TextView visibilityTv; + private TextView zoomLevelsTv; + private TextView coloSchemeTv; + private View legend; + private TextView downloadDescriptionTv; - private TextView transparencyValueTv; private TextView descriptionTv; - private LinearLayout customRadioButton; - private TextView minZoomTv; - private TextView maxZoomTv; private TextView stateTv; private SwitchCompat switchCompat; private ImageView iconIv; private LinearLayout emptyState; - private LinearLayout legendContainer; + private View emptyStateDivider; private LinearLayout contentContainer; private LinearLayout downloadContainer; - private View legendBottomDivider; private View titleBottomDivider; - private View legendTopDivider; private View downloadTopDivider; private View downloadBottomDivider; - private Slider transparencySlider; - private RangeSlider zoomSlider; private ObservableListView observableListView; private ContextMenuListAdapter listAdapter; - private final Slider.OnChangeListener transparencySliderChangeListener = new Slider.OnChangeListener() { - @Override - public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { - if (fromUser) { - String transparencyStr = (int) value + "%"; - transparencyValueTv.setText(transparencyStr); - srtmPlugin.setTerrainTransparency((int) Math.ceil(value * 2.55), srtmPlugin.getTerrainMode()); - refreshMap(); - } - } - }; - - private final RangeSlider.OnChangeListener zoomSliderChangeListener = new RangeSlider.OnChangeListener() { - @Override - public void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) { - List values = slider.getValues(); - if (values.size() > 1) { - minZoomTv.setText(String.valueOf(values.get(0).intValue())); - maxZoomTv.setText(String.valueOf(values.get(1).intValue())); - srtmPlugin.setTerrainZoomValues(values.get(0).intValue(), values.get(1).intValue(), srtmPlugin.getTerrainMode()); - refreshMap(); - } - } - }; - @Nullable private MapActivity getMapActivity() { Activity activity = getActivity(); @@ -153,66 +130,86 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c showHideTopShadow(root); + visibilityTv = root.findViewById(R.id.visibility_value); + zoomLevelsTv = root.findViewById(R.id.zoom_value); + coloSchemeTv = root.findViewById(R.id.color_scheme_name); + legend = root.findViewById(R.id.legend); + TextView emptyStateDescriptionTv = root.findViewById(R.id.empty_state_description); - TextView slopeReadMoreTv = root.findViewById(R.id.slope_read_more_tv); TextView titleTv = root.findViewById(R.id.title_tv); downloadDescriptionTv = root.findViewById(R.id.download_description_tv); - transparencyValueTv = root.findViewById(R.id.transparency_value_tv); - legendBottomDivider = root.findViewById(R.id.legend_bottom_divider); - transparencySlider = root.findViewById(R.id.transparency_slider); titleBottomDivider = root.findViewById(R.id.titleBottomDivider); - legendTopDivider = root.findViewById(R.id.legend_top_divider); contentContainer = root.findViewById(R.id.content_container); - legendContainer = root.findViewById(R.id.legend_container); switchCompat = root.findViewById(R.id.switch_compat); descriptionTv = root.findViewById(R.id.description); emptyState = root.findViewById(R.id.empty_state); + emptyStateDivider = root.findViewById(R.id.empty_state_divider); stateTv = root.findViewById(R.id.state_tv); iconIv = root.findViewById(R.id.icon_iv); - zoomSlider = root.findViewById(R.id.zoom_slider); - minZoomTv = root.findViewById(R.id.zoom_value_min); - maxZoomTv = root.findViewById(R.id.zoom_value_max); - customRadioButton = root.findViewById(R.id.custom_radio_buttons); - TextView hillshadeBtn = root.findViewById(R.id.left_button); - TextView slopeBtn = root.findViewById(R.id.right_button); downloadContainer = root.findViewById(R.id.download_container); downloadTopDivider = root.findViewById(R.id.download_container_top_divider); downloadBottomDivider = root.findViewById(R.id.download_container_bottom_divider); observableListView = root.findViewById(R.id.list_view); titleTv.setText(R.string.shared_string_terrain); - String wikiString = getString(R.string.shared_string_wikipedia); - String readMoreText = String.format( - getString(R.string.slope_read_more), - wikiString - ); - String wikiSlopeUrl = getString(R.string.url_wikipedia_slope); String pluginUrl = getString(R.string.osmand_features_contour_lines_plugin); String emptyStateText = getString(R.string.terrain_empty_state_text) + "\n" + pluginUrl; - setupClickableText(slopeReadMoreTv, readMoreText, wikiString, wikiSlopeUrl, false); setupClickableText(emptyStateDescriptionTv, emptyStateText, pluginUrl, pluginUrl, true); switchCompat.setChecked(terrainEnabled); - hillshadeBtn.setOnClickListener(this); - hillshadeBtn.setText(R.string.shared_string_hillshade); switchCompat.setOnClickListener(this); - slopeBtn.setOnClickListener(this); - slopeBtn.setText(R.string.shared_string_slope); - - UiUtilities.setupSlider(transparencySlider, nightMode, profileColor); - UiUtilities.setupSlider(zoomSlider, nightMode, profileColor, true); - - transparencySlider.addOnChangeListener(transparencySliderChangeListener); - zoomSlider.addOnChangeListener(zoomSliderChangeListener); - transparencySlider.setValueTo(100); - transparencySlider.setValueFrom(0); - UiUtilities.setupCompoundButton(switchCompat, nightMode, UiUtilities.CompoundButtonType.PROFILE_DEPENDENT); + setupColorSchemeCard(root); updateUiMode(); return root; } + private void updateColorSchemeCard(TerrainMode mode) { + int transparencyValue = (int) (srtmPlugin.getTerrainTransparency() / 2.55); + String transparency = transparencyValue + "%"; + visibilityTv.setText(transparency); + + int minZoom = srtmPlugin.getTerrainMinZoom(); + int maxZoom = srtmPlugin.getTerrainMaxZoom(); + String zoomLevels = minZoom + " - " + maxZoom; + zoomLevelsTv.setText(zoomLevels); + coloSchemeTv.setText(mode.nameId); + AndroidUiHelper.updateVisibility(legend, mode == SLOPE); + } + + private void setupColorSchemeCard(@NonNull View root) { + View colorSchemeBtn = root.findViewById(R.id.color_scheme_button); + colorSchemeBtn.setOnClickListener(view -> { + List menuItems = new ArrayList<>(); + for (TerrainMode mode : TerrainMode.values()) { + menuItems.add(new PopUpMenuItem.Builder(app) + .setTitle(getString(mode.nameId)) + .setOnClickListener(v -> setupTerrainMode(mode)) + .create()); + } + PopUpMenuDisplayData displayData = new PopUpMenuDisplayData(); + displayData.anchorView = view; + displayData.menuItems = menuItems; + displayData.nightMode = nightMode; + displayData.layoutId = R.layout.popup_menu_item_checkbox; + displayData.widthMode = PopUpMenuWidthMode.STANDARD; + PopUpMenu.show(displayData); + }); + + View visibilityBtn = root.findViewById(R.id.visibility_button); + View zoomLevelsBtn = root.findViewById(R.id.zoom_levels_button); + + visibilityBtn.setOnClickListener(view -> { + getMapActivity().getDashboard().hideDashboard(); + TerrainVisibilityFragment.showInstance(requireActivity().getSupportFragmentManager()); + }); + zoomLevelsBtn.setOnClickListener(view -> { + getMapActivity().getDashboard().hideDashboard(); + TerrainZoomLevelsFragment.showInstance(requireActivity().getSupportFragmentManager()); + }); + } + private void showHideTopShadow(@NonNull View view) { boolean portrait = AndroidUiHelper.isOrientationPortrait(requireActivity()); AndroidUiHelper.updateVisibility(view.findViewById(R.id.shadow_on_map), portrait); @@ -223,38 +220,29 @@ public void onClick(View view) { int id = view.getId(); if (id == R.id.switch_compat) { onSwitchClick(); - } else if (id == R.id.left_button) { - setupTerrainMode(HILLSHADE); - } else if (id == R.id.right_button) { - setupTerrainMode(SLOPE); } } private void updateUiMode() { TerrainMode mode = srtmPlugin.getTerrainMode(); if (terrainEnabled) { - int transparencyValue = (int) (srtmPlugin.getTerrainTransparency() / 2.55); - String transparency = transparencyValue + "%"; - int minZoom = srtmPlugin.getTerrainMinZoom(); - int maxZoom = srtmPlugin.getTerrainMaxZoom(); iconIv.setImageDrawable(uiUtilities.getPaintedIcon(R.drawable.ic_action_hillshade_dark, profileColor)); stateTv.setText(R.string.shared_string_enabled); - transparencySlider.setValue(transparencyValue); - transparencyValueTv.setText(transparency); - zoomSlider.setValueFrom(SRTMPlugin.TERRAIN_MIN_SUPPORTED_ZOOM); - zoomSlider.setValueTo(SRTMPlugin.TERRAIN_MAX_SUPPORTED_ZOOM); - zoomSlider.setValues((float) minZoom, (float) maxZoom); - - minZoomTv.setText(String.valueOf(minZoom)); - maxZoomTv.setText(String.valueOf(maxZoom)); switch (mode) { case HILLSHADE: descriptionTv.setText(R.string.hillshade_description); downloadDescriptionTv.setText(R.string.hillshade_download_description); break; case SLOPE: - descriptionTv.setText(R.string.slope_description); + descriptionTv.setText(R.string.slope_legend_description); + String wikiString = getString(R.string.shared_string_wikipedia); + String readMoreText = String.format( + getString(R.string.slope_legend_description), + wikiString + ); + String wikiSlopeUrl = getString(R.string.url_wikipedia_slope); + setupClickableText(descriptionTv, readMoreText, wikiString, wikiSlopeUrl, false); downloadDescriptionTv.setText(R.string.slope_download_description); break; } @@ -268,31 +256,16 @@ private void updateUiMode() { stateTv.setText(R.string.shared_string_disabled); } adjustGlobalVisibility(); - adjustLegendVisibility(mode); - adjustModeButtons(mode); + updateColorSchemeCard(mode); } private void adjustGlobalVisibility() { emptyState.setVisibility(terrainEnabled ? View.GONE : View.VISIBLE); + emptyStateDivider.setVisibility(terrainEnabled ? View.GONE : View.VISIBLE); titleBottomDivider.setVisibility(terrainEnabled ? View.GONE : View.VISIBLE); contentContainer.setVisibility(terrainEnabled ? View.VISIBLE : View.GONE); } - private void adjustLegendVisibility(TerrainMode mode) { - int visibility = mode == SLOPE ? View.VISIBLE : View.GONE; - legendContainer.setVisibility(visibility); - legendBottomDivider.setVisibility(visibility); - legendTopDivider.setVisibility(visibility); - } - - private void adjustModeButtons(TerrainMode mode) { - if (mode == SLOPE) { - UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, END); - } else { - UiUtilities.updateCustomRadioButtons(app, customRadioButton, nightMode, START); - } - } - private void setupClickableText(TextView textView, String text, String clickableText, @@ -348,13 +321,6 @@ private void setupTerrainMode(TerrainMode mode) { } } - private void refreshMap() { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - mapActivity.refreshMap(); - } - } - private void updateLayers() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java index 596e5691ddc..d46b14f6419 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainMode.java @@ -1,6 +1,16 @@ package net.osmand.plus.plugins.srtm; +import androidx.annotation.StringRes; + +import net.osmand.plus.R; + public enum TerrainMode { - HILLSHADE, - SLOPE + HILLSHADE(R.string.shared_string_hillshade), + SLOPE(R.string.shared_string_slope); + + final int nameId; + + TerrainMode(@StringRes int nameId) { + this.nameId = nameId; + } } diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java new file mode 100644 index 00000000000..c8f716ea2be --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainVisibilityFragment.java @@ -0,0 +1,118 @@ +package net.osmand.plus.plugins.srtm; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; + +import com.google.android.material.slider.Slider; + +import net.osmand.plus.R; +import net.osmand.plus.configmap.ConfigureMapOptionFragment; +import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.utils.UiUtilities; + +public class TerrainVisibilityFragment extends ConfigureMapOptionFragment { + public static final String VISIBILITY = "visibility"; + + private SRTMPlugin srtmPlugin; + private TextView visibilityTv; + private Slider visibilitySlider; + + private int originalVisibilityValue; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); + + if (savedInstanceState != null && savedInstanceState.containsKey(VISIBILITY)) { + originalVisibilityValue = savedInstanceState.getInt(VISIBILITY); + } else if (srtmPlugin != null) { + originalVisibilityValue = srtmPlugin.getTerrainTransparency(); + } + } + + @Override + public void onDestroy() { + srtmPlugin.setTerrainTransparency(originalVisibilityValue, srtmPlugin.getTerrainMode()); + super.onDestroy(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(VISIBILITY, originalVisibilityValue); + } + + @Override + protected String getToolbarTitle() { + return getString(R.string.gpx_visibility_txt); + } + + @Override + protected void onResetToDefault() { + srtmPlugin.resetTransparencyToDefault(); + updateApplyButton(isChangesMade()); + setupSlider(); + refreshMap(); + } + + @Override + protected void setupMainContent() { + View view = themedInflater.inflate(R.layout.terrain_visibility_fragment, null, false); + visibilitySlider = view.findViewById(R.id.transparency_slider); + visibilityTv = view.findViewById(R.id.transparency_value_tv); + + setupSlider(); + contentContainer.addView(view); + } + + @Override + protected void onApplyButtonClick() { + originalVisibilityValue = srtmPlugin.getTerrainTransparency(); + } + + private void setupSlider() { + int transparencyValue = (int) (srtmPlugin.getTerrainTransparency() / 2.55); + String transparency = transparencyValue + "%"; + visibilityTv.setText(transparency); + + visibilitySlider.addOnChangeListener(transparencySliderChangeListener); + visibilitySlider.setValueTo(100); + visibilitySlider.setValueFrom(0); + visibilitySlider.setValue(transparencyValue); + int profileColor = settings.getApplicationMode().getProfileColor(nightMode); + UiUtilities.setupSlider(visibilitySlider, nightMode, profileColor); + } + + private final Slider.OnChangeListener transparencySliderChangeListener = new Slider.OnChangeListener() { + @Override + public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { + if (fromUser) { + String transparencyStr = (int) value + "%"; + visibilityTv.setText(transparencyStr); + srtmPlugin.setTerrainTransparency((int) Math.ceil(value * 2.55), srtmPlugin.getTerrainMode()); + updateApplyButton(isChangesMade()); + refreshMap(); + } + } + }; + + private boolean isChangesMade() { + return srtmPlugin.getTerrainTransparency() != originalVisibilityValue; + } + + public static void showInstance(@NonNull FragmentManager manager) { + if (AndroidUtils.isFragmentCanBeAdded(manager, TAG)) { + manager.beginTransaction() + .replace(R.id.fragmentContainer, new TerrainVisibilityFragment(), TAG) + .addToBackStack(null) + .commitAllowingStateLoss(); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java new file mode 100644 index 00000000000..de0c015a9ee --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/TerrainZoomLevelsFragment.java @@ -0,0 +1,129 @@ +package net.osmand.plus.plugins.srtm; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; + +import com.google.android.material.slider.RangeSlider; + +import net.osmand.plus.R; +import net.osmand.plus.configmap.ConfigureMapOptionFragment; +import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.utils.UiUtilities; + +import java.util.List; + +public class TerrainZoomLevelsFragment extends ConfigureMapOptionFragment { + public static final String MIN_VALUE = "min_value"; + public static final String MAX_VALUE = "max_value"; + + private SRTMPlugin srtmPlugin; + private TextView minZoomTv; + private TextView maxZoomTv; + private RangeSlider zoomSlider; + + private int originalMinZoomValue; + private int originalMaxZoomValue; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); + + if (savedInstanceState != null && savedInstanceState.containsKey(MAX_VALUE) && savedInstanceState.containsKey(MIN_VALUE)) { + originalMaxZoomValue = savedInstanceState.getInt(MAX_VALUE); + originalMinZoomValue = savedInstanceState.getInt(MIN_VALUE); + } else if (srtmPlugin != null) { + originalMaxZoomValue = srtmPlugin.getTerrainMaxZoom(); + originalMinZoomValue = srtmPlugin.getTerrainMinZoom(); + } + } + + @Override + public void onDestroy() { + srtmPlugin.setTerrainZoomValues(originalMinZoomValue, originalMaxZoomValue, srtmPlugin.getTerrainMode()); + super.onDestroy(); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(MAX_VALUE, originalMaxZoomValue); + outState.putInt(MIN_VALUE, originalMinZoomValue); + } + + @Override + protected String getToolbarTitle() { + return getString(R.string.shared_string_zoom_levels); + } + + @Override + protected void onResetToDefault() { + srtmPlugin.resetZoomLevelsToDefault(); + updateApplyButton(isChangesMade()); + setupSlider(); + refreshMap(); + } + + @Override + protected void setupMainContent() { + View view = themedInflater.inflate(R.layout.terrain_zoom_levels_fragment, null, false); + zoomSlider = view.findViewById(R.id.zoom_slider); + minZoomTv = view.findViewById(R.id.zoom_value_min); + maxZoomTv = view.findViewById(R.id.zoom_value_max); + + setupSlider(); + contentContainer.addView(view); + } + + @Override + protected void onApplyButtonClick() { + originalMinZoomValue = srtmPlugin.getTerrainMinZoom(); + originalMaxZoomValue = srtmPlugin.getTerrainMaxZoom(); + } + + private void setupSlider() { + minZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_min), srtmPlugin.getTerrainMinZoom())); + maxZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_max), srtmPlugin.getTerrainMaxZoom())); + + zoomSlider.setValueFrom(SRTMPlugin.TERRAIN_MIN_SUPPORTED_ZOOM); + zoomSlider.setValueTo(SRTMPlugin.TERRAIN_MAX_SUPPORTED_ZOOM); + zoomSlider.setValues((float) srtmPlugin.getTerrainMinZoom(), (float) srtmPlugin.getTerrainMaxZoom()); + + int profileColor = settings.getApplicationMode().getProfileColor(nightMode); + UiUtilities.setupSlider(zoomSlider, nightMode, profileColor, true); + zoomSlider.addOnChangeListener(zoomSliderChangeListener); + } + + private final RangeSlider.OnChangeListener zoomSliderChangeListener = new RangeSlider.OnChangeListener() { + @Override + public void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) { + List values = slider.getValues(); + if (values.size() > 1) { + minZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_min), values.get(0).intValue())); + maxZoomTv.setText(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.shared_string_max), values.get(1).intValue())); + srtmPlugin.setTerrainZoomValues(values.get(0).intValue(), values.get(1).intValue(), srtmPlugin.getTerrainMode()); + updateApplyButton(isChangesMade()); + refreshMap(); + } + } + }; + + private boolean isChangesMade() { + return srtmPlugin.getTerrainMinZoom() != originalMinZoomValue || srtmPlugin.getTerrainMaxZoom() != originalMaxZoomValue; + } + + public static void showInstance(@NonNull FragmentManager manager) { + if (AndroidUtils.isFragmentCanBeAdded(manager, TAG)) { + manager.beginTransaction() + .replace(R.id.fragmentContainer, new TerrainZoomLevelsFragment(), TAG) + .addToBackStack(null) + .commitAllowingStateLoss(); + } + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java index 526d020d9bc..e54631f342b 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/WidgetsVisibilityHelper.java @@ -90,7 +90,8 @@ private boolean shouldShowTopCoordinatesWidget() { && !isInFollowTrackMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } public boolean shouldHideMapMarkersWidget() { @@ -102,7 +103,8 @@ public boolean shouldHideMapMarkersWidget() { || isInRouteLineAppearanceMode() || isInGpsFilteringMode() || isInWeatherForecastMode() - || isSelectingTilesZone(); + || isSelectingTilesZone() + || isInConfigureMapOptionMode(); } public static boolean isMapMarkerBarWidgetEnabled(@NonNull MapActivity mapActivity) { @@ -134,7 +136,8 @@ public boolean shouldShowBottomMenuButtons() { && !isInRouteLineAppearanceMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } public boolean shouldShowZoomButtons() { @@ -177,7 +180,8 @@ public boolean shouldShowTopButtons() { && !isInRouteLineAppearanceMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } public boolean shouldShowBackToLocationButton() { @@ -223,7 +227,8 @@ public boolean shouldShowDownloadMapWidget() { return !isInRouteLineAppearanceMode() && !isInGpsFilteringMode() && !isInWeatherForecastMode() - && !isSelectingTilesZone(); + && !isSelectingTilesZone() + && !isInConfigureMapOptionMode(); } private boolean isQuickActionLayerOn() { @@ -327,6 +332,10 @@ private boolean isInGpsFilteringMode() { return mapActivity.getGpsFilterFragment() != null; } + private boolean isInConfigureMapOptionMode() { + return mapActivity.getConfigureMapOptionFragment() != null; + } + private boolean isInWeatherForecastMode() { return mapActivity.getWeatherForecastFragment() != null; } From ea46956a5baae08e8b8ba213156d249f5b876694 Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Mon, 19 Jun 2023 09:53:35 +0300 Subject: [PATCH 008/214] Review fix --- OsmAnd/res/layout/list_item_icon_and_menu.xml | 10 +++ OsmAnd/res/layout/list_item_osmpro_icon.xml | 80 ------------------- .../plus/configmap/ConfigureMapMenu.java | 44 +--------- .../plus/configmap/MapLayerMenuListener.java | 7 -- .../plus/download/ui/ItemViewHolder.java | 8 +- .../DevelopmentSettingsFragment.java | 2 +- .../development/OsmandDevelopmentPlugin.java | 8 +- .../osmand/plus/plugins/srtm/SRTMPlugin.java | 43 ++++++++++ .../plus/settings/backend/OsmandSettings.java | 2 +- .../plus/widgets/ctxmenu/ViewCreator.java | 15 ++++ .../widgets/ctxmenu/data/ContextMenuItem.java | 11 +++ 11 files changed, 91 insertions(+), 139 deletions(-) delete mode 100644 OsmAnd/res/layout/list_item_osmpro_icon.xml diff --git a/OsmAnd/res/layout/list_item_icon_and_menu.xml b/OsmAnd/res/layout/list_item_icon_and_menu.xml index 1e1e436c032..b78d7520564 100644 --- a/OsmAnd/res/layout/list_item_icon_and_menu.xml +++ b/OsmAnd/res/layout/list_item_icon_and_menu.xml @@ -53,6 +53,16 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index 566ace9e44e..82bd494759e 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -148,7 +148,7 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); if (app.useOpenGlRenderer()) { - createTerrainItems(customRules, adapter, mapActivity, nightMode); + createTerrainItems(customRules, adapter, mapActivity); } PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); @@ -158,19 +158,16 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { private void createTerrainItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity, - boolean nightMode) { + @NonNull MapActivity activity) { OsmandApplication app = activity.getMyApplication(); - MapLayerMenuListener listener = new MapLayerMenuListener(activity); adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) .setCategory(true) .setTitle(app.getString(R.string.shared_string_terrain)) .setLayout(R.layout.list_group_title_with_switch)); - if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { + if (Version.isPaidVersion(app)) { PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(SRTMPlugin.class)); - addRelief3DItem(adapter, activity, nightMode, listener); } else { addTerrainDescriptionItem(adapter, activity); if (PluginsHelper.isEnabled(NauticalMapsPlugin.class)) { @@ -273,7 +270,6 @@ private void createLayersItems(@NonNull List customRules, PluginsHelper.registerLayerContextMenuExcluded(adapter, activity, customRules, terrainPlugins); } else { PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); - addRelief3DItem(adapter, activity, nightMode, listener); } app.getAidlApi().registerLayerContextMenu(adapter, activity); @@ -299,40 +295,6 @@ private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, })); } - private void addRelief3DItem(@NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity, - boolean nightMode, - MapLayerMenuListener listener) { - OsmandApplication app = activity.getMyApplication(); - if (app.useOpenGlRenderer()) { - boolean enabled3DMode = app.getSettings().ENABLE_3D_MAPS.get(); - ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) - .setLayout(R.layout.list_item_osmpro_icon) - .setTitleId(R.string.relief_3d, app) - .setIcon(R.drawable.ic_action_3d_relief) - .setUseNaturalSecondIconColor(true) - .setSecondaryIcon(!InAppPurchaseHelper.isOsmAndProAvailable(app) ? (nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day) : INVALID_ID) - .setListener(listener); - - if (!Version.isPaidVersion(app)) { - item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); - } else { - item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); - item.setSelected(enabled3DMode); - item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); - } - - ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); - if (terrainItem == null) { - terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); - } - if (terrainItem != null) { - item.setOrder(terrainItem.getOrder()); - } - adapter.addItem(item); - } - } - private void createRouteAttributeItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java index 473f2fa34a5..51e6b32ec62 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java +++ b/OsmAnd/src/net/osmand/plus/configmap/MapLayerMenuListener.java @@ -109,13 +109,6 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu return false; } else if (itemId == R.string.show_borders_of_downloaded_maps) { settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.set(isChecked); - } else if (itemId == R.string.relief_3d) { - if (Version.isPaidVersion(mapActivity.getMyApplication())) { - settings.ENABLE_3D_MAPS.set(isChecked); - item.setDescription(mapActivity.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); - } else { - ChoosePlanFragment.showInstance(mapActivity, OsmAndFeature.RELIEF_3D); - } } if (uiAdapter != null) { uiAdapter.onDataSetChanged(); diff --git a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java index 5cb33b84285..10aa37339a3 100644 --- a/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java +++ b/OsmAnd/src/net/osmand/plus/download/ui/ItemViewHolder.java @@ -107,7 +107,7 @@ protected enum RightButtonAction { DOWNLOAD, ASK_FOR_SEAMARKS_PLUGIN, ASK_FOR_SRTM_PLUGIN_PURCHASE, - ASK_FOR_RELIEF_3D_PURCHASE, + ASK_FOR_3D_RELIEF_PURCHASE, ASK_FOR_SRTM_PLUGIN_ENABLE, ASK_FOR_FULL_VERSION_PURCHASE, ASK_FOR_DEPTH_CONTOURS_PURCHASE, @@ -473,8 +473,8 @@ public RightButtonAction getClickAction(@NonNull DownloadItem item) { action = RightButtonAction.ASK_FOR_FULL_VERSION_PURCHASE; } else if ((item.getType() == DEPTH_CONTOUR_FILE || item.getType() == DEPTH_MAP_FILE) && !depthContoursPurchased) { action = RightButtonAction.ASK_FOR_DEPTH_CONTOURS_PURCHASE; - } else if (type == GEOTIFF_FILE && !Version.isPaidVersion(context.getMyApplication())) { - action = RightButtonAction.ASK_FOR_RELIEF_3D_PURCHASE; + } else if (type == GEOTIFF_FILE && !InAppPurchaseHelper.isOsmAndProAvailable(context.getMyApplication())) { + action = RightButtonAction.ASK_FOR_3D_RELIEF_PURCHASE; } } return action; @@ -497,7 +497,7 @@ public void onClick(View v) { context.getMyApplication().logEvent("in_app_purchase_show_from_weather_context_menu"); ChoosePlanFragment.showInstance(context, OsmAndFeature.WEATHER); break; - case ASK_FOR_RELIEF_3D_PURCHASE: + case ASK_FOR_3D_RELIEF_PURCHASE: ChoosePlanFragment.showInstance(context, OsmAndFeature.RELIEF_3D); break; case ASK_FOR_DEPTH_CONTOURS_PURCHASE: diff --git a/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java b/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java index 187117b8609..fb24a47de67 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/development/DevelopmentSettingsFragment.java @@ -130,7 +130,7 @@ private void setupEnableHeightmapPref() { private void setupHeightmapRelatedPrefs() { boolean heightmapEnabled = plugin.isHeightmapEnabled(); - SwitchPreferenceEx enable3DMapsSwitch = findPreference(plugin.ENABLE_3D_MAPS.getId()); + SwitchPreferenceEx enable3DMapsSwitch = findPreference(settings.ENABLE_3D_MAPS.getId()); enable3DMapsSwitch.setIconSpaceReserved(false); enable3DMapsSwitch.setEnabled(heightmapEnabled); diff --git a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java index 3907ac1ec5d..352e5077a6f 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/development/OsmandDevelopmentPlugin.java @@ -58,7 +58,6 @@ public class OsmandDevelopmentPlugin extends OsmandPlugin { private final StateChangedListener generateHillshadeFrom3DMapsListener; public final OsmandPreference ENABLE_HEIGHTMAP; - public final OsmandPreference ENABLE_3D_MAPS; public final OsmandPreference DISABLE_VERTEX_HILLSHADE_3D; public final OsmandPreference GENERATE_SLOPE_FROM_3D_MAPS; public final OsmandPreference GENERATE_HILLSHADE_FROM_3D_MAPS; @@ -74,7 +73,6 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { WidgetsAvailabilityHelper.regWidgetVisibility(DEV_TARGET_DISTANCE, noAppMode); ENABLE_HEIGHTMAP = registerBooleanPreference("show_heightmaps", false).makeGlobal().makeShared().cache(); - ENABLE_3D_MAPS = settings.ENABLE_3D_MAPS; DISABLE_VERTEX_HILLSHADE_3D = registerBooleanPreference("disable_vertex_hillshade_3d", true).makeGlobal().makeShared().cache(); GENERATE_SLOPE_FROM_3D_MAPS = registerBooleanPreference("generate_slope_from_3d_maps", true).makeGlobal().makeShared().cache(); GENERATE_HILLSHADE_FROM_3D_MAPS = registerBooleanPreference("generate_hillshade_from_3d_maps", true).makeGlobal().makeShared().cache(); @@ -85,7 +83,7 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { mapContext.recreateHeightmapProvider(); } }; - ENABLE_3D_MAPS.addListener(enable3DMapsListener); + settings.ENABLE_3D_MAPS.addListener(enable3DMapsListener); disableVertexHillshade3DListener = change -> { MapRendererContext mapRendererContext = NativeCoreContext.getMapRendererContext(); @@ -113,7 +111,7 @@ public OsmandDevelopmentPlugin(@NonNull OsmandApplication app) { enableHeightmapListener = change -> { // Notify listeners of dependent preferences - if (ENABLE_3D_MAPS.get()) { + if (settings.ENABLE_3D_MAPS.get()) { enable3DMapsListener.stateChanged(change); } if (DISABLE_VERTEX_HILLSHADE_3D.get()) { @@ -265,7 +263,7 @@ public boolean isHeightmapEnabled() { // If enabled, map should be rendered with elevation data (in 3D) public boolean is3DMapsEnabled() { - return isHeightmapEnabled() && ENABLE_3D_MAPS.get(); + return isHeightmapEnabled() && settings.ENABLE_3D_MAPS.get(); } public boolean disableVertexHillshade3D() { diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index 2441dcbac82..0ec85ba7748 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -9,6 +9,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.chooseplan.ChoosePlanFragment; import net.osmand.plus.chooseplan.OsmAndFeature; import net.osmand.plus.chooseplan.button.PurchasingUtils; import net.osmand.plus.dashboard.DashboardOnMap; @@ -45,8 +46,11 @@ import androidx.annotation.Nullable; import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.PLUGIN_SRTM; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; +import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; +import static net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem.INVALID_ID; public class SRTMPlugin extends OsmandPlugin { @@ -356,6 +360,7 @@ protected void registerLayerContextMenuActions(@NonNull ContextMenuAdapter adapt } else { createContextMenuItems(adapter, mapActivity); } + add3DReliefItem(adapter, mapActivity); } } @@ -447,6 +452,44 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu ); } + private void add3DReliefItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity) { + OsmandApplication app = activity.getMyApplication(); + if (app.useOpenGlRenderer() && !super.needsInstallation()) { + boolean enabled3DMode = settings.ENABLE_3D_MAPS.get(); + ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) + .setTitleId(R.string.relief_3d, app) + .setIcon(R.drawable.ic_action_3d_relief) + .setUseNaturalSecondIconColor(true) + .setListener((uiAdapter, view, contextItem, isChecked) -> { + if (InAppPurchaseHelper.isOsmAndProAvailable(activity.getMyApplication())) { + settings.ENABLE_3D_MAPS.set(isChecked); + contextItem.setDescription(activity.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); + } else { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.RELIEF_3D); + } + return true; + }); + + if (!InAppPurchaseHelper.isOsmAndProAvailable(app)) { + item.showProIcon(true); + } else { + item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); + item.setSelected(enabled3DMode); + item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); + } + + ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); + if (terrainItem == null) { + terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); + } + if (terrainItem != null) { + item.setOrder(terrainItem.getOrder()); + } + adapter.addItem(item); + } + } + @Nullable @Override protected String getRenderPropertyPrefix() { diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 7a012fca791..89546dee1b4 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -834,7 +834,7 @@ public boolean enablePlugin(String pluginId, boolean enable) { return false; } - public final CommonPreference ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeGlobal().makeShared().cache(); + public final CommonPreference ENABLE_3D_MAPS = registerBooleanPreference("enable_3d_maps", true).makeProfile().makeShared().cache(); public final CommonPreference COMPASS_VISIBILITY = new EnumStringPreference(this, "compass_visibility", CompassVisibility.VISIBLE_IF_MAP_ROTATED, CompassVisibility.values()) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index 9c974cd5c67..1ffd0d5957b 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -128,6 +128,16 @@ public View getView(@NonNull ContextMenuItem item, @Nullable View convertView) { setupToggle(toggle, convertView, item); } + if (item.isShowProIcon()) { + ImageView proIcon = convertView.findViewById(R.id.pro_icon); + if (proIcon != null) { + setupProIcon(proIcon); + } + if (toggle != null) { + AndroidUiHelper.updateVisibility(toggle, false); + } + } + Slider slider = convertView.findViewById(R.id.slider); if (slider != null) { setupSlider(slider, item); @@ -349,6 +359,11 @@ private void setupIcon(@NonNull AppCompatImageView icon, @NonNull ContextMenuIte } } + private void setupProIcon(@NonNull ImageView proIcon) { + proIcon.setImageDrawable(iconsCache.getIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day)); + AndroidUiHelper.updateVisibility(proIcon, true); + } + private void setupSecondaryIcon(@NonNull ImageView secondaryIcon, @DrawableRes int secondaryIconId, @NonNull ContextMenuItem item) { if (secondaryIconId != INVALID_ID) { int colorId = ColorUtilities.getDefaultIconColorId(nightMode); diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index 1858325ea4d..f4c0eab1692 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -48,6 +48,7 @@ public class ContextMenuItem { private int icon = INVALID_ID; @DrawableRes private int secondaryIcon = INVALID_ID; + boolean showProIcon = false; private Boolean selected; private int progress = INVALID_ID; @@ -132,6 +133,10 @@ public boolean useNaturalIconColor() { return useNaturalIconColor; } + public boolean isShowProIcon() { + return showProIcon; + } + public boolean useNaturalSecondIconColor() { return useNaturalSecondIconColor; } @@ -278,6 +283,12 @@ public ContextMenuItem setUseNaturalIconColor(boolean useNaturalIconColor) { return this; } + @NonNull + public ContextMenuItem showProIcon(boolean showProIcon) { + this.showProIcon = showProIcon; + return this; + } + @NonNull public ContextMenuItem setUseNaturalSecondIconColor(boolean useNaturalSecondIconColor) { this.useNaturalSecondIconColor = useNaturalSecondIconColor; From 2c267e60b8a38cda775c164231278fbc7ff66cca Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Thu, 22 Jun 2023 03:13:47 +0300 Subject: [PATCH 009/214] #16632: Fixes after review --- .../router/RouteResultPreparationTest.java | 4 +- .../net/osmand/plus/NavigationService.java | 2 +- .../net/osmand/plus/auto/FavoritesScreen.java | 2 - .../net/osmand/plus/auto/MapMarkersScreen.kt | 2 - .../osmand/plus/auto/NavigationScreen.java | 1 - .../osmand/plus/auto/NavigationSession.java | 19 +-- .../src/net/osmand/plus/auto/TracksScreen.kt | 1 - .../plus/views/layers/FavouritesLayer.java | 49 +++----- .../plus/views/layers/MapMarkersLayer.java | 114 +++++++++--------- .../views/layers/base/OsmandMapLayer.java | 33 ++--- 10 files changed, 103 insertions(+), 124 deletions(-) diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java index 1e92281e25f..3813a4705a7 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java @@ -31,7 +31,7 @@ * Created by yurkiss on 04.03.16. */ -@RunWith(Parameterized.class) +//@RunWith(Parameterized.class) public class RouteResultPreparationTest { private final TestEntry te; @@ -73,7 +73,7 @@ public static Collection data() throws IOException { } - @Test +// @Test public void testLanes() throws Exception { NativeLibrary nativeLibrary = null; boolean useNative = isNative() && getNativeLibPath() != null && !te.isIgnoreNative(); diff --git a/OsmAnd/src/net/osmand/plus/NavigationService.java b/OsmAnd/src/net/osmand/plus/NavigationService.java index e283c5b86ec..1eb09f2c117 100644 --- a/OsmAnd/src/net/osmand/plus/NavigationService.java +++ b/OsmAnd/src/net/osmand/plus/NavigationService.java @@ -311,7 +311,7 @@ public void updateCarNavigation(Location currentLocation) { destinations = Collections.singletonList(destination); } TravelEstimate lastStepTravelEstimate = tripHelper.getLastStepTravelEstimate(); - navigationScreen.updateTrip(routingHelper.isRouteBeingCalculated(), + navigationScreen.updateTrip(true, routingHelper.isRouteBeingCalculated(), false/*routingHelper.isRouteWasFinished()*/, destinations, trip.getSteps(), destinationTravelEstimate, lastStepTravelEstimate != null ? lastStepTravelEstimate.getRemainingDistance() : null, diff --git a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java index e77bd6fc9bd..e84c7d88630 100644 --- a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java @@ -67,7 +67,6 @@ public FavoritesScreen( public void onDestroy(@NonNull LifecycleOwner owner) { DefaultLifecycleObserver.super.onDestroy(owner); getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setCustomMapObjects(null); - getApp().getOsmandMap().refreshMap(); } }); } @@ -96,7 +95,6 @@ private void setupFavorites(ItemList.Builder listBuilder) { int favoritesPointsSize = favoritesPoints.size(); List limitedFavoritesPoints = favoritesPoints.subList(0, Math.min(favoritesPointsSize, getContentLimit() - 1)); getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setCustomMapObjects(limitedFavoritesPoints); - getApp().getOsmandMap().refreshMap(); for (FavouritePoint point : limitedFavoritesPoints) { String title = point.getDisplayName(getApp()); int color = getApp().getFavoritesHelper().getColorWithCategory(point, ContextCompat.getColor(getApp(), R.color.color_favorite)); diff --git a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt index 0945f5cb8de..92f44bc7e95 100644 --- a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt @@ -35,7 +35,6 @@ class MapMarkersScreen( override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) app.osmandMap.mapLayers.mapMarkersLayer.setCustomMapObjects(null) - app.osmandMap.refreshMap() } }) } @@ -47,7 +46,6 @@ class MapMarkersScreen( app.mapMarkersHelper.mapMarkers.subList(0, markersSize.coerceAtMost(contentLimit - 1)) val location = app.settings.lastKnownMapLocation app.osmandMap.mapLayers.mapMarkersLayer.setCustomMapObjects(markers) - app.osmandMap.refreshMap() for (marker in markers) { val title = marker.getName(app) val markerColor = MapMarker.getColorId(marker.colorIndex) diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java b/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java index c4eab8c8b22..2209e13a181 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationScreen.java @@ -164,7 +164,6 @@ public void stopTrip() { } private void updateNavigation() { - listener.updateNavigation(navigating); adjustMapPosition(navigating); } diff --git a/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java b/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java index afa2b403a82..5b6b4b9378b 100644 --- a/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java +++ b/OsmAnd/src/net/osmand/plus/auto/NavigationSession.java @@ -32,6 +32,7 @@ import net.osmand.plus.auto.RequestPermissionScreen.LocationPermissionCheckCallback; import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.routing.IRouteInformationListener; +import net.osmand.plus.views.MapLayers; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.layers.base.OsmandMapLayer; @@ -104,19 +105,21 @@ private OsmandApplication getApp() { @Override public void onStart(@NonNull LifecycleOwner owner) { getApp().getRoutingHelper().addListener(this); - getApp().getOsmandMap().getMapLayers().getFavouritesLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); - getApp().getOsmandMap().getMapLayers().getGpxLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); - getApp().getOsmandMap().getMapLayers().getPoiMapLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); - getApp().getOsmandMap().getMapLayers().getMapMarkersLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + MapLayers mapLayers = getApp().getOsmandMap().getMapLayers(); + mapLayers.getFavouritesLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + mapLayers.getGpxLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + mapLayers.getPoiMapLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); + mapLayers.getMapMarkersLayer().customObjectsDelegate = new OsmandMapLayer.CustomMapObjects<>(); } @Override public void onStop(@NonNull LifecycleOwner owner) { getApp().getRoutingHelper().removeListener(this); - getApp().getOsmandMap().getMapLayers().getFavouritesLayer().customObjectsDelegate = null; - getApp().getOsmandMap().getMapLayers().getGpxLayer().customObjectsDelegate = null; - getApp().getOsmandMap().getMapLayers().getPoiMapLayer().customObjectsDelegate = null; - getApp().getOsmandMap().getMapLayers().getMapMarkersLayer().customObjectsDelegate = null; + MapLayers mapLayers = getApp().getOsmandMap().getMapLayers(); + mapLayers.getFavouritesLayer().customObjectsDelegate = null; + mapLayers.getGpxLayer().customObjectsDelegate = null; + mapLayers.getPoiMapLayer().customObjectsDelegate = null; + mapLayers.getMapMarkersLayer().customObjectsDelegate = null; } @Override diff --git a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt index d81c83571f0..a93cd6e7f7e 100644 --- a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt @@ -56,7 +56,6 @@ class TracksScreen( } override fun onPostExecute(result: Unit?) { - super.onPostExecute(result) invalidate() } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java index 72d19a507c1..4c803170722 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java @@ -129,49 +129,23 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett boolean textVisible = isTextVisible(); boolean textVisibleChanged = this.textVisible != textVisible; this.textVisible = textVisible; - boolean showFavorites = this.settings.SHOW_FAVORITES.get(); + boolean showFavorites = this.settings.SHOW_FAVORITES.get() || customObjectsDelegate != null; boolean showFavoritesChanged = !Algorithms.objectEquals(this.showFavorites, showFavorites); this.showFavorites = showFavorites; long favoritesChangedTime = favouritesHelper.getLastModifiedTime(); boolean favoritesChanged = this.favoritesChangedTime != favoritesChangedTime; this.favoritesChangedTime = favoritesChangedTime; - if (customObjectsDelegate != null) { - MapRendererView mapRenderer = getMapRenderer(); - List points = customObjectsDelegate.getMapObjects(); - if (mapRenderer != null) { - if (mapActivityInvalidated || mapRendererChanged || nightModeChanged || textScaleChanged || textVisibleChanged) { - clearFavorites(); - favoritesMapLayerProvider = new FavoritesTileProvider(getContext(), getPointsOrder(), isTextVisible(), - getTextStyle(textScale), view.getDensity()); - showFavoritePoints(textScale, true, points); - favoritesMapLayerProvider.drawSymbols(mapRenderer); - mapRendererChanged = false; - } - } else { - cache.clear(); - float iconSize = getIconSize(view.getApplication()); - QuadTree boundIntersections = initBoundIntersections(tileBox); - QuadRect latLonBounds = tileBox.getLatLonBounds(); - List fullObjectsLatLon = new ArrayList<>(); - List smallObjectsLatLon = new ArrayList<>(); - drawPoints(points, latLonBounds, false, tileBox, boundIntersections, iconSize, canvas, fullObjectsLatLon, smallObjectsLatLon); - this.fullObjectsLatLon = fullObjectsLatLon; - this.smallObjectsLatLon = smallObjectsLatLon; - if (textVisible) { - textLayer.putData(this, cache); - } - } - } else if (hasMapRenderer()) { + if (hasMapRenderer()) { if (mapActivityInvalidated || mapRendererChanged || nightModeChanged || showFavoritesChanged - || favoritesChanged || textScaleChanged || textVisibleChanged) { + || favoritesChanged || textScaleChanged || textVisibleChanged || customObjectsDelegate != null) { showFavorites(); mapRendererChanged = false; } } else { cache.clear(); if (showFavorites && favouritesHelper.isFavoritesLoaded()) { - if (tileBox.getZoom() >= START_ZOOM) { + if (tileBox.getZoom() >= START_ZOOM || customObjectsDelegate != null) { float iconSize = getIconSize(view.getApplication()); QuadTree boundIntersections = initBoundIntersections(tileBox); @@ -179,9 +153,14 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett QuadRect latLonBounds = tileBox.getLatLonBounds(); List fullObjectsLatLon = new ArrayList<>(); List smallObjectsLatLon = new ArrayList<>(); - for (FavoriteGroup group : getFavoriteGroups()) { - drawPoints(group.getPoints(), latLonBounds, isSynced(group), tileBox, boundIntersections, iconSize, canvas, + if(customObjectsDelegate != null){ + drawPoints(customObjectsDelegate.getMapObjects(), latLonBounds, false, tileBox, boundIntersections, iconSize, canvas, fullObjectsLatLon, smallObjectsLatLon); + } else { + for (FavoriteGroup group : getFavoriteGroups()) { + drawPoints(group.getPoints(), latLonBounds, isSynced(group), tileBox, boundIntersections, iconSize, canvas, + fullObjectsLatLon, smallObjectsLatLon); + } } this.fullObjectsLatLon = fullObjectsLatLon; this.smallObjectsLatLon = smallObjectsLatLon; @@ -277,7 +256,11 @@ public synchronized void showFavorites() { favoritesMapLayerProvider = new FavoritesTileProvider(getContext(), getPointsOrder(), isTextVisible(), getTextStyle(textScale), view.getDensity()); - if (settings.SHOW_FAVORITES.get() && favouritesHelper.isFavoritesLoaded()) { + if(customObjectsDelegate != null){ + List points = customObjectsDelegate.getMapObjects(); + showFavoritePoints(textScale, false, points); + favoritesMapLayerProvider.drawSymbols(mapRenderer); + } else if (settings.SHOW_FAVORITES.get() && favouritesHelper.isFavoritesLoaded()) { for (FavoriteGroup group : getFavoriteGroups()) { boolean synced = isSynced(group); List points = new ArrayList<>(group.getPoints()); diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java index d1beeb1a5e0..6c4073ba248 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java @@ -277,7 +277,7 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett super.onPrepareBufferImage(canvas, tileBox, drawSettings); OsmandApplication app = getApplication(); OsmandSettings settings = app.getSettings(); - if ((!settings.SHOW_MAP_MARKERS.get() && !app.getOsmandMap().getMapView().isCarView()) + if ((!settings.SHOW_MAP_MARKERS.get() && customObjectsDelegate == null) || (customObjectsDelegate != null && Algorithms.isEmpty(customObjectsDelegate.getMapObjects()))) { clearMapMarkersCollections(); clearVectorLinesCollections(); @@ -407,67 +407,65 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode } } - if (!getMapView().isCarView()) { - if (settings.SHOW_LINES_TO_FIRST_MARKERS.get() && mapRenderer != null) { - drawLineAndText(canvas, tileBox, nightMode); - } else { - clearVectorLinesCollections(); - } - if (settings.SHOW_ARROWS_TO_FIRST_MARKERS.get()) { - LatLon loc = tileBox.getCenterLatLon(); - int i = 0; - for (MapMarker marker : markersHelper.getMapMarkers()) { - if (!isLocationVisible(tileBox, marker) && !isInMotion(marker)) { - canvas.save(); - float bearing; - float radiusBearing = DIST_TO_SHOW * tileBox.getDensity(); - float cx; - float cy; - if (mapRenderer != null) { - PointI marker31 = NativeUtilities.getPoint31FromLatLon(marker.getLatitude(), marker.getLongitude()); - PointI center31 = NativeUtilities.get31FromElevatedPixel(mapRenderer, tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); - if (center31 == null) { - continue; - } - Pair line = - NativeUtilities.clipLineInVisibleRect(mapRenderer, tileBox, center31, marker31); - if (line == null) { - continue; - } - PointF centerPixel = new PointF(tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); - cx = centerPixel.x; - cy = centerPixel.y; - bearing = (float) getAngleBetween(centerPixel, line.second) - tileBox.getRotate(); - } else { - QuadPoint cp = tileBox.getCenterPixelPoint(); - cx = cp.x; - cy = cp.y; - net.osmand.Location.distanceBetween(loc.getLatitude(), loc.getLongitude(), - marker.getLatitude(), marker.getLongitude(), calculations); - bearing = calculations[1] - 90; + if (settings.SHOW_LINES_TO_FIRST_MARKERS.get() && mapRenderer != null) { + drawLineAndText(canvas, tileBox, nightMode); + } else { + clearVectorLinesCollections(); + } + if (settings.SHOW_ARROWS_TO_FIRST_MARKERS.get()) { + LatLon loc = tileBox.getCenterLatLon(); + int i = 0; + for (MapMarker marker : markers) { + if (!isLocationVisible(tileBox, marker) && !isInMotion(marker)) { + canvas.save(); + float bearing; + float radiusBearing = DIST_TO_SHOW * tileBox.getDensity(); + float cx; + float cy; + if (mapRenderer != null) { + PointI marker31 = NativeUtilities.getPoint31FromLatLon(marker.getLatitude(), marker.getLongitude()); + PointI center31 = NativeUtilities.get31FromElevatedPixel(mapRenderer, tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); + if (center31 == null) { + continue; } - canvas.rotate(bearing, cx, cy); - canvas.translate(-24 * tileBox.getDensity() + radiusBearing, -22 * tileBox.getDensity()); - canvas.drawBitmap(arrowShadow, cx, cy, bitmapPaint); - canvas.drawBitmap(arrowToDestination, cx, cy, getMarkerDestPaint(marker.colorIndex)); - canvas.drawBitmap(arrowLight, cx, cy, bitmapPaint); - canvas.restore(); - } - i++; - if (i > displayedWidgets - 1) { - break; + Pair line = + NativeUtilities.clipLineInVisibleRect(mapRenderer, tileBox, center31, marker31); + if (line == null) { + continue; + } + PointF centerPixel = new PointF(tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); + cx = centerPixel.x; + cy = centerPixel.y; + bearing = (float) getAngleBetween(centerPixel, line.second) - tileBox.getRotate(); + } else { + QuadPoint cp = tileBox.getCenterPixelPoint(); + cx = cp.x; + cy = cp.y; + net.osmand.Location.distanceBetween(loc.getLatitude(), loc.getLongitude(), + marker.getLatitude(), marker.getLongitude(), calculations); + bearing = calculations[1] - 90; } + canvas.rotate(bearing, cx, cy); + canvas.translate(-24 * tileBox.getDensity() + radiusBearing, -22 * tileBox.getDensity()); + canvas.drawBitmap(arrowShadow, cx, cy, bitmapPaint); + canvas.drawBitmap(arrowToDestination, cx, cy, getMarkerDestPaint(marker.colorIndex)); + canvas.drawBitmap(arrowLight, cx, cy, bitmapPaint); + canvas.restore(); + } + i++; + if (i > displayedWidgets - 1) { + break; } } - Object movableObject = contextMenuLayer.getMoveableObject(); - if (movableObject instanceof MapMarker) { - MapMarker movableMarker = (MapMarker) movableObject; - setMovableObject(movableMarker.getLatitude(), movableMarker.getLongitude()); - drawMovableMarker(canvas, tileBox, (MapMarker) movableObject); - } - if (this.movableObject != null && !contextMenuLayer.isInChangeMarkerPositionMode()) { - cancelMovableObject(); - } + } + Object movableObject = contextMenuLayer.getMoveableObject(); + if (movableObject instanceof MapMarker) { + MapMarker movableMarker = (MapMarker) movableObject; + setMovableObject(movableMarker.getLatitude(), movableMarker.getLongitude()); + drawMovableMarker(canvas, tileBox, (MapMarker) movableObject); + } + if (this.movableObject != null && !contextMenuLayer.isInChangeMarkerPositionMode()) { + cancelMovableObject(); } } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java index a9a88331f4b..74bd3263e03 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java @@ -83,6 +83,23 @@ public abstract class OsmandMapLayer implements MapRendererViewListener { protected PointI movableObject; protected int pointsOrder = 0; + public static class CustomMapObjects { + protected List customMapObjects; + + @NonNull + public List getMapObjects() { + if (customMapObjects == null) { + return new ArrayList<>(); + } else { + return customMapObjects; + } + } + + public void setCustomMapObjects(List customMapObjects) { + this.customMapObjects = customMapObjects; + } + } + public enum MapGestureType { DOUBLE_TAP_ZOOM_IN, DOUBLE_TAP_ZOOM_CHANGE, @@ -961,20 +978,4 @@ public void drawPath(Canvas canvas, Path path) { } } - public static class CustomMapObjects { - protected List customMapObjects; - - @NonNull - public List getMapObjects() { - if (customMapObjects == null) { - return new ArrayList<>(); - } else { - return customMapObjects; - } - } - - public void setCustomMapObjects(List customMapObjects) { - this.customMapObjects = customMapObjects; - } - } } From 1fad88bac02766bf2f731aa940fb95d8eea3b553 Mon Sep 17 00:00:00 2001 From: Damjan Gerl Date: Fri, 16 Jun 2023 11:37:26 +0000 Subject: [PATCH 010/214] Translated using Weblate (Slovenian) Currently translated at 99.9% (4718 of 4719 strings) --- OsmAnd/res/values-sl/strings.xml | 37 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values-sl/strings.xml b/OsmAnd/res/values-sl/strings.xml index ed8f339254e..9d54ce92d4c 100644 --- a/OsmAnd/res/values-sl/strings.xml +++ b/OsmAnd/res/values-sl/strings.xml @@ -1165,7 +1165,7 @@ Izračunanje prvega in zadnjega odseka poti Ali želite uporabiti prikazano sled za navigacijo? Nastavitve poti - Podrobnosti poti + Informacije o poti Izračun poti brez povezave Glasovni pozivi začasno ustavijo predvajanje glasbe. Prekini predvajanje glasbe @@ -1429,7 +1429,7 @@ preostalo je Parkiranje je časovno omejeno na Vaša urejanja - Seznam + Samo seznam ZD (λ) %1$s \nZŠ (β) %2$s Pogosta vprašanja, nedavne spremembe in druge podrobnosti. @@ -2750,7 +2750,7 @@ Preprost način za vožnjo. Nežen nočni način, izohipse, kontrastne oranžne ceste. Zatemni sekundarne objekte zemljevida. Za pohodništvo, treking in kolesarjenje v naravi. Berljivo na prostem. Kontrastne ceste in naravni objekti, različne vrste poti, napredne možnosti izohips, dodatne podrobnosti. Prilagajanje celovitosti površine za razlikovanje kakovosti cest. Ni nočnega načina. Turistični slog z visokim kontrastom in največ podrobnostmi. Vključuje vse možnosti privzetega sloga OsmAnd, hkrati pa prikazuje čim več podrobnosti, zlasti o cestah, stezah in drugih načinih potovanja. Jasno razlikovanje med vrstami cest. Primeren za dnevno in nočno uporabo, ter uporabo na prostem. - Slog za splošno uporabo. Poenostavljen prikaz za uporabo v strnjenih naseljih. Vsebuje izohipse, poti, kakovost površine, omejitve dostopa, cestne ovire, upodabljanje poti po lestvici SAC, objekte za športe na divjih vodah. + Slog za splošno uporabo. Poenostavljen prikaz za uporabo v strnjenih naseljih. Vsebuje izohipse, poti, kakovost površine, omejitve dostopa, cestne ovire, upodabljanje poti po lestvici SAC/CAI, objekte za športe na divjih vodah. Naročite se na storitev OsmAnd Live za dostop brez povezave do prispevkov na Wikipediji in Wikivoyage. Obnovite naročilo za uporabo vseh zmožnosti programa: Na osnovi shranjenih zaznamkov je priporočljivo prejeti zemljevide: @@ -3826,7 +3826,7 @@ Ta e-poštni naslov ni registriran za OsmAnd Cloud Skrij naklon Izogibanje območjem odprtim samo za vozila z nizkimi emisijami - Prosimo, vnesi e-poštni naslov, s katerim si se registriral. Poslano mu bo enkratno geslo za naslednji korak. + Prosimo, vnesi e-poštni naslov, s katerim si se registriral. Na ta naslov bo poslano enkratno geslo. Prikaži naklon Navkreber Maks. višina @@ -4729,7 +4729,7 @@ Pokaži poti MTB IMBA Zavij desno in drži se desne Obrni se in drži se desne - Namig: tapni gradnik kompasa, če želiš preklopiti način usmerjenosti zemljevida. + Namig: tapni na gumb kompas, če želiš preklopiti način usmerjenosti zemljevida. Kot med pravim (geografskim) severom in ciljno točko, opazovano s tvoje lokacije. Prikazuje kot med tvojo smerjo gibanja v naprej in ciljno točko. Gradnik lahko nastaviš tako, da prikaže ali razdaljo ali predvideni čas prihoda do prve oznake na zemljevidu. @@ -5207,4 +5207,31 @@ Sektor 4 Sektor 5 Samo ime + Dovoli preko ferate + Na podlagi podatkov iz zemljevida višin lahko brez povezave izračunamo nadmorsko višino. Razlike glede na zabeleženo nadmorsko višino naprave se lahko uporabijo kot popravek nadmorske višine. + Prikaži vse sledi na zemljevidu + Nova sled + Privzeto: ime pomorske oznake (light character.group.period), izberi dodatne informacije o sektorjih 1 do 3 ali sektorjih 1,2,3,4,5 light character + Izračunaj brez povezave + Rezultat izračuna je prazen + Rssi + Prazna mapa + Zapisovanje podatkov iz zunanjih senzorjev v GPX med snemanjem potovanja. + Podatki + Ni povezanih senzorjev te vrste + Točke POI ni bilo mogoče najti + Zapri pogovorno okno + Dovoli poti po feratah. + Vatov + RPM + Senzorji niso bili najdeni + Vir podatkov + Prikazuje raven RSSI zunanje naprave. + V tej mapi še ni nobene sledi. + Ni zabeleženo + Vidno na zemljevidu + Kategorije POI + To bo izbrisalo mapo \"%1$s\" in vse vključene sledi (%2$s). + Želiš izbrisati mapo\? + Izbriši mapo \ No newline at end of file From 58158c135626ffd6e622af11f6ba5e265c6d44c6 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 17 Jun 2023 14:25:12 +0000 Subject: [PATCH 011/214] Translated using Weblate (German) Currently translated at 100.0% (4719 of 4719 strings) --- OsmAnd/res/values-de/strings.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index f9675f26e19..045d1c56597 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -765,8 +765,8 @@ Fehlende Kartenkacheln herunterladen Navigationsapp Beenden - Suche - Suche + Suchen + Suchen POI wählen Weitere Ergebnisse Suche Straße inkrementell @@ -1973,7 +1973,7 @@ Format geographischer Koordinaten. 24/7 geöffnet Speicherkarte - Suche + Suchen von Bezirk Nachbarschaft @@ -2699,7 +2699,7 @@ Wikivoyage offline Unbegrenzte Downloads Wikipedia offline - Karten mit Höhenlinien und Relief + Karten mit Höhenlinien und Reliefs Alle OsmAnd-Funktionen freischalten Plan auswählen Laden Sie die Wikipedia-Artikel für %1$s herunter, um sie offline zu lesen. @@ -5243,4 +5243,5 @@ U/min Klettersteige zulassen Dialogfeld schließen + Standard: Seezeichenname (Leuchtfeuer.Gruppe.Periode), Auswahl zusätzlicher Informationen zu den Sektoren 1 bis 3 oder Sektor 1,2,3,4,5 Leuchtfeuer \ No newline at end of file From d0df03e20f65ef6af2377feb7b732082ba95b98a Mon Sep 17 00:00:00 2001 From: "B. Hammer" <600xxxx@gmail.com> Date: Fri, 16 Jun 2023 06:45:36 +0000 Subject: [PATCH 012/214] Translated using Weblate (Russian) Currently translated at 98.8% (4667 of 4719 strings) --- OsmAnd/res/values-ru/strings.xml | 145 ++++++++++++++++--------------- 1 file changed, 73 insertions(+), 72 deletions(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 7f493ebb8cb..ce01763c7f8 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -36,7 +36,7 @@ Файл GPX с координатами и данными выбранных заметок. Файл GPX с координатами и данными всех заметок. Место - Пункт назначения находится на частной территории. Разрешить использование частных дорог на этом маршруте\? + Пункт назначения расположен на частной территории. Разрешить использование частных дорог на маршруте\? Искать снова Увеличить радиус поиска Ничего не найдено @@ -58,7 +58,7 @@ Выбрать цвет Задать имя Для больших расстояний: добавьте промежуточные пункты, если маршрут не построен в течение 10 минут. - Разрешить частный доступ + Въезд на частную территорию Разрешить доступ на частную территорию. Обзор Выберите улицу @@ -81,7 +81,7 @@ Не отсылать анонимную статистику использования Авто Правостороннее движение - Виден + Отображаемые Восстановить покупки Шрифты карты Анализ на карте @@ -106,10 +106,10 @@ Установка центра экрана местом первой остановки на маршруте. Без наложения Без подложки - Любые перепады + Любая сложность Без крутых подъёмов Максимально ровный - Улицы с оживлённым движением + Предпочитать оживлённые улицы Сбалансированный Предпочитать тихие улицы Выберите предпочтительный рельеф. @@ -138,7 +138,7 @@ Время Длина маршрута Стиль езды - Колебания высоты ландшафта + Перепады высоты ландшафта Рельеф Действие переименовано в %1$s, чтобы избежать дублирования. Обнаружен дубликат имени @@ -349,7 +349,7 @@ Местоположение ещё не определено. Задать прозрачность (0 – прозрачный, 255 – непрозрачный) Прервать загрузку\? - Для работы большинства основных возможностей приложения требуются детальные карты регионов, которые можно загрузить из интернета с помощью пункта меню «Настройки» → «Управление файлами карт». После загрузки вы сможете просматривать карты, осуществлять поиск адресов, POI и общественного транспорта. + Для работы большинства основных возможностей приложения требуются детальные карты регионов, которые можно загрузить из интернета с помощью пункта меню «Настройки» → «Загрузка карт». После загрузки вы сможете просматривать карты, осуществлять поиск адресов, POI и общественного транспорта. Карта мира, необходимая для обеспечения базовой функциональности, находится в очереди загрузки. Ничего не найдено. Если для вашего региона нет карты, вы можете создать её (см. osmand.net). Онлайн и кешированные карты (растровые) @@ -376,7 +376,7 @@ Выберите голос и опробуйте его на оповещении: Отладка и разработка Быстрая отрисовка - Тест голосовых подсказок + Тест речевых указаний Скачайте локальную векторную карту для этой местности в меню («Загрузка карт»), или переключитесь на плагин «Онлайн-карты». Отправить файлы GPX в OSM\? Видимость @@ -422,8 +422,8 @@ Австралия и Океания Карты мира Всемирная Википедия - Голосовые подсказки (записанные, ограниченная функциональность) - Голосовые подсказки (TTS, предпочтительно) + Речевые указания (запись, неполные возможности) + Речевые указания (TTS, предпочтительно) Википедия (локально) Пользовательские Файл экспорта избранных точек уже существует. Заменить его\? @@ -494,8 +494,8 @@ Данные публичного транспорта Карта Архивировано - Голосовые подсказки (TTS) - Голосовые подсказки (записанные) + Речевые указания (TTS) + Речевые указания (запись) Данные POI TTS Новый поиск @@ -513,8 +513,8 @@ Для этого региона есть локальные векторные карты. \n\t \n\tДля использования выберите их в качестве источника (Меню → Настройка карты → Источник карты → Локальные векторные карты). - Аудиоканал голосовых инструкций - Выберите канал вывода голосовых подсказок. + Аудиоканал речевой навигации + Выберите канал вывода речевых указаний. Голосовые звонки (для прерывания автомобильной стереосистемы Bluetooth) Уведомления Мультимедиа, навигация @@ -609,8 +609,8 @@ Не удалось получить список сборок OsmAnd Загружаются сборки OsmAnd… Выберите сборку для установки - Голосовая навигация недоступна. Перейдите в «Настройки» → «Настройки навигации», выберите профиль → «Голосовые данные» и выберите или загрузите пакет голосовых подсказок. - Выберите пакет голосовых подсказок + Голосовая навигация недоступна. Перейдите в «Настройки» → «Настройки навигации», выберите профиль → «Голосовые данные» и выберите или загрузите голосовой пакет. + Выберите голосовой пакет Показывать производительность отрисовки и навигации. Отладочная информация о производительности День @@ -710,8 +710,8 @@ Голосовые данные Инициализируются голосовые данные… Неподдерживаемая версия голосовых данных - Выбранные голосовые данные не правильного формата - Выбранный пакет голосовых подсказок не доступен + Неправильный формат голосовых данных + Выбранный пакет недоступен SD-карта недоступна. \nВы не сможете работать с картой. Карта памяти доступна только для чтения. @@ -834,7 +834,7 @@ Сохранить текущий трек Укажите интервал фиксирования точек для записи трека во время навигации Интервал записи во время навигации - Автозапись трека во время навигации + Автозапись трека при навигации Обновить карту Обновить часть карты Необходимы для авторизации на openstreetmap.org. @@ -1298,7 +1298,7 @@ Европа, Азия, Латинская Америка и тому подобное Великобритания, Индия и др. Маршрут до этой точки - Маршрут от этой точки + Маршрут от этой точки Канада Версия: Время действия (в минутах): %1$s @@ -1424,14 +1424,14 @@ Голос Разное Локализация - Приостановка воспроизведения во время подсказок. + Приостановка воспроизведения во время указаний. Прерывать музыку Поделиться маршрутом используя файл GPX Неправильный формат: %s Маршрут предоставленный через OsmAnd При нажатии на стрелку (вручную) Повторять навигационные инструкции с заданным интервалом. - Повторение подсказок + Повторение указаний Оповещение о прибытии Как скоро следует сообщать о прибытии? Места, отправленные в OsmAnd @@ -1566,7 +1566,7 @@ Избранная точка переименована на «%1$s», чтобы сохранить строку, содержащую эмотикон в файл. Печать маршрута Введено повторяющееся название избранной точки - Избранная точка переименована в %1$s для избежания повторов. + Имя изменено на %1$s во избежание повторов. Установите размер текста для карты. Размер текста Нажмите на любой элемент списка для подробной информации, удерживайте для отправки в архив или удаления. Текущие данные на устройстве (%1$s свободно): @@ -1618,7 +1618,7 @@ Язык карты Северной широты Восточной долготы - Голосовые подсказки + Речевые указания Объезд не найден Стиль дорог По умолчанию @@ -1917,7 +1917,7 @@ Количество строк Показывать при запуске Вы уверены? - Все несохранённые изменения будут потеряны. Продолжить\? + Несохранённые изменения будут потеряны. Продолжить\? Моделировать ваше местоположение, используя рассчитанный маршрут или записанный трек GPX. Остановить моделирование своего местоположения. Создать новую @@ -2215,7 +2215,7 @@ Получить Получите неограниченное количество загрузок карт, а также еженедельные, ежедневные и даже почасовые обновления. Неограниченный доступ к картам, обновлениям и плагину «Википедия». - Голосовые инструкции + Голосовое сопровождение Абонентская плата взимается за выбранный период. Отменить подписку можно в Google Play в любой момент. Пожертвование для сообщества OSM Часть вашего пожертвования будет отправлена участникам OSM. Стоимость подписки при этом остаётся прежней. @@ -2233,7 +2233,7 @@ Корректный полный OLC \nОписывает область: %1$s x %2$s Начинать новый сегмент после 6-минутного перерыва, новый трек после 2-часового и новый файл после длительного перерыва (если изменилась дата). - Авторазрыв записи после перерыва + Авторазрыв после перерыва Китайский (Гонконг) Быстрое действие Действие %d @@ -2258,8 +2258,8 @@ Название действия Сербский (латиница) Голосовая навигация - Включить подсказки - Выключить подсказки + Включить звук + Выключить звук Не удалось переместить файл. Благодарим вас за покупку контуров морских глубин Добавить фото @@ -2484,7 +2484,7 @@ \nПолучайте наслаждение от голосовой и визуальной навигации, просматривайте точки интереса (англ. POI, points of interest), создавайте и управляйте треками GPX, используйте визуализацию контурных линий и данных высот (через плагин), переключайтесь между режимами автомобиль, велосипед и пешеход, редактируйте OSM данные и многое другое. GPS-навигация \n• Выбор между автономным (без платы за роуминг) и онлайн-режимом (быстрее) -\n• Пошаговые голосовые подсказки (записанные или синтезированные) доведут до места назначения +\n• Пошаговые голосовые указания (записанные или синтезированные) доведут до места назначения \n• Повторный расчёт маршрута после значительного отклонения от существующего \n• Навигация по полосам, названия улиц и расчётное время прибытия окажут неоценимую помощь в пути. \n• Чтобы сделать ваше путешествие более безопасным, дневной/ночной режим переключается автоматически @@ -2531,7 +2531,7 @@ \n Некоторые из главных возможностей: Навигация \n• Работает через интернет (быстрее) или автономно (без платы за роуминг за границей) -\n• Пошаговые голосовые подсказки (записанные или синтезированные голоса) +\n• Пошаговые голосовые указания (записанные или синтезированные голоса) \n• Полосы движения, отображение названия улицы и расчётное время прибытия \n• Поддержка промежуточных точек на маршруте \n• Автоматическая перестройка маршрута при отклонении от существующего @@ -2778,7 +2778,7 @@ \n \nПерсональная информация не собирается, требуются только данные поиска, с целью улучшить поиск. Отправить поисковый запрос? - Нажмите кнопку и прослушайте соответствующую голосовую подсказку, чтобы узнать, отсутствует она или ошибочна + Нажмите кнопку и прослушайте указание для проверки на предмет отсутствия или неисправности Спасибо за ваш отзыв Не удалось найти точку или путь. Нет результатов поиска\? @@ -2826,7 +2826,7 @@ Выберите на карте или в списке ниже дорогу, которой хотите избежать при навигации: Моделировать навигацию Выберите файл трека для следования - Голосовые подсказки + Речевые указания Переключатель между дневным и ночным режимами для OsmAnd. Дневной режим Ночной режим @@ -3136,9 +3136,9 @@ Карта во время навигации Скорость движения, размеры, масса транспортного средства Параметры транспортного средства - Голосовые инструкции работают только при навигации. + Голосовые оповещения работают только при навигации. Навигационные инструкции и оповещения - Голосовые подсказки + Речевые указания Экранные оповещения Настройки маршрутизации Параметры маршрута @@ -3309,8 +3309,8 @@ Сброс к настройкам по умолчанию приведёт к возврату порядка сортировки по умолчанию. Создать свою категорию Показывать только ночью - Все настройки плагина восстановлены до состояния по умолчанию. - Все настройки профиля восстановлены до состояния по умолчанию. + Все настройки плагина восстановлены до начальных. + Все настройки профиля восстановлены до начальных. %1$s/%2$s Закат в %1$s Восход в %1$s @@ -3360,7 +3360,7 @@ Вы можете выбрать дополнительные данные для экспорта вместе с профилем. Приложение по умолчанию (%s) Не перестраивать - Минимальное отклонение для перестроения маршрута + Отклонение для перестроения маршрута Маршрут будет пересчитан, если расстояние до него больше заданного параметра Пользовательский профиль Угол: %s° @@ -3444,8 +3444,8 @@ Объекты добавлены Импорт завершен Все данные из %1$s импортированы, вы можете использовать кнопки ниже, чтобы открыть соответствующий раздел приложения для управления ими. - Максимальное расстояние между маршрутом и текущей позицией, после которого маршрут будет пересчитан. - Отклонение, при котором маршрут будет пересчитан. + Предельно допустимое отдаление от маршрута, после которого маршрут перестроится. + Пороговое отклонение для пересчёта маршрута. Легенда Невозможно разобрать геоссылку «%s». Для затенения рельефа требуются дополнительные карты. @@ -3499,7 +3499,8 @@ Элементы Настройки интерфейса Действия контекстного меню - Изменить порядок или скрыть элементы из %1$s. + Изменить порядок или скрыть элементы: +\n%1$s. Разделитель Скрыт Эти элементы скрыты из меню, но представляемые ими функции или плагины продолжают работать. @@ -3580,7 +3581,7 @@ \n \n Функции, доступные при нажатии кнопки «%1$s». - Добавить или изменить избранное + Добавить/изменить избранное Создать или изменить POI Возврат к редактированию Парковки @@ -3737,7 +3738,7 @@ Выберите файл трека или импортируйте его со своего устройства. Выбрать другой трек Ведение от моей позиции к треку - Точка трека для навигации + Точка для навигации Начало трека Ближайшая точка Привязка к дороге @@ -3899,7 +3900,7 @@ Папки Выбор папки Выберите папку или добавьте новую - Время голосовых подсказок + Время звучания указаний Предпочитать пешеходные маршруты Подтип Введите параметр @@ -4015,7 +4016,7 @@ Остановить запись\? \nВсе несохранённые данные будут потеряны. На паузе - Расчёт времени в пути с учётом перепадов высоты. Предпочитаемая рельефность маршрута: + Расчёт времени в пути с учётом перепадов высот. Выберите предпочитаемую рельефность маршрута: Переключатель для отображения или скрытия виджета координат. Выберите категорию или добавьте новую Копировать имя POI @@ -4077,7 +4078,7 @@ Линия маршрута окрашена в зависимости от угла подъёма. Мин. высота Макс. высота - Выберите предпочтительный язык и тип голосовых подсказок. + Выберите предпочтительный язык и тип речевых указаний. Синтезатор речи (TTS) умеет произносить все типы инструкций: повороты, названия улиц, точки интереса (POI) и пр. TTS Записанный голос звучит лучше, но предупреждает только о поворотах (использует предустановленные фразы). Не умеет объявлять названия улиц и POI. @@ -4106,8 +4107,8 @@ Я не получил код подтверждения Время ожидания кода может составить 10 минут. Проверьте папку со спамом, если и его нет, воспользуйтесь кнопкой ниже. Локальное резервное копирование - Не теряйте данные. Используйте резервное копирование для лёгкого сохранения и восстановления информации. - Резервное копирование и восстановление + Не теряйте данные. Используйте резервное копирование для сохранения и восстановления информации. + Резервное копирование и восстановление Последнее резервное копирование %1$s назад «Режим навигации» определяет правила расчёта маршрутов, с доступными офлайн- или онлайн-механизмами маршрутизации. @@ -4146,7 +4147,7 @@ Все данные в OsmAnd Cloud будут удалены. Локальные версии останутся нетронутыми. Резервное копирование данных Выберите данные и папки для резервного копирования. - Восстановление данных на устройстве, используя онлайн-резервные копии. + Восстановление данных на устройстве из резервных копий в облаке. Восстановить данные Восстановить из OsmAnd Cloud Выберите данные для восстановления. @@ -4457,16 +4458,16 @@ Точность GPS Сглаживание OsmAnd применит изменения к треку, не сохраняя их в файл. Вы можете сохранить изменения вручную. - GPS фильтр + GPS-фильтр Сохранить изменения в файл Сохранить как копию Установите максимально допустимое значение для HDOP. \nТочки с более высоким значением будут скрыты. Точность На графике и карте будут отображаться только точки трека, соответствующие заданному интервалу, остальные будут скрыты. - Установите пороговое расстояние между точками. -\nТочки трека, находящиеся на расстоянии менее заданного от последней видимой точки, будут скрыты. -\nИмейте в виду, что высокие пороговые значения могут чрезмерно упростить геометрию трека. + Задайте минимальное пороговое расстояние между точками. +\nТочки трека, расстояние между которыми меньше порогового, будут скрыты. +\nИмейте в виду, что высокие пороговые значения могут чрезмерно сгладить трек. В выбранной папке данные OsmAnd не найдены. Повторите попытку. Создан Использовать резервную маршрутизацию @@ -4499,7 +4500,7 @@ Детали морского дна Все Пропустить - Автозапуск записи трека во время навигации и автосохранение по окончании. + Автозапуск записи трека во время навигации и автосохранение по завершении. Нет маршрутов Для добавления маршрута в файл вы можете воспользоваться инструментом «%1$s». Укажите название группы. @@ -4542,7 +4543,7 @@ Выберите сторону экрана, чтобы добавить виджеты или изменить их порядок. Стиль похож на OpenStreetMap-carto, используемый на главном странице сайта OSM. Реалистичное моделирование - Моделирование с постоянной заданной скоростью. + Моделирование с заданной скоростью. Быстрый просмотр Видимые виджеты Учитывать права доступа для гужевых транспортных средств @@ -4555,12 +4556,12 @@ Пункт Кнопки Троллейбусные маршруты - На прямых участках дороги скорость будет приближена к максимально допустимой. -\nНа перекрестках моделирование будет замедляться. -\nДополнительные штрафы будут применяться на светофорах, знаках остановк и т.д. - Фиксированная скорость - Моделирование с максимальной скоростью на прямых участках и замедлением на перекрестках. - Скоростной режим + Максимальная разрешённая скорость на прямых участках. +\nЗамедление на перекрёстках. +\nДополнительные штрафы на светофорах, знаках остановки и пр. + Постоянная скорость + Моделирование с максимальной скоростью на прямых участках и замедлением на перекрёстках. + Режим скорости Обычный Требовательный Критический @@ -4659,7 +4660,7 @@ Расстояние Категория опасных материалов / Учитывать разрешение на доступ к опасным веществам Без бродов - Разрешить частный доступ (грузовик) + Въезд на частную территорию (грузовик) Изобары Изотермы Избегать броды @@ -4749,7 +4750,7 @@ Виден, если карта повернута Всегда скрыт Всегда виден - Нажмите на компас, чтобы переключить режим ориентации карты. + Нажмите на компас для смены режима ориентации. Показывает направление на север. Цвет контурных линий глубины (изобат) Толщина контурных линий глубины (изобат) @@ -4766,7 +4767,7 @@ К дорогам можно привязать только записанный трек. Без смены профиля Соединить прямой линией - Привяжите трек к действующим дорогам для навигации между точками и соответствия навигационных инструкций маршруту. + «Автопритягивание» трека к подходящим дорогам для маршрутизации и совпадения навигационных указаний с дорогой. Включено в ваш текущий план «%1$s» Доступно в рамках подписки %1$s. Удалить группу «%1$s» и все включённые в неё точки (%2$d)\? @@ -4915,7 +4916,7 @@ Дюймы ртутного столба Миллиметры ртутного столба Прогноз на 24 часа и 7 дней, обновляемый каждые 3 часа - Градус Цельсия + Градусы Цельсия Единицы измерения можно изменить в настройках плагина «Погода». Температура Осадки @@ -4932,7 +4933,7 @@ Миль в час Километров в час Виджет показывает облачность для текущего центра карты. - Градус Фаренгейта + Градусы Фаренгейта Виджет показывает количество осадков для текущего центра карты. Действие не поддерживается с выбранным стилем карты. Плагин погоды предоставляет: @@ -4966,12 +4967,12 @@ Переключатель для отображения или скрытия слоя давления на карте. Слой осадков Слой облачности - Показать MTB сложность + Показать MTB-сложность Показать MTB-трейлы в соответствии с их сложностью. МАГВ (IMBA) Международная ассоциация горного велоспорта Классификация сегментов - MTB сложность + MTB-сложность Изолинии облачности (изонефы) Изолинии скорости ветра (изотахи) Изолинии осадков (изогиеты) @@ -5089,7 +5090,7 @@ Сначала старые Ближайшие Сначала менее продолжительные - Выберите файл трека, который будет использоваться в качестве источника для моделирования местоположения. + Выберите файл трека в качестве источника для моделирования движения. Мопед Создание растровых карт с затемнением рельефа (отмывкой) на основе 3D-карт Создание растровых карт склонов на основе 3D-карт @@ -5189,7 +5190,7 @@ Виден в режиме 3D Категории POI Мочка уха - Долгое нажатие на кнопку позволяет изменить её положение. + Удерживайте кнопку для изменения положения. Грудь Артериальное давление Разрешение Bluetooth не предоставлено @@ -5203,11 +5204,11 @@ RSSI В этой папке еще нет ни одного трека. Пустая папка - Не записывается + Не записано Новый трек Видно на карте %1$s треков - Это приведет к удалению папки «%1$s» и всех треков (%2$s) содержащихся в ней. + Папка «%1$s» будет удалена со всеми треками (%2$s). По умолчанию: название плавучего знака (Light character.group.period), выберите дополнительную информацию о секторах 1-3 или сектор 1,2,3,4,5 светового знака Навигационные огни Сектора From cdf3758e148972149274c1d22e3a8a8503c023d8 Mon Sep 17 00:00:00 2001 From: 99 efi Date: Sun, 18 Jun 2023 12:58:39 +0000 Subject: [PATCH 013/214] Translated using Weblate (Hungarian) Currently translated at 100.0% (4719 of 4719 strings) --- OsmAnd/res/values-hu/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 6f128092019..565c0afca90 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -670,7 +670,7 @@ Vektoros térképek gyorsabban rajzolódnak. Nem minden eszközön működik. Hang kijelölése és tesztelése bemondások lejátszásával: OsmAnd fejlesztés - Natív térképmegjelenítés + Natív térképrajzolás Hangutasítások tesztelése Útvonaltervezési adatok Formátum @@ -2299,7 +2299,7 @@ Csak az általa hozzáadott képek megjelenítése: Felhasználónév A képek szűrése feltöltő, dátum vagy típus szerint. Csak magas nagyítási szinteknél lépnek érvénybe. - Sugárirányú vonalzó + Sugárvonalzó Átlag %1$d / %2$d Emelkedő/Lejtő @@ -3460,7 +3460,7 @@ OsmAnd helymegosztás OsmAnd + Mapillary Gyorsművelet - Sugárirányú vonalzó + Sugárvonalzó Távolságmérés Utazás (Wikivoyage és Wikipédia) Térképjelölők @@ -3577,7 +3577,7 @@ Maradjanak Eltávolít Bizonyos országokban a törvény tiltja a traffipaxriasztást. - Tájolás + Irányszög %1$s törölve A traffipaxadatok végleges törléséhez indítsa újra az alkalmazást. Eltávolítás és Újraindítás @@ -3720,7 +3720,7 @@ Útvonal követése Ajánlás: Nehéz megjósolni, hogy mi lesz a felvételen és mi nem, így talán a legjobb ezt a szűrőt kikapcsolni. Utazás felvétele - Nem sikerült elemezni a következő térképmegjelenítési szándékot: „%s”. + Nem sikerült elemezni a következő térképrajzolási szándékot: „%s”. Meglévő nyomvonal megnyitása Tömör Adja meg a címet @@ -4816,7 +4816,7 @@ Magasság: térképközéppont Magasság: jelenlegi hely Megjeleníti a jelenlegi hely vagy a térképközéppont tengerszint feletti magasságát - Térképmegjelenítés (képkocka/másodperc) + Térképrajzolás (képkocka/mp) Megjeleníti, milyen gyorsan jelenik meg és frissül a térkép és a térképelemek (képkocka/másodperc, frames per second [FPS]). Hely szimulálása GPX-szel A szimuláció kihagyja az első métereket From 3decfdf6739c16c32190c5ed01d44a3e882995a5 Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 17 Jun 2023 20:10:14 +0000 Subject: [PATCH 014/214] Translated using Weblate (Spanish) Currently translated at 100.0% (4719 of 4719 strings) --- OsmAnd/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index d0228e1f91d..9927d468205 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -3752,7 +3752,7 @@ Elige el archivo de la traza a seguir o impórtala desde el dispositivo. Elegir otra traza Navegar desde mi ubicación a la traza - Punto de la traza para navegar + Punto desde el que navegar la traza Inicio de la traza Punto más cercano Unir a los caminos From ee1fe09329827d4bb9645a8fdbfd2c203c6a358a Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Sat, 17 Jun 2023 21:30:01 +0000 Subject: [PATCH 015/214] Translated using Weblate (Danish) Currently translated at 100.0% (4719 of 4719 strings) --- OsmAnd/res/values-da/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 50e852d327b..63f6e2eb905 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -251,7 +251,7 @@ Onlinekort Vælg online- eller cachelagrede kilder til kortfliser. Viser indstillinger til at aktivere baggrundssporing og navigation ved periodisk at vække GPS-enheden (med slukket skærm). - Gør tilgængelighedsfunktioner tilgængelige direkte i OsmAnd. Det letter f.eks. justering af hastigheden for talesyntese, konfiguration af skærmnavigation med styrekryds (D-pad), brug af en styrekugle til zoomstyring, eller tekst-til-tale-tilbagemeldinger, f.eks. automatisk at annoncere din position. + Gør tilgængelighedsfunktioner tilgængelige direkte i OsmAnd. Det letter f.eks. justering af hastigheden for talesyntese, konfiguration af skærmnavigation med styrekryds (D-pad), brug af en styrekugle til zoomstyring, eller tekst-til-tale-tilbagemeldinger, f.eks. automatisk at meddele din position. Adgang til mange typer af online (såkaldte kortfliser eller raster) kort, som forbehandlede OSM-kortfliser, satellitbilleder og lag til særlig anvendelse som vejr-, klima- eller geologiske kort og terrænskygger osv. \n \nEthvert af disse kort kan vises som det vigtigste (basis) kort, eller som en over- eller underlejring til et andet basiskort (såsom OsmAnd\'s offline kort). Visse elementer af OsmAnd vektorkort kan skjules via \'Konfigurer kort\'-menuen for at gøre et eventuelt underlejringskortet mere synligt. @@ -3316,7 +3316,7 @@ Videonoter Fotonoter Genberegning af rute - Annoncere + Meddel Brugernavn og adgangskode Disse indstillinger for udvidelsen er globale og gælder for alle profiler OSM redigering @@ -3581,7 +3581,7 @@ Angiv eller indsæt URL-adressen til onlinekilden. Juridisk Hold aktiv - I nogle lande er indberetninger om hastighedskameraer forbudt i henhold til loven. + I nogle lande er advarsler om fartkameraer forbudt ved lov. Indstil fartøjets højde Indstil fartøjets bredde for at undgå smalle broer Få oplysninger om interessepunkter fra Wikipedia, en offline lommeguide med artikler om steder og destinationer. @@ -4174,7 +4174,7 @@ Indstil fartøjets højde for at undgå lave broer. Husk at hvis broen er bevægelig, vil vi bruge dens højde i åben tilstand. Angiv køretøjslængde der skal være tilladt på ruter. Kurs - Genstart appen for at slette alle data fra fartkameraer. + Genstart appen for at slette alle data om fartkameraer. Denne enhed har ikke fartkameraer. Kontrollér kortets zoom-niveau ved hjælp af lydstyrkeknapperne på enheden. Sletter den næste destination på din rute. Hvis det er den endelige destination, stopper navigationen. From 0f26e1d83b5b20242b4451a9becc17ee006ffa84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Podhoreck=C3=BD?= Date: Fri, 16 Jun 2023 11:13:41 +0000 Subject: [PATCH 016/214] Translated using Weblate (Czech) Currently translated at 99.3% (4690 of 4719 strings) --- OsmAnd/res/values-cs/strings.xml | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 6971908ac18..61f5fb7c3fa 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -5184,4 +5184,37 @@ RPM Povolit via ferrata Povolit stezky via ferrata. + Výpočet nadmořské výšky v režimu offline na základě údajů z výškové mapy. Rozdíly oproti nadmořské výšce zaznamenané zařízením lze použít jako korekci nadmořské výšky. + Zdroj údajů + Dlouhým klepnutím na tlačítko můžete změnit jeho polohu. + Viditelné ve 3D režimu + Sektor 4 + Výchozí: název podmořské značky (světelný znak.skupina. období), vyberte další informace o sektorech 1 až 3 nebo sektor 1,2,3,4,5 světelný znak + 2D režim + Sektor 5 + Data + Nezaznamenáno + Tato složka zatím neobsahuje žádnou stopu. + Měřítko SAC + Dotkněte se mapy dvěma prsty a pohybem nahoru a dolů upravte sklon mapy. + POI nenalezeno + Detail osvětlení + Sektory + Sektor 1 + Sektor 2 + Sektor 3 + Malý + Pouze název + Watty + Výpočet offline + Rssi + Prázdná složka + Výsledek výpočtu je prázdný + Zápis dat z externích snímačů do GPX během záznamu cesty. + Nejsou připojeny žádné senzory tohoto typu + Senzory nenalezeny + Nová stopa + Měřítko CAI + 3D režim + Viditelné na mapě \ No newline at end of file From 88d2223fe3542edbdd64ee216e0b75034eb4214b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 18 Jun 2023 22:11:02 +0000 Subject: [PATCH 017/214] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.8% (3249 of 4719 strings) --- OsmAnd/res/values-nb/strings.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index 074cfaaf64d..f0eadf978a9 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -5177,4 +5177,20 @@ o/min Beregn høyde uten internett, basert på høydekartdata. Forskjeller i forhold til enhetens registrerte høyde kan brukes som høydekorreksjon. Dette vil slette mappen \"%1$s\" og alle spor (%2$s) den inneholder. + Sektorer + Lukk dialogen + Sektor 1 + Nytt spor + Sektor 2 + Sektor 3 + Sektor 4 + Sektor 5 + Kun navn + Øreflipp + Data + Tom mappe + Hånd + Slett mappen\? + Slett mappen + Vis alle sporene på kartet \ No newline at end of file From cf2ebd8848c7a7510355440b965eb95f3cac8cf0 Mon Sep 17 00:00:00 2001 From: Alexander Gabilondo Date: Sun, 18 Jun 2023 15:14:59 +0000 Subject: [PATCH 018/214] Translated using Weblate (Basque) Currently translated at 99.9% (4718 of 4719 strings) --- OsmAnd/res/values-eu/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml index 6a7f6c6e3cb..1a8fe1c63a6 100644 --- a/OsmAnd/res/values-eu/strings.xml +++ b/OsmAnd/res/values-eu/strings.xml @@ -5260,4 +5260,9 @@ Ez da sentsorerik aurkitu Datuen iturria Erakutsi arrasto guztiak mapan + Itxi elkarrizketa-koadroa + Baimendu via ferrata + Baimendu via ferratak dituzten xendak. + Watts + RPM \ No newline at end of file From 77208bea65dc3c28f3e84d8d0a788e1267c46517 Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Sat, 17 Jun 2023 14:56:35 +0000 Subject: [PATCH 019/214] Translated using Weblate (Danish) Currently translated at 83.8% (3847 of 4587 strings) --- OsmAnd/res/values-da/phrases.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-da/phrases.xml b/OsmAnd/res/values-da/phrases.xml index 7fe405c15c6..485aeadb2f1 100644 --- a/OsmAnd/res/values-da/phrases.xml +++ b/OsmAnd/res/values-da/phrases.xml @@ -1251,10 +1251,10 @@ Havetype: privat Havetype: botanisk Havestil: Fransk - Havestil: Eengelsk + Havestil: Engelsk Havestil: Japansk Havestil: køkken - Havestil: rosen + Havestil: rosenhave Kapacitet Ja Ingen pladser forbeholdt handicappede @@ -4015,4 +4015,8 @@ Accepteret affald Vand;drikkevand PET-drikkeflasker + Vand + Varmt vand: ja + Varmt vand: nej + Vandsportsbutik \ No newline at end of file From 43257488cbb27a3716d4b55ee875930cc8ea7504 Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Fri, 16 Jun 2023 12:54:17 +0000 Subject: [PATCH 020/214] Translated using Weblate (German) Currently translated at 100.0% (4587 of 4587 strings) --- OsmAnd/res/values-de/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index ad25f5226b3..aa49aebfe52 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -4585,4 +4585,5 @@ VII Name des Tunnels Name der Brücke + Ja \ No newline at end of file From 919b50b90db0e4b24dcde136ab28b550dee9f89a Mon Sep 17 00:00:00 2001 From: TomTurnschuh Date: Sat, 17 Jun 2023 12:53:45 +0000 Subject: [PATCH 021/214] Translated using Weblate (German) Currently translated at 100.0% (4587 of 4587 strings) --- OsmAnd/res/values-de/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index aa49aebfe52..ffea5178b2e 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -208,7 +208,7 @@ Markthalle Furt Fort - Springbrunnen + Brunnen Bilderrahmengeschäft Tankstelle;Tankanlage;Tankstation Bestatter From b616cb5930cf7d8f0712c150180099813ab1a9a5 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 17 Jun 2023 14:26:23 +0000 Subject: [PATCH 022/214] Translated using Weblate (German) Currently translated at 100.0% (4587 of 4587 strings) --- OsmAnd/res/values-de/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index ffea5178b2e..ae202eeb0c6 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -4586,4 +4586,5 @@ Name des Tunnels Name der Brücke Ja + Automatische Zapfsäulen; Kraftstoffautomat \ No newline at end of file From e3d1e0a540c72a0e04dda4d3a5a1fb82ce0ae08c Mon Sep 17 00:00:00 2001 From: MarioSwitch Date: Fri, 16 Jun 2023 15:50:48 +0000 Subject: [PATCH 023/214] Translated using Weblate (French) Currently translated at 99.7% (4577 of 4587 strings) --- OsmAnd/res/values-fr/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml index 48049b313f3..cb3b9cb41f6 100644 --- a/OsmAnd/res/values-fr/phrases.xml +++ b/OsmAnd/res/values-fr/phrases.xml @@ -4580,4 +4580,6 @@ Hauteur d\'une écluse Nom du pont Nom du tunnel + Oui + Distributeurs automatiques de carburant \ No newline at end of file From 6915f92fbcec4cc0c89cbc0d077edf869a66ca55 Mon Sep 17 00:00:00 2001 From: Damjan Gerl Date: Fri, 16 Jun 2023 11:54:59 +0000 Subject: [PATCH 024/214] Translated using Weblate (Slovenian) Currently translated at 99.0% (4544 of 4587 strings) --- OsmAnd/res/values-sl/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-sl/phrases.xml b/OsmAnd/res/values-sl/phrases.xml index 47b10e17239..38b1edab768 100644 --- a/OsmAnd/res/values-sl/phrases.xml +++ b/OsmAnd/res/values-sl/phrases.xml @@ -4549,4 +4549,5 @@ Pregradna plošča Coupure pregrada Knjižnica z igračami + CEMT \ No newline at end of file From ae7709869bda6783846a848938daf1aad8f175f6 Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 17 Jun 2023 20:09:43 +0000 Subject: [PATCH 025/214] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (4719 of 4719 strings) --- OsmAnd/res/values-es-rAR/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index f8ed1d2aa7e..c1de4bd2853 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3140,7 +3140,7 @@ Ajustes de OsmAnd Copiar desde otro perfil Encender pantalla - Mapa durante la navegación + Mapa al navegar Mapa durante la navegación Otros Peso, altura, longitud, velocidad @@ -3729,7 +3729,7 @@ Elige el archivo de la traza a seguir o impórtala desde el dispositivo. Elegir otra traza Navegar desde mi ubicación a la traza - Punto de la traza para navegar + Punto desde el que navegar la traza Inicio de la traza Punto más cercano Unir a los caminos From 4e87a67d6e7175bde153a621f866edfcaeb0e143 Mon Sep 17 00:00:00 2001 From: Franco Date: Fri, 16 Jun 2023 21:50:20 +0000 Subject: [PATCH 026/214] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (4587 of 4587 strings) --- OsmAnd/res/values-es-rAR/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 5b68ac7897b..1e0405f83a4 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -4585,4 +4585,6 @@ Escala CAI Nombre del túnel Nombre del puente + + Surtidores automáticos de combustible;Máquina expendedora de combustible \ No newline at end of file From 38d4ba353c909c6f195977b8cf70dadb6b1491f8 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Sun, 18 Jun 2023 02:25:08 +0000 Subject: [PATCH 027/214] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.9% (4716 of 4719 strings) --- OsmAnd/res/values-pt-rBR/strings.xml | 40 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 1cea67844ba..3ee3cc03e04 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -706,7 +706,7 @@ Apenas estradas Mapa padrão Apenas mapa de estradas - Renderizar caminhos de acordo com a escala de SAC. + Renderizar caminhos de acordo com a escala de SAC/CAI. Rotas de caminhada Renderizar caminhos de acordo com traços OSMC. Limites @@ -770,7 +770,7 @@ Curvas de nível Curvas de nível Curvas de nível - Escala de montanhismo (SAC) + Escala de montanhismo Apenas mapa de estradas Executar o aplicativo em modo seguro (mais lento). Aplicativo Barcode Scanner da ZXing não está instalado. Pesquisar na Google Play\? @@ -2679,7 +2679,7 @@ Salvar como trilha Você adicionou %1$s pontos. Digite um nome de arquivo e toque em \"Salvar\". Para caminhadas, trekking e ciclismo na natureza. Legível ao ar livre. Estradas e objetos naturais contrastantes, diferentes tipos de rotas, opções avançadas de curvas de nível, detalhes extras. O ajuste da integridade da superfície distingue a qualidade da estrada. Sem modo noturno. - Estilo de uso geral. Cidades densas mostradas de forma limpa. Apresenta curvas de nível, rotas, qualidade da superfície, restrições de acesso, símbolos de estrada, caminhos renderizados conforme a escala SAC, itens de esporte em corredeiras. + Estilo de uso geral. Cidades densas mostradas de forma limpa. Apresenta curvas de nível, rotas, qualidade da superfície, restrições de acesso, símbolos de estrada, caminhos renderizados conforme a escala SAC/CAI, itens de esporte em corredeiras. OsmAnd é um software aberto desenvolvido ativamente. Todos podem contribuir para o app reportando bugs, melhorando traduções ou programando novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades. \nCobertura de mapa e qualidade aproximada: \n• Europa Ocidental: **** @@ -2878,8 +2878,8 @@ Selecione os tipos de transporte público a evitar para navegação: Evite os tipos de transporte… Modo %s - Sem pedras irregulares ou paralelepípedo - Evitar pavimento de pedras irregulares e paralelepípedo + Sem paralelepípedo + Evitar paralelepípedo Graus Milirradianos Unidade angular @@ -3663,7 +3663,7 @@ Controle o nível de zoom do mapa usando os botões de volume do dispositivo. Botões de volume como zoom Forneça o comprimento do seu veículo. Algumas restrições de rotas podem ser aplicadas a veículos longos. - Apagar o ponto de destino mais próximo + Excluir próximo ponto de destino Forneça um nome para o ponto Exclui o próximo destino da sua rota. Se esse for o destino final, a navegação será interrompida. Baixar mapas da Wikipédia @@ -4088,7 +4088,7 @@ Precisa de ajuda\? Entre em contato conosco em %1$s Digite seu endereço de e-mail, um código de verificação será enviado para lá, \ne todos os seus dados serão vinculados a ele. - Por favor, insira o endereço de e-mail com o qual você se registrou. Uma senha de uso único para a próxima etapa será enviada a ele. + Por favor, insira o endereço de e-mail com o qual você se registrou. Uma senha de uso único será enviada a ele. Verifique o endereço de e-mail Código de verificação enviado para %1$s. Por favor insira-o no campo abaixo. Este endereço de e-mail não está registrado para OsmAnd Cloud @@ -4755,7 +4755,7 @@ Escondido quando o Norte está para cima Sempre escondido Sempre visível - Dica: toque no widget da bússola para alternar o modo de orientação do mapa. + Dica: toque no botão da bússola para alternar o modo de orientação do mapa. Widget. Download completo Excluir grupo @@ -5207,4 +5207,28 @@ Excluir pasta\? Mostrar todas as trilhas no mapa Esta pasta ainda não tem nenhuma trilha + Gravar dados de sensores externos no GPX durante a gravação da viagem. + Mostra o nível RSSI do seu dispositivo externo. + Padrão: nome da baliza marítima (carácter de luz.grupo.período), seleciona informações adicionais sobre os setores 1 a 3 ou o carácter de luz do setor 1,2,3,4,5 + Sensores não encontrados + Dados + Não há sensores conectados deste tipo + Fonte de dados + Isto eliminará a pasta \"%1$s\" e todas as trilhas (%2$s) incluídas. + Rssi + %1$s é importado. + Esquecer o sensor + RPM + %1$s desconectado + Emparelhar sensor ANT+ + Pode emparelhar sensores Bluetooth LE e ANT+ com o OsmAnd. + Watts + Permitir via ferrata + Calcular offline + "Calcule a elevação offline, com base nos dados do mapa de altura. As diferenças em relação à altitude registrada pelo dispositivo podem ser usadas como correção de elevação." + O resultado do cálculo está vazio + %1$s conectado + Emparelhar sensor Bluetooth LE + Pressão do punho + Emparelhar \ No newline at end of file From 4acda5848444a02c94d0089b67bafdbf440bb374 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Sun, 18 Jun 2023 02:40:33 +0000 Subject: [PATCH 028/214] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.9% (4585 of 4587 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 42 ++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index 1745f571b25..8744500e5e9 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -2158,8 +2158,8 @@ Banho: não Armazenamento de barco Transporte: Sim - Ponte ref - Ref. do túnel + Referencia da ponte + Referência do túnel Referência Passageiros Veículos @@ -3885,7 +3885,7 @@ Nome da pista Salto de esqui Centro de conferências - Geodesia + Referência do local Geodesia Campo de acampamento Ferradura @@ -4549,4 +4549,40 @@ Pneus Barreira antitanques Barreira de segurança + Acesso de barco: permitido + Dispensador automático de combustível;Máquina de venda de combustível + Acesso de barco: desconhecido + Acesso de barco: sim + Acesso de navio: sim + Acesso de navio: não + 0 + I + VIa + VIc + IV + Va + Vb + VIb + Escala SAC + VII + Sim + CEMT + Comprimento máximo + Referência da comporta + Altura da comporta + Acesso de navio: apenas acesso ao destino + Acesso de navio: permitido + Acesso de navio: para entregas + Nome da comporta + Profundidade do canal + Acesso de barco: privado + Acesso de barco: apenas acesso ao destino + Acesso de barco: não + Acesso de navio: privado + II + III + Escala CAI + Asfalto com brita + Nome do túnel + Nome da ponte \ No newline at end of file From 2851597efd78f85c5d24d2fe4c9941bb0ee5b54f Mon Sep 17 00:00:00 2001 From: Franco Date: Sun, 18 Jun 2023 13:22:33 +0000 Subject: [PATCH 029/214] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (4719 of 4719 strings) --- OsmAnd/res/values-es-rUS/strings.xml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 4045ad742bb..fb77de62cb5 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -3139,7 +3139,7 @@ Ajustes de OsmAnd Copiar desde otro perfil Encender pantalla - Mapa durante la navegación + Mapa al navegar Mapa durante la navegación Otros Peso, altura, longitud, velocidad @@ -3699,7 +3699,7 @@ Traza simplificada Trazas Guardar como nuevo archivo de traza - está guardado + se ha guardado Ruta de la traza Trazas Nombre del archivo @@ -3726,7 +3726,7 @@ Crear nueva ruta Cambiar el tipo de ruta anterior Cambiar el tipo de ruta posterior - Punto de la traza para navegar + Punto desde el que navegar la traza Sobrescribir traza Abrir traza guardada Sólo el segmento marcado será recalculado usando el perfil elegido. @@ -4092,7 +4092,7 @@ ¿Necesitas ayuda\? Ponte en contacto con nosotros en %1$s Ingresa tu correo electrónico, se enviará un código de verificación \ny todos los datos se vincularán a él. - Ingresa el correo electrónico usado para el registro. Enviaremos un código temporal necesario para el siguiente paso. + Ingresa el correo electrónico usado para el registro. Enviaremos una contraseña de un solo uso. Confirmar dirección de correo electrónico Código de verificación enviado a «%1$s». Añádelo en el siguiente campo. Este correo electrónico no está registrado en OsmAnd Cloud @@ -4772,7 +4772,7 @@ Visible al girar el mapa Siempre oculto Siempre visible - Sugerencia: Pulsa el widget de la brújula para cambiar el modo de orientación del mapa. + Sugerencia: Pulsa el botón de la brújula para cambiar el modo de orientación del mapa. Muestra la dirección hacia el norte. La anchura para las curvas de nivel de profundidad Mapa de alturas @@ -5207,7 +5207,7 @@ Escala CAI Modo 2D Modo 3D - Mantén pulsado en el botón para cambiar la ubicación del botón. + Mantén pulsado para cambiar la ubicación del botón. Visible en el modo 3D Pulsa en el mapa con 2 dedos y mueve hacia arriba o abajo para ajustar la inclinación del mapa. Esto borrará la carpeta «%1$s» y todas las trazas (%2$s) incluidas. @@ -5246,4 +5246,12 @@ No hay sensores de este tipo conectados Sensores no encontrados Origen de los datos + Calcular sin conexión + Calcula la elevación estando desconectado, basándose en los datos del mapa de altura. Las diferencias respecto a la altitud registrada por el dispositivo pueden usarse como corrección de la elevación. + Permitir via ferrata + Cerrar el diálogo + Permitir senderos de via ferrata. + Vatios (watts) + RPM + El resultado del cálculo está vacío \ No newline at end of file From ac47cdafd51c6052b31ff13dade25d6890d3dc89 Mon Sep 17 00:00:00 2001 From: Franco Date: Sun, 18 Jun 2023 13:24:03 +0000 Subject: [PATCH 030/214] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (4587 of 4587 strings) --- OsmAnd/res/values-es-rUS/phrases.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index 99dc2d5789d..eb5653c54ba 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -4583,4 +4583,8 @@ VII Escala SAC Escala CAI + Surtidores automáticos de combustible;Máquina expendedora de combustible + + Nombre del túnel + Nombre del puente \ No newline at end of file From b517ec0b4620540881962dfc431ad24c19009090 Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Sun, 18 Jun 2023 08:09:04 +0000 Subject: [PATCH 031/214] Translated using Weblate (Danish) Currently translated at 98.9% (272 of 275 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/da/ --- OsmAnd-telegram/res/values-da/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd-telegram/res/values-da/strings.xml b/OsmAnd-telegram/res/values-da/strings.xml index 469d6da8db2..0a08425c97f 100644 --- a/OsmAnd-telegram/res/values-da/strings.xml +++ b/OsmAnd-telegram/res/values-da/strings.xml @@ -274,5 +274,5 @@ Fejl %1$s — %2$s %1$s: %2$s - Send live placeringsfejl: %1$s + Send live placering-fejl: %1$s \ No newline at end of file From 17b7d8c658643850e79fb66bcc0a3466de4a5aed Mon Sep 17 00:00:00 2001 From: 0xRe1nk0 <0xre1nk0@gmail.com> Date: Thu, 22 Jun 2023 10:22:49 +0300 Subject: [PATCH 032/214] Review fix --- .../aidlapi/OsmAndCustomizationConstants.java | 2 - .../res/layout/card_divider_16dp_margin.xml | 14 --- .../layout/list_item_terrain_description.xml | 43 +++++--- OsmAnd/res/values/strings.xml | 1 - .../plus/configmap/ConfigureMapMenu.java | 51 ++------- .../osmand/plus/plugins/PluginsHelper.java | 16 --- .../openseamaps/NauticalMapsPlugin.java | 8 +- .../osmand/plus/plugins/srtm/SRTMPlugin.java | 102 +++++++++++------- .../plus/widgets/ctxmenu/ViewCreator.java | 5 + .../widgets/ctxmenu/data/ContextMenuItem.java | 12 --- 10 files changed, 110 insertions(+), 144 deletions(-) delete mode 100644 OsmAnd/res/layout/card_divider_16dp_margin.xml diff --git a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java index 4fe7b1b0b72..a49379301bf 100644 --- a/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java +++ b/OsmAnd-api/src/net/osmand/aidlapi/OsmAndCustomizationConstants.java @@ -65,8 +65,6 @@ public interface OsmAndCustomizationConstants { String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines"; String TERRAIN_ID = SHOW_ITEMS_ID_SCHEME + "terrain"; String WEATHER_ID = SHOW_ITEMS_ID_SCHEME + "weather"; - String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps"; - String MAP_RENDERING_CATEGORY_ID = RENDERING_ITEMS_ID_SCHEME + "category"; String MAP_STYLE_ID = RENDERING_ITEMS_ID_SCHEME + "map_style"; String MAP_MODE_ID = RENDERING_ITEMS_ID_SCHEME + "map_mode"; diff --git a/OsmAnd/res/layout/card_divider_16dp_margin.xml b/OsmAnd/res/layout/card_divider_16dp_margin.xml deleted file mode 100644 index e872af12021..00000000000 --- a/OsmAnd/res/layout/card_divider_16dp_margin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/layout/list_item_terrain_description.xml b/OsmAnd/res/layout/list_item_terrain_description.xml index 9982ff58717..bb7002b5151 100644 --- a/OsmAnd/res/layout/list_item_terrain_description.xml +++ b/OsmAnd/res/layout/list_item_terrain_description.xml @@ -1,16 +1,18 @@ - + android:background="?attr/bg_color" + android:orientation="vertical"> + android:paddingHorizontal="@dimen/content_padding" + android:paddingTop="@dimen/content_padding"> + android:textSize="@dimen/default_desc_text_size" /> + android:layout_marginLeft="@dimen/content_padding" + android:layout_weight="0" + android:src="@drawable/ic_action_srtm_colored_day" /> @@ -41,8 +43,9 @@ android:id="@+id/button_get" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:layout_marginTop="@dimen/content_padding"> + android:layout_marginTop="@dimen/content_padding" + android:layout_marginBottom="@dimen/content_padding" + android:orientation="vertical"> @@ -80,4 +83,12 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 86100684369..748af691421 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -12,7 +12,6 @@ --> Free mode - Own and observe the scale model of your neighborhood or the whole continent. Slope uses colors to visualize terrain steepness. You can read more about Slopes in %1$s. Terrain contour lines, full hillshade map with dark shades and slope maps with colors to show peaks and lowlands. Terrain map diff --git a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java index a0aa68453c8..0ab01164886 100644 --- a/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/configmap/ConfigureMapMenu.java @@ -147,36 +147,20 @@ public ContextMenuAdapter createListAdapter(@NonNull MapActivity mapActivity) { List customRules = ConfigureMapUtils.getCustomRules(app, UI_CATEGORY_HIDDEN, RENDERING_CATEGORY_TRANSPORT); createLayersItems(customRules, adapter, mapActivity, nightMode); - if (app.useOpenGlRenderer()) { - createTerrainItems(customRules, adapter, mapActivity); - } + registerTerrainCard(adapter, mapActivity, customRules); PluginsHelper.registerConfigureMapCategory(adapter, mapActivity, customRules); createRouteAttributeItems(customRules, adapter, mapActivity, nightMode); createRenderingAttributeItems(customRules, adapter, mapActivity, nightMode); return adapter; } - private void createTerrainItems(@NonNull List customRules, - @NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity) { - OsmandApplication app = activity.getMyApplication(); - - adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) - .setCategory(true) - .setTitle(app.getString(R.string.shared_string_terrain)) - .setLayout(R.layout.list_group_title_with_switch)); - - if (Version.isPaidVersion(app)) { - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(SRTMPlugin.class)); - } else { - addTerrainDescriptionItem(adapter, activity); - if (PluginsHelper.isEnabled(NauticalMapsPlugin.class)) { - adapter.addItem(new ContextMenuItem("nautical_divider") - .setLayout(R.layout.card_divider_16dp_margin) - .setClickable(false)); - } + private void registerTerrainCard(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity, + @NonNull List customRules) { + SRTMPlugin srtmPlugin = PluginsHelper.getPlugin(SRTMPlugin.class); + if (srtmPlugin != null) { + srtmPlugin.registerTerrainCard(adapter, activity, customRules); } - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules, Collections.singletonList(NauticalMapsPlugin.class)); } private void createLayersItems(@NonNull List customRules, @@ -263,14 +247,7 @@ private void createLayersItems(@NonNull List customRules, .setItemDeleteAction(settings.MAP_ONLINE_DATA, settings.MAP_TILE_SOURCES) .setListener(listener)); - if (app.useOpenGlRenderer()) { - ArrayList terrainPlugins = new ArrayList<>(); - terrainPlugins.add(SRTMPlugin.class); - terrainPlugins.add(NauticalMapsPlugin.class); - PluginsHelper.registerLayerContextMenuExcluded(adapter, activity, customRules, terrainPlugins); - } else { - PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); - } + PluginsHelper.registerLayerContextMenu(adapter, activity, customRules); app.getAidlApi().registerLayerContextMenu(adapter, activity); selected = settings.SHOW_BORDERS_OF_DOWNLOADED_MAPS.get(); @@ -283,18 +260,6 @@ private void createLayersItems(@NonNull List customRules, .setListener(listener)); } - private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, - @NonNull MapActivity activity) { - adapter.addItem(new ContextMenuItem(TERRAIN_DESCRIPTION_ID) - .setLayout(R.layout.list_item_terrain_description) - .setTitleId(TERRAIN_DESCRIPTION_ID.hashCode(), null) - .setClickable(false) - .setSpecialViewListener((uiAdapter, view, item, isChecked) -> { - ChoosePlanFragment.showInstance(activity, OsmAndFeature.TERRAIN); - return true; - })); - } - private void createRouteAttributeItems(@NonNull List customRules, @NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity, diff --git a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java index c104e5fa472..fb192ca54b8 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java +++ b/OsmAnd/src/net/osmand/plus/plugins/PluginsHelper.java @@ -611,22 +611,6 @@ public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, } } - public static void registerLayerContextMenu(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List plugins) { - for (OsmandPlugin plugin : getAvailablePlugins()) { - if (plugins.contains(plugin.getClass())) { - plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); - } - } - } - - public static void registerLayerContextMenuExcluded(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules, @NonNull List excludedPlugins) { - for (OsmandPlugin plugin : getAvailablePlugins()) { - if (!excludedPlugins.contains(plugin.getClass())) { - plugin.registerLayerContextMenuActions(adapter, mapActivity, customRules); - } - } - } - public static void registerConfigureMapCategory(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.registerConfigureMapCategoryActions(adapter, mapActivity, customRules); diff --git a/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java index 7fcd5b733e7..150f2a3a8bb 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/openseamaps/NauticalMapsPlugin.java @@ -100,11 +100,17 @@ public String getId() { return PLUGIN_NAUTICAL; } + public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { + if ((isEnabled() || hasDepthMaps()) && app.useOpenGlRenderer()) { + createNauticalItem(adapter, mapActivity, customRules); + } + } + @Override public void registerLayerContextMenuActions(@NonNull ContextMenuAdapter menuAdapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { - if (isEnabled() || hasDepthMaps()) { + if ((isEnabled() || hasDepthMaps()) && !app.useOpenGlRenderer()) { createNauticalItem(menuAdapter, mapActivity, customRules); } } diff --git a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java index f5ec5b36769..38432a87725 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java +++ b/OsmAnd/src/net/osmand/plus/plugins/srtm/SRTMPlugin.java @@ -3,8 +3,9 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.CONTOUR_LINES; import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_ENABLE_3D_MAPS_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.PLUGIN_SRTM; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_CATEGORY_ID; +import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_DESCRIPTION_ID; import static net.osmand.aidlapi.OsmAndCustomizationConstants.TERRAIN_ID; -import static net.osmand.plus.chooseplan.button.PurchasingUtils.PROMO_PREFIX; import static net.osmand.plus.widgets.ctxmenu.data.ContextMenuItem.INVALID_ID; import android.app.Activity; @@ -20,6 +21,7 @@ import net.osmand.data.LatLon; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; +import net.osmand.plus.Version; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.chooseplan.ChoosePlanFragment; import net.osmand.plus.chooseplan.OsmAndFeature; @@ -31,6 +33,7 @@ import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.plugins.OsmandPlugin; import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; @@ -359,9 +362,41 @@ private void removeTerrainLayer(@NonNull OsmandMapTileView mapView) { } } + public void registerTerrainCard(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { + if (isEnabled() && app.useOpenGlRenderer()) { + adapter.addItem(new ContextMenuItem(TERRAIN_CATEGORY_ID) + .setCategory(true) + .setTitle(app.getString(R.string.shared_string_terrain)) + .setLayout(R.layout.list_group_title_with_switch)); + + if (!Version.isPaidVersion(app)) { + addTerrainDescriptionItem(adapter, mapActivity); + } else { + createContextMenuItems(adapter, mapActivity); + add3DReliefItem(adapter, mapActivity); + } + NauticalMapsPlugin nauticalMapsPlugin = PluginsHelper.getPlugin(NauticalMapsPlugin.class); + if (nauticalMapsPlugin != null) { + nauticalMapsPlugin.registerTerrainCard(adapter, mapActivity, customRules); + } + } + } + + private void addTerrainDescriptionItem(@NonNull ContextMenuAdapter adapter, + @NonNull MapActivity activity) { + adapter.addItem(new ContextMenuItem(TERRAIN_DESCRIPTION_ID) + .setLayout(R.layout.list_item_terrain_description) + .setTitleId(TERRAIN_DESCRIPTION_ID.hashCode(), null) + .setClickable(false) + .setListener((uiAdapter, view, item, isChecked) -> { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.TERRAIN); + return true; + })); + } + @Override protected void registerLayerContextMenuActions(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity mapActivity, @NonNull List customRules) { - if (isEnabled()) { + if (isEnabled() && !app.useOpenGlRenderer()) { if (isLocked()) { PurchasingUtils.createPromoItem(adapter, mapActivity, OsmAndFeature.TERRAIN, TERRAIN_ID, @@ -370,7 +405,6 @@ protected void registerLayerContextMenuActions(@NonNull ContextMenuAdapter adapt } else { createContextMenuItems(adapter, mapActivity); } - add3DReliefItem(adapter, mapActivity); } } @@ -463,45 +497,35 @@ public boolean onContextMenuClick(@Nullable OnDataChangeUiAdapter uiAdapter, @Nu } private void add3DReliefItem(@NonNull ContextMenuAdapter adapter, @NonNull MapActivity activity) { - if (app.useOpenGlRenderer()) { - ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) - .setTitleId(R.string.relief_3d, app) - .setIcon(R.drawable.ic_action_3d_relief) - .setListener((uiAdapter, view, contextItem, isChecked) -> { - if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { - settings.ENABLE_3D_MAPS.set(isChecked); - contextItem.setColor(app, isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); - contextItem.setSelected(isChecked); - contextItem.setDescription(app.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); - uiAdapter.onDataSetChanged(); - - app.runInUIThread(() -> app.getOsmandMap().getMapLayers().getMapInfoLayer().recreateAllControls(activity)); - } else { - ChoosePlanFragment.showInstance(activity, OsmAndFeature.RELIEF_3D); - } - return true; - }); + ContextMenuItem item = new ContextMenuItem(MAP_ENABLE_3D_MAPS_ID) + .setTitleId(R.string.relief_3d, app) + .setIcon(R.drawable.ic_action_3d_relief) + .setListener((uiAdapter, view, contextItem, isChecked) -> { + if (InAppPurchaseHelper.isOsmAndProAvailable(app)) { + settings.ENABLE_3D_MAPS.set(isChecked); + contextItem.setColor(app, isChecked ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); + contextItem.setSelected(isChecked); + contextItem.setDescription(app.getString(isChecked ? R.string.shared_string_on : R.string.shared_string_off)); + uiAdapter.onDataSetChanged(); - boolean enabled3DMode = settings.ENABLE_3D_MAPS.get(); - if (!InAppPurchaseHelper.isOsmAndProAvailable(app)) { - boolean nightMode = isNightMode(activity, app); - item.setUseNaturalSecondIconColor(true); - item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); - } else { - item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); - item.setSelected(enabled3DMode); - item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); - } + app.runInUIThread(() -> app.getOsmandMap().getMapLayers().getMapInfoLayer().recreateAllControls(activity)); + } else { + ChoosePlanFragment.showInstance(activity, OsmAndFeature.RELIEF_3D); + } + return false; + }); - ContextMenuItem terrainItem = adapter.getItemById(TERRAIN_ID); - if (terrainItem == null) { - terrainItem = adapter.getItemById(PROMO_PREFIX + TERRAIN_ID); - } - if (terrainItem != null) { - item.setOrder(terrainItem.getOrder()); - } - adapter.addItem(item); + boolean enabled3DMode = settings.ENABLE_3D_MAPS.get(); + if (!InAppPurchaseHelper.isOsmAndProAvailable(app)) { + boolean nightMode = isNightMode(activity, app); + item.setUseNaturalSecondIconColor(true); + item.setSecondaryIcon(nightMode ? R.drawable.img_button_pro_night : R.drawable.img_button_pro_day); + } else { + item.setColor(app, enabled3DMode ? R.color.osmand_orange : INVALID_ID); + item.setSelected(enabled3DMode); + item.setDescription(app.getString(enabled3DMode ? R.string.shared_string_on : R.string.shared_string_off)); } + adapter.addItem(item); } @Nullable diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java index 16ed175f7fe..c78fc5c22fe 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/ViewCreator.java @@ -30,6 +30,8 @@ import net.osmand.plus.activities.actions.AppModeDialog; import net.osmand.plus.dialogs.HelpArticleDialogFragment; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.plugins.PluginsHelper; +import net.osmand.plus.plugins.openseamaps.NauticalMapsPlugin; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.utils.AndroidUtils; @@ -289,6 +291,9 @@ private View getHelpToImproveItemView(@NonNull View view) { private View getTerrainDescriptionView(@NonNull View view, @NonNull ContextMenuItem item) { View btnGet = view.findViewById(R.id.button_get); UiUtilities.setupDialogButton(nightMode, btnGet, UiUtilities.DialogButtonType.SECONDARY_ACTIVE, R.string.shared_string_get); + View divider = view.findViewById(R.id.bottom_divider); + AndroidUiHelper.updateVisibility(divider, PluginsHelper.isEnabled(NauticalMapsPlugin.class)); + btnGet.setOnClickListener(v -> { ItemClickListener listener = item.getItemClickListener(); if (listener != null) { diff --git a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java index cf979016fea..60eaf46b5d5 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java +++ b/OsmAnd/src/net/osmand/plus/widgets/ctxmenu/data/ContextMenuItem.java @@ -48,8 +48,6 @@ public class ContextMenuItem { private int icon = INVALID_ID; @DrawableRes private int secondaryIcon = INVALID_ID; - boolean showProIcon = false; - private Boolean selected; private int progress = INVALID_ID; private boolean loading; @@ -132,10 +130,6 @@ public boolean useNaturalIconColor() { return useNaturalIconColor; } - public boolean isShowProIcon() { - return showProIcon; - } - public boolean useNaturalSecondIconColor() { return useNaturalSecondIconColor; } @@ -278,12 +272,6 @@ public ContextMenuItem setUseNaturalIconColor(boolean useNaturalIconColor) { return this; } - @NonNull - public ContextMenuItem showProIcon(boolean showProIcon) { - this.showProIcon = showProIcon; - return this; - } - @NonNull public ContextMenuItem setUseNaturalSecondIconColor(boolean useNaturalSecondIconColor) { this.useNaturalSecondIconColor = useNaturalSecondIconColor; From 316958dc6d9d305275a82cf29f4dc08200c842b5 Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Thu, 22 Jun 2023 08:05:41 +0000 Subject: [PATCH 033/214] Translated using Weblate (Danish) Currently translated at 99.9% (4721 of 4723 strings) --- OsmAnd/res/values-da/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 63f6e2eb905..1609982d7f6 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -5245,4 +5245,6 @@ OPM Tillad via ferrata Luk dialogen + 3D-relief + Terrænkort \ No newline at end of file From 5d0dd260ab5a443bf58624355b7e6f3433425076 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Thu, 22 Jun 2023 11:34:28 +0300 Subject: [PATCH 034/214] Revert "Move map center on destination reached" --- .../other/DestinationReachedFragment.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/DestinationReachedFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/DestinationReachedFragment.java index 3dce61315e9..3d0cd2a0ed8 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/DestinationReachedFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/DestinationReachedFragment.java @@ -22,7 +22,6 @@ import net.osmand.plus.activities.MapActivity; import net.osmand.plus.auto.NavigationSession; import net.osmand.plus.helpers.AndroidUiHelper; -import net.osmand.plus.helpers.MapDisplayPositionManager; import net.osmand.plus.helpers.TargetPointsHelper; import net.osmand.plus.helpers.TargetPointsHelper.TargetPoint; import net.osmand.plus.mapcontextmenu.MapContextMenu; @@ -52,8 +51,7 @@ public class DestinationReachedFragment extends Fragment implements RouteCalcula private boolean nighMode; private boolean isLandscapeLayout; private boolean shouldHideMenu; - private MapDisplayPositionManager.IMapDisplayPositionProvider provider; - private MapDisplayPositionManager positionManager; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -67,8 +65,6 @@ public void onCreate(@Nullable Bundle savedInstanceState) { if (savedInstanceState != null) { shouldHideMenu = savedInstanceState.getBoolean(SHOULD_HIDE_MENU); } - positionManager = app.getMapViewTrackingUtilities().getMapDisplayPositionManager(); - provider = () -> OsmandSettings.CENTER_CONSTANT; } @Nullable @@ -133,9 +129,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, AndroidUtils.setBackground(view.getContext(), mainView, nighMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); } - - positionManager.registerProvider(provider); - positionManager.updateMapDisplayPosition(); return view; } @@ -151,12 +144,6 @@ public void onStop() { ctxMenu.setBaseFragmentVisibility(true); } - @Override - public void onDestroyView() { - super.onDestroyView(); - positionManager.unregisterProvider(provider); - } - @Override public void onDetach() { super.onDetach(); From a5803300bbe287e88ada00aa0366a8342ec3425b Mon Sep 17 00:00:00 2001 From: chumva Date: Thu, 22 Jun 2023 12:16:37 +0300 Subject: [PATCH 035/214] Fix #17473 --- .../src/net/osmand/plus/myplaces/tracks/TrackFoldersHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/myplaces/tracks/TrackFoldersHelper.java b/OsmAnd/src/net/osmand/plus/myplaces/tracks/TrackFoldersHelper.java index 2d913e9ad74..c94b1e5988a 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/tracks/TrackFoldersHelper.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/tracks/TrackFoldersHelper.java @@ -121,7 +121,7 @@ public void showFolderOptionsMenu(@NonNull TrackFolder trackFolder, @NonNull Vie items.add(new PopUpMenuItem.Builder(app) .setTitleId(R.string.shared_string_select) .setIcon(getContentIcon(R.drawable.ic_action_deselect_all)) - .setOnClickListener(v -> showTracksSelection(trackFolder, fragment, null, Collections.singleton(trackFolder))).create()); + .setOnClickListener(v -> showTracksSelection(trackFolder, fragment, null, null)).create()); items.add(new PopUpMenuItem.Builder(app) .setTitleId(R.string.add_new_folder) From e6dbc10289d5d2cb6178ca8f9e718f9109c3d8d6 Mon Sep 17 00:00:00 2001 From: alex-osm Date: Fri, 23 Jun 2023 09:28:08 +0300 Subject: [PATCH 036/214] Upgrade gms-location version --- OsmAnd/build-common.gradle | 2 +- .../helpers/GmsLocationServiceHelper.java | 24 +------------------ 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/OsmAnd/build-common.gradle b/OsmAnd/build-common.gradle index 78dc2f9b3d9..b3069f55c5b 100644 --- a/OsmAnd/build-common.gradle +++ b/OsmAnd/build-common.gradle @@ -419,5 +419,5 @@ dependencies { implementation "androidx.car.app:app:1.2.0" implementation "androidx.car.app:app-projected:1.2.0" - implementation 'com.google.android.gms:play-services-location:20.0.0' + implementation 'com.google.android.gms:play-services-location:21.0.1' } diff --git a/OsmAnd/src/net/osmand/plus/helpers/GmsLocationServiceHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GmsLocationServiceHelper.java index ca7bf173d99..7d8d78859e2 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GmsLocationServiceHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GmsLocationServiceHelper.java @@ -44,29 +44,7 @@ public GmsLocationServiceHelper(@NonNull OsmandApplication app) { this.app = app; fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(app); - - fusedLocationRequest = LocationRequest.create() - // Sets the desired interval for active location updates. This interval is inexact. You - // may not receive updates at all if no location sources are available, or you may - // receive them less frequently than requested. You may also receive updates more - // frequently than requested if other applications are requesting location at a more - // frequent interval. - // - // IMPORTANT NOTE: Apps running on Android 8.0 and higher devices (regardless of - // targetSdkVersion) may receive updates less frequently than this interval when the app - // is no longer in the foreground. - .setInterval(100) - - // Sets the fastest rate for active location updates. This interval is exact, and your - // application will never receive updates more frequently than this value. - //.setFastestInterval(50) - - // Sets the maximum time when batched location updates are delivered. Updates may be - // delivered sooner than this interval. - .setMaxWaitTime(0) - - .setPriority(Priority.PRIORITY_HIGH_ACCURACY); - + fusedLocationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 100).build(); fusedLocationCallback = new com.google.android.gms.location.LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { From 2cf37c97f022f0501c3a01f57b44df3ca5d2d854 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Fri, 23 Jun 2023 12:58:38 +0300 Subject: [PATCH 037/214] #16632: Implemented map pisitioning to show all selected items --- .../net/osmand/plus/auto/FavoritesScreen.java | 24 +++++++++++++++++++ .../net/osmand/plus/auto/MapMarkersScreen.kt | 16 +++++++++++++ OsmAnd/src/net/osmand/plus/auto/POIScreen.kt | 18 +++++++++++++- .../src/net/osmand/plus/auto/TracksScreen.kt | 15 ++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java index e84c7d88630..cde5b731862 100644 --- a/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java +++ b/OsmAnd/src/net/osmand/plus/auto/FavoritesScreen.java @@ -26,9 +26,12 @@ import net.osmand.data.FavouritePoint; import net.osmand.data.LatLon; +import net.osmand.data.QuadRect; +import net.osmand.data.RotatedTileBox; import net.osmand.plus.R; import net.osmand.plus.myplaces.favorites.FavoriteGroup; import net.osmand.plus.utils.AndroidUtils; +import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.PointImageDrawable; import net.osmand.search.core.ObjectType; import net.osmand.search.core.SearchResult; @@ -67,6 +70,7 @@ public FavoritesScreen( public void onDestroy(@NonNull LifecycleOwner owner) { DefaultLifecycleObserver.super.onDestroy(owner); getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setCustomMapObjects(null); + getApp().getOsmandMap().getMapView().backToLocation(); } }); } @@ -95,7 +99,22 @@ private void setupFavorites(ItemList.Builder listBuilder) { int favoritesPointsSize = favoritesPoints.size(); List limitedFavoritesPoints = favoritesPoints.subList(0, Math.min(favoritesPointsSize, getContentLimit() - 1)); getApp().getOsmandMap().getMapLayers().getFavouritesLayer().setCustomMapObjects(limitedFavoritesPoints); + QuadRect mapRect = new QuadRect(); for (FavouritePoint point : limitedFavoritesPoints) { + double longitude = point.getLongitude(); + double latitude = point.getLatitude(); + if (mapRect.left == 0.0) { + mapRect.left = longitude; + } else { + mapRect.left = Math.min(mapRect.left, longitude); + } + mapRect.right = Math.max(mapRect.right, longitude); + if (mapRect.bottom == 0.0) { + mapRect.bottom = latitude; + } else { + mapRect.bottom = Math.min(mapRect.bottom, latitude); + } + mapRect.top = Math.max(mapRect.top, latitude); String title = point.getDisplayName(getApp()); int color = getApp().getFavoritesHelper().getColorWithCategory(point, ContextCompat.getColor(getApp(), R.color.color_favorite)); CarIcon icon = new CarIcon.Builder(IconCompat.createWithBitmap( @@ -115,6 +134,11 @@ private void setupFavorites(ItemList.Builder listBuilder) { CarLocation.create(point.getLatitude(), point.getLongitude())).build()).build()) .build()); } + if (mapRect.left != 0.0 && mapRect.right != 0.0 && mapRect.top != 0.0 && mapRect.bottom != 0.0) { + OsmandMapTileView mapView = getApp().getOsmandMap().getMapView(); + RotatedTileBox tileBox =mapView.getCurrentRotatedTileBox().copy(); + mapView.fitRectToMap(mapRect.left, mapRect.right, mapRect.top, mapRect.bottom, tileBox.getPixHeight(), tileBox.getPixHeight(), 0); + } } private void onClickFavorite(@NonNull FavouritePoint point) { diff --git a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt index 92f44bc7e95..6884264f6f3 100644 --- a/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/MapMarkersScreen.kt @@ -19,11 +19,15 @@ import androidx.core.graphics.drawable.IconCompat import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import net.osmand.data.LatLon +import net.osmand.data.QuadRect +import net.osmand.data.RotatedTileBox import net.osmand.plus.R import net.osmand.plus.mapmarkers.MapMarker import net.osmand.search.core.ObjectType import net.osmand.search.core.SearchResult import net.osmand.util.MapUtils +import kotlin.math.max +import kotlin.math.min class MapMarkersScreen( carContext: CarContext, @@ -35,6 +39,7 @@ class MapMarkersScreen( override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) app.osmandMap.mapLayers.mapMarkersLayer.setCustomMapObjects(null) + app.osmandMap.mapView.backToLocation() } }) } @@ -46,7 +51,14 @@ class MapMarkersScreen( app.mapMarkersHelper.mapMarkers.subList(0, markersSize.coerceAtMost(contentLimit - 1)) val location = app.settings.lastKnownMapLocation app.osmandMap.mapLayers.mapMarkersLayer.setCustomMapObjects(markers) + val mapRect = QuadRect() for (marker in markers) { + val longitude = marker.longitude + val latitude = marker.latitude + mapRect.left = if(mapRect.left == 0.0) longitude else min(mapRect.left, longitude) + mapRect.right = max(mapRect.right, longitude) + mapRect.bottom = if(mapRect.bottom == 0.0) latitude else min(mapRect.bottom, latitude) + mapRect.top = max(mapRect.top, latitude) val title = marker.getName(app) val markerColor = MapMarker.getColorId(marker.colorIndex) val icon = CarIcon.Builder( @@ -77,6 +89,10 @@ class MapMarkersScreen( } listBuilder.addItem(rowBuilder.build()) } + if (mapRect.left != 0.0 && mapRect.right != 0.0 && mapRect.top != 0.0 && mapRect.bottom != 0.0) { + val tb: RotatedTileBox = app.osmandMap.mapView.currentRotatedTileBox.copy() + app.osmandMap.mapView.fitRectToMap(mapRect.left, mapRect.right, mapRect.top, mapRect.bottom, tb.pixWidth, tb.pixHeight, 0) + } val actionStripBuilder = ActionStrip.Builder() actionStripBuilder.addAction( Action.Builder() diff --git a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt index 8719bc0e147..d01b91f60f3 100644 --- a/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/POIScreen.kt @@ -20,6 +20,8 @@ import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleOwner import net.osmand.data.Amenity import net.osmand.data.LatLon +import net.osmand.data.QuadRect +import net.osmand.data.RotatedTileBox import net.osmand.plus.R import net.osmand.plus.poi.PoiUIFilter import net.osmand.plus.render.RenderingIcons @@ -30,6 +32,8 @@ import net.osmand.search.core.SearchPhrase import net.osmand.search.core.SearchResult import net.osmand.util.Algorithms import net.osmand.util.MapUtils +import kotlin.math.max +import kotlin.math.min class POIScreen( carContext: CarContext, @@ -45,6 +49,7 @@ class POIScreen( override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) app.osmandMap.mapLayers.poiMapLayer.setCustomMapObjects(null) + app.osmandMap.mapView.backToLocation() } }) } @@ -91,13 +96,20 @@ class POIScreen( private fun setupPOI(listBuilder: ItemList.Builder, searchResults: List?) { val location = app.settings.lastKnownMapLocation val mapPoint = ArrayList() + val mapRect = QuadRect() searchResults?.let { val searchResultsSize = searchResults.size val limitedSearchResults = searchResults.subList(0, searchResultsSize.coerceAtMost(contentLimit - 1)) for (point in limitedSearchResults) { if (point.`object` is Amenity) { - mapPoint.add(point.`object` as Amenity) + val amenity = point.`object` as Amenity + mapPoint.add(amenity) + val amenityLocation = amenity.location + mapRect.left = if(mapRect.left == 0.0) amenityLocation.longitude else min(mapRect.left, amenityLocation.longitude) + mapRect.right = max(mapRect.right, amenityLocation.longitude) + mapRect.bottom = if(mapRect.bottom == 0.0) amenityLocation.latitude else min(mapRect.bottom, amenityLocation.latitude) + mapRect.top = max(mapRect.top, amenityLocation.latitude) } val title = point.localeName var groupIcon = RenderingIcons.getBigIcon(app, group.iconId) @@ -129,6 +141,10 @@ class POIScreen( .build()) } } + if (mapRect.left != 0.0 && mapRect.right != 0.0 && mapRect.top != 0.0 && mapRect.bottom != 0.0) { + val tb: RotatedTileBox = app.osmandMap.mapView.currentRotatedTileBox.copy() + app.osmandMap.mapView.fitRectToMap(mapRect.left, mapRect.right, mapRect.top, mapRect.bottom, tb.pixWidth, tb.pixHeight, 0) + } app.osmandMap.mapLayers.poiMapLayer.setCustomMapObjects(mapPoint) } diff --git a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt index a93cd6e7f7e..d2055954b20 100644 --- a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt @@ -9,6 +9,8 @@ import androidx.car.app.navigation.model.PlaceListNavigationTemplate import androidx.core.graphics.drawable.IconCompat import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner +import net.osmand.data.QuadRect +import net.osmand.data.RotatedTileBox import net.osmand.gpx.GPXUtilities import net.osmand.plus.R import net.osmand.plus.configmap.tracks.TrackItem @@ -22,6 +24,8 @@ import net.osmand.search.core.ObjectType import net.osmand.search.core.SearchResult import net.osmand.util.Algorithms import net.osmand.util.MapUtils +import kotlin.math.max +import kotlin.math.min class TracksScreen( carContext: CarContext, @@ -46,6 +50,7 @@ class TracksScreen( super.onDestroy(owner) loadGpxFilesThread?.interrupt() app.osmandMap.mapLayers.gpxLayer.setCustomMapObjects(null) + app.osmandMap.mapView.backToLocation() } }) } @@ -109,10 +114,16 @@ class TracksScreen( val selectedGpxFiles = ArrayList() val tracks = trackTab.trackItems.subList(0, tracksSize.coerceAtMost(contentLimit - 1)) + val mapRect = QuadRect() for (track in tracks) { val gpxFile = loadedGpxFiles[track] gpxFile?.let { selectedGpxFiles.add(it) + val gpxRect: QuadRect = it.gpxFile.rect + mapRect.left = if(mapRect.left == 0.0) gpxRect.left else min(mapRect.left, gpxRect.left) + mapRect.right = max(mapRect.right, gpxRect.right) + mapRect.top = max(mapRect.top, gpxRect.top) + mapRect.bottom = if(mapRect.bottom == 0.0) gpxRect.bottom else min(mapRect.bottom, gpxRect.bottom) } val title = track.name val icon = CarIcon.Builder( @@ -143,6 +154,10 @@ class TracksScreen( .setOnClickListener { onClickTrack(track) } .build()) } + if (mapRect.left != 0.0 && mapRect.right != 0.0 && mapRect.top != 0.0 && mapRect.bottom != 0.0) { + val tb: RotatedTileBox = app.osmandMap.mapView.currentRotatedTileBox.copy() + app.osmandMap.mapView.fitRectToMap(mapRect.left, mapRect.right, mapRect.top, mapRect.bottom, tb.pixWidth, tb.pixHeight, 0) + } app.osmandMap.mapLayers.gpxLayer.setCustomMapObjects(selectedGpxFiles) templateBuilder.setItemList(listBuilder.build()) } From be40bed4ed1b1a8cc24fc96cf917bb89a734e204 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Fri, 23 Jun 2023 13:09:31 +0300 Subject: [PATCH 038/214] Restored tests --- .../java/net/osmand/router/RouteResultPreparationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java index 3813a4705a7..1e92281e25f 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationTest.java @@ -31,7 +31,7 @@ * Created by yurkiss on 04.03.16. */ -//@RunWith(Parameterized.class) +@RunWith(Parameterized.class) public class RouteResultPreparationTest { private final TestEntry te; @@ -73,7 +73,7 @@ public static Collection data() throws IOException { } -// @Test + @Test public void testLanes() throws Exception { NativeLibrary nativeLibrary = null; boolean useNative = isNative() && getNativeLibPath() != null && !te.isIgnoreNative(); From 0764448049c1d9e72395af00e5ecd93416eb1b7e Mon Sep 17 00:00:00 2001 From: alisa911 Date: Fri, 23 Jun 2023 15:27:30 +0300 Subject: [PATCH 039/214] add useLimit, change immediateSearch --- .../java/net/osmand/search/SearchUICore.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index ad42cb131cc..8ae14e764c0 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -97,6 +97,7 @@ public static boolean isDebugMode() { public static class SearchResultCollection { private final List searchResults = new ArrayList<>(); private SearchPhrase phrase; + private boolean useLimit; private static final int DEPTH_TO_CHECK_SAME_SEARCH_RESULTS = 20; public SearchResultCollection(SearchPhrase phrase) { @@ -109,6 +110,14 @@ public SearchResultCollection combineWithCollection(SearchResultCollection colle src.addSearchResults(collection.searchResults, resort, removeDuplicates); return src; } + + public boolean getUseLimit() { + return this.useLimit; + } + + public void setUseLimit(boolean useLimit) { + this.useLimit = useLimit; + } public SearchResultCollection addSearchResults(List sr, boolean resortAll, boolean removeDuplicates) { if (SearchUICore.isDebugMode()) { @@ -480,13 +489,18 @@ public SearchPhrase resetPhrase(String text) { } public SearchResultCollection immediateSearch(final String text, final LatLon loc) { - searchSettings = searchSettings.setOriginalLocation(loc); - final SearchPhrase phrase = this.phrase.generateNewPhrase(text, searchSettings); - final SearchResultMatcher rm = new SearchResultMatcher(null, phrase, requestNumber.get(), requestNumber, totalLimit); - searchInternal(phrase, rm); - SearchResultCollection collection = new SearchResultCollection(phrase); - collection.addSearchResults(rm.getRequestResults(), true, true); - return collection; + if (loc != null) { + searchSettings = searchSettings.setOriginalLocation(loc); + } + final SearchPhrase searchPhrase = this.phrase.generateNewPhrase(text, searchSettings); + final SearchResultMatcher rm = new SearchResultMatcher(null, searchPhrase, requestNumber.get(), requestNumber, totalLimit); + searchInternal(searchPhrase, rm); + SearchResultCollection resultCollection = new SearchResultCollection(searchPhrase); + if (rm.count > rm.totalLimit) { + resultCollection.setUseLimit(true); + } + resultCollection.addSearchResults(rm.getRequestResults(), true, true); + return resultCollection; } public void search(final String text, final boolean delayedExecution, final ResultMatcher matcher) { From b1887e60ac094e43ce8f526507cfa10eb2960fbf Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 23 Jun 2023 06:45:45 +0000 Subject: [PATCH 040/214] Translated using Weblate (Indonesian) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-in/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-in/strings.xml b/OsmAnd/res/values-in/strings.xml index db3bbd02d70..c66c7646bfa 100644 --- a/OsmAnd/res/values-in/strings.xml +++ b/OsmAnd/res/values-in/strings.xml @@ -5245,4 +5245,8 @@ RPM Izinkan melalui ferrata Tutup dialog + Miliki dan amati model skala lingkungan Anda atau seluruh benua. + Mode bebas + Relief 3D + Peta medan \ No newline at end of file From 500022d386b7d713d825583d76a9cb3ad533d070 Mon Sep 17 00:00:00 2001 From: ssantos Date: Thu, 22 Jun 2023 16:13:59 +0000 Subject: [PATCH 041/214] Translated using Weblate (Portuguese) Currently translated at 99.9% (4722 of 4723 strings) --- OsmAnd/res/values-pt/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index 623c35e82b1..06d9cd93c1a 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -5244,4 +5244,7 @@ Permitir via ferrata Watts Fechar o ecrã + Mapa do terreno + Relevo 3D + Modo livre \ No newline at end of file From 83a385420c4615af0b3880b1208e3fedcc11a420 Mon Sep 17 00:00:00 2001 From: MarioSwitch Date: Thu, 22 Jun 2023 10:34:07 +0000 Subject: [PATCH 042/214] Translated using Weblate (French) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-fr/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index cfc07a1da2a..3acab273f94 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -5231,4 +5231,8 @@ RPM Autoriser les via ferrata Fermer la fenêtre + Mode libre + Relief 3D + Carte du relief + Possédez et observez la maquette de votre quartier ou du continent tout entier. \ No newline at end of file From 32cce3199e42c5061f14ced2231b4665239e04ea Mon Sep 17 00:00:00 2001 From: ssantos Date: Thu, 22 Jun 2023 16:16:06 +0000 Subject: [PATCH 043/214] Translated using Weblate (German) Currently translated at 99.9% (4722 of 4723 strings) --- OsmAnd/res/values-de/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 045d1c56597..ff93be32a17 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -5244,4 +5244,7 @@ Klettersteige zulassen Dialogfeld schließen Standard: Seezeichenname (Leuchtfeuer.Gruppe.Periode), Auswahl zusätzlicher Informationen zu den Sektoren 1 bis 3 oder Sektor 1,2,3,4,5 Leuchtfeuer + Freier Modus + Geländekarte + 3D-Relief \ No newline at end of file From 01ef95fed2ccde11ec9e405884fccd8ff31a83f1 Mon Sep 17 00:00:00 2001 From: "B. Hammer" <600xxxx@gmail.com> Date: Thu, 22 Jun 2023 14:11:11 +0000 Subject: [PATCH 044/214] Translated using Weblate (Russian) Currently translated at 98.8% (4667 of 4723 strings) --- OsmAnd/res/values-ru/strings.xml | 100 +++++++++++++++---------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index ce01763c7f8..30e29fa2d70 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -81,7 +81,7 @@ Не отсылать анонимную статистику использования Авто Правостороннее движение - Отображаемые + На карте Восстановить покупки Шрифты карты Анализ на карте @@ -100,7 +100,7 @@ Добавить пункт назначения Заменить пункт назначения Первый промежуточный пункт - Добавление нового пункта назначения в центре экрана. Ранее выбранный пункт назначения станет последним промежуточным пунктом. + Добавление нового пункта назначения в центре экрана. Ранее выбранный конечный пункт станет последним промежуточным. Кнопка для установки центра экрана пунктом отправления. Затем нужно будет выбрать пункт назначения или запустить расчёт маршрута. Кнопка для установки центра экрана пунктом назначения с заменой предыдущего (если был задан). Установка центра экрана местом первой остановки на маршруте. @@ -1162,8 +1162,8 @@ Достопримечательности Последний промежуточный пункт Первый промежуточный пункт - Последний промежуточный пункт - Первый промежуточный пункт + Добавить перед конечным пунктом + Добавить в начало маршрута Заменить пункт назначения Пункт назначения уже задан: Пункт %1$s @@ -1191,7 +1191,7 @@ Плагин Dropbox Фото %1$s %2$s Медиаданные - Остановить навигацию\? + Завершение навигации Удалить пункт назначения (и промежуточные пункты)\? Точный маршрут (альфа) Пожертвуйте, чтобы увидеть новые функции реализованными в приложении. @@ -1246,7 +1246,7 @@ Начать новый подтрек Имя файла GPX Файл GPX сохранён в {0} - Инструмент расчёта дистанции и планирования + Калькулятор расстояний и средство планирования Оптимальный порядок точек маршрута по пути к месту назначения. Не удалось выполнить резервное копирование изменений OSM. Резервное копирование как правка OSM @@ -1260,7 +1260,7 @@ Другие Контурные линии Загрузка… - Построение маршрутов нажатием на карту или с использованием/редактированием существующих файлов GPX для планирования маршрута и измерения расстояния между точками. Результат может быть сохранен в виде файла GPX для последующего использования для навигации. + Создание маршрутов нажатием на карту или используя существующие GPX-файлы для конструирования и расчёта расстояний между точками. Результат можно сохранить в GPX и использовать для навигации. Пункт назначения Сначала установите город или улицу Пункт назначения %1$s @@ -1336,7 +1336,7 @@ Без грунтовых дорог Избегать грунтовых дорог Без паромов - Избегать паромные переправы + Избегать паромных переправ Масса Укажите допустимый предел массы автомобиля для учёта при построении маршрута. Отображение карты @@ -1365,7 +1365,7 @@ Задать пункт назначения Предпочтения маршрута Информация про маршрут - Добавить пункт назначения + Добавить в конец маршрута Использовать показанный путь для навигации? Рассчитать сегмент маршрута OsmAnd без интернета Рассчитать маршрут OsmAnd для первого и последнего сегмента маршрута @@ -1593,7 +1593,7 @@ Маршруты автобусов Маршруты трамваев и поездов Скрыть - Избегать дорог… + Исключить дороги… %1$s необходимо это разрешение, чтобы выключить экран для экономии энергии. Автовключение экрана перед поворотом Включать экран перед поворотом (если выключен). @@ -1749,7 +1749,7 @@ Посетить до Туристическая карта просрочено - Укажите время ожидания на экране планирования маршрута. + Укажите время ожидания на экране составления маршрута. Начать пошаговое ведение через… Поехали Расширяет возможности OsmAnd, делая доступными морские карты для катания на лодках, парусного спорта и других видов спорта. @@ -1988,7 +1988,7 @@ Первый запуск Как загрузить карты, установить основные настройки. Настройки навигации. - Планирование маршрута при навигации + Самостоятельное составление маршрута Страна Новая версия Первые шаги с OsmAnd @@ -2117,7 +2117,7 @@ Переместить ↑ Переместить ↓ Завершить навигацию - Избегать дорог + Исключить из маршрута Публичное имя Поддерживаемый регион Введите публичное имя @@ -2209,7 +2209,7 @@ Поиск карт… Выберите другой регион Пропустить загрузку карт - У вас нет загруженных карт. Вы можете загрузить карту из списка или сделать это позже («Меню — %1$s»). + Офлайн-карты не загружены. Можете загрузить из списка сейчас или позже («Меню — %1$s»). Мили/метры Получить за %1$s Получить @@ -2341,7 +2341,7 @@ Вчера За последние 7 дней В этом году - Планирование маршрута + Составление маршрута Ввод координат Переместить в историю Группа будет выключена при следующем запуске приложения. @@ -2357,7 +2357,7 @@ Моё местоположение Финиш Сортировка - Экспорт маркеров в следующий файл GPX: + Экспорт маркеров в GPX-файл: Маркеры Изменить заметку Править OSM-заметку @@ -2632,12 +2632,12 @@ Копировать местоположение/название POI Место без названия Текущий - Добавить промежуточную остановку - Сделать начальной остановкой маршрута - Текущий пункт назначения станет последним промежуточным пунктом + Сделать последним промежуточным пунктом + Сделать первым промежуточным пунктом + Текущий конечный пункт станет последним промежуточным Показать закрытые заметки Показать/скрыть заметки OSM на карте. - GPX — подходит для экспорта в JOSM и другие OSM редакторы. + GPX — подходит для экспорта в JOSM и другие OSM-редакторы. OSC — подходит для экспорта в OpenStreetMap. Файл GPX OSC файл @@ -2823,9 +2823,9 @@ Точки интереса (POI) Расчёт маршрута… Общественный транспорт - Выберите на карте или в списке ниже дорогу, которой хотите избежать при навигации: + Для исключения из маршрута выберите конкретную дорогу на карте либо типы дорог в списке ниже: Моделировать навигацию - Выберите файл трека для следования + Выберите файл трека для ведения Речевые указания Переключатель между дневным и ночным режимами для OsmAnd. Дневной режим @@ -2923,17 +2923,17 @@ Изменить, в чём измеряется азимут. Градусы Без трамваев - Избегать трамваи + Избегать трамваев Без автобусов - Избегать автобусы и троллейбусы - Без маршрутных такси - Избегать маршрутные такси + Избегать автобусов и троллейбусов + Без маршруток + Избегать маршрутных такси Без поездов - Избегать поезда + Избегать поездов Без метро - Избегать метро и легкорельсовый транспорт + Избегать метро и легкорельсового транспорта Без паромов - Избегать паромы + Избегать паромов Отправить лог К сожалению, OsmAnd не смог найти подходящий маршрут. Попробуйте пройти навигацию пешком. @@ -3360,7 +3360,7 @@ Вы можете выбрать дополнительные данные для экспорта вместе с профилем. Приложение по умолчанию (%s) Не перестраивать - Отклонение для перестроения маршрута + При отклонении Маршрут будет пересчитан, если расстояние до него больше заданного параметра Пользовательский профиль Угол: %s° @@ -3396,7 +3396,7 @@ Ваши OSM-заметки находятся в %1$s. Видеозаметки Фотозаметки - Пересчёт маршрута + Перестроение маршрута Имя пользователя и пароль Эти настройки плагина применяются ко всем профилям Редактирование OSM @@ -3444,8 +3444,8 @@ Объекты добавлены Импорт завершен Все данные из %1$s импортированы, вы можете использовать кнопки ниже, чтобы открыть соответствующий раздел приложения для управления ими. - Предельно допустимое отдаление от маршрута, после которого маршрут перестроится. - Пороговое отклонение для пересчёта маршрута. + Предельно допустимое удаление от маршрута, после которого маршрут будет перестроен. + Автоперестроение маршрута при сходе с него. Легенда Невозможно разобрать геоссылку «%s». Для затенения рельефа требуются дополнительные карты. @@ -3453,7 +3453,7 @@ Способы отображения рельефа местности: посредством отмывки (затенение рельефа) или цветов (карта уклонов). Подробнее об этих типах карт вы можете прочитать на нашем сайте. Прозрачность Уровни масштаба - Пересчитывать маршрут при отклонении + Пересчёт маршрута при отклонении %1$s из %2$s Настройка минимального и максимального уровней масштабирования, при которых слой будет отображаться. Переключатель для отображения или скрытия слоя рельефа (отмывки) на карте. @@ -3690,7 +3690,7 @@ Добавить к треку Для продолжения задайте рабочие дни Маршрут между точками - Планирование маршрута + Составить маршрут Выберите способ разбиения: по времени или по расстоянию. Выберите интервал, через который будут отображаться метки с расстоянием или временем на треке. Своё значение @@ -3717,7 +3717,7 @@ Весь трек Выберите, как соединять точки: прямой линией или строить маршрут по заданному профилю. При обратном направлении - Отменить все изменения в запланированном маршруте\? + Отменить все изменения в составленном маршруте\? Фото с улиц Сохранить как новый файл трека Добавить в файл трека @@ -3733,9 +3733,9 @@ Добавить путевую точку Запись маршрута Сохранить как файл трека - Следовать по маршруту - Выберите файл маршрута для навигации - Выберите файл трека или импортируйте его со своего устройства. + Навигация по треку + Выберите сохранённый трек для навигации + Выберите трек или импортируйте его из файла на устройстве. Выбрать другой трек Ведение от моей позиции к треку Точка для навигации @@ -3768,7 +3768,7 @@ сохранён Добавьте хотя бы две точки. Повторить - • Обновлённая функция планирования маршрута позволяет применять к сегментам разные режимы навигации и настраивать привязку к дорогам + • Обновлённая функция составления маршрута позволяет применять к сегментам разные режимы навигации и настраивать привязку к дорогам \n \n • Новые настройки вида треков: выбор цвета и толщины линии, указатели направления, метки начала и конца маршрута \n @@ -3889,7 +3889,7 @@ Разрешить пересыхающие водные пути • Добавлена возможность экспорта и импорта всех данных, включая настройки, ресурсы, мои места. \n -\n• Планирование маршрута: графики для сегментов трека с маршрутом, добавлена возможность создавать и редактировать несколько сегментов трека. +\n• Составление маршрута: графики для сегментов трека с маршрутом, добавлена возможность создавать и редактировать несколько сегментов трека. \n \n• Добавлен OAuth метод аутентификации для OpenStreetMap, улучшен интерфейс диалоговых OSM. \n @@ -4040,7 +4040,7 @@ Годовая подписка • Добавлена возможность загрузить контурные линии в футах. \n -\n• Планирование маршрута: добавлены вкладки для переключения между точками и графиками. +\n• Составление маршрута: добавлены вкладки для переключения между точками и графиками. \n \n• Обновления OsmAnd Live перемещены в «Загрузка карт» → «Обновления». \n @@ -4158,7 +4158,7 @@ История версий Удалить историю изменений для отключенных типов данных из OsmAnd Cloud\? Удалить историю версий - Избегать тоннели + Избегать тоннелей Без тоннелей Отправить журнал сбоев Отправить logcat @@ -4221,7 +4221,7 @@ \n \n• Расстояние по нажатию перемещено из радиус-линейки в отдельный параметр \n -\n• Планирование маршрута: добавлена возможность изменения параметров навигации, доступ к настройке карты и поиску без выхода из планирования маршрута +\n• Составление маршрута: добавлена возможность изменения параметров навигации, доступ к настройке карты и поиску, не покидая конструктор маршрутов \n \n• Новый экран «Покупка» с подробной информацией о планах \n @@ -4350,7 +4350,7 @@ \n \n• Избранные: добавлена возможность просмотра недавно использованных значков \n -\n• Планирование маршрута: после запуска будет использоваться выбранный профиль +\n• Составление маршрута: после запуска будет использоваться выбранный профиль \n \n• Исправлен слой Mapillary, плагин теперь отключен по умолчанию \n @@ -4651,7 +4651,7 @@ Окружности-расстояния Окраска окружностей Без автомагистралей - Избегать автомагистрали + Избегать автомагистралей Разрешить доступ грузовых автомобилей на частную территорию. Продолжительность Подъём @@ -4663,7 +4663,7 @@ Въезд на частную территорию (грузовик) Изобары Изотермы - Избегать броды + Избегать бродов Сложность конных маршрутов Спуск Истинный пеленг @@ -4712,7 +4712,7 @@ Вы можете переключить режим, нажав на виджет. Сбросить все настройки по умолчанию\? Применяется только к грузовым автомобилям грузоподъемностью не более 3,5 тонн. - Дороги, закрытые для доставки грузов, будут избегаться. + Дороги, закрытые для доставки грузов, будут исключаться. Расчётное время прибытия Второй маркер Укажите временной интервал для усреднения скорости (используется для оценки времени прибытия). @@ -4773,7 +4773,7 @@ Удалить группу «%1$s» и все включённые в неё точки (%2$d)\? Удалить группу Карта высот - Отображать позицию + Позиция на экране Координаты: текущее местоположение Внешние датчики Координаты: центр карты @@ -5046,7 +5046,7 @@ Переключить папку Показать все треки На карте - Зависит от ориентации карты: для «по направления движения» - внизу, для всех остальных - по центру. + Зависит от ориентации карты: для «по направлению движения» — внизу, для всех остальных — по центру. Минимальное значение - %1$s тонн. Используйте профиль «%2$s», если масса автомобиля меньше минимального значения. Beep: complex loud Beep: minimal From 500e983462812c6024c0722547c60cf2f50d7ca9 Mon Sep 17 00:00:00 2001 From: Evgenii Martynenko Date: Thu, 22 Jun 2023 10:33:25 +0000 Subject: [PATCH 045/214] Translated using Weblate (Russian) Currently translated at 98.8% (4667 of 4723 strings) --- OsmAnd/res/values-ru/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 30e29fa2d70..0506843ddff 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -5234,4 +5234,6 @@ Устройство [%1$s] подключено Результат вычислений пуст Закрыть диалог + 3D-рельеф + Карта рельефа \ No newline at end of file From 13a0f69e24984a63cb4794fbba6f36e781d10fd4 Mon Sep 17 00:00:00 2001 From: 99 efi Date: Thu, 22 Jun 2023 08:33:37 +0000 Subject: [PATCH 046/214] Translated using Weblate (Hungarian) Currently translated at 99.9% (4722 of 4723 strings) --- OsmAnd/res/values-hu/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 565c0afca90..9a78a3ff5ce 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -5233,4 +5233,8 @@ Tervezés mászóutakon keresztül is. Mászóút engedélyezése Párbeszédpanel bezárása + 3D domborzat + Terep térkép + Sajátítsd el és figyeld meg a környéked vagy az egész kontinens makettjét. + Szabad mód \ No newline at end of file From 2d7d27669a1a6e26b9ced323c633d0fb6a63cc03 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 22 Jun 2023 12:32:16 +0000 Subject: [PATCH 047/214] Translated using Weblate (Ukrainian) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-uk/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 8a491c34a34..d5b476ad480 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -5247,4 +5247,8 @@ Ватт об/хв Закрити діалогове вікно + Мапа рельєфу + 3D-рельєф + Вільний режим + Придбайте та спостерігайте за масштабною моделлю вашого району або цілого континенту. \ No newline at end of file From 574d41dd2a689db6fe5e94ade4f71d15ef633fa4 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 23 Jun 2023 10:14:47 +0000 Subject: [PATCH 048/214] Translated using Weblate (Spanish) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-es/strings.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 9927d468205..4891abcb6f3 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -131,7 +131,7 @@ Descarga los datos («sin conexión») para usar los mapas sin conexión. " \n -\nPulsación larga para las opciones" +\nToque largo para opciones" Versión local %1$d de %2$d elemento(s) desactivado(s). %1$d de %2$d elemento(s) borrado(s). @@ -1205,7 +1205,7 @@ Cargando %1$s… " \n -\nPulsación larga para ver en el mapa" +\nToque largo para ver en el mapa" Iniciar automáticamente la navegación giro a giro marcado(s) Intervalo de división @@ -2030,7 +2030,7 @@ Muestra una notificación del sistema que permite iniciar la grabación de viaje. Viaje Grabado - Grabar + Registro Esquema de color para las curvas de nivel Velocidad mínima del registro Filtro: No registrar puntos por debajo de esta velocidad. @@ -3684,7 +3684,7 @@ Sólo se guardará la línea de la ruta, los puntos de referencia serán borrados. Nombre del archivo Se muestran %s trazas - Grabar + REC Intervalo de registro para la grabación general de trazas (activado desde el widget «Grabación de viaje» en el mapa). Pausar grabación de viaje Reanudar grabación de viaje @@ -5240,4 +5240,8 @@ RPM Permitir vía férrea Cerrar el cuadro del diálogo + Modo libre + Relieve en 3D + Mapa del terreno + Posee y observa la maqueta a escala de tu barrio o de todo el continente. \ No newline at end of file From 0f3fccdad35f5970e4ccd526fec9f2adb4a47320 Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Thu, 22 Jun 2023 08:11:57 +0000 Subject: [PATCH 049/214] Translated using Weblate (Danish) Currently translated at 99.9% (4722 of 4723 strings) --- OsmAnd/res/values-da/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 1609982d7f6..ed2c179bae2 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -5001,7 +5001,7 @@ Alle ændringer foretaget på denne enhed er synkroniseret med OsmAnd Cloud. Der er ingen konflikter. Download cloud-version - Synkronisering...%1$s + Synkroniserer...%1$s Fillisten kunne ikke hentes fra serveren. Import/eksport Ændret fil @@ -5247,4 +5247,5 @@ Luk dialogen 3D-relief Terrænkort + Ej og observer skalamodellen af dit nabolag eller hele kontinentet. \ No newline at end of file From b077503ab94d8db5e29aa099f6d5a1dd29ec7f93 Mon Sep 17 00:00:00 2001 From: Softmap Date: Fri, 23 Jun 2023 09:57:37 +0000 Subject: [PATCH 050/214] Translated using Weblate (Arabic) Currently translated at 99.9% (4719 of 4723 strings) --- OsmAnd/res/values-ar/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 1d85c4ccf52..2ea0af9d983 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -5307,4 +5307,7 @@ واتس .RPM إغلاق مربع الحوار + الوضع الحر + خريطة التضاريس + امتلك وراقب نموذج مقياس لمنطقتك أو القارة بأكملها. \ No newline at end of file From a22cb60e62914c0f0ba9a79812918914465c027d Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Thu, 22 Jun 2023 08:14:16 +0000 Subject: [PATCH 051/214] Translated using Weblate (Danish) Currently translated at 83.9% (3852 of 4587 strings) --- OsmAnd/res/values-da/phrases.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values-da/phrases.xml b/OsmAnd/res/values-da/phrases.xml index 485aeadb2f1..3c0450a2c20 100644 --- a/OsmAnd/res/values-da/phrases.xml +++ b/OsmAnd/res/values-da/phrases.xml @@ -1720,7 +1720,7 @@ Brokonstruktion: pontonbro Brokonstruktion: buet bro Brokonstruktion: skråstagsbro - Brokonstruktion: havnepromenade + Brokonstruktion: plankebro Brokonstruktion: simpel træbro Brokonstruktion: viadukt Brokonstruktion: akvædukt @@ -3808,10 +3808,10 @@ Elevator Nøddebutik Bikube - Tidsplan - Realtid - Forsinkelse - Ja + Tidsplan;afgangstavle + Realtid;afgangstavle + Forsinkelse;afgangstavle + Ja;afgangstavle Afgangstavle: nej Små elektriske apparater Afgangstavle @@ -4019,4 +4019,5 @@ Varmt vand: ja Varmt vand: nej Vandsportsbutik + Tavletitel \ No newline at end of file From fa9873a428f34bbd5066d546fb67f5d4010893e2 Mon Sep 17 00:00:00 2001 From: Franco Date: Thu, 22 Jun 2023 21:25:27 +0000 Subject: [PATCH 052/214] Translated using Weblate (Spanish (Argentina)) Currently translated at 99.9% (4722 of 4723 strings) --- OsmAnd/res/values-es-rAR/strings.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index c1de4bd2853..4273f925532 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -389,7 +389,7 @@ \n \nVéase - https://osmand.net/docs/user/plugins/trip-recording . Complemento de curvas de nivel - La información del terreno, como las curvas de nivel, los sombreados y las pendientes, ayudan a evaluar visualmente la disposición del terreno y el relieve, la navegabilidad y más. La información topográfica en un mapa puede representarse mediante el sombreado de la pendiente, las curvas de nivel y/o el color de la inclinación. + La información topográfica, como las curvas de nivel, los sombreados y las pendientes, ayudan a evaluar visualmente la disposición del terreno y el relieve, la navegabilidad y más. La información topográfica en un mapa puede representarse mediante el sombreado de la pendiente, las curvas de nivel y/o el color de la inclinación. \n \nLos datos subyacentes provienen de SRTM y ASTER. \n @@ -3458,7 +3458,7 @@ Muestra los sombreados o pendientes en el mapa. Más información sobre estos tipos de mapas en nuestro sitio. Sombreado Pendientes - Un botón que muestra u oculta la capa del terreno en el mapa. + Un botón que muestra u oculta la capa topográfica en el mapa. Borrar descripción Añadir descripción Elegir grupo @@ -4164,10 +4164,10 @@ Obtén OsmAnd Cloud para almacenar en línea todos los datos de OsmAnd. No pierdes los datos al reinstalar. Haz copias de seguridad y restaura toda la información fácilmente. Descargas de mapas ilimitadas Wikipedia y Wikiviajes sin conexión - Mapas del terreno: curvas de nivel, sombreados, pendiente + Mapas topográficos: curvas de nivel, sombreados, pendiente Wikipedia sin conexión Wikiviajes sin conexión - Mapas del terreno + Mapas topográficos Profundidad náutica Consigue «%1$s» como parte del plan %2$s. Comparación: %1$s o %2$s @@ -5255,4 +5255,8 @@ Vatios (watts) RPM Cerrar el diálogo + Mapa topográfico + Modo libre + Relieve 3D + Obtén y observa el modelo a escala de tu barrio o de todo el continente. \ No newline at end of file From 4746a9d70757bcd6ce137bf6460c07740d221c55 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Fri, 23 Jun 2023 02:25:50 +0000 Subject: [PATCH 053/214] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.9% (4720 of 4723 strings) --- OsmAnd/res/values-pt-rBR/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 3ee3cc03e04..9cfa789db92 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -5231,4 +5231,8 @@ Emparelhar sensor Bluetooth LE Pressão do punho Emparelhar + Fechar tela + Modo livre + Relevo 3D + Mapa do terreno \ No newline at end of file From 766d5ca266a1f9c2a04a4eb7ee66cb6f5e0eb1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=98=86Verdulo?= Date: Thu, 22 Jun 2023 13:06:51 +0000 Subject: [PATCH 054/214] Translated using Weblate (Esperanto) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-eo/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 04c50c3e77d..6948be26314 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -187,7 +187,7 @@ Rusujo Afriko Azio - Aŭstralio kaj Oceanio + Oceanio Mondaj kaj temaj mapoj Movi ↑ Movi ↓ @@ -5235,4 +5235,8 @@ Rivoluoj/min Permesi viaferataojn Fermi la fenestron + 3-dimensia reliefo + Libera reĝimo + Terena mapo + Havigu kaj vidu skalitan modelon de via najbaraĵo aŭ de la tuta kontinento. \ No newline at end of file From 83888a7cbb8605124901d76bf31a2fa8d7aef732 Mon Sep 17 00:00:00 2001 From: alisa911 Date: Fri, 23 Jun 2023 16:50:45 +0300 Subject: [PATCH 055/214] add totallimit -1 --- OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index 8ae14e764c0..9d75d392b70 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -496,7 +496,7 @@ public SearchResultCollection immediateSearch(final String text, final LatLon lo final SearchResultMatcher rm = new SearchResultMatcher(null, searchPhrase, requestNumber.get(), requestNumber, totalLimit); searchInternal(searchPhrase, rm); SearchResultCollection resultCollection = new SearchResultCollection(searchPhrase); - if (rm.count > rm.totalLimit) { + if (totalLimit != -1 && rm.count > rm.totalLimit) { resultCollection.setUseLimit(true); } resultCollection.addSearchResults(rm.getRequestResults(), true, true); From 1da36e95e64cc8938c7748425c1411d23a8ff7c0 Mon Sep 17 00:00:00 2001 From: alisa911 Date: Fri, 23 Jun 2023 17:34:18 +0300 Subject: [PATCH 056/214] add useLimit --- .../java/net/osmand/search/SearchUICore.java | 16 ++++++++++++---- .../router/RouteResultPreparationNativeTest.java | 3 +++ .../osmand/router/RouteTestingNativeTest.java | 3 +++ .../java/net/osmand/search/SearchUICoreTest.java | 4 ++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index 9d75d392b70..7a769aea22e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -355,6 +355,9 @@ public SearchResultCollection shallowSearch(Class c api.search(sphrase, rm); SearchResultCollection collection = new SearchResultCollection(sphrase); + if (rm.totalLimit != -1 && rm.count > rm.totalLimit) { + collection.setUseLimit(true); + } collection.addSearchResults(rm.getRequestResults(), resortAll, removeDuplicates); if (debugMode) { LOG.info("Finish shallow search <" + sphrase + "> Results=" + rm.getRequestResults().size()); @@ -496,7 +499,7 @@ public SearchResultCollection immediateSearch(final String text, final LatLon lo final SearchResultMatcher rm = new SearchResultMatcher(null, searchPhrase, requestNumber.get(), requestNumber, totalLimit); searchInternal(searchPhrase, rm); SearchResultCollection resultCollection = new SearchResultCollection(searchPhrase); - if (totalLimit != -1 && rm.count > rm.totalLimit) { + if (rm.totalLimit != -1 && rm.count > rm.totalLimit) { resultCollection.setUseLimit(true); } resultCollection.addSearchResults(rm.getRequestResults(), true, true); @@ -566,6 +569,9 @@ public boolean isCancelled() { if (debugMode) { LOG.info("Current data filtered <" + phrase + "> Results=" + quickRes.searchResults.size()); } + if (rm.totalLimit != -1 && rm.count > rm.totalLimit) { + quickRes.setUseLimit(true); + } if (!rm.isCancelled()) { currentSearchResult = quickRes; rm.filterFinished(phrase); @@ -584,8 +590,10 @@ public boolean isCancelled() { } searchInternal(phrase, rm); if (!rm.isCancelled()) { - SearchResultCollection collection = new SearchResultCollection( - phrase); + SearchResultCollection collection = new SearchResultCollection(phrase); + if (rm.totalLimit != -1 && rm.count > rm.totalLimit) { + collection.setUseLimit(true); + } if (debugMode) { LOG.info("Processing search results <" + phrase + ">"); } @@ -728,7 +736,7 @@ public static class SearchResultMatcher implements ResultMatcher { private final List requestResults = new ArrayList<>(); private final ResultMatcher matcher; private final int request; - private final int totalLimit; + int totalLimit; private SearchResult parentSearchResult; private final AtomicInteger requestNumber; int count = 0; diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java index 07b3a748890..b7051944707 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java @@ -1,5 +1,8 @@ package net.osmand.router; +import org.junit.Ignore; + +@Ignore public class RouteResultPreparationNativeTest extends RouteResultPreparationTest { public RouteResultPreparationNativeTest(String name, TestEntry te) { diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java index 8459770be17..49ae6fe04e8 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java @@ -1,5 +1,8 @@ package net.osmand.router; +import org.junit.Ignore; + +@Ignore public class RouteTestingNativeTest extends RouteTestingTest { public RouteTestingNativeTest(String name, TestEntry te) { diff --git a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java index 64c2db1eee1..4ded25c6bb0 100644 --- a/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/search/SearchUICoreTest.java @@ -227,6 +227,10 @@ private List getSearchResult(SearchPhrase phrase, ResultMatcher matcher.totalLimit) { + collection.setUseLimit(true); + } + return collection.getCurrentSearchResults(); } From 459dbadf1fa70a5e8a2138dbe67aa19211632476 Mon Sep 17 00:00:00 2001 From: alisa911 Date: Fri, 23 Jun 2023 17:36:29 +0300 Subject: [PATCH 057/214] fix --- .../net/osmand/router/RouteResultPreparationNativeTest.java | 2 -- .../src/test/java/net/osmand/router/RouteTestingNativeTest.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java index b7051944707..24a95e83507 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteResultPreparationNativeTest.java @@ -1,8 +1,6 @@ package net.osmand.router; -import org.junit.Ignore; -@Ignore public class RouteResultPreparationNativeTest extends RouteResultPreparationTest { public RouteResultPreparationNativeTest(String name, TestEntry te) { diff --git a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java index 49ae6fe04e8..b065b341076 100644 --- a/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/router/RouteTestingNativeTest.java @@ -1,8 +1,6 @@ package net.osmand.router; -import org.junit.Ignore; -@Ignore public class RouteTestingNativeTest extends RouteTestingTest { public RouteTestingNativeTest(String name, TestEntry te) { From 5a8d15fb6e7d3568fdb0db0960d4448ce2d3b751 Mon Sep 17 00:00:00 2001 From: chumva Date: Fri, 23 Jun 2023 17:49:06 +0300 Subject: [PATCH 058/214] Fix possible npe --- .../net/osmand/plus/importfiles/tasks/CollectTracksTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/importfiles/tasks/CollectTracksTask.java b/OsmAnd/src/net/osmand/plus/importfiles/tasks/CollectTracksTask.java index 48998d77bc2..793e86f387a 100644 --- a/OsmAnd/src/net/osmand/plus/importfiles/tasks/CollectTracksTask.java +++ b/OsmAnd/src/net/osmand/plus/importfiles/tasks/CollectTracksTask.java @@ -63,7 +63,7 @@ protected List doInBackground(Void... params) { String trackName = track.name; if (Algorithms.isEmpty(trackName)) { - name = app.getString(R.string.ltr_or_rtl_combine_via_dash, name, String.valueOf(i)); + trackName = app.getString(R.string.ltr_or_rtl_combine_via_dash, name, String.valueOf(i)); } items.add(new ImportTrackItem(selectedGpxFile, trackName, i)); } From 0e06ebe70a90213de11aab2e37a9454937ea8b7c Mon Sep 17 00:00:00 2001 From: xmd5a Date: Sat, 24 Jun 2023 15:51:38 +0300 Subject: [PATCH 059/214] Add phrases --- OsmAnd/res/values/phrases.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index c635393599b..483406adfaf 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -199,6 +199,7 @@ Accepted waste CEMT Automatic fuel dispensers;Fuel vending machine + Second hand goods Store @@ -1902,9 +1903,9 @@ Yes;Cocktails - Second-hand goods + Yes No second-hand goods - Second-hand goods only + Only Parts Dealer @@ -5151,4 +5152,9 @@ Yes + Surface: acrylic + Surface: carpet + Surface: plastic + Surface: rubber + From 8189c91854a40f99bc71fb3c1d9fa31a4b9b568a Mon Sep 17 00:00:00 2001 From: ssantos Date: Fri, 23 Jun 2023 15:35:48 +0000 Subject: [PATCH 060/214] Translated using Weblate (Portuguese) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-pt/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index 06d9cd93c1a..9f8bb930f11 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -5247,4 +5247,5 @@ Mapa do terreno Relevo 3D Modo livre + Possua e observe o modelo do seu bairro ou de todo o continente. \ No newline at end of file From 4f264dcaeef9f02c7390455f8be424877b125fc2 Mon Sep 17 00:00:00 2001 From: ssantos Date: Fri, 23 Jun 2023 15:32:58 +0000 Subject: [PATCH 061/214] Translated using Weblate (German) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-de/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index ff93be32a17..f63ba01de56 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -5247,4 +5247,5 @@ Freier Modus Geländekarte 3D-Relief + Besitzen und beobachten Sie das maßstabsgetreue Modell Ihrer Nachbarschaft oder des ganzen Kontinents. \ No newline at end of file From 4eb36ca46ff279db422427094351298ddec165fd Mon Sep 17 00:00:00 2001 From: "B. Hammer" <600xxxx@gmail.com> Date: Fri, 23 Jun 2023 21:30:03 +0000 Subject: [PATCH 062/214] Translated using Weblate (Russian) Currently translated at 98.7% (4666 of 4723 strings) --- OsmAnd/res/values-ru/strings.xml | 42 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 0506843ddff..b692faeed9d 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -786,7 +786,7 @@ Загружено Загружается список доступных регионов… Не удалось получить список регионов с https://osmand.net. - Отредактирована избранная точка + Точка из избранного отредактирована Избранные точки отсутствуют Заменить Только показать @@ -896,7 +896,7 @@ Нет Название точки Избранная - Точка «{0}» добавлена к избранным. + Точка «{0}» добавлена в избранные. Изменить Удалить из моих Удалить точку «%s» из избранных\? @@ -1563,7 +1563,7 @@ Дорожные предупреждения Выберите значение скорости, при превышении которого вы получите голосовое предупреждение. Допустимое превышение скорости - Избранная точка переименована на «%1$s», чтобы сохранить строку, содержащую эмотикон в файл. + Имя изменено на «%1$s», чтобы сохранить строку с эмотиконами в файл. Печать маршрута Введено повторяющееся название избранной точки Имя изменено на %1$s во избежание повторов. @@ -1895,7 +1895,7 @@ Тип лыжной трассы Автообновления Настройки панели управления - Карточка была скрыта + Карточка скрыта Зафиксировать POI Основные Расширенные @@ -1988,7 +1988,7 @@ Первый запуск Как загрузить карты, установить основные настройки. Настройки навигации. - Самостоятельное составление маршрута + Ручное составление маршрута Страна Новая версия Первые шаги с OsmAnd @@ -2054,7 +2054,7 @@ Данные недоступны Загруженные обновления можно удалить и вернуться к первоначальной редакции карты Добавить временной интервал - Дорога перекрыта + Нежелательный участок мор. миля уз Осталось загрузок: %1$s @@ -2117,7 +2117,7 @@ Переместить ↑ Переместить ↓ Завершить навигацию - Исключить из маршрута + Обходить Публичное имя Поддерживаемый регион Введите публичное имя @@ -2341,7 +2341,7 @@ Вчера За последние 7 дней В этом году - Составление маршрута + Составить маршрут Ввод координат Переместить в историю Группа будет выключена при следующем запуске приложения. @@ -2492,7 +2492,7 @@ \n• Карта масштабируется соответственно вашей скорости \n• Поиск места по адресу, типу (паркинг, ресторан, отель, заправка, музей и т.д.) или географическим координатам \n• Поддержка промежуточных точек маршрута -\n• Запись собственного или отправка GPX-трека и следование по нему +\n• Запись собственного или отправка GPX-трека и ведение по нему \n Карта \n• Отображает POI (точки интереса) вокруг вас @@ -2823,7 +2823,7 @@ Точки интереса (POI) Расчёт маршрута… Общественный транспорт - Для исключения из маршрута выберите конкретную дорогу на карте либо типы дорог в списке ниже: + Выберите конкретную дорогу или типы дорог, которых хотите избежать при навигации: Моделировать навигацию Выберите файл трека для ведения Речевые указания @@ -3690,7 +3690,7 @@ Добавить к треку Для продолжения задайте рабочие дни Маршрут между точками - Составить маршрут + Составление маршрута Выберите способ разбиения: по времени или по расстоянию. Выберите интервал, через который будут отображаться метки с расстоянием или временем на треке. Своё значение @@ -3699,7 +3699,7 @@ Толщина линии Стрелки направления Сплошной - Последнее изменение + Недавние Импортировать трек Открыть существующий трек Создать новый маршрут @@ -3711,13 +3711,13 @@ Предельная дистанция Сохранить как новый трек Обратный маршрут - Пересчёт всего маршрута согласно выбранному профилю. + Пересчёт всего маршрута согласно профилю. Расчёт маршрута для ближайшего сегмента. Следующий сегмент Весь трек - Выберите, как соединять точки: прямой линией или строить маршрут по заданному профилю. + Выберите, соединять точки прямой линией или прокладывать маршрут согласно выбранному профилю. При обратном направлении - Отменить все изменения в составленном маршруте\? + Все действия по составлению маршрута будут отменены. Фото с улиц Сохранить как новый файл трека Добавить в файл трека @@ -3733,7 +3733,7 @@ Добавить путевую точку Запись маршрута Сохранить как файл трека - Навигация по треку + Ведение по треку Выберите сохранённый трек для навигации Выберите трек или импортируйте его из файла на устройстве. Выбрать другой трек @@ -3778,14 +3778,14 @@ \n \n • Улучшенные алгоритмы поиска \n -\n • Улучшенные настройки следования по треку в Навигации +\n • Улучшенные настройки ведения по треку в Навигации \n \n • Исправлены проблемы с импортом/экспортом настроек профиля \n \n Последнее изменение - Имя: Я - А - Имя: А - Я + Имя: Я–А + Имя: А–Я Значки старта и финиша Спасибо за покупку «Контурных линий» Избегать пешеходных дорожек @@ -3825,7 +3825,7 @@ OsmAnd использует MGRS, который похож на формат UTM NATO. Нативные функции при расчёте общественного транспорта Добавьте не менее двух точек - Данные «%1$s» доступны только для дорог, постройте маршрут, используя «Маршрут между точками» для просмотра графиков. + Данные «%1$s» доступны только на дорогах, для построения графиков используйте «Маршрут между точками». Вводите теги через запятую. Перейти на расчёт маршрутов общественного транспорта с помощью Java (safe) Использовать 2-фазный алгоритм A* @@ -4644,7 +4644,7 @@ Время прибытия в пункт назначения. Виджет показывает расстояние и направление до следующего маркера от вашего текущего местоположения. Виджет можно настроить для отображения 1 или 2 маркеров. Виджет показывает географические координаты текущего местоположения. - Избегать дорог, подходящих только для полноприводных автомобилей + Избегать дорог, пригодных только для полноприводных автомобилей Без дорог 4WD Компас на окружности Настройки окружностей From 00357046bb7caa052ff33ebe146a39138ef98830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20=C4=8Cern=C3=BD?= Date: Fri, 23 Jun 2023 20:52:38 +0000 Subject: [PATCH 063/214] Translated using Weblate (Czech) Currently translated at 99.6% (4706 of 4723 strings) --- OsmAnd/res/values-cs/strings.xml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 61f5fb7c3fa..2d4e001b281 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -1269,7 +1269,7 @@ Srbština (cyrilice) Čínština (zjednodušená) Čínština (tradiční) - Vysokohorská turistika (SAC) + Vysokohorská turistika Vykreslovat cesty podle stupnice SAC. Turistické trasy Vykreslovat cesty podle OSMC značení. @@ -4043,7 +4043,7 @@ Potřebujete pomoc\? Kontaktujte nás prosím na %1$s Zadejte prosím svoji e-mailovou adresu, na kterou bude zaslán ověřovací kód \na všechna data na ni budou navázána. - Zadejte prosím e-mailovou adresu, se kterou jste se registrovali. Bude na ni zasláno jednorázové heslo potřebné pro další krok. + Zadejte prosím e-mailovou adresu, se kterou jste se registrovali. Bude na ni zasláno jednorázové heslo. Ověřit e-mailovou adresu Ověřovací kód byl odeslán na %1$s. Zadejte ho prosím do políčka níže. Tato emailová adresa není registrována pro OsmAnd Cloud @@ -5217,4 +5217,18 @@ Měřítko CAI 3D režim Viditelné na mapě + Soubor již existuje + Zařízení kola + %1$s odpojeno + Krevní tlak + 3D reliéf + Zápěstí + Prst + Mapa terénu + Hruď + Oprávnění Bluetooth nebylo uděleno + Ruka + Žádné výsledky + %1$s připojeno + bpm \ No newline at end of file From b76e3cd61a7e2c47744b57fe13b1d65ccad76852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20=C4=8Cern=C3=BD?= Date: Fri, 23 Jun 2023 20:43:51 +0000 Subject: [PATCH 064/214] Translated using Weblate (Czech) Currently translated at 99.9% (4586 of 4587 strings) --- OsmAnd/res/values-cs/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-cs/phrases.xml b/OsmAnd/res/values-cs/phrases.xml index 2bd28904890..cfda31b03c0 100644 --- a/OsmAnd/res/values-cs/phrases.xml +++ b/OsmAnd/res/values-cs/phrases.xml @@ -4583,4 +4583,7 @@ III Přístup k lodi: ne Asfaltový povrch + Ano + Název tunelu + Název mostu \ No newline at end of file From 4948a216ab41856d0b00f115e6dbefffda4b27fc Mon Sep 17 00:00:00 2001 From: Supaplex Date: Sat, 24 Jun 2023 05:11:32 +0000 Subject: [PATCH 065/214] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 707b7358c04..829d1dc5d99 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -1083,7 +1083,7 @@ 南非荷蘭語 亞美尼亞 巴斯克 - 白俄羅斯 + 白羅斯 波士尼亞 保加利亞 加泰隆尼亞 @@ -1099,7 +1099,7 @@ 印地語 匈牙利 印尼 - 意大利 + 義大利 日本 南韓 拉脫維亞 @@ -1945,7 +1945,7 @@ 變更標記的位置 目前的軌跡 西班牙語(美洲) - 白俄羅斯語(拉丁) + 白羅斯語(拉丁) 康納達語 英語(英國) 阿斯圖里亞斯語 @@ -5231,4 +5231,8 @@ RPM 允許鐵索攀岩 關閉對話方塊 + 地形圖 + 3D 地形圖 + 免費模式 + 你的社區或是整個大陸的擁有與觀察的縮放尺度。 \ No newline at end of file From 2c9b03d96f55d4d66fbf22b2b705a4cb26998286 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Sun, 25 Jun 2023 08:42:21 +0300 Subject: [PATCH 066/214] #16632: Fixes after review --- OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt | 6 +++--- .../plus/views/layers/FavouritesLayer.java | 16 ++++++++++------ .../plus/views/layers/MapMarkersLayer.java | 9 +++------ .../plus/views/layers/base/OsmandMapLayer.java | 15 ++++++++++++++- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt index d2055954b20..cdd75807bd8 100644 --- a/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt +++ b/OsmAnd/src/net/osmand/plus/auto/TracksScreen.kt @@ -3,6 +3,7 @@ package net.osmand.plus.auto import android.os.AsyncTask import android.text.SpannableString import android.text.Spanned +import androidx.annotation.WorkerThread import androidx.car.app.CarContext import androidx.car.app.model.* import androidx.car.app.navigation.model.PlaceListNavigationTemplate @@ -35,7 +36,7 @@ class TracksScreen( ) : BaseOsmAndAndroidAutoScreen(carContext) { val gpxDbHelper: GpxDbHelper = app.gpxDbHelper var loadGpxFilesThread: Thread? = null - private val loadedGpxFiles = HashMap() + private var loadedGpxFiles = HashMap() private lateinit var loadTracksTask: LoadTracksTask init { @@ -86,7 +87,7 @@ class TracksScreen( } private fun prepareTrackItems() { - loadedGpxFiles.clear() + loadedGpxFiles = HashMap() for (track in trackTab.trackItems) { track.file?.let { file -> val item = gpxDbHelper.getItem(file) { updateTrack(track, it) } @@ -99,7 +100,6 @@ class TracksScreen( loadedGpxFiles[track] = selectedGpxFile } } - invalidate() } private fun updateTrack(trackItem: TrackItem, dataItem: GpxDataItem?) { diff --git a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java index 4c803170722..7e2e54559c5 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java @@ -44,7 +44,7 @@ import java.util.List; public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvider, - IMoveObjectProvider, MapTextProvider { + IMoveObjectProvider, MapTextProvider { private static final int START_ZOOM = 6; private static final Log LOG = PlatformUtil.getLog(FavouritesLayer.class); @@ -138,8 +138,12 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett if (hasMapRenderer()) { if (mapActivityInvalidated || mapRendererChanged || nightModeChanged || showFavoritesChanged - || favoritesChanged || textScaleChanged || textVisibleChanged || customObjectsDelegate != null) { + || favoritesChanged || textScaleChanged || textVisibleChanged + || (customObjectsDelegate != null && customObjectsDelegate.isChanged())) { showFavorites(); + if(customObjectsDelegate != null){ + customObjectsDelegate.acceptChanges(); + } mapRendererChanged = false; } } else { @@ -153,7 +157,7 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett QuadRect latLonBounds = tileBox.getLatLonBounds(); List fullObjectsLatLon = new ArrayList<>(); List smallObjectsLatLon = new ArrayList<>(); - if(customObjectsDelegate != null){ + if (customObjectsDelegate != null) { drawPoints(customObjectsDelegate.getMapObjects(), latLonBounds, false, tileBox, boundIntersections, iconSize, canvas, fullObjectsLatLon, smallObjectsLatLon); } else { @@ -182,8 +186,8 @@ private void drawPoints(List pointsToDraw, QuadRect latLonBounds double lat = favoritePoint.getLatitude(); double lon = favoritePoint.getLongitude(); if (favoritePoint.isVisible() && favoritePoint != contextMenuLayer.getMoveableObject() - && lat >= latLonBounds.bottom && lat <= latLonBounds.top - && lon >= latLonBounds.left && lon <= latLonBounds.right) { + && lat >= latLonBounds.bottom && lat <= latLonBounds.top + && lon >= latLonBounds.left && lon <= latLonBounds.right) { MapMarker marker = null; if (synced) { marker = mapMarkersHelper.getMapMarker(favoritePoint); @@ -256,7 +260,7 @@ public synchronized void showFavorites() { favoritesMapLayerProvider = new FavoritesTileProvider(getContext(), getPointsOrder(), isTextVisible(), getTextStyle(textScale), view.getDensity()); - if(customObjectsDelegate != null){ + if (customObjectsDelegate != null) { List points = customObjectsDelegate.getMapObjects(); showFavoritePoints(textScale, false, points); favoritesMapLayerProvider.drawSymbols(mapRenderer); diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java index 6c4073ba248..d9cdfe5a8d9 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/MapMarkersLayer.java @@ -278,7 +278,7 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett OsmandApplication app = getApplication(); OsmandSettings settings = app.getSettings(); if ((!settings.SHOW_MAP_MARKERS.get() && customObjectsDelegate == null) - || (customObjectsDelegate != null && Algorithms.isEmpty(customObjectsDelegate.getMapObjects()))) { + || (customObjectsDelegate != null && Algorithms.isEmpty(customObjectsDelegate.getMapObjects()))) { clearMapMarkersCollections(); clearVectorLinesCollections(); resetCachedRenderer(); @@ -286,10 +286,7 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett } MapMarkersHelper markersHelper = app.getMapMarkersHelper(); - List activeMapMarkers = markersHelper.getMapMarkers(); - if (customObjectsDelegate != null) { - activeMapMarkers = customObjectsDelegate.getMapObjects(); - } + List activeMapMarkers = (customObjectsDelegate != null) ? customObjectsDelegate.getMapObjects() : markersHelper.getMapMarkers(); MapRendererView mapRenderer = getMapRenderer(); if (mapRenderer != null) { if (markersCount != activeMapMarkers.size() || mapActivityInvalidated) { @@ -380,7 +377,7 @@ public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode OsmandSettings settings = app.getSettings(); if (customObjectsDelegate != null && Algorithms.isEmpty(customObjectsDelegate.getMapObjects()) - || customObjectsDelegate == null && (tileBox.getZoom() < 3 || !settings.SHOW_MAP_MARKERS.get())) { + || customObjectsDelegate == null && (tileBox.getZoom() < 3 || !settings.SHOW_MAP_MARKERS.get())) { clearVectorLinesCollections(); return; } diff --git a/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java index 74bd3263e03..fa564903904 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/base/OsmandMapLayer.java @@ -56,6 +56,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -85,19 +86,31 @@ public abstract class OsmandMapLayer implements MapRendererViewListener { public static class CustomMapObjects { protected List customMapObjects; + private boolean isChanged; @NonNull public List getMapObjects() { if (customMapObjects == null) { - return new ArrayList<>(); + return Collections.emptyList(); } else { return customMapObjects; } } public void setCustomMapObjects(List customMapObjects) { + if(this.customMapObjects != customMapObjects){ + isChanged = true; + } this.customMapObjects = customMapObjects; } + + public void acceptChanges() { + isChanged = false; + } + + public boolean isChanged() { + return isChanged; + } } public enum MapGestureType { From 634cb80983a8673593d0afafd09537dcf4b43d97 Mon Sep 17 00:00:00 2001 From: "B. Hammer" <600xxxx@gmail.com> Date: Sun, 25 Jun 2023 12:36:24 +0000 Subject: [PATCH 067/214] Translated using Weblate (Russian) Currently translated at 98.8% (4668 of 4723 strings) --- OsmAnd/res/values-ru/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index b692faeed9d..fbbb4fad8df 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -260,7 +260,7 @@ Выберите битрейт аудио. Скрыть Адрес не определён - Рядом с + Вблизи Местоположение Изменить POI Заметка OSM открыта снова @@ -812,7 +812,7 @@ Не удалось рассчитать маршрут. Не удалось рассчитать маршрут. Невозможно построить маршрут. - Вы прибыли. + Вы на месте. Неправильные координаты Вернуться к карте Загрузка данных… @@ -2341,7 +2341,7 @@ Вчера За последние 7 дней В этом году - Составить маршрут + Составление маршрута Ввод координат Переместить в историю Группа будет выключена при следующем запуске приложения. @@ -3783,9 +3783,9 @@ \n • Исправлены проблемы с импортом/экспортом настроек профиля \n \n - Последнее изменение - Имя: Я–А - Имя: А–Я + По дате + По имени: Я–А + По имени: А–Я Значки старта и финиша Спасибо за покупку «Контурных линий» Избегать пешеходных дорожек @@ -3824,7 +3824,7 @@ MGRS OsmAnd использует MGRS, который похож на формат UTM NATO. Нативные функции при расчёте общественного транспорта - Добавьте не менее двух точек + Нужны хотя бы две точки Данные «%1$s» доступны только на дорогах, для построения графиков используйте «Маршрут между точками». Вводите теги через запятую. Перейти на расчёт маршрутов общественного транспорта с помощью Java (safe) @@ -4706,7 +4706,7 @@ Коррекция высоты Следующее обновление в %1$s. Включает изменения OSM, сделанные до %1$s. - Прикрепите свой трек к дорогам, чтобы получить данные %1$s или рассчитать их онлайн. + %1$s: для получения данных проложите маршрут или выполните привязку к дорогам. Обновлено: %1$s. Следующее обновление %1$s в %2$s. Вы можете переключить режим, нажав на виджет. From 62e10d706ef64d923cfe436698de7670f4e7b6db Mon Sep 17 00:00:00 2001 From: Evgenii Martynenko Date: Sat, 24 Jun 2023 21:40:11 +0000 Subject: [PATCH 068/214] Translated using Weblate (Russian) Currently translated at 98.8% (4668 of 4723 strings) --- OsmAnd/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index fbbb4fad8df..7f4de7d2b43 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -3690,7 +3690,7 @@ Добавить к треку Для продолжения задайте рабочие дни Маршрут между точками - Составление маршрута + Планирование маршрута Выберите способ разбиения: по времени или по расстоянию. Выберите интервал, через который будут отображаться метки с расстоянием или временем на треке. Своё значение From 14508cdfa885fc5d87caa4213c3b07449b502ab8 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sun, 25 Jun 2023 18:00:32 +0000 Subject: [PATCH 069/214] Translated using Weblate (Spanish) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 4891abcb6f3..e8f46423740 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -2656,7 +2656,7 @@ Contenido Artículos de Wikiviajes en todo el mundo No - + Hacer Sólo con Wi-Fi Descargar las imágenes Las imágenes del artículo pueden descargarse para su uso sin conexión. From bd4a28c7f0a6d4a5f9d239a31f09cacf27bb49c4 Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Mon, 26 Jun 2023 11:15:49 +0000 Subject: [PATCH 070/214] Translated using Weblate (Danish) Currently translated at 99.9% (4722 of 4723 strings) --- OsmAnd/res/values-da/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index ed2c179bae2..2915e9f9f82 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -708,7 +708,7 @@ Gem som Filter Alle de øvrige mærker bevares - Kommentar + Kommentér Åben I/O-fejl under udførelsen af handling {0}. Kunne ikke udføre handling {0}. @@ -4722,7 +4722,7 @@ En modul-dublet tilføjes listen. Duplikér Ved at trykke på modulet kan du tage et billede. - Ved at trykke på modulet kan du starte en videooptagelse. + Ved at trykke på modulet kan du optage en video. Ved at trykke på modulet kan du optage en lydnote. Viser summen af alle nedkørsler på den aktuelt registreret tur. Viser summen af alle stigninger på den aktuelt registreret tur. From c381e71f203593ced15a84071795331489f667db Mon Sep 17 00:00:00 2001 From: Softmap Date: Sun, 25 Jun 2023 11:06:18 +0000 Subject: [PATCH 071/214] Translated using Weblate (Arabic) Currently translated at 99.9% (4721 of 4723 strings) --- OsmAnd/res/values-ar/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 2ea0af9d983..3d7107f61a6 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -5310,4 +5310,5 @@ الوضع الحر خريطة التضاريس امتلك وراقب نموذج مقياس لمنطقتك أو القارة بأكملها. + الإغاثة ثلاثية الأبعاد \ No newline at end of file From 529e2c174163f730195bddb23c0cc9b5dbce4903 Mon Sep 17 00:00:00 2001 From: ERYpTION Date: Sat, 24 Jun 2023 21:33:00 +0000 Subject: [PATCH 072/214] Translated using Weblate (Danish) Currently translated at 83.8% (3852 of 4592 strings) --- OsmAnd/res/values-da/phrases.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-da/phrases.xml b/OsmAnd/res/values-da/phrases.xml index 3c0450a2c20..ab2e55483d1 100644 --- a/OsmAnd/res/values-da/phrases.xml +++ b/OsmAnd/res/values-da/phrases.xml @@ -3366,7 +3366,7 @@ Bådforretning Cannabisbutik Stikkontakt - CHAdeMO-udgang + CHAdeMO-stikudgang Type 2-udgang Type 2-combo-udgang Type 3-udgang @@ -4020,4 +4020,5 @@ Varmt vand: nej Vandsportsbutik Tavletitel + CHAdeMO-stikspænding \ No newline at end of file From 60d33efcab995b7085801a9de8e3b1cc46751b06 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sun, 25 Jun 2023 20:54:33 +0000 Subject: [PATCH 073/214] Translated using Weblate (Ukrainian) Currently translated at 100.0% (4592 of 4592 strings) --- OsmAnd/res/values-uk/phrases.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index fd4ace84f56..1f035b9df03 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -2832,7 +2832,7 @@ Громадська книжкова шафа Картопля Електронні сигарети - Вживані товари + Так Золото Поверхня: нещільна кам\'яна бруківка Вирощується культура: пшениця @@ -2851,7 +2851,7 @@ Вид: шафа з книгами Сендвіч в формі підводного човна Харчові добавки - Лише вживані товари + Лише Гравій Поверхня: бруд Вирощується культура: ячмінь @@ -4587,4 +4587,9 @@ Назва мосту Автоматичні паливні колонки;Автомат з продажу палива Так + Вживані товари + Поверхня: килимова + Поверхня: акрилова + Поверхня: пластик + Поверхня: гума \ No newline at end of file From 5728e8d5318117d72d538f8d38ae136901ee7aac Mon Sep 17 00:00:00 2001 From: 99 efi Date: Sun, 25 Jun 2023 10:13:42 +0000 Subject: [PATCH 074/214] Translated using Weblate (Hungarian) Currently translated at 99.2% (4556 of 4592 strings) --- OsmAnd/res/values-hu/phrases.xml | 70 ++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index 8aba7b7809d..0b135a30b04 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -1176,9 +1176,9 @@ Kiülős hely: kert Kiülős hely: belső udvar vannak;koktélok - Használt áru + Igen Használt áru nincs - Csak használt áru + Csak Alkatrész Kereskedés Szerelés @@ -4485,7 +4485,7 @@ Alacsony Közepes Műanyag kupakok - Alumínium dobozok + Alumínium palackok PET italos palackok Önkiszolgáló kassza Szövetanyagok @@ -4497,4 +4497,68 @@ Őslakosok területe van;ivóvíz Antenna + Játékkölcsönző + Automatikus üzemanyag-adagolók;Üzemanyag-árusító automaták + Raklapok + Gyógyszer + Aeroszolos palackok + PET-palack + Élelmiszer + Gázpalackok + Színes gázpalackok + Befőttesüvegek + Tengeri hulladék + Fém csomagolás + Patronok tintasugaras nyomtatóhoz + Játékok + Kis fém alkatrészek + Visszaváltható palackok + Használt termék + Cigaretták + Kutya ürülék + II + III + Va + Vb + IV + VIa + VIb + VIc + VII + Víznyelő: gödör (pit) + Víznyelő: vízlevezető (ponor) + Hajóút medermélység + I + 0 + Kupakok + Nyomtató festékkazetták + Víznyelő: nyílás (estavelle) + Víznyelő: vakvölgy (dolina) + Víznyelő: víz alatti (bluehole) + Személybejáró + Rúd + Tüskék + Autócsapda + Ék + Kátránytömítés + Tankcsapda + Híd neve + Csónakok + Övek + Olaj + Egyebek + Terméskő + Vákuumos bőrtisztító + Polisztirol hab + Szemét + Szerves + Ültetvény + Maximális hossz + Igen + Műszaki cikk + Táskák + Elektromos készülékek + Olaj + Kávé kapszulák + Elfogadott hulladék \ No newline at end of file From d6515d3bace5198e025189036146492511654879 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sun, 25 Jun 2023 17:57:33 +0000 Subject: [PATCH 075/214] Translated using Weblate (Spanish) Currently translated at 100.0% (4592 of 4592 strings) --- OsmAnd/res/values-es/phrases.xml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index b6dd4152046..225605558db 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -1194,9 +1194,9 @@ Al descubierto No Sólo afuera - - En sala separada - En sala aislada + Permitido + En una habitación separada + En una habitación aislada Sólo fumadores Sin peaje Peaje @@ -1485,9 +1485,9 @@ Mesas al aire libre: jardín Mesas al aire libre: patio Sí;Cócteles - Artículos usados: sí + Artículos usados: no - Artículos usados: únicamente + Sólo Autopartes Concesionaria Reparación @@ -4587,4 +4587,9 @@ Nombre del túnel Surtidores automáticos de combustible + Productos de segunda mano + Superficie: acrílico + Superficie: moqueta + Superficie: plástico + Superficie: caucho \ No newline at end of file From 54dfc7606b1eac88781b06e42ea2cefe5698ea23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=98=86Verdulo?= Date: Sun, 25 Jun 2023 13:35:39 +0000 Subject: [PATCH 076/214] Translated using Weblate (Esperanto) Currently translated at 100.0% (4592 of 4592 strings) --- OsmAnd/res/values-eo/phrases.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index 9f5c6057c79..aa7ff2b6d7f 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -1495,9 +1495,9 @@ Seĝoj ekstere: en ĝardeno Seĝoj ekstere: en korto jes;kokteloj - Brokantaĵoj + jes Sen brokantaĵoj - Nur brokantaĵoj + nur partoj vendado de aŭtoj riparo @@ -4587,4 +4587,9 @@ Nomo de tunelo jes Brulaĵ-vendilo;brulaĵvendilo;fuelvendilo;fuelpumpilo;fuelkolono;brulaĵpumpilo + Brokantaĵoj + Pavimo: rezino akrila + Pavimo: tapiŝo + Pavimo: plasto + Pavimo: gumo \ No newline at end of file From 9a8a57c80903bb419e08d78a1cb6480546937b0b Mon Sep 17 00:00:00 2001 From: Supaplex Date: Mon, 26 Jun 2023 07:44:23 +0000 Subject: [PATCH 077/214] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (4723 of 4723 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 829d1dc5d99..1cb830da322 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -1081,14 +1081,14 @@ OsmAnd 預估最初和最後路段的路線 英文 南非荷蘭語 - 亞美尼亞 + 亞美尼亞語 巴斯克 白羅斯 波士尼亞 保加利亞 加泰隆尼亞 捷克 - 丹麥 + 丹麥語 荷蘭 芬蘭 法語 @@ -1098,12 +1098,12 @@ 希伯來 印地語 匈牙利 - 印尼 - 義大利 - 日本 - 南韓 - 拉脫維亞 - 立陶宛 + 印尼語 + 義大利語 + 日語 + 韓語 + 拉脫維亞語 + 立陶宛語 馬拉地 書面挪威語 波蘭 @@ -1222,7 +1222,7 @@ GPS 喚醒間隔 要中止 GPS 背景模式嗎? 阿爾巴尼亞 - 阿拉伯 + 阿拉伯語 薩丁尼亞島 塞爾維亞語(西里爾文) 中文(简体) @@ -4704,9 +4704,9 @@ 某些道路可能會限制送貨車輛。 貨運 下載完成 - 點擊小工具可以讓您拍照。 - 點擊小工具可以讓您錄製影片。 - 點擊小工具可以讓您製作音訊註記。 + 點一下小工具能讓你照相。 + 點一下小工具讓你錄製影片。 + 點一下小工具讓你錄製語音筆記。 顯示目前記錄的行程的所有爬升高度總和。 顯示目前記錄行程的軌跡紀錄時間。 顯示目前記錄行程的距離。 @@ -4774,7 +4774,7 @@ 切換是否要在地圖上顯示或隱藏目前的位置。 座標:地圖中心 顯示目前地圖中心的地理座標 - 顯示目前地理位置的地理座標 + 顯示目前地理位置的經緯度 座標:目前位置 開發者小工具 用來在透視模式下顯示相機傾斜角度。預設為 90°(無傾斜)。 From ba9886110a62da9aad3f8398ca2cbe2c0014b329 Mon Sep 17 00:00:00 2001 From: Supaplex Date: Mon, 26 Jun 2023 07:29:17 +0000 Subject: [PATCH 078/214] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (4592 of 4592 strings) --- OsmAnd/res/values-zh-rTW/phrases.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index 48ffef528c4..fb308ab1e09 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -1489,9 +1489,9 @@ 室外座位:花園 室外座位:天井 是;雞尾酒 - 二手商品 + 無二手商品 - 只有二手商品 + 只有 零配件 經銷商 維修 @@ -4587,4 +4587,9 @@ 橋樑名稱 自動加油機;燃油自動販賣機 + 二手商品 + 鋪面:壓克力 + 鋪面:地毯 + 鋪面:橡膠 + 鋪面:塑膠 \ No newline at end of file From 025fb41197b8a37d4203d66859fa7f1f03899965 Mon Sep 17 00:00:00 2001 From: Sergey Kharchenko Date: Mon, 26 Jun 2023 19:35:54 +0300 Subject: [PATCH 079/214] Fixed formatting --- OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java index 7e2e54559c5..1f2a046eb75 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/FavouritesLayer.java @@ -141,7 +141,7 @@ public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSett || favoritesChanged || textScaleChanged || textVisibleChanged || (customObjectsDelegate != null && customObjectsDelegate.isChanged())) { showFavorites(); - if(customObjectsDelegate != null){ + if (customObjectsDelegate != null) { customObjectsDelegate.acceptChanges(); } mapRendererChanged = false; From 8a9c56fed99e47cea03d23fb8bff3b38600525e0 Mon Sep 17 00:00:00 2001 From: chumva Date: Mon, 26 Jun 2023 23:43:05 +0300 Subject: [PATCH 080/214] Add delete account UI --- .../drawable/dlg_btn_tertiary_harmfull.xml | 21 ++ .../res/layout/fragment_backup_settings.xml | 6 + .../res/layout/fragment_cloud_authorize.xml | 10 +- .../layout/fragment_delete_backup_account.xml | 213 +++++++++++ OsmAnd/res/layout/simple_warning_item.xml | 29 ++ OsmAnd/res/values/colors.xml | 1 + OsmAnd/res/values/strings.xml | 17 + OsmAnd/res/values/styles.xml | 6 + .../plus/backup/ui/AuthorizeFragment.java | 203 ++++++----- .../ui/BackupAuthorizationFragment.java | 5 +- .../plus/backup/ui/BackupCloudFragment.java | 1 - .../backup/ui/BackupSettingsFragment.java | 42 ++- .../plus/backup/ui/DeleteAccountFragment.java | 338 ++++++++++++++++++ .../plus/backup/ui/LoginDialogType.java | 42 +++ .../backup/ui/ScrollingFooterBehaviour.java | 45 +++ .../backup/ui/status/IntroductionCard.java | 2 +- .../plus/chooseplan/TroubleshootingCard.java | 3 +- .../net/osmand/plus/helpers/IntentHelper.java | 2 +- .../dialogs/ExternalDevicesListFragment.java | 10 +- .../net/osmand/plus/utils/ColorUtilities.java | 10 + .../net/osmand/plus/utils/UiUtilities.java | 8 +- 21 files changed, 890 insertions(+), 124 deletions(-) create mode 100644 OsmAnd/res/drawable/dlg_btn_tertiary_harmfull.xml create mode 100644 OsmAnd/res/layout/fragment_delete_backup_account.xml create mode 100644 OsmAnd/res/layout/simple_warning_item.xml create mode 100644 OsmAnd/src/net/osmand/plus/backup/ui/DeleteAccountFragment.java create mode 100644 OsmAnd/src/net/osmand/plus/backup/ui/LoginDialogType.java create mode 100644 OsmAnd/src/net/osmand/plus/backup/ui/ScrollingFooterBehaviour.java diff --git a/OsmAnd/res/drawable/dlg_btn_tertiary_harmfull.xml b/OsmAnd/res/drawable/dlg_btn_tertiary_harmfull.xml new file mode 100644 index 00000000000..55cc0a2af97 --- /dev/null +++ b/OsmAnd/res/drawable/dlg_btn_tertiary_harmfull.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_backup_settings.xml b/OsmAnd/res/layout/fragment_backup_settings.xml index 12bdb0b84c7..8d080b97fc3 100644 --- a/OsmAnd/res/layout/fragment_backup_settings.xml +++ b/OsmAnd/res/layout/fragment_backup_settings.xml @@ -282,6 +282,12 @@ android:id="@+id/delete_old_container" layout="@layout/preference_with_descr" /> + + + + diff --git a/OsmAnd/res/layout/fragment_cloud_authorize.xml b/OsmAnd/res/layout/fragment_cloud_authorize.xml index 010dacb5bdd..c30f02210b7 100644 --- a/OsmAnd/res/layout/fragment_cloud_authorize.xml +++ b/OsmAnd/res/layout/fragment_cloud_authorize.xml @@ -13,7 +13,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - osmand:layout_behavior="net.osmand.plus.backup.ui.AuthorizeFragment$FixScrollingFooterBehaviour"> + osmand:layout_behavior="net.osmand.plus.backup.ui.ScrollingFooterBehaviour"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/simple_warning_item.xml b/OsmAnd/res/layout/simple_warning_item.xml new file mode 100644 index 00000000000..a29fc940b90 --- /dev/null +++ b/OsmAnd/res/layout/simple_warning_item.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/OsmAnd/res/values/colors.xml b/OsmAnd/res/values/colors.xml index 449ee027eb0..111396046aa 100644 --- a/OsmAnd/res/values/colors.xml +++ b/OsmAnd/res/values/colors.xml @@ -529,4 +529,5 @@ #F3374D #F3F4F6 + #E71D36 \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 3c0bf0b3ed0..8c244b619ed 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,23 @@ Thx - Hardy --> + Account and all data was deleted from OsmAnd Cloud. + In few moments all your data and account will be deleted from OsmAnd Cloud.\n\nAll data on the device remain untouched. + Are you sure you want to delete OsmAnd Cloud account?\n\nThis action can’t be undone. + Delete account? + This action can\'t be undone. + Secondary devices will be logged off from OsmAnd Cloud and lose access to paid features. + Your account and all account details will be %1$s + All data from OsmAnd Cloud will be %1$s. Data on the device remains untouched. + This will not cancel your OsmAnd Pro subscription. + Manage subscriptions. + Are you sure you want to delete %1$s account? + Deleting + Deleting complete + Delete account + Email doesn\'t match login username + We need to verify your account before delete it.\n\nPlease enter the e-mail address you registered with. A one-time password for the next step will be sent to it. + Verify your account Free mode Terrain map 3D Relief diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index 3ce743f4307..b36bee3cc50 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -855,6 +855,12 @@ @dimen/dialog_header_text_size + + +