diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index ef0ceda661..0c808453b0 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -90,6 +90,7 @@ public class MapActivityActions implements DialogProvider { public static final int CHANGE_POSITION_ITEM_ORDER = 3000; public static final int EDIT_GPX_WAYPOINT_ITEM_ORDER = 9000; public static final int ADD_GPX_WAYPOINT_ITEM_ORDER = 9000; + public static final int MEASURE_DISTANCE_ITEM_ORDER = 13000; private static final int DIALOG_ADD_FAVORITE = 100; private static final int DIALOG_REPLACE_FAVORITE = 101; @@ -327,6 +328,12 @@ public class MapActivityActions implements DialogProvider { .setListener(listener).createItem()); } + adapter.addItem(itemBuilder + .setTitleId(R.string.measurement_tool, mapActivity) + .setIcon(R.drawable.ic_action_ruler) + .setOrder(MEASURE_DISTANCE_ITEM_ORDER) + .createItem()); + adapter.sortItemsByOrder(); final ArrayAdapter listAdapter = @@ -355,6 +362,9 @@ public class MapActivityActions implements DialogProvider { getMyApplication().getTargetPointsHelper().setStartPoint(new LatLon(latitude, longitude), true, mapActivity.getContextMenu().getPointDescription()); } + } else if (standardId == R.string.measurement_tool) { + mapActivity.getContextMenu().close(); + MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), new LatLon(latitude, longitude)); } } }); diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index ca34bca1b7..9309ca2ab6 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -35,6 +35,7 @@ import android.widget.Toast; import net.osmand.AndroidUtils; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; +import net.osmand.data.LatLon; import net.osmand.plus.ApplicationMode; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; @@ -110,6 +111,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { private MeasurementEditingContext editingCtx = new MeasurementEditingContext(); + private LatLon initialPoint; + private enum SaveType { ROUTE_POINT, LINE @@ -119,6 +122,10 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { this.editingCtx = editingCtx; } + private void setInitialPoint(LatLon initialPoint) { + this.initialPoint = initialPoint; + } + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -464,6 +471,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { getMapActivity().getMapLayers().getMapControlsLayer().showMapControlsIfHidden(); cachedMapPosition = getMapActivity().getMapView().getMapPosition(); setDefaultMapPosition(); + addInitialPoint(); } @Override @@ -978,6 +986,17 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { R.id.measure_mode_controls); } + private void addInitialPoint() { + if (initialPoint != null) { + MeasurementToolLayer layer = getMeasurementLayer(); + if (layer != null) { + editingCtx.getCommandManager().execute(new AddPointCommand(layer, initialPoint)); + doAddOrMovePointCommonStuff(); + initialPoint = null; + } + } + } + private void addPoint() { MeasurementToolLayer measurementLayer = getMeasurementLayer(); if (measurementLayer != null) { @@ -1508,23 +1527,24 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { } } + public static boolean showInstance(FragmentManager fragmentManager, LatLon initialPoint) { + MeasurementToolFragment fragment = new MeasurementToolFragment(); + fragment.setInitialPoint(initialPoint); + return showFragment(fragment, fragmentManager); + } + public static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx) { - try { - MeasurementToolFragment fragment = new MeasurementToolFragment(); - fragment.setEditingCtx(editingCtx); - fragment.setRetainInstance(true); - fragmentManager.beginTransaction() - .add(R.id.bottomFragmentContainer, fragment, MeasurementToolFragment.TAG) - .commitAllowingStateLoss(); - return true; - } catch (Exception e) { - return false; - } + MeasurementToolFragment fragment = new MeasurementToolFragment(); + fragment.setEditingCtx(editingCtx); + return showFragment(fragment, fragmentManager); } public static boolean showInstance(FragmentManager fragmentManager) { + return showFragment(new MeasurementToolFragment(), fragmentManager); + } + + private static boolean showFragment(MeasurementToolFragment fragment, FragmentManager fragmentManager) { try { - MeasurementToolFragment fragment = new MeasurementToolFragment(); fragment.setRetainInstance(true); fragmentManager.beginTransaction() .add(R.id.bottomFragmentContainer, fragment, MeasurementToolFragment.TAG) diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/command/AddPointCommand.java b/OsmAnd/src/net/osmand/plus/measurementtool/command/AddPointCommand.java index 62d3bbc957..702c110a02 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/command/AddPointCommand.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/command/AddPointCommand.java @@ -1,23 +1,40 @@ package net.osmand.plus.measurementtool.command; +import net.osmand.data.LatLon; import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.measurementtool.MeasurementToolLayer; public class AddPointCommand extends MeasurementModeCommand { - private final int position; + private int position; private WptPt point; - private final boolean center; + private boolean center; public AddPointCommand(MeasurementToolLayer measurementLayer, boolean center) { + init(measurementLayer, null, center); + } + + public AddPointCommand(MeasurementToolLayer measurementLayer, LatLon latLon) { + init(measurementLayer, latLon, false); + } + + private void init(MeasurementToolLayer measurementLayer, LatLon latLon, boolean center) { this.measurementLayer = measurementLayer; + if (latLon != null) { + point = new WptPt(); + point.lat = latLon.getLatitude(); + point.lon = latLon.getLongitude(); + } this.center = center; position = measurementLayer.getEditingCtx().getPointsCount(); } @Override public boolean execute() { - if (center) { + if (point != null) { + measurementLayer.getEditingCtx().addPoint(point); + measurementLayer.moveMapToPoint(position); + } else if (center) { point = measurementLayer.addCenterPoint(); } else { point = measurementLayer.addPoint();