diff --git a/OsmAnd/res/layout/profile_with_config_btn_layout.xml b/OsmAnd/res/layout/profile_with_config_btn_layout.xml
index 1b6a87561e..04e4d5384c 100644
--- a/OsmAnd/res/layout/profile_with_config_btn_layout.xml
+++ b/OsmAnd/res/layout/profile_with_config_btn_layout.xml
@@ -9,27 +9,30 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="2dp">
-
-
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
index 9ce68686de..6d1522de1d 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
@@ -385,6 +385,22 @@ public class MeasurementEditingContext {
return allSegments.size() > 0 ? allSegments : null;
}
+ public void recalculateRouteSegmentsForAppMode() {
+ clearRouteSegmentsByAppMode();
+ updateSegmentsForSnap();
+ }
+
+ public void clearRouteSegmentsByAppMode() {
+ for (Pair key : getOrderedRoadSegmentDataKeys()) {
+ if(key.first.getProfileType().equals(appMode.getStringKey())) {
+ RoadSegmentData data = roadSegmentData.get(key);
+ if (data != null) {
+ roadSegmentData.remove(key);
+ }
+ }
+ }
+ }
+
void splitSegments(int position) {
List points = new ArrayList<>();
points.addAll(before.points);
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
index f56eab9797..c54dd93a08 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
@@ -71,6 +71,7 @@ import net.osmand.plus.measurementtool.command.RemovePointCommand;
import net.osmand.plus.measurementtool.command.ReorderPointCommand;
import net.osmand.plus.measurementtool.command.ReversePointsCommand;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet;
+import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DialogMode;
import net.osmand.plus.measurementtool.command.SplitPointsCommand;
import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.plus.settings.backend.ApplicationMode;
@@ -107,7 +108,8 @@ import static net.osmand.plus.measurementtool.command.ClearPointsCommand.ClearCo
public class MeasurementToolFragment extends BaseOsmAndFragment implements RouteBetweenPointsFragmentListener,
OptionsFragmentListener, GpxApproximationFragmentListener, SelectedPointFragmentListener,
- SaveAsNewTrackFragmentListener, MapControlsLayer.MapControlsThemeInfoProvider {
+ SaveAsNewTrackFragmentListener, MapControlsLayer.MapControlsThemeInfoProvider,
+ RouteOptionsBottomSheet.OnAppModeConfiguredCallback{
public static final String TAG = MeasurementToolFragment.class.getSimpleName();
public static final String TAPS_DISABLED_KEY = "taps_disabled_key";
@@ -131,6 +133,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private ImageView redoBtn;
private ImageView mainIcon;
private String fileName;
+ private OnBackPressedCallback onBackPressedCallback;
private InfoType currentInfoType;
@@ -218,11 +221,12 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+ onBackPressedCallback = new OnBackPressedCallback(true) {
public void handleOnBackPressed() {
quit(true);
}
- });
+ };
+ requireMyActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
}
@Nullable
@@ -531,7 +535,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
configBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- RouteOptionsBottomSheet.showInstance(mapActivity.getSupportFragmentManager(),
+ RouteOptionsBottomSheet.showInstance(
+ mapActivity, MeasurementToolFragment.this, DialogMode.PLAN_ROUTE,
editingCtx.getAppMode().getStringKey());
}
});
@@ -551,6 +556,10 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
return view;
}
+ public OnBackPressedCallback getOnBackPressedCallback() {
+ return onBackPressedCallback;
+ }
+
private OnRadioItemClickListener getInfoTypeBtnListener(@NonNull final InfoType type) {
return new OnRadioItemClickListener() {
@Override
@@ -687,6 +696,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
super.onResume();
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
+ onBackPressedCallback.setEnabled(true);
detailsMenu.setMapActivity(mapActivity);
mapActivity.getMapLayers().getMapControlsLayer().addThemeInfoProviderTag(TAG);
mapActivity.getMapLayers().getMapControlsLayer().showMapControlsIfHidden();
@@ -1091,6 +1101,12 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
updateDistancePointsText();
}
+ @Override
+ public void onAppModeConfigured() {
+ editingCtx.recalculateRouteSegmentsForAppMode();
+ updateDistancePointsText();
+ }
+
@Override
public void onChangeRouteTypeBefore() {
MapActivity mapActivity = getMapActivity();
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
index 99ad964bbc..c856a47426 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
@@ -1535,7 +1535,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
private void clickRouteParams() {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
- RouteOptionsBottomSheet.showInstance(mapActivity.getSupportFragmentManager());
+ RouteOptionsBottomSheet.showInstance(mapActivity);
}
}
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java
index cc983c9f77..1769f3c7bc 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java
@@ -55,6 +55,7 @@ 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.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import net.osmand.router.GeneralRouter;
import net.osmand.router.GeneralRouter.RoutingParameter;
import net.osmand.util.Algorithms;
@@ -67,8 +68,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
-import static net.osmand.plus.measurementtool.RouteBetweenPointsBottomSheetDialogFragment.RouteBetweenPointsDialogMode.ALL;
-import static net.osmand.plus.measurementtool.RouteBetweenPointsBottomSheetDialogFragment.RouteBetweenPointsDialogType.WHOLE_ROUTE_CALCULATION;
import static net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DRIVING_STYLE;
import static net.osmand.plus.settings.fragments.RouteParametersFragment.RELIEF_SMOOTHNESS_FACTOR;
import static net.osmand.plus.settings.fragments.RouteParametersFragment.getRoutingParameterTitle;
@@ -80,7 +79,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
public static final String TAG = RouteOptionsBottomSheet.class.getSimpleName();
private static final Log LOG = PlatformUtil.getLog(RouteOptionsBottomSheet.class);
public static final String APP_MODE_KEY = "APP_MODE_KEY";
- public static final String PLANE_ROUTE = "PLANE_ROUTE";
+ public static final String DIALOG_MODE_KEY = "DIALOG_MODE_KEY";
private OsmandApplication app;
private OsmandSettings settings;
@@ -95,8 +94,38 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
private CommonPreference useHeightPref;
private StateChangedListener voiceMuteChangeListener;
private StateChangedListener useHeightChangeListener;
- private boolean planRouteMode;
private List reliefParameters = new ArrayList<>();
+ private DialogMode dialogMode;
+
+ public enum DialogMode {
+ DIRECTIONS(),
+ PLAN_ROUTE(MuteSoundRoutingParameter.class,
+ RouteSimulationItem.class,
+ GpxLocalRoutingParameter.class);
+
+ private final Class extends LocalRoutingParameter>[] excludeParameters;
+
+ @SafeVarargs
+ DialogMode(Class extends LocalRoutingParameter> ... excludeParameters) {
+ this.excludeParameters = excludeParameters;
+ }
+
+ public boolean isAvailableParameter(LocalRoutingParameter parameter) {
+ for (Class extends LocalRoutingParameter> c : excludeParameters) {
+ if (Algorithms.objectEquals(parameter.getClass(), c)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static DialogMode getModeByName(String modeName) {
+ if (modeName != null) {
+ return valueOf(modeName);
+ }
+ return DIRECTIONS;
+ }
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -106,8 +135,9 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
String appMode = args.getString(APP_MODE_KEY, null);
if (appMode != null) {
applicationMode = ApplicationMode.valueOfStringKey(appMode, null);
- planRouteMode = true;
}
+ String dialogModeName = args.getString(DIALOG_MODE_KEY, null);
+ dialogMode = DialogMode.getModeByName(dialogModeName);
}
app = requiredMyApplication();
settings = app.getSettings();
@@ -117,6 +147,9 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
if (applicationMode == null) {
applicationMode = routingHelper.getAppMode();
}
+ if (dialogMode == null) {
+ dialogMode = DialogMode.DIRECTIONS;
+ }
selectedModeColorId = applicationMode.getIconColorInfo().getColor(nightMode);
voiceMuteChangeListener = new StateChangedListener() {
@Override
@@ -139,28 +172,27 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
items.add(new TitleItem(app.getString(R.string.shared_string_settings), nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light));
List list = getRoutingParameters(applicationMode);
-
for (final LocalRoutingParameter optionsItem : list) {
+ if (!dialogMode.isAvailableParameter(optionsItem)) {
+ continue;
+ }
+
if (optionsItem instanceof DividerItem) {
- items.add(new DividerStartItem(app));
- } else if (optionsItem instanceof MuteSoundRoutingParameter) {
- if (!planRouteMode) {
- items.add(createMuteSoundItem(optionsItem));
+ if (isDividerRequired()) {
+ items.add(new DividerStartItem(app));
}
+ } else if (optionsItem instanceof MuteSoundRoutingParameter) {
+ items.add(createMuteSoundItem(optionsItem));
} else if (optionsItem instanceof ShowAlongTheRouteItem) {
items.add(createShowAlongTheRouteItem(optionsItem));
} else if (optionsItem instanceof RouteSimulationItem) {
- if (!planRouteMode) {
- items.add(createRouteSimulationItem(optionsItem));
- }
+ items.add(createRouteSimulationItem(optionsItem));
} else if (optionsItem instanceof AvoidPTTypesRoutingParameter) {
items.add(createAvoidPTTypesItem(optionsItem));
} else if (optionsItem instanceof AvoidRoadsRoutingParameter) {
items.add(createAvoidRoadsItem(optionsItem));
} else if (optionsItem instanceof GpxLocalRoutingParameter) {
- if (!planRouteMode) {
- items.add(createGpxRoutingItem(optionsItem));
- }
+ items.add(createGpxRoutingItem(optionsItem));
} else if (optionsItem instanceof TimeConditionalRoutingItem) {
items.add(createTimeConditionalRoutingItem(optionsItem));
} else if (optionsItem instanceof OtherSettingsRoutingParameter) {
@@ -173,6 +205,11 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
}
}
+ private boolean isDividerRequired() {
+ // do not show two dividers at once
+ return items.size() > 1 && !(items.get(items.size() - 1) instanceof DividerStartItem);
+ }
+
@Override
public void onResume() {
super.onResume();
@@ -282,8 +319,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
voicePromptsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- BaseSettingsFragment.showInstance(
- mapActivity, BaseSettingsFragment.SettingsScreenType.VOICE_ANNOUNCES);
+ BaseSettingsFragment.showInstance(mapActivity, SettingsScreenType.VOICE_ANNOUNCES);
dismiss();
}
});
@@ -508,10 +544,16 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
@Override
public void onClick(View view) {
dismiss();
+
+ Fragment fragment = getTargetFragment();
+ if (fragment instanceof MeasurementToolFragment) {
+ ((MeasurementToolFragment) fragment).getOnBackPressedCallback().setEnabled(false);
+ }
+
Bundle args = new Bundle();
- args.putBoolean(PLANE_ROUTE, planRouteMode);
- BaseSettingsFragment.showInstance(mapActivity, BaseSettingsFragment.SettingsScreenType.NAVIGATION,
- applicationMode, args);
+ args.putString(DIALOG_MODE_KEY, dialogMode.name());
+ BaseSettingsFragment.showInstance(mapActivity,
+ SettingsScreenType.NAVIGATION, applicationMode, args);
}
})
.create();
@@ -614,16 +656,13 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
- updatePlanRoute();
+ notifyAppModeConfigurationChanged();
}
- private void updatePlanRoute() {
- MapActivity mapActivity = getMapActivity();
- if (mapActivity != null) {
- Fragment fragment = mapActivity.getSupportFragmentManager().findFragmentByTag(MeasurementToolFragment.TAG);
- if (fragment != null) {
- ((MeasurementToolFragment) fragment).onChangeApplicationMode(applicationMode, WHOLE_ROUTE_CALCULATION, ALL);
- }
+ private void notifyAppModeConfigurationChanged() {
+ Fragment fragment = getTargetFragment();
+ if (fragment instanceof OnAppModeConfiguredCallback) {
+ ((OnAppModeConfiguredCallback) fragment).onAppModeConfigured();
}
}
@@ -658,17 +697,23 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
return (MapActivity) getActivity();
}
- public static void showInstance(FragmentManager fragmentManager) {
- showInstance(fragmentManager, null);
+ public static void showInstance(MapActivity mapActivity) {
+ showInstance(mapActivity, null, DialogMode.DIRECTIONS, null);
}
- public static void showInstance(FragmentManager fm, String appModeKey) {
+ public static void showInstance(MapActivity mapActivity,
+ Fragment targetFragment,
+ DialogMode dialogMode,
+ String appModeKey) {
try {
+ FragmentManager fm = mapActivity.getSupportFragmentManager();
if (!fm.isStateSaved()) {
RouteOptionsBottomSheet fragment = new RouteOptionsBottomSheet();
Bundle args = new Bundle();
args.putString(APP_MODE_KEY, appModeKey);
+ args.putString(DIALOG_MODE_KEY, dialogMode.name());
fragment.setArguments(args);
+ fragment.setTargetFragment(targetFragment, 0);
fragment.show(fm, TAG);
}
} catch (RuntimeException e) {
@@ -694,6 +739,10 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
}
}
+ public interface OnAppModeConfiguredCallback {
+ void onAppModeConfigured();
+ }
+
public enum AppModeOptions {
CAR(MuteSoundRoutingParameter.KEY,
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java
index 08ea81a092..47b8270066 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java
@@ -4,10 +4,14 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import androidx.activity.OnBackPressedCallback;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.SwitchPreferenceCompat;
+import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet;
+import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DialogMode;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
@@ -35,7 +39,7 @@ import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.IS
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.PROFILE_KEY_ARG;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.SELECTED_KEY;
import static net.osmand.plus.profiles.SelectProfileBottomSheetDialogFragment.TYPE_NAV_PROFILE;
-import static net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.PLANE_ROUTE;
+import static net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet.DIALOG_MODE_KEY;
public class NavigationFragment extends BaseSettingsFragment {
@@ -51,16 +55,31 @@ public class NavigationFragment extends BaseSettingsFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
routingProfileDataObjects = getRoutingProfiles(app);
- requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+ setupOnBackPressedCallback();
+ }
+
+ private void setupOnBackPressedCallback() {
+ OnBackPressedCallback callback = new OnBackPressedCallback(true) {
public void handleOnBackPressed() {
+ MapActivity mapActivity = getMapActivity();
Bundle args = getArguments();
- if (args != null && args.getBoolean(PLANE_ROUTE, false)) {
- RouteOptionsBottomSheet.showInstance(getMapActivity().getSupportFragmentManager(),
- getSelectedAppMode().getStringKey());
+ if (mapActivity != null && args != null) {
+ String dialogModeName = args.getString(DIALOG_MODE_KEY, null);
+ if (DialogMode.getModeByName(dialogModeName) == DialogMode.PLAN_ROUTE) {
+ FragmentManager fm = mapActivity.getSupportFragmentManager();
+ Fragment fragment = fm.findFragmentByTag(MeasurementToolFragment.TAG);
+ if (fragment != null) {
+ RouteOptionsBottomSheet.showInstance(
+ mapActivity, fragment, DialogMode.PLAN_ROUTE,
+ getSelectedAppMode().getStringKey());
+ ((MeasurementToolFragment) fragment).getOnBackPressedCallback().setEnabled(true);
+ }
+ }
}
dismiss();
}
- });
+ };
+ requireMyActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}
@Override