diff --git a/OsmAnd/res/layout/bottom_sheet_item_slider_with_two_text.xml b/OsmAnd/res/layout/bottom_sheet_item_slider_with_two_text.xml
new file mode 100644
index 0000000000..78cced76e7
--- /dev/null
+++ b/OsmAnd/res/layout/bottom_sheet_item_slider_with_two_text.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 917b17a8a6..a2992b9dbc 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -11,6 +11,9 @@
Thx - Hardy
-->
+ The route will be recalculated if the distance from the route to the current location is more than selected value.
+ Select the distance after which the route will be recalculated.
+ Recalculate route in case of deviation
Are you sure you want to clear recorded data?
All profile settings will be restored to their original state after creating/importing this profile.
Restore all profile settings?
diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
index 2dc0c9a7fb..d76294be21 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
@@ -959,7 +959,7 @@ public class OsmandSettings {
}
}
- private class FloatPreference extends CommonPreference {
+ public class FloatPreference extends CommonPreference {
private FloatPreference(String id, float defaultValue) {
diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerHalfItem.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerHalfItem.java
index 62948107cf..4f70a525fd 100644
--- a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerHalfItem.java
+++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerHalfItem.java
@@ -26,7 +26,7 @@ public class DividerHalfItem extends DividerItem {
}
@Override
- protected int getLeftMargin(Context context) {
+ protected int getStartMargin(Context context) {
return context.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_divider_margin_start);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerItem.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerItem.java
index 388da9b0ea..5f8fc47638 100644
--- a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerItem.java
+++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerItem.java
@@ -39,10 +39,10 @@ public class DividerItem extends BaseBottomSheetItem {
public void inflate(Context context, ViewGroup container, boolean nightMode) {
super.inflate(context, container, nightMode);
- int height = AndroidUtils.dpToPx(context, 1);
+ int height = getHeight(context);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
- params.setMargins(getLeftMargin(context), getTopMargin(context), 0, getBottomMargin(context));
+ AndroidUtils.setMargins(params, getStartMargin(context), getTopMargin(context), 0, getBottomMargin(context));
params.height = height;
view.setMinimumHeight(height);
@@ -53,7 +53,7 @@ public class DividerItem extends BaseBottomSheetItem {
return context.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_content_padding_small);
}
- protected int getLeftMargin(Context context) {
+ protected int getStartMargin(Context context) {
return 0;
}
@@ -61,8 +61,12 @@ public class DividerItem extends BaseBottomSheetItem {
return context.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_content_padding_small);
}
+ protected int getHeight(Context ctx) {
+ return AndroidUtils.dpToPx(ctx, 1);
+ }
+
@ColorRes
- private int getBgColorId(boolean nightMode) {
+ protected int getBgColorId(boolean nightMode) {
if (colorId != INVALID_ID) {
return colorId;
}
diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerSpaceItem.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerSpaceItem.java
new file mode 100644
index 0000000000..5412a17df2
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerSpaceItem.java
@@ -0,0 +1,33 @@
+package net.osmand.plus.base.bottomsheetmenu.simpleitems;
+
+import android.content.Context;
+
+public class DividerSpaceItem extends DividerItem {
+
+ private int verticalSpacePx;
+
+ public DividerSpaceItem(Context context, int verticalSpacePx) {
+ super(context);
+ this.verticalSpacePx = verticalSpacePx;
+ }
+
+ @Override
+ protected int getTopMargin(Context context) {
+ return 0;
+ }
+
+ @Override
+ protected int getBottomMargin(Context context) {
+ return 0;
+ }
+
+ @Override
+ protected int getHeight(Context ctx) {
+ return verticalSpacePx;
+ }
+
+ @Override
+ protected int getBgColorId(boolean nightMode) {
+ return android.R.color.transparent;
+ }
+}
diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerStartItem.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerStartItem.java
index 232434d5a8..3025e21924 100644
--- a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerStartItem.java
+++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/DividerStartItem.java
@@ -26,7 +26,7 @@ public class DividerStartItem extends DividerItem {
}
@Override
- protected int getLeftMargin(Context context) {
+ protected int getStartMargin(Context context) {
return context.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_divider_margin_start);
}
}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/SubtitmeListDividerItem.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/SubtitmeListDividerItem.java
index d353a05858..8002667177 100644
--- a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/SubtitmeListDividerItem.java
+++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/simpleitems/SubtitmeListDividerItem.java
@@ -26,7 +26,7 @@ public class SubtitmeListDividerItem extends DividerItem {
}
@Override
- protected int getLeftMargin(Context context) {
+ protected int getStartMargin(Context context) {
return context.getResources().getDimensionPixelSize(R.dimen.list_content_padding);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java
index 86686526b6..ba0114f046 100644
--- a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java
@@ -14,6 +14,7 @@ import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
+import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceViewHolder;
@@ -30,6 +31,7 @@ import net.osmand.plus.activities.SettingsBaseActivity;
import net.osmand.plus.activities.SettingsNavigationActivity;
import net.osmand.plus.routing.RouteProvider;
import net.osmand.plus.routing.RoutingHelper;
+import net.osmand.plus.settings.bottomsheets.RecalculateRouteInDeviationBottomSheet;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
import net.osmand.plus.settings.preferences.MultiSelectBooleanPreference;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
@@ -55,6 +57,10 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
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";
+ private static final String ROUTING_RECALC_DISTANCE= "routing_recalc_distance";
+
+ public static final float DISABLE_MODE = -1.0f;
+ public static final float DEFAULT_MODE = 0.0f;
private List avoidParameters = new ArrayList();
private List preferParameters = new ArrayList();
@@ -147,9 +153,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
fastRoute.setSummaryOn(R.string.shared_string_on);
fastRoute.setSummaryOff(R.string.shared_string_off);
- float defaultAllowedDeviation = RoutingHelper.getDefaultAllowedDeviation(settings, am,
- RoutingHelper.getPosTolerance(0));
- setupSelectRouteRecalcDistance(screen, defaultAllowedDeviation);
+ setupSelectRouteRecalcDistance(screen);
if (am.getRouteService() == RouteProvider.RouteService.OSMAND){
GeneralRouter router = app.getRouter(am);
@@ -261,6 +265,18 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
return super.onPreferenceClick(preference);
}
+ @Override
+ public void onDisplayPreferenceDialog(Preference preference) {
+ if (preference.getKey().equals(settings.ROUTE_RECALCULATION_DISTANCE.getId())) {
+ FragmentManager fragmentManager = getFragmentManager();
+ if (fragmentManager != null) {
+ RecalculateRouteInDeviationBottomSheet.showInstance(getFragmentManager(), preference.getKey(), this, false, getSelectedAppMode());
+ }
+ } else {
+ super.onDisplayPreferenceDialog(preference);
+ }
+ }
+
private void showSeekbarSettingsDialog(Activity activity, final ApplicationMode mode) {
if (activity == null || mode == null) {
return;
@@ -318,35 +334,30 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
UiUtilities.setupSeekBar(angleBar, activeColor, nightMode);
}
- private void setupSelectRouteRecalcDistance(PreferenceScreen screen, float defaultAllowedDeviation) {
- Float[] entryValues;
- OsmandSettings settings = app.getSettings();
- OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
- if (mc == OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS) {
- entryValues = new Float[] {-1.0f, 0.f, 10.f, 20.0f, 30.0f, 50.0f, 100.0f, 200.0f, 500.0f, 1000.0f, 1500.0f};
- } else {
- entryValues = new Float[] {-1.0f, 0.f, 9.1f, 18.3f, 30.5f, 45.7f, 91.5f, 183.0f, 482.0f, 965.0f, 1609.0f};
+ private void setupSelectRouteRecalcDistance(PreferenceScreen screen) {
+ final SwitchPreferenceEx switchPref = createSwitchPreferenceEx(ROUTING_RECALC_DISTANCE,
+ R.string.route_recalculation_dist_title, R.layout.preference_with_descr_dialog_and_switch);
+ switchPref.setIcon(getRoutingPrefIcon(ROUTING_RECALC_DISTANCE));
+ screen.addPreference(switchPref);
+ updateRouteRecalcDistancePref();
+ }
+
+ private void updateRouteRecalcDistancePref() {
+ SwitchPreferenceEx switchPref = (SwitchPreferenceEx) findPreference(ROUTING_RECALC_DISTANCE);
+ if (switchPref == null) {
+ return;
}
-
- String[] entries = new String[entryValues.length];
- entries[0] = getString(R.string.no_recalculation_setting);
- String defaultDistance = defaultAllowedDeviation < 0 ? getString(R.string.no_recalculation_setting) :
- OsmAndFormatter.getFormattedDistance(defaultAllowedDeviation , app, false);
- entries[1] = String.format(getString(R.string.shared_string_app_default_w_val), defaultDistance);
-
- for (int i = 2; i < entryValues.length; i++) {
- entries[i] = OsmAndFormatter.getFormattedDistance(entryValues[i], app, false);
+ ApplicationMode appMode = getSelectedAppMode();
+ float allowedValue = settings.ROUTE_RECALCULATION_DISTANCE.getModeValue(appMode);
+ boolean enabled = allowedValue != DISABLE_MODE;
+ if (allowedValue <= 0) {
+ allowedValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode, RoutingHelper.getPosTolerance(0));
}
-
- ListPreferenceEx routeRecalculationDist = createListPreferenceEx(settings.ROUTE_RECALCULATION_DISTANCE.getId(),
- entries, entryValues, R.string.route_recalculation_dist_title, R.layout.preference_with_descr);
- routeRecalculationDist.setEntries(entries);
- routeRecalculationDist.setEntryValues(entryValues);
- routeRecalculationDist.setDescription(getString(R.string.route_recalculation_dist_descr));
- routeRecalculationDist.setIcon(getRoutingPrefIcon("routing_recalc_distance"));
-
-
- screen.addPreference(routeRecalculationDist);
+ String summary = String.format(getString(R.string.ltr_or_rtl_combine_via_bold_point),
+ enabled ? getString(R.string.shared_string_enabled) : getString(R.string.shared_string_disabled),
+ OsmAndFormatter.getFormattedDistance(allowedValue, app, false));
+ switchPref.setSummary(summary);
+ switchPref.setChecked(enabled);
}
@Override
@@ -414,12 +425,12 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
return true;
} else if ("prouting_short_way".equals(key) && newValue instanceof Boolean) {
return app.getSettings().FAST_ROUTE_MODE.setModeValue(getSelectedAppMode(), !(Boolean) newValue);
- } else if (settings.ROUTE_RECALCULATION_DISTANCE.getId().equals(key) && newValue instanceof Float) {
- if ((float) newValue == -1.f) {
- settings.DISABLE_OFFROUTE_RECALC.setModeValue(getSelectedAppMode(), true);
- } else {
- settings.DISABLE_OFFROUTE_RECALC.setModeValue(getSelectedAppMode(), false);
- }
+ } else if (ROUTING_RECALC_DISTANCE.equals(key) && newValue instanceof Boolean) {
+ boolean enabled = (Boolean) newValue;
+ settings.ROUTE_RECALCULATION_DISTANCE.setModeValue(getSelectedAppMode(),
+ enabled ? DEFAULT_MODE : DISABLE_MODE);
+ settings.DISABLE_OFFROUTE_RECALC.setModeValue(getSelectedAppMode(), !enabled);
+ updateRouteRecalcDistancePref();
}
return super.onPreferenceChange(preference, newValue);
@@ -429,6 +440,8 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
public void onPreferenceChanged(String prefId) {
if (AVOID_ROUTING_PARAMETER_PREFIX.equals(prefId) || PREFER_ROUTING_PARAMETER_PREFIX.equals(prefId)) {
recalculateRoute();
+ } else if (ROUTING_RECALC_DISTANCE.equals(prefId)) {
+ updateRouteRecalcDistancePref();
}
}
@@ -529,7 +542,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
return getPersistentPrefIcon(R.drawable.ic_action_fastest_route);
case "enable_time_conditional_routing":
return getPersistentPrefIcon(R.drawable.ic_action_road_works_dark);
- case "routing_recalc_distance":
+ case ROUTING_RECALC_DISTANCE:
return getPersistentPrefIcon(R.drawable.ic_action_minimal_distance);
default:
diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java
index 7eb843fea6..1aba6eb3df 100644
--- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/BooleanPreferenceBottomSheet.java
@@ -109,14 +109,14 @@ public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet {
return R.string.shared_string_cancel;
}
- private View getCustomButtonView(boolean checked) {
+ protected View getCustomButtonView(boolean checked) {
View customView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_preference_switch, null);
updateCustomButtonView(customView, checked);
return customView;
}
- private void updateCustomButtonView(View customView, boolean checked) {
+ protected void updateCustomButtonView(View customView, boolean checked) {
OsmandApplication app = requiredMyApplication();
View buttonView = customView.findViewById(R.id.button_container);
diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java
new file mode 100644
index 0000000000..3bc0afc256
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/RecalculateRouteInDeviationBottomSheet.java
@@ -0,0 +1,239 @@
+package net.osmand.plus.settings.bottomsheets;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.google.android.material.slider.Slider;
+
+import net.osmand.AndroidUtils;
+import net.osmand.plus.ApplicationMode;
+import net.osmand.plus.OsmAndFormatter;
+import net.osmand.plus.OsmandApplication;
+import net.osmand.plus.OsmandSettings;
+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.simpleitems.LongDescriptionItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.SubtitmeListDividerItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
+import net.osmand.plus.routing.RoutingHelper;
+import net.osmand.plus.settings.OnPreferenceChanged;
+import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
+
+import static net.osmand.plus.settings.RouteParametersFragment.DEFAULT_MODE;
+import static net.osmand.plus.settings.RouteParametersFragment.DISABLE_MODE;
+
+public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBottomSheet {
+
+ public static final String TAG = RecalculateRouteInDeviationBottomSheet.class.getSimpleName();
+
+ private static final String CURRENT_VALUE = "current_value";
+
+ private OsmandApplication app;
+ private OsmandSettings settings;
+ private ApplicationMode appMode;
+ private OsmandSettings.CommonPreference preference;
+
+ private Slider slider;
+ private TextView tvSliderTitle;
+ private TextView tvSliderSummary;
+
+ private Float[] entryValues;
+ private float currentValue;
+ private boolean enabled = false;
+ private boolean sliderPositionChanged = false;
+
+ @Override
+ public void createMenuItems(Bundle savedInstanceState) {
+ app = requiredMyApplication();
+ settings = app.getSettings();
+ appMode = getAppMode();
+ preference = settings.ROUTE_RECALCULATION_DISTANCE;
+ getPreferenceStateAndValue();
+
+ final SwitchPreferenceEx switchPref = (SwitchPreferenceEx) getPreference();
+ if (switchPref == null) {
+ return;
+ }
+
+ if (savedInstanceState != null && savedInstanceState.containsKey(CURRENT_VALUE)) {
+ currentValue = savedInstanceState.getFloat(CURRENT_VALUE);
+ }
+
+ int contentPaddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
+ int dialogContentMargin = app.getResources().getDimensionPixelSize(R.dimen.dialog_content_margin);
+
+ OsmandSettings.MetricsConstants mc = settings.METRIC_SYSTEM.get();
+ if (mc == OsmandSettings.MetricsConstants.KILOMETERS_AND_METERS) {
+ entryValues = new Float[]{10.f, 20.0f, 30.0f, 50.0f, 100.0f, 200.0f, 500.0f, 1000.0f, 1500.0f};
+ } else {
+ entryValues = new Float[]{9.1f, 18.3f, 30.5f, 45.7f, 91.5f, 183.0f, 482.0f, 965.0f, 1609.0f};
+ }
+
+ final int appModeColor = appMode.getIconColorInfo().getColor(nightMode);
+ final int activeColor = AndroidUtils.resolveAttribute(app, R.attr.active_color_basic);
+ final int disabledColor = AndroidUtils.resolveAttribute(app, android.R.attr.textColorSecondary);
+
+ String title = getString(R.string.recalculate_route_in_deviation);
+ items.add(new TitleItem(title));
+
+ final View sliderView = UiUtilities.getInflater(getContext(), nightMode).inflate(R.layout.bottom_sheet_item_slider_with_two_text, null);
+ slider = sliderView.findViewById(R.id.slider);
+ tvSliderTitle = sliderView.findViewById(android.R.id.title);
+ tvSliderTitle.setText(getString(R.string.distance));
+ tvSliderSummary = sliderView.findViewById(android.R.id.summary);
+ slider.setValueFrom(0);
+ slider.setValueTo(entryValues.length - 1);
+ slider.setStepSize(1);
+ updateSliderView();
+
+ final String on = getString(R.string.shared_string_enabled);
+ final String off = getString(R.string.shared_string_disabled);
+ final BottomSheetItemWithCompoundButton[] preferenceBtn = new BottomSheetItemWithCompoundButton[1];
+ preferenceBtn[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
+ .setChecked(enabled)
+ .setCompoundButtonColorId(appModeColor)
+ .setTitle(enabled ? on : off)
+ .setTitleColorId(enabled ? activeColor : disabledColor)
+ .setCustomView(getCustomButtonView(enabled))
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ enabled = !enabled;
+ if (switchPref.callChangeListener(enabled)) {
+ sliderPositionChanged = false;
+ switchPref.setChecked(enabled);
+ preferenceBtn[0].setTitle(enabled ? on : off);
+ preferenceBtn[0].setTitleColorId(enabled ? activeColor : disabledColor);
+ preferenceBtn[0].setChecked(enabled);
+ getDefaultValue();
+ updateSliderView();
+ updateCustomButtonView(v, enabled);
+ Fragment target = getTargetFragment();
+ if (target instanceof OnPreferenceChanged) {
+ ((OnPreferenceChanged) target).onPreferenceChanged(switchPref.getKey());
+ }
+ }
+ }
+ })
+ .create();
+ items.add(preferenceBtn[0]);
+ items.add(new DividerSpaceItem(app, contentPaddingSmall));
+ items.add(new LongDescriptionItem(getString(R.string.select_distance_route_will_recalc)));
+ items.add(new DividerSpaceItem(app, dialogContentMargin));
+
+ slider.addOnChangeListener(new Slider.OnChangeListener() {
+ @Override
+ public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
+ sliderPositionChanged = true;
+ if (fromUser) {
+ currentValue = entryValues[(int) slider.getValue()];
+ tvSliderSummary.setText(getFormattedDistance(app, currentValue));
+ }
+ }
+ });
+ items.add(new BaseBottomSheetItem.Builder()
+ .setCustomView(sliderView)
+ .create());
+ items.add(new SubtitmeListDividerItem(getContext()));
+ items.add(new DividerSpaceItem(app, contentPaddingSmall));
+ items.add(new LongDescriptionItem(getString(R.string.recalculate_route_distance_promo)));
+ }
+
+ @Override
+ protected void onRightBottomButtonClick() {
+ if (enabled && sliderPositionChanged) {
+ preference.setModeValue(getAppMode(), currentValue);
+ }
+ Fragment target = getTargetFragment();
+ if (target instanceof OnPreferenceChanged) {
+ ((OnPreferenceChanged) target).onPreferenceChanged(preference.getId());
+ }
+ dismiss();
+ }
+
+ @Override
+ protected int getRightBottomButtonTextId() {
+ return R.string.shared_string_apply;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putFloat(CURRENT_VALUE, currentValue);
+ }
+
+ private void updateSliderView() {
+ int activeColor = AndroidUtils.resolveAttribute(app, R.attr.active_color_basic);
+ int disabledColor = AndroidUtils.resolveAttribute(app, android.R.attr.textColorSecondary);
+ int textColorPrimary = AndroidUtils.resolveAttribute(app, android.R.attr.textColorPrimary);
+ tvSliderTitle.setTextColor(ContextCompat.getColor(app, enabled ? textColorPrimary : disabledColor));
+ tvSliderSummary.setTextColor(ContextCompat.getColor(app, enabled ? activeColor : disabledColor));
+ tvSliderSummary.setText(getFormattedDistance(app, currentValue));
+ slider.setValue(findIndexOfValue(currentValue));
+ slider.setEnabled(enabled);
+ }
+
+ private void getPreferenceStateAndValue() {
+ float allowedValue = preference.getModeValue(appMode);
+ if (allowedValue == DISABLE_MODE) {
+ enabled = false;
+ getDefaultValue();
+ } else {
+ enabled = true;
+ if (allowedValue == DEFAULT_MODE) {
+ getDefaultValue();
+ } else {
+ currentValue = allowedValue;
+ }
+ }
+ }
+
+ private void getDefaultValue() {
+ currentValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode,
+ RoutingHelper.getPosTolerance(0));
+ }
+
+ private int findIndexOfValue(float allowedValue) {
+ for (int i = 0; i < entryValues.length; i++) {
+ float value = entryValues[i];
+ if (allowedValue == value) {
+ return i;
+ } else if (value > allowedValue) {
+ return i > 0 ? --i : i;
+ }
+ }
+ return 0;
+ }
+
+ private static String getFormattedDistance(@NonNull OsmandApplication app, float value) {
+ return OsmAndFormatter.getFormattedDistance(value, app, false);
+ }
+
+ public static boolean showInstance(@NonNull FragmentManager fragmentManager, String key, Fragment target,
+ boolean usedOnMap, @Nullable ApplicationMode appMode) {
+ try {
+ Bundle args = new Bundle();
+ args.putString(PREFERENCE_ID, key);
+
+ RecalculateRouteInDeviationBottomSheet fragment = new RecalculateRouteInDeviationBottomSheet();
+ fragment.setArguments(args);
+ fragment.setUsedOnMap(usedOnMap);
+ fragment.setAppMode(appMode);
+ fragment.setTargetFragment(target, 0);
+ fragment.show(fragmentManager, TAG);
+ return true;
+ } catch (RuntimeException e) {
+ return false;
+ }
+ }
+}
\ No newline at end of file