diff --git a/OsmAnd-java/src/net/osmand/router/TurnType.java b/OsmAnd-java/src/net/osmand/router/TurnType.java index c788605e87..ac4476080a 100644 --- a/OsmAnd-java/src/net/osmand/router/TurnType.java +++ b/OsmAnd-java/src/net/osmand/router/TurnType.java @@ -247,4 +247,8 @@ public class TurnType { public static boolean isRightTurn(int type) { return type == TR || type == TSHR || type == TSLR || type == TU; } + + public static boolean isSlightTurn(int type) { + return type == TSLR || type == TSLL || type == KL || type == KR || type == C; + } } diff --git a/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java b/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java index 9f1c6d6b50..f991f80929 100644 --- a/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java +++ b/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java @@ -1,6 +1,8 @@ package net.osmand.util; import java.net.URI; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -82,15 +84,15 @@ public class GeoPointParserUtil { // google calendar // geo:0,0?q=760 West Genesee Street Syracuse NY 13204 - String qstr = "q=760 West Genesee Street Syracuse NY 13204"; - url = "geo:0,0?" + qstr; + String qstr = "760 West Genesee Street Syracuse NY 13204"; + url = "geo:0,0?q=" + qstr; System.out.println("url: " + url); actual = GeoPointParserUtil.parse("geo", url); - assertGeoPoint(actual, new GeoParsedPoint(qstr.replaceAll("\\s+", "+"))); + assertGeoPoint(actual, new GeoParsedPoint(qstr)); // geo:0,0?z=11&q=1600+Amphitheatre+Parkway,+CA - qstr = "q=1600+Amphitheatre+Parkway,+CA"; - url = "geo:0,0?z=11&" + qstr; + qstr = "1600 Amphitheatre Parkway, CA"; + url = "geo:0,0?z=11&q=" + URLEncoder.encode(qstr); System.out.println("url: " + url); actual = GeoPointParserUtil.parse("geo", url); assertGeoPoint(actual, new GeoParsedPoint(qstr)); @@ -330,7 +332,7 @@ public class GeoPointParserUtil { /** * Parses geo and map intents: - * + * * @param scheme * The intent scheme * @param data @@ -450,48 +452,79 @@ public class GeoPointParserUtil { return null; } if ("geo".equals(scheme) || "osmand.geo".equals(scheme)) { - final String schemeSpecific = data.getSchemeSpecificPart(); + String schemeSpecific = data.getSchemeSpecificPart(); if (schemeSpecific == null) { return null; } - if (schemeSpecific.startsWith("0,0?")) { - // geo:0,0?q=34.99,-106.61(Treasure Island) - // geo:0,0?z=11&q=34.99,-106.61(Treasure Island) - String query = schemeSpecific.substring("0,0?".length()); - final String pattern = "(?:z=(\\d{1,2}))?&?q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?)[\\+]?(?:\\((.+?)\\))?"; - final Matcher matcher = Pattern.compile(pattern).matcher(query); - if (matcher.matches()) { - final String z = matcher.group(1); - final String name = matcher.group(4); - final int zoom = z != null ? Integer.parseInt(z) : GeoParsedPoint.NO_ZOOM; - final double lat = Double.parseDouble(matcher.group(2)); - final double lon = Double.parseDouble(matcher.group(3)); - return new GeoParsedPoint(lat, lon, zoom, name); - } else { - // geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA - if (query.contains("z=")) - query = query.substring(query.indexOf("&") + 1); - return new GeoParsedPoint(query); - } - } else { - // geo:47.6,-122.3 - // geo:47.6,-122.3?z=11 (Treasure Island) - final String pattern = "([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?)(?:(?:\\?z=(\\d{1,2}))?|(?:\\?q=.*?)?)[\\+]?(?:\\((.*?)\\))?"; - final Matcher matcher = Pattern.compile(pattern).matcher(schemeSpecific); - if (matcher.matches()) { - final double lat = Double.valueOf(matcher.group(1)); - final double lon = Double.valueOf(matcher.group(2)); - final String name = matcher.group(4); - int zoom = matcher.group(3) != null ? Integer.parseInt(matcher.group(3)) : GeoParsedPoint.NO_ZOOM; - if (zoom != GeoParsedPoint.NO_ZOOM) { - return new GeoParsedPoint(lat, lon, zoom, name); - } else { - return new GeoParsedPoint(lat, lon, name); - } - } else { - return null; + + String name = null; + final Pattern namePattern = Pattern.compile("[\\+\\s]*\\((.*)\\)[\\+\\s]*$"); + final Matcher nameMatcher = namePattern.matcher(schemeSpecific); + if (nameMatcher.find()) { + name = URLDecoder.decode(nameMatcher.group(1)); + if (name != null) { + schemeSpecific = schemeSpecific.substring(0, nameMatcher.start()); } } + + String positionPart; + String queryPart = ""; + int queryStartIndex = schemeSpecific.indexOf('?'); + if (queryStartIndex == -1) { + positionPart = schemeSpecific; + } else { + positionPart = schemeSpecific.substring(0, queryStartIndex); + if (queryStartIndex < schemeSpecific.length()) + queryPart = schemeSpecific.substring(queryStartIndex + 1); + } + + final Pattern positionPattern = Pattern.compile( + "([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?)"); + final Matcher positionMatcher = positionPattern.matcher(positionPart); + if (!positionMatcher.find()) { + return null; + } + double lat = Double.valueOf(positionMatcher.group(1)); + double lon = Double.valueOf(positionMatcher.group(2)); + + int zoom = GeoParsedPoint.NO_ZOOM; + String searchRequest = null; + for (String param : queryPart.split("&")) { + String paramName; + String paramValue = null; + int nameValueDelimititerIndex = param.indexOf('='); + if (nameValueDelimititerIndex == -1) { + paramName = param; + } else { + paramName = param.substring(0, nameValueDelimititerIndex); + if (nameValueDelimititerIndex < param.length()) + paramValue = param.substring(nameValueDelimititerIndex + 1); + } + + if ("z".equals(paramName) && paramValue != null) { + zoom = Integer.parseInt(paramValue); + } else if ("q".equals(paramName) && paramValue != null) { + searchRequest = URLDecoder.decode(paramValue); + } + } + + if (searchRequest != null) { + final Matcher positionInSearchRequestMatcher = + positionPattern.matcher(searchRequest); + if (lat == 0.0 && lon == 0.0 && positionInSearchRequestMatcher.find()) { + lat = Double.valueOf(positionInSearchRequestMatcher.group(1)); + lon = Double.valueOf(positionInSearchRequestMatcher.group(2)); + } + } + + if (lat == 0.0 && lon == 0.0 && searchRequest != null) { + return new GeoParsedPoint(searchRequest); + } + + if (zoom != GeoParsedPoint.NO_ZOOM) { + return new GeoParsedPoint(lat, lon, zoom, name); + } + return new GeoParsedPoint(lat, lon, name); } return null; } diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index 6041398f06..573771e744 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -165,11 +165,16 @@ - + + + + + + diff --git a/OsmAnd/build.xml b/OsmAnd/build.xml index 7667fda885..6e3b9015a1 100644 --- a/OsmAnd/build.xml +++ b/OsmAnd/build.xml @@ -38,14 +38,14 @@ - + - + - + diff --git a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java index 65f4a51cd9..08b3333bd5 100644 --- a/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/FavouritesDbHelper.java @@ -16,6 +16,7 @@ import java.util.regex.Pattern; import android.app.AlertDialog; import android.content.ActivityNotFoundException; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; @@ -151,9 +152,6 @@ public class FavouritesDbHelper { } FavoriteGroup group = getOrCreateGroup(p, 0); - //making sure that dublicated names will not occur in favorites - checkDublicates(p); - if (!p.getName().equals("")) { p.setVisible(group.visible); p.setColor(group.color); @@ -167,45 +165,45 @@ public class FavouritesDbHelper { return true; } - private void checkDublicates(FavouritePoint p){ - boolean fl = true; + public static AlertDialog.Builder checkDublicates(FavouritePoint p, FavouritesDbHelper fdb, Context uiContext) { boolean emoticons = false; String index = ""; int number = 0; String name = checkEmoticons(p.getName()); String category = checkEmoticons(p.getCategory()); p.setCategory(category); - if (name.length() != p.getName().length()){ + if (name.length() != p.getName().length()) { emoticons = true; } - while (fl){ + boolean fl = true; + while (fl) { fl = false; - for (FavouritePoint fp : cachedFavoritePoints){ - if (fp.getName().equals(name)){ + for (FavouritePoint fp : fdb.getFavouritePoints()) { + if (fp.getName().equals(name)) { number++; index = " (" + number + ")"; name = p.getName() + index; - fl=true; + fl = true; break; } } } - if ((index.length() > 0 || emoticons)&& - context.getMapActivity() != null){ - AlertDialog.Builder builder = new AlertDialog.Builder(context.getMapActivity()); + if ((index.length() > 0 || emoticons) ) { + AlertDialog.Builder builder = new AlertDialog.Builder(uiContext); builder.setTitle(R.string.fav_point_dublicate); - if (emoticons){ - builder.setMessage(context.getString(R.string.fav_point_emoticons_message, name)); + if (emoticons) { + builder.setMessage(uiContext.getString(R.string.fav_point_emoticons_message, name)); } else { - builder.setMessage(context.getString(R.string.fav_point_dublicate_message, name)); + builder.setMessage(uiContext.getString(R.string.fav_point_dublicate_message, name)); } builder.setPositiveButton(R.string.default_buttons_ok, null); p.setName(name); - builder.show(); + return builder; } + return null; } - public String checkEmoticons(String name){ + public static String checkEmoticons(String name){ char[] chars = name.toCharArray(); int index; char ch1; @@ -317,7 +315,7 @@ public class FavouritesDbHelper { return false; } - private File getExternalFile() { + public File getExternalFile() { return new File(context.getAppPath(null), FILE_TO_SAVE); } diff --git a/OsmAnd/src/net/osmand/plus/GPXUtilities.java b/OsmAnd/src/net/osmand/plus/GPXUtilities.java index 565a763192..8be820695d 100644 --- a/OsmAnd/src/net/osmand/plus/GPXUtilities.java +++ b/OsmAnd/src/net/osmand/plus/GPXUtilities.java @@ -87,6 +87,7 @@ public class GPXUtilities { public double lat; public double lon; public String name = null; + // previous undocumented feature 'category' ,now 'type' public String category = null; public String desc = null; // by default @@ -754,7 +755,7 @@ public class GPXUtilities { } writeNotNullText(serializer, "name", p.name); writeNotNullText(serializer, "desc", p.desc); - writeNotNullText(serializer, "category", p.category); + writeNotNullText(serializer, "type", p.category); if (!Double.isNaN(p.hdop)) { writeNotNullText(serializer, "hdop", p.hdop + ""); } @@ -917,6 +918,10 @@ public class GPXUtilities { ((WptPt) parse).desc = readText(parser, "desc"); } else if (tag.equals("category")) { ((WptPt) parse).category = readText(parser, "category"); + } else if (tag.equals("type")) { + if(((WptPt) parse).category == null) { + ((WptPt) parse).category = readText(parser, "type"); + } } else if (parser.getName().equals("ele")) { String text = readText(parser, "ele"); if (text != null) { diff --git a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java index fcfef74bf8..85e03644fe 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndAppCustomization.java @@ -152,5 +152,14 @@ public class OsmAndAppCustomization { public boolean showNavigationControls() { return true;} - public boolean onlyTourDownload() { return false;} + public boolean onlyTourDownload() { + return false; + } + + public void resumeActivity(Class class1, T d) { + } + + public void pauseActivity(Class class1) { + } + } diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index a7e63613f8..daf8f61512 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -117,9 +117,6 @@ public class OsmandApplication extends Application { SQLiteAPI sqliteAPI; BRouterServiceConnection bRouterServiceConnection; - - MapActivity mapActivity; - DownloadActivity downloadActivity; @Override public void onCreate() { @@ -911,19 +908,5 @@ public class OsmandApplication extends Application { } } - public MapActivity getMapActivity() { - return mapActivity; - } - public void setMapActivity(MapActivity mapActivity) { - this.mapActivity = mapActivity; - } - - public void setDownloadActivity(DownloadActivity downloadActivity) { - this.downloadActivity = downloadActivity; - } - - public DownloadActivity getDownloadActivity() { - return downloadActivity; - } } diff --git a/OsmAnd/src/net/osmand/plus/activities/FavouritesTreeFragment.java b/OsmAnd/src/net/osmand/plus/activities/FavouritesTreeFragment.java index 43d0c921f7..7a7c266ec0 100644 --- a/OsmAnd/src/net/osmand/plus/activities/FavouritesTreeFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/FavouritesTreeFragment.java @@ -38,6 +38,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.graphics.Typeface; +import android.net.Uri; import android.os.AsyncTask; import android.support.v4.app.FragmentActivity; import android.text.Spannable; @@ -524,9 +525,11 @@ public class FavouritesTreeFragment extends OsmandExpandableListFragment { hideProgressBar(); final Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, GPXUtilities.asString(gpxFile, getMyApplication())); + sendIntent.putExtra(Intent.EXTRA_TEXT, "Favourites.gpx:\n\n\n"+GPXUtilities.asString(gpxFile, getMyApplication())); sendIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_fav_subject)); - sendIntent.setType("application/gpx+xml"); + sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(helper.getExternalFile())); +// sendIntent.setType("application/gpx+xml"); + sendIntent.setType("text/plain"); startActivity(sendIntent); } }; diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index c6fddc7a4f..dd5217e913 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -346,7 +346,6 @@ public class MapActivity extends AccessibleActivity implements } settings.MAP_ACTIVITY_ENABLED.set(true); - app.setMapActivity(this); checkExternalStorage(); showAndHideMapPosition(); @@ -420,6 +419,7 @@ public class MapActivity extends AccessibleActivity implements if(glSurfaceView != null) { glSurfaceView.onResume(); } + getMyApplication().getAppCustomization().resumeActivity(MapActivity.class, this); } @@ -623,7 +623,7 @@ public class MapActivity extends AccessibleActivity implements settings.setLastKnownMapZoom(mapView.getZoom()); settings.MAP_ACTIVITY_ENABLED.set(false); - app.setMapActivity(null); + getMyApplication().getAppCustomization().pauseActivity(MapActivity.class); app.getResourceManager().interruptRendering(); app.getResourceManager().setBusyIndicator(null); OsmandPlugin.onMapActivityPause(this); diff --git a/OsmAnd/src/net/osmand/plus/dialogs/FavoriteDialogs.java b/OsmAnd/src/net/osmand/plus/dialogs/FavoriteDialogs.java index e80bf16205..f125106510 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/FavoriteDialogs.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/FavoriteDialogs.java @@ -12,17 +12,17 @@ import net.osmand.AndroidUtils; import net.osmand.access.AccessibleToast; import net.osmand.data.FavouritePoint; import net.osmand.plus.FavouritesDbHelper; +import net.osmand.plus.FavouritesDbHelper.FavoriteGroup; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.FavouritesDbHelper.FavoriteGroup; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.FavoriteImageDrawable; import net.osmand.util.MapUtils; import android.app.Activity; import android.app.AlertDialog; -import android.app.Dialog; import android.app.AlertDialog.Builder; +import android.app.Dialog; import android.content.DialogInterface; import android.content.res.Resources; import android.os.Build; @@ -202,13 +202,27 @@ public class FavoriteDialogs { builder.setPositiveButton(R.string.default_buttons_add, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - FavouritePoint point = (FavouritePoint) args.getSerializable(KEY_FAVORITE); + final FavouritePoint point = (FavouritePoint) args.getSerializable(KEY_FAVORITE); OsmandApplication app = (OsmandApplication) activity.getApplication(); String categoryStr = cat.getText().toString().trim(); final FavouritesDbHelper helper = app.getFavorites(); app.getSettings().LAST_FAV_CATEGORY_ENTERED.set(categoryStr); point.setName(editText.getText().toString().trim()); point.setCategory(categoryStr); + Builder bld = FavouritesDbHelper.checkDublicates(point, helper, activity); + if(bld != null) { + bld.setPositiveButton(R.string.default_buttons_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + addFavorite(activity, point, helper); + } + }); + } else { + addFavorite(activity, point, helper); + } + } + + protected void addFavorite(final Activity activity, FavouritePoint point, final FavouritesDbHelper helper) { boolean added = helper.addFavourite(point); if (added) { AccessibleToast.makeText(activity, MessageFormat.format( diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java index 7c2cfda727..960638557a 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java @@ -217,8 +217,7 @@ public class DownloadActivity extends SherlockFragmentActivity { @Override protected void onResume() { super.onResume(); - getMyApplication().setDownloadActivity(this); - BasicProgressAsyncTask t = downloadListIndexThread.getCurrentRunningTask(); + getMyApplication().getAppCustomization().resumeActivity(DownloadActivity.class, this); } @@ -289,7 +288,7 @@ public class DownloadActivity extends SherlockFragmentActivity { @Override public void onPause() { super.onPause(); - (getMyApplication()).setDownloadActivity(null); + getMyApplication().getAppCustomization().pauseActivity(DownloadActivity.class); } protected void downloadFilesCheckFreeVersion() { diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxImportHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxImportHelper.java index 91d08cd075..07f9efdaf7 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxImportHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxImportHelper.java @@ -65,7 +65,8 @@ public class GpxImportHelper { if (fileName != null && fileName.endsWith(KML_SUFFIX)) { handleKmlImport(intentUri, fileName, saveFile); - } else if (fileName != null && fileName.endsWith("favourites.gpx")) { + } else if (fileName != null && (fileName.contains("favourite")|| + fileName.contains("favorite"))) { handleFavouritesImport(intentUri, fileName, saveFile); } else { handleGpxImport(intentUri, fileName, saveFile); diff --git a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java index af124a48be..722d6aa01e 100644 --- a/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java +++ b/OsmAnd/src/net/osmand/plus/sherpafy/SherpafyCustomization.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -84,6 +85,7 @@ public class SherpafyCustomization extends OsmAndAppCustomization { public static final String TOUR_SERVER = "download.osmand.net"; private static final String SAVE_GPX_FOLDER = "save_gpx_folder"; private Object originalGlobal; + private Map, Object> activities = new HashMap, Object>(); @Override public void setup(OsmandApplication app) { @@ -230,7 +232,7 @@ public class SherpafyCustomization extends OsmAndAppCustomization { } this.tourPresent = tourPresent; if(!suggestToDownloadMap.isEmpty()) { - final DownloadActivity da = app.getDownloadActivity(); + final DownloadActivity da = (DownloadActivity) activities.get(DownloadActivity.class); if (da != null) { app.runInUIThread(new Runnable() { @@ -687,7 +689,7 @@ public class SherpafyCustomization extends OsmAndAppCustomization { } public boolean onDestinationReached() { - final MapActivity map = app.getMapActivity(); + final MapActivity map = (MapActivity) activities.get(MapActivity.class); if(map != null && getSelectedStage() != null) { app.runInUIThread(new Runnable() { @@ -700,6 +702,17 @@ public class SherpafyCustomization extends OsmAndAppCustomization { return true; } + @Override + public void pauseActivity(Class class1) { + super.pauseActivity(class1); + } + + @Override + @SuppressWarnings("unchecked") + public void resumeActivity(Class class1, T d) { + activities.put((Class) class1, d); + } + public void runStage(Activity a, TourInformation tour, StageInformation stage, boolean startOver) { WptPt point = null; GPXFile gpx = null;