[routing] Avoid paved roads

Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
This commit is contained in:
x7z4w
2025-09-26 13:20:57 +00:00
committed by Yannik Bloscheck
parent a4909a0554
commit 90c12003bd
7 changed files with 80 additions and 10 deletions

View File

@@ -32,7 +32,8 @@ public class DrivingOptionsScreen extends BaseMapScreen
new DrivingOption(RoadType.Dirty, R.string.avoid_unpaved),
new DrivingOption(RoadType.Ferry, R.string.avoid_ferry),
new DrivingOption(RoadType.Motorway, R.string.avoid_motorways),
new DrivingOption(RoadType.Steps, R.string.avoid_steps)};
new DrivingOption(RoadType.Steps, R.string.avoid_steps),
new DrivingOption(RoadType.Paved, R.string.avoid_paved)};
@NonNull
private final Map<RoadType, Boolean> mInitialDrivingOptionsState = new HashMap<>();

View File

@@ -90,28 +90,36 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment
{
SwitchCompat tollsBtn = root.findViewById(R.id.avoid_tolls_btn);
tollsBtn.setChecked(RoutingOptions.hasOption(RoadType.Toll));
CompoundButton.OnCheckedChangeListener tollBtnListener = new ToggleRoutingOptionListener(RoadType.Toll);
CompoundButton.OnCheckedChangeListener tollBtnListener = new ToggleRoutingOptionListener(RoadType.Toll, root);
tollsBtn.setOnCheckedChangeListener(tollBtnListener);
SwitchCompat motorwaysBtn = root.findViewById(R.id.avoid_motorways_btn);
motorwaysBtn.setChecked(RoutingOptions.hasOption(RoadType.Motorway));
CompoundButton.OnCheckedChangeListener motorwayBtnListener = new ToggleRoutingOptionListener(RoadType.Motorway);
CompoundButton.OnCheckedChangeListener motorwayBtnListener =
new ToggleRoutingOptionListener(RoadType.Motorway, root);
motorwaysBtn.setOnCheckedChangeListener(motorwayBtnListener);
SwitchCompat ferriesBtn = root.findViewById(R.id.avoid_ferries_btn);
ferriesBtn.setChecked(RoutingOptions.hasOption(RoadType.Ferry));
CompoundButton.OnCheckedChangeListener ferryBtnListener = new ToggleRoutingOptionListener(RoadType.Ferry);
CompoundButton.OnCheckedChangeListener ferryBtnListener = new ToggleRoutingOptionListener(RoadType.Ferry, root);
ferriesBtn.setOnCheckedChangeListener(ferryBtnListener);
SwitchCompat dirtyRoadsBtn = root.findViewById(R.id.avoid_dirty_roads_btn);
dirtyRoadsBtn.setChecked(RoutingOptions.hasOption(RoadType.Dirty));
CompoundButton.OnCheckedChangeListener dirtyBtnListener = new ToggleRoutingOptionListener(RoadType.Dirty);
dirtyRoadsBtn.setEnabled(!RoutingOptions.hasOption(RoadType.Paved) || RoutingOptions.hasOption(RoadType.Dirty));
CompoundButton.OnCheckedChangeListener dirtyBtnListener = new ToggleRoutingOptionListener(RoadType.Dirty, root);
dirtyRoadsBtn.setOnCheckedChangeListener(dirtyBtnListener);
SwitchCompat stepsBtn = root.findViewById(R.id.avoid_steps_btn);
stepsBtn.setChecked(RoutingOptions.hasOption(RoadType.Steps));
CompoundButton.OnCheckedChangeListener stepsBtnListener = new ToggleRoutingOptionListener(RoadType.Steps);
CompoundButton.OnCheckedChangeListener stepsBtnListener = new ToggleRoutingOptionListener(RoadType.Steps, root);
stepsBtn.setOnCheckedChangeListener(stepsBtnListener);
SwitchCompat pavedBtn = root.findViewById(R.id.avoid_paved_roads_btn);
pavedBtn.setChecked(RoutingOptions.hasOption(RoadType.Paved));
pavedBtn.setEnabled(!RoutingOptions.hasOption(RoadType.Dirty) || RoutingOptions.hasOption(RoadType.Paved));
CompoundButton.OnCheckedChangeListener pavedBtnListener = new ToggleRoutingOptionListener(RoadType.Paved, root);
pavedBtn.setOnCheckedChangeListener(pavedBtnListener);
}
private static class ToggleRoutingOptionListener implements CompoundButton.OnCheckedChangeListener
@@ -119,9 +127,13 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment
@NonNull
private final RoadType mRoadType;
private ToggleRoutingOptionListener(@NonNull RoadType roadType)
@NonNull
private final View mRoot;
private ToggleRoutingOptionListener(@NonNull RoadType roadType, @NonNull View root)
{
mRoadType = roadType;
mRoot = root;
}
@Override
@@ -131,6 +143,27 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment
RoutingOptions.addOption(mRoadType);
else
RoutingOptions.removeOption(mRoadType);
SwitchCompat dirtyRoadsBtn = mRoot.findViewById(R.id.avoid_dirty_roads_btn);
SwitchCompat pavedBtn = mRoot.findViewById(R.id.avoid_paved_roads_btn);
if (mRoadType == RoadType.Dirty)
{
pavedBtn.setEnabled(!isChecked);
if (isChecked)
{
pavedBtn.setChecked(false);
dirtyRoadsBtn.setEnabled(true);
}
}
else if (mRoadType == RoadType.Paved)
{
dirtyRoadsBtn.setEnabled(!isChecked);
if (isChecked)
{
dirtyRoadsBtn.setChecked(false);
pavedBtn.setEnabled(true);
}
}
}
}
}

View File

@@ -59,6 +59,28 @@
android:padding="@dimen/margin_half_double_plus"/>
</LinearLayout>
<include layout="@layout/item_divider"/>
<LinearLayout
android:orientation="horizontal"
android:minHeight="@dimen/height_block_base"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingEnd="@dimen/margin_base"
android:paddingStart="@dimen/margin_base">
<com.google.android.material.textview.MaterialTextView
android:text="@string/avoid_paved"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="?android:attr/textColorPrimary"/>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/avoid_paved_roads_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="@dimen/margin_half_double_plus"/>
</LinearLayout>
<include layout="@layout/item_divider"/>
<LinearLayout
android:orientation="horizontal"
android:minHeight="@dimen/height_block_base"

View File

@@ -677,6 +677,7 @@
<string name="avoid_ferry">Avoid ferries</string>
<string name="avoid_motorways">Avoid freeways</string>
<string name="avoid_steps">Avoid stairs</string>
<string name="avoid_paved">Avoid paved roads</string>
<string name="unable_to_calc_alert_title">Unable to calculate route</string>
<string name="unable_to_calc_alert_subtitle">A route could not be found. This may be caused by your routing options or incomplete OpenStreetMap data. Please change your routing options and retry.</string>
<string name="define_to_avoid_btn">Define roads to avoid</string>

View File

@@ -7,5 +7,6 @@ public enum RoadType
Motorway,
Ferry,
Dirty,
Steps
Steps,
Paved
}

View File

@@ -36,6 +36,10 @@ void RoutingOptions::SaveCarOptionsToSettings(RoutingOptions options)
void RoutingOptions::Add(RoutingOptions::Road type)
{
if (type == RoutingOptions::Road::Paved)
Remove(RoutingOptions::Road::Dirty);
else if (type == RoutingOptions::Road::Dirty)
Remove(RoutingOptions::Road::Paved);
m_options |= static_cast<RoadType>(type);
}
@@ -67,7 +71,9 @@ RoutingOptionsClassifier::RoutingOptionsClassifier()
{{"psurface", "unpaved_bad"}, RoutingOptions::Road::Dirty},
{{"psurface", "unpaved_good"}, RoutingOptions::Road::Dirty},
{{"highway", "steps"}, RoutingOptions::Road::Steps},
{{"highway", "ladder"}, RoutingOptions::Road::Steps}};
{{"highway", "ladder"}, RoutingOptions::Road::Steps},
{{"psurface", "paved_good"}, RoutingOptions::Road::Paved},
{{"psurface", "paved_bad"}, RoutingOptions::Road::Paved}};
m_data.Reserve(std::size(types));
for (auto const & data : types)
@@ -108,6 +114,9 @@ RoutingOptions::Road ChooseMainRoutingOptionRoad(RoutingOptions options, bool is
if (options.Has(RoutingOptions::Road::Steps))
return RoutingOptions::Road::Steps;
if (options.Has(RoutingOptions::Road::Paved))
return RoutingOptions::Road::Paved;
return RoutingOptions::Road::Usual;
}
@@ -132,6 +141,7 @@ string DebugPrint(RoutingOptions const & routingOptions)
append(RoutingOptions::Road::Ferry);
append(RoutingOptions::Road::Dirty);
append(RoutingOptions::Road::Steps);
append(RoutingOptions::Road::Paved);
if (wasAppended)
ss << " | ";
@@ -150,6 +160,7 @@ string DebugPrint(RoutingOptions::Road type)
case RoutingOptions::Road::Ferry: return "ferry";
case RoutingOptions::Road::Dirty: return "dirty";
case RoutingOptions::Road::Steps: return "steps";
case RoutingOptions::Road::Paved: return "paved";
case RoutingOptions::Road::Usual: return "usual";
case RoutingOptions::Road::Max: return "max";
}

View File

@@ -19,8 +19,9 @@ public:
Ferry = 1u << 3,
Dirty = 1u << 4,
Steps = 1u << 5,
Paved = 1u << 6,
Max = (1u << 5) + 1
Max = (1u << 6) + 1
};
using RoadType = std::underlying_type_t<Road>;