From f9e42fc37a0447b3c88e0176facd90b4963e9bef Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Fri, 13 Oct 2017 21:24:55 +0200 Subject: [PATCH 001/187] less greedy intent-filter for www.openstreetmap.org (fixes #4440) Registering an intent filter for all of openstreetmap breaks the OAuth process for other Android apps, trying to access www.openstreetmap.org/oauth --- OsmAnd/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index fdfd8c2bde..af7edc7f44 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -229,7 +229,9 @@ - + + + From c1683b1151d823f48650fd06159917400f7a71f6 Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Tue, 17 Oct 2017 13:13:19 +0300 Subject: [PATCH 002/187] Add link to the new Release notes article. --- OsmAnd/src/net/osmand/plus/AppInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java index 0dc3cc726a..53fb922d9f 100644 --- a/OsmAnd/src/net/osmand/plus/AppInitializer.java +++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java @@ -87,7 +87,7 @@ public class AppInitializer implements IProgress { private static final String VERSION_INSTALLED = "VERSION_INSTALLED"; //$NON-NLS-1$ private static final String EXCEPTION_FILE_SIZE = "EXCEPTION_FS"; //$NON-NLS-1$ - public static final String LATEST_CHANGES_URL = "https://osmand.net/blog?id=osmand-2-7-released"; + public static final String LATEST_CHANGES_URL = "https://osmand.net/blog?id=osmand-2-8-released"; // public static final String LATEST_CHANGES_URL = null; // not enough to read public static final int APP_EXIT_CODE = 4; public static final String APP_EXIT_KEY = "APP_EXIT_KEY"; From 017aa48a21f8105630d1ae195e10c3b858249a61 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Tue, 17 Oct 2017 13:14:14 +0300 Subject: [PATCH 003/187] Fix history menu --- ...fragment_marker_history_bottom_sheet_dialog.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml index c3d82544c8..daf7ff4969 100644 --- a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml @@ -52,8 +52,7 @@ android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" - android:textSize="@dimen/default_list_text_size" - android:textColor="?android:textColorPrimary" + android:textAppearance="@style/TextAppearance.ListItemTitle" tools:text="Bloemstraat 179"/> @@ -97,7 +95,8 @@ android:layout_marginRight="@dimen/bottom_sheet_icon_margin" tools:src="@drawable/ic_action_reset_to_default_dark"/> - - Date: Tue, 17 Oct 2017 13:21:10 +0300 Subject: [PATCH 004/187] Fix #4579 --- OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java index 95dc1638b4..b599107212 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/AvailableGPXFragment.java @@ -182,7 +182,7 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment { if (!importing) { if (asyncLoader == null || asyncLoader.getResult() == null) { asyncLoader = new LoadGpxTask(); - asyncLoader.execute(getActivity()); + asyncLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { allGpxAdapter.refreshSelected(); allGpxAdapter.notifyDataSetChanged(); From ad8824f13e0303d0d0cfc14082826cfa9d93a982 Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Tue, 17 Oct 2017 13:21:33 +0300 Subject: [PATCH 005/187] Update DE strings. --- OsmAnd/res/values-de/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index a7ca3f2419..c89236e9fe 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -2864,11 +2864,11 @@ Abgedeckte Fläche: %1$s x %2$s Beenden Gerätetastatur verwenden Kartenmarkierung auf Karte verschoben - • komplett überarbeitete Kartenmarkierungen mit Linien und Routenplanung + • Vollständig überarbeitete Kartenmarkierungen mit Richtlinien und Routenplanung \n -\n• Entfernungsmesswerkzeug bietet ausrichten auf Straße Funktion und speichern als Track +\n• Entfernungsmesser-Tool, mit Funktionen zum Einrasten auf Straßen und Punkte als Track Speichern \n -\n• Bug-Fixes, neue Daten auf dem Server alle 30 Minuten, Updates implementiert in der Navigation +\n• OsmAnd Live: Bugfixes, neue Daten auf dem Server alle 30 Minuten, in die Navigation implementierte Updates \n \n Dunkelgelb From 5815285ae88d844cd4353ef90ed592071720f6cb Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Oct 2017 14:53:15 +0300 Subject: [PATCH 006/187] Fix strings --- OsmAnd/res/values-tr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 5a1d0362fc..73197b320a 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -1052,7 +1052,7 @@ kamyon - Şimdidosya ($1%s ) Yeni Geliş kopyalamak … + Şimdidosya (%s) Yeni Geliş kopyalamak … Yeni hedef (%s) için Osmand veri dosyaları kopyalanıyor … Yolbul tercihleri Öncelikli yönlendirme @@ -2008,7 +2008,7 @@ Kaydedilen her klibin uzunluğunu artık bu belirtilen zaman aralığı olmayacak Depolama boyutu Tüm kaydedilen kliplerin tarafından işgal edilebilir alan miktarı - Son harita değişikliği:% s + Son harita değişikliği: %s Saatlik Günlük Haftalık From 529de80676a7a38742e32219554614a1b048657b Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Oct 2017 11:37:03 +0300 Subject: [PATCH 007/187] Fix endless "looking up address" after adding map marker --- OsmAnd/src/net/osmand/plus/MapMarkersHelper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java index 1f8023a472..ebd85e0527 100644 --- a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java +++ b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java @@ -769,6 +769,7 @@ public class MapMarkersHelper { mapMarkers.add(0, marker); addMarkerToGroup(marker); reorderActiveMarkersIfNeeded(); + lookupAddress(marker); } } } From a6a7a981845dff5f39fede51cba87af99bdf5872 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Oct 2017 13:09:03 +0300 Subject: [PATCH 008/187] Fix update query; fix opening of old markers --- OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java | 4 ++-- OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java index 93fdc99e77..dcab53a5cb 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java @@ -30,7 +30,6 @@ import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.TargetPointsHelper.TargetPointChangedListener; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.dashboard.DashboardOnMap; import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.mapcontextmenu.MenuController.ContextMenuToolbarController; import net.osmand.plus.mapcontextmenu.MenuController.MenuState; @@ -44,6 +43,7 @@ import net.osmand.plus.mapcontextmenu.editors.RtePtEditor; import net.osmand.plus.mapcontextmenu.editors.WptPtEditor; import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu; import net.osmand.plus.mapcontextmenu.other.ShareMenu; +import net.osmand.plus.mapmarkers.MapMarkersDialogFragment; import net.osmand.plus.monitoring.OsmandMonitoringPlugin; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.views.ContextMenuLayer; @@ -717,7 +717,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL if (pointDescription.isMapMarker()) { hide(); MapActivity.clearPrevActivityIntent(); - mapActivity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.MAP_MARKERS); + MapMarkersDialogFragment.showInstance(mapActivity); } else { mapActivity.getMapActions().addMapMarker(latLon.getLatitude(), latLon.getLongitude(), getPointDescriptionForMarker()); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java index c6a7a27b51..19b7687f4e 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java @@ -140,7 +140,7 @@ public class MapMarkersDbHelper { if (oldVersion < 10) { db.execSQL("ALTER TABLE " + MARKERS_TABLE_NAME + " ADD " + MARKERS_COL_SELECTED + " int"); db.execSQL("UPDATE " + MARKERS_TABLE_NAME + - " SET" + MARKERS_COL_SELECTED + " = ? " + + " SET " + MARKERS_COL_SELECTED + " = ? " + "WHERE " + MARKERS_COL_SELECTED + " IS NULL", new Object[]{0}); } } From cfbf0f313665f49c2398e112446e501b9bdc1856 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Oct 2017 13:54:10 +0300 Subject: [PATCH 009/187] Fix condition --- OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java index dcab53a5cb..843e268078 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java @@ -898,7 +898,8 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL public PointDescription getPointDescriptionForMarker() { PointDescription pd = getPointDescriptionForTarget(); - if (Algorithms.isEmpty(pd.getName()) && !nameStr.equals(PointDescription.getAddressNotFoundStr(mapActivity))) { + if (Algorithms.isEmpty(pd.getName()) && !Algorithms.isEmpty(nameStr) + && !nameStr.equals(PointDescription.getAddressNotFoundStr(mapActivity))) { return new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, nameStr); } else { return pd; From 1b7e5d008377d25e0e69a719ef89027905e14320 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Oct 2017 14:28:32 +0300 Subject: [PATCH 010/187] Fix onUpgrade --- OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java index 19b7687f4e..4d6798e7a4 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDbHelper.java @@ -21,7 +21,7 @@ import java.util.Random; public class MapMarkersDbHelper { - private static final int DB_VERSION = 10; + private static final int DB_VERSION = 11; public static final String DB_NAME = "map_markers_db"; private static final String MARKERS_TABLE_NAME = "map_markers"; @@ -139,6 +139,8 @@ public class MapMarkersDbHelper { } if (oldVersion < 10) { db.execSQL("ALTER TABLE " + MARKERS_TABLE_NAME + " ADD " + MARKERS_COL_SELECTED + " int"); + } + if (oldVersion < 11) { db.execSQL("UPDATE " + MARKERS_TABLE_NAME + " SET " + MARKERS_COL_SELECTED + " = ? " + "WHERE " + MARKERS_COL_SELECTED + " IS NULL", new Object[]{0}); From b1c5091767c8d743abfdc9378cb0969419fb5ab7 Mon Sep 17 00:00:00 2001 From: PaulStets Date: Tue, 17 Oct 2017 16:15:44 +0300 Subject: [PATCH 011/187] Fixed getRegionName and improved osmlive filename recognition --- .../src/net/osmand/binary/BinaryMapIndexReader.java | 12 ++++++++---- .../src/net/osmand/search/core/SearchPhrase.java | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java b/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java index 8b5f0bbdcc..325ec1540a 100644 --- a/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java +++ b/OsmAnd-java/src/net/osmand/binary/BinaryMapIndexReader.java @@ -407,14 +407,18 @@ public class BinaryMapIndexReader { } String ls = rg.get(0); if (ls.lastIndexOf('_') != -1) { - if (ls.matches(".*([0-9]+_*){3}\\.obf")) { - Pattern osmDiffDateEnding = Pattern.compile("_([0-9]+_*){3}\\.obf"); + if (ls.matches("([a-zA-Z-]+_)+([0-9]+_){2}[0-9]+\\.obf")) { + Pattern osmDiffDateEnding = Pattern.compile("_([0-9]+_){2}[0-9]+\\.obf"); Matcher m = osmDiffDateEnding.matcher(ls); if (m.find()) { ls = ls.substring(0, m.start()); + if (ls.lastIndexOf('_') != -1) { + return ls.substring(0, ls.lastIndexOf('_')).replace('_', ' '); + } else { + return ls; + } + } - return ls.substring(0, ls.lastIndexOf('_')).replace('_', ' '); - } else { if (ls.contains(".")) { ls = ls.substring(0, ls.indexOf(".")); diff --git a/OsmAnd-java/src/net/osmand/search/core/SearchPhrase.java b/OsmAnd-java/src/net/osmand/search/core/SearchPhrase.java index e0eac2a796..d9da250e28 100644 --- a/OsmAnd-java/src/net/osmand/search/core/SearchPhrase.java +++ b/OsmAnd-java/src/net/osmand/search/core/SearchPhrase.java @@ -587,7 +587,8 @@ public class SearchPhrase { Iterator it = indexes.iterator(); while (it.hasNext()) { BinaryMapIndexReader r = it.next(); - if (r.getFile().getName().matches(".*([0-9]+_*){3}\\.obf")) { + String filename = r.getFile().getName(); + if (filename.matches("([a-zA-Z-]+_)+([0-9]+_){2}[0-9]+\\.obf")) { String currRegionName = r.getRegionName(); if (result.containsKey(currRegionName)) { result.get(currRegionName).add(r); From 7f830d74a8dd4854c767cc1246a699a5b7cd32e3 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Tue, 17 Oct 2017 16:59:38 +0300 Subject: [PATCH 012/187] Fix saving snap to road --- .../osmand/plus/measurementtool/MeasurementToolFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index 3813c19899..cc65e048fe 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -665,7 +665,7 @@ public class MeasurementToolFragment extends Fragment { return new SaveAsNewTrackFragmentListener() { @Override public void saveAsRoutePointOnClick() { - saveAsGpx(SaveType.ROUTE_POINT); + saveAsGpx(editingCtx.isInSnapToRoadMode() ? SaveType.SNAP_TO_ROAD : SaveType.ROUTE_POINT); } @Override From 969506a7756553c011a7214b3709ed23baea727f Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Tue, 17 Oct 2017 17:09:59 +0300 Subject: [PATCH 013/187] Fix #4589 --- OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java index 438a5d58b9..e09b67eb12 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java @@ -107,7 +107,6 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi private void initUI() { bitmapPaint = new Paint(); - bitmapPaint.setDither(true); bitmapPaint.setAntiAlias(true); bitmapPaint.setFilterBitmap(true); markerBitmapBlue = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_marker_blue); From c30674350fa2c6069001d9c6a388f4f4f2dc691b Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Tue, 17 Oct 2017 17:19:23 +0300 Subject: [PATCH 014/187] Fix history menu --- ...ment_marker_history_bottom_sheet_dialog.xml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml index daf7ff4969..440dc8bf98 100644 --- a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml @@ -45,24 +45,24 @@ android:gravity="center_vertical" android:orientation="vertical"> - - @@ -95,8 +95,7 @@ android:layout_marginRight="@dimen/bottom_sheet_icon_margin" tools:src="@drawable/ic_action_reset_to_default_dark"/> - - Date: Tue, 17 Oct 2017 17:20:26 +0300 Subject: [PATCH 015/187] Reformat code --- ...ent_marker_history_bottom_sheet_dialog.xml | 272 +++++++++--------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml index 440dc8bf98..b89be37e6b 100644 --- a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml @@ -1,161 +1,161 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:osmand="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/bg_color" + android:orientation="vertical"> - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - - + + \ No newline at end of file From 9050c44f76383d2bc7c46440f3a4417b81188405 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 17 Oct 2017 18:26:14 +0300 Subject: [PATCH 016/187] FIx crash in proxy setting --- OsmAnd/res/values/strings.xml | 1 + .../activities/SettingsGeneralActivity.java | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 340d70a08a..a9418a8cd0 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,7 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Wrong format Road Show map Route is calculated diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 3ad0466430..860662b3d4 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -58,6 +58,12 @@ import java.util.List; public class SettingsGeneralActivity extends SettingsBaseActivity implements OnRequestPermissionsResultCallback { + private static final String IP_ADDRESS_PATTERN = + "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; + private Preference applicationDir; private ListPreference applicationModePreference; private Preference drivingRegionPreference; @@ -366,9 +372,15 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR hostPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - settings.PROXY_HOST.set((String) newValue); - enableProxy(NetworkUtils.getProxy() != null); - return true; + String ipAddress = (String) newValue; + if (ipAddress.matches(IP_ADDRESS_PATTERN)) { + settings.PROXY_HOST.set(ipAddress); + enableProxy(NetworkUtils.getProxy() != null); + return true; + } else { + Toast.makeText(SettingsGeneralActivity.this, getString(R.string.wrong_format), Toast.LENGTH_SHORT).show(); + return false; + } } }); From 9287b9419d8d66f2fcf22d236cb15a67233fc83d Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 17 Oct 2017 18:49:05 +0300 Subject: [PATCH 017/187] Fix crash in settings --- .../net/osmand/plus/activities/SettingsGeneralActivity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 3ad0466430..10d1bc9288 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -42,6 +42,7 @@ import net.osmand.plus.OsmandSettings.DrivingRegion; import net.osmand.plus.OsmandSettings.MetricsConstants; import net.osmand.plus.R; import net.osmand.plus.Version; +import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.dashboard.DashChooseAppDirFragment; import net.osmand.plus.dashboard.DashChooseAppDirFragment.ChooseAppDirFragment; import net.osmand.plus.dashboard.DashChooseAppDirFragment.MoveFilesToDifferentDirectory; @@ -160,7 +161,10 @@ public class SettingsGeneralActivity extends SettingsBaseActivity implements OnR public void onClick(DialogInterface dialog, int which) { if (drs.get(which) == null) { settings.DRIVING_REGION_AUTOMATIC.set(true); - MapActivity.getSingleMapViewTrackingUtilities().resetDrivingRegionUpdate(); + MapViewTrackingUtilities mapViewTrackingUtilities = MapActivity.getSingleMapViewTrackingUtilities(); + if (mapViewTrackingUtilities != null) { + mapViewTrackingUtilities.resetDrivingRegionUpdate(); + } } else { settings.DRIVING_REGION_AUTOMATIC.set(false); settings.DRIVING_REGION.set(drs.get(which)); From adc0966ca2b87ed7ad7ecfa3fdb42edfcdd47045 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 17 Oct 2017 18:57:22 +0300 Subject: [PATCH 018/187] Fix #4577 --- .../osmand/plus/mapcontextmenu/other/ShareMenuFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenuFragment.java index 48c58c6011..b969ae5076 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/ShareMenuFragment.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -121,10 +122,9 @@ public class ShareMenuFragment extends Fragment implements OnItemClickListener { } public void dismissMenu() { + menu.getMapActivity().getSupportFragmentManager().popBackStackImmediate(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); if (menu.getMapActivity().getContextMenu().isVisible()) { menu.getMapActivity().getContextMenu().hide(); - } else { - menu.getMapActivity().getSupportFragmentManager().popBackStack(); } } } From 053418c1c3e71baf7c69fdd820c38942763cbd82 Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Tue, 17 Oct 2017 20:47:38 +0300 Subject: [PATCH 019/187] Merge --- .../plus/mapcontextmenu/MenuBuilder.java | 14 +++-- .../builders/AmenityMenuBuilder.java | 18 ++++++ .../builders/cards/AbstractCard.java | 8 +++ .../builders/cards/ImageCard.java | 56 +++++++++++++++++++ .../builders/cards/UrlImageCard.java | 21 +++++++ 5 files changed, 112 insertions(+), 5 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index bfdf8c0c57..6d00340d0d 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -42,7 +42,6 @@ import net.osmand.plus.mapcontextmenu.builders.cards.AbstractCard; import net.osmand.plus.mapcontextmenu.builders.cards.CardsRowBuilder; import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask; -import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener; import net.osmand.plus.mapcontextmenu.builders.cards.NoImagesCard; import net.osmand.plus.render.RenderingIcons; import net.osmand.util.Algorithms; @@ -55,6 +54,7 @@ import java.util.LinkedList; import java.util.List; import static android.util.TypedValue.COMPLEX_UNIT_DIP; +import static net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.*; public class MenuBuilder { @@ -349,7 +349,7 @@ public class MenuBuilder { @Override public void onCollapseExpand(boolean collapsed) { if (!collapsed && onlinePhotoCards == null) { - startLoadingImages(MenuBuilder.this); + startLoadingImages(); } } }); @@ -359,18 +359,22 @@ public class MenuBuilder { if (needUpdateOnly && onlinePhotoCards != null) { onlinePhotoCardsRow.setCards(onlinePhotoCards); } else if (!collapsableView.isCollapsed()) { - startLoadingImages(this); + startLoadingImages(); } } - private void startLoadingImages(final MenuBuilder menuBuilder) { + private void startLoadingImages() { onlinePhotoCards = new ArrayList<>(); onlinePhotoCardsRow.setProgressCard(); +<<<<<<< HEAD execute(new GetImageCardsTask(mapActivity, menuBuilder.getLatLon(), +======= + execute(new GetImageCardsTask(mapActivity, getLatLon(), getAdditionalCardParams(), +>>>>>>> dbb72952c7... Fix osm image/mapillary processing new GetImageCardsListener() { @Override public void onFinish(List cardList) { - if (!menuBuilder.isHidden()) { + if (!isHidden()) { List cards = new ArrayList<>(); cards.addAll(cardList); if (cardList.size() == 0) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 9a65b98354..842b0bb94b 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -506,6 +506,24 @@ public class AmenityMenuBuilder extends MenuBuilder { } } +<<<<<<< HEAD +======= + @Override + protected Map getAdditionalCardParams() { + Map params = new HashMap<>(); + Map additionalInfo = amenity.getAdditionalInfo(); + String imageValue = additionalInfo.get("image"); + String mapillaryValue = additionalInfo.get("mapillary"); + if (!Algorithms.isEmpty(imageValue)) { + params.put("osm_image", imageValue); + } + if (!Algorithms.isEmpty(mapillaryValue)) { + params.put("osm_mapillary_key", mapillaryValue); + } + return params; + } + +>>>>>>> dbb72952c7... Fix osm image/mapillary processing private static class AmenityInfoRow { private String key; private Drawable icon; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java index 1c265960f2..fdf91efcb2 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java @@ -14,6 +14,7 @@ import android.view.LayoutInflater; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; +import android.webkit.WebViewClient; import android.widget.LinearLayout; import net.osmand.plus.OsmandApplication; @@ -83,6 +84,13 @@ public abstract class AbstractCard { }); final WebView wv = new WebView(ctx); + wv.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return false; + } + }); + WebSettings settings = wv.getSettings(); /* settings.setDefaultTextEncodingName("utf-8"); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java index 343a875060..cc099508b7 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java @@ -85,6 +85,7 @@ public abstract class ImageCard extends AbstractCard { public ImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity); +<<<<<<< HEAD try { if (imageObject.has("type")) { this.type = imageObject.getString("type"); @@ -102,6 +103,58 @@ public abstract class ImageCard extends AbstractCard { this.timestamp = DATE_FORMAT.parse(imageObject.getString("timestamp")); } catch (ParseException e) { e.printStackTrace(); +======= + if (imageObject != null) { + try { + if (imageObject.has("type")) { + this.type = imageObject.getString("type"); + } + if (imageObject.has("ca") && !imageObject.isNull("ca")) { + this.ca = imageObject.getDouble("ca"); + } + if (imageObject.has("lat") && imageObject.has("lon") + && !imageObject.isNull("lat") && !imageObject.isNull("lon")) { + double latitude = imageObject.getDouble("lat"); + double longitude = imageObject.getDouble("lon"); + this.location = new LatLon(latitude, longitude); + } + if (imageObject.has("timestamp")) { + try { + this.timestamp = DATE_FORMAT.parse(imageObject.getString("timestamp")); + } catch (ParseException e) { + e.printStackTrace(); + } + } + if (imageObject.has("key")) { + this.key = imageObject.getString("key"); + } + if (imageObject.has("title") && !imageObject.isNull("title")) { + this.title = imageObject.getString("title"); + } + if (imageObject.has("username") && !imageObject.isNull("username")) { + this.userName = imageObject.getString("username"); + } + if (imageObject.has("url") && !imageObject.isNull("url")) { + this.url = imageObject.getString("url"); + } + if (imageObject.has("imageUrl") && !imageObject.isNull("imageUrl")) { + this.imageUrl = imageObject.getString("imageUrl"); + } + if (imageObject.has("imageHiresUrl") && !imageObject.isNull("imageHiresUrl")) { + this.imageHiresUrl = imageObject.getString("imageHiresUrl"); + } + if (imageObject.has("externalLink") && !imageObject.isNull("externalLink")) { + this.externalLink = imageObject.getBoolean("externalLink"); + } + if (imageObject.has("topIcon") && !imageObject.isNull("topIcon")) { + this.topIconId = getDrawableId(imageObject.getString("topIcon")); + } + if (imageObject.has("buttonIcon") && !imageObject.isNull("buttonIcon")) { + this.buttonIconId = getDrawableId(imageObject.getString("buttonIcon")); + } + if (imageObject.has("buttonText") && !imageObject.isNull("buttonText")) { + this.buttonText = imageObject.getString("buttonText"); +>>>>>>> dbb72952c7... Fix osm image/mapillary processing } } if (imageObject.has("key")) { @@ -465,6 +518,9 @@ public abstract class ImageCard extends AbstractCard { downloading = false; downloaded = true; ImageCard.this.bitmap = bitmap; + if (bitmap != null && Algorithms.isEmpty(getImageHiresUrl())) { + ImageCard.this.imageHiresUrl = getUrl(); + } update(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java index cae773173b..d2055c52c0 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java @@ -12,11 +12,22 @@ public class UrlImageCard extends ImageCard { public UrlImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity, imageObject); +<<<<<<< HEAD if (!Algorithms.isEmpty(getUrl())) { OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { openUrl(getMapActivity(), getMyApplication(), "", getUrl(), isExternalLink()); +======= + + if (!Algorithms.isEmpty(getSuitableUrl())) { + OnClickListener onClickListener = new OnClickListener() { + @Override + public void onClick(View v) { + openUrl(getMapActivity(), getMyApplication(), getTitle(), getSuitableUrl(), + isExternalLink() || Algorithms.isEmpty(getImageHiresUrl()), + !Algorithms.isEmpty(getImageHiresUrl())); +>>>>>>> dbb72952c7... Fix osm image/mapillary processing } }; if (!Algorithms.isEmpty(buttonText)) { @@ -26,4 +37,14 @@ public class UrlImageCard extends ImageCard { } } } + + private String getSuitableUrl() { + final String url; + if (Algorithms.isEmpty(getImageHiresUrl())) { + url = getUrl(); + } else { + url = getImageHiresUrl(); + } + return url; + } } From e3c6215b5e9f6888f4de204b807f8c779a0033da Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Tue, 17 Oct 2017 20:58:14 +0300 Subject: [PATCH 020/187] Revert "Merge" This reverts commit 053418c1c3e71baf7c69fdd820c38942763cbd82. --- .../plus/mapcontextmenu/MenuBuilder.java | 14 ++--- .../builders/AmenityMenuBuilder.java | 18 ------ .../builders/cards/AbstractCard.java | 8 --- .../builders/cards/ImageCard.java | 56 ------------------- .../builders/cards/UrlImageCard.java | 21 ------- 5 files changed, 5 insertions(+), 112 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index 6d00340d0d..bfdf8c0c57 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -42,6 +42,7 @@ import net.osmand.plus.mapcontextmenu.builders.cards.AbstractCard; import net.osmand.plus.mapcontextmenu.builders.cards.CardsRowBuilder; import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask; +import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener; import net.osmand.plus.mapcontextmenu.builders.cards.NoImagesCard; import net.osmand.plus.render.RenderingIcons; import net.osmand.util.Algorithms; @@ -54,7 +55,6 @@ import java.util.LinkedList; import java.util.List; import static android.util.TypedValue.COMPLEX_UNIT_DIP; -import static net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.*; public class MenuBuilder { @@ -349,7 +349,7 @@ public class MenuBuilder { @Override public void onCollapseExpand(boolean collapsed) { if (!collapsed && onlinePhotoCards == null) { - startLoadingImages(); + startLoadingImages(MenuBuilder.this); } } }); @@ -359,22 +359,18 @@ public class MenuBuilder { if (needUpdateOnly && onlinePhotoCards != null) { onlinePhotoCardsRow.setCards(onlinePhotoCards); } else if (!collapsableView.isCollapsed()) { - startLoadingImages(); + startLoadingImages(this); } } - private void startLoadingImages() { + private void startLoadingImages(final MenuBuilder menuBuilder) { onlinePhotoCards = new ArrayList<>(); onlinePhotoCardsRow.setProgressCard(); -<<<<<<< HEAD execute(new GetImageCardsTask(mapActivity, menuBuilder.getLatLon(), -======= - execute(new GetImageCardsTask(mapActivity, getLatLon(), getAdditionalCardParams(), ->>>>>>> dbb72952c7... Fix osm image/mapillary processing new GetImageCardsListener() { @Override public void onFinish(List cardList) { - if (!isHidden()) { + if (!menuBuilder.isHidden()) { List cards = new ArrayList<>(); cards.addAll(cardList); if (cardList.size() == 0) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 842b0bb94b..9a65b98354 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -506,24 +506,6 @@ public class AmenityMenuBuilder extends MenuBuilder { } } -<<<<<<< HEAD -======= - @Override - protected Map getAdditionalCardParams() { - Map params = new HashMap<>(); - Map additionalInfo = amenity.getAdditionalInfo(); - String imageValue = additionalInfo.get("image"); - String mapillaryValue = additionalInfo.get("mapillary"); - if (!Algorithms.isEmpty(imageValue)) { - params.put("osm_image", imageValue); - } - if (!Algorithms.isEmpty(mapillaryValue)) { - params.put("osm_mapillary_key", mapillaryValue); - } - return params; - } - ->>>>>>> dbb72952c7... Fix osm image/mapillary processing private static class AmenityInfoRow { private String key; private Drawable icon; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java index fdf91efcb2..1c265960f2 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java @@ -14,7 +14,6 @@ import android.view.LayoutInflater; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.LinearLayout; import net.osmand.plus.OsmandApplication; @@ -84,13 +83,6 @@ public abstract class AbstractCard { }); final WebView wv = new WebView(ctx); - wv.setWebViewClient(new WebViewClient() { - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - return false; - } - }); - WebSettings settings = wv.getSettings(); /* settings.setDefaultTextEncodingName("utf-8"); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java index cc099508b7..343a875060 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java @@ -85,7 +85,6 @@ public abstract class ImageCard extends AbstractCard { public ImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity); -<<<<<<< HEAD try { if (imageObject.has("type")) { this.type = imageObject.getString("type"); @@ -103,58 +102,6 @@ public abstract class ImageCard extends AbstractCard { this.timestamp = DATE_FORMAT.parse(imageObject.getString("timestamp")); } catch (ParseException e) { e.printStackTrace(); -======= - if (imageObject != null) { - try { - if (imageObject.has("type")) { - this.type = imageObject.getString("type"); - } - if (imageObject.has("ca") && !imageObject.isNull("ca")) { - this.ca = imageObject.getDouble("ca"); - } - if (imageObject.has("lat") && imageObject.has("lon") - && !imageObject.isNull("lat") && !imageObject.isNull("lon")) { - double latitude = imageObject.getDouble("lat"); - double longitude = imageObject.getDouble("lon"); - this.location = new LatLon(latitude, longitude); - } - if (imageObject.has("timestamp")) { - try { - this.timestamp = DATE_FORMAT.parse(imageObject.getString("timestamp")); - } catch (ParseException e) { - e.printStackTrace(); - } - } - if (imageObject.has("key")) { - this.key = imageObject.getString("key"); - } - if (imageObject.has("title") && !imageObject.isNull("title")) { - this.title = imageObject.getString("title"); - } - if (imageObject.has("username") && !imageObject.isNull("username")) { - this.userName = imageObject.getString("username"); - } - if (imageObject.has("url") && !imageObject.isNull("url")) { - this.url = imageObject.getString("url"); - } - if (imageObject.has("imageUrl") && !imageObject.isNull("imageUrl")) { - this.imageUrl = imageObject.getString("imageUrl"); - } - if (imageObject.has("imageHiresUrl") && !imageObject.isNull("imageHiresUrl")) { - this.imageHiresUrl = imageObject.getString("imageHiresUrl"); - } - if (imageObject.has("externalLink") && !imageObject.isNull("externalLink")) { - this.externalLink = imageObject.getBoolean("externalLink"); - } - if (imageObject.has("topIcon") && !imageObject.isNull("topIcon")) { - this.topIconId = getDrawableId(imageObject.getString("topIcon")); - } - if (imageObject.has("buttonIcon") && !imageObject.isNull("buttonIcon")) { - this.buttonIconId = getDrawableId(imageObject.getString("buttonIcon")); - } - if (imageObject.has("buttonText") && !imageObject.isNull("buttonText")) { - this.buttonText = imageObject.getString("buttonText"); ->>>>>>> dbb72952c7... Fix osm image/mapillary processing } } if (imageObject.has("key")) { @@ -518,9 +465,6 @@ public abstract class ImageCard extends AbstractCard { downloading = false; downloaded = true; ImageCard.this.bitmap = bitmap; - if (bitmap != null && Algorithms.isEmpty(getImageHiresUrl())) { - ImageCard.this.imageHiresUrl = getUrl(); - } update(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java index d2055c52c0..cae773173b 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java @@ -12,22 +12,11 @@ public class UrlImageCard extends ImageCard { public UrlImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity, imageObject); -<<<<<<< HEAD if (!Algorithms.isEmpty(getUrl())) { OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { openUrl(getMapActivity(), getMyApplication(), "", getUrl(), isExternalLink()); -======= - - if (!Algorithms.isEmpty(getSuitableUrl())) { - OnClickListener onClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - openUrl(getMapActivity(), getMyApplication(), getTitle(), getSuitableUrl(), - isExternalLink() || Algorithms.isEmpty(getImageHiresUrl()), - !Algorithms.isEmpty(getImageHiresUrl())); ->>>>>>> dbb72952c7... Fix osm image/mapillary processing } }; if (!Algorithms.isEmpty(buttonText)) { @@ -37,14 +26,4 @@ public class UrlImageCard extends ImageCard { } } } - - private String getSuitableUrl() { - final String url; - if (Algorithms.isEmpty(getImageHiresUrl())) { - url = getUrl(); - } else { - url = getImageHiresUrl(); - } - return url; - } } From 7eff262dca8020157dadb1a084f1883a379a81fd Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Tue, 17 Oct 2017 15:43:43 +0300 Subject: [PATCH 021/187] Fix #4346 --- .../src/net/osmand/plus/OsmandSettings.java | 2 +- .../plus/mapcontextmenu/MenuBuilder.java | 17 +- .../builders/AmenityMenuBuilder.java | 26 ++- .../builders/cards/AbstractCard.java | 28 ++- .../builders/cards/ImageCard.java | 199 ++++++++++-------- .../builders/cards/UrlImageCard.java | 15 +- 6 files changed, 188 insertions(+), 99 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 73d25f1563..9c8fcf4d5e 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -920,7 +920,7 @@ public class OsmandSettings { public final OsmandPreference SHOW_MAPILLARY = new BooleanPreference("show_mapillary", false).makeGlobal(); public final OsmandPreference MAPILLARY_FIRST_DIALOG_SHOWN = new BooleanPreference("mapillary_first_dialog_shown", false).makeGlobal(); - public final OsmandPreference MAPILLARY_MENU_COLLAPSED = new BooleanPreference("mapillary_menu_collapsed", false).makeGlobal(); + public final OsmandPreference ONLINE_PHOTOS_ROW_COLLAPSED = new BooleanPreference("mapillary_menu_collapsed", false).makeGlobal(); public final OsmandPreference WEBGL_SUPPORTED = new BooleanPreference("webgl_supported", true).makeGlobal(); // this value string is synchronized with settings_pref.xml preference name diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index bfdf8c0c57..f58a4b72ec 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -53,6 +53,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import static android.util.TypedValue.COMPLEX_UNIT_DIP; @@ -344,7 +345,7 @@ public class MenuBuilder { onlinePhotoCardsRow = new CardsRowBuilder(this, view, false); onlinePhotoCardsRow.build(); CollapsableView collapsableView = new CollapsableView(onlinePhotoCardsRow.getContentView(), - app.getSettings().MAPILLARY_MENU_COLLAPSED); + app.getSettings().ONLINE_PHOTOS_ROW_COLLAPSED); collapsableView.setOnCollExpListener(new CollapsableView.OnCollExpListener() { @Override public void onCollapseExpand(boolean collapsed) { @@ -366,8 +367,13 @@ public class MenuBuilder { private void startLoadingImages(final MenuBuilder menuBuilder) { onlinePhotoCards = new ArrayList<>(); onlinePhotoCardsRow.setProgressCard(); - execute(new GetImageCardsTask(mapActivity, menuBuilder.getLatLon(), + execute(new GetImageCardsTask(mapActivity, menuBuilder.getLatLon(), getAdditionalCardParams(), new GetImageCardsListener() { + @Override + public void onPostProcess(List cardList) { + processOnlinePhotosCards(cardList); + } + @Override public void onFinish(List cardList) { if (!menuBuilder.isHidden()) { @@ -383,6 +389,13 @@ public class MenuBuilder { })); } + protected Map getAdditionalCardParams() { + return null; + } + + protected void processOnlinePhotosCards(List cardList) { + } + protected void buildInternal(View view) { } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 9a65b98354..8330458ee4 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -38,6 +38,7 @@ import net.osmand.util.OpeningHoursParser; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -289,9 +290,13 @@ public class AmenityMenuBuilder extends MenuBuilder { String key = e.getKey(); String vl = e.getValue(); + if (key.equals("image") || key.equals("mapillary")) { + continue; + } + String textPrefix = ""; CollapsableView collapsableView = null; - boolean collapsable = false; + boolean collapsable = false; boolean isWiki = false; boolean isText = false; boolean isDescription = false; @@ -465,7 +470,7 @@ public class AmenityMenuBuilder extends MenuBuilder { if (processNearstWiki() && nearestWiki.size() > 0) { AmenityInfoRow wikiInfo = new AmenityInfoRow( - "nearest_wiki", R.drawable.ic_action_wikipedia, null, app.getString(R.string.wiki_around) + " (" + nearestWiki.size()+")", true, + "nearest_wiki", R.drawable.ic_action_wikipedia, null, app.getString(R.string.wiki_around) + " (" + nearestWiki.size() + ")", true, getCollapsableWikiView(view.getContext(), true), 0, false, false, false, 1000, null, false, false); buildAmenityRow(view, wikiInfo); @@ -475,7 +480,7 @@ public class AmenityMenuBuilder extends MenuBuilder { boolean osmEditingEnabled = OsmandPlugin.getEnabledPlugin(OsmEditingPlugin.class) != null; if (osmEditingEnabled && amenity.getId() != null - && amenity.getId() > 0 && + && amenity.getId() > 0 && (amenity.getId() % 2 == 0 || (amenity.getId() >> 1) < Integer.MAX_VALUE)) { String link; if (amenity.getId() % 2 == 0) { @@ -506,6 +511,21 @@ public class AmenityMenuBuilder extends MenuBuilder { } } + @Override + protected Map getAdditionalCardParams() { + Map params = new HashMap<>(); + Map additionalInfo = amenity.getAdditionalInfo(); + String imageValue = additionalInfo.get("image"); + String mapillaryValue = additionalInfo.get("mapillary"); + if (!Algorithms.isEmpty(imageValue)) { + params.put("image", imageValue); + } + if (!Algorithms.isEmpty(mapillaryValue)) { + params.put("mapillary", mapillaryValue); + } + return params; + } + private static class AmenityInfoRow { private String key; private Drawable icon; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java index 1c265960f2..c0b9de5795 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java @@ -7,6 +7,8 @@ import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.Toolbar; import android.util.TypedValue; @@ -51,8 +53,12 @@ public abstract class AbstractCard { @SuppressLint("SetJavaScriptEnabled") @SuppressWarnings("deprecation") - protected static void openUrl(Context ctx, OsmandApplication app, - String title, String url, boolean externalLink) { + protected static void openUrl(@NonNull Context ctx, + @NonNull OsmandApplication app, + @Nullable String title, + @NonNull String url, + boolean externalLink, + boolean hasImageUrl) { if (externalLink) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); @@ -84,12 +90,14 @@ public abstract class AbstractCard { final WebView wv = new WebView(ctx); WebSettings settings = wv.getSettings(); - /* - settings.setDefaultTextEncodingName("utf-8"); - settings.setBuiltInZoomControls(true); - settings.setDisplayZoomControls(false); - settings.setSupportZoom(true); + if (hasImageUrl) { + settings.setDefaultTextEncodingName("utf-8"); + settings.setBuiltInZoomControls(true); + settings.setDisplayZoomControls(false); + settings.setSupportZoom(true); + } + /* //Scale web view font size with system font size float scale = ctx.getResources().getConfiguration().fontScale; if (android.os.Build.VERSION.SDK_INT >= 14) { @@ -111,7 +119,11 @@ public abstract class AbstractCard { wv.setBackgroundColor(Color.argb(1, 0, 0, 0)); //wv.setScrollContainer(false); wv.getSettings().setJavaScriptEnabled(true); - wv.loadUrl(url); + if (hasImageUrl) { + wv.loadData("", "text/html", "UTF-8"); + } else { + wv.loadUrl(url); + } ll.addView(topBar); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java index 343a875060..e960ebd774 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java @@ -5,6 +5,7 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.widget.AppCompatButton; import android.view.View; import android.view.View.OnClickListener; @@ -38,29 +39,32 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import static java.text.DateFormat.FULL; - public abstract class ImageCard extends AbstractCard { - private String type; + public static String TYPE_MAPILLARY_PHOTO = "mapillary-photo"; + public static String TYPE_MAPILLARY_CONTRIBUTE = "mapillary-contribute"; + + protected String type; // Image location - private LatLon location; - // (optional) Image's camera angle in range [0, 360]. - private double ca = Double.NaN; - // Date When bitmap was captured. - private Date timestamp; - // Image key. - private String key; + protected LatLon location; + // (optional) Image's camera angle in range [0, 360] + protected double ca = Double.NaN; + // Date When bitmap was captured + protected Date timestamp; + // Image key + protected String key; + // Image title + protected String title; // User name - private String userName; + protected String userName; // Image viewer url - private String url; + protected String url; // Image bitmap url - private String imageUrl; + protected String imageUrl; // Image high resolution bitmap url - private String imageHiresUrl; + protected String imageHiresUrl; // true if external browser should to be opened, open webview otherwise - private boolean externalLink; + protected boolean externalLink; protected int topIconId; protected int buttonIconId; @@ -76,7 +80,8 @@ public abstract class ImageCard extends AbstractCard { protected OnClickListener onClickListener; protected OnClickListener onButtonClickListener; - private static final DateFormat DATE_FORMAT = SimpleDateFormat.getDateTimeInstance(FULL, FULL, Locale.US); //"yyyy-MM-dd'T'HH:mm:ss"); + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); + private boolean downloading; private boolean downloaded; private Bitmap bitmap; @@ -85,75 +90,80 @@ public abstract class ImageCard extends AbstractCard { public ImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity); - try { - if (imageObject.has("type")) { - this.type = imageObject.getString("type"); - } - if (imageObject.has("ca") && !imageObject.isNull("ca")) { - this.ca = imageObject.getDouble("ca"); - } - if (imageObject.has("lat") && imageObject.has("lon")) { - double latitude = imageObject.getDouble("lat"); - double longitude = imageObject.getDouble("lon"); - this.location = new LatLon(latitude, longitude); - } - if (imageObject.has("timestamp")) { - try { - this.timestamp = DATE_FORMAT.parse(imageObject.getString("timestamp")); - } catch (ParseException e) { - e.printStackTrace(); + if (imageObject != null) { + try { + if (imageObject.has("type")) { + this.type = imageObject.getString("type"); } - } - if (imageObject.has("key")) { - this.key = imageObject.getString("key"); - } - if (imageObject.has("username")) { - this.userName = imageObject.getString("username"); - } - if (imageObject.has("url")) { - this.url = imageObject.getString("url"); - } - if (imageObject.has("imageUrl")) { - this.imageUrl = imageObject.getString("imageUrl"); - } - if (imageObject.has("imageHiresUrl")) { - this.imageHiresUrl = imageObject.getString("imageHiresUrl"); - } - if (imageObject.has("externalLink") && !imageObject.isNull("externalLink")) { - this.externalLink = imageObject.getBoolean("externalLink"); - } - if (imageObject.has("topIcon") && !imageObject.isNull("topIcon")) { - this.topIconId = getDrawableId(imageObject.getString("topIcon")); - } - if (imageObject.has("buttonIcon") && !imageObject.isNull("buttonIcon")) { - this.buttonIconId = getDrawableId(imageObject.getString("buttonIcon")); - } - if (imageObject.has("buttonText") && !imageObject.isNull("buttonText")) { - this.buttonText = imageObject.getString("buttonText"); - } - if (imageObject.has("buttonIconColor") && !imageObject.isNull("buttonIconColor")) { - try { - this.buttonIconColor = Algorithms.parseColor(imageObject.getString("buttonIconColor")); - } catch (IllegalArgumentException e) { - e.printStackTrace(); + if (imageObject.has("ca") && !imageObject.isNull("ca")) { + this.ca = imageObject.getDouble("ca"); } - } - if (imageObject.has("buttonColor") && !imageObject.isNull("buttonColor")) { - try { - this.buttonColor = Algorithms.parseColor(imageObject.getString("buttonColor")); - } catch (IllegalArgumentException e) { - e.printStackTrace(); + if (imageObject.has("lat") && imageObject.has("lon")) { + double latitude = imageObject.getDouble("lat"); + double longitude = imageObject.getDouble("lon"); + this.location = new LatLon(latitude, longitude); } - } - if (imageObject.has("buttonTextColor") && !imageObject.isNull("buttonTextColor")) { - try { - this.buttonTextColor = Algorithms.parseColor(imageObject.getString("buttonTextColor")); - } catch (IllegalArgumentException e) { - e.printStackTrace(); + if (imageObject.has("timestamp")) { + try { + this.timestamp = DATE_FORMAT.parse(imageObject.getString("timestamp")); + } catch (ParseException e) { + e.printStackTrace(); + } } + if (imageObject.has("key")) { + this.key = imageObject.getString("key"); + } + if (imageObject.has("title")) { + this.title = imageObject.getString("title"); + } + if (imageObject.has("username")) { + this.userName = imageObject.getString("username"); + } + if (imageObject.has("url")) { + this.url = imageObject.getString("url"); + } + if (imageObject.has("imageUrl")) { + this.imageUrl = imageObject.getString("imageUrl"); + } + if (imageObject.has("imageHiresUrl")) { + this.imageHiresUrl = imageObject.getString("imageHiresUrl"); + } + if (imageObject.has("externalLink") && !imageObject.isNull("externalLink")) { + this.externalLink = imageObject.getBoolean("externalLink"); + } + if (imageObject.has("topIcon") && !imageObject.isNull("topIcon")) { + this.topIconId = getDrawableId(imageObject.getString("topIcon")); + } + if (imageObject.has("buttonIcon") && !imageObject.isNull("buttonIcon")) { + this.buttonIconId = getDrawableId(imageObject.getString("buttonIcon")); + } + if (imageObject.has("buttonText") && !imageObject.isNull("buttonText")) { + this.buttonText = imageObject.getString("buttonText"); + } + if (imageObject.has("buttonIconColor") && !imageObject.isNull("buttonIconColor")) { + try { + this.buttonIconColor = Algorithms.parseColor(imageObject.getString("buttonIconColor")); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + } + if (imageObject.has("buttonColor") && !imageObject.isNull("buttonColor")) { + try { + this.buttonColor = Algorithms.parseColor(imageObject.getString("buttonColor")); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + } + if (imageObject.has("buttonTextColor") && !imageObject.isNull("buttonTextColor")) { + try { + this.buttonTextColor = Algorithms.parseColor(imageObject.getString("buttonTextColor")); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } } @@ -170,9 +180,9 @@ public abstract class ImageCard extends AbstractCard { try { if (imageObject.has("type")) { String type = imageObject.getString("type"); - if ("mapillary-photo".equals(type)) { + if (TYPE_MAPILLARY_PHOTO.equals(type)) { imageCard = new MapillaryImageCard(mapActivity, imageObject); - } else if ("mapillary-contribute".equals(type)) { + } else if (TYPE_MAPILLARY_CONTRIBUTE.equals(type)) { imageCard = new MapillaryContributeCard(mapActivity, imageObject); } else { imageCard = new UrlImageCard(mapActivity, imageObject); @@ -192,6 +202,10 @@ public abstract class ImageCard extends AbstractCard { return key; } + public String getTitle() { + return title; + } + public String getType() { return type; } @@ -302,9 +316,11 @@ public abstract class ImageCard extends AbstractCard { if (view != null) { ImageView image = (ImageView) view.findViewById(R.id.image); ImageView iconImageView = (ImageView) view.findViewById(R.id.icon); + TextView urlTextView = (TextView) view.findViewById(R.id.url); TextView watermarkTextView = (TextView) view.findViewById(R.id.watermark); ProgressBar progress = (ProgressBar) view.findViewById(R.id.progress); AppCompatButton button = (AppCompatButton) view.findViewById(R.id.button); + if (icon == null && topIconId != 0) { icon = getMyApplication().getIconsCache().getIcon(topIconId); } @@ -328,6 +344,12 @@ public abstract class ImageCard extends AbstractCard { } else { progress.setVisibility(View.GONE); image.setImageBitmap(bitmap); + if (bitmap == null) { + urlTextView.setVisibility(View.VISIBLE); + urlTextView.setText(getUrl()); + } else { + urlTextView.setVisibility(View.GONE); + } } if (onClickListener != null) { view.findViewById(R.id.image_card).setOnClickListener(new OnClickListener() { @@ -377,17 +399,22 @@ public abstract class ImageCard extends AbstractCard { private MapActivity mapActivity; private OsmandApplication app; private LatLon latLon; + private Map params; private GetImageCardsListener listener; private List result; public interface GetImageCardsListener { + void onPostProcess(List cardList); + void onFinish(List cardList); } - public GetImageCardsTask(@NonNull MapActivity mapActivity, LatLon latLon, GetImageCardsListener listener) { + public GetImageCardsTask(@NonNull MapActivity mapActivity, LatLon latLon, + @Nullable Map params, GetImageCardsListener listener) { this.mapActivity = mapActivity; this.app = mapActivity.getMyApplication(); this.latLon = latLon; + this.params = params; this.listener = listener; } @@ -410,6 +437,9 @@ public abstract class ImageCard extends AbstractCard { if (!Algorithms.isEmpty(preferredLang)) { pms.put("lang", preferredLang); } + if (this.params != null) { + pms.putAll(this.params); + } String response = AndroidNetworkUtils.sendRequest(app, "https://osmand.net/api/cm_place.php", pms, "Requesting location images...", false, false); @@ -435,6 +465,9 @@ public abstract class ImageCard extends AbstractCard { } catch (Exception e) { e.printStackTrace(); } + if (listener != null) { + listener.onPostProcess(result); + } return result; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java index cae773173b..27d8525c04 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java @@ -12,11 +12,22 @@ public class UrlImageCard extends ImageCard { public UrlImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity, imageObject); - if (!Algorithms.isEmpty(getUrl())) { + + final String url; + final boolean hasImageUrl; + if (Algorithms.isEmpty(getImageHiresUrl())) { + url = getUrl(); + hasImageUrl = false; + } else { + url = getImageHiresUrl(); + hasImageUrl = true; + } + + if (!Algorithms.isEmpty(url)) { OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { - openUrl(getMapActivity(), getMyApplication(), "", getUrl(), isExternalLink()); + openUrl(getMapActivity(), getMyApplication(), getTitle(), url, isExternalLink(), hasImageUrl); } }; if (!Algorithms.isEmpty(buttonText)) { From 5df51ebe3ca623e913ea35e805e8f45b11695a0c Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Tue, 17 Oct 2017 20:47:38 +0300 Subject: [PATCH 022/187] Fix osm image/mapillary processing --- .../plus/mapcontextmenu/MenuBuilder.java | 12 ++++----- .../builders/AmenityMenuBuilder.java | 4 +-- .../builders/cards/AbstractCard.java | 8 ++++++ .../builders/cards/ImageCard.java | 16 +++++++----- .../builders/cards/UrlImageCard.java | 26 ++++++++++--------- 5 files changed, 40 insertions(+), 26 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index f58a4b72ec..022f9fdb98 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -42,7 +42,6 @@ import net.osmand.plus.mapcontextmenu.builders.cards.AbstractCard; import net.osmand.plus.mapcontextmenu.builders.cards.CardsRowBuilder; import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask; -import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.GetImageCardsListener; import net.osmand.plus.mapcontextmenu.builders.cards.NoImagesCard; import net.osmand.plus.render.RenderingIcons; import net.osmand.util.Algorithms; @@ -56,6 +55,7 @@ import java.util.List; import java.util.Map; import static android.util.TypedValue.COMPLEX_UNIT_DIP; +import static net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask.*; public class MenuBuilder { @@ -350,7 +350,7 @@ public class MenuBuilder { @Override public void onCollapseExpand(boolean collapsed) { if (!collapsed && onlinePhotoCards == null) { - startLoadingImages(MenuBuilder.this); + startLoadingImages(); } } }); @@ -360,14 +360,14 @@ public class MenuBuilder { if (needUpdateOnly && onlinePhotoCards != null) { onlinePhotoCardsRow.setCards(onlinePhotoCards); } else if (!collapsableView.isCollapsed()) { - startLoadingImages(this); + startLoadingImages(); } } - private void startLoadingImages(final MenuBuilder menuBuilder) { + private void startLoadingImages() { onlinePhotoCards = new ArrayList<>(); onlinePhotoCardsRow.setProgressCard(); - execute(new GetImageCardsTask(mapActivity, menuBuilder.getLatLon(), getAdditionalCardParams(), + execute(new GetImageCardsTask(mapActivity, getLatLon(), getAdditionalCardParams(), new GetImageCardsListener() { @Override public void onPostProcess(List cardList) { @@ -376,7 +376,7 @@ public class MenuBuilder { @Override public void onFinish(List cardList) { - if (!menuBuilder.isHidden()) { + if (!isHidden()) { List cards = new ArrayList<>(); cards.addAll(cardList); if (cardList.size() == 0) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 8330458ee4..8d1bdeef6d 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -518,10 +518,10 @@ public class AmenityMenuBuilder extends MenuBuilder { String imageValue = additionalInfo.get("image"); String mapillaryValue = additionalInfo.get("mapillary"); if (!Algorithms.isEmpty(imageValue)) { - params.put("image", imageValue); + params.put("osm_image", imageValue); } if (!Algorithms.isEmpty(mapillaryValue)) { - params.put("mapillary", mapillaryValue); + params.put("osm_mapillary_key", mapillaryValue); } return params; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java index c0b9de5795..5669cb1fd7 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/AbstractCard.java @@ -16,6 +16,7 @@ import android.view.LayoutInflater; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; +import android.webkit.WebViewClient; import android.widget.LinearLayout; import net.osmand.plus.OsmandApplication; @@ -89,6 +90,13 @@ public abstract class AbstractCard { }); final WebView wv = new WebView(ctx); + wv.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return false; + } + }); + WebSettings settings = wv.getSettings(); if (hasImageUrl) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java index e960ebd774..4e3d69b652 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java @@ -98,7 +98,8 @@ public abstract class ImageCard extends AbstractCard { if (imageObject.has("ca") && !imageObject.isNull("ca")) { this.ca = imageObject.getDouble("ca"); } - if (imageObject.has("lat") && imageObject.has("lon")) { + if (imageObject.has("lat") && imageObject.has("lon") + && !imageObject.isNull("lat") && !imageObject.isNull("lon")) { double latitude = imageObject.getDouble("lat"); double longitude = imageObject.getDouble("lon"); this.location = new LatLon(latitude, longitude); @@ -113,19 +114,19 @@ public abstract class ImageCard extends AbstractCard { if (imageObject.has("key")) { this.key = imageObject.getString("key"); } - if (imageObject.has("title")) { + if (imageObject.has("title") && !imageObject.isNull("title")) { this.title = imageObject.getString("title"); } - if (imageObject.has("username")) { + if (imageObject.has("username") && !imageObject.isNull("username")) { this.userName = imageObject.getString("username"); } - if (imageObject.has("url")) { + if (imageObject.has("url") && !imageObject.isNull("url")) { this.url = imageObject.getString("url"); } - if (imageObject.has("imageUrl")) { + if (imageObject.has("imageUrl") && !imageObject.isNull("imageUrl")) { this.imageUrl = imageObject.getString("imageUrl"); } - if (imageObject.has("imageHiresUrl")) { + if (imageObject.has("imageHiresUrl") && !imageObject.isNull("imageHiresUrl")) { this.imageHiresUrl = imageObject.getString("imageHiresUrl"); } if (imageObject.has("externalLink") && !imageObject.isNull("externalLink")) { @@ -498,6 +499,9 @@ public abstract class ImageCard extends AbstractCard { downloading = false; downloaded = true; ImageCard.this.bitmap = bitmap; + if (bitmap != null && Algorithms.isEmpty(getImageHiresUrl())) { + ImageCard.this.imageHiresUrl = getUrl(); + } update(); } } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java index 27d8525c04..313305cf67 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/UrlImageCard.java @@ -13,21 +13,13 @@ public class UrlImageCard extends ImageCard { public UrlImageCard(MapActivity mapActivity, JSONObject imageObject) { super(mapActivity, imageObject); - final String url; - final boolean hasImageUrl; - if (Algorithms.isEmpty(getImageHiresUrl())) { - url = getUrl(); - hasImageUrl = false; - } else { - url = getImageHiresUrl(); - hasImageUrl = true; - } - - if (!Algorithms.isEmpty(url)) { + if (!Algorithms.isEmpty(getSuitableUrl())) { OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { - openUrl(getMapActivity(), getMyApplication(), getTitle(), url, isExternalLink(), hasImageUrl); + openUrl(getMapActivity(), getMyApplication(), getTitle(), getSuitableUrl(), + isExternalLink() || Algorithms.isEmpty(getImageHiresUrl()), + !Algorithms.isEmpty(getImageHiresUrl())); } }; if (!Algorithms.isEmpty(buttonText)) { @@ -37,4 +29,14 @@ public class UrlImageCard extends ImageCard { } } } + + private String getSuitableUrl() { + final String url; + if (Algorithms.isEmpty(getImageHiresUrl())) { + url = getUrl(); + } else { + url = getImageHiresUrl(); + } + return url; + } } From b1f4da214b19ffa307831d037545b635dcc51034 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Wed, 18 Oct 2017 08:54:11 +0300 Subject: [PATCH 023/187] Fix activity not found --- OsmAnd/src/net/osmand/plus/Version.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/Version.java b/OsmAnd/src/net/osmand/plus/Version.java index 5600d8c073..bfc4fbfd31 100644 --- a/OsmAnd/src/net/osmand/plus/Version.java +++ b/OsmAnd/src/net/osmand/plus/Version.java @@ -26,11 +26,20 @@ public class Version { public static boolean isMarketEnabled(OsmandApplication ctx) { return isGooglePlayEnabled(ctx) || isAmazonEnabled(ctx); } + + public static boolean isGooglePlayInstalled(OsmandApplication ctx) { + try { + ctx.getPackageManager().getPackageInfo("com.android.vending", 0); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + return true; + } public static String marketPrefix(OsmandApplication ctx) { if (isAmazonEnabled(ctx)) { return "amzn://apps/android?p="; - } else if (isGooglePlayEnabled(ctx)) { + } else if (isGooglePlayEnabled(ctx) && isGooglePlayInstalled(ctx)) { return "market://details?id="; } return "https://osmand.net/apps?id="; From f9bf198ee8d1fd8cbc9064a1d944f9107cf28879 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 18 Oct 2017 13:29:54 +0300 Subject: [PATCH 024/187] Add show direction menu to configure screen --- ...howDirectionBottomSheetDialogFragment.java | 6 +++- .../views/mapwidgets/MapWidgetRegistry.java | 29 +++++-------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java index 1b1a59ee83..dacf153f6c 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java @@ -282,6 +282,10 @@ public class ShowDirectionBottomSheetDialogFragment extends BottomSheetDialogFra showDirectionEnabled = false; break; } + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.refreshMap(); + } if (listener != null) { listener.onMapMarkersModeChanged(showDirectionEnabled); } @@ -289,7 +293,7 @@ public class ShowDirectionBottomSheetDialogFragment extends BottomSheetDialogFra } }; - interface ShowDirectionFragmentListener { + public interface ShowDirectionFragmentListener { void onMapMarkersModeChanged(boolean showDirectionEnabled); } } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java index 0735984144..b95c2d5289 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java @@ -1,11 +1,9 @@ package net.osmand.plus.views.mapwidgets; import android.content.Context; -import android.content.DialogInterface; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.StringRes; -import android.support.v7.app.AlertDialog; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -19,16 +17,15 @@ import net.osmand.plus.ContextMenuItem; import net.osmand.plus.IconsCache; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; -import net.osmand.plus.OsmandSettings.MapMarkersMode; import net.osmand.plus.OsmandSettings.OsmandPreference; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.dialogs.ConfigureMapMenu; +import net.osmand.plus.mapmarkers.ShowDirectionBottomSheetDialogFragment; import net.osmand.plus.quickaction.QuickActionListFragment; import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.MapQuickActionLayer; import net.osmand.plus.views.OsmandMapLayer.DrawSettings; -import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.widgets.IconPopupMenu; import java.util.Collections; @@ -329,27 +326,17 @@ public class MapWidgetRegistry { .setDescription(settings.MAP_MARKERS_MODE.get().toHumanString(map)) .setListener(new ContextMenuAdapter.ItemClickListener() { @Override - public boolean onContextMenuClick(final ArrayAdapter ad, - int itemId, final int pos, boolean isChecked) { - final OsmandMapTileView view = map.getMapView(); - AlertDialog.Builder bld = new AlertDialog.Builder(view.getContext()); - bld.setTitle(R.string.map_markers); - final String[] items = new String[MapMarkersMode.values().length]; - for (int i = 0; i < items.length; i++) { - items[i] = MapMarkersMode.values()[i].toHumanString(map); - } - int i = settings.MAP_MARKERS_MODE.get().ordinal(); - bld.setSingleChoiceItems(items, i, new DialogInterface.OnClickListener() { + public boolean onContextMenuClick(final ArrayAdapter adapter, int itemId, final int position, boolean isChecked) { + ShowDirectionBottomSheetDialogFragment fragment = new ShowDirectionBottomSheetDialogFragment(); + fragment.setListener(new ShowDirectionBottomSheetDialogFragment.ShowDirectionFragmentListener() { @Override - public void onClick(DialogInterface dialog, int which) { - settings.MAP_MARKERS_MODE.set(MapMarkersMode.values()[which]); + public void onMapMarkersModeChanged(boolean showDirectionEnabled) { updateMapMarkersMode(map); - dialog.dismiss(); - cm.getItem(pos).setDescription(settings.MAP_MARKERS_MODE.get().toHumanString(map)); - ad.notifyDataSetChanged(); + cm.getItem(position).setDescription(settings.MAP_MARKERS_MODE.get().toHumanString(map)); + adapter.notifyDataSetChanged(); } }); - bld.show(); + fragment.show(map.getSupportFragmentManager(), ShowDirectionBottomSheetDialogFragment.TAG); return false; } }).setLayout(R.layout.list_item_text_button).createItem()); From 334ef116b3df7994cec7b91ebea9f4fe687b9762 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 18 Oct 2017 14:47:47 +0300 Subject: [PATCH 025/187] Add search prefix and change openstreetmap correspondingly --- OsmAnd/AndroidManifest.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index af7edc7f44..145d61cedf 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -232,7 +232,11 @@ - + + + + + From 6bf3f70f48847c104482e2f527da9e4a795595ca Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 18 Oct 2017 13:59:10 +0200 Subject: [PATCH 026/187] Fix #3665 --- .../osmand/router/RouteResultPreparation.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java index 99e26ca3e2..00738df442 100644 --- a/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/net/osmand/router/RouteResultPreparation.java @@ -1429,16 +1429,16 @@ public class RouteResultPreparation { } } } - // remove all non-slight turns - if(possibleTurns.size() > 1) { - TIntIterator it = possibleTurns.iterator(); - while(it.hasNext()) { - int nxt = it.next(); - if(!TurnType.isSlightTurn(nxt)) { - it.remove(); - } - } - } + // remove all non-slight turns // TEST don't pass +// if(possibleTurns.size() > 1) { +// TIntIterator it = possibleTurns.iterator(); +// while(it.hasNext()) { +// int nxt = it.next(); +// if(!TurnType.isSlightTurn(nxt)) { +// it.remove(); +// } +// } +// } int infer = 0; if (possibleTurns.size() == 1) { infer = possibleTurns.iterator().next(); From 162605aa345899d783aeaeca1761a3d3e39e5672 Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Wed, 18 Oct 2017 15:43:19 +0300 Subject: [PATCH 027/187] Fix #4266 --- .../res/layout/map_context_menu_fragment.xml | 29 +++++ .../plus/mapcontextmenu/MapContextMenu.java | 51 ++++++-- .../MapContextMenuFragment.java | 112 ++++++++++++++---- .../plus/mapcontextmenu/MenuController.java | 4 + .../osmand/plus/views/MapControlsLayer.java | 17 ++- .../mapwidgets/MapInfoWidgetsFactory.java | 4 +- .../mapwidgets/MapMarkersWidgetsFactory.java | 2 +- 7 files changed, 179 insertions(+), 40 deletions(-) diff --git a/OsmAnd/res/layout/map_context_menu_fragment.xml b/OsmAnd/res/layout/map_context_menu_fragment.xml index e51c489a04..1924bf56a3 100644 --- a/OsmAnd/res/layout/map_context_menu_fragment.xml +++ b/OsmAnd/res/layout/map_context_menu_fragment.xml @@ -436,6 +436,35 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + + fragmentRef = findMenuFragment(); + if (fragmentRef != null) { + fragmentRef.get().doZoomIn(); + return true; + } + return false; + } + + public boolean zoomOutPressed() { + WeakReference fragmentRef = findMenuFragment(); + if (fragmentRef != null) { + fragmentRef.get().doZoomOut(); + return true; + } + return false; + } + public void buttonWaypointPressed() { if (pointDescription.isDestination()) { mapActivity.getMapActions().editWaypoints(); @@ -1033,6 +1060,10 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL return menuController == null || menuController.fabVisible(); } + public boolean zoomButtonsVisible() { + return menuController == null || menuController.zoomButtonsVisible(); + } + public boolean isClosable() { return menuController == null || menuController.isClosable(); } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index 3f83428f8c..02422e6039 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -66,7 +66,10 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { private View view; private View mainView; - ImageView fabView; + private ImageView fabView; + private View zoomButtonsView; + private ImageButton zoomInButtonView; + private ImageButton zoomOutButtonView; private MapContextMenu menu; private OnLayoutChangeListener containerLayoutListener; @@ -83,6 +86,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { private int screenHeight; private int viewHeight; + private int zoomButtonsHeight; private int fabPaddingTopPx; private int markerPaddingPx; @@ -257,7 +261,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { if (singleTapDetector.onTouchEvent(event)) { moving = false; if (hasMoved) { - applyPosY(getViewY(), false, false, 0, 0); + applyPosY(getViewY(), false, false, 0, 0, 0); } openMenuHalfScreen(); return true; @@ -386,6 +390,32 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { fabView.setVisibility(View.GONE); } + // Zoom buttons + zoomButtonsView = view.findViewById(R.id.context_menu_zoom_buttons); + zoomInButtonView = (ImageButton) view.findViewById(R.id.context_menu_zoom_in_button); + zoomOutButtonView = (ImageButton) view.findViewById(R.id.context_menu_zoom_out_button); + if (menu.zoomButtonsVisible()) { + updateImageButton(zoomInButtonView, R.drawable.map_zoom_in, R.drawable.map_zoom_in_night, + R.drawable.btn_circle_trans, R.drawable.btn_circle_night, nightMode); + updateImageButton(zoomOutButtonView, R.drawable.map_zoom_out, R.drawable.map_zoom_out_night, + R.drawable.btn_circle_trans, R.drawable.btn_circle_night, nightMode); + zoomInButtonView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + menu.zoomInPressed(); + } + }); + zoomOutButtonView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + menu.zoomOutPressed(); + } + }); + zoomButtonsView.setVisibility(View.VISIBLE); + } else { + zoomButtonsView.setVisibility(View.GONE); + } + View buttonsTopBorder = view.findViewById(R.id.buttons_top_border); AndroidUtils.setBackground(getMapActivity(), buttonsTopBorder, nightMode, R.color.dashboard_divider_light, R.color.dashboard_divider_dark); @@ -481,6 +511,16 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { return view; } + private void updateImageButton(ImageButton button, int iconLightId, int iconDarkId, int bgLightId, int bgDarkId, boolean night) { + button.setImageDrawable(getMapActivity().getMyApplication().getIconsCache().getIcon(night ? iconDarkId : iconLightId)); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { + button.setBackground(getMapActivity().getResources().getDrawable(night ? bgDarkId : bgLightId, + getMapActivity().getTheme())); + } else { + button.setBackgroundDrawable(getMapActivity().getResources().getDrawable(night ? bgDarkId : bgLightId)); + } + } + private void processScreenHeight(ViewParent parent) { View container = (View)parent; if (Build.VERSION.SDK_INT >= 11) { @@ -525,17 +565,33 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { boolean needMapAdjust = oldMenuState != newMenuState && newMenuState != MenuState.FULL_SCREEN; if (newMenuState != oldMenuState) { - menu.updateControlsVisibility(); + menu.updateControlsVisibility(true); doBeforeMenuStateChange(oldMenuState, newMenuState); } - applyPosY(currentY, needCloseMenu, needMapAdjust, oldMenuState, newMenuState); + applyPosY(currentY, needCloseMenu, needMapAdjust, oldMenuState, newMenuState, 0); + } + + public void doZoomIn() { + if (!centered) { + centered = true; + calculateCenterLatLon(menu.getLatLon(), getZoom() + 1, true); + } + applyPosY(getViewY(), false, true, 0, 0, 1); + } + + public void doZoomOut() { + if (!centered) { + centered = true; + calculateCenterLatLon(menu.getLatLon(), getZoom() - 1, true); + } + applyPosY(getViewY(), false, true, 0, 0, -1); } private void applyPosY(final int currentY, final boolean needCloseMenu, boolean needMapAdjust, - final int previousMenuState, final int newMenuState) { + final int previousMenuState, final int newMenuState, int dZoom) { final int posY = getPosY(needCloseMenu); - if (currentY != posY) { + if (currentY != posY || dZoom != 0) { if (posY < currentY) { updateMainViewLayout(posY); } @@ -574,8 +630,13 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { .setInterpolator(new DecelerateInterpolator()) .start(); + zoomButtonsView.animate().y(getZoomButtonsY(posY)) + .setDuration(200) + .setInterpolator(new DecelerateInterpolator()) + .start(); + if (needMapAdjust) { - adjustMapPosition(posY, true, centered); + adjustMapPosition(posY, true, centered, dZoom); } } else { setViewY(posY, false, needMapAdjust); @@ -791,7 +852,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { if (parent != null && containerLayoutListener != null) { ((View) parent).addOnLayoutChangeListener(containerLayoutListener); } - + menu.updateControlsVisibility(true); } @Override @@ -805,6 +866,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { if (!wasDrawerDisabled) { getMapActivity().enableDrawer(); } + menu.updateControlsVisibility(false); super.onPause(); } @@ -874,6 +936,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { menuTopShadowHeight = view.findViewById(R.id.context_menu_top_shadow).getHeight(); int newMenuTopShadowAllHeight = view.findViewById(R.id.context_menu_top_shadow_all).getHeight(); menuFullHeight = view.findViewById(R.id.context_menu_main).getHeight(); + zoomButtonsHeight = zoomButtonsView.getHeight(); int dy = 0; if (!menu.isLandscapeLayout()) { @@ -960,7 +1023,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { public void centerMarkerLocation() { centered = true; - showOnMap(menu.getLatLon(), true, true, false); + showOnMap(menu.getLatLon(), true, true, false, getZoom()); } private int getZoom() { @@ -994,21 +1057,20 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { return new LatLon(flat, flon); } - private void showOnMap(LatLon latLon, boolean updateCoords, boolean needMove, boolean alreadyAdjusted) { + private void showOnMap(LatLon latLon, boolean updateCoords, boolean needMove, boolean alreadyAdjusted, int zoom) { AnimateDraggingMapThread thread = map.getAnimatedDraggingThread(); - int fZoom = getZoom(); - LatLon calcLatLon = calculateCenterLatLon(latLon, fZoom, updateCoords); + LatLon calcLatLon = calculateCenterLatLon(latLon, zoom, updateCoords); if (updateCoords) { mapCenter = calcLatLon; menu.setMapCenter(mapCenter); } if (!alreadyAdjusted) { - calcLatLon = getAdjustedMarkerLocation(getPosY(), calcLatLon, true, fZoom); + calcLatLon = getAdjustedMarkerLocation(getPosY(), calcLatLon, true, zoom); } if (needMove) { - thread.startMoving(calcLatLon.getLatitude(), calcLatLon.getLongitude(), fZoom, true); + thread.startMoving(calcLatLon.getLatitude(), calcLatLon.getLongitude(), zoom, true); } } @@ -1137,30 +1199,36 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { if (!oldAndroid()) { mainView.setY(y); fabView.setY(getFabY(y)); + zoomButtonsView.setY(getZoomButtonsY(y)); } else { mainView.setPadding(0, y, 0, 0); fabView.setPadding(0, getFabY(y), 0, 0); + zoomButtonsView.setPadding(0, getZoomButtonsY(y), 0, 0); } if (!customMapCenter) { if (adjustMapPos) { - adjustMapPosition(y, animated, centered); + adjustMapPosition(y, animated, centered, 0); } } else { customMapCenter = false; } } - private void adjustMapPosition(int y, boolean animated, boolean center) { + private void adjustMapPosition(int y, boolean animated, boolean center, int dZoom) { map.getAnimatedDraggingThread().stopAnimatingSync(); - LatLon latlon = getAdjustedMarkerLocation(y, menu.getLatLon(), center, getZoom()); + int zoom = getZoom() + dZoom; + LatLon latlon = getAdjustedMarkerLocation(y, menu.getLatLon(), center, zoom); - if (map.getLatitude() == latlon.getLatitude() && map.getLongitude() == latlon.getLongitude()) { + if (map.getLatitude() == latlon.getLatitude() && map.getLongitude() == latlon.getLongitude() && dZoom == 0) { return; } if (animated) { - showOnMap(latlon, false, true, true); + showOnMap(latlon, false, true, true, zoom); } else { + if (dZoom != 0) { + map.setIntZoom(zoom); + } map.setLatLon(latlon.getLatitude(), latlon.getLongitude()); } } @@ -1236,6 +1304,10 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { return fabY; } + private int getZoomButtonsY(int y) { + return y - zoomButtonsHeight - fabPaddingTopPx; + } + private boolean oldAndroid() { return (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH); } @@ -1268,7 +1340,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { if (mapCenter != null) { map.setLatLon(mapCenter.getLatitude(), mapCenter.getLongitude()); } - adjustMapPosition(getPosY(), true, false); + adjustMapPosition(getPosY(), true, false, 0); } else { view.setVisibility(View.GONE); } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java index d7e9d64af4..e6e0d4faa2 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java @@ -353,6 +353,10 @@ public abstract class MenuController extends BaseMenuController { return true; } + public boolean zoomButtonsVisible() { + return !isLandscapeLayout(); + } + public boolean buttonsVisible() { return true; } diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index d1b750845f..9d4d5e82e1 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -628,12 +628,14 @@ public class MapControlsLayer extends OsmandMapLayer { zoomInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + if (mapActivity.getContextMenu().zoomInPressed()) { + return; + } if (view.isZooming()) { mapActivity.changeZoom(2, System.currentTimeMillis()); } else { mapActivity.changeZoom(1, System.currentTimeMillis()); } - } }); final View.OnLongClickListener listener = MapControlsLayer.getOnClickMagnifierListener(view); @@ -645,6 +647,9 @@ public class MapControlsLayer extends OsmandMapLayer { zoomOutButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + if (mapActivity.getContextMenu().zoomOutPressed()) { + return; + } mapActivity.changeZoom(-1, System.currentTimeMillis()); } }); @@ -708,7 +713,7 @@ public class MapControlsLayer extends OsmandMapLayer { boolean routeFollowingMode = !routePlanningMode && rh.isFollowingMode(); boolean routeDialogOpened = MapRouteInfoMenu.isVisible(); boolean trackDialogOpened = TrackDetailsMenu.isVisible(); - boolean contextMenuOpened = mapActivity.getContextMenu().shouldShowControls(); + boolean contextMenuOpened = mapActivity.getContextMenu().shouldShowTopControls(); boolean showRouteCalculationControls = routePlanningMode || ((app.accessibilityEnabled() || (System.currentTimeMillis() - touchEvent < TIMEOUT_TO_SHOW_BUTTONS)) && routeFollowingMode); updateMyLocation(rh, routeDialogOpened || trackDialogOpened || !contextMenuOpened); @@ -790,8 +795,8 @@ public class MapControlsLayer extends OsmandMapLayer { private boolean shouldShowCompass() { float mapRotate = mapActivity.getMapView().getRotate(); return forceShowCompass || mapRotate != 0 - || settings.ROTATE_MAP.get() != OsmandSettings.ROTATE_MAP_NONE - || mapActivity.getMapLayers().getMapInfoLayer().getMapInfoControls().isVisible("compass"); + || settings.ROTATE_MAP.get() != OsmandSettings.ROTATE_MAP_NONE + || mapActivity.getMapLayers().getMapInfoLayer().getMapInfoControls().isVisible("compass"); } public CompassDrawable getCompassDrawable(Drawable originalDrawable) { @@ -1122,8 +1127,8 @@ public class MapControlsLayer extends OsmandMapLayer { this.mapQuickActionLayer = mapQuickActionLayer; } - private boolean isInMovingMarkerMode(){ - return mapQuickActionLayer == null ? contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxPointMode(): + private boolean isInMovingMarkerMode() { + return mapQuickActionLayer == null ? contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxPointMode() : mapQuickActionLayer.isInMovingMarkerMode() || contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxPointMode(); } diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index b82129c738..0a62258445 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -28,8 +28,6 @@ import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.WaypointDialogHelper; import net.osmand.plus.helpers.WaypointHelper; import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper; -import net.osmand.plus.mapcontextmenu.MapContextMenu; -import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu; import net.osmand.plus.routing.RouteDirectionInfo; import net.osmand.plus.routing.RoutingHelper; @@ -813,7 +811,7 @@ public class MapInfoWidgetsFactory { } } } - if (map.isTopToolbarActive() || !map.getContextMenu().shouldShowControls()) { + if (map.isTopToolbarActive() || !map.getContextMenu().shouldShowTopControls()) { updateVisibility(false); } else if (!showNextTurn && updateWaypoint()) { updateVisibility(true); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java index d83d387f7a..ad6af0b50a 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java @@ -200,7 +200,7 @@ public class MapMarkersWidgetsFactory { || MapRouteInfoMenu.isVisible() || addressTopBar.getVisibility() == View.VISIBLE || map.isTopToolbarActive() - || !map.getContextMenu().shouldShowControls() + || !map.getContextMenu().shouldShowTopControls() || map.getMapLayers().getMapMarkersLayer().isInPlanRouteMode()) { updateVisibility(false); return; From e09acfce483c47d165e4530b53bc5fc73fea0e2c Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Wed, 18 Oct 2017 18:20:45 +0300 Subject: [PATCH 028/187] Added tap on empty place feature --- .../osmand/plus/activities/MapActivity.java | 2 ++ .../osmand/plus/dashboard/DashboardOnMap.java | 4 +-- .../plus/mapcontextmenu/MapContextMenu.java | 19 ++++++++---- .../MapContextMenuFragment.java | 1 + .../other/MapRouteInfoMenuFragment.java | 1 + .../plus/mapmarkers/PlanRouteFragment.java | 1 + .../MeasurementToolFragment.java | 6 ++++ .../osmand/plus/views/ContextMenuLayer.java | 11 +++++-- .../osmand/plus/views/MapControlsLayer.java | 30 +++++++++++++++++++ 9 files changed, 64 insertions(+), 11 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 4e4f9dc846..4aa1980093 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -913,6 +913,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } public void readLocationToShow() { + mapLayers.getMapControlsLayer().showMapControls(); + LatLon cur = new LatLon(mapView.getLatitude(), mapView.getLongitude()); LatLon latLonToShow = settings.getAndClearMapLocationToShow(); PointDescription mapLabelToShow = settings.getAndClearMapLabelToShow(latLonToShow); diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java b/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java index 3aec39ede8..8438311687 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java @@ -851,7 +851,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis } } mapActivity.findViewById(R.id.toolbar_back).setVisibility(isBackButtonVisible() ? View.VISIBLE : View.GONE); - mapActivity.findViewById(R.id.MapHudButtonsOverlay).setVisibility(View.INVISIBLE); + mapActivity.getMapLayers().getMapControlsLayer().hideMapControls(); boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); if (!portrait) { AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_route_land_left_margin_external), true); @@ -875,7 +875,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, DynamicLis mapActivity.getMapView().refreshMap(); } - mapActivity.findViewById(R.id.MapHudButtonsOverlay).setVisibility(View.VISIBLE); + mapActivity.getMapLayers().getMapControlsLayer().showMapControls(); hideActionButton(); for (WeakReference df : fragList) { if (df.get() != null) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java index d6528205f0..916fb34fb6 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java @@ -413,7 +413,8 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL init(latLon, pointDescription, object); } - public void close() { + public boolean close() { + boolean result = false; if (active) { active = false; if (object instanceof MapMarker) { @@ -428,15 +429,17 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL if (this.object != null) { clearSelectedObject(this.object); } - hide(); + result = hide(); if (menuController != null) { menuController.setActive(false); } mapActivity.refreshMap(); } + return result; } - public void hide() { + public boolean hide() { + boolean result = false; if (mapPosition != 0) { mapActivity.getMapView().setMapPosition(mapPosition); mapPosition = 0; @@ -447,7 +450,9 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL WeakReference fragmentRef = findMenuFragment(); if (fragmentRef != null) { fragmentRef.get().dismissMenu(); + result = true; } + return result; } public void updateControlsVisibility(boolean menuVisible) { @@ -642,18 +647,20 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL } } - public void onSingleTapOnMap() { + public boolean onSingleTapOnMap() { + boolean result = false; if (menuController == null || !menuController.handleSingleTapOnMap()) { if (menuController != null && !menuController.isClosable()) { - hide(); + result = hide(); } else { updateMapCenter(null); - close(); + result = close(); } if (mapActivity.getMapLayers().getMapQuickActionLayer().isLayerOn()) { mapActivity.getMapLayers().getMapQuickActionLayer().refreshLayer(); } } + return result; } @Override diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index 02422e6039..b181e47f40 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -853,6 +853,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { ((View) parent).addOnLayoutChangeListener(containerLayoutListener); } menu.updateControlsVisibility(true); + getMapActivity().getMapLayers().getMapControlsLayer().showMapControls(); } @Override diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenuFragment.java index 6ebf0ee420..1ceedaa33c 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapRouteInfoMenuFragment.java @@ -55,6 +55,7 @@ public class MapRouteInfoMenuFragment extends Fragment { if (menu == null) { dismiss(); } + getMapActivity().getMapLayers().getMapControlsLayer().showMapControls(); } @Override diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java index 434792feef..b55066047c 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java @@ -365,6 +365,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene if (mapActivity != null) { mapActivity.getMyApplication().getLocationProvider().addLocationListener(this); } + getMapActivity().getMapLayers().getMapControlsLayer().showMapControls(); } @Override diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index cc65e048fe..3345225bae 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -457,6 +457,12 @@ public class MeasurementToolFragment extends Fragment { return view; } + @Override + public void onResume() { + super.onResume(); + getMapActivity().getMapLayers().getMapControlsLayer().showMapControls(); + } + @Override public void onDestroyView() { super.onDestroyView(); diff --git a/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java b/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java index 7740d4e12b..350c284eb4 100644 --- a/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java @@ -809,8 +809,11 @@ public class ContextMenuLayer extends OsmandMapLayer { } } - hideVisibleMenues(); - menu.onSingleTapOnMap(); + boolean processed = hideVisibleMenues(); + processed |= menu.onSingleTapOnMap(); + if (!processed) { + activity.getMapLayers().getMapControlsLayer().switchMapControlsVisibility(); + } return false; } @@ -854,10 +857,12 @@ public class ContextMenuLayer extends OsmandMapLayer { return res; } - private void hideVisibleMenues() { + private boolean hideVisibleMenues() { if (multiSelectionMenu.isVisible()) { multiSelectionMenu.hide(); + return true; } + return false; } private void showContextMenuForSelectedObjects(final LatLon latLon, final Map selectedObjects) { diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index 9d4d5e82e1..4895eaa881 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -48,6 +48,7 @@ import net.osmand.plus.dialogs.DirectionsDialogs; import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; +import net.osmand.plus.measurementtool.MeasurementToolFragment; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.views.corenative.NativeCoreContext; @@ -656,6 +657,35 @@ public class MapControlsLayer extends OsmandMapLayer { zoomOutButton.setOnLongClickListener(listener); } + public void showMapControls() { + mapActivity.findViewById(R.id.MapHudButtonsOverlay).setVisibility(View.VISIBLE); + } + public void hideMapControls() { + mapActivity.findViewById(R.id.MapHudButtonsOverlay).setVisibility(View.INVISIBLE); + } + + public void setMapControlsVisibility(boolean visible) { + View mapHudButtonsOverlay = mapActivity.findViewById(R.id.MapHudButtonsOverlay); + mapHudButtonsOverlay.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + } + + public boolean isMapControlsVisible() { + return mapActivity.findViewById(R.id.MapHudButtonsOverlay).getVisibility() == View.VISIBLE; + } + + public void switchMapControlsVisibility() { + if (app.getRoutingHelper().isFollowingMode() || app.getRoutingHelper().isPauseNavigation() + || mapActivity.getMeasurementToolFragment() != null + || mapActivity.getPlanRouteFragment() != null) { + return; + } + if (isMapControlsVisible()) { + hideMapControls(); + } else { + showMapControls(); + } + } + public void startNavigation() { OsmandApplication app = mapActivity.getMyApplication(); RoutingHelper routingHelper = app.getRoutingHelper(); From 2c5995da1961b2446a680703f807942f3ba27f9b Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Wed, 18 Oct 2017 19:14:57 +0300 Subject: [PATCH 029/187] Add new marker menu on map --- .../layout/fragment_marker_menu_on_map.xml | 191 ++++++++++++ OsmAnd/res/values/strings.xml | 1 + .../mapmarkers/MapMarkersActiveFragment.java | 5 +- .../mapmarkers/MarkerMenuOnMapFragment.java | 286 ++++++++++++++++++ 4 files changed, 481 insertions(+), 2 deletions(-) create mode 100644 OsmAnd/res/layout/fragment_marker_menu_on_map.xml create mode 100644 OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java diff --git a/OsmAnd/res/layout/fragment_marker_menu_on_map.xml b/OsmAnd/res/layout/fragment_marker_menu_on_map.xml new file mode 100644 index 0000000000..8278eb87bd --- /dev/null +++ b/OsmAnd/res/layout/fragment_marker_menu_on_map.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index a9418a8cd0..9ac72f6a80 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,7 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Back Wrong format Road Show map diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java index 594f8d7723..6befe63d30 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java @@ -56,9 +56,10 @@ public class MapMarkersActiveFragment extends Fragment implements OsmAndCompassL public void onItemClick(View view) { int pos = recyclerView.getChildAdapterPosition(view); MapMarker marker = adapter.getItem(pos); - mapActivity.getMyApplication().getSettings().setMapLocationToShow(marker.getLatitude(), marker.getLongitude(), - 15, marker.getPointDescription(mapActivity), true, marker); + mapActivity.getMyApplication().getSettings() + .setMapLocationToShow(marker.getLatitude(), marker.getLongitude(), 15, null, false, null); MapActivity.launchMapActivityMoveToTop(mapActivity); + MarkerMenuOnMapFragment.showInstance(mapActivity, marker); ((DialogFragment) getParentFragment()).dismiss(); } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java new file mode 100644 index 0000000000..3d63f740ae --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java @@ -0,0 +1,286 @@ +package net.osmand.plus.mapmarkers; + +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.annotation.DrawableRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.content.ContextCompat; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import net.osmand.Location; +import net.osmand.data.LatLon; +import net.osmand.plus.IconsCache; +import net.osmand.plus.MapMarkersHelper.MapMarker; +import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener; +import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.MapViewTrackingUtilities; +import net.osmand.plus.dashboard.DashLocationFragment; +import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.views.OsmandMapTileView; +import net.osmand.util.MapUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +import static net.osmand.plus.OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT; +import static net.osmand.plus.OsmandSettings.MIDDLE_TOP_CONSTANT; + +public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassListener, OsmAndLocationListener { + + public static final String TAG = "MarkerMenuOnMapFragment"; + + private IconsCache iconsCache; + private MapMarker marker; + + private boolean night; + private boolean portrait; + + private int previousMapPosition; + + private Float heading; + private Location location; + + private ImageView arrowIv; + private TextView distanceTv; + + public void setMarker(MapMarker marker) { + this.marker = marker; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + OsmandApplication app = (OsmandApplication) getActivity().getApplication(); + night = app.getDaynightHelper().isNightModeForMapControls(); + iconsCache = app.getIconsCache(); + portrait = AndroidUiHelper.isOrientationPortrait(getActivity()); + final int themeRes = night ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; + + final View mainView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.fragment_marker_menu_on_map, null); + mainView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); + } + }); + + ((ImageView) mainView.findViewById(R.id.marker_icon)) + .setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_flag_dark, MapMarker.getColorId(marker.colorIndex))); + ((ImageView) mainView.findViewById(R.id.rename_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_edit_dark)); + ((ImageView) mainView.findViewById(R.id.delete_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_delete_dark)); + + ((TextView) mainView.findViewById(R.id.marker_title)).setText(marker.getName(getActivity())); + + arrowIv = (ImageView) mainView.findViewById(R.id.marker_direction_icon); + distanceTv = (TextView) mainView.findViewById(R.id.marker_distance); + + String descr; + if ((descr = marker.groupName) != null) { + if (descr.equals("")) { + descr = getActivity().getString(R.string.shared_string_favorites); + } + } else { + Date date = new Date(marker.creationDate); + String month = new SimpleDateFormat("MMM", Locale.getDefault()).format(date); + if (month.length() > 1) { + month = Character.toUpperCase(month.charAt(0)) + month.substring(1); + } + month = month.replaceAll("\\.", ""); + String day = new SimpleDateFormat("d", Locale.getDefault()).format(date); + descr = month + " " + day; + } + ((TextView) mainView.findViewById(R.id.marker_description)).setText(descr); + + ImageButton visitedBtn = (ImageButton) mainView.findViewById(R.id.marker_visited_button); + visitedBtn.setBackgroundDrawable(ContextCompat.getDrawable(getContext(), + night ? R.drawable.marker_circle_background_dark_with_inset : R.drawable.marker_circle_background_light_with_inset)); + visitedBtn.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_marker_passed, night ? 0 : R.color.icon_color)); + visitedBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(getContext(), "Passed", Toast.LENGTH_SHORT).show(); + } + }); + + mainView.findViewById(R.id.rename_row).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(getContext(), "Rename", Toast.LENGTH_SHORT).show(); + } + }); + + mainView.findViewById(R.id.delete_row).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(getContext(), "Delete", Toast.LENGTH_SHORT).show(); + } + }); + + mainView.findViewById(R.id.back_row).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + MapMarkersDialogFragment.showInstance(mapActivity); + } + dismiss(); + } + }); + + return mainView; + } + + @Override + public void onResume() { + super.onResume(); + enterMenuMode(); + startLocationUpdate(); + } + + @Override + public void onPause() { + super.onPause(); + exitMenuMode(); + stopLocationUpdate(); + } + + @Override + public void updateLocation(Location location) { + boolean newLocation = this.location == null && location != null; + boolean locationChanged = this.location != null && location != null + && this.location.getLatitude() != location.getLatitude() + && this.location.getLongitude() != location.getLongitude(); + if (newLocation || locationChanged) { + this.location = location; + updateLocationUi(); + } + } + + @Override + public void updateCompassValue(float value) { + // 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction) + // on non-compass devices + float lastHeading = heading != null ? heading : 99; + heading = value; + if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) { + updateLocationUi(); + } else { + heading = lastHeading; + } + } + + private OsmandApplication getMyApplication() { + if (getActivity() != null) { + return ((MapActivity) getActivity()).getMyApplication(); + } + return null; + } + + private MapActivity getMapActivity() { + return (MapActivity) getActivity(); + } + + private Drawable getContentIcon(@DrawableRes int id) { + return iconsCache.getIcon(id, night ? R.color.ctx_menu_info_text_dark : R.color.on_map_icon_color); + } + + private void startLocationUpdate() { + OsmandApplication app = getMyApplication(); + if (app != null) { + app.getLocationProvider().removeCompassListener(app.getLocationProvider().getNavigationInfo()); + app.getLocationProvider().addCompassListener(this); + app.getLocationProvider().addLocationListener(this); + updateLocationUi(); + } + } + + private void stopLocationUpdate() { + OsmandApplication app = getMyApplication(); + if (app != null) { + app.getLocationProvider().removeLocationListener(this); + app.getLocationProvider().removeCompassListener(this); + app.getLocationProvider().addCompassListener(app.getLocationProvider().getNavigationInfo()); + } + } + + private void updateLocationUi() { + final MapActivity mapActivity = (MapActivity) getActivity(); + if (mapActivity != null) { + mapActivity.getMyApplication().runInUIThread(new Runnable() { + @Override + public void run() { + if (location == null) { + location = mapActivity.getMyApplication().getLocationProvider().getLastKnownLocation(); + } + MapViewTrackingUtilities utilities = mapActivity.getMapViewTrackingUtilities(); + + boolean useCenter = !(utilities.isMapLinkedToLocation() && location != null); + LatLon loc = useCenter ? mapActivity.getMapLocation() : new LatLon(location.getLatitude(), location.getLongitude()); + float head = useCenter ? -mapActivity.getMapRotate() : heading != null ? heading : 99; + + DashLocationFragment.updateLocationView(useCenter, loc, head, arrowIv, + R.drawable.ic_direction_arrow, 0, distanceTv, marker.point, + DashLocationFragment.getScreenOrientation(mapActivity), mapActivity.getMyApplication(), mapActivity, true); + } + }); + } + } + + private void enterMenuMode() { + final MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.disableDrawer(); + mapActivity.getMapLayers().getMapControlsLayer().hideMapControls(); + OsmandMapTileView tileView = mapActivity.getMapView(); + previousMapPosition = tileView.getMapPosition(); + tileView.setMapPosition(portrait ? MIDDLE_TOP_CONSTANT : LANDSCAPE_MIDDLE_RIGHT_CONSTANT); + mapActivity.refreshMap(); + } + } + + private void exitMenuMode() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.enableDrawer(); + mapActivity.getMapLayers().getMapControlsLayer().showMapControls(); + mapActivity.getMapView().setMapPosition(previousMapPosition); + mapActivity.refreshMap(); + } + } + + private void dismiss() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.getSupportFragmentManager().popBackStackImmediate(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); + } + } + + public static boolean showInstance(MapActivity mapActivity, @NonNull MapMarker marker) { + try { + MarkerMenuOnMapFragment fragment = new MarkerMenuOnMapFragment(); + fragment.setRetainInstance(true); + fragment.setMarker(marker); + mapActivity.getSupportFragmentManager().beginTransaction() + .replace(R.id.fragmentContainer, fragment, TAG) + .addToBackStack(TAG) + .commitAllowingStateLoss(); + return true; + } catch (Exception e) { + return false; + } + } +} From 414a0f0d48adbeded9feb0acf40157aa91596974 Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Wed, 18 Oct 2017 20:09:04 +0300 Subject: [PATCH 030/187] Disable empty state for ruler --- OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java | 3 ++- OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index 4895eaa881..6c397b09d6 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -676,7 +676,8 @@ public class MapControlsLayer extends OsmandMapLayer { public void switchMapControlsVisibility() { if (app.getRoutingHelper().isFollowingMode() || app.getRoutingHelper().isPauseNavigation() || mapActivity.getMeasurementToolFragment() != null - || mapActivity.getPlanRouteFragment() != null) { + || mapActivity.getPlanRouteFragment() != null + || mapActivity.getMapLayers().getRulerControlLayer().rulerModeOn()) { return; } if (isMapControlsVisible()) { diff --git a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java index 583d5d42db..a19bd37a5d 100644 --- a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java @@ -234,7 +234,7 @@ public class RulerControlLayer extends OsmandMapLayer { } } - private boolean rulerModeOn() { + public boolean rulerModeOn() { return mapActivity.getMapLayers().getMapWidgetRegistry().isVisible("ruler") && rightWidgetsPanel.getVisibility() == View.VISIBLE; } From e45fbdca22d6538cd24176fd46c0f8a2e89d88be Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 19 Oct 2017 11:21:10 +0300 Subject: [PATCH 031/187] Add functionality to buttons --- .../osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java index 3d63f740ae..64932c8170 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java @@ -64,7 +64,7 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - OsmandApplication app = (OsmandApplication) getActivity().getApplication(); + final OsmandApplication app = (OsmandApplication) getActivity().getApplication(); night = app.getDaynightHelper().isNightModeForMapControls(); iconsCache = app.getIconsCache(); portrait = AndroidUiHelper.isOrientationPortrait(getActivity()); @@ -112,7 +112,8 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi visitedBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Toast.makeText(getContext(), "Passed", Toast.LENGTH_SHORT).show(); + app.getMapMarkersHelper().moveMapMarkerToHistory(marker); + dismiss(); } }); @@ -126,7 +127,8 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi mainView.findViewById(R.id.delete_row).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Toast.makeText(getContext(), "Delete", Toast.LENGTH_SHORT).show(); + app.getMapMarkersHelper().removeMarker(marker); + dismiss(); } }); From 433be904aaaeee7363c3e246810171ebbecc7c10 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 19 Oct 2017 11:26:38 +0300 Subject: [PATCH 032/187] Fix passed button --- OsmAnd/res/layout/fragment_marker_menu_on_map.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/OsmAnd/res/layout/fragment_marker_menu_on_map.xml b/OsmAnd/res/layout/fragment_marker_menu_on_map.xml index 8278eb87bd..dca9b87443 100644 --- a/OsmAnd/res/layout/fragment_marker_menu_on_map.xml +++ b/OsmAnd/res/layout/fragment_marker_menu_on_map.xml @@ -91,7 +91,6 @@ android:id="@+id/marker_visited_button" android:layout_width="56dp" android:layout_height="56dp" - android:focusableInTouchMode="true" tools:background="@drawable/marker_circle_background_dark_with_inset" tools:src="@drawable/ic_action_marker_passed"/> From 6a6a648bf944f875d8e97a1ee475aeef4570b137 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Thu, 19 Oct 2017 11:41:55 +0300 Subject: [PATCH 033/187] Fix tablet UI --- ...er_circle_background_dark_n_with_inset.xml | 8 +- ...r_circle_background_light_n_with_inset.xml | 8 +- ..._circle_background_on_map_n_with_inset.xml | 8 +- .../marker_circle_background_p_with_inset.xml | 8 +- .../layout-land/fragment_measurement_tool.xml | 12 +-- .../fragment_plan_route_half_screen.xml | 8 +- .../layout/close_measurement_tool_dialog.xml | 2 +- .../fragment_coordinate_input_dialog.xml | 2 +- .../layout/fragment_map_markers_dialog.xml | 6 +- ...r_coordinate_input_bottom_sheet_dialog.xml | 16 +-- ...nate_input_options_bottom_sheet_helper.xml | 16 +-- ...ent_marker_history_bottom_sheet_dialog.xml | 26 ++--- ...ent_marker_options_bottom_sheet_dialog.xml | 98 +++++++++---------- ...nt_marker_order_by_bottom_sheet_dialog.xml | 40 ++++---- ...rker_save_as_track_bottom_sheet_dialog.xml | 16 +-- ...ker_show_direction_bottom_sheet_dialog.xml | 48 ++++----- .../res/layout/fragment_measurement_tool.xml | 12 +-- .../fragment_options_bottom_sheet_dialog.xml | 66 ++++++------- ...plan_route_options_bottom_sheet_dialog.xml | 56 +++++------ ..._save_as_new_track_bottom_sheet_dialog.xml | 32 +++--- ...ment_selected_menu_bottom_sheet_dialog.xml | 48 ++++----- ...gment_snap_to_road_bottom_sheet_dialog.xml | 16 +-- .../res/layout/list_item_icon_and_title.xml | 8 +- OsmAnd/res/layout/map_marker_item_header.xml | 12 +-- OsmAnd/res/layout/map_marker_item_new.xml | 38 +++---- .../map_marker_item_show_hide_history.xml | 8 +- .../res/layout/marker_coordinate_formats.xml | 24 ++--- .../layout/markers_track_name_edit_text.xml | 8 +- .../markers_track_name_text_field_box.xml | 8 +- .../res/layout/measure_points_list_item.xml | 34 +++---- .../plan_route_toolbar_and_up_down_row.xml | 4 +- OsmAnd/res/layout/save_gpx_dialog.xml | 2 +- OsmAnd/res/values-large/sizes.xml | 15 ++- OsmAnd/res/values/sizes.xml | 13 ++- ...ryMarkerMenuBottomSheetDialogFragment.java | 2 +- .../OptionsBottomSheetDialogFragment.java | 2 +- .../OrderByBottomSheetDialogFragment.java | 2 +- ...RouteOptionsBottomSheetDialogFragment.java | 2 +- .../SaveAsTrackBottomSheetDialogFragment.java | 2 +- ...howDirectionBottomSheetDialogFragment.java | 2 +- .../OptionsBottomSheetDialogFragment.java | 2 +- ...electedPointBottomSheetDialogFragment.java | 2 +- 42 files changed, 375 insertions(+), 367 deletions(-) diff --git a/OsmAnd/res/drawable/marker_circle_background_dark_n_with_inset.xml b/OsmAnd/res/drawable/marker_circle_background_dark_n_with_inset.xml index ad071dcc25..d777eb52c4 100644 --- a/OsmAnd/res/drawable/marker_circle_background_dark_n_with_inset.xml +++ b/OsmAnd/res/drawable/marker_circle_background_dark_n_with_inset.xml @@ -1,7 +1,7 @@ \ No newline at end of file + android:insetBottom="@dimen/context_menu_first_line_top_margin" + android:insetLeft="@dimen/context_menu_first_line_top_margin" + android:insetRight="@dimen/context_menu_first_line_top_margin" + android:insetTop="@dimen/context_menu_first_line_top_margin"/> \ No newline at end of file diff --git a/OsmAnd/res/drawable/marker_circle_background_light_n_with_inset.xml b/OsmAnd/res/drawable/marker_circle_background_light_n_with_inset.xml index b20f1f27f0..8c2cc54e0a 100644 --- a/OsmAnd/res/drawable/marker_circle_background_light_n_with_inset.xml +++ b/OsmAnd/res/drawable/marker_circle_background_light_n_with_inset.xml @@ -1,7 +1,7 @@ \ No newline at end of file + android:insetBottom="@dimen/context_menu_first_line_top_margin" + android:insetLeft="@dimen/context_menu_first_line_top_margin" + android:insetRight="@dimen/context_menu_first_line_top_margin" + android:insetTop="@dimen/context_menu_first_line_top_margin"/> \ No newline at end of file diff --git a/OsmAnd/res/drawable/marker_circle_background_on_map_n_with_inset.xml b/OsmAnd/res/drawable/marker_circle_background_on_map_n_with_inset.xml index e9ab9f1da0..26b6310ad7 100644 --- a/OsmAnd/res/drawable/marker_circle_background_on_map_n_with_inset.xml +++ b/OsmAnd/res/drawable/marker_circle_background_on_map_n_with_inset.xml @@ -1,7 +1,7 @@ \ No newline at end of file + android:insetBottom="@dimen/context_menu_first_line_top_margin" + android:insetLeft="@dimen/context_menu_first_line_top_margin" + android:insetRight="@dimen/context_menu_first_line_top_margin" + android:insetTop="@dimen/context_menu_first_line_top_margin"/> \ No newline at end of file diff --git a/OsmAnd/res/drawable/marker_circle_background_p_with_inset.xml b/OsmAnd/res/drawable/marker_circle_background_p_with_inset.xml index 87a731b9d6..849b4ac748 100644 --- a/OsmAnd/res/drawable/marker_circle_background_p_with_inset.xml +++ b/OsmAnd/res/drawable/marker_circle_background_p_with_inset.xml @@ -1,9 +1,9 @@ + android:insetBottom="@dimen/context_menu_first_line_top_margin" + android:insetLeft="@dimen/context_menu_first_line_top_margin" + android:insetRight="@dimen/context_menu_first_line_top_margin" + android:insetTop="@dimen/context_menu_first_line_top_margin"> \ No newline at end of file diff --git a/OsmAnd/res/layout-land/fragment_measurement_tool.xml b/OsmAnd/res/layout-land/fragment_measurement_tool.xml index 9a611c8672..3c3615d0af 100644 --- a/OsmAnd/res/layout-land/fragment_measurement_tool.xml +++ b/OsmAnd/res/layout-land/fragment_measurement_tool.xml @@ -70,9 +70,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginEnd="@dimen/measurement_tool_text_margin_small" + android:layout_marginEnd="@dimen/text_margin_small" android:layout_marginLeft="@dimen/measurement_tool_text_margin" - android:layout_marginRight="@dimen/measurement_tool_text_margin_small" + android:layout_marginRight="@dimen/text_margin_small" android:layout_marginStart="@dimen/measurement_tool_text_margin" android:layout_toEndOf="@id/main_icon" android:layout_toRightOf="@id/main_icon" @@ -108,9 +108,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginEnd="@dimen/measurement_tool_text_margin_small" + android:layout_marginEnd="@dimen/text_margin_small" android:layout_marginLeft="@dimen/measurement_tool_text_margin" - android:layout_marginRight="@dimen/measurement_tool_text_margin_small" + android:layout_marginRight="@dimen/text_margin_small" android:layout_marginStart="@dimen/measurement_tool_text_margin" android:layout_toEndOf="@id/main_icon" android:layout_toRightOf="@id/main_icon" @@ -123,9 +123,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginEnd="@dimen/measurement_tool_text_margin_small" + android:layout_marginEnd="@dimen/text_margin_small" android:layout_marginLeft="@dimen/measurement_tool_text_margin" - android:layout_marginRight="@dimen/measurement_tool_text_margin_small" + android:layout_marginRight="@dimen/text_margin_small" android:layout_marginStart="@dimen/measurement_tool_text_margin" android:layout_toEndOf="@id/main_icon" android:layout_toRightOf="@id/main_icon" diff --git a/OsmAnd/res/layout-land/fragment_plan_route_half_screen.xml b/OsmAnd/res/layout-land/fragment_plan_route_half_screen.xml index d85da7b8fc..fa57a31b82 100644 --- a/OsmAnd/res/layout-land/fragment_plan_route_half_screen.xml +++ b/OsmAnd/res/layout-land/fragment_plan_route_half_screen.xml @@ -47,8 +47,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/measurement_tool_text_margin_small" - android:layout_marginRight="@dimen/measurement_tool_text_margin_small" + android:layout_marginEnd="@dimen/text_margin_small" + android:layout_marginRight="@dimen/text_margin_small" android:ellipsize="end" android:maxLines="1" android:textAppearance="@style/TextAppearance.ListItemTitle" @@ -86,8 +86,8 @@ android:ellipsize="end" android:gravity="center_vertical" android:maxLines="1" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingLeft="@dimen/list_content_padding" + android:paddingRight="@dimen/list_content_padding" android:text="@string/shared_string_options" android:textAllCaps="true" android:textColor="?attr/color_dialog_buttons" diff --git a/OsmAnd/res/layout/close_measurement_tool_dialog.xml b/OsmAnd/res/layout/close_measurement_tool_dialog.xml index e1c823056a..66d2b6fa42 100644 --- a/OsmAnd/res/layout/close_measurement_tool_dialog.xml +++ b/OsmAnd/res/layout/close_measurement_tool_dialog.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" - android:padding="@dimen/bottom_sheet_content_padding"> + android:padding="@dimen/content_padding"> @@ -34,10 +34,10 @@ diff --git a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml index cd2b841a19..9a9d487f03 100644 --- a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml +++ b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml @@ -23,10 +23,10 @@ android:layout_width="match_parent" android:layout_height="@dimen/bottom_sheet_title_height" android:gravity="center_vertical" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding" + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding" android:text="@string/shared_string_options" android:textAppearance="@style/TextAppearance.ListItemTitle" osmand:typeface="@string/font_roboto_medium"/> @@ -38,8 +38,8 @@ android:background="?attr/selectableItemBackground" android:descendantFocusability="blocksDescendants" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding"> + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding"> diff --git a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml index b89be37e6b..a53f553019 100644 --- a/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_marker_history_bottom_sheet_dialog.xml @@ -17,7 +17,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingBottom="8dp"> + android:paddingBottom="@dimen/bottom_sheet_content_padding_small"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingBottom="@dimen/bottom_sheet_content_padding_small"> @@ -37,15 +37,15 @@ android:layout_height="@dimen/bottom_sheet_list_item_height" android:background="?attr/selectableItemBackground" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> @@ -37,10 +37,10 @@ android:layout_height="@dimen/bottom_sheet_list_item_height" android:background="?attr/selectableItemBackground" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding" + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding" android:gravity="center_vertical"> @@ -34,10 +34,10 @@ diff --git a/OsmAnd/res/layout/fragment_marker_show_direction_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_show_direction_bottom_sheet_dialog.xml index d94792fa53..c818680b60 100644 --- a/OsmAnd/res/layout/fragment_marker_show_direction_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_marker_show_direction_bottom_sheet_dialog.xml @@ -23,10 +23,10 @@ android:layout_width="match_parent" android:layout_height="@dimen/bottom_sheet_title_height" android:gravity="center_vertical" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding" + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding" android:text="@string/show_direction" android:textAppearance="@style/TextAppearance.ListItemTitle" osmand:typeface="@string/font_roboto_medium"/> @@ -34,10 +34,10 @@ @@ -122,8 +122,8 @@ android:background="?attr/selectableItemBackground" android:descendantFocusability="blocksDescendants" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding"> + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding"> + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingBottom="@dimen/bottom_sheet_content_padding_small"> @@ -38,10 +38,10 @@ android:layout_height="@dimen/bottom_sheet_list_item_height" android:background="?attr/selectableItemBackground" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> @@ -39,10 +39,10 @@ android:background="?attr/selectableItemBackground" android:gravity="center_vertical" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding" + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding" android:visibility="gone" tools:visibility="visible"> @@ -71,10 +71,10 @@ android:background="?attr/selectableItemBackground" android:gravity="center_vertical" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> @@ -34,10 +34,10 @@ @@ -121,10 +121,10 @@ android:layout_height="@dimen/bottom_sheet_list_item_height" android:background="?attr/selectableItemBackground" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> diff --git a/OsmAnd/res/layout/list_item_icon_and_title.xml b/OsmAnd/res/layout/list_item_icon_and_title.xml index 783198f543..ee7652a09c 100644 --- a/OsmAnd/res/layout/list_item_icon_and_title.xml +++ b/OsmAnd/res/layout/list_item_icon_and_title.xml @@ -6,10 +6,10 @@ android:layout_height="@dimen/bottom_sheet_list_item_height" android:background="?attr/selectableItemBackground" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> diff --git a/OsmAnd/res/layout/map_marker_item_new.xml b/OsmAnd/res/layout/map_marker_item_new.xml index 3f1f1d6c38..2ebd8cd890 100644 --- a/OsmAnd/res/layout/map_marker_item_new.xml +++ b/OsmAnd/res/layout/map_marker_item_new.xml @@ -25,13 +25,13 @@ @@ -49,8 +49,8 @@ android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center_vertical" - android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="@dimen/bottom_sheet_content_margin" + android:layout_marginRight="@dimen/bottom_sheet_content_margin" tools:src="@drawable/ic_action_flag_dark"/> + android:layout_height="@dimen/map_marker_title_height"> @@ -158,10 +158,10 @@ android:id="@+id/map_marker_check_box" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_marginTop="16dp" + android:layout_marginBottom="@dimen/bottom_sheet_content_margin" + android:layout_marginLeft="@dimen/bottom_sheet_content_margin" + android:layout_marginRight="@dimen/bottom_sheet_content_margin" + android:layout_marginTop="@dimen/bottom_sheet_content_margin" android:visibility="gone" tools:visibility="visible"/> @@ -172,8 +172,8 @@ android:id="@+id/divider" android:layout_width="wrap_content" android:layout_height="1dp" - android:layout_marginLeft="56dp" - android:layout_marginStart="56dp" + android:layout_marginLeft="@dimen/map_button_shadow_width" + android:layout_marginStart="@dimen/map_button_shadow_width" tools:background="?attr/dashboard_divider"/> diff --git a/OsmAnd/res/layout/map_marker_item_show_hide_history.xml b/OsmAnd/res/layout/map_marker_item_show_hide_history.xml index 908b633e61..3d066409d2 100644 --- a/OsmAnd/res/layout/map_marker_item_show_hide_history.xml +++ b/OsmAnd/res/layout/map_marker_item_show_hide_history.xml @@ -10,19 +10,19 @@ + android:layout_height="@dimen/bottom_sheet_list_item_height"> diff --git a/OsmAnd/res/layout/marker_coordinate_formats.xml b/OsmAnd/res/layout/marker_coordinate_formats.xml index 3d589075c9..f342c3d05a 100644 --- a/OsmAnd/res/layout/marker_coordinate_formats.xml +++ b/OsmAnd/res/layout/marker_coordinate_formats.xml @@ -12,10 +12,10 @@ android:background="?attr/selectableItemBackground" android:gravity="center_vertical" android:minHeight="@dimen/bottom_sheet_list_item_height" - android:paddingEnd="@dimen/bottom_sheet_content_padding" - android:paddingLeft="@dimen/bottom_sheet_content_padding" - android:paddingRight="@dimen/bottom_sheet_content_padding" - android:paddingStart="@dimen/bottom_sheet_content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding"> @@ -32,8 +32,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" + android:layout_marginEnd="@dimen/bottom_sheet_content_margin" + android:layout_marginRight="@dimen/bottom_sheet_content_margin" android:layout_toEndOf="@id/measure_point_reorder_icon" android:layout_toRightOf="@id/measure_point_reorder_icon" tools:src="@drawable/ic_action_measure_point"/> @@ -47,12 +47,12 @@ android:layout_centerVertical="true" android:background="?attr/selectableItemBackground" android:focusableInTouchMode="true" - android:paddingBottom="12dp" - android:paddingEnd="16dp" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:paddingStart="16dp" - android:paddingTop="12dp" + android:paddingBottom="@dimen/measurement_tool_content_padding_medium" + android:paddingEnd="@dimen/content_padding" + android:paddingLeft="@dimen/content_padding" + android:paddingRight="@dimen/content_padding" + android:paddingStart="@dimen/content_padding" + android:paddingTop="@dimen/measurement_tool_content_padding_medium" tools:src="@drawable/ic_action_remove_dark"/> + android:padding="@dimen/content_padding"> 14sp 27sp + 24sp + 15sp 15sp 12sp @@ -97,11 +99,11 @@ 30dp 24dp 12dp - 24dp + 24dp 12dp 12dp 18dp - 6dp + 6dp 12dp 330dp 48dp @@ -118,13 +120,16 @@ 66dp 72dp 36dp - 11dp - 12dp - 96dp + 11dp + 12dp + 84dp 15dp 84dp 78dp 15dp + + 8dp + 42dp \ No newline at end of file diff --git a/OsmAnd/res/values/sizes.xml b/OsmAnd/res/values/sizes.xml index d43bf1466d..aacd678beb 100644 --- a/OsmAnd/res/values/sizes.xml +++ b/OsmAnd/res/values/sizes.xml @@ -162,11 +162,11 @@ 20dp 16dp 8dp - 16dp + 16dp 8dp 8dp 12dp - 4dp + 4dp 8dp 220dp 48dp @@ -183,12 +183,15 @@ 44dp 48dp 24dp - 7dp - 8dp - 64dp + 7dp + 8dp + 64dp 10dp 56dp 52dp 10dp + + 5dp + 28dp \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/HistoryMarkerMenuBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/HistoryMarkerMenuBottomSheetDialogFragment.java index d8fe089349..c6b8d359be 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/HistoryMarkerMenuBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/HistoryMarkerMenuBottomSheetDialogFragment.java @@ -117,7 +117,7 @@ public class HistoryMarkerMenuBottomSheetDialogFragment extends BottomSheetDialo if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, nightMode, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java index 91a8c769d7..c8721fb477 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java @@ -179,7 +179,7 @@ public class OptionsBottomSheetDialogFragment extends BottomSheetDialogFragment if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, nightMode, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/OrderByBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/OrderByBottomSheetDialogFragment.java index 6ee9925660..c2cee573e1 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/OrderByBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/OrderByBottomSheetDialogFragment.java @@ -98,7 +98,7 @@ public class OrderByBottomSheetDialogFragment extends BottomSheetDialogFragment if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, night, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java index 42e3ed58f0..cf6a765044 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java @@ -141,7 +141,7 @@ public class PlanRouteOptionsBottomSheetDialogFragment extends BottomSheetDialog } if (!portrait) { - if (screenHeight - statusBarHeight - mainView.getHeight() >= AndroidUtils.dpToPx(getActivity(), 8)) { + if (screenHeight - statusBarHeight - mainView.getHeight() >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, night, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java index 284454f23e..a8cff6f07d 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java @@ -120,7 +120,7 @@ public class SaveAsTrackBottomSheetDialogFragment extends BottomSheetDialogFragm if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, nightMode, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java index dacf153f6c..a9530827fc 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/ShowDirectionBottomSheetDialogFragment.java @@ -161,7 +161,7 @@ public class ShowDirectionBottomSheetDialogFragment extends BottomSheetDialogFra if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, night, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java index 81bb38aac4..d8fec9de3f 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/OptionsBottomSheetDialogFragment.java @@ -150,7 +150,7 @@ public class OptionsBottomSheetDialogFragment extends BottomSheetDialogFragment if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, nightMode, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SelectedPointBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SelectedPointBottomSheetDialogFragment.java index b196f1410c..6588e9fd12 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/SelectedPointBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/SelectedPointBottomSheetDialogFragment.java @@ -176,7 +176,7 @@ public class SelectedPointBottomSheetDialogFragment extends BottomSheetDialogFra if (!portrait) { if (screenHeight - statusBarHeight - mainView.getHeight() - >= AndroidUtils.dpToPx(getActivity(), 8)) { + >= getResources().getDimension(R.dimen.bottom_sheet_content_padding_small)) { AndroidUtils.setBackground(getActivity(), mainView, nightMode, R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); } else { From bb55f77e34efc38c90ce20d699d819e91d1e04f1 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 19 Oct 2017 12:01:45 +0300 Subject: [PATCH 034/187] Add opening of marker menu on map from groups --- .../mapmarkers/MapMarkersGroupsFragment.java | 19 ++++++++++++++++++ .../adapters/MapMarkersGroupsAdapter.java | 20 +++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java index 4db3ae33cd..88d51a7153 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersGroupsFragment.java @@ -10,6 +10,7 @@ import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; +import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v7.widget.LinearLayoutManager; @@ -203,6 +204,24 @@ public class MapMarkersGroupsFragment extends Fragment implements OsmAndCompassL itemTouchHelper.attachToRecyclerView(recyclerView); adapter = new MapMarkersGroupsAdapter(mapActivity); + adapter.setListener(new MapMarkersGroupsAdapter.MapMarkersGroupsAdapterListener() { + @Override + public void onItemClick(View view) { + int pos = recyclerView.getChildAdapterPosition(view); + if (pos == RecyclerView.NO_POSITION) { + return; + } + Object item = adapter.getItem(pos); + if (item instanceof MapMarker) { + MapMarker marker = (MapMarker) item; + mapActivity.getMyApplication().getSettings() + .setMapLocationToShow(marker.getLatitude(), marker.getLongitude(), 15, null, false, null); + MapActivity.launchMapActivityMoveToTop(mapActivity); + MarkerMenuOnMapFragment.showInstance(mapActivity, marker); + ((DialogFragment) getParentFragment()).dismiss(); + } + } + }); recyclerView.setAdapter(adapter); return recyclerView; } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java index 1876f3fb30..5a456521e9 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java @@ -12,9 +12,9 @@ import android.widget.TextView; import net.osmand.data.LatLon; import net.osmand.plus.IconsCache; +import net.osmand.plus.MapMarkersHelper.GroupHeader; import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; -import net.osmand.plus.MapMarkersHelper.GroupHeader; import net.osmand.plus.MapMarkersHelper.ShowHideHistoryButton; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -52,6 +52,12 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter showDirectionMarkers; private Snackbar snackbar; + private MapMarkersGroupsAdapterListener listener; + + public void setListener(MapMarkersGroupsAdapterListener listener) { + this.listener = listener; + } + public MapMarkersGroupsAdapter(MapActivity mapActivity) { this.mapActivity = mapActivity; app = mapActivity.getMyApplication(); @@ -150,7 +156,12 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter Date: Thu, 19 Oct 2017 15:53:46 +0300 Subject: [PATCH 035/187] Add the ability to undo an action --- .../mapmarkers/MarkerMenuOnMapFragment.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java index 64932c8170..f4bd81aba3 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; @@ -113,6 +114,17 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi @Override public void onClick(View view) { app.getMapMarkersHelper().moveMapMarkerToHistory(marker); + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + Snackbar.make(mapActivity.findViewById(R.id.bottomFragmentContainer), R.string.marker_moved_to_history, Snackbar.LENGTH_LONG) + .setAction(R.string.shared_string_undo, new View.OnClickListener() { + @Override + public void onClick(View view) { + app.getMapMarkersHelper().restoreMarkerFromHistory(marker, 0); + } + }) + .show(); + } dismiss(); } }); @@ -128,6 +140,17 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi @Override public void onClick(View view) { app.getMapMarkersHelper().removeMarker(marker); + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + Snackbar.make(mapActivity.findViewById(R.id.bottomFragmentContainer), R.string.item_removed, Snackbar.LENGTH_LONG) + .setAction(R.string.shared_string_undo, new View.OnClickListener() { + @Override + public void onClick(View view) { + app.getMapMarkersHelper().addMarker(marker); + } + }) + .show(); + } dismiss(); } }); From 3ab51932deefaddfaac4d9efbc7144c747649f51 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Thu, 19 Oct 2017 17:10:11 +0300 Subject: [PATCH 036/187] Fix direction and distance indication --- .../layout/fragment_marker_menu_on_map.xml | 3 ++ .../mapmarkers/MarkerMenuOnMapFragment.java | 33 +++++++++++++------ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/OsmAnd/res/layout/fragment_marker_menu_on_map.xml b/OsmAnd/res/layout/fragment_marker_menu_on_map.xml index dca9b87443..0a157e20bc 100644 --- a/OsmAnd/res/layout/fragment_marker_menu_on_map.xml +++ b/OsmAnd/res/layout/fragment_marker_menu_on_map.xml @@ -55,8 +55,10 @@ android:id="@+id/marker_direction_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="center_vertical" android:layout_marginEnd="4dp" android:layout_marginRight="4dp" + android:layout_marginTop="1sp" tools:src="@drawable/ic_direction_arrow"/> Date: Thu, 19 Oct 2017 17:26:09 +0300 Subject: [PATCH 037/187] Add landscape layout --- .../fragment_marker_menu_on_map.xml | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml diff --git a/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml b/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml new file mode 100644 index 0000000000..e3ac0a91b1 --- /dev/null +++ b/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5154af8ccaa785630241fd99a327e4721c02abda Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Thu, 19 Oct 2017 17:41:57 +0300 Subject: [PATCH 038/187] Extract general stuff from portrait and landscape layouts --- .../fragment_marker_menu_on_map.xml | 152 +---------------- .../layout/fragment_marker_menu_on_map.xml | 152 +---------------- .../res/layout/marker_menu_on_map_content.xml | 160 ++++++++++++++++++ 3 files changed, 162 insertions(+), 302 deletions(-) create mode 100644 OsmAnd/res/layout/marker_menu_on_map_content.xml diff --git a/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml b/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml index e3ac0a91b1..3ca520dc96 100644 --- a/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml +++ b/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml @@ -1,7 +1,6 @@ @@ -13,156 +12,7 @@ android:clickable="true" android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -14,156 +13,7 @@ android:clickable="true" android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b923d62ce1d1c9109d8c3061d18550d51468918a Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Thu, 19 Oct 2017 19:10:28 +0300 Subject: [PATCH 039/187] Add fragment for renaming marker --- ...ment_rename_marker_bottom_sheet_dialog.xml | 80 ++++++++++ OsmAnd/res/values/strings.xml | 1 + .../mapmarkers/MarkerMenuOnMapFragment.java | 9 +- ...RenameMarkerBottomSheetDialogFragment.java | 141 ++++++++++++++++++ 4 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 OsmAnd/res/layout/fragment_rename_marker_bottom_sheet_dialog.xml create mode 100644 OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java diff --git a/OsmAnd/res/layout/fragment_rename_marker_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_rename_marker_bottom_sheet_dialog.xml new file mode 100644 index 0000000000..8e91d69c52 --- /dev/null +++ b/OsmAnd/res/layout/fragment_rename_marker_bottom_sheet_dialog.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 9ac72f6a80..43fe81569e 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,7 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Enter new name Back Wrong format Road diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java index 934a759b5a..711c871cde 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java @@ -16,7 +16,6 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import net.osmand.Location; import net.osmand.data.LatLon; @@ -133,7 +132,13 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi mainView.findViewById(R.id.rename_row).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Toast.makeText(getContext(), "Rename", Toast.LENGTH_SHORT).show(); + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + RenameMarkerBottomSheetDialogFragment fragment = new RenameMarkerBottomSheetDialogFragment(); + fragment.setMarker(marker); + fragment.setRetainInstance(true); + fragment.show(mapActivity.getSupportFragmentManager(), RenameMarkerBottomSheetDialogFragment.TAG); + } } }); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java new file mode 100644 index 0000000000..f0191ed619 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java @@ -0,0 +1,141 @@ +package net.osmand.plus.mapmarkers; + +import android.app.Dialog; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.LinearLayout; + +import net.osmand.AndroidUtils; +import net.osmand.plus.MapMarkersHelper.MapMarker; +import net.osmand.plus.OsmandTextFieldBoxes; +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.BottomSheetDialogFragment; +import net.osmand.plus.helpers.AndroidUiHelper; + +public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFragment { + + public final static String TAG = "RenameMarkerBottomSheetDialogFragment"; + + private MapMarker marker; + + public void setMarker(MapMarker marker) { + this.marker = marker; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + MapActivity mapActivity = (MapActivity) getActivity(); + final boolean portrait = AndroidUiHelper.isOrientationPortrait(getActivity()); + final boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls(); + final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; + + final View mainView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.fragment_rename_marker_bottom_sheet_dialog, container); + + LinearLayout contentLayout = (LinearLayout) mainView.findViewById(R.id.content_linear_layout); + int layoutRes = Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH + ? R.layout.markers_track_name_text_field_box + : R.layout.markers_track_name_edit_text; + contentLayout.addView(getLayoutInflater().inflate(layoutRes, contentLayout, false), 1); + + if (portrait) { + AndroidUtils.setBackground(getActivity(), mainView, nightMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); + } + + final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text); + nameEditText.setText(marker.getName(mapActivity)); + View textBox = mainView.findViewById(R.id.name_text_box); + if (textBox instanceof OsmandTextFieldBoxes) { + ((OsmandTextFieldBoxes) textBox).activate(true); + } + + mainView.findViewById(R.id.save_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); + } + }); + + mainView.findViewById(R.id.close_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); + } + }); + + final int screenHeight = AndroidUtils.getScreenHeight(getActivity()); + final int statusBarHeight = AndroidUtils.getStatusBarHeight(getActivity()); + final int navBarHeight = AndroidUtils.getNavBarHeight(getActivity()); + + mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + + boolean dimensSet; + + @Override + public void onGlobalLayout() { + if (!dimensSet) { + final View scrollView = mainView.findViewById(R.id.rename_marker_scroll_view); + int scrollViewHeight = scrollView.getHeight(); + int dividerHeight = AndroidUtils.dpToPx(getContext(), 1); + int cancelButtonHeight = getContext().getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height); + int spaceForScrollView = screenHeight - statusBarHeight - navBarHeight - dividerHeight - cancelButtonHeight; + if (scrollViewHeight > spaceForScrollView) { + scrollView.getLayoutParams().height = spaceForScrollView; + scrollView.requestLayout(); + } + + if (!portrait) { + if (screenHeight - statusBarHeight - mainView.getHeight() + >= AndroidUtils.dpToPx(getActivity(), 8)) { + AndroidUtils.setBackground(getActivity(), mainView, nightMode, + R.drawable.bg_bottom_sheet_topsides_landscape_light, R.drawable.bg_bottom_sheet_topsides_landscape_dark); + } else { + AndroidUtils.setBackground(getActivity(), mainView, nightMode, + R.drawable.bg_bottom_sheet_sides_landscape_light, R.drawable.bg_bottom_sheet_sides_landscape_dark); + } + } + dimensSet = true; + } + + final Window window = getDialog().getWindow(); + WindowManager.LayoutParams params = window.getAttributes(); + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.BOTTOM; + window.setAttributes(params); + } + }); + + return mainView; + } + + @Override + public void onStart() { + super.onStart(); + if (!AndroidUiHelper.isOrientationPortrait(getActivity())) { + final Window window = getDialog().getWindow(); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = getActivity().getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width); + window.setAttributes(params); + } + } + + @Override + public void onDestroyView() { + Dialog dialog = getDialog(); + if (dialog != null && getRetainInstance()) { + dialog.setDismissMessage(null); + } + super.onDestroyView(); + } +} From 909268dd74e6795f493472a46a6a88f0a4c9c292 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 20 Oct 2017 10:49:46 +0300 Subject: [PATCH 040/187] Fix osm live --- .../plus/liveupdates/OsmLiveActivity.java | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/liveupdates/OsmLiveActivity.java b/OsmAnd/src/net/osmand/plus/liveupdates/OsmLiveActivity.java index 0de509e747..28f8e874b4 100644 --- a/OsmAnd/src/net/osmand/plus/liveupdates/OsmLiveActivity.java +++ b/OsmAnd/src/net/osmand/plus/liveupdates/OsmLiveActivity.java @@ -34,6 +34,7 @@ public class OsmLiveActivity extends AbstractDownloadActivity implements Downloa private LiveUpdatesFragmentPagerAdapter pagerAdapter; private InAppHelper inAppHelper; private boolean openSubscription; + private GetLastUpdateDateTask getLastUpdateDateTask; private static final String URL = "https://osmand.net/api/osmlive_status"; public InAppHelper getInAppHelper() { @@ -53,42 +54,6 @@ public class OsmLiveActivity extends AbstractDownloadActivity implements Downloa inAppHelper = null; } - new AsyncTask() { - - @Override - protected void onPreExecute() { - } - - @Override - protected String doInBackground(Void... params) { - try { - return AndroidNetworkUtils.sendRequest(getMyApplication(), URL, null, "Requesting map updates info...", false, false); - } catch (Exception e) { - LOG.error("Error: " + "Requesting map updates info error", e); - return null; - } - } - - @Override - protected void onPostExecute(String response) { - if (response != null) { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - SimpleDateFormat source = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); - source.setTimeZone(TimeZone.getTimeZone("UTC")); - SimpleDateFormat dest = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); - dest.setTimeZone(TimeZone.getDefault()); - try { - Date parsed = source.parse(response); - actionBar.setSubtitle(dest.format(parsed)); - } catch (ParseException e) { - e.printStackTrace(); - } - } - } - } - }.execute(); - Intent intent = getIntent(); if (intent != null && intent.getExtras() != null) { openSubscription = intent.getExtras().getBoolean(OPEN_SUBSCRIPTION_INTENT_PARAM, false); @@ -101,6 +66,9 @@ public class OsmLiveActivity extends AbstractDownloadActivity implements Downloa final TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); tabLayout.setupWithViewPager(viewPager); + + getLastUpdateDateTask = new GetLastUpdateDateTask(); + getLastUpdateDateTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @Override @@ -137,6 +105,9 @@ public class OsmLiveActivity extends AbstractDownloadActivity implements Downloa if (inAppHelper != null) { inAppHelper.stop(); } + if (getLastUpdateDateTask != null) { + getLastUpdateDateTask.cancel(true); + } } @Override @@ -158,6 +129,38 @@ public class OsmLiveActivity extends AbstractDownloadActivity implements Downloa return openSubscription; } + private class GetLastUpdateDateTask extends AsyncTask { + + @Override + protected String doInBackground(Void... params) { + try { + return AndroidNetworkUtils.sendRequest(getMyApplication(), URL, null, "Requesting map updates info...", false, false); + } catch (Exception e) { + LOG.error("Error: " + "Requesting map updates info error", e); + return null; + } + } + + @Override + protected void onPostExecute(String response) { + if (response != null) { + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + SimpleDateFormat source = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); + source.setTimeZone(TimeZone.getTimeZone("UTC")); + SimpleDateFormat dest = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); + dest.setTimeZone(TimeZone.getDefault()); + try { + Date parsed = source.parse(response); + actionBar.setSubtitle(dest.format(parsed)); + } catch (ParseException e) { + e.printStackTrace(); + } + } + } + } + } + public static class LiveUpdatesFragmentPagerAdapter extends FragmentPagerAdapter { private final Fragment[] fragments = new Fragment[] { new LiveUpdatesFragment(), new ReportsFragment() }; private static final int[] titleIds = new int[] { LiveUpdatesFragment.TITLE, ReportsFragment.TITLE }; From 1e2e23c05907c29de44d469cff4713b01edcda14 Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Fri, 20 Oct 2017 10:40:38 +0300 Subject: [PATCH 041/187] Change splash screen. (cherry picked from commit db8ef03) --- .../image_text_osmand_osmlive.png | Bin 4758 -> 5160 bytes .../image_text_osmand_plus_osmlive.png | Bin 4930 -> 5353 bytes .../image_text_osmand_osmlive.png | Bin 3610 -> 3886 bytes .../image_text_osmand_plus_osmlive.png | Bin 3703 -> 3986 bytes .../image_text_osmand_osmlive.png | Bin 6297 -> 6759 bytes .../image_text_osmand_plus_osmlive.png | Bin 6516 -> 7003 bytes .../image_text_osmand_osmlive.png | Bin 9099 -> 9783 bytes .../image_text_osmand_plus_osmlive.png | Bin 9483 -> 10230 bytes .../image_text_osmand_osmlive.png | Bin 12200 -> 13238 bytes .../image_text_osmand_plus_osmlive.png | Bin 12639 -> 13790 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/OsmAnd/res/drawable-hdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-hdpi/image_text_osmand_osmlive.png index ef8e6b61b48747c788bfab8ab181ae03f8b50eb4..f48103258badd316620407e39802dd5271818784 100644 GIT binary patch delta 4348 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 HCH6l6GfE@a delta 3942 zcmai1XHXN2vJIgHloF~Sp+vw)2`xfG5CQ~9X!0SwM396UiXc)1LKhGa2t`4P6a{Ia zH))C#6-1f@6jYER2ue}9k9jk9?t4G(+#hFV=gisJot>RCyXCNKDH;JNri4VIP`Y~h zsw(=bN=kZaC!M4e0~`I2-X;ZHwTUbw?xL2}6Mz#O8-MmR|zm zJeRzRN3P-`blie+)ab+h?P?8I-}z)Wx~g^ToYFw>9jq|JR}POkE{Vat#eyVb=Z-at zEJ(+3cm}`U>^FbQ{7sGT79pN)ZUzhhGhf6g695ni0ssJD0HA0>d%KS^F~MiY43J6a z2-<`jP<-qiW;z4ctQ4pqpk?{XzhpfF^un0-E%KPw($Z4siXi}&sP`GRH!k

uld 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 delta 4116 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 diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-mdpi/image_text_osmand_osmlive.png index a52503e793e312fde2a83511447ea46583459b47..fcd01914404476a9e69ef02019eab8772daa8770 100644 GIT binary patch delta 3063 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 FV1f~k$>{(9 delta 2785 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 diff --git a/OsmAnd/res/drawable-mdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-mdpi/image_text_osmand_plus_osmlive.png index 036c19d1ee12aaa41948ddb05e3b05cfcc0fd55e..c4a80b7a2b98c2172b54953e099f5c131fee11ec 100644 GIT binary patch delta 3164 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 delta 5612 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 CLd3WL diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand_osmlive.png index 124d8871a02102061392353651e8b506a1f95933..0d5b99b738cc1553f69ab0c1760e6210e1014f20 100644 GIT binary patch delta 8687 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 D8^uV( delta 7996 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 diff --git a/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus_osmlive.png b/OsmAnd/res/drawable-xxhdpi/image_text_osmand_plus_osmlive.png index 91f2c4ab5d1c78050c26142543e9fcc2d32519ee..85e2130f7ffb8ab4de96868f60d6c652a6d1ef12 100644 GIT binary patch delta 9141 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 F{{_I-qC@}y delta 8367 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 P&qP~YPpwSVF693JG>#%@ diff --git a/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_osmlive.png b/OsmAnd/res/drawable-xxxhdpi/image_text_osmand_osmlive.png index 51032033f8b1488d59c05e5098d390e8f53da960..c9f2bc7c755fde330335db81566062cab6b1cf32 100644 GIT binary patch literal 13238 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 delta 11885 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 P0_dTxkq%bN_SydeZwBdc From ad47ca4483c34b934d5b3397d79f923b1ff72483 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 11:58:52 +0300 Subject: [PATCH 042/187] Fix index out of bounds exceptions --- .../net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java | 3 +++ .../net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java index 594f8d7723..2c3018cd49 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersActiveFragment.java @@ -55,6 +55,9 @@ public class MapMarkersActiveFragment extends Fragment implements OsmAndCompassL @Override public void onItemClick(View view) { int pos = recyclerView.getChildAdapterPosition(view); + if (pos == RecyclerView.NO_POSITION) { + return; + } MapMarker marker = adapter.getItem(pos); mapActivity.getMyApplication().getSettings().setMapLocationToShow(marker.getLatitude(), marker.getLongitude(), 15, marker.getPointDescription(mapActivity), true, marker); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java index 3013dabc8b..8368cb8091 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersHistoryFragment.java @@ -184,6 +184,9 @@ public class MapMarkersHistoryFragment extends Fragment implements MapMarkersHel @Override public void onItemClick(View view) { int pos = recyclerView.getChildAdapterPosition(view); + if (pos == RecyclerView.NO_POSITION) { + return; + } Object item = adapter.getItem(pos); if (item instanceof MapMarker) { MapMarker marker = (MapMarker) item; From 74bd9a9d0ebcd1672c13f3814ed9a12f9e95f021 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 12:03:32 +0300 Subject: [PATCH 043/187] Fix NPE --- .../osmand/plus/mapmarkers/MapMarkerSelectionFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java index c1f0dd42d7..5fbf6a084d 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java @@ -72,7 +72,11 @@ public class MapMarkerSelectionFragment extends BaseOsmAndDialogFragment { LatLon myLoc = l == null ? null : new LatLon(l.getLatitude(), l.getLongitude()); useCenter = !mapLinked; loc = (useCenter ? mw : myLoc); - heading = useCenter ? -mapRotation : head; + if (useCenter) { + heading = -mapRotation; + } else { + heading = head; + } } } nightMode = !app.getSettings().isLightContent(); From ae23a621582ccb230caf5429f5aa028026f17bae Mon Sep 17 00:00:00 2001 From: vshcherb Date: Fri, 20 Oct 2017 12:23:20 +0300 Subject: [PATCH 044/187] Update build.gradle --- OsmAnd/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index 9c1b0ce045..0bbdf704e6 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -39,10 +39,10 @@ android { defaultConfig { minSdkVersion System.getenv("MIN_SDK_VERSION") ? System.getenv("MIN_SDK_VERSION").toInteger() : 14 targetSdkVersion 23 - versionCode 270 + versionCode 280 versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode multiDexEnabled true - versionName "2.7.0" + versionName "2.8.0" versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName } From 6555ce6f615d083bbd30156d63267d819e4f7373 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 12:25:57 +0300 Subject: [PATCH 045/187] Show keyboard with fragment --- .../mapmarkers/RenameMarkerBottomSheetDialogFragment.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java index f0191ed619..0703a867e4 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java @@ -1,6 +1,7 @@ package net.osmand.plus.mapmarkers; import android.app.Dialog; +import android.content.Context; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; @@ -12,6 +13,7 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.LinearLayout; @@ -55,6 +57,8 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text); nameEditText.setText(marker.getName(mapActivity)); + final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); View textBox = mainView.findViewById(R.id.name_text_box); if (textBox instanceof OsmandTextFieldBoxes) { ((OsmandTextFieldBoxes) textBox).activate(true); @@ -63,6 +67,7 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag mainView.findViewById(R.id.save_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0); dismiss(); } }); @@ -70,6 +75,7 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag mainView.findViewById(R.id.close_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0); dismiss(); } }); From cb7c1d6ee5e8e373cfc50c1a180fc4b7ae9e55d6 Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Fri, 20 Oct 2017 12:32:50 +0300 Subject: [PATCH 046/187] Fix context menu for map regions --- .../mapcontextmenu/MapContextMenuFragment.java | 1 + .../plus/mapcontextmenu/MenuController.java | 16 +++++++++++++++- .../controllers/MapDataMenuController.java | 7 ++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index b181e47f40..ab03574f92 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -787,6 +787,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { progressTitle.setText(titleProgressController.caption); progressBar.setIndeterminate(titleProgressController.indeterminate); progressBar.setProgress(titleProgressController.progress); + progressBar.setVisibility(titleProgressController.progressVisible ? View.VISIBLE : View.GONE); final ImageView progressButton = (ImageView) view.findViewById(R.id.progressButton); progressButton.setVisibility(titleProgressController.buttonVisible ? View.VISIBLE : View.GONE); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java index e6e0d4faa2..894018ab7c 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java @@ -440,7 +440,9 @@ public abstract class MenuController extends BaseMenuController { leftDownloadButtonController.visible = !downloaded; leftDownloadButtonController.leftIconId = R.drawable.ic_action_import; - boolean downloadIndexes = getMapActivity().getMyApplication().getSettings().isInternetConnectionAvailable() + boolean internetConnectionAvailable = + getMapActivity().getMyApplication().getSettings().isInternetConnectionAvailable(); + boolean downloadIndexes = internetConnectionAvailable && !downloadThread.getIndexes().isDownloadedFromInternet && !downloadThread.getIndexes().downloadFromInternetFailed; @@ -470,6 +472,9 @@ public abstract class MenuController extends BaseMenuController { } else if (downloadIndexes) { titleProgressController.setIndexesDownloadMode(); titleProgressController.visible = true; + } else if (!internetConnectionAvailable) { + titleProgressController.setNoInternetConnectionMode(); + titleProgressController.visible = true; } else { titleProgressController.visible = false; } @@ -507,16 +512,25 @@ public abstract class MenuController extends BaseMenuController { public int progress = 0; public boolean indeterminate; public boolean visible; + public boolean progressVisible; public boolean buttonVisible; public void setIndexesDownloadMode() { caption = getMapActivity().getString(R.string.downloading_list_indexes); indeterminate = true; + progressVisible = true; + buttonVisible = false; + } + + public void setNoInternetConnectionMode() { + caption = getMapActivity().getString(R.string.no_index_file_to_download); + progressVisible = false; buttonVisible = false; } public void setMapDownloadMode() { indeterminate = false; + progressVisible = true; buttonVisible = true; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java index 2e0c0c2e24..4b1a519633 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/MapDataMenuController.java @@ -353,7 +353,9 @@ public class MapDataMenuController extends MenuController { topRightTitleButtonController.visible = (otherIndexItems != null && otherIndexItems.size() > 0) || (otherLocalIndexInfos != null && otherLocalIndexInfos.size() > 0); - boolean downloadIndexes = getMapActivity().getMyApplication().getSettings().isInternetConnectionAvailable() + boolean internetConnectionAvailable = + getMapActivity().getMyApplication().getSettings().isInternetConnectionAvailable(); + boolean downloadIndexes = internetConnectionAvailable && !downloadThread.getIndexes().isDownloadedFromInternet && !downloadThread.getIndexes().downloadFromInternetFailed; @@ -383,6 +385,9 @@ public class MapDataMenuController extends MenuController { } else if (downloadIndexes) { titleProgressController.setIndexesDownloadMode(); titleProgressController.visible = true; + } else if (!internetConnectionAvailable) { + titleProgressController.setNoInternetConnectionMode(); + titleProgressController.visible = true; } else { titleProgressController.visible = false; } From 541ad88f018d11d5a394a23423b0c72c9635d0ce Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 12:57:45 +0300 Subject: [PATCH 047/187] Add functionality for renaming --- .../src/net/osmand/plus/MapMarkersHelper.java | 4 ++++ .../mapmarkers/MarkerMenuOnMapFragment.java | 2 +- ...RenameMarkerBottomSheetDialogFragment.java | 22 +++++++++++++++---- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java index ebd85e0527..9e778e4001 100644 --- a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java +++ b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java @@ -101,6 +101,10 @@ public class MapMarkersHelper { return pointDescription == null ? "" : pointDescription.getName(); } + public void setName(String name) { + pointDescription.setName(name); + } + public double getLatitude() { return point.getLatitude(); } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java index 711c871cde..654da3ea4b 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MarkerMenuOnMapFragment.java @@ -305,7 +305,7 @@ public class MarkerMenuOnMapFragment extends Fragment implements OsmAndCompassLi } } - private void dismiss() { + public void dismiss() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { mapActivity.getSupportFragmentManager().popBackStackImmediate(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java index 0703a867e4..77bd395cdb 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java @@ -5,6 +5,8 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.LayoutInflater; @@ -38,7 +40,7 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - MapActivity mapActivity = (MapActivity) getActivity(); + final MapActivity mapActivity = (MapActivity) getActivity(); final boolean portrait = AndroidUiHelper.isOrientationPortrait(getActivity()); final boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls(); final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; @@ -57,8 +59,9 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text); nameEditText.setText(marker.getName(mapActivity)); + nameEditText.requestFocus(); final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); + imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY); View textBox = mainView.findViewById(R.id.name_text_box); if (textBox instanceof OsmandTextFieldBoxes) { ((OsmandTextFieldBoxes) textBox).activate(true); @@ -67,7 +70,14 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag mainView.findViewById(R.id.save_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0); + String name = nameEditText.getText().toString(); + marker.setName(name); + mapActivity.getMyApplication().getMapMarkersHelper().updateMapMarker(marker, true); + FragmentManager fm = mapActivity.getSupportFragmentManager(); + Fragment fragment = fm.findFragmentByTag(MarkerMenuOnMapFragment.TAG); + if (fragment != null) { + ((MarkerMenuOnMapFragment) fragment).dismiss(); + } dismiss(); } }); @@ -75,7 +85,6 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag mainView.findViewById(R.id.close_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0); dismiss(); } }); @@ -138,6 +147,11 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag @Override public void onDestroyView() { + View view = getView(); + if (view != null) { + InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } Dialog dialog = getDialog(); if (dialog != null && getRetainInstance()) { dialog.setDismissMessage(null); From 90268647da16f3726c25bcda5c303cf52e77628e Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 13:29:59 +0300 Subject: [PATCH 048/187] Add error message and name check --- OsmAnd/res/values/strings.xml | 1 + .../RenameMarkerBottomSheetDialogFragment.java | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 43fe81569e..866a9c442e 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,7 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Wrong input Enter new name Back Wrong format diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java index 77bd395cdb..886c38794e 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/RenameMarkerBottomSheetDialogFragment.java @@ -71,14 +71,18 @@ public class RenameMarkerBottomSheetDialogFragment extends BottomSheetDialogFrag @Override public void onClick(View view) { String name = nameEditText.getText().toString(); - marker.setName(name); - mapActivity.getMyApplication().getMapMarkersHelper().updateMapMarker(marker, true); - FragmentManager fm = mapActivity.getSupportFragmentManager(); - Fragment fragment = fm.findFragmentByTag(MarkerMenuOnMapFragment.TAG); - if (fragment != null) { - ((MarkerMenuOnMapFragment) fragment).dismiss(); + if (name.replaceAll("\\s", "").length() > 0) { + marker.setName(name); + mapActivity.getMyApplication().getMapMarkersHelper().updateMapMarker(marker, true); + FragmentManager fm = mapActivity.getSupportFragmentManager(); + Fragment fragment = fm.findFragmentByTag(MarkerMenuOnMapFragment.TAG); + if (fragment != null) { + ((MarkerMenuOnMapFragment) fragment).dismiss(); + } + dismiss(); + } else { + nameEditText.setError(getString(R.string.wrong_input)); } - dismiss(); } }); From af6670535a77da8ffa3af19a9bc40db7473ceabb Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 20 Oct 2017 13:53:05 +0300 Subject: [PATCH 049/187] Fix groups after disabling --- .../src/net/osmand/plus/MapMarkersHelper.java | 52 +++++++++---------- .../adapters/MapMarkersGroupsAdapter.java | 19 +++---- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java index ebd85e0527..eb961cc33e 100644 --- a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java +++ b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java @@ -488,21 +488,6 @@ public class MapMarkersHelper { } } - public void addMarker(MapMarker marker, int position) { - if (marker != null) { - markersDbHelper.addMarker(marker); - if (marker.history) { - mapMarkersHistory.add(position, marker); - sortMarkers(mapMarkersHistory, true, OsmandSettings.MapMarkersOrderByMode.DATE_ADDED_DESC); - } else { - mapMarkers.add(position, marker); - reorderActiveMarkersIfNeeded(); - } - addMarkerToGroup(marker); - refresh(); - } - } - public void restoreMarkerFromHistory(MapMarker marker, int position) { if (marker != null) { markersDbHelper.restoreMapMarkerFromHistory(marker); @@ -700,11 +685,34 @@ public class MapMarkersHelper { markersDbHelper.removeDisabledGroups(); } - public void updateGroupDisabled(String id, boolean disabled) { + public void updateGroupDisabled(MapMarkersGroup group, boolean disabled) { + String id = group.getGroupKey(); if (id != null) { markersDbHelper.updateSyncGroupDisabled(id, disabled); + updateSyncGroupDisabled(group, disabled); } - loadMarkers(); + } + + private void updateSyncGroupDisabled(MapMarkersGroup group, boolean disabled) { + List groupMarkers = group.getMarkers(); + for (MapMarker marker : groupMarkers) { + if (marker.history) { + if (disabled) { + mapMarkersHistory.remove(marker); + } else { + mapMarkersHistory.add(marker); + } + } else { + if (disabled) { + mapMarkers.remove(marker); + } else { + mapMarkers.add(marker); + } + } + } + reorderActiveMarkersIfNeeded(); + sortMarkers(mapMarkersHistory, true, OsmandSettings.MapMarkersOrderByMode.DATE_ADDED_DESC); + refresh(); } public void removeActiveMarkersFromSyncGroup(String syncGroupId) { @@ -798,16 +806,6 @@ public class MapMarkersHelper { } } - public void moveMarkerToTop(MapMarker marker) { - int i = mapMarkers.indexOf(marker); - if (i != -1 && mapMarkers.size() > 1) { - mapMarkers.remove(i); - mapMarkers.add(0, marker); - reorderActiveMarkersIfNeeded(); - refresh(); - } - } - public void saveMapMarkers(List markers, List markersHistory) { if (markers != null) { List ls = new ArrayList<>(markers.size()); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java index 1876f3fb30..2eb0bafd2f 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersGroupsAdapter.java @@ -69,6 +69,7 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter groups = app.getMapMarkersHelper().getMapMarkersGroups(); for (int i = 0; i < groups.size(); i++) { MapMarkersGroup group = groups.get(i); @@ -351,32 +352,32 @@ public class MapMarkersGroupsAdapter extends RecyclerView.Adapter Date: Fri, 20 Oct 2017 14:46:47 +0300 Subject: [PATCH 050/187] Select gpx when import waypoints --- .../net/osmand/plus/myplaces/TrackPointFragment.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java index 8b35a5897f..c710b74f00 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java @@ -89,7 +89,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { private OsmandApplication app; final private PointGPXAdapter adapter = new PointGPXAdapter(); - private GpxDisplayItemType[] filterTypes = { GpxDisplayItemType.TRACK_POINTS, GpxDisplayItemType.TRACK_ROUTE_POINTS }; + private GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_POINTS, GpxDisplayItemType.TRACK_ROUTE_POINTS}; private boolean selectionMode = false; private boolean addToMapMarkersMode = false; private LinkedHashMap> selectedItems = new LinkedHashMap<>(); @@ -350,7 +350,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { protected List flatten(List groups) { ArrayList list = new ArrayList<>(); - for(GpxDisplayGroup g : groups) { + for (GpxDisplayGroup g : groups) { list.addAll(g.getModifiableList()); } return list; @@ -647,6 +647,10 @@ public class TrackPointFragment extends OsmandExpandableListFragment { AndroidUtils.trimExtension(gpx.getName()), MarkersSyncGroup.GPX_TYPE); markersHelper.addMarkersSyncGroup(syncGroup); markersHelper.syncGroup(syncGroup); + GPXFile gpxFile = getTrackActivity().getGpx(); + if (gpxFile != null) { + app.getSelectedGpxHelper().selectGpxFile(gpxFile, true, false); + } } else { for (GpxDisplayItem i : entry.getValue()) { if (i.locationStart != null) { @@ -718,7 +722,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { AlertDialog.Builder b = new AlertDialog.Builder(getTrackActivity()); final EditText editText = new EditText(getTrackActivity()); String name = getSelectedItems().iterator().next().group.getName(); - if(name.indexOf('\n') > 0) { + if (name.indexOf('\n') > 0) { name = name.substring(0, name.indexOf('\n')); } editText.setText(name); @@ -735,7 +739,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { actionMode.finish(); } FavouritesDbHelper fdb = app.getFavorites(); - for(GpxDisplayItem i : getSelectedItems()) { + for (GpxDisplayItem i : getSelectedItems()) { if (i.locationStart != null) { FavouritePoint fp = new FavouritePoint(i.locationStart.lat, i.locationStart.lon, i.name, editText.getText().toString()); if (!Algorithms.isEmpty(i.description)) { From 1d437c872ce089963010de06f77af96c66d4c319 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 16:04:24 +0300 Subject: [PATCH 051/187] Fix icons for snap to road mode button --- OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java | 2 +- .../osmand/plus/measurementtool/MeasurementToolFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java index b55066047c..1909b7c19b 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java @@ -650,7 +650,7 @@ public class PlanRouteFragment extends Fragment implements OsmAndLocationListene if (mapActivity != null) { final ImageButton appModesBtn = (ImageButton) mapActivity.findViewById(R.id.snap_to_road_image_button); appModesBtn.setBackgroundResource(nightMode ? R.drawable.btn_circle_night : R.drawable.btn_circle); - appModesBtn.setImageDrawable(getActiveIcon(planRouteContext.getSnappedMode().getSmallIconDark())); + appModesBtn.setImageDrawable(getActiveIcon(planRouteContext.getSnappedMode().getMapIconId())); appModesBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index 3345225bae..1ecb43e380 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -754,7 +754,7 @@ public class MeasurementToolFragment extends Fragment { ImageButton snapToRoadBtn = (ImageButton) mapActivity.findViewById(R.id.snap_to_road_image_button); snapToRoadBtn.setBackgroundResource(nightMode ? R.drawable.btn_circle_night : R.drawable.btn_circle); - snapToRoadBtn.setImageDrawable(getActiveIcon(appMode.getSmallIconDark())); + snapToRoadBtn.setImageDrawable(getActiveIcon(appMode.getMapIconId())); snapToRoadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { From 2ff9954942fb1c5908c46a897bd83ad09851cbed Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 20 Oct 2017 16:25:22 +0300 Subject: [PATCH 052/187] Fix build --- .../fragment_marker_menu_on_map.xml | 2 +- .../layout/fragment_marker_menu_on_map.xml | 2 +- ...ment_rename_marker_bottom_sheet_dialog.xml | 8 +++---- .../res/layout/marker_menu_on_map_content.xml | 22 +++++++++---------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml b/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml index 3ca520dc96..6bce2a039d 100644 --- a/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml +++ b/OsmAnd/res/layout-land/fragment_marker_menu_on_map.xml @@ -22,7 +22,7 @@ diff --git a/OsmAnd/res/layout/marker_menu_on_map_content.xml b/OsmAnd/res/layout/marker_menu_on_map_content.xml index fef10c9dbf..2a3f3e760a 100644 --- a/OsmAnd/res/layout/marker_menu_on_map_content.xml +++ b/OsmAnd/res/layout/marker_menu_on_map_content.xml @@ -16,9 +16,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/bottom_sheet_icon_margin" - android:layout_marginLeft="@dimen/bottom_sheet_content_padding" + android:layout_marginLeft="@dimen/content_padding" android:layout_marginRight="@dimen/bottom_sheet_icon_margin" - android:layout_marginStart="@dimen/bottom_sheet_content_padding" + android:layout_marginStart="@dimen/content_padding" tools:src="@drawable/ic_action_flag_dark"/> Date: Fri, 20 Oct 2017 16:58:03 +0300 Subject: [PATCH 053/187] Fix index out of bounds exception --- .../adapters/MapMarkersItemTouchHelperCallback.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersItemTouchHelperCallback.java b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersItemTouchHelperCallback.java index 32f08e9e0d..8a4d1c0285 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersItemTouchHelperCallback.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/adapters/MapMarkersItemTouchHelperCallback.java @@ -88,7 +88,12 @@ public class MapMarkersItemTouchHelperCallback extends ItemTouchHelper.Callback @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { - return adapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition()); + int from = source.getAdapterPosition(); + int to = target.getAdapterPosition(); + if (from == RecyclerView.NO_POSITION || to == RecyclerView.NO_POSITION) { + return false; + } + return adapter.onItemMove(from, to); } @Override From baf37542d5092e72ef74fe9f0aa6c99e06cf5f5a Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Fri, 20 Oct 2017 17:11:34 +0300 Subject: [PATCH 054/187] Fix directions icon --- .../plus/mapmarkers/OptionsBottomSheetDialogFragment.java | 2 +- .../mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java index c8721fb477..8da8580f2f 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/OptionsBottomSheetDialogFragment.java @@ -79,7 +79,7 @@ public class OptionsBottomSheetDialogFragment extends BottomSheetDialogFragment ((ImageView) mainView.findViewById(R.id.coordinate_input_icon)) .setImageDrawable(getContentIcon(R.drawable.ic_action_coordinates_longitude)); ((ImageView) mainView.findViewById(R.id.build_route_icon)) - .setImageDrawable(getContentIcon(R.drawable.map_directions)); + .setImageDrawable(getContentIcon(R.drawable.ic_action_gdirections_dark)); ((ImageView) mainView.findViewById(R.id.save_as_new_track_icon)) .setImageDrawable(getContentIcon(R.drawable.ic_action_polygom_dark)); ((ImageView) mainView.findViewById(R.id.move_all_to_history_icon)) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java index cf6a765044..02228c50fc 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteOptionsBottomSheetDialogFragment.java @@ -55,7 +55,7 @@ public class PlanRouteOptionsBottomSheetDialogFragment extends BottomSheetDialog ((TextView) mainView.findViewById(R.id.title)).setTextColor(ContextCompat.getColor(getActivity(), R.color.ctx_menu_info_text_dark)); } - ((ImageView) mainView.findViewById(R.id.navigate_icon)).setImageDrawable(getContentIcon(R.drawable.map_directions)); + ((ImageView) mainView.findViewById(R.id.navigate_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_gdirections_dark)); ((ImageView) mainView.findViewById(R.id.make_round_trip_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_trip_round)); ((ImageView) mainView.findViewById(R.id.door_to_door_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_sort_door_to_door)); ((ImageView) mainView.findViewById(R.id.reverse_icon)).setImageDrawable(getContentIcon(R.drawable.ic_action_sort_reverse_order)); From 135d01b7c7a8bed42d5a75551706312b968e9796 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 20 Oct 2017 17:20:37 +0300 Subject: [PATCH 055/187] Fix waypoints --- OsmAnd/res/layout/track_points_tree.xml | 4 +- OsmAnd/res/values/strings.xml | 2 + .../osmand/plus/activities/MapActivity.java | 14 +- .../mapmarkers/MapMarkersDialogFragment.java | 20 +++ .../plus/myplaces/TrackPointFragment.java | 150 ++++++++++-------- 5 files changed, 120 insertions(+), 70 deletions(-) diff --git a/OsmAnd/res/layout/track_points_tree.xml b/OsmAnd/res/layout/track_points_tree.xml index 83a44d7fc9..51335ba85b 100644 --- a/OsmAnd/res/layout/track_points_tree.xml +++ b/OsmAnd/res/layout/track_points_tree.xml @@ -1,5 +1,5 @@ - @@ -25,4 +25,4 @@ - \ 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 a9418a8cd0..d0adadf810 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,8 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + View + Waypoints added to map markers Wrong format Road Show map diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 4aa1980093..f2ba5a6a6c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -144,6 +144,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven MapMarkerChangedListener, OnDismissDialogFragmentListener, OnDrawMapListener { public static final String INTENT_KEY_PARENT_MAP_ACTIVITY = "intent_parent_map_activity_key"; + public static final String OPEN_MAP_MARKERS_GROUPS = "open_map_markers_groups"; + private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1; private static final int LONG_KEYPRESS_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 2; private static final int LONG_KEYPRESS_DELAY = 500; @@ -680,6 +682,9 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } } } + if (intent.hasExtra(OPEN_MAP_MARKERS_GROUPS)) { + MapMarkersDialogFragment.showInstance(this, true); + } } mapView.refreshMap(true); if (atlasMapRendererView != null) { @@ -1378,7 +1383,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven return mapLayers; } - public static void launchMapActivityMoveToTop(Context activity) { + public static void launchMapActivityMoveToTop(Context activity, String openMarkersAction) { if (activity instanceof MapActivity) { if (((MapActivity) activity).getDashboard().isVisible()) { ((MapActivity) activity).getDashboard().hideDashboard(); @@ -1400,10 +1405,17 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven Intent newIntent = new Intent(activity, ((OsmandApplication) activity.getApplicationContext()) .getAppCustomization().getMapActivity()); newIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); + if (openMarkersAction != null) { + newIntent.putExtra(openMarkersAction, true); + } activity.startActivity(newIntent); } } + public static void launchMapActivityMoveToTop(Context activity) { + launchMapActivityMoveToTop(activity, null); + } + public static void clearPrevActivityIntent() { prevActivityIntent = null; } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java index b339c021ce..43a03eb77e 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java @@ -64,6 +64,11 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { + Bundle args = getArguments(); + boolean openGroups = false; + if (args != null && args.getBoolean(MapActivity.OPEN_MAP_MARKERS_GROUPS)) { + openGroups = true; + } List fragments = getChildFragmentManager().getFragments(); if (fragments != null) { for (Fragment fragment : fragments) { @@ -144,6 +149,12 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm bottomNav.setItemIconTintList(ContextCompat.getColorStateList(getContext(), R.color.bottom_navigation_color_selector_dark)); bottomNav.setItemTextColor(ContextCompat.getColorStateList(getContext(), R.color.bottom_navigation_color_selector_dark)); } + if (openGroups) { + activeFragment.stopLocationUpdate(); + groupsFragment.startLocationUpdate(); + groupsFragment.updateAdapter(); + viewPager.setCurrentItem(GROUPS_POSITION, false); + } bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { @@ -350,11 +361,20 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm } public static boolean showInstance(@NonNull MapActivity mapActivity) { + return showInstance(mapActivity, false); + } + + public static boolean showInstance(@NonNull MapActivity mapActivity, boolean openGroups) { try { if (mapActivity.isActivityDestroyed()) { return false; } MapMarkersDialogFragment fragment = new MapMarkersDialogFragment(); + if (openGroups) { + Bundle args = new Bundle(); + args.putBoolean(MapActivity.OPEN_MAP_MARKERS_GROUPS, true); + fragment.setArguments(args); + } fragment.show(mapActivity.getSupportFragmentManager(), TAG); return true; } catch (RuntimeException e) { diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java index c710b74f00..4b4aa9b1f8 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java @@ -9,6 +9,7 @@ import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; import android.support.v4.content.ContextCompat; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; @@ -91,7 +92,6 @@ public class TrackPointFragment extends OsmandExpandableListFragment { final private PointGPXAdapter adapter = new PointGPXAdapter(); private GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_POINTS, GpxDisplayItemType.TRACK_ROUTE_POINTS}; private boolean selectionMode = false; - private boolean addToMapMarkersMode = false; private LinkedHashMap> selectedItems = new LinkedHashMap<>(); private Set selectedGroups = new LinkedHashSet<>(); private ActionMode actionMode; @@ -105,6 +105,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { private FloatingActionButton lineFab; private View lineTextLayout; private View overlayView; + private View mainView; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -179,29 +180,29 @@ public class TrackPointFragment extends OsmandExpandableListFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.track_points_tree, container, false); - ExpandableListView listView = (ExpandableListView) view.findViewById(android.R.id.list); + mainView = inflater.inflate(R.layout.track_points_tree, container, false); + ExpandableListView listView = (ExpandableListView) mainView.findViewById(android.R.id.list); setHasOptionsMenu(true); - overlayView = view.findViewById(R.id.overlay_view); + overlayView = mainView.findViewById(R.id.overlay_view); overlayView.setOnClickListener(onFabClickListener); - menuFab = (FloatingActionButton) view.findViewById(R.id.menu_fab); + menuFab = (FloatingActionButton) mainView.findViewById(R.id.menu_fab); menuFab.setOnClickListener(onFabClickListener); - waypointFab = (FloatingActionButton) view.findViewById(R.id.waypoint_fab); + waypointFab = (FloatingActionButton) mainView.findViewById(R.id.waypoint_fab); waypointFab.setOnClickListener(onFabClickListener); - waypointTextLayout = view.findViewById(R.id.waypoint_text_layout); + waypointTextLayout = mainView.findViewById(R.id.waypoint_text_layout); waypointTextLayout.setOnClickListener(onFabClickListener); - routePointFab = (FloatingActionButton) view.findViewById(R.id.route_fab); + routePointFab = (FloatingActionButton) mainView.findViewById(R.id.route_fab); routePointFab.setOnClickListener(onFabClickListener); - routePointTextLayout = view.findViewById(R.id.route_text_layout); + routePointTextLayout = mainView.findViewById(R.id.route_text_layout); routePointTextLayout.setOnClickListener(onFabClickListener); - lineFab = (FloatingActionButton) view.findViewById(R.id.line_fab); + lineFab = (FloatingActionButton) mainView.findViewById(R.id.line_fab); lineFab.setOnClickListener(onFabClickListener); - lineTextLayout = view.findViewById(R.id.line_text_layout); + lineTextLayout = mainView.findViewById(R.id.line_text_layout); lineTextLayout.setOnClickListener(onFabClickListener); TextView tv = new TextView(getActivity()); @@ -212,7 +213,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { setContent(listView); setListView(listView); expandAllGroups(); - return view; + return mainView; } private int getSelectedItemsCount() { @@ -469,10 +470,6 @@ public class TrackPointFragment extends OsmandExpandableListFragment { this.selectionMode = selectionMode; } - private void enableAddToMapMarkersMode(boolean addToMapMarkersMode) { - this.addToMapMarkersMode = addToMapMarkersMode; - } - private void enterDeleteMode() { actionMode = getActionBarActivity().startSupportActionMode(new ActionMode.Callback() { @@ -588,50 +585,83 @@ public class TrackPointFragment extends OsmandExpandableListFragment { } private void enterMapMarkersMode() { - actionMode = getActionBarActivity().startSupportActionMode(new ActionMode.Callback() { + if (getSettings().USE_MAP_MARKERS.get()) { + addMapMarkersSyncGroup(); + } else { + actionMode = getActionBarActivity().startSupportActionMode(new ActionMode.Callback() { - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - if (getSettings().USE_MAP_MARKERS.get()) { - enableAddToMapMarkersMode(true); - createMenuItem(menu, SELECT_MAP_MARKERS_ACTION_MODE_ID, R.string.shared_string_add_to_map_markers, - R.drawable.ic_action_flag_dark, R.drawable.ic_action_flag_dark, - MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); - } else { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { enableSelectionMode(true); createMenuItem(menu, SELECT_MAP_MARKERS_ACTION_MODE_ID, R.string.select_destination_and_intermediate_points, R.drawable.ic_action_intermediate, R.drawable.ic_action_intermediate, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); + selectedItems.clear(); + selectedGroups.clear(); + adapter.notifyDataSetInvalidated(); + updateSelectionMode(mode); + return true; } - selectedItems.clear(); - selectedGroups.clear(); - adapter.notifyDataSetInvalidated(); - updateSelectionMode(mode); - return true; - } - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return false; - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - enableSelectionMode(false); - enableAddToMapMarkersMode(false); - adapter.notifyDataSetInvalidated(); - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (item.getItemId() == SELECT_MAP_MARKERS_ACTION_MODE_ID) { - mode.finish(); - selectMapMarkersImpl(); + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; } - return true; + + @Override + public void onDestroyActionMode(ActionMode mode) { + enableSelectionMode(false); + adapter.notifyDataSetInvalidated(); + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (item.getItemId() == SELECT_MAP_MARKERS_ACTION_MODE_ID) { + mode.finish(); + selectMapMarkersImpl(); + } + return true; + } + }); + } + } + + private void addMapMarkersSyncGroup() { + MapMarkersHelper markersHelper = app.getMapMarkersHelper(); + File gpx = getGpxDataItem().getFile(); + MarkersSyncGroup syncGroup = new MarkersSyncGroup(gpx.getAbsolutePath(), + AndroidUtils.trimExtension(gpx.getName()), MarkersSyncGroup.GPX_TYPE); + markersHelper.addMarkersSyncGroup(syncGroup); + markersHelper.syncGroup(syncGroup); + GPXFile gpxFile = getTrackActivity().getGpx(); + if (gpxFile != null) { + app.getSelectedGpxHelper().selectGpxFile(gpxFile, true, false); + } + hideTransparentOverlay(); + closeMenu(); + updateMenuFabVisibility(false); + Snackbar snackbar = Snackbar.make(mainView, getResources().getString(R.string.waypoints_added_to_map_markers), Snackbar.LENGTH_LONG) + .setAction(getResources().getString(R.string.view), new View.OnClickListener() { + @Override + public void onClick(View v) { + MapActivity.launchMapActivityMoveToTop(getTrackActivity(), MapActivity.OPEN_MAP_MARKERS_GROUPS); + } + }); + snackbar.addCallback(new Snackbar.Callback() { + @Override + public void onDismissed(Snackbar transientBottomBar, int event) { + updateMenuFabVisibility(true); + super.onDismissed(transientBottomBar, event); } }); + View snackBarView = snackbar.getView(); + TextView tv = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_action); + tv.setTextColor(ContextCompat.getColor(getContext(), R.color.color_dialog_buttons_dark)); + snackbar.show(); + } + private void updateMenuFabVisibility(boolean visible) { + menuFab.setVisibility(visible ? View.VISIBLE : View.GONE); } private void selectMapMarkersImpl() { @@ -641,17 +671,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { List points = new LinkedList<>(); List names = new LinkedList<>(); for (Map.Entry> entry : selectedItems.entrySet()) { - if (entry.getKey() == GpxDisplayItemType.TRACK_POINTS) { - File gpx = getGpxDataItem().getFile(); - MarkersSyncGroup syncGroup = new MarkersSyncGroup(gpx.getAbsolutePath(), - AndroidUtils.trimExtension(gpx.getName()), MarkersSyncGroup.GPX_TYPE); - markersHelper.addMarkersSyncGroup(syncGroup); - markersHelper.syncGroup(syncGroup); - GPXFile gpxFile = getTrackActivity().getGpx(); - if (gpxFile != null) { - app.getSelectedGpxHelper().selectGpxFile(gpxFile, true, false); - } - } else { + if (entry.getKey() != GpxDisplayItemType.TRACK_POINTS) { for (GpxDisplayItem i : entry.getValue()) { if (i.locationStart != null) { points.add(new LatLon(i.locationStart.lat, i.locationStart.lon)); @@ -788,7 +808,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { } } updateSelectionMode(actionMode); - } else if (!addToMapMarkersMode) { + } else { final GpxDisplayItem item = adapter.getChild(groupPosition, childPosition); if (item != null) { if (item.group.getGpx() != null) { @@ -897,8 +917,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { View row = convertView; final GpxDisplayGroup group = getGroup(groupPosition); boolean checkBox = row != null && row.findViewById(R.id.toggle_item) instanceof CheckBox; - boolean showCheckBox = selectionMode || (addToMapMarkersMode && group.getType() == GpxDisplayItemType.TRACK_POINTS); - boolean same = (showCheckBox && checkBox) || (!showCheckBox && !checkBox); + boolean same = (selectionMode && checkBox) || (!selectionMode && !checkBox); if (row == null || !same) { LayoutInflater inflater = getActivity().getLayoutInflater(); row = inflater.inflate(R.layout.wpt_list_item_category, parent, false); @@ -915,7 +934,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { description.setText(getString(R.string.route_points_category_name)); } - if (showCheckBox) { + if (selectionMode) { final CheckBox ch = (CheckBox) row.findViewById(R.id.toggle_item); ch.setVisibility(View.VISIBLE); ch.setChecked(selectedGroups.contains(groupPosition)); @@ -1061,9 +1080,6 @@ public class TrackPointFragment extends OsmandExpandableListFragment { }); } else { row.findViewById(R.id.icon).setVisibility(View.VISIBLE); - if (addToMapMarkersMode) { - ch.setVisibility(View.GONE); - } } return row; } From 318068860782306e5e666905c6282ac59509f02d Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 20 Oct 2017 17:30:07 +0300 Subject: [PATCH 056/187] Rename argument --- OsmAnd/src/net/osmand/plus/activities/MapActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index f2ba5a6a6c..dba86cfbd5 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -1383,7 +1383,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven return mapLayers; } - public static void launchMapActivityMoveToTop(Context activity, String openMarkersAction) { + public static void launchMapActivityMoveToTop(Context activity, String intentExtraActionName) { if (activity instanceof MapActivity) { if (((MapActivity) activity).getDashboard().isVisible()) { ((MapActivity) activity).getDashboard().hideDashboard(); @@ -1405,8 +1405,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven Intent newIntent = new Intent(activity, ((OsmandApplication) activity.getApplicationContext()) .getAppCustomization().getMapActivity()); newIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); - if (openMarkersAction != null) { - newIntent.putExtra(openMarkersAction, true); + if (intentExtraActionName != null) { + newIntent.putExtra(intentExtraActionName, true); } activity.startActivity(newIntent); } From 53bc3b1a1ac0ce2828ee491004c1f1a3d747fc1b Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Fri, 20 Oct 2017 17:19:34 +0300 Subject: [PATCH 057/187] Fix context menu zoom --- .../MapContextMenuFragment.java | 40 ++++++++++++++----- .../osmand/plus/views/OsmandMapTileView.java | 32 +++++++++++++-- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index ab03574f92..1cdddd794c 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -565,6 +565,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { boolean needMapAdjust = oldMenuState != newMenuState && newMenuState != MenuState.FULL_SCREEN; if (newMenuState != oldMenuState) { + restoreCustomMapRatio(); menu.updateControlsVisibility(true); doBeforeMenuStateChange(oldMenuState, newMenuState); } @@ -572,20 +573,39 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { applyPosY(currentY, needCloseMenu, needMapAdjust, oldMenuState, newMenuState, 0); } - public void doZoomIn() { - if (!centered) { - centered = true; - calculateCenterLatLon(menu.getLatLon(), getZoom() + 1, true); + private void restoreCustomMapRatio() { + if (map.hasCustomMapRatio()) { + map.restoreMapRatio(); + } + } + + private void setCustomMapRatio() { + LatLon latLon = menu.getLatLon(); + RotatedTileBox tb = map.getCurrentRotatedTileBox().copy(); + float px = tb.getPixXFromLatLon(latLon.getLatitude(), latLon.getLongitude()); + float py = tb.getPixYFromLatLon(latLon.getLatitude(), latLon.getLongitude()); + float ratioX = px / tb.getPixWidth(); + float ratioY = py / tb.getPixHeight(); + map.setCustomMapRatio(ratioX, ratioY); + map.setLatLon(latLon.getLatitude(), latLon.getLongitude()); + } + + public void doZoomIn() { + if (map.isZooming() && map.hasCustomMapRatio()) { + getMapActivity().changeZoom(2, System.currentTimeMillis()); + } else { + if (!map.hasCustomMapRatio()) { + setCustomMapRatio(); + } + getMapActivity().changeZoom(1, System.currentTimeMillis()); } - applyPosY(getViewY(), false, true, 0, 0, 1); } public void doZoomOut() { - if (!centered) { - centered = true; - calculateCenterLatLon(menu.getLatLon(), getZoom() - 1, true); + if (!map.hasCustomMapRatio()) { + setCustomMapRatio(); } - applyPosY(getViewY(), false, true, 0, 0, -1); + getMapActivity().changeZoom(-1, System.currentTimeMillis()); } private void applyPosY(final int currentY, final boolean needCloseMenu, boolean needMapAdjust, @@ -859,6 +879,8 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { @Override public void onPause() { + restoreCustomMapRatio(); + ViewParent parent = view.getParent(); if (parent != null && containerLayoutListener != null) { ((View) parent).removeOnLayoutChangeListener(containerLayoutListener); diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 79aa23f434..230ff660c7 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -124,9 +124,12 @@ public class OsmandMapTileView implements IMapDownloaderCallback { private float rotate; // accumulate private int mapPosition; - private int mapPositionX; + private float mapRatioX; + private float mapRatioY; + private LatLon originalRatioCenterLatLon; + private boolean showMapPosition = true; private IMapLocationListener locationListener; @@ -488,6 +491,25 @@ public class OsmandMapTileView implements IMapDownloaderCallback { this.mapPositionX = type; } + public void setCustomMapRatio(float ratioX, float ratioY) { + this.mapRatioX = ratioX; + this.mapRatioY = ratioY; + originalRatioCenterLatLon = currentViewport.getCenterLatLon(); + } + + public void restoreMapRatio() { + mapRatioX = 0; + mapRatioY = 0; + if (originalRatioCenterLatLon != null) { + setLatLon(originalRatioCenterLatLon.getLatitude(), originalRatioCenterLatLon.getLongitude()); + originalRatioCenterLatLon = null; + } + } + + public boolean hasCustomMapRatio() { + return mapRatioX != 0 && mapRatioY != 0; + } + public OsmandSettings getSettings() { return settings; } @@ -576,7 +598,9 @@ public class OsmandMapTileView implements IMapDownloaderCallback { return; } final float ratioy; - if (mapPosition == OsmandSettings.BOTTOM_CONSTANT) { + if (mapRatioY != 0) { + ratioy = mapRatioY; + } else if (mapPosition == OsmandSettings.BOTTOM_CONSTANT) { ratioy = 0.85f; } else if (mapPosition == OsmandSettings.MIDDLE_BOTTOM_CONSTANT) { ratioy = 0.70f; @@ -586,7 +610,9 @@ public class OsmandMapTileView implements IMapDownloaderCallback { ratioy = 0.5f; } final float ratiox; - if (mapPosition == OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT) { + if (mapRatioX != 0) { + ratiox = mapRatioX; + } else if (mapPosition == OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT) { ratiox = 0.7f; } else { ratiox = mapPositionX == 0 ? 0.5f : 0.75f; From 8d50394b7594ed8b434dc1f6a3a85f883130ace5 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 20 Oct 2017 17:35:23 +0300 Subject: [PATCH 058/187] Move constant --- OsmAnd/src/net/osmand/plus/activities/MapActivity.java | 4 +--- .../osmand/plus/mapmarkers/MapMarkersDialogFragment.java | 6 ++++-- OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index dba86cfbd5..59c85b86a2 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -144,8 +144,6 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven MapMarkerChangedListener, OnDismissDialogFragmentListener, OnDrawMapListener { public static final String INTENT_KEY_PARENT_MAP_ACTIVITY = "intent_parent_map_activity_key"; - public static final String OPEN_MAP_MARKERS_GROUPS = "open_map_markers_groups"; - private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1; private static final int LONG_KEYPRESS_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 2; private static final int LONG_KEYPRESS_DELAY = 500; @@ -682,7 +680,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven } } } - if (intent.hasExtra(OPEN_MAP_MARKERS_GROUPS)) { + if (intent.hasExtra(MapMarkersDialogFragment.OPEN_MAP_MARKERS_GROUPS)) { MapMarkersDialogFragment.showInstance(this, true); } } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java index 43a03eb77e..a1eba79338 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkersDialogFragment.java @@ -39,6 +39,8 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm public static final String TAG = "MapMarkersDialogFragment"; + public static final String OPEN_MAP_MARKERS_GROUPS = "open_map_markers_groups"; + private static final int ACTIVE_MARKERS_POSITION = 0; private static final int GROUPS_POSITION = 1; private static final int HISTORY_MARKERS_POSITION = 2; @@ -66,7 +68,7 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { Bundle args = getArguments(); boolean openGroups = false; - if (args != null && args.getBoolean(MapActivity.OPEN_MAP_MARKERS_GROUPS)) { + if (args != null && args.getBoolean(OPEN_MAP_MARKERS_GROUPS)) { openGroups = true; } List fragments = getChildFragmentManager().getFragments(); @@ -372,7 +374,7 @@ public class MapMarkersDialogFragment extends android.support.v4.app.DialogFragm MapMarkersDialogFragment fragment = new MapMarkersDialogFragment(); if (openGroups) { Bundle args = new Bundle(); - args.putBoolean(MapActivity.OPEN_MAP_MARKERS_GROUPS, true); + args.putBoolean(OPEN_MAP_MARKERS_GROUPS, true); fragment.setArguments(args); } fragment.show(mapActivity.getSupportFragmentManager(), TAG); diff --git a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java index 4b4aa9b1f8..8d4f9b564b 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/TrackPointFragment.java @@ -59,6 +59,7 @@ import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.base.FavoriteImageDrawable; import net.osmand.plus.base.OsmandExpandableListFragment; import net.osmand.plus.dialogs.DirectionsDialogs; +import net.osmand.plus.mapmarkers.MapMarkersDialogFragment; import net.osmand.plus.measurementtool.NewGpxData; import net.osmand.util.Algorithms; @@ -644,7 +645,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment { .setAction(getResources().getString(R.string.view), new View.OnClickListener() { @Override public void onClick(View v) { - MapActivity.launchMapActivityMoveToTop(getTrackActivity(), MapActivity.OPEN_MAP_MARKERS_GROUPS); + MapActivity.launchMapActivityMoveToTop(getTrackActivity(), MapMarkersDialogFragment.OPEN_MAP_MARKERS_GROUPS); } }); snackbar.addCallback(new Snackbar.Callback() { From 75a9acce67e1512595dd08bcf6a1c6ac88c1e2a7 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Sat, 21 Oct 2017 19:44:49 +0300 Subject: [PATCH 059/187] Fix crash with location provider --- OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java index b3046bc6c3..5b2611e2c2 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java @@ -869,6 +869,7 @@ public class OsmAndLocationProvider implements SensorEventListener { } public net.osmand.Location getLastKnownLocation() { + net.osmand.Location location = this.location; if (location != null && locationRequestsCounter == 0 && System.currentTimeMillis() - location.getTime() > STALE_LOCATION_TIMEOUT) { location = null; From e6b14d6a68b6a29441f57c6ba029f280d005654f Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Mon, 23 Oct 2017 12:21:32 +0300 Subject: [PATCH 060/187] Fix NPE --- OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java index 188915c41e..ab0974df95 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java @@ -268,7 +268,9 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { public void afterTextChanged(Editable s) { if (!getEditPoiData().isInEdit()) { getEditPoiData().updateTypeTag(s.toString()); - poiTypeTextInputLayout.setHint(editPoiData.getPoiCategory().getTranslation()); + if (!getMyApplication().isApplicationInitializing()) { + poiTypeTextInputLayout.setHint(editPoiData.getPoiCategory().getTranslation()); + } } } }); From 066888bef0473f2644a8899324045b0277a7ad5e Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Mon, 23 Oct 2017 13:55:16 +0300 Subject: [PATCH 061/187] Fix context menu npe --- .../MapContextMenuFragment.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index 1cdddd794c..b0d958737e 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -574,7 +574,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { } private void restoreCustomMapRatio() { - if (map.hasCustomMapRatio()) { + if (map != null && map.hasCustomMapRatio()) { map.restoreMapRatio(); } } @@ -881,16 +881,18 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents { public void onPause() { restoreCustomMapRatio(); - ViewParent parent = view.getParent(); - if (parent != null && containerLayoutListener != null) { - ((View) parent).removeOnLayoutChangeListener(containerLayoutListener); + if (view != null) { + ViewParent parent = view.getParent(); + if (parent != null && containerLayoutListener != null) { + ((View) parent).removeOnLayoutChangeListener(containerLayoutListener); + } + getMapActivity().getMapViewTrackingUtilities().setContextMenu(null); + getMapActivity().getMapViewTrackingUtilities().setMapLinkedToLocation(false); + if (!wasDrawerDisabled) { + getMapActivity().enableDrawer(); + } + menu.updateControlsVisibility(false); } - getMapActivity().getMapViewTrackingUtilities().setContextMenu(null); - getMapActivity().getMapViewTrackingUtilities().setMapLinkedToLocation(false); - if (!wasDrawerDisabled) { - getMapActivity().enableDrawer(); - } - menu.updateControlsVisibility(false); super.onPause(); } From d6dbf27e148f1eaa5b8e1642cc915b8e6b394377 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Mon, 23 Oct 2017 18:58:38 +0300 Subject: [PATCH 062/187] Auto size text and keyboard styling --- OsmAnd/res/drawable/keyboard_item_dark_bg.xml | 4 +- .../keyboard_item_text_color_light.xml | 5 ++ .../fragment_coordinate_input_dialog.xml | 25 ++++--- ...ent_marker_options_bottom_sheet_dialog.xml | 1 - .../layout/input_coordinate_keyboard_item.xml | 10 +-- OsmAnd/res/values/attrs.xml | 1 + OsmAnd/res/values/colors.xml | 5 +- OsmAnd/res/values/styles.xml | 4 ++ OsmAnd/src/net/osmand/AndroidUtils.java | 12 ++-- .../CoordinateInputDialogFragment.java | 68 +++++++++++-------- 10 files changed, 82 insertions(+), 53 deletions(-) create mode 100644 OsmAnd/res/drawable/keyboard_item_text_color_light.xml diff --git a/OsmAnd/res/drawable/keyboard_item_dark_bg.xml b/OsmAnd/res/drawable/keyboard_item_dark_bg.xml index b4a642e69e..533eb8eaf9 100644 --- a/OsmAnd/res/drawable/keyboard_item_dark_bg.xml +++ b/OsmAnd/res/drawable/keyboard_item_dark_bg.xml @@ -1,7 +1,7 @@ - - + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/keyboard_item_text_color_light.xml b/OsmAnd/res/drawable/keyboard_item_text_color_light.xml new file mode 100644 index 0000000000..47019c86f1 --- /dev/null +++ b/OsmAnd/res/drawable/keyboard_item_text_color_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml b/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml index df67805097..553f11ddc3 100644 --- a/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml +++ b/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml @@ -1,10 +1,10 @@ + xmlns:tools="http://schemas.android.com/tools"> + osmand:contentInsetLeft="54dp" + osmand:contentInsetStart="54dp"> + osmand:labelText="@string/navigate_point_latitude"> + osmand:labelText="@string/navigate_point_longitude"> + osmand:labelText="@string/shared_string_name"> + tools:src="@drawable/ic_action_arrow_down"/> - diff --git a/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml index ab56b39923..d6ccfd5352 100644 --- a/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml +++ b/OsmAnd/res/layout/fragment_marker_options_bottom_sheet_dialog.xml @@ -112,7 +112,6 @@ android:background="?attr/dashboard_divider"/> - \ No newline at end of file diff --git a/OsmAnd/res/values/attrs.xml b/OsmAnd/res/values/attrs.xml index 607dd9269b..9770a92a98 100644 --- a/OsmAnd/res/values/attrs.xml +++ b/OsmAnd/res/values/attrs.xml @@ -8,6 +8,7 @@ + diff --git a/OsmAnd/res/values/colors.xml b/OsmAnd/res/values/colors.xml index 82634e5bfa..715564f2a0 100644 --- a/OsmAnd/res/values/colors.xml +++ b/OsmAnd/res/values/colors.xml @@ -264,6 +264,9 @@ #525e66 - #545454 + #545454 + #ffffff + + #ffffff \ No newline at end of file diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index e558b60677..2dea7d5aae 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -171,6 +171,8 @@ @color/color_dialog_buttons_light @style/PopupMenuLight + + @drawable/keyboard_item_text_color_light + + From a8f18ea653c0dbc801dd0cd9b7df5423f2921253 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 3 Nov 2017 16:53:35 +0200 Subject: [PATCH 132/187] Fix keyboard icon --- OsmAnd/res/values/colors.xml | 1 + .../osmand/plus/mapmarkers/CoordinateInputDialogFragment.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values/colors.xml b/OsmAnd/res/values/colors.xml index 06fe9c6bfa..faf4b4bd9c 100644 --- a/OsmAnd/res/values/colors.xml +++ b/OsmAnd/res/values/colors.xml @@ -281,6 +281,7 @@ #e6e6e6 #2a2f33 + #9fadfc #4257c9 \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 6fb4dfa89a..7ab74cc700 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -188,7 +188,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm final OsmandTextFieldBoxes longitudeBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.longitude_box); textFieldBoxes.add(longitudeBox); final OsmandTextFieldBoxes nameBox = (OsmandTextFieldBoxes) mainView.findViewById(R.id.name_box); - nameBox.setEndIcon(iconsCache.getThemedIcon(R.drawable.ic_action_keyboard)); + nameBox.setEndIcon(iconsCache.getIcon(R.drawable.ic_action_keyboard, R.color.coordinate_input_keyboard_icon_color)); nameBox.getEndIconImageButton().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { From 99298344f2899417b51b435cdb85c067449b88c5 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 3 Nov 2017 18:14:52 +0200 Subject: [PATCH 133/187] Add show number pad setting --- .../fragment_coordinate_input_dialog.xml | 85 +------ ...coordinate_input_land_map_markers_list.xml | 41 ++++ .../coordinate_input_land_osmand_keyboard.xml | 46 ++++ ...nate_input_options_bottom_sheet_helper.xml | 2 +- ...rdinateInputBottomSheetDialogFragment.java | 48 ++-- .../CoordinateInputDialogFragment.java | 224 ++++++++++-------- 6 files changed, 246 insertions(+), 200 deletions(-) create mode 100644 OsmAnd/res/layout/coordinate_input_land_map_markers_list.xml create mode 100644 OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml diff --git a/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml b/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml index b648f02eef..26c6d10416 100644 --- a/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml +++ b/OsmAnd/res/layout-land/fragment_coordinate_input_dialog.xml @@ -121,94 +121,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OsmAnd/res/layout/coordinate_input_land_map_markers_list.xml b/OsmAnd/res/layout/coordinate_input_land_map_markers_list.xml new file mode 100644 index 0000000000..e9a2e62df9 --- /dev/null +++ b/OsmAnd/res/layout/coordinate_input_land_map_markers_list.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml b/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml new file mode 100644 index 0000000000..64d4d9fceb --- /dev/null +++ b/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml index f261d69782..349c03aebc 100644 --- a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml +++ b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml @@ -102,7 +102,7 @@ adapterView, View view, int i, long l) { - View focusedView = getDialog().getCurrentFocus(); - if (focusedView != null && focusedView instanceof EditText) { - EditText focusedEditText = (EditText) focusedView; - switch (i) { - case CLEAR_BUTTON_POSITION: - focusedEditText.setText(""); - break; - case BACKSPACE_BUTTON_POSITION: - String str = focusedEditText.getText().toString(); - if (str.length() > 0) { - str = str.substring(0, str.length() - 1); - focusedEditText.setText(str); - focusedEditText.setSelection(str.length()); - } - break; - case SWITCH_TO_NEXT_INPUT_BUTTON_POSITION: - switchToNextInput(focusedEditText.getId()); - break; - default: - focusedEditText.setText(focusedEditText.getText().toString() + keyboardAdapter.getItem(i)); - focusedEditText.setSelection(focusedEditText.getText().length()); - } - } - } - }); - - if (orientationPortrait) { - final ImageView showHideKeyboardIcon = (ImageView) mainView.findViewById(R.id.show_hide_keyboard_icon); - showHideKeyboardIcon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_arrow_down, R.color.keyboard_item_show_hide_color)); - showHideKeyboardIcon.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - boolean isCurrentlyVisible = isOsmandKeyboardCurrentlyVisible(); - View focusedView = getDialog().getCurrentFocus(); - if (focusedView != null && !isCurrentlyVisible) { - AndroidUtils.hideSoftKeyboard(getActivity(), focusedView); - } - if (orientationPortrait) { - changeOsmandKeyboardVisibility(!isCurrentlyVisible); - } - } - }); - } + registerMainView(); return mainView; } + private void registerMainView() { + MapActivity mapActivity = getMapActivity(); + + if (mapActivity != null) { + if (!orientationPortrait) { + LinearLayout handContainer = (LinearLayout) mainView.findViewById(R.id.hand_container); + if (rightHand) { + View.inflate(getContext(), R.layout.coordinate_input_land_map_markers_list, handContainer); + View.inflate(getContext(), R.layout.coordinate_input_land_osmand_keyboard, handContainer); + } else { + View.inflate(getContext(), R.layout.coordinate_input_land_osmand_keyboard, handContainer); + View.inflate(getContext(), R.layout.coordinate_input_land_map_markers_list, handContainer); + } + } + + final View mapMarkersLayout = mainView.findViewById(R.id.map_markers_layout); + + RecyclerView recyclerView = (RecyclerView) mainView.findViewById(R.id.markers_recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + adapter = new CoordinateInputAdapter(mapActivity, mapMarkers); + if (mapMarkersLayout != null) { + adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + mapMarkersLayout.setVisibility(adapter.isEmpty() ? View.GONE : View.VISIBLE); + } + }); + } + recyclerView.setAdapter(adapter); + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + compassUpdateAllowed = newState == RecyclerView.SCROLL_STATE_IDLE; + } + }); + + mainView.findViewById(R.id.add_marker_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + addMapMarker(); + } + }); + + View keyboardLayout = mainView.findViewById(R.id.keyboard_layout); + if (orientationPortrait) { + AndroidUtils.setBackground(mapActivity, keyboardLayout, !lightTheme, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); + } + + Object[] keyboardItems = new Object[] { "1", "2", "3", getString(R.string.shared_string_clear), + "4", "5", "6", "-", + "7", "8", "9", R.drawable.ic_keyboard_backspace, + ".", "0", ":", R.drawable.ic_keyboard_next_field}; + final GridView keyboardGrid = (GridView) mainView.findViewById(R.id.keyboard_grid_view); + keyboardGrid.setBackgroundColor(ContextCompat.getColor(getContext(), lightTheme ? R.color.keyboard_divider_light : R.color.keyboard_divider_dark)); + final KeyboardAdapter keyboardAdapter = new KeyboardAdapter(mapActivity, keyboardItems); + keyboardGrid.setAdapter(keyboardAdapter); + keyboardGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + View focusedView = getDialog().getCurrentFocus(); + if (focusedView != null && focusedView instanceof EditText) { + EditText focusedEditText = (EditText) focusedView; + switch (i) { + case CLEAR_BUTTON_POSITION: + focusedEditText.setText(""); + break; + case BACKSPACE_BUTTON_POSITION: + String str = focusedEditText.getText().toString(); + if (str.length() > 0) { + str = str.substring(0, str.length() - 1); + focusedEditText.setText(str); + focusedEditText.setSelection(str.length()); + } + break; + case SWITCH_TO_NEXT_INPUT_BUTTON_POSITION: + switchToNextInput(focusedEditText.getId()); + break; + default: + focusedEditText.setText(focusedEditText.getText().toString() + keyboardAdapter.getItem(i)); + focusedEditText.setSelection(focusedEditText.getText().length()); + } + } + } + }); + + if (orientationPortrait) { + final ImageView showHideKeyboardIcon = (ImageView) mainView.findViewById(R.id.show_hide_keyboard_icon); + showHideKeyboardIcon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_arrow_down, R.color.keyboard_item_show_hide_color)); + showHideKeyboardIcon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + boolean isCurrentlyVisible = isOsmandKeyboardCurrentlyVisible(); + View focusedView = getDialog().getCurrentFocus(); + if (focusedView != null && !isCurrentlyVisible) { + AndroidUtils.hideSoftKeyboard(getActivity(), focusedView); + } + changeOsmandKeyboardVisibility(!isCurrentlyVisible); + } + }); + } + } + } + @Override public void onResume() { super.onResume(); @@ -584,7 +604,9 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } private void changeHand() { - + LinearLayout handContainer = (LinearLayout) mainView.findViewById(R.id.hand_container); + handContainer.removeAllViewsInLayout(); + registerMainView(); } private void changeEditTextSelections() { From 83215d47a31f75830ea788652411df4847e376fb Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 3 Nov 2017 18:20:22 +0200 Subject: [PATCH 134/187] Clear button clears all inputs --- .../osmand/plus/mapmarkers/CoordinateInputDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 15838b7bea..e9413fcf2d 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -293,7 +293,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm EditText focusedEditText = (EditText) focusedView; switch (i) { case CLEAR_BUTTON_POSITION: - focusedEditText.setText(""); + clearInputs(); break; case BACKSPACE_BUTTON_POSITION: String str = focusedEditText.getText().toString(); From 21494f20e1661a8dc5843db13b0378b756befd7c Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Fri, 3 Nov 2017 18:48:01 +0200 Subject: [PATCH 135/187] Change default keyboard by tapping on icon --- .../CoordinateInputDialogFragment.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index e9413fcf2d..fff4b371d2 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -196,9 +196,8 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm public void onClick(View view) { View focusedView = getDialog().getCurrentFocus(); if (focusedView != null) { - if (isOsmandKeyboardCurrentlyVisible()) { - changeOsmandKeyboardVisibility(false); - } + useOsmandKeyboard = false; + changeKeyboard(); AndroidUtils.showSoftKeyboard(focusedView); } } @@ -570,17 +569,21 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm changeEditTextSelections(); } + private void changeKeyboard() { + if (orientationPortrait && !useOsmandKeyboard && isOsmandKeyboardCurrentlyVisible()) { + changeOsmandKeyboardVisibility(false); + } + changeKeyboardInBoxes(); + changeKeyboardInEditTexts(); + changeEditTextSelections(); + } + private CoordinateInputBottomSheetDialogFragment.CoordinateInputFormatChangeListener createCoordinateInputFormatChangeListener() { return new CoordinateInputBottomSheetDialogFragment.CoordinateInputFormatChangeListener() { @Override public void onKeyboardChanged(boolean useOsmandKeyboard) { CoordinateInputDialogFragment.this.useOsmandKeyboard = useOsmandKeyboard; - if (orientationPortrait && !useOsmandKeyboard && isOsmandKeyboardCurrentlyVisible()) { - changeOsmandKeyboardVisibility(false); - } - changeKeyboardInBoxes(); - changeKeyboardInEditTexts(); - changeEditTextSelections(); + changeKeyboard(); } @Override From 9083b0b6734591abe73abca110e6f219da20eb0f Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Mon, 6 Nov 2017 13:20:15 +0200 Subject: [PATCH 136/187] Fix colors --- OsmAnd/res/drawable/keyboard_item_icon_color_light.xml | 5 +++++ OsmAnd/res/drawable/keyboard_item_text_color_light.xml | 5 ----- OsmAnd/res/layout-land/input_coordinate_keyboard_item.xml | 2 +- OsmAnd/res/layout/input_coordinate_keyboard_item.xml | 2 +- OsmAnd/res/values/attrs.xml | 2 +- OsmAnd/res/values/styles.xml | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 OsmAnd/res/drawable/keyboard_item_icon_color_light.xml delete mode 100644 OsmAnd/res/drawable/keyboard_item_text_color_light.xml diff --git a/OsmAnd/res/drawable/keyboard_item_icon_color_light.xml b/OsmAnd/res/drawable/keyboard_item_icon_color_light.xml new file mode 100644 index 0000000000..d40fc93754 --- /dev/null +++ b/OsmAnd/res/drawable/keyboard_item_icon_color_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/keyboard_item_text_color_light.xml b/OsmAnd/res/drawable/keyboard_item_text_color_light.xml deleted file mode 100644 index 42423b3f54..0000000000 --- a/OsmAnd/res/drawable/keyboard_item_text_color_light.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/OsmAnd/res/layout-land/input_coordinate_keyboard_item.xml b/OsmAnd/res/layout-land/input_coordinate_keyboard_item.xml index db0edc8f3d..e546c02781 100644 --- a/OsmAnd/res/layout-land/input_coordinate_keyboard_item.xml +++ b/OsmAnd/res/layout-land/input_coordinate_keyboard_item.xml @@ -33,7 +33,7 @@ android:layout_gravity="center" android:layout_weight="1" android:scaleType="center" - android:tint="?attr/keyboard_item_text_color" + android:tint="?attr/keyboard_item_icon_color" tools:src="@drawable/ic_action_backspace_fill"/> \ No newline at end of file diff --git a/OsmAnd/res/layout/input_coordinate_keyboard_item.xml b/OsmAnd/res/layout/input_coordinate_keyboard_item.xml index 6f2cd9357c..2d9f7be76a 100644 --- a/OsmAnd/res/layout/input_coordinate_keyboard_item.xml +++ b/OsmAnd/res/layout/input_coordinate_keyboard_item.xml @@ -33,7 +33,7 @@ android:layout_gravity="center" android:layout_weight="1" android:scaleType="center" - android:tint="?attr/keyboard_item_text_color" + android:tint="?attr/keyboard_item_icon_color" tools:src="@drawable/ic_action_backspace_fill"/> \ No newline at end of file diff --git a/OsmAnd/res/values/attrs.xml b/OsmAnd/res/values/attrs.xml index 8d6816fa2b..b46ef5c0ad 100644 --- a/OsmAnd/res/values/attrs.xml +++ b/OsmAnd/res/values/attrs.xml @@ -8,7 +8,7 @@ - + diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index cca6adbc33..1c72bbf5f4 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -177,7 +177,7 @@ @style/PopupMenuLight - @drawable/keyboard_item_text_color_light + @drawable/keyboard_item_icon_color_light @@ -350,7 +349,6 @@ @style/PopupMenuDark - @color/keyboard_item_divider_control_color_dark @color/keyboard_item_add_button_divider_dark diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 82a27a9f9a..50c34b5ca2 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -5,6 +5,7 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; @@ -12,6 +13,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.widget.TextViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; @@ -845,7 +847,14 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm keyboardItemBottomSpacing.setVisibility(View.GONE); keyboardItemText.setVisibility(View.GONE); keyboardItemImage.setVisibility(View.VISIBLE); - keyboardItemImage.setImageResource((Integer) item); + Drawable icon; + if (lightTheme) { + icon = DrawableCompat.wrap(getResources().getDrawable((Integer) item)); + DrawableCompat.setTintList(icon, numberColorStateList); + } else { + icon = iconsCache.getIcon((Integer) item, R.color.keyboard_item_divider_control_color_dark); + } + keyboardItemImage.setImageDrawable(icon); } return convertView; From bfe5b7b8139b28a06ae8fea4edcbd3fe2a0cf084 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 10:11:25 +0200 Subject: [PATCH 147/187] Fix backspace --- .../CoordinateInputDialogFragment.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 50c34b5ca2..6284bd8ddf 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -383,9 +383,11 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm private void registerInputEditTexts() { TextWatcher textWatcher = new TextWatcher() { + private int strLength; + @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - + strLength = charSequence.length(); } @Override @@ -400,11 +402,14 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm if (focusedView != null && focusedView instanceof EditText) { EditText focusedEditText = (EditText) focusedView; String str = focusedEditText.getText().toString(); - int pointIndex = str.indexOf("."); - if (pointIndex != -1) { - int currentAccuracy = str.substring(pointIndex + 1).length(); - if (currentAccuracy >= accuracy) { - switchToNextInput(focusedEditText.getId()); + int currentLength = str.length(); + if (currentLength > strLength) { + int pointIndex = str.indexOf("."); + if (pointIndex != -1) { + int currentAccuracy = str.substring(pointIndex + 1).length(); + if (currentAccuracy >= accuracy) { + switchToNextInput(focusedEditText.getId()); + } } } } From 61462118597ca50d8c618eeaddc605fb7ebd8000 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 11:18:59 +0200 Subject: [PATCH 148/187] Save state on rotate --- .../plus/widgets/OsmandTextFieldBoxes.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java b/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java index 181354c57f..ac74ae009a 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java +++ b/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java @@ -1,6 +1,9 @@ package net.osmand.plus.widgets; import android.content.Context; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.View; @@ -81,7 +84,54 @@ public class OsmandTextFieldBoxes extends TextFieldBoxes { this.activated = false; } + @Nullable + @Override + protected Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + SavedState savedState = new SavedState(superState); + savedState.hasText = editText.getText().length() > 0; + return savedState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + SavedState savedState = (SavedState) state; + super.onRestoreInstanceState(savedState.getSuperState()); + if (savedState.hasText) { + activate(true); + } + } + public ExtendedEditText getEditText() { return editText; } + + private static class SavedState extends BaseSavedState { + private boolean hasText; + + SavedState(Parcel source) { + super(source); + hasText = source.readByte() == 1; + } + + SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeByte((byte) (hasText ? 1 : 0)); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } } From 39eed933ce83d591a16c016e61d748aab4dc7d26 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 18:01:42 +0200 Subject: [PATCH 149/187] Add checking --- OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java b/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java index ac74ae009a..6c87674b85 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java +++ b/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java @@ -89,7 +89,9 @@ public class OsmandTextFieldBoxes extends TextFieldBoxes { protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState savedState = new SavedState(superState); - savedState.hasText = editText.getText().length() > 0; + if (editText != null) { + savedState.hasText = !editText.getText().toString().isEmpty(); + } return savedState; } From a739381339154911e1c64c43e840f93ac095a457 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 19:55:14 +0200 Subject: [PATCH 150/187] Show error in input field --- OsmAnd/res/values/colors.xml | 1 + OsmAnd/res/values/styles.xml | 1 + .../CoordinateInputDialogFragment.java | 34 ++++++++++++++----- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/OsmAnd/res/values/colors.xml b/OsmAnd/res/values/colors.xml index a6c29ce377..0f40ee0c18 100644 --- a/OsmAnd/res/values/colors.xml +++ b/OsmAnd/res/values/colors.xml @@ -294,5 +294,6 @@ #536dfe #2d3980 #9fadfc + #ed5421 \ No newline at end of file diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index 37f9b8ab6c..14c055351b 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -89,6 +89,7 @@ diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 6284bd8ddf..dffc58892f 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -40,7 +40,6 @@ import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import android.widget.Toast; import net.osmand.AndroidUtils; import net.osmand.Location; @@ -659,18 +658,35 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } private void addMapMarker() { - String latitude = ((EditText) mainView.findViewById(R.id.latitude_edit_text)).getText().toString(); - String longitude = ((EditText) mainView.findViewById(R.id.longitude_edit_text)).getText().toString(); - String locPhrase = latitude + " " + longitude; - LatLon latLon = MapUtils.parseLocation(locPhrase); - if (latLon != null) { - String name = ((EditText) mainView.findViewById(R.id.name_edit_text)).getText().toString(); - addMapMarker(latLon, name); + final String latitude = ((EditText) mainView.findViewById(R.id.latitude_edit_text)).getText().toString(); + final String longitude = ((EditText) mainView.findViewById(R.id.longitude_edit_text)).getText().toString(); + double lat = parseCoordinate(latitude); + double lon = parseCoordinate(longitude); + if (lat == 0 || lon == 0) { + if (lon == 0) { + ((OsmandTextFieldBoxes) mainView.findViewById(R.id.latitude_box)).setError("", true); + } + if (lat == 0) { + ((OsmandTextFieldBoxes) mainView.findViewById(R.id.longitude_box)).setError("", true); + } } else { - Toast.makeText(getContext(), getString(R.string.wrong_format), Toast.LENGTH_SHORT).show(); + String name = ((EditText) mainView.findViewById(R.id.name_edit_text)).getText().toString(); + addMapMarker(new LatLon(lat, lon), name); } } + private double parseCoordinate(String s) { + List d = new ArrayList<>(); + List all = new ArrayList<>(); + List strings = new ArrayList<>(); + MapUtils.splitObjects(s, d, all, strings); + double coordinate = MapUtils.parse1Coordinate(all, 0, all.size()); + if (coordinate == 0 && d.size() == 1) { + coordinate = d.get(0); + } + return coordinate; + } + private void addMapMarker(LatLon latLon, String name) { PointDescription pointDescription = new PointDescription(PointDescription.POINT_TYPE_MAP_MARKER, name); int colorIndex = mapMarkers.size() > 0 ? mapMarkers.get(mapMarkers.size() - 1).colorIndex : -1; From b050f07c01bcacf9a0d508fb472982c5dd89a576 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 20:12:39 +0200 Subject: [PATCH 151/187] Increase library version --- OsmAnd/build.gradle | 2 +- .../plus/widgets/OsmandTextFieldBoxes.java | 50 +------------------ 2 files changed, 2 insertions(+), 50 deletions(-) diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index c644910373..409fe53919 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -399,7 +399,7 @@ dependencies { exclude group: 'com.android.support' } compile 'com.github.PhilJay:MPAndroidChart:v3.0.1' - compile ("com.github.HITGIF:TextFieldBoxes:1.3.4"){ + compile ("com.github.HITGIF:TextFieldBoxes:1.3.5"){ exclude group: 'com.android.support' } } diff --git a/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java b/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java index 6c87674b85..d2503239d9 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java +++ b/OsmAnd/src/net/osmand/plus/widgets/OsmandTextFieldBoxes.java @@ -61,6 +61,7 @@ public class OsmandTextFieldBoxes extends TextFieldBoxes { if (!useOsmandKeyboard) { OsmandTextFieldBoxes.this.inputMethodManager.showSoftInput(OsmandTextFieldBoxes.this.editText, InputMethodManager.SHOW_IMPLICIT); } + performClick(); } @Override @@ -84,56 +85,7 @@ public class OsmandTextFieldBoxes extends TextFieldBoxes { this.activated = false; } - @Nullable - @Override - protected Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - if (editText != null) { - savedState.hasText = !editText.getText().toString().isEmpty(); - } - return savedState; - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState) state; - super.onRestoreInstanceState(savedState.getSuperState()); - if (savedState.hasText) { - activate(true); - } - } - public ExtendedEditText getEditText() { return editText; } - - private static class SavedState extends BaseSavedState { - private boolean hasText; - - SavedState(Parcel source) { - super(source); - hasText = source.readByte() == 1; - } - - SavedState(Parcelable superState) { - super(superState); - } - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeByte((byte) (hasText ? 1 : 0)); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } } From 287e32ba8135042f67789f6c6ebd73e799c5f3e1 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 20:15:20 +0200 Subject: [PATCH 152/187] Go to next field on by default --- .../osmand/plus/mapmarkers/CoordinateInputDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index dffc58892f..8ad0134c19 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -93,7 +93,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm private boolean lightTheme; private boolean useOsmandKeyboard = true; private boolean rightHand = true; - private boolean goToNextField; + private boolean goToNextField = true; private int accuracy = 4; private List textFieldBoxes; private View mainView; From 8285969ca929d3079f87460769c7814c040da741 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 20:20:57 +0200 Subject: [PATCH 153/187] Clear only current input --- .../osmand/plus/mapmarkers/CoordinateInputDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 8ad0134c19..e0bcefd818 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -288,7 +288,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm EditText focusedEditText = (EditText) focusedView; switch (i) { case CLEAR_BUTTON_POSITION: - clearInputs(); + focusedEditText.setText(""); break; case BACKSPACE_BUTTON_POSITION: String str = focusedEditText.getText().toString(); From 75f77f60aafab938b881811ee982679ca28a377f Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 20:25:06 +0200 Subject: [PATCH 154/187] Switch to previous input --- .../plus/mapmarkers/CoordinateInputDialogFragment.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index e0bcefd818..7bb5a2371c 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -296,6 +296,8 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm str = str.substring(0, str.length() - 1); focusedEditText.setText(str); focusedEditText.setSelection(str.length()); + } else { + switchToPreviousInput(focusedEditText.getId()); } break; case SWITCH_TO_NEXT_INPUT_BUTTON_POSITION: @@ -657,6 +659,14 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } } + private void switchToPreviousInput(int id) { + if (id == R.id.name_edit_text) { + ((OsmandTextFieldBoxes) mainView.findViewById(R.id.longitude_box)).select(); + } else if (id == R.id.longitude_edit_text) { + ((OsmandTextFieldBoxes) mainView.findViewById(R.id.latitude_box)).select(); + } + } + private void addMapMarker() { final String latitude = ((EditText) mainView.findViewById(R.id.latitude_edit_text)).getText().toString(); final String longitude = ((EditText) mainView.findViewById(R.id.longitude_edit_text)).getText().toString(); From 07b0fc0e1fb17cf96c25c60cdea343c39a4a6610 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 20:29:46 +0200 Subject: [PATCH 155/187] Increase numbers in portrait --- OsmAnd/res/layout/input_coordinate_keyboard_item.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/layout/input_coordinate_keyboard_item.xml b/OsmAnd/res/layout/input_coordinate_keyboard_item.xml index 8b2f3a0f57..0163a3229b 100644 --- a/OsmAnd/res/layout/input_coordinate_keyboard_item.xml +++ b/OsmAnd/res/layout/input_coordinate_keyboard_item.xml @@ -9,13 +9,13 @@ android:id="@+id/keyboard_item_top_spacing" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="0.3"/> + android:layout_weight="0.25"/> @@ -24,7 +24,7 @@ android:id="@+id/keyboard_item_bottom_spacing" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="0.3"/> + android:layout_weight="0.25"/> Date: Tue, 7 Nov 2017 20:47:41 +0200 Subject: [PATCH 156/187] Make accuracy setting non active when go to next field disabled --- ...nate_input_options_bottom_sheet_helper.xml | 3 +- ...rdinateInputBottomSheetDialogFragment.java | 44 +++++++++++-------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml index 8af08920b1..4c80f53f51 100644 --- a/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml +++ b/OsmAnd/res/layout/fragment_marker_coordinate_input_options_bottom_sheet_helper.xml @@ -208,7 +208,6 @@ android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:textAppearance="@style/TextAppearance.ListItemTitle" - android:textColor="@color/map_widget_blue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/selected_accuracy" @@ -218,7 +217,7 @@ android:id="@+id/accuracy_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/ic_action_arrow_drop_down"/> + tools:src="@drawable/ic_action_arrow_drop_down"/> diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java index 303aa4eefa..23ed66b538 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputBottomSheetDialogFragment.java @@ -110,36 +110,39 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia public void onClick(View view) { goToNextField = !goToNextField; ((CompoundButton) mainView.findViewById(R.id.go_to_next_field_switch)).setChecked(goToNextField); + switchSelectedAccuracy(); if (listener != null) { listener.onGoToNextFieldChanged(goToNextField); } } }); - ((ImageView) mainView.findViewById(R.id.accuracy_arrow)).setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_drop_down)); + switchSelectedAccuracy(); populateSelectedAccuracy(); mainView.findViewById(R.id.accuracy_row).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - final ListPopupWindow listPopupWindow = new ListPopupWindow(getContext()); - listPopupWindow.setAnchorView(view); - listPopupWindow.setContentWidth(AndroidUtils.dpToPx(getMyApplication(), 100)); - listPopupWindow.setModal(true); - listPopupWindow.setDropDownGravity(Gravity.END | Gravity.TOP); - listPopupWindow.setAdapter(new ArrayAdapter<>(getContext(), R.layout.popup_list_text_item, new Integer[]{0, 1, 2, 3, 4, 5, 6})); - listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - accuracy = i; - populateSelectedAccuracy(); - if (listener != null) { - listener.onAccuracyChanged(accuracy); + if (goToNextField) { + final ListPopupWindow listPopupWindow = new ListPopupWindow(getContext()); + listPopupWindow.setAnchorView(view); + listPopupWindow.setContentWidth(AndroidUtils.dpToPx(getMyApplication(), 100)); + listPopupWindow.setModal(true); + listPopupWindow.setDropDownGravity(Gravity.END | Gravity.TOP); + listPopupWindow.setAdapter(new ArrayAdapter<>(getContext(), R.layout.popup_list_text_item, new Integer[]{0, 1, 2, 3, 4, 5, 6})); + listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + accuracy = i; + populateSelectedAccuracy(); + if (listener != null) { + listener.onAccuracyChanged(accuracy); + } + listPopupWindow.dismiss(); } - listPopupWindow.dismiss(); - } - }); - listPopupWindow.show(); + }); + listPopupWindow.show(); + } } }); @@ -175,6 +178,11 @@ public class CoordinateInputBottomSheetDialogFragment extends MenuBottomSheetDia ((TextView) mainView.findViewById(R.id.selected_accuracy_hint)).setText("00:00." + new String(new char[accuracy]).replace("\0", "0")); } + private void switchSelectedAccuracy() { + ((TextView) mainView.findViewById(R.id.selected_accuracy)).setTextColor(ContextCompat.getColor(getContext(), goToNextField ? R.color.map_widget_blue : android.R.color.darker_gray)); + ((ImageView) mainView.findViewById(R.id.accuracy_arrow)).setImageDrawable(goToNextField ? getContentIcon(R.drawable.ic_action_arrow_drop_down) : getIcon(R.drawable.ic_action_arrow_drop_down, android.R.color.darker_gray)); + } + interface CoordinateInputFormatChangeListener { void onKeyboardChanged(boolean useOsmandKeyboard); From d05645d702193db05a4614411fc1173482ac3179 Mon Sep 17 00:00:00 2001 From: PavelRatushnyi Date: Tue, 7 Nov 2017 22:43:44 +0200 Subject: [PATCH 157/187] Merge branch 'master' of ssh://github.com/osmandapp/Osmand into coordinate_input_screen # Conflicts: # OsmAnd/res/values/strings.xml # OsmAnd/res/values/styles.xml --- OsmAnd/res/values/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index d7c3bb7104..139e68e899 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,14 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Digits quantity + Right + Left + Show number pad + Paste + Automatically switch to the next field after entering %1$d digits after the decimal point + %1$d digits + Go to next field Rename marker A tap on the map toggles the control buttons and widgets. Full screen mode From fc88d4d2db76fb73a237da159dd7efd0568c80c0 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 8 Nov 2017 10:21:55 +0200 Subject: [PATCH 158/187] Refactor --- .../CoordinateInputDialogFragment.java | 63 ++----------------- 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 7bb5a2371c..8cf8a5beaf 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -203,12 +203,9 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } } }); - textFieldBoxes.add(nameBox); - registerTextFieldBoxes(); - - registerInputEditTexts(); + registerInputs(); if (savedInstanceState == null) { latitudeBox.select(); @@ -360,7 +357,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } } - private void registerTextFieldBoxes() { + private void registerInputs() { View.OnTouchListener textFieldBoxOnTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { @@ -375,13 +372,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } }; - for (OsmandTextFieldBoxes textFieldBox : textFieldBoxes) { - textFieldBox.getPanel().setOnTouchListener(textFieldBoxOnTouchListener); - } - changeKeyboardInBoxes(); - } - - private void registerInputEditTexts() { TextWatcher textWatcher = new TextWatcher() { private int strLength; @@ -527,6 +517,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm }; for (OsmandTextFieldBoxes textFieldBox : textFieldBoxes) { + textFieldBox.getPanel().setOnTouchListener(textFieldBoxOnTouchListener); EditText editText = textFieldBox.getEditText(); if (editText.getId() != R.id.name_edit_text) { editText.addTextChangedListener(textWatcher); @@ -536,9 +527,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm editText.setOnEditorActionListener(inputTextViewOnEditorActionListener); } - changeInputEditTextHints(); - changeInputEditTextLengths(); - changeKeyboardInEditTexts(); + changeKeyboardInBoxes(); changeEditTextSelections(); } @@ -547,7 +536,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm changeOsmandKeyboardVisibility(false); } changeKeyboardInBoxes(); - changeKeyboardInEditTexts(); changeEditTextSelections(); } @@ -573,8 +561,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm @Override public void onAccuracyChanged(int accuracy) { CoordinateInputDialogFragment.this.accuracy = accuracy; - changeInputEditTextHints(); - changeInputEditTextLengths(); } }; } @@ -610,47 +596,6 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm } } - private void changeKeyboardInEditTexts() { -// int coordinateInputType = useOsmandKeyboard ? InputType.TYPE_NULL : InputType.TYPE_CLASS_NUMBER; -// int nameInputType = useOsmandKeyboard ? InputType.TYPE_NULL : InputType.TYPE_CLASS_TEXT; -// for (TextView inputTextView : inputEditTexts) { -// inputTextView.setInputType(inputTextView.getId() == R.id.name_edit_text ? nameInputType : coordinateInputType); -// } - } - - private void changeInputEditTextLengths() { -// int maxLength; -// if (accuracy == PointDescription.FORMAT_DEGREES) { -// maxLength = DEGREES_MAX_LENGTH; -// } else if (accuracy == PointDescription.FORMAT_MINUTES) { -// maxLength = MINUTES_MAX_LENGTH; -// } else { -// maxLength = SECONDS_MAX_LENGTH; -// } -// InputFilter[] filtersArray = new InputFilter[] {new InputFilter.LengthFilter(maxLength)}; -// for (EditText editText : inputEditTexts) { -// if (editText.getId() != R.id.name_edit_text) { -// editText.setFilters(filtersArray); -// } -// } - } - - private void changeInputEditTextHints() { -// String hint; -// if (accuracy == PointDescription.FORMAT_DEGREES) { -// hint = DEGREES_HINT; -// } else if (accuracy == PointDescription.FORMAT_MINUTES) { -// hint = MINUTES_HINT; -// } else { -// hint = SECONDS_HINT; -// } -// for (EditText editText : inputEditTexts) { -// if (editText.getId() != R.id.name_edit_text) { -// editText.setHint(hint); -// } -// } - } - private void switchToNextInput(int id) { if (id == R.id.latitude_edit_text) { ((OsmandTextFieldBoxes) mainView.findViewById(R.id.longitude_box)).select(); From 177a8a7cacbfad17a414cb27c3a2319dc723c090 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 8 Nov 2017 10:29:36 +0200 Subject: [PATCH 159/187] Change keyboard --- .../mapmarkers/CoordinateInputDialogFragment.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 8cf8a5beaf..bfb75fd08a 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -77,12 +77,12 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm public static final String GO_TO_NEXT_FIELD = "go_to_next_field"; public static final String ACCURACY = "accuracy"; - private static final int CLEAR_BUTTON_POSITION = 3; + private static final int SWITCH_TO_NEXT_INPUT_BUTTON_POSITION = 3; private static final int MINUS_BUTTON_POSITION = 7; private static final int BACKSPACE_BUTTON_POSITION = 11; - private static final int POINT_BUTTON_POSITION = 12; - private static final int COLON_BUTTON_POSITION = 14; - private static final int SWITCH_TO_NEXT_INPUT_BUTTON_POSITION = 15; + private static final int COLON_BUTTON_POSITION = 12; + private static final int POINT_BUTTON_POSITION = 14; + private static final int CLEAR_BUTTON_POSITION = 15; private static final String LATITUDE_LABEL = "latitude"; private static final String LONGITUDE_LABEL = "longitude"; private static final String NAME_LABEL = "name"; @@ -268,10 +268,10 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm AndroidUtils.setBackground(mapActivity, keyboardLayout, !lightTheme, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); } - Object[] keyboardItems = new Object[] { "1", "2", "3", getString(R.string.shared_string_clear), + Object[] keyboardItems = new Object[] { "1", "2", "3", R.drawable.ic_keyboard_next_field, "4", "5", "6", "-", "7", "8", "9", R.drawable.ic_keyboard_backspace, - ".", "0", ":", R.drawable.ic_keyboard_next_field}; + ":", "0", ".", getString(R.string.shared_string_clear)}; final GridView keyboardGrid = (GridView) mainView.findViewById(R.id.keyboard_grid_view); keyboardGrid.setBackgroundColor(ContextCompat.getColor(getContext(), lightTheme ? R.color.keyboard_divider_light : R.color.keyboard_divider_dark)); final KeyboardAdapter keyboardAdapter = new KeyboardAdapter(mapActivity, keyboardItems); From 26ce8b99edda4ce475df78db84bda3a55af8cc37 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Wed, 8 Nov 2017 11:16:08 +0200 Subject: [PATCH 160/187] Fix twitching of guide lines in navigation --- .../src/net/osmand/plus/views/MapMarkersLayer.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java index 78d1a4b359..79ccc7610f 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java @@ -27,6 +27,7 @@ import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.TargetPointsHelper.TargetPoint; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.views.ContextMenuLayer.ApplyMovedObjectCallback; import net.osmand.plus.views.ContextMenuLayer.IContextMenuProvider; import net.osmand.plus.views.ContextMenuLayer.IContextMenuProviderSelection; @@ -217,8 +218,17 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi textAttrs.updatePaints(view, nightMode, tileBox); textAttrs.paint.setStyle(Paint.Style.FILL); - int locX = (int) tileBox.getPixXFromLatLon(myLoc.getLatitude(), myLoc.getLongitude()); - int locY = (int) tileBox.getPixYFromLatLon(myLoc.getLatitude(), myLoc.getLongitude()); + int locX; + int locY; + if (map.getMapViewTrackingUtilities().isMapLinkedToLocation() + && !MapViewTrackingUtilities.isSmallSpeedForAnimation(myLoc) + && !map.getMapViewTrackingUtilities().isMovingToMyLocation()) { + locX = (int) tileBox.getPixXFromLatLon(tileBox.getLatitude(), tileBox.getLongitude()); + locY = (int) tileBox.getPixYFromLatLon(tileBox.getLatitude(), tileBox.getLongitude()); + } else { + locX = (int) tileBox.getPixXFromLatLon(myLoc.getLatitude(), myLoc.getLongitude()); + locY = (int) tileBox.getPixYFromLatLon(myLoc.getLatitude(), myLoc.getLongitude()); + } int[] colors = MapMarker.getColors(map); for (int i = 0; i < activeMapMarkers.size() && i < 2; i++) { MapMarker marker = activeMapMarkers.get(i); From ec612db57d01f4a41bc1e6787026bcde51b1edb1 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Wed, 8 Nov 2017 12:31:34 +0200 Subject: [PATCH 161/187] Show distance between finger and markers --- .../osmand/plus/views/MapMarkersLayer.java | 101 +++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java index 79ccc7610f..ae70b65bb1 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java @@ -10,9 +10,13 @@ import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; +import android.os.Handler; +import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; +import android.view.GestureDetector; +import android.view.MotionEvent; import net.osmand.Location; import net.osmand.data.LatLon; @@ -22,6 +26,7 @@ import net.osmand.data.RotatedTileBox; import net.osmand.plus.GPXUtilities.TrkSegment; import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper.MapMarker; +import net.osmand.plus.OsmAndConstants; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; @@ -42,6 +47,8 @@ import gnu.trove.list.array.TIntArrayList; public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvider, IContextMenuProviderSelection, ContextMenuLayer.IMoveObjectProvider { + private static final long USE_FINGER_LOCATION_DELAY = 1000; + private static final int MAP_REFRESH_MESSAGE = OsmAndConstants.UI_HANDLER_MAP_VIEW + 6; protected static final int DIST_TO_SHOW = 80; private static final int TEXT_SIZE = 12; private static final int VERTICAL_OFFSET = 10; @@ -81,6 +88,13 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi private TIntArrayList ty = new TIntArrayList(); private Path linePath = new Path(); + private LatLon fingerLocation; + private boolean hasMoved; + private boolean moving; + private boolean useFingerLocation; + private GestureDetector longTapDetector; + private Handler handler; + private ContextMenuLayer contextMenuLayer; private boolean inPlanRouteMode; @@ -193,7 +207,39 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi @Override public void initLayer(OsmandMapTileView view) { this.view = view; + handler = new Handler(); initUI(); + longTapDetector = new GestureDetector(view.getContext(), new GestureDetector.OnGestureListener() { + @Override + public boolean onDown(MotionEvent e) { + return false; + } + + @Override + public void onShowPress(MotionEvent e) { + + } + + @Override + public boolean onSingleTapUp(MotionEvent e) { + return false; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + return false; + } + + @Override + public void onLongPress(MotionEvent e) { + cancelFingerAction(); + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + return false; + } + }); } @Override @@ -276,8 +322,8 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi @Override public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode) { Location myLoc = map.getMyApplication().getLocationProvider().getLastStaleKnownLocation(); - widgetsFactory.updateInfo(myLoc == null - ? tileBox.getCenterLatLon() : new LatLon(myLoc.getLatitude(), myLoc.getLongitude()), tileBox.getZoom()); + widgetsFactory.updateInfo(useFingerLocation ? fingerLocation : (myLoc == null + ? tileBox.getCenterLatLon() : new LatLon(myLoc.getLatitude(), myLoc.getLongitude())), tileBox.getZoom()); OsmandSettings settings = map.getMyApplication().getSettings(); if (tileBox.getZoom() < 3 || !settings.USE_MAP_MARKERS.get()) { @@ -374,6 +420,57 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi public void destroyLayer() { } + @Override + public boolean onTouchEvent(MotionEvent event, RotatedTileBox tileBox) { + if (!longTapDetector.onTouchEvent(event)) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + float x = event.getX(); + float y = event.getY(); + fingerLocation = tileBox.getLatLonFromPixel(x, y); + hasMoved = false; + moving = true; + break; + + case MotionEvent.ACTION_MOVE: + if (!hasMoved) { + if (!handler.hasMessages(MAP_REFRESH_MESSAGE)) { + Message msg = Message.obtain(handler, new Runnable() { + @Override + public void run() { + handler.removeMessages(MAP_REFRESH_MESSAGE); + if (moving) { + if (!useFingerLocation) { + useFingerLocation = true; + map.refreshMap(); + } + } + } + }); + msg.what = MAP_REFRESH_MESSAGE; + handler.sendMessageDelayed(msg, USE_FINGER_LOCATION_DELAY); + } + hasMoved = true; + } + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + cancelFingerAction(); + break; + } + } + return super.onTouchEvent(event, tileBox); + } + + private void cancelFingerAction() { + handler.removeMessages(MAP_REFRESH_MESSAGE); + useFingerLocation = false; + moving = false; + fingerLocation = null; + map.refreshMap(); + } + @Override public boolean drawInScreenPixels() { return false; From 9bd03ec9e903fe82726a77ecdc3fe5eb2c5dc2e0 Mon Sep 17 00:00:00 2001 From: Alexander Sytnyk Date: Wed, 8 Nov 2017 13:25:08 +0200 Subject: [PATCH 162/187] Replace OnGestureListener with SimpleOnGestureListener --- .../osmand/plus/views/MapMarkersLayer.java | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java index ae70b65bb1..96b6b5a886 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapMarkersLayer.java @@ -209,36 +209,11 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi this.view = view; handler = new Handler(); initUI(); - longTapDetector = new GestureDetector(view.getContext(), new GestureDetector.OnGestureListener() { - @Override - public boolean onDown(MotionEvent e) { - return false; - } - - @Override - public void onShowPress(MotionEvent e) { - - } - - @Override - public boolean onSingleTapUp(MotionEvent e) { - return false; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - return false; - } - + longTapDetector = new GestureDetector(view.getContext(), new GestureDetector.SimpleOnGestureListener() { @Override public void onLongPress(MotionEvent e) { cancelFingerAction(); } - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - return false; - } }); } From b1b65509fd4cbb558967871d7afb84cb66a987f4 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Wed, 8 Nov 2017 11:36:22 +0000 Subject: [PATCH 163/187] Translated using Weblate (Esperanto) Currently translated at 100.0% (2473 of 2473 strings) --- OsmAnd/res/values-eo/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index d7a2b7b3c1..09d0e537d8 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -1501,7 +1501,7 @@ Proporcia memoro %4$s MB (limito de Android %5$s MB, Dalvik %6$s MB). Ĉesigi simuladon Ekigi simuladon - Ne povas renomi dosieron. + Ne povas alinomi dosieron. Dosiero kun sama nomo jam ekzistas. GPX-kurso Trovis kelkajn kategoriojn de interesejoj kiuj kongruas kun la serĉmendo: @@ -2855,4 +2855,5 @@ Indikas lokon: %1$s x %2$s" Plenekrana reĝimo Montri en supra breto Marki pasigitajn + Alinomi markon From f27e55903b9bf083d3b3f34b06961f552e71315a Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Wed, 8 Nov 2017 09:15:18 +0000 Subject: [PATCH 164/187] Translated using Weblate (French) Currently translated at 99.7% (2468 of 2473 strings) --- OsmAnd/res/values-fr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 4bc741e8b7..caac8965de 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -2992,4 +2992,5 @@ représentant la zone : %1$s x %2$s Mode plein écran Afficher dans la barre supérieure Marquer comme passé + Renommer la marque From 6654b8658868e0084b77352e937929999147dd87 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 8 Nov 2017 08:26:51 +0000 Subject: [PATCH 165/187] Translated using Weblate (Hebrew) Currently translated at 43.5% (1077 of 2473 strings) --- OsmAnd/res/values-he/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 76ec775e0f..1b7cfd424b 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -1474,4 +1474,6 @@ שינוי הערה ב־OSM מסלול הלוך וחזור תבנית נקודות הציון + שינוי שם סמן + נגיעה במפה מחליפה את תצוגת הכפתורים והווידג׳טים. From 03d3977f0392c67c09f3907433bf448942b9373b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D1=96=D0=B9=20=D0=94=D1=83=D0=B1?= =?UTF-8?q?=D0=B8=D0=BA?= Date: Wed, 8 Nov 2017 09:09:30 +0000 Subject: [PATCH 166/187] Translated using Weblate (Ukrainian) Currently translated at 94.4% (2336 of 2473 strings) --- OsmAnd/res/values-uk/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 6fa528cbd6..b13ce09b1e 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -883,9 +883,9 @@ Пункт призначення Висота Час в дорозі - Наст. поворот - Наст. поворот (мал.) - Другий наст. поворот + Наступний поворот + Наступний поворот (невеликий) + Другий наступний поворот Міні мапа маршрутів Блокування екрану Екран заблоковано @@ -2216,7 +2216,7 @@ Розбиття на кліпи Використовувати розбиття на кліпи Циклічно перезаписувати кліпи, коли недостатньо місця на сховищі. - Тривалість записаного кліпу не буде перевищувати вказаного значення + Верхня межа часу записаного кліпу. Обсяг пам’яті, який може бути зайнятий всіма кліпами. Стільниця або меню керування Оновлення From eed3f9ebbd933bcf83a39039b6b0729c6616c89e Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Wed, 8 Nov 2017 13:54:07 +0200 Subject: [PATCH 167/187] Add images for new Distance indication screen. --- .../img_help_markers_direction_arrows_day.webp | Bin 0 -> 3910 bytes .../img_help_markers_direction_arrows_night.webp | Bin 0 -> 3908 bytes .../img_help_markers_direction_device_day.webp | Bin 0 -> 3228 bytes .../img_help_markers_direction_device_night.webp | Bin 0 -> 3206 bytes ...g_help_markers_direction_guide_lines_day.webp | Bin 0 -> 3286 bytes ...help_markers_direction_guide_lines_night.webp | Bin 0 -> 3506 bytes .../img_help_markers_direction_topbar_1_day.webp | Bin 0 -> 1776 bytes ...mg_help_markers_direction_topbar_1_night.webp | Bin 0 -> 1738 bytes .../img_help_markers_direction_topbar_2_day.webp | Bin 0 -> 1422 bytes ...mg_help_markers_direction_topbar_2_night.webp | Bin 0 -> 1422 bytes .../img_help_markers_direction_widget_1_day.webp | Bin 0 -> 1702 bytes ...mg_help_markers_direction_widget_1_night.webp | Bin 0 -> 2032 bytes .../img_help_markers_direction_widget_2_day.webp | Bin 0 -> 1702 bytes ...mg_help_markers_direction_widget_2_night.webp | Bin 0 -> 2024 bytes .../img_help_markers_direction_arrows_day.webp | Bin 0 -> 2490 bytes .../img_help_markers_direction_arrows_night.webp | Bin 0 -> 2490 bytes .../img_help_markers_direction_device_day.webp | Bin 0 -> 2272 bytes .../img_help_markers_direction_device_night.webp | Bin 0 -> 2202 bytes ...g_help_markers_direction_guide_lines_day.webp | Bin 0 -> 2352 bytes ...help_markers_direction_guide_lines_night.webp | Bin 0 -> 2386 bytes .../img_help_markers_direction_topbar_1_day.webp | Bin 0 -> 1296 bytes ...mg_help_markers_direction_topbar_1_night.webp | Bin 0 -> 1266 bytes .../img_help_markers_direction_topbar_2_day.webp | Bin 0 -> 948 bytes ...mg_help_markers_direction_topbar_2_night.webp | Bin 0 -> 924 bytes .../img_help_markers_direction_widget_1_day.webp | Bin 0 -> 1032 bytes ...mg_help_markers_direction_widget_1_night.webp | Bin 0 -> 1210 bytes .../img_help_markers_direction_widget_2_day.webp | Bin 0 -> 1116 bytes ...mg_help_markers_direction_widget_2_night.webp | Bin 0 -> 1264 bytes .../img_help_markers_direction_arrows_day.webp | Bin 0 -> 5092 bytes .../img_help_markers_direction_arrows_night.webp | Bin 0 -> 5094 bytes .../img_help_markers_direction_device_day.webp | Bin 0 -> 4246 bytes .../img_help_markers_direction_device_night.webp | Bin 0 -> 4174 bytes ...g_help_markers_direction_guide_lines_day.webp | Bin 0 -> 4134 bytes ...help_markers_direction_guide_lines_night.webp | Bin 0 -> 4436 bytes .../img_help_markers_direction_topbar_1_day.webp | Bin 0 -> 2336 bytes ...mg_help_markers_direction_topbar_1_night.webp | Bin 0 -> 2274 bytes .../img_help_markers_direction_topbar_2_day.webp | Bin 0 -> 1810 bytes ...mg_help_markers_direction_topbar_2_night.webp | Bin 0 -> 1810 bytes .../img_help_markers_direction_widget_1_day.webp | Bin 0 -> 2316 bytes ...mg_help_markers_direction_widget_1_night.webp | Bin 0 -> 2668 bytes .../img_help_markers_direction_widget_2_day.webp | Bin 0 -> 2234 bytes ...mg_help_markers_direction_widget_2_night.webp | Bin 0 -> 2544 bytes .../img_help_markers_direction_arrows_day.webp | Bin 0 -> 7762 bytes .../img_help_markers_direction_arrows_night.webp | Bin 0 -> 7806 bytes .../img_help_markers_direction_device_day.webp | Bin 0 -> 6132 bytes .../img_help_markers_direction_device_night.webp | Bin 0 -> 6184 bytes ...g_help_markers_direction_guide_lines_day.webp | Bin 0 -> 6854 bytes ...help_markers_direction_guide_lines_night.webp | Bin 0 -> 7260 bytes .../img_help_markers_direction_topbar_1_day.webp | Bin 0 -> 3794 bytes ...mg_help_markers_direction_topbar_1_night.webp | Bin 0 -> 3750 bytes .../img_help_markers_direction_topbar_2_day.webp | Bin 0 -> 2824 bytes ...mg_help_markers_direction_topbar_2_night.webp | Bin 0 -> 2824 bytes .../img_help_markers_direction_widget_1_day.webp | Bin 0 -> 3650 bytes ...mg_help_markers_direction_widget_1_night.webp | Bin 0 -> 4144 bytes .../img_help_markers_direction_widget_2_day.webp | Bin 0 -> 3776 bytes ...mg_help_markers_direction_widget_2_night.webp | Bin 0 -> 4248 bytes 56 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_arrows_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_arrows_night.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_device_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_device_night.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_guide_lines_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_guide_lines_night.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_1_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_1_night.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_2_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_2_night.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_1_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_1_night.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_2_day.webp create mode 100644 OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_2_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_arrows_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_arrows_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_device_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_device_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_guide_lines_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_guide_lines_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_1_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_1_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_2_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_2_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_widget_1_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_widget_1_night.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_widget_2_day.webp create mode 100644 OsmAnd/res/drawable-mdpi/img_help_markers_direction_widget_2_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_arrows_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_arrows_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_device_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_device_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_guide_lines_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_guide_lines_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_1_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_1_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_2_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_2_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_1_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_1_night.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_2_day.webp create mode 100644 OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_2_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_arrows_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_arrows_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_device_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_device_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_guide_lines_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_guide_lines_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_1_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_1_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_2_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_2_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_1_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_1_night.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_2_day.webp create mode 100644 OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_2_night.webp diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_arrows_day.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_arrows_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..6f91ed7bfc152799b0e604032fd79740fdd51c4e GIT binary patch literal 3910 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 EFZ)!aM*si- literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_arrows_night.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_arrows_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..da4769e6657794095bff13cad158dfc2f5d933c0 GIT binary patch literal 3908 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_device_day.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_device_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..061768c87b00da31815c3634c8f5424a8c50a278 GIT binary patch literal 3228 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 Oy%|*zHnj1S0002y-Bu?6 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_device_night.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_device_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..882f5286df3d16bc0010b2d0334f9906059e3308 GIT binary patch literal 3206 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 V(Y1I-X;Qg1>Fd(B^}qfTe*+*npFjWr literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_1_night.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..7cb7f6a83b9a6596deac19438c84e941ed1b5db8 GIT binary patch literal 1738 zcmb_ddpOjI8vc!uaW~E=CKX2M#MZcF+=oe{(aEJP)=FBIIbw{J%hX^nYMr!Zg=iU? zXcC&-21TR9nnZ&PlUjGx&eCK^#$0~eKKnfT$2t4w`JV54-uM0f_@4Lu>pM=s<9jp! zAmlJEFgVcpD{TM(;Gc&8`J=u66?o*%X9YnzkY4erZmPWca438P)JpW%Ve7T^wI}W% zT&+Gaudi}Tt23l3-mHxnB5WZ(sw(g;Cz&io`vr#jZS|* z0&9|C7X(~#9{DKE){JwSd%7S4zy^Bk^PqbG*f{0EjKXfR(){2lMUfKmp}PZPZTBW3 zLQ$)@K88{4U4YudHVmFtMtL63(C+R_Qtv1JI(?V;5uC)5utI9tCS67BpowAf1fJ>= z$jLU|0qU?@qz#ICthHd^zsPRu@nWGQG=;8pW6}_LqeVFMJ+{i_+){Yx`dssY4IM+L zeS7-WVcYQW#Xb@3ydXyC)vY#9&8%#rh0N(^(8AXhlj-|i5uH~AaaLX_??XZovtSls zlT!TWxfVZ8q4^vT5U-Jlu=h{lL_{YIyH83vbtd zqa00fmfo!>$L&%SCaf~x!-KfLvHQOP{_mUJ0H6Zj_GSUj-Lo|`RWEjDI?IUal9s0A zF-Cisx>^U5!=c(SzGPhVN1jgG@J4?5TgFY-uF^f7Cey@Q??A^<&WeGmu<|~Eu4HO5 z(%Q|#~C85c~0(1`yub@cNo z=QKLZPycwrm(^WFnK{-xR#xoWm&Rpb(x$(o-CWW9n4N@3Cmpj;D=g>eXYGW(pGYiv z&a<%n&y~I<+C-fUkt6&_KaNb?)8*ju0G&EWxLOj;6OxKqLbyW3u1NqvzDZu`lUAsCva2T zn3OU1?WlHaa18C#12OyjQ*5m3C*O+?nO2oyzFXF|rR9!{BH)`m>@)NVl9kmpL+Po> zpJ+;>5T2+>N4kWi0@VveB=y4Wif~-d49T~CaQT$&IKWsF9rTU~KM|NHQ}`xl(eM(}v(7=3|T-BEUj^ zh0Fx}h6c8^2NV_AI&(X=rcQZ63Y*9QB5f9OkOH>S z@XT0vLu*bc-$i+}U+2o3VbSYpH49d;bM}>;SemA$V3V?jh`qOxaJgj2&|$Xg2fjvd z*EPpF@eBHmgwd9``xDE&A-bsfSyJORM~(CErq&C_=KvOpZrBZhz;Wd2~SJ-q?2QF?#2sr5IXIr5p6Z0&z{j9F4}rwgm1xM4{ds+|4%xr6vn<>? zC081jZA`I3AFwf#{^q>*eB6|e1>Ti9Bx^r;6{@H1Qtfl*x%KpRc(o9F06ID)Nt?~A zDB<&r2SQ|F|2XY`slc*M9_XL=?PhA-^FXSWTw>|qlKsfPg7&aHvk{tK8PNZ;u1!Y3 zMWfwf$z@#bQ_t7}(WDis_6%dr=E*0+YCc`ZhMY5AB9Zj37LMDSyh`_$p_!7z#o3q? z)SY;bRj=T!q7{~$8+fFB`CtZ@oS(NGxe|4f>o~Toe4BFW9J2YQDWjf4E0@=<{PU>g z&(8&sA~!3&%4UDsS)!9zPiEBmqICbf?Q%TK-cR%^m*Xd%JN)JPc}=53B8@HXgfBp^ uke7&(MDu;p5wCj!E&6qqn;iV0{FqC#^U`~VDFL%=L`b3D;^)`&SN#qktbLCF literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_2_day.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_2_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a2e43ad28dc88e355aafb0eafbe92a1d4f06410 GIT binary patch literal 1422 zcmbW1YdF&j9LN9LBOI5}N{GyoNXB?v%bhUSsg?qy;AwrVqkGH?ao`572vBhV`3d7BX-iqgx7?P;`|1;S+?ziEA&N?1618GUzGAh-o-e&5X)jh`C!6zW7Sgw3SNu+wixmAAGf* zuN4IS-V?!CvffbV`ge2<>Qk#76+iM4ddjK|9pqqVbne#K8xp4jFZjDwa}2As7soL)kgJ6T>*8m_eJp&QV!#4=+ca8M zZ+=H~rG>ICnK;RgZD%*1*ssSwu%qB(!eHX|{y4M-Rvkyy^*5Juf?+tmZ5hnPs zH7XIJ*-ZPAq`v=(?!pY1LTx#M&sqjsOO{dBRp`Tc@G0+DL?J=D-lo}bxFGvw!WfRm zKj_h~8DTvS%Uq{6t|iBf%d`n)I4T4;uIPNB?+N#T;1kl6#6cx|`So4!_k@UBPZcv_ zqe?^wkx~$S!{wuoUzQ3SXsyn9Y(~*Pyd-bg$({rZMnKqozkU8}-DS*YYhgu4+U!-;D8(sZ#j~U4}U3d18-tFqhYT+A(B0=8n zX&a-fJR(=ZKU3)5Ox+Y+Y1u25&C)h`h2l01d3lMKA|ABp-sWofn|h^QP8=)nsTV>g z4PNABC5>2|R3tWz9O)pNOT|_VS=5$GdTiRp@v^v?pMy2pf?)!yNeR<`$j;v^BtN!Q zbGpo7b3Y5BW~_tsYiDKi&RDyM literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_2_night.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_topbar_2_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a2e43ad28dc88e355aafb0eafbe92a1d4f06410 GIT binary patch literal 1422 zcmbW1YdF&j9LN9LBOI5}N{GyoNXB?v%bhUSsg?qy;AwrVqkGH?ao`572vBhV`3d7BX-iqgx7?P;`|1;S+?ziEA&N?1618GUzGAh-o-e&5X)jh`C!6zW7Sgw3SNu+wixmAAGf* zuN4IS-V?!CvffbV`ge2<>Qk#76+iM4ddjK|9pqqVbne#K8xp4jFZjDwa}2As7soL)kgJ6T>*8m_eJp&QV!#4=+ca8M zZ+=H~rG>ICnK;RgZD%*1*ssSwu%qB(!eHX|{y4M-Rvkyy^*5Juf?+tmZ5hnPs zH7XIJ*-ZPAq`v=(?!pY1LTx#M&sqjsOO{dBRp`Tc@G0+DL?J=D-lo}bxFGvw!WfRm zKj_h~8DTvS%Uq{6t|iBf%d`n)I4T4;uIPNB?+N#T;1kl6#6cx|`So4!_k@UBPZcv_ zqe?^wkx~$S!{wuoUzQ3SXsyn9Y(~*Pyd-bg$({rZMnKqozkU8}-DS*YYhgu4+U!-;D8(sZ#j~U4}U3d18-tFqhYT+A(B0=8n zX&a-fJR(=ZKU3)5Ox+Y+Y1u25&C)h`h2l01d3lMKA|ABp-sWofn|h^QP8=)nsTV>g z4PNABC5>2|R3tWz9O)pNOT|_VS=5$GdTiRp@v^v?pMy2pf?)!yNeR<`$j;v^BtN!Q zbGpo7b3Y5BW~_tsYiDKi&RDyM literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_1_day.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_1_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..37fa7602b23b98847c314a3ec242b3b214f08406 GIT binary patch literal 1702 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_2_day.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_2_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..1642529505c4a1940873a7403a40a5e9475bfc06 GIT binary patch literal 1702 zcmchX`#;kQ9LB#J*}~aGIm>k|aoAiIYK@G@m_k!HE{jfXCAUm+n-D_LN(!S0kzVFd zVwhVZ!*5-D~Eh^gO==^qmIX|2q&htE<*ZcVcp4W$LZE2Y&0RT?NkJ&rg!c*M>qeAEnraTT5v$PD7>)Ef z8={ST2a?e@H@$%HhEjpH?$|4_>JIc)%}yw;QiecSo^1oJ5(+`*Y~^gtxq>taoHk++ zd$mZexam6e+o~UNcb8c}_d5tjv$NcHn+iK()vqOsd+cqbP0HKkfe;}I0I1aSJ})s> z!gLunZgRpTxrhZM<|YEta!neBdRzl>y$r|S_!JBq(iEgnfD{8COn7f#5#wRl=00I+ z;cZP<^VIV?cd$6Q1GC-5{ZqiwsfGn<=Ve=%&J&sVCBz~C|1>5Q9G1jFQxE%L6V?M( zxeI_P8{Ob)teLP5*hR!@9BsPO;yt;_tkhL`bRb-v1|QQJD({adJ$G}M#4FQw8N+0v z&)8Jgor<7LhoaFJ|8yPh5KRAzMfnxmdqjf80f4CkFhE))5D8?0MWk31>`UGQmX!g; zxwyV`A0^gGASC)AAK!kz0zeiakF%I|bQRy_6?hA5i^jan3kw`ErqhW0oBe13akXN# z0!!PVtmyXP+6m<`=3B_%V--2Jcq5f37#*Bx+?}s+rNLQtb-eRq_(W3xsyoFR^9dLl*}BADjjNp=eWm z`y+t%@Z}n(ri>`&gf-(CMUqm=D~A6^=p&a7l_1{3Pc{YjT5{N3*E@Rz6VorY@1$1mfFNB=`36@tQ66U6E-pk&BK`pR2w6E|Qxi&bfLL^B4 zu;t=u>w(`dB^2>%2NxH6>#`%XB58Fpn6glEDMoK1G@foHuEb0tDEhV4R$?OIU7Ux$ zZ|v9YG*3s$TXIGVN8OfS>pH^V^rR}8K`CX1aAVNqWPkE2)_a>Gv>_T-!LOY*bxJ4h zex4UtP+dN3p~H`VxS89K^abX=Ty2^yF@NoO^>U|ADA-Ir#^%UphoU1ijo=mgxQuwv z)&UDwgk}G1d=-nO_(Je8mH0reRB2M2PLmY)tmcjIEc5QM#@iQlID;e)XTiMFOLT>d zg}Qb56%keOi<|%E@z5Ykt^gA2<+q=H#G!#;LhPBMH|oz$@zUERQ>LNp?sZCM2}iPh z92=;=+50_xHZ#0|2LJ&mRn=S+E($fH7}sKw&+=QXf3&7tFei9_Mr`4hVZ$8*yE!ZU zW%=r-8k5hkbJ5h-x!rUFQDM$-I3=DSB&fD#DOf&8;M9tT*K0C<8T=Whhl_fpU7xQ! zdqC^D5S;eVaY+A7^OL3ViXr^*HJ6RGu7zyHS$s-Ko59UJ9N!qT%d#I>sKG7QEZW}j zfeYG%LZWM{GOqPjxYc*}v(1e@%tJie08cI?YhxDGPdO9*?7k6KN=>wr@`shyQkKFX zBDrk$WvT<-S~ot{{A-Z&uCc@O*vaOeQus;1)#x{F%{|ppp#TPAM4m5V7B8>84>|F& JZ+mus>n{-KQ;Prq literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_2_night.webp b/OsmAnd/res/drawable-hdpi/img_help_markers_direction_widget_2_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..05ec307bc72cddc55da68debcdf3722db4119689 GIT binary patch literal 2024 zcmchX={p;U7KekX+KMi8u@0rR);4K1l|k*X#f+__ilMflwKhS-K4@&Ur$yDSqNPlU zrS?7cN`u&!v?@$A36YH6=YF|g?uYx~p7)&R_x=Ir9H^<0(Gm{;U~i~zZD)PUfe!!x z2%n58$B)*7Seqnp0stJyu3~>#)54L~u>K-SMp6<8U>2QcR9yV1kO_@OtwGv8>=F&_ zgL^de#PIff#gF_E#3odQz7chiSdQBP3OFXIXyE4FQ4hbd;f*?=@jsJTR?)m{q5pur zOITkBf{ll{_!i|JxHRJjp?BbVq@ZE(=2EePyUoMU=_{HrIwn-hlX>%A2IJ1u!B{|6 zZJlc0-9a+hZT?^S(%`UN+bMIhbt>5w9_D0fwre>Yw8bE9oZ(#?%f9@={K@7}>e(ME zL6W(Pbd>U3Iip}o<9?nQ{2)5(^-+w4JLFwUfpXoLg+fh@=J`cE_@Vdj%86WDpkR!G1!&;jsN>6Q2)+$-sPx6fr=x}&MK6%Vql9J zKqsm@6=ZDhQ(ax1%!Fn8{yLRiaN;pd_Kv+(9c4t5YCg>2eNUWOSGt$=9Ht~qULFnj z0kr60X7Ddp0wlP$oifjwxVx`hn7kFQWhwKltuJXOU#QQQRf5~JUi_r+VhY^{nou>j z@f{IT37SX4rfHblOX1t43O+l3zia=J>bQ89X0*)yZ?GABC;KU_#SH+|YXe?zD4KDY zapv&1tXSTE@czQ^uG{y}?6 zy@BJ{;#fzrNb_kl+f!U`k!0MCM8|=`HKjRZ7ON#niz&#AUE@lvpd$OzR;20}iQp0z zl>N&-fa$rx!0uq2K`PIcfSn-P;y1UiGo#b)EIve*Pf98!s;cT78Mrm4|8 zmcZ;|0r(PC_}HCmwD4y?LWAf35|45^x6r{J5W?IDdb%tV3X%R8ds=||ya<<=n?t;` z@awk@zP$&#_ShrCL0#;^>N25qAe|8&%5_@c(oNT&E|KJajloP*wUbsZY!9EyF|P&J zV{yz|fy>>AXT|?Nk-!81SnPes$!FmZ`oiwq%91B1ua)ZyB0>3H=I_7OS*5kh=xj`E z+HVoixgml!N-yg5{G+f>>t98lHgjE4ILb~=+BChR~*cMhvA9rb_P?^_N5W4$K z_LF2`($W3q_Zc)+s9C=(o9%O~s|KXY(r_H#0e*@v-)u0?3g1{C;Tv0&=-J>b^>`E5 z1h`-7;Wq1)LV2L*56o46#RT*GeKy@F{E6ky__!-W>pY6f5T4}?Ux@+bSl zo^JC8x*a*wj@;MFEvaJh)+M|^i4xz3I+hFS@Enxu>Tu4JU{P6!&9S0`GRP4 zEb;Usfx#Z4E_oigLTpOfmT;}6YeZ-Wqk`48ZXq3?F0Mnm$Q!>3cdAw1pO9lt-LHz8 z3lBK31m>>&6%m4;dq{SHZLdihipJ!6w=G2=QEHv)1COtQ=kKBEE-6Y%6ucaf+*=Ip zoIk_4O9z`2bB9o5VUNj^@>M$$NM?^e>Y8CPB_&eKxTxFU-QmSM)CNlQpOBEa@BldY zcs_}|ep!p~phip~*IR8lePN^Hh`ncw;lmT9FWHQAi$||SIAuh`m%*_Y6r!;(84Qb4r-6!cMOwMlsKp=Xmz& z{`}C`%+6}fcS@Ti!OJ$P?we#Rs-toSYg6sHPb_qr^%Vrdn`mwNAuf#89U6XZrr@~< zCpxsiE?avWPr`G(dfN}(Pp|x{g!teETt7=`%)=cTa>O{M576wBij& zK|Rn?`IzVE$F20Q$|5pY?k#6i_3q#ET>0lF;F3U;fl8@vx#N2*NF;^DN%RI?00zBG z!+uR!zuuJ;cHB}}TTn0uYwS`S=M7ZG8}K-I$2Kr6$(b~v{VxgMM|>}w*PV`Y`x@|3 zONJpuN+vh)NR^gfbQ*2Q6MLTX&79LyU^eeeNIcT5-aR(o&2&X>XrrP_)Gsv5Ki#LL P(Npj92d$HH`*-~VRG%ES literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_arrows_day.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_arrows_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf4110347b60663af15c510759a7b6d95a28855b GIT binary patch literal 2490 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 E09t+KQ2+n{ literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_arrows_night.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_arrows_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..3bbc542e8fac22ddaf25e37e77834de6d7297f3f GIT binary patch literal 2490 zcmV;r2}Sl&Nk&Gp2><|BMM6+kP&il$0000G0002n007$n06|PpNXP^L01X$!Ad(~} z^pFvUe?i$nMC9Oi9!CU8so8NJ+Zee_{w43Qc5U0Sz0tm3vF*A+ZFfAiZQC|;?|=Py z^S)2M+~av8`ac1z|9}1e>;GT>|N8&e|Nmd{T|@s!2nh%TA^oEui3tG)g#9BRq{+Es zG5!IR6fgmSD3Wa6326x0$RM(adFnYjf076wHfRI^69hCj1Of>JIvIDfdXUKEq{9Dy;%JC=Z(imninQGrU8&lV+yh*nBkZlXnOLtOP>37J1f8c-o-&U zFA%iR*!YKW->;LC1+ipJMYi93>o;$n<=j7w7cT~qoDpV<4E}O(`syAgqRf^diQ>g~ zT>H!ytoqFlPHl!{W(o_k`Hw%23-14w79f^uBks6sdgWJE-#0H@Zj8VgVK!jlrl$wq z@WcX4W@|HqapUzLvE~nd*n2o>K+XqDWPrDS0+(L$a4-=WOTYD<4Qu=8oin2bDa{EG z99{Z5aCF<2H=TlDNy&8o_j@nC#MOPb?WI#`N-`S_%|YY#*8mP({m3L!7Ph8@@}&nl zx%22{V>NHTcC`WsGXjATy7ScU3n%x!`CZ`z#M(2Uo_*--nFD)HZaT;G<8xmLIqf^1DhP7rTC`q{Nd_MTkn-LEd%GXMdZkAjJeKYz0Vm!G+JA|Qx0 zCQw$;r;mU7x4oNI`1Fl4V^Tz#4Q4XZu6b$uO1pl#=6Q?AY;_P&L^k>UCr3{%e7XDe z%h5(6^U*}4aq9=1^Tef(PZE)_%nAz6`uNrR2JrUNrw1m3<^+N;I=s7cU9jW(Pn{r$ zwPpYnk<(|N?L7&<{r2=_-~h1MU?RvgZhMh)yZ7qHra=(d>c}9dgnIPK!}8{*mv0jo z3(QA@5whi`Usl28$DjO}Z~|kkSrSpnTfgtTgwI~O7=|D=BM?Bi;RRN^*=wHy0%Gl9 z5Jka5Colf!m$N4j2FRQ=!Ql4KSH&e4Jj#mM+91d%sAt);@$F-%pgAWn!%qIp>JM$* z`i5l2ax)@|9{m38!v|3YVDrI1aN>^F*T9j}4`oi6tE;z=?tM56B$$5;$iN#dF<_0ls`}v30zy0l_S1!5cDqeo- z-78LP+I?!r)}ID)9y1`zGy$2H8BBin_Y>c}u=Uc*b|?AW(@*?-&909Q>}r6yEHWTT zfRyG188kh5|FPpoEW@LoDCqTMyqgAK>*Lw%xxjU$Q2SpT#)&m1Q5jP1p%b_Mp7oRR>_o@^9d2l z6d~q)EJ|yT_{TBU8teaG|NpwY0aj2rAjAX!0PrdRodGJ`0NemRF&K(OA|Z$_0#FbE zf?8X+U93jMmZ5Jm{2=^pDx9E87_|7ha|?hjCZ-Hdz4bip1&yBPP7>4H3mb}{cE(*$`A>|@?T zrU>#K*vF&0x(%sVX_cz25e0DgY2{f}$J$`{?om#C;#`K&Hkq z4v+S<0k{##OL2RLSEF|R$dJ&mS|c{iXN^SEtS648t)iSXOxrW)O#U#%{hNilaOr|P zhjuaVA=3nT4(wyzL#7C@0092~@=O2#01yBFRR_Nx@OS6u+>#%9#y>~YzPI(pfB(04 zrW8^>N%E&w*vmMa95s+pB{g=~Z~ykN(#{wE{5PGhL+_1)|5Ly5o$l$)=nX2g0L?-F z45bbZ87oK|n+3+fnfZA>M|{9CfBx?emE-;7opAZ_=T`itSot$Zj{lR&yDkn+FdJc8 z>>*hMRqc%ih~KIf+>G0~Aes_!v6?BRBJInHDZJ7+?mL#BYxce=?Or~Z8n|0*2qfBf zAA97o%RKyH9vwnEGVFJ0sXee$ zPQ5+<5e~)k75doMbLBbxh+RMY((mSb-~Z`B#w_-W{^EEwNj@NH7CautZj@ic?yb!O z3rN0k5apdh)kY6dhxHFyR}B!$qy664{9u2jr5v^225X@DTc0oq)WM57nb63zmsyI| zt}Xh@L++0thgckYsCu+a>R%f#z2^`0nj^rBAz~D_PH!^Mc&sm+pd^T4%*k?*yd>{Nl%)kIupleFru!%Wotvm%F)YASK ze~fX)9Q2%=*55P|DL?rzR}qcFBFce;fX9&j?yo-%F8*gxSEuUJ{-;S!N%3=>N(-~W zrzId=0>lV`q~&p*fkv?rf%R(AXQ4Xnlzr_oX}X?9kYr zSt~jz_F@rojKBJ6x@|1#u`t~9ZJHqG#eI*SmXen#0Ue5=H}@0F9@XhMxx#bg2ufJK zk=kvHryp?7<}f)v(Esn;Q}auv^P$Q9xW9K+G;(8Q`_Qf+bu;oO$x`_E1!#0(fB*mh E0C-#LX8-^I literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_device_day.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_device_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..5d10e9d95f847025466b413e7a9392962592a4d8 GIT binary patch literal 2272 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_device_night.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_device_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..86f64c4ccf1402140a5a7db64f2257be2c0079eb GIT binary patch literal 2202 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_1_day.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_1_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..50333681435937a42b3a8aa561c21ac0acb33f47 GIT binary patch literal 1296 zcmV+r1@HP&Nk&Ep1pok7MM6+kP&il$0000G0002n007$n06|PpNTdJ&009|AZQDS~ zyXB9#-N7KD{}VtJpk#jGFp^|dnZ2J2`N#K##r599xrhmv0HXe1|9>>CDAbns+c&`&BBkPBhADjAr{lETS|F8eo|Lgzn zkycPRAU*^D0PrLLodGJ`0NemRF&K+PA|as?8JtKU0|c|TaJilS0WH8F_vA$WOYH;S zANUVr-XI+$e87IYeyaQD^nia){&VW%>H+8hioH^^RtY!Vts{n!8LvOVTK0{g4Y&^fW4IY@H zN#4mU#Zq4>DORlhjE#WR)$pJk%VHgd)ZVZtw0Fw0b#OKPdCfIxJ`64vwj8J;V3TmD z6`*g-O4z4v?}Xar|LxKj{a;`0Kl1w6hxqJho>3cetP0SVEvnXz)8PT+qi)?$|2YL)Rh=d;d}=U3~pT7i0Vb9#i#S z_`T`9vjmEjm$tX{6mVH|Wank663iRH{)e44rC?@|59r%Jr&xGxo45aA^c!nugZ{6f z`TjlAup>f|4zA)2qCrcc<%K7SZSL+pUc6I&M(oW=R^bM6BH2-3B-C=id2G{Yyy34{gqzc%w>(rv^XQW{5?D_`3$2{7Sk4ij>`0>tN#iO!`REMJBvx zalH$OpZQiL+J*kF$!d@1V>)p#;vr+;4<~yk8k6+5>h}&hNdX~c{E~u-=yS`T9IHWBr93##Oh3kH0bo!zja#lKC$Fz zMSG&TEoSGQ9S$&@kdgsbDb@$C{KQ^J1_Pg;<|FXFSO&)as00000 G0000p_KbA^ literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_1_night.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..1d00ce4401569ae60b490c3b27a6137bb650c1e2 GIT binary patch literal 1266 zcmV>CDAbns+c&`&BBkPBhADjAr{lETS|F8eo|Lgzn z|5i{qARq()0MH@;odGJ`0NemRF&K+PA|as?82m^e0|c|TaJit3i!E%l$+Y7~|DgLo z`Mv#vn0uuMm=D*lT#k?r?0?8Qz(0U`fO&6wCw|5L$NNNT&h-Pd&+FfXbD$Lmf4cro z_?hF}!LRMR<4^ogFn>k=(e+&aIr*#Im{9rOpKxB_y}^5e_XX|wN(q&6-G0cYG?ztI z&wZDrt`>_gwFL*Dz(C#F=*_A61RFO*du?V^i~|m<!w3_0WHx(Y_de zH$LG474la9^th&lI*rL|Cn~*zzL)wwohM1sbe$(d`f}hr@6Wg|a9-fO!Fz)D1?~&n z7q~BQUf{jKdxG}`?hD)(xG!*C;Jv|ng7*dP3)~mDFK}J}0RI2cBLP?aW&imqCj8OP z>F3V){#mQ|r4HIBz5ZNrP7v=A^{jHC@C!tE8E1C>3Uf_(HOmu39Bu%D$NQu?m+(#3 z-OMK9nqc_9p3O&3@AxpaeI3np8Ov_In;%b6xW3iM_=~Ne=5;&#^%37ZYRNua=PPl z`*S&;SXBIuIYF|iWJs;Z%W$(9U(kSf+4}yu7-9u)|Qr}%s>9e z)SEKe^wFgb>8!~E&!iuni1=yjg&d%6v615T?p7o9c!{?l(->qa`PBy_)w59HJGjt0 z`_o=I{oEl$*U7<(t^CacaFE2lu zMN5x0lY0%Px;M1& literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_2_day.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_topbar_2_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..85d5d5c5b343b46fa053110db4d1181a77d550c0 GIT binary patch literal 948 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_help_markers_direction_widget_1_night.webp b/OsmAnd/res/drawable-mdpi/img_help_markers_direction_widget_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..105d5fff770fe257ecd9d2494c081d748c61556b GIT binary patch literal 1210 zcma)+eK^wz0LOo0TIjYyr4z{|TCzveFxgwmke4fGV^@@FI$5r(PBng$vLz*o(6bzd zlBdagg<4$KMeoJKIAUAM+HXwQ%Z8R3!P z-fRm102a?z{x$UN;mi{#06-zKnnd{%Sx>XW@MrCY7pN&Y;GK#Wf%*F|s`a2L6cAPM(gw%gTLFo@#h^zOI8 z0i$2!)>e}Zb$`ZKJ@?w2Q+h><_X)C)=HNIERJUPnuKmiMpZUIMLFns=0%%)_b;uL( z_iAz2McozU&t*E2%iQh6Aa zc$%BG&zz)H-`dU{DF~ur0y?eZX3KO@Zc)LAV1TYMaovr-zU!Mil!%A$B4WGH`7sA; z6WwD{o>Y5wgc4eTc3(;gxOolL=WG>nG~v#V*6G)5a^g#S{p-$EIF6lE#+bGqRb;O7 zd~?n#K4i_w84E@*3aKQW~j#j1spmhMmD11NA4^TX8MgC5!MaOIxqfSS2ns=p% zFhdJo6tTLz86lXb=zCIj_cyTJwNHo%_L`L2? z(Fmx%g@4hbYL^?E4AV;16i!5V2Riy4nZv+#{e+n&9YI}O2=?Ar!MU?o_>#%_HN-(T z3dxfHY_&o1FJe0vW4oWYQI`aaTk)VOL$Qc8K=rjyTX5scVC`(p~cq$ zo8$5Mji+$T{zDs^e`uM$Xv-HS_x~XT05I~QL*T=&&(M*Sm%}C9V+V_?%~1hL$lz5` zQ=x7Z;_8~0K$jlab+mr@V|JH#s|)g+U)%`p=H7d;V$qaA0DjOKKYGkL`X#jtjNx>j zxY`D=W2l{_&}1M+^m8AnVr>E(i-lH|Eq$=RX~8q?>;O1;QK~}^MhFd0sI=)6GIA3r zqmTLaCcVTor zZ@4Re$?XFzy)I|6l`PBA8;Q%grx;byG7XmvvTh$Ap_XZEn;4Q4R(^6jsaI3n!C)s9 zb9DIr^zc+w=((W|hJEhQSC9oASKowC5>Obdc4I;PO!E{D`z^(z&b?fBSWosQ8?O}QWoBo}ldNmyS&z0~O^0~= z;Kq&o!py7YSa}#qaCTw?97RBc5Yq7;d8CO%koHlAG7*IDq=Fw+tB`KOi#al;C06&y TQxQ8cU4=o8>k%E-XLc>STpBo+7G_-`G;4a_z_ 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_device_night.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_device_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..e22e29fa169c72291d0d13df33b0fe44a79120e2 GIT binary patch literal 4174 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 Y&9K!##=s_|`!-IoFsd-Bk?Vgz0Nf_{!2kdN literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_guide_lines_day.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_guide_lines_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..5d27f7cff75d3df3cf7ce57a9e63cd75f8f66baa GIT binary patch literal 4134 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_guide_lines_night.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_guide_lines_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..867cf61b26e9d76935d28f84f862e8344d995efe GIT binary patch literal 4436 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 ChoH>> literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_1_day.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_1_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..b77eb7335eab92e94be56fed2ab8fd5d409a08dc GIT binary patch literal 2336 zcmds(c{J3G8pnTQ-h^ZZk!>*MM%NgPl%;pPV@k+6vQ3sGOYtTmTb7|@&s5$ljSR9x zB9vv6B_w3ccx9)EjJ462X=Z-6d(OS*-uvIZ|K8_(KHqbmf1dOF`8|8a)KpFs0Gv;s zBsvidNMZm0z<=5R`8xzFqIuEJ4I=+CU=nNY^aV_cnnrQ)kWq11s*%$IfiEE(fHIsw zv3NBMpCJCMq%;Ohp!E4NK>Ab5_t z`PPZG?58?co9}#EmXXQJQUuxL{~GYS@Xy~>i6Q{7=>$B2Xf{F`A;0O!rJ1N93*qLk zOjM!2yl4n&CQ+7WHx+tfQQN5Gw^9S)p9eQ+Su{orpIpXQ-F4+Sk3(6jtcI%U92kQ( zPKi`usytU-lvEv{HSz9#V(Vsuz^e~hRX zEDHW2`?{og)uf^4iv9uj~XJrP| z43oFe%9d8L^xdTJV%cn4YL(u#S$P*QT11y;u@jf1pQ|c9zmj?`=io(D*T#j~K$_B? zd|31NNBG?R0PS2O)fe>W>1%xr<0O~3lD?$l^L@-IaT;lr!Ic;tX}|vGiJ_B+0eFIg z{v7)w+QD#4-ov7l*MWVnEB>!&S2fe!2I{kI3-$hwJzf9^z|Gz^0PrUNh@C5Q@AgqR z2IUSR0_zS6bvH)b!BO`+KrMl@7mn1`rlN+YCJMQAGlY$B;Z_3;JCwdebgb)h+=KdN z$z3fqsP%)r1H;u$Pz0^FTIYBZ@dOhUYx47^T4lC>sKD$;c5)rJW^|ai!i2msw03dS zl+&AZjftS@Xb#`q+D0(O0(eVsUR%8gLO%2{8g`@|9jr`uds=JfXHT5}wBdcJyGqG@ z{Wr(fGCvA|27SAwRTOfJOOm!(;Ogehn`BSB$80;uB?`Vun}&0IeFGE3L$F`Audl1b z-U%I%yyK?*P?O{Hp#O{=E6H>lCTQy8NC)*`6=Z1q^xR`eXONTb@y@_E%bC{k8bXxp zVDA;N6#gXU(*T6sOU~u2)q_iMHk{p?r)VjUEkW=`lXS<>v-9{B zq3B>jah}m4L&DO|VtA2;&mXr)kqBfh&^_LNOiSK4l(oNuWNwrZl)vz718p#MDHyd} zq@RH>;+ae$yAm;myqH?4!Jhqo{`-l<3;}=<=jZ4T6bwZx$ERi@?llT^2TfR%CT-eu zQ@kf;6`$Y2KLl3F(_VkNbg@>nX6h=nR5{SXq&lp+X|Aop_9~Mus^v87Uuvn5>g}R9 zjTJ!%jk*mtTRXLSy3Gh&wamhlgzH*6%sMw^4en{|xeT8vnNjTTxnc5kkcXq%QsZp{ z;{-Cn+i&hoK5173tVDZ{9p3d$n>9c=JM>xHis4PNyYACYZ z5WUu#C5@$Y3g(5Ek0rD8sc= zn7}PYrt zFFW}WwItSqibQ4@nvdDR-OppGFBmYGUu5^)oi3F!iZw*alfSd&q^yu@yxaN71@pF? zv5Kl*46FpH`Pl@GA=(!OyKgv(c03#q-1R&=^i?Dd~vA) zCc0yv^Je5CJ>+v3c1)Ii+{f%@p6)I^t#U!V_&Xk#aPf2`k!?qj*q6{YcVJTabcy4H z4WF4RsA$uMBfY}xRR5B7oN@8Ug2H%x24(L^O)nauX>RA~Q$u$9p* zbgodo|KS_|+rPYYSCFslW#Q6w=2W^L*2f!b!T5`xEi&i#IlaLQbZUvMkhKq+wqWhL zUcQEC+)6zXYJ4*=JyQJ8LZxFyUAY2X$uze@rRp90%2?8$W_W8bvJV6)D*WD8t;hT| kLmTFYM8`wPc|PrszTHS;Kt%@8lt)>zAo=_(JO43%1IGKEVgLXD literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_1_night.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_topbar_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..8b3d547e2693f0017b59941903fec563406ba0b3 GIT binary patch literal 2274 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 A^8f$< literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_1_night.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..69944ce7440aae4ff7ca29e3b210fa90304a290b GIT binary patch literal 2668 zcmds1Yd8~%AKqALszaBPQCJcxa+by1bH9z)0Kn76($&Ki z;q_w$$p4ro;NP-9y4t%-0{}pF$uH!P*ZrHl=0TCEsoJ+5dV;LGLBHf^-P7vm{ZQ|& z`H7jwBSfIjYp?*ae+d~^vWWP66UusOQwZDA+-kVT6ZZ~& zOvYx!$4RKaMnA|58A{ouLY3>4nOAvDg=e7x-c|W7ebHIh*yctvPf$?`o8&u4RW&2k z%+A{(@7)Lqd$FCn!wnH};+x#lUSWxdv4@-I{1-SGEu1XE3v(Ieuo)UQYBIoq0N3E`A~9gY{DFDEG^*8LHTkZ=U#Av{y77I zQ~}WKh+W4xEqB@`Kb#GR#5ca^Sz<92t=NZ1u#39;jm*%7wAW|DSUG*2vD4cYJ&*%M zvwvR21aOlv5dFvFyYkQJ!K>L2y(StW@NTxk8_e7)pI;x7c6u>gKogHhPH^txdyu=| zCIviA7*Fhi?kZ>5J`O%<5qli+@Q>aC=Iqs@XnLZs^Xijmn3Dm?@l%N7^Ac9hieNqp zHX~X5SCn`v{zw~iVdsyuod*;GPtt%ipcxGEyLHLYRAni7d0>*y#TM?K2|b3de^Wfv zQEMs!>Y^vH*Z^{+f0N0PBy*A=@dE3lhmxdM{(4y;G7!JT5t~oxZLoGM7jy*}g@0 ziYpR`g+{pf;R=_3WAtY?bfOQ|Ke?iu7W2<3hV+9NP`@d7pd{k^9^aV-9`iBwvrWSQ zfi|=de~A+M&p$Qpt>`3YAhJem;dF5G>E1^3Z(m%;Nz=HjtiVK>WOVAq{$X&9cQ&%% zPTC=Dua`l&GV;lK6nM3)Wc*n}{e}0*?l82~^sFxl_6Wy%lA(djJrmOV|8G_RfLOAE z{89OU>qnYS8${+^hwj|@DQ$EDh8@-CPiuG8KVF>dM3^vIV5oB^-U+HbTu>#vGY{7) zbn!Pgz^_J=_!jE=m0hlDdxe~miSpL24q$^q{pjzbN2N^~DsSiI{N>;g zZ{D1#ME6*5V3G~yu&FCa>@+@v^v6+zl}Y#07PGiFu7~k44#P<+bB*{;2YF=KeAia& zfc=Mo^Ty15$>PY7E`p~~Gr^U=B~kd0dn&f-Qh`|0tBg_k+^N7au=F%K;MDDz+Rj50 zrCh}o%}hU>LCp@CJ*w)bYM&dsjEpFu@WpkAl(-llF)vJ(Z}3dxSdT}fD(tJimKFM3 zLrBDY(w_#&-kBRAp`QlHI_uk$nU&11tQ(t+lkeayP|zdFy6(N4#I=*)t{tJRnzGx> zl8LZk6|aI@PYUk0y;ojlr_=-uf})Yh7dB$sTDPnsSLhI&;%kp;$R~=lxKY&npxqXB0>UdFMyt zu+ILnYpPLI{nLyNctyzU=Z}rw&WvnEU31Mm3ku zLlwK?^7yCoIy}=c0~~&M@ADB4Vi6+7?kLz!H=S9k9u@+td7PYZ2kk>hLOj{!UUN6- zON%(KMWrjQ%sgq`Tj<%GE}CD%jSLMWxU@60Jq;Eh@bU7+v-qd;mn!!k02_X=tPr@+ z#wzk|H56aMcQ27Gg$I7Iv~63%t?});98BcET_Qsn9{_%e2hgf&V}-Fq^}wh zgrIDmDk!`ET8Y2#=d10D-zgP~?Z@i+iVgvI{x)ZPn7Om26W*BM3~=i#xl~*qG2o#i zak13_A*`GkUJxC!;h4Z_7$%xZS4LFA)PA1cF;sp7OdG}sI24H_fo^#_O%PP~&TFsZ zk+5OD0g6EK^;ZeZDxP1F0iiaEqrm@LdQ$0yO!R6O*LNo`HZatq;HPlFV^?3kGsB+u%RYA z$h1uDK$MhB87cqCaD^!`W(6xQepw)MV-?k63RUF0&i^)Q{N Sy_(v3xD7zM{&%PRH~s^+c3p1( literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_2_day.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_2_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..715540511feb9e597b4ab43bb7cf8319d54ad372 GIT binary patch literal 2234 zcmdUvc{JOJ7RP@PyAo5i)YyvFUQ4QqSX)G>rH60^Nv3n&Iq$sp&ii-%n0xO1e$V&*{kivotFv>9H~{!L zIeH7}ZpC6(ZEv|_N=Z}mr-?M1R{K>k zwho`-s4G#UgBbn&q5fq3m2ATOf6OGz46KM?c1vpJoW`WX+Qo}B7O>t9nI`(X0{l&L zCumCSZh1D}vqz3g=gspk3)%!Tf>pr|{y(Dh05*51Zd?mx$1-v$h**8rq?Sc${{h3^ z%YFO#yL$2+E!%5LYK*ejlZyieieU;`w#g1rmW#P2PZc)K-@OIjEvR^sL>(uFC0`9> zNULD`KRAG+t!s9adx8NCJP(IGO;j}7%uMLi)0)xAUq&DOTpe&{m{BdtF$V3UpV zJRJcJgc2uSs89iqjQBjg#{7A>M0O!vc3~AVf4=p&eNvrvkwhWVYF1IB>&-hikc?_O z_DxUl!7bAs&pdB>5&g=E9Fg|oCHsGpB@s(iK4xNn>T9sND*5hy7#*iYe5KMZTMBkq4;E;v3N`3Y1 z8(%0yMCbvp5z~qbO*@_3*te|pa~a(&2$2lG4}g9x5L^36Dr3j{x8%jB_DT7z(l%0_ z-au{X<^|{0kG2*Qs6su?mr#yDT}8?gKtm$;5oxp%Mwb$8Q&p&o=go~cF|qiZ}||y^X$tnhcW$%p;4xbUreBi8=N7H>!sPF!6Kx+?dBpfa z@QJ&>X5E&;%VU;q;Th@+>Md$L-&5?W`N#RbNjEm=3-j-u-NI9Fp_c{(gdNuUHJ;Ax z`7-=(+)RNIzkq-F3$zo@acOQ_Syztns&>qhJfiy-n*`|PG(E%Up8dY`?^v}as3xpI zx9H3Un^B+!OLaim?LC!$0Gybrgs}|$q@`u z&0(){75>&{kO=SvYeL_?^tX!Vv-bw|Ew~dNGf$;eQjkpi(xI3KvvXuS1!ug+*D>}% z$oyW=#p{@lS#@jQR*W=ew&1)>OIWy0VXBXQnxY-e?P4alCn~&e(o)1AHRv+@DCl~mHWl8H;T;O?6ot9K(8ScrZFV88 zEh%-z3KRXPS&Bo6M=|!7jq`t*(>`*RJeZ}*s@SpvHQkq0X2Z~Z(q$i$J{v`Mm z(QQ3aRNd!CAel8VkGhbuOD4>RN-pEz$Q>!99>L(??}JyzWm?7iG`E1Tx#XOgPpiC<_8?&-u6 zV)?CvJ{)z>x2JN%4m{cqMs4xNwglzCuEnA{k6spq zT6N54qy%zAJA<6Rt90r8_~2XsOU-p#qfx<)IS0MVtUp_^c>=B#5>x+UzS)aWgK_z_ zge=x2In|xV<2@SQ5Vwib!0{Kt2-^95h^T{D87$c8LMzOMy6`Na>3v_&=N(@u4klow z?6v!?7sztNI?EC!;`7oukLFGV^I(}c) z*)?Aa3Kdf=@ecm-h?o+eq5`IchgkF)_wvt5TUz>>2H3p19o(~bz0JoPT?t2z1j%92 z{5QNF@e!s^!!u)55XF(O`{4Rkw<_uDHe3+bl&qd`598d`-@!nWNf)hEqo;|9=%aBR mE$=JK?ReUqP`jr$M=#^*=XrFZ?_-V;^5R3y@qh9DZ~X)IPC1hR literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_2_night.webp b/OsmAnd/res/drawable-xhdpi/img_help_markers_direction_widget_2_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..f75c9756cb71858d784f9a40bf9c62acd0a1ff33 GIT binary patch literal 2544 zcmdUvS2WxW8pdZtSwk2hA`!+Q61_z4br?h!6NwTnYSc8Mi?GC4AwvkFX7n!6Ei!rw z!$;KU!YDI>DgVv4=j_?5z1eg2V$buu&+qoVc%Rn_i9l>IgFto$x)ygWlu-~62n78- z&EP++V`^b!egOmmHy6mHx%Cg94`@A%Nl1`T_o5snCSb>9IE?hbW+J7ao)JM$Dr{gmteymG0{>wX7?+>PGLV@DR^_U>()ky68KRl9aGunB-!h6em+ z@qb-eJd?aVuJLMf*l4pM&`^PMQHSiQ#OjgnqxyRHgR`P)33N_P=W;!hp$=4HWJDJi z!q%!&hD=b4eEyaHeYnu1n*W|6MS@i9&=Wm+xRkRZaVSxoo zh@$k>&@Wyw;qi{sBa~h4*h&P0fCitrkjpS4dx8m*tXWP++*`ow`$rY|_$fW~^zf_h z8K1JxrZcpSBF?in9(rpxrx(dFr0K?L2)vkD)~NAHz85j=TZJeso!IdX3B6X?qO^^{ zqd45sjyh~aQcb82tQfycjorAXEV~hvC_VE%n<#osDE`6D-wWN4#St+X`vXPl@C@V6 zvO}haEgQ>363#Np2DA`uS{Ie>S}bK@6qT6&$j{~Yd)lmeGqXP1{?L4Y4ePykbWihz z)>DzcLh2;I#u)*wW^fDy87d(x`ubfk`Gi({wSM%VNczcgEYZ^>gD?L6HoqAn{Uo;N zsOPnn@x$p_jqBNmORTLJ3GJ%xe2`7gi2a=h~6`A?~wYZs!9Xha&oZ-hdhDp9PABj zPE$W*S6gIDxci_pyRyBcP}aZ&<&J?X_!+xlSi9h%GZm%}4)fxe+RpcRE)yJ-7(p|^cBe1CC# zS#vN#I})@f)O3LqJH@mUSrEC)GUwaIm2zXZAivu+wCu2q1Nw*}+MzK635Fe7-QAL^fY1d?FmN=@7Q^HYjJE5tKYY zp|Y4$ZIr{9rUicCr?lq%l%`%aXdASL3OkSAsOs`>X8_U6&^enlBi(nx`fH zwIF;58F+>g;6Gr#tZ{{T zi}?%RXXgeiHL~MABA02}bf_BO)SKl<+I)DFDA*ac1PJCE_8zwNdyxn~a^Szfx_v-# z?rIoyF(|0#%)R-HGrItwHx!=Fe@~q!tu;ihC3iM@-$v9BC7ReSR^yXV;hBavfn>4v z6<(-{w`X!EjL|GOIB~9jeoi=5@&H1izuGzL5nd5$-BoFsFP}#%=dZ&$J>o<;5jIW$~4YrsI7|Rwt4#=gJDROW%gaZ02vqA!e<+?+4SZ zG(gy$^*Y_Nwm`hhf8%m&;Er@{oz8(q*X*#yo~tD1>ff|DZ-gE>2Tl)S@hKS)@!J?n zJ(aO9P*Q?X8rq}+?MuIpKYOgJnieErOcrF;(N) z$)~E_8(e-w)YQknw4=8I+b@*zs*5o`Wjd_lkC0}9fcs+i-1v6SyI(*{NDj6)21 zk3U^I65%vi$Y~TEX0ca078uV}h)9fho%askK>SsG+ALjuKi}j7#7mhR>>Pm?lOg=L zsPDUs3)>LhfE&E(UvsGE5_k1(Tff793m@`&3qdXCQ%-4VH5?bGWjC;?20#H82YcLg zwR1Sc8jKF~_O5%*nMr=ZCy$o&(D=zt!TINjEcehjU~ghhvu624Vp{QGo&T)+zvCYu Cc002D<`9)UC;4IO$A%_rmV4w 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_arrows_night.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_arrows_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..afdc87c74812c4115543ff103d4ebe6b69052506 GIT binary patch literal 7806 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 K2=c$3HU14zm&(2X literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_device_day.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_device_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..bfb46c54c1eff7936d58c5d2b93219a0da39dbcd GIT binary patch literal 6132 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 Y`}BjDSW5WLZgfX5wJ)j8_22$~0Q)nM(EtDd literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_device_night.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_device_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..d3eba8dea2c8f2149fe36fa9a9a36c667851c791 GIT binary patch literal 6184 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 aNLVw$p*M!yOrL4nPH&p(eo|-xfPVv!(Ah8m literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_guide_lines_day.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_guide_lines_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..d167c05f8262b38e22c0c8a67f98c0991afc9a6e GIT binary patch literal 6854 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 G=lowspa{VL literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_guide_lines_night.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_guide_lines_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..62eab83f70d68679acbf23138ca7e2d9cf51e200 GIT binary patch literal 7260 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_1_day.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_1_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..ae591d7811f00bcccfd283947de46c3020bb06a8 GIT binary patch literal 3794 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_1_night.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..50cdbb217976d05ce2bb1ca19258d9b20fad0397 GIT binary patch literal 3750 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 M7ZHE{vHW}b6W20WasU7T literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_2_day.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_2_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..c7314d5e699735ee68bb6faa5ea3a692cdabde10 GIT binary patch literal 2824 zcmd^9cTm&m7EK@o1e6X@=_T~80YZ}|(gZ>m%!){nq98@2g`yw?O%N0WX=0&<-jon& zE5$%SklqCZmZFgjxFo;DH*a?4&3kX={k!wNIp3Xo?;m&OoO9=*EY6iHW#-TR%R!?z|R{+M&{{|pH@Q91J+z}Z(4wMg8$YRQ3GEj$MO(i9Yx#h#O z#hD=u&B1RsA%2kC-SY!lE8!Jwq^0TwR{8NrL${W8KaBWAMaCXYeit+9o5Q-!b->k6 zm=N{EWC183gZ_SQewbFo`i-=k?9R$q`a-$H@{jliB^Zww0{#b^bjsDO|A3lY?T z5ARE%`HD zeKf5e?_qP!8s+Yz#*tcjEX^wLS8&K#u)0N1&N~%&5nNum{%&VXpoTm zjP}K#=bOwG-0c@g=JM-?#BLuV#-5kGdb!6>gI$3IecSj!zdKD(Rdyl zat2_ac}S7q0zqAK#WruZz=xMf4$>LcFuCvBQEc?Bz7wRhy4mI~zrxjm0p#>+>lZn~ zz4<#w;^_ql{#4elBZ?;i-qis?n{hEV#J&xaPbX0%Zy9q|1e<@#?U&@|Hi_04R>{R( zJJMKY?&-~#BLh@XPHfKi(D9T{N(LyoXhQS;)wde|3B@vYc46 zPqY(!dH;pwLU5Y#HNT&pU;UnumB8YBqJq^ask~$C%0^ANE3#7LpAGcg^#7BM`1`H4 zAO!?s0Q=roj_&ARkA;=C1^`-?Lqmxh!a@a4B_gKfK-2y)8^scoP&bVgTicolKYlKkAAL<;J z)Cg$ri9QeW`R=q7%b4-ww@kW?mFsx-gzd17?!I-XHhETTqd?FuX6egyLi(QbNk(-6{bpb`vBgjOJ{T_n}{6I?hSX2z`%_(4-K7CuD2L`Y=^t? zOqlkgOfuzgUuHONm)Ket)aQq^&u9fReU<{pK?^Ya&t`k~L?BiCZJ)WDE+7ZV4ibTp z@QL9(j}AI}T^_Nuo=fN*mV8$bLpn5sWkuS<$^)!kI%N3jN$%CeZMVt1*icp!zp#?w zV-f#xWoHjjTOkl>t@AGG@yo&APR&+JT({~!rD>H}Jz4Vr&OpMY_}=t0Br$kB-MWNk zx^{!oWnk&t8d1=jdI;c5fboGeq!ncSMq+?;ZcR+Nh^BCPyaBZ-jM{NQ=6x&W&Qwhr zp1XOASt%`DUGA3l^Iv@YXs7AG(^fr)2W+tYm8Mq)ud+Cw&$9doZarBYau8Tp6FZce z=$7r1_hV{LWovP6>+r^x#kYoMCvdMr5WQDjoA*gV2v57XxWxQs`;U2dsPMN)&Ur<5 z+lF;SoAb3Zk+MG=d`8T41d6{852aseSW*Zk`BrP^BsU4{4ie@~=DXrw61~col)O=z zE~&CTkGq^>N$=Sa(%qRB%T2UAuGz1L%L@G*2jxGIbC8b~M!vyrKAYVhw0_UTxrl+wY+P#UNj|3c=Ifwo#7BTXz#AU@QCvLA^lX&y5 zopsx64DOTGo)bnL%!xPreB#wKuudarX{`1Z4=T*N026j>qpX5O&(U*(9{Y%oA2seNm%Y$phldo25XqO1&Rus8uq6Q#WabMg}LoVJT}LJ>*zTWTdKKC}2!VkA&? zCwl)uaw?OmO<)KjQeOq)s(UBOHa`_u&@=>mt?u z6V6Uq3ggZyP4eC*mz{>MtLJqMXc~H7+bpRu?s^YQ$bY8KZ<&KHEC?LxYP!0d0=1}S zgD~ZR2nG3Qm~1G;dBoUsy|Ry!*%nL3;jTkEL948wF$cy=*EYZnRBQgl$#TS=jsgIjSX~1b8TQxt H{rBWg(H=wO literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_2_night.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_topbar_2_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..c7314d5e699735ee68bb6faa5ea3a692cdabde10 GIT binary patch literal 2824 zcmd^9cTm&m7EK@o1e6X@=_T~80YZ}|(gZ>m%!){nq98@2g`yw?O%N0WX=0&<-jon& zE5$%SklqCZmZFgjxFo;DH*a?4&3kX={k!wNIp3Xo?;m&OoO9=*EY6iHW#-TR%R!?z|R{+M&{{|pH@Q91J+z}Z(4wMg8$YRQ3GEj$MO(i9Yx#h#O z#hD=u&B1RsA%2kC-SY!lE8!Jwq^0TwR{8NrL${W8KaBWAMaCXYeit+9o5Q-!b->k6 zm=N{EWC183gZ_SQewbFo`i-=k?9R$q`a-$H@{jliB^Zww0{#b^bjsDO|A3lY?T z5ARE%`HD zeKf5e?_qP!8s+Yz#*tcjEX^wLS8&K#u)0N1&N~%&5nNum{%&VXpoTm zjP}K#=bOwG-0c@g=JM-?#BLuV#-5kGdb!6>gI$3IecSj!zdKD(Rdyl zat2_ac}S7q0zqAK#WruZz=xMf4$>LcFuCvBQEc?Bz7wRhy4mI~zrxjm0p#>+>lZn~ zz4<#w;^_ql{#4elBZ?;i-qis?n{hEV#J&xaPbX0%Zy9q|1e<@#?U&@|Hi_04R>{R( zJJMKY?&-~#BLh@XPHfKi(D9T{N(LyoXhQS;)wde|3B@vYc46 zPqY(!dH;pwLU5Y#HNT&pU;UnumB8YBqJq^ask~$C%0^ANE3#7LpAGcg^#7BM`1`H4 zAO!?s0Q=roj_&ARkA;=C1^`-?Lqmxh!a@a4B_gKfK-2y)8^scoP&bVgTicolKYlKkAAL<;J z)Cg$ri9QeW`R=q7%b4-ww@kW?mFsx-gzd17?!I-XHhETTqd?FuX6egyLi(QbNk(-6{bpb`vBgjOJ{T_n}{6I?hSX2z`%_(4-K7CuD2L`Y=^t? zOqlkgOfuzgUuHONm)Ket)aQq^&u9fReU<{pK?^Ya&t`k~L?BiCZJ)WDE+7ZV4ibTp z@QL9(j}AI}T^_Nuo=fN*mV8$bLpn5sWkuS<$^)!kI%N3jN$%CeZMVt1*icp!zp#?w zV-f#xWoHjjTOkl>t@AGG@yo&APR&+JT({~!rD>H}Jz4Vr&OpMY_}=t0Br$kB-MWNk zx^{!oWnk&t8d1=jdI;c5fboGeq!ncSMq+?;ZcR+Nh^BCPyaBZ-jM{NQ=6x&W&Qwhr zp1XOASt%`DUGA3l^Iv@YXs7AG(^fr)2W+tYm8Mq)ud+Cw&$9doZarBYau8Tp6FZce z=$7r1_hV{LWovP6>+r^x#kYoMCvdMr5WQDjoA*gV2v57XxWxQs`;U2dsPMN)&Ur<5 z+lF;SoAb3Zk+MG=d`8T41d6{852aseSW*Zk`BrP^BsU4{4ie@~=DXrw61~col)O=z zE~&CTkGq^>N$=Sa(%qRB%T2UAuGz1L%L@G*2jxGIbC8b~M!vyrKAYVhw0_UTxrl+wY+P#UNj|3c=Ifwo#7BTXz#AU@QCvLA^lX&y5 zopsx64DOTGo)bnL%!xPreB#wKuudarX{`1Z4=T*N026j>qpX5O&(U*(9{Y%oA2seNm%Y$phldo25XqO1&Rus8uq6Q#WabMg}LoVJT}LJ>*zTWTdKKC}2!VkA&? zCwl)uaw?OmO<)KjQeOq)s(UBOHa`_u&@=>mt?u z6V6Uq3ggZyP4eC*mz{>MtLJqMXc~H7+bpRu?s^YQ$bY8KZ<&KHEC?LxYP!0d0=1}S zgD~ZR2nG3Qm~1G;dBoUsy|Ry!*%nL3;jTkEL948wF$cy=*EYZnRBQgl$#TS=jsgIjSX~1b8TQxt H{rBWg(H=wO literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_1_day.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_1_day.webp new file mode 100644 index 0000000000000000000000000000000000000000..519edbc12bf6474ebaa3c06135b38095f6f9648e GIT binary patch literal 3650 zcmdT{c{mhWAD+PwB7`j2<`TE8StDzb%7j+6DA?%z|_3}&nh0sw$j3!*4-gTs<=M%oigJ$-_h#q!uv=+4yu$15TsewTZ4 zbjMxnxlx&S?JbPbU)B3@fAncBpm>zIp9bqiioYDXDZUvDkZQBWn5>5C-)39{3>nnI zfL_8IwuwgE7wYx8YZNlDrm`JIckA_%hvna%a>V0qNUCl&%wr`3x#Rlhm?km({j@4O zf-~oF4uGYH+Tl}hCO>1>crxiF^CoAe>rRwHU4Vz`GhGHV1%?ZX)9d78-K4C|TN^); zS7;0`Xf!-+gSLk_qS1b0F>ao3-#8b!ehaRbQ6@FP=@6kP1_U6m#!$F7&#=9s4uE|Qy<^_l zQS(uq8*v=dbcFsXx_yq8LI&Qh_?5V=3r3m1+hx-jCL&K-Vko|<=?;tc9Ea=|-^G1qZ#?Lm>pp7eKH{=Vv|>Hp_Z|E- zZTb=Py9Dz%q&VLMWioC&aaI+DyMK173Fm|N{D3Zy@!ms?q`|~_wY}d>ZcAK?E)Wuh zXn~0w;+67oqD8SGN^v$;`Ba}$Dlgw_?y0J?n!QvMCSmJ>HQK9oyo3QIJ43M z2kVy>064gi9iLJk^#h0BncWo*a$M(^Lmp&TmuNuD!2wl^cJPoMm>k57C7{m30Up}C z-T6jtY#m2xFU#}A2OY)OSjA5pMxaMHwM|%H;zFZ%sF?9EUP_;b0dn*@k8zcz4wEcVjE$gi&)KBvHKqIXpxHf7KanMxO4sEc_Jc|HzpTuzOL@>%^e&xyg)}VO}8=PdFh<-g9I92;1cNKgG*uii}L?#^uHYahwuN- zlqSRjIH{+i)29Fc`4|8OcrlGGjZRB}FJ2!k7O!8z0gSroP+T^0<9k4Z>Z9}9XYN>hipN^aaR1X?0HCCj6l)A$*indwVE<#k(E8LZ;P1PoE zMZgzm!`cG~@8eaP2(ft`J>*3iVP)EVR+EV`tZ-?2#w%_2cL&?na?NpX=pEM*CVy)f z(v#C%_r3RhbG}R)E7>Jah`>n_l3KT#Mlh9?LBN;u*XXtSe<~ z=fuw0Wsw#0E;h2d4cHArZP5YB;)#FCc7Ner(!0W40T@{AsnHZHrkW3}_p42UvUI_% z-Vv1YPi+H$pQTGb7v^z~fHR|Iu-8w&`Wf;cx~ITnTs-WJ>s}U#d;J4$;&1;{{wV=k z002}PIr8N9^`9|uYEa{D`CR5&l_OYBUl&G_^>WM!=y1#5j>?XRAHCpPxUB>W zLYR_QYXVh6pW>;{yUp&q%#PCJ3H&7)*@rW)T0c&niM{j?Z*Tvi7jel@HJU!w#87m7 z_UW)z6OnQ+igGJl91FGOi3-z4 z8+dLc`2r40_fK9#>V!MY6Sa3<-aexXONYeP%`Tw`q7L_6ayM5r-QOUs#TH zn~h`>t$)wGOXz&op1z=bwxMy6a`(RAocf-dWG?;hW&YlAn-91+4HNkgj2DG9$&T!x zZ$mM~&Z>fP;P^U$E!#m$N7HHjphasf1E-E&ha(F4W*0RC&TK6aOz{;V2ab^uZODj+ zr%!>H0~3m+H}?Inwbv#9xAt-n%;y`*Gg0jE<#k%o?;P`>HxHMlpCm`O?kqx(i=RdOrnB~g9KwI3+T6&J0 zx97B?g+k-UXtE=fXb0smd9yX4s0TiR7Crl{Pw5$SG$J*LHiHT>=0EHlsOmi#9c-Zz zi>l#TwZh-04yujY%-)Q?H+6~9+qcVp7n`QZwzyQRZ>FJ>X+{A-POXl8URx(Le9+y& z_0Xh?haM+te09?`Oz9XdOFzdw%FkNtkgK-S+=LK|_T86#y3M#tN9@A3Un?xkbuvh1 zn-s`08yT$VC!xJGz$5{8l7qiU=xROaUe67)r5x?#WdKq!yW1DO?A=!PDB@~Ds^2$7 zRmyZUfBBO{qb!c^EJ<8=cReT1{jJcZ d9fYt!lJf~~MP_Jrj#*zLQ>3te)}sH3{{rTYCVT(@ literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_1_night.webp b/OsmAnd/res/drawable-xxhdpi/img_help_markers_direction_widget_1_night.webp new file mode 100644 index 0000000000000000000000000000000000000000..3263d581a167c7be8140368ca705c32fc392e348 GIT binary patch literal 4144 zcmdUxcTm&Yw#P#eP(Vp?jQG$d*}V}{nGESp8b%EkZ<(g0?HjX1OL=;1 zln`61aoTQ0MMWd+QxPLnjQ?Qu{QyPu%G*X#@MBcU;jyhc@j&Te>1OisYvKip}J>#od>1OSpKUqyYL2sKCkDR5$X8Q8%x2?tab2515%fR%rf0;ti7uj5@l za+G`T?Fhc!ZN#9}6VOSn(I4)QtmG)Xt#a$-xz?57h_KZ4$@t@5;7oL8U{>)sd}j7c0JAYntfq%SziCq)x@7tbXP|6S8v} zBjJWi!+jznZ~|8Qcou8pvG|&A@~5bxus(W4^sr)hdCReTmRMjrcXNVmT_%O)lXR&m zo-dp!lR^S1FJ5Mg=PAu+*QccA0D+9cGfC@+7pDZOmQD072JAqb+j+M<%O7&1Pf2A> z?J+i+kMLc3EztTPL+cEdkAAEDgTSp8GA~9

dxujw+K-#|5GujgjVl}{^ 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 VcQHO6V336IW-jl)KcD}`_z&e*ZD{}i literal 0 HcmV?d00001 From 3c27fbacc1db690412348dc4df308c347652f855 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Sun, 5 Nov 2017 02:55:19 +0000 Subject: [PATCH 168/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2473 of 2473 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 15e656ecd0..8df9b51367 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -2925,4 +2925,5 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式 全螢幕模式 在頂列上顯示 已經過標記 + 重新命名標記 From fa9c18fc45e3deeea502e6e8b874212dbaa2e881 Mon Sep 17 00:00:00 2001 From: iman Date: Mon, 6 Nov 2017 12:53:06 +0000 Subject: [PATCH 169/187] Translated using Weblate (Persian) Currently translated at 100.0% (2473 of 2473 strings) --- OsmAnd/res/values-fa/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 34e060d465..511106729c 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -2930,4 +2930,5 @@ حالت تمام‌صفحه در نوار بالا نشان بده از این عبور کردم + تغییر نام نشانه From c125c7485c61acabbbcda5f5644012790c7cc13a Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 8 Nov 2017 14:46:00 +0200 Subject: [PATCH 170/187] Move parsing code to LocationParser --- .../osmand/search/core/SearchCoreFactory.java | 7 +- .../src/net/osmand/util/LocationParser.java | 275 ++++++++++++++++++ OsmAnd-java/src/net/osmand/util/MapUtils.java | 270 ----------------- .../CoordinateInputDialogFragment.java | 5 +- 4 files changed, 282 insertions(+), 275 deletions(-) create mode 100644 OsmAnd-java/src/net/osmand/util/LocationParser.java diff --git a/OsmAnd-java/src/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/net/osmand/search/core/SearchCoreFactory.java index ef75cdf175..0fe421f8f1 100644 --- a/OsmAnd-java/src/net/osmand/search/core/SearchCoreFactory.java +++ b/OsmAnd-java/src/net/osmand/search/core/SearchCoreFactory.java @@ -31,6 +31,7 @@ import net.osmand.search.core.SearchPhrase.SearchPhraseDataType; import net.osmand.util.Algorithms; import net.osmand.util.GeoPointParserUtil; import net.osmand.util.GeoPointParserUtil.GeoParsedPoint; +import net.osmand.util.LocationParser; import net.osmand.util.MapUtils; import java.io.IOException; @@ -1127,17 +1128,17 @@ public class SearchCoreFactory { List d = new ArrayList<>(); List all = new ArrayList<>(); List strings = new ArrayList<>(); - MapUtils.splitObjects(s, d, all, strings); + LocationParser.splitObjects(s, d, all, strings); if (d.size() == 0) { return null; } - double lat = MapUtils.parse1Coordinate(all, 0, all.size()); + double lat = LocationParser.parse1Coordinate(all, 0, all.size()); return new LatLon(lat, 0); } private void parseLocation(SearchPhrase phrase, SearchResultMatcher resultMatcher) { String lw = phrase.getUnknownSearchPhrase(); - LatLon l = MapUtils.parseLocation(lw); + LatLon l = LocationParser.parseLocation(lw); if (l != null) { if (phrase.isSearchTypeAllowed(ObjectType.LOCATION)) { SearchResult sp = new SearchResult(phrase); diff --git a/OsmAnd-java/src/net/osmand/util/LocationParser.java b/OsmAnd-java/src/net/osmand/util/LocationParser.java new file mode 100644 index 0000000000..4d320be701 --- /dev/null +++ b/OsmAnd-java/src/net/osmand/util/LocationParser.java @@ -0,0 +1,275 @@ +package net.osmand.util; + +import com.google.openlocationcode.OpenLocationCode; +import com.jwetherell.openmap.common.LatLonPoint; +import com.jwetherell.openmap.common.UTMPoint; + +import net.osmand.data.LatLon; + +import java.util.ArrayList; +import java.util.List; + +public class LocationParser { + public static LatLon parseLocation(String locPhrase) { + locPhrase = locPhrase.trim(); + // detect OLC first + // avoid throwing exceptions by carefully checking exceptions + if (locPhrase.length() > 0 && OpenLocationCode.isValidCode(locPhrase)) { + OpenLocationCode olc = new OpenLocationCode(locPhrase); + if (olc.isFull()) { + OpenLocationCode.CodeArea codeArea = olc.decode(); + return new LatLon(codeArea.getCenterLatitude(), codeArea.getCenterLongitude()); + } + } + if (locPhrase.length() == 0 || !(locPhrase.charAt(0) == '-' || Character.isDigit(locPhrase.charAt(0)) + || locPhrase.charAt(0) == 'S' || locPhrase.charAt(0) == 's' + || locPhrase.charAt(0) == 'N' || locPhrase.charAt(0) == 'n' + || locPhrase.contains("://"))) { + return null; + } + List d = new ArrayList<>(); + List all = new ArrayList<>(); + List strings = new ArrayList<>(); + splitObjects(locPhrase, d, all, strings); + if (d.size() == 0) { + return null; + } + // detect UTM + if (all.size() == 4 && d.size() == 3 && all.get(1) instanceof String) { + char ch = all.get(1).toString().charAt(0); + if (Character.isLetter(ch)) { + UTMPoint upoint = new UTMPoint(d.get(2), d.get(1), d.get(0).intValue(), ch); + LatLonPoint ll = upoint.toLatLonPoint(); + return new LatLon(ll.getLatitude(), ll.getLongitude()); + } + } + + if (all.size() == 3 && d.size() == 2 && all.get(1) instanceof String) { + char ch = all.get(1).toString().charAt(0); + String combined = strings.get(2); + if (Character.isLetter(ch)) { + try { + String east = combined.substring(0, combined.length() / 2); + String north = combined.substring(combined.length() / 2, combined.length()); + UTMPoint upoint = new UTMPoint(Double.parseDouble(north), Double.parseDouble(east), d.get(0) + .intValue(), ch); + LatLonPoint ll = upoint.toLatLonPoint(); + return new LatLon(ll.getLatitude(), ll.getLongitude()); + } catch (NumberFormatException e) { + } + } + } + // try to find split lat/lon position + int jointNumbers = 0; + int lastJoin = 0; + int degSplit = -1; + int degType = -1; // 0 - degree, 1 - minutes, 2 - seconds + boolean finishDegSplit = false; + int northSplit = -1; + int eastSplit = -1; + for (int i = 1; i < all.size(); i++ ) { + if (all.get(i - 1) instanceof Double && all.get(i) instanceof Double) { + jointNumbers ++; + lastJoin = i; + } + if (all.get(i).equals("n") || all.get(i).equals("s") || + all.get(i).equals("N") || all.get(i).equals("S")) { + northSplit = i + 1; + } + if (all.get(i).equals("e") || all.get(i).equals("w") || + all.get(i).equals("E") || all.get(i).equals("W")) { + eastSplit = i; + } + int dg = -1; + if (all.get(i).equals("°")) { + dg = 0; + } else if (all.get(i).equals("\'") || all.get(i).equals("′")) { + dg = 1; + } else if (all.get(i).equals("″") || all.get(i).equals("\"")) { + dg = 2; + } + if (dg != -1) { + if (!finishDegSplit) { + if (degType < dg) { + degSplit = i + 1; + degType = dg; + } else { + finishDegSplit = true; + degType = dg; + } + } else { + if (degType < dg) { + degType = dg; + } else { + // reject delimiter + degSplit = -1; + } + } + } + } + int split = -1; + if (jointNumbers == 1) { + split = lastJoin; + } + if (northSplit != -1 && northSplit < all.size() -1) { + split = northSplit; + } else if (eastSplit != -1 && eastSplit < all.size() -1) { + split = eastSplit; + } else if (degSplit != -1 && degSplit < all.size() -1) { + split = degSplit; + } + + if (split != -1) { + double lat = parse1Coordinate(all, 0, split); + double lon = parse1Coordinate(all, split, all.size()); + return new LatLon(lat, lon); + } + if (d.size() == 2) { + return new LatLon(d.get(0), d.get(1)); + } + // simple url case + if (locPhrase.contains("://")) { + double lat = 0; + double lon = 0; + boolean only2decimals = true; + for (int i = 0; i < d.size(); i++) { + if (d.get(i).doubleValue() != d.get(i).intValue()) { + if (lat == 0) { + lat = d.get(i); + } else if (lon == 0) { + lon = d.get(i); + } else { + only2decimals = false; + } + } + } + if (lat != 0 && lon != 0 && only2decimals) { + return new LatLon(lat, lon); + } + } + // split by equal number of digits + if (d.size() > 2 && d.size() % 2 == 0) { + int ind = d.size() / 2 + 1; + int splitEq = -1; + for (int i = 0; i < all.size(); i++) { + if (all.get(i) instanceof Double) { + ind --; + } + if (ind == 0) { + splitEq = i; + break; + } + } + if (splitEq != -1) { + double lat = parse1Coordinate(all, 0, splitEq); + double lon = parse1Coordinate(all, splitEq, all.size()); + return new LatLon(lat, lon); + } + } + return null; + } + + public static double parse1Coordinate(List all, int begin, int end) { + boolean neg = false; + double d = 0; + int type = 0; // degree - 0, minutes - 1, seconds = 2 + Double prevDouble = null; + for (int i = begin; i <= end; i++) { + Object o = i == end ? "" : all.get(i); + if(o.equals("S") || o.equals("W")) { + neg = !neg; + } + if (prevDouble != null) { + if (o.equals("°")) { + type = 0; + } else if (o.equals("′") /*o.equals("'")*/) { + // ' can be used as delimeter ignore it + type = 1; + } else if (o.equals("\"") || o.equals("″")) { + type = 2; + } + if (type == 0) { + double ld = prevDouble.doubleValue(); + if (ld < 0) { + ld = -ld; + neg = true; + } + d += ld; + } else if (type == 1) { + d += prevDouble.doubleValue() / 60.f; + } else /*if (type == 1) */ { + d += prevDouble.doubleValue() / 3600.f; + } + type++; + } + if (o instanceof Double) { + prevDouble = (Double) o; + } else { + prevDouble = null; + } + } + if (neg) { + d = -d; + } + return d; + } + + public static void splitObjects(String s, List d, List all, List strings) { + boolean digit = false; + int word = -1; + for (int i = 0; i <= s.length(); i++) { + char ch = i == s.length() ? ' ' : s.charAt(i); + boolean dg = Character.isDigit(ch); + boolean nonwh = ch != ',' && ch != ' ' && ch != ';'; + if (ch == '.' || dg || ch == '-' ) { + if (!digit) { + if (word != -1) { + all.add(s.substring(word, i)); + strings.add(s.substring(word, i)); + } + digit = true; + word = i; + } else { + if(word == -1) { + word = i; + } + // if digit + // continue + } + } else { + if (digit){ + if (word != -1) { + try { + double dl = Double.parseDouble(s.substring(word, i)); + d.add(dl); + all.add(dl); + strings.add(s.substring(word, i)); + digit = false; + word = -1; + } catch (NumberFormatException e) { + } + } + } + if (nonwh) { + if(!Character.isLetter(ch)) { + if(word != -1) { + all.add(s.substring(word, i)); + strings.add(s.substring(word, i)); + } + all.add(s.substring(i, i + 1)); + strings.add(s.substring(i, i +1)); + word = -1; + } else if(word == -1) { + word = i; + } + } else { + if (word != -1) { + all.add(s.substring(word, i)); + strings.add(s.substring(word, i)); + } + word = -1; + } + } + } + } +} diff --git a/OsmAnd-java/src/net/osmand/util/MapUtils.java b/OsmAnd-java/src/net/osmand/util/MapUtils.java index 829a9cf13a..040fed2996 100644 --- a/OsmAnd-java/src/net/osmand/util/MapUtils.java +++ b/OsmAnd-java/src/net/osmand/util/MapUtils.java @@ -1,16 +1,9 @@ package net.osmand.util; - -import com.google.openlocationcode.OpenLocationCode; -import com.jwetherell.openmap.common.LatLonPoint; -import com.jwetherell.openmap.common.UTMPoint; - -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import net.osmand.binary.BinaryMapIndexReader.SearchRequest; import net.osmand.data.LatLon; import net.osmand.data.MapObject; import net.osmand.data.QuadPoint; @@ -606,269 +599,6 @@ public class MapUtils { return y1; } } - - public static LatLon parseLocation(String locPhrase) { - locPhrase = locPhrase.trim(); - // detect OLC first - // avoid throwing exceptions by carefully checking exceptions - if (locPhrase.length() > 0 && OpenLocationCode.isValidCode(locPhrase)) { - OpenLocationCode olc = new OpenLocationCode(locPhrase); - if (olc.isFull()) { - OpenLocationCode.CodeArea codeArea = olc.decode(); - return new LatLon(codeArea.getCenterLatitude(), codeArea.getCenterLongitude()); - } - } - if (locPhrase.length() == 0 || !(locPhrase.charAt(0) == '-' || Character.isDigit(locPhrase.charAt(0)) - || locPhrase.charAt(0) == 'S' || locPhrase.charAt(0) == 's' - || locPhrase.charAt(0) == 'N' || locPhrase.charAt(0) == 'n' - || locPhrase.contains("://"))) { - return null; - } - List d = new ArrayList<>(); - List all = new ArrayList<>(); - List strings = new ArrayList<>(); - splitObjects(locPhrase, d, all, strings); - if (d.size() == 0) { - return null; - } - // detect UTM - if (all.size() == 4 && d.size() == 3 && all.get(1) instanceof String) { - char ch = all.get(1).toString().charAt(0); - if (Character.isLetter(ch)) { - UTMPoint upoint = new UTMPoint(d.get(2), d.get(1), d.get(0).intValue(), ch); - LatLonPoint ll = upoint.toLatLonPoint(); - return new LatLon(ll.getLatitude(), ll.getLongitude()); - } - } - - if (all.size() == 3 && d.size() == 2 && all.get(1) instanceof String) { - char ch = all.get(1).toString().charAt(0); - String combined = strings.get(2); - if (Character.isLetter(ch)) { - try { - String east = combined.substring(0, combined.length() / 2); - String north = combined.substring(combined.length() / 2, combined.length()); - UTMPoint upoint = new UTMPoint(Double.parseDouble(north), Double.parseDouble(east), d.get(0) - .intValue(), ch); - LatLonPoint ll = upoint.toLatLonPoint(); - return new LatLon(ll.getLatitude(), ll.getLongitude()); - } catch (NumberFormatException e) { - } - } - } - // try to find split lat/lon position - int jointNumbers = 0; - int lastJoin = 0; - int degSplit = -1; - int degType = -1; // 0 - degree, 1 - minutes, 2 - seconds - boolean finishDegSplit = false; - int northSplit = -1; - int eastSplit = -1; - for (int i = 1; i < all.size(); i++ ) { - if (all.get(i - 1) instanceof Double && all.get(i) instanceof Double) { - jointNumbers ++; - lastJoin = i; - } - if (all.get(i).equals("n") || all.get(i).equals("s") || - all.get(i).equals("N") || all.get(i).equals("S")) { - northSplit = i + 1; - } - if (all.get(i).equals("e") || all.get(i).equals("w") || - all.get(i).equals("E") || all.get(i).equals("W")) { - eastSplit = i; - } - int dg = -1; - if (all.get(i).equals("°")) { - dg = 0; - } else if (all.get(i).equals("\'") || all.get(i).equals("′")) { - dg = 1; - } else if (all.get(i).equals("″") || all.get(i).equals("\"")) { - dg = 2; - } - if (dg != -1) { - if (!finishDegSplit) { - if (degType < dg) { - degSplit = i + 1; - degType = dg; - } else { - finishDegSplit = true; - degType = dg; - } - } else { - if (degType < dg) { - degType = dg; - } else { - // reject delimiter - degSplit = -1; - } - } - } - } - int split = -1; - if (jointNumbers == 1) { - split = lastJoin; - } - if (northSplit != -1 && northSplit < all.size() -1) { - split = northSplit; - } else if (eastSplit != -1 && eastSplit < all.size() -1) { - split = eastSplit; - } else if (degSplit != -1 && degSplit < all.size() -1) { - split = degSplit; - } - - if (split != -1) { - double lat = parse1Coordinate(all, 0, split); - double lon = parse1Coordinate(all, split, all.size()); - return new LatLon(lat, lon); - } - if (d.size() == 2) { - return new LatLon(d.get(0), d.get(1)); - } - // simple url case - if (locPhrase.contains("://")) { - double lat = 0; - double lon = 0; - boolean only2decimals = true; - for (int i = 0; i < d.size(); i++) { - if (d.get(i).doubleValue() != d.get(i).intValue()) { - if (lat == 0) { - lat = d.get(i); - } else if (lon == 0) { - lon = d.get(i); - } else { - only2decimals = false; - } - } - } - if (lat != 0 && lon != 0 && only2decimals) { - return new LatLon(lat, lon); - } - } - // split by equal number of digits - if (d.size() > 2 && d.size() % 2 == 0) { - int ind = d.size() / 2 + 1; - int splitEq = -1; - for (int i = 0; i < all.size(); i++) { - if (all.get(i) instanceof Double) { - ind --; - } - if (ind == 0) { - splitEq = i; - break; - } - } - if (splitEq != -1) { - double lat = parse1Coordinate(all, 0, splitEq); - double lon = parse1Coordinate(all, splitEq, all.size()); - return new LatLon(lat, lon); - } - } - return null; - } - - public static double parse1Coordinate(List all, int begin, int end) { - boolean neg = false; - double d = 0; - int type = 0; // degree - 0, minutes - 1, seconds = 2 - Double prevDouble = null; - for (int i = begin; i <= end; i++) { - Object o = i == end ? "" : all.get(i); - if(o.equals("S") || o.equals("W")) { - neg = !neg; - } - if (prevDouble != null) { - if (o.equals("°")) { - type = 0; - } else if (o.equals("′") /*o.equals("'")*/) { - // ' can be used as delimeter ignore it - type = 1; - } else if (o.equals("\"") || o.equals("″")) { - type = 2; - } - if (type == 0) { - double ld = prevDouble.doubleValue(); - if (ld < 0) { - ld = -ld; - neg = true; - } - d += ld; - } else if (type == 1) { - d += prevDouble.doubleValue() / 60.f; - } else /*if (type == 1) */ { - d += prevDouble.doubleValue() / 3600.f; - } - type++; - } - if (o instanceof Double) { - prevDouble = (Double) o; - } else { - prevDouble = null; - } - } - if (neg) { - d = -d; - } - return d; - } - - public static void splitObjects(String s, List d, List all, List strings) { - boolean digit = false; - int word = -1; - for (int i = 0; i <= s.length(); i++) { - char ch = i == s.length() ? ' ' : s.charAt(i); - boolean dg = Character.isDigit(ch); - boolean nonwh = ch != ',' && ch != ' ' && ch != ';'; - if (ch == '.' || dg || ch == '-' ) { - if (!digit) { - if (word != -1) { - all.add(s.substring(word, i)); - strings.add(s.substring(word, i)); - } - digit = true; - word = i; - } else { - if(word == -1) { - word = i; - } - // if digit - // continue - } - } else { - if (digit){ - if (word != -1) { - try { - double dl = Double.parseDouble(s.substring(word, i)); - d.add(dl); - all.add(dl); - strings.add(s.substring(word, i)); - digit = false; - word = -1; - } catch (NumberFormatException e) { - } - } - } - if (nonwh) { - if(!Character.isLetter(ch)) { - if(word != -1) { - all.add(s.substring(word, i)); - strings.add(s.substring(word, i)); - } - all.add(s.substring(i, i + 1)); - strings.add(s.substring(i, i +1)); - word = -1; - } else if(word == -1) { - word = i; - } - } else { - if (word != -1) { - all.add(s.substring(word, i)); - strings.add(s.substring(word, i)); - } - word = -1; - } - } - } - } } diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index bfb75fd08a..7efb63e0af 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -59,6 +59,7 @@ import net.osmand.plus.dashboard.DashLocationFragment; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.mapmarkers.adapters.CoordinateInputAdapter; import net.osmand.plus.widgets.OsmandTextFieldBoxes; +import net.osmand.util.LocationParser; import net.osmand.util.MapUtils; import java.util.ArrayList; @@ -634,8 +635,8 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm List d = new ArrayList<>(); List all = new ArrayList<>(); List strings = new ArrayList<>(); - MapUtils.splitObjects(s, d, all, strings); - double coordinate = MapUtils.parse1Coordinate(all, 0, all.size()); + LocationParser.splitObjects(s, d, all, strings); + double coordinate = LocationParser.parse1Coordinate(all, 0, all.size()); if (coordinate == 0 && d.size() == 1) { coordinate = d.get(0); } From 756246024efe832d3d27a0170e57fb0d821ab297 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 8 Nov 2017 14:58:02 +0200 Subject: [PATCH 171/187] Fix icon color --- OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml | 2 +- OsmAnd/res/layout/fragment_coordinate_input_dialog.xml | 2 +- OsmAnd/res/values/colors.xml | 3 +-- .../osmand/plus/mapmarkers/CoordinateInputDialogFragment.java | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml b/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml index 8c64f20e23..bf450ea5aa 100644 --- a/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml +++ b/OsmAnd/res/layout/coordinate_input_land_osmand_keyboard.xml @@ -37,7 +37,7 @@ android:maxLines="1" android:text="@string/shared_string_add" android:textAllCaps="true" - android:textColor="@color/keyboard_item_add_button_text_color" + android:textColor="@color/keyboard_item_button_text_color" android:textSize="@dimen/default_list_text_size"/> diff --git a/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml b/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml index 326071caa2..0dcd5bd3c4 100644 --- a/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml +++ b/OsmAnd/res/layout/fragment_coordinate_input_dialog.xml @@ -210,7 +210,7 @@ android:layout_weight="3" android:layout_height="match_parent" android:gravity="center" - android:textColor="@color/keyboard_item_add_button_text_color" + android:textColor="@color/keyboard_item_button_text_color" android:textSize="@dimen/default_list_text_size" android:text="@string/shared_string_add"/> diff --git a/OsmAnd/res/values/colors.xml b/OsmAnd/res/values/colors.xml index 049df8a642..b9e838e9d0 100644 --- a/OsmAnd/res/values/colors.xml +++ b/OsmAnd/res/values/colors.xml @@ -292,8 +292,7 @@ #4b62e3 #2d3980 #4b62e3 - #ffffff - #222c66 + #ffffff #4b62e3 #121733 #e6e6e6 diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java index 7efb63e0af..449577d25b 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java @@ -313,7 +313,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm if (orientationPortrait) { final ImageView showHideKeyboardIcon = (ImageView) mainView.findViewById(R.id.show_hide_keyboard_icon); showHideKeyboardIcon.setBackgroundResource(lightTheme ? R.drawable.keyboard_item_add_button_light_bg : R.drawable.keyboard_item_add_button_dark_bg); - showHideKeyboardIcon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_arrow_down, R.color.keyboard_item_show_hide_color)); + showHideKeyboardIcon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_arrow_down, R.color.keyboard_item_button_text_color)); showHideKeyboardIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -588,7 +588,7 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm mainView.findViewById(R.id.keyboard_grid_view).setVisibility(visibility); mainView.findViewById(R.id.keyboard_divider).setVisibility(visibility); ((ImageView) mainView.findViewById(R.id.show_hide_keyboard_icon)) - .setImageDrawable(iconsCache.getIcon(show ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up, R.color.keyboard_item_show_hide_color)); + .setImageDrawable(iconsCache.getIcon(show ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up, R.color.keyboard_item_button_text_color)); } private void changeKeyboardInBoxes() { From 0e76730e885c96104e0c989bb9be679fb0858276 Mon Sep 17 00:00:00 2001 From: PavelRatushny Date: Wed, 8 Nov 2017 15:58:50 +0200 Subject: [PATCH 172/187] Move getting arrow width to widgets factory --- .../src/net/osmand/router/TurnType.java | 35 ----------------- .../mapwidgets/RouteInfoWidgetsFactory.java | 39 ++++++++++++++++++- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/router/TurnType.java b/OsmAnd-java/src/net/osmand/router/TurnType.java index 71be5a3c73..f7e7ae9766 100644 --- a/OsmAnd-java/src/net/osmand/router/TurnType.java +++ b/OsmAnd-java/src/net/osmand/router/TurnType.java @@ -413,41 +413,6 @@ public class TurnType { } } - public static int getArrowWidthInDp(int tt) { - int result; - - switch (tt){ - case TurnType.C: - result = 12; - break; - case TurnType.TR: - case TurnType.TL: - result = 20; - break; - case TurnType.KR: - case TurnType.KL: - result = 13; - break; - case TurnType.TSLR: - case TurnType.TSLL: - result = 13; - break; - case TurnType.TSHR: - case TurnType.TSHL: - result = 19; - break; - case TurnType.TRU: - case TurnType.TU: - result = 24; - break; - default: - result = 12; - break; - } - - return result; - } - public static int convertType(String lane) { int turn; if (lane.equals("none") || lane.equals("through")) { diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java index 2e196cae6e..f8e5c1214e 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java @@ -915,7 +915,7 @@ public class RouteInfoWidgetsFactory { secondTurnType, thirdTurnType, TurnPathHelper.FIRST_TURN, coef, leftSide); if (b != null) { if (secondTurnType == 0 && thirdTurnType == 0) { - int arrowWidth = AndroidUtils.dpToPx(ctx, TurnType.getArrowWidthInDp(turnType)); + int arrowWidth = AndroidUtils.dpToPx(ctx, getArrowWidthInDp(turnType)); int emptyWidth = b.getWidth() - arrowWidth; w += emptyWidth / 2 + arrowWidth; } else { @@ -1022,12 +1022,47 @@ public class RouteInfoWidgetsFactory { } private Bitmap applyCrop(Bitmap bitmap, int turnType) { - int arrowWidth = AndroidUtils.dpToPx(ctx, TurnType.getArrowWidthInDp(turnType)); + int arrowWidth = AndroidUtils.dpToPx(ctx, getArrowWidthInDp(turnType)); int emptyWidth = bitmap.getWidth() - arrowWidth; int widthToCrop = emptyWidth / 4; return Bitmap.createBitmap(bitmap, widthToCrop, 0, bitmap.getWidth() - 2 * widthToCrop, bitmap.getHeight()); } + private int getArrowWidthInDp(int tt) { + int result; + + switch (tt){ + case TurnType.C: + result = 12; + break; + case TurnType.TR: + case TurnType.TL: + result = 20; + break; + case TurnType.KR: + case TurnType.KL: + result = 13; + break; + case TurnType.TSLR: + case TurnType.TSLL: + result = 13; + break; + case TurnType.TSHR: + case TurnType.TSHL: + result = 19; + break; + case TurnType.TRU: + case TurnType.TU: + result = 24; + break; + default: + result = 12; + break; + } + + return result; + } + //@Override public void drawOld(Canvas canvas) { float w = 72 * scaleCoefficient / miniCoeff; From 114048f3c4e0e1457368d41cb8d59d2e1651e64f Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Wed, 8 Nov 2017 17:29:08 +0200 Subject: [PATCH 173/187] Add shadow for Keyboard. --- .../bg_contextmenu_shadow_left_light.9.png | Bin 0 -> 1117 bytes .../bg_contextmenu_shadow_left_light.9.png | Bin 0 -> 1095 bytes .../bg_contextmenu_shadow_left_light.9.png | Bin 0 -> 1148 bytes .../bg_contextmenu_shadow_left_light.9.png | Bin 0 -> 1274 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 OsmAnd/res/drawable-hdpi/bg_contextmenu_shadow_left_light.9.png create mode 100644 OsmAnd/res/drawable-mdpi/bg_contextmenu_shadow_left_light.9.png create mode 100644 OsmAnd/res/drawable-xhdpi/bg_contextmenu_shadow_left_light.9.png create mode 100644 OsmAnd/res/drawable-xxhdpi/bg_contextmenu_shadow_left_light.9.png diff --git a/OsmAnd/res/drawable-hdpi/bg_contextmenu_shadow_left_light.9.png b/OsmAnd/res/drawable-hdpi/bg_contextmenu_shadow_left_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a940bc2f08568834db4fe9270ddc0d63c52f0ce8 GIT binary patch literal 1117 zcmbVLOKa3n6b@EIs@)bJn@hS-!MqD~f zi!KDgowzGq`C7OvSeNP_5EVfY!GhAYE4`V{R2QX-UP$iieBU|uob#>BOkW%sJ~2#D z)JS>KtdjW@`K}y3ME<`@PcvjXj*E3Xhg{sYB1jb+)PSJuTTNJnmeaZZ7Un2wXxXdP zalJC7+sJ3F)P_y`kf13lH=cx+-GUf2VABio^w#=LOIoH1QTWu3j}ueP3jkrx!2|b&hMd+iY86QPkuF zP187Dd5l+kLSC7h>8q}xyM!%Ag`IEed+A}Qk% zE93;0=X^hXSI;`eRroKAU9IC)x?IXiLNl<*$polrYsqy(u5%k zf>6v%sG?X93`5Eq8Aap^18g~nu@%^G;M*g<``F^1Slx)Ag;7*PXmQX5GYbf#cmajL zFw&~a;Pku~IH(<;Nz1hTY7<7@GIUB2@(#r@!EUq_b7PxYV+aN>ixBP?%3+1tCvrH{vdT%wb_pkN+1uSsH~Oq14*IBlIy?JS!~?#zTXxiPuzqyvfw zA_{JF>km*Dt`rxFZWT8Q3L>J2pdeCpCw1e^v{OZj3j?{&?>pz*bIx~ZYU0?o{=t5R zVYZdVoeG_I(ckLZO2>NxH_y;%HyN#wY1|-fH$hC%$8`isq1!|iWpAF&|tEp}Edi{;oxtzf*9py|#; z)$7cAhR+^70){h_8VC__K^87VshL@9*RDy|`LV!)E`-cm>{?K@@)WRff`H0voCjqc z6bv4!hAt_GfFwdq5Dft;oCr`oqa8T+cK}-T1f!v~7$BV>bX{2jU2;*{j!*GKpKrXnFO>b?t+88 z#SlfL^)yb^6oWGm)VPK(H4Le)8BzoG>}~Tv`O5DgpJ>LQKE!&PFJEHVYu4yO8B{->KywK}{sTL+U zZQ&T$c3yP_9GDFvAGgzkd70K;?Vu!BLjG8SL(t8$8Eg^*QdCiHAjCmML!6?kGG}N7 z#JQp`DXJo?uBx%?eE)y*C(xjTyjlKep577d$b7jW1-jV~6N;#U5-OFIho`PlnKesJ zv6{X9^6K#Rb71G_$+Ls!f4;kQ<E4WP4?0bzqM9j{B}Z-aljI$kOP9b9-d& F{4W?)Sa|>d literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/bg_contextmenu_shadow_left_light.9.png b/OsmAnd/res/drawable-xhdpi/bg_contextmenu_shadow_left_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eaaa663c0ea4c1d7b885f1ef78c3eda237024b29 GIT binary patch literal 1148 zcmb_bOKa3n7>)Qqss+J~x@kxe6wKr1HIvYBoJsl^aB4dp>1+ySlABKKBsV5^nsjg> z;=&?=yKYnjcP<1MqTr(HMqE^M<3jWw6uJ~a#GC0%by2zy1G&%dob%o9u{tw7IXrY~ zh@z<=T5VMp65h zy?O&Tsuy(|`J9#6aH$^>G)0XS)6lY)Af}se(F+R9)~j`f_M8GUuT+I zce-wOmu$^pis$LER3`*J#1@_U?I70E0@LHw$vQjc8M&Mfn^p3P9xrjR!I-0A0{@0nq)AA!?E1>NRtsuSIqRriF2+^L&ydTq1EO zTI7MIX}lovqR0{pHeLy^m9jxRI$$tiY)4**JrvLxqt!$mTwsW&+fVSrYITP=i2H#e zA>&gkxix%bB;;ehS_yA=^kX#5^Aghp-^NPf3Y7VlN z;E1v!ONynaOds$3Yy5cP6rUB#U&S*xA{Ch}cUpmLcA5zWq=O>TD$U!gcSxJvub8EJ z`epMg7-X-{z_wEKq@3sTo(`w%(K#PZ z%#9VzxoK0i=)n_UAk>I}1F-=@r{)G)n4+7y8ktAi91WTfJe{I9oGRtVfsT9#WL9BJ zA&~_ADl5opQk0GXkrxz>S2;mqctPV;jTb=cp@}u$s%VAmNXr&krRXV)J&ofUjRxCD zu*k1+f~u+xYo1)1HYuT1&C{V5>lQNT(O@)yaNo7ylRIwt&Iy><*s+>q> zBt4@iR6!W-&nTjp7IZz4)ca+TPsiMx8(_mVVQkwbwp-lHu3Sy`p@ETKM5q>5!T1!y zD40SX(Df+m66l+>T?;jWqfweRZk>g`Jp-)~A32~IXU*Qh2PnyWq5>f!ND5@6q?}+> zr5`c|Z;6sDC1gWZ=oa7l*Z6V7DK09OZN(FBk&29_o2@_=o6Q7W(m_6Hl{4@BHx$*@ zlgp-y;mYTi$2%W@?xA$UT${IE*M?Ws<;SZ}7vKK6eR=KKO7*#X zYyI1c_ji`he}8=Q1J%~Px1$>jEl>xVU$Push&SV-w)P_guz~y=-?0?q7g|!=@k5&; rhaxKxeGC8pjjr|`oc~=~{o27(!P34fKObGCqrXvZcr3e|IeXy`dRTNR literal 0 HcmV?d00001 From 366587280130d73ae822a1953134eba161a85270 Mon Sep 17 00:00:00 2001 From: Franco Date: Mon, 6 Nov 2017 18:27:44 +0000 Subject: [PATCH 174/187] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (2473 of 2473 strings) --- OsmAnd/res/values-es-rAR/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 03d2742e4f..f37fde6dba 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -2819,4 +2819,5 @@ Proporciona un código completo Modo de pantalla completa Mostrar en la barra superior Marcador ya utilizado + Renombrar marcador From 348d3a656e7f1bff27b3ef93ae9ca31e82b8104f Mon Sep 17 00:00:00 2001 From: Suren Date: Wed, 8 Nov 2017 15:50:08 +0000 Subject: [PATCH 175/187] Translated using Weblate (Armenian) Currently translated at 83.0% (2054 of 2473 strings) --- OsmAnd/res/values-hy/strings.xml | 323 ++++++++++++++++--------------- 1 file changed, 162 insertions(+), 161 deletions(-) diff --git a/OsmAnd/res/values-hy/strings.xml b/OsmAnd/res/values-hy/strings.xml index 20c524ba72..80549941d7 100644 --- a/OsmAnd/res/values-hy/strings.xml +++ b/OsmAnd/res/values-hy/strings.xml @@ -10,27 +10,27 @@ Նկար %1$s %2$s Նկարել Նկարել - Dropbox plugin-ը թույլ է տալիս սինխրոնիզացնել տրեքերը և Աուդիո/վիդեո նշումները ձեր dropbox-ի հետ: + Dropbox plugin-ը թույլ է տալիս սինխրոնիզացնել տրեքերը և Աուդիո/վիդեո նշումները ձեր Dropbox-ի հետ: Փոխել հերթականությունը Рассмотрите пожалуйста покупку плагина \"Линии высот\" на Market, чтобы поддержать последующую разработку. Բարձրության գծեր փլագին Տեսանյութի ձայնագրում Աուդիո ձայնագրում - Ընտրեք տեսանյութի ֆորմատը + Ընտրեք տեսանյութի ֆորմատը։ Տեսանյութի ֆորմատ - Օգտագործել սիստեմային ծրագիր տեսաձայնագրման համար + Օգտագործել սիստեմային ծրագիր տեսաձայնագրման համար։ Օգտագործել արտաքին ծրագիր - Օգտագործել սիստեմային ծրագիր լուսանկարելու համար + Օգտագործել սիստեմային ծրագիր լուսանկարելու համար։ Օգտագործել Camera ծրագիրը - Տեսա/Ձայնա-գրման պարամետրեր + Տեսա/Ձայնա-գրման պարամետրեր։ "Աուդիո/վիդեո պարամետրեր" "Սխալ է տեղի ունեցել արձանագրության ժամանակ" Վիդեո/Ֆոտո-խցիկը անհասանելի է էլ-փոստ -Օգտագործել Կալմանի ֆիլտրը կողմնացույցի սխելներից խուսափելու համար +Օգտագործել Կալմանի ֆիլտրը կողմնացույցի սխելներից խուսափելու համար։ Օգտագործել Կալմանի ֆիլտրը - Օգտագործել մագնիսական սենսորը որոշելու կողմնացույցի ուղղությունը + Օգտագործել մագնիսական սենսորը որոշելու կողմնացույցի ուղղությունը։ Օգտագործել մագնիսական սենսորը Այլ Մնացել է %1$d ֆայլ @@ -46,7 +46,7 @@ Ուղևորության գրանցում - Ընտրեք ծրագրի դիզայնի թեման + Ընտրեք ծրագրի դիզայնի թեման։ Ընտրել հասցեն Ընտրել նախնտրածներից OSM փոփոխություններ @@ -83,7 +83,7 @@ \n * Սեխմեք և պահեք քարտեզի վրա նախորդ կետը ջնջելու համար։ \n * Սեխմեք և պահեք կետը վրա բացատրությունը տեսնելու և ավելացնելու համար։ \n * Սեխմեք չափման վիդջետի վրա այլ հնարավորությունների համար։ - Ուղևորության գրանցոման կարգավորում + Ուղևորության գրանցոման կարգավորում։ Ծրագրի դիզայնի թեման Հատուկ հնարավորությունների կարգավորումներ Տարածքի ռելիոֆի շերտ @@ -94,14 +94,14 @@ Քարտեզ Նախնտրել մայրուղիներ Նախնտրել… - Նախնտրել մայրուղիներ + Նախնտրել մայրուղիներ։ Ոչ OpenMaps - Եվրոպա Կոնտուրային գծերի/եզրագծերի տվյալներ Միացնել ճշգրիտ ճանապարհի հաշվարկի ռեժիմը։ Այս ռեժիմը աշխատում է կարճ հեռավորությունների վրա և չի օգտագործում սեփական գրադարանը Dropbox փլագին Ընտրել ըստ հարցման - Ընտրել default Widget գործողություն + Ընտրել default Widget գործողություն։ Default վիդջետի գործողություն Կատարվում է Աուդիո/վիդեո ձայնագրում, դադարեցնելու համար սեխմեք \"Վերջ\"։ Նվագում է ձայնագրությունը\n%1$s @@ -115,7 +115,7 @@ Ջնջել ձայնագրությունը Նվագել Գրանցում %1$s %3$s %2$s - ձայնագրություն\\գրառում + Ձայնագրություն\\գրառում Կանգնել ձայնագրել Աուդիո/Վիդեո նշումներ @@ -135,16 +135,16 @@ ուղու նախապատվություններ Ուղու տեղեկատվություն Նախընտրելի ավտոճանապարհ - Նախընտրելի ավտոճանապարհ - Խուսափել վճարովի ճանապարհները + Նախընտրելի ավտոճանապարհ։ + Խուսափել վճարովի ճանապարհները։ Խուսափել հողածածկ ճանապարհներից - Խուսափել հողածածկ ճանապարհները + Խուսափել հողածածկ ճանապարհները։ Խուսափել լաստանավերից - Խուսափել լաստանավերը + Խուսափել լաստանավերը։ Խուսափել ավտոմայրուղիներից - Խուսափել ավտոճանապարհները + Խուսափել ավտոճանապարհները։ Առավելագույն քաշը - Նշել մեքենայի քաշը երթուղին հաշվառկելու համար + Նշել մեքենայի քաշը երթուղին հաշվառկելու համար։ Ստեղծել ուղիներ (կամ օգտագործել/փոփոխել առկա GPX ֆայլերը) կետեռի միջև հեռավորության չափման համար։ Պահպանել որպես GPX, որը կարող է օգտագործվել GPX ուղիների պլանավորման համար։ Ոչ Այո @@ -160,7 +160,7 @@ Ընտրեք կոորդինատների մուտքագրման ձեւաչափը: Դուք միշտ կարող եք փոխել այն սեղմելով Հատկություններ։ Կոորդինատների արագ մուտքագրումը Խուսափել սառույցի ճանապարհներից, ծանծաղուտ - Խուսափել սառույցի ճանապարհներից և ծանծաղուտներից + Խուսափել սառույցի ճանապարհներից և ծանծաղուտներից։ Օգտագործել դիրքը Ավելացրեք ձեր դիրքը, որպես առաջին կետ, երթուղին կատարյալ պլանավորելու համար։ Իմ դիրքը @@ -184,13 +184,13 @@ Դասավորել ըստ: Ընտրեք, թե ինչպես ցույց տա քարտեզի էկրանին մարկերները քարտեզագրելու հեռավորությունը եւ ուղղությունը: Քարտեզի կողմնորոշման շեմը - "Ընտրեք ստորեւ, թե ինչ արագության հասնելուց քարտեզի կողմնորոշումը կպոխվի \"Շարժման ուղղություն\" դեպի «Կողմնացույց»" + "Ընտրեք ստորեւ, թե ինչ արագության հասնելուց քարտեզի կողմնորոշումը կպոխվի \"Շարժման ուղղություն\" դեպի «Կողմնացույց»։" Բոլոր Մարկերները տեղափոխվել են պատմություն Քարտեզի Մարկերները տեղափոխվել են պատմություն Քարտեզի Մարկերները տեղափոխվեցին ակտիվ Ցուցակ Խմբեր - Անցավ `%1$s + Վերջին օգտագործված` %1$s Ակտիվացնել Այսօր Երեկ @@ -200,7 +200,7 @@ Հեռավորության ցուցիչ Դասավորել ըստ Մի օգտագործեք անիմացիաները - Անջատում է անիմացիաները + Անջատում է անիմացիաները։ Ցուցադրել քարտեզի վրա Ելք առանց պահպանման? Գիծ @@ -251,10 +251,10 @@ \nԴա անելու համարանհրաժեշտ է տեղադրել Mapillary ծրագիրը Google Play խանութից:" Առցանց լուսանկարներ Ավելացնել լուսանկարներ - Այս վայրի համար լուսանկարներ չունենք + Այս վայրի համար լուսանկարներ չունենք։ Նպաստել այս դիրքի համար ձեր սեփական փողոցային դիտարկումներով Mapillary- ի միջոցով: Mapillary վիջեթը - Թույլ է տալիս արագորեն նպաստել Mapillary-ին + Թույլ է տալիս արագորեն նպաստել Mapillary-ին։ Առցանց փողոցային նկարներ բոլորի համար: Բացահայտեք վայրերը, համագործակցեք, նկարեք աշխարհը: Մափիլարի(Mapillary) Փողոցային նկարներ բոլորի համար: Բացահայտեք վայրերը, համագործակցեք, նկարեք աշխարհը: @@ -262,7 +262,7 @@ Նորից որոնեք Ավելացնել որոնման շառավղը Ոչինչ չի գտնվել :( - "Փոխել հարցումը կամ ավելացնել որոնման շառավիղը" + "Փոխել հարցումը կամ ավելացնել որոնման շառավիղը։" Ցույց տալ/թաքցնել OSM նշումները Ցույց տալ OSM նշումները Թաքցնել OSM նշումները @@ -278,7 +278,7 @@ Գունային սխեմա Ցուցադրել խոշորացման մակարդակից Թույլ տալ մասնավոր մուտք - Թույլ տալ մուտք մասնավոր սեփականության + Թույլ տալ մուտք մասնավոր սեփականության։ Մեծացնել՝ %1$s Խմբի անունը Փոխել գույնը @@ -300,14 +300,14 @@ Ավելացնել նպատակակետ Փոխարինել նպատակակետը Ավելացնել առաջին միջանկյալ կետը - Գործողությունների կոճակը հպելով, ավելացննում նպատակակետ էկրանի կենտրոնում։ Մինչ այդ ընտրած նպատակակետը կդառնա միջանկյալ կետը։ + Գործողությունների կոճակը հպելով, ավելացննում նպատակակետ էկրանի կենտրոնում։ Մինչ այդ ընտրած նպատակակետը կդառնա միջանկյալ կետ։ Գործողությունների կոճակը հպելով, տեղափոխում նպատակակետը էկրանի կենտրոն։ Գործողությունների կոճակը հպելով, ավելացննում է առաջին միջանկյալ կետ էկրանի կենտրոնում։ Ծածկույթի քարտեզը անջատված է Նեքեվի շերնը անջատված է Սխալ Բաժանորդագրվեք մեր էլեկտրոնային փոստի առաքմանը `OsmAnd զեղչերի մասին եւ ստացիր 3 լրացուցիչ քարտեզների ներբեռնում: - Եզրագծեր եւ ծովային խորության կետեր։ + Քարտեզներ, որոնք պարունակոմ են եզրագծեր և ծովային խորության կետեր։ Շնորհակալություն ծովային խորքային ուրվագծերի ձեռքբերման համար: Ծովային խորքային ուրվագծեր Ծովային խորքային ուրվագիծը @@ -328,7 +328,7 @@ Կարճ երթուղիները Հավասարակշռված նախընտրում անընդմեջ - Նախընտրելի տեղանք`հարթ կամ լեռնոտ + Նախընտրելի տեղանք`հարթ կամ լեռնոտ։ Լանջ Ավելացնել նոր թղթապանակ Կետ(եր)ը հաջողությամբ ջնջված է: @@ -357,8 +357,8 @@ Ընդհանուր հեռավորությունը Ընտրել բարձունքների տատանումը Օգտագործել բարձրության տվյալները - Օգտագործել բարձրության տվյալներ տրամադրված SRTM, ASTER և EU-DEM - Ցույց տալ խորության տվյալները + Օգտագործել բարձրության տվյալներ տրամադրված SRTM, ASTER և EU-DEM։ + Ցույց տալ խորության տվյալները։ Ծովային խորքային ուրվագծեր Եզրագծերի խտությունը Եզրագծերի խտությունը @@ -372,7 +372,7 @@ Հին որոնման տեսակը Ցույց տալ հին որոնման տեսակը Թույլատրել ավտոմայրուղիներ - Թույլատրել ավտոմայրուղիներ + Թույլատրել ավտոմայրուղիներ։ Դուք կարող եք վերբեռնել ձեր OSM Նշումը անանուն կամ ձեր OpenStreetMap.org պրոֆիլի միջոցով: Վիքիպեդիայի հոդվածներ Որոնել քաղաք կամ երկիր @@ -428,19 +428,19 @@ Ազատ տեղ OsmAnd-ը կպահպանի տվյալները (քարտեզներ, երթուղիներ և այլն) %1$s։ Տալ թույլտվություն - "Միացնել Իմ Դիրքի անիմացումը քարտեզի համայնապատկերում նավիգացիայի ժամանակ" + "Միացնել Իմ Դիրքի անիմացումը քարտեզի համայնապատկերում նավիգացիայի ժամանակ։" Ծովային խորության կետերը հարավային կիսագնդում Ծովային խորության կետերը հյուսիսային կիսագնդում OsmAnd հավաքում է միայն այն տեղեկատվությունները, որոնք վերաբերվում են հավելվածին օգտագործման։ Ձեր դիրքը երբեք չի ուղարկվի, ոչ էլ այն, ինչ դուք մուտք եք գործել հավեվածում կամ ձեր դիտած, որոնման և ներբեռնելու տարածքների մանրամասները: - Չցուցադրել հավելվածի զեղչերի և տեղական միջոցառման հատուկ հաղորդագրությունները - "Սկսել նոր սեգմենտ 6 րոպեանոց ընդմիջումից հետո, նոր տրեկ 2 ժամանոց ընդմիջումից հետո կամ նոր ֆայլ երկարատև ընդմիջումից հետո (եթե ամսաթիվը փոխվել է):" + Չցուցադրել հավելվածի զեղչերի և տեղական միջոցառման հատուկ հաղորդագրությունները։ + Սկսել նոր սեգմենտ 6 րոպեանոց ընդմիջումից հետո, նոր տրեկ 2 ժամանոց ընդմիջումից հետո կամ նոր ֆայլ երկարատև ընդմիջումից հետո (եթե ամսաթիվը փոխվել է): Եզրագծերի գունային սխեման Նվազագույն արագությունը մուտքագրելու համար - Ֆիլտր: Նշանակել նվազագույն արագություն կետի համար + Ֆիլտր՝ Նշանակել նվազագույն արագություն կետի համար։ Նվազագույն տեղաշարժը մուտքագրելու համար - Ֆիլտր: Նշանակել նվազագույն հեռավորությունը կետի համար վերջին դիրքից + Ֆիլտր՝ Նշանակել նվազագույն հեռավորությունը կետի համար վերջին դիրքից։ Նվազագույն ճշգրտությունը մուտքագրելու համար - Ֆիլտր: Նշանակել նվազագույն ճշգրտություն կետի համար + Ֆիլտր՝ Նշանակել նվազագույն ճշգրտություն կետի համար։ Սուրբ Ծննդյան եւ Ամանորյա տոների նախօրեին դուք կարող եք ընտրել Սուրբ Ծնունդի հետ կապված POI-ների ցուցադրումը՝ տոնածառեր, տոնավաճառներ և այլն: Բաց-շագանակագույն Մուգ շագանակագույն @@ -449,12 +449,12 @@ Transliterate անունները Ստացեք երթուղիներ եւ հայտնաբերեք նոր վայրեր առանց ինտերնետ կապի Գտնել իմ դիրքը - Չստուգել թարմացումների համար կամ թարմացումներ կապված OsmAnd-ի զեղչեր հետ + Չստուգել թարմացումների համար կամ թարմացումներ կապված OsmAnd-ի զեղչեր հետ։ Չցուցադրել թարմացումներ Ցանկանում եք թարմացնել բոլոր քարտեզները հիմա? "Ջնջել բոլոր տայլերը" Վառելիք տնտեսող ճանապարհ - Կիրառել վառելիք տնտեսող ճանապարհ (սովորաբար ավելի կարճ) + Կիրառել վառելիք տնտեսող ճանապարհ (սովորաբար ավելի կարճ)։ Վստահ եք, որ ցանկանում եք փոխարինել սիրածները %1$s? Վերգետնյա օբյեկտներ Փոխել @@ -475,7 +475,7 @@ Բաց է 24/7 Հիշողություն քարտ Կոորդինատների ձևաչափ - Աշխարհագրական կոորդինատների ձևաչափ + Աշխարհագրական կոորդինատների ձևաչափ։ Ավտոբուսը Գնացք Ընթացիկ տրեկ @@ -483,28 +483,28 @@ Տեղափոխել մարկերը դիրքը Տեքաշարժեք քարտեզը որպեսզի փոխեք մարկերի դիրքը Բաժանորդագրվեք մեզ - Ձայնով ազդարարել նպատակակետի ուղղութունը - "Միացնել նավիգացիան հաշվը առնելով OsmAnd Live թարմացումները" + Ձայնով ազդարարել նպատակակետի ուղղութունը։ + "Միացնել նավիգացիան հաշվը առնելով OsmAnd Live թարմացումները։" OsmAnd Live նավիգացիա Նպատակը սահմանված չէ Մագնիսական կրող Երթուղին դադարեցնելուց հետո երթուղու վերահաշվարկ չի կատարվում - Կանխել երթուղու ավտոմատ վերահաշվարկը երթուղին դադարեցնելուց հետո + Կանխել երթուղու ավտոմատ վերահաշվարկը երթուղին դադարեցնելուց հետո։ Չվերահաշվարկել երթուղին հակառակ ուղղության համար - Կանխել երթուղու ավտոմատ վերահաշվարկը հակառակ ողղությամբ շարժվելու ժամանակ + Կանխել երթուղու ավտոմատ վերահաշվարկը հակառակ ողղությամբ շարժվելու ժամանակ։ Smart ավտո-հայտարարում Թույլ տալ որոշել գտնվելու վայրը Կիսել OsmAnd-ի միջոցով Ուղղության ձայնային նշում - Նշեք թրթռանքով նպատակակետի ուղղութունը - Տեղեկացնել միայն նպատակակետի ուղղությունը փոխվելուց + Նշեք թրթռանքով նպատակակետի ուղղութունը։ + Տեղեկացնել միայն նպատակակետի ուղղությունը փոխվելուց։ Ավտո-հայտարարոման ժամանակաշրջան - Նվազագույն ժամանակահատվածը հայտարարությունների միջև + Նվազագույն ժամանակահատվածը հայտարարությունների միջև։ Սկզբնադիր գույնը Ընտրե’ք կատեգորիան Մուտքագրեք անուն Մուտքագրեք կատեգորիան - Մուտքագրեք նկարագրություն + Մուտքագրեք նկարագրություն: Քարտեզը կապված է գտնվելու վայրի հետ Փակել ցանկը Ընդլայնված ցուցակ @@ -532,10 +532,10 @@ Խմբի ID Միանալ OsMo Խմբեր - Ավտոմատ սկսել ուղևորությունը և ուղարկել դիրքը հավելվածի գործարկելուց հետո + Ավտոմատ սկսել ուղևորությունը և ուղարկել դիրքը հավելվածի գործարկելուց հետո: Ավտոմատ սկսել ուղևորությունը Տրեկերի ID - Սեղմեք տրեկերի ID դիտելու համար + Սեղմեք տրեկերի ID դիտելու համար: Մականուն Փոխանցել գտնվելու վայրը OpenStreetMap Մոնիտորինգ @@ -544,7 +544,7 @@ Տեղափոխել ներքև "Ավարտել նավարկությունը" Խուսափել ճանապարհներից - Տվյալների պահպանման համար ընտրված թղթապանակը միայն կարդալու է:Փոխարենը ժամանակավորապես կկիրառվի ներքին հիշողությունը: Խնդրում ենք ընտրել համապատասխան պահպանման վայր: + Տվյալների պահպանման համար ընտրված թղթապանակը միայն կարդալու է: Փոխարենը ժամանակավորապես կկիրառվի ներքին հիշողությունը: Խնդրում ենք ընտրել համապատասխան պահպանման վայր: Համատեղ հիշողություն Վերին վահանակ Լրիվ հաշվետվությունում @@ -556,18 +556,18 @@ OSM քարտեզագրողների վարկանիշը OsmAnd Live բաժանորդագրություն Բաժանորդագրվել - Նա անհրաժեշտ է մեզ, որպեսզի ձեզ տրամադրել տեղեկատվություն ներդրումների մասին + Նա անհրաժեշտ է, որպեսզի ձեզ տրամադրել տեղեկատվություն ներդրումների մասին: Հանրային անուն Մի ցուցադրեք իմ անունը զեկույցներում Աջակցվող տարածաշրջան Ամսավճար - Ամսական վճար + Ամսական վճար: Ակտիվ Ոչ ակտիվ Խնդրում ենք մուտքագրեք ճիշտ E-mail հասցեն Մուտքագրեք անուն Շնորհակալություն ավտոմատ թարմացումներին բաժանորդագրվելու համար! - Ձեր նվիրատվության մի մասը կուղարկվի OpenStreetMap նախագծի մասնակիցներին, ովքեր փոփոխություններ են կատարել այս տարածաշրջանի քարտեզի վրա + Ձեր նվիրատվության մի մասը կուղարկվի OpenStreetMap նախագծի մասնակիցներին, ովքեր փոփոխություններ են կատարել այս տարածաշրջանի քարտեզի վրա: Բաժանորդագրության պարամետրերը Խնդրում ենք նախ ձեռք բերեք OsmAnd Live բաժանորդագրությունը Ընտրեք մարկերը @@ -583,7 +583,7 @@ Ավելացնել մարկերներին Ընտրել մարկերներ Հակառակ դասավորություն - Քարտեզի վրա օգտագործեք մարկերներ + Քարտեզի վրա օգտագործել մարկերներ։ Ջնջել բոլոր ակտիվ մարկերները? Մաքրել մարկերները պատմությունից? Ակտիվ մարկերներ @@ -614,13 +614,13 @@ Live թարմացումներ Հասանելի քարտեզներ Ընտրեք ձայնային ուղեցույց - Ընտրեք կամ ներբեռնեք ձեր ձայնային ուղեցույցի լեզոոն - Ընտրեք ճանապարհներ, որոնք ցանկանում եք խուսափել նավարկության ժամանակ + Ընտրեք կամ ներբեռնեք ձեր ձայնային ուղեցույցի լեզոոն։ + Ընտրեք ճանապարհներ, որոնք ցանկանում եք խուսափել նավարկության ժամանակ։ Ձայն Ցանկալի է անջատել պոլիգենների ցուցադրումը։ "Clip երկարությունը" Յուրաքանչյուր ձայնագրված տեսահոլովակի(clip) երկարությունը չի նշանակվի ավելի երկար ընտրված ժամանակահատվածից - Հիշողության ծավալը, որը կարող է զբաղեցված լինի բոլոր clips-ներով + Հիշողության ծավալը, որը կարող է զբաղեցված լինի բոլոր clips-ներով։ Հեռավորություն։ Ժամանակ՝ Ձիոյու երթուղիներ @@ -630,18 +630,18 @@ Ցածր որակ Բարձր որակ Տեսանյութի որակը - Ընտրեք տեսանյութի որակը + Ընտրեք տեսանյութի որակը։ Ձայնի ձևաչափ - Ընտրեք ձայնի ձևաչափ + Ընտրեք ձայնի ձևաչափ։ Ձայնի bitrate - Ընտրեք ձայնի bitrate + Ընտրեք ձայնի bitrate։ Ճանապարհ Ցույց տալ քարտեզը Երթուղին հաշվարկված է Շրջագայություն Այս գործառույթն օգտագործելու համար պետք է ավելացնեք առնվազն մեկ մարկեր: Միացնել արագ գրանցումը - Ցուցադրել համակարգի ծանուցումը, որը թույլ կտա սկսել ուղեւորության գրանցումը + Ցուցադրել համակարգի ծանուցումը, որը թույլ կտա սկսել ուղեւորության գրանցումը։ Դադարեցվել է Գրանցված է Գրանցում @@ -654,10 +654,10 @@ Ներբեռնել {0} ֆայլ(եր)? Օգտագործված պահեստային տարածքը {3} ՄԲ ժամանակավոր է, {1} ՄԲ մշտապես: (Առկա է միայն {2} ՄԲ:) Ներբեռնեք {0} ֆայլ (եր)? Օգտագործված պահեստային տարածքը`{1} ՄԲ է։ (Առկա տարածքը {2} ՄԲ է:) Պահպանման տարացքի ծավալը - Խնդրում ենք նշել ճիշտ POI տեսակի կամ բաց թողնել այն - Մենյուի կոճակը բացում է Վահանակը, այլ ոչ Մենյու + Խնդրում ենք նշել ճիշտ POI տեսակի կամ բաց թողնել այն։ + Մենյուի կոճակը բացում է Վահանակը, այլ ոչ Մենյու։ Մուտք քարտեզից - \'Off\' ուղղակիորեն մեկնարկում է քարտեզը + \'Off\' ուղղակիորեն մեկնարկում է քարտեզը։ Ցույց տալ սկզբից Պատճենված է Պահպանել անցանց @@ -722,7 +722,7 @@ Քարտեզը ներբեռնված է Քարտեզի %1$s ներբեռնված է, այժմ կարող եք օգտագործել այն: Ցույց տալ քարտեզը - Սահմանում է առաջին գործարկման նշանը, չի փոխում այլ կարգավորումները + Սահմանում է առաջին գործարկման նշանը, չի փոխում այլ կարգավորումները։ Ընդօրինակում առաջին գործարկումը գեո: Ուղարկել գտնվելու վայրը @@ -735,7 +735,7 @@ Համաշխարհային քարտեզներ Ավելացնել նոր Ընտրեք կատեգորիա - Ընտրեք արագության չափման միավորնը + Ընտրեք արագության չափման միավորնը։ Արագության չափման միավորը նմ Ծովային մղոն @@ -753,10 +753,10 @@ Նավիգացիա Աշխատանք ֆոնում GPS արթնացնող ժամանակահատված - Դադարեցնել սիմուլյացիան - Խթանել ձեր դիրքորոշումը, օգտագործելով հաշվարկված երթուղին կամ գրանցված GPX երթուղին + Դադարեցնել սիմուլյացիան։ + Խթանել ձեր դիրքորոշումը, օգտագործելով հաշվարկված երթուղին կամ գրանցված GPX երթուղին։ Հասցեի որոնում - GPX ֆայլը նշումների կոորդինատներով + GPX ֆայլը նշումների կոորդինատներով։ Գտնվելու վայրերը Պլագիններ Խուսափեք բեռնատար գնացքներից @@ -864,7 +864,7 @@ Խմբագրել Տեղերը Որոնում - Ցույց տալ նկարագրությունը + Ցույց տալ նկարագրությունը։ Հաղորդագրություն A-GPS-ի վերջին տվյալները ներբեռնվել են` %1$s Շատ երկրներում (Գերմանիա, Ֆրանսիա, Իտալիա եւ այլն) արագության խցիկի մասին զգուշացումների օգտագործումը օրենքով չի թույլատրվում։ Ընտրեք «այո», միայն այն դեպքում, եթե դուք իրավասու եք օգտագործել այս հնարավորությունը: @@ -879,7 +879,7 @@ Դուք մտադիր եք ջնջել %1$d նշումներ: Համոզված եք? Դուք մտադիր եք %1$d փոփոխություններ ուղարկել OSM- ին: Համոզված եք? Ցանկանում եք մաքրել պատմությունը? - Նշեք սպասման ժամանակը երթուղու պլանավորման էկրանին + Նշեք սպասման ժամանակը երթուղու պլանավորման էկրանին։ Նավիգացիաի մեկնարկի հետաձքումը… Գնացինք ժամկետանց @@ -898,7 +898,7 @@ Բնակարանների ցուցակ Լայնությունը %1$s \nԵրկայնությունը %2$s - Հաճախակի տրվող հարցեր, վերջին փոփոխությունները և այլն + Հաճախակի տրվող հարցեր, վերջին փոփոխությունները և այլն։ Նավիգացիայի կարգավորումները Ընդհանուր կարգավորումները @@ -1073,7 +1073,7 @@ Ավտոկայանատեղ ՋՆՋԵԼ TAG-ը GPS-ի կարգավիճակը - Ներբեռնեք գիշերային հավաքները(nightly builds) + Ներբեռնեք գիշերային հավաքները(nightly builds)։ Հավաքներ Փողոցային լուսավորություն Proxy սերվեր @@ -1095,7 +1095,7 @@ Ցույց տալ հետիոտնային անցումներ Ամերիկայի ճանապարհների ատլաս "Չօգտագործել երթուղային 1.9 տարբերակը" - "Չօգտագործել երթուղային 1.9 տարբերակում ներկայացված ալգորիթմը" + "Չօգտագործել երթուղային 1.9 տարբերակում ներկայացված ալգորիթմը։" Ցանկանում եք ներբեռնել անցանց քարտեզները? Ներբեռնված քարտեզներ %1$s Ներբեռնեք նոր քարտեզ @@ -1118,7 +1118,7 @@ Ներբեռնումը հնարավոր չէ, ստուգեք ձեր ինտերնետ կապը: Բոլոր ֆայլերը թարմացավ են Օգտագործել OpenGL ներկայացնման համար - Օգտագործել ապարատային արագացում OpenGL ներկայացման համար (հնարավոր է չաշխատի որոշ սարքերի վրա) + Օգտագործել ապարատային արագացում OpenGL ներկայացման համար (հնարավոր է չաշխատի որոշ սարքերի վրա)։ Շրջանցում չի գտնվել Գլխավոր Քարտեզների համար հասանելի թարմացումներ %1$s @@ -1129,7 +1129,7 @@ Մետրոի երթուղիները %1$s պետք է այդ թույլտվությունը էկրանը անջատելու համար էներգիա խնայելու համար: Ինքնաբերաբար միացնել էկրանը մինչև շրջադարձ - Միացնել սարքի էկրանը(եթե անջատված է), երբ մոտենում եք շրջադարձին + Միացնել սարքի էկրանը(եթե անջատված է), երբ մոտենում եք շրջադարձին։ Խուսափել ճանապարհներից… Գնացքների երթուղիները Տրամվայների երթուղիները @@ -1173,28 +1173,28 @@ Դադարեցնել GPS-ի աշխատանքը ֆոնային ռեժիմում? Դադարեցնել Միշտ հարցնել - Ընտրեք ժամանակի ընդմիջումը տրեկի գրանցման համար (ներառյալ GPX գրանցումը վիջեթի միջոցով քարտեզի վրա) + Ընտրեք ժամանակի ընդմիջումը տրեկի գրանցման համար (ներառյալ GPX գրանցումը վիջեթի միջոցով քարտեզի վրա)։ Ընդհանուր ժամանակի ընդմիջումը GPS-ի զարթմատ ժամանակի ընդմիջումը Միացնել GPS ֆոնի ռեժիմը Գրանցել տրեկը GPX ֆայլի տեքով Տրեկի գրանցումը ըստ պահանջի - Ընդհանուր դիրքի գրանցումը GPX ֆայլի տեսքով կարող եք միացնել կամ անջատել GPX վիջետի միջոցով քարտեզի էկրանից - "Պահպանել ընթացիկ տրեկը SD-քարտի վրա հիմա" + Ընդհանուր դիրքի գրանցումը GPX ֆայլի տեսքով կարող եք միացնել կամ անջատել GPX վիջետի միջոցով քարտեզի էկրանից։ + "Պահպանել ընթացիկ տրեկը SD-քարտի վրա հիմա։" Պահպանել ընթացիկ GPX տրեկը Նավիգացիայի ընթացքում ավտոմատ գրանցել տրեկը - Նավիգացիայի ընթացքում GPX տրեկները ինքնաբերաբար կպահպանվեն տրեկների թղթապանակում + Նավիգացիայի ընթացքում GPX տրեկները ինքնաբերաբար կպահպանվեն տրեկների թղթապանակում։ Մուտքագրման ժամանակի ընդմիջումը Նավիգացիայի ընթացքում մուտքագրման ժամանակի ընդմիջումը - Ընտրեք մուտքագրման ժամանակի ընդմիջումը նավիգացիայի ընթացքում - Ընտրեք ձայնային ուղեցույցի լեզուն նավիգացիայի համար + Ընտրեք մուտքագրման ժամանակի ընդմիջումը նավիգացիայի ընթացքում։ + Ընտրեք ձայնային ուղեցույցի լեզուն նավիգացիայի համար։ Ձայնի ուղեցույց - Միացնել HTTP Proxy սերվեր - Կարգավորել HTTP Proxy սերերը բոլոր ցանցային հարցումների համար + Միացնել HTTP proxy սերվեր + Կարգավորել HTTP proxy սերերը բոլոր ցանցային հարցումների համար։ Proxy սերվերի հասցեն - Կարգավորեք Ձեր proxy սեվերի անունը(օրինակ 127.0.0.1) + Կարգավորեք Ձեր proxy սեվերի անունը(օրինակ 127.0.0.1)։ Proxy սերվերի պորտը - Կարգավորեք proxy սերվերի պորտի համարը (օրինակ, 8118) + Կարգավորեք proxy սերվերի պորտի համարը (օրինակ, 8118)։ ժամ Տևողություն Հեռավորություն @@ -1220,7 +1220,7 @@ Շարունակել նավարկությունը Կասեցնել նավիգացիյան Պահել - Նախընտրելի լեզուն նշաններ համար քարտեզի վրա (եթե այն հասանելի չէ, ապա անգլերեն կամ տեղական անուններ) + Նախընտրելի լեզուն նշաններ համար քարտեզի վրա (եթե հասանելի չէ, ապա անգլերեն կամ տեղական անուններ)։ Քարտեզի նախընտրելի լեզուն Տեղական անուններ Սուահիլի @@ -1251,7 +1251,7 @@ Խումբը ստեղծելուց առաջ կարդացեք! Չհաջողվեց մուտք գործել OsMo "OsMo կետերի %1$s ներբեռնված է:" - Ավտոմատ կերպով միանալ ծառայությանը, երբ ծրագիրը սկսվում է + Ավտոմատ կերպով միանալ ծառայությանը, երբ ծրագիրը սկսվում է։ Ավտոմատ միացում "OsMo Ծառայություն" OsMo track %1$s ներբեռնված է: @@ -1262,7 +1262,7 @@ Բաժանման ընդմիջումի ժամանակը Դասակարգել ըստ հեռավորությանը Դասակարգել ըստ անունի - Ցուցադրել խոշորացման կոճակները նավիգացիայի ընթացքում + Ցուցադրել խոշորացման կոճակները նավիգացիայի ընթացքում։ Ցույց տալ խոշորացման կոճակները Պահպանել որպես «Սիրված» խումբ Ընտրեք նպատակակետերը @@ -1302,7 +1302,7 @@ Օգտագործողը %1$s միացել է խմբին %2$s Օգտագործող %1$s լքեց խումբը %2$s Ցույց տալ խմբային ծանուցումները - Ցույց տալ հաղորդագրություններ, երբ օգտվողը միանում է կամ թողնում խումբը + Ցույց տալ հաղորդագրություններ, երբ օգտվողը միանում է կամ թողնում խումբը։ Հետևել Մուտք գործել Խմբեր ստեղծելու համար դուք պետք է OsMo գրանցված օգտագործող լինեք։ @@ -1356,7 +1356,7 @@ Դադարեցնել նիստը Սեմինարի մեկնարկ Կարգավորող տեղեկություններ - Մոնիտորինգի պարամետրերի ստեղծում և անձնական մոնիտորինգի ալիք ստեղծելու համար + Մոնիտորինգի պարամետրերի ստեղծում և անձնական մոնիտորինգի ալիք ստեղծելու համար։ ՕսՄօ(OsMo) Ցուցադրել դիրքը էկրանի կենտրոնում Ձայն @@ -1431,11 +1431,11 @@ Ցանկանում եք օգտագործել նավարկության համար ցուցադրված track-ը? Ավելացնել որպես նպատակակետ Խուսափել աստիճաններից - Խուսափել աստիճաններից + Խուսափել աստիճաններից։ Խուսափել սահմանի հատմանը - Խուսափել սահմանի հատման մեկ այլ երկրի հետ + Խուսափել սահմանի հատման մեկ այլ երկրի հետ։ Բարձրության սահմանափակում - Նշեք մեքենայի բարձրությունը երթուղու հաշվարկի համար + Նշեք մեքենայի բարձրությունը երթուղու հաշվարկի համար։ Տեղանքի ռելիեֆի(Hillshade) շերտը անջատված է Android 4.4 (KitKat) տարբերակից սկսած քարտը չեք կարող բեռնել և թարմացնել հին պահեստային ֆոլդերում (% s): Ցանկանում եք փոխել գտնվելու վայրը վավեր վայրով և պատճենել բոլոր OsmAnd ֆայլերը? \n…Ծանոթագրություն 1. Ձեր հին ֆայլերը կմնան անփոփոխ (բայց կարող են ջնջվել ձեռքով): @@ -1447,13 +1447,13 @@ Բեռնատար Նավարկության կարգավորումները Երթուղու կարգավորումները - Որոշեք արտասանության արագությունը TTS համար + Որոշեք արտասանության արագությունը TTS համար։ Արտասանության արագությունը Արագ երթուղու կառուծումը չհաջողվեծ (%s), չեղյալ համարեք դանդաղ հաշվարկին վերադառնալու համար։ - Անջատեք 2 փուլային երթուղին ավտոմեքենայի նավարկության համար + Անջատեք 2 փուլային երթուղին ավտոմեքենայի նավարկության համար։ Անջատել բարդ երթուղին Նավիգացիոն նշաններ (լճակներ) - "Ընտրեք օգտվողի պրոֆիլները հավելվածում տեսանելի լինելու համար" + "Ընտրեք օգտվողի պրոֆիլները հավելվածում տեսանելի լինելու համար։" Հավելվածի պրոֆիլներ Քարտեզի ցուցադրումը Ոտքով զբոսնելն (Hiking) @@ -1487,7 +1487,7 @@ Ընտրեք առկա… Սահմանել/Խմբագրել … Կարգավորման տեղեկություններ - Ընտրեք վարելու տարածաշրջանը՝ ԱՄՆ, Եվրոպա, Մեծ Բրիտանիա, Ասիա և այլն + Ընտրեք վարելու տարածաշրջանը՝ ԱՄՆ, Եվրոպա, Մեծ Բրիտանիա, Ասիա և այլն։ Վարելու տարածաշրջանը Ճապոնիա Ամերիկայի Միացյալ Նահանգներ @@ -1496,7 +1496,7 @@ Մեծ Բրիտանիան, Հնդկաստանը և այլն Ավստրալիա Հայտարարել… - Կարգավորել հնչեցումը՝ Փողոցների անվանումների, նախազգուշացումների (պառկած ոստիկանների, «Շարժումը առանց դադարեցնելու արգելված է»), արագության տեսախցիկներ, արագության սահմանափակումներ + Կարգավորել հնչեցումը՝ Փողոցների անվանումների, նախազգուշացումների (պառկած ոստիկանների, «Շարժումը առանց դադարեցնելու արգելված է»), արագության տեսախցիկներ, արագության սահմանափակումներ։ Փողոցների անունները (TTS) Արագության սահմանափակում Արագության վերահսկման տեսախցիկներ @@ -1560,11 +1560,11 @@ Ստանդարտ քարտեզ Ճանապարհների քարտեզը Լեռնաշղթայի զբոսնում մասշտաբով (SAC) - Պատկերացնել ճանապարհը SAC մասշտաբով + Պատկերացնել ճանապարհը SAC մասշտաբով։ Ճանապարհի արտացոլումը ըստ OSMC երթուղիների - Ճանապարհի արտացոլումը ըստ OSMC երթուղիների + Ճանապարհի արտացոլումը ըստ OSMC երթուղիների։ Սահմանները - Թաքցնել տարածաշրջանային սահմանները (admin levels 5–9) + Թաքցնել տարածաշրջանային սահմանները (admin levels 5–9)։ Արագության սահմանափակումը GPX Շենքեր չեն գտնվել: @@ -1614,15 +1614,15 @@ Զբոսաշրջիկների համար Լիցքավորման կետեր "Ցույց տալ ազդանշանները…" - Ցույց տալ արագության սահմանափակումները, տեսախցիկները և արհեստական անհարթությունները (speed bumps) - Նավարկել կողմնացույցի օգնությամբ, եթե շարժման ուղղությունը հայտնի չէ + Ցույց տալ արագության սահմանափակումները, տեսախցիկները և արհեստական անհարթությունները (speed bumps)։ + Նավարկել կողմնացույցի օգնությամբ, եթե շարժման ուղղությունը հայտնի չէ։ Օգտագործեք կողմնացույցը Խուսափել ավտոմայրուղիներից - Ավտոմատ կերպով փոխել քարտեզի մասշտաբը արագությունը փոխելու դեպքում + Ավտոմատ կերպով փոխել քարտեզի մասշտաբը արագությունը փոխելու դեպքում։ Ավտո-մասշտաբ - Կապել ընթացիկ դիրքը ճանապարհին + Կապել ընթացիկ դիրքը ճանապարհին։ Կապել ճանապարհին - Ձայնային հուշումների դադար, երաժշտական նվագարկում + Ձայնային հուշումների դադար, երաժշտական նվագարկում։ Ընդհատել երաժշտությունը OsmAnd քարտեզներ և նավիգացիա OsmAnd - ճանապարհորդելու համար նավիգացիոն ծրագիր է բաց կոդով @@ -1645,8 +1645,8 @@ "OsmAnd+ (OSM Automated Navigation Directions) OsmAnd+-ը բաց կոդով նավիգացիոն ծրագիր է, որը հնարավորություն է տալիս մուտք գործել համաշխարհային OpenStreetMap (OSM) տվյալների լայն շրջանակ: Բոլոր քարտեզները (վեկտորային կամ կղմինդր) և դրա հետ կապված տվյալները կարող են պահվել հեռախոսի հիշողության քարտում անցանց օգտագործման համար: OsmAnd+-ն առաջարկում է նաև անցանց և առցանց երթուղիների ֆունկցիոնալություն, այդ թվում`մանրամասն ձայնային ուղեցույց: OsmAnd+ - հավելվածի վճարովի տարբերակն է, ձեռք բերելով այն, աջակցեկցում եք նախագծին, ֆինանսավորում եք նոր առանձնահատկությունների զարգացումը և ստանում եք վերջին թարմացումները: Հիմնական առանձնահատկություններից մի քանիսը`- Ամբողջությամբ անցանց ֆունկցիոնալությունը (պահեստավորվող վեկտոր կամ կղմինդր քարտեզներ սարքի հիշողութունում)։ - Կոմպակտ անցանց քարտեզներ ամբողջ աշխարհի համար։ - Երկրի կամ տարածաշրջանի քարտեզները անսահմանափակ ներբեռնում ուղղակիորեն հավելվածից։ - Անցանց Վիքիպեդիա տվյալներ (ներբեռնել Վիքիպեդիա POIs), տեսարժան վայրերի համար։ - Հնարավոր է մի քանի քարտեզի շերտերի կափարիչ , ինչպիսիք են GPX-ը կամ նավիգացիոն ուղիները(tracks), POI, «Սիրված»(Favorites), Եզրագծերը(Contour lines), հասարակական տրանսպորտի կանգառները, հարմարեցված թափանցիկությամբ լրացուցիչ քարտեզներ։ - Հասցեների և տեղերի (POIs) անցանց որոնում։ - Ավտոմատ կերպով երթուղու հաշվարկ միջին հեռավորությունների համար։ - Մեքենա, հեծանիվ և հետիոտն ռեժիմներ։ - Ընտրովի՝ ցերեկային / գիշերային ռեժիմների ավտոմատացված դիտում։ - Ընտրովի՝ արագություննից կախված քարտեզի ընդլայնում։ - Ընտրովի՝ քարտեզի հավասարեցում, ըստ կողմնացույցի կամ շարժման ուղղության։ - Ընտրովի՝ գծի ուղեցույց, արագության սահմանափակուման ցուցադռումը, արձանագրված և TTS ձայներ" "OsmAnd+ (OSM Automated Navigation Directions) հանդիսանում է որպեսզ քարտեզ և նավիգացիոն հավելված ազատ մուտթով բարձրորակ OpenStreetMap (OSM) տվյալներին։ Վայելեք ձայնային և օպտիկական նավիգատորի հնարավորությունները, դիտելով POIs, ստեղծեք և կառավարեք GPX track-րը, օգտագործելով եզրագծերի(contour lines) արտացոլման և բարձրությանների տեղեկատվություն (plugin-ի միջոցով), մեքենավարման, հեծանվավազքի, հետիոտների ռեժիմների միջև ընտրում, OSM խմբագրում և այլնի: OsmAnd+ - հավելվածի վճարովի տարբերակն է, ձեռք բերելով այն, աջակցեկցում եք նախագծին, ֆինանսավորում եք նոր առանձնահատկությունների զարգացումը և ստանում եք վերջին թարմացումները: Հիմնական առանձնահատկություններից մի քանիսը`" "Նավիգացիան • Աշխատում է առցանց (արագ) կամ անցանց (չկա ռոումինգի վճարներ, արտերկրում) • Ձայնային ուղեկցումը առաջնորդում է Ձեզ ճանապարհով (ձայնագրված և սինթեզված(TTS) ձայն) • Ճանապարհային ուղեցույցը, փողոցների անունները և նախատեսված ժամանման ժամանակը • Աջակցում է երթուղու միջանկյալ կետերը ձեր երթուղու վրա • Երթուղին վերահաշվարկվում է եթե դուք շեղվում եք նրանից • Դուք կարող եք որոնել Ձեր նպատակակետը ըստ հասցեյի, ըստ տեսակի (օրինակ`ավտոկանգառ, ռեստորան, հյուրանոց, բենզալցակայան, թանգարան) կամ ըստ աշխարհագրական կոորդինատների" - "Ավելացնել մենյուի ցանկում հին որոնումը" - "Վերագրանցել կլիպները(clips), երբ սահմանվաշ պահեստային ծավալը գերազանցում է" + "Ավելացնել մենյուի ցանկում հին որոնումը։" + "Վերագրանցել կլիպները(clips), երբ սահմանվաշ պահեստային ծավալը գերազանցում է։" "Քարտեզի դիտում • Ցուցադրում է ձեր դիրքը և կողմնորոշումը • Կարգավորում է քարտեզը ըստ Ձեր շարժման ուղղությամբ • Պահպանում է ձեր ամենակարևոր տեղերը «Սիրված»-ում (Favorites) • Ցուցադրում է Ձեր շուրջը գտնվող POIs (հետաքրքրության կետ) • Ցուցադրում է մասնագիտացված օնլայն սալիկներ, արբանյակային դիտում (Bing-ից), տարբեր կափարիչներ, ինչպիսիք են շրջագայությունը/նավիգացիան GPX tracks և լրացուցիչ շերտերով`հարմարեցված թափանցիկությամբ • Թույլ է տալիս ընտրել, թե ինչպես ցուցադրել անունները քարտեզի վրա`անգլերեն, տեղական կամ հնչյունական ուղղագրությամբ" "Հհարավորություն է տալիս օգտագործել OSM և Wikipedia տվյալները • Բարձրորակ տեղեկատվություն աշխարհի լավագույն համագործակցային նախագծերից • OSM տվյալներ ըստ երկրի կամ տարածաշրջանի • Վիքիպեդիա POIs, մեծ տեսարժան վայրեր դիտելու համար • Անսահմանափակ անվճար ներլցումներ, անմիջապես հավելվածից • Կոմպակտ անցանց վեկտորային քարտեզները թարմացվում են առնվազն ամիսը մեկ անգամ • Ընտրություն միջև ամբողջական տարածաշրջանային տվյալների և ճանապարհային ցանցի (օրինակ, ամբողջ Ճապոնիայն 700 ՄԲ կամ 200 ՄԲ միայն ճանապարհային ցանցի համար)" Անվտանգության հատկություններ • Լրացուցիչ ավտոմատացված օրվա/գիշերային դիտման անցում • Լրացուցիչ արագության ցուցադրման ցուցադրություն, հիշեցում, եթե այն գերազանցում է • Արագության սահմանափակումների ցուցադռումը և զգուշացում այն գերազանցելու դեպկում • Փոխանակեք ձեր գտնվելու վայրը, որպեսզի ձեր ընկերները կարողանան գտնել ձեզ @@ -1665,7 +1665,7 @@ Խուսափել չմշակված ճանապարհներից Խուսափել լաստանավերից Երթուղին կառուցման ժամանակ խուսափել… - Խուսափել վճարովի ճանապարհներից, երկաթգծերից և լաստանավերից + Խուսափել վճարովի ճանապարհներից, երկաթգծերից և լաստանավերից։ Լյումինեսցենտային երթուղիներ Քանոն Տեսակետի ուղղությունը @@ -1741,13 +1741,13 @@ Պահեք ձախ կողմում Պահեք աջ կողմում "Ընդհանուր համակարգային հիշողությունն առանձնացված հավելվածին %1$s ՄԲ (Dalvik %2$s ՄԲ, other %3$s ՄԲ)։ Համամասնական հիշողություն %4$s ՄԲ (Android-ի սահմանափակումը %5$s ՄԲ, Dalvik %6$s ՄԲ)." - Ցուցադրել միայն պոլիգոնների սահմանները + Ցուցադրել միայն պոլիգոնների սահմանները։ Պոլիգոններ Ցուցադրման ռեժիմ Քարտեզի օպտիմալացում համապատասխան պրոֆիլի համար Ընտրեք նվազագույն մասշտաբի մակարդակը եզրագծերի համար (նախ պետք է ներբեռնեք համապատասխան SRTM ֆայլ): Ցույց տալ եզրագծերը (contour lines) - Քարտեզի վրա ցույց տալ ավելի շատ մանրամասներ + Քարտեզի վրա ցույց տալ ավելի շատ մանրամասներ։ Ավելի մանրամասն Routing-ի տվյալներ Ձևաչափ @@ -1758,7 +1758,7 @@ Որոնում «Սիրված»-ում(Favorites) OsmAnd անցանց նավարկությունը ժամանակավորապես հասանելի չէ: Ձախակողմյան նավարկություն - Ընտրեք ձախակողմյան երթևեկող երկրների համար + Ընտրեք ձախակողմյան երթևեկող երկրների համար։ "Սխմեք ցանկացած տարր,տեսնել ավելի մանրամասն տեղեկություններ տեսնելու համար, սխմեք և երկար պահեք`անջատելու կամ ջնջելու համար: Սարքի ընթացիկ տվյալները (%1$s ազատ է)՝" Մեկնարկի դիքը դեռ որոշված չէ Որոշում ենք գտնվելու վայրը @@ -1768,13 +1768,13 @@ "Հիմնական քարտեզը անհրաժեշտ է հավելվածի ճիշտ աշխատանքի համար և ավտոմատ ընտրված է ներբեռնելու համար:" Առցանց և քեշավորված քարտեզներ (tile maps) Ստանդարտ քարտեզներ (վեկտորային) - "Քարտեզների ֆայլերը ներբեռնում և կառավարում ձեր սարքում" + "Քարտեզների ֆայլերը ներբեռնում և կառավարում ձեր սարքում։" "Միացրեք առցանց քարտեզների plugin-ը տարբեր քարտեզային աղբյուրներ ընտրելու համար" Առցանց քարտեզներ - Օգտագործեք առցանց քարտեզներ (ներբեռնեք և քեշավորեք սալիկներ(tiles) SD քարտում) - «Կարգավորումներ» առցանց քարտեզների և շերտերի(tile) աղբյուրների + Օգտագործեք առցանց քարտեզներ (ներբեռնեք և քեշավորեք սալիկներ(tiles) SD քարտում)։ + «Կարգավորումներ» առցանց քարտեզների և շերտերի(tile) աղբյուրների։ Պլագիններ - Plugins-ը ակտիվացնում է հավելվածի լրացուցիչ հնարավորությունները + Plugins-ը ակտիվացնում է հավելվածի լրացուցիչ հնարավորությունները։ Պլագիններ Վեկտորային քարտեզները կարող են ավելի արագ ցուցադրվել: Բոլոր սարքերը չեն աջակցում: Ընտրեք ձայնը և ստուգեք աշխատեցնելով հրահանգները @@ -1788,12 +1788,12 @@ Նշեք OSM-ի օգտվողի անունը և գաղտնաբառը, GPX ֆայլերը OpenStreetMap-ին վերբեռնելու համար: Աջակցում Աջակցել նոր հատկությունների զարգացումը - Նվիրատվություն կատարեք նոր հատկությունները հավելվածում տեսնելու համար + Նվիրատվություն կատարեք նոր հատկությունները հավելվածում տեսնելու համար։ Ցույց տալ սանդղակը Տեղեկատվություն Վերադառնալ Հատուկ հնարավորությունների ռեժիմ - Միացնում է հատուկ հնարավորություններ + Միացնում է հատուկ հնարավորություններ։ Օգտագործել համակարգի պարամետրերը Վերադառնալ «Մենյուին» Մանրացնել @@ -1831,13 +1831,13 @@ "Աշխարհայացքով (Sidewise) (8 հատված)" ժամացույցի սլաքի ուղղությամբ (12 հատված) Ուղղության ոճը - "Ընտրեք հարաբերական ուղղությունները ոճը արտահայտելու համար շարժվելու ընթացքում" + "Ընտրեք հարաբերական ուղղությունները ոճը արտահայտելու համար շարժվելու ընթացքում։" Ավտոմատ հայտարարել Դադարեցնել ավտո հայտարարությունը Ես այստեղ եմ - "Փոխել քարտեզի սանդղակը trackball-ի հորիզոնական շարժումների հետ" + "Փոխել քարտեզի սանդղակը trackball-ի հորիզոնական շարժումների հետ։" Օգտագործել trackball-ը մասշտաբը փոխելու համար - Մատչելիության հետ կապված «Կարգավուրումներ» + Մատչելիության հետ կապված «Կարգավուրումներ»։ Մի քիչ շուտ Սովորական Ուշացումով @@ -1846,9 +1846,9 @@ Որքան շուտ եք ուզում հայտարարել ժամանելու մասին? Սխալ. գործընթացի անբավարար հիշողություն քարտեզի ցուցադրման համար Լյումինեսցենտային գույներ - Օգտագործեք լյումինեսցենտային գույներ, track-ի և երթուղիների ցուցադրելու համար + Օգտագործեք լյումինեսցենտային գույներ, track-ի և երթուղիների ցուցադրելու համար։ Անցանց խմբագրում - Միշտ օգտագործել անցանց խմբագրումը + Միշտ օգտագործել անցանց խմբագրումը։ POI-ի փոփոխությունը հավելվածի մեջ չի ազդում ներբեռնված POI-րի վրա, փոփոխությունները պահպանվում են տեղական ֆայլում: Վերբեռնուն … {0} POI/Նշումները վերբեռնվեցին @@ -1857,10 +1857,10 @@ Ջնջել փոփոխությունները Asynchronous OSM խմբագրում՝ Անցանց(տեղում) պահպանված OSM POIs/Նշումները - Ցույց տալ և կառավարել OSM POIs/Նշումները, որոնք տեղադրված են տեղական տվյալների բազայում - Նշել առցանց դիտարկման ժամանակահատվածը + Ցույց տալ և կառավարել OSM POIs/Նշումները, որոնք տեղադրված են տեղական տվյալների բազայում։ + Նշել առցանց դիտարկման ժամանակահատվածը։ "Առցանց վերահսկողության ժամանակահատված" - Նշեք կայքի հասցեն`պարամետրերի շարադրանքով` lat={0}, lon ={1}, timestamp ={2}, hdop ={3}, բարձրությունը ={4}, արագ ={5}, bearing={6} + Նշեք կայքի հասցեն`պարամետրերի շարադրանքով` lat={0}, lon ={1}, timestamp ={2}, hdop ={3}, բարձրությունը ={4}, արագ ={5}, bearing={6}։ Առցանց հսկողության վեբ կայքի հասցեն Ժամանակային բուֆեր առցանց դիտարկման համար "Նշեք ժամանակի բուֆերը, դիրքերի պահպանման համար ցանցի բացակայության դեպքում" @@ -1868,7 +1868,7 @@ Ցուցադրել ընթացիկ երթուղին Այս անվճար OsmAnd-ի տարբերակը սահմանափակվում է %1$s ներբեռնումով և չի աջակցում անցանց Վիքիպեդիա հոդվածները: Անվճար տարբերակ - Ցույց տալ POI նկարագրությունը + Ցույց տալ POI նկարագրությունը։ Հյուսիսային Ամերիկա Եվրոպա - Նիդերլանդներ Հյուսիսային Ամերիկա - Միացյալ Նահանգներ @@ -1890,14 +1890,14 @@ «Սիրված»(Favorites) ֆայլը արդեն գոյություն ունի: Ցանկանում եք փոխարինել այն? Պրոֆիլի կարգավորումները Նավիգացիա - Նշեք նավարկության ընտրանքները + Նշեք նավարկության ընտրանքները։ Ընդհանուր «Կարգավորումներ» Քարտեզների կառավարում Ընդհանուր - Էկրանի պարամետրերը, տեղայնացում, միավորներ և այլն + Էկրանի պարամետրերը, տեղայնացում, միավորներ և այլն։ Հավելվածի ընդհանուր կարգավորումները Ձեր OSM օգտվողի անունը (user name) - Նշեք OSM-ի օգտվողի անունը (պահանջվում է OSM-ի հետ աշխատելու համար) + Նշեք OSM-ի օգտվողի անունը (պահանջվում է OSM-ի հետ աշխատելու համար)։ Ձեր OSM գաղտնաբառը Ֆոնային ռեժիմ Միացնում է OsmAnd-ը ֆոնային ռեժիմում երբ էկրանը անջատված է @@ -1908,7 +1908,7 @@ Քարտեզի ավտոմատ վերադարձման կարգավորումները Ընտրեք այն ժամանակը, երբ քարտեզը կվերադառնա ընթացիկ դիրքին Միայն ձեռքով (սեղմելով «սլաքը») - Կրկնել նավիգացիոն հրահանգները պարբերաբար + Կրկնել նավիգացիոն հրահանգները պարբերաբար։ Կրկնել նավիգացիոն հրահանգները Քարտեզի ավտո-վերադարձ միայն երթուղով հետեվելու ժամանակ Քարտեզի ավտո-վերադարձ ընթացիկ դիրք միայն երթուղով հետեվելու ժամանակ։ @@ -1946,11 +1946,11 @@ Երթուղին հաջողությամբ պահպանվեց \'%1$s\'։ Ֆայլի անունը՝ "Նման անվանումով Ֆայլը արդեն գոյություն ունի:" - "Կիսվել GPX ֆայլերով OSM համայնքի հետ: Նրանք կօգտագործվեն քարտեզի բարելավման համար և վերբեռնվելու են osm.org:" + Կիսվել GPX ֆայլերով OSM համայնքի հետ: Նրանք կօգտագործվեն քարտեզի բարելավման համար և վերբեռնվելու են osm.org: %1$d из %2$d օբյեկտ(ներ) հաջողությամբ վերբեռնվեց: Ուղարկել OSM-ին Մանրամասն քարտեզ - Ցույց տալ մանրամասները (ճանապարհներ և այլն), սկսած փոքր մասշտաբից + Ցույց տալ մանրամասները (ճանապարհներ և այլն), սկսած փոքր մասշտաբից։ «Սիրված» կետերը ջնջված են: "Դուք մտադիր եք ջնջել %1$d «Սիրված(ներ)» և %2$d «Սիրված» խմբեր(ը): Համոզված եք?" Տուն @@ -1969,7 +1969,7 @@ %1$d օբյեկտներից %2$d հաջողությամբ ակտիվացված է: Չկա օբյեկտներ, որ %1$s Դուք պատրաստվում եք %1$s %2$s օբյեկտ(ներ): Համոզված եք? - Քարտեզների կառավարում + Քարտեզների կառավարում։ Ակտիվացնել Անջատել Կրկնակի ներբեռնել sdcard-ից @@ -1983,10 +1983,10 @@ POI տյալներ TTS ձայն Նոր որոնում - Ընտրեք տեքստի տարրերի չափը քարտեզի վրա + Ընտրեք տեքստի տարրերի չափը քարտեզի վրա։ Տեքստի չափսը Տրամադրել տեղեկություն խնդիրների վերաբերյալ - Ցուցադրում մատուցման կատարողականը + Ցուցադրում մատուցման կատարողականը։ Բացվում են նոր տվյալները… "Դուք պատրաստվում եք օգտագործել Ինտերնետ երթուղիները, սակայն ակտիվ ինտերնետ կապ չեք ունենում:" Լեզուն չի աջակցվում @@ -2000,30 +2000,30 @@ \n\t \n\tՕգտագործելու համար ընտրեք «Մենյու»→«Քարտեզի կարգավորում»→«Քարտեզի աղբյուրը…»→«Վեկտորային քարտեր»: Ձայնային հրահանգներ - Ընտրեք ձայնային հրահանգների համար + Ընտրեք ձայնային հրահանգների համար։ Հեռախոսազանգի աուդիո (նաև ընդհատում BT) Ծանուցման հոսքը Երաժշտության հոսքը "Քարտեզի շերտը %1$s չի կարող ներբեռնված լինել հավելվածով, փորձեք կրկին տեղադրեք այն:" - "Փոխել overlay քարտեզի թափանցիկությունը" + "Փոխել overlay քարտեզի թափանցիկությունը։" Ծածկույթի թափանցիկությունը - Փոխել հիմնական քարտեզի թափանցիկությունը + Փոխել հիմնական քարտեզի թափանցիկությունը։ Հիմնական քարտեզը թափանցիկությունը Տակդիր քարտեզ… Տակդիր քարտեզ - Ընտրեք տակդիր շերտը հիմնական քարտեզի համար + Ընտրեք տակդիր շերտը հիմնական քարտեզի համար։ Կափարիչ քարտեզ… Կափարիչ քարտեզ - Ընտրեք կափարիչ շերտը հինական քարտեզի համար - Քարտեզը արդեն տեղադրված է, պարամետրերը կթարմացվեն - Ընտրեք քարտեզ տեղադրելու կամ թարմացնելու համար - Այս գործողության համար անհրաժեշտ է ինտերնետ կապ, սակայն այն մատչելի չէ + Ընտրեք կափարիչ շերտը հինական քարտեզի համար։ + Քարտեզը արդեն տեղադրված է, պարամետրերը կթարմացվեն։ + Ընտրեք քարտեզ տեղադրելու կամ թարմացնելու համար։ + Այս գործողության համար անհրաժեշտ է ինտերնետ կապ, սակայն այն մատչելի չէ։ Տեղադրել ավելին… - Առավելագույն սանդղակը(մասշտաբ) վեկտորային քարտեզների օգտագործման համար ուղղորդված քարտեզների փոխարեն + Առավելագույն սանդղակը(մասշտաբ) վեկտորային քարտեզների օգտագործման համար ուղղորդված քարտեզների փոխարեն։ Սանդղակը(մասշտաբ) վեկտորային քարտեզների օգտագործման համար - 1Online OSM2 քարտեզ նկաներով - Անցանց որոնման սխալ - Հնարավոր չէ վերլուծել հարցումը \'%s\' + 1Online OSM2 քարտեզ նկաներով։ + Անցանց որոնման սխալ։ + Հնարավոր չէ վերլուծել հարցումը \'%s\'։ Որոնում ըստ հասցեյի տեղական(offlne) քարտեզներում Համակարգային "Այս plugin-ը հարստացնում է OsmAnd նավարկության հավելվածը ինչպես նաևւ ծովային քարտեզներով նավակների համար, ծովագնացության և այլ տեսակի ջրային շրջաններում @@ -2031,10 +2031,10 @@ \nOsmAnd-ի հատուկ քարտեզների add-on-ը կտրամադրի բոլոր ծովային նավագնացության նշանները և աղյուսակը, ներքին, ինչպես նաև մոտակա նավարկության համար: Յուրաքանչյուր նավագնացության նշանի նկարագրությունը ապահովում է նրանց և դրանց իմաստը հայտնաբերելու համար անհրաժեշտ մանրամասները(կատեգորիա, ձև, գույն, հաջորդականություն, հղում և այլն): \n \nOsmAnd-ի ավանդական քարտեզի ոճերից մեկին վերադառնալու համար պարզապես կամ ապաակտիվացրեք այս հավելվածը կամ ըստ ցանկության փոխեք «Քարտեզի ոճը» «Քարտեզի կարգավորում» մենույում:" - Ընտրել ծրագրի լեզուն (Վերագործարկեք OsmAnd փոփոխությունից հետո) + Ընտրել ծրագրի լեզուն (Վերագործարկեք OsmAnd փոփոխությունից հետո)։ Տեղայնացումը (լեզուն) թերի - Երկարության և արագության չափման միավորներ + Երկարության և արագության չափման միավորներ։ Երկարության միավորները Մղոններ/ֆուտ Մղոններ/յարդեր @@ -2111,18 +2111,18 @@ Ընտրվեց {0} Ներբեռնված Արագընթաց երթուղի - Հաշվարկել արագընթաց երթուղի փոխարեն ամենակարճ + Հաշվարկել արագընթաց երթուղի փոխարեն ամենակարճ։ Ներբեռնել քարտեզ Ընտրեք առավելագույն մասշտաբ տեսանելի տարածքի ներբեռնման համար Ընտրված քարտեզը չի կարող ներբեռնված լինել Շարունակական rendering - Ընտրեք քարտեզի ցուցադրուման ձևը + Ընտրեք քարտեզի ցուցադրուման ձևը։ Քարտեզը ցուցադրելու ժամանակ անսպասելի սխալ տեղի ունեցավ Համատեքստային մենյու… Ոճը հաջողությամբ ներբեռնված է Այս ոճը տեղադրելու ընթացքում սխալ տեղի ունեցավ Վեկտորային քարտեզի մատուցման ոճ - Ընտրեք քարտեզի ցուցադրելու ոճը + Ընտրեք քարտեզի ցուցադրելու ոճը։ Դիտել POI կայքը Ցույց տալ POI հեռախոսը ֆիլտր @@ -2145,7 +2145,7 @@ Կողմնացույցի ուղղությամբ Շարժման ուղղությամբ "Չպտտել (հյուսիսը վերեվում)" - Ընտրեք քարտեզի պտտման ձևը + Ընտրեք քարտեզի պտտման ձևը։ Քարտեզի կողմնորոշումը Ցույց տալ երթուղին «Սիրվածները» հաջողությամբ ներմուծվել են @@ -2163,13 +2163,13 @@ Քարտեզի աղբյուրը… Շերտեր Որոնել POI - Քարտեզը շարժելու համար օգտագործեք trackball + Քարտեզը շարժելու համար օգտագործեք trackball։ Օգտագործել trackball Պահպանել տվյալները որպես GPX ֆայլ թե պահպանել որպես «Սիրված» կետեր? Կետեր պարունակող GPX ֆայլ չի գտնվել {0} մեջ «Սիրված» կետերը պահպանվեցին {0} մեջ "Տեղական վեկտորային(offline) քարտեզներ չեն գտնվել: Ներբեռնեք դրանք Ինտերնետից:" - Ընտրեք առավելագույն ժամանակը դիրքի որոնման համար + Ընտրեք առավելագույն ժամանակը դիրքի որոնման համար։ Սպասման ժամանակը Որտեղ եմ ես? OsmAnd նավիգացիոն ծառայությունը @@ -2177,10 +2177,10 @@ GPS վայրկյան րոպ․ - Ընտրեք արթնացման ժամանակի ընդմիջումը ֆոնային ծառայության համար + Ընտրեք արթնացման ժամանակի ընդմիջումը ֆոնային ծառայության համար։ Ֆոնային ծառայության համար ընտրել դիրքորոշման աղբյուր Դիրքորոշման աղբյուր - Միացնում է OsmAnd-ը ֆոնային ռեժիմում, ձեր գտնվելու վայրը հետեւելու համար, երբ էկրանը անջատված է + Միացնում է OsmAnd-ը ֆոնային ռեժիմում, ձեր գտնվելու վայրը հետեւելու համար, երբ էկրանը անջատված է։ Միացնում է OsmAnd-ը ֆոնին ռեժիմում OsmAnd-ի երթուղայնացման ծառայությունը միացված է, եթե անջատեք դիրքավորումը, այն կդադարի երթուղով շարժվել: Թաքցնել ֆիլտր @@ -2203,4 +2203,5 @@ Ձախ թեկվեք և շարժվեք Կտրուկ ձախ թեքվեք և շարժվեք Սահուն ձախ պահեք և շարժվեք + Վերանվանել մարկերը From 0da6a3b2d2ae441577045d48bb4266f1b9c2ad40 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Wed, 8 Nov 2017 12:24:32 +0000 Subject: [PATCH 176/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2473 of 2473 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 8df9b51367..3fa273cb3c 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -2525,7 +2525,7 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式 導航 訊息 選擇類別以儲存我的收藏。 - 選擇可選的類別。 + 選定可供選擇的類別。 POI 清單 您可以增加一個或是更多的 POI 類別顯示在地圖上。 增加一個地圖樣式 From 1d1567427487b81210f09a8eec7897ab43ecb014 Mon Sep 17 00:00:00 2001 From: iman Date: Wed, 8 Nov 2017 15:19:20 +0000 Subject: [PATCH 177/187] Translated using Weblate (Persian) Currently translated at 100.0% (2473 of 2473 strings) --- OsmAnd/res/values-fa/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 511106729c..030c934892 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -1782,7 +1782,7 @@ آیا فایل‌های دادهٔ OsmAnd نیز به مکان جدید کپی شود؟ نمی‌توان نقشه‌ها را در پوشهٔ موردنظر ایجاد کرد کپی‌کردن فایل‌ها ناموفق بود - محل زخیره‌سازی خارجی + محل ذخیره‌سازی خارجی محل ذخیره‌سازی چندکاربره حافظهٔ داخلی برنامه انتخاب دستی From 40bdf592aecee0090ef99b6dc34b40e1473f8c19 Mon Sep 17 00:00:00 2001 From: Franco Date: Wed, 8 Nov 2017 16:38:52 +0000 Subject: [PATCH 178/187] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-es-rAR/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index f37fde6dba..0fe6f9de13 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -2820,4 +2820,12 @@ Proporciona un código completo Mostrar en la barra superior Marcador ya utilizado Renombrar marcador + Cantidad de dígitos + Derecha + Izquierda + Mostrar teclado numérico + Pegar + Cambiar automáticamente al campo siguiente al ingresar %1$d dígitos después del punto decimal + %1$d dígitos + Ir al campo siguiente From 7c2c584682535a8f071ce43b8171e4b2e64a97b7 Mon Sep 17 00:00:00 2001 From: Franco Date: Wed, 8 Nov 2017 16:41:22 +0000 Subject: [PATCH 179/187] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-es-rUS/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 6a4ba8ea39..2776420252 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -2820,4 +2820,13 @@ Proporciona un código completo Modo de pantalla completa Mostrar en la barra superior Marcador ya utilizado + Cantidad de dígitos + Derecha + Izquierda + Mostrar teclado numérico + Pegar + Cambiar automáticamente al campo siguiente al ingresar %1$d dígitos después del punto decimal. + %1$d dígitos + Ir al campo siguiente + Renombrar marcador From 007b4ebcb2d44bbfa17688a5775da6c6ececcc0d Mon Sep 17 00:00:00 2001 From: Franco Date: Wed, 8 Nov 2017 16:43:19 +0000 Subject: [PATCH 180/187] Translated using Weblate (Spanish) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-es/strings.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 72f9f5a6c8..ac70542a5c 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -2754,4 +2754,13 @@ Por favor proporciona un código completo Importar como archivo GPX Importar como favoritos Importar archivo - + Cantidad de dígitos + Derecha + Izquierda + Mostrar teclado numérico + Pegar + Cambiar automáticamente al campo siguiente al ingresar %1$d dígitos después del punto decimal. + %1$d dígitos + Ir al campo siguiente + Renombrar marcador + From c2958ec2124f7d2028b52637bd28b1fd46c854f2 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Wed, 8 Nov 2017 19:06:23 +0000 Subject: [PATCH 181/187] Translated using Weblate (Sardinian) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-sc/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 8391fe4c77..49056734a4 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -2841,4 +2841,13 @@ Pro praghere iscrie su còdighe intreu Modalidade a ischermu intreu Ammustra in sa barra superiore Sinna comente coladu + Nùmeru de tzifras + Destra + Manca + Ammustra tecladu numèricu + Incolla + Cola automaticamente a su campu imbeniente a pustis de àere iscritu %1$d tzifras a pustis de sa vìrgula + %1$d tzifras + Cola a su campu imbeniente + Torra a numenare su marcadore From 9e7454d436c722b51b62e5739ccfbacbdef956ca Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Wed, 8 Nov 2017 21:41:10 +0000 Subject: [PATCH 182/187] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 3fa273cb3c..f85496483e 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -2926,4 +2926,12 @@ OsmAnd (Automated Navigation Directions) 是一個地圖和導航的應用程式 在頂列上顯示 已經過標記 重新命名標記 + 數位量 + 右方 + 左方 + 顯示數字鍵盤 + 貼上 + 在小數點後面輸入 %1$d 個數字以後,自動切換到下一段 + %1$d 個數字 + 到下一段 From 747c1ff36d38a5c7e370b9384e6995ff0a8be32b Mon Sep 17 00:00:00 2001 From: Verdulo Date: Wed, 8 Nov 2017 22:44:39 +0000 Subject: [PATCH 183/187] Translated using Weblate (Esperanto) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-eo/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 09d0e537d8..7616ff2e6f 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -2856,4 +2856,12 @@ Indikas lokon: %1$s x %2$s" Montri en supra breto Marki pasigitajn Alinomi markon + Nombro da ciferoj + Dekstre + Maldekstre + Montri nombran klavaron + Englui + Aŭtomate baskuli al sekva kampo post entajpi %1$d ciferojn post la komo + %1$d ciferoj + Iri al la sekva kampo From 07509698f461c13897e4d418e88dea14e72a97d3 Mon Sep 17 00:00:00 2001 From: iman Date: Thu, 9 Nov 2017 05:57:40 +0000 Subject: [PATCH 184/187] Translated using Weblate (Persian) Currently translated at 100.0% (2481 of 2481 strings) --- OsmAnd/res/values-fa/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 030c934892..52fd039b33 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -2931,4 +2931,12 @@ در نوار بالا نشان بده از این عبور کردم تغییر نام نشانه + تعداد ارقام + راست + چپ + نمایش صفحه‌کلید عددی + الصاق + پس از واردکردن %1$d رقم بعد از ممیز، به‌صورت خودکار خانۀ بعدی فعال شود + %1$d رقم + رفتن به خانهٔ بعدی From 89b19a95b2a528ca3dc78fd9f6a3865c35324345 Mon Sep 17 00:00:00 2001 From: sonora Date: Thu, 9 Nov 2017 07:56:39 +0100 Subject: [PATCH 185/187] update string for #4461 --- OsmAnd/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 03c1a5fe9d..caa602a0e0 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -2047,7 +2047,7 @@ Specify a time buffer to keep locations to send without connection Log track using GPX widget or via \'Trip recording\' settings. Show current track - This free OsmAnd version is limited to %1$s map downloads (including update downloads) and does not support offline Wikipedia articles. + This free OsmAnd version is limited to %1$s map downloads (to add or update maps) and does not support offline Wikipedia articles. Free version Show POI description. North America From 01e882e70cf5eeba0270a66b62853bb6efd2e72b Mon Sep 17 00:00:00 2001 From: sonora Date: Thu, 9 Nov 2017 08:25:42 +0100 Subject: [PATCH 186/187] fix strings for POI Overlay --- OsmAnd/res/values-de/strings.xml | 8 ++++---- OsmAnd/res/values/strings.xml | 8 ++++---- .../net/osmand/plus/dialogs/ConfigureMapMenu.java | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 5c9f588e18..225720d1c6 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -631,8 +631,8 @@ Favoriten OSM-Notizen (online) - POI… - Punktbezeichnungen + POI Overlay… + POI-Overlay-Bezeichnungen Kartenquelle… Kartenebenen Suche POI @@ -807,8 +807,8 @@ Blickrichtung einblenden 3D-Kartenansicht verwenden. 3D-Kartenansicht - Zuletzt gewählte POIs auf der Karte anzeigen. - POIs anzeigen + Zuletzt gewähltes POIs Overlax auf der Karte anzeigen. + POI Overlay anzeigen Online- oder Offline-Quelle für Karte (Kacheln). Kartenquelle (Kacheln) Kartenquelle diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index caa602a0e0..21952f035f 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -1198,7 +1198,7 @@ Show zoom buttons Save as group of favorites Select destinations - Point labels + POI overlay labels Loading %1$s… Current time Waypoint @@ -2340,7 +2340,7 @@ Yandex traffic Route OSM Notes (online) - POI… + POI Overlay… Map source… Map layers Search POI @@ -2492,8 +2492,8 @@ Display viewing direction Enable 3D view of the map. Map View 3D - Show POI over map (use last chosen filter). - Show POI + Show the last selected POI overlay on the map. + Show POI overlay Choose the source of online or cached map tiles. Tile map source Map source diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java index abf2e5eb5c..9bf8c5d691 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java @@ -271,6 +271,13 @@ public class ConfigureMapMenu { .setIcon(R.drawable.ic_action_info_dark) .setSecondaryIcon(R.drawable.ic_action_additional_option) .setListener(l).createItem()); + selected = settings.SHOW_POI_LABEL.get(); + adapter.addItem(new ContextMenuItem.ItemBuilder() + .setTitleId(R.string.layer_amenity_label, activity) + .setSelected(settings.SHOW_POI_LABEL.get()) + .setColor(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID) + .setIcon(R.drawable.ic_action_text_dark) + .setListener(l).createItem()); /* ContextMenuItem item = createProperties(customRules, null, R.string.rendering_category_transport, R.drawable.ic_action_bus_dark, @@ -451,13 +458,6 @@ public class ConfigureMapMenu { b.show(); } }).createItem()); - selected = settings.SHOW_POI_LABEL.get(); - adapter.addItem(new ContextMenuItem.ItemBuilder() - .setTitleId(R.string.layer_amenity_label, activity) - .setSelected(settings.SHOW_POI_LABEL.get()) - .setColor(selected ? R.color.osmand_orange : ContextMenuItem.INVALID_ID) - .setIcon(R.drawable.ic_action_text_dark) - .setListener(l).createItem()); selected = app.getSelectedGpxHelper().isShowingAnyGpxFiles(); adapter.addItem(new ContextMenuItem.ItemBuilder() .setTitleId(R.string.layer_gpx_layer, activity) From 9dba20a63d2924203750624e7f236165e5c6e3ce Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Thu, 9 Nov 2017 13:18:28 +0200 Subject: [PATCH 187/187] Add and Change icons for Markers indications. --- .../drawable-hdpi/ic_action_device_topbar.png | Bin 1064 -> 1067 bytes .../ic_action_device_topbar_two.png | Bin 0 -> 1072 bytes .../drawable-hdpi/ic_action_device_widget.png | Bin 1076 -> 1072 bytes .../ic_action_device_widget_two.png | Bin 0 -> 1076 bytes .../drawable-mdpi/ic_action_device_topbar.png | Bin 1047 -> 1047 bytes .../ic_action_device_topbar_two.png | Bin 0 -> 1051 bytes .../drawable-mdpi/ic_action_device_widget.png | Bin 1049 -> 1046 bytes .../ic_action_device_widget_two.png | Bin 0 -> 1049 bytes .../ic_action_device_topbar.png | Bin 1079 -> 1081 bytes .../ic_action_device_topbar_two.png | Bin 0 -> 1085 bytes .../ic_action_device_widget.png | Bin 1113 -> 1108 bytes .../ic_action_device_widget_two.png | Bin 0 -> 1113 bytes .../ic_action_device_topbar.png | Bin 1128 -> 1130 bytes .../ic_action_device_topbar_two.png | Bin 0 -> 1135 bytes .../ic_action_device_widget.png | Bin 1165 -> 1157 bytes .../ic_action_device_widget_two.png | Bin 0 -> 1165 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 OsmAnd/res/drawable-hdpi/ic_action_device_topbar_two.png create mode 100644 OsmAnd/res/drawable-hdpi/ic_action_device_widget_two.png create mode 100644 OsmAnd/res/drawable-mdpi/ic_action_device_topbar_two.png create mode 100644 OsmAnd/res/drawable-mdpi/ic_action_device_widget_two.png create mode 100644 OsmAnd/res/drawable-xhdpi/ic_action_device_topbar_two.png create mode 100644 OsmAnd/res/drawable-xhdpi/ic_action_device_widget_two.png create mode 100644 OsmAnd/res/drawable-xxhdpi/ic_action_device_topbar_two.png create mode 100644 OsmAnd/res/drawable-xxhdpi/ic_action_device_widget_two.png diff --git a/OsmAnd/res/drawable-hdpi/ic_action_device_topbar.png b/OsmAnd/res/drawable-hdpi/ic_action_device_topbar.png index 2ea354119c75aac1b22f64b9050d62054ec21793..6aea76546c1e5abbffea3256237854b97f65051b 100644 GIT binary patch delta 224 zcmZ3%v6^E;9Fu~Rg^{6)sgb#pi{G&`Du!>J=dhzRv p`(CCv+;2Q|oPz}lN^-aj7>*{gI~&M}Uj`b=;OXk;vd$@?2>`liK^6c2 delta 221 zcmZ3@v4Uem9Fu~DqoaYVqq(7lrG=}Zp{u#0sfC-9fvJUwfw8NJg@NnjIwl#IA_JU? zb}^-?B%34|n;Iq==$e=%C+eD*8mHd_4hj6mSa{`U0laDM$z owv^Pnr7L(iAmByt1;GS{PIVTqj87jY0!?J_boFyt=akR{0Pc4{CIA2c diff --git a/OsmAnd/res/drawable-hdpi/ic_action_device_topbar_two.png b/OsmAnd/res/drawable-hdpi/ic_action_device_topbar_two.png new file mode 100644 index 0000000000000000000000000000000000000000..55cd34bd10e2064b67f73af20754e07b95f23ca0 GIT binary patch literal 1072 zcmbVL%WKp?9FA7hmR9IN!3q*m1(oJ8*<|yeYu(*!+d#LL?Se~Bog}lnp-miU@l4FAzOw3mz+8y@*csQ9YC%3?%c&@B4nw@5$2Q+}Oy(2*WUA z_PkZ2>$U7Xf0lj^n4KNETqczUS;kG$fiYr=9(E9G2e5@|2zs0MKcH!b8A|^pQ>-k3yeJtWP|SIGEXh|WHTf%<-=rhz+j=ojs1xDIAk+M=->@f;Ao`16oRN)Jt7X1exYc|#1uv% z5F{}Ovb?(138|sKVH|6n)Hfp})=+{sVwd)#IXM8++MVnuGo;a&cVnM61+H7z-3U-f zY^%W0KZ56brl(7urZjclP!x?M*=h1f1_tyTPes5T@EnIPRU|nF)O^Xx0{|+T zp-OUDlQkWHd{Hmw23R{x2n<~`@aw_s+YGZ8 z(ezx?YpM>{$9w-d@f%L55+5 z%CmNj?xXp4;yC?(W;QqJc8-)9WC1rx+er{JVqdp;j=vk)VZ*YTesd z@eH4xxB|vAlPU-iaX=QXMyZ(<*^XY5o^!Flf)0eN6xps*jmkW*aDsr!7dQ{fI?xOr zs)jBpV?YvNK@bfADx3&S(J(~_dW)sj62EEI?3tb|dMmOmLSj=8+U+*qmU)~k3(znO zL6ihZ;wXYk*CXO&T$GOVHP|Tik{~7ljzF%_aq$`{veeUV2w_~Q94L;`UZQBqgv^Nr z$csW4=5ck+3NRYAD5PiAU?v9O;v3?v6H;1F1LWToTZtIIA}H)Fc7eDNUU-6h-3{Xvmx{xlIm9&~SX$R}u93dJf}Hmqba1YH8XoKnP2k zp^B2FNtzB}VM@2;KDQjD#ECrAw;fR1J+6Hu*R&Gk5S-L8UhQ|md#>ah;rfOyinb^ZIlFekw25*5Ogwa28VcoTu1d~N90gJgPh{23g=3?!4-7mYP#I? zo2tw9`2PQ9P@ql;dAt16K7A4G$^3XQ4D@m^PAH-?l+auwqFmNWnS!#%Aaj^zDa#03m)z>% literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/ic_action_device_topbar.png b/OsmAnd/res/drawable-mdpi/ic_action_device_topbar.png index 9fd6ca7d1880d9036185458fbbaf64505979566f..91e5a0904db73d91befa75d71ba1843628f18fdb 100644 GIT binary patch delta 178 zcmbQvF`Z*W9Fu~xv9q(Qk*lSXi|JE*9&FGRQipuz^A007E}7yLRTjU|R+t@O1TaS?83{1OOUC BF#G@j delta 178 zcmbQvF`Z*W9Fu~jsgb#b1rS+UxEdO|nmd|WxH%b^T9_CZyP8-SxK6HPl7T5Q$Ej!+ zQ<_S$Ns_UtVUmHaiCJ=@u8FB}s&1mGMT%}plChrI^HDB=FN;Z@-Q3n`byVm(m?S&Vaa7&r_VBzstlI8}ccOn}7Fl?DC*Oo*XUIk!n+s5)TDz7N08^L{?ho9nBkso5!x<4W~4 zx5d_(;=O*2eZLRv-)y-}YaO~lx^#e2%q<1P!+bqLJ>0@5*n9FBFLK;O9=1EQ(|Bn4 zBoa|!Bj!=U&>Xi|%@gErVaj{B7sj^mBwdv}DtgAwPNq<}D4nR?A%(`C=zq=u?_lk~A0$#6ejkX-|TtX-cvp zDGFc~Alr*6%0ZmXj~QH?`DvKYki>k!h&-}GZGlC4nnIK`8fV0DHYyY=nUteMf}$)% zQIXe)bw*qGZy4uVXYIWNOD&v{oz!Rj=+2M9tacYWDhydP)}u6JO+ni(@pmE|)4FR5 z?2j0PffX2XpsQU2n5wD+6`EyWC|(y}1)3=E0u4id%yS;zDLYP0skzH;1wvTUO-)uD zUC|8)D@%q`9%JiqMp5kJvG0)i9$}pev6ho!L`m8vWP3aX%|4+d>yw0coTBSGf471B zFfK0d6^%O0+r??Pi-VPvMEpsmt?-;Eu!ppujAVc-Is~e(slZbV6I2ZB=|;I5bTv;H z;e-FJpu~cbigEd8e8yL7CX4Nv7}()VPB>;7N|{(Dk9O}fp_z4eshxlIj*gG36X4RV zi5DNFUXY)QDeIR_3_!OYvIzoxk>Gu*e!lOIdH>V6^D MdTrf3Sl)d02LR4SjsO4v literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/ic_action_device_widget.png b/OsmAnd/res/drawable-mdpi/ic_action_device_widget.png index 042f8d89910452313c25a74b2e008c1494305666..3182f3c1a985e96a3214c472507382710ed6d69b 100644 GIT binary patch delta 170 zcmbQqF^ywG9Fu~xv9q(Qk(;5Di7 t29wF>nAMbgmn|0Si89DyWMxn|z%YL|i_sHL86TiDgQu&X%Q~loCIF}pE_eU{ delta 173 zcmbQnF_U9M9Fu~jsgb225L;MUxEdO|nmd|WxH%b^T9_CZyP8-SxK6HPl7T6*z^P~# zQ<_S$Ns_UtVUmHaiCJ=@u8FB}s&1mGMT%}plCh-2rrO(lP?~+Q>(Ldg&Igzp7?>GWNV1ySt2TE4RWNwE`njxgN@xNA-Tzd z2^Ka|9wiLTam&>_fk7Wr-pAcAc7&hrKL~t?9O0?nP#TGgd*S+CinsPQTESjFu#ixF z$S>zMBZx4Cd>(DbnVmbrkk@AW;#wB?p$Y9f!YHVAW0QADig{hChyf^@ykSW|w@g)g zz^e+V$ciNcO;mubShfQA@gp#ADeBlwZ*A<0ogAS@X=2OrU@(vdWr?I+8CaGjE2^xj zBC`;)-I&5$jI*T)gNL&q4HFuYm@gQiPj;vyut-NKL`kD@MjU73La~y`IZR|ADRLAQ zc@3>I+QfguIM+IB?Iu`m;*9L10qaL+X#!@oyVy}-$fB{Iq#R=o-Upk`RQqPm7^ zm;h8(Ot(D2*5i!AIKUI%A@e=L8fzC~Z8yb`lC(w0_GAh+dxVm#M-tw3i>@2|-3AQ8 zxVXGmG-{N$htu!{Mr$dF_+h2(@SG^H4|P(vnFS>m;oZP;ARQq&1?S8zp&y~32#c88@=ipT#)_QHj Jd$;=R9Fu~Dk&%I=xtWWFrG=}Zp{u#0sfC-9fvJUwfw8NJg@NnjIwl#IB4?b6 zb}^-?B%34|n;Iq==$e=%C+eD*8mHwg3PC diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_device_topbar_two.png b/OsmAnd/res/drawable-xhdpi/ic_action_device_topbar_two.png new file mode 100644 index 0000000000000000000000000000000000000000..a15f8d30548ed034d056f00d12e8cbab76d8996d GIT binary patch literal 1085 zcmbVLO>5LZ7!DPzRtojdgMtuJ4;IYFWV4$Ox|VLTwF~ZAw+k&)q?63-ZfKK<$<)mj zMDZg201x)yO%ERQ2Po*pLr;QU)SGw_5h^GYz361S+j=NH7|49Q^E~hOdvCsWadhPL z2*+`wl{u%*b|w3d9cAm{(675}J4MS&bb&N!2gaD2LBz#;C4enl#}IX|Z{aD9JCgd1 zCAw6-WO*czV1|*>AYyEeo0?7|=&fSPySU|tMPd8-OM&-MQCQ4Zm1<<;wm-KKX8UiIo&hx4Q3bJC#Kob>UDW;_WzW)i#T8x@j-I?v%Vz;8urZlo-xzp)Lot#AC zmJCeOloeH0RgodYq#IJ0ieWM_(BR<2i~WfDB;+%V&?W1%C@@cVLkOa3bx(1a^b^HW zCZ{lxfuzVmkj2$QC$x_D-8c}PG`bO%>o_6nvB&DsoEVTIMLX8N<#ExRo%WF!b=iw$E($xurw7mK|eAN!%c0ZO{etZ9+-XCJ}Gj zS=Dv^TornLm`;q#>Q@6L1*7>Zq-`DC%@kO^X$ddNmF?H=KjxaZzy}q&XW_l&)*+xjt{YG`uoh6 mknJnWAGWo94EO5MW9|rd>*4TD<45;(_E0I;oTsIgJAVOJsZZ|! literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_device_widget.png b/OsmAnd/res/drawable-xhdpi/ic_action_device_widget.png index 246aac70417b156f2061987f397aa7a71095ccc3..d7990198c4a8d70ab7f79464b6572ece3ca6885d 100644 GIT binary patch delta 266 zcmcb~afM?;9Fu~Rg`umZnT3IqiY7=kCYf6pr=_HsCQWu>ZmQool`)Bd zfuYFL#WAGf)|(p#c^ec2SRBsj>72A%6Z`hj5k3_`^@?!C5Jp2hlOH1+Lye&H UN-=(+Lkb{KPgg&ebxsLQ03C%+>;M1& delta 271 zcmcb@ag$?19Fu~Dk&%I=xw)Z*rG=}Zp{u#0sfC-9fvJUwfw8NJg@NnjIwl#IA_JU? zb}^-?B%34|n;Iq==$e=%C+eD*8mH(+<7ydnYt)lcpo_oG?zVo^_GktNO z?{ptQ5CerNy@Yo*{d$k$|LmbZckwoaCaS0$IH+MnkQlQA6Oskbn1>~3*v*@3Fh>xF z6Sq=D)#4S^3cQSw>SPix#At%ZjV7UC)gdBHIPdxz_3POSigay_niY#|G0el7JGB(S z^3rt0TB=)$O^u!>bBT%#cn}$6;w|{GnrKwZu8Pm8n4!p)3aV?=E~#p9hRg>MB*jdY zwg4}al9B{qY~Vsv9ESqX@-y~!8llqEL;y~xC6$yJJ?aGh}o!DBNrFN zSkMD&(StrJ=o*DzGPY~0w#?d+;K;Nh2ofy-g{NiCbZE!{#js6Vguv?9*$+Q1b3hk4 zeq7H2045|wWVyV=NiqQ0F*(n7umwLxhHt@+Zx{P+W4QydYCeJn3ZhC7EOfeHrWT+e zt_2~P&!<(F$g@Sma{W|zE-ln<+&YZhThN}20*`EET6Onf0Zl`+d4r{4RsytOi2`kM zvO;HNXi75g*p6sYZM^-z8DuaiCT*90+NUGJJ((W6!+*;HUe`<>eltyw2}@ Sd3x%5Dlbe->kr50?)(MTx?nB< literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_device_topbar.png b/OsmAnd/res/drawable-xxhdpi/ic_action_device_topbar.png index ea92278360c6cfb68b1e8d7d47b4a48230882554..3559edc1d6a7ec8b0cc1b26463fde9f8c178d780 100644 GIT binary patch delta 288 zcmaFC@rq+Z9Fu~jsgb#%rJIS9i>aHTp{u#2sezHRxskbrp`n?hg|qSGIwl#IB4eD2 zb}^-?q$VYrrWhw0=%$*P8|s=Qo0{k*8Ch8BnpvbKnOhjArKFiAO?F{!s?X{CmCC@t z(BbLg7*cWT&8>@^3k*l$VrG=}Zp{u#0sfC-9fvJUwfw8NJg@NnjIwl#IA|srN zb}^-?B%34|n;Iq==$e=%C+eD*8mH%vJUZ(nmTFfy@l2q-u-Ku920 z#i0Qt_@edL!N~2k8>aFWC4mJzK;)N$(Q9%h2nz!>fOSp)lOX*JoL~~DQyHuhY+jTv bBOAl>XDpN0UuHZ7I*Gy4)z4*}Q$iB}Ts%%& diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_device_topbar_two.png b/OsmAnd/res/drawable-xxhdpi/ic_action_device_topbar_two.png new file mode 100644 index 0000000000000000000000000000000000000000..3be8f835b5049769bb5656a4da14adfad2fdc5a4 GIT binary patch literal 1135 zcmbVMOK8+U7)~EZyHMC36%RvN>Z{pgvYX9=uI+Bpb{E`Q*A*88F^}19X!B??b<;hG z;K73@Z%RQA_EZEbcu^6-iwJsF5%nhcJa`qH?4v4_9t>n={y*RM|Ns1tTwPq4A4wcY zP!u&%Dryz77vpzmA6d_Qy+2R3{dl&9PkVLT)B{B2Ezdxpk=&-u(BesG1kIkE-S`DgQlY99 z3R)III4jBm$EzYQN)TrAlA7*uOKymD*F-(vHu2r%=J(_(YJha?1y#>m>2<+k!^2+K z@O+@Ean(g|xU8GD8!L~*h3ec}LxFt}S#yEsfOe)8dzUDXp$k@8=NOa~A(JtM3}f(; z%w#2Gh*G+4)dhp@@~!{PAWMQ`<97M0eR?X=lkst97>KYlPRJ!Q6p&&0@aP31gLbW? z<*U(~FK_RSP|4)Xsb|Ga;rhnQ!J~Y~|b#$E4t7VBu`&?BeF+VrFP)=xT0hYGCASZe(s@XlUkW;cPs)j!6cl$Q7re zT}){zsY!{ZDaMHgx~XR7hPo!nrY5>cMi!R3W)`VQ<`%|jDQTujlUQA(K*D^3L zEcSG945_&F=GH;p1_c2I$MbqRC+*h6zI}9r>5H_q&!>j+Kr`wfsu)Y zLqNd+LISx$3Jws#2@HP)GW0f2JJ}w*G~+|=zaulV-mDE@5XIdU*FVD=q$hqGDM`kbCZ-li#%75olUc8d{n=>#l ztoC$q45_&F=GH;Z1_J>Whx2+mC+*h6zJ1ig`r>$p;h95!A3N|(lbC6FqSTG0fq{{U zg+oBWfeA!_cq#~?7wrzkGq?KK&C%*)yZ_98&dOukzjB4VcDVRjbaOLM>6cV9hwqW6 z-mH~T`?EO1gPrlx(GtU0A90{0rvi|^d^E-oXeKAbU>1%E3=q43HV8R1#GOz)z)-i_ WL2^-B(NCbe89ZJ6T-G@yGywqPq-E~_ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_device_widget_two.png b/OsmAnd/res/drawable-xxhdpi/ic_action_device_widget_two.png new file mode 100644 index 0000000000000000000000000000000000000000..725f6f6f5c6d547597ff015ffbed5d0e2c0aceae GIT binary patch literal 1165 zcmbVLNoW*76m4USNgyJEXv9O=5mB+1>REar6DR3T%s?iF$%qkD?4>5tB)!;OaXL9j zP;dbco&-TJdJ-1|5f2_*Aex9E>dlLwAc6^A6cH4x&dekpf(IMAe$}u4-+%R&^FxFC z+FG}?QWVve>(>fI_Q!v76Il-|+}lS)JMJC9!(Itj^Z-%amS-T4bM#SEK)N+~d=7O| z)auACj^L5}fMR+MtH(BMNI-Y(D?DFnblSO<|a?uJT~p%-x#vX9jq4HixCSca~W8p#g<)e8_v zv1!JH2?>ZY3sbTrB=-P;hiQ(NIhbU4sPMAFLs0u@5-qSwN&0%vH#wE6_c&*ztb z-LRG@k}@vReGalb=Q#1Z7Og{EK+7~%v<{1tKH>@}^d}cc9piuu=90 zHYtieu6gE!gIt``GBmkiE!$EoiMPaLNn+$=Qe=`)PB4;Slo%vHS+@);g`io-S;@bL zmsF_sCVI3qgs@kXQ@o&xf+#_l?v~U<-8bikSa(fSk8P9KHDBSMzKR+k9eY91^Tz94 zFjV%i7nVIAsA^nw5$w$CrtQYcU2&nR@77RYpFmb$;5lG1(~7+U3uNdiE1~lYN{f(5 znyDmX2$IaCC1i+FqGXj)23_;F{x^dhA;rb*@>l!RRir25?b0xi!_qh*m&{N=hUM;- zs|p#kn>nq!7`>Z+_oQW-U*DL0#qOEwx^-mX!-X}UpPz#-pZ@-sU3Y2oWqEd@uW_1M z)zH|y9%LKhB|dFmR((F34KLpx=(@7|eAD|+`>))1_TYPK@k{pgmyP#M6Vq=fo&9m> z#r*B9JAPd+uU++K2E!u*o5)=YAoA_ZVMribs<@5K7pZC}5@17i`snPo$JEJ(+4gH^ Rf}eyomFpeU?(`fx^#{74Z%P0F literal 0 HcmV?d00001