From 9bd626178e300f014f4844f06ce9534b75aeadb5 Mon Sep 17 00:00:00 2001 From: Nazar-Kutz Date: Tue, 5 May 2020 13:17:46 +0300 Subject: [PATCH] Fix #8600 --- OsmAnd/res/values/strings.xml | 4 + .../src/net/osmand/plus/OsmandSettings.java | 3 + .../osmand/plus/dialogs/ConfigureMapMenu.java | 226 ++++------------- .../plus/quickaction/QuickActionRegistry.java | 2 + .../actions/ShowHideTransportLinesAction.java | 61 +++++ .../plus/transport/TransportLinesMenu.java | 238 ++++++++++++++++++ 6 files changed, 357 insertions(+), 177 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java create mode 100644 OsmAnd/src/net/osmand/plus/transport/TransportLinesMenu.java diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 000888d3fd..a4b152b3be 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,10 @@ Thx - Hardy --> + A button to show or hide public transport on the map. + Show/hide public transport + Show public transport + Hide public transport • New offline Slope maps\n\n • Full customization of Favorites and GPX Waypoints – custom colors, icons, shapes\n\n diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 7e9a6742c1..1dbfa86691 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -3747,6 +3747,9 @@ public class OsmandSettings { public final ListStringPreference TRANSPORT_DEFAULT_SETTINGS = (ListStringPreference) new ListStringPreference("transport_default_settings", "transportStops", ",").makeProfile(); + + public final ListStringPreference DISPLAYED_TRANSPORT_SETTINGS = (ListStringPreference) + new ListStringPreference("displayed_transport_settings", null, ",").makeProfile(); public final OsmandPreference SHOW_ARRIVAL_TIME_OTHERWISE_EXPECTED_TIME = new BooleanPreference("show_arrival_time", true).makeProfile(); diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java index 224226f818..e8bf1d7ff1 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java @@ -11,8 +11,6 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.ImageView; -import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; @@ -53,8 +51,8 @@ import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.poi.PoiFiltersHelper; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.render.RendererRegistry; -import net.osmand.plus.settings.ConfigureMenuRootFragment.ScreenType; import net.osmand.plus.srtmplugin.SRTMPlugin; +import net.osmand.plus.transport.TransportLinesMenu; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.corenative.NativeCoreContext; import net.osmand.plus.wikipedia.WikipediaPoiMenu; @@ -141,10 +139,20 @@ public class ConfigureMapMenu { ma.getDashboard().updateListAdapter(createListAdapter(ma)); } }); + List customRules = getCustomRules(app); + adapter.setProfileDependent(true); + adapter.setNightMode(nightMode); + createLayersItems(customRules, adapter, ma, themeRes, nightMode); + createRenderingAttributeItems(customRules, adapter, ma, themeRes, nightMode); + return adapter; + } + + public static List getCustomRules(OsmandApplication app) { RenderingRulesStorage renderer = app.getRendererRegistry().getCurrentSelectedRenderer(); List customRules = new ArrayList<>(); boolean useDepthContours = app.getResourceManager().hasDepthContours() - && (InAppPurchaseHelper.isSubscribedToLiveUpdates(app) || InAppPurchaseHelper.isDepthContoursPurchased(app)); + && (InAppPurchaseHelper.isSubscribedToLiveUpdates(app) + || InAppPurchaseHelper.isDepthContoursPurchased(app)); if (renderer != null) { for (RenderingRuleProperty p : renderer.PROPS.getCustomRules()) { if (!RenderingRuleStorageProperties.UI_CATEGORY_HIDDEN.equals(p.getCategory()) @@ -153,11 +161,7 @@ public class ConfigureMapMenu { } } } - adapter.setProfileDependent(true); - adapter.setNightMode(nightMode); - createLayersItems(customRules, adapter, ma, themeRes, nightMode); - createRenderingAttributeItems(customRules, adapter, ma, themeRes, nightMode); - return adapter; + return customRules; } private final class LayerMenuListener extends OnRowItemClick { @@ -193,7 +197,7 @@ public class ConfigureMapMenu { } @Override - public boolean onRowItemClick(ArrayAdapter adapter, View view, int itemId, int pos) { + public boolean onRowItemClick(final ArrayAdapter adapter, View view, int itemId, int pos) { if (itemId == R.string.layer_poi) { showPoiFilterDialog(adapter, adapter.getItem(pos)); return false; @@ -204,6 +208,26 @@ public class ConfigureMapMenu { ma.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.WIKIPEDIA, AndroidUtils.getCenterViewCoordinates(view)); return false; + } else if (itemId == R.string.rendering_category_transport) { + final ContextMenuItem item = adapter.getItem(pos); + TransportLinesMenu.showTransportsDialog(ma, new CallbackWithObject() { + @Override + public boolean processResult(Boolean result) { + if (item != null) { + item.setSelected(result); + item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); + adapter.notifyDataSetChanged(); + } + return true; + } + }); + boolean selected = TransportLinesMenu.isShowLines(ma.getMyApplication()); + if (!selected && item != null) { + item.setSelected(true); + item.setColorRes(R.color.osmand_orange); + adapter.notifyDataSetChanged(); + } + return false; } else { CompoundButton btn = (CompoundButton) view.findViewById(R.id.toggle_item); if (btn != null && btn.getVisibility() == View.VISIBLE) { @@ -257,6 +281,17 @@ public class ConfigureMapMenu { return true; } }); + } else if (itemId == R.string.rendering_category_transport) { + boolean selected = TransportLinesMenu.isShowLines(ma.getMyApplication()); + TransportLinesMenu.toggleTransportLines(ma, !selected, new CallbackWithObject() { + @Override + public boolean processResult(Boolean result) { + item.setSelected(result); + item.setColorRes(result ? R.color.osmand_orange : ContextMenuItem.INVALID_ID); + adapter.notifyDataSetChanged(); + return true; + } + }); } else if (itemId == R.string.map_markers) { settings.SHOW_MAP_MARKERS.set(isChecked); } else if (itemId == R.string.layer_map) { @@ -364,179 +399,16 @@ public class ConfigureMapMenu { } */ - final List transportRules = new ArrayList<>(); - final List> transportPrefs = new ArrayList<>(); - Iterator it = customRules.iterator(); - while (it.hasNext()) { - RenderingRuleProperty p = it.next(); - if ("transport".equals(p.getCategory()) && p.isBoolean()) { - transportRules.add(p); - final OsmandSettings.CommonPreference pref = activity.getMyApplication().getSettings() - .getCustomRenderBooleanProperty(p.getAttrName()); - transportPrefs.add(pref); - it.remove(); - } - } - selected = false; - for (OsmandSettings.CommonPreference p : transportPrefs) { - if (p.get()) { - selected = true; - break; - } - } - final boolean transportSelected = selected; + selected = TransportLinesMenu.isShowLines(app); adapter.addItem(new ContextMenuItem.ItemBuilder() .setId(TRANSPORT_ID) .setTitleId(R.string.rendering_category_transport, activity) .setIcon(R.drawable.ic_action_transport_bus) .setSecondaryIcon(R.drawable.ic_action_additional_option) - .setSelected(transportSelected) - .setColor(transportSelected ? selectedProfileColorRes : ContextMenuItem.INVALID_ID) - .setListener(new ContextMenuAdapter.OnRowItemClick() { - ArrayAdapter adapter; - boolean transportSelectedInner = transportSelected; + .setSelected(selected) + .setColor(selected ? selectedProfileColorRes : ContextMenuItem.INVALID_ID) + .setListener(l).createItem()); - @Override - public boolean onRowItemClick(ArrayAdapter adapter, View view, int itemId, int position) { - if (transportSelectedInner) { - showTransportDialog(adapter, position); - return false; - } else { - CompoundButton btn = (CompoundButton) view.findViewById(R.id.toggle_item); - if (btn != null && btn.getVisibility() == View.VISIBLE) { - btn.setChecked(!btn.isChecked()); - adapter.getItem(position).setColorRes(btn.isChecked() ? selectedProfileColorRes : ContextMenuItem.INVALID_ID); - adapter.notifyDataSetChanged(); - return false; - } else { - return onContextMenuClick(adapter, itemId, position, false, null); - } - } - } - - @Override - public boolean onContextMenuClick(final ArrayAdapter ad, int itemId, - final int pos, boolean isChecked, int[] viewCoordinates) { - if (transportSelectedInner) { - for (int i = 0; i < transportPrefs.size(); i++) { - transportPrefs.get(i).set(false); - } - transportSelectedInner = false; - ad.getItem(pos).setColorRes(ContextMenuItem.INVALID_ID); - refreshMapComplete(activity); - activity.getMapLayers().updateLayers(activity.getMapView()); - } else { - ad.getItem(pos).setColorRes(selectedProfileColorRes); - showTransportDialog(ad, pos); - } - ad.notifyDataSetChanged(); - return false; - } - - private void showTransportDialog(final ArrayAdapter ad, final int pos) { - final AlertDialog.Builder b = new AlertDialog.Builder(new ContextThemeWrapper(activity, themeRes)); - b.setTitle(activity.getString(R.string.rendering_category_transport)); - - final int[] iconIds = new int[transportPrefs.size()]; - final boolean[] checkedItems = new boolean[transportPrefs.size()]; - for (int i = 0; i < transportPrefs.size(); i++) { - checkedItems[i] = transportPrefs.get(i).get(); - } - final String[] vals = new String[transportRules.size()]; - for (int i = 0; i < transportRules.size(); i++) { - RenderingRuleProperty p = transportRules.get(i); - String propertyName = SettingsActivity.getStringPropertyName(activity, p.getAttrName(), - p.getName()); - vals[i] = propertyName; - if ("transportStops".equals(p.getAttrName())) { - iconIds[i] = R.drawable.ic_action_transport_stop; - } else if ("publicTransportMode".equals(p.getAttrName())) { - iconIds[i] = R.drawable.ic_action_transport_bus; - } else if ("tramTrainRoutes".equals(p.getAttrName())) { - iconIds[i] = R.drawable.ic_action_transport_tram; - } else if ("subwayMode".equals(p.getAttrName())) { - iconIds[i] = R.drawable.ic_action_transport_subway; - } else { - iconIds[i] = R.drawable.ic_action_transport_bus; - } - } - - adapter = new ArrayAdapter(new ContextThemeWrapper(activity, themeRes), R.layout.popup_list_item_icon24_and_menu, R.id.title, vals) { - @NonNull - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - View v = super.getView(position, convertView, parent); - final ImageView icon = (ImageView) v.findViewById(R.id.icon); - if (checkedItems[position]) { - icon.setImageDrawable(app.getUIUtilities().getIcon(iconIds[position], selectedProfileColorRes)); - } else { - icon.setImageDrawable(app.getUIUtilities().getThemedIcon(iconIds[position])); - } - v.findViewById(R.id.divider).setVisibility(View.GONE); - v.findViewById(R.id.description).setVisibility(View.GONE); - v.findViewById(R.id.secondary_icon).setVisibility(View.GONE); - final SwitchCompat check = (SwitchCompat) v.findViewById(R.id.toggle_item); - check.setOnCheckedChangeListener(null); - check.setChecked(checkedItems[position]); - check.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - checkedItems[position] = isChecked; - if (checkedItems[position]) { - icon.setImageDrawable(app.getUIUtilities().getIcon(iconIds[position], selectedProfileColorRes)); - } else { - icon.setImageDrawable(app.getUIUtilities().getThemedIcon(iconIds[position])); - } - } - }); - UiUtilities.setupCompoundButton(nightMode, selectedProfileColor, check); - return v; - } - }; - - final ListView listView = new ListView(activity); - listView.setDivider(null); - listView.setClickable(true); - listView.setAdapter(adapter); - listView.setOnItemClickListener(new ListView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - checkedItems[position] = !checkedItems[position]; - adapter.notifyDataSetChanged(); - } - }); - b.setView(listView); - - b.setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - ContextMenuItem item = ad.getItem(pos); - if (item != null) { - item.setSelected(transportSelectedInner); - item.setColorRes(transportSelectedInner ? selectedProfileColorRes : ContextMenuItem.INVALID_ID); - ad.notifyDataSetChanged(); - } - - } - }); - b.setNegativeButton(R.string.shared_string_cancel, null); - b.setPositiveButton(R.string.shared_string_apply, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - transportSelectedInner = false; - for (int i = 0; i < transportPrefs.size(); i++) { - transportPrefs.get(i).set(checkedItems[i]); - if (!transportSelectedInner && checkedItems[i]) { - transportSelectedInner = true; - } - } - refreshMapComplete(activity); - activity.getMapLayers().updateLayers(activity.getMapView()); - } - }); - b.show(); - } - }).createItem()); selected = app.getSelectedGpxHelper().isShowingAnyGpxFiles(); adapter.addItem(new ContextMenuItem.ItemBuilder() .setId(GPX_FILES_ID) diff --git a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java index 714abee320..e778b5e0b7 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionRegistry.java @@ -34,6 +34,7 @@ import net.osmand.plus.quickaction.actions.NewAction; import net.osmand.plus.quickaction.actions.ShowHideFavoritesAction; import net.osmand.plus.quickaction.actions.ShowHideGpxTracksAction; import net.osmand.plus.quickaction.actions.ShowHidePoiAction; +import net.osmand.plus.quickaction.actions.ShowHideTransportLinesAction; import net.osmand.util.Algorithms; import java.lang.reflect.Type; @@ -223,6 +224,7 @@ public class QuickActionRegistry { quickActionTypes.add(ShowHidePoiAction.TYPE); quickActionTypes.add(MapStyleAction.TYPE); quickActionTypes.add(DayNightModeAction.TYPE); + quickActionTypes.add(ShowHideTransportLinesAction.TYPE); // navigation quickActionTypes.add(NavVoiceAction.TYPE); quickActionTypes.add(NavDirectionsFromAction.TYPE); diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java new file mode 100644 index 0000000000..61f04f2c6f --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/ShowHideTransportLinesAction.java @@ -0,0 +1,61 @@ +package net.osmand.plus.quickaction.actions; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.quickaction.QuickAction; +import net.osmand.plus.quickaction.QuickActionType; +import net.osmand.plus.transport.TransportLinesMenu; + +public class ShowHideTransportLinesAction extends QuickAction { + + public static final QuickActionType TYPE = new QuickActionType(31, + "transport.showhide", ShowHideTransportLinesAction.class) + .nameRes(R.string.quick_action_show_hide_transport) + .iconRes(R.drawable.ic_action_transport_bus).nonEditable() + .category(QuickActionType.CONFIGURE_MAP); + + public ShowHideTransportLinesAction() { + super(TYPE); + } + + public ShowHideTransportLinesAction(QuickAction quickAction) { + super(quickAction); + } + + @Override + public void execute(final MapActivity activity) { + boolean enabled = TransportLinesMenu.isShowLines(activity.getMyApplication()); + TransportLinesMenu.toggleTransportLines(activity, !enabled, null); + } + + @Override + public void drawUI(ViewGroup parent, MapActivity activity) { + + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.quick_action_with_text, parent, false); + + ((TextView) view.findViewById(R.id.text)).setText( + R.string.quick_action_transport_descr); + + parent.addView(view); + } + + @Override + public String getActionText(OsmandApplication application) { + + return TransportLinesMenu.isShowLines(application) + ? application.getString(R.string.quick_action_transport_hide) + : application.getString(R.string.quick_action_transport_show); + } + + @Override + public boolean isActionWithSlash(OsmandApplication application) { + return TransportLinesMenu.isShowLines(application); + } +} diff --git a/OsmAnd/src/net/osmand/plus/transport/TransportLinesMenu.java b/OsmAnd/src/net/osmand/plus/transport/TransportLinesMenu.java new file mode 100644 index 0000000000..8c47ed2838 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/transport/TransportLinesMenu.java @@ -0,0 +1,238 @@ +package net.osmand.plus.transport; + +import android.content.Context; +import android.content.DialogInterface; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.ListView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.SwitchCompat; +import androidx.core.content.ContextCompat; + +import net.osmand.CallbackWithObject; +import net.osmand.plus.ApplicationMode; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.OsmandSettings.CommonPreference; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.SettingsActivity; +import net.osmand.plus.dialogs.ConfigureMapMenu; +import net.osmand.render.RenderingRuleProperty; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TransportLinesMenu { + + public static final String TRANSPORT_RENDERING_CATEGORY = "transport"; + + public static final String PT_TRANSPORT_STOPS = "transportStops"; + public static final String PT_PUBLIC_TRANSPORT_MODE = "publicTransportMode"; + public static final String PT_TRAM_TRAIN_ROUTES = "tramTrainRoutes"; + public static final String PT_SUBWAY_MODE = "subwayMode"; + + public static void toggleTransportLines(@NonNull MapActivity mapActivity, boolean enable, + @Nullable CallbackWithObject callback) { + OsmandApplication app = mapActivity.getMyApplication(); + OsmandSettings settings = app.getSettings(); + if (enable) { + List enabledTransportIds = settings.DISPLAYED_TRANSPORT_SETTINGS.getStringsList(); + if (enabledTransportIds != null) { + for (CommonPreference pref : getTransportPrefs(app, null)) { + boolean selected = enabledTransportIds.contains(pref.getId()); + pref.set(selected); + } + refreshMap(mapActivity); + } else { + showTransportsDialog(mapActivity, callback); + } + } else { + for (CommonPreference pref : getTransportPrefs(app, null)) { + pref.set(false); + } + refreshMap(mapActivity); + if (callback != null) { + callback.processResult(false); + } + } + } + + public static void showTransportsDialog(@NonNull final MapActivity mapActivity, + @Nullable final CallbackWithObject callback) { + final OsmandApplication app = mapActivity.getMyApplication(); + final OsmandSettings settings = app.getSettings(); + final ApplicationMode appMode = settings.getApplicationMode(); + + final List enabledTransportIds = app.getSettings().DISPLAYED_TRANSPORT_SETTINGS.getStringsList(); + final List transportRules = getTransportRules(app); + final List> transportPrefs = getTransportPrefs(app, transportRules); + + final boolean nightMode = app.getDaynightHelper().isNightModeForMapControls(); + final Context themedCtx = UiUtilities.getThemedContext(mapActivity, nightMode); + final int profileColorResId = appMode.getIconColorInfo().getColor(nightMode); + final int profileColor = ContextCompat.getColor(themedCtx, profileColorResId); + + final AlertDialog.Builder b = new AlertDialog.Builder(themedCtx); + b.setTitle(themedCtx.getString(R.string.rendering_category_transport)); + + final boolean[] checkedItems = new boolean[transportPrefs.size()]; + for (int i = 0; i < transportPrefs.size(); i++) { + boolean selected = enabledTransportIds != null + && enabledTransportIds.contains(transportPrefs.get(i).getId()); + checkedItems[i] = selected; + } + + final int[] iconIds = new int[transportPrefs.size()]; + final String[] vals = new String[transportRules.size()]; + + final Map transportIcons = new HashMap<>(); + transportIcons.put(PT_TRANSPORT_STOPS, R.drawable.ic_action_transport_stop); + transportIcons.put(PT_PUBLIC_TRANSPORT_MODE, R.drawable.ic_action_transport_bus); + transportIcons.put(PT_TRAM_TRAIN_ROUTES, R.drawable.ic_action_transport_tram); + transportIcons.put(PT_SUBWAY_MODE, R.drawable.ic_action_transport_subway); + + for (int i = 0; i < transportRules.size(); i++) { + RenderingRuleProperty p = transportRules.get(i); + String attrName = p.getAttrName(); + String propertyName = SettingsActivity + .getStringPropertyName(themedCtx, attrName, p.getName()); + vals[i] = propertyName; + Integer iconId = transportIcons.get(attrName); + if (iconId != null) { + iconIds[i] = iconId; + } else { + iconIds[i] = R.drawable.ic_action_transport_bus; + } + } + + final ArrayAdapter adapter = new ArrayAdapter(themedCtx, + R.layout.popup_list_item_icon24_and_menu, R.id.title, vals) { + @NonNull + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + View v = super.getView(position, convertView, parent); + final ImageView icon = (ImageView) v.findViewById(R.id.icon); + if (checkedItems[position]) { + icon.setImageDrawable(app.getUIUtilities().getIcon(iconIds[position], profileColorResId)); + } else { + icon.setImageDrawable(app.getUIUtilities().getThemedIcon(iconIds[position])); + } + v.findViewById(R.id.divider).setVisibility(View.GONE); + v.findViewById(R.id.description).setVisibility(View.GONE); + v.findViewById(R.id.secondary_icon).setVisibility(View.GONE); + final SwitchCompat check = (SwitchCompat) v.findViewById(R.id.toggle_item); + check.setOnCheckedChangeListener(null); + check.setChecked(checkedItems[position]); + check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + checkedItems[position] = isChecked; + if (checkedItems[position]) { + icon.setImageDrawable(app.getUIUtilities().getIcon(iconIds[position], profileColorResId)); + } else { + icon.setImageDrawable(app.getUIUtilities().getThemedIcon(iconIds[position])); + } + } + }); + UiUtilities.setupCompoundButton(nightMode, profileColor, check); + return v; + } + }; + + final ListView listView = new ListView(themedCtx); + listView.setDivider(null); + listView.setClickable(true); + listView.setAdapter(adapter); + listView.setOnItemClickListener(new ListView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + checkedItems[position] = !checkedItems[position]; + adapter.notifyDataSetChanged(); + } + }); + b.setView(listView); + + b.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + if (callback != null) { + callback.processResult(isShowLines(app)); + } + } + }); + + b.setNegativeButton(R.string.shared_string_cancel, null); + b.setPositiveButton(R.string.shared_string_apply, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + List transportIdsToSave = new ArrayList<>(); + for (int i = 0; i < transportPrefs.size(); i++) { + CommonPreference pref = transportPrefs.get(i); + boolean selected = checkedItems[i]; + if (selected) { + transportIdsToSave.add(pref.getId()); + } + pref.set(selected); + } + settings.DISPLAYED_TRANSPORT_SETTINGS.setStringsListForProfile(appMode, + transportIdsToSave.size() > 0 ? transportIdsToSave : null); + if (callback != null) { + callback.processResult(transportIdsToSave.size() > 0); + } + refreshMap(mapActivity); + } + }); + b.show(); + } + + public static List getTransportRules(OsmandApplication app) { + List transportRules = new ArrayList<>(); + for (RenderingRuleProperty property : ConfigureMapMenu.getCustomRules(app)) { + if (TRANSPORT_RENDERING_CATEGORY.equals(property.getCategory()) && property.isBoolean()) { + transportRules.add(property); + } + } + return transportRules; + } + + public static List> getTransportPrefs(@NonNull OsmandApplication app, + List transportRules) { + if (transportRules == null) { + transportRules = getTransportRules(app); + } + List> transportPrefs = new ArrayList<>(); + for (RenderingRuleProperty property : transportRules) { + final CommonPreference pref = app.getSettings() + .getCustomRenderBooleanProperty(property.getAttrName()); + transportPrefs.add(pref); + } + return transportPrefs; + } + + + private static void refreshMap(MapActivity mapActivity) { + ConfigureMapMenu.refreshMapComplete(mapActivity); + mapActivity.getMapLayers().updateLayers(mapActivity.getMapView()); + } + + public static boolean isShowLines(@NonNull OsmandApplication app) { + ApplicationMode appMode = app.getSettings().getApplicationMode(); + for (CommonPreference pref : getTransportPrefs(app, null)) { + if (pref.getModeValue(appMode)) { + return true; + } + } + return false; + } +}