From 6d0fbb2c936dce2216b192acb8e8a76a51aa1f9e Mon Sep 17 00:00:00 2001 From: GaidamakUA Date: Tue, 4 Aug 2015 12:35:26 +0300 Subject: [PATCH 1/3] Fix for NullPointerException. When you just want to open search after you opened application. --- .../plus/activities/FavoritesListFragment.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/activities/FavoritesListFragment.java b/OsmAnd/src/net/osmand/plus/activities/FavoritesListFragment.java index 450211f447..93518e91a0 100644 --- a/OsmAnd/src/net/osmand/plus/activities/FavoritesListFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/FavoritesListFragment.java @@ -51,6 +51,13 @@ public class FavoritesListFragment extends OsmAndListFragment implements SearchA public void onAttach(Activity activity) { super.onAttach(activity); Intent intent = activity.getIntent(); + settings = getApplication().getSettings(); + OsmandApplication app = getApplication(); + favouritesAdapter = new FavouritesAdapter(activity, app.getFavorites().getFavouritePoints(), + !selectFavoriteMode); + setListAdapter(favouritesAdapter); + setHasOptionsMenu(true); + if (intent != null) { selectFavoriteMode = intent.hasExtra(SELECT_FAVORITE_POINT_INTENT_KEY); if (intent.hasExtra(SearchActivity.SEARCH_LAT) && intent.hasExtra(SearchActivity.SEARCH_LON)) { @@ -61,12 +68,6 @@ public class FavoritesListFragment extends OsmAndListFragment implements SearchA } } } - settings = ((OsmandApplication) getApplication()).getSettings(); - OsmandApplication app = (OsmandApplication) getApplication(); - favouritesAdapter = new FavouritesAdapter(activity, app.getFavorites().getFavouritePoints(), - !selectFavoriteMode); - setListAdapter(favouritesAdapter); - setHasOptionsMenu(true); } private OsmandApplication getApplication() { From 1cb5afcb9ad3694ed407504af4ee61322f62ac6f Mon Sep 17 00:00:00 2001 From: GaidamakUA Date: Tue, 4 Aug 2015 15:47:29 +0300 Subject: [PATCH 2/3] GeoPointParserUtil indentation fix --- .../net/osmand/util/GeoPointParserUtil.java | 446 +++++++++--------- 1 file changed, 224 insertions(+), 222 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java b/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java index d81d1194e2..4ed8540dda 100644 --- a/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java +++ b/OsmAnd-java/src/net/osmand/util/GeoPointParserUtil.java @@ -22,12 +22,12 @@ public class GeoPointParserUtil { String url; String noQueryParameters[] = { - "geo:0,0", - "geo:0,0?", - "http://download.osmand.net/go", - "http://download.osmand.net/go?", + "geo:0,0", + "geo:0,0?", + "http://download.osmand.net/go", + "http://download.osmand.net/go?", }; - for (String s: noQueryParameters) { + for (String s : noQueryParameters) { URI uri = URI.create(s); Map map = getQueryParameters(uri); System.out.print(s + " map: " + map.size() + "..."); @@ -39,14 +39,15 @@ public class GeoPointParserUtil { } String oneQueryParameter[] = { - "geo:0,0?m", - "geo:0,0?m=", - "geo:0,0?m=foo", - "http://download.osmand.net/go?lat", - "http://download.osmand.net/go?lat=", - "http://download.osmand.net/go?lat=34.99393", + "geo:0,0?m", + "geo:0,0?m=", + "geo:0,0?m=foo", + "geo:0,0?q=%D0%9D%D0", + "http://download.osmand.net/go?lat", + "http://download.osmand.net/go?lat=", + "http://download.osmand.net/go?lat=34.99393", }; - for (String s: oneQueryParameter) { + for (String s : oneQueryParameter) { URI uri = URI.create(s); Map map = getQueryParameters(uri); System.out.print(s + " map: " + map.size() + "..."); @@ -58,13 +59,13 @@ public class GeoPointParserUtil { } String twoQueryParameters[] = { - "geo:0,0?z=11&q=Lots+Of+Stuff", - "http://osmand.net/go?lat=34.99393&lon=-110.12345", - "http://www.osmand.net/go.html?lat=34.99393&lon=-110.12345", - "http://download.osmand.net/go?lat=34.99393&lon=-110.12345", - "http://download.osmand.net/go?lat=34.99393&lon=-110.12345#this+should+be+ignored", + "geo:0,0?z=11&q=Lots+Of+Stuff", + "http://osmand.net/go?lat=34.99393&lon=-110.12345", + "http://www.osmand.net/go.html?lat=34.99393&lon=-110.12345", + "http://download.osmand.net/go?lat=34.99393&lon=-110.12345", + "http://download.osmand.net/go?lat=34.99393&lon=-110.12345#this+should+be+ignored", }; - for (String s: twoQueryParameters) { + for (String s : twoQueryParameters) { URI uri = URI.create(s); Map map = getQueryParameters(uri); System.out.print(s + " map: " + map.size() + "..."); @@ -88,7 +89,7 @@ public class GeoPointParserUtil { actual = GeoPointParserUtil.parse(url); assertUrlEquals(url, actual.getGeoUriString()); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon)); - + // geo:34.99393,-106.61568?z=11 z = 11; url = "geo:" + dlat + "," + dlon + "?z=" + z; @@ -211,7 +212,7 @@ public class GeoPointParserUtil { System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(ilat, ilon, z)); - + // http://maps.google.com/maps?q=N34.939,E-106 url = "http://maps.google.com/maps?q=N" + dlat + ",E" + Math.abs(dlon); System.out.println("url: " + url); @@ -223,7 +224,7 @@ public class GeoPointParserUtil { System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); - + // http://osmand.net/go?lat=34&lon=-106&z=11 url = "http://osmand.net/go?lat=" + ilat + "&lon=" + ilon + "&z=" + z; System.out.println("url: " + url); @@ -256,7 +257,7 @@ public class GeoPointParserUtil { actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); - // https://www.openstreetmap.org/#map=11/49.563/17.291 + // https://www.openstreetmap.org/#map=11/49.563/17.291 url = "https://www.openstreetmap.org/#map=" + z + "/" + dlat + "/" + dlon; System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); @@ -264,7 +265,7 @@ public class GeoPointParserUtil { // https://www.openstreetmap.org/?mlat=34.993933029174805&mlon=-106.61568069458008#map=11/34.99393/-106.61568 url = "https://www.openstreetmap.org/?mlat=" + longLat + "&mlon=" + longLon - + "#map=" + z + "/" + dlat + "/" + dlon; + + "#map=" + z + "/" + dlat + "/" + dlon; System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); @@ -465,9 +466,9 @@ public class GeoPointParserUtil { assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); // http://maps.google.com/maps?lci=com.google.latitudepublicupdates&ll=34.99393%2C-106.61568&q=34.99393%2C-106.61568 - z = GeoParsedPoint.NO_ZOOM; + z = GeoParsedPoint.NO_ZOOM; url = "http://maps.google.com/maps?lci=com.google.latitudepublicupdates&ll=" + dlat - +"%2C" + dlon + "&q=" + dlat + "%2C" + dlon + "((" + dlat + "%2C%20" + dlon + "))"; + + "%2C" + dlon + "&q=" + dlat + "%2C" + dlon + "((" + dlat + "%2C%20" + dlon + "))"; System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); @@ -523,14 +524,14 @@ public class GeoPointParserUtil { // http://map.baidu.com/?l=13&tn=B_NORMAL_MAP&c=13748138,4889173&s=gibberish z = 7; - int latint = ((int)(dlat * 100000)); - int lonint = ((int)(dlon * 100000)); + int latint = ((int) (dlat * 100000)); + int lonint = ((int) (dlon * 100000)); url = "http://map.baidu.com/?l=" + z + "&tn=B_NORMAL_MAP&c=" + latint + "," + lonint + "&s=gibberish"; System.out.println("url: " + url); actual = GeoPointParserUtil.parse(url); assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); - // http://www.amap.com/#!poi!!q=38.174596,114.995033|2|%E5%AE%BE%E9%A6%86&radius=1000 + // http://www.amap.com/#!poi!!q=38.174596,114.995033|2|%E5%AE%BE%E9%A6%86&radius=1000 z = 13; // amap uses radius, so 1000m is roughly zoom level 13 url = "http://www.amap.com/#!poi!!q=" + dlat + "," + dlon + "|2|%E5%AE%BE%E9%A6%86&radius=1000"; System.out.println("\nurl: " + url); @@ -587,44 +588,44 @@ public class GeoPointParserUtil { assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z)); /* URLs straight from various services, instead of generated here */ - - String urls[] = { - "https://openstreetmap.org/go/0LQ127-?m", - "http://osm.org/go/0LQ127-?m", - "http://osm.org/go/0EEQjE==", - "http://osm.org/go/0EEQjEEb", - "http://osm.org/go/0EE~jEEb", - "http://osm.org/go/0EE@jEEb", - "http://osm.org/go/~~~~", - "http://osm.org/go/@@@@", - "https://www.openstreetmap.org/#map=0/0/0", - "https://www.openstreetmap.org/#map=0/180/180", - "https://www.openstreetmap.org/#map=0/-180/-180", - "https://www.openstreetmap.org/#map=0/180.0/180.0", - "https://www.openstreetmap.org/#map=6/33.907/34.662", - "https://www.openstreetmap.org/?mlat=49.56275939941406&mlon=17.291107177734375#map=8/49.563/17.291", - "https://www.google.at/maps/place/Bargou,+Tunesien/@36.0922506,9.5676327,15z/data=!3m1!4b1!4m2!3m1!1s0x12fc5d0b4dc5e66f:0xbd3618c6193d14cd", - "http://www.amap.com/#!poi!!q=38.174596,114.995033,%E6%B2%B3%E5%8C%97%E7%9C%81%E7%9F%B3%E5%AE%B6%E5%BA%84%E5%B8%82%E6%97%A0%E6%9E%81%E5%8E%BF", - "http://wb.amap.com/?p=B013706PJN,38.179456,114.98577,%E6%96%B0%E4%B8%9C%E6%96%B9%E5%A4%A7%E9%85%92%E5%BA%97(%E4%BF%9D%E9%99%A9%E8%8A%B1...,%E5%BB%BA%E8%AE%BE%E8%B7%AF67%E5%8F%B7", - "http://www.amap.com/#!poi!!q=38.179456,114.98577|3|B013706PJN", - "http://www.amap.com/#!poi!!q=38.174596,114.995033|2|%E5%AE%BE%E9%A6%86&radius=1000", - "http://www.amap.com/?p=B013704EJT,38.17914,114.976337,%E6%97%A0%E6%9E%81%E5%8E%BF%E4%BA%BA%E6%B0%91%E6%94%BF%E5%BA%9C,%E5%BB%BA%E8%AE%BE%E4%B8%9C%E8%B7%AF12%E5%8F%B7", - "http://share.here.com/l/52.5134272,13.3778416,Hannah-Arendt-Stra%C3%9Fe?z=16.0&t=normal", - "https://www.here.com/location?map=52.5134272,13.3778416,16,normal&msg=Hannah-Arendt-Stra%C3%9Fe", - "https://www.here.com/?map=48.23145,16.38454,15,normal", - "http://map.wap.qq.com/loc/detail.jsp?sid=AU8f3ck87L6XDmytunBm4iWg&g_ut=2&city=%E5%8C%97%E4%BA%AC&key=NOBU%20Beijing&x=116.48177&y=39.91082&md=10461366113386140862", - "http://map.wap.qq.com/loc/d.jsp?c=113.275020,39.188380&m=113.275020,39.188380&n=%E9%BC%93%E6%A5%BC&a=%E5%B1%B1%E8%A5%BF%E7%9C%81%E5%BF%BB%E5%B7%9E%E5%B8%82%E7%B9%81%E5%B3%99%E5%8E%BF+&p=+&i=16959367104973338386&z=0", - "http://map.wap.qq.com/loc/d.jsp?c=113.275020,39.188380&m=113.275020,39.188380&n=%E9%BC%93%E6%A5%BC&a=%E5%B1%B1%E8%A5%BF%E7%9C%81%E5%BF%BB%E5%B7%9E%E5%B8%82%E7%B9%81%E5%B3%99%E5%8E%BF+&p=+&i=16959367104973338386&z=0&m", - "http://map.qq.com/AppBox/print/?t=&c=%7B%22base%22%3A%7B%22l%22%3A11%2C%22lat%22%3A39.90403%2C%22lng%22%3A116.407526%7D%7D", - "http://maps.yandex.com/?text=Australia%2C%20Victoria%2C%20Christmas%20Hills&sll=145.319026%2C-37.650344&ll=145.319026%2C-37.650344&spn=0.352249%2C0.151501&z=12&l=map", - "http://maps.apple.com/?q=Bargou,+Tunisien", - "http://maps.apple.com/?daddr=Bargou,+Tunisien", - "http://maps.apple.com/?lsp=7618&q=40.738065,-73.988898&sll=40.738065,-73.988898", - "http://maps.apple.com/?lsp=9902&auid=13787349062281695774&sll=40.694576,-73.982992&q=Garden%20Nail%20%26%20Spa&hnear=325%20Gold%20St%2C%20Brooklyn%2C%20NY%20%2011201-3054%2C%20United%20States", - "https://www.google.com/maps/place/Wild+Herb+Market/@33.32787,-105.66291,14z/data=!4m5!1m2!2m1!1sfood!3m1!1s0x86e1ce2079e1f94b:0x1d7460465dcaf3ed", - "http://www.google.com/maps/search/food/@34,-106,14z", - "http://www.google.com/maps/search/food/@34.99393,-106.61568,14z", - }; + + String urls[] = { + "https://openstreetmap.org/go/0LQ127-?m", + "http://osm.org/go/0LQ127-?m", + "http://osm.org/go/0EEQjE==", + "http://osm.org/go/0EEQjEEb", + "http://osm.org/go/0EE~jEEb", + "http://osm.org/go/0EE@jEEb", + "http://osm.org/go/~~~~", + "http://osm.org/go/@@@@", + "https://www.openstreetmap.org/#map=0/0/0", + "https://www.openstreetmap.org/#map=0/180/180", + "https://www.openstreetmap.org/#map=0/-180/-180", + "https://www.openstreetmap.org/#map=0/180.0/180.0", + "https://www.openstreetmap.org/#map=6/33.907/34.662", + "https://www.openstreetmap.org/?mlat=49.56275939941406&mlon=17.291107177734375#map=8/49.563/17.291", + "https://www.google.at/maps/place/Bargou,+Tunesien/@36.0922506,9.5676327,15z/data=!3m1!4b1!4m2!3m1!1s0x12fc5d0b4dc5e66f:0xbd3618c6193d14cd", + "http://www.amap.com/#!poi!!q=38.174596,114.995033,%E6%B2%B3%E5%8C%97%E7%9C%81%E7%9F%B3%E5%AE%B6%E5%BA%84%E5%B8%82%E6%97%A0%E6%9E%81%E5%8E%BF", + "http://wb.amap.com/?p=B013706PJN,38.179456,114.98577,%E6%96%B0%E4%B8%9C%E6%96%B9%E5%A4%A7%E9%85%92%E5%BA%97(%E4%BF%9D%E9%99%A9%E8%8A%B1...,%E5%BB%BA%E8%AE%BE%E8%B7%AF67%E5%8F%B7", + "http://www.amap.com/#!poi!!q=38.179456,114.98577|3|B013706PJN", + "http://www.amap.com/#!poi!!q=38.174596,114.995033|2|%E5%AE%BE%E9%A6%86&radius=1000", + "http://www.amap.com/?p=B013704EJT,38.17914,114.976337,%E6%97%A0%E6%9E%81%E5%8E%BF%E4%BA%BA%E6%B0%91%E6%94%BF%E5%BA%9C,%E5%BB%BA%E8%AE%BE%E4%B8%9C%E8%B7%AF12%E5%8F%B7", + "http://share.here.com/l/52.5134272,13.3778416,Hannah-Arendt-Stra%C3%9Fe?z=16.0&t=normal", + "https://www.here.com/location?map=52.5134272,13.3778416,16,normal&msg=Hannah-Arendt-Stra%C3%9Fe", + "https://www.here.com/?map=48.23145,16.38454,15,normal", + "http://map.wap.qq.com/loc/detail.jsp?sid=AU8f3ck87L6XDmytunBm4iWg&g_ut=2&city=%E5%8C%97%E4%BA%AC&key=NOBU%20Beijing&x=116.48177&y=39.91082&md=10461366113386140862", + "http://map.wap.qq.com/loc/d.jsp?c=113.275020,39.188380&m=113.275020,39.188380&n=%E9%BC%93%E6%A5%BC&a=%E5%B1%B1%E8%A5%BF%E7%9C%81%E5%BF%BB%E5%B7%9E%E5%B8%82%E7%B9%81%E5%B3%99%E5%8E%BF+&p=+&i=16959367104973338386&z=0", + "http://map.wap.qq.com/loc/d.jsp?c=113.275020,39.188380&m=113.275020,39.188380&n=%E9%BC%93%E6%A5%BC&a=%E5%B1%B1%E8%A5%BF%E7%9C%81%E5%BF%BB%E5%B7%9E%E5%B8%82%E7%B9%81%E5%B3%99%E5%8E%BF+&p=+&i=16959367104973338386&z=0&m", + "http://map.qq.com/AppBox/print/?t=&c=%7B%22base%22%3A%7B%22l%22%3A11%2C%22lat%22%3A39.90403%2C%22lng%22%3A116.407526%7D%7D", + "http://maps.yandex.com/?text=Australia%2C%20Victoria%2C%20Christmas%20Hills&sll=145.319026%2C-37.650344&ll=145.319026%2C-37.650344&spn=0.352249%2C0.151501&z=12&l=map", + "http://maps.apple.com/?q=Bargou,+Tunisien", + "http://maps.apple.com/?daddr=Bargou,+Tunisien", + "http://maps.apple.com/?lsp=7618&q=40.738065,-73.988898&sll=40.738065,-73.988898", + "http://maps.apple.com/?lsp=9902&auid=13787349062281695774&sll=40.694576,-73.982992&q=Garden%20Nail%20%26%20Spa&hnear=325%20Gold%20St%2C%20Brooklyn%2C%20NY%20%2011201-3054%2C%20United%20States", + "https://www.google.com/maps/place/Wild+Herb+Market/@33.32787,-105.66291,14z/data=!4m5!1m2!2m1!1sfood!3m1!1s0x86e1ce2079e1f94b:0x1d7460465dcaf3ed", + "http://www.google.com/maps/search/food/@34,-106,14z", + "http://www.google.com/maps/search/food/@34.99393,-106.61568,14z", + }; for (String u : urls) { System.out.println("url: " + u); @@ -636,14 +637,14 @@ public class GeoPointParserUtil { // these URLs are not parsable, but should not crash or cause problems String[] unparsableUrls = { - "http://maps.yandex.ru/-/CVCw6M9g", - "http://maps.yandex.com/-/CVCXEKYW", - "http://goo.gl/maps/Cji0V", - "http://amap.com/0F0i02", - "http://j.map.baidu.com/oXrVz", - "http://l.map.qq.com/9741483212?m", - "http://map.qq.com/?l=261496722", - "http://her.is/vLCEXE", + "http://maps.yandex.ru/-/CVCw6M9g", + "http://maps.yandex.com/-/CVCXEKYW", + "http://goo.gl/maps/Cji0V", + "http://amap.com/0F0i02", + "http://j.map.baidu.com/oXrVz", + "http://l.map.qq.com/9741483212?m", + "http://map.qq.com/?l=261496722", + "http://her.is/vLCEXE", }; for (String u : unparsableUrls) { @@ -653,8 +654,8 @@ public class GeoPointParserUtil { throw new RuntimeException(u + " not parsable, but parse did not return null!"); System.out.println("Handled URL"); } - - + + } private static boolean areCloseEnough(double a, double b, long howClose) { @@ -667,7 +668,7 @@ public class GeoPointParserUtil { if (expected.getQuery() != null) { if (!expected.getQuery().equals(actual.getQuery())) throw new RuntimeException("Query param not equal:\n'" + - actual.getQuery() + "' != '" + expected.getQuery()); + actual.getQuery() + "' != '" + expected.getQuery()); } else { double aLat = actual.getLatitude(), eLat = expected.getLatitude(), aLon = actual.getLongitude(), eLon = expected.getLongitude(); int aZoom = actual.getZoom(), eZoom = expected.getZoom(); @@ -705,10 +706,10 @@ public class GeoPointParserUtil { + aLabel + ", expected=" + eLabel); } } - if (((int)eLat) != ((int)aLat)) { + if (((int) eLat) != ((int) aLat)) { throw new RuntimeException("Latitude is not equal; actual=" + aLat + ", expected=" + eLat); } - if (((int)eLon) != ((int)aLon)) { + if (((int) eLon) != ((int) aLon)) { throw new RuntimeException("Longitude is not equal; actual=" + aLon + ", expected=" + eLon); } if (eZoom != aZoom) { @@ -718,10 +719,10 @@ public class GeoPointParserUtil { System.out.println("Passed!"); } - private static void assertUrlEquals(String actual, String expected) { - if (actual == null || !actual.equals(expected)) - throw new RuntimeException("URLs not equal; actual=" + actual + ", expected=" + expected); - } + private static void assertUrlEquals(String actual, String expected) { + if (actual == null || !actual.equals(expected)) + throw new RuntimeException("URLs not equal; actual=" + actual + ", expected=" + expected); + } private static String getQueryParameter(final String param, URI uri) { final String query = uri.getQuery(); @@ -738,43 +739,43 @@ public class GeoPointParserUtil { return value; } - /** - * This parses out all of the parameters in the query string for both - * http: and geo: URIs. This will only work on URIs with valid syntax, so - * it will not work on URIs that do odd things like have a query string in - * the fragment, like this one: - * http://www.amap.com/#!poi!!q=38.174596,114.995033|2|%E5%AE%BE%E9%A6%86&radius=1000 - * + /** + * This parses out all of the parameters in the query string for both + * http: and geo: URIs. This will only work on URIs with valid syntax, so + * it will not work on URIs that do odd things like have a query string in + * the fragment, like this one: + * http://www.amap.com/#!poi!!q=38.174596,114.995033|2|%E5%AE%BE%E9%A6%86&radius=1000 + * * @param uri * @return {@link Map} a Map of the query parameters - */ + */ private static Map getQueryParameters(URI uri) { - String query = null; - if (uri.isOpaque()) { - String schemeSpecificPart = uri.getSchemeSpecificPart(); - int pos = schemeSpecificPart.indexOf("?"); - if (pos == schemeSpecificPart.length()) { - query = ""; - } else if (pos > -1) { - query = schemeSpecificPart.substring(pos + 1); - } - } else { - query = uri.getRawQuery(); - } - return getQueryParameters(query); - } + String query = null; + if (uri.isOpaque()) { + String schemeSpecificPart = uri.getSchemeSpecificPart(); + int pos = schemeSpecificPart.indexOf("?"); + if (pos == schemeSpecificPart.length()) { + query = ""; + } else if (pos > -1) { + query = schemeSpecificPart.substring(pos + 1); + } + } else { + query = uri.getRawQuery(); + } + return getQueryParameters(query); + } private static Map getQueryParameters(String query) { - final LinkedHashMap map = new LinkedHashMap(); - if (query != null && !query.equals("")) { - String[] params = query.split("&"); - for (String p : params) { - String[] keyValue = p.split("="); - if (keyValue.length == 1) - map.put(keyValue[0], ""); - else if (keyValue.length > 1) - map.put(keyValue[0], URLDecoder.decode(keyValue[1])); - } + final LinkedHashMap map = new LinkedHashMap(); + if (query != null && !query.equals("")) { + String[] params = query.split("&"); + for (String p : params) { + String[] keyValue = p.split("="); + if (keyValue.length == 1) + map.put(keyValue[0], ""); + else if (keyValue.length > 1) + map.put(keyValue[0], URLDecoder.decode(keyValue[1])); + } } return map; } @@ -786,67 +787,68 @@ public class GeoPointParserUtil { * @return {@link GeoParsedPoint} */ public static GeoParsedPoint parse(final String uriString) { - URI uri; - try { - // amap.com uses | in their URLs, which is an illegal character for a URL - uri = URI.create(uriString.replaceAll("\\s+", "+") - .replaceAll("%20", "+") - .replaceAll("%2C", ",") - .replaceAll("\\|", ";") - .replaceAll("\\(\\(\\S+\\)\\)", "")); - } catch (IllegalArgumentException e) { - return null; - } + System.out.println("parse(" + "uriString=" + uriString + ")"); + URI uri; + try { + // amap.com uses | in their URLs, which is an illegal character for a URL + uri = URI.create(uriString.replaceAll("\\s+", "+") + .replaceAll("%20", "+") + .replaceAll("%2C", ",") + .replaceAll("\\|", ";") + .replaceAll("\\(\\(\\S+\\)\\)", "")); + } catch (IllegalArgumentException e) { + return null; + } - String scheme = uri.getScheme(); - if (scheme == null) - return null; - else - scheme = scheme.toLowerCase(Locale.US); + String scheme = uri.getScheme(); + if (scheme == null) + return null; + else + scheme = scheme.toLowerCase(Locale.US); if ("http".equals(scheme) || "https".equals(scheme)) { - String host = uri.getHost(); - if (host == null) - return null; - else - host = host.toLowerCase(Locale.US); - String path = uri.getPath(); + String host = uri.getHost(); + if (host == null) + return null; + else + host = host.toLowerCase(Locale.US); + String path = uri.getPath(); if (path == null) { path = ""; } - String fragment = uri.getFragment(); + String fragment = uri.getFragment(); - // lat-double, lon - double, zoom or z - int - Set simpleDomains = new HashSet(); - simpleDomains.add("osmand.net"); - simpleDomains.add("www.osmand.net"); - simpleDomains.add("download.osmand.net"); - simpleDomains.add("openstreetmap.de"); - simpleDomains.add("www.openstreetmap.de"); + // lat-double, lon - double, zoom or z - int + Set simpleDomains = new HashSet(); + simpleDomains.add("osmand.net"); + simpleDomains.add("www.osmand.net"); + simpleDomains.add("download.osmand.net"); + simpleDomains.add("openstreetmap.de"); + simpleDomains.add("www.openstreetmap.de"); final Pattern commaSeparatedPairPattern = Pattern.compile("(?:loc:)?([N|S]?[+-]?\\d+(?:\\.\\d+)?),([E|W]?[+-]?\\d+(?:\\.\\d+)?)"); - try { - if (host.equals("osm.org") || host.endsWith("openstreetmap.org")) { - Pattern p; - Matcher matcher; - if (path.startsWith("/go/")) { // short URL form - p = Pattern.compile("^/go/([A-Za-z0-9_@~]+-*)(?:.*)"); - matcher = p.matcher(path); - if (matcher.matches()) { - return MapUtils.decodeShortLinkString(matcher.group(1)); - } + try { + if (host.equals("osm.org") || host.endsWith("openstreetmap.org")) { + Pattern p; + Matcher matcher; + if (path.startsWith("/go/")) { // short URL form + p = Pattern.compile("^/go/([A-Za-z0-9_@~]+-*)(?:.*)"); + matcher = p.matcher(path); + if (matcher.matches()) { + return MapUtils.decodeShortLinkString(matcher.group(1)); + } } else { // data in the query and/or feature strings double lat = 0; double lon = 0; int zoom = GeoParsedPoint.NO_ZOOM; if (fragment != null) { - if(fragment.startsWith("map=")) { + if (fragment.startsWith("map=")) { fragment = fragment.substring("map=".length()); } String[] vls = fragment.split("/"); - if(vls.length >= 3) { + if (vls.length >= 3) { zoom = parseZoom(vls[0]); lat = parseSilentDouble(vls[1]); lon = parseSilentDouble(vls[2]); @@ -854,30 +856,30 @@ public class GeoPointParserUtil { } // the query string sometimes has higher resolution values String mlat = getQueryParameter("mlat", uri); - if(mlat != null) { + if (mlat != null) { lat = parseSilentDouble(mlat); } String mlon = getQueryParameter("mlon", uri); - if(mlon != null) { + if (mlon != null) { lon = parseSilentDouble(mlon); } return new GeoParsedPoint(lat, lon, zoom); } - } else if (host.startsWith("map.baidu.")) { // .com and .cn both work - /* Baidu Map uses a custom format for lat/lon., it is basically standard lat/lon + } else if (host.startsWith("map.baidu.")) { // .com and .cn both work + /* Baidu Map uses a custom format for lat/lon., it is basically standard lat/lon * multiplied by 100,000, then rounded to an integer */ Map params = getQueryParameters(uri); - String zm = params.get("l"); - String[] vls = silentSplit(params.get("c"),","); - if ( vls != null && vls.length >= 2) { - double lat = parseSilentInt(vls[0]) / 100000.; - double lon = parseSilentInt(vls[1]) / 100000.; - int zoom = parseZoom(zm); - return new GeoParsedPoint(lat, lon, zoom); - } + String zm = params.get("l"); + String[] vls = silentSplit(params.get("c"), ","); + if (vls != null && vls.length >= 2) { + double lat = parseSilentInt(vls[0]) / 100000.; + double lon = parseSilentInt(vls[1]) / 100000.; + int zoom = parseZoom(zm); + return new GeoParsedPoint(lat, lon, zoom); + } } else if (simpleDomains.contains(host)) { Map params = getQueryParameters(uri); - if(uri.getQuery() == null && params.size() == 0) { + if (uri.getQuery() == null && params.size() == 0) { // DOUBLE check this may be wrong test of openstreetmap.de (looks very weird url and server doesn't respond) params = getQueryParameters(path.substring(1)); } @@ -907,13 +909,13 @@ public class GeoPointParserUtil { String lonString = null; String z = String.valueOf(GeoParsedPoint.NO_ZOOM); Map params = getQueryParameters(uri); - if(params.containsKey("q")){ + if (params.containsKey("q")) { Matcher matcher = commaSeparatedPairPattern.matcher(params.get("q")); if (matcher.matches()) { latString = matcher.group(1); lonString = matcher.group(2); } - } else if(params.containsKey("ll")){ + } else if (params.containsKey("ll")) { Matcher matcher = commaSeparatedPairPattern.matcher(params.get("ll")); if (matcher.matches()) { latString = matcher.group(1); @@ -926,11 +928,11 @@ public class GeoPointParserUtil { } return new GeoParsedPoint(latString, lonString, z); } - if(params.containsKey("daddr")){ + if (params.containsKey("daddr")) { return parseGoogleMapsPath(params.get("daddr"), params); - } else if(params.containsKey("saddr")){ + } else if (params.containsKey("saddr")) { return parseGoogleMapsPath(params.get("saddr"), params); - } else if(params.containsKey("q")){ + } else if (params.containsKey("q")) { return parseGoogleMapsPath(params.get("q"), params); } if (fragment != null) { @@ -940,9 +942,9 @@ public class GeoPointParserUtil { return new GeoParsedPoint(m.group(1)); } } - - String[] pathPrefixes = new String[] { "/@", "/ll=", - "loc:", "/" }; + + String[] pathPrefixes = new String[]{"/@", "/ll=", + "loc:", "/"}; for (String pref : pathPrefixes) { if (path.contains(pref)) { path = path.substring(path.lastIndexOf(pref) @@ -959,9 +961,9 @@ public class GeoPointParserUtil { Matcher matcher; final String[] patterns = { /* though this looks like Query String, it is also used as part of the Fragment */ - ".*q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*&radius=(\\d+).*", - ".*q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*", - ".*p=(?:[A-Z0-9]+),([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*", }; + ".*q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*&radius=(\\d+).*", + ".*q=([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*", + ".*p=(?:[A-Z0-9]+),([+-]?\\d+(?:\\.\\d+)?),([+-]?\\d+(?:\\.\\d+)?).*",}; for (int i = 0; i < patterns.length; i++) { p = Pattern.compile(patterns[i]); matcher = p.matcher(subString); @@ -969,7 +971,7 @@ public class GeoPointParserUtil { if (matcher.groupCount() == 3) { // amap uses radius in meters, so do rough conversion into zoom level float radius = Float.valueOf(matcher.group(3)); - long zoom = Math.round(23. - Math.log(radius)/Math.log(2.0)); + long zoom = Math.round(23. - Math.log(radius) / Math.log(2.0)); return new GeoParsedPoint(matcher.group(1), matcher.group(2), String.valueOf(zoom)); } else if (matcher.groupCount() == 2) { return new GeoParsedPoint(matcher.group(1), matcher.group(2)); @@ -1096,9 +1098,9 @@ public class GeoPointParserUtil { } } - } catch (RuntimeException e) { - e.printStackTrace(); - } + } catch (RuntimeException e) { + e.printStackTrace(); + } return null; } else if ("geo".equals(scheme) || "osmand.geo".equals(scheme)) { String schemeSpecific = uri.getSchemeSpecificPart(); @@ -1182,14 +1184,14 @@ public class GeoPointParserUtil { String zmPart = ""; String descr = ""; String path = opath; - if(path.contains("&")){ + if (path.contains("&")) { String[] vls = path.split("&"); path = vls[0]; - for(int i = 1; i < vls.length; i++) { + for (int i = 1; i < vls.length; i++) { int ik = vls[i].indexOf('='); - if(ik > 0) { - params.put(vls[i].substring(0, ik), vls[i].substring(ik + 1)); - } + if (ik > 0) { + params.put(vls[i].substring(0, ik), vls[i].substring(ik + 1)); + } } } if (path.contains("+")) { @@ -1200,36 +1202,36 @@ public class GeoPointParserUtil { } } - if(params.containsKey("z")) { + if (params.containsKey("z")) { zmPart = params.get("z"); } String[] vls = silentSplit(path, ","); - - if(vls.length >= 2) { + + if (vls.length >= 2) { double lat = parseSilentDouble(vls[0]); - double lon = parseSilentDouble(vls[1]) ; - int zoom = GeoParsedPoint.NO_ZOOM; - if(vls.length >= 3 || zmPart.length() > 0) { - if(zmPart.length() == 0){ - zmPart = vls[2]; - } - if(zmPart.startsWith("z=")) { - zmPart = zmPart.substring(2); - } else if(zmPart.contains("z")) { - zmPart = zmPart.substring(0, zmPart.indexOf('z')); - } - zoom = parseZoom(zmPart); - } - return new GeoParsedPoint(lat, lon, zoom); + double lon = parseSilentDouble(vls[1]); + int zoom = GeoParsedPoint.NO_ZOOM; + if (vls.length >= 3 || zmPart.length() > 0) { + if (zmPart.length() == 0) { + zmPart = vls[2]; + } + if (zmPart.startsWith("z=")) { + zmPart = zmPart.substring(2); + } else if (zmPart.contains("z")) { + zmPart = zmPart.substring(0, zmPart.indexOf('z')); + } + zoom = parseZoom(zmPart); + } + return new GeoParsedPoint(lat, lon, zoom); } return new GeoParsedPoint(URLDecoder.decode(opath)); } - private static String[] silentSplit(String vl, String split) { - if(vl == null) { - return null; - } - return vl.split(split); + private static String[] silentSplit(String vl, String split) { + if (vl == null) { + return null; + } + return vl.split(split); } private static int parseZoom(String zoom) { @@ -1241,7 +1243,7 @@ public class GeoPointParserUtil { } return GeoParsedPoint.NO_ZOOM; } - + private static double parseSilentDouble(String zoom) { try { if (zoom != null) { @@ -1251,7 +1253,7 @@ public class GeoPointParserUtil { } return 0; } - + private static int parseSilentInt(String zoom) { try { if (zoom != null) { @@ -1307,20 +1309,20 @@ public class GeoPointParserUtil { } private static double parseLon(String lonString) { - if(lonString.startsWith("E")) { + if (lonString.startsWith("E")) { return -Double.valueOf(lonString.substring(1)); - } else if(lonString.startsWith("W")) { + } else if (lonString.startsWith("W")) { return Double.valueOf(lonString.substring(1)); - } + } return Double.valueOf(lonString); } private static double parseLat(String latString) { - if(latString.startsWith("S")) { + if (latString.startsWith("S")) { return -Double.valueOf(latString.substring(1)); - } else if(latString.startsWith("N")) { + } else if (latString.startsWith("N")) { return Double.valueOf(latString.substring(1)); - } + } return Double.valueOf(latString); } @@ -1363,8 +1365,8 @@ public class GeoPointParserUtil { } private String formatDouble(double d) { - if(d == (long) d) - return String.format(Locale.ENGLISH, "%d", (long)d); + if (d == (long) d) + return String.format(Locale.ENGLISH, "%d", (long) d); else return String.format("%s", d); } From 238c13cb316a143b25fe40603beb470290c185e8 Mon Sep 17 00:00:00 2001 From: GaidamakUA Date: Fri, 21 Aug 2015 18:32:49 +0300 Subject: [PATCH 3/3] Updatte icons --- .../widget_monitoring_rec_inactive_day.png | Bin 2559 -> 2546 bytes .../widget_monitoring_rec_inactive_night.png | Bin 2345 -> 2361 bytes .../widget_monitoring_rec_inactive_day.png | Bin 1855 -> 1891 bytes .../widget_monitoring_rec_inactive_night.png | Bin 1780 -> 1847 bytes .../widget_monitoring_rec_inactive_day.png | Bin 3262 -> 3267 bytes .../widget_monitoring_rec_inactive_night.png | Bin 3041 -> 3044 bytes .../widget_monitoring_rec_inactive_day.png | Bin 4444 -> 4375 bytes .../widget_monitoring_rec_inactive_night.png | Bin 4173 -> 4067 bytes 8 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 OsmAnd/res/drawable-hdpi/widget_monitoring_rec_inactive_day.png mode change 100644 => 100755 OsmAnd/res/drawable-hdpi/widget_monitoring_rec_inactive_night.png mode change 100644 => 100755 OsmAnd/res/drawable-mdpi/widget_monitoring_rec_inactive_day.png mode change 100644 => 100755 OsmAnd/res/drawable-mdpi/widget_monitoring_rec_inactive_night.png mode change 100644 => 100755 OsmAnd/res/drawable-xhdpi/widget_monitoring_rec_inactive_day.png mode change 100644 => 100755 OsmAnd/res/drawable-xhdpi/widget_monitoring_rec_inactive_night.png mode change 100644 => 100755 OsmAnd/res/drawable-xxhdpi/widget_monitoring_rec_inactive_day.png mode change 100644 => 100755 OsmAnd/res/drawable-xxhdpi/widget_monitoring_rec_inactive_night.png diff --git a/OsmAnd/res/drawable-hdpi/widget_monitoring_rec_inactive_day.png b/OsmAnd/res/drawable-hdpi/widget_monitoring_rec_inactive_day.png old mode 100644 new mode 100755 index 1fcda1060b31b655049cdaf67ac5058584a1c753..c39f19c6953fe8c5955a7ab140a50905b5d14007 GIT binary patch delta 1872 zcma)%X*d*$0)|Bfm$Hl`*~W4((_r=)q8ekLN%mc4%wlP#Fi2v`dhLvG#(KM@NR~+1 zNvSLu>KqJ4wnSMHqFXpU&%HnIeV+UMe4qEn_Z|Sh0_)X9{joGSk{*CSL9rA{0F+Ka z!k{=hj0{Cl$S5Qng+szHI4#Yq%qt|43E^@;1e3;M+Y-#Qei1`z5Y+^OLST@1D-;ri zL&IQ}C@caL(oG#EJ)#nCGt82~`ZVzb#Ivf?J9w-Zaqz@-)cB0(^;gLo*59 z_@WZ#z4fXf=t(cJk@WP;%fuB~=N)orHV?9;dc81W@euhAqr)r!8sr4!D z_a>AOkVg{VHe0T9vFd3TUit92z7$-Nc7k0hT$nOPM*6V z@1_waeLM18@=T{kv)+F3rPw3MuTtb8Oenx2>-K`-><9S}Wz2%kEXVfp(Vl$1!L&iK zCn-+*`tG9Lvk%Hj6ec#Iv0FsRxTW@Rtv%?YTrlWJ6c)x;{Z4nV^JlYxwP6E8vBbQG z>9~bZ0ORJNQ~qHV8DFm7<9%745&Ws!@<(}-^?N0?X6lJz@5lN?L3g)Eb#-+>X=&*k z7K16Q@#`p}QK=aMPD*39aT5~mUmJ6f7rcMB8P87klq9d^Har|#^+`RyoL-ll`^c;2 z(!u`T!HNVCQ$JC`t`GDu4Vqr)J&>GPybJ1%?*!-YqLOhHJ`Q^w=$*Oi)c}Q~Avq}deGNDo0#{!$0nxdANMb>+$r>%p%ZRk$c)-|7saZGl9deVT~ zqn}Ckzk>o)%u3?uceaNAj4Sg!y?3(BZdFH0up72cW{q*$OP=9}sgEPctF~%orp}bSb2noXG!UI>jS4!>*78_AB94-Jb2LG61R7)-GZOPQQXKO zec<1)`{tn)?0;;*7}%HeJVkbgC2VzNJe^d_-a^=*>+ZZLw7s}gS6l0*sHoVj)rhNN z3nmZ4cd)$A^hQBL^d|jwQG| bE*=7i2&pfyR?VUikzcd5JWr^_`^WzUA?;PS delta 1885 zcma))XHXLe0)HmfVhZ!7<4~pQ8#Ngma1fBsW zpbnV42wrG71BdgXd!h81`d$bPNI2V(=|g1v50bytM9&yvs29fYA(ENl^f3PrwtsNY zUly-e`XuLLEqq%_O74Uu+0;2|Y|%A<666TuGbKQ5Ezcb|kM`i|d7Lfs&KSS%U-?P`ve$%D} zH#L8)^+5RR85;#)i;PN}t%WLhmG5Bl4>Istzy{c9Pctw+bX?WYmo~pCpldjY6^Vu;k)~#W(4k**~{DK}D z6);k_o+gQzp#3s#l~!_LcL8>JRXp$KwQ-5l&f2>6 zPv~gW^UcL{<7IhdLbbGzf9ItQk~rjR`IlJ|?;w9E3lwW>4=XrnI zEs=evcV|yD#WzRh#yp(VA678Elp?F2RH{5N0%=kQlPZ;n{Rv7Vakk5_;$6qr1oD$x zx$<|SdewI#I4-)X;*4tX^Et>s@7wb0$Ii(M_=hg?PZ@wDV&87~z!$Kqd$mbnM(ZiL zkWpeo(*sQBg{Y92oy{BF;-b48l~`j&mXd%U`zp|CbY|L^4k8u)_MrCFLPXHHa!CTM zObA#p`HNlRg}J@HTVH#NFFUB4gAWW@?r@+Z?; z6(KKcU+aucVr#X~s4z6hvGc5z(bC#=b*}1?GN~+H zL7DSdl#=#s*i;l(QX`Cee=8hZY=C=0ZiQNl1iVu|c)0@<|6ohO_`9>Vau1!cr&Kb{vf>N~JwUVyeHqNo@8k+O2)z+rs;4%bHkR zX+cSZMrKss3;DQ`?;7c;5}qcy00CMM^N}jVgV!wmSls548@dT$@iH-YSC^wM>U{o5 zl{qIfwVbC^{;hLx-YxN9eY28f#>}PzHTY-T!e>A@LWO7+9qD?L`rDBPPoAiEs+CLj z&x~^qc;@;UVE*Jv@KSQnZL8?2-OC1|{r5hn;cf*39~r+s%}XGaR?Pk&7heYGL&%4h zN^{1e>rVz}!L=+;G#aJuTDc>wWZj&c2I4C#E42qF1}Eqqf=E$-&(n_c8CR_zwYWYD z(uBD`yQ${ecRv;VVv%jQ&c4Ej&Gqq%oR! zPTG&D_l0$%EU;YsA>4vBx2&(>kHYBPubkPr?Bvq&+$VmeS4bAp;bzP*EZE%^#^XS80R+Ps?g}*STNc?aqasS9~c?2_#P(x>)D oAzHfNY0%gG{nGuzr5qVmsq8nKFH?<{{G|?LNwFh8A$i9A2a^bE@Bjb+ diff --git a/OsmAnd/res/drawable-hdpi/widget_monitoring_rec_inactive_night.png b/OsmAnd/res/drawable-hdpi/widget_monitoring_rec_inactive_night.png old mode 100644 new mode 100755 index 5a3045ed6f9e483bc53dd7b8e653ff896d269112..8880e901c59020bb79bdabe0dae6ff287f2b38a0 GIT binary patch delta 1685 zcma)&dpOez1IJNn|*WBWeVcTzZ!7{sOs-2lj$f;~IcabT1FflA5%;oGTUS8tl z(m^_roRcmK!!obP>1|QDHN-kBi_`O*_s{ozp7;Cb=lT5c{eFMe>(=|lT90sr$ za0CQJr!ycdIsk>BS^Q2osaYy2>cM0J&OhblhoEDzrvh}$ghfXX_KE{`l=Yv#OVp+9E)NO8 zmVYj}HON(We90r~#?&|cf&)7c{9CHPuPkaW{3}bPOVi%JZlSKM%>Nrp>T_WJea;A@vciJlGPTH%9*GPKu)jfH|&yQJE(KUCk{0%otic2*|BJ zKhnVVrbP!xqr}rj7op(R?m1}H0O7F+xnLiqQ_?}}ei1>YG$#^B)vwwN^i$VHb9z7s z%jy}UJOMY5>N|jIx(e!A%iqpUXOx2iX7Ln)Nq-)Q$8-SO6ytWMwCpN(TXGdVJgXAB z#N>=&l^MNnBQE|qCc0+5-|{q3eqLfVV>^SHIYtNx(tz0w@Js4%oAaN?I`Z<4lEBZd z$)9btOZJ8u@lGJ>)KC4T|swUB*qWG$a5DD({G_7A*PIu0phX2E( zDs=h|4!UE#O8Fyes`>Thjky|j@GS3Q$|nv_r8PyHo|AUV*b6x8Rz;@6UTtoge+*rc zxJkvUjp9!;eI5JctCbq}uu4nr+(Gf2$75e^B{_I1ZJ(*bAO;a9tEc1+U9ysNML26^ zBsW+YIgEQR6)++lhr~C2m@%8C+0#r=BV6?wv^T4+{L+`s(TB0Wo-}*g>C@?d{N`4K(#n{@!s4VsZPKrjd@3Qm!#KyR^5pp!(EHH%)_imO~&bB4Xd-2eY0ouZL(Qpfwy|qz@K_Mhmo3N*(F1b)cwO274cWRg4?R^a&r4}fII;_dI{AB* zJ;#3&Gg}M}z^^B?8U+P3E_5rW<+DbMPi8-64zmth;FHJi##f*wE^ZV#CD9_IMWg0x z8VzVli;NsB5U0`Q`L_O{hZ-dscsySG`nC4A1;kws{LH%ERV{7Lhs)fY4*yErrjw{p zm*uJGl}khKg6e|y z&=f*jZrwo}@RK=jVQ(5;r^5Ce-rf8~U8m!av8tC-rDUd6)p(% zTbkeRF2vlC{X6=IG!dwYiUMRdHH(ksbsN&K`N;={A4V=v#qL+6u-%O-{WF`_q>s{g z!)%VDfk%1-f|HnC3Y$3Tmlf!kgIH^Q^yT#Jn0vx#EVWP@LKc`r7=C$l$9G}ka?jgT zzezf|uSEaWGK;?;u#WrQe4*o~Ei;y6e+(WE-{T%k8;|^spDsNXvGT(y#YPBFxmD2l z7&J(8EqkkPd4X#8x>+r#^36r7iIJiy8`I)(^V!y35eHjJFdC=i1$&(l(6|n#8%hW| z>ZN0pv}i+O%X&M_gb&rs3(u8kYHXQI$qzZ_C%=-FcxvU?vH5TAXOvS`C&0JI3Xk6j zxaZ?s*5mVn?dzz^i2mG(>y>~DPMRn>-|QS|aV09g&s0^B47a(Hn3z13uOSn^UhQ=@ F>o1)B1N;C0 delta 1669 zcma)%do?d$I+kST;Zf5VV<veTq=j^}to^!u{e$MxM&ga_!tAQ!d22t)p zhy)NI54^z59l(2fKp@`3jmXElf$l^BAm9+(ctk8FJw7QYh)hf5rN#>q#0;7@c8j?1 zWBFu|1`;61gFpuk`4Ne9$O8l+PZH73lkNuqBwt_Y_Xa4;UnP>?|15PH@FkEC@Z=I9 z5}ru#;Nv}kEhmmA2gLJ9Bo2=QxCz`i1S}>+93l{s`Txb_|9av|!FahQ^Mz!ZAcdD4 znggFV7_>uS=`WX95pjrP2ujl{v)^6D(`uSczSweeiNsuN zSk|TDOXeGl&-%M;Af+WdvfI*rTRe`!<8n{pw%M4*JUe)_h^8_;Rq_0|TzTtRLdpBq z+pp@xXAb-e1bqK24cJB5ukWzTzN1-p z!l&i=v9_6Kgjf2*bbnCR<}mPJr1_xU{+%6H%s&$U%xbd+)ecJ4WNscckmfvcA472f z7ox)m4#i6nz@aI4&X8Xgdd+oaI3_wS8u}*l2T`f$hVI2|&%sf2ciQV<%@~qy%wX#- z@r6ucg6Nf_I3FRfIeq#&5Au&b-z`8=vKEtN)PM$`R6683D2<4rYAX(q*3Gq`2%9TL zpRXfYmd;INFxMv82H@pXKJ{MY=m`ZjyAOq?SMptphYuD%UX3CksG_W(O?z# z6!L1gN~ZX9?XyNaWi@(j}0>EH+P=!XnrJi$hoy zPTE{H0ORd=q)2tTjf=TlX`X@{Q}zTj>lFejDNi+UZYN%eBA*uy{mSIqn4eNLecI&s%QJFN;X>b z#Gg-zwbuj!>mRUqD?{!*07F%O68`s!x3=UwtMf ze=PQVy%x!(j-HAm+Lv9v^7@&6%|m*2 zwx-K>yQBM_ih1lkvvUPo8`>rsJE1!u_B=5UXD@Ko614GI`{BauoxV%(vBkaeM4YJ| zVximXQ}Xt!pCc<+`~759H|pM5=wqb)ta!~uQ$BGUufkUxjr+pF|8o=u1tT#Eq1t=8 zJoEIu>*GaTB-^S9QO3wrYo4|(&hEoYGVt76mm`u{Y2*i2RuFT43z&jd2l<~hEeCYp z1gIp+NQUw8;IGt`s`-hLBUGEUT;n*LKfNRUfwJ`WxR&VA{9=3{xQbl_yWdyiY(6Be`Z z=Hf1>FE`|)88;R7_hZ)#0sDmR!@EkX7>XT<$LbD=2J*qx5^>64=RQAHjY~f}tH3b@ zRqV)chC0?)=j{?cwU;i9r?=IQHWgAm>PO#D#nZ=R{Z?zO+1zkzn2wqm$dI@{b;7rw jL$k| diff --git a/OsmAnd/res/drawable-mdpi/widget_monitoring_rec_inactive_day.png b/OsmAnd/res/drawable-mdpi/widget_monitoring_rec_inactive_day.png old mode 100644 new mode 100755 index ddd99345a93b44e22ccf5788c4b562ae9cba1602..e95da2d603d11a7fe2f6322f0da211fea59f69bb GIT binary patch delta 1212 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 AxBvhE diff --git a/OsmAnd/res/drawable-mdpi/widget_monitoring_rec_inactive_night.png b/OsmAnd/res/drawable-mdpi/widget_monitoring_rec_inactive_night.png old mode 100644 new mode 100755 index fb19e8ec4b2f59d47cd05851ea8d1b32df19193e..d8e3e7b77b48058ef2065210a32960b80b220ccf GIT binary patch delta 1167 zcmeyuyPa=?98-cts*y=rvazYIMN(3-Zd#Iwp{`|`VWO^SQlhDek*TGLp}D1!LPc(Y zudkI$esXDUYF>$_i>(q+L@y;X#md~-(ZI#r%+$ox(#+7%)zs0zz|_*x(%9L^$kf%z z(qwWSlZ*mXkqJ&kyO>hyEmAC!4b75_b(2hzOmve|Oj2|$63q>CO%2kL%*{;_jVz5! zloX0ff>P70Qn0v$D4*!tDcI;2rKDN8q!uR^WfqiV=I23#CeLM7uU{JLsL8;<9Pa7j z7*cWTN|?7#aG=0k_smQ|DJ9WM3`qf8h8ij+C5bmA{)BXYY*uj#*E`~0^3*9g$)`s< z{Fwih)?EftmrpoFT=BoNL7+EOAn8C-ke!!~f>*Zv`uVTVB*z73tjvk1m^}Gj`TLp1 z#rMzL3HRh+)V3^2Xmwv_RlhSe+vB#)&u#vP<}=_ADlT|#qzo=~O(qPw!>$sdG=KtXRMwzwW{O?Q zt^G()^S6%XJCE0-Ch&S*of`D(fX9Io>MveMR4#dY&)Fa{YtyucTb^^<*jBMT+O)?0 z>pJ_Us;4__jz>&*68h@mBd0kxwyf9Hl_Ub~!m4ct zj_qY%@cyK-)lt)R%b2b@W=&ej<>Zybz!zP1W3sf$y~~%G4<-mWEu3IfzBA@z?W0M& z_Cc3E8-)hyUAIY4HJPEa^(1ds&BqsS-};{G{jMQNlRaD$u)~MnlMw4|0d7!l1iP)%^c?3EQ>at zn>hXa)F(kLQ!YGvmS!Nq!>a8!&7jB>{Ur*h9?T_}kD;ZOkc+bv0fA@ah%*dK3(fDuXl5;Q2edPM**^AQxp*==% oi*5Cb{(8Uk`2Tl**M24*hDC|Ws~$>l`7!{3r>mdKI;Vst01$)nPyhe` delta 1100 zcmdna_l0+Z98-c>nu)oQfr*7~s;QZguBC;Ev95)wVT!J)v6*42QEH-rX|kb`LPc(Y zudkI$esXDUYF>$_i>(q+L@y;X#mdCe($Lw_+|<>`(aq4%)x^ob!qUmf#K_6m!qmjk z%x!WVlZ*mXkqJ&kyO>hyP11}klMGGFbqx(HQgkhifNn~(Of=R_F*i?4PBb!2HBB^7 zQYbD7N=>s$!Qv94e4=lsV547@l4j+STAW;zSx}Ohp9c||JeOI$UW$e99RmZih^LEV zNX4x)p{Kn=5=HF8)7LGw6ta|@mKM?%*ra>Lcde6l_KG)&9;?l=T2?p3T~Lc+&Gj(~ zf2YExbLqvxFYGST#YXD9pF)kYI?88V-)kKIyk_psJ99F(D7|Wyueopg{7>Ee$8(BB z6Q{>KL29!dVF+B@OGS22;7NfXc3*KnOp zQDJ23%yqr+?qQy9sQ34YR)){zMeU_il;ywVrml;57BFc~SR<1Qr{$%scWy_|op?v2 z^1b-n-`_ZTP9{zidNyfK0HLxvZUY+5Bh1 z)4Us%e^iccG4h`v?83L2;c4ZJ$^X~?&BhTKICwtFse2T$Gr~ zXHJ^;r8npDVdthA&9tQ^OGQFgM#Sms=$*?txVkx9@6ekLey4>3FLvpzZ+0mDW%m1> zE>Db`ylzEr(hiT%Y}NEE(N|wjb$P3@o}2x2-r|65`^C8Gy-qK=eCY~{&mNhUjsK1t z>|Jtq$J5XE-Q;XzS9@H4v%=MSPu%gLwn911f2K5R-C z|IO<&NvD6&|yNqY9_D{nOBzkJvAVzopr0R6Pu`v3p{ diff --git a/OsmAnd/res/drawable-xhdpi/widget_monitoring_rec_inactive_day.png b/OsmAnd/res/drawable-xhdpi/widget_monitoring_rec_inactive_day.png old mode 100644 new mode 100755 index 1dea15d87ec3efbdd5f6745b390ab352effbe14b..d1b700e940f992e59b68b6a03cb8f9ccf360038b GIT binary patch delta 2599 zcma)%c{~#g1IL$5JZa>9gv=3=v9U2%8s;d@|K$;-n#wKcz*h}F~PNp_t_^3<7P_l!Kh1zeTM+hXC8rc{l(YA0y z1k%I^4#yx(P$;CeEevJ@M_bt#8yV(Ogp?rvkqrK)#1JA-Q3MnoZiF+0;t)6l6i+}9 zpeTQ17!(O3;f#$D{stxn2sKC~*_B8#CH$9?|LckV35dCV1c78~LyW{n1cs9X!$SX! za!Y_(RJ$F;VE{mM!odc8E|#<473X}5CEL?GCA~_3}*7=bh-_G>3=q zuZ5xtWmMXwAvJ-7A~J9YQB=5TcXJA^$(c=eu-D3%B5Fz{Wn||cE(q!?S3Q*dM2JW9 zSJ7=0+{uirXJv-v^HNBfhNFdsYg?Y+n zNFu2VbqKhN0U$(iA_@-%SDlNCNJph?>zy@%HNFT`|%w3#{Gmku>q16stMCE%vlJ7h># zLzIha*d6J!g}RzX84WzWuPk2ARR(9+7>spapPaFbXq%BWQzC3D6OKS$$OE{%a(w@rt_I4ySjdG zS8QABym%_0j72VL<5L^Pfa`V63Ef*&l(GWZJU&UM&h!!B4BcpBS(RCPK(*lSQ_E&1Tx`S{lh`Z;=~N~v^L=~h*5_POLh z$6v&R14Eg6?4u7@|aWHXOmGSZwGQiK_S)EGTja^gIUi}HvwsvFP7fjqA&X~&GNKrP6 zPOq!4Kb~{if$HGj+1c6W2h%1!dG*98tI&2C(?qsu}uJiWjUCf4UiTq}$?|AXudiy}l@}GlZ=Us^lKumiqIyuw#L3 z#omW`s!o4B)3R$Odnx`t=BfT%(=yMAZ^jOh%BYky2%-G3NJ|q;@daK^+Z&sCL7fWS zJw5(CJv|eNXHT8V+0^N08v72#j^zfN5LA9tI@UgwPqRjmPamTU&#lB^X9fs%v8zCuP`024n}U{XpM z&^P??bD;I98DLMsZ&xPf5_45!JgEk zB~ACC<(o5Kt?b}1rI~{;27F>9i2EV>*3UQ|SX~|L;u|BfHBJ93Bjxymc0O*`Mmr<#fqZ z(s5b7ITLsAWll>)m&v#v^IN%uz=u6T9RrW=$-j}%_q-ahR;&e&QhWHBhOrpU{&WvX z@p!7QtJ|>|oTUjnlwVM^dyG%6TU8qId6oLt_JT%@_f}!Qk*T_<%+1nq!(D3XCAP@c z&tsIO6N{g38h*GRT1$W3U3M2HNWS`3@2`rBh{ISfuR!1C_=Yr+8lD=6o@eDZ>mD*Y zd)gj%8f)H4G2L^yjlj$G_0EjG3!253)EBesJ@ji*#R5FfPVa1$^$BO*@NrbJWwSfAZJ$4VS{mPxf74t-neHx$@#W=%uSw#y(dqld zv|ci_?(HP#2>+0;tgM_~URvTpp-^?{W_FG*v`r4O-H|5kqM)EqpniGzE@))5)OhuF z%$IYN0!3{}z$meoI>(*jiR7yKUC#RfdKwxUx*O4+3Qh`FQodVTfuU|phGMa|SI1kE z;KReimPu$6Ntn}4ZIvFB!mKH~L8HCPC3VnVoqE1w^tTiFEr&Ul8IYb4v(m+O5wiD|0N&{+Y zx~Upb=h=HCyX};vW0#fU!E`xWPX09TV#aL{{VACP!lkakr<%dXRoo4+jem% zs{Oh|RCF{ajQa*IT7|nN8MBxf?-#($jNg+NdbKCKQt00FOhT||5ZvR) delta 2594 zcma))X*3j$0>us4vhPurC|fjUv2SA;#SDfV^I!TuML|EmemKt>N3i1pAh#Ra(sdie)?`T73a z$}D10AmDh{#F&^k=FLrw(BU%-$4C_VqqyM&`u6aL6UTVGf&MqyyY1&l@QsAS{3)UR7a4 z=H91m743$1s)XHooC+z<_uKd!Id;-R+t*7Yyr?A-0efni>XFo0Io4B}s_idWrEN-1 zt`zmUJ{w-^7o*)a zMF1$nbV(}w!yf08B$o+haq10;RL&aq8ZPRQk0L)$7R1GENN$1V}i0FEs=5A-^m*_F8f zdUENwoel3kSKh6{T&#TT3c!MVDbR;WFBS07@4>A8BK@Ero3q<*{mFg1*}=k*?O|$) zyGz645Ss6uBFXk?&A;+LeH%B#h0QuvXj#aJh5D;3Cnlm7-g13d(Bnq}2*FF(=kxIa z`pgGm^gVHbgZMk`jUys>WL+wU3tN;y=&xx7MoiPkV++pp+o&=Wia7|QhhNeGHa<~Q zD;9ihW83+p6y|%bye^J^+lw5%dF<$!2 z3kMY1y{E=~#J2)A&oxLBwi~Z}6l)@V2?J+G1S6EQPUg=ykjG!s1f&gFE&eukXc1=R zXcAXIRGMEv(CaSfDYcdGIUJWyJ)_6nE@vCZ8=TDjIO&RQljg3JXT6P%w~ICZ=^e~{ zTb1~BxX_{h3eVs%FqFY_XCbUakjjO(MX;6&bDF3KBIT4ztN8;7F{}(CYWuKl3$XUE z4b3E42CBiMVZR%Z=+uL7CjFhv@_r7um&*M@hfnZuI+u`U?7IzhGTcIlHcj~>62wzK4 zbX8x3fTXVPA+eUgrNAi!R4j^q>XgWSu1@)6bUk?WjGJLt>)&%RAu+^#zq6&|jZ3Vq zUnL|gdWGN-7^kTHld5mHdFKQxaXaahK0 z&vdJu$xnGnXtR^+6Ga1x)nOFicP&*KHd}1WhsOPa`FZb zPTS{+rRh$NsuOBkbXwU_L)fQog=Opmx@qgA0sP|g;GAz5l|He>`yeLjVD;{OmoA^_ zmR&?v9N0V*ifN2}{?uA#Jphp?ek4@!nc_@X>)vW;zI#~uiQgh_cCYDcozT5~*lk&KE7ufuXO`im_IVU*31Yx`aX@%M^)E@PwS?8nUx@-t+ zuVwSiUcMFo(3oUZ?LIX%wTF9?gUe8Ohe+CX>M=Ni_h^MX8w)y-kB9EfFotfut9VM! z?rTkHt$y4}^TgT%3*G-Js&y+`uiGCU$=ePesBga_=t+xQo_u;^b#Bf%=KVM9!i9e} zGqrzv$ZBin=Z~&ZCnqQG9h{gH(v)cgUH|P9!ym)3qtqJSYak3pA=G2)J*D`%d1O~* zXGciKQZ9QLQ%awsB;S;h zyqug#Zf2%XW_GrE=;}y*Kw@IzPqXp>l@U&}JfUFpQ4#9sNzx4A^!>!dM98;ymGv_- zGaCg31;z34Y>FCVQaS;fY`TUKu4g&iS)>miJ$e+py*dgR%LBbSv(L7fAo{^v0J;{@ zw^+Zo7kaevCimzfn&BG2{+r4kXm(89H?)Cmxm+)~HSmMm!g^C!X_MS~ji4T00n1yb bFmp4VtT-b=E8kdiGyRb{+{(1x*p>7z%T3ku diff --git a/OsmAnd/res/drawable-xhdpi/widget_monitoring_rec_inactive_night.png b/OsmAnd/res/drawable-xhdpi/widget_monitoring_rec_inactive_night.png old mode 100644 new mode 100755 index 34a1e314bc9f3f72915129155ff37527bb38343e..0d0c4e6873027a2f35a395e05b85f0dc2a242847 GIT binary patch delta 2374 zcma)*do&Xc8^;mpH!8PsNerpbu-S#VPMao*uznK7Hj}y5u(@OzVp3@263J2&qbPGH zLPPVTBt)1?s;56e#6Thvjz+*x z4qyZnW&sC-F)#~rbJ$S_Q&Th;WsgR{%~Ji9)W=RK`bCpT_7dG&7XuM{+CVuuS-m9fL11#h$JN1pF+447#Ry4J%0plFl-}S4`~e3HO40EjwB-Vi=^XA3d-0+LwSlvwi~=jnVtT&g1bvz?JxP({W`$y@xF{% zpqA3z_)-bC)W6SWIp;)mr4a>1HDXJtDa%U#~?k}RII zc}n|&?r3yhlk1gZ0UJJ8r-nB5K;7FnJ3b$>^<+QJI$nKXbJa~tb`7^ESt$T9{B)wk1p zGh^4eyRkPIH16X{=UYW@)L+gFXDnVZITo{$#v8S8ZN3DXorsrBzm41(Oz25aVqR(M z+}XMc4kfGPr`KiPQ-R9W-@jUyLe$sUCkE(t zrxpRG`R+A=mvv)AZtL%H>m&n`egtucU ze#8615{E;z>o%VfiFSc=C-Yjqo}&Nw2LIuVtr0kE&;aJ6zvAjQYKp6s64^sJkJs}T zhWG4`)+I1*mT@07Lm~amayq-R4|WqhC7*26RMXvP8Z|%W_EeWk+#Kk3HZ+;x2@l?q z(U2#kYt2NE>?O-bUjV5C1s9pt+p=5hl!a^YTZK9r$)7%v%d4wpx#Jw0K02R&)q*nL z&c<8=>SKNvLN$>)Qi@}}evaxk`CI*yTxjVtM0yefNEaMEno^#qVkf4ieaz2c$z^C- zv4fE3s#RA-A9iy%oDDv`SH-g}-r8JqmyhWC;GfmFVP(v=O z_CDUV8J}ZJ^ZJ3F8Wvxpi&ll>vRPR42TM+UhY={JTXJVz5+D^y{V1N%%1H&w7_>yq zykI6xVS<8!5(^46Ca93GGY^uw@My{Ds*a)BvngMK#v**CBO@cP4umu}XiRdC3&NYf ze<*A>GjOYepG$wO**GchZJg^TGb8jUpi~y>^gefDri^4NXKc|apBaPYdR@zCQ>n=q zz{kLGz3r$0e;@s&r6qYeeQpeFRZZG>t@qkn)=NVr1BF4Yyi}ziwV_#W<-@(WI1k&f zr;D%j?^vI>4&+%?2t0KiR1{>pk+YrIA9*^PTO0?f>|SH<9Ssc)Bhtkz);<34c*5JU z^C*`GN&3NPNk#f%@C<6rcfDQ>ahbk@{juj+Q)WQ{z~A4W{5Wj{`+VmQuZBF;o zo^P}{Cxu4$ z0@k+6hhT!N`?{F0rd*lLKrKLr+phOU{-`i?cZ+*O~KUrgIn`{ODnQKw1)PrkA z^aRIT99lV-d4WKLE1VBGR5>kQc=E0ax& zU)yLq8f&Y0y$d;t_R8YwCaeV+>fWRO{l4o>gKVOED)o>{wsx+wrX|JU!DUiZV`L18 ze7tHnn2&F_p&uBV-*vTszp*)>`MEL9K?)m9J4T_@-oJa-x1(H@dOwkdiMGDNVY54G z2|YLD<87EmvT(kS8}tk@`*Q4+7C?gNeT{!#`=7EG!GlLQ&3xQn6T3A-x%8&Cni_~F z4wuv0Ye6d;I-sntYW~v5Nup&RA~ZcaH@A#H4#~A)yx3|7lL6S`yo2Jj3gwN>O+6Y; zUfVjxqr_75(7jA0V?p#z5P|fYY>u9nk=xt;XIMXFf&c8CaMfc`Sy_l(!`gt=Puu;L z+OsbwBkr)?^s!d78q3YpPLJqWd?u@UdZ5zLKzu$7@oRYMs+410o3xrllz@|&27LBe P;*T6LC(%{*zKnkXH7#+v delta 2371 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 TjCRNj=wDz^I>c{@ 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 Be3k$J