Add reorder intermediate points
This commit is contained in:
parent
7df983425a
commit
b3f445dd2a
21 changed files with 516 additions and 286 deletions
BIN
OsmAnd/res/drawable-hdpi/av_download.png
Normal file
BIN
OsmAnd/res/drawable-hdpi/av_download.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
OsmAnd/res/drawable-hdpi/av_upload.png
Normal file
BIN
OsmAnd/res/drawable-hdpi/av_upload.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
OsmAnd/res/drawable-mdpi/av_download.png
Normal file
BIN
OsmAnd/res/drawable-mdpi/av_download.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
OsmAnd/res/drawable-mdpi/av_upload.png
Normal file
BIN
OsmAnd/res/drawable-mdpi/av_upload.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
25
OsmAnd/res/layout/change_order_item.xml
Normal file
25
OsmAnd/res/layout/change_order_item.xml
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/LinearLayout1"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginTop="2dip"
|
||||
android:layout_marginLeft="5dip"
|
||||
android:layout_marginRight="5dip"
|
||||
android:weightSum="1" android:background="@color/color_white">
|
||||
<ImageButton android:src="@drawable/av_download" android:id="@+id/down" android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:text="@string/layer_poi"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textColor="@color/color_black" android:layout_weight="1"/>
|
||||
<ImageButton android:src="@drawable/av_upload" android:id="@+id/up"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</LinearLayout>
|
|
@ -7,7 +7,7 @@
|
|||
android:layout_marginTop="2dip"
|
||||
android:layout_marginLeft="5dip"
|
||||
android:layout_marginRight="5dip"
|
||||
android:weightSum="1" >
|
||||
android:weightSum="1" android:background="@color/color_white">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
|
|
|
@ -236,8 +236,9 @@ public class NavigationInfo {
|
|||
|
||||
public synchronized void setLocation(Location location) {
|
||||
currentLocation = location;
|
||||
if (autoAnnounce && ((OsmandApplication)(context.getApplicationContext())).accessibilityEnabled()) {
|
||||
final LatLon point = settings.getPointToNavigate();
|
||||
OsmandApplication app = ((OsmandApplication)(context.getApplicationContext()));
|
||||
if (autoAnnounce && app.accessibilityEnabled()) {
|
||||
final LatLon point = app.getTargetPointsHelper().getPointToNavigate();
|
||||
if (point != null) {
|
||||
if ((currentLocation != null) && currentLocation.hasBearing()) {
|
||||
final long now = SystemClock.uptimeMillis();
|
||||
|
|
|
@ -76,6 +76,7 @@ public class OsmandApplication extends Application {
|
|||
private GPXFile gpxFileToDisplay;
|
||||
private SavingTrackHelper savingTrackHelper;
|
||||
private LiveMonitoringHelper liveMonitoringHelper;
|
||||
private TargetPointsHelper targetPointsHelper;
|
||||
|
||||
private boolean applicationInitializing = false;
|
||||
private Locale prefferedLocale = null;
|
||||
|
@ -96,6 +97,7 @@ public class OsmandApplication extends Application {
|
|||
liveMonitoringHelper = new LiveMonitoringHelper(this);
|
||||
uiHandler = new Handler();
|
||||
rendererRegistry = new RendererRegistry();
|
||||
targetPointsHelper = new TargetPointsHelper(osmandSettings, routingHelper);
|
||||
checkPrefferedLocale();
|
||||
startApplication();
|
||||
if (LOG.isDebugEnabled()) {
|
||||
|
@ -574,6 +576,10 @@ public class OsmandApplication extends Application {
|
|||
return false;
|
||||
return ((AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE)).isEnabled();
|
||||
}
|
||||
|
||||
public TargetPointsHelper getTargetPointsHelper() {
|
||||
return targetPointsHelper;
|
||||
}
|
||||
|
||||
public ClientContext getClientContext() {
|
||||
if (clientContext == null) {
|
||||
|
|
|
@ -1076,7 +1076,7 @@ public class OsmandSettings {
|
|||
return saveIntermediatePoints(ps,ds);
|
||||
}
|
||||
|
||||
private boolean saveIntermediatePoints(List<LatLon> ps, List<String> ds) {
|
||||
public boolean saveIntermediatePoints(List<LatLon> ps, List<String> ds) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(int i=0; i<ps.size(); i++) {
|
||||
if(i > 0){
|
||||
|
|
192
OsmAnd/src/net/osmand/plus/TargetPointsHelper.java
Normal file
192
OsmAnd/src/net/osmand/plus/TargetPointsHelper.java
Normal file
|
@ -0,0 +1,192 @@
|
|||
package net.osmand.plus;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.location.Location;
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.osmand.access.AccessibleToast;
|
||||
import net.osmand.osm.LatLon;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
|
||||
public class TargetPointsHelper {
|
||||
|
||||
private List<LatLon> intermediatePoints = new ArrayList<LatLon>();
|
||||
private List<String> intermediatePointNames = new ArrayList<String>();
|
||||
private LatLon pointToNavigate = null;
|
||||
private OsmandSettings settings;
|
||||
private RoutingHelper routingHelper;
|
||||
|
||||
public TargetPointsHelper(OsmandSettings settings, RoutingHelper routingHelper){
|
||||
this.settings = settings;
|
||||
this.routingHelper = routingHelper;
|
||||
readFromSettings(settings);
|
||||
}
|
||||
|
||||
private void readFromSettings(OsmandSettings settings) {
|
||||
pointToNavigate = settings.getPointToNavigate();
|
||||
intermediatePoints.clear();
|
||||
intermediatePointNames.clear();
|
||||
intermediatePoints.addAll(settings.getIntermediatePoints());
|
||||
intermediatePointNames.addAll(settings.getIntermediatePointDescriptions(intermediatePoints.size()));
|
||||
}
|
||||
|
||||
public LatLon getPointToNavigate() {
|
||||
return pointToNavigate;
|
||||
}
|
||||
|
||||
public String getPointNavigateDescription(){
|
||||
return settings.getPointNavigateDescription();
|
||||
}
|
||||
|
||||
public List<String> getIntermediatePointNames() {
|
||||
return intermediatePointNames;
|
||||
}
|
||||
|
||||
public List<LatLon> getIntermediatePoints() {
|
||||
return intermediatePoints;
|
||||
}
|
||||
|
||||
public List<LatLon> getIntermediatePointsWithTarget() {
|
||||
List<LatLon> res = new ArrayList<LatLon>();
|
||||
res.addAll(intermediatePoints);
|
||||
if(pointToNavigate != null) {
|
||||
res.add(pointToNavigate);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public List<String> getIntermediatePointNamesWithTarget() {
|
||||
List<String> res = new ArrayList<String>();
|
||||
res.addAll(intermediatePointNames);
|
||||
if(pointToNavigate != null) {
|
||||
res.add(getPointNavigateDescription());
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public LatLon getFirstIntermediatePoint(){
|
||||
if(intermediatePoints.size() > 0) {
|
||||
return intermediatePoints.get(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public void removeWayPoint(MapActivity map, boolean updateRoute, int index){
|
||||
if(index < 0){
|
||||
settings.clearPointToNavigate();
|
||||
pointToNavigate = null;
|
||||
if(intermediatePoints.size() > 0) {
|
||||
settings.deleteIntermediatePoint(intermediatePoints.size() - 1);
|
||||
pointToNavigate = intermediatePoints.remove(intermediatePoints.size() - 1);
|
||||
settings.setPointToNavigate(pointToNavigate.getLatitude(), pointToNavigate.getLongitude(),
|
||||
intermediatePointNames.remove(intermediatePoints.size() - 1));
|
||||
}
|
||||
} else {
|
||||
settings.deleteIntermediatePoint(index);
|
||||
intermediatePoints.remove(index);
|
||||
intermediatePointNames.remove(index);
|
||||
}
|
||||
updateRouteAndReferesh(map, updateRoute);
|
||||
}
|
||||
|
||||
private void updateRouteAndReferesh(MapActivity map, boolean updateRoute) {
|
||||
if(updateRoute && ( routingHelper.isRouteBeingCalculated() || routingHelper.isRouteCalculated() ||
|
||||
routingHelper.isFollowingMode())) {
|
||||
Location lastKnownLocation = map == null ? routingHelper.getLastProjection() : map.getLastKnownLocation();
|
||||
routingHelper.setFinalAndCurrentLocation(settings.getPointToNavigate(),
|
||||
settings.getIntermediatePoints(), lastKnownLocation, routingHelper.getCurrentGPXRoute());
|
||||
}
|
||||
if(map != null) {
|
||||
map.getMapView().refreshMap();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void clearPointToNavigate(MapActivity map, boolean updateRoute) {
|
||||
settings.clearPointToNavigate();
|
||||
settings.clearIntermediatePoints();
|
||||
readFromSettings(settings);
|
||||
updateRouteAndReferesh(map, updateRoute);
|
||||
}
|
||||
|
||||
public void reorderAllTargetPoints(MapActivity map, List<LatLon> point,
|
||||
List<String> names, boolean updateRoute){
|
||||
settings.clearPointToNavigate();
|
||||
if (point.size() > 0) {
|
||||
settings.saveIntermediatePoints(point.subList(0, point.size() - 1), names.subList(0, point.size() - 1));
|
||||
LatLon p = point.get(point.size() - 1);
|
||||
String nm = names.get(point.size() - 1);
|
||||
settings.setPointToNavigate(p.getLatitude(), p.getLongitude(), nm);
|
||||
} else {
|
||||
settings.clearIntermediatePoints();
|
||||
}
|
||||
readFromSettings(settings);
|
||||
updateRouteAndReferesh(map, updateRoute);
|
||||
}
|
||||
|
||||
public void navigateToPoint(MapActivity map, LatLon point, boolean updateRoute, int intermediate){
|
||||
if(point != null){
|
||||
if(intermediate < 0) {
|
||||
settings.setPointToNavigate(point.getLatitude(), point.getLongitude(), null);
|
||||
} else {
|
||||
settings.insertIntermediatePoint(point.getLatitude(), point.getLongitude(), null,
|
||||
intermediate, false);
|
||||
}
|
||||
} else {
|
||||
settings.clearPointToNavigate();
|
||||
settings.clearIntermediatePoints();
|
||||
}
|
||||
readFromSettings(settings);
|
||||
updateRouteAndReferesh(map, updateRoute);
|
||||
|
||||
}
|
||||
|
||||
public boolean checkPointToNavigate(Context ctx ){
|
||||
if(pointToNavigate == null){
|
||||
AccessibleToast.makeText(ctx, R.string.mark_final_location_first, Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void navigatePointDialogAndLaunchMap(final Context ctx, final double lat, final double lon, final String name){
|
||||
if(pointToNavigate != null) {
|
||||
Builder builder = new AlertDialog.Builder(ctx);
|
||||
builder.setTitle(R.string.new_destination_point_dialog);
|
||||
builder.setItems(new String[] {
|
||||
ctx.getString(R.string.replace_destination_point),
|
||||
ctx.getString(R.string.add_as_first_destination_point),
|
||||
ctx.getString(R.string.add_as_last_destination_point)
|
||||
}, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if(which == 0) {
|
||||
settings.setPointToNavigate(lat, lon, true, name);
|
||||
} else if(which == 2) {
|
||||
int sz = intermediatePoints.size();
|
||||
LatLon pt = pointToNavigate;
|
||||
settings.insertIntermediatePoint(pt.getLatitude(), pt.getLongitude(),
|
||||
settings.getPointNavigateDescription(), sz, true);
|
||||
settings.setPointToNavigate(lat, lon, true, name);
|
||||
} else {
|
||||
settings.insertIntermediatePoint(lat, lon, name, 0, true);
|
||||
}
|
||||
readFromSettings(settings);
|
||||
MapActivity.launchMapActivityMoveToTop(ctx);
|
||||
}
|
||||
});
|
||||
builder.show();
|
||||
} else {
|
||||
settings.setPointToNavigate(lat, lon, true, name);
|
||||
MapActivity.launchMapActivityMoveToTop(ctx);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,189 @@
|
|||
package net.osmand.plus.activities;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.osmand.OsmAndFormatter;
|
||||
import net.osmand.access.AccessibleAlertBuilder;
|
||||
import net.osmand.osm.LatLon;
|
||||
import net.osmand.osm.MapUtils;
|
||||
import net.osmand.plus.OsmandApplication;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.views.AnimateDraggingMapThread;
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.content.DialogInterface;
|
||||
import android.graphics.Color;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class IntermediatePointsDialog {
|
||||
|
||||
|
||||
public static void openIntermediatePointsDialog(MapActivity mapActivity, OsmandApplication app){
|
||||
openIntermediatePointsDialog(mapActivity, app, false);
|
||||
}
|
||||
|
||||
public static void openIntermediatePointsDialog(final MapActivity mapActivity,
|
||||
final OsmandApplication app, final boolean changeOrder){
|
||||
TargetPointsHelper targets = app.getTargetPointsHelper();
|
||||
final List<LatLon> intermediates = targets.getIntermediatePointsWithTarget();
|
||||
final List<String> names = targets.getIntermediatePointNamesWithTarget();
|
||||
final boolean[] checkedIntermediates = new boolean[intermediates.size()];
|
||||
final ArrayAdapter<LatLon> listadapter = new ArrayAdapter<LatLon>(app,
|
||||
changeOrder? R.layout.change_order_item : R.layout.layers_list_activity_item, R.id.title,
|
||||
intermediates) {
|
||||
@Override
|
||||
public View getView(final int position, View convertView, ViewGroup parent) {
|
||||
|
||||
// User super class to create the View
|
||||
View v = super.getView(position, convertView, parent);
|
||||
TextView tv = (TextView) v.findViewById(R.id.title);
|
||||
String nm = (position + 1) + ". ";
|
||||
String distString = "";
|
||||
if(mapActivity != null) {
|
||||
double lat = mapActivity.getMapView().getLatitude();
|
||||
double lon = mapActivity.getMapView().getLongitude();
|
||||
double meters = MapUtils.getDistance(intermediates.get(position), lat, lon);
|
||||
distString = OsmAndFormatter.getFormattedDistance((float) meters, mapActivity);
|
||||
}
|
||||
|
||||
nm += app.getString(R.string.target_point, distString);
|
||||
String descr = names.get(position);
|
||||
if(descr != null && descr.trim().length() > 0) {
|
||||
nm += "\n" + descr;
|
||||
}
|
||||
tv.setText(nm);
|
||||
checkedIntermediates[position] = true;
|
||||
if (changeOrder) {
|
||||
((ImageButton) v.findViewById(R.id.up)).setOnClickListener(new View.OnClickListener(){
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if(position > 0) {
|
||||
LatLon old = intermediates.remove(position - 1);
|
||||
String oldN = names.remove(position - 1);
|
||||
names.add(position, oldN);
|
||||
intermediates.add(position, old);
|
||||
notifyDataSetInvalidated();
|
||||
}
|
||||
}
|
||||
});
|
||||
((ImageButton) v.findViewById(R.id.down)).setOnClickListener(new View.OnClickListener(){
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if(position < intermediates.size() - 1) {
|
||||
LatLon old = intermediates.remove(position + 1);
|
||||
String oldN = names.remove(position + 1);
|
||||
names.add(position, oldN);
|
||||
intermediates.add(position, old);
|
||||
notifyDataSetInvalidated();
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (position == intermediates.size() - 1) {
|
||||
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.list_view_set_destination, 0, 0, 0);
|
||||
final CheckBox ch = ((CheckBox) v.findViewById(R.id.check_item));
|
||||
ch.setVisibility(View.GONE);
|
||||
} else {
|
||||
// list_view_set_intermediate
|
||||
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.list_view_set_intermediate, 0, 0, 0);
|
||||
final CheckBox ch = ((CheckBox) v.findViewById(R.id.check_item));
|
||||
ch.setVisibility(View.VISIBLE);
|
||||
ch.setChecked(true);
|
||||
ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
checkedIntermediates[position] = isChecked;
|
||||
}
|
||||
});
|
||||
}
|
||||
return v;
|
||||
}
|
||||
};
|
||||
ListView lv = new ListView(app);
|
||||
lv.setAdapter(listadapter);
|
||||
lv.setBackgroundColor(Color.WHITE);
|
||||
lv.setOnItemClickListener(new OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
if (mapActivity != null) {
|
||||
// AnimateDraggingMapThread thread = mapActivity.getMapView().getAnimatedDraggingThread();
|
||||
LatLon pointToNavigate = intermediates.get(position);
|
||||
float fZoom = mapActivity.getMapView().getFloatZoom() < 15 ? 15 : mapActivity.getMapView().getFloatZoom();
|
||||
// thread.startMoving(pointToNavigate.getLatitude(), pointToNavigate.getLongitude(), fZoom, true);
|
||||
mapActivity.getMapView().setZoom(fZoom);
|
||||
mapActivity.getMapView().setLatLon(pointToNavigate.getLatitude(), pointToNavigate.getLongitude());
|
||||
listadapter.notifyDataSetInvalidated();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Builder builder = new AccessibleAlertBuilder(app);
|
||||
builder.setView(lv);
|
||||
builder.setInverseBackgroundForced(true);
|
||||
builder.setPositiveButton(R.string.default_buttons_ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if(changeOrder) {
|
||||
commitChangePointsOrder(app, mapActivity, intermediates, names);
|
||||
} else {
|
||||
commitPointsRemoval(app, mapActivity, checkedIntermediates);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
if (!changeOrder) {
|
||||
builder.setNeutralButton("Change order", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
openIntermediatePointsDialog(mapActivity, app, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private static void commitPointsRemoval(OsmandApplication app, final MapActivity mapActivity, final boolean[] checkedIntermediates) {
|
||||
int cnt = 0;
|
||||
for (int i = checkedIntermediates.length - 1; i >= 0; i--) {
|
||||
if (!checkedIntermediates[i]) {
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
if (cnt > 0) {
|
||||
for (int i = checkedIntermediates.length - 1; i >= 0; i--) {
|
||||
if (!checkedIntermediates[i]) {
|
||||
cnt--;
|
||||
app.getTargetPointsHelper().removeWayPoint(mapActivity, cnt == 0, i);
|
||||
}
|
||||
}
|
||||
if(mapActivity != null) {
|
||||
mapActivity.getMapLayers().getContextMenuLayer().setLocation(null, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void commitChangePointsOrder(OsmandApplication app, final MapActivity mapActivity, List<LatLon> target, List<String> names) {
|
||||
TargetPointsHelper targets = app.getTargetPointsHelper();
|
||||
List<LatLon> cur = targets.getIntermediatePointsWithTarget();
|
||||
boolean eq = true;
|
||||
for(int j = 0; j < cur.size() && j < target.size() ; j++) {
|
||||
if(cur.get(j) != target.get(j)) {
|
||||
eq = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!eq) {
|
||||
targets.reorderAllTargetPoints(mapActivity, target, names, true);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,6 +28,7 @@ import net.osmand.plus.OsmandPlugin;
|
|||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.ResourceManager;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.search.SearchActivity;
|
||||
import net.osmand.plus.routing.RouteProvider.GPXRouteParams;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
|
@ -207,7 +208,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
// This situtation could be when navigation suddenly crashed and after restarting
|
||||
// it tries to continue the last route
|
||||
if(settings.FOLLOW_THE_ROUTE.get() && !routingHelper.isRouteCalculated()){
|
||||
restoreRoutingMode(settings.getPointToNavigate(), settings.getIntermediatePoints());
|
||||
restoreRoutingMode();
|
||||
}
|
||||
|
||||
mapView.setMapLocationListener(this);
|
||||
|
@ -285,7 +286,6 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
setRequestedOrientation(settings.MAP_SCREEN_ORIENTATION.get());
|
||||
// can't return from this method we are not sure if activity will be recreated or not
|
||||
}
|
||||
mapLayers.getNavigationLayer().setPointToNavigate(settings.getPointToNavigate(), settings.getIntermediatePoints());
|
||||
|
||||
Location loc = getLastKnownLocation();
|
||||
if (loc != null && (System.currentTimeMillis() - loc.getTime()) > 30 * 1000) {
|
||||
|
@ -307,13 +307,14 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
|
||||
mapLayers.getMapInfoLayer().getBackToLocation().setEnabled(false);
|
||||
|
||||
// if destination point was changed try to recalculate route
|
||||
// if destination point was changed try to recalculate route
|
||||
TargetPointsHelper targets = getTargetPoints();
|
||||
if (routingHelper.isFollowingMode() && (
|
||||
!Algoritms.objectEquals(settings.getPointToNavigate(), routingHelper.getFinalLocation() )||
|
||||
!Algoritms.objectEquals(settings.getIntermediatePoints(), routingHelper.getIntermediatePoints())
|
||||
!Algoritms.objectEquals(targets.getPointToNavigate(), routingHelper.getFinalLocation() )||
|
||||
!Algoritms.objectEquals(targets.getIntermediatePoints(), routingHelper.getIntermediatePoints())
|
||||
)) {
|
||||
routingHelper.setFinalAndCurrentLocation(settings.getPointToNavigate(),
|
||||
settings.getIntermediatePoints(),
|
||||
routingHelper.setFinalAndCurrentLocation(targets.getPointToNavigate(),
|
||||
targets.getIntermediatePoints(),
|
||||
getLastKnownLocation(), routingHelper.getCurrentGPXRoute());
|
||||
}
|
||||
|
||||
|
@ -385,8 +386,10 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
mapView.refreshMap(changed);
|
||||
}
|
||||
|
||||
private void restoreRoutingMode(final LatLon pointToNavigate, final List<LatLon> intermediates) {
|
||||
private void restoreRoutingMode() {
|
||||
final String gpxPath = settings.FOLLOW_THE_GPX_ROUTE.get();
|
||||
final TargetPointsHelper targetPoints = getTargetPoints();
|
||||
final LatLon pointToNavigate = targetPoints.getPointToNavigate();
|
||||
if (pointToNavigate == null && gpxPath == null) {
|
||||
notRestoreRoutingMode();
|
||||
} else {
|
||||
|
@ -475,7 +478,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
if (endPoint == null) {
|
||||
notRestoreRoutingMode();
|
||||
} else {
|
||||
followRoute(settings.getApplicationMode(), endPoint, intermediates, startPoint, gpxRoute);
|
||||
followRoute(settings.getApplicationMode(), endPoint, targetPoints.getIntermediatePoints(), startPoint, gpxRoute);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -674,7 +677,7 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
}
|
||||
|
||||
private void emitNavigationHint() {
|
||||
final LatLon point = settings.getPointToNavigate();
|
||||
final LatLon point = getTargetPoints().getPointToNavigate();
|
||||
if (point != null) {
|
||||
if (routingHelper.isRouteCalculated()) {
|
||||
routingHelper.getVoiceRouter().announceCurrentDirection(getLastKnownLocation());
|
||||
|
@ -985,16 +988,6 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
return zoomDelta;
|
||||
}
|
||||
|
||||
public void removeIntermediatePoint(boolean updateRoute, int index){
|
||||
mapLayers.getNavigationLayer().getIntermediatePoints().remove(index);
|
||||
settings.deleteIntermediatePoint(index);
|
||||
if(updateRoute && ( routingHelper.isRouteBeingCalculated() || routingHelper.isRouteCalculated() ||
|
||||
routingHelper.isFollowingMode())) {
|
||||
routingHelper.setFinalAndCurrentLocation(settings.getPointToNavigate(),
|
||||
settings.getIntermediatePoints(), getLastKnownLocation(), routingHelper.getCurrentGPXRoute());
|
||||
}
|
||||
mapView.refreshMap();
|
||||
}
|
||||
|
||||
public void followRoute(ApplicationMode appMode, LatLon finalLocation, List<LatLon> intermediatePoints, Location currentLocation, GPXRouteParams gpxRoute){
|
||||
// change global settings
|
||||
|
@ -1016,25 +1009,6 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
getMyApplication().showDialogInitializingCommandPlayer(MapActivity.this);
|
||||
}
|
||||
|
||||
public void navigateToPoint(LatLon point, boolean updateRoute, int intermediate){
|
||||
if(point != null){
|
||||
if(intermediate < 0) {
|
||||
settings.setPointToNavigate(point.getLatitude(), point.getLongitude(), null);
|
||||
} else {
|
||||
settings.insertIntermediatePoint(point.getLatitude(), point.getLongitude(), null,
|
||||
intermediate, false);
|
||||
}
|
||||
} else {
|
||||
settings.clearPointToNavigate();
|
||||
settings.clearIntermediatePoints();
|
||||
}
|
||||
if(updateRoute && ( routingHelper.isRouteBeingCalculated() || routingHelper.isRouteCalculated() ||
|
||||
routingHelper.isFollowingMode())) {
|
||||
routingHelper.setFinalAndCurrentLocation(settings.getPointToNavigate(),
|
||||
settings.getIntermediatePoints(), getLastKnownLocation(), routingHelper.getCurrentGPXRoute());
|
||||
}
|
||||
mapLayers.getNavigationLayer().setPointToNavigate(settings.getPointToNavigate(), settings.getIntermediatePoints());
|
||||
}
|
||||
|
||||
public Location getLastKnownLocation(){
|
||||
if(mapLayers.getLocationLayer() == null) {
|
||||
|
@ -1047,21 +1021,12 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
|
|||
return new LatLon(mapView.getLatitude(), mapView.getLongitude());
|
||||
}
|
||||
|
||||
public TargetPointsHelper getTargetPoints(){
|
||||
return getMyApplication().getTargetPointsHelper();
|
||||
}
|
||||
|
||||
public LatLon getPointToNavigate(){
|
||||
return mapLayers.getNavigationLayer().getPointToNavigate();
|
||||
}
|
||||
|
||||
public List<LatLon> getIntermediatePoints(){
|
||||
return mapLayers.getNavigationLayer().getIntermediatePoints();
|
||||
}
|
||||
|
||||
|
||||
public LatLon getFirstIntermediatePoint(){
|
||||
List<LatLon> ip = mapLayers.getNavigationLayer().getIntermediatePoints();
|
||||
if(ip.size() > 0) {
|
||||
return ip.get(0);
|
||||
}
|
||||
return null;
|
||||
return getTargetPoints().getPointToNavigate();
|
||||
}
|
||||
|
||||
public RoutingHelper getRoutingHelper() {
|
||||
|
|
|
@ -15,7 +15,6 @@ import net.osmand.AndroidUtils;
|
|||
import net.osmand.CallbackWithObject;
|
||||
import net.osmand.FavouritePoint;
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.OsmAndFormatter;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.LogUtil;
|
||||
import net.osmand.Version;
|
||||
|
@ -36,10 +35,10 @@ import net.osmand.plus.OsmandPlugin;
|
|||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.ResourceManager;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.search.SearchActivity;
|
||||
import net.osmand.plus.routing.RouteProvider.GPXRouteParams;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.plus.views.AnimateDraggingMapThread;
|
||||
import net.osmand.plus.views.BaseMapLayer;
|
||||
import net.osmand.plus.views.MapTileLayer;
|
||||
import net.osmand.plus.views.OsmandMapTileView;
|
||||
|
@ -50,7 +49,6 @@ import android.app.Dialog;
|
|||
import android.app.ProgressDialog;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.DialogInterface.OnMultiChoiceClickListener;
|
||||
import android.content.Intent;
|
||||
|
@ -77,7 +75,6 @@ import android.widget.AutoCompleteTextView;
|
|||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ListAdapter;
|
||||
|
@ -462,15 +459,6 @@ public class MapActivityActions implements DialogProvider {
|
|||
}
|
||||
|
||||
|
||||
private boolean checkPointToNavigate(){
|
||||
MapActivityLayers mapLayers = mapActivity.getMapLayers();
|
||||
if(mapLayers.getNavigationLayer().getPointToNavigate() == null){
|
||||
AccessibleToast.makeText(mapActivity, R.string.mark_final_location_first, Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public String getRoutePointDescription(double lat, double lon) {
|
||||
return mapActivity.getString(R.string.route_descr_lat_lon, lat, lon);
|
||||
}
|
||||
|
@ -491,22 +479,23 @@ public class MapActivityActions implements DialogProvider {
|
|||
from = getRoutePointDescription(fromOrCurrent.getLatitude(),
|
||||
fromOrCurrent.getLongitude());
|
||||
}
|
||||
|
||||
TargetPointsHelper targets = mapActivity.getTargetPoints();
|
||||
String tos;
|
||||
if(to == null) {
|
||||
tos = getRoutePointDescription(mapActivity.getPointToNavigate(),
|
||||
settings.getPointNavigateDescription());
|
||||
tos = getRoutePointDescription(targets.getPointToNavigate(),
|
||||
targets.getPointNavigateDescription());
|
||||
} else {
|
||||
tos = getRoutePointDescription(to, "");
|
||||
}
|
||||
int sz = mapActivity.getIntermediatePoints().size();
|
||||
|
||||
int sz = targets.getIntermediatePoints().size();
|
||||
if(sz == 0) {
|
||||
return mapActivity.getString(R.string.route_descr_from_to, from, tos);
|
||||
} else {
|
||||
String via = "";
|
||||
List<String> names = settings.getIntermediatePointDescriptions(sz);
|
||||
List<String> names = targets.getIntermediatePointNames();
|
||||
for (int i = 0; i < sz ; i++) {
|
||||
via += "\n - " + getRoutePointDescription(mapActivity.getIntermediatePoints().get(i),
|
||||
via += "\n - " + getRoutePointDescription(targets.getIntermediatePoints().get(i),
|
||||
names.get(i));
|
||||
}
|
||||
return mapActivity.getString(R.string.route_descr_from_to_via, from, via, tos);
|
||||
|
@ -516,9 +505,8 @@ public class MapActivityActions implements DialogProvider {
|
|||
|
||||
public void getDirections(final Location fromOrCurrent, final LatLon to, boolean gpxRouteEnabled) {
|
||||
|
||||
final RoutingHelper routingHelper = mapActivity.getRoutingHelper();
|
||||
|
||||
Builder builder = new AlertDialog.Builder(mapActivity);
|
||||
final TargetPointsHelper targets = mapActivity.getTargetPoints();
|
||||
|
||||
View view = mapActivity.getLayoutInflater().inflate(R.layout.calculate_route, null);
|
||||
final CheckBox nonoptimal = (CheckBox) view.findViewById(R.id.OptimalCheckox);
|
||||
|
@ -577,14 +565,14 @@ public class MapActivityActions implements DialogProvider {
|
|||
DialogInterface.OnClickListener onlyShowCall = new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if(to != null) {
|
||||
mapActivity.navigateToPoint(to, false, -1);
|
||||
if (to != null) {
|
||||
targets.navigateToPoint(mapActivity, to, false, -1);
|
||||
}
|
||||
if (!checkPointToNavigate()) {
|
||||
if (!targets.checkPointToNavigate(mapActivity)) {
|
||||
return;
|
||||
}
|
||||
Location from = fromOrCurrent;
|
||||
if(from == null) {
|
||||
if (from == null) {
|
||||
from = mapActivity.getLastKnownLocation();
|
||||
}
|
||||
if (from == null) {
|
||||
|
@ -592,7 +580,8 @@ public class MapActivityActions implements DialogProvider {
|
|||
return;
|
||||
}
|
||||
|
||||
// PREV_APPLICATION_MODE also needs to be set here to overwrite possibly outdated value from prior follow-navigation in different profile
|
||||
// PREV_APPLICATION_MODE also needs to be set here to overwrite possibly outdated value from prior follow-navigation in
|
||||
// different profile
|
||||
// Do not overwrite PREV_APPLICATION_MODE if already navigating
|
||||
if (!routingHelper.isFollowingMode()) {
|
||||
settings.PREV_APPLICATION_MODE.set(settings.APPLICATION_MODE.get());
|
||||
|
@ -604,8 +593,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
settings.FOLLOW_THE_ROUTE.set(false);
|
||||
settings.FOLLOW_THE_GPX_ROUTE.set(null);
|
||||
routingHelper.setFollowingMode(false);
|
||||
routingHelper.setFinalAndCurrentLocation(mapActivity.getPointToNavigate(),
|
||||
mapActivity.getIntermediatePoints(),from, null);
|
||||
routingHelper.setFinalAndCurrentLocation(targets.getPointToNavigate(), targets.getIntermediatePoints(), from, null);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -613,9 +601,9 @@ public class MapActivityActions implements DialogProvider {
|
|||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if(to != null) {
|
||||
mapActivity.navigateToPoint(to, false, -1);
|
||||
targets.navigateToPoint(mapActivity, to, false, -1);
|
||||
}
|
||||
if (!checkPointToNavigate()) {
|
||||
if (!targets.checkPointToNavigate(mapActivity)) {
|
||||
return;
|
||||
}
|
||||
boolean msg = true;
|
||||
|
@ -638,7 +626,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
ApplicationMode mode = getAppMode(buttons, settings);
|
||||
settings.OPTIMAL_ROUTE_MODE.setModeValue(mode, !nonoptimal.isChecked());
|
||||
dialog.dismiss();
|
||||
mapActivity.followRoute(mode, mapActivity.getPointToNavigate(), mapActivity.getIntermediatePoints(),
|
||||
mapActivity.followRoute(mode, targets.getPointToNavigate(), targets.getIntermediatePoints(),
|
||||
current, null);
|
||||
}
|
||||
};
|
||||
|
@ -647,7 +635,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if(to != null) {
|
||||
mapActivity.navigateToPoint(to, false, -1);
|
||||
targets.navigateToPoint(mapActivity, to, false, -1);
|
||||
}
|
||||
ApplicationMode mode = getAppMode(buttons, settings);
|
||||
navigateUsingGPX(mode);
|
||||
|
@ -712,8 +700,8 @@ public class MapActivityActions implements DialogProvider {
|
|||
endPoint = point;
|
||||
}
|
||||
if(endPoint != null) {
|
||||
settings.setPointToNavigate(point.getLatitude(), point.getLongitude(), null);
|
||||
mapLayers.getNavigationLayer().setPointToNavigate(point, new ArrayList<LatLon>());
|
||||
mapActivity.getTargetPoints().navigateToPoint(
|
||||
mapActivity, point, false, -1);
|
||||
}
|
||||
}
|
||||
if(endPoint != null){
|
||||
|
@ -820,8 +808,9 @@ public class MapActivityActions implements DialogProvider {
|
|||
|
||||
adapter.registerItem(R.string.context_menu_item_navigate_point, R.drawable.list_view_set_destination);
|
||||
adapter.registerItem(R.string.context_menu_item_directions, R.drawable.list_activities_directions_to_here);
|
||||
if(settings.getPointToNavigate() != null) {
|
||||
if(mapActivity.getIntermediatePoints().size() == 0) {
|
||||
final TargetPointsHelper targets = mapActivity.getTargetPoints();
|
||||
if(targets.getPointToNavigate() != null) {
|
||||
if(targets.getIntermediatePoints().size() == 0) {
|
||||
adapter.registerItem(R.string.context_menu_item_intermediate_point, R.drawable.list_view_set_intermediate);
|
||||
} else {
|
||||
adapter.registerItem(R.string.context_menu_item_first_intermediate_point, R.drawable.list_view_set_intermediate);
|
||||
|
@ -874,23 +863,27 @@ public class MapActivityActions implements DialogProvider {
|
|||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
mapActivity.startActivity(intent);
|
||||
} else if (standardId == R.string.context_menu_item_navigate_point) {
|
||||
mapActivity.navigateToPoint(new LatLon(latitude, longitude), true, -1);
|
||||
mapActivity.getTargetPoints().navigateToPoint(mapActivity,
|
||||
new LatLon(latitude, longitude), true, -1);
|
||||
} else if (standardId == R.string.context_menu_item_directions) {
|
||||
// always enable and follow and let calculate it (GPS is not accessible in garage)
|
||||
getDirections(null, new LatLon(latitude, longitude), true);
|
||||
} else if (standardId == R.string.context_menu_item_show_route) {
|
||||
if (checkPointToNavigate()) {
|
||||
if (targets.checkPointToNavigate(mapActivity)) {
|
||||
Location loc = new Location("map");
|
||||
loc.setLatitude(latitude);
|
||||
loc.setLongitude(longitude);
|
||||
getDirections(loc, null, true);
|
||||
}
|
||||
} else if (standardId == R.string.context_menu_item_intermediate_point) {
|
||||
mapActivity.navigateToPoint(new LatLon(latitude, longitude), true, mapActivity.getIntermediatePoints().size());
|
||||
targets.navigateToPoint(mapActivity,
|
||||
new LatLon(latitude, longitude), true, targets.getIntermediatePoints().size());
|
||||
} else if (standardId == R.string.context_menu_item_first_intermediate_point) {
|
||||
mapActivity.navigateToPoint(new LatLon(latitude, longitude), true, 0);
|
||||
targets.navigateToPoint(mapActivity,
|
||||
new LatLon(latitude, longitude), true, 0);
|
||||
} else if (standardId == R.string.context_menu_item_last_intermediate_point) {
|
||||
mapActivity.navigateToPoint(new LatLon(latitude, longitude), true, mapActivity.getIntermediatePoints().size());
|
||||
targets.navigateToPoint(mapActivity,
|
||||
new LatLon(latitude, longitude), true, targets.getIntermediatePoints().size());
|
||||
} else if (standardId == R.string.context_menu_item_share_location) {
|
||||
shareLocation(latitude, longitude, mapActivity.getMapView().getZoom());
|
||||
} else if (standardId == R.string.context_menu_item_add_favorite) {
|
||||
|
@ -1038,7 +1031,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
new OnOptionsMenuClick() {
|
||||
@Override
|
||||
public void prepareOptionsMenu(Menu menu, MenuItem navigateToPointMenu) {
|
||||
if (settings.getPointToNavigate() != null) {
|
||||
if (mapActivity.getPointToNavigate() != null) {
|
||||
navigateToPointMenu.setTitle((routingHelper.isRouteCalculated() || routingHelper.isFollowingMode() ||
|
||||
routingHelper.isRouteBeingCalculated()) ? R.string.stop_routing : R.string.stop_navigation);
|
||||
navigateToPointMenu.setVisible(true);
|
||||
|
@ -1056,7 +1049,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
mapActivity.updateApplicationModeSettings();
|
||||
mapView.refreshMap(changed);
|
||||
} else {
|
||||
mapActivity.navigateToPoint(null, true, -1);
|
||||
mapActivity.getTargetPoints().clearPointToNavigate(mapActivity, true);
|
||||
}
|
||||
mapView.refreshMap();
|
||||
return true;
|
||||
|
@ -1121,7 +1114,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
optionsMenuHelper.registerOptionsMenuItem(R.string.target_points, R.string.target_points, new OnOptionsMenuClick() {
|
||||
@Override
|
||||
public void prepareOptionsMenu(Menu menu, MenuItem item) {
|
||||
item.setVisible(mapActivity.getIntermediatePoints().size() > 0);
|
||||
item.setVisible(mapActivity.getTargetPoints().getIntermediatePoints().size() > 0);
|
||||
}
|
||||
@Override
|
||||
public boolean onClick(MenuItem item) {
|
||||
|
@ -1168,99 +1161,10 @@ public class MapActivityActions implements DialogProvider {
|
|||
}
|
||||
|
||||
public void openIntermediatePointsDialog(){
|
||||
Builder builder = new AlertDialog.Builder(mapActivity);
|
||||
final ArrayList<LatLon> intermediates = new ArrayList<LatLon>(mapActivity.getIntermediatePoints());
|
||||
final ArrayList<String> names = new ArrayList<String>(settings.getIntermediatePointDescriptions(
|
||||
intermediates.size()));
|
||||
final int targetPointInd = mapActivity.getPointToNavigate() == null ? -1 : intermediates.size();
|
||||
if(mapActivity.getPointToNavigate() != null) {
|
||||
intermediates.add(mapActivity.getPointToNavigate());
|
||||
if(settings.getPointNavigateDescription() != null) {
|
||||
names.add(settings.getPointNavigateDescription());
|
||||
} else {
|
||||
names.add("");
|
||||
}
|
||||
}
|
||||
final List<String> intermediateNames = new ArrayList<String>();
|
||||
double lat = mapActivity.getMapView().getLatitude();
|
||||
double lon = mapActivity.getMapView().getLongitude();
|
||||
for (int i = 0; i < intermediates.size(); i++) {
|
||||
double meters = MapUtils.getDistance(intermediates.get(i), lat, lon);
|
||||
String distString = OsmAndFormatter.getFormattedDistance((float) meters, mapActivity);
|
||||
String nm = (i+1)+". " + mapActivity.getString(R.string.target_point, distString);
|
||||
String descr = names.get(i);
|
||||
if(names.get(i) != null && descr.trim().length() > 0) {
|
||||
nm += "\n" + descr;
|
||||
}
|
||||
intermediateNames.add(nm);
|
||||
}
|
||||
final boolean[] checkedIntermediates = new boolean[intermediateNames.size()];
|
||||
ListAdapter listadapter = new ArrayAdapter<String>(mapActivity, R.layout.layers_list_activity_item, R.id.title,
|
||||
intermediateNames) {
|
||||
@Override
|
||||
public View getView(final int position, View convertView, ViewGroup parent) {
|
||||
// User super class to create the View
|
||||
View v = super.getView(position, convertView, parent);
|
||||
TextView tv = (TextView) v.findViewById(R.id.title);
|
||||
tv.setText(intermediateNames.get(position));
|
||||
|
||||
checkedIntermediates[position] = true;
|
||||
if(position == targetPointInd) {
|
||||
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.list_view_set_destination, 0, 0, 0);
|
||||
final CheckBox ch = ((CheckBox) v.findViewById(R.id.check_item));
|
||||
ch.setVisibility(View.GONE);
|
||||
} else {
|
||||
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.list_view_set_intermediate, 0, 0, 0);
|
||||
final CheckBox ch = ((CheckBox) v.findViewById(R.id.check_item));
|
||||
ch.setVisibility(View.VISIBLE);
|
||||
ch.setChecked(true);
|
||||
ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
checkedIntermediates[position] = isChecked;
|
||||
}
|
||||
});
|
||||
}
|
||||
return v;
|
||||
}
|
||||
};
|
||||
builder.setAdapter(listadapter, new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
AnimateDraggingMapThread thread = mapActivity.getMapView().getAnimatedDraggingThread();
|
||||
LatLon pointToNavigate = intermediates.get(which);
|
||||
float fZoom = mapActivity.getMapView().getFloatZoom() < 15 ? 15 : mapActivity.getMapView().getFloatZoom();
|
||||
thread.startMoving(pointToNavigate.getLatitude(), pointToNavigate.getLongitude(), fZoom, true);
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(R.string.default_buttons_ok, new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
int cnt = 0;
|
||||
for (int i = checkedIntermediates.length - 1; i >= 0; i--) {
|
||||
if (!checkedIntermediates[i]) {
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
if (cnt > 0) {
|
||||
for (int i = checkedIntermediates.length - 1; i >= 0; i--) {
|
||||
if (!checkedIntermediates[i]) {
|
||||
cnt--;
|
||||
mapActivity.removeIntermediatePoint(cnt == 0, i);
|
||||
if (cnt == 0) {
|
||||
mapActivity.getMapView().refreshMap();
|
||||
}
|
||||
}
|
||||
}
|
||||
mapActivity.getMapLayers().getContextMenuLayer().setLocation(null, "");
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
builder.show();
|
||||
IntermediatePointsDialog.openIntermediatePointsDialog(mapActivity, mapActivity.getMyApplication());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void startGpsStatusIntent() {
|
||||
Intent intent = new Intent();
|
||||
|
@ -1306,7 +1210,7 @@ public class MapActivityActions implements DialogProvider {
|
|||
mapActivity.backToLocationImpl();
|
||||
break;
|
||||
case 1:
|
||||
mapActivity.getNavigationInfo().show(settings.getPointToNavigate(),
|
||||
mapActivity.getNavigationInfo().show(mapActivity.getPointToNavigate(),
|
||||
mapActivity.getMapLayers().getLocationLayer().getHeading());
|
||||
break;
|
||||
default:
|
||||
|
@ -1345,9 +1249,8 @@ public class MapActivityActions implements DialogProvider {
|
|||
if(onShow != null) {
|
||||
onShow.onClick(v);
|
||||
}
|
||||
navigateToPoint(activity, location.getLatitude(), location.getLongitude(), name);
|
||||
// app.getSettings().setPointToNavigate(location.getLatitude(), location.getLongitude(), name);
|
||||
// MapActivity.launchMapActivityMoveToTop(activity);
|
||||
app.getTargetPointsHelper().navigatePointDialogAndLaunchMap(activity,
|
||||
location.getLatitude(), location.getLongitude(), name);
|
||||
qa.dismiss();
|
||||
}
|
||||
});
|
||||
|
@ -1369,38 +1272,4 @@ public class MapActivityActions implements DialogProvider {
|
|||
// qa.addActionItem(directionsTo);
|
||||
}
|
||||
|
||||
public static void navigateToPoint(final Context activity, final double lat, final double lon, final String name){
|
||||
final OsmandApplication app = ((OsmandApplication) activity.getApplicationContext());
|
||||
if(app.getSettings().getPointToNavigate() != null) {
|
||||
Builder builder = new AlertDialog.Builder(activity);
|
||||
builder.setTitle(R.string.new_destination_point_dialog);
|
||||
builder.setItems(new String[] {
|
||||
activity.getString(R.string.replace_destination_point),
|
||||
activity.getString(R.string.add_as_first_destination_point),
|
||||
activity.getString(R.string.add_as_last_destination_point)
|
||||
}, new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if(which == 0) {
|
||||
app.getSettings().setPointToNavigate(lat, lon, true, name);
|
||||
} else if(which == 2) {
|
||||
int sz = app.getSettings().getIntermediatePoints().size();
|
||||
// app.getSettings().insertIntermediatePoint(lat, lon, name, sz);
|
||||
LatLon pt = app.getSettings().getPointToNavigate();
|
||||
app.getSettings().insertIntermediatePoint(pt.getLatitude(), pt.getLongitude(),
|
||||
app.getSettings().getPointNavigateDescription(), sz, true);
|
||||
app.getSettings().setPointToNavigate(lat, lon, true, name);
|
||||
} else {
|
||||
app.getSettings().insertIntermediatePoint(lat, lon, name, 0, true);
|
||||
}
|
||||
MapActivity.launchMapActivityMoveToTop(activity);
|
||||
}
|
||||
});
|
||||
builder.show();
|
||||
} else {
|
||||
app.getSettings().setPointToNavigate(lat, lon, true, name);
|
||||
MapActivity.launchMapActivityMoveToTop(activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -257,9 +257,11 @@ public class NavigatePointActivity extends Activity implements SearchActivityChi
|
|||
|
||||
if(navigate){
|
||||
if(activity != null) {
|
||||
MapActivityActions.navigateToPoint(activity, lat, lon, getString(R.string.point_on_map, lat, lon));
|
||||
OsmandApplication app = (OsmandApplication) activity.getApplication();
|
||||
app.getTargetPointsHelper().navigatePointDialogAndLaunchMap(activity, lat, lon, getString(R.string.point_on_map, lat, lon));
|
||||
} else {
|
||||
MapActivityActions.navigateToPoint(this, lat, lon, getString(R.string.point_on_map, lat, lon));
|
||||
OsmandApplication app = (OsmandApplication) getApplication();
|
||||
app.getTargetPointsHelper().navigatePointDialogAndLaunchMap(this, lat, lon, getString(R.string.point_on_map, lat, lon));
|
||||
}
|
||||
if(dlg != null){
|
||||
dlg.dismiss();
|
||||
|
|
|
@ -12,6 +12,7 @@ import net.osmand.plus.RegionAddressRepository;
|
|||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.MapActivityActions;
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
@ -236,7 +237,8 @@ public class SearchAddressActivity extends Activity {
|
|||
finish();
|
||||
} else {
|
||||
if (navigateTo) {
|
||||
MapActivityActions.navigateToPoint(SearchAddressActivity.this, searchPoint.getLatitude(), searchPoint.getLongitude(), historyName);
|
||||
OsmandApplication app = (OsmandApplication) getApplication();
|
||||
app.getTargetPointsHelper().navigatePointDialogAndLaunchMap(SearchAddressActivity.this, searchPoint.getLatitude(), searchPoint.getLongitude(), historyName);
|
||||
} else {
|
||||
osmandSettings.setMapLocationToShow(searchPoint.getLatitude(), searchPoint.getLongitude(), zoom, historyName);
|
||||
MapActivity.launchMapActivityMoveToTop(SearchAddressActivity.this);
|
||||
|
|
|
@ -22,6 +22,7 @@ import net.osmand.plus.activities.TransportRouteHelper;
|
|||
import net.osmand.plus.activities.search.SearchActivity.SearchActivityChild;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.app.Application;
|
||||
import android.app.ListActivity;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
|
@ -142,8 +143,8 @@ public class SearchTransportActivity extends ListActivity implements SearchActiv
|
|||
if (startPoint == null) {
|
||||
startPoint = settings.getLastKnownMapLocation();
|
||||
}
|
||||
|
||||
LatLon pointToNavigate = settings.getPointToNavigate();
|
||||
OsmandApplication app = (OsmandApplication) getApplication();
|
||||
LatLon pointToNavigate = app.getTargetPointsHelper().getPointToNavigate();
|
||||
if(!Algoritms.objectEquals(pointToNavigate, this.destinationLocation) ||
|
||||
!Algoritms.objectEquals(startPoint, this.lastKnownMapLocation)){
|
||||
destinationLocation = pointToNavigate;
|
||||
|
|
|
@ -63,7 +63,7 @@ public class OsmandDevelopmentPlugin extends OsmandPlugin {
|
|||
@Override
|
||||
public void prepareOptionsMenu(Menu menu, MenuItem animateMenu) {
|
||||
animateMenu.setTitle(routeAnimation.isRouteAnimating() ? R.string.animate_route_off : R.string.animate_route);
|
||||
animateMenu.setVisible(settings.getPointToNavigate() != null);
|
||||
animateMenu.setVisible(app.getTargetPointsHelper().getPointToNavigate() != null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -174,8 +174,9 @@ public class DistanceCalculatorPlugin extends OsmandPlugin {
|
|||
measurementPoints.add(l);
|
||||
view.refreshMap();
|
||||
updateText();
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -184,8 +185,9 @@ public class DistanceCalculatorPlugin extends OsmandPlugin {
|
|||
measurementPoints.remove(measurementPoints.size() - 1);
|
||||
view.refreshMap();
|
||||
updateText();
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -15,6 +15,7 @@ import net.osmand.plus.OsmandApplication;
|
|||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.OsmandSettings.MetricsConstants;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.ApplicationMode;
|
||||
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
||||
import net.osmand.plus.routing.RouteProvider.GPXRouteParams;
|
||||
|
@ -362,9 +363,10 @@ public class RoutingHelper {
|
|||
showMessage(app.getString(R.string.arrived_at_intermediate_point));
|
||||
voiceRouter.arrivedIntermediatePoint();
|
||||
route.passIntermediatePoint();
|
||||
int toDel = settings.getIntermediatePoints().size() - route.getIntermediatePointsToPass();
|
||||
TargetPointsHelper targets = app.getTargetPointsHelper();
|
||||
int toDel = targets.getIntermediatePoints().size() - route.getIntermediatePointsToPass();
|
||||
while(toDel > 0) {
|
||||
settings.deleteIntermediatePoint(0);
|
||||
targets.removeWayPoint(null, false, 0);
|
||||
toDel--;
|
||||
}
|
||||
while(intermediatePoints != null && route.getIntermediatePointsToPass() < intermediatePoints.size()) {
|
||||
|
@ -378,6 +380,8 @@ public class RoutingHelper {
|
|||
showMessage(app.getString(R.string.arrived_at_destination));
|
||||
voiceRouter.arrivedDestinationPoint();
|
||||
clearCurrentRoute(null, null);
|
||||
TargetPointsHelper targets = app.getTargetPointsHelper();
|
||||
targets.clearPointToNavigate(null, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
package net.osmand.plus.views;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.osmand.osm.LatLon;
|
||||
import net.osmand.plus.ContextMenuAdapter;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.plus.views.ContextMenuLayer.IContextMenuProvider;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
|
@ -31,8 +30,6 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
private Paint point;
|
||||
private Paint bitmapPaint;
|
||||
|
||||
protected LatLon pointToNavigate = null;
|
||||
protected List<LatLon> intermediatePoints = new ArrayList<LatLon>();
|
||||
private OsmandMapTileView view;
|
||||
private float[] calculations = new float[2];
|
||||
|
||||
|
@ -43,8 +40,6 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
|
||||
private Paint textPaint;
|
||||
|
||||
private RoutingHelper routingHelper;
|
||||
|
||||
private final MapActivity map;
|
||||
|
||||
public PointNavigationLayer(MapActivity map) {
|
||||
|
@ -88,7 +83,6 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
dm = new DisplayMetrics();
|
||||
WindowManager wmgr = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
|
||||
wmgr.getDefaultDisplay().getMetrics(dm);
|
||||
routingHelper = view.getApplication().getRoutingHelper();
|
||||
initUI();
|
||||
}
|
||||
|
||||
|
@ -98,14 +92,8 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
public void onDraw(Canvas canvas, RectF latLonBounds, RectF tilesRect, DrawSettings nightMode) {
|
||||
int index = 0;
|
||||
|
||||
if(routingHelper != null && routingHelper.isFollowingMode() && routingHelper.isRouteCalculated()) {
|
||||
List<LatLon> ip = routingHelper.getIntermediatePoints();
|
||||
int sz = ip == null ? 0 : ip.size();
|
||||
while(sz > intermediatePoints.size()) {
|
||||
intermediatePoints.remove(0);
|
||||
}
|
||||
}
|
||||
for (LatLon ip : intermediatePoints) {
|
||||
TargetPointsHelper targetPoints = map.getTargetPoints();
|
||||
for (LatLon ip : targetPoints.getIntermediatePoints()) {
|
||||
index ++;
|
||||
if (isLocationVisible(ip)) {
|
||||
int marginX = intermediatePoint.getWidth() / 3;
|
||||
|
@ -118,6 +106,7 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
canvas.rotate(view.getRotate(), locationX, locationY);
|
||||
}
|
||||
}
|
||||
LatLon pointToNavigate = targetPoints.getPointToNavigate();
|
||||
if (isLocationVisible(pointToNavigate)) {
|
||||
int marginX = targetPoint.getWidth() / 3;
|
||||
int marginY = 2 * targetPoint.getHeight() / 3;
|
||||
|
@ -145,22 +134,6 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
}
|
||||
|
||||
|
||||
public LatLon getPointToNavigate() {
|
||||
return pointToNavigate;
|
||||
}
|
||||
|
||||
public void setPointToNavigate(LatLon pointToNavigate, List<LatLon> intermediatePoints) {
|
||||
this.pointToNavigate = pointToNavigate;
|
||||
this.intermediatePoints.clear();
|
||||
this.intermediatePoints.addAll(intermediatePoints);
|
||||
view.refreshMap();
|
||||
}
|
||||
|
||||
public List<LatLon> getIntermediatePoints() {
|
||||
return intermediatePoints;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void destroyLayer() {
|
||||
|
||||
|
@ -184,15 +157,11 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
|
||||
@Override
|
||||
public void collectObjectsFromPoint(PointF point, List<Object> o) {
|
||||
for(int i=0; i<=intermediatePoints.size(); i++) {
|
||||
LatLon latLon;
|
||||
boolean target = i == intermediatePoints.size();
|
||||
if(target){
|
||||
latLon = pointToNavigate;
|
||||
} else {
|
||||
latLon = intermediatePoints.get(i);
|
||||
}
|
||||
if(latLon != null) {
|
||||
List<LatLon> intermediatePoints = map.getTargetPoints().getIntermediatePointsWithTarget();
|
||||
for (int i = 0; i < intermediatePoints.size(); i++) {
|
||||
LatLon latLon = intermediatePoints.get(i);
|
||||
boolean target = i == intermediatePoints.size() - 1;
|
||||
if (latLon != null) {
|
||||
int ex = (int) point.x;
|
||||
int ey = (int) point.y;
|
||||
int x = view.getRotatedMapXForPoint(latLon.getLatitude(), latLon.getLongitude());
|
||||
|
@ -202,7 +171,7 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
TargetPoint tp = new TargetPoint();
|
||||
tp.location = latLon;
|
||||
tp.intermediate = !target;
|
||||
if(target) {
|
||||
if (target) {
|
||||
tp.name = view.getContext().getString(R.string.target_point, "");
|
||||
} else {
|
||||
tp.name = (i + 1) + ". " + view.getContext().getString(R.string.intermediate_point, "");
|
||||
|
@ -262,10 +231,11 @@ public class PointNavigationLayer extends OsmandMapLayer implements IContextMenu
|
|||
@Override
|
||||
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
|
||||
if (itemId == R.string.delete_target_point) {
|
||||
TargetPointsHelper targetPointsHelper = map.getMyApplication().getTargetPointsHelper();
|
||||
if(a.intermediate) {
|
||||
map.removeIntermediatePoint(true, a.index);
|
||||
targetPointsHelper.removeWayPoint(map, true, a.index);
|
||||
} else {
|
||||
map.navigateToPoint(null, true, -1);
|
||||
targetPointsHelper.removeWayPoint(map, true, -1);
|
||||
}
|
||||
}
|
||||
map.getMapLayers().getContextMenuLayer().setLocation(null, "");
|
||||
|
|
|
@ -10,6 +10,7 @@ import net.osmand.plus.OsmandApplication;
|
|||
import net.osmand.plus.OsmandSettings;
|
||||
import net.osmand.plus.OsmandSettings.OsmandPreference;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.TargetPointsHelper;
|
||||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.routing.AlarmInfo;
|
||||
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
|
||||
|
@ -464,12 +465,13 @@ public class RouteInfoControls {
|
|||
|
||||
protected TextInfoControl createIntermediateDistanceControl(final MapActivity map, Paint paintText, Paint paintSubText) {
|
||||
final OsmandMapTileView view = map.getMapView();
|
||||
final TargetPointsHelper targets = map.getTargetPoints();
|
||||
DistanceToPointInfoControl distanceControl = new DistanceToPointInfoControl(map, 0, paintText, paintSubText, map.getResources()
|
||||
.getDrawable(R.drawable.info_intermediate), view) {
|
||||
|
||||
@Override
|
||||
protected void click(OsmandMapTileView view) {
|
||||
if(map.getIntermediatePoints().size() > 1) {
|
||||
if(targets.getIntermediatePoints().size() > 1) {
|
||||
map.getMapActions().openIntermediatePointsDialog();
|
||||
} else {
|
||||
super.click(view);
|
||||
|
@ -478,7 +480,7 @@ public class RouteInfoControls {
|
|||
|
||||
@Override
|
||||
public LatLon getPointToNavigate() {
|
||||
return map.getFirstIntermediatePoint();
|
||||
return targets.getFirstIntermediatePoint();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue