From 892ff7addbd8d1f1428ce780d292db3d9d9debae Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Mon, 7 Dec 2020 10:11:10 +0200 Subject: [PATCH] Plan route config profile --- OsmAnd/res/drawable/bg_round_btn_dark.xml | 10 +++ OsmAnd/res/drawable/bg_round_btn_light.xml | 10 +++ .../drawable/btn_circle_night_no_shadow.xml | 13 +++ OsmAnd/res/drawable/btn_circle_no_shadow.xml | 13 +++ OsmAnd/res/layout-land/map_hud_bottom.xml | 33 +++++--- OsmAnd/res/layout/map_hud_bottom.xml | 31 ++++--- .../layout/profile_with_config_btn_layout.xml | 35 ++++++++ OsmAnd/res/values/attrs.xml | 1 + OsmAnd/res/values/styles.xml | 2 + .../MeasurementToolFragment.java | 43 +++++++++- .../RouteOptionsBottomSheet.java | 81 +++++++++++++++++-- .../fragments/NavigationFragment.java | 15 ++++ 12 files changed, 257 insertions(+), 30 deletions(-) create mode 100644 OsmAnd/res/drawable/bg_round_btn_dark.xml create mode 100644 OsmAnd/res/drawable/bg_round_btn_light.xml create mode 100644 OsmAnd/res/drawable/btn_circle_night_no_shadow.xml create mode 100644 OsmAnd/res/drawable/btn_circle_no_shadow.xml create mode 100644 OsmAnd/res/layout/profile_with_config_btn_layout.xml diff --git a/OsmAnd/res/drawable/bg_round_btn_dark.xml b/OsmAnd/res/drawable/bg_round_btn_dark.xml new file mode 100644 index 0000000000..e73b696dd0 --- /dev/null +++ b/OsmAnd/res/drawable/bg_round_btn_dark.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/OsmAnd/res/drawable/bg_round_btn_light.xml b/OsmAnd/res/drawable/bg_round_btn_light.xml new file mode 100644 index 0000000000..b6a1875aa5 --- /dev/null +++ b/OsmAnd/res/drawable/bg_round_btn_light.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/OsmAnd/res/drawable/btn_circle_night_no_shadow.xml b/OsmAnd/res/drawable/btn_circle_night_no_shadow.xml new file mode 100644 index 0000000000..f3b4395849 --- /dev/null +++ b/OsmAnd/res/drawable/btn_circle_night_no_shadow.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/btn_circle_no_shadow.xml b/OsmAnd/res/drawable/btn_circle_no_shadow.xml new file mode 100644 index 0000000000..6ba74f9ec9 --- /dev/null +++ b/OsmAnd/res/drawable/btn_circle_no_shadow.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout-land/map_hud_bottom.xml b/OsmAnd/res/layout-land/map_hud_bottom.xml index c591d05eda..ec9b4e0c4a 100644 --- a/OsmAnd/res/layout-land/map_hud_bottom.xml +++ b/OsmAnd/res/layout-land/map_hud_bottom.xml @@ -110,16 +110,31 @@ android:layout_marginStart="@dimen/map_button_spacing_land" android:background="@drawable/btn_round" android:contentDescription="@string/layer_route" - tools:src="@drawable/ic_action_remove_dark"/> + tools:src="@drawable/ic_action_remove_dark" /> + + + + + + + - diff --git a/OsmAnd/res/layout/map_hud_bottom.xml b/OsmAnd/res/layout/map_hud_bottom.xml index dc4be05d64..629f9350a1 100644 --- a/OsmAnd/res/layout/map_hud_bottom.xml +++ b/OsmAnd/res/layout/map_hud_bottom.xml @@ -106,15 +106,28 @@ android:contentDescription="@string/layer_route" tools:src="@drawable/ic_action_remove_dark"/> - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/attrs.xml b/OsmAnd/res/values/attrs.xml index ae88075cb7..fbcfe713fb 100644 --- a/OsmAnd/res/values/attrs.xml +++ b/OsmAnd/res/values/attrs.xml @@ -23,6 +23,7 @@ + diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index 50432d35a9..330dda3311 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -96,6 +96,7 @@ @drawable/btn_round_light @drawable/btn_round_border_light @drawable/btn_round_border_light_2 + @drawable/bg_round_btn_light @drawable/bg_card_light @drawable/context_menu_card_light @drawable/bg_map_context_menu_light @@ -400,6 +401,7 @@ @drawable/btn_round_dark @drawable/btn_round_border_dark @drawable/btn_round_border_dark_2 + @drawable/bg_round_btn_dark @drawable/bg_card_dark @drawable/context_menu_card_dark @drawable/bg_map_context_menu_dark diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index a441c7607a..3a7ef237a8 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -22,6 +22,7 @@ import androidx.activity.OnBackPressedCallback; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; import androidx.core.content.ContextCompat; import androidx.core.widget.TextViewCompat; import androidx.fragment.app.FragmentManager; @@ -68,6 +69,7 @@ import net.osmand.plus.measurementtool.command.MovePointCommand; 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.cards.BaseCard; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; @@ -230,7 +232,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route return null; } final MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer(); - OsmandApplication app = mapActivity.getMyApplication(); + final OsmandApplication app = mapActivity.getMyApplication(); editingCtx.setApplication(mapActivity.getMyApplication()); editingCtx.setProgressListener(new SnapToRoadProgressListener() { @@ -432,7 +434,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route @Override public void onMeasure(float distance, float bearing) { String distStr = OsmAndFormatter.getFormattedDistance(distance, mapActivity.getMyApplication()); - String azimuthStr = OsmAndFormatter.getFormattedAzimuth(bearing, getMyApplication()); + String azimuthStr = OsmAndFormatter.getFormattedAzimuth(bearing, app); distanceToCenterTv.setText(String.format("%1$s • %2$s", distStr, azimuthStr)); TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration( distanceToCenterTv, 14, 18, 2, @@ -496,7 +498,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route final GpxData gpxData = editingCtx.getGpxData(); - ImageButton snapToRoadBtn = (ImageButton) mapActivity.findViewById(R.id.snap_to_road_image_button); + ImageButton snapToRoadBtn = mapActivity.findViewById(R.id.snap_to_road_image_button); snapToRoadBtn.setBackgroundResource(nightMode ? R.drawable.btn_circle_night : R.drawable.btn_circle); snapToRoadBtn.setOnClickListener(new OnClickListener() { @Override @@ -505,6 +507,31 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route } }); snapToRoadBtn.setVisibility(View.VISIBLE); + LinearLayout profileWithConfig = mapActivity.findViewById(R.id.profile_with_config_btn); + + View background = profileWithConfig.findViewById(R.id.btn_background); + AndroidUtils.setBackground(background, AppCompatResources.getDrawable(view.getContext(), + AndroidUtils.resolveAttribute(view.getContext(), R.attr.bg_round_btn))); + View divider = profileWithConfig.findViewById(R.id.divider); + divider.setBackgroundResource(AndroidUtils.resolveAttribute(view.getContext(), R.attr.divider_color)); + ImageButton profileBtn = profileWithConfig.findViewById(R.id.profile); + profileBtn.setBackgroundResource(nightMode ? R.drawable.btn_circle_night_no_shadow : R.drawable.btn_circle_no_shadow); + profileBtn.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + startSnapToRoad(false); + } + }); + ImageButton configBtn = profileWithConfig.findViewById(R.id.profile_config); + configBtn.setBackgroundResource(nightMode ? R.drawable.btn_circle_night_no_shadow : R.drawable.btn_circle_no_shadow); + configBtn.setImageDrawable(getContentIcon(R.drawable.ic_action_settings)); + configBtn.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + RouteOptionsBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), + editingCtx.getAppMode().getStringKey()); + } + }); initMeasurementMode(gpxData, savedInstanceState == null); @@ -1251,17 +1278,24 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route final ApplicationMode appMode = editingCtx.getAppMode(); if (mapActivity != null) { Drawable icon; + ImageButton snapToRoadBtn = mapActivity.findViewById(R.id.snap_to_road_image_button); + LinearLayout profileWithConfig = mapActivity.findViewById(R.id.profile_with_config_btn); + ImageButton configBtn = profileWithConfig.findViewById(R.id.profile); if (isTrackReadyToCalculate()) { if (appMode == MeasurementEditingContext.DEFAULT_APP_MODE) { icon = getActiveIcon(R.drawable.ic_action_split_interval); + snapToRoadBtn.setVisibility(View.VISIBLE); + profileWithConfig.setVisibility(View.GONE); } else { icon = getIcon(appMode.getIconRes(), appMode.getIconColorInfo().getColor(nightMode)); + snapToRoadBtn.setVisibility(View.GONE); + profileWithConfig.setVisibility(View.VISIBLE); } } else { icon = getContentIcon(R.drawable.ic_action_help); } - ImageButton snapToRoadBtn = (ImageButton) mapActivity.findViewById(R.id.snap_to_road_image_button); snapToRoadBtn.setImageDrawable(icon); + configBtn.setImageDrawable(icon); mapActivity.refreshMap(); } } @@ -1274,6 +1308,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { mapActivity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE); + mapActivity.findViewById(R.id.profile_with_config_btn).setVisibility(View.GONE); } } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java index 4c54fa47b0..0a8b47bbf4 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java @@ -1,6 +1,7 @@ package net.osmand.plus.routepreparationmenu; import android.app.Activity; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Build; @@ -12,11 +13,14 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.ColorRes; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.GPXUtilities.GPXFile; +import net.osmand.PlatformUtil; import net.osmand.StateChangedListener; import net.osmand.plus.OsmAndLocationSimulation; import net.osmand.plus.OsmandApplication; @@ -31,6 +35,7 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerStartItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; +import net.osmand.plus.measurementtool.MeasurementToolFragment; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidPTTypesRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidRoadsRoutingParameter; import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DividerItem; @@ -53,18 +58,25 @@ import net.osmand.router.GeneralRouter; import net.osmand.router.GeneralRouter.RoutingParameter; import net.osmand.util.Algorithms; +import org.apache.commons.logging.Log; + import java.io.File; 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.router.GeneralRouter.USE_HEIGHT_OBSTACLES; public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { - public static final String TAG = "RouteOptionsBottomSheet"; + 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"; private OsmandApplication app; private OsmandSettings settings; @@ -79,16 +91,27 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { private CommonPreference useHeightPref; private StateChangedListener voiceMuteChangeListener; private StateChangedListener useHeightChangeListener; + private boolean planeRouteMode; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Bundle args = getArguments(); + if (args != null) { + String appMode = args.getString(APP_MODE_KEY, null); + if (appMode != null) { + applicationMode = ApplicationMode.valueOfStringKey(appMode, null); + planeRouteMode = true; + } + } app = requiredMyApplication(); settings = app.getSettings(); routingHelper = app.getRoutingHelper(); routingOptionsHelper = app.getRoutingOptionsHelper(); mapActivity = getMapActivity(); - applicationMode = routingHelper.getAppMode(); + if (applicationMode == null) { + applicationMode = routingHelper.getAppMode(); + } selectedModeColorId = applicationMode.getIconColorInfo().getColor(nightMode); voiceMuteChangeListener = new StateChangedListener() { @Override @@ -115,17 +138,29 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { if (optionsItem instanceof DividerItem) { items.add(new DividerStartItem(app)); } else if (optionsItem instanceof MuteSoundRoutingParameter) { - items.add(createMuteSoundItem(optionsItem)); + if (!planeRouteMode) { + items.add(createMuteSoundItem(optionsItem)); + } else { + continue; + } } else if (optionsItem instanceof ShowAlongTheRouteItem) { items.add(createShowAlongTheRouteItem(optionsItem)); } else if (optionsItem instanceof RouteSimulationItem) { - items.add(createRouteSimulationItem(optionsItem)); + if (!planeRouteMode) { + items.add(createRouteSimulationItem(optionsItem)); + } else { + continue; + } } else if (optionsItem instanceof AvoidPTTypesRoutingParameter) { items.add(createAvoidPTTypesItem(optionsItem)); } else if (optionsItem instanceof AvoidRoadsRoutingParameter) { items.add(createAvoidRoadsItem(optionsItem)); } else if (optionsItem instanceof GpxLocalRoutingParameter) { - items.add(createGpxRoutingItem(optionsItem)); + if (!planeRouteMode) { + items.add(createGpxRoutingItem(optionsItem)); + } else { + continue; + } } else if (optionsItem instanceof TimeConditionalRoutingItem) { items.add(createTimeConditionalRoutingItem(optionsItem)); } else if (optionsItem instanceof OtherSettingsRoutingParameter) { @@ -415,8 +450,10 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { @Override public void onClick(View view) { dismiss(); + Bundle args = new Bundle(); + args.putBoolean(PLANE_ROUTE, true); BaseSettingsFragment.showInstance(mapActivity, BaseSettingsFragment.SettingsScreenType.NAVIGATION, - mapActivity.getRoutingHelper().getAppMode()); + applicationMode, args); } }) .create(); @@ -515,6 +552,21 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { if (mapActivity != null) { mapActivity.getMapRouteInfoMenu().updateMenu(); } + + } + + @Override + public void onDismiss(@NonNull DialogInterface dialog) { + super.onDismiss(dialog); + updatePlanRoute(); + } + + private void updatePlanRoute() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + Fragment fragment = mapActivity.getSupportFragmentManager().findFragmentByTag(MeasurementToolFragment.TAG); + ((MeasurementToolFragment) fragment).onChangeApplicationMode(applicationMode, WHOLE_ROUTE_CALCULATION, ALL); + } } private List getRoutingParameters(ApplicationMode applicationMode) { @@ -549,8 +601,21 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment { } public static void showInstance(FragmentManager fragmentManager) { - RouteOptionsBottomSheet f = new RouteOptionsBottomSheet(); - f.show(fragmentManager, RouteOptionsBottomSheet.TAG); + showInstance(fragmentManager, null); + } + + public static void showInstance(FragmentManager fm, String appModeKey) { + try { + if (!fm.isStateSaved()) { + RouteOptionsBottomSheet fragment = new RouteOptionsBottomSheet(); + Bundle args = new Bundle(); + args.putString(APP_MODE_KEY, appModeKey); + fragment.setArguments(args); + fragment.show(fm, TAG); + } + } catch (RuntimeException e) { + LOG.error("showInstance", e); + } } public void updateParameters() { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java index cb9aba42dd..4b2252f48e 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/NavigationFragment.java @@ -3,9 +3,11 @@ package net.osmand.plus.settings.fragments; import android.graphics.drawable.Drawable; import android.os.Bundle; +import androidx.activity.OnBackPressedCallback; import androidx.preference.Preference; import androidx.preference.SwitchPreferenceCompat; +import net.osmand.plus.routepreparationmenu.RouteOptionsBottomSheet; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; @@ -33,6 +35,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; public class NavigationFragment extends BaseSettingsFragment { @@ -48,6 +51,18 @@ public class NavigationFragment extends BaseSettingsFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); routingProfileDataObjects = getRoutingProfiles(app); + requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + public void handleOnBackPressed() { + Bundle args = getArguments(); + if (args != null && args.getBoolean(PLANE_ROUTE, false)) { + RouteOptionsBottomSheet.showInstance(getMapActivity().getSupportFragmentManager(), + getSelectedAppMode().getStringKey()); + dismiss(); + } else { + getActivity().onBackPressed(); + } + } + }); } @Override