diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AvoidRoadsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AvoidRoadsBottomSheetDialogFragment.java index 2a1102d289..26e3664bcd 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AvoidRoadsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AvoidRoadsBottomSheetDialogFragment.java @@ -302,11 +302,7 @@ public class AvoidRoadsBottomSheetDialogFragment extends MenuBottomSheetDialogFr avoidSpecificRoads.removeImpassableRoad(routeLocation); } - RoutingHelper routingHelper = app.getRoutingHelper(); - if (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated()) { - routingHelper.recalculateRouteDueToSettingsChange(); - } - + app.getRoutingHelper().recalculateRouteDueToSettingsChange(); MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { final MapRouteInfoMenu mapRouteInfoMenu = mapActivity.getMapRouteInfoMenu(); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index 7cfe5031f1..6d2c09300b 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -1,5 +1,6 @@ package net.osmand.plus.routepreparationmenu; +import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnDismissListener; import android.graphics.PointF; @@ -59,9 +60,12 @@ import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.WaypointHelper; import net.osmand.plus.mapmarkers.MapMarkerSelectionFragment; import net.osmand.plus.poi.PoiUIFilter; +import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidPTTypesRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidRoadsRoutingParameter; +import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.LocalRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.LocalRoutingParameterGroup; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.MuteSoundRoutingParameter; +import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.RouteMenuAppModes; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.ShowAlongTheRouteItem; import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; @@ -803,57 +807,10 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } final OsmandApplication app = mapActivity.getMyApplication(); RoutingHelper routingHelper = app.getRoutingHelper(); - final boolean nightMode = app.getDaynightHelper().isNightModeForMapControls(); - final OsmandSettings settings = app.getSettings(); - final int colorActive = ContextCompat.getColor(app, nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); - final int colorDisabled = ContextCompat.getColor(app, R.color.description_font_and_bottom_sheet_icons); final ApplicationMode applicationMode = routingHelper.getAppMode(); - final RoutingOptionsHelper.RouteMenuAppModes mode = app.getRoutingOptionsHelper().modes.get(applicationMode); - int margin = AndroidUtils.dpToPx(app, 3); - - View startButton = mainView.findViewById(R.id.start_button); - TextViewExProgress startButtonText = (TextViewExProgress) mainView.findViewById(R.id.start_button_descr); - boolean publicTransportMode = routingHelper.getAppMode() == ApplicationMode.PUBLIC_TRANSPORT; - int iconId = publicTransportMode ? R.drawable.ic_map : R.drawable.ic_action_start_navigation; - int color; - if (isRouteCalculated()) { - AndroidUtils.setBackground(app, startButton, nightMode, R.color.active_buttons_and_links_light, R.color.active_buttons_and_links_dark); - color = nightMode ? R.color.main_font_dark : R.color.card_and_list_background_light; - } else { - AndroidUtils.setBackground(app, startButton, nightMode, R.color.activity_background_light, R.color.activity_background_dark); - color = R.color.description_font_and_bottom_sheet_icons; - } - startButtonText.color2 = ContextCompat.getColor(app, color); - startButtonText.setCompoundDrawablesWithIntrinsicBounds(app.getUIUtilities().getIcon(iconId, color), null, null, null); - if (publicTransportMode) { - startButtonText.setText(R.string.shared_string_show_on_map); - } else if (routingHelper.isFollowingMode() || routingHelper.isPauseNavigation()) { - startButtonText.setText(R.string.shared_string_continue); - } else { - startButtonText.setText(R.string.shared_string_control_start); - } - startButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - clickRouteGo(); - } - }); - - View cancelButton = mainView.findViewById(R.id.cancel_button); - TextView cancelButtonText = (TextView) mainView.findViewById(R.id.cancel_button_descr); - if (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated() || isTransportRouteCalculated()) { - cancelButtonText.setText(R.string.shared_string_dismiss); - } else { - cancelButtonText.setText(R.string.shared_string_cancel); - } - AndroidUtils.setBackground(app, cancelButton, nightMode, R.color.card_and_list_background_light, R.color.card_and_list_background_dark); - cancelButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - clickRouteCancel(); - } - }); + final RouteMenuAppModes mode = app.getRoutingOptionsHelper().modes.get(applicationMode); + updateControlButtons(mapActivity, mainView); LinearLayout optionsButton = (LinearLayout) mainView.findViewById(R.id.map_options_route_button); TextView optionsTitle = (TextView) mainView.findViewById(R.id.map_options_route_button_title); ImageView optionsIcon = (ImageView) mainView.findViewById(R.id.map_options_route_button_icon); @@ -880,271 +837,373 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (mode == null) { return; } - - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); - LinearLayout.LayoutParams newLp = new LinearLayout.LayoutParams(AndroidUtils.dpToPx(app, 100), ViewGroup.LayoutParams.MATCH_PARENT); - - lp.setMargins(margin, 0, margin, 0); - + createRoutingParametersButtons(mapActivity, mode, optionsContainer); + int rightPadding = AndroidUtils.dpToPx(app, 70); if (mode.parameters.size() > 2) { optionsTitle.setVisibility(View.GONE); } else { optionsTitle.setVisibility(View.VISIBLE); - } - - for (final RoutingOptionsHelper.LocalRoutingParameter parameter : mode.parameters) { - if (parameter instanceof MuteSoundRoutingParameter) { - String text = null; - final boolean active = !app.getRoutingHelper().getVoiceRouter().isMute(); - if (mode.parameters.size() <= 2) { - text = app.getString(active ? R.string.shared_string_on : R.string.shared_string_off); - } - View item = createToolbarOptionView(active, text, parameter.getActiveIconId(), parameter.getDisabledIconId(), new OnClickListener() { - @Override - public void onClick(View v) { - OsmandApplication app = getApp(); - if (app != null) { - app.getRoutingOptionsHelper().switchSound(); - boolean active = !app.getRoutingHelper().getVoiceRouter().isMute(); - String text = app.getString(active ? R.string.shared_string_on : R.string.shared_string_off); - - Drawable itemDrawable = app.getUIUtilities().getIcon(active ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.route_info_control_icon_color_dark : R.color.route_info_control_icon_color_light); - Drawable activeItemDrawable = app.getUIUtilities().getIcon(active ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); - - if (Build.VERSION.SDK_INT >= 21) { - itemDrawable = AndroidUtils.createPressedStateListDrawable(itemDrawable, activeItemDrawable); - } - - ((ImageView) v.findViewById(R.id.route_option_image_view)).setImageDrawable(active ? activeItemDrawable : itemDrawable); - ((TextView) v.findViewById(R.id.route_option_title)).setText(text); - ((TextView) v.findViewById(R.id.route_option_title)).setTextColor(active ? colorActive : colorDisabled); - } - } - }); - if (item != null) { - optionsContainer.addView(item, lp); - } - } else if (parameter instanceof ShowAlongTheRouteItem) { - final Set poiFilters = app.getPoiFilters().getSelectedPoiFilters(); - final boolean traffic = app.getSettings().SHOW_TRAFFIC_WARNINGS.getModeValue(applicationMode); - final boolean fav = app.getSettings().SHOW_NEARBY_FAVORITES.getModeValue(applicationMode); - if (!poiFilters.isEmpty()) { - LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); - if (item != null) { - item.findViewById(R.id.route_option_container).setVisibility(View.GONE); - Iterator it = poiFilters.iterator(); - while (it.hasNext()) { - final PoiUIFilter poiUIFilter = it.next(); - final View container = createToolbarSubOptionView(true, poiUIFilter.getName(), R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { - @Override - public void onClick(View v) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - mapActivity.getMyApplication().getPoiFilters().removeSelectedPoiFilter(poiUIFilter); - mapActivity.getMapView().refreshMap(); - updateOptionsButtons(); - } - } - }); - if (container != null) { - item.addView(container, newLp); - } - } - optionsContainer.addView(item, lp); - } - } - if (traffic) { - LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); - if (item != null) { - item.findViewById(R.id.route_option_container).setVisibility(View.GONE); - final View container = createToolbarSubOptionView(true, app.getString(R.string.way_alarms), R.drawable.ic_action_remove_dark, true, new OnClickListener() { - @Override - public void onClick(View v) { - OsmandApplication app = getApp(); - if (app != null) { - app.getWaypointHelper().enableWaypointType(WaypointHelper.ALARMS, false); - updateOptionsButtons(); - } - } - }); - if (container != null) { - AndroidUtils.setBackground(app, container, nightMode, R.drawable.btn_border_light, R.drawable.btn_border_dark); - item.addView(container, newLp); - optionsContainer.addView(item, lp); - } - } - } - if (fav) { - LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); - if (item != null) { - item.findViewById(R.id.route_option_container).setVisibility(View.GONE); - final View container = createToolbarSubOptionView(true, app.getString(R.string.favourites), R.drawable.ic_action_remove_dark, true, new OnClickListener() { - @Override - public void onClick(View v) { - OsmandApplication app = getApp(); - if (app != null) { - app.getWaypointHelper().enableWaypointType(WaypointHelper.FAVORITES, false); - updateOptionsButtons(); - } - } - }); - if (container != null) { - AndroidUtils.setBackground(app, container, nightMode, R.drawable.btn_border_light, R.drawable.btn_border_dark); - item.addView(container, newLp); - optionsContainer.addView(item, lp); - } - } - } - - } else if (parameter instanceof AvoidRoadsRoutingParameter || parameter instanceof RoutingOptionsHelper.AvoidPTTypesRoutingParameter) { - final LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); - if (item != null) { - - item.findViewById(R.id.route_option_container).setVisibility(View.GONE); - Map impassableRoads = new TreeMap<>(); - if (parameter instanceof AvoidRoadsRoutingParameter) { - impassableRoads = app.getAvoidSpecificRoads().getImpassableRoads(); - } - Iterator it = impassableRoads.values().iterator(); - while (it.hasNext()) { - final RouteDataObject routeDataObject = it.next(); - final View container = createToolbarSubOptionView(false, app.getAvoidSpecificRoads().getText(routeDataObject), R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { - @Override - public void onClick(View v) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - OsmandApplication app = mapActivity.getMyApplication(); - RoutingHelper routingHelper = app.getRoutingHelper(); - if (routeDataObject != null) { - app.getAvoidSpecificRoads().removeImpassableRoad(routeDataObject); - } - if (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated()) { - routingHelper.recalculateRouteDueToSettingsChange(); - } - if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty()) { - mode.parameters.remove(parameter); - } - mapActivity.getMapView().refreshMap(); - if (mode.parameters.size() > 2) { - item.removeView(v); - } else { - updateOptionsButtons(); - } - } - } - }); - if (container != null) { - item.addView(container, newLp); - } - } - - List avoidParameters = app.getRoutingOptionsHelper().getAvoidRoutingPrefsForAppMode(applicationMode); - final List avoidedParameters = new ArrayList<>(); - for (int i = 0; i < avoidParameters.size(); i++) { - RoutingParameter p = avoidParameters.get(i); - CommonPreference preference = settings.getCustomRoutingBooleanProperty(p.getId(), p.getDefaultBoolean()); - if (preference != null && preference.getModeValue(app.getRoutingHelper().getAppMode())) { - avoidedParameters.add(p); - } - } - for (int i = 0; i < avoidedParameters.size(); i++) { - final RoutingParameter routingParameter = avoidedParameters.get(i); - final View container = createToolbarSubOptionView(false, SettingsBaseActivity.getRoutingStringPropertyName(app, routingParameter.getId(), routingParameter.getName()), R.drawable.ic_action_remove_dark, i == avoidedParameters.size() - 1, new OnClickListener() { - @Override - public void onClick(View v) { - CommonPreference preference = settings.getCustomRoutingBooleanProperty(routingParameter.getId(), routingParameter.getDefaultBoolean()); - preference.setModeValue(app.getRoutingHelper().getAppMode(), false); - avoidedParameters.remove(routingParameter); - if (avoidedParameters.isEmpty()) { - mode.parameters.remove(parameter); - } - if (mode.parameters.size() > 2) { - item.removeView(v); - } else { - updateOptionsButtons(); - } - } - }); - if (container != null) { - item.addView(container, newLp); - } - } - if(avoidedParameters.size() > 0 || impassableRoads.size() > 0) { - optionsContainer.addView(item, lp); - } - } - } else if (parameter instanceof LocalRoutingParameterGroup) { - final LocalRoutingParameterGroup group = (LocalRoutingParameterGroup) parameter; - String text = null; - RoutingOptionsHelper.LocalRoutingParameter selected = group.getSelected(settings); - if (selected != null) { - text = group.getText(mapActivity); - } - View item = createToolbarOptionView(false, text, parameter.getActiveIconId(), parameter.getDisabledIconId(), new OnClickListener() { - @Override - public void onClick(View v) { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - mapActivity.getMyApplication().getRoutingOptionsHelper().showLocalRoutingParameterGroupDialog(group, mapActivity, new RoutingOptionsHelper.OnClickListener() { - @Override - public void onClick() { - updateOptionsButtons(); - } - }); - } - } - }); - if (item != null) { - optionsContainer.addView(item, lp); - } - } else { - String text; - boolean active; - if (parameter.routingParameter != null) { - if (parameter.routingParameter.getId().equals(GeneralRouter.USE_SHORTEST_WAY)) { - // if short route settings - it should be inverse of fast_route_mode - active = !settings.FAST_ROUTE_MODE.getModeValue(routingHelper.getAppMode()); - } else { - active = parameter.isSelected(settings); - } - text = parameter.getText(mapActivity); - View item = createToolbarOptionView(active, text, parameter.getActiveIconId(), parameter.getDisabledIconId(), new OnClickListener() { - @Override - public void onClick(View v) { - OsmandApplication app = getApp(); - if (parameter.routingParameter != null && app != null) { - boolean selected = !parameter.isSelected(settings); - app.getRoutingOptionsHelper().applyRoutingParameter(parameter, selected); - - Drawable itemDrawable = app.getUIUtilities().getIcon(selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.route_info_control_icon_color_dark : R.color.route_info_control_icon_color_light); - Drawable activeItemDrawable = app.getUIUtilities().getIcon(selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); - - if (Build.VERSION.SDK_INT >= 21) { - itemDrawable = AndroidUtils.createPressedStateListDrawable(itemDrawable, activeItemDrawable); - } - ((ImageView) v.findViewById(R.id.route_option_image_view)).setImageDrawable(selected ? activeItemDrawable : itemDrawable); - ((TextView) v.findViewById(R.id.route_option_title)).setTextColor(selected ? colorActive : colorDisabled); - } - } - }); - if (item != null) { - LinearLayout.LayoutParams newLp2 = new LinearLayout.LayoutParams(AndroidUtils.dpToPx(app, 100), ViewGroup.LayoutParams.MATCH_PARENT); - newLp2.setMargins(margin, 0, margin, 0); - optionsContainer.addView(item, newLp2); - } - } - } - } - int rightPadding = AndroidUtils.dpToPx(app, 70); - if (optionsTitle.getVisibility() == View.VISIBLE) { rightPadding += AndroidUtils.getTextWidth(app.getResources().getDimensionPixelSize(R.dimen.text_button_text_size), app.getString(R.string.shared_string_options)); } optionsContainer.setPadding(optionsContainer.getPaddingLeft(), optionsContainer.getPaddingTop(), rightPadding, optionsContainer.getPaddingBottom()); } + private void updateControlButtons(MapActivity mapActivity, View mainView) { + if (mapActivity == null || mainView == null) { + return; + } + final OsmandApplication app = mapActivity.getMyApplication(); + final RoutingHelper helper = app.getRoutingHelper(); + View startButton = mainView.findViewById(R.id.start_button); + TextViewExProgress startButtonText = (TextViewExProgress) mainView.findViewById(R.id.start_button_descr); + boolean publicTransportMode = helper.getAppMode() == ApplicationMode.PUBLIC_TRANSPORT; + int iconId = publicTransportMode ? R.drawable.ic_map : R.drawable.ic_action_start_navigation; + int color; + if (isRouteCalculated()) { + AndroidUtils.setBackground(app, startButton, nightMode, R.color.active_buttons_and_links_light, R.color.active_buttons_and_links_dark); + color = nightMode ? R.color.main_font_dark : R.color.card_and_list_background_light; + } else { + AndroidUtils.setBackground(app, startButton, nightMode, R.color.activity_background_light, R.color.activity_background_dark); + color = R.color.description_font_and_bottom_sheet_icons; + } + startButtonText.color2 = ContextCompat.getColor(app, color); + startButtonText.setCompoundDrawablesWithIntrinsicBounds(app.getUIUtilities().getIcon(iconId, color), null, null, null); + if (publicTransportMode) { + startButtonText.setText(R.string.shared_string_show_on_map); + } else if (helper.isFollowingMode() || helper.isPauseNavigation()) { + startButtonText.setText(R.string.shared_string_continue); + } else { + startButtonText.setText(R.string.shared_string_control_start); + } + startButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + clickRouteGo(); + } + }); + View cancelButton = mainView.findViewById(R.id.cancel_button); + TextView cancelButtonText = (TextView) mainView.findViewById(R.id.cancel_button_descr); + if (helper.isRouteCalculated() || helper.isRouteBeingCalculated() || isTransportRouteCalculated()) { + cancelButtonText.setText(R.string.shared_string_dismiss); + } else { + cancelButtonText.setText(R.string.shared_string_cancel); + } + AndroidUtils.setBackground(app, cancelButton, nightMode, R.color.card_and_list_background_light, R.color.card_and_list_background_dark); + cancelButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + clickRouteCancel(); + } + }); + } + + private void createRoutingParametersButtons(MapActivity mapActivity, final RouteMenuAppModes mode, LinearLayout optionsContainer) { + if (mapActivity == null || optionsContainer == null) { + return; + } + for (final LocalRoutingParameter parameter : mode.parameters) { + if (parameter instanceof MuteSoundRoutingParameter) { + createMuteSoundRoutingParameterButton(mapActivity, (MuteSoundRoutingParameter) parameter, mode, optionsContainer); + } else if (parameter instanceof ShowAlongTheRouteItem) { + createShowAlongTheRouteItems(mapActivity, optionsContainer); + } else if (parameter instanceof AvoidRoadsRoutingParameter || parameter instanceof AvoidPTTypesRoutingParameter) { + createAvoidRoadsRoutingParameterButton(mapActivity, parameter, mode, optionsContainer); + } else if (parameter instanceof LocalRoutingParameterGroup) { + createLocalRoutingParameterGroupButton(mapActivity, parameter, optionsContainer); + } else { + createSimpleRoutingParameterButton(mapActivity, parameter, optionsContainer); + } + } + } + + private void createMuteSoundRoutingParameterButton(MapActivity mapActivity, final MuteSoundRoutingParameter parameter, final RouteMenuAppModes mode, LinearLayout optionsContainer) { + final int colorActive = ContextCompat.getColor(mapActivity, nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); + final int colorDisabled = ContextCompat.getColor(mapActivity, R.color.description_font_and_bottom_sheet_icons); + String text = null; + final boolean active = !mapActivity.getRoutingHelper().getVoiceRouter().isMute(); + if (mode.parameters.size() <= 2) { + text = mapActivity.getString(active ? R.string.shared_string_on : R.string.shared_string_off); + } + View item = createToolbarOptionView(active, text, parameter.getActiveIconId(), parameter.getDisabledIconId(), new OnClickListener() { + @Override + public void onClick(View v) { + OsmandApplication app = getApp(); + if (app != null) { + app.getRoutingOptionsHelper().switchSound(); + boolean active = !app.getRoutingHelper().getVoiceRouter().isMute(); + String text = app.getString(active ? R.string.shared_string_on : R.string.shared_string_off); + + Drawable itemDrawable = app.getUIUtilities().getIcon(active ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.route_info_control_icon_color_dark : R.color.route_info_control_icon_color_light); + Drawable activeItemDrawable = app.getUIUtilities().getIcon(active ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); + + if (Build.VERSION.SDK_INT >= 21) { + itemDrawable = AndroidUtils.createPressedStateListDrawable(itemDrawable, activeItemDrawable); + } + ((ImageView) v.findViewById(R.id.route_option_image_view)).setImageDrawable(active ? activeItemDrawable : itemDrawable); + ((TextView) v.findViewById(R.id.route_option_title)).setText(text); + ((TextView) v.findViewById(R.id.route_option_title)).setTextColor(active ? colorActive : colorDisabled); + } + } + }); + if (item != null) { + optionsContainer.addView(item, getContainerButtonLayoutParams(mapActivity, true)); + } + } + + private void createShowAlongTheRouteItems(MapActivity mapActivity, LinearLayout optionsContainer) { + OsmandApplication app = mapActivity.getMyApplication(); + final ApplicationMode applicationMode = app.getRoutingHelper().getAppMode(); + final Set poiFilters = app.getPoiFilters().getSelectedPoiFilters(); + final boolean traffic = app.getSettings().SHOW_TRAFFIC_WARNINGS.getModeValue(applicationMode); + final boolean fav = app.getSettings().SHOW_NEARBY_FAVORITES.getModeValue(applicationMode); + if (!poiFilters.isEmpty()) { + createPoiFiltersItems(mapActivity, poiFilters, optionsContainer); + } + if (traffic) { + createWaypointItem(mapActivity, optionsContainer, WaypointHelper.ALARMS); + } + if (fav) { + createWaypointItem(mapActivity, optionsContainer, WaypointHelper.FAVORITES); + } + } + + private void createPoiFiltersItems(MapActivity mapActivity, Set poiFilters, LinearLayout optionsContainer) { + LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); + if (item != null) { + item.findViewById(R.id.route_option_container).setVisibility(View.GONE); + Iterator it = poiFilters.iterator(); + while (it.hasNext()) { + final PoiUIFilter poiUIFilter = it.next(); + final View container = createToolbarSubOptionView(true, poiUIFilter.getName(), R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { + @Override + public void onClick(View v) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.getMyApplication().getPoiFilters().removeSelectedPoiFilter(poiUIFilter); + mapActivity.getMapView().refreshMap(); + updateOptionsButtons(); + } + } + }); + if (container != null) { + item.addView(container, getContainerButtonLayoutParams(mapActivity, false)); + } + } + optionsContainer.addView(item, getContainerButtonLayoutParams(mapActivity, true)); + } + } + + private void createWaypointItem(MapActivity mapActivity, LinearLayout optionsContainer, final int waypointType) { + LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); + if (item != null) { + item.findViewById(R.id.route_option_container).setVisibility(View.GONE); + String title = ""; + if (waypointType == WaypointHelper.ALARMS) { + title = mapActivity.getString(R.string.way_alarms); + } else if (waypointType == WaypointHelper.FAVORITES) { + title = mapActivity.getString(R.string.favourites); + } + final View container = createToolbarSubOptionView(true, title, R.drawable.ic_action_remove_dark, true, new OnClickListener() { + @Override + public void onClick(View v) { + OsmandApplication app = getApp(); + if (app != null) { + app.getWaypointHelper().enableWaypointType(waypointType, false); + updateOptionsButtons(); + } + } + }); + if (container != null) { + AndroidUtils.setBackground(app, container, nightMode, R.drawable.btn_border_light, R.drawable.btn_border_dark); + item.addView(container, getContainerButtonLayoutParams(mapActivity, false)); + optionsContainer.addView(item, getContainerButtonLayoutParams(mapActivity, true)); + } + } + } + + private void createAvoidRoadsRoutingParameterButton(MapActivity mapActivity, final LocalRoutingParameter parameter, final RouteMenuAppModes mode, LinearLayout optionsContainer) { + OsmandApplication app = mapActivity.getMyApplication(); + final LinearLayout item = createToolbarOptionView(false, null, -1, -1, null); + if (item != null) { + item.findViewById(R.id.route_option_container).setVisibility(View.GONE); + Map impassableRoads = new TreeMap<>(); + if (parameter instanceof AvoidRoadsRoutingParameter) { + impassableRoads = app.getAvoidSpecificRoads().getImpassableRoads(); + } + + final List avoidedParameters = getAvoidedParameters(app); + createImpassableRoadsItems(mapActivity, impassableRoads, parameter, mode, item); + createAvoidParametersItems(mapActivity, avoidedParameters, parameter, mode, item); + if (avoidedParameters.size() > 0 || impassableRoads.size() > 0) { + optionsContainer.addView(item, getContainerButtonLayoutParams(mapActivity, true)); + } + } + } + + private List getAvoidedParameters(OsmandApplication app) { + final ApplicationMode applicationMode = app.getRoutingHelper().getAppMode(); + List avoidParameters = app.getRoutingOptionsHelper().getAvoidRoutingPrefsForAppMode(applicationMode); + final List avoidedParameters = new ArrayList<>(); + for (int i = 0; i < avoidParameters.size(); i++) { + RoutingParameter p = avoidParameters.get(i); + CommonPreference preference = app.getSettings().getCustomRoutingBooleanProperty(p.getId(), p.getDefaultBoolean()); + if (preference != null && preference.getModeValue(app.getRoutingHelper().getAppMode())) { + avoidedParameters.add(p); + } + } + return avoidedParameters; + } + + private void createImpassableRoadsItems(MapActivity mapActivity, Map impassableRoads, final LocalRoutingParameter parameter, final RouteMenuAppModes mode, final LinearLayout item) { + OsmandApplication app = mapActivity.getMyApplication(); + Iterator it = impassableRoads.values().iterator(); + while (it.hasNext()) { + final RouteDataObject routeDataObject = it.next(); + final View container = createToolbarSubOptionView(false, app.getAvoidSpecificRoads().getText(routeDataObject), R.drawable.ic_action_remove_dark, !it.hasNext(), new OnClickListener() { + @Override + public void onClick(View v) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + OsmandApplication app = mapActivity.getMyApplication(); + RoutingHelper routingHelper = app.getRoutingHelper(); + if (routeDataObject != null) { + app.getAvoidSpecificRoads().removeImpassableRoad(routeDataObject); + } + routingHelper.recalculateRouteDueToSettingsChange(); + if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty() && getAvoidedParameters(app).isEmpty()) { + mode.parameters.remove(parameter); + } + mapActivity.getMapView().refreshMap(); + if (mode.parameters.size() > 2) { + item.removeView(v); + } else { + updateOptionsButtons(); + } + } + } + }); + if (container != null) { + item.addView(container, getContainerButtonLayoutParams(mapActivity, false)); + } + } + } + + private void createAvoidParametersItems(MapActivity mapActivity, final List avoidedParameters, final LocalRoutingParameter parameter, final RouteMenuAppModes mode, final LinearLayout item) { + final OsmandSettings settings = mapActivity.getMyApplication().getSettings(); + for (int i = 0; i < avoidedParameters.size(); i++) { + final RoutingParameter routingParameter = avoidedParameters.get(i); + final View container = createToolbarSubOptionView(false, SettingsBaseActivity.getRoutingStringPropertyName(app, routingParameter.getId(), routingParameter.getName()), R.drawable.ic_action_remove_dark, i == avoidedParameters.size() - 1, new OnClickListener() { + @Override + public void onClick(View v) { + OsmandApplication app = getApp(); + if (app == null) { + return; + } + CommonPreference preference = settings.getCustomRoutingBooleanProperty(routingParameter.getId(), routingParameter.getDefaultBoolean()); + preference.setModeValue(app.getRoutingHelper().getAppMode(), false); + avoidedParameters.remove(routingParameter); + app.getRoutingHelper().recalculateRouteDueToSettingsChange(); + if (app.getAvoidSpecificRoads().getImpassableRoads().isEmpty() && avoidedParameters.isEmpty()) { + mode.parameters.remove(parameter); + } + if (mode.parameters.size() > 2) { + item.removeView(v); + } else { + updateOptionsButtons(); + } + } + }); + if (container != null) { + item.addView(container, getContainerButtonLayoutParams(mapActivity, false)); + } + } + } + + private void createLocalRoutingParameterGroupButton(MapActivity mapActivity, final LocalRoutingParameter parameter, LinearLayout optionsContainer) { + final OsmandSettings settings = mapActivity.getMyApplication().getSettings(); + final LocalRoutingParameterGroup group = (LocalRoutingParameterGroup) parameter; + String text = null; + LocalRoutingParameter selected = group.getSelected(settings); + if (selected != null) { + text = group.getText(mapActivity); + } + View item = createToolbarOptionView(false, text, parameter.getActiveIconId(), parameter.getDisabledIconId(), new OnClickListener() { + @Override + public void onClick(View v) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.getMyApplication().getRoutingOptionsHelper().showLocalRoutingParameterGroupDialog(group, mapActivity, new RoutingOptionsHelper.OnClickListener() { + @Override + public void onClick() { + updateOptionsButtons(); + } + }); + } + } + }); + if (item != null) { + optionsContainer.addView(item, getContainerButtonLayoutParams(mapActivity, true)); + } + } + + private void createSimpleRoutingParameterButton(MapActivity mapActivity, final LocalRoutingParameter parameter, LinearLayout optionsContainer) { + OsmandApplication app = mapActivity.getMyApplication(); + RoutingHelper routingHelper = app.getRoutingHelper(); + final int colorActive = ContextCompat.getColor(app, nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); + final int colorDisabled = ContextCompat.getColor(app, R.color.description_font_and_bottom_sheet_icons); + int margin = AndroidUtils.dpToPx(app, 3); + final OsmandSettings settings = app.getSettings(); + String text; + boolean active; + if (parameter.routingParameter != null) { + if (parameter.routingParameter.getId().equals(GeneralRouter.USE_SHORTEST_WAY)) { + // if short route settings - it should be inverse of fast_route_mode + active = !settings.FAST_ROUTE_MODE.getModeValue(routingHelper.getAppMode()); + } else { + active = parameter.isSelected(settings); + } + text = parameter.getText(mapActivity); + View item = createToolbarOptionView(active, text, parameter.getActiveIconId(), parameter.getDisabledIconId(), new OnClickListener() { + @Override + public void onClick(View v) { + OsmandApplication app = getApp(); + if (parameter.routingParameter != null && app != null) { + boolean selected = !parameter.isSelected(settings); + app.getRoutingOptionsHelper().applyRoutingParameter(parameter, selected); + + Drawable itemDrawable = app.getUIUtilities().getIcon(selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.route_info_control_icon_color_dark : R.color.route_info_control_icon_color_light); + Drawable activeItemDrawable = app.getUIUtilities().getIcon(selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(), nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light); + + if (Build.VERSION.SDK_INT >= 21) { + itemDrawable = AndroidUtils.createPressedStateListDrawable(itemDrawable, activeItemDrawable); + } + ((ImageView) v.findViewById(R.id.route_option_image_view)).setImageDrawable(selected ? activeItemDrawable : itemDrawable); + ((TextView) v.findViewById(R.id.route_option_title)).setTextColor(selected ? colorActive : colorDisabled); + } + } + }); + if (item != null) { + LinearLayout.LayoutParams layoutParams = getContainerButtonLayoutParams(mapActivity, false); + layoutParams.setMargins(margin, 0, margin, 0); + optionsContainer.addView(item, layoutParams); + } + } + } + + private LinearLayout.LayoutParams getContainerButtonLayoutParams(Context context, boolean containerParams) { + if (containerParams) { + int margin = AndroidUtils.dpToPx(context, 3); + LinearLayout.LayoutParams containerBtnLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); + containerBtnLp.setMargins(margin, 0, margin, 0); + return containerBtnLp; + } else { + return new LinearLayout.LayoutParams(AndroidUtils.dpToPx(context, 100), ViewGroup.LayoutParams.MATCH_PARENT); + } + } + @Nullable private LinearLayout createToolbarOptionView(boolean active, String title, @DrawableRes int activeIconId, - @DrawableRes int disabledIconId, OnClickListener listener) { + @DrawableRes int disabledIconId, OnClickListener listener) { MapActivity mapActivity = getMapActivity(); if (mapActivity == null) { return null; @@ -1196,7 +1255,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener @Nullable private View createToolbarSubOptionView(boolean hideTextLine, String title, @DrawableRes int iconId, - boolean lastItem, OnClickListener listener) { + boolean lastItem, OnClickListener listener) { MapActivity mapActivity = getMapActivity(); if (mapActivity == null) { return null; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ShowAlongTheRouteBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ShowAlongTheRouteBottomSheet.java index 3aef796c58..39d98c23e3 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ShowAlongTheRouteBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ShowAlongTheRouteBottomSheet.java @@ -460,6 +460,17 @@ public class ShowAlongTheRouteBottomSheet extends MenuBottomSheetDialogFragment } } + private MapActivity getMapActivity() { + return (MapActivity) getActivity(); + } + + private void updateMenu() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + mapActivity.getMapRouteInfoMenu().updateMenu(); + } + } + protected void selectDifferentRadius(final int type) { int length = WaypointHelper.SEARCH_RADIUS_VALUES.length; String[] names = new String[length]; @@ -548,6 +559,7 @@ public class ShowAlongTheRouteBottomSheet extends MenuBottomSheetDialogFragment ShowAlongTheRouteBottomSheet fragment = fragmentRef.get(); if (fragment != null && fragment.isAdded()) { fragment.updateAdapter(); + fragment.updateMenu(); } } } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java index e50b27a7fd..f2663aa870 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java @@ -2,7 +2,6 @@ package net.osmand.plus.routepreparationmenu.cards; import android.graphics.Matrix; import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; import android.view.MotionEvent; @@ -72,7 +71,7 @@ public class RouteStatisticCard extends BaseCard { SpannableStringBuilder distanceStr = new SpannableStringBuilder(text); int spaceIndex = text.indexOf(" "); if (spaceIndex != -1) { - distanceStr.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)), 0, spaceIndex, 0); + distanceStr.setSpan(new ForegroundColorSpan(getMainFontColor()), 0, spaceIndex, 0); } distanceTv.setText(distanceStr); SpannableStringBuilder timeStr = new SpannableStringBuilder(); @@ -84,7 +83,7 @@ public class RouteStatisticCard extends BaseCard { } spaceIndex = timeStr.toString().lastIndexOf(" "); if (spaceIndex != -1) { - timeStr.setSpan(new ForegroundColorSpan(ContextCompat.getColor(app, nightMode ? R.color.primary_text_dark : R.color.primary_text_light)), 0, spaceIndex, 0); + timeStr.setSpan(new ForegroundColorSpan(getMainFontColor()), 0, spaceIndex, 0); } TextView timeTv = (TextView) view.findViewById(R.id.time); timeTv.setText(timeStr); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java index 9f4bff7845..f02032e257 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java @@ -53,7 +53,7 @@ public class WarningCard extends BaseCard { @Override public void onClick(@NonNull View widget) { - WikipediaDialogFragment.showFullArticle(app, Uri.parse(OSMAND_BLOG_LINK), nightMode); + WikipediaDialogFragment.showFullArticle(mapActivity, Uri.parse(OSMAND_BLOG_LINK), nightMode); } }; int startIndex = text.lastIndexOf(" ");