diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java index 63ea2de8a2..b749e4e562 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java @@ -57,6 +57,23 @@ public class AddPointBottomSheetDialog extends MenuBottomSheetDialogFragment { public static final String FAVOURITES = "favourites"; private PointType pointType = PointType.START; + private DialogListener listener; + + public interface DialogListener { + void onSelectOnMap(AddPointBottomSheetDialog dialog); + } + + public DialogListener getListener() { + return listener; + } + + public void setListener(DialogListener listener) { + this.listener = listener; + } + + public PointType getPointType() { + return pointType; + } @Override public void createMenuItems(Bundle savedInstanceState) { @@ -249,6 +266,10 @@ public class AddPointBottomSheetDialog extends MenuBottomSheetDialogFragment { if (mapActivity != null) { MapRouteInfoMenu menu = mapActivity.getMapRouteInfoMenu(); menu.selectOnScreen(pointType); + DialogListener listener = getListener(); + if (listener != null) { + listener.onSelectOnMap(AddPointBottomSheetDialog.this); + } } dismiss(); } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java index a0f6fe04dc..711d5f066d 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java @@ -76,6 +76,7 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe public static final String ROUTE_INDEX_KEY = "route_index_key"; public static final String ROUTE_INFO_STATE_KEY = "route_info_state_key"; public static final String INITIAL_MENU_STATE_KEY = "initial_menu_state_key"; + public static final String USE_ROUTE_INFO_MENU_KEY = "use_route_info_menu_key"; @Nullable private LockableViewPager viewPager; @@ -98,7 +99,7 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe private int routesCount; private boolean publicTransportMode; - private int routeInfoMenuState = -1; + private boolean useRouteInfoMenu; private boolean openingAnalyseOnMap = false; @Nullable @@ -115,7 +116,7 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe Bundle args = getArguments(); if (args != null) { routeIndex = args.getInt(ROUTE_INDEX_KEY); - routeInfoMenuState = args.getInt(ROUTE_INFO_STATE_KEY, -1); + useRouteInfoMenu = args.getBoolean(USE_ROUTE_INFO_MENU_KEY, false); initialMenuState = args.getInt(INITIAL_MENU_STATE_KEY, initialMenuState); } routesCount = 1; @@ -218,10 +219,16 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe if (!wasDrawerDisabled) { mapActivity.enableDrawer(); } - updateControlsVisibility(true, routeInfoMenuState != -1); + updateControlsVisibility(true, useRouteInfoMenu); } } + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + outState.putBoolean(USE_ROUTE_INFO_MENU_KEY, useRouteInfoMenu); + super.onSaveInstanceState(outState); + } + @Override public int getStatusBarColorId() { View view = getView(); @@ -270,8 +277,8 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { mapActivity.getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss(); - if (routeInfoMenuState != -1 && !openingAnalyseOnMap) { - mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog(routeInfoMenuState); + if (useRouteInfoMenu && !openingAnalyseOnMap) { + mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog(); } } } catch (Exception e) { @@ -837,12 +844,12 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe } static boolean showFromRouteInfo(FragmentManager fragmentManager, int routeIndex, - int routeInfoState, int initialMenuState) { + boolean useRouteInfoMenu, int initialMenuState) { try { ChooseRouteFragment fragment = new ChooseRouteFragment(); Bundle args = new Bundle(); args.putInt(ROUTE_INDEX_KEY, routeIndex); - args.putInt(ROUTE_INFO_STATE_KEY, routeInfoState); + args.putBoolean(USE_ROUTE_INFO_MENU_KEY, useRouteInfoMenu); args.putInt(INITIAL_MENU_STATE_KEY, initialMenuState); fragment.setArguments(args); fragmentManager.beginTransaction() diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index 6566d5350e..04c4a78b2b 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -116,9 +116,11 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener private boolean selectFromMapTouch; private PointType selectFromMapPointType; private int selectFromMapMenuState = MenuState.HEADER_ONLY; + private boolean selectFromMapWaypoints; private boolean showMenu = false; private int showMenuState = DEFAULT_MENU_STATE; + private int lastMenuState = MenuState.HEADER_ONLY; @Nullable private MapActivity mapActivity; @@ -234,8 +236,9 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } public boolean onSingleTap(PointF point, RotatedTileBox tileBox) { - OsmandApplication app = getApp(); - if (app != null) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + OsmandApplication app = mapActivity.getMyApplication(); if (selectFromMapTouch) { LatLon latlon = tileBox.getLatLonFromPixel(point.x, point.y); selectFromMapTouch = false; @@ -257,7 +260,11 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener targets.setWorkPoint(latlon, null); break; } - show(selectFromMapMenuState); + if (selectFromMapWaypoints) { + WaypointsFragment.showInstance(mapActivity.getSupportFragmentManager(), true); + } else { + show(selectFromMapMenuState); + } return true; } } @@ -329,7 +336,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (fragmentRef != null) { return fragmentRef.get().getCurrentMenuState(); } - return 0; + return lastMenuState; } public int getSupportedMenuStates() { @@ -348,6 +355,10 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN; } + public void showHideMenu() { + showHideMenu(lastMenuState); + } + public void showHideMenu(int menuState) { intermediateRequestsLatLon.clear(); if (isVisible()) { @@ -593,7 +604,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (mapActivity != null) { if (card instanceof SimpleRouteCard) { hide(); - ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), 0, getCurrentMenuState(), MenuState.FULL_SCREEN); + ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), 0, true, MenuState.FULL_SCREEN); } } } @@ -618,7 +629,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (buttonIndex == PublicTransportCard.DETAILS_BUTTON_INDEX) { hide(); ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), - ((PublicTransportCard) card).getRouteId(), getCurrentMenuState(), MenuState.FULL_SCREEN); + ((PublicTransportCard) card).getRouteId(), true, MenuState.FULL_SCREEN); } else if (buttonIndex == PublicTransportCard.SHOW_BUTTON_INDEX) { setupCards(); openMenuHeaderOnly(); @@ -626,7 +637,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } else if (card instanceof SimpleRouteCard) { hide(); ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), 0, - getCurrentMenuState(), MenuState.FULL_SCREEN); + true, MenuState.FULL_SCREEN); } } } @@ -1301,7 +1312,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener if (app.getRoutingHelper().isPublicTransportMode()) { if (isTransportRouteCalculated()) { ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), - app.getTransportRoutingHelper().getCurrentRoute(), getCurrentMenuState(), MenuState.HEADER_ONLY); + app.getTransportRoutingHelper().getCurrentRoute(), true, MenuState.HEADER_ONLY); } } else { mapActivity.getMapLayers().getMapControlsLayer().startNavigation(); @@ -1353,7 +1364,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener MapActivity mapActivity = getMapActivity(); if (mapActivity != null && mapActivity.getMyApplication().getTargetPointsHelper().checkPointToNavigateShort()) { hide(); - WaypointsFragment.showInstance(mapActivity.getSupportFragmentManager(), getCurrentMenuState()); + WaypointsFragment.showInstance(mapActivity.getSupportFragmentManager(), true); } } }); @@ -1618,9 +1629,18 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } public void selectOnScreen(PointType pointType) { + selectOnScreen(pointType, getCurrentMenuState(), false); + } + + public void selectOnScreen(PointType pointType, boolean waypointsMenu) { + selectOnScreen(pointType, getCurrentMenuState(), waypointsMenu); + } + + public void selectOnScreen(PointType pointType, int menuState, boolean waypointsMenu) { selectFromMapTouch = true; selectFromMapPointType = pointType; - selectFromMapMenuState = getCurrentMenuState(); + selectFromMapMenuState = menuState; + selectFromMapWaypoints = waypointsMenu; hide(); } @@ -1901,10 +1921,11 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener public void routeWasFinished() { } - public void onDismiss() { + public void onDismiss(int currentMenuState) { cancelButtonsAnimations(); MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { + lastMenuState = currentMenuState; mapActivity.getMapView().setMapPositionX(0); mapActivity.getMapView().refreshMap(); AndroidUiHelper.updateVisibility(mapActivity.findViewById(R.id.map_route_land_left_margin), false); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java index 7bb0acdaa3..a4b2a0f04c 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java @@ -177,7 +177,7 @@ public class MapRouteInfoMenuFragment extends ContextMenuFragment { public void onDestroyView() { super.onDestroyView(); if (menu != null) { - menu.onDismiss(); + menu.onDismiss(getCurrentMenuState()); } } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java index b25f63e347..62f7e04de5 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java @@ -49,6 +49,8 @@ import net.osmand.plus.views.controls.DynamicListView; import net.osmand.plus.views.controls.DynamicListViewCallbacks; import net.osmand.plus.views.controls.StableArrayAdapter; import net.osmand.plus.views.controls.SwipeDismissListViewTouchListener; +import net.osmand.plus.views.controls.SwipeDismissListViewTouchListener.DismissCallbacks; +import net.osmand.plus.views.controls.SwipeDismissListViewTouchListener.Undoable; import net.osmand.plus.widgets.TextViewEx; import net.osmand.plus.widgets.TextViewExProgress; import net.osmand.util.Algorithms; @@ -58,12 +60,12 @@ import java.util.ArrayList; import java.util.List; import static net.osmand.plus.helpers.WaypointDialogHelper.showOnMap; -import static net.osmand.plus.routepreparationmenu.ChooseRouteFragment.ROUTE_INFO_STATE_KEY; public class WaypointsFragment extends BaseOsmAndFragment implements ObservableScrollViewCallbacks, - DynamicListViewCallbacks, WaypointDialogHelper.WaypointDialogHelperCallback { + DynamicListViewCallbacks, WaypointDialogHelper.WaypointDialogHelperCallback, AddPointBottomSheetDialog.DialogListener { public static final String TAG = "WaypointsFragment"; + public static final String USE_ROUTE_INFO_MENU_KEY = "use_route_info_menu_key"; private View view; private View mainView; @@ -83,11 +85,11 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS private boolean nightMode; private boolean wasDrawerDisabled; - private int routeInfoMenuState = -1; + private boolean useRouteInfoMenu; @Nullable @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, final Bundle savedInstanceState) { MapActivity mapActivity = (MapActivity) requireActivity(); portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls(); @@ -99,7 +101,7 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS AndroidUtils.addStatusBarPadding21v(mapActivity, view); Bundle args = getArguments(); if (args != null) { - routeInfoMenuState = args.getInt(ROUTE_INFO_STATE_KEY, -1); + useRouteInfoMenu = args.getBoolean(USE_ROUTE_INFO_MENU_KEY, false); } mainView = view.findViewById(R.id.main_view); @@ -174,95 +176,44 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS swipeDismissListener = new SwipeDismissListViewTouchListener( mapActivity, listView, - new SwipeDismissListViewTouchListener.DismissCallbacks() { + new DismissCallbacks() { @Override public boolean canDismiss(int position) { - List activeObjects = ((StableArrayAdapter) listAdapter).getActiveObjects(); - Object obj = listAdapter.getItem(position); - if (obj instanceof LocationPointWrapper) { - LocationPointWrapper w = (LocationPointWrapper) obj; - if (w.getPoint() instanceof TargetPoint) { - return !((TargetPoint) w.getPoint()).start; + StableArrayAdapter stableAdapter = listAdapter; + if (stableAdapter != null) { + List activeObjects = stableAdapter.getActiveObjects(); + Object obj = stableAdapter.getItem(position); + if (obj instanceof LocationPointWrapper) { + LocationPointWrapper w = (LocationPointWrapper) obj; + if (w.getPoint() instanceof TargetPoint) { + return !((TargetPoint) w.getPoint()).start; + } } + return activeObjects.contains(obj); } - return activeObjects.contains(obj); + return false; } @Override - public SwipeDismissListViewTouchListener.Undoable onDismiss(final int position) { - final Object item; - final StableArrayAdapter stableAdapter; - final int activeObjPos; - stableAdapter = (StableArrayAdapter) listAdapter; - item = stableAdapter.getItem(position); - - stableAdapter.setNotifyOnChange(false); - stableAdapter.remove(item); - stableAdapter.getObjects().remove(item); - activeObjPos = stableAdapter.getActiveObjects().indexOf(item); - stableAdapter.getActiveObjects().remove(item); - stableAdapter.refreshData(); - stableAdapter.notifyDataSetChanged(); - - return new SwipeDismissListViewTouchListener.Undoable() { - @Override - public void undo() { - if (item != null) { - stableAdapter.setNotifyOnChange(false); - stableAdapter.insert(item, position); - stableAdapter.getObjects().add(position, item); - stableAdapter.getActiveObjects().add(activeObjPos, item); - stableAdapter.refreshData(); - applyPointsChanges(); - updateTitle(); - } - } - - @Override - public String getTitle() { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - List activeObjects; - if ((mapActivity.getRoutingHelper().isRoutePlanningMode() || mapActivity.getRoutingHelper().isFollowingMode()) - && item != null - && ((activeObjects = stableAdapter.getActiveObjects()).isEmpty() || isContainsOnlyStart(activeObjects))) { - return mapActivity.getResources().getString(R.string.cancel_navigation); - } - } - return null; - } - }; + public Undoable onDismiss(final int position) { + StableArrayAdapter stableAdapter = listAdapter; + if (stableAdapter != null) { + Object item = stableAdapter.getItem(position); + stableAdapter.setNotifyOnChange(false); + stableAdapter.remove(item); + stableAdapter.getObjects().remove(item); + stableAdapter.getActiveObjects().remove(item); + stableAdapter.refreshData(); + stableAdapter.notifyDataSetChanged(); + } + cancelTimer(); + startTimer(); + return null; } @Override public void onHidePopup() { - MapActivity mapActivity = getMapActivity(); - if (mapActivity != null) { - StableArrayAdapter stableAdapter = (StableArrayAdapter) listAdapter; - stableAdapter.refreshData(); - applyPointsChanges(); - updateTitle(); - List activeObjects = stableAdapter.getActiveObjects(); - if (activeObjects.isEmpty() || isContainsOnlyStart(activeObjects)) { - mapActivity.getMapActions().stopNavigationWithoutConfirm(); - mapActivity.getMyApplication().getTargetPointsHelper().removeAllWayPoints(false, true); - mapActivity.getMapRouteInfoMenu().hide(); - } - } - } - - private boolean isContainsOnlyStart(List items) { - if (items.size() == 1) { - Object item = items.get(0); - if (item instanceof LocationPointWrapper) { - LocationPointWrapper w = (LocationPointWrapper) item; - if (w.getPoint() instanceof TargetPoint) { - return ((TargetPoint) w.getPoint()).start; - } - } - } - return false; } }); @@ -277,6 +228,7 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS AddPointBottomSheetDialog fragment = new AddPointBottomSheetDialog(); fragment.setArguments(args); fragment.setUsedOnMap(true); + fragment.setListener(WaypointsFragment.this); fragment.show(mapActivity.getSupportFragmentManager(), AddPointBottomSheetDialog.TAG); } } @@ -364,10 +316,16 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS if (!wasDrawerDisabled) { mapActivity.enableDrawer(); } - updateControlsVisibility(true, routeInfoMenuState != -1); + updateControlsVisibility(true, useRouteInfoMenu); } } + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + outState.putBoolean(USE_ROUTE_INFO_MENU_KEY, useRouteInfoMenu); + super.onSaveInstanceState(outState); + } + @Override public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) { @@ -385,8 +343,8 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS @Override public void reloadAdapter() { - if (listAdapter != null) { - StableArrayAdapter stableAdapter = (StableArrayAdapter) listAdapter; + StableArrayAdapter stableAdapter = listAdapter; + if (stableAdapter != null) { reloadListAdapter(stableAdapter); setDynamicListItems(listView, stableAdapter); } @@ -737,7 +695,7 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS cTimer.cancel(); } - private static View updateWaypointItemView(final boolean edit, final List deletedPoints, + private View updateWaypointItemView(final boolean edit, final List deletedPoints, final MapActivity mapActivity, View v, final LocationPointWrapper point, final ArrayAdapter adapter, final boolean nightMode, @@ -931,15 +889,15 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS } public static boolean showInstance(FragmentManager fragmentManager) { - return WaypointsFragment.showInstance(fragmentManager, -1); + return WaypointsFragment.showInstance(fragmentManager, false); } - public static boolean showInstance(FragmentManager fragmentManager, int routeInfoState) { + public static boolean showInstance(FragmentManager fragmentManager, boolean useRouteInfoMenu) { try { WaypointsFragment fragment = new WaypointsFragment(); Bundle args = new Bundle(); - args.putInt(ROUTE_INFO_STATE_KEY, routeInfoState); + args.putBoolean(USE_ROUTE_INFO_MENU_KEY, useRouteInfoMenu); fragment.setArguments(args); fragmentManager.beginTransaction() @@ -958,12 +916,22 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS MapActivity mapActivity = (MapActivity) getActivity(); if (mapActivity != null) { mapActivity.getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss(); - if (routeInfoMenuState != -1) { - mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog(routeInfoMenuState); + if (useRouteInfoMenu) { + mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog(); } } } catch (Exception e) { // } } + + @Override + public void onSelectOnMap(AddPointBottomSheetDialog dialog) { + MapActivity mapActivity = (MapActivity) getActivity(); + if (mapActivity != null) { + mapActivity.getMapRouteInfoMenu().selectOnScreen(dialog.getPointType(), true); + useRouteInfoMenu = false; + dismiss(); + } + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index 9e125678d1..7ca6119ebc 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -319,6 +319,10 @@ public class MapControlsLayer extends OsmandMapLayer { mapActivity.getMapActions().stopNavigationWithoutConfirm(); } + public void showRouteInfoControlDialog() { + mapRouteInfoMenu.showHideMenu(); + } + public void showRouteInfoControlDialog(int menuState) { mapRouteInfoMenu.showHideMenu(menuState); }