diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 4fd7436d0f..a57f609348 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -24,7 +24,6 @@
Currently, there are {2} MB available.
You can upload your OSM Note anonymously if you use your OpenStreetMap.org profile.
Upload OSM Note
- Show Map markers topbar
First Map marker
Second Map marker
Toolbar
diff --git a/OsmAnd/src/net/osmand/plus/ApplicationMode.java b/OsmAnd/src/net/osmand/plus/ApplicationMode.java
index 66be5fc4f2..9f11d54050 100644
--- a/OsmAnd/src/net/osmand/plus/ApplicationMode.java
+++ b/OsmAnd/src/net/osmand/plus/ApplicationMode.java
@@ -50,6 +50,7 @@ public class ApplicationMode {
icon(R.drawable.ic_truck, R.drawable.ic_action_truck_dark).reg();
static {
+ ApplicationMode[] exceptDefault = new ApplicationMode[] { CAR, PEDESTRIAN, BICYCLE, BOAT, AIRCRAFT };
ApplicationMode[] exceptPedestrianAndDefault = new ApplicationMode[] { CAR, BICYCLE, BOAT, AIRCRAFT };
ApplicationMode[] exceptAirBoatDefault = new ApplicationMode[] { CAR, BICYCLE, PEDESTRIAN };
ApplicationMode[] pedestrian = new ApplicationMode[] { PEDESTRIAN };
@@ -63,7 +64,10 @@ public class ApplicationMode {
regWidget("next_turn_small", pedestrian);
regWidget("next_next_turn", exceptPedestrianAndDefault);
- // right
+ // right
+ regWidget("intermediate_distance", exceptDefault);
+ regWidget("distance", exceptDefault);
+ regWidget("time", exceptDefault);
regWidget("speed", exceptPedestrianAndDefault);
regWidget("max_speed", CAR);
regWidget("gps_info", none);
diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
index 1790836ec0..2192b72b25 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
@@ -1144,7 +1144,17 @@ public class OsmandSettings {
public final OsmandPreference SHOULD_SHOW_FREE_VERSION_BANNER = new BooleanPreference("should_show_free_version_banner", false).makeGlobal().cache();
public final OsmandPreference USE_MAP_MARKERS = new BooleanPreference("use_map_markers", true).makeGlobal().cache();
- public final OsmandPreference SHOW_MAP_MARKERS_TOOLBAR = new BooleanPreference("show_map_markers_toolbar", true).makeGlobal().cache();
+
+ public final CommonPreference MAP_MARKERS_MODE =
+ new EnumIntPreference<>("map_markers_mode", MapMarkersMode.TOOLBAR, MapMarkersMode.values());
+
+ {
+ MAP_MARKERS_MODE.makeProfile().cache();
+ MAP_MARKERS_MODE.setModeDefaultValue(ApplicationMode.DEFAULT, MapMarkersMode.TOOLBAR);
+ MAP_MARKERS_MODE.setModeDefaultValue(ApplicationMode.CAR, MapMarkersMode.TOOLBAR);
+ MAP_MARKERS_MODE.setModeDefaultValue(ApplicationMode.BICYCLE, MapMarkersMode.TOOLBAR);
+ MAP_MARKERS_MODE.setModeDefaultValue(ApplicationMode.PEDESTRIAN, MapMarkersMode.TOOLBAR);
+ }
public ITileSource getMapTileSource(boolean warnWhenSelected) {
String tileName = MAP_TILE_SOURCES.get();
@@ -2460,9 +2470,39 @@ public class OsmandSettings {
return new DayNightMode[]{AUTO, DAY, NIGHT};
}
}
-
}
+ public enum MapMarkersMode {
+ TOOLBAR(R.string.shared_string_toolbar),
+ WIDGETS(R.string.shared_string_widgets),
+ NONE(R.string.shared_string_none);
+
+ private final int key;
+
+ MapMarkersMode(int key) {
+ this.key = key;
+ }
+
+ public String toHumanString(Context ctx) {
+ return ctx.getString(key);
+ }
+
+ public boolean isToolbar() {
+ return this == TOOLBAR;
+ }
+
+ public boolean isWidgets() {
+ return this == WIDGETS;
+ }
+
+ public boolean isNone() {
+ return this == NONE;
+ }
+
+ public static MapMarkersMode[] possibleValues(Context context) {
+ return new MapMarkersMode[]{TOOLBAR, WIDGETS, NONE};
+ }
+ }
public enum SpeedConstants {
KILOMETERS_PER_HOUR(R.string.km_h, R.string.si_kmh),
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java
index 38526cf00a..a9b2e5761b 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java
@@ -12,6 +12,8 @@ import net.osmand.plus.IconsCache;
import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmAndFormatter;
+import net.osmand.plus.OsmandSettings;
+import net.osmand.plus.OsmandSettings.MapMarkersMode;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.DashLocationFragment;
@@ -181,7 +183,7 @@ public class MapMarkersWidgetsFactory {
List markers = helper.getSortedMapMarkers();
if (zoom < 3 || markers.size() == 0
- || !map.getMyApplication().getSettings().SHOW_MAP_MARKERS_TOOLBAR.get()
+ || !map.getMyApplication().getSettings().MAP_MARKERS_MODE.get().isToolbar()
|| map.getMyApplication().getRoutingHelper().isFollowingMode()
|| map.getMyApplication().getRoutingHelper().isRoutePlanningMode()
|| map.getMapLayers().getMapControlsLayer().getMapRouteInfoMenu().isVisible()
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java
index 83729884f5..b83a6ca6cc 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java
@@ -12,13 +12,18 @@ import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
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.views.MapInfoLayer;
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
+import net.osmand.plus.views.OsmandMapTileView;
+
import android.content.Context;
+import android.content.DialogInterface;
+import android.support.v7.app.AlertDialog;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
@@ -198,6 +203,25 @@ public class MapWidgetRegistry {
}
}
+ public void changeVisibility(MapWidgetRegInfo m, boolean visible) {
+ ApplicationMode mode = settings.APPLICATION_MODE.get();
+ defineDefaultSettingsElement(mode);
+ // clear everything
+ this.visibleElementsFromSettings.get(mode).remove(m.key);
+ this.visibleElementsFromSettings.get(mode).remove("+" + m.key);
+ this.visibleElementsFromSettings.get(mode).remove("-" + m.key);
+ m.visibleModes.remove(mode);
+ m.visibleCollapsible.remove(mode);
+ if (visible) {
+ m.visibleModes.add(mode);
+ this.visibleElementsFromSettings.get(mode).add("" + m.key);
+ }
+ saveVisibleElementsToSettings(mode);
+ if (m.stateChangeListener != null) {
+ m.stateChangeListener.run();
+ }
+ }
+
private void defineDefaultSettingsElement(ApplicationMode mode) {
if (this.visibleElementsFromSettings.get(mode) == null) {
LinkedHashSet set = new LinkedHashSet();
@@ -245,9 +269,10 @@ public class MapWidgetRegistry {
settings.TRANSPARENT_MAP_THEME.resetToDefault();
settings.SHOW_STREET_NAME.resetToDefault();
settings.CENTER_POSITION_ON_MAP.resetToDefault();
+ settings.MAP_MARKERS_MODE.resetToDefault();
}
- public void addControlsAppearance(final MapActivity map, ContextMenuAdapter cm, ApplicationMode mode) {
+ public void addControlsAppearance(final MapActivity map, final ContextMenuAdapter cm, ApplicationMode mode) {
// addControlId(mil, cm, R.string.map_widget_show_ruler, settings.SHOW_RULER);
addControlId(map, cm, R.string.map_widget_show_destination_arrow, settings.SHOW_DESTINATION_ARROW);
addControlId(map, cm, R.string.map_widget_transparent, settings.TRANSPARENT_MAP_THEME);
@@ -256,7 +281,40 @@ public class MapWidgetRegistry {
addControlId(map, cm, R.string.map_widget_top_text, settings.SHOW_STREET_NAME);
}
if (settings.USE_MAP_MARKERS.get()) {
- addControlId(map, cm, R.string.show_map_markers_topbar, settings.SHOW_MAP_MARKERS_TOOLBAR);
+ cm.item(R.string.map_markers).description(settings.MAP_MARKERS_MODE.get().toHumanString(map)).listen(new OnContextMenuClick() {
+ @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() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ settings.MAP_MARKERS_MODE.set(MapMarkersMode.values()[which]);
+ for (MapWidgetRegInfo info : right) {
+ if ("map_marker_1st".equals(info.key) || "map_marker_2nd".equals(info.key)) {
+ changeVisibility(info, settings.MAP_MARKERS_MODE.get().isWidgets());
+ }
+ }
+ MapInfoLayer mil = map.getMapLayers().getMapInfoLayer();
+ if (mil != null) {
+ mil.recreateControls();
+ }
+ map.refreshMap();
+ dialog.dismiss();
+ cm.setItemDescription(pos, settings.MAP_MARKERS_MODE.get().toHumanString(map));
+ ad.notifyDataSetChanged();
+ }
+ });
+ bld.show();
+ return false;
+ }
+ }).layout(R.layout.drawer_list_doubleitem).reg();
}
}
@@ -318,7 +376,15 @@ public class MapWidgetRegistry {
}
private void addControls(final MapActivity map, final ContextMenuAdapter adapter, Set top, final ApplicationMode mode) {
- for(final MapWidgetRegInfo r : top){
+ for (final MapWidgetRegInfo r : top) {
+ if (mode == ApplicationMode.DEFAULT) {
+ if ("intermediate_distance".equals(r.key) || "distance".equals(r.key) || "time".equals(r.key)) {
+ continue;
+ }
+ }
+ if ("map_marker_1st".equals(r.key) || "map_marker_2nd".equals(r.key)) {
+ continue;
+ }
adapter.item(r.messageId).selected(r.visibleCollapsed(mode) || r.visible(mode) ? 1 : 0)
.iconColor(r.drawableMenu).listen(new OnContextMenuClick() {
@@ -331,7 +397,7 @@ public class MapWidgetRegistry {
}
adapter.setItemName(pos, getText(mil.getMapActivity(), mode, r));
adapter.setSelection(pos, r.visibleCollapsed(mode) || r.visible(mode) ? 1 : 0);
- a.notifyDataSetInvalidated();
+ a.notifyDataSetChanged();
return false;
}
}).reg();