From 85c75ca283f9706c502f25cdf2ca6618a45b1ecc Mon Sep 17 00:00:00 2001 From: androiddevkkotlin Date: Thu, 26 Nov 2020 12:46:03 +0200 Subject: [PATCH 1/5] Combine "Use elevation data" and "Elevation fluctuation" into one dialog --- OsmAnd/res/values/strings.xml | 1 + .../RouteOptionsBottomSheet.java | 42 +++- .../plus/settings/backend/OsmandSettings.java | 2 +- .../BooleanPreferenceBottomSheet.java | 33 ++- .../ElevationDateBottomSheet.java | 195 ++++++++++++++++++ ...ecalculateRouteInDeviationBottomSheet.java | 4 +- .../fragments/RouteParametersFragment.java | 25 ++- 7 files changed, 263 insertions(+), 39 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 72fb10e393..cd194a60a5 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + You can use Elevation data for consideration of Ascent / Descent for your trip OsmAnd shows photos from several sources:\nOpenPlaceReviews - POI photos;\nMapillary - street-level imagery;\nWeb / Wikimedia - POI photos specified in OpenStreetMap data. Use dev.openstreetmap.org Switch to use "dev.openstreetmap.org" instead of "openstreetmap.org" to testing uploading OSM Note / POI / GPX. diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index d18537bfb8..d2f01fe4c2 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -46,15 +46,20 @@ import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.bottomsheets.ElevationDateBottomSheet; import net.osmand.plus.settings.fragments.BaseSettingsFragment; import net.osmand.router.GeneralRouter; import net.osmand.util.Algorithms; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import static net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DRIVING_STYLE; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.RELIEF_SMOOTHNESS_FACTOR; +import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { @@ -436,18 +441,27 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } else { builder.setChecked(parameter.isSelected(settings)); } + builder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - routingOptionsHelper.addNewRouteMenuParameter(applicationMode, parameter); - boolean selected = !parameter.isSelected(settings); - routingOptionsHelper.applyRoutingParameter(parameter, selected); - item[0].setChecked(selected); - int iconId = selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(); - if (iconId != -1) { - item[0].setIcon(getContentIcon(iconId)); + GeneralRouter router = app.getRouter(applicationMode); + List reliefFactorParameters = new ArrayList(); + Map parameters = router.getParameters(); + for (Map.Entry e : parameters.entrySet()) { + GeneralRouter.RoutingParameter routingParameter = e.getValue(); + if (RELIEF_SMOOTHNESS_FACTOR.equals(routingParameter.getGroup())) { + reliefFactorParameters.add(routingParameter); + } + } + if (!reliefFactorParameters.isEmpty() && parameter.getKey().equals(USE_HEIGHT_OBSTACLES)) { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager != null) { + ElevationDateBottomSheet.showInstance(fragmentManager, reliefFactorParameters, applicationMode, RouteOptionsBottomSheet.this, false); + } + } else { + applyParameter(item[0], parameter); } - updateMenu(); } }); } @@ -459,6 +473,18 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } } + private void applyParameter(BottomSheetItemWithCompoundButton bottomSheetItem, LocalRoutingParameter parameter) { + routingOptionsHelper.addNewRouteMenuParameter(applicationMode, parameter); + boolean selected = !parameter.isSelected(settings); + routingOptionsHelper.applyRoutingParameter(parameter, selected); + bottomSheetItem.setChecked(selected); + int iconId = selected ? parameter.getActiveIconId() : parameter.getDisabledIconId(); + if (iconId != -1) { + bottomSheetItem.setIcon(getContentIcon(iconId)); + } + updateMenu(); + } + private void updateMenu() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 065fd2113a..90c63d3334 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -97,7 +97,7 @@ public class OsmandSettings { private static String CUSTOM_SHARED_PREFERENCES_NAME; private static final String RENDERER_PREFERENCE_PREFIX = "nrenderer_"; - private static final String ROUTING_PREFERENCE_PREFIX = "prouting_"; + public static final String ROUTING_PREFERENCE_PREFIX = "prouting_"; /// Settings variables private final OsmandApplication ctx; diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java index 3730833d4d..98c4397327 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java @@ -9,21 +9,22 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; -import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.settings.backend.BooleanPreference; -import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.BooleanPreference; +import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.settings.fragments.ApplyQueryType; import net.osmand.plus.settings.fragments.OnConfirmPreferenceChange; import net.osmand.plus.settings.fragments.OnPreferenceChanged; @@ -39,7 +40,7 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { @Override public void createMenuItems(Bundle savedInstanceState) { - OsmandApplication app = getMyApplication(); + final OsmandApplication app = getMyApplication(); if (app == null) { return; } @@ -72,7 +73,7 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { .setChecked(checked) .setTitle(checked ? on : off) .setTitleColorId(checked ? activeColor : disabledColor) - .setCustomView(getCustomButtonView(checked)) + .setCustomView(getCustomButtonView(app, getAppMode(), checked, nightMode)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -91,7 +92,7 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { preferenceBtn[0].setTitle(newValue ? on : off); preferenceBtn[0].setChecked(newValue); preferenceBtn[0].setTitleColorId(newValue ? activeColor : disabledColor); - updateCustomButtonView(v, newValue); + updateCustomButtonView(app, getAppMode(), v, newValue, nightMode); if (targetFragment instanceof OnPreferenceChanged) { ((OnPreferenceChanged) targetFragment).onPreferenceChanged(switchPreference.getKey()); @@ -121,25 +122,24 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { return R.string.shared_string_cancel; } - protected View getCustomButtonView(boolean checked) { - View customView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_preference_switch, null); - updateCustomButtonView(customView, checked); + protected static View getCustomButtonView(OsmandApplication app, ApplicationMode mode, boolean checked, boolean nightMode) { + View customView = UiUtilities.getInflater(app, nightMode).inflate(R.layout.bottom_sheet_item_preference_switch, null); + updateCustomButtonView(app, mode, customView, checked, nightMode); return customView; } - protected void updateCustomButtonView(View customView, boolean checked) { - OsmandApplication app = requiredMyApplication(); + protected static void updateCustomButtonView(OsmandApplication app, ApplicationMode mode, View customView, boolean checked, boolean nightMode) { Context themedCtx = UiUtilities.getThemedContext(app, nightMode); View buttonView = customView.findViewById(R.id.button_container); - int colorRes = getAppMode().getIconColorInfo().getColor(nightMode); - int color = checked ? getResolvedColor(colorRes) : AndroidUtils.getColorFromAttr(themedCtx, R.attr.divider_color_basic); + int colorRes = mode.getIconColorInfo().getColor(nightMode); + int color = checked ? ContextCompat.getColor(themedCtx, colorRes) : AndroidUtils.getColorFromAttr(themedCtx, R.attr.divider_color_basic); int bgColor = UiUtilities.getColorWithAlpha(color, checked ? 0.1f : 0.5f); int selectedColor = UiUtilities.getColorWithAlpha(color, checked ? 0.3f : 0.5f); + int bgResId = R.drawable.rectangle_rounded_right; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { - int bgResId = R.drawable.rectangle_rounded_right; int selectableResId = R.drawable.ripple_rectangle_rounded_right; Drawable bgDrawable = app.getUIUtilities().getPaintedIcon(bgResId, bgColor); @@ -147,7 +147,6 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { Drawable[] layers = {bgDrawable, selectable}; AndroidUtils.setBackground(buttonView, new LayerDrawable(layers)); } else { - int bgResId = R.drawable.rectangle_rounded_right; Drawable bgDrawable = app.getUIUtilities().getPaintedIcon(bgResId, bgColor); AndroidUtils.setBackground(buttonView, bgDrawable); } @@ -158,8 +157,8 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { } public static void showInstance(@NonNull FragmentManager fm, String prefId, Fragment target, boolean usedOnMap, - @Nullable ApplicationMode appMode, ApplyQueryType applyQueryType, - boolean profileDependent) { + @Nullable ApplicationMode appMode, ApplyQueryType applyQueryType, + boolean profileDependent) { try { if (fm.findFragmentByTag(BooleanPreferenceBottomSheet.TAG) == null) { Bundle args = new Bundle(); diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java new file mode 100644 index 0000000000..49785bda09 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java @@ -0,0 +1,195 @@ +package net.osmand.plus.settings.bottomsheets; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + +import net.osmand.AndroidUtils; +import net.osmand.PlatformUtil; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.routing.RoutingHelper; +import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.BooleanPreference; +import net.osmand.plus.settings.fragments.BaseSettingsFragment; +import net.osmand.plus.settings.fragments.OnPreferenceChanged; +import net.osmand.router.GeneralRouter.RoutingParameter; + +import org.apache.commons.logging.Log; + +import java.util.ArrayList; +import java.util.List; + +import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.getCustomButtonView; +import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.updateCustomButtonView; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.setRoutingParameterSelected; +import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; + +public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { + + public static final String TAG = ElevationDateBottomSheet.class.getSimpleName(); + + private static final Log LOG = PlatformUtil.getLog(ElevationDateBottomSheet.class); + + private OsmandApplication app; + private ApplicationMode appMode; + private List reliefFactorParameters = new ArrayList(); + private static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key"; + + private final List reliefFactorButtons = new ArrayList<>(); + private int selectedEntryIndex = -1; + + public void setAppMode(ApplicationMode appMode) { + this.appMode = appMode; + } + + public ApplicationMode getAppMode() { + return appMode != null ? appMode : app.getSettings().getApplicationMode(); + } + + @Override + public void createMenuItems(Bundle savedInstanceState) { + app = requiredMyApplication(); + Context ctx = requireContext(); + int contentPaddingSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small); + + final BooleanPreference pref = (BooleanPreference) app.getSettings().getCustomRoutingBooleanProperty(USE_HEIGHT_OBSTACLES, false); + + Context themedCtx = UiUtilities.getThemedContext(ctx, nightMode); + + final String on = getString(R.string.shared_string_enable); + final String off = getString(R.string.shared_string_disable); + final int activeColor = AndroidUtils.resolveAttribute(themedCtx, R.attr.active_color_basic); + final int disabledColor = AndroidUtils.resolveAttribute(themedCtx, android.R.attr.textColorSecondary); + if (savedInstanceState != null) { + selectedEntryIndex = savedInstanceState.getInt(SELECTED_ENTRY_INDEX_KEY); + } + boolean checked = pref.getModeValue(getAppMode()); + final BottomSheetItemWithCompoundButton[] preferenceBtn = new BottomSheetItemWithCompoundButton[1]; + preferenceBtn[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + .setChecked(checked) + .setTitle(checked ? on : off) + .setTitleColorId(checked ? activeColor : disabledColor) + .setCustomView(getCustomButtonView(app, getAppMode(), checked, nightMode)) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean newValue = !pref.getModeValue(getAppMode()); + enableItems(newValue); + Fragment targetFragment = getTargetFragment(); + pref.setModeValue(getAppMode(), newValue); + + preferenceBtn[0].setTitle(newValue ? on : off); + preferenceBtn[0].setChecked(newValue); + preferenceBtn[0].setTitleColorId(newValue ? activeColor : disabledColor); + updateCustomButtonView(app, getAppMode(), v, newValue, nightMode); + + if (targetFragment instanceof OnPreferenceChanged) { + ((OnPreferenceChanged) targetFragment).onPreferenceChanged(pref.getId()); + } + if (targetFragment instanceof BaseSettingsFragment) { + ((BaseSettingsFragment) targetFragment).updateSetting(pref.getId()); + } + } + }) + .create(); + preferenceBtn[0].setCompoundButtonColorId(getAppMode().getIconColorInfo().getColor(nightMode)); + items.add(new TitleItem(getString(R.string.routing_attr_height_obstacles_name))); + items.add(preferenceBtn[0]); + items.add(new DividerSpaceItem(getMyApplication(), contentPaddingSmall)); + items.add(new LongDescriptionItem(getString(R.string.elevation_data))); + items.add(new DividerSpaceItem(getMyApplication(), contentPaddingSmall)); + + for (int i = 0; i < reliefFactorParameters.size(); i++) { + RoutingParameter parameter = reliefFactorParameters.get(i); + final BottomSheetItemWithCompoundButton[] preferenceItem = new BottomSheetItemWithCompoundButton[1]; + preferenceItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + .setChecked(i == selectedEntryIndex) + .setButtonTintList(AndroidUtils.createCheckedColorStateList(ctx, R.color.icon_color_default_light, getAppMode().getIconColorInfo().getColor(nightMode))) + .setTitle(getRoutingParameterTitle(app, parameter)) + .setTag(i) + .setLayoutId(R.layout.bottom_sheet_item_with_radio_btn_left) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selectedEntryIndex = (int) preferenceItem[0].getTag(); + if (selectedEntryIndex >= 0) { + RoutingParameter parameter = reliefFactorParameters.get(selectedEntryIndex); + + String selectedParameterId = parameter.getId(); + for (RoutingParameter p : reliefFactorParameters) { + String parameterId = p.getId(); + setRoutingParameterSelected(app.getSettings(), appMode, parameterId, p.getDefaultBoolean(), parameterId.equals(selectedParameterId)); + } + recalculateRoute(); + + Fragment targetFragment = getTargetFragment(); + if (targetFragment instanceof OnPreferenceChanged) { + ((OnPreferenceChanged) targetFragment).onPreferenceChanged(pref.getId()); + } + } + updateItems(); + } + }) + .create(); + reliefFactorButtons.add(preferenceItem[0]); + items.add(preferenceItem[0]); + } + } + + private void recalculateRoute() { + RoutingHelper routingHelper = app.getRoutingHelper(); + if (getAppMode().equals(routingHelper.getAppMode()) + && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { + routingHelper.recalculateRouteDueToSettingsChange(); + } + } + + private String getRoutingParameterTitle(Context context, RoutingParameter parameter) { + return AndroidUtils.getRoutingStringPropertyName(context, parameter.getId(), parameter.getName()); + } + + private void updateItems() { + for (BaseBottomSheetItem item : reliefFactorButtons) { + if (item instanceof BottomSheetItemWithCompoundButton) { + boolean checked = item.getTag().equals(selectedEntryIndex); + ((BottomSheetItemWithCompoundButton) item).setChecked(checked); + } + } + } + + private void enableItems(boolean enable) { + for (BaseBottomSheetItem item : reliefFactorButtons) { + if (item instanceof BottomSheetItemWithCompoundButton) { + item.getView().setEnabled(enable); + } + } + } + + public static void showInstance(FragmentManager fm, List reliefFactorParameters, + ApplicationMode appMode, Fragment target, boolean usedOnMap) { + try { + if (fm.findFragmentByTag(ElevationDateBottomSheet.TAG) == null) { + ElevationDateBottomSheet fragment = new ElevationDateBottomSheet(); + fragment.setAppMode(appMode); + fragment.setUsedOnMap(usedOnMap); + fragment.reliefFactorParameters.addAll(reliefFactorParameters); + fragment.setTargetFragment(target, 0); + fragment.show(fm, ScreenTimeoutBottomSheet.TAG); + } + } catch (RuntimeException e) { + LOG.error("showInstance", e); + } + } +} + diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java index d2679564a8..99fb5fa73a 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java @@ -111,7 +111,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot .setCompoundButtonColorId(appModeColorId) .setTitle(enabled ? on : off) .setTitleColorId(enabled ? activeColor : disabledColor) - .setCustomView(getCustomButtonView(enabled)) + .setCustomView(getCustomButtonView(app, getAppMode(), enabled, nightMode)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -123,7 +123,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot preferenceBtn[0].setChecked(enabled); getDefaultValue(); updateSliderView(); - updateCustomButtonView(v, enabled); + updateCustomButtonView(app, getAppMode(), v, enabled, nightMode); Fragment target = getTargetFragment(); float newValue = enabled ? DEFAULT_MODE : DISABLE_MODE; if (target instanceof OnConfirmPreferenceChange) { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index b688d5dab4..223ad25083 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -38,6 +38,7 @@ import net.osmand.plus.settings.backend.BooleanPreference; import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.OsmandPreference; import net.osmand.plus.settings.backend.OsmandSettings; +import net.osmand.plus.settings.bottomsheets.ElevationDateBottomSheet; import net.osmand.plus.settings.bottomsheets.RecalculateRouteInDeviationBottomSheet; import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.MultiSelectBooleanPreference; @@ -54,6 +55,8 @@ import java.util.Map; import java.util.Set; import static net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DRIVING_STYLE; +import static net.osmand.plus.settings.backend.OsmandSettings.ROUTING_PREFERENCE_PREFIX; +import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; public class RouteParametersFragment extends BaseSettingsFragment implements OnPreferenceChanged { @@ -63,7 +66,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP private static final String PREFER_ROUTING_PARAMETER_PREFIX = "prefer_"; private static final String ROUTE_PARAMETERS_INFO = "route_parameters_info"; private static final String ROUTE_PARAMETERS_IMAGE = "route_parameters_image"; - private static final String RELIEF_SMOOTHNESS_FACTOR = "relief_smoothness_factor"; + public static final String RELIEF_SMOOTHNESS_FACTOR = "relief_smoothness_factor"; private static final String ROUTING_SHORT_WAY = "prouting_short_way"; private static final String ROUTING_RECALC_DISTANCE = "routing_recalc_distance"; private static final String ROUTING_RECALC_WRONG_DIRECTION = "disable_wrong_direction_recalc"; @@ -275,12 +278,6 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP MultiSelectBooleanPreference preferRouting = createRoutingBooleanMultiSelectPref(PREFER_ROUTING_PARAMETER_PREFIX, title, "", preferParameters); screen.addPreference(preferRouting); } - if (reliefFactorParameters.size() > 0) { - ListPreferenceEx reliefFactorRouting = createRoutingBooleanListPreference(RELIEF_SMOOTHNESS_FACTOR, reliefFactorParameters); - reliefFactorRouting.setDescription(R.string.relief_smoothness_factor_descr); - - screen.addPreference(reliefFactorRouting); - } for (RoutingParameter p : otherRoutingParameters) { String title = AndroidUtils.getRoutingStringPropertyName(app, p.getId(), p.getName()); String description = AndroidUtils.getRoutingStringPropertyDescription(app, p.getId(), p.getDescription()); @@ -390,6 +387,12 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP if (fragmentManager != null) { RecalculateRouteInDeviationBottomSheet.showInstance(getFragmentManager(), preference.getKey(), this, false, getSelectedAppMode()); } + } else if (!reliefFactorParameters.isEmpty() && preference.getKey().equals(ROUTING_PREFERENCE_PREFIX + USE_HEIGHT_OBSTACLES)) { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager != null) { + ApplicationMode appMode = getSelectedAppMode(); + ElevationDateBottomSheet.showInstance(fragmentManager, reliefFactorParameters, appMode, this, false); + } } else { super.onDisplayPreferenceDialog(preference); } @@ -658,8 +661,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } } - private void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, - String parameterId, boolean defaultBoolean, boolean isChecked) { + public static void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, + String parameterId, boolean defaultBoolean, boolean isChecked) { CommonPreference property = settings.getCustomRoutingBooleanProperty(parameterId, defaultBoolean); if (mode != null) { property.setModeValue(mode, isChecked); @@ -678,9 +681,9 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP Drawable disabled = getContentIcon(R.drawable.ic_action_avoid_motorways); Drawable enabled = getActiveIcon(R.drawable.ic_action_motorways); return getPersistentPrefIcon(enabled, disabled); - case GeneralRouter.USE_HEIGHT_OBSTACLES: + case USE_HEIGHT_OBSTACLES: case RELIEF_SMOOTHNESS_FACTOR: - return getPersistentPrefIcon(R.drawable.ic_action_elevation); + return getPersistentPrefIcon(R.drawable.ic_action_altitude_average); case AVOID_ROUTING_PARAMETER_PREFIX: return getPersistentPrefIcon(R.drawable.ic_action_alert); case DRIVING_STYLE: From afb6639d76e8690bca5ab47269ac1c0275e2fc64 Mon Sep 17 00:00:00 2001 From: androiddevkkotlin Date: Sun, 29 Nov 2020 21:43:48 +0200 Subject: [PATCH 2/5] Second dialog --- .../RouteOptionsBottomSheet.java | 79 ++++-- .../ElevationDateBottomSheet.java | 234 ++++++++++-------- .../SingleSelectPreferenceBottomSheet.java | 2 +- .../fragments/RouteParametersFragment.java | 37 +-- 4 files changed, 209 insertions(+), 143 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index d2f01fe4c2..4c54fa47b0 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -45,14 +45,15 @@ import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.TimeConditional import net.osmand.plus.routing.RouteProvider; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; +import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.bottomsheets.ElevationDateBottomSheet; import net.osmand.plus.settings.fragments.BaseSettingsFragment; import net.osmand.router.GeneralRouter; +import net.osmand.router.GeneralRouter.RoutingParameter; import net.osmand.util.Algorithms; import java.io.File; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -73,13 +74,16 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { @ColorRes private int selectedModeColorId; private boolean currentMuteState; + private boolean currentUseHeightState; private MapActivity mapActivity; - StateChangedListener voiceMuteChangeListener; + private CommonPreference useHeightPref; + private StateChangedListener voiceMuteChangeListener; + private StateChangedListener useHeightChangeListener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - app = getMyApplication(); + app = requiredMyApplication(); settings = app.getSettings(); routingHelper = app.getRoutingHelper(); routingOptionsHelper = app.getRoutingOptionsHelper(); @@ -92,16 +96,13 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { updateWhenMuteChanged(); } }; - } - - public void updateWhenMuteChanged() { - if (app != null) { - boolean changedState = app.getSettings().VOICE_MUTE.getModeValue(applicationMode); - if (changedState != currentMuteState) { - currentMuteState = changedState; - updateParameters(); + useHeightChangeListener = new StateChangedListener() { + @Override + public void stateChanged(Boolean change) { + updateWhenUseHeightChanged(); } - } + }; + useHeightPref = settings.getCustomRoutingBooleanProperty(USE_HEIGHT_OBSTACLES, false); } @Override @@ -144,12 +145,17 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { itemWithCompoundButton.setChecked(itemWithCompoundButton.isChecked()); } } + currentUseHeightState = useHeightPref.getModeValue(applicationMode); + currentMuteState = app.getSettings().VOICE_MUTE.getModeValue(applicationMode); + + useHeightPref.addListener(useHeightChangeListener); app.getSettings().VOICE_MUTE.addListener(voiceMuteChangeListener); } @Override public void onPause() { super.onPause(); + useHeightPref.removeListener(useHeightChangeListener); app.getSettings().VOICE_MUTE.removeListener(voiceMuteChangeListener); } @@ -172,6 +178,24 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } } + public void updateWhenMuteChanged() { + boolean changedState = app.getSettings().VOICE_MUTE.getModeValue(applicationMode); + if (changedState != currentMuteState) { + currentMuteState = changedState; + updateParameters(); + updateMenu(); + } + } + + public void updateWhenUseHeightChanged() { + boolean changedState = useHeightPref.getModeValue(applicationMode); + if (changedState != currentUseHeightState) { + currentUseHeightState = changedState; + updateParameters(); + updateMenu(); + } + } + private BaseBottomSheetItem createMuteSoundItem(final LocalRoutingParameter optionsItem) { boolean active = !routingHelper.getVoiceRouter().isMuteForMode(applicationMode); int selectedModeColor = ContextCompat.getColor(app, selectedModeColorId); @@ -437,27 +461,17 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { builder.setLayoutId(R.layout.bottom_sheet_item_with_switch_56dp); if (parameter.routingParameter != null && parameter.routingParameter.getId().equals(GeneralRouter.USE_SHORTEST_WAY)) { // if short route settings - it should be inverse of fast_route_mode - builder.setChecked(!settings.FAST_ROUTE_MODE.getModeValue(routingHelper.getAppMode())); + builder.setChecked(!settings.FAST_ROUTE_MODE.getModeValue(applicationMode)); } else { builder.setChecked(parameter.isSelected(settings)); } - builder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - GeneralRouter router = app.getRouter(applicationMode); - List reliefFactorParameters = new ArrayList(); - Map parameters = router.getParameters(); - for (Map.Entry e : parameters.entrySet()) { - GeneralRouter.RoutingParameter routingParameter = e.getValue(); - if (RELIEF_SMOOTHNESS_FACTOR.equals(routingParameter.getGroup())) { - reliefFactorParameters.add(routingParameter); - } - } - if (!reliefFactorParameters.isEmpty() && parameter.getKey().equals(USE_HEIGHT_OBSTACLES)) { - FragmentManager fragmentManager = getFragmentManager(); - if (fragmentManager != null) { - ElevationDateBottomSheet.showInstance(fragmentManager, reliefFactorParameters, applicationMode, RouteOptionsBottomSheet.this, false); + if (USE_HEIGHT_OBSTACLES.equals(parameter.getKey()) && hasReliefParameters()) { + FragmentManager fm = getFragmentManager(); + if (fm != null) { + ElevationDateBottomSheet.showInstance(fm, applicationMode, RouteOptionsBottomSheet.this, false); } } else { applyParameter(item[0], parameter); @@ -473,6 +487,17 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } } + private boolean hasReliefParameters() { + Map parameters = app.getRouter(applicationMode).getParameters(); + for (Map.Entry e : parameters.entrySet()) { + RoutingParameter routingParameter = e.getValue(); + if (RELIEF_SMOOTHNESS_FACTOR.equals(routingParameter.getGroup())) { + return true; + } + } + return false; + } + private void applyParameter(BottomSheetItemWithCompoundButton bottomSheetItem, LocalRoutingParameter parameter) { routingOptionsHelper.addNewRouteMenuParameter(applicationMode, parameter); boolean selected = !parameter.isSelected(settings); diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java index 49785bda09..7bc449448c 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Bundle; import android.view.View; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -18,172 +19,210 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.LongDescriptionItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; -import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.settings.backend.ApplicationMode; -import net.osmand.plus.settings.backend.BooleanPreference; +import net.osmand.plus.settings.backend.CommonPreference; +import net.osmand.plus.settings.fragments.ApplyQueryType; import net.osmand.plus.settings.fragments.BaseSettingsFragment; -import net.osmand.plus.settings.fragments.OnPreferenceChanged; +import net.osmand.plus.settings.fragments.OnConfirmPreferenceChange; import net.osmand.router.GeneralRouter.RoutingParameter; import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import static net.osmand.AndroidUtils.createCheckedColorStateList; import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.getCustomButtonView; import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.updateCustomButtonView; -import static net.osmand.plus.settings.fragments.RouteParametersFragment.setRoutingParameterSelected; +import static net.osmand.plus.settings.fragments.BaseSettingsFragment.APP_MODE_KEY; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.RELIEF_SMOOTHNESS_FACTOR; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.getRoutingParameterTitle; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.isRoutingParameterSelected; +import static net.osmand.plus.settings.fragments.RouteParametersFragment.updateSelectedParameters; import static net.osmand.router.GeneralRouter.USE_HEIGHT_OBSTACLES; public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { public static final String TAG = ElevationDateBottomSheet.class.getSimpleName(); - private static final Log LOG = PlatformUtil.getLog(ElevationDateBottomSheet.class); private OsmandApplication app; private ApplicationMode appMode; - private List reliefFactorParameters = new ArrayList(); - private static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key"; + private List parameters; + private CommonPreference useHeightPref; + + private BottomSheetItemWithCompoundButton useHeightButton; + private List reliefFactorButtons = new ArrayList<>(); - private final List reliefFactorButtons = new ArrayList<>(); private int selectedEntryIndex = -1; - public void setAppMode(ApplicationMode appMode) { - this.appMode = appMode; - } + private String on; + private String off; + private int activeColor; + private int disabledColor; + private int appModeColor; - public ApplicationMode getAppMode() { - return appMode != null ? appMode : app.getSettings().getApplicationMode(); + @Override + public void onCreate(Bundle savedInstanceState) { + app = requiredMyApplication(); + if (savedInstanceState != null) { + appMode = ApplicationMode.valueOfStringKey(savedInstanceState.getString(APP_MODE_KEY), null); + } + super.onCreate(savedInstanceState); + + Map routingParameterMap = app.getRouter(appMode).getParameters(); + RoutingParameter parameter = routingParameterMap.get(USE_HEIGHT_OBSTACLES); + if (parameter != null) { + useHeightPref = app.getSettings().getCustomRoutingBooleanProperty(parameter.getId(), parameter.getDefaultBoolean()); + } else { + useHeightPref = app.getSettings().getCustomRoutingBooleanProperty(USE_HEIGHT_OBSTACLES, false); + } + parameters = getReliefParametersForMode(routingParameterMap); + for (int i = 0; i < parameters.size(); i++) { + if (isRoutingParameterSelected(app.getSettings(), appMode, parameters.get(i))) { + selectedEntryIndex = i; + } + } } @Override public void createMenuItems(Bundle savedInstanceState) { - app = requiredMyApplication(); - Context ctx = requireContext(); + Context themedCtx = UiUtilities.getThemedContext(requireContext(), nightMode); + + on = getString(R.string.shared_string_enable); + off = getString(R.string.shared_string_disable); + appModeColor = appMode.getIconColorInfo().getColor(nightMode); + activeColor = AndroidUtils.resolveAttribute(themedCtx, R.attr.active_color_basic); + disabledColor = AndroidUtils.resolveAttribute(themedCtx, android.R.attr.textColorSecondary); + + items.add(new TitleItem(getString(R.string.routing_attr_height_obstacles_name))); + + createUseHeightButton(themedCtx); + int contentPaddingSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small); + items.add(new DividerSpaceItem(app, contentPaddingSmall)); + items.add(new LongDescriptionItem(getString(R.string.elevation_data))); + items.add(new DividerSpaceItem(app, contentPaddingSmall)); - final BooleanPreference pref = (BooleanPreference) app.getSettings().getCustomRoutingBooleanProperty(USE_HEIGHT_OBSTACLES, false); + createReliefFactorButtons(themedCtx); + } - Context themedCtx = UiUtilities.getThemedContext(ctx, nightMode); - - final String on = getString(R.string.shared_string_enable); - final String off = getString(R.string.shared_string_disable); - final int activeColor = AndroidUtils.resolveAttribute(themedCtx, R.attr.active_color_basic); - final int disabledColor = AndroidUtils.resolveAttribute(themedCtx, android.R.attr.textColorSecondary); - if (savedInstanceState != null) { - selectedEntryIndex = savedInstanceState.getInt(SELECTED_ENTRY_INDEX_KEY); - } - boolean checked = pref.getModeValue(getAppMode()); - final BottomSheetItemWithCompoundButton[] preferenceBtn = new BottomSheetItemWithCompoundButton[1]; - preferenceBtn[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + private void createUseHeightButton(Context context) { + boolean checked = useHeightPref.getModeValue(appMode); + useHeightButton = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() + .setCompoundButtonColorId(appModeColor) .setChecked(checked) .setTitle(checked ? on : off) .setTitleColorId(checked ? activeColor : disabledColor) - .setCustomView(getCustomButtonView(app, getAppMode(), checked, nightMode)) + .setCustomView(getCustomButtonView(app, appMode, checked, nightMode)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - boolean newValue = !pref.getModeValue(getAppMode()); - enableItems(newValue); - Fragment targetFragment = getTargetFragment(); - pref.setModeValue(getAppMode(), newValue); + boolean newValue = !useHeightPref.getModeValue(appMode); + Fragment target = getTargetFragment(); + if (target instanceof OnConfirmPreferenceChange) { + OnConfirmPreferenceChange confirmInterface = (OnConfirmPreferenceChange) target; + if (confirmInterface.onConfirmPreferenceChange(useHeightPref.getId(), newValue, ApplyQueryType.NONE)) { + updateUseHeightButton(useHeightButton, newValue); - preferenceBtn[0].setTitle(newValue ? on : off); - preferenceBtn[0].setChecked(newValue); - preferenceBtn[0].setTitleColorId(newValue ? activeColor : disabledColor); - updateCustomButtonView(app, getAppMode(), v, newValue, nightMode); - - if (targetFragment instanceof OnPreferenceChanged) { - ((OnPreferenceChanged) targetFragment).onPreferenceChanged(pref.getId()); - } - if (targetFragment instanceof BaseSettingsFragment) { - ((BaseSettingsFragment) targetFragment).updateSetting(pref.getId()); + if (target instanceof BaseSettingsFragment) { + ((BaseSettingsFragment) target).updateSetting(useHeightPref.getId()); + } + } + } else { + useHeightPref.setModeValue(appMode, newValue); + updateUseHeightButton(useHeightButton, newValue); } } - }) - .create(); - preferenceBtn[0].setCompoundButtonColorId(getAppMode().getIconColorInfo().getColor(nightMode)); - items.add(new TitleItem(getString(R.string.routing_attr_height_obstacles_name))); - items.add(preferenceBtn[0]); - items.add(new DividerSpaceItem(getMyApplication(), contentPaddingSmall)); - items.add(new LongDescriptionItem(getString(R.string.elevation_data))); - items.add(new DividerSpaceItem(getMyApplication(), contentPaddingSmall)); + }).create(); + items.add(useHeightButton); + } - for (int i = 0; i < reliefFactorParameters.size(); i++) { - RoutingParameter parameter = reliefFactorParameters.get(i); + private void updateUseHeightButton(BottomSheetItemWithCompoundButton button, boolean newValue) { + enableDisableReliefButtons(newValue); + button.setTitle(newValue ? on : off); + button.setChecked(newValue); + button.setTitleColorId(newValue ? activeColor : disabledColor); + updateCustomButtonView(app, appMode, button.getView(), newValue, nightMode); + } + + private void createReliefFactorButtons(Context context) { + for (int i = 0; i < parameters.size(); i++) { + RoutingParameter parameter = parameters.get(i); final BottomSheetItemWithCompoundButton[] preferenceItem = new BottomSheetItemWithCompoundButton[1]; preferenceItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() .setChecked(i == selectedEntryIndex) - .setButtonTintList(AndroidUtils.createCheckedColorStateList(ctx, R.color.icon_color_default_light, getAppMode().getIconColorInfo().getColor(nightMode))) + .setButtonTintList(createCheckedColorStateList(context, R.color.icon_color_default_light, appModeColor)) .setTitle(getRoutingParameterTitle(app, parameter)) - .setTag(i) .setLayoutId(R.layout.bottom_sheet_item_with_radio_btn_left) + .setTag(i) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectedEntryIndex = (int) preferenceItem[0].getTag(); if (selectedEntryIndex >= 0) { - RoutingParameter parameter = reliefFactorParameters.get(selectedEntryIndex); - - String selectedParameterId = parameter.getId(); - for (RoutingParameter p : reliefFactorParameters) { - String parameterId = p.getId(); - setRoutingParameterSelected(app.getSettings(), appMode, parameterId, p.getDefaultBoolean(), parameterId.equals(selectedParameterId)); - } - recalculateRoute(); - - Fragment targetFragment = getTargetFragment(); - if (targetFragment instanceof OnPreferenceChanged) { - ((OnPreferenceChanged) targetFragment).onPreferenceChanged(pref.getId()); - } + RoutingParameter parameter = parameters.get(selectedEntryIndex); + updateSelectedParameters(app, appMode, parameters, parameter.getId()); } - updateItems(); + updateReliefButtons(); } - }) - .create(); - reliefFactorButtons.add(preferenceItem[0]); + }).create(); items.add(preferenceItem[0]); + reliefFactorButtons.add(preferenceItem[0]); } } - private void recalculateRoute() { - RoutingHelper routingHelper = app.getRoutingHelper(); - if (getAppMode().equals(routingHelper.getAppMode()) - && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { - routingHelper.recalculateRouteDueToSettingsChange(); + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString(APP_MODE_KEY, appMode.getStringKey()); + } + + @Override + public void onResume() { + super.onResume(); + updateReliefButtons(); + enableDisableReliefButtons(useHeightButton.isChecked()); + } + + @Override + protected boolean isNightMode(@NonNull OsmandApplication app) { + if (usedOnMap) { + return app.getDaynightHelper().isNightModeForMapControlsForProfile(appMode); + } else { + return !app.getSettings().isLightContentForMode(appMode); } } - private String getRoutingParameterTitle(Context context, RoutingParameter parameter) { - return AndroidUtils.getRoutingStringPropertyName(context, parameter.getId(), parameter.getName()); - } - - private void updateItems() { - for (BaseBottomSheetItem item : reliefFactorButtons) { - if (item instanceof BottomSheetItemWithCompoundButton) { - boolean checked = item.getTag().equals(selectedEntryIndex); - ((BottomSheetItemWithCompoundButton) item).setChecked(checked); + private List getReliefParametersForMode(Map parameters) { + List reliefParameters = new ArrayList<>(); + for (RoutingParameter routingParameter : parameters.values()) { + if (RELIEF_SMOOTHNESS_FACTOR.equals(routingParameter.getGroup())) { + reliefParameters.add(routingParameter); } } + return reliefParameters; } - private void enableItems(boolean enable) { - for (BaseBottomSheetItem item : reliefFactorButtons) { - if (item instanceof BottomSheetItemWithCompoundButton) { - item.getView().setEnabled(enable); - } + private void updateReliefButtons() { + for (BottomSheetItemWithCompoundButton item : reliefFactorButtons) { + item.setChecked(item.getTag().equals(selectedEntryIndex)); } } - public static void showInstance(FragmentManager fm, List reliefFactorParameters, - ApplicationMode appMode, Fragment target, boolean usedOnMap) { + private void enableDisableReliefButtons(boolean enable) { + for (BaseBottomSheetItem item : reliefFactorButtons) { + item.getView().setEnabled(enable); + } + } + + public static void showInstance(FragmentManager fm, ApplicationMode appMode, Fragment target, boolean usedOnMap) { try { - if (fm.findFragmentByTag(ElevationDateBottomSheet.TAG) == null) { + if (!fm.isStateSaved() && fm.findFragmentByTag(ElevationDateBottomSheet.TAG) == null) { ElevationDateBottomSheet fragment = new ElevationDateBottomSheet(); - fragment.setAppMode(appMode); + fragment.appMode = appMode; fragment.setUsedOnMap(usedOnMap); - fragment.reliefFactorParameters.addAll(reliefFactorParameters); fragment.setTargetFragment(target, 0); fragment.show(fm, ScreenTimeoutBottomSheet.TAG); } @@ -191,5 +230,4 @@ public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { LOG.error("showInstance", e); } } -} - +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java index c7ee2da9df..dc673207b2 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SingleSelectPreferenceBottomSheet.java @@ -26,7 +26,7 @@ public class SingleSelectPreferenceBottomSheet extends BasePreferenceBottomSheet public static final String TAG = SingleSelectPreferenceBottomSheet.class.getSimpleName(); - private static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key"; + public static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key"; private static final String USE_COLLAPSIBLE_DESCRIPTION = "use_collapsible_description"; private static final int COLLAPSED_DESCRIPTION_LINES = 4; diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index 223ad25083..f763d99896 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -90,13 +90,13 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP booleanRoutingPrefListener = new StateChangedListener() { @Override public void stateChanged(Boolean change) { - recalculateRoute(); + recalculateRoute(app, getSelectedAppMode()); } }; customRoutingPrefListener = new StateChangedListener() { @Override public void stateChanged(String change) { - recalculateRoute(); + recalculateRoute(app, getSelectedAppMode()); } }; } @@ -391,7 +391,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP FragmentManager fragmentManager = getFragmentManager(); if (fragmentManager != null) { ApplicationMode appMode = getSelectedAppMode(); - ElevationDateBottomSheet.showInstance(fragmentManager, reliefFactorParameters, appMode, this, false); + ElevationDateBottomSheet.showInstance(fragmentManager, appMode, this, false); } } else { super.onDisplayPreferenceDialog(preference); @@ -534,14 +534,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP @Override public void onApplyPreferenceChange(String prefId, boolean applyToAllProfiles, Object newValue) { if ((RELIEF_SMOOTHNESS_FACTOR.equals(prefId) || DRIVING_STYLE.equals(prefId)) && newValue instanceof String) { - ApplicationMode appMode = getSelectedAppMode(); - String selectedParameterId = (String) newValue; List routingParameters = DRIVING_STYLE.equals(prefId) ? drivingStyleParameters : reliefFactorParameters; - for (RoutingParameter p : routingParameters) { - String parameterId = p.getId(); - setRoutingParameterSelected(settings, appMode, parameterId, p.getDefaultBoolean(), parameterId.equals(selectedParameterId)); - } - recalculateRoute(); + updateSelectedParameters(app, getSelectedAppMode(), routingParameters, (String) newValue); } else if (ROUTING_SHORT_WAY.equals(prefId) && newValue instanceof Boolean) { applyPreference(ROUTING_SHORT_WAY, applyToAllProfiles, newValue); applyPreference(settings.FAST_ROUTE_MODE.getId(), applyToAllProfiles, !(Boolean) newValue); @@ -568,7 +562,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP @Override public void onPreferenceChanged(String prefId) { if (AVOID_ROUTING_PARAMETER_PREFIX.equals(prefId) || PREFER_ROUTING_PARAMETER_PREFIX.equals(prefId)) { - recalculateRoute(); + recalculateRoute(app, getSelectedAppMode()); } } @@ -632,9 +626,9 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP return multiSelectPref; } - private void recalculateRoute() { + private static void recalculateRoute(OsmandApplication app, ApplicationMode mode) { RoutingHelper routingHelper = app.getRoutingHelper(); - if (getSelectedAppMode().equals(routingHelper.getAppMode()) + if (mode.equals(routingHelper.getAppMode()) && (routingHelper.isRouteCalculated() || routingHelper.isRouteBeingCalculated())) { routingHelper.recalculateRouteDueToSettingsChange(); } @@ -648,11 +642,11 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP otherRoutingParameters.clear(); } - private String getRoutingParameterTitle(Context context, RoutingParameter parameter) { + public static String getRoutingParameterTitle(Context context, RoutingParameter parameter) { return AndroidUtils.getRoutingStringPropertyName(context, parameter.getId(), parameter.getName()); } - private boolean isRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, RoutingParameter parameter) { + public static boolean isRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, RoutingParameter parameter) { CommonPreference property = settings.getCustomRoutingBooleanProperty(parameter.getId(), parameter.getDefaultBoolean()); if (mode != null) { return property.getModeValue(mode); @@ -661,8 +655,17 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } } - public static void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, - String parameterId, boolean defaultBoolean, boolean isChecked) { + public static void updateSelectedParameters(OsmandApplication app, ApplicationMode mode, + List parameters, String selectedParameterId) { + for (RoutingParameter p : parameters) { + String parameterId = p.getId(); + setRoutingParameterSelected(app.getSettings(), mode, parameterId, p.getDefaultBoolean(), parameterId.equals(selectedParameterId)); + } + recalculateRoute(app, mode); + } + + private static void setRoutingParameterSelected(OsmandSettings settings, ApplicationMode mode, + String parameterId, boolean defaultBoolean, boolean isChecked) { CommonPreference property = settings.getCustomRoutingBooleanProperty(parameterId, defaultBoolean); if (mode != null) { property.setModeValue(mode, isChecked); From 7e24eee20fe94f65907a4201434871633500d43b Mon Sep 17 00:00:00 2001 From: androiddevkkotlin Date: Sun, 29 Nov 2020 22:45:01 +0200 Subject: [PATCH 3/5] Icon change --- .../plus/routepreparationmenu/RoutingOptionsHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java index 430cf122a6..d34144cbdc 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java @@ -542,8 +542,8 @@ public class RoutingOptionsHelper { rp.disabledIconId = R.drawable.ic_action_fuel; break; case GeneralRouter.USE_HEIGHT_OBSTACLES: - rp.activeIconId = R.drawable.ic_action_elevation; - rp.disabledIconId = R.drawable.ic_action_elevation; + rp.activeIconId = R.drawable.ic_action_altitude_average; + rp.disabledIconId = R.drawable.ic_action_altitude_average; break; case GeneralRouter.AVOID_FERRIES: rp.activeIconId = R.drawable.ic_action_fuel; From fb2a3edb19b8635ef5ff158b41c106812bda7cbe Mon Sep 17 00:00:00 2001 From: androiddevkkotlin Date: Mon, 30 Nov 2020 09:05:28 +0200 Subject: [PATCH 4/5] Colors --- OsmAnd/src/net/osmand/AndroidUtils.java | 15 +++++++++++++++ .../bottomsheets/ElevationDateBottomSheet.java | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java index af0d934083..23ab69822f 100644 --- a/OsmAnd/src/net/osmand/AndroidUtils.java +++ b/OsmAnd/src/net/osmand/AndroidUtils.java @@ -10,6 +10,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PointF; @@ -319,6 +320,20 @@ public class AndroidUtils { ); } + public static ColorStateList createColorStateList(Context ctx, boolean night) { + return new ColorStateList( + new int[][] { + new int[] {-android.R.attr.state_enabled}, // disabled + new int[] {android.R.attr.state_checked}, + new int[] {} + }, + new int[] { + Color.GRAY, + ContextCompat.getColor(ctx, night? R.color.active_color_primary_light : R.color.active_color_primary_dark), + Color.GRAY} + ); + } + public static StateListDrawable createCheckedStateListDrawable(Drawable normal, Drawable checked) { return createStateListDrawable(normal, checked, android.R.attr.state_checked); } diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java index 7bc449448c..cd64e760fa 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java @@ -32,7 +32,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import static net.osmand.AndroidUtils.createCheckedColorStateList; +import static net.osmand.AndroidUtils.createColorStateList; import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.getCustomButtonView; import static net.osmand.plus.settings.bottomsheets.BooleanPreferenceBottomSheet.updateCustomButtonView; import static net.osmand.plus.settings.fragments.BaseSettingsFragment.APP_MODE_KEY; @@ -150,10 +150,11 @@ public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { private void createReliefFactorButtons(Context context) { for (int i = 0; i < parameters.size(); i++) { RoutingParameter parameter = parameters.get(i); + boolean nightMode = app.getDaynightHelper().isNightModeForMapControls(); final BottomSheetItemWithCompoundButton[] preferenceItem = new BottomSheetItemWithCompoundButton[1]; preferenceItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() .setChecked(i == selectedEntryIndex) - .setButtonTintList(createCheckedColorStateList(context, R.color.icon_color_default_light, appModeColor)) + .setButtonTintList(createColorStateList(context, nightMode)) .setTitle(getRoutingParameterTitle(app, parameter)) .setLayoutId(R.layout.bottom_sheet_item_with_radio_btn_left) .setTag(i) @@ -214,6 +215,7 @@ public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { private void enableDisableReliefButtons(boolean enable) { for (BaseBottomSheetItem item : reliefFactorButtons) { item.getView().setEnabled(enable); + item.getView().findViewById(R.id.compound_button).setEnabled(enable); } } From 18ce71167bfdb7b5a06e8b0e0d7585a0099091aa Mon Sep 17 00:00:00 2001 From: androiddevkkotlin Date: Mon, 30 Nov 2020 09:12:41 +0200 Subject: [PATCH 5/5] Colors fix --- OsmAnd/src/net/osmand/AndroidUtils.java | 2 +- .../plus/settings/bottomsheets/ElevationDateBottomSheet.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java index 23ab69822f..69b55a95f4 100644 --- a/OsmAnd/src/net/osmand/AndroidUtils.java +++ b/OsmAnd/src/net/osmand/AndroidUtils.java @@ -329,7 +329,7 @@ public class AndroidUtils { }, new int[] { Color.GRAY, - ContextCompat.getColor(ctx, night? R.color.active_color_primary_light : R.color.active_color_primary_dark), + ContextCompat.getColor(ctx, night? R.color.active_color_primary_dark : R.color.active_color_primary_light), Color.GRAY} ); } diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java index cd64e760fa..14b0e7eacd 100644 --- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ElevationDateBottomSheet.java @@ -150,7 +150,6 @@ public class ElevationDateBottomSheet extends MenuBottomSheetDialogFragment { private void createReliefFactorButtons(Context context) { for (int i = 0; i < parameters.size(); i++) { RoutingParameter parameter = parameters.get(i); - boolean nightMode = app.getDaynightHelper().isNightModeForMapControls(); final BottomSheetItemWithCompoundButton[] preferenceItem = new BottomSheetItemWithCompoundButton[1]; preferenceItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder() .setChecked(i == selectedEntryIndex)