From d014c7a8419ef7caa24ffe94669ceed1e279ae88 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Fri, 5 Apr 2019 17:16:05 +0300 Subject: [PATCH 001/114] Add api method to subscribe for updates on next turn type and distance via callback. --- .../net/osmand/aidl/IOsmAndAidlCallback.aidl | 3 + .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 4 +- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 76 ++++++++++++++++++- .../net/osmand/aidl/OsmandAidlConstants.java | 15 ++++ .../net/osmand/aidl/OsmandAidlService.java | 20 +++++ .../aidl/navigation/ADirectionInfo.aidl | 3 + .../aidl/navigation/ADirectionInfo.java | 73 ++++++++++++++++++ .../navigation/ANavigationUpdateParams.aidl | 4 + .../navigation/ANavigationUpdateParams.java | 57 ++++++++++++++ .../osmand/plus/routing/RoutingHelper.java | 3 + 10 files changed, 255 insertions(+), 3 deletions(-) create mode 100644 OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.aidl create mode 100644 OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java create mode 100644 OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl create mode 100644 OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java diff --git a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl index 6f0cb8f65b..eb12810adb 100644 --- a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl +++ b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl @@ -2,6 +2,7 @@ package net.osmand.aidl; import net.osmand.aidl.search.SearchResult; import net.osmand.aidl.gpx.AGpxBitmap; +import net.osmand.aidl.navigation.ADirectionInfo; interface IOsmAndAidlCallback { void onSearchComplete(in List resultSet); @@ -11,4 +12,6 @@ interface IOsmAndAidlCallback { void onAppInitialized(); void onGpxBitmapCreated(in AGpxBitmap bitmap); + + void updateNavigationInfo(in ADirectionInfo directionInfo); } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl index d8aa037510..f418b2b561 100644 --- a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl +++ b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl @@ -81,7 +81,7 @@ import net.osmand.aidl.tiles.ASqliteDbFile; import net.osmand.aidl.plugins.PluginParams; import net.osmand.aidl.copyfile.CopyFileParams; - +import net.osmand.aidl.navigation.ANavigationUpdateParams; // NOTE: Add new methods at the end of file!!! @@ -182,4 +182,6 @@ interface IOsmAndAidlInterface { boolean getBitmapForGpx(in CreateGpxBitmapParams file, IOsmAndAidlCallback callback); int copyFile(in CopyFileParams filePart); + + long registerForNavigationUpdates(in ANavigationUpdateParams params, IOsmAndAidlCallback callback); } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index cb5a26b35e..ff47cee9d6 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -42,6 +42,8 @@ import net.osmand.aidl.maplayer.point.AMapPoint; import net.osmand.aidl.mapmarker.AMapMarker; import net.osmand.aidl.mapwidget.AMapWidget; import net.osmand.aidl.navdrawer.NavDrawerFooterParams; +import net.osmand.aidl.navigation.ADirectionInfo; +import net.osmand.aidl.navigation.ANavigationUpdateParams; import net.osmand.aidl.plugins.PluginParams; import net.osmand.aidl.search.SearchResult; import net.osmand.aidl.tiles.ASqliteDbFile; @@ -75,6 +77,7 @@ import net.osmand.plus.helpers.ExternalApiHelper; import net.osmand.plus.monitoring.OsmandMonitoringPlugin; import net.osmand.plus.myplaces.TrackBitmapDrawer; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; +import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.views.AidlMapLayer; import net.osmand.plus.views.MapInfoLayer; @@ -83,6 +86,7 @@ import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.mapwidgets.MapWidgetRegistry.MapWidgetRegInfo; import net.osmand.plus.views.mapwidgets.TextInfoWidget; +import net.osmand.router.TurnType; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -191,6 +195,9 @@ public class OsmandAidlApi { private boolean mapActivityActive = false; + private Map callbacks; + private long updateCallbackId = 0; + public OsmandAidlApi(OsmandApplication app) { this.app = app; loadConnectedApps(); @@ -238,6 +245,12 @@ public class OsmandAidlApi { receivers = new TreeMap<>(); } + + public static boolean isAidlSubscribedForUpdates() { +// return !callbacks.isEmpty(); + return true; + } + public boolean isUpdateAllowed() { return mapActivityActive; } @@ -1918,6 +1931,57 @@ public class OsmandAidlApi { return app.getAppCustomization().changePluginStatus(params); } + public long registerForNavigationUpdates(ANavigationUpdateParams params, IOsmAndAidlCallback callback) { + if (params.isSubscribeToUpdates()) { + updateCallbackId++; + callbacks.put(updateCallbackId, callback); + startNavigationalUpdates(updateCallbackId); + return updateCallbackId; + } else { + callbacks.remove(params.getCallbackId()); + return -1; + } + } + + public NavUpdateListener navUpdateListener = null; + + public boolean isActiveListeners() { + return callbacks.size() > 0; + } + + private void startNavigationalUpdates(final long updateCallbackId) { + final ADirectionInfo directionInfo = new ADirectionInfo(-1, -1, false); + final NextDirectionInfo baseNdi = new NextDirectionInfo(); + navUpdateListener = new NavUpdateListener() { + @Override + public void onNavUpdate() { + RoutingHelper rh = app.getRoutingHelper(); + if (callbacks.containsKey(updateCallbackId)) { + if (rh.isDeviatedFromRoute()) { + directionInfo.setTurnType(TurnType.OFFR); + directionInfo.setDistanceTo((int) rh.getRouteDeviation()); + } else { + NextDirectionInfo ndi = rh.getNextRouteDirectionInfo(baseNdi, true); + if (ndi != null && ndi.distanceTo > 0 && ndi.directionInfo != null) { + directionInfo.setDistanceTo(ndi.distanceTo); + directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); + } + } + try { + callbacks.get(updateCallbackId).updateNavigationInfo(directionInfo); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } + } + } + }; + } + + public interface NavUpdateListener { + void onNavUpdate(); + } + + boolean getBitmapForGpx(final Uri gpxUri, final float density, final int widthPixels, final int heightPixels, final int color, final GpxBitmapCreatedCallback callback) { if (gpxUri == null || callback == null) { return false; @@ -2103,6 +2167,8 @@ public class OsmandAidlApi { } } + + private static AGpxFileDetails createGpxFileDetails(@NonNull GPXTrackAnalysis a) { return new AGpxFileDetails(a.totalDistance, a.totalTracks, a.startTime, a.endTime, a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown, @@ -2179,6 +2245,12 @@ public class OsmandAidlApi { } public interface OsmandAppInitCallback { - void onAppInitialized(); - } + void onAppInitialized(); + } + + public interface DirectionsUpdateCallback { + void onDirectionsUpdate(ADirectionInfo directionInfo); + } + + } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlConstants.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlConstants.java index a74fb67b5a..583a77c4e1 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlConstants.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlConstants.java @@ -18,4 +18,19 @@ public interface OsmandAidlConstants { int COPY_FILE_WRITE_LOCK_ERROR = -1003; int COPY_FILE_IO_ERROR = -1004; int COPY_FILE_UNSUPPORTED_FILE_TYPE_ERROR = -1005; + + int TURN_TYPE_C = 1;//"C"; // continue (go straight) //$NON-NLS-1$ + int TURN_TYPE_TL = 2; // turn left //$NON-NLS-1$ + int TURN_TYPE_TSLL = 3; // turn slightly left //$NON-NLS-1$ + int TURN_TYPE_TSHL = 4; // turn sharply left //$NON-NLS-1$ + int TURN_TYPE_TR = 5; // turn right //$NON-NLS-1$ + int TURN_TYPE_TSLR = 6; // turn slightly right //$NON-NLS-1$ + int TURN_TYPE_TSHR = 7; // turn sharply right //$NON-NLS-1$ + int TURN_TYPE_KL = 8; // keep left //$NON-NLS-1$ + int TURN_TYPE_KR = 9; // keep right//$NON-NLS-1$ + int TURN_TYPE_TU = 10; // U-turn //$NON-NLS-1$ + int TURN_TYPE_TRU = 11; // Right U-turn //$NON-NLS-1$ + int TURN_TYPE_OFFR = 12; // Off route //$NON-NLS-1$ + int TURN_TYPE_RNDB = 13; // Roundabout + int TURN_TYPE_RNLB = 14; // Roundabout left } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index 846ebad253..f334494ba5 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -11,6 +11,7 @@ import android.os.RemoteException; import android.support.annotation.Nullable; import net.osmand.PlatformUtil; +import net.osmand.aidl.OsmandAidlApi.DirectionsUpdateCallback; import net.osmand.aidl.OsmandAidlApi.GpxBitmapCreatedCallback; import net.osmand.aidl.OsmandAidlApi.OsmandAppInitCallback; import net.osmand.aidl.OsmandAidlApi.SearchCompleteCallback; @@ -50,6 +51,8 @@ import net.osmand.aidl.mapwidget.UpdateMapWidgetParams; import net.osmand.aidl.navdrawer.NavDrawerFooterParams; import net.osmand.aidl.navdrawer.NavDrawerHeaderParams; import net.osmand.aidl.navdrawer.SetNavDrawerItemsParams; +import net.osmand.aidl.navigation.ADirectionInfo; +import net.osmand.aidl.navigation.ANavigationUpdateParams; import net.osmand.aidl.navigation.MuteNavigationParams; import net.osmand.aidl.navigation.NavigateGpxParams; import net.osmand.aidl.navigation.NavigateParams; @@ -68,6 +71,8 @@ import net.osmand.aidl.search.SearchResult; import net.osmand.aidl.tiles.ASqliteDbFile; import net.osmand.aidl.copyfile.CopyFileParams; import net.osmand.plus.OsmandApplication; +import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; +import net.osmand.plus.routing.RouteDirectionInfo; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -992,5 +997,20 @@ public class OsmandAidlService extends Service { return UNKNOWN_API_ERROR; } } + + @Override + public long registerForNavigationUpdates(ANavigationUpdateParams params, final IOsmAndAidlCallback callback) { + try { + OsmandAidlApi api = getApi("registerForNavUpdates"); + if (api != null) { + return api.registerForNavigationUpdates(params, callback); + } else { + return -1; + } + } catch (Exception e) { + handleException(e); + return UNKNOWN_API_ERROR; + } + } }; } diff --git a/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.aidl b/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.aidl new file mode 100644 index 0000000000..b0793d6e1a --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.navigation; + +parcelable ADirectionInfo; diff --git a/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java b/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java new file mode 100644 index 0000000000..f83c9c5764 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java @@ -0,0 +1,73 @@ +package net.osmand.aidl.navigation; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ADirectionInfo implements Parcelable { + + private int distanceTo; //distance to next turn + private int turnType; //turn type + private boolean isLeftSide; //is movement leftsided + + public ADirectionInfo(int distanceTo, int turnType, boolean isLeftSide) { + this.distanceTo = distanceTo; + this.turnType = turnType; + this.isLeftSide = isLeftSide; + } + + protected ADirectionInfo(Parcel in) { + distanceTo = in.readInt(); + turnType = in.readInt(); + isLeftSide = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public ADirectionInfo createFromParcel(Parcel in) { + return new ADirectionInfo(in); + } + + @Override + public ADirectionInfo[] newArray(int size) { + return new ADirectionInfo[size]; + } + }; + + public int getDistanceTo() { + return distanceTo; + } + + public int getTurnType() { + return turnType; + } + + public boolean isLeftSide() { + return isLeftSide; + } + + public void setDistanceTo(int distanceTo) { + this.distanceTo = distanceTo; + } + + public void setTurnType(int turnType) { + this.turnType = turnType; + } + + public void setLeftSide(boolean leftSide) { + isLeftSide = leftSide; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(distanceTo); + dest.writeInt(turnType); + dest.writeByte((byte) (isLeftSide ? 1 : 0)); + } + + +} diff --git a/OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl b/OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl new file mode 100644 index 0000000000..43f370d024 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl @@ -0,0 +1,4 @@ + +package net.osmand.aidl.navigation; + +parcelable ANavigationUpdateParams; \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java b/OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java new file mode 100644 index 0000000000..38c8f5ffe4 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java @@ -0,0 +1,57 @@ +package net.osmand.aidl.navigation; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ANavigationUpdateParams implements Parcelable { + + private boolean subscribeToUpdates = true; + private long callbackId = -1L; + + public ANavigationUpdateParams() { + } + + public long getCallbackId() { + return callbackId; + } + + public void setCallbackId(long callbackId) { + this.callbackId = callbackId; + } + + public void setSubscribeToUpdates(boolean subscribeToUpdates) { + this.subscribeToUpdates = subscribeToUpdates; + } + + public boolean isSubscribeToUpdates() { + return subscribeToUpdates; + } + + protected ANavigationUpdateParams(Parcel in) { + callbackId = in.readLong(); + subscribeToUpdates = in.readByte() != 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(callbackId); + dest.writeByte((byte) (subscribeToUpdates ? 1 : 0)); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public ANavigationUpdateParams createFromParcel(Parcel in) { + return new ANavigationUpdateParams(in); + } + + @Override + public ANavigationUpdateParams[] newArray(int size) { + return new ANavigationUpdateParams[size]; + } + }; +} diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 6a0f46a52e..71e03f02d4 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -502,6 +502,9 @@ public class RoutingHelper { route.updateCurrentRoute(newCurrentRoute + 1); currentRoute = newCurrentRoute + 1; app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION); + if (app.getAidlApi().isActiveListeners() && app.getAidlApi().navUpdateListener != null) { + app.getAidlApi().navUpdateListener.onNavUpdate(); + } } else { break; } From 2cbe465fe8d40278d9ecb4b9caa951ec0b4c4efc Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Fri, 5 Apr 2019 18:04:16 +0300 Subject: [PATCH 002/114] documenting aidl --- .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 87 +++++++++++++++++-- 1 file changed, 82 insertions(+), 5 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl index f418b2b561..71e0214604 100644 --- a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl +++ b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl @@ -104,25 +104,102 @@ interface IOsmAndAidlInterface { boolean removeMapLayer(in RemoveMapLayerParams params); boolean updateMapLayer(in UpdateMapLayerParams params); - boolean importGpx(in ImportGpxParams params); - boolean showGpx(in ShowGpxParams params); - boolean hideGpx(in HideGpxParams params); - boolean getActiveGpx(out List files); + boolean importGpx(in ImportGpxParams params); + boolean showGpx(in ShowGpxParams params); + boolean hideGpx(in HideGpxParams params); + boolean getActiveGpx(out List files); - boolean setMapLocation(in SetMapLocationParams params); + boolean setMapLocation(in SetMapLocationParams params); boolean calculateRoute(in CalculateRouteParams params); + /** + * Refresh the map (UI) + */ boolean refreshMap(); + /** + * Add favorite group with given params. + * + * @param name - group name. + * @param color - group color. Can be one of: "red", "orange", "yellow", + * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". + * @param visible - group visibility. + */ boolean addFavoriteGroup(in AddFavoriteGroupParams params); + + /** + * Update favorite group with given params. + * + * @param namePrev - group name (current). + * @param colorPrev - group color (current). + * @param visiblePrev - group visibility (current). + * @param nameNew - group name (new). + * @param colorNew - group color (new). + * @param visibleNew - group visibility (new). + */ boolean removeFavoriteGroup(in RemoveFavoriteGroupParams params); + + /** + * Remove favorite group with given name. + * + * @param name - name of favorite group. + */ boolean updateFavoriteGroup(in UpdateFavoriteGroupParams params); + /** + * Add favorite at given location with given params. + * + * @param lat - latitude. + * @param lon - longitude. + * @param name - name of favorite item. + * @param description - description of favorite item. + * @param category - category of favorite item. + * @param color - color of favorite item. Can be one of: "red", "orange", "yellow", + * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". + * @param visible - should favorite item be visible after creation. + */ boolean addFavorite(in AddFavoriteParams params); + + /** + * Update favorite at given location with given params. + * + * @param latPrev - latitude (current favorite). + * @param lonPrev - longitude (current favorite). + * @param namePrev - name of favorite item (current favorite). + * @param categoryPrev - category of favorite item (current favorite). + * @param latNew - latitude (new favorite). + * @param lonNew - longitude (new favorite). + * @param nameNew - name of favorite item (new favorite). + * @param descriptionNew - description of favorite item (new favorite). + * @param categoryNew - category of favorite item (new favorite). Use only to create a new category, + * not to update an existing one. If you want to update an existing category, + * use the {@link #updateFavoriteGroup(String, String, boolean, String, String, boolean)} method. + * @param colorNew - color of new category. Can be one of: "red", "orange", "yellow", + * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". + * @param visibleNew - should new category be visible after creation. + */ boolean removeFavorite(in RemoveFavoriteParams params); + + /** + * Remove favorite at given location with given params. + * + * @param lat - latitude. + * @param lon - longitude. + * @param name - name of favorite item. + * @param category - category of favorite item. + */ boolean updateFavorite(in UpdateFavoriteParams params); + /** + * Add map marker at given location. + * + * @param lat - latitude. + * @param lon - longitude. + * @param name - name. + */ boolean startGpxRecording(in StartGpxRecordingParams params); + + boolean stopGpxRecording(in StopGpxRecordingParams params); boolean takePhotoNote(in TakePhotoNoteParams params); From 408e6b94a4092f24923a1d11b33be469224e3856 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Mon, 8 Apr 2019 11:33:20 +0300 Subject: [PATCH 003/114] AIDL documentation --- .../net/osmand/aidl/IOsmAndAidlCallback.aidl | 24 +- .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 446 +++++++++++++++++- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 6 - .../aidl/navigation/ADirectionInfo.java | 2 +- 4 files changed, 462 insertions(+), 16 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl index eb12810adb..87f6de79c4 100644 --- a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl +++ b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlCallback.aidl @@ -5,13 +5,35 @@ import net.osmand.aidl.gpx.AGpxBitmap; import net.osmand.aidl.navigation.ADirectionInfo; interface IOsmAndAidlCallback { + + /** + * Callback for search requests. + * + * @return resultSet - set of SearchResult + */ void onSearchComplete(in List resultSet); - + + /** + * Callback for {@link IOsmAndAidlInterface} registerForUpdates() method. + */ void onUpdate(); + /** + * Callback for {@link IOsmAndAidlInterface} registerForOsmandInitListener() method. + */ void onAppInitialized(); + /** + * Callback for {@link IOsmAndAidlInterface} getBitmapForGpx() method. + * + * @return bitmap - snapshot image of gpx track on map + */ void onGpxBitmapCreated(in AGpxBitmap bitmap); + /** + * Callback for {@link IOsmAndAidlInterface} registerForNavigationUpdates() method. + * + * @return directionInfo - update on distance to next turn and turns type. + */ void updateNavigationInfo(in ADirectionInfo directionInfo); } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl index 71e0214604..5f5a01ad88 100644 --- a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl +++ b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl @@ -88,28 +88,188 @@ import net.osmand.aidl.navigation.ANavigationUpdateParams; interface IOsmAndAidlInterface { + /** + * Add map marker at given location. + * + * @param lat - latitude. + * @param lon - longitude. + * @param name - name. + */ boolean addMapMarker(in AddMapMarkerParams params); + + /** + * Remove map marker at given location with name. + * + * @param lat - latitude. + * @param lon - longitude. + * @param name - name. + */ boolean removeMapMarker(in RemoveMapMarkerParams params); + + /** + * Update map marker at given location with name. + * + * @param latPrev - latitude (current marker). + * @param lonPrev - longitude (current marker). + * @param namePrev - name (current marker). + * @param latNew - latitude (new marker). + * @param lonNew - longitude (new marker). + * @param nameNew - name (new marker). + */ boolean updateMapMarker(in UpdateMapMarkerParams params); + /** + * Add map widget to the right side of the main screen. + * Note: any specified icon should exist in OsmAnd app resources. + * + * @param id - widget id. + * @param menuIconName - icon name (configure map menu). + * @param menuTitle - widget name (configure map menu). + * @param lightIconName - icon name for the light theme (widget). + * @param darkIconName - icon name for the dark theme (widget). + * @param text - main widget text. + * @param description - sub text, like "km/h". + * @param order - order position in the widgets list. + * @param intentOnClick - onClick intent. Called after click on widget as startActivity(Intent intent). + */ boolean addMapWidget(in AddMapWidgetParams params); + + /** + * Remove map widget. + * + * @param id - widget id. + */ boolean removeMapWidget(in RemoveMapWidgetParams params); + + /** + * Update map widget. + * Note: any specified icon should exist in OsmAnd app resources. + * + * @param id - widget id. + * @param menuIconName - icon name (configure map menu). + * @param menuTitle - widget name (configure map menu). + * @param lightIconName - icon name for the light theme (widget). + * @param darkIconName - icon name for the dark theme (widget). + * @param text - main widget text. + * @param description - sub text, like "km/h". + * @param order - order position in the widgets list. + * @param intentOnClick - onClick intent. Called after click on widget as startActivity(Intent intent). + */ boolean updateMapWidget(in UpdateMapWidgetParams params); + /** + * Add point to user layer. + * + * @param layerId - layer id. Note: layer should be added first. + * @param pointId - point id. + * @param shortName - short name (single char). Displayed on the map. + * @param fullName - full name. Displayed in the context menu on first row. + * @param typeName - type name. Displayed in context menu on second row. + * @param color - color of circle's background. + * @param location - location of the point. + * @param details - list of details. Displayed under context menu. + * @param params - optional map of params for point. + */ boolean addMapPoint(in AddMapPointParams params); + + + /** + * Remove point. + * + * @param layerId - layer id. + * @param pointId - point id. + */ boolean removeMapPoint(in RemoveMapPointParams params); + + /** + * Update point. + * + * @param layerId - layer id. + * @param pointId - point id. + * @param shortName - short name (single char). Displayed on the map. + * @param fullName - full name. Displayed in the context menu on first row. + * @param typeName - type name. Displayed in context menu on second row. + * @param color - color of circle's background. + * @param location - location of the point. + * @param details - list of details. Displayed under context menu. + * @param params - optional map of params for point. + */ boolean updateMapPoint(in UpdateMapPointParams params); + /** + * Add user layer on the map. + * + * @param id - layer id. + * @param name - layer name. + * @param zOrder - z-order position of layer. Default value is 5.5f + * @param points - initial list of points. Nullable. + * @param imagePoints - use new style for points on map or not. Also default zoom bounds for new style can be edited. + */ boolean addMapLayer(in AddMapLayerParams params); + + /** + * Remove user layer. + * + * @param id - layer id. + */ boolean removeMapLayer(in RemoveMapLayerParams params); + + /** + * Update user layer. + * + * @param id - layer id. + * @param name - layer name. + * @param zOrder - z-order position of layer. Default value is 5.5f + * @param points - list of points. Nullable. + * @param imagePoints - use new style for points on map or not. Also default zoom bounds for new style can be edited. + */ boolean updateMapLayer(in UpdateMapLayerParams params); + /** + * Import GPX file to OsmAnd (from URI or file). + * + * @param gpxUri - URI created by FileProvider (preferable method). + * @param file - File which represents GPX track (not recomended, OsmAnd should have rights to access file location). + * @param fileName - Destination file name. May contain dirs. + * @param color - color of gpx. Can be one of: "red", "orange", "lightblue", "blue", "purple", + * "translucent_red", "translucent_orange", "translucent_lightblue", + * "translucent_blue", "translucent_purple" + * @param show - show track on the map after import + */ boolean importGpx(in ImportGpxParams params); + + /** + * Show GPX file on map. + * + * @param fileName - file name to show. Must be imported first. + */ boolean showGpx(in ShowGpxParams params); + + /** + * Hide GPX file. + * + * @param fileName - file name to hide. + */ boolean hideGpx(in HideGpxParams params); + + /** + * Get list of active GPX files. + * + * @return list of active gpx files. + */ boolean getActiveGpx(out List files); + /** + * Set map view to current location. + * + * @param latitude - latitude of new map center. + * @param longitude - longitude of new map center. + * @param zoom - map zoom level. Set 0 to keep zoom unchanged. + * @param animated - set true to animate changes. + */ boolean setMapLocation(in SetMapLocationParams params); + + boolean calculateRoute(in CalculateRouteParams params); /** @@ -190,75 +350,345 @@ interface IOsmAndAidlInterface { */ boolean updateFavorite(in UpdateFavoriteParams params); - /** - * Add map marker at given location. - * - * @param lat - latitude. - * @param lon - longitude. - * @param name - name. - */ + /** + * Start gpx recording. + */ boolean startGpxRecording(in StartGpxRecordingParams params); - + /** + * Stop gpx recording. + */ boolean stopGpxRecording(in StopGpxRecordingParams params); + /** + * Take photo note. + * + * @param lat - latutude of photo note. + * @param lon - longitude of photo note. + */ boolean takePhotoNote(in TakePhotoNoteParams params); + + /** + * Start video note recording. + * + * @param lat - latutude of video note point. + * @param lon - longitude of video note point. + */ boolean startVideoRecording(in StartVideoRecordingParams params); + + /** + * Start audio note recording. + * + * @param lat - latutude of audio note point. + * @param lon - longitude of audio note point. + */ boolean startAudioRecording(in StartAudioRecordingParams params); + + /** + * Stop Audio/Video recording. + */ boolean stopRecording(in StopRecordingParams params); + /** + * Start navigation. + * + * @param startName - name of the start point as it displays in OsmAnd's UI. Nullable. + * @param startLat - latitude of the start point. If 0 - current location is used. + * @param startLon - longitude of the start point. If 0 - current location is used. + * @param destName - name of the start point as it displays in OsmAnd's UI. + * @param destLat - latitude of a destination point. + * @param destLon - longitude of a destination point. + * @param profile - One of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). + * @param force - ask to stop current navigation if any. False - ask. True - don't ask. + */ boolean navigate(in NavigateParams params); + + /** + * Start navigation using gpx file. User need to grant Uri permission to OsmAnd. + * + * @param gpxUri - URI created by FileProvider. + * @param force - ask to stop current navigation if any. False - ask. True - don't ask. + */ boolean navigateGpx(in NavigateGpxParams params); + /** + * Remove GPX file. + * + * @param fileName - file name to remove; + */ boolean removeGpx(in RemoveGpxParams params); + + /** + * Show AMapPoint on map in OsmAnd. + * + * @param layerId - layer id. Note: layer should be added first. + * @param pointId - point id. + * @param shortName - short name (single char). Displayed on the map. + * @param fullName - full name. Displayed in the context menu on first row. + * @param typeName - type name. Displayed in context menu on second row. + * @param color - color of circle's background. + * @param location - location of the point. + * @param details - list of details. Displayed under context menu. + * @param params - optional map of params for point. + */ boolean showMapPoint(in ShowMapPointParams params); + /** + * Method for adding up to 3 items to the OsmAnd navigation drawer. + * + * @param appPackage - current application package. + * @param names - list of names for items. + * @param uris - list of uris for intents. + * @param iconNames - list of icon names for items. + * @param flags - list of flags for intents. Use -1 if no flags needed. + */ boolean setNavDrawerItems(in SetNavDrawerItemsParams params); + /** + * Put navigation on pause. + */ boolean pauseNavigation(in PauseNavigationParams params); + + /** + * Resume navigation if it was paused before. + */ boolean resumeNavigation(in ResumeNavigationParams params); + + /** + * Stop navigation. Removes target / intermediate points and route path from the map. + */ boolean stopNavigation(in StopNavigationParams params); + + + /** + * Mute voice guidance. Stays muted until unmute manually or via the api. + */ boolean muteNavigation(in MuteNavigationParams params); + + /** + * Unmute voice guidance. + */ boolean unmuteNavigation(in UnmuteNavigationParams params); + /** + * Run search for POI / Address. + * + * @param searchQuery - search query string. + * @param searchType - type of search. Values: + * SearchParams.SEARCH_TYPE_ALL - all kind of search + * SearchParams.SEARCH_TYPE_POI - POIs only + * SearchParams.SEARCH_TYPE_ADDRESS - addresses only + * + * @param latitude - latitude of original search location. + * @param longitude - longitude of original search location. + * @param radiusLevel - value from 1 to 7. Default value = 1. + * @param totalLimit - limit of returned search result rows. Default value = -1 (unlimited). + */ boolean search(in SearchParams params, IOsmAndAidlCallback callback); + + /** + * Do search and start navigation. + * + * @param startName - name of the start point as it displays in OsmAnd's UI. Nullable. + * @param startLat - latitude of the start point. If 0 - current location is used. + * @param startLon - longitude of the start point. If 0 - current location is used. + * @param searchQuery - Text of a query for searching a destination point. Sent as URI parameter. + * @param searchLat - original location of search (latitude). Sent as URI parameter. + * @param searchLon - original location of search (longitude). Sent as URI parameter. + * @param profile - one of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). + * @param force - ask to stop current navigation if any. False - ask. True - don't ask. + */ boolean navigateSearch(in NavigateSearchParams params); + /** + * Method to register for periodical callbacks from OsmAnd + * + * @param updateTimeMS - period of time in millisecond after which callback is triggered + * @param callback - create and provide instance of {@link IOsmAndAidlCallback} interface + * @return id of callback in OsmAnd. Needed to unsubscribe from updates. + */ long registerForUpdates(in long updateTimeMS, IOsmAndAidlCallback callback); + + /** + * Method to unregister from periodical callbacks from OsmAnd + * + * @param callbackId - id of registered callback (provided by OsmAnd + * in {@link OsmAndAidlHelper#registerForUpdates(long, IOsmAndAidlCallback)}) + */ boolean unregisterFromUpdates(in long callbackId); + /** + * Method for adding image to the top of Osmand's NavDrawer. + * + * @param imageUri - image's URI.toString + * + * @deprecated + * Use the {@link #setNavDrawerLogoWithParams(NavDrawerHeaderParams params)} method. + */ boolean setNavDrawerLogo(in String imageUri); + /** + * Method for selected UI elements (like QuickSearch button) to show. + * + * @param ids - list of menu items keys from {@link OsmAndCustomizationConstants} + */ boolean setEnabledIds(in List ids); + + /** + * Method for selected UI elements (like QuickSearch button) to hide. + * + * @param ids - list of menu items keys from {@link OsmAndCustomizationConstants} + */ boolean setDisabledIds(in List ids); + + /** + * Method to show selected NavDrawer's menu items. + * + * @param patterns - list of menu items names from {@link OsmAndCustomizationConstants} + */ boolean setEnabledPatterns(in List patterns); + + /** + * Method to hide selected NavDrawer's menu items. + * + * @param patterns - list of menu items names from {@link OsmAndCustomizationConstants} + */ boolean setDisabledPatterns(in List patterns); + /** + * Register OsmAnd widgets for visibility. + * + * @param widgetKey - widget id. + * @param appModKeys - list of OsmAnd Application modes widget active with. Could be "null" for all modes. + */ boolean regWidgetVisibility(in SetWidgetsParams params); + + /** + * Register OsmAnd widgets for availability. + * + * @param widgetKey - widget id. + * @param appModKeys - ist of OsmAnd Application modes widget active with. Could be "null" for all modes. + */ boolean regWidgetAvailability(in SetWidgetsParams params); + /** + * Add custom parameters for OsmAnd settings to associate with client app. + * + * @param sharedPreferencesName - string with name of clint's app for shared preferences key + * @param bundle - bundle with keys from Settings IDs {@link OsmAndCustomizationConstants} and Settings params + */ boolean customizeOsmandSettings(in OsmandSettingsParams params); + /** + * Method to get list of gpx files currently registered (imported or created) in OsmAnd; + * + * @return list of gpx files + */ boolean getImportedGpx(out List files); + /** + * Method to get list of sqlitedb files registered in OsmAnd; + * + * @return list of sqlitedb files + */ boolean getSqliteDbFiles(out List files); + + /** + * Method to get list of currently active sqlitedb files + * + * @return list of sqlitedb files + */ boolean getActiveSqliteDbFiles(out List files); + + /** + * Method to show selected sqlitedb file as map overlay. + * + * @param fileName - name of sqlitedb file + */ boolean showSqliteDbFile(String fileName); + + /** + * Method to hide sqlitedb file from map overlay. + * + * @param fileName - name of sqlitedb file + */ boolean hideSqliteDbFile(String fileName); + /** + * Method for adding image to the top of OsmAnd's NavDrawer with additional params + * + * @param imageUri - image's URI.toString + * @param packageName - client's app package name + * @param intent - intent for additional functionality on image click + * + */ boolean setNavDrawerLogoWithParams(in NavDrawerHeaderParams params); + + /** + * Method for adding functionality to "Powered by Osmand" logo in NavDrawer's footer + * (reset OsmAnd settings to pre-clinet app's state) + * + * @param packageName - package name + * @param intent - intent + * @param appName - client's app name + */ boolean setNavDrawerFooterWithParams(in NavDrawerFooterParams params); + /** + * Restore default (pre-client) OsmAnd settings and state: + * clears features, widgets and settings customization, NavDraw logo. + */ boolean restoreOsmand(); + /** + * Method to change state of plug-ins in OsmAnd. + * + * @param pluginId - id (name) of plugin. + * @param newState - new state (0 - off, 1 - on). + */ boolean changePluginState(in PluginParams params); + /** + * Method to register for callback on OsmAnd initialization + * @param callback - create and provide instance of {@link IOsmAndAidlCallback} interface + */ boolean registerForOsmandInitListener(in IOsmAndAidlCallback callback); + /** + * Requests bitmap snap-shot of map with GPX file from provided URI in its center. + * You can set bitmap size, density and GPX lines color, but you need + * to manually download appropriate map in OsmAnd or background will be empty. + * Bitmap will be returned through callback {@link IOsmAndAidlCallback#onGpxBitmapCreated(AGpxBitmap)} + * + * @param gpxUri - Uri for gpx file + * @param density - image density. Recommended to use default metrics for device's display. + * @param widthPixels - width of bitmap + * @param heightPixels - height of bitmap + * @param color - color in ARGB format + * @param callback - instance of callback from OsmAnd. + */ boolean getBitmapForGpx(in CreateGpxBitmapParams file, IOsmAndAidlCallback callback); + /** + * Method to copy files to OsmAnd part by part. For now supports only sqlitedb format. + * Part size (bytearray) should not exceed 256k. + * + * @param copyPart.fileName - name of file + * @param copyPart.filePartData - parts of file, byte[] with size 256k or less. + * @param copyPart.startTime - timestamp of copying start. + * @param copyPart.isDone - boolean to mark end of copying. + * @return number of last successfully received file part or error(-1). + */ int copyFile(in CopyFileParams filePart); + + /** + * Method to register for updates during navgation. Notifies user about distance to the next turn and its type. + * + * @params params.subscribeToUpdates - boolean flag to subscribe or unsubscribe from updates + * @params params.callbackId - id of callback, needed to unsubscribe from updates + * @params callback - callback to notify user on navigation data change + */ long registerForNavigationUpdates(in ANavigationUpdateParams params, IOsmAndAidlCallback callback); } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index ff47cee9d6..c45b6931ef 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -1981,7 +1981,6 @@ public class OsmandAidlApi { void onNavUpdate(); } - boolean getBitmapForGpx(final Uri gpxUri, final float density, final int widthPixels, final int heightPixels, final int color, final GpxBitmapCreatedCallback callback) { if (gpxUri == null || callback == null) { return false; @@ -2248,9 +2247,4 @@ public class OsmandAidlApi { void onAppInitialized(); } - public interface DirectionsUpdateCallback { - void onDirectionsUpdate(ADirectionInfo directionInfo); - } - - } diff --git a/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java b/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java index f83c9c5764..a5e7074f0e 100644 --- a/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java +++ b/OsmAnd/src/net/osmand/aidl/navigation/ADirectionInfo.java @@ -7,7 +7,7 @@ public class ADirectionInfo implements Parcelable { private int distanceTo; //distance to next turn private int turnType; //turn type - private boolean isLeftSide; //is movement leftsided + private boolean isLeftSide; //is movement left-sided public ADirectionInfo(int distanceTo, int turnType, boolean isLeftSide) { this.distanceTo = distanceTo; From 44885666e11919124c9b578c63c56335d953b229 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Mon, 8 Apr 2019 11:40:46 +0300 Subject: [PATCH 004/114] typo fix --- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index c45b6931ef..2ee46a73eb 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -25,6 +25,7 @@ import android.text.TextUtils; import android.view.View; import android.widget.ArrayAdapter; +import java.util.HashMap; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; @@ -195,7 +196,7 @@ public class OsmandAidlApi { private boolean mapActivityActive = false; - private Map callbacks; + private Map callbacks = new HashMap<>(); private long updateCallbackId = 0; public OsmandAidlApi(OsmandApplication app) { @@ -245,12 +246,6 @@ public class OsmandAidlApi { receivers = new TreeMap<>(); } - - public static boolean isAidlSubscribedForUpdates() { -// return !callbacks.isEmpty(); - return true; - } - public boolean isUpdateAllowed() { return mapActivityActive; } From 9284983fefeab06e1e6b9748dee0e21e8bbc8968 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Mon, 8 Apr 2019 12:31:21 +0300 Subject: [PATCH 005/114] add option to remove of inner callback from RoutingHelper if no aidl callbacks registered. --- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index 2ee46a73eb..34dbc38793 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -26,6 +26,7 @@ import android.view.View; import android.widget.ArrayAdapter; import java.util.HashMap; +import java.util.Map.Entry; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; @@ -1930,10 +1931,13 @@ public class OsmandAidlApi { if (params.isSubscribeToUpdates()) { updateCallbackId++; callbacks.put(updateCallbackId, callback); - startNavigationalUpdates(updateCallbackId); + startNavigationalUpdates(); return updateCallbackId; } else { callbacks.remove(params.getCallbackId()); + if (callbacks.size() == 0) { + navUpdateListener = null; + } return -1; } } @@ -1944,14 +1948,14 @@ public class OsmandAidlApi { return callbacks.size() > 0; } - private void startNavigationalUpdates(final long updateCallbackId) { + private void startNavigationalUpdates() { final ADirectionInfo directionInfo = new ADirectionInfo(-1, -1, false); final NextDirectionInfo baseNdi = new NextDirectionInfo(); - navUpdateListener = new NavUpdateListener() { - @Override - public void onNavUpdate() { - RoutingHelper rh = app.getRoutingHelper(); - if (callbacks.containsKey(updateCallbackId)) { + if (navUpdateListener == null) { + navUpdateListener = new NavUpdateListener() { + @Override + public void onNavUpdate() { + RoutingHelper rh = app.getRoutingHelper(); if (rh.isDeviatedFromRoute()) { directionInfo.setTurnType(TurnType.OFFR); directionInfo.setDistanceTo((int) rh.getRouteDeviation()); @@ -1962,14 +1966,16 @@ public class OsmandAidlApi { directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); } } - try { - callbacks.get(updateCallbackId).updateNavigationInfo(directionInfo); - } catch (Exception e) { - LOG.debug(e.getMessage(), e); + for (Entry cb : callbacks.entrySet()) { + try { + cb.getValue().updateNavigationInfo(directionInfo); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } } } - } - }; + }; + } } public interface NavUpdateListener { From cf10d7394b7fed08a4bdba4b77f549354514f18f Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Mon, 8 Apr 2019 12:31:21 +0300 Subject: [PATCH 006/114] add option to remove of inner callback from RoutingHelper if no aidl callbacks registered. --- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 32 +++++++++++-------- .../net/osmand/aidl/OsmandAidlService.java | 1 - 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index 2ee46a73eb..34dbc38793 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -26,6 +26,7 @@ import android.view.View; import android.widget.ArrayAdapter; import java.util.HashMap; +import java.util.Map.Entry; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; @@ -1930,10 +1931,13 @@ public class OsmandAidlApi { if (params.isSubscribeToUpdates()) { updateCallbackId++; callbacks.put(updateCallbackId, callback); - startNavigationalUpdates(updateCallbackId); + startNavigationalUpdates(); return updateCallbackId; } else { callbacks.remove(params.getCallbackId()); + if (callbacks.size() == 0) { + navUpdateListener = null; + } return -1; } } @@ -1944,14 +1948,14 @@ public class OsmandAidlApi { return callbacks.size() > 0; } - private void startNavigationalUpdates(final long updateCallbackId) { + private void startNavigationalUpdates() { final ADirectionInfo directionInfo = new ADirectionInfo(-1, -1, false); final NextDirectionInfo baseNdi = new NextDirectionInfo(); - navUpdateListener = new NavUpdateListener() { - @Override - public void onNavUpdate() { - RoutingHelper rh = app.getRoutingHelper(); - if (callbacks.containsKey(updateCallbackId)) { + if (navUpdateListener == null) { + navUpdateListener = new NavUpdateListener() { + @Override + public void onNavUpdate() { + RoutingHelper rh = app.getRoutingHelper(); if (rh.isDeviatedFromRoute()) { directionInfo.setTurnType(TurnType.OFFR); directionInfo.setDistanceTo((int) rh.getRouteDeviation()); @@ -1962,14 +1966,16 @@ public class OsmandAidlApi { directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); } } - try { - callbacks.get(updateCallbackId).updateNavigationInfo(directionInfo); - } catch (Exception e) { - LOG.debug(e.getMessage(), e); + for (Entry cb : callbacks.entrySet()) { + try { + cb.getValue().updateNavigationInfo(directionInfo); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } } } - } - }; + }; + } } public interface NavUpdateListener { diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index f334494ba5..42f74164b9 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -11,7 +11,6 @@ import android.os.RemoteException; import android.support.annotation.Nullable; import net.osmand.PlatformUtil; -import net.osmand.aidl.OsmandAidlApi.DirectionsUpdateCallback; import net.osmand.aidl.OsmandAidlApi.GpxBitmapCreatedCallback; import net.osmand.aidl.OsmandAidlApi.OsmandAppInitCallback; import net.osmand.aidl.OsmandAidlApi.SearchCompleteCallback; From 94f1da830a670c645b1a4f48364d2441d9b6bd9d Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Fri, 12 Apr 2019 17:42:48 +0300 Subject: [PATCH 007/114] changes to aidl nav update method. need testing. --- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 75 ++++++------------ .../net/osmand/aidl/OsmandAidlService.java | 77 +++++++++++++++---- .../routing/IRoutingDataUpdateListener.java | 5 ++ .../osmand/plus/routing/RoutingHelper.java | 13 +++- 4 files changed, 104 insertions(+), 66 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/routing/IRoutingDataUpdateListener.java diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index 34dbc38793..fa8e6480a3 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -79,6 +79,7 @@ import net.osmand.plus.helpers.ExternalApiHelper; import net.osmand.plus.monitoring.OsmandMonitoringPlugin; import net.osmand.plus.myplaces.TrackBitmapDrawer; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; +import net.osmand.plus.routing.IRoutingDataUpdateListener; import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.views.AidlMapLayer; @@ -1927,62 +1928,36 @@ public class OsmandAidlApi { return app.getAppCustomization().changePluginStatus(params); } - public long registerForNavigationUpdates(ANavigationUpdateParams params, IOsmAndAidlCallback callback) { - if (params.isSubscribeToUpdates()) { - updateCallbackId++; - callbacks.put(updateCallbackId, callback); - startNavigationalUpdates(); - return updateCallbackId; - } else { - callbacks.remove(params.getCallbackId()); - if (callbacks.size() == 0) { - navUpdateListener = null; - } - return -1; - } - } - - public NavUpdateListener navUpdateListener = null; - - public boolean isActiveListeners() { - return callbacks.size() > 0; - } - - private void startNavigationalUpdates() { + public void registerForNavigationUpdates() { final ADirectionInfo directionInfo = new ADirectionInfo(-1, -1, false); final NextDirectionInfo baseNdi = new NextDirectionInfo(); - if (navUpdateListener == null) { - navUpdateListener = new NavUpdateListener() { - @Override - public void onNavUpdate() { - RoutingHelper rh = app.getRoutingHelper(); - if (rh.isDeviatedFromRoute()) { - directionInfo.setTurnType(TurnType.OFFR); - directionInfo.setDistanceTo((int) rh.getRouteDeviation()); - } else { - NextDirectionInfo ndi = rh.getNextRouteDirectionInfo(baseNdi, true); - if (ndi != null && ndi.distanceTo > 0 && ndi.directionInfo != null) { - directionInfo.setDistanceTo(ndi.distanceTo); - directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); - } - } - for (Entry cb : callbacks.entrySet()) { - try { - cb.getValue().updateNavigationInfo(directionInfo); - } catch (Exception e) { - LOG.debug(e.getMessage(), e); - } + app.getRoutingHelper().addDataUpdateListener(new IRoutingDataUpdateListener(){ + @Override + public void onRoutingDataUpdate() { + RoutingHelper rh = app.getRoutingHelper(); + if (rh.isDeviatedFromRoute()) { + directionInfo.setTurnType(TurnType.OFFR); + directionInfo.setDistanceTo((int) rh.getRouteDeviation()); + } else { + NextDirectionInfo ndi = rh.getNextRouteDirectionInfo(baseNdi, true); + if (ndi != null && ndi.distanceTo > 0 && ndi.directionInfo != null) { + directionInfo.setDistanceTo(ndi.distanceTo); + directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); } } - }; - } + for (Entry cb : callbacks.entrySet()) { + try { + cb.getValue().updateNavigationInfo(directionInfo); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } + } + } + }); } - public interface NavUpdateListener { - void onNavUpdate(); - } - - boolean getBitmapForGpx(final Uri gpxUri, final float density, final int widthPixels, final int heightPixels, final int color, final GpxBitmapCreatedCallback callback) { + boolean getBitmapForGpx(final Uri gpxUri, final float density, final int widthPixels, + final int heightPixels, final int color, final GpxBitmapCreatedCallback callback) { if (gpxUri == null || callback == null) { return false; } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index 42f74164b9..ddcce504ae 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -10,6 +10,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; +import java.util.concurrent.ConcurrentHashMap; import net.osmand.PlatformUtil; import net.osmand.aidl.OsmandAidlApi.GpxBitmapCreatedCallback; import net.osmand.aidl.OsmandAidlApi.OsmandAppInitCallback; @@ -50,7 +51,6 @@ import net.osmand.aidl.mapwidget.UpdateMapWidgetParams; import net.osmand.aidl.navdrawer.NavDrawerFooterParams; import net.osmand.aidl.navdrawer.NavDrawerHeaderParams; import net.osmand.aidl.navdrawer.SetNavDrawerItemsParams; -import net.osmand.aidl.navigation.ADirectionInfo; import net.osmand.aidl.navigation.ANavigationUpdateParams; import net.osmand.aidl.navigation.MuteNavigationParams; import net.osmand.aidl.navigation.NavigateGpxParams; @@ -70,8 +70,6 @@ import net.osmand.aidl.search.SearchResult; import net.osmand.aidl.tiles.ASqliteDbFile; import net.osmand.aidl.copyfile.CopyFileParams; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo; -import net.osmand.plus.routing.RouteDirectionInfo; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -79,7 +77,6 @@ import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import static net.osmand.aidl.OsmandAidlConstants.CANNOT_ACCESS_API_ERROR; import static net.osmand.aidl.OsmandAidlConstants.MIN_UPDATE_TIME_MS; @@ -92,16 +89,34 @@ public class OsmandAidlService extends Service { private static final String DATA_KEY_RESULT_SET = "resultSet"; - private Map callbacks; + public static final int KEY_ON_SEARCH_COMPLETE = 1; + public static final int KEY_ON_UPDATE = 2; + public static final int KEY_ON_APP_INIT = 3; + public static final int KEY_ON_GPX_BMP_CREATED = 4; + public static final int KEY_ON_NAV_DATA_UPDATE = 5; + + private static Map callbacks; private Handler mHandler = null; HandlerThread mHandlerThread = new HandlerThread("OsmAndAidlServiceThread"); - private long updateCallbackId = 0; + private static long aidlCallbackId = 0; private OsmandApplication getApp() { return (OsmandApplication) getApplication(); } + public static void addAidlCallback(IOsmAndAidlCallback callback, long id, long key) { + callbacks.put(id, new AidlCallbackParams(callback, key)); + } + + public static boolean removeAidlCallback (long id){ + return callbacks.remove(id) != null; + } + + public static Map getAidlCallbacks() { + return callbacks; + } + @Nullable private OsmandAidlApi getApi(String reason) { LOG.info("Request AIDL API for " + reason); @@ -720,10 +735,10 @@ public class OsmandAidlService extends Service { public long registerForUpdates(long updateTimeMS, IOsmAndAidlCallback callback) { try { if (updateTimeMS >= MIN_UPDATE_TIME_MS) { - updateCallbackId++; - callbacks.put(updateCallbackId, callback); - startRemoteUpdates(updateTimeMS, updateCallbackId, callback); - return updateCallbackId; + aidlCallbackId++; + addAidlCallback(callback, aidlCallbackId, KEY_ON_UPDATE); + startRemoteUpdates(updateTimeMS, aidlCallbackId, callback); + return aidlCallbackId; } else { return MIN_UPDATE_TIME_MS_ERROR; } @@ -736,7 +751,7 @@ public class OsmandAidlService extends Service { @Override public boolean unregisterFromUpdates(long callbackId) { try { - return callbacks.remove(callbackId) != null; + return removeAidlCallback(callbackId); } catch (Exception e) { handleException(e); return false; @@ -1000,9 +1015,18 @@ public class OsmandAidlService extends Service { @Override public long registerForNavigationUpdates(ANavigationUpdateParams params, final IOsmAndAidlCallback callback) { try { + aidlCallbackId++; OsmandAidlApi api = getApi("registerForNavUpdates"); - if (api != null) { - return api.registerForNavigationUpdates(params, callback); + if (api != null ) { + if (!params.isSubscribeToUpdates() && params.getCallbackId() != -1) { + removeAidlCallback(params.getCallbackId()); + return -1; + } else { + addAidlCallback(callback, aidlCallbackId, KEY_ON_NAV_DATA_UPDATE); + } + + api.registerForNavigationUpdates(); + return aidlCallbackId; } else { return -1; } @@ -1012,4 +1036,31 @@ public class OsmandAidlService extends Service { } } }; + + private static class AidlCallbackParams { + private IOsmAndAidlCallback callback; + private long key; + + AidlCallbackParams(IOsmAndAidlCallback callback, long key) { + this.callback = callback; + + this.key = key; + } + + public IOsmAndAidlCallback getCallback() { + return callback; + } + + public void setCallback(IOsmAndAidlCallback callback) { + this.callback = callback; + } + + public long getKey() { + return key; + } + + public void setKey(long key) { + this.key = key; + } + } } diff --git a/OsmAnd/src/net/osmand/plus/routing/IRoutingDataUpdateListener.java b/OsmAnd/src/net/osmand/plus/routing/IRoutingDataUpdateListener.java new file mode 100644 index 0000000000..c4fb23084e --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routing/IRoutingDataUpdateListener.java @@ -0,0 +1,5 @@ +package net.osmand.plus.routing; + +public interface IRoutingDataUpdateListener { + void onRoutingDataUpdate(); +} diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 71e03f02d4..0f84f947a9 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -39,7 +39,7 @@ public class RoutingHelper { private static final float POSITION_TOLERANCE = 60; private List> listeners = new LinkedList<>(); - + private List> updateListeners = new LinkedList<>(); private OsmandApplication app; private TransportRoutingHelper transportRoutingHelper; @@ -265,6 +265,10 @@ public class RoutingHelper { transportRoutingHelper.addListener(l); } + public void addDataUpdateListener(IRoutingDataUpdateListener listener) { + updateListeners.add(new WeakReference(listener)); + } + public boolean removeListener(IRouteInformationListener lt){ Iterator> it = listeners.iterator(); while(it.hasNext()) { @@ -502,9 +506,12 @@ public class RoutingHelper { route.updateCurrentRoute(newCurrentRoute + 1); currentRoute = newCurrentRoute + 1; app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION); - if (app.getAidlApi().isActiveListeners() && app.getAidlApi().navUpdateListener != null) { - app.getAidlApi().navUpdateListener.onNavUpdate(); + if (!updateListeners.isEmpty()) { + for (WeakReference ref : updateListeners) { + ref.get().onRoutingDataUpdate(); + } } + } else { break; } From 575e936d2ea832e7763f0648001caf1ab22d0351 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Mon, 15 Apr 2019 09:52:06 +0300 Subject: [PATCH 008/114] Navigation Update aidl method refactoring. --- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 17 ++++++++--------- .../src/net/osmand/aidl/OsmandAidlService.java | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index fa8e6480a3..c8f56080fe 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -45,7 +45,6 @@ import net.osmand.aidl.mapmarker.AMapMarker; import net.osmand.aidl.mapwidget.AMapWidget; import net.osmand.aidl.navdrawer.NavDrawerFooterParams; import net.osmand.aidl.navigation.ADirectionInfo; -import net.osmand.aidl.navigation.ANavigationUpdateParams; import net.osmand.aidl.plugins.PluginParams; import net.osmand.aidl.search.SearchResult; import net.osmand.aidl.tiles.ASqliteDbFile; @@ -124,6 +123,7 @@ import static net.osmand.aidl.OsmandAidlConstants.COPY_FILE_PART_SIZE_LIMIT_ERRO import static net.osmand.aidl.OsmandAidlConstants.COPY_FILE_UNSUPPORTED_FILE_TYPE_ERROR; import static net.osmand.aidl.OsmandAidlConstants.COPY_FILE_WRITE_LOCK_ERROR; import static net.osmand.aidl.OsmandAidlConstants.OK_RESPONSE; +import static net.osmand.aidl.OsmandAidlService.KEY_ON_NAV_DATA_UPDATE; import static net.osmand.plus.OsmAndCustomizationConstants.DRAWER_ITEM_ID_SCHEME; public class OsmandAidlApi { @@ -198,9 +198,6 @@ public class OsmandAidlApi { private boolean mapActivityActive = false; - private Map callbacks = new HashMap<>(); - private long updateCallbackId = 0; - public OsmandAidlApi(OsmandApplication app) { this.app = app; loadConnectedApps(); @@ -1945,11 +1942,13 @@ public class OsmandAidlApi { directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); } } - for (Entry cb : callbacks.entrySet()) { - try { - cb.getValue().updateNavigationInfo(directionInfo); - } catch (Exception e) { - LOG.debug(e.getMessage(), e); + for (Entry cb : OsmandAidlService.getAidlCallbacks().entrySet()) { + if (cb.getValue().getKey() == KEY_ON_NAV_DATA_UPDATE) { //add bitwise check instead + try { + cb.getValue().getCallback().updateNavigationInfo(directionInfo); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } } } } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index ddcce504ae..8165a9b932 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -1037,7 +1037,7 @@ public class OsmandAidlService extends Service { } }; - private static class AidlCallbackParams { + public static class AidlCallbackParams { private IOsmAndAidlCallback callback; private long key; From f7f6dec1b3dba9e97c41af5002f502bf6962ae64 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Mon, 15 Apr 2019 11:27:53 +0300 Subject: [PATCH 009/114] changes to aidl nav update method. need testing. --- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 2 +- OsmAnd/src/net/osmand/aidl/OsmandAidlService.java | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index c8f56080fe..8777f9a91e 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -1943,7 +1943,7 @@ public class OsmandAidlApi { } } for (Entry cb : OsmandAidlService.getAidlCallbacks().entrySet()) { - if (cb.getValue().getKey() == KEY_ON_NAV_DATA_UPDATE) { //add bitwise check instead + if ((cb.getValue().getKey() & KEY_ON_NAV_DATA_UPDATE) > 0) { try { cb.getValue().getCallback().updateNavigationInfo(directionInfo); } catch (Exception e) { diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index 8165a9b932..832bb281b2 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -89,11 +89,8 @@ public class OsmandAidlService extends Service { private static final String DATA_KEY_RESULT_SET = "resultSet"; - public static final int KEY_ON_SEARCH_COMPLETE = 1; - public static final int KEY_ON_UPDATE = 2; - public static final int KEY_ON_APP_INIT = 3; - public static final int KEY_ON_GPX_BMP_CREATED = 4; - public static final int KEY_ON_NAV_DATA_UPDATE = 5; + public static final int KEY_ON_UPDATE = 1; + public static final int KEY_ON_NAV_DATA_UPDATE = 2; private static Map callbacks; private Handler mHandler = null; From b1e236bdad71aabfc14b945b66903c83a10053b8 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Wed, 17 Apr 2019 10:36:16 +0300 Subject: [PATCH 010/114] pr changes - removed static method, add callback to aidl service, fixed concurrency issue to RouteHelper, add types to params in javadoc --- .../net/osmand/aidl/AidlCallbackListener.java | 9 + .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 368 +++++++++--------- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 34 +- .../net/osmand/aidl/OsmandAidlService.java | 62 +-- .../osmand/plus/routing/RoutingHelper.java | 26 +- 5 files changed, 279 insertions(+), 220 deletions(-) create mode 100644 OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java diff --git a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java new file mode 100644 index 0000000000..82556a7e59 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java @@ -0,0 +1,9 @@ +package net.osmand.aidl; + +import java.util.Map; + +public interface AidlCallbackListener{ + void addAidlCallback(IOsmAndAidlCallback callback, int key); + boolean removeAidlCallback(long id); + Map getAidlCallbacks(); +} diff --git a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl index 5f5a01ad88..1ac8569bfc 100644 --- a/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl +++ b/OsmAnd/src/net/osmand/aidl/IOsmAndAidlInterface.aidl @@ -91,30 +91,30 @@ interface IOsmAndAidlInterface { /** * Add map marker at given location. * - * @param lat - latitude. - * @param lon - longitude. - * @param name - name. + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String)- name of marker. */ boolean addMapMarker(in AddMapMarkerParams params); /** - * Remove map marker at given location with name. + * Add map marker at given location. * - * @param lat - latitude. - * @param lon - longitude. - * @param name - name. + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String)- name of marker. */ boolean removeMapMarker(in RemoveMapMarkerParams params); /** * Update map marker at given location with name. * - * @param latPrev - latitude (current marker). - * @param lonPrev - longitude (current marker). - * @param namePrev - name (current marker). - * @param latNew - latitude (new marker). - * @param lonNew - longitude (new marker). - * @param nameNew - name (new marker). + * @param latPrev (double) - latitude (current marker). + * @param lonPrev (double) - longitude (current marker). + * @param namePrev (String) - name (current marker). + * @param latNew (double) - latitude (new marker). + * @param lonNew (double) - longitude (new marker). + * @param nameNew (String) - name (new marker). */ boolean updateMapMarker(in UpdateMapMarkerParams params); @@ -122,22 +122,22 @@ interface IOsmAndAidlInterface { * Add map widget to the right side of the main screen. * Note: any specified icon should exist in OsmAnd app resources. * - * @param id - widget id. - * @param menuIconName - icon name (configure map menu). - * @param menuTitle - widget name (configure map menu). - * @param lightIconName - icon name for the light theme (widget). - * @param darkIconName - icon name for the dark theme (widget). - * @param text - main widget text. - * @param description - sub text, like "km/h". - * @param order - order position in the widgets list. - * @param intentOnClick - onClick intent. Called after click on widget as startActivity(Intent intent). + * @param id (String) - widget id. + * @param menuIconName (String) - icon name (configure map menu). + * @param menuTitle (String) - widget name (configure map menu). + * @param lightIconName (String) - icon name for the light theme (widget). + * @param darkIconName (String) - icon name for the dark theme (widget). + * @param text (String) - main widget text. + * @param description (String) - sub text, like "km/h". + * @param order (int) - order position in the widgets list. + * @param intentOnClick (String) - onClick intent. Called after click on widget as startActivity(Intent intent). */ boolean addMapWidget(in AddMapWidgetParams params); /** * Remove map widget. * - * @param id - widget id. + * @param (String) id - widget id. */ boolean removeMapWidget(in RemoveMapWidgetParams params); @@ -145,30 +145,30 @@ interface IOsmAndAidlInterface { * Update map widget. * Note: any specified icon should exist in OsmAnd app resources. * - * @param id - widget id. - * @param menuIconName - icon name (configure map menu). - * @param menuTitle - widget name (configure map menu). - * @param lightIconName - icon name for the light theme (widget). - * @param darkIconName - icon name for the dark theme (widget). - * @param text - main widget text. - * @param description - sub text, like "km/h". - * @param order - order position in the widgets list. - * @param intentOnClick - onClick intent. Called after click on widget as startActivity(Intent intent). + * @param id (String) - widget id. + * @param menuIconName (String) - icon name (configure map menu). + * @param menuTitle (String) - widget name (configure map menu). + * @param lightIconName (String) - icon name for the light theme (widget). + * @param darkIconName (String) - icon name for the dark theme (widget). + * @param text (String) - main widget text. + * @param description (String) - sub text, like "km/h". + * @param order (int) - order position in the widgets list. + * @param intentOnClick (String) - onClick intent. Called after click on widget as startActivity(Intent intent). */ boolean updateMapWidget(in UpdateMapWidgetParams params); /** * Add point to user layer. * - * @param layerId - layer id. Note: layer should be added first. - * @param pointId - point id. - * @param shortName - short name (single char). Displayed on the map. - * @param fullName - full name. Displayed in the context menu on first row. - * @param typeName - type name. Displayed in context menu on second row. - * @param color - color of circle's background. - * @param location - location of the point. - * @param details - list of details. Displayed under context menu. - * @param params - optional map of params for point. + * @param layerId (String) - layer id. Note: layer should be added first. + * @param pointId (String) - point id. + * @param shortName (String) - short name (single char). Displayed on the map. + * @param fullName (String) - full name. Displayed in the context menu on first row. + * @param typeName (String) - type name. Displayed in context menu on second row. + * @param color (int) - color of circle's background. + * @param location (ALatLon) - location of the point. + * @param details (List)- list of details. Displayed under context menu. + * @param params (Map) - optional map of params for point. */ boolean addMapPoint(in AddMapPointParams params); @@ -176,79 +176,79 @@ interface IOsmAndAidlInterface { /** * Remove point. * - * @param layerId - layer id. - * @param pointId - point id. + * @param layerId (String) - layer id. + * @param pointId (String) - point id. */ boolean removeMapPoint(in RemoveMapPointParams params); /** * Update point. * - * @param layerId - layer id. - * @param pointId - point id. - * @param shortName - short name (single char). Displayed on the map. - * @param fullName - full name. Displayed in the context menu on first row. - * @param typeName - type name. Displayed in context menu on second row. - * @param color - color of circle's background. - * @param location - location of the point. - * @param details - list of details. Displayed under context menu. - * @param params - optional map of params for point. + * @param layerId (String) - layer id. + * @param pointId (String) - point id. + * @param shortName (String) - short name (single char). Displayed on the map. + * @param fullName (String) - full name. Displayed in the context menu on first row. + * @param typeName (String) - type name. Displayed in context menu on second row. + * @param color (String) - color of circle's background. + * @param location (ALatLon)- location of the point. + * @param details (List) - list of details. Displayed under context menu. + * @param params (Map) - optional map of params for point. */ boolean updateMapPoint(in UpdateMapPointParams params); /** * Add user layer on the map. * - * @param id - layer id. - * @param name - layer name. - * @param zOrder - z-order position of layer. Default value is 5.5f - * @param points - initial list of points. Nullable. - * @param imagePoints - use new style for points on map or not. Also default zoom bounds for new style can be edited. + * @param id (String) - layer id. + * @param name (String) - layer name. + * @param zOrder (float) - z-order position of layer. Default value is 5.5f + * @param points Map - initial list of points. Nullable. + * @param imagePoints (boolean) - use new style for points on map or not. Also default zoom bounds for new style can be edited. */ boolean addMapLayer(in AddMapLayerParams params); /** * Remove user layer. * - * @param id - layer id. + * @param id (String) - layer id. */ boolean removeMapLayer(in RemoveMapLayerParams params); /** * Update user layer. * - * @param id - layer id. - * @param name - layer name. - * @param zOrder - z-order position of layer. Default value is 5.5f - * @param points - list of points. Nullable. - * @param imagePoints - use new style for points on map or not. Also default zoom bounds for new style can be edited. + * @param id (String) - layer id. + * @param name (String) - layer name. + * @param zOrder (float) - z-order position of layer. Default value is 5.5f + * @param points Map - list of points. Nullable. + * @param imagePoints (boolean) - use new style for points on map or not. Also default zoom bounds for new style can be edited. */ boolean updateMapLayer(in UpdateMapLayerParams params); /** * Import GPX file to OsmAnd (from URI or file). * - * @param gpxUri - URI created by FileProvider (preferable method). - * @param file - File which represents GPX track (not recomended, OsmAnd should have rights to access file location). - * @param fileName - Destination file name. May contain dirs. - * @param color - color of gpx. Can be one of: "red", "orange", "lightblue", "blue", "purple", + * @param gpxUri (Uri) - URI created by FileProvider (preferable method). + * @param file (File) - File which represents GPX track (not recomended, OsmAnd should have rights to access file location). + * @param fileName (String) - Destination file name. May contain dirs. + * @param color (String) - color of gpx. Can be one of: "red", "orange", "lightblue", "blue", "purple", * "translucent_red", "translucent_orange", "translucent_lightblue", * "translucent_blue", "translucent_purple" - * @param show - show track on the map after import + * @param show (boolean) - show track on the map after import */ boolean importGpx(in ImportGpxParams params); /** * Show GPX file on map. * - * @param fileName - file name to show. Must be imported first. + * @param fileName (String) - file name to show. Must be imported first. */ boolean showGpx(in ShowGpxParams params); /** * Hide GPX file. * - * @param fileName - file name to hide. + * @param fileName (String) - file name to hide. */ boolean hideGpx(in HideGpxParams params); @@ -262,10 +262,10 @@ interface IOsmAndAidlInterface { /** * Set map view to current location. * - * @param latitude - latitude of new map center. - * @param longitude - longitude of new map center. - * @param zoom - map zoom level. Set 0 to keep zoom unchanged. - * @param animated - set true to animate changes. + * @param latitude (double) - latitude of new map center. + * @param longitude (double) - longitude of new map center. + * @param zoom (float) - map zoom level. Set 0 to keep zoom unchanged. + * @param animated (boolean) - set true to animate changes. */ boolean setMapLocation(in SetMapLocationParams params); @@ -280,73 +280,73 @@ interface IOsmAndAidlInterface { /** * Add favorite group with given params. * - * @param name - group name. - * @param color - group color. Can be one of: "red", "orange", "yellow", + * @param name (String) - group name. + * @param color (String) - group color. Can be one of: "red", "orange", "yellow", * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". - * @param visible - group visibility. + * @param visible (boolean) - group visibility. */ boolean addFavoriteGroup(in AddFavoriteGroupParams params); /** * Update favorite group with given params. * - * @param namePrev - group name (current). - * @param colorPrev - group color (current). - * @param visiblePrev - group visibility (current). - * @param nameNew - group name (new). - * @param colorNew - group color (new). - * @param visibleNew - group visibility (new). + * @param namePrev (String) - group name (current). + * @param colorPrev (String) - group color (current). + * @param visiblePrev (boolean) - group visibility (current). + * @param nameNew (String) - group name (new). + * @param colorNew (String) - group color (new). + * @param visibleNew (boolean) - group visibility (new). */ boolean removeFavoriteGroup(in RemoveFavoriteGroupParams params); /** * Remove favorite group with given name. * - * @param name - name of favorite group. + * @param name (String) - name of favorite group. */ boolean updateFavoriteGroup(in UpdateFavoriteGroupParams params); /** * Add favorite at given location with given params. * - * @param lat - latitude. - * @param lon - longitude. - * @param name - name of favorite item. - * @param description - description of favorite item. - * @param category - category of favorite item. - * @param color - color of favorite item. Can be one of: "red", "orange", "yellow", + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String) - name of favorite item. + * @param description (String) - description of favorite item. + * @param category (String) - category of favorite item. + * @param color (String) - color of favorite item. Can be one of: "red", "orange", "yellow", * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". - * @param visible - should favorite item be visible after creation. + * @param visible (boolean) - should favorite item be visible after creation. */ boolean addFavorite(in AddFavoriteParams params); /** * Update favorite at given location with given params. * - * @param latPrev - latitude (current favorite). - * @param lonPrev - longitude (current favorite). - * @param namePrev - name of favorite item (current favorite). - * @param categoryPrev - category of favorite item (current favorite). - * @param latNew - latitude (new favorite). - * @param lonNew - longitude (new favorite). - * @param nameNew - name of favorite item (new favorite). - * @param descriptionNew - description of favorite item (new favorite). - * @param categoryNew - category of favorite item (new favorite). Use only to create a new category, + * @param latPrev (double) - latitude (current favorite). + * @param lonPrev (double) - longitude (current favorite). + * @param namePrev (String) - name of favorite item (current favorite). + * @param categoryPrev (String) - category of favorite item (current favorite). + * @param latNew (double) - latitude (new favorite). + * @param lonNew (double) - longitude (new favorite). + * @param nameNew (String) - name of favorite item (new favorite). + * @param descriptionNew (String) - description of favorite item (new favorite). + * @param categoryNew (String) - category of favorite item (new favorite). Use only to create a new category, * not to update an existing one. If you want to update an existing category, * use the {@link #updateFavoriteGroup(String, String, boolean, String, String, boolean)} method. - * @param colorNew - color of new category. Can be one of: "red", "orange", "yellow", + * @param colorNew (String) - color of new category. Can be one of: "red", "orange", "yellow", * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". - * @param visibleNew - should new category be visible after creation. + * @param visibleNew (boolean) - should new category be visible after creation. */ boolean removeFavorite(in RemoveFavoriteParams params); /** * Remove favorite at given location with given params. * - * @param lat - latitude. - * @param lon - longitude. - * @param name - name of favorite item. - * @param category - category of favorite item. + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String) - name of favorite item. + * @param category (String) - category of favorite item. */ boolean updateFavorite(in UpdateFavoriteParams params); @@ -363,24 +363,24 @@ interface IOsmAndAidlInterface { /** * Take photo note. * - * @param lat - latutude of photo note. - * @param lon - longitude of photo note. + * @param lat (double) - latutude of photo note. + * @param lon (double) - longitude of photo note. */ boolean takePhotoNote(in TakePhotoNoteParams params); /** * Start video note recording. * - * @param lat - latutude of video note point. - * @param lon - longitude of video note point. + * @param lat (double) - latutude of video note point. + * @param lon (double) - longitude of video note point. */ boolean startVideoRecording(in StartVideoRecordingParams params); /** * Start audio note recording. * - * @param lat - latutude of audio note point. - * @param lon - longitude of audio note point. + * @param lat (double) - latutude of audio note point. + * @param lon (double) - longitude of audio note point. */ boolean startAudioRecording(in StartAudioRecordingParams params); @@ -392,29 +392,29 @@ interface IOsmAndAidlInterface { /** * Start navigation. * - * @param startName - name of the start point as it displays in OsmAnd's UI. Nullable. - * @param startLat - latitude of the start point. If 0 - current location is used. - * @param startLon - longitude of the start point. If 0 - current location is used. - * @param destName - name of the start point as it displays in OsmAnd's UI. - * @param destLat - latitude of a destination point. - * @param destLon - longitude of a destination point. - * @param profile - One of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). - * @param force - ask to stop current navigation if any. False - ask. True - don't ask. + * @param startName (String) - name of the start point as it displays in OsmAnd's UI. Nullable. + * @param startLat (double) - latitude of the start point. If 0 - current location is used. + * @param startLon (double) - longitude of the start point. If 0 - current location is used. + * @param destName (String) - name of the start point as it displays in OsmAnd's UI. + * @param destLat (double) - latitude of a destination point. + * @param destLon (double) - longitude of a destination point. + * @param profile (String) - One of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). + * @param force (boolean) - ask to stop current navigation if any. False - ask. True - don't ask. */ boolean navigate(in NavigateParams params); /** * Start navigation using gpx file. User need to grant Uri permission to OsmAnd. * - * @param gpxUri - URI created by FileProvider. - * @param force - ask to stop current navigation if any. False - ask. True - don't ask. + * @param gpxUri (Uri) - URI created by FileProvider. + * @param force (boolean) - ask to stop current navigation if any. False - ask. True - don't ask. */ boolean navigateGpx(in NavigateGpxParams params); /** * Remove GPX file. * - * @param fileName - file name to remove; + * @param fileName (String) - file name to remove; */ boolean removeGpx(in RemoveGpxParams params); @@ -422,15 +422,15 @@ interface IOsmAndAidlInterface { /** * Show AMapPoint on map in OsmAnd. * - * @param layerId - layer id. Note: layer should be added first. - * @param pointId - point id. - * @param shortName - short name (single char). Displayed on the map. - * @param fullName - full name. Displayed in the context menu on first row. - * @param typeName - type name. Displayed in context menu on second row. - * @param color - color of circle's background. - * @param location - location of the point. - * @param details - list of details. Displayed under context menu. - * @param params - optional map of params for point. + * @param layerId (String) - layer id. Note: layer should be added first. + * @param pointId (String) - point id. + * @param shortName (String) - short name (single char). Displayed on the map. + * @param fullName (String) - full name. Displayed in the context menu on first row. + * @param typeName (String) - type name. Displayed in context menu on second row. + * @param color (int) - color of circle's background. + * @param location (ALatLon) - location of the point. + * @param details List - list of details. Displayed under context menu. + * @param params Map - optional map of params for point. */ boolean showMapPoint(in ShowMapPointParams params); @@ -474,46 +474,46 @@ interface IOsmAndAidlInterface { /** * Run search for POI / Address. * - * @param searchQuery - search query string. - * @param searchType - type of search. Values: + * @param searchQuery (String) - search query string. + * @param searchType (int) - type of search. Values: * SearchParams.SEARCH_TYPE_ALL - all kind of search * SearchParams.SEARCH_TYPE_POI - POIs only * SearchParams.SEARCH_TYPE_ADDRESS - addresses only * - * @param latitude - latitude of original search location. - * @param longitude - longitude of original search location. - * @param radiusLevel - value from 1 to 7. Default value = 1. - * @param totalLimit - limit of returned search result rows. Default value = -1 (unlimited). + * @param latitude (double) - latitude of original search location. + * @param longitude (double) - longitude of original search location. + * @param radiusLevel (int) - value from 1 to 7. Default value = 1. + * @param totalLimit (int) - limit of returned search result rows. Default value = -1 (unlimited). */ boolean search(in SearchParams params, IOsmAndAidlCallback callback); /** * Do search and start navigation. * - * @param startName - name of the start point as it displays in OsmAnd's UI. Nullable. - * @param startLat - latitude of the start point. If 0 - current location is used. - * @param startLon - longitude of the start point. If 0 - current location is used. - * @param searchQuery - Text of a query for searching a destination point. Sent as URI parameter. - * @param searchLat - original location of search (latitude). Sent as URI parameter. - * @param searchLon - original location of search (longitude). Sent as URI parameter. - * @param profile - one of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). - * @param force - ask to stop current navigation if any. False - ask. True - don't ask. + * @param startName (String) - name of the start point as it displays in OsmAnd's UI. Nullable. + * @param startLat (double) - latitude of the start point. If 0 - current location is used. + * @param startLon (double) - longitude of the start point. If 0 - current location is used. + * @param searchQuery (String) - Text of a query for searching a destination point. Sent as URI parameter. + * @param searchLat (double) - original location of search (latitude). Sent as URI parameter. + * @param searchLon (double) - original location of search (longitude). Sent as URI parameter. + * @param profile (String) - one of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). + * @param force (boolean) - ask to stop current navigation if any. False - ask. True - don't ask. */ boolean navigateSearch(in NavigateSearchParams params); /** * Method to register for periodical callbacks from OsmAnd * - * @param updateTimeMS - period of time in millisecond after which callback is triggered - * @param callback - create and provide instance of {@link IOsmAndAidlCallback} interface - * @return id of callback in OsmAnd. Needed to unsubscribe from updates. + * @param updateTimeMS (long)- period of time in millisecond after which callback is triggered + * @param callback (IOsmAndCallback)- create and provide instance of {@link IOsmAndAidlCallback} interface + * @return id (long) - id of callback in OsmAnd. Needed to unsubscribe from updates. */ long registerForUpdates(in long updateTimeMS, IOsmAndAidlCallback callback); /** * Method to unregister from periodical callbacks from OsmAnd * - * @param callbackId - id of registered callback (provided by OsmAnd + * @param callbackId (long)- id of registered callback (provided by OsmAnd * in {@link OsmAndAidlHelper#registerForUpdates(long, IOsmAndAidlCallback)}) */ boolean unregisterFromUpdates(in long callbackId); @@ -521,7 +521,7 @@ interface IOsmAndAidlInterface { /** * Method for adding image to the top of Osmand's NavDrawer. * - * @param imageUri - image's URI.toString + * @param imageUri (String)- image's URI.toString * * @deprecated * Use the {@link #setNavDrawerLogoWithParams(NavDrawerHeaderParams params)} method. @@ -531,35 +531,35 @@ interface IOsmAndAidlInterface { /** * Method for selected UI elements (like QuickSearch button) to show. * - * @param ids - list of menu items keys from {@link OsmAndCustomizationConstants} + * @param ids (List)- list of menu items keys from {@link OsmAndCustomizationConstants} */ boolean setEnabledIds(in List ids); /** * Method for selected UI elements (like QuickSearch button) to hide. * - * @param ids - list of menu items keys from {@link OsmAndCustomizationConstants} + * @param ids (List)- list of menu items keys from {@link OsmAndCustomizationConstants} */ boolean setDisabledIds(in List ids); /** * Method to show selected NavDrawer's menu items. * - * @param patterns - list of menu items names from {@link OsmAndCustomizationConstants} + * @param patterns (List) - list of menu items names from {@link OsmAndCustomizationConstants} */ boolean setEnabledPatterns(in List patterns); /** * Method to hide selected NavDrawer's menu items. * - * @param patterns - list of menu items names from {@link OsmAndCustomizationConstants} + * @param patterns (List)- list of menu items names from {@link OsmAndCustomizationConstants} */ boolean setDisabledPatterns(in List patterns); /** * Register OsmAnd widgets for visibility. * - * @param widgetKey - widget id. + * @param widgetKey ()- widget id. * @param appModKeys - list of OsmAnd Application modes widget active with. Could be "null" for all modes. */ boolean regWidgetVisibility(in SetWidgetsParams params); @@ -567,16 +567,16 @@ interface IOsmAndAidlInterface { /** * Register OsmAnd widgets for availability. * - * @param widgetKey - widget id. - * @param appModKeys - ist of OsmAnd Application modes widget active with. Could be "null" for all modes. + * @param widgetKey (String) - widget id. + * @param appModKeys (List)- ist of OsmAnd Application modes widget active with. Could be "null" for all modes. */ boolean regWidgetAvailability(in SetWidgetsParams params); /** * Add custom parameters for OsmAnd settings to associate with client app. * - * @param sharedPreferencesName - string with name of clint's app for shared preferences key - * @param bundle - bundle with keys from Settings IDs {@link OsmAndCustomizationConstants} and Settings params + * @param sharedPreferencesName (String)- string with name of clint's app for shared preferences key + * @param bundle (Bundle)- bundle with keys from Settings IDs {@link OsmAndCustomizationConstants} and Settings params */ boolean customizeOsmandSettings(in OsmandSettingsParams params); @@ -604,23 +604,23 @@ interface IOsmAndAidlInterface { /** * Method to show selected sqlitedb file as map overlay. * - * @param fileName - name of sqlitedb file + * @param fileName (String) - name of sqlitedb file */ boolean showSqliteDbFile(String fileName); /** * Method to hide sqlitedb file from map overlay. * - * @param fileName - name of sqlitedb file + * @param fileName (String) - name of sqlitedb file */ boolean hideSqliteDbFile(String fileName); /** * Method for adding image to the top of OsmAnd's NavDrawer with additional params * - * @param imageUri - image's URI.toString - * @param packageName - client's app package name - * @param intent - intent for additional functionality on image click + * @param imageUri (String) - image's URI.toString + * @param packageName (String) - client's app package name + * @param intent (String) - intent for additional functionality on image click * */ boolean setNavDrawerLogoWithParams(in NavDrawerHeaderParams params); @@ -629,9 +629,9 @@ interface IOsmAndAidlInterface { * Method for adding functionality to "Powered by Osmand" logo in NavDrawer's footer * (reset OsmAnd settings to pre-clinet app's state) * - * @param packageName - package name - * @param intent - intent - * @param appName - client's app name + * @param packageName (String) - package name + * @param intent (String) - intent + * @param appName (String) - client's app name */ boolean setNavDrawerFooterWithParams(in NavDrawerFooterParams params); @@ -644,14 +644,14 @@ interface IOsmAndAidlInterface { /** * Method to change state of plug-ins in OsmAnd. * - * @param pluginId - id (name) of plugin. - * @param newState - new state (0 - off, 1 - on). + * @param pluginId (String) - id (name) of plugin. + * @param newState (int) - new state (0 - off, 1 - on). */ boolean changePluginState(in PluginParams params); /** * Method to register for callback on OsmAnd initialization - * @param callback - create and provide instance of {@link IOsmAndAidlCallback} interface + * @param callback (IOsmAndAidlCallback) - create and provide instance of {@link IOsmAndAidlCallback} interface */ boolean registerForOsmandInitListener(in IOsmAndAidlCallback callback); @@ -661,12 +661,12 @@ interface IOsmAndAidlInterface { * to manually download appropriate map in OsmAnd or background will be empty. * Bitmap will be returned through callback {@link IOsmAndAidlCallback#onGpxBitmapCreated(AGpxBitmap)} * - * @param gpxUri - Uri for gpx file - * @param density - image density. Recommended to use default metrics for device's display. - * @param widthPixels - width of bitmap - * @param heightPixels - height of bitmap - * @param color - color in ARGB format - * @param callback - instance of callback from OsmAnd. + * @param gpxUri (Uri/File) - Uri for gpx file + * @param density (float) - image density. Recommended to use default metrics for device's display. + * @param widthPixels (int) - width of bitmap + * @param heightPixels (int) - height of bitmap + * @param color (int) - color in ARGB format + * @param callback (IOsmAndAidlCallback) - instance of callback from OsmAnd. */ boolean getBitmapForGpx(in CreateGpxBitmapParams file, IOsmAndAidlCallback callback); @@ -674,10 +674,10 @@ interface IOsmAndAidlInterface { * Method to copy files to OsmAnd part by part. For now supports only sqlitedb format. * Part size (bytearray) should not exceed 256k. * - * @param copyPart.fileName - name of file - * @param copyPart.filePartData - parts of file, byte[] with size 256k or less. - * @param copyPart.startTime - timestamp of copying start. - * @param copyPart.isDone - boolean to mark end of copying. + * @param fileName (String) - name of file + * @param filePartData (byte[]) - parts of file, byte[] with size 256k or less. + * @param startTime (long) - timestamp of copying start. + * @param isDone (boolean) - boolean to mark end of copying. * @return number of last successfully received file part or error(-1). */ int copyFile(in CopyFileParams filePart); @@ -686,9 +686,9 @@ interface IOsmAndAidlInterface { /** * Method to register for updates during navgation. Notifies user about distance to the next turn and its type. * - * @params params.subscribeToUpdates - boolean flag to subscribe or unsubscribe from updates - * @params params.callbackId - id of callback, needed to unsubscribe from updates - * @params callback - callback to notify user on navigation data change + * @params subscribeToUpdates (boolean) - boolean flag to subscribe or unsubscribe from updates + * @params callbackId (long) - id of callback, needed to unsubscribe from updates + * @params callback (IOsmAndAidlCallback) - callback to notify user on navigation data change */ long registerForNavigationUpdates(in ANavigationUpdateParams params, IOsmAndAidlCallback callback); } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index 8777f9a91e..f51e292677 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -127,6 +127,9 @@ import static net.osmand.aidl.OsmandAidlService.KEY_ON_NAV_DATA_UPDATE; import static net.osmand.plus.OsmAndCustomizationConstants.DRAWER_ITEM_ID_SCHEME; public class OsmandAidlApi { + + AidlCallbackListener aidlCallbackListener = null; + private static final Log LOG = PlatformUtil.getLog(OsmandAidlApi.class); private static final String AIDL_REFRESH_MAP = "aidl_refresh_map"; private static final String AIDL_SET_MAP_LOCATION = "aidl_set_map_location"; @@ -1925,10 +1928,12 @@ public class OsmandAidlApi { return app.getAppCustomization().changePluginStatus(params); } - public void registerForNavigationUpdates() { + private Map navUpdateCallbacks = new ConcurrentHashMap<>(); + + void registerForNavigationUpdates(long id) { final ADirectionInfo directionInfo = new ADirectionInfo(-1, -1, false); final NextDirectionInfo baseNdi = new NextDirectionInfo(); - app.getRoutingHelper().addDataUpdateListener(new IRoutingDataUpdateListener(){ + IRoutingDataUpdateListener listener = new IRoutingDataUpdateListener() { @Override public void onRoutingDataUpdate() { RoutingHelper rh = app.getRoutingHelper(); @@ -1942,19 +1947,29 @@ public class OsmandAidlApi { directionInfo.setTurnType(ndi.directionInfo.getTurnType().getValue()); } } - for (Entry cb : OsmandAidlService.getAidlCallbacks().entrySet()) { - if ((cb.getValue().getKey() & KEY_ON_NAV_DATA_UPDATE) > 0) { - try { - cb.getValue().getCallback().updateNavigationInfo(directionInfo); - } catch (Exception e) { - LOG.debug(e.getMessage(), e); + if (aidlCallbackListener != null) { + for (OsmandAidlService.AidlCallbackParams cb : aidlCallbackListener.getAidlCallbacks().values()) { + if (!aidlCallbackListener.getAidlCallbacks().isEmpty() && (cb.getKey() & KEY_ON_NAV_DATA_UPDATE) > 0) { + try { + cb.getCallback().updateNavigationInfo(directionInfo); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } } } } } - }); + }; + navUpdateCallbacks.put(id, listener); + app.getRoutingHelper().addDataUpdateListener(listener); } + public void unregisterFromUpdates(long id) { + app.getRoutingHelper().removeDataUpdateListener(navUpdateCallbacks.get(id)); + navUpdateCallbacks.remove(id); + } + + boolean getBitmapForGpx(final Uri gpxUri, final float density, final int widthPixels, final int heightPixels, final int color, final GpxBitmapCreatedCallback callback) { if (gpxUri == null || callback == null) { @@ -2014,6 +2029,7 @@ public class OsmandAidlApi { private Map copyFilesCache = new ConcurrentHashMap<>(); + private class FileCopyInfo { long startTime; long lastAccessTime; diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index 832bb281b2..c31d68fcf1 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -10,6 +10,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; +import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import net.osmand.PlatformUtil; import net.osmand.aidl.OsmandAidlApi.GpxBitmapCreatedCallback; @@ -83,7 +84,7 @@ import static net.osmand.aidl.OsmandAidlConstants.MIN_UPDATE_TIME_MS; import static net.osmand.aidl.OsmandAidlConstants.MIN_UPDATE_TIME_MS_ERROR; import static net.osmand.aidl.OsmandAidlConstants.UNKNOWN_API_ERROR; -public class OsmandAidlService extends Service { +public class OsmandAidlService extends Service implements AidlCallbackListener { private static final Log LOG = PlatformUtil.getLog(OsmandAidlService.class); @@ -92,28 +93,16 @@ public class OsmandAidlService extends Service { public static final int KEY_ON_UPDATE = 1; public static final int KEY_ON_NAV_DATA_UPDATE = 2; - private static Map callbacks; + private Map callbacks = new ConcurrentHashMap<>(); private Handler mHandler = null; HandlerThread mHandlerThread = new HandlerThread("OsmAndAidlServiceThread"); - private static long aidlCallbackId = 0; + private long aidlCallbackId = 0; private OsmandApplication getApp() { return (OsmandApplication) getApplication(); } - public static void addAidlCallback(IOsmAndAidlCallback callback, long id, long key) { - callbacks.put(id, new AidlCallbackParams(callback, key)); - } - - public static boolean removeAidlCallback (long id){ - return callbacks.remove(id) != null; - } - - public static Map getAidlCallbacks() { - return callbacks; - } - @Nullable private OsmandAidlApi getApi(String reason) { LOG.info("Request AIDL API for " + reason); @@ -137,7 +126,11 @@ public class OsmandAidlService extends Service { @Override public void onCreate() { super.onCreate(); - callbacks = new ConcurrentHashMap<>(); + OsmandAidlApi api = getApi("setting_listener"); + if(api != null) { + LOG.debug("aidl api not null!"); + api.aidlCallbackListener = this; + } } @Override @@ -147,6 +140,29 @@ public class OsmandAidlService extends Service { callbacks.clear(); } + + @Override + public void addAidlCallback(IOsmAndAidlCallback callback, int key) { + aidlCallbackId++; + callbacks.put(aidlCallbackId, new AidlCallbackParams(callback, key)); + } + + @Override + public boolean removeAidlCallback(long id) { + for (Long key : callbacks.keySet()) { + if (key == id) { + callbacks.remove(id); + return true; + } + } + return false; + } + + @Override + public Map getAidlCallbacks() { + return callbacks; + } + private final IOsmAndAidlInterface.Stub mBinder = new IOsmAndAidlInterface.Stub() { private void handleException(Exception e) { @@ -733,7 +749,7 @@ public class OsmandAidlService extends Service { try { if (updateTimeMS >= MIN_UPDATE_TIME_MS) { aidlCallbackId++; - addAidlCallback(callback, aidlCallbackId, KEY_ON_UPDATE); + addAidlCallback(callback, KEY_ON_UPDATE); startRemoteUpdates(updateTimeMS, aidlCallbackId, callback); return aidlCallbackId; } else { @@ -1012,18 +1028,17 @@ public class OsmandAidlService extends Service { @Override public long registerForNavigationUpdates(ANavigationUpdateParams params, final IOsmAndAidlCallback callback) { try { - aidlCallbackId++; OsmandAidlApi api = getApi("registerForNavUpdates"); if (api != null ) { if (!params.isSubscribeToUpdates() && params.getCallbackId() != -1) { + api.unregisterFromUpdates(params.getCallbackId()); removeAidlCallback(params.getCallbackId()); return -1; } else { - addAidlCallback(callback, aidlCallbackId, KEY_ON_NAV_DATA_UPDATE); + addAidlCallback(callback, KEY_ON_NAV_DATA_UPDATE); + api.registerForNavigationUpdates(aidlCallbackId); + return aidlCallbackId; } - - api.registerForNavigationUpdates(); - return aidlCallbackId; } else { return -1; } @@ -1034,6 +1049,7 @@ public class OsmandAidlService extends Service { } }; + public static class AidlCallbackParams { private IOsmAndAidlCallback callback; private long key; @@ -1060,4 +1076,6 @@ public class OsmandAidlService extends Service { this.key = key; } } + + } diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 0f84f947a9..7921b164a7 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -29,6 +29,7 @@ import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import static net.osmand.plus.notifications.OsmandNotification.NotificationType.NAVIGATION; @@ -38,8 +39,8 @@ public class RoutingHelper { private static final float POSITION_TOLERANCE = 60; - private List> listeners = new LinkedList<>(); - private List> updateListeners = new LinkedList<>(); + private List> listeners = new CopyOnWriteArrayList<>(); + private List> updateListeners = new CopyOnWriteArrayList<>(); private OsmandApplication app; private TransportRoutingHelper transportRoutingHelper; @@ -266,7 +267,20 @@ public class RoutingHelper { } public void addDataUpdateListener(IRoutingDataUpdateListener listener) { - updateListeners.add(new WeakReference(listener)); + updateListeners.add(new WeakReference<>(listener)); + } + + public boolean removeDataUpdateListener(IRoutingDataUpdateListener listener) { + Iterator> it = updateListeners.iterator(); + while(it.hasNext()) { + WeakReference wrl = it.next(); + IRoutingDataUpdateListener l = wrl.get(); + if(listener == l) { + it.remove(); + return true; + } + } + return false; } public boolean removeListener(IRouteInformationListener lt){ @@ -274,7 +288,7 @@ public class RoutingHelper { while(it.hasNext()) { WeakReference ref = it.next(); IRouteInformationListener l = ref.get(); - if(l == null || lt == l) { + if(l == lt) { it.remove(); return true; } @@ -508,7 +522,9 @@ public class RoutingHelper { app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION); if (!updateListeners.isEmpty()) { for (WeakReference ref : updateListeners) { - ref.get().onRoutingDataUpdate(); + if (ref.get() != null) { + ref.get().onRoutingDataUpdate(); + } } } From a8f6aadcc2a9766a8c3a78c004f137c74cdbfb39 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Wed, 17 Apr 2019 11:36:09 +0300 Subject: [PATCH 011/114] fix old method' id incrementation --- OsmAnd/src/net/osmand/aidl/OsmandAidlService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index c31d68fcf1..c8a530746c 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -748,7 +748,6 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { public long registerForUpdates(long updateTimeMS, IOsmAndAidlCallback callback) { try { if (updateTimeMS >= MIN_UPDATE_TIME_MS) { - aidlCallbackId++; addAidlCallback(callback, KEY_ON_UPDATE); startRemoteUpdates(updateTimeMS, aidlCallbackId, callback); return aidlCallbackId; From 6df0ffe005584bf1ff0a082b598d7845359e1b43 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Wed, 17 Apr 2019 17:45:22 +0300 Subject: [PATCH 012/114] fixed concurrency issues --- .../net/osmand/aidl/AidlCallbackListener.java | 2 +- .../net/osmand/aidl/OsmandAidlService.java | 36 ++++++++++++------- .../osmand/plus/routing/RoutingHelper.java | 31 ++++++++-------- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java index 82556a7e59..95d958fb39 100644 --- a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java +++ b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java @@ -3,7 +3,7 @@ package net.osmand.aidl; import java.util.Map; public interface AidlCallbackListener{ - void addAidlCallback(IOsmAndAidlCallback callback, int key); + long addAidlCallback(IOsmAndAidlCallback callback, int key); boolean removeAidlCallback(long id); Map getAidlCallbacks(); } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index c8a530746c..f70bbc76d3 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -78,6 +78,7 @@ import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; import static net.osmand.aidl.OsmandAidlConstants.CANNOT_ACCESS_API_ERROR; import static net.osmand.aidl.OsmandAidlConstants.MIN_UPDATE_TIME_MS; @@ -97,7 +98,7 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { private Handler mHandler = null; HandlerThread mHandlerThread = new HandlerThread("OsmAndAidlServiceThread"); - private long aidlCallbackId = 0; + private final AtomicLong aidlCallbackId = new AtomicLong(0); private OsmandApplication getApp() { return (OsmandApplication) getApplication(); @@ -128,7 +129,6 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { super.onCreate(); OsmandAidlApi api = getApi("setting_listener"); if(api != null) { - LOG.debug("aidl api not null!"); api.aidlCallbackListener = this; } } @@ -136,15 +136,27 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { @Override public void onDestroy() { super.onDestroy(); - mHandlerThread.quit(); + callbacks.clear(); + OsmandAidlApi api = getApi("clear_listener"); + if(api != null) { + api.aidlCallbackListener = null; + } + mHandlerThread.quit(); } + private long getCallbackId() { + return aidlCallbackId.get(); + } + + private long getAndIncrementCallbackId() { + return aidlCallbackId.getAndIncrement(); + } @Override - public void addAidlCallback(IOsmAndAidlCallback callback, int key) { - aidlCallbackId++; - callbacks.put(aidlCallbackId, new AidlCallbackParams(callback, key)); + public long addAidlCallback(IOsmAndAidlCallback callback, int key) { + callbacks.put(getAndIncrementCallbackId(), new AidlCallbackParams(callback, key)); + return getCallbackId(); } @Override @@ -748,9 +760,9 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { public long registerForUpdates(long updateTimeMS, IOsmAndAidlCallback callback) { try { if (updateTimeMS >= MIN_UPDATE_TIME_MS) { - addAidlCallback(callback, KEY_ON_UPDATE); - startRemoteUpdates(updateTimeMS, aidlCallbackId, callback); - return aidlCallbackId; + long id = addAidlCallback(callback, KEY_ON_UPDATE); + startRemoteUpdates(updateTimeMS, id, callback); + return getCallbackId(); } else { return MIN_UPDATE_TIME_MS_ERROR; } @@ -1034,9 +1046,9 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { removeAidlCallback(params.getCallbackId()); return -1; } else { - addAidlCallback(callback, KEY_ON_NAV_DATA_UPDATE); - api.registerForNavigationUpdates(aidlCallbackId); - return aidlCallbackId; + long id = addAidlCallback(callback, KEY_ON_NAV_DATA_UPDATE); + api.registerForNavigationUpdates(id); + return id; } } else { return -1; diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 7921b164a7..f9bac930d9 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -26,6 +26,7 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -39,8 +40,8 @@ public class RoutingHelper { private static final float POSITION_TOLERANCE = 60; - private List> listeners = new CopyOnWriteArrayList<>(); - private List> updateListeners = new CopyOnWriteArrayList<>(); + private List> listeners = new LinkedList<>(); + private List> updateListeners = new LinkedList<>(); private OsmandApplication app; private TransportRoutingHelper transportRoutingHelper; @@ -267,28 +268,25 @@ public class RoutingHelper { } public void addDataUpdateListener(IRoutingDataUpdateListener listener) { - updateListeners.add(new WeakReference<>(listener)); - } - - public boolean removeDataUpdateListener(IRoutingDataUpdateListener listener) { - Iterator> it = updateListeners.iterator(); - while(it.hasNext()) { - WeakReference wrl = it.next(); - IRoutingDataUpdateListener l = wrl.get(); - if(listener == l) { - it.remove(); - return true; + List> copy = new ArrayList<>(updateListeners); + List> tmp = new ArrayList<>(); + for (WeakReference ref : copy) { + IRoutingDataUpdateListener l = ref.get(); + if (l != null) { + tmp.add(ref); } } - return false; + tmp.add(new WeakReference<>(listener)); + updateListeners = tmp; } + public boolean removeListener(IRouteInformationListener lt){ Iterator> it = listeners.iterator(); while(it.hasNext()) { WeakReference ref = it.next(); IRouteInformationListener l = ref.get(); - if(l == lt) { + if(l == null || lt == l) { it.remove(); return true; } @@ -521,7 +519,8 @@ public class RoutingHelper { currentRoute = newCurrentRoute + 1; app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION); if (!updateListeners.isEmpty()) { - for (WeakReference ref : updateListeners) { + final ArrayList> tmp = new ArrayList<>(updateListeners); + for (WeakReference ref : tmp) { if (ref.get() != null) { ref.get().onRoutingDataUpdate(); } From 39e55340720eb74ab580e497fab2e94b24c01de4 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Wed, 17 Apr 2019 17:45:22 +0300 Subject: [PATCH 013/114] fixed concurrency issues --- .../net/osmand/aidl/AidlCallbackListener.java | 2 +- .../net/osmand/aidl/OsmandAidlService.java | 36 ++++++++----- .../osmand/plus/routing/RoutingHelper.java | 53 ++++++++++++------- 3 files changed, 60 insertions(+), 31 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java index 82556a7e59..95d958fb39 100644 --- a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java +++ b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java @@ -3,7 +3,7 @@ package net.osmand.aidl; import java.util.Map; public interface AidlCallbackListener{ - void addAidlCallback(IOsmAndAidlCallback callback, int key); + long addAidlCallback(IOsmAndAidlCallback callback, int key); boolean removeAidlCallback(long id); Map getAidlCallbacks(); } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index c8a530746c..f70bbc76d3 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -78,6 +78,7 @@ import org.apache.commons.logging.Log; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; import static net.osmand.aidl.OsmandAidlConstants.CANNOT_ACCESS_API_ERROR; import static net.osmand.aidl.OsmandAidlConstants.MIN_UPDATE_TIME_MS; @@ -97,7 +98,7 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { private Handler mHandler = null; HandlerThread mHandlerThread = new HandlerThread("OsmAndAidlServiceThread"); - private long aidlCallbackId = 0; + private final AtomicLong aidlCallbackId = new AtomicLong(0); private OsmandApplication getApp() { return (OsmandApplication) getApplication(); @@ -128,7 +129,6 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { super.onCreate(); OsmandAidlApi api = getApi("setting_listener"); if(api != null) { - LOG.debug("aidl api not null!"); api.aidlCallbackListener = this; } } @@ -136,15 +136,27 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { @Override public void onDestroy() { super.onDestroy(); - mHandlerThread.quit(); + callbacks.clear(); + OsmandAidlApi api = getApi("clear_listener"); + if(api != null) { + api.aidlCallbackListener = null; + } + mHandlerThread.quit(); } + private long getCallbackId() { + return aidlCallbackId.get(); + } + + private long getAndIncrementCallbackId() { + return aidlCallbackId.getAndIncrement(); + } @Override - public void addAidlCallback(IOsmAndAidlCallback callback, int key) { - aidlCallbackId++; - callbacks.put(aidlCallbackId, new AidlCallbackParams(callback, key)); + public long addAidlCallback(IOsmAndAidlCallback callback, int key) { + callbacks.put(getAndIncrementCallbackId(), new AidlCallbackParams(callback, key)); + return getCallbackId(); } @Override @@ -748,9 +760,9 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { public long registerForUpdates(long updateTimeMS, IOsmAndAidlCallback callback) { try { if (updateTimeMS >= MIN_UPDATE_TIME_MS) { - addAidlCallback(callback, KEY_ON_UPDATE); - startRemoteUpdates(updateTimeMS, aidlCallbackId, callback); - return aidlCallbackId; + long id = addAidlCallback(callback, KEY_ON_UPDATE); + startRemoteUpdates(updateTimeMS, id, callback); + return getCallbackId(); } else { return MIN_UPDATE_TIME_MS_ERROR; } @@ -1034,9 +1046,9 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { removeAidlCallback(params.getCallbackId()); return -1; } else { - addAidlCallback(callback, KEY_ON_NAV_DATA_UPDATE); - api.registerForNavigationUpdates(aidlCallbackId); - return aidlCallbackId; + long id = addAidlCallback(callback, KEY_ON_NAV_DATA_UPDATE); + api.registerForNavigationUpdates(id); + return id; } } else { return -1; diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 7921b164a7..c3117224f3 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -26,6 +26,7 @@ import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -39,8 +40,8 @@ public class RoutingHelper { private static final float POSITION_TOLERANCE = 60; - private List> listeners = new CopyOnWriteArrayList<>(); - private List> updateListeners = new CopyOnWriteArrayList<>(); + private List> listeners = new LinkedList<>(); + private List> updateListeners = new LinkedList<>(); private OsmandApplication app; private TransportRoutingHelper transportRoutingHelper; @@ -267,20 +268,30 @@ public class RoutingHelper { } public void addDataUpdateListener(IRoutingDataUpdateListener listener) { - updateListeners.add(new WeakReference<>(listener)); - } - - public boolean removeDataUpdateListener(IRoutingDataUpdateListener listener) { - Iterator> it = updateListeners.iterator(); - while(it.hasNext()) { - WeakReference wrl = it.next(); - IRoutingDataUpdateListener l = wrl.get(); - if(listener == l) { + List> copyList = new ArrayList<>(updateListeners); + Iterator> it = copyList.iterator(); + while (it.hasNext()) { + WeakReference ref = it.next(); + IRoutingDataUpdateListener l = ref.get(); + if (l == null) { it.remove(); - return true; } } - return false; + copyList.add(new WeakReference<>(listener)); + updateListeners = copyList; + } + + public void removeDataUpdateListener(IRoutingDataUpdateListener listener) { + List> copyList = new ArrayList<>(updateListeners); + Iterator> it = copyList.iterator(); + while (it.hasNext()) { + WeakReference ref = it.next(); + IRoutingDataUpdateListener l = ref.get(); + if (l == null || l == listener) { + it.remove(); + } + } + updateListeners = copyList; } public boolean removeListener(IRouteInformationListener lt){ @@ -288,7 +299,7 @@ public class RoutingHelper { while(it.hasNext()) { WeakReference ref = it.next(); IRouteInformationListener l = ref.get(); - if(l == lt) { + if(l == null || lt == l) { it.remove(); return true; } @@ -521,13 +532,19 @@ public class RoutingHelper { currentRoute = newCurrentRoute + 1; app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION); if (!updateListeners.isEmpty()) { - for (WeakReference ref : updateListeners) { - if (ref.get() != null) { - ref.get().onRoutingDataUpdate(); + ArrayList> tmp = new ArrayList<>(updateListeners); + Iterator> it = tmp.iterator(); + while (it.hasNext()) { + WeakReference ref = it.next(); + IRoutingDataUpdateListener l = ref.get(); + if (l == null) { + it.remove(); + } else { + l.onRoutingDataUpdate(); } + updateListeners = tmp; } } - } else { break; } From fda53a015587e601b41aaeb966c8fce742b60751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Mart=C3=ADnez?= Date: Wed, 17 Apr 2019 19:28:16 +0000 Subject: [PATCH 014/114] Added translation using Weblate (Aragonese) --- OsmAnd/res/values-an/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 OsmAnd/res/values-an/strings.xml diff --git a/OsmAnd/res/values-an/strings.xml b/OsmAnd/res/values-an/strings.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/OsmAnd/res/values-an/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From e7d3f2f8a914260b89e6bc8521841740f22400d1 Mon Sep 17 00:00:00 2001 From: josep constanti Date: Wed, 17 Apr 2019 05:44:00 +0000 Subject: [PATCH 015/114] Translated using Weblate (Catalan) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-ca/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 6440549a85..3ffd67fb1a 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -3045,4 +3045,5 @@ Abasta l\'àrea: %1$s x %2$s \n \n• Mostra l\'azimut en la mesura de la distància \n + Envia el registre \ No newline at end of file From c395abfd94f7111a99743f8ed5da98db646280a7 Mon Sep 17 00:00:00 2001 From: jan madsen Date: Tue, 16 Apr 2019 20:55:10 +0000 Subject: [PATCH 016/114] Translated using Weblate (Danish) Currently translated at 99.6% (2740 of 2750 strings) --- OsmAnd/res/values-da/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 217eaa7d0b..2175247edc 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -3031,4 +3031,5 @@ Repræsenterer område: %1$s x %2$s \n • Rettet mørkt tema i Retningsmenuen og Rutedetaljer \n \n • Vis azimut i mål afstand + Send log \ No newline at end of file From 929bc69b2c5a4c76f7a48910555d7fe1128b8762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Mart=C3=ADnez?= Date: Wed, 17 Apr 2019 19:42:54 +0000 Subject: [PATCH 017/114] Added translation using Weblate (Aragonese) --- OsmAnd/res/values-an/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 OsmAnd/res/values-an/phrases.xml diff --git a/OsmAnd/res/values-an/phrases.xml b/OsmAnd/res/values-an/phrases.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/OsmAnd/res/values-an/phrases.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 80349adefc78e9d50c91fdf8c545c555aa332071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Mart=C3=ADnez?= Date: Wed, 17 Apr 2019 19:48:08 +0000 Subject: [PATCH 018/114] Added translation using Weblate (Aragonese) --- OsmAnd-telegram/res/values-an/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 OsmAnd-telegram/res/values-an/strings.xml diff --git a/OsmAnd-telegram/res/values-an/strings.xml b/OsmAnd-telegram/res/values-an/strings.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/OsmAnd-telegram/res/values-an/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 8e3db1f5192ea5889af89e6875f3782310bd77e1 Mon Sep 17 00:00:00 2001 From: Evgenii Martynenko Date: Wed, 17 Apr 2019 13:00:39 +0000 Subject: [PATCH 019/114] Translated using Weblate (Russian) Currently translated at 99.6% (2739 of 2750 strings) --- OsmAnd/res/values-ru/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index f3dcfde72d..c4e458d859 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -3015,4 +3015,5 @@ \n• Отображение азимута в инструменте \"Измерить расстояние\" \n \n + Отправить log \ No newline at end of file From e3a66de44f019efbe625d74a486f04b18d2ffdce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Mart=C3=ADnez?= Date: Wed, 17 Apr 2019 19:55:05 +0000 Subject: [PATCH 020/114] Translated using Weblate (Aragonese) Currently translated at 0.1% (1 of 2750 strings) --- OsmAnd/res/values-an/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-an/strings.xml b/OsmAnd/res/values-an/strings.xml index a6b3daec93..a056c05800 100644 --- a/OsmAnd/res/values-an/strings.xml +++ b/OsmAnd/res/values-an/strings.xml @@ -1,2 +1,4 @@ - \ No newline at end of file + + Evitar lo tramvía + \ No newline at end of file From d05e6bcdee2589ed9598b7698b2aca7fa2f3d4ae Mon Sep 17 00:00:00 2001 From: crimean Date: Thu, 18 Apr 2019 10:37:24 +0300 Subject: [PATCH 021/114] Fix chart crash --- .../osmand/plus/routepreparationmenu/cards/RouteInfoCard.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java index acc593830b..7a09b837c7 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java @@ -27,7 +27,6 @@ import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.SettingsNavigationActivity; import net.osmand.plus.helpers.GpxUiHelper; -import net.osmand.router.RouteStatistics; import net.osmand.router.RouteStatistics.Boundaries; import net.osmand.router.RouteStatistics.RouteSegmentAttribute; import net.osmand.router.RouteStatistics.Statistics; @@ -83,7 +82,7 @@ public class RouteInfoCard extends BaseCard { public void onValueSelected(Entry e, Highlight h) { List> elems = routeStatistics.getElements(); int i = h.getStackIndex(); - if (elems.size() > i) { + if (i >= 0 && elems.size() > i) { selectedPropertyName = elems.get(i).getPropertyName(); if (showLegend) { updateLegend(routeStatistics); From f85047ab83b1c97ed05c5c6f0b303e3c13b2a7c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Seoane?= Date: Wed, 17 Apr 2019 10:52:51 +0000 Subject: [PATCH 022/114] Translated using Weblate (Galician) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-gl/strings.xml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml index c109ee9535..08a4e9894e 100644 --- a/OsmAnd/res/values-gl/strings.xml +++ b/OsmAnd/res/values-gl/strings.xml @@ -245,7 +245,7 @@ Moto Embarcación Aeronave - Está a piques de eliminar %1$d mudanzas no OSM. Confírmao\? + Estás a piques de eliminar %1$d mudanzas no OSM. Tes a certeza de querer facelo\? Eliminar todo Calcula-la rota primeiro "Simular empregando a rota calculada " @@ -373,8 +373,8 @@ Sombreado Curvas de nivel Datos de son/vídeo - Está na certeza de que desexa dete-la navigación\? - Confirmas que desexas limpar o destino (e os destinos intermedios)\? + Tes a certeza de querer dete-la navigación\? + Tes a certeza de querer limpar o destino (e os destinos intermedios)\? Calcular rutas precisas sen interferencias. Aínda está limitado polas distancias e é tardo. Navigación precisa (alfa) Amosar @@ -882,7 +882,7 @@ Amosar máis detalles dos mapas Amosar algún detalle dos mapas vectoriais (estradas, etc.) xa a niveis inferiores. Puntos favoritos eliminados. - Está a piques de eliminar %1$d Favoritos e %2$d grupos de Favoritos. Confírmao\? + Estás a piques de eliminar %1$d Favoritos e %2$d grupos de Favoritos. Tes a certeza de querer facelo\? Casa Amizades Lugares @@ -1508,8 +1508,8 @@ Reciba a benvida Rota actual Marcar para eliminar - Está a piques de eliminar %1$d notas. Confírmao? - Está a piques de enviar %1$d mudanza(s) ó OSM. Confírmao\? + Estás a piques de eliminar %1$d notas. Tes a certeza de querer facelo\? + Estás a piques de enviar %1$d mudanza(s) ó OSM. Tes a certeza de querer facelo\? Limpa-lo historial\? Ir Edicións do OSM @@ -1699,7 +1699,7 @@ Lon %2$s O punto de interese (PDI) será eliminado unha vez enviadas as mudanzas Amosar datos GPX Número de liñas - Confírmao? + Tes a certeza de querer facelo\? Vanse perde-las mudanzas non gardadas. Proseguer\? Fican %1$s baixadas Estradas @@ -1972,7 +1972,7 @@ Lon %2$s Non mostrar as actualizacións Desexa actualizar tódolos mapas agora\? Limpar tódalas teselas - Confirma que desexa substituí-lo favorito \"%1$s\"\? + Tes a certeza de querer substituí-lo favorito \"%1$s\"\? Procura de coordenadas Procura avanzada por coordenadas Voltar á procura @@ -2113,7 +2113,7 @@ Lon %2$s Engadir ós Favorito Engadir unha acción Eliminar a acción - Confirma que desexa eliminar a acción «%s»? + Tes a certeza de querer eliminar a acción \"%s\"\? Amosar diálogo dos Favoritos Ó premer no botón de acción engádese unha marcaxe do mapa na posición central da pantalla. Ó premer neste botón de acción engádese unha nota de son na posición central da pantalla. @@ -2200,7 +2200,7 @@ Lon %2$s Costa Engadir un cartafol novo Punto(s) eliminado(s). - Vai eliminar %1$d punto(s). Confírmao? + Vas eliminar %1$d punto(s). Tes a certeza de querer facelo\? Puntos da rota, puntos de interese, funcións nomeadas Viraxes a pasar nesta rota Velocidade máxima @@ -3061,4 +3061,5 @@ Lon %2$s Evitar tipos de transporte… Evitar o pavemento empedrado e lastros Evita as rúas empedradas e con lastros + Enviar rexistro (log) \ No newline at end of file From 3425c165b8c0ab5b7bd9775e279d3ed24f27f471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Tue, 16 Apr 2019 20:25:39 +0000 Subject: [PATCH 023/114] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.2% (2729 of 2750 strings) --- OsmAnd/res/values-nb/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index ec6df8f4a8..829f9e2fe0 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -3028,4 +3028,5 @@ \n • Visning av asimut i måling av distanse \n \n + Send logg \ No newline at end of file From c8997ee0d0ab9fffad9f1e964d97e9a94742fb71 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 17 Apr 2019 12:21:40 +0000 Subject: [PATCH 024/114] Translated using Weblate (Hebrew) Currently translated at 99.9% (2749 of 2750 strings) --- OsmAnd/res/values-he/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml index 8d7d36bf4e..0f63e86df9 100644 --- a/OsmAnd/res/values-he/strings.xml +++ b/OsmAnd/res/values-he/strings.xml @@ -3021,4 +3021,5 @@ \n \n • הצגת אזימוט במדידת מרחק \n + שליחת יומן \ No newline at end of file From a976dcfde68051f18418dd64767546552e7d8abe Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Thu, 18 Apr 2019 17:08:30 +0200 Subject: [PATCH 025/114] Fix #6201 --- .../plus/resources/IncrementalChangesManager.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java b/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java index 85f5dfaef1..5aa9c24112 100644 --- a/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java +++ b/OsmAnd/src/net/osmand/plus/resources/IncrementalChangesManager.java @@ -15,6 +15,7 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URLEncoder; import java.util.ArrayList; @@ -301,14 +302,17 @@ public class IncrementalChangesManager { private List getIncrementalUpdates(String file, long timestamp) throws IOException, XmlPullParserException { String url = URL + "?aosmc=true×tamp=" + timestamp + "&file=" + URLEncoder.encode(file); - LOG.debug(String.format("getIncrementalUpdates(): URL => %s", url)); //todo delete + HttpURLConnection conn = NetworkUtils.getHttpURLConnection(url); conn.setUseCaches(false); XmlPullParser parser = PlatformUtil.newXMLPullParser(); - parser.setInput(conn.getInputStream(), "UTF-8"); + InputStream is = conn.getInputStream(); + parser.setInput(is, "UTF-8"); List lst = new ArrayList(); + int elements = 0; while (parser.next() != XmlPullParser.END_DOCUMENT) { if (parser.getEventType() == XmlPullParser.START_TAG) { + elements ++; if (parser.getName().equals("update")) { IncrementalUpdate dt = new IncrementalUpdate(); dt.date = parser.getAttributeValue("", "updateDate"); @@ -317,12 +321,13 @@ public class IncrementalChangesManager { dt.sizeText = parser.getAttributeValue("", "size"); dt.timestamp = Long.parseLong(parser.getAttributeValue("", "timestamp")); dt.fileName = parser.getAttributeValue("", "name"); - LOG.debug(String.format("getIncrementalUpdates(): update => %s", dt.toString())); //todo delete lst.add(dt); } } } - LOG.debug(String.format("getIncrementalUpdates(): list size => %s", lst.size())); //todo delete + LOG.debug(String.format("Incremental updates: %s, updates %d (total %d)", url, lst.size(), elements)); + is.close(); + conn.disconnect(); return lst; } From 6ebc966893a82118864cf95ad256962a20d2fcbb Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 17 Apr 2019 10:16:18 +0000 Subject: [PATCH 026/114] Translated using Weblate (Italian) Currently translated at 65.7% (2340 of 3562 strings) --- OsmAnd/res/values-it/phrases.xml | 4988 ++++++++++++++---------------- 1 file changed, 2377 insertions(+), 2611 deletions(-) diff --git a/OsmAnd/res/values-it/phrases.xml b/OsmAnd/res/values-it/phrases.xml index d79018dad1..71b3580b38 100644 --- a/OsmAnd/res/values-it/phrases.xml +++ b/OsmAnd/res/values-it/phrases.xml @@ -1,2611 +1,2377 @@ - -Centro commerciale - Pescheria - Supermercato - Negozio biciclette - Distributore automatico - - Libreria - Sito paleontologico - - Panificio - Alcolici - Drogheria - Negozio di bevande - Macelleria - Gastronomia - Vendita prodotti di fattoria - Fruttivendolo - Negozio di dolciumi - Gelateria - Negozio di té - Latteria - Antiquariato - Negozio d\'arte - Articoli per l\'infanzia - Negozio borse - Arredo bagno - Negozio biancheria da letto - Negozio tappeti - Mesticheria - Abbigliamento - Abbigliamento bambini - Negozio calzature - Negozio di computer - Copisteria - Negozio tendaggi - Negozio drappeggi - Negozio materassi - Negozio articoli per immersione - Negozio per fai-da-te - Negozio erotica - Negozio pesca - Fioreria / fiorista - Cornici - Negozio mobili - Articoli per Giardinaggio - Negozio gas - Guado - Passo montano - Ponte - Mura cittadine - Ponte levatoio - Dosso - Chicane - Strisce rallentatrici - Autoriparatore - Gommista - Centro revisioni - Autolavaggio - Stazione di servizio;Distributore; Pompa benzina - Stazione di ricarica - Aria compressa - Parcheggio - Parcheggio per moto - Entrata parcheggio - Garage - - Fermata trasporto pubblico - Fermata autobus - Fermata autobus - Fermata tram - Stazione trasporto pubblico - Stazione autobus - Entrata metropolitana - - Aeroporto - Eliporto - Noleggio bici - Parcheggio bici - - Negozio anime - Boutique - Emporio - Negozio regali - Vetreria - Ferramenta - Negozi apparecchi acustici - Erboristeria - Negozio di HiFi - Negozio caccia-pesca - Negozio decorazione d\'interni - Gioielleria - Chiosco - Negozio articoli da cucina - Negozio telefonia mobile - Negozio di moto - Strumenti musicali - Optometrista - Alimenti biologici - Negozio articoli per l\'attività all\'aperto - Negozio articoli pittura - Negozio animali domestici - Negozio dell\'usato - Tabaccheria - Negozio di giocattoli - Negozio casalinghi - Giornalaio - Negozio per radiotecnica - Articoli sportivi - Biglietteria - Negozio aspirapolvere - Negozi articoli a basso costo - Videonoleggio - Negozio finestre cieche - Grande magazzino - Negozio elettronica - Negozio per auto - Autoricambi - Negozio quad - Negozio cosmetici - Mercato - Polizia - Pompieri - Telefono di emergenza - Idrante - Estintore - Stazione ambulanze - Negozio nautica - Negozio di cancelleria (cartoleria) - Negozio articoli per la tavola - Gate aeroporto - - Gondola - Ascensore carrozzine - Autovelox - Rotonda per inversione di marcia - Depuratore acque - Mulino ad acqua - - Sottostazione - Trasformatore - Generatore elettrico - - Centrale elettrica - Ufficio postale - Cassetta postale - Telefono - Torre telecomunicazioni - Isola ecologica - Cestino rifiuti - - Pontile - Videosorveglianza - Costrizione in corso - Fabbrica - Tunnel verticale - Ingresso di una galleria mineraria - Pozzo petrolifero - Punto geodetico - Mulino a vento - Cava - Vigneto - Frutteto - Salina - Campo da cricket circondato da reti - - Scuola guida - Scuola - Parco giochi - Università - Università - - Struttura che fornisce servizi sociali - Tribunale - Carcere - Anagrafe - Ambasciata - Ufficio pubblico - Ufficiale giudiziario - Ufficio migrazione - Guardia di finanza - Ufficio amministrativo - Città capoluogo di provincia - Città - Paese - Borgo-contrada - Insediamento rurale isolato - Grande quartiere - Quartiere - Località - - Farmacia - Ospedale - Medico - Clinica - Pronto soccorso - Dentista - Servizi di assistenza continua - Culla per la vita - Veterinario - Medicina alternativa - Audiologo - Banca del sangue - Centro medico - Levatrice - Optometrista - Fisioterapista - Psicoterapeuta - Logopedista - Assicurazione - Negozio immobiliare - Ufficio per l\'impiego - Ponte - - Riabilitazione - Pista atletica - Pista per bicicletta - Football australiano - Baseball - Basket - Beach volley - Canoa - Scacchi - Cricket - Corse cani - Equitazione - Golf - Pallamano - Hockey - Corse cavalli - Pattinaggio sul ghiaccio - Parapendio - Pelota - Pattinaggio a rotelle - Spiaggia - Baia - Rapide - Fiordo - Zona umida - Riserva naturale - Isola - Base militare navale - Sito esplosioni nucleari -Poligono militare - Area pericolosa - Caserma - Bunker - Aeroporto militare - Militare - Relitto - - Scoglio - Transponder radar marittimo - Cascata - Dolina - Ghiacciaio - Crinale - Cratere - Vulcano - Sella - Picco montuoso - Entrata grotta/caverna - Pagamento Bitcoin - - Bancomat - Banca - Internet caffè - - Crematorio - Celle mortuarie - Bordello - Sauna - Car sharing - Autonoleggio - Lavanderia - Lavasecco - Tatuatore - Centro massaggi - Parrucchiere - "Manicure " - Salone di bellezza - Costruzione finestre - - Costruttore orologi - Sarto - Produzione calzature - Scultore - Idraulico - Laboratorio fotografico - Fotografo - Posatore di parquet - Pittore - Ottico - Gioielliere - Riscaldamento, ventilazione e condizionamento - Giardiniere - Elettricista - Sarto - Cristianesimo - Luogo di culto - Chalet - - Rifugio alpino - Motel - Ostello - Pensione - Hotel - Parco a tema - - Zoo - Monumento - Relitto navale - Pietra runica - Rovine storiche - Fontana - Forte - Porta di ingresso della città - Castello - Pietra di confine - Campo di battaglia - Sito archeologico - Memoriale - Attrazione turistica - Museo - Pallavolo - - Toboga - Tennis - Tennis tavolo - Piscina - Calcio - Sci - Skateboard - Pattinaggio - Tiro - Canottaggio - Rugby a 15 - Rugby a 13 - Racquetball - Pala battifuoco - Manichetta antincendio - Stazione protezione civile - Cassone di sabbia - Bacino anti-incendio - Punto di accesso di emergenza - - Casello - Posto di controllo - Dosso lungo - Cuscini rallentatori - Dosso tavola - Restringimento di carreggiata rallentatore - Semaforo - - Rampa per veicoli - Fermata tram - Terminal aeroporto - Scivolo - Terminal traghetti - Faro - - Stazione skilift - Funivia - Skilift a ancora - Skilift a J - Skilift a piattello - Skilift misto - Skilift - Skilift a fune - Skilift per oggetti - Skilift a tappeto - - Tunnel - Fermata filobus - Stazione ferroviaria - Pozzo - Fontanella - Impianto idrico - Cantiere navale - Torre idrica - Chiuse - Inversione di marcia per battelli - Sbarramento - Diga - Centralino telefonico - - Discarica - Zona raccolta di rifiuti - Istituto scolastico - Scommesse - - Stadio - Centro sportivo - Pista pattinaggio sul ghiaccio - Atletica leggera - Bocce - Ciclismo - Ginnastica - Buddismo - Induismo - Shintoismo - Taoismo - Monastero - Monastero storico - Croce storica - Tabernacolo storico - Informazioni turistiche - Orologio - Punto panoramico - Campeggio - Area caravan e camper - Area attrezzata per picnic - Sorgente - Cimitero - Cimitero - Pensilina o ricovero - Funicolare - Club artistico - Club astrofili - Club informatico - Club giochi da tavolo - Club motociclistico - Club sportivo - Club giochi - Club automobilistico - Club scacchistico - Cineclub - Fan club - Club di pesca - Club di veterani - "Club Linux " - Associazione teatrale - Club fotografico - Club caccia - Biblioteca - Teatro - Circo - Sala da ballo - Discoteca;Disko;Disco;Club notturno - Strip club - Postazione di caccia - Mini golf - Parco giochi - Piscina - Parco acquatico - Parco - - Bar - Ristorante - Fast food - American Bar - Pub - Acqua potabile - Barbecue - - Apicoltore - Fabbro - Birrificio - Costruzione barche - Rilegatore - Carpentiere - Posatore di moquette - Servizio di catering - Orologiaio - Vetraio - Artigiano - Isolamento termico degli edifici - Fabbro per serrature - Servizio di duplicazione chiavi - Costruzioni metalliche - Stuccatore - Vasaio - Attrezzature per barche a vela - Costruzione e riparazione di tetti - Sellaio - Velaio - Segheria - Ponteggi e impalcature - Allestimento di stand - Scalpellino - Spazzacamino - Tende da sole - Piastrellista - Lattoniere - Tappezziere - Impresa di pompe funebri - Municipio - Centro di ricerca e sviluppo - Ufficio IT - Redazione giornalistica - Studio di architettura - Agenzia pubblicitaria - Studio di registrazione - Nave storica - Musulmano - Sikhismo - Agenzia di viaggi - Cinema - Casinò - Centro sociale - Prestasoldi - Monte di pietà - Cambia valute - Studio contabile - Fiume - Ruscello - Isoletta - - Osservatorio - Osservatorio astronomico - Fattoria - - Terapista occupazionale - Ufficio telecomunicazioni - Football americano - BMX - Posteggio taxi - - Svincolo autostradale - - Dogana - Podologo - Azienda - Avvocato - Campo da golf - Ippodromo - Bowling a nove birilli - Bowling a dieci birilli - Arrampicata - Croquet - Immersioni subacquee - Stock sport - Korfball - Orientamento - "Paddle tennis " - Surf - Opera d\'arte - Cannone storico - Ruota panoramica - Giostra - Labirinto - Montagne russe - Toboga estivo - Ebraico - Geyser - Centro artistico - Postazione di pesca - Porto - "Biergarten " - Motori agricoli - Cestaio - Capo - Stretto - Ancoraggio - Porto - Negozio - Ufficio - Artificiale - Miniera storica - Acquario - Alimentari e supermercato - Stazione di servizio - Trasporto pubblico - Trasporto aereo - Emergenza - Trasporti - Ostacolo sulla strada - Trasporto privato - Educazione - Amministrativo - Salute - Sport - Turismo - Alloggio - Accesso a Internet - Finanza - Wikipedia - Cioccolateria - Abbandonato - Sito web - Orario di servizio - Altezza massima - Peso massimo - Telefono - Orari di apertura - Descrizione - Uscita - - Ingresso - Tornello - Barriera generica - Wikipedia - Wiki inglese - Wiki araba - Wiki bielorussa - Wiki bulgara - Wiki catalana - Wiki ceca - Wiki danese - Wiki cebuana - Wiki tedesca - Wiki greca - Wiki estone - Wiki spagnola - Wiki finlandese - Wiki francese - Wiki galiziana - Wiki ebraica - Wiki hindi - Wiki croata - Wiki haitiana - Wiki ungherese - Wiki indonesiana - Wiki italiana - Wiki giapponese - Wiki coreana - Wiki lituana - Wiki lettone - Wiki malese - Wiki newari - Wiki olandese - Wiki norvegese Nynorsk - Wiki norvegese - Wiki polacca - Wiki portoghese - Wiki rumena - Wiki russa - Wiki slovacca - Wiki slovena - Wiki serba - Wiki svedese - Wiki swahili - Wiki telugu - Wiki thai - Wiki turca - Wiki ucraina - Wiki vietnamita - Wiki Volapük - Wiki cinese - - Zona militare - Bacino portuale - Bacino di carenaggio - Bacino galleggiante - Tuffi - Football canadese - Hockey su prato - Sport motoristici - Vela - Pallamano - Attrazione turistica - Luogo di culto - Accesso a Internet: servizio - - Accesso a Internet: WLAN - Accesso a Internet: terminale - Accesso a Internet: via cavo - Accesso a Internet: pubblico - Tavolo da picnic - Sorgente calda - Tomba - Bacino - Area fumatori - Valle - Acqua - Bosco - Albero - Torre - Radar - Gru - Area industriale - Torre campanaria - Trasporto navale - Trasporto in bici - Trasporto a fune - Nodo di rete ciclistico/pedonale - Percorso escursionistico - Energia - Comunicazioni - Uso del terreno - Cibo - Bar e ristorante - Artigiano - Natura - Nautico - Definito dall\'utente - - Negozio di latticini - Enoteca - - Fotocamere e lenti - Negozio di candele - Negozio di pelletteria - Negozio di musica - Gommista - Negozio di orologi - Giochi - Negozio di modellistica - Videogiochi - Fuochi d’artificio - Armeria - - Bio-diesel - GPL - 80 ottani - 91 ottani - 92 ottani - 95 ottani - 98 ottani - 100 ottani - Etanolo - Metanolo - Torre di osservazione - Area ferroviaria - Cartucce da stampante - CD - Pneumatici - Computer - Mercurio - Televisori, monitor - Tetrapak - Olio esausto - Bottiglie - Medicinali - Alberi di Natale - Lampadine - Mini rotonda - Area di servizio - Passaggio a livello - Passaggio a livello - Ufficio parrocchiale - Lampione - - Noleggio sci - - Stazione sciistica - Club - Pasta - Tipo di carburante - Tipo di carburante (avia) - Tipo di pagamento - Carte carburante - Ulteriori - Tipo di accesso a internet - Servizio per biciclette - Tipo - Tipo - Tipo - Posizione - Fonte d\'acqua - Tipo di pagamento - Suono - Tipo - Pavimentazione tattile - Servizio - Senza spazzola (acqua ad alta pressione) - Self-service - Automatizzato - Tipo - Coperto - Stazione della metropolitana - "Cargo " - Tipo - Trasporto di biciclette - Riscaldamento - Pompa - Designazione - Tipo - Tipo - Tipo - Capitale - Ricette - Specialità - Caratteristica - Tipo - Numero stelle - Religione - Denominazione - Tipo - Contenuto - Ulteriori - Tipo - Difficoltà delle piste - Genere - Posti a sedere all\'aperto - Costi - Fumatori - Consegna - "Drive in " - A portar via - Cocktail - Microbirrificio - Servizio - Tipo - Rifiuti accettati - Tipo - Caminetto - Stagionale - Caratteristica dell\'acqua - Superficie - Nudismo - Cibo - Tipo di massaggio - Tende - Lavatrice - Camper - Alimentazione elettrica - Sistema medico - Visita a domicilio - Tipo di pagamento (trasporto) - Tipo - Aria compressa - Aspirapolvere - -Smaltimento rifiuti - Meta turistica - Tempo libero - Servizio - Caffetteria - Pasticceria - Porte - Negozio di moda - Negozio di articoli di freefly (paracadutismo) - Negozio di mobili da giardino - Rifornimento medico - Negozio di fotografia - Negozio di merci secche - Negozio di articoli di piscina - Trofei, premi - Profumeria - - Diesel - Diesel GTL - Diesel camion - CNG - 1:25 carburante - 1:50 carburante - SVO - E10 - E20 - E85 - Biogas - Idrogeno liquido - Energia elettrica - Posizione stop del trasporto pubblico - Piattaforma ferroviaria - Fermata ferroviaria - Pista - Area di sosta - - Frangiflutti - - Traliccio alta tensione - Palo dell\'elettricità - - Torre di raffreddamento - Vetro - Carta - Vestiti - Lattine - Bottiglie di vetro - Plastica - Rottami metallici - Batterie - Bottiglie di plastica - Rifiuti verdi - Rifiuti (sacchi neri) - Imballaggi in plastica - Giornale - Cartoni - Cartone - Imballaggi di carta - Piccoli elettrodomestici - Legno - Libri - Scarpe - Alluminio - Organico - Cartoni per bevande - Rifiuti di giardino - Lampadine a basso consumo - Tubi fluorescenti - Metallo - Articoli elettrici - Olio da cucina - Olio motore - Sacchetti di plastica - Rifiuti pericolosi - Cellulari - Vernice - Rifiuti origine animale - Frigorifero e congelatore - Mobili - Batterie per auto - Automobili - Biciclette - - Foresta di tenute umano - Fattoria - Prato - Terra di conservazione - - Canale - Palo - Serbatoio - Gasometro - "Silo " - Fondo pensione - Quartiere - Area residenziale - - Sanatorio - Struttura medica - Pediatria - - Organizzazione non governativa - Ufficio religioso - Ufficio associazione - Ufficio finanziario - Ufficio partito politico - Notaio - Piazzola - Pista sportiva - Circuito - Multi sport - Oggetto turistico - Animale (attrazione) - Treno (attrazione) - Appartamento - Rifugio non custodito - Cabina - Voodoo - Spiritualismo - Cattolica - Battista - Cattolica romana - Ortodossa - Evangelico - Ortodossa russa - Mormone - Testimoni di Geova - Chiesa dell\'Inghilterra - Tibetano - Esercito della Salvezza - Apostolica - Chiesa di Cristo - Accesso Internet: sì - Accesso Internet: no - - Club musicale - Club natura - Snowpark - Centro comunitario - Galleria d\'arte - Parco per cani - Marina - Doccia - Ufficio militare - Palo Dissuasore - Barriera per biciclette - Barriera per moto - Blocco - Trappola di autobus - Ingresso principale - Passaggio pedonale - - Tempi di raccolta - Email - Fax - Facebook - Twitter - Skype - YouTube - Instagram - Google+ - Cellulare - Altezza - Altezza sul livello del mare - Oggetto abbandonato - In disuso - - Operatore - Marchio - - No - - No - - No - Stagione secca - Stagione umida - Primavera - Estate - Autunno - Inverno - Con semaforo - Non regolato - Data di inizio - - No - Limitata - Accesso privato - Nessun accesso - Accesso permissivo - Accesso cliente - Accesso di consegna - Accesso agricolo - - Contenuto: insilato - Contenuto: acqua - Contenuto: olio - Contenuto: carburante - Contenuto: vino - Contenuto: gas - Contenuto: biomassa - Contenuto: birra - Contenuto: sale - Contenuto: grano - - Ammessi - Vietato - Obbligatorio - Permissiva - - Materiali da costruzione - Attrezzature idrauliche - Forniture di legno - Forniture agricole - Forniture di piastrelle - - Popolazione - Sotterraneo - Multipiano - - Ancore - Costruzione speciale - Dissuasore - Informale - - Misto - Senza foglie - Specie - Oliva - Mela - Olio di Palma - Arancia - Mandorla - Banana - Nocciola - Noce di cocco - Cachi - Ciliegia - Noce - Prugna - Pesca - - "Coca " - Kiwi - Nettarina - Mango - Dattero - Caffè - Urbano - Rurale - - Rifugio per animali - Posti a sedere - Schienale: Sì - Schienale: nessuna - - Nome nazionale - Nome internazionale - Nome regionale - Nome locale - Nome vecchio - Nome alternativo - - Manuale - Alimentato - Nessuna pompa - - - Minerale - Punto acqua - - Cucina - - Indicatore stradale - Mappa - Ufficio - Terminale - Mappa dei sentieri - Natura - Storia - Segno - Audioguida - Mappa di biciclette - Modello tattile - Mappa tattile - Piante - Geologia - Trasporti pubblici - Tecnologia - Astronomia - - Area commerciale - - Nessun caminetto - - - Non coperto - - Non ammessi - Solo all\'esterno - Ammessi - In una stanza separata - In una stanza isolata - Dedicato ai fumatori - - Pedaggio - Nessun pedaggio - Pedaggio camion - - Senza pavimentazione tattile - - No - Solo quando è consentito camminare - - Stazione di soccorso - - Posto per birdwatching - Giardino - - Brughiera - Erba - Terreno agricolo - Sabbia - - Legno morto - - Luogo di passaggio - Facile - Intermedio - Avanzate - Novizio - Esperto - Naturale - Classic + skating - No - Giardino: residenziale - Giardino: Comunità - Giardino: privato - Giardino: botanica - - Giardino: cucina - Giardino di stile: francese - Giardino di stile: inglese - Giardino di stile: giapponese - - Capacità - - Nessun luoghi dedicati per disabili - Luoghi dedicati per disabili - Luoghi dedicati per donne - Nessun luoghi dedicati per donne - Luoghi dedicati per donne - Luoghi dedicati per studenti - Luoghi dedicati per insegnanti - Luoghi dedicati per genitori - Nessun luoghi dedicati per genitori - Luoghi dedicati per genitori - - Capacità oraria - - Senza riscaldamento - Ammessi - Biciclette: non ammessi - Ammessi solo in estate - Solo entrare - Solo uscire - Entrare e uscire - Accessi estivi: solo entrare - Accessi estivi: solo uscire - Accessi estivi: entrare e uscire - - 1 (turista) - 1S (turistica superiore) - 2 (standard) - "2S (standard superiore)" - 3 (comfort) - "3S (comfort superiore)" - 4 (prima classe) - 4S (prima classe superiore) - 5 (lusso) - 5S (lusso superiore) - Camere - - Hotel di amore - - Monete - Monete non accettate - Monete di $0,5 - 50c, 1€ e monete da 2€ - Schede telefoniche - Non si accettano schede telefoniche - Carte di credito - Non si accettano carte di credito - Banconote - Non si accettano banconote - Contanti - Non si accettano contanti - Carte di debito - Non si accettano carte di debito - Bitcoin - Non si accettano Bitcoin - Visa - Non si accetta la Visa - MasterCard - Non si accetta la MasterCard - Schede conto - Maestro - Maestro non accettato - "American Express (AMEX) " - American Express (AMEX) non accettato - "Diners Club " - Diners Club non accettate - DKV - DKV non accettato - UTA - Carte UTA non accettato - "Efectivo " - Efectivo non accettato - "Girocard " - Girocard non accettato - "Discover Card " - Discover Card non accettata - "Visa Electron " - Visa Electron non accettato - "Litecoin " - Litecoin non accettato - Assegni - PIKEPASS - PIKEPASS non accettato - PIKEPASS (indicato) - Carte di debito Visa - Carte di debito Visa non accettato - Cryptomonete non accettate - Altro - Altri metodi di pagamento non accettati - "Routex " - Bancomat - Bancomat non accettato - Biglietti prepagati - JCB - "Quick " - "Eurowag " - "E‑ZPass " - E‑ZPass non accettato - EuroShell - "KITCard " - KITCard non accettato - "Westfalen " - Bonifici - Bonifici non accettati - Pagamenti tramite SMS - PayPal - Non si accetta PayPal - Carte regalo - Descrizione del pagamento - - Accesso a Internet - a pagamento - Accesso a Internet - senza pagamento - - Vegetariana - Solo Vegana - Vegana - Tiro con l\'arco - Club etnico - Frangiflutti - Tipo di vendita - Campo scout - Guidare attraverso - Negozio di beneficenza - Negozio immersioni subacquee - Specialità di salute - Piatto - Caratteristica - -Costruzione di trasporto - Beni religiosi - - Isola di traffico - Stazione di rifornimento per barche - Fermata buffer - Frangiflutti - Centro di riciclaggio - Contenitore - Macerie - riciclaggio sughero - Compostaggio - Poliestere - Cartongesso - Stazione di monitoraggio - Paese - "Base jumping " - Giainismo - Bahaismo - Scientologismo - Paganesimo - Zoroastrismo - - Sunni - Protestante - Anglicana - Presbiteriano - Pentecostale - Greco-ortodosso - Riformato - Settimo giorno Avventista - Nuovo apostolica - Episcopale - Shia - Greco-cattolica - Chiesa di Scozia - Assemblee di Dio - Aconfessionale - Avventista - Nazareno - Congregazionale - Serbo-ortodosso - Spiritista - Riformata olandese - Riforma - Santi degli ultimi giorni - Chiesa unita di Cristo - Ortodosso romano - Etiopica ortodosso tewahedo - Maronita - Cantina per vini - Azienda vinicola - - Club di storia - Club di tiro - Club turistico - Club di carità - Loggia massonica - Pista - Pista di discesa - Pista sci nordico - Pista di slitta - Pista da slitta - Panca - Corte del mangiare - Linea di taglio - WC - Terminale di pagamento - Notevole pietra - Segnale da nebbia - Wiki Irlandese - Wiki Arminiana - Wiki Islanda - Wiki Georgiana - Wiki Latina - Wiki Lussemburghese - Wiki Macedone - Wiki Sarda - Wiki Albanese - Wiki Filippina - Wiki cantonese - Wiki nepalese - Wiki Siciliana - Wiki Bavarese - Limitatore di altezza - Passaggio in una parete o una recinzione - Nodo di rete ciclistica internazionale - Nodo di rete ciclistica nazionale - Nodo di rete ciclistica regionale - VKontakte - Sorvegliato - Non sorvegliato - Accesso di destinazione - Controllo: passaggio col rosso - Intermittente - - Fonte di energia: carbone - Fonte di energia: gas - Fonte di energia: nucleare - Fonte di energia: solare - Fonte di energia: idrica - Fonte di energia: vento - Fonte di energia: geotermia - Fonte di energia: olio - Fonte di energia: diesel - - Solforico - - Macchia - Livello - Scala RTSA - - Portafogli elettronici - Portafogli elettronici non accettati - Laser - V PAY - "Dogecoin " - Dogecoin non accettato - "Cibus " - AvantCard - AvantCard non accettato - MEP - MEP non accettato - "Minipay " - Minipay non accettato - MiniCash - MiniCash non accettato - "Moneo " - Moneo non accettato - "Monedero 4B " - Monedero 4B non accettato - "Monedero " - Monedero non accettato - "BankAxess " - BankAxess non accettato - "Coinkite " - Coinkite non accettato - "Roadrunner " - SVG - SVG non accettato - "OV-Chipkaart " - OV-Chipkaart non accettato - "Oyster " - SUBE - "Via Verde " - Via Verde non accettato - Buoni pasto - Buoni pasto non accettati - "U-Key " - U-Key non accettato - "PRO100 " - Yandex. Money - Yandex. Money non accettato - Vegetariana - Dieta vegetariana: no - Vegana - Dieta vegana: no - Senza glutine - Solo senza glutine - Senza glutine - Dieta senza glutine: no - - "Drive-in: no " - - - - A portar via - No a portar via - Solo a portar via - - - - Posti a sedere all\'aperto: Sì - Nessun posto a sedere all\'aperto - Posti a sedere all\'aperto: terrazza - Posti a sedere all\'aperto: marciapiede - Posti a sedere all\'aperto: zona pedonale - Posti a sedere all\'aperto: giardino - - - Parti - Rivenditore - Riparazione - Nessuna riparazione - Riparazione di veicoli elettrici - Riparazione Motocicli - - No Self-Service - - Non automatizzato - Servizio completo - - Senza spazzola: no - Lavaggio auto: no - - - Bagno pubblico - - Esterno - - Accesso a servizi igienici: clienti - Accesso a servizi igienici: permissiva - Accesso a servizi igienici: Comunità - Accesso a servizi igienici: pubblico - - Limite tempo di parcheggio - - Biglietti parcheggio - Sigarette - Sacchetti per escrementi - Biglietti di trasporto pubblico - Bevande - Dolci - Preservativi - Francobolli - Tubi della bicicletta - Cibo - Cibo e bevande - Distributore carburante - Ritiro pacco - Latte - Pane - Biglietti per il parcheggio; biglietti di trasporto pubblico - Caffè - Distributore biglietti - Distributore acqua - Buoni telefono - Alimenti per animali - Piani di trasporto pubblico - Bevande e dolci - Buoni - DVD - Candele - Giocattoli - Memoriale di guerra - Statua - Pietra - Veicolo - Pietra d’inciampo - Obelisco - Colonna - Iscrizione - Cava storica - - Carbone - Rame - Diamante - "Dolomite " - Gas - Oro - Grafite - Ghiaia - Gesso - Calcare - Marmo - Olio minerale - Olio - Torba - Platino - Sale - Sabbia - Argento - Pietra - Uranio - Acqua - Prato umido - Palude - Mangrovie - Sabbia - Roccioso - - Canna fumaria - Cipresso - Pennone - - - Senza panca - Con cestino - Senza cestello - - Trasporti pubblici - Pic-nic - Meteo - Costruzione - Wi-Fi - Terminale - Tipo accesso a Internet: pubblico - Nessun accesso Internet - Con accesso Internet - - Larghezza massima - Codice IATA - Codice ICAO - Codice FAA - - Larghezza - - Architetto - - Architettura: moderno - Architettura: Neoclassicismo stalinista - Architettura: eclettico - Architettura: nuova oggettività - Architettura: contemporanea - Architettura: costruttivismo - Architettura: telaio in legno - Architettura: Neoclassicismo - Architettura: vittoriano - Architettura: brutalismo - Architettura: classicismo - Architettura: gotico - Architettura: barocco - Architettura: stile guglielmino - Architettura: rinascimento - Architettura: romanico - - Tunnel d\'acqua - Tunnel pedonale - Ponte stradale - Ponte pedonale - Ponte di biciclette - Ponte ferroviera - Struttura ponte: fascio - Struttura ponte: sospensione semplice - Struttura ponte: sospensione - Struttura ponte: arco - Struttura ponte: capriata - Struttura ponte: galleggiante - Struttura ponte: megattere - Struttura ponte: lungomare - Struttura ponte: semplice in legno - Struttura ponte: viadotto - Struttura ponte: acquedotto - Superficie: non asfaltate - Superficie: pavimentata - Superficie: asfalto - Superficie: cemento - Superficie: ciottoli - Superficie: pietra - Superficie: metallo - Superficie: legno - Superficie: ghiaia - Superficie: ghiaia fine - Superficie: compattato - Superficie: sabbia - Superficie: erba - Superficie: terra - Superficie: sporco - Superficie: fango - Superficie: ghiaccio - Superficie: sale - Superficie: neve - - Autobus - Filobus - "Tram " - Treno - Funicolare - Traghetto - - Percorso della ferrovia - - Oggetto storico - Sorveglianza: Sì - Con negozio - - Vendita al dettaglio - Riparazione - Riparazione biciclette: no - Noleggio - Noleggio biciclette: no - Pompa - Pompa biciclette: no - Pulizia - Pulizia biciclette: no - Ricarica biciclette: Sì - Ricarica: no - Posto per osservare la fauna selvatica - - Oggetto monumentale - - Tipo: fabbrica - Tipo: industria gas - Tipo: legname - Tipo: raffineria - Tipo: magazzino - Tipo: carroattrezzi auto - Tipo: agricoltura - Tipo: birreria - Tipo: terminal intermodale - Tipo: segheria - Tipo: depot - - Nota - Posto d\'innaffiamento - Aereo storico - - Con ascensore - Senza ascensore - - Aerodromo di modello - Ufficio forestale - Carburante 91UL - Carburante 100LL - "Autogas " - Carburante Jet A-1 - Carburante AdBlue - - Lane di fuga - - Raccolto: riso - Raccolto: erba - Raccolto: canna da zucchero - Raccolto: soia - Raccolto: tè - Raccolto: caffè - Raccolto: girasole - Raccolto: lampone - Raccolto: asparagi - Raccolto: fiori - - Donne - Biancheria intima - Uomini - Abiti da sposa - Sport - Abbigliamento da lavoro - Cappelli - In pelle - Costumi - Tradizionale - Maternità - Scuola - Calzini - Camicie - Danza - Militare - - Traguardo storico - - Bambini - Donne - Sport - Uomini - Ortopedici - - Tipo castello: difensivo - Tipo castello: fortezza - Tipo castello: palazzo - Tailandese - Sessuale - Cinese - Terapeutica - - Servizio massaggi - Servizi di sauna - Servizi solarium - - Ammessi - Tende non ammessi - Caminetto ammessi - Caminetto non ammessi - - "No " - - Lavatrice: no - - Doccia: Sì - Doccia: no - Doccia: caldo - Doccia: all\'aperto - Doccia: freddo - - Caravan: no - Stazione di discarica sanitaria: Sì - Stazione di sanitari discarica: no - - Alimentazione elettrica: no - Tensione di alimentazione (presa): CEE 17 blu - Tensione di alimentazione (presa): CEE 7/4 - Tensione di alimentazione (presa): CEE 7/5 - Tensione di alimentazione (presa): NEMA 5-15 - - Cani ammessi - Cani non ammessi - - Residenza assistita - Anziani - Bambini - Orfani - Disabili - Pazienti con disturbi mentali - Senzatetto - Migranti - Disoccupati - Bambini giovanile - - Filarmonica - Dramma - Opera - "Cabaret " - Commedia - Marionetta - Balletto - Gioco di ombre - - Prodotto: mattone - Prodotto: birra - Prodotto: carne - - Descrizione per non vedenti - Scale - Corrimano: Sì - Corrimano: no - Rampa: Sì - Rampa: no - Rampa (passeggino): Sì - Rampa (passeggino): no - Rampa per biciclette: Sì - Rampa per biciclette: no - Conteggio dei passi - Passo condizione: irregolare - Defibrillatore - Defibrillatore: Sì - - Tipo: tomba di guerra - Tipo: tumulus - Tipo: ipogeo - Tipo: mausoleo - Tipo: sarcofago - Tipo: cripta - Tipo: piramide - - Civiltà: preistorico - Civiltà: greco antico - Civiltà: romana - Civiltà: celtico - Civiltà: micenea - Civiltà: romana e bizantina egiziano - Addestramento animali - Cane - Cavallo - - Cavalli ammessi - Cavalli non ammessi - Animali ammessi - Animali non ammessi - - Pietra storico - Materiale: legno - Materiale: metallo - Materiale: cemento armato - Materiale: acciaio - Materiale: pietra - Materiale: mattoni - Materiale: plastica - Materiale: granito - Materiale: metallo, legno - Materiale: vetro - Materiale: bronzo - Materiale: terra - Materiale: marmo - Materiale: alluminio - - Fortificazione - Insediamento - Città - Stazione ferroviaria storica - - Patibolo storico - Ferrovia storica - - Piazza - Artista - Scultore - - Tipo di edificio: Chiesa - Tipo di edificio: Cappella - Tipo di edificio: Moschea - Tipo di edificio: Tempio - Tipo di edificio: Cattedrale - Tipo di edificio: Monastero - Tipo di edificio: Basilica - Tipo di edificio: Sinagoga - Tipo di edificio: Santuario - - Croce - Croce di vetta: Sì - - Ex campo di prigionia - Tipo: nazista - Tipo: gulag - - Temperatura - Nr° ponte - Nr° tunnel - - Nr - - Veicoli - Biciclette - Contenitori - Lunghezza - - Centro fitness - "Fitness " - - Biliardo - - Forno a microonde: Sì - Forno a microonde: no - Riscaldatore di acqua: Sì - Riscaldatore di acqua: no - - Tipo: superficie - "Dojo " - - Giochi Gaelic - "Netball " - "Judo " - Disc golf - Boxe - - Nome ufficiale - - Delfino - - In costruzione - Bancomat: sì - Bancomat: no - - Area protetta - Titolo di protezione - Oggetto di protezione: storico - Oggetto di protezione: natura - Oggetto di protezione: acqua - - Nome casa - - - - Aria compressa: no - - - - - Aspirapolvere: no - Aspirapolvere - - Sgancio a pulsante: Sì - Sgancio a pulsante: no - - "Solarium " - - Pilastro - Stagno - Parete - - Capacità (posti letto) - - Emergenza: Sì - Emergenza: no - - Visita a domicilio: no - - Diametro idrante - Marciapiede - Strada - Cisterna - In servizio: Sì - - Profondità - - Sale - Sale: no - Indicato - Campo estivo - Campana di attraversamento - Campana di attraversamento: no - Luce di passaggio - Attraversamento su richiesta - Attraversamento su richiesta: no - accettate - non accettate - - Internazionale - Regionale - Pubblico - Militare - Militare/pubblico - Privato - - Pozzo di ventilazione - - "Troika " - Carta Troika non accettata - - Telescopio - Ottico - Radio - "Gamma " - Diametro - Utilizzo: spionaggio - Utilizzo: spionaggio - Meteorologica - Gravitazionale - - Tensione - Potenza di uscita - Uscita: elettricità - Potenza di uscita di acqua calda - Uscita: acqua calda - Uscita: aria calda - Uscita: acqua fredda - Uscita: aria compressa - Potenza di uscita di biogas - Uscita: biogas - - Stazione pompaggio - - Barometro - Barometro: no - Termometro - Termometro: no - Igrometro - Igrometro: no - Visualizzazione della data - Visualizzazione della data: no - - Acquacoltura: gamberetti - Acquacoltura - Acquacoltura: pesce - Acquacoltura: cozze - - Età minima - - Specchio - - Consolato - Consolato generale - Consolato onorario - Missione permanente - Delegazione - Residenza dell\'ambasciatore - Lunghezza - - Wikipedia - - Natale - Evento di Natale - Mercatino di Natale - Piramide di Natale - Negozio di Natale - Negozio di alberi - Albero di Natale - Natale: periodo per l\'evento - Natale: Nota - Natale: Orari di apertura - Natale: sito web - - Pizza - Burger - Caffè - Kebab - Pollo - Sushi - Frutti di mare - Colazione - Bistecca - "Tapas " - "Heuriger " - Curry - "Buschenschank " - Griglia - Bagel - "Pasta " - Succo di frutta - - Negozio tè - Zuppa - Hot Dog - Insalata - "Bistro " - Cous cous - Pollo fritto - "Dessert " - Mensa - "Tacos " - "Falafel " - "Smoothie " - "Gyros " - Crepes - Carne - Cioccolato - Vino - Patata - Burrito - Regionale - Italiano - Cinese - Messicana - Giapponese - Tedesco - Indiano - Americano - Asiatica - Francese - Greco - Tailandese - Internazionale - Turco - Spagnolo - Vietnamita - Coreano - Mediterraneo - Bavarese - Libanese - Russo - Filippine - Portoghese - Georgiano - Polacco - Brasiliano - Arabo - Danese - Indonesiano - Africano - Caraibi - Argentino - Balcanico - Peruviano - Croato - Boliviano - Malgascio - Farsi - Marocchino - Austriaco - Malese - Irlandese - Etiope - Ungherese - Laotiano - Europeo - Uzbeco - Ceco - Cubano - Britannico - Latino-americana - "Nepalese " - Mongolo - Mediorientale - Ucraino - Afgano - Belga - Basco - Svizzero - Cantonese - Svedese - Giamaicano - Armeno - Hawaiano - Inglese - Pakistano - Taiwan - "Tex-mex " - Olandese - Siriano - Australiano - Egiziano - "Senegalese " - Ebraico - Bulgaro - Tibetano - - Articoli per feste - Biglietti lotteria - Tipo - Lotteria - Bingo - - Locomotiva - - Studio fotografico - - -Barriera corallina - Accessibilità in carrozzina - Accesso alla toletta in carrozzina: Sì - Accesso alla toletta in carrozzina: No - Descrizione per utenti in carrozzina - Rampa per carrozzina: Sì - Rampa per carrozzina: No - Mangiatoia - - Gruppo bersaglio - Infrastruttura emergenza - Letti - -Centro ricreativo - - Attivazione del attraversamento: automatica - Attivazione del attraversamento: locale - Attivazione del attraversamento: remoto - Barriera di attraversamento: nessuna - Barriera di attraversamento - Barriera di attraversamento: completo - Barriera di attraversamento: metà - Barriera di attraversamento: doppio metà - Luce di attraversamento: no - Negozio del fabbro (chiavi) - Apparecchi di illuminazione - Falesia - - Stazione merci - - - - Vino: Sì - Vino: vendita in bottiglia - Vino: servito - - Ufficio del fornitore di energia - - Scuola di musica - Scuola di lingue - - Salvagente - - Parco Zoo safari - Uccelli - Voliera - Falconeria - Vendita - Vendita: no - Noleggio - Officina riparazioni - Ricambi - Vendita pneumatici - Direzione: indietro - Direzione: in senso orario - Direzione: in senso antiorario - Direzione: tutte - - Ricovero invernale: sì - Ricovero invernale: no - Prenotazione: necessaria - Prenotazione: consigliata - Prenotazione: sì - Prenotazione: no - Nessuna struttura - Caffetteria - Tipo - Servizi - Animali accettati - Scopo - -Controllo del traffico - Panini (sandwich) - Kebab (shawarma) - Gelato - Fish and chips - Salsiccia - Torta - Pancake - Fast food - Torte - Gastronomia - Sagardotegia (sidro) - Waffle - Brunch - Baguette farcite - Pita (pane piatto lievitato) - Fonduta - Baguette - Pastel (fagottini ripieni) - Teriyaki - Shawarma (kebab) - - Negozio di materiale elettrico - Scommesse - Negozio di sigarette elettroniche - - Integratori alimentari - Riparazione: computer - Riparazione: elettrodomestici - Riparazione: telefoni - Riparazione: tv - - Animali non pericolosi - Animali liberi - Animali in gabbia - Rettilario - - Vendita: nuovo e usato - Vendita: solo usato - Noleggio: no - Riparazioni: no - Ricambi: no - Vendita pneumatici: no - Abbigliamento moto - Abbigliamento moto: no - Scooter - Proprietario - - Adozione: sì - Adozione: no - Direzione: nord - Direzione: nord nord est - Direzione: nord est - Direzione: est nord est - Direzione: est - Direzione: est sud est - Direzione: sud est - Direzione: sud sud est - Direzione: sud - Direzione: sud sud ovest - Direzione: sud ovest - Direzione: ovest sud ovest - Direzione: ovest - Direzione: ovest nord ovest - Direzione: nord ovest - Direzione: nord nord ovest - Direzione: avanti - Direzione: sopra - Direzione: sotto - Direzione: entrata - Direzione: uscita - Prenotazione: solo membri - - Tipo di moto - Negozio materiali da costruzione - Negozio forniture di energia - Negozio spezie - Negozio belle arti - Negozio miele - Guado tramite pietre - Incrocio - Riviste - Area commerciale - - Orti urbani - Bacino - - - Orti di città - Hockey su ghiaccio - Luterana - Verde pubblico - Wiki bengalese - Wiki bretone - Wiki piemontese - Barriera jersey - Nodo di rete ciclistica locale - Nodo di rete escursionistica internazionale - Nodo di rete escursionistica nazionale - Nodo di rete escursionistica regionale - Nodo di rete escursionistica locale - - Percorso escursionistico internazionale - Percorso escursionistico nazionale - Percorso escursionistico regionale - Percorso escursionistico locale - Senza semaforo - Genere - Tassonomia - - Controllo: limite velocità - Controllo: limite altezza - Controllo: distanza minima - Controllo: documenti, tasso alcolico - Controllo: accesso - Controllo: pedaggio - - Cani - Gatti - Cani, gatti - Uccelli - Cavalli - Mammiferi - Pesci - - Edificio - Cartello informazioni - Erba - Pagamenti via SMS non accettati - Non si accettano carte regalo - Vegetariana (qualcosa) - Solo vegetariana - Kosher - Solo kosher - Kosher - Dieta kosher: no - Senza lattosio - Solo senza lattosio - Senza lattosio - Dieta senza lattosio: no - No microbirrificio - - Uomo - Vietato agli uomini - Donna - Vietato alle donne - Interno - Senza bagno - Finitura della pista - Elettrodomestici - Lamiera - Polistirolo - Sito dismesso - Serbatoio - - Centro di formazione - Barche a noleggio - -Stazione rifornimento aerei - Pannolini - Pista pattinaggio sul ghiaccio - Riparatore di computer - Pattinaggio - Tempo medio di arrivo, minuti - Carte Laser non accettate - Carte V PAY non accettate - Consegna - No consegna - Solo consegna - - Posti a sedere all\'aperto: patio - - Usato - Non usato - Solo usato - - Tavolo cambio pannolino - Tavolo cambio pannolino non presente - Locale cambio pannolino - - Presa - Uscita CHAdeMO - Uscita Tipo 2 - Uscita Tipo 2 combinata - Uscita Tipo 3 - Uscita CEE blu - Uscita Schuko - -Stato delle operazioni - "Via ferrata " - Difficoltà - -Condivisione di barche - Potabilizzazione acqua - Stile arrampicata - Tipo di ghiacciaio - - - Armadio distribuzione elettrica - Torre faro - Fondazione - Seggiolini volanti; Calcinculo - Multiconfessionale - Metodista - Ortodosso georgiano - Club Nautico - Associazione Scout - - Stabilimento balneare - Segnale - Detriti - Tipo di alimentazione idrica - Servizio auto - Approvvigionamento idrico - Truciolare - Scorie nucleari - Silo bunker - Ufficio consulente fiscale - - Alloggio - Alloggio di caccia - - "Tenrikyo " - Unito - Ortodosso bulgaro - Apostolico armeno - Ortodosso copto - Ormeggio ancoraggio - Ormeggio - "Africaans wiki " - Tornello a tutta altezza - Scaletta - Pilone di sollevamento aereo - - Pellicola - Procuratore - Universalismo unitariano - Assegni non accettati - Carte carburanti Routex non accettate - Biglietti prepagati IC - Biglietti prepagati IC non accettati - Carte JCB non accettate - Carte Quick non accettate - Carte Eurowag non accettate - Carte carburanti Euroshell non accettate - Carte Westfalen non accettate - Carte Cibus non accettate - Proton - Carte Proton non accettate - Carte Roadrunner non accettate - Carte Oyster non accettate - Carte SUBE non accettate - Gettoni - Gettoni non accettati - Golden Crown - Carte Golden Crown non accettate - Carte PRO100 non accettate - Union Card - Union Card non accettata - MTS-Money - MTS-Money non accettato - Nome birrificio - Principale - Stagno - Ruscello - "Balka " - - Display: sì - "Display: no " - Display analogico - Display digitale - - "No " - Solo - - Noleggio barche - Barche a motore: sì - Barche a motore: no - Case galleggianti: sì - Case galleggianti: no - Pedalò: sì - Pedalò: no - Jetski: sì - Jetski: no - Kayak: sì - Kayak: no - "Tartan " - Tipo Checkpoint - -Ciotole - Posto accesso all\'acqua - "Resort " - Terreno ricreativo - "Donut " - "Crepe " - Panificio - Spuntino - "Yogurt " - "Cajun " - "Standard " - - Argilla - Necessità di manutenzione - - Pompa - Presa: Schuko - Auto: sì - Auto: no - Bicicletta: sì - Bicicletta: no - Camion: sì - Camion: no - - Parcheggio a pagamento: sì - Parcheggio a pagamento: no - Parcheggio a pagamento - - Amperaggio - Stazione di ricarica - - Strada - Numero civico - Codice postale - - Ghiaccio: sì - Ghiaccio: no - Alimenti surgelati - - "CHAdeMO " - "Schuko " - Bassa - Medio - Griglia barbecue: Sì - - Cambio olio - Vendita auto usate - Freni - Vendita auto nuove - Diagnostica - Batterie - Aria condizionata - Ruote - Vetro - Riparazione di camion - Motore - Assicurazione - Pneumatici - - Numero cavi - Valle - Montagna - Roccia - Codice - Roccia - - Data di fine - - Senza contatto - Pericolo valanghe - Campo minato - - Rovine - - Classi di licenza - -Bancomat - + + + Centro commerciale + Pescheria + Supermercato + Negozio biciclette + Distributore automatico + Libreria + Sito paleontologico + Panificio + Alcolici + Drogheria + Negozio di bevande + Macelleria + Gastronomia + Vendita prodotti di fattoria + Fruttivendolo + Negozio di dolciumi + Gelateria + Negozio di té + Latteria + Antiquariato + Negozio d\'arte + Articoli per l\'infanzia + Negozio borse + Arredo bagno + Negozio biancheria da letto + Negozio tappeti + Mesticheria + Abbigliamento + Abbigliamento bambini + Negozio calzature + Negozio di computer + Copisteria + Negozio tendaggi + Negozio drappeggi + Negozio materassi + Negozio articoli per immersione + Negozio per fai-da-te + Negozio erotica + Negozio pesca + Fioreria / fiorista + Cornici + Negozio mobili + Articoli per Giardinaggio + Negozio gas + Guado + Passo montano + Ponte + Mura cittadine + Ponte levatoio + Dosso + Chicane + Strisce rallentatrici + Autoriparatore + Gommista + Centro revisioni + Autolavaggio + Stazione di servizio;Distributore; Pompa benzina + Stazione di ricarica + Aria compressa + Parcheggio + Parcheggio per moto + Entrata parcheggio + Garage + Fermata trasporto pubblico + Fermata autobus + Fermata autobus + Fermata tram + Stazione trasporto pubblico + Stazione autobus + Entrata metropolitana + + Aeroporto + Eliporto + Noleggio bici + Parcheggio bici + Negozio anime + Boutique + Emporio + Negozio regali + Vetreria + Ferramenta + Negozi apparecchi acustici + Erboristeria + Negozio di HiFi + Negozio caccia-pesca + Negozio decorazione d\'interni + Gioielleria + Chiosco + Negozio articoli da cucina + Negozio telefonia mobile + Negozio di moto + Strumenti musicali + Optometrista + Alimenti biologici + Negozio articoli per l\'attività all\'aperto + Negozio articoli pittura + Negozio animali domestici + Negozio dell\'usato + Tabaccheria + Negozio di giocattoli + Negozio casalinghi + Giornalaio + Negozio per radiotecnica + Articoli sportivi + Biglietteria + Negozio aspirapolvere + Negozi articoli a basso costo + Videonoleggio + Negozio finestre cieche + Grande magazzino + Negozio elettronica + Negozio per auto + Autoricambi + Negozio quad + Negozio cosmetici + Mercato + Polizia + Pompieri + Telefono di emergenza + Idrante + Estintore + Stazione ambulanze + Negozio nautica + Negozio di cancelleria (cartoleria) + Negozio articoli per la tavola + Gate aeroporto + Gondola + Ascensore carrozzine + Autovelox + Rotonda per inversione di marcia + Depuratore acque + Mulino ad acqua + Sottostazione + Trasformatore + Generatore elettrico + Centrale elettrica + Ufficio postale + Cassetta postale + Telefono + Torre telecomunicazioni + Riciclaggio dei rifiuti + Cestino rifiuti + Pontile + Videosorveglianza + Costrizione in corso + Fabbrica + Tunnel verticale + Ingresso di una galleria mineraria + Pozzo petrolifero + Punto geodetico + Mulino a vento + Cava + Vigneto + Frutteto + Salina + Campo da cricket circondato da reti + Scuola guida + Scuola + Parco giochi + Università + Università + Struttura che fornisce servizi sociali + Tribunale + Carcere + Anagrafe + Ambasciata + Ufficio pubblico + Ufficiale giudiziario + Ufficio migrazione + Guardia di finanza + Ufficio amministrativo + Città capoluogo di provincia + Città + Paese + Borgo-contrada + Insediamento rurale isolato + Grande quartiere + Quartiere + Località + Farmacia + Ospedale + Medico + Clinica + Pronto soccorso + Dentista + Servizi di assistenza continua + Culla per la vita + Veterinario + Medicina alternativa + Audiologo + Banca del sangue + Centro medico + Levatrice + Optometrista + Fisioterapista + Psicoterapeuta + Logopedista + Assicurazione + Negozio immobiliare + Ufficio per l\'impiego + Ponte + Riabilitazione + Pista atletica + Pista per bicicletta + Football australiano + Baseball + Basket + Beach volley + Canoa + Scacchi + Cricket + Corse cani + Equitazione + Golf + Pallamano + Hockey + Corse cavalli + Pattinaggio sul ghiaccio + Parapendio + Pelota + Pattinaggio a rotelle + Spiaggia + Baia + Rapide + Fiordo + Zona umida + Riserva naturale + Isola + Base militare navale + Sito esplosioni nucleari + Poligono militare + Area pericolosa + Caserma + Bunker + Aeroporto militare + Militare + Relitto + Scoglio + Transponder radar marittimo + Cascata + Dolina + Ghiacciaio + Crinale + Cratere + Vulcano + Sella + Picco montuoso + Entrata grotta/caverna + Pagamento Bitcoin + Bancomat + Banca + Internet caffè + Crematorio + Celle mortuarie + Bordello + Sauna + Car sharing + Autonoleggio + Lavanderia + Lavasecco + Tatuatore + Centro massaggi + Parrucchiere + "Manicure " + Salone di bellezza + Costruzione finestre + Costruttore orologi + Sarto + Produzione calzature + Scultore + Idraulico + Laboratorio fotografico + Fotografo + Posatore di parquet + Pittore + Ottico + Gioielliere + Riscaldamento, ventilazione e condizionamento + Giardiniere + Elettricista + Sarto + Cristianesimo + Luogo di culto + Chalet + Rifugio alpino + Motel + Ostello + Pensione + Hotel + Parco a tema + Zoo + Monumento + Relitto navale + Pietra runica + Rovine storiche + Fontana + Forte + Porta di ingresso della città + Castello + Pietra di confine + Campo di battaglia + Sito archeologico + Memoriale + Attrazione turistica + Museo + Pallavolo + Toboga + Tennis + Tennis tavolo + Piscina + Calcio + Sci + Skateboard + Pattinaggio + Tiro + Canottaggio + Rugby a 15 + Rugby a 13 + Racquetball + Pala battifuoco + Manichetta antincendio + Stazione protezione civile + Cassone di sabbia + Bacino anti-incendio + Punto di accesso di emergenza + Casello + Posto di controllo + Dosso lungo + Cuscini rallentatori + Dosso tavola + Restringimento di carreggiata rallentatore + Semaforo + Rampa per veicoli + Fermata tram + Terminal aeroporto + Scivolo + Terminal traghetti + Faro + Stazione skilift + Funivia + Skilift a ancora + Skilift a J + Skilift a piattello + Skilift misto + Skilift + Skilift a fune + Skilift per oggetti + Skilift a tappeto + Tunnel + Fermata filobus + Stazione ferroviaria + Pozzo + Fontanella + Impianto idrico + Cantiere navale + Torre idrica + Chiuse + Inversione di marcia per battelli + Sbarramento + Diga + Centralino telefonico + Discarica + Zona raccolta di rifiuti + Istituto scolastico + Scommesse + Stadio + Centro sportivo + Pista pattinaggio sul ghiaccio + Atletica leggera + Bocce + Ciclismo + Ginnastica + Buddismo + Induismo + Shintoismo + Taoismo + Monastero + Monastero storico + Croce storica + Tabernacolo storico + Informazioni turistiche + Orologio + Punto panoramico + Campeggio + Area caravan e camper + Area attrezzata per picnic + Sorgente + Cimitero + Cimitero + Pensilina o ricovero + Funicolare + Club artistico + Club astrofili + Club informatico + Club giochi da tavolo + Club motociclistico + Club sportivo + Club giochi + Club automobilistico + Club scacchistico + Cineclub + Fan club + Club di pesca + Club di veterani + "Club Linux " + Associazione teatrale + Club fotografico + Club caccia + Biblioteca + Teatro + Circo + Sala da ballo + Discoteca;Disko;Disco;Club notturno + Strip club + Postazione di caccia + Mini golf + Parco giochi + Piscina + Parco acquatico + Parco + Bar + Ristorante + Fast food + American Bar + Pub + Acqua potabile + Barbecue + Apicoltore + Fabbro + Birrificio + Costruzione barche + Rilegatore + Carpentiere + Posatore di moquette + Servizio di catering + Orologiaio + Vetraio + Artigiano + Isolamento termico degli edifici + Fabbro per serrature + Servizio di duplicazione chiavi + Costruzioni metalliche + Stuccatore + Vasaio + Attrezzature per barche a vela + Costruzione e riparazione di tetti + Sellaio + Velaio + Segheria + Ponteggi e impalcature + Allestimento di stand + Scalpellino + Spazzacamino + Tende da sole + Piastrellista + Lattoniere + Tappezziere + Impresa di pompe funebri + Municipio + Centro di ricerca e sviluppo + Ufficio IT + Redazione giornalistica + Studio di architettura + Agenzia pubblicitaria + Studio di registrazione + Nave storica + Musulmano + Sikhismo + Agenzia di viaggi + Cinema + Casinò + Centro sociale + Prestasoldi + Monte di pietà + Cambia valute + Studio contabile + Fiume + Ruscello + Isoletta + Osservatorio + Osservatorio astronomico + Fattoria + Terapista occupazionale + Ufficio telecomunicazioni + Football americano + BMX + Posteggio taxi + Svincolo autostradale + Dogana + Podologo + Azienda + Avvocato + Campo da golf + Ippodromo + Bowling a nove birilli + Bowling a dieci birilli + Arrampicata + Croquet + Immersioni subacquee + Stock sport + Korfball + Orientamento + "Paddle tennis " + Surf + Opera d\'arte + Cannone storico + Ruota panoramica + Giostra + Labirinto + Montagne russe + Toboga estivo + Ebraico + Geyser + Centro artistico + Postazione di pesca + Porto + "Biergarten " + Motori agricoli + Cestaio + Capo + Stretto + Ancoraggio + Porto + Negozio + Ufficio + Artificiale + Miniera storica + Acquario + Alimentari e supermercato + Stazione di servizio + Trasporto pubblico + Trasporto aereo + Emergenza + Trasporti + Ostacolo sulla strada + Trasporto privato + Educazione + Amministrativo + Salute + Sport + Turismo + Alloggio + Accesso a Internet + Finanza + Wikipedia + Cioccolateria + Abbandonato + Sito web + Orario di servizio + Altezza massima + Peso massimo + Telefono + Orari di apertura + Descrizione + Uscita + Ingresso + Tornello + Barriera generica + Wikipedia + Wiki inglese + Wiki araba + Wiki bielorussa + Wiki bulgara + Wiki catalana + Wiki ceca + Wiki danese + Wiki cebuana + Wiki tedesca + Wiki greca + Wiki estone + Wiki spagnola + Wiki finlandese + Wiki francese + Wiki galiziana + Wiki ebraica + Wiki hindi + Wiki croata + Wiki haitiana + Wiki ungherese + Wiki indonesiana + Wiki italiana + Wiki giapponese + Wiki coreana + Wiki lituana + Wiki lettone + Wiki malese + Wiki newari + Wiki olandese + Wiki norvegese Nynorsk + Wiki norvegese + Wiki polacca + Wiki portoghese + Wiki rumena + Wiki russa + Wiki slovacca + Wiki slovena + Wiki serba + Wiki svedese + Wiki swahili + Wiki telugu + Wiki thai + Wiki turca + Wiki ucraina + Wiki vietnamita + Wiki Volapük + Wiki cinese + Zona militare + Bacino portuale + Bacino di carenaggio + Bacino galleggiante + Tuffi + Football canadese + Hockey su prato + Sport motoristici + Vela + Pallamano + Attrazione turistica + Luogo di culto + Accesso a Internet: servizio + Accesso a Internet: WLAN + Accesso a Internet: terminale + Accesso a Internet: via cavo + Accesso a Internet: pubblico + Tavolo da picnic + Sorgente calda + Tomba + Bacino + Area fumatori + Valle + Acqua + Bosco + Albero + Torre + Radar + Gru + Area industriale + Torre campanaria + Trasporto navale + Trasporto in bici + Trasporto a fune + Nodo di rete ciclistico/pedonale + Percorso escursionistico + Energia + Comunicazioni + Uso del terreno + Cibo + Bar e ristorante + Artigiano + Natura + Nautico + Definito dall\'utente + Negozio di latticini + Enoteca + Fotocamere e lenti + Negozio di candele + Negozio di pelletteria + Negozio di musica + Gommista + Negozio di orologi + Giochi + Negozio di modellistica + Videogiochi + Fuochi d’artificio + Armeria + Bio-diesel + GPL + 80 ottani + 91 ottani + 92 ottani + 95 ottani + 98 ottani + 100 ottani + Etanolo + Metanolo + Torre di osservazione + Area ferroviaria + Cartucce da stampante + CD + Pneumatici + Computer + Mercurio + Televisori, monitor + Tetrapak + Olio esausto + Bottiglie + Medicinali + Alberi di Natale + Lampadine + Mini rotonda + Area di servizio + Passaggio a livello + Passaggio a livello + Ufficio parrocchiale + Lampione + Noleggio sci + Stazione sciistica + Club + Pasta + Tipo di carburante + Tipo di carburante (avia) + Tipo di pagamento + Carte carburante + Ulteriori + Tipo di accesso a internet + Servizio per biciclette + Tipo + Tipo + Tipo + Posizione + Fonte d\'acqua + Tipo di pagamento + Suono + Tipo + Pavimentazione tattile + Servizio + Senza spazzola (acqua ad alta pressione) + Self-service + Automatizzato + Tipo + Coperto + Stazione della metropolitana + "Cargo " + Tipo + Trasporto di biciclette + Riscaldamento + Pompa + Designazione + Tipo + Tipo + Tipo + Capitale + Ricette + Specialità + Caratteristica + Tipo + Numero stelle + Religione + Denominazione + Tipo + Contenuto + Ulteriori + Tipo + Difficoltà delle piste + Genere + Posti a sedere all\'aperto + Costi + Fumatori + Consegna + "Drive in " + A portar via + Cocktail + Microbirrificio + Servizio + Tipo + Rifiuti accettati + Tipo + Caminetto + Stagionale + Caratteristica dell\'acqua + Superficie + Nudismo + Cibo + Tipo di massaggio + Tende + Lavatrice + Camper + Alimentazione elettrica + Sistema medico + Visita a domicilio + Tipo di pagamento (trasporto) + Tipo + Aria compressa + Aspirapolvere + Smaltimento rifiuti + Meta turistica + Tempo libero + Servizio + Caffetteria + Pasticceria + Porte + Negozio di moda + Negozio di articoli di freefly (paracadutismo) + Negozio di mobili da giardino + Rifornimento medico + Negozio di fotografia + Negozio di merci secche + Negozio di articoli di piscina + Trofei, premi + Profumeria + Diesel + Diesel GTL + Diesel camion + CNG + 1:25 carburante + 1:50 carburante + SVO + E10 + E20 + E85 + Biogas + Idrogeno liquido + Energia elettrica + Posizione stop del trasporto pubblico + Piattaforma ferroviaria + Fermata ferroviaria + Pista + Area di sosta + Frangiflutti + Traliccio alta tensione + Palo dell\'elettricità + Torre di raffreddamento + Vetro + Carta + Vestiti + Lattine + Bottiglie di vetro + Plastica + Rottami metallici + Batterie + Bottiglie di plastica + Rifiuti verdi + Rifiuti (sacchi neri) + Imballaggi in plastica + Giornali + Cartoni + Cartone + Imballaggi di carta + Piccoli elettrodomestici + Legno + Libri + Scarpe + Alluminio + Organico + Cartoni per bevande + Rifiuti di giardino + Lampadine a basso consumo + Tubi fluorescenti + Metallo + Articoli elettrici + Olio da cucina + Olio motore + Sacchetti di plastica + Rifiuti pericolosi + Cellulari + Vernice + Rifiuti origine animale + Frigoriferi e congelatori + Mobili + Batterie per auto + Automobili + Biciclette + Foresta di tenute umano + Fattoria + Prato + Terra di conservazione + Canale + Palo + Serbatoio + Gasometro + "Silo " + Fondo pensione + Quartiere + Area residenziale + Sanatorio + Struttura medica + Pediatria + Organizzazione non governativa + Ufficio religioso + Ufficio associazione + Ufficio finanziario + Ufficio partito politico + Notaio + Piazzola + Pista sportiva + Circuito + Multi sport + Oggetto turistico + Animale (attrazione) + Treno (attrazione) + Appartamento + Rifugio non custodito + Cabina + Voodoo + Spiritualismo + Cattolica + Battista + Cattolica romana + Ortodossa + Evangelico + Ortodossa russa + Mormone + Testimoni di Geova + Chiesa dell\'Inghilterra + Tibetano + Esercito della Salvezza + Apostolica + Chiesa di Cristo + Accesso Internet: sì + Accesso Internet: no + Club musicale + Club natura + Snowpark + Centro comunitario + Galleria d\'arte + Parco per cani + Marina + Doccia + Ufficio militare + Palo Dissuasore + Barriera per biciclette + Barriera per moto + Blocco + Trappola di autobus + Ingresso principale + Passaggio pedonale + Tempi di raccolta + Email + Fax + Facebook + Twitter + Skype + YouTube + Instagram + Google+ + Cellulare + Altezza + Altezza sul livello del mare + Oggetto abbandonato + In disuso + Operatore + Marchio + + No + + No + + No + Stagione secca + Stagione umida + Primavera + Estate + Autunno + Inverno + Con semaforo + Non regolato + Data di inizio + + No + Limitata + Accesso privato + Nessun accesso + Accesso permissivo + Accesso cliente + Accesso di consegna + Accesso agricolo + Contenuto: insilato + Contenuto: acqua + Contenuto: olio + Contenuto: carburante + Contenuto: vino + Contenuto: gas + Contenuto: biomassa + Contenuto: birra + Contenuto: sale + Contenuto: grano + Ammessi + Vietato + Obbligatorio + Permissiva + Materiali da costruzione + Attrezzature idrauliche + Forniture di legno + Forniture agricole + Forniture di piastrelle + Popolazione + Sotterraneo + Multipiano + Ancore + Costruzione speciale + Dissuasore + Informale + Misto + Senza foglie + Specie + Oliva + Mela + Olio di Palma + Arancia + Mandorla + Banana + Nocciola + Noce di cocco + Cachi + Ciliegia + Noce + Prugna + Pesca + + "Coca " + Kiwi + Nettarina + Mango + Dattero + Caffè + Urbano + Rurale + Rifugio per animali + Posti a sedere + Schienale: Sì + Schienale: nessuna + Nome nazionale + Nome internazionale + Nome regionale + Nome locale + Nome vecchio + Nome alternativo + Manuale + Alimentato + Nessuna pompa + + Minerale + Punto acqua + Cucina + Indicatore stradale + Mappa + Ufficio + Terminale + Mappa dei sentieri + Natura + Storia + Segno + Audioguida + Mappa di biciclette + Modello tattile + Mappa tattile + Piante + Geologia + Trasporti pubblici + Tecnologia + Astronomia + Area commerciale + + Nessun caminetto + + Non coperto + Non ammessi + Solo all\'esterno + Ammessi + In una stanza separata + In una stanza isolata + Dedicato ai fumatori + Pedaggio + Nessun pedaggio + Pedaggio camion + + Senza pavimentazione tattile + + No + Solo quando è consentito camminare + Stazione di soccorso + Posto per birdwatching + Giardino + Brughiera + Erba + Terreno agricolo + Sabbia + Legno morto + Luogo di passaggio + Facile + Intermedio + Avanzate + Novizio + Esperto + Naturale + Classic + skating + No + Giardino: residenziale + Giardino: Comunità + Giardino: privato + Giardino: botanica + Giardino: cucina + Giardino di stile: francese + Giardino di stile: inglese + Giardino di stile: giapponese + Capacità + + Nessun luoghi dedicati per disabili + Luoghi dedicati per disabili + Luoghi dedicati per donne + Nessun luoghi dedicati per donne + Luoghi dedicati per donne + Luoghi dedicati per studenti + Luoghi dedicati per insegnanti + Luoghi dedicati per genitori + Nessun luoghi dedicati per genitori + Luoghi dedicati per genitori + Capacità oraria + + Senza riscaldamento + Ammessi + Biciclette: non ammessi + Ammessi solo in estate + Solo entrare + Solo uscire + Entrare e uscire + Accessi estivi: solo entrare + Accessi estivi: solo uscire + Accessi estivi: entrare e uscire + 1 (turista) + 1S (turistica superiore) + 2 (standard) + "2S (standard superiore)" + 3 (comfort) + "3S (comfort superiore)" + 4 (prima classe) + 4S (prima classe superiore) + 5 (lusso) + 5S (lusso superiore) + Camere + Hotel di amore + Monete + Monete non accettate + Monete di $0,5 + 50c, 1€ e monete da 2€ + Schede telefoniche + Non si accettano schede telefoniche + Carte di credito + Non si accettano carte di credito + Banconote + Non si accettano banconote + Contanti + Non si accettano contanti + Carte di debito + Non si accettano carte di debito + Bitcoin + Non si accettano Bitcoin + Visa + Non si accetta la Visa + MasterCard + Non si accetta la MasterCard + Schede conto + Maestro + Maestro non accettato + "American Express (AMEX) " + American Express (AMEX) non accettato + "Diners Club " + Diners Club non accettate + DKV + DKV non accettato + UTA + Carte UTA non accettato + "Efectivo " + Efectivo non accettato + "Girocard " + Girocard non accettato + "Discover Card " + Discover Card non accettata + "Visa Electron " + Visa Electron non accettato + "Litecoin " + Litecoin non accettato + Assegni + PIKEPASS + PIKEPASS non accettato + PIKEPASS (indicato) + Carte di debito Visa + Carte di debito Visa non accettato + Cryptomonete non accettate + Altro + Altri metodi di pagamento non accettati + "Routex " + Bancomat + Bancomat non accettato + Biglietti prepagati + JCB + "Quick " + "Eurowag " + "E‑ZPass " + E‑ZPass non accettato + EuroShell + "KITCard " + KITCard non accettato + "Westfalen " + Bonifici + Bonifici non accettati + Pagamenti tramite SMS + PayPal + Non si accetta PayPal + Carte regalo + Descrizione del pagamento + Accesso a Internet - a pagamento + Accesso a Internet - senza pagamento + Vegetariana + Solo Vegana + Vegana + Tiro con l\'arco + Club etnico + Frangiflutti + Tipo di vendita + Campo scout + Guidare attraverso + Negozio di beneficenza + Negozio immersioni subacquee + Specialità di salute + Piatto + Caratteristica + Costruzione di trasporto + Beni religiosi + Isola di traffico + Stazione di rifornimento per barche + Fermata buffer + Frangiflutti + Centro di riciclaggio + Contenitore + Macerie + Sughero + Compostaggio + Poliestere + Cartongesso + Stazione di monitoraggio + Paese + "Base jumping " + Giainismo + Bahaismo + Scientologismo + Paganesimo + Zoroastrismo + Sunni + Protestante + Anglicana + Presbiteriano + Pentecostale + Greco-ortodosso + Riformato + Settimo giorno Avventista + Nuovo apostolica + Episcopale + Shia + Greco-cattolica + Chiesa di Scozia + Assemblee di Dio + Aconfessionale + Avventista + Nazareno + Congregazionale + Serbo-ortodosso + Spiritista + Riformata olandese + Riforma + Santi degli ultimi giorni + Chiesa unita di Cristo + Ortodosso romano + Etiopica ortodosso tewahedo + Maronita + Cantina per vini + Azienda vinicola + Club di storia + Club di tiro + Club turistico + Club di carità + Loggia massonica + Pista + Pista di discesa + Pista sci nordico + Pista di slitta + Pista da slitta + Panca + Corte del mangiare + Linea di taglio + WC + Terminale di pagamento + Notevole pietra + Segnale da nebbia + Wiki Irlandese + Wiki Arminiana + Wiki Islanda + Wiki Georgiana + Wiki Latina + Wiki Lussemburghese + Wiki Macedone + Wiki Sarda + Wiki Albanese + Wiki Filippina + Wiki cantonese + Wiki nepalese + Wiki Siciliana + Wiki Bavarese + Limitatore di altezza + Passaggio in una parete o una recinzione + Nodo di rete ciclistica internazionale + Nodo di rete ciclistica nazionale + Nodo di rete ciclistica regionale + VKontakte + Sorvegliato + Non sorvegliato + Accesso di destinazione + Controllo: passaggio col rosso + Intermittente + Fonte di energia: carbone + Fonte di energia: gas + Fonte di energia: nucleare + Fonte di energia: solare + Fonte di energia: idrica + Fonte di energia: vento + Fonte di energia: geotermia + Fonte di energia: olio + Fonte di energia: diesel + Solforico + Macchia + Livello + Scala RTSA + Portafogli elettronici + Portafogli elettronici non accettati + Laser + V PAY + "Dogecoin " + Dogecoin non accettato + "Cibus " + AvantCard + AvantCard non accettato + MEP + MEP non accettato + "Minipay " + Minipay non accettato + MiniCash + MiniCash non accettato + "Moneo " + Moneo non accettato + "Monedero 4B " + Monedero 4B non accettato + "Monedero " + Monedero non accettato + "BankAxess " + BankAxess non accettato + "Coinkite " + Coinkite non accettato + "Roadrunner " + SVG + SVG non accettato + "OV-Chipkaart " + OV-Chipkaart non accettato + "Oyster " + SUBE + "Via Verde " + Via Verde non accettato + Buoni pasto + Buoni pasto non accettati + "U-Key " + U-Key non accettato + "PRO100 " + Yandex. Money + Yandex. Money non accettato + Vegetariana + Dieta vegetariana: no + Vegana + Dieta vegana: no + Senza glutine + Solo senza glutine + Senza glutine + Dieta senza glutine: no + + "Drive-in: no " + + + + A portar via + No a portar via + Solo a portar via + + + Posti a sedere all\'aperto: Sì + Nessun posto a sedere all\'aperto + Posti a sedere all\'aperto: terrazza + Posti a sedere all\'aperto: marciapiede + Posti a sedere all\'aperto: zona pedonale + Posti a sedere all\'aperto: giardino + + Parti + Rivenditore + Riparazione + Nessuna riparazione + Riparazione di veicoli elettrici + Riparazione Motocicli + + No Self-Service + + Non automatizzato + Servizio completo + + Senza spazzola: no + Lavaggio auto: no + Bagno pubblico + Esterno + + Accesso a servizi igienici: clienti + Accesso a servizi igienici: permissiva + Accesso a servizi igienici: Comunità + Accesso a servizi igienici: pubblico + Limite tempo di parcheggio + Biglietti parcheggio + Sigarette + Sacchetti per escrementi + Biglietti di trasporto pubblico + Bevande + Dolci + Preservativi + Francobolli + Tubi della bicicletta + Cibo + Cibo e bevande + Distributore carburante + Ritiro pacco + Latte + Pane + Biglietti per il parcheggio; biglietti di trasporto pubblico + Caffè + Distributore biglietti + Distributore acqua + Buoni telefono + Alimenti per animali + Piani di trasporto pubblico + Bevande e dolci + Buoni + DVD + Candele + Giocattoli + Memoriale di guerra + Statua + Pietra + Veicolo + Pietra d’inciampo + Obelisco + Colonna + Iscrizione + Cava storica + Carbone + Rame + Diamante + "Dolomite " + Gas + Oro + Grafite + Ghiaia + Gesso + Calcare + Marmo + Olio minerale + Olio + Torba + Platino + Sale + Sabbia + Argento + Pietra + Uranio + Acqua + Prato umido + Palude + Mangrovie + Sabbia + Roccioso + Canna fumaria + Cipresso + Pennone + + Senza panca + Con cestino + Senza cestello + Trasporti pubblici + Pic-nic + Meteo + Costruzione + Wi-Fi + Terminale + Tipo accesso a Internet: pubblico + Nessun accesso Internet + Con accesso Internet + Larghezza massima + Codice IATA + Codice ICAO + Codice FAA + Larghezza + Architetto + Architettura: moderno + Architettura: Neoclassicismo stalinista + Architettura: eclettico + Architettura: nuova oggettività + Architettura: contemporanea + Architettura: costruttivismo + Architettura: telaio in legno + Architettura: Neoclassicismo + Architettura: vittoriano + Architettura: brutalismo + Architettura: classicismo + Architettura: gotico + Architettura: barocco + Architettura: stile guglielmino + Architettura: rinascimento + Architettura: romanico + Tunnel d\'acqua + Tunnel pedonale + Ponte stradale + Ponte pedonale + Ponte di biciclette + Ponte ferroviera + Struttura ponte: fascio + Struttura ponte: sospensione semplice + Struttura ponte: sospensione + Struttura ponte: arco + Struttura ponte: capriata + Struttura ponte: galleggiante + Struttura ponte: megattere + Struttura ponte: lungomare + Struttura ponte: semplice in legno + Struttura ponte: viadotto + Struttura ponte: acquedotto + Superficie: non asfaltate + Superficie: pavimentata + Superficie: asfalto + Superficie: cemento + Superficie: ciottoli + Superficie: pietra + Superficie: metallo + Superficie: legno + Superficie: ghiaia + Superficie: ghiaia fine + Superficie: compattato + Superficie: sabbia + Superficie: erba + Superficie: terra + Superficie: sporco + Superficie: fango + Superficie: ghiaccio + Superficie: sale + Superficie: neve + Autobus + Filobus + "Tram " + Treno + Funicolare + Traghetto + Percorso della ferrovia + Oggetto storico + Sorveglianza: Sì + Con negozio + Vendita al dettaglio + Riparazione + Riparazione biciclette: no + Noleggio + Noleggio biciclette: no + Pompa + Pompa biciclette: no + Pulizia + Pulizia biciclette: no + Ricarica biciclette: Sì + Ricarica: no + Posto per osservare la fauna selvatica + Oggetto monumentale + Tipo: fabbrica + Tipo: industria gas + Tipo: legname + Tipo: raffineria + Tipo: magazzino + Tipo: carroattrezzi auto + Tipo: agricoltura + Tipo: birreria + Tipo: terminal intermodale + Tipo: segheria + Tipo: depot + Nota + Posto d\'innaffiamento + Aereo storico + Con ascensore + Senza ascensore + Aerodromo di modello + Ufficio forestale + Carburante 91UL + Carburante 100LL + "Autogas " + Carburante Jet A-1 + Carburante AdBlue + Lane di fuga + Raccolto: riso + Raccolto: erba + Raccolto: canna da zucchero + Raccolto: soia + Raccolto: tè + Raccolto: caffè + Raccolto: girasole + Raccolto: lampone + Raccolto: asparagi + Raccolto: fiori + Donne + Biancheria intima + Uomini + Abiti da sposa + Sport + Abbigliamento da lavoro + Cappelli + In pelle + Costumi + Tradizionale + Maternità + Scuola + Calzini + Camicie + Danza + Militare + Traguardo storico + Bambini + Donne + Sport + Uomini + Ortopedici + Tipo castello: difensivo + Tipo castello: fortezza + Tipo castello: palazzo + Tailandese + Sessuale + Cinese + Terapeutica + Servizio massaggi + Servizi di sauna + Servizi solarium + Ammessi + Tende non ammessi + Caminetto ammessi + Caminetto non ammessi + + "No " + + Lavatrice: no + + Doccia: Sì + Doccia: no + Doccia: caldo + Doccia: all\'aperto + Doccia: freddo + + Caravan: no + Stazione di discarica sanitaria: Sì + Stazione di sanitari discarica: no + + Alimentazione elettrica: no + Tensione di alimentazione (presa): CEE 17 blu + Tensione di alimentazione (presa): CEE 7/4 + Tensione di alimentazione (presa): CEE 7/5 + Tensione di alimentazione (presa): NEMA 5-15 + Cani ammessi + Cani non ammessi + Residenza assistita + Anziani + Bambini + Orfani + Disabili + Pazienti con disturbi mentali + Senzatetto + Migranti + Disoccupati + Bambini giovanile + Filarmonica + Dramma + Opera + "Cabaret " + Commedia + Marionetta + Balletto + Gioco di ombre + Prodotto: mattone + Prodotto: birra + Prodotto: carne + Descrizione per non vedenti + Scale + Corrimano: Sì + Corrimano: no + Rampa: Sì + Rampa: no + Rampa (passeggino): Sì + Rampa (passeggino): no + Rampa per biciclette: Sì + Rampa per biciclette: no + Conteggio dei passi + Passo condizione: irregolare + Defibrillatore + Defibrillatore: Sì + Tipo: tomba di guerra + Tipo: tumulus + Tipo: ipogeo + Tipo: mausoleo + Tipo: sarcofago + Tipo: cripta + Tipo: piramide + Civiltà: preistorico + Civiltà: greco antico + Civiltà: romana + Civiltà: celtico + Civiltà: micenea + Civiltà: romana e bizantina egiziano + Addestramento animali + Cane + Cavallo + Cavalli ammessi + Cavalli non ammessi + Animali ammessi + Animali non ammessi + Pietra storico + Materiale: legno + Materiale: metallo + Materiale: cemento armato + Materiale: acciaio + Materiale: pietra + Materiale: mattoni + Materiale: plastica + Materiale: granito + Materiale: metallo, legno + Materiale: vetro + Materiale: bronzo + Materiale: terra + Materiale: marmo + Materiale: alluminio + Fortificazione + Insediamento + Città + Stazione ferroviaria storica + Patibolo storico + Ferrovia storica + Piazza + Artista + Scultore + Tipo di edificio: Chiesa + Tipo di edificio: Cappella + Tipo di edificio: Moschea + Tipo di edificio: Tempio + Tipo di edificio: Cattedrale + Tipo di edificio: Monastero + Tipo di edificio: Basilica + Tipo di edificio: Sinagoga + Tipo di edificio: Santuario + Croce + Croce di vetta: Sì + Ex campo di prigionia + Tipo: nazista + Tipo: gulag + Temperatura + Nr° ponte + Nr° tunnel + Nr + Veicoli + Biciclette + Contenitori + Lunghezza + Centro fitness + "Fitness " + Biliardo + Forno a microonde: Sì + Forno a microonde: no + Riscaldatore di acqua: Sì + Riscaldatore di acqua: no + Tipo: superficie + "Dojo " + Giochi Gaelic + "Netball " + "Judo " + Disc golf + Boxe + Nome ufficiale + Delfino + In costruzione + Bancomat: sì + Bancomat: no + Area protetta + Titolo di protezione + Oggetto di protezione: storico + Oggetto di protezione: natura + Oggetto di protezione: acqua + Nome casa + + Aria compressa: no + + + Aspirapolvere: no + Aspirapolvere + Sgancio a pulsante: Sì + Sgancio a pulsante: no + "Solarium " + Pilastro + Stagno + Parete + Capacità (posti letto) + Emergenza: Sì + Emergenza: no + + Visita a domicilio: no + Diametro idrante + Marciapiede + Strada + Cisterna + In servizio: Sì + Profondità + Sale + Sale: no + Indicato + Campo estivo + Campana di attraversamento + Campana di attraversamento: no + Luce di passaggio + Attraversamento su richiesta + Attraversamento su richiesta: no + accettate + non accettate + Internazionale + Regionale + Pubblico + Militare + Militare/pubblico + Privato + Pozzo di ventilazione + "Troika " + Carta Troika non accettata + Telescopio + Ottico + Radio + "Gamma " + Diametro + Utilizzo: spionaggio + Utilizzo: spionaggio + Meteorologica + Gravitazionale + Tensione + Potenza di uscita + Uscita: elettricità + Potenza di uscita di acqua calda + Uscita: acqua calda + Uscita: aria calda + Uscita: acqua fredda + Uscita: aria compressa + Potenza di uscita di biogas + Uscita: biogas + Stazione pompaggio + Barometro + Barometro: no + Termometro + Termometro: no + Igrometro + Igrometro: no + Visualizzazione della data + Visualizzazione della data: no + Acquacoltura: gamberetti + Acquacoltura + Acquacoltura: pesce + Acquacoltura: cozze + Età minima + Specchio + Consolato + Consolato generale + Consolato onorario + Missione permanente + Delegazione + Residenza dell\'ambasciatore + Lunghezza + Wikipedia + Natale + Evento di Natale + Mercatino di Natale + Piramide di Natale + Negozio di Natale + Negozio di alberi + Albero di Natale + Natale: periodo per l\'evento + Natale: Nota + Natale: Orari di apertura + Natale: sito web + Pizza + Burger + Caffè + Kebab + Pollo + Sushi + Frutti di mare + Colazione + Bistecca + "Tapas " + "Heuriger " + Curry + "Buschenschank " + Griglia + Bagel + "Pasta " + Succo di frutta + + Negozio tè + Zuppa + Hot Dog + Insalata + "Bistro " + Cous cous + Pollo fritto + "Dessert " + Mensa + "Tacos " + "Falafel " + "Smoothie " + "Gyros " + Crepes + Carne + Cioccolato + Vino + Patata + Burrito + Regionale + Italiano + Cinese + Messicana + Giapponese + Tedesco + Indiano + Americano + Asiatica + Francese + Greco + Tailandese + Internazionale + Turco + Spagnolo + Vietnamita + Coreano + Mediterraneo + Bavarese + Libanese + Russo + Filippine + Portoghese + Georgiano + Polacco + Brasiliano + Arabo + Danese + Indonesiano + Africano + Caraibi + Argentino + Balcanico + Peruviano + Croato + Boliviano + Malgascio + Farsi + Marocchino + Austriaco + Malese + Irlandese + Etiope + Ungherese + Laotiano + Europeo + Uzbeco + Ceco + Cubano + Britannico + Latino-americana + "Nepalese " + Mongolo + Mediorientale + Ucraino + Afgano + Belga + Basco + Svizzero + Cantonese + Svedese + Giamaicano + Armeno + Hawaiano + Inglese + Pakistano + Taiwan + "Tex-mex " + Olandese + Siriano + Australiano + Egiziano + "Senegalese " + Ebraico + Bulgaro + Tibetano + Articoli per feste + Biglietti lotteria + Tipo + Lotteria + Bingo + Locomotiva + Studio fotografico + Barriera corallina + Accessibilità in carrozzina + Accesso alla toletta in carrozzina: Sì + Accesso alla toletta in carrozzina: No + Descrizione per utenti in carrozzina + Rampa per carrozzina: Sì + Rampa per carrozzina: No + Mangiatoia + Gruppo bersaglio + Infrastruttura emergenza + Letti + Centro ricreativo + Attivazione del attraversamento: automatica + Attivazione del attraversamento: locale + Attivazione del attraversamento: remoto + Barriera di attraversamento: nessuna + Barriera di attraversamento + Barriera di attraversamento: completo + Barriera di attraversamento: metà + Barriera di attraversamento: doppio metà + Luce di attraversamento: no + Negozio del fabbro (chiavi) + Apparecchi di illuminazione + Falesia + Stazione merci + + Vino: Sì + Vino: vendita in bottiglia + Vino: servito + Ufficio del fornitore di energia + Scuola di musica + Scuola di lingue + Salvagente + Parco Zoo safari + Uccelli + Voliera + Falconeria + Vendita + Vendita: no + Noleggio + Officina riparazioni + Ricambi + Vendita pneumatici + Direzione: indietro + Direzione: in senso orario + Direzione: in senso antiorario + Direzione: tutte + Ricovero invernale: sì + Ricovero invernale: no + Prenotazione: necessaria + Prenotazione: consigliata + Prenotazione: sì + Prenotazione: no + Nessuna struttura + Caffetteria + Tipo + Servizi + Animali accettati + Scopo + Controllo del traffico + Panini (sandwich) + Kebab (shawarma) + Gelato + Fish and chips + Salsiccia + Torta + Pancake + Fast food + Torte + Gastronomia + Sagardotegia (sidro) + Waffle + Brunch + Baguette farcite + Pita (pane piatto lievitato) + Fonduta + Baguette + Pastel (fagottini ripieni) + Teriyaki + Shawarma (kebab) + Negozio di materiale elettrico + Scommesse + Negozio di sigarette elettroniche + Integratori alimentari + Riparazione: computer + Riparazione: elettrodomestici + Riparazione: telefoni + Riparazione: tv + Animali non pericolosi + Animali liberi + Animali in gabbia + Rettilario + Vendita: nuovo e usato + Vendita: solo usato + Noleggio: no + Riparazioni: no + Ricambi: no + Vendita pneumatici: no + Abbigliamento moto + Abbigliamento moto: no + Scooter + Proprietario + Adozione: sì + Adozione: no + Direzione: nord + Direzione: nord nord est + Direzione: nord est + Direzione: est nord est + Direzione: est + Direzione: est sud est + Direzione: sud est + Direzione: sud sud est + Direzione: sud + Direzione: sud sud ovest + Direzione: sud ovest + Direzione: ovest sud ovest + Direzione: ovest + Direzione: ovest nord ovest + Direzione: nord ovest + Direzione: nord nord ovest + Direzione: avanti + Direzione: sopra + Direzione: sotto + Direzione: entrata + Direzione: uscita + Prenotazione: solo membri + Tipo di moto + Negozio materiali da costruzione + Negozio forniture di energia + Negozio spezie + Negozio belle arti + Negozio miele + Guado tramite pietre + Incrocio + Riviste + Area commerciale + Orti urbani + Bacino + + Orti di città + Hockey su ghiaccio + Luterana + Verde pubblico + Wiki bengalese + Wiki bretone + Wiki piemontese + Barriera jersey + Nodo di rete ciclistica locale + Nodo di rete escursionistica internazionale + Nodo di rete escursionistica nazionale + Nodo di rete escursionistica regionale + Nodo di rete escursionistica locale + Percorso escursionistico internazionale + Percorso escursionistico nazionale + Percorso escursionistico regionale + Percorso escursionistico locale + Senza semaforo + Genere + Tassonomia + Controllo: limite velocità + Controllo: limite altezza + Controllo: distanza minima + Controllo: documenti, tasso alcolico + Controllo: accesso + Controllo: pedaggio + Cani + Gatti + Cani, gatti + Uccelli + Cavalli + Mammiferi + Pesci + Edificio + Cartello informazioni + Erba + Pagamenti via SMS non accettati + Non si accettano carte regalo + Vegetariana (qualcosa) + Solo vegetariana + Kosher + Solo kosher + Kosher + Dieta kosher: no + Senza lattosio + Solo senza lattosio + Senza lattosio + Dieta senza lattosio: no + No microbirrificio + Uomo + Vietato agli uomini + Donna + Vietato alle donne + Interno + Senza bagno + Finitura della pista + Elettrodomestici + Lamiera + Polistirolo + Sito dismesso + Serbatoio + Centro di formazione + Barche a noleggio + Stazione rifornimento aerei + Pannolini + Pista pattinaggio sul ghiaccio + Riparatore di computer + Pattinaggio + Tempo medio di arrivo, minuti + Carte Laser non accettate + Carte V PAY non accettate + Consegna + No consegna + Solo consegna + Posti a sedere all\'aperto: patio + Usato + Non usato + Solo usato + Tavolo cambio pannolino + Tavolo cambio pannolino non presente + Locale cambio pannolino + Presa + Uscita CHAdeMO + Uscita Tipo 2 + Uscita Tipo 2 combinata + Uscita Tipo 3 + Uscita CEE blu + Uscita Schuko + Stato delle operazioni + "Via ferrata " + Difficoltà + Condivisione di barche + Potabilizzazione acqua + Stile arrampicata + Tipo di ghiacciaio + Armadio distribuzione elettrica + Torre faro + Fondazione + Seggiolini volanti; Calcinculo + Multiconfessionale + Metodista + Ortodosso georgiano + Club Nautico + Associazione Scout + Stabilimento balneare + Segnale + Detriti + Tipo di alimentazione idrica + Servizio auto + Approvvigionamento idrico + Truciolare + Scorie nucleari + Silo bunker + Ufficio consulente fiscale + Alloggio + Alloggio di caccia + "Tenrikyo " + Unito + Ortodosso bulgaro + Apostolico armeno + Ortodosso copto + Ormeggio ancoraggio + Ormeggio + "Africaans wiki " + Tornello a tutta altezza + Scaletta + Pilone di sollevamento aereo + Pellicola + Procuratore + Universalismo unitariano + Assegni non accettati + Carte carburanti Routex non accettate + Biglietti prepagati IC + Biglietti prepagati IC non accettati + Carte JCB non accettate + Carte Quick non accettate + Carte Eurowag non accettate + Carte carburanti Euroshell non accettate + Carte Westfalen non accettate + Carte Cibus non accettate + Proton + Carte Proton non accettate + Carte Roadrunner non accettate + Carte Oyster non accettate + Carte SUBE non accettate + Gettoni + Gettoni non accettati + Golden Crown + Carte Golden Crown non accettate + Carte PRO100 non accettate + Union Card + Union Card non accettata + MTS-Money + MTS-Money non accettato + Nome birrificio + Principale + Stagno + Ruscello + "Balka " + Display: sì + "Display: no " + Display analogico + Display digitale + + "No " + Solo + Noleggio barche + Barche a motore: sì + Barche a motore: no + Case galleggianti: sì + Case galleggianti: no + Pedalò: sì + Pedalò: no + Jetski: sì + Jetski: no + Kayak: sì + Kayak: no + "Tartan " + Tipo Checkpoint + Ciotole + Posto accesso all\'acqua + "Resort " + Terreno ricreativo + "Donut " + "Crepe " + Panificio + Spuntino + "Yogurt " + "Cajun " + "Standard " + Argilla + Necessità di manutenzione + Pompa + Presa: Schuko + Auto: sì + Auto: no + Bicicletta: sì + Bicicletta: no + Camion: sì + Camion: no + Parcheggio a pagamento: sì + Parcheggio a pagamento: no + Parcheggio a pagamento + Amperaggio + Stazione di ricarica + Strada + Numero civico + Codice postale + Ghiaccio: sì + Ghiaccio: no + Alimenti surgelati + "CHAdeMO " + "Schuko " + Bassa + Medio + Griglia barbecue: Sì + Cambio olio + Vendita auto usate + Freni + Vendita auto nuove + Diagnostica + Batterie + Aria condizionata + Ruote + Vetro + Riparazione di camion + Motore + Assicurazione + Pneumatici + Numero cavi + Valle + Montagna + Roccia + Codice + Roccia + Data di fine + Senza contatto + Pericolo valanghe + Campo minato + Rovine + Classi di licenza + Bancomat + Macerie inerti + \ No newline at end of file From 39f0e0ffde5e0cecf9bfdb2d0dc6b2cc6da5ad67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Mart=C3=ADnez?= Date: Wed, 17 Apr 2019 19:52:35 +0000 Subject: [PATCH 027/114] Translated using Weblate (Aragonese) Currently translated at 0.1% (3 of 3562 strings) --- OsmAnd/res/values-an/phrases.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-an/phrases.xml b/OsmAnd/res/values-an/phrases.xml index a6b3daec93..b977adb21d 100644 --- a/OsmAnd/res/values-an/phrases.xml +++ b/OsmAnd/res/values-an/phrases.xml @@ -1,2 +1,6 @@ - \ No newline at end of file + + Tipo de combustible + Tipo de combustible (avions) + Tipo de pago + \ No newline at end of file From dd050485ad33da748b0c7b0325ee018186e31336 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 18 Apr 2019 03:03:34 +0000 Subject: [PATCH 028/114] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 114 +++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 861e691058..cf725cfb82 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -704,7 +704,7 @@ 沒有我的收藏標點存在 取代 顯示路線 - 開始導航 + 開始指引 請先選擇目的地 導引 營業時間 @@ -1499,7 +1499,7 @@ 刪除動作 已過時 在路線規劃螢幕上,指示剩餘等待時間。 - 導航後開始轉向建議… + 指引後開始轉向建議… 執行 清除過去的記錄嗎? 您要上傳 %1$d 以更改 OSM。您確定嗎? @@ -2387,7 +2387,7 @@ 更改顏色 編輯名稱 名稱中包含太多的大寫字母。要繼續嗎? - 如果在十分鐘內沒有沒有找到路線,請增加中轉地點。 + 對於較長的距離:如果在10分鐘之內沒有找到路線請新增中轉目的地。 顯示縮放級別:%1$s 色調配置 由縮放級別來顯示 @@ -2903,15 +2903,119 @@ 前一個路線 切換 顯示更多 - 在地圖上追蹤 + 顯示軌跡 一天中的時間 由 %1$s 按步驟 道路類型 出口於 - 坐在站點上 + 站點的座位 顯示/隱藏 GPX 軌跡 點選此動作按鈕在地圖上顯示或隱藏選定的 GPX 軌跡 隱藏 GPX 軌跡 顯示 GPX 軌跡 + 傳送紀錄檔 + 避免電車 + 避免電車 + 避免巴士 + 避免巴士與無軌電車 + 避免共享計程車 + 避免共享計程車 + 避免火車 + 避免火車 + 避免捷運 + 避免捷運與輕軌運輸 + 避免渡輪 + 避免渡輪 + • 在大眾運輸工具間轉乘時顯示時間 +\n +\n • 修正路線詳細資訊的使用者介面 +\n +\n • 修復在方向選單與路徑詳細資訊中的暗色主題 +\n +\n • 在測量距離中顯示方位角 +\n +\n + + 毫弧度 + 角度測量單位 + 變更測量的方位角。 + 選取要避免在導航中使用的大眾運輸類型: + %s 模式 + 避免運輸類型…… + 步行 + 標籤「%s」的最大長度為 255 個字元。 +\n請縮短以繼續。 + 「%s」值的長度 + 在我們的部落格上取得更多關於 OsmAnd 如何計算路徑的資訊。 + 大眾運輸導航目前正在測試階段,可能會有錯誤與不準確的地方。 + 加入中繼點 + %1$d 次轉乘 + 新增起始與結束點 + 新增起始點 + 選取起始點 + 無鋪面 + + + 草與透氣磚鋪面 + 地面 + + + + + + 柏油 + 有鋪面 + 混凝土 + 枕木 + 鵝卵石 + 鋪路石 + 礫石 + 石頭 + 金屬 + 木頭 + 碎石 + 細石 + 壓實 + 優秀 + + 中等 + + 非常差 + 可怕 + 非常可怕 + 無法通行 + 高速公路 + 州級公路 + 道路 + 街道 + 服務 + 人行道 + 小徑 + 馬道 + 臺階 + 路徑 + 自行車道 + 未定義 + • 新的「方向」畫面:顯示家裡與工作目的地按鈕、「前一條路徑」快捷鍵、作用中的 GPX 軌跡與標記清單、搜尋歷史 +\n +\n • 「路徑詳細資訊」下的額外資訊:道路類型、表面、坡度、平滑度 +\n +\n • 大眾運輸導航現在支援所有類型的運輸工具:捷運、巴士、電車等等 +\n +\n • 新的顯示/隱藏軌跡的快速動作與日/夜模式 +\n +\n • 修復德國、南非與魁北克被顯示為淹沒的區域 +\n +\n • 對 KML 與 KMZ 匯入的額外支援 +\n +\n • 在開啟某些大眾運輸站點時當機的問題 +\n +\n • 從免費版中移除 Facebook 與 Firebase 分析(OsmAnd+ 則從未包含其在內) +\n +\n + 為 OsmAnd Live 變更啟用大眾運輸。 + OsmAnd Live 大眾運輸 + 避免鵝卵石與枕木 + 避免鵝卵石與枕木 \ No newline at end of file From 84c15d2503f3e3065cac31c6b0c34268510abcff Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 18 Apr 2019 02:57:08 +0000 Subject: [PATCH 029/114] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3562 of 3562 strings) --- OsmAnd/res/values-zh-rTW/phrases.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index f96628c0fc..015e31a145 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -3559,4 +3559,22 @@ 能源:生物能 放射治療 危險 + 難度分類 + 放射治療 + н/к + н/к* + + 1А* + + 1Б* + + 2А* + + 2Б* + + 3А* + + 3Б* + 燃燒塔 + 已刪除的物件 \ No newline at end of file From a5a43f9a2debaeec8b99e5271d08dee18c43f377 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 18 Apr 2019 02:54:10 +0000 Subject: [PATCH 030/114] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (215 of 215 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/zh_Hant/ --- OsmAnd-telegram/res/values-zh-rTW/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-zh-rTW/strings.xml b/OsmAnd-telegram/res/values-zh-rTW/strings.xml index 6fa53cc69b..8be91c7f30 100644 --- a/OsmAnd-telegram/res/values-zh-rTW/strings.xml +++ b/OsmAnd-telegram/res/values-zh-rTW/strings.xml @@ -214,4 +214,8 @@ 啟用監視以儲存所有歷史中的位置。 線上追蹤器 OsmAnd 追蹤器 + 搜尋聯絡人 + 搜尋您所有的群組與聯絡人。 + 輸入聯絡人或群組名稱 + 搜尋 \ No newline at end of file From 6cd7c4fb0824d839943e9ddb7bd38f3123c9cbed Mon Sep 17 00:00:00 2001 From: Verdulo Date: Tue, 16 Apr 2019 21:18:45 +0000 Subject: [PATCH 031/114] Translated using Weblate (Esperanto) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-eo/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 6d4e3d0b35..95306d21cb 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -3011,4 +3011,5 @@ Indikas lokon: %1$s x %2$s" \n \n• montri azimuton ĉe distanc‑mezurilo \n + Sendi erar‑protokolon \ No newline at end of file From 7496c4b19ba019f750946a6e46b2cc1ae483ca31 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Tue, 16 Apr 2019 20:26:52 +0000 Subject: [PATCH 032/114] Translated using Weblate (Esperanto) Currently translated at 100.0% (3562 of 3562 strings) --- OsmAnd/res/values-eo/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index 574896b033..5dd34c791c 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -239,7 +239,7 @@ Kudrilar-vendejo Horloĝ-vendejo Naĝej-akcesoriaĵoj vendejo - Lud-vendejo + Tabullud‑vendejo Modelfar-vendejo Pokaloj-k-premioj-vendejo Videolud-vendejo From 70d56ab370c32cf3bc19348d7725bee2b3b13d99 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Tue, 16 Apr 2019 21:13:02 +0000 Subject: [PATCH 033/114] Translated using Weblate (French) Currently translated at 99.9% (2747 of 2750 strings) --- OsmAnd/res/values-fr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 2c7fd31a70..5fb55af2a5 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -2993,4 +2993,5 @@ représentant la zone : %1$s x %2$s \n • Affichage de l’azimut lors de la mesure de distance. \n \n + Envoyer le journal \ No newline at end of file From c26ebc6d83e08e06636069d89dc645e479abb5ef Mon Sep 17 00:00:00 2001 From: ssantos Date: Thu, 18 Apr 2019 18:23:55 +0000 Subject: [PATCH 034/114] Translated using Weblate (German) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-de/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 8cbc472164..8d56579143 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3036,4 +3036,5 @@ Abgedeckte Fläche: %1$s x %2$s \n• Azimut in der Maßeinheit Distanz anzeigen \n \n + Sendeprotokoll \ No newline at end of file From 56419f396131e9dcb9aaa7643d7d1ee3c325c79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Babos=20G=C3=A1bor?= Date: Thu, 18 Apr 2019 09:42:21 +0000 Subject: [PATCH 035/114] Translated using Weblate (Hungarian) Currently translated at 99.6% (2740 of 2750 strings) --- OsmAnd/res/values-hu/strings.xml | 86 ++++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 74c1495e4e..98d87d0646 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -844,7 +844,7 @@ Proporcionális memória %4$s MB (Android korlát %5$s MB, Dalvik %6$s MB).Célpont %1$s Célpontok %1$s köztes célpont túl messze van a legközelebbi úttól. - Megérkeztél a köztes célponthoz + Érkezés a köztes célponthoz Beállítás köztes célpontnak Köztes célpont A célpont közelében nem található út. @@ -1465,7 +1465,7 @@ Proporcionális memória %4$s MB (Android korlát %5$s MB, Dalvik %6$s MB).maradt Törlöd az előzményeket? A hátralévő várakozási idő megadása az útvonaltervezés képernyőn. - Turn-by-turn navigáció indítása ez után… + Részletes navigáció indítása ez után… Indítás A parkolási idő vége A szerkesztéseid @@ -1787,7 +1787,7 @@ Hosszúság: %2$s Biztosan elmented a POI-t típus nélkül? OSM-szerkesztés módosítása Kártya el lett rejtve - Kérlek add meg a helyes POI típust, vagy hagyd ki. + Kérjük, helyes POI típust adjon meg, vagy hagyja ki ezt a lépést. A menü gomb a menü helyett a műszerfalat indítja Elérés a térképről Vágólapra másolva @@ -1839,7 +1839,7 @@ Hosszúság: %2$s Éjjel Hónap és ország kiválasztása Eltávolítás - Átváltottam belső memóriára, mert a kiválasztott adattároló könyvtár csak olvasható. Kérlek, válassz írható tárolási könyvtárat. + Az alkalmazás átváltott belső memóriára, mert a kiválasztott adattároló könyvtár csak olvasható. Kérjük, válasszon írható tárolási könyvtárat. Osztott memória Felső sáv Útvonal újraszámítása @@ -1856,13 +1856,13 @@ Hosszúság: %2$s Havi fizetés Aktív Inaktív - Kérlek, érvényes email címet adj meg - Kérlek, adj meg publikus nevet + Kérjük, érvényes e-mail címet adjon meg + Kérjük, nyilvános nevet adjon meg Köszönjük az OsmAnd támogatását! \nAz új funkciók aktiválásához az OsmAnd újraindítása szükséges. Az adományod egy részét a megadott régióban tevékenykedő OSM-szerkesztőknek továbbítjuk. Előfizetési beállítások - Előbb kérlek vásárolj OsmAnd Live előfizetést + Először kérjük, vásároljon OsmAnd Live előfizetést Ez az előfizetés a világ bármely térképének óránkénti frissítését teszi lehetővé. A bevételek egy része az OSM közösségnek jut vissza, és OSM szerkesztésenként kerül kifizetésre. Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésüket, ez ennek a tökéletes módja. @@ -1932,7 +1932,7 @@ Jelenleg csak {2} MB érhető el. Klipek elvágása, ha a felhasznált hely túllépi a tárolási méretet. A felvett klipek maximális hossza. Az összes klip által elfoglalható hely. - Kérlek, vegyél fel jelölőket a térképen + Kérjük, vegyen fel jelölőket a térképen Nem találhatók útpontok Relatív irány Ne tervezzen újra, amikor elhagyod a tervezett útvonalat. @@ -2050,7 +2050,7 @@ Jelenleg csak {2} MB érhető el. Szűrő mentése Szűrő törlése Új szűrő - Kérlek add meg az új szűrő nevét, ez hozzá lesz adva a „Kategóriák” fülhöz. + Kérjük, adja meg az új szűrő nevét, ami hozzá fog adódni a „Kategóriák” fülhöz. kabil Folytatás Nincs adat @@ -2294,7 +2294,7 @@ Kérlek adj meg egy teljes kódot Saját pozícióm animálása A saját pozíció mozgásának animálása navigáció közben. Áttekintés - Ha 10 percen belül nem kapsz eredményt erre a hosszú útvonalra, kérlek adj hozzá köztes célpontokat. + Hosszú távolságoknál: Ha 10 percen belül nem kap eredményt, adjon hozzá köztes célpontokat. OsmAnd (OSM Automated Navigation Directions) egy térkép- és navigációs alkalmazás, amellyel hozzáférhetsz az ingyenes, globális és kiváló minőségű OpenStreetMap (OSM) adataihoz. \n \nÉlvezd a hangalapú és vizuális navigációs szolgáltatást, tekints meg érdekes helyeket (POI-kat), hozz létre és kezelj GPX nyomvonalakat, szintvonalak és magasságinformációk használatával (egy plugin segítségével), válassz az autós, kerékpáros és gyalogos üzemmód közül, szerkessz OSM-et és használd ki a számos egyéb lehetőséget. @@ -2731,7 +2731,7 @@ Kérlek adj meg egy teljes kódot Előbb a város kiválasztása Visszaállítás Elhagyott jelölők megtartása a térképen - A folytatáshoz kérlek engedélyezd a helymeghatározást az OsmAnd számára. + A folytatáshoz engedélyezze a helymeghatározást az OsmAnd számára. Köszönjük a visszajelzésed • Pár eszközt érintő indításkori összeomlás javítása \n @@ -2767,7 +2767,7 @@ Kérlek adj meg egy teljes kódot Keresési sugár növelése: %1$s %1$s pont törölve %1$s pontot hoztál létre. Adj meg egy fájlnevet és nyomj a „Mentés”-re. - Kérlek, küldj egy képernyőképet erről a figyelmeztetésről a support@osmand.net-re + Kérjük, küldjön egy képernyőképet erről a figyelmeztetésről a support@osmand.net-re Csak 360°-os képek megjelenítése Fekete Nyomj egy gombra és hallgasd meg a hangutasítást, hogy megtaláld a hiányzó, vagy hibás utasításokat. @@ -2794,7 +2794,7 @@ Kérlek adj meg egy teljes kódot Hangbemondások Köztes célpontok Érkezés ekkor: %1$s - A motorháztető alatt: OsmAnd + Az OsmAndtól Harmadik féltől származó alkalmazás Elküldjük a keresésed: „%1$s”, valamint a tartózkodási helyed.

Nem gyűjtünk személyes adatokat, a keresési adatokat csak a kereső algoritmus fejlesztéséhez használjuk.
@@ -2878,7 +2878,7 @@ Kérlek adj meg egy teljes kódot
Otthon hozzáadása Felcserélés Továbbiak megjelenítése - Nyomvonalak a térképen + Megjelenített nyomvonalak Útkategória Lépésről lépésre Úttípusok @@ -2887,7 +2887,7 @@ Kérlek adj meg egy teljes kódot A műveletgombra koppintás elrejti vagy megjeleníti a GPX nyomvonalakat a térképen GPX nyomvonalak elrejtése GPX nyomvonalak megjelenítése - Először jelölj ki egy célpontot + Először jelöljön ki egy célpontot "• Új \'Navigáció\' képernyő: Új gomb az Otthon és Munkahely célpontokhoz, \'előző útvonal\' gyors gomb, az aktív GPX útvonalak és jelölők listája, keresési előzmények \n \n • Több információ az \'Útvonal adataiban\': úttípus, útburkolat, meredekség, simaság @@ -2929,4 +2929,60 @@ Kérlek adj meg egy teljes kódot A tömegközlekedési útvonaltervezés jelenleg bétatesztelési fázisban van, hibák és pontatlanságok előfordulhatnak. Köztes pont megadása %1$d átszállás + Fok + Milliradián + Szögmérés mértékegysége + Az azimutmérés mértékegységének módosítása. + %s mód + A „%s” címke címke legfeljebb 255 karakter hosszú lehet. +\nA folytatáshoz rövidítse le. + A „%s” érték hossza + Kiindulási és célpont hozzáadása + Kiindulási pont hozzáadása + Kiindulási pont kijelölése + Burkolatlan + Homok + + Gyephézagos térkő + Talaj + Föld + Sár + Jég + + + Aszfalt + Burkolt + Beton + Macskakő + Nagy kavics (görgeteg) + Térkő + Kavics + + Fém + Fa + Zúzott kő + Murva + Tömörített + Kitűnő + + Közepes + Rossz + Nagyon rossz + Szörnyű + Rettenetes + Járhatatlan + Autópálya + Állami út + Út + Utca + Szervizút + Gyalogút + Mzg. vagy erdészeti út + Lovaglóút + Lépcső + Ösvény + Kerékpárút + Meghatározatlan + Macskakő és kavicsburkolat elkerülése + Macskakő és kavicsburkolat elkerülése \ No newline at end of file From 4c9915e7332147c86c3e77aed23c1ac595cb1a99 Mon Sep 17 00:00:00 2001 From: IgorEliezer Date: Wed, 17 Apr 2019 09:43:27 +0000 Subject: [PATCH 036/114] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-pt-rBR/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 91f9964e16..cf77636258 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3012,4 +3012,5 @@ Pôr do Sol: %2$s \n \n  • Exibição do azimute na distância medida \n + Enviar log \ No newline at end of file From f73adeb057739e979487d1e2dafe1ce2354a1797 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Tue, 16 Apr 2019 21:29:10 +0000 Subject: [PATCH 037/114] Translated using Weblate (Sardinian) Currently translated at 99.6% (2738 of 2750 strings) --- OsmAnd/res/values-sc/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 641ff08d6f..892da7d28a 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -3016,4 +3016,5 @@ Pro praghere iscrie su còdighe intreu \n • Ammustra s\'azimuth in Medi sa distàntzia \n \n + Imbia su registru \ No newline at end of file From a954e181b1809a22679281b9e69c0bf670cc463f Mon Sep 17 00:00:00 2001 From: Franco Date: Wed, 17 Apr 2019 13:00:42 +0000 Subject: [PATCH 038/114] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-es-rUS/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 67d8073e63..5b6a2becb6 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -3029,4 +3029,5 @@ Lon %2$s \n \n • Visualización de medida «azimut» en «Medir distancia» \n + Enviar registro del problema \ No newline at end of file From d1be6ce7e9daff8eac936a2fa22c261d2ea7f641 Mon Sep 17 00:00:00 2001 From: Franco Date: Wed, 17 Apr 2019 13:01:06 +0000 Subject: [PATCH 039/114] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (215 of 215 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/es_US/ --- OsmAnd-telegram/res/values-es-rUS/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-es-rUS/strings.xml b/OsmAnd-telegram/res/values-es-rUS/strings.xml index 60e5837825..d413701d43 100644 --- a/OsmAnd-telegram/res/values-es-rUS/strings.xml +++ b/OsmAnd-telegram/res/values-es-rUS/strings.xml @@ -212,4 +212,8 @@ Activa la monitorización para guardar todas las ubicaciones en el historial. Rastreador en línea Rastreador de OsmAnd + Buscar contactos + Busca en todos tus grupos y contactos. + Escribe el nombre del contacto o grupo + Buscar \ No newline at end of file From 0bae89f4f2c0ceb25a4581db06838445c1c2b930 Mon Sep 17 00:00:00 2001 From: Franco Date: Wed, 17 Apr 2019 13:02:38 +0000 Subject: [PATCH 040/114] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-es-rAR/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 5275a05a42..610e1be314 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3028,4 +3028,5 @@ Lon %2$s \n \n• Visualización de medida «azimut» en «Medir distancia» \n + Enviar registro del problema \ No newline at end of file From 0ed397ecf920ae2490c5d30f7e773efc7cec69be Mon Sep 17 00:00:00 2001 From: ___ Date: Wed, 17 Apr 2019 18:01:59 +0000 Subject: [PATCH 041/114] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-uk/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml index 5bf1da6450..79e8c24032 100644 --- a/OsmAnd/res/values-uk/strings.xml +++ b/OsmAnd/res/values-uk/strings.xml @@ -3019,4 +3019,5 @@ Ви використовуєте {0} мапу, надану OsmAnd. Хочете запустити повну версію OsmAnd\? Уникати мостові та бруківку Уникати мостові та бруківку + Надіслати журнал \ No newline at end of file From 055c403f14a2a3c676555b99f2d0e355875d26fc Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Fri, 19 Apr 2019 10:24:53 +0300 Subject: [PATCH 042/114] add pr fixes, add AidlCallbackListener documentation --- .../net/osmand/aidl/AidlCallbackListener.java | 30 +++++++++++++- OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 6 +-- .../osmand/plus/routing/RoutingHelper.java | 40 ++++++++----------- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java index 95d958fb39..71fe1f1b8f 100644 --- a/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java +++ b/OsmAnd/src/net/osmand/aidl/AidlCallbackListener.java @@ -2,8 +2,36 @@ package net.osmand.aidl; import java.util.Map; -public interface AidlCallbackListener{ +public interface AidlCallbackListener { + + /** + * Add AidlCallbackListener to OsmandAidlService's map of listeners. Key is unique to each AIDL + * method that wants to register callback and used to access only "own" callbacks. + * + * @param callback + * @param key - every AIDL method which uses that register callbacks in service need to use its own bit key + * 1 - key for registerForUpdates(...) + * 2 - key for registerForNavigationUpdates(...) + * 4 - key for onContextMenuButtonClicked(...) + * 8 - key for... future use + * 16 - key for... future use + * @return long - unique id of callback. Could be used for unregistering callback + */ long addAidlCallback(IOsmAndAidlCallback callback, int key); + + + /** + * Unregister AidlCallbackListener from OsmandAidlService's map + * + * @param id - unique id of callback + * @return - true if callback successfully unregistered + */ boolean removeAidlCallback(long id); + + /** + * + * @return map of all callbacks. AidlCallbackParams contains method key and callback. + */ Map getAidlCallbacks(); + } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java index f51e292677..a8cd1acfcc 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java @@ -25,8 +25,6 @@ import android.text.TextUtils; import android.view.View; import android.widget.ArrayAdapter; -import java.util.HashMap; -import java.util.Map.Entry; import net.osmand.CallbackWithObject; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; @@ -1961,11 +1959,11 @@ public class OsmandAidlApi { } }; navUpdateCallbacks.put(id, listener); - app.getRoutingHelper().addDataUpdateListener(listener); + app.getRoutingHelper().addRouteDataListener(listener); } public void unregisterFromUpdates(long id) { - app.getRoutingHelper().removeDataUpdateListener(navUpdateCallbacks.get(id)); + app.getRoutingHelper().removeRouteDataListener(navUpdateCallbacks.get(id)); navUpdateCallbacks.remove(id); } diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index c3117224f3..86ceb4f8e6 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -30,7 +30,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; import static net.osmand.plus.notifications.OsmandNotification.NotificationType.NAVIGATION; @@ -267,31 +266,29 @@ public class RoutingHelper { transportRoutingHelper.addListener(l); } - public void addDataUpdateListener(IRoutingDataUpdateListener listener) { - List> copyList = new ArrayList<>(updateListeners); - Iterator> it = copyList.iterator(); - while (it.hasNext()) { - WeakReference ref = it.next(); - IRoutingDataUpdateListener l = ref.get(); - if (l == null) { - it.remove(); - } - } - copyList.add(new WeakReference<>(listener)); - updateListeners = copyList; + public void addRouteDataListener(IRoutingDataUpdateListener listener) { + updateListeners = updateListenersList(new ArrayList<>(updateListeners), listener, true); } - public void removeDataUpdateListener(IRoutingDataUpdateListener listener) { - List> copyList = new ArrayList<>(updateListeners); + public void removeRouteDataListener(IRoutingDataUpdateListener listener) { + updateListeners = updateListenersList(new ArrayList<>(updateListeners), listener, false); + } + + private List> updateListenersList( + List> copyList, + IRoutingDataUpdateListener listener, boolean isNewListener) { Iterator> it = copyList.iterator(); while (it.hasNext()) { WeakReference ref = it.next(); IRoutingDataUpdateListener l = ref.get(); - if (l == null || l == listener) { + if (l == null || (l == listener)) { it.remove(); } } - updateListeners = copyList; + if (isNewListener) { + copyList.add(new WeakReference<>(listener)); + } + return copyList; } public boolean removeListener(IRouteInformationListener lt){ @@ -533,16 +530,11 @@ public class RoutingHelper { app.getNotificationHelper().refreshNotification(NotificationType.NAVIGATION); if (!updateListeners.isEmpty()) { ArrayList> tmp = new ArrayList<>(updateListeners); - Iterator> it = tmp.iterator(); - while (it.hasNext()) { - WeakReference ref = it.next(); + for (WeakReference ref : tmp) { IRoutingDataUpdateListener l = ref.get(); - if (l == null) { - it.remove(); - } else { + if (l != null) { l.onRoutingDataUpdate(); } - updateListeners = tmp; } } } else { From f2f5511f588a1d2d7ba76e144a2bcbfe843f6e4b Mon Sep 17 00:00:00 2001 From: crimean Date: Fri, 19 Apr 2019 12:40:10 +0300 Subject: [PATCH 043/114] Synchronize main chart and info charts at route details --- .../RouteDetailsFragment.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java index 6d60fd36e1..cb4f296334 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java @@ -314,11 +314,12 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT OsmandApplication app = mapActivity.getMyApplication(); statisticCard = new RouteStatisticCard(mapActivity, gpx, new OnTouchListener() { @Override - public boolean onTouch(View v, MotionEvent event) { + public boolean onTouch(View v, MotionEvent ev) { InterceptorLinearLayout mainView = getMainView(); if (mainView != null) { mainView.requestDisallowInterceptTouchEvent(true); } + dispatchEventToInfoCards(v, ev); return false; } }, new OnClickListener() { @@ -394,21 +395,33 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent ev) { - if (ev.getSource() != 0) { - for (RouteInfoCard card : routeInfoCards) { - final HorizontalBarChart ch = card.getChart(); - if (ch != null && v instanceof HorizontalBarChart && ch != v) { + if (ev.getSource() != 0 && v instanceof HorizontalBarChart) { + if (statisticCard != null) { + LineChart ch = statisticCard.getChart(); + if (ch != null) { final MotionEvent event = MotionEvent.obtainNoHistory(ev); event.setSource(0); ch.dispatchTouchEvent(event); } } + dispatchEventToInfoCards(v, ev); } return false; } }; } + private void dispatchEventToInfoCards(View v, MotionEvent ev) { + for (RouteInfoCard card : routeInfoCards) { + final HorizontalBarChart ch = card.getChart(); + if (ch != null && ch != v) { + final MotionEvent event = MotionEvent.obtainNoHistory(ev); + event.setSource(0); + ch.dispatchTouchEvent(event); + } + } + } + @SuppressLint("ClickableViewAccessibility") private void addRouteCard(final LinearLayout cardsContainer, RouteInfoCard routeInfoCard) { OsmandApplication app = requireMyApplication(); From 347d9358b295ed2ed37f1b14c5ceb7404b3e088b Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Fri, 19 Apr 2019 13:28:27 +0300 Subject: [PATCH 044/114] fixed older code. --- .../osmand/plus/routing/RoutingHelper.java | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java index 86ceb4f8e6..bae4c245fb 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java +++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java @@ -261,10 +261,6 @@ public class RoutingHelper { return lastProjection; } - public void addListener(IRouteInformationListener l){ - listeners.add(new WeakReference<>(l)); - transportRoutingHelper.addListener(l); - } public void addRouteDataListener(IRoutingDataUpdateListener listener) { updateListeners = updateListenersList(new ArrayList<>(updateListeners), listener, true); @@ -281,7 +277,7 @@ public class RoutingHelper { while (it.hasNext()) { WeakReference ref = it.next(); IRoutingDataUpdateListener l = ref.get(); - if (l == null || (l == listener)) { + if (l == null || l == listener) { it.remove(); } } @@ -291,20 +287,34 @@ public class RoutingHelper { return copyList; } - public boolean removeListener(IRouteInformationListener lt){ - Iterator> it = listeners.iterator(); - while(it.hasNext()) { + public void addListener(IRouteInformationListener l){ + listeners = updateInformationListeners(new ArrayList<>(listeners), l, true); + transportRoutingHelper.addListener(l); + } + + public void removeListener(IRouteInformationListener lt){ + listeners = updateInformationListeners(new ArrayList<>(listeners), lt, false); + } + + private List> updateInformationListeners( + List> copyList, + IRouteInformationListener listener, boolean isNewListener) { + Iterator> it = copyList.iterator(); + while (it.hasNext()) { WeakReference ref = it.next(); IRouteInformationListener l = ref.get(); - if(l == null || lt == l) { + if (l == null || l == listener) { it.remove(); - return true; } } - transportRoutingHelper.removeListener(lt); - return false; + + if (isNewListener) { + copyList.add(new WeakReference<>(listener)); + } + return copyList; } + public void updateLocation(Location currentLocation) { if (settings.getPointToStart() == null && settings.getMyLocationToStart() == null && currentLocation != null) { app.getTargetPointsHelper().setMyLocationPoint( From 83138098652fcfd8271d3969ac86037fb0001baa Mon Sep 17 00:00:00 2001 From: xmd5a Date: Fri, 19 Apr 2019 17:02:31 +0300 Subject: [PATCH 045/114] Add phrases --- OsmAnd/res/values-ru/phrases.xml | 2 ++ OsmAnd/res/values/phrases.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index 598f6d4c21..f845086e03 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -3457,5 +3457,7 @@ Газовый факел Спасательный ящик + Место для скалолазания + Да \ No newline at end of file diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index f15aaa1a85..77769ae472 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -113,6 +113,7 @@ Denotation Park and ride Difficulty category + Climbing crag Store @@ -3936,5 +3937,6 @@ Deleted object Rescue box + Yes From 8aea5d6da7f1257cae8555bf63548b5f87ffb6f9 Mon Sep 17 00:00:00 2001 From: Hellohat Date: Fri, 19 Apr 2019 15:11:45 +0000 Subject: [PATCH 046/114] Translated using Weblate (French) Currently translated at 90.7% (3230 of 3563 strings) --- OsmAnd/res/values-fr/phrases.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml index 448cbf960b..344f8fb873 100644 --- a/OsmAnd/res/values-fr/phrases.xml +++ b/OsmAnd/res/values-fr/phrases.xml @@ -1677,8 +1677,8 @@ Dojo Oui Sans banc - Avec panier - Sans panier + Avec poubelle + Sans poubelle Avec accès Internet Salle de sport Billards From 97905e1744668d1d4b69db666dcbbe72436da72b Mon Sep 17 00:00:00 2001 From: IgorEliezer Date: Fri, 19 Apr 2019 14:20:41 +0000 Subject: [PATCH 047/114] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.9% (3563 of 3565 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index bfb39358ad..0fa2d9fb62 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -3578,4 +3578,5 @@ Explosão de gás;Queimador de gás Objeto excluído Radioterapia + \ No newline at end of file From 9a839f1aac0ab4f7b77f6077904b641de55172a1 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Fri, 19 Apr 2019 16:54:46 +0000 Subject: [PATCH 048/114] Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.9% (3563 of 3565 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index 0fa2d9fb62..84f0886a19 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -3579,4 +3579,5 @@ Objeto excluído Radioterapia + Penhasco de escalada \ No newline at end of file From adbc1bdfa938c876b5666b4641edcadd419f3538 Mon Sep 17 00:00:00 2001 From: Eduardo Addad de Oliveira Date: Fri, 19 Apr 2019 16:55:08 +0000 Subject: [PATCH 049/114] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-pt-rBR/phrases.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml index 84f0886a19..3357b7bba1 100644 --- a/OsmAnd/res/values-pt-rBR/phrases.xml +++ b/OsmAnd/res/values-pt-rBR/phrases.xml @@ -3578,6 +3578,7 @@ Explosão de gás;Queimador de gás Objeto excluído Radioterapia - + Caixa de resgate Penhasco de escalada + Sim \ No newline at end of file From 984120dda72c37382fbdbeedfaccd7c58d11e4f4 Mon Sep 17 00:00:00 2001 From: crimean Date: Sat, 20 Apr 2019 12:34:11 +0300 Subject: [PATCH 050/114] Fix route details charts sync. Highlight with vert line. --- .../net/osmand/plus/helpers/GpxUiHelper.java | 4 +- .../RouteDetailsFragment.java | 105 +++++++++--------- .../cards/CardChartListener.java | 68 ------------ .../cards/RouteInfoCard.java | 2 + .../cards/RouteStatisticCard.java | 46 ++------ 5 files changed, 69 insertions(+), 156 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index 04bc14c9bd..c3f5976c4a 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -1255,8 +1255,6 @@ public class GpxUiHelper { yr.setDrawGridLines(false); yr.setAxisMinimum(0f); chart.setMinOffset(0); - chart.setExtraRightOffset(16); - chart.setExtraLeftOffset(16); int mainFontColor = ContextCompat.getColor(app, nightMode ? R.color.main_font_dark : R.color.main_font_light); yl.setTextColor(mainFontColor); @@ -1300,7 +1298,7 @@ public class GpxUiHelper { entries.add(new BarEntry(0, stacks)); BarDataSet barDataSet = new BarDataSet(entries, ""); barDataSet.setColors(colors); - barDataSet.setHighLightColor(ContextCompat.getColor(app, R.color.color_white)); + barDataSet.setHighLightColor(!nightMode ? mChart.getResources().getColor(R.color.secondary_text_light) : mChart.getResources().getColor(R.color.secondary_text_dark)); BarData dataSet = new BarData(barDataSet); dataSet.setDrawValues(false); dataSet.setBarWidth(1); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java index cb4f296334..15ed87f13b 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java @@ -2,6 +2,7 @@ package net.osmand.plus.routepreparationmenu; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; @@ -28,11 +29,14 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import com.github.mikephil.charting.animation.ChartAnimator; import com.github.mikephil.charting.charts.HorizontalBarChart; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; -import com.github.mikephil.charting.listener.ChartTouchListener; +import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; +import com.github.mikephil.charting.renderer.HorizontalBarChartRenderer; +import com.github.mikephil.charting.utils.ViewPortHandler; import net.osmand.AndroidUtils; import net.osmand.GPXUtilities.GPXFile; @@ -319,7 +323,14 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT if (mainView != null) { mainView.requestDisallowInterceptTouchEvent(true); } - dispatchEventToInfoCards(v, ev); + for (RouteInfoCard card : routeInfoCards) { + final HorizontalBarChart ch = card.getChart(); + if (ch != null) { + final MotionEvent event = MotionEvent.obtainNoHistory(ev); + event.setSource(0); + ch.dispatchTouchEvent(event); + } + } return false; } }, new OnClickListener() { @@ -373,6 +384,8 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT trackDetailsMenu.setMapActivity(mapActivity); LineChart chart = statisticCard.getChart(); if (chart != null) { + chart.setExtraRightOffset(16); + chart.setExtraLeftOffset(16); trackDetailsMenu.refreshChart(chart, true); } } @@ -404,24 +417,13 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ch.dispatchTouchEvent(event); } } - dispatchEventToInfoCards(v, ev); + return true; } return false; } }; } - private void dispatchEventToInfoCards(View v, MotionEvent ev) { - for (RouteInfoCard card : routeInfoCards) { - final HorizontalBarChart ch = card.getChart(); - if (ch != null && ch != v) { - final MotionEvent event = MotionEvent.obtainNoHistory(ev); - event.setSource(0); - ch.dispatchTouchEvent(event); - } - } - } - @SuppressLint("ClickableViewAccessibility") private void addRouteCard(final LinearLayout cardsContainer, RouteInfoCard routeInfoCard) { OsmandApplication app = requireMyApplication(); @@ -433,6 +435,14 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT routeInfoCards.add(routeInfoCard); HorizontalBarChart chart = routeInfoCard.getChart(); if (chart != null) { + LineChart mainChart = statisticCard.getChart(); + if (mainChart != null) { + chart.getAxisRight().setAxisMinimum(mainChart.getXChartMin()); + chart.getAxisRight().setAxisMaximum(mainChart.getXChartMax()); + } + chart.setRenderer(new CustomBarChartRenderer(chart, chart.getAnimator(), chart.getViewPortHandler(), AndroidUtils.dpToPx(app, 1f) / 2f)); + chart.setHighlightPerDragEnabled(false); + chart.setHighlightPerTapEnabled(false); chart.setOnTouchListener(getChartTouchListener()); } } @@ -1645,49 +1655,28 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT } } + private void highlightRouteInfoCharts(@Nullable Highlight h) { + for (RouteInfoCard rc : routeInfoCards) { + HorizontalBarChart chart = rc.getChart(); + if (chart != null) { + Highlight bh = h != null ? chart.getHighlighter().getHighlight(1, h.getXPx()) : null; + if (bh != null) { + bh.setDraw(h.getXPx(), 0); + } + chart.highlightValue(bh, true); + } + } + } + @Override public void onValueSelected(BaseCard card, Entry e, Highlight h) { refreshChart(); + highlightRouteInfoCharts(h); } @Override public void onNothingSelected(BaseCard card) { - } - - @Override - public void onChartGestureStart(BaseCard card, MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { - } - - @Override - public void onChartGestureEnd(BaseCard card, MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { - } - - @Override - public void onChartLongPressed(BaseCard card, MotionEvent me) { - } - - @Override - public void onChartDoubleTapped(BaseCard card, MotionEvent me) { - } - - @Override - public void onChartSingleTapped(BaseCard card, MotionEvent me) { - } - - @Override - public void onChartFling(BaseCard card, MotionEvent me1, MotionEvent me2, float velocityX, - float velocityY) { - } - - @Override - public void onChartScale(BaseCard card, MotionEvent me, float scaleX, float scaleY) { - } - - @Override - public void onChartTranslate(BaseCard card, Highlight h, MotionEvent me, float dX, float dY) { - if (h != null) { - refreshChart(); - } + highlightRouteInfoCharts(null); } public static class CumulativeInfo { @@ -1718,4 +1707,20 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT final int timeInSeconds = model.getExpectedTime(); return Algorithms.formatDuration(timeInSeconds, app.accessibilityEnabled()); } + + private static class CustomBarChartRenderer extends HorizontalBarChartRenderer { + + private float highlightHalfWidth; + + CustomBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler, float highlightHalfWidth) { + super(chart, animator, viewPortHandler); + this.highlightHalfWidth = highlightHalfWidth; + } + + @Override + protected void setHighlightDrawPos(Highlight high, RectF bar) { + bar.left = high.getDrawX() - highlightHalfWidth; + bar.right = high.getDrawX() + highlightHalfWidth; + } + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java index e4a215ed83..aa6193b034 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java @@ -1,10 +1,7 @@ package net.osmand.plus.routepreparationmenu.cards; -import android.view.MotionEvent; - import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; -import com.github.mikephil.charting.listener.ChartTouchListener; public interface CardChartListener { /** @@ -20,69 +17,4 @@ public interface CardChartListener { * Called when nothing has been selected or an "un-select" has been made. */ void onNothingSelected(BaseCard card); - - /** - * Callbacks when a touch-gesture has started on the chart (ACTION_DOWN) - * - * @param me - * @param lastPerformedGesture - */ - void onChartGestureStart(BaseCard card, MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture); - - /** - * Callbacks when a touch-gesture has ended on the chart (ACTION_UP, ACTION_CANCEL) - * - * @param me - * @param lastPerformedGesture - */ - void onChartGestureEnd(BaseCard card, MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture); - - /** - * Callbacks when the chart is longpressed. - * - * @param me - */ - void onChartLongPressed(BaseCard card, MotionEvent me); - - /** - * Callbacks when the chart is double-tapped. - * - * @param me - */ - void onChartDoubleTapped(BaseCard card, MotionEvent me); - - /** - * Callbacks when the chart is single-tapped. - * - * @param me - */ - void onChartSingleTapped(BaseCard card, MotionEvent me); - - /** - * Callbacks then a fling gesture is made on the chart. - * - * @param me1 - * @param me2 - * @param velocityX - * @param velocityY - */ - void onChartFling(BaseCard card, MotionEvent me1, MotionEvent me2, float velocityX, float velocityY); - - /** - * Callbacks when the chart is scaled / zoomed via pinch zoom gesture. - * - * @param me - * @param scaleX scalefactor on the x-axis - * @param scaleY scalefactor on the y-axis - */ - void onChartScale(BaseCard card, MotionEvent me, float scaleX, float scaleY); - - /** - * Callbacks when the chart is moved / translated via drag gesture. - * - * @param me - * @param dX translation distance on the x-axis - * @param dY translation distance on the y-axis - */ - void onChartTranslate(BaseCard card, Highlight h, MotionEvent me, float dX, float dY); } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java index 7a09b837c7..6ccd795f7d 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteInfoCard.java @@ -75,6 +75,8 @@ public class RouteInfoCard extends BaseCard { updateHeader(); final HorizontalBarChart chart = (HorizontalBarChart) view.findViewById(R.id.chart); GpxUiHelper.setupHorizontalGPXChart(app, chart, 5, 9, 24, true, nightMode); + chart.setExtraRightOffset(16); + chart.setExtraLeftOffset(16); BarData barData = GpxUiHelper.buildStatisticChart(app, chart, routeStatistics, analysis, true, nightMode); chart.setData(barData); chart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() { diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java index d699ebdaa8..41c17a15ac 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java @@ -22,6 +22,7 @@ import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture; import com.github.mikephil.charting.listener.OnChartGestureListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener; +import com.github.mikephil.charting.utils.MPPointD; import net.osmand.AndroidUtils; import net.osmand.GPXUtilities.GPXFile; @@ -287,10 +288,6 @@ public class RouteStatisticCard extends BaseCard { } else { highlightDrawX = -1; } - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartGestureStart(RouteStatisticCard.this, me, lastPerformedGesture); - } } @Override @@ -302,65 +299,44 @@ public class RouteStatisticCard extends BaseCard { } else { gpxItem.chartHighlightPos = -1; } - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartGestureEnd(RouteStatisticCard.this, me, lastPerformedGesture); - } } @Override public void onChartLongPressed(MotionEvent me) { - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartLongPressed(RouteStatisticCard.this, me); - } } @Override public void onChartDoubleTapped(MotionEvent me) { - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartDoubleTapped(RouteStatisticCard.this, me); - } } @Override public void onChartSingleTapped(MotionEvent me) { - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartSingleTapped(RouteStatisticCard.this, me); - } } @Override public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartFling(RouteStatisticCard.this, me1, me2, velocityX, velocityY); - } } @Override public void onChartScale(MotionEvent me, float scaleX, float scaleY) { - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartScale(RouteStatisticCard.this, me, scaleX, scaleY); - } } @Override public void onChartTranslate(MotionEvent me, float dX, float dY) { - Highlight h = null; if (highlightDrawX != -1) { - h = mChart.getHighlightByTouchPoint(highlightDrawX, 0f); + Highlight h = mChart.getHighlightByTouchPoint(highlightDrawX, 0f); if (h != null) { - mChart.highlightValue(h); + /* + ILineDataSet set = mChart.getLineData().getDataSetByIndex(h.getDataSetIndex()); + if (set != null && set.isHighlightEnabled()) { + Entry e = set.getEntryForXValue(h.getX(), h.getY()); + MPPointD pix = mChart.getTransformer(set.getAxisDependency()).getPixelForValues(e.getX(), e.getY()); + h.setDraw((float) pix.x, (float) pix.y); + } + */ + mChart.highlightValue(h, true); } } - CardChartListener chartListener = getChartListener(); - if (chartListener != null) { - chartListener.onChartTranslate(RouteStatisticCard.this, h, me, dX, dY); - } } }); mChart.setVisibility(View.VISIBLE); From ab5da3422543c4574b7b1e66c50db4f33c161b27 Mon Sep 17 00:00:00 2001 From: Chumva Date: Sat, 20 Apr 2019 12:36:04 +0300 Subject: [PATCH 051/114] Update tracker aidl methods --- .../net/osmand/aidl/IOsmAndAidlCallback.aidl | 27 +- .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 527 +++++++++++++++++- .../osmand/aidl/copyfile/CopyFileParams.aidl | 3 + .../osmand/aidl/copyfile/CopyFileParams.java | 78 +++ .../src/net/osmand/aidl/gpx/AGpxBitmap.java | 4 - .../net/osmand/aidl/gpx/ASelectedGpxFile.java | 42 +- .../net/osmand/aidl/maplayer/AMapLayer.java | 4 + .../osmand/aidl/maplayer/point/AMapPoint.java | 3 +- .../aidl/navigation/ADirectionInfo.aidl | 3 + .../aidl/navigation/ADirectionInfo.java | 73 +++ .../navigation/ANavigationUpdateParams.aidl | 4 + .../navigation/ANavigationUpdateParams.java | 57 ++ .../aidl/navigation/NavigateSearchParams.java | 20 +- .../net/osmand/aidl/search/SearchParams.java | 14 +- .../telegram/helpers/OsmandAidlHelper.kt | 8 +- 15 files changed, 844 insertions(+), 23 deletions(-) create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.java create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.java create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java diff --git a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl index 6f0cb8f65b..87f6de79c4 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl +++ b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl @@ -2,13 +2,38 @@ package net.osmand.aidl; import net.osmand.aidl.search.SearchResult; import net.osmand.aidl.gpx.AGpxBitmap; +import net.osmand.aidl.navigation.ADirectionInfo; interface IOsmAndAidlCallback { + + /** + * Callback for search requests. + * + * @return resultSet - set of SearchResult + */ void onSearchComplete(in List resultSet); - + + /** + * Callback for {@link IOsmAndAidlInterface} registerForUpdates() method. + */ void onUpdate(); + /** + * Callback for {@link IOsmAndAidlInterface} registerForOsmandInitListener() method. + */ void onAppInitialized(); + /** + * Callback for {@link IOsmAndAidlInterface} getBitmapForGpx() method. + * + * @return bitmap - snapshot image of gpx track on map + */ void onGpxBitmapCreated(in AGpxBitmap bitmap); + + /** + * Callback for {@link IOsmAndAidlInterface} registerForNavigationUpdates() method. + * + * @return directionInfo - update on distance to next turn and turns type. + */ + void updateNavigationInfo(in ADirectionInfo directionInfo); } \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl index 59fd213ab6..1ac8569bfc 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl +++ b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl @@ -54,7 +54,6 @@ import net.osmand.aidl.gpx.RemoveGpxParams; import net.osmand.aidl.maplayer.point.ShowMapPointParams; import net.osmand.aidl.navdrawer.SetNavDrawerItemsParams; - import net.osmand.aidl.navdrawer.NavDrawerFooterParams; import net.osmand.aidl.navdrawer.NavDrawerHeaderParams; @@ -76,104 +75,620 @@ import net.osmand.aidl.customization.OsmandSettingsParams; import net.osmand.aidl.gpx.AGpxFile; import net.osmand.aidl.gpx.AGpxFileDetails; import net.osmand.aidl.gpx.CreateGpxBitmapParams; + import net.osmand.aidl.tiles.ASqliteDbFile; import net.osmand.aidl.plugins.PluginParams; +import net.osmand.aidl.copyfile.CopyFileParams; + +import net.osmand.aidl.navigation.ANavigationUpdateParams; + // NOTE: Add new methods at the end of file!!! interface IOsmAndAidlInterface { + /** + * Add map marker at given location. + * + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String)- name of marker. + */ boolean addMapMarker(in AddMapMarkerParams params); + + /** + * Add map marker at given location. + * + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String)- name of marker. + */ boolean removeMapMarker(in RemoveMapMarkerParams params); + + /** + * Update map marker at given location with name. + * + * @param latPrev (double) - latitude (current marker). + * @param lonPrev (double) - longitude (current marker). + * @param namePrev (String) - name (current marker). + * @param latNew (double) - latitude (new marker). + * @param lonNew (double) - longitude (new marker). + * @param nameNew (String) - name (new marker). + */ boolean updateMapMarker(in UpdateMapMarkerParams params); + /** + * Add map widget to the right side of the main screen. + * Note: any specified icon should exist in OsmAnd app resources. + * + * @param id (String) - widget id. + * @param menuIconName (String) - icon name (configure map menu). + * @param menuTitle (String) - widget name (configure map menu). + * @param lightIconName (String) - icon name for the light theme (widget). + * @param darkIconName (String) - icon name for the dark theme (widget). + * @param text (String) - main widget text. + * @param description (String) - sub text, like "km/h". + * @param order (int) - order position in the widgets list. + * @param intentOnClick (String) - onClick intent. Called after click on widget as startActivity(Intent intent). + */ boolean addMapWidget(in AddMapWidgetParams params); + + /** + * Remove map widget. + * + * @param (String) id - widget id. + */ boolean removeMapWidget(in RemoveMapWidgetParams params); + + /** + * Update map widget. + * Note: any specified icon should exist in OsmAnd app resources. + * + * @param id (String) - widget id. + * @param menuIconName (String) - icon name (configure map menu). + * @param menuTitle (String) - widget name (configure map menu). + * @param lightIconName (String) - icon name for the light theme (widget). + * @param darkIconName (String) - icon name for the dark theme (widget). + * @param text (String) - main widget text. + * @param description (String) - sub text, like "km/h". + * @param order (int) - order position in the widgets list. + * @param intentOnClick (String) - onClick intent. Called after click on widget as startActivity(Intent intent). + */ boolean updateMapWidget(in UpdateMapWidgetParams params); + /** + * Add point to user layer. + * + * @param layerId (String) - layer id. Note: layer should be added first. + * @param pointId (String) - point id. + * @param shortName (String) - short name (single char). Displayed on the map. + * @param fullName (String) - full name. Displayed in the context menu on first row. + * @param typeName (String) - type name. Displayed in context menu on second row. + * @param color (int) - color of circle's background. + * @param location (ALatLon) - location of the point. + * @param details (List)- list of details. Displayed under context menu. + * @param params (Map) - optional map of params for point. + */ boolean addMapPoint(in AddMapPointParams params); + + + /** + * Remove point. + * + * @param layerId (String) - layer id. + * @param pointId (String) - point id. + */ boolean removeMapPoint(in RemoveMapPointParams params); + + /** + * Update point. + * + * @param layerId (String) - layer id. + * @param pointId (String) - point id. + * @param shortName (String) - short name (single char). Displayed on the map. + * @param fullName (String) - full name. Displayed in the context menu on first row. + * @param typeName (String) - type name. Displayed in context menu on second row. + * @param color (String) - color of circle's background. + * @param location (ALatLon)- location of the point. + * @param details (List) - list of details. Displayed under context menu. + * @param params (Map) - optional map of params for point. + */ boolean updateMapPoint(in UpdateMapPointParams params); + /** + * Add user layer on the map. + * + * @param id (String) - layer id. + * @param name (String) - layer name. + * @param zOrder (float) - z-order position of layer. Default value is 5.5f + * @param points Map - initial list of points. Nullable. + * @param imagePoints (boolean) - use new style for points on map or not. Also default zoom bounds for new style can be edited. + */ boolean addMapLayer(in AddMapLayerParams params); + + /** + * Remove user layer. + * + * @param id (String) - layer id. + */ boolean removeMapLayer(in RemoveMapLayerParams params); + + /** + * Update user layer. + * + * @param id (String) - layer id. + * @param name (String) - layer name. + * @param zOrder (float) - z-order position of layer. Default value is 5.5f + * @param points Map - list of points. Nullable. + * @param imagePoints (boolean) - use new style for points on map or not. Also default zoom bounds for new style can be edited. + */ boolean updateMapLayer(in UpdateMapLayerParams params); - boolean importGpx(in ImportGpxParams params); - boolean showGpx(in ShowGpxParams params); - boolean hideGpx(in HideGpxParams params); - boolean getActiveGpx(out List files); + /** + * Import GPX file to OsmAnd (from URI or file). + * + * @param gpxUri (Uri) - URI created by FileProvider (preferable method). + * @param file (File) - File which represents GPX track (not recomended, OsmAnd should have rights to access file location). + * @param fileName (String) - Destination file name. May contain dirs. + * @param color (String) - color of gpx. Can be one of: "red", "orange", "lightblue", "blue", "purple", + * "translucent_red", "translucent_orange", "translucent_lightblue", + * "translucent_blue", "translucent_purple" + * @param show (boolean) - show track on the map after import + */ + boolean importGpx(in ImportGpxParams params); + + /** + * Show GPX file on map. + * + * @param fileName (String) - file name to show. Must be imported first. + */ + boolean showGpx(in ShowGpxParams params); + + /** + * Hide GPX file. + * + * @param fileName (String) - file name to hide. + */ + boolean hideGpx(in HideGpxParams params); + + /** + * Get list of active GPX files. + * + * @return list of active gpx files. + */ + boolean getActiveGpx(out List files); + + /** + * Set map view to current location. + * + * @param latitude (double) - latitude of new map center. + * @param longitude (double) - longitude of new map center. + * @param zoom (float) - map zoom level. Set 0 to keep zoom unchanged. + * @param animated (boolean) - set true to animate changes. + */ + boolean setMapLocation(in SetMapLocationParams params); + - boolean setMapLocation(in SetMapLocationParams params); boolean calculateRoute(in CalculateRouteParams params); + /** + * Refresh the map (UI) + */ boolean refreshMap(); + /** + * Add favorite group with given params. + * + * @param name (String) - group name. + * @param color (String) - group color. Can be one of: "red", "orange", "yellow", + * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". + * @param visible (boolean) - group visibility. + */ boolean addFavoriteGroup(in AddFavoriteGroupParams params); + + /** + * Update favorite group with given params. + * + * @param namePrev (String) - group name (current). + * @param colorPrev (String) - group color (current). + * @param visiblePrev (boolean) - group visibility (current). + * @param nameNew (String) - group name (new). + * @param colorNew (String) - group color (new). + * @param visibleNew (boolean) - group visibility (new). + */ boolean removeFavoriteGroup(in RemoveFavoriteGroupParams params); + + /** + * Remove favorite group with given name. + * + * @param name (String) - name of favorite group. + */ boolean updateFavoriteGroup(in UpdateFavoriteGroupParams params); + /** + * Add favorite at given location with given params. + * + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String) - name of favorite item. + * @param description (String) - description of favorite item. + * @param category (String) - category of favorite item. + * @param color (String) - color of favorite item. Can be one of: "red", "orange", "yellow", + * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". + * @param visible (boolean) - should favorite item be visible after creation. + */ boolean addFavorite(in AddFavoriteParams params); + + /** + * Update favorite at given location with given params. + * + * @param latPrev (double) - latitude (current favorite). + * @param lonPrev (double) - longitude (current favorite). + * @param namePrev (String) - name of favorite item (current favorite). + * @param categoryPrev (String) - category of favorite item (current favorite). + * @param latNew (double) - latitude (new favorite). + * @param lonNew (double) - longitude (new favorite). + * @param nameNew (String) - name of favorite item (new favorite). + * @param descriptionNew (String) - description of favorite item (new favorite). + * @param categoryNew (String) - category of favorite item (new favorite). Use only to create a new category, + * not to update an existing one. If you want to update an existing category, + * use the {@link #updateFavoriteGroup(String, String, boolean, String, String, boolean)} method. + * @param colorNew (String) - color of new category. Can be one of: "red", "orange", "yellow", + * "lightgreen", "green", "lightblue", "blue", "purple", "pink", "brown". + * @param visibleNew (boolean) - should new category be visible after creation. + */ boolean removeFavorite(in RemoveFavoriteParams params); + + /** + * Remove favorite at given location with given params. + * + * @param lat (double) - latitude. + * @param lon (double) - longitude. + * @param name (String) - name of favorite item. + * @param category (String) - category of favorite item. + */ boolean updateFavorite(in UpdateFavoriteParams params); + /** + * Start gpx recording. + */ boolean startGpxRecording(in StartGpxRecordingParams params); + + /** + * Stop gpx recording. + */ boolean stopGpxRecording(in StopGpxRecordingParams params); + /** + * Take photo note. + * + * @param lat (double) - latutude of photo note. + * @param lon (double) - longitude of photo note. + */ boolean takePhotoNote(in TakePhotoNoteParams params); + + /** + * Start video note recording. + * + * @param lat (double) - latutude of video note point. + * @param lon (double) - longitude of video note point. + */ boolean startVideoRecording(in StartVideoRecordingParams params); + + /** + * Start audio note recording. + * + * @param lat (double) - latutude of audio note point. + * @param lon (double) - longitude of audio note point. + */ boolean startAudioRecording(in StartAudioRecordingParams params); + + /** + * Stop Audio/Video recording. + */ boolean stopRecording(in StopRecordingParams params); + /** + * Start navigation. + * + * @param startName (String) - name of the start point as it displays in OsmAnd's UI. Nullable. + * @param startLat (double) - latitude of the start point. If 0 - current location is used. + * @param startLon (double) - longitude of the start point. If 0 - current location is used. + * @param destName (String) - name of the start point as it displays in OsmAnd's UI. + * @param destLat (double) - latitude of a destination point. + * @param destLon (double) - longitude of a destination point. + * @param profile (String) - One of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). + * @param force (boolean) - ask to stop current navigation if any. False - ask. True - don't ask. + */ boolean navigate(in NavigateParams params); + + /** + * Start navigation using gpx file. User need to grant Uri permission to OsmAnd. + * + * @param gpxUri (Uri) - URI created by FileProvider. + * @param force (boolean) - ask to stop current navigation if any. False - ask. True - don't ask. + */ boolean navigateGpx(in NavigateGpxParams params); + /** + * Remove GPX file. + * + * @param fileName (String) - file name to remove; + */ boolean removeGpx(in RemoveGpxParams params); + + /** + * Show AMapPoint on map in OsmAnd. + * + * @param layerId (String) - layer id. Note: layer should be added first. + * @param pointId (String) - point id. + * @param shortName (String) - short name (single char). Displayed on the map. + * @param fullName (String) - full name. Displayed in the context menu on first row. + * @param typeName (String) - type name. Displayed in context menu on second row. + * @param color (int) - color of circle's background. + * @param location (ALatLon) - location of the point. + * @param details List - list of details. Displayed under context menu. + * @param params Map - optional map of params for point. + */ boolean showMapPoint(in ShowMapPointParams params); + /** + * Method for adding up to 3 items to the OsmAnd navigation drawer. + * + * @param appPackage - current application package. + * @param names - list of names for items. + * @param uris - list of uris for intents. + * @param iconNames - list of icon names for items. + * @param flags - list of flags for intents. Use -1 if no flags needed. + */ boolean setNavDrawerItems(in SetNavDrawerItemsParams params); + /** + * Put navigation on pause. + */ boolean pauseNavigation(in PauseNavigationParams params); + + /** + * Resume navigation if it was paused before. + */ boolean resumeNavigation(in ResumeNavigationParams params); + + /** + * Stop navigation. Removes target / intermediate points and route path from the map. + */ boolean stopNavigation(in StopNavigationParams params); + + + /** + * Mute voice guidance. Stays muted until unmute manually or via the api. + */ boolean muteNavigation(in MuteNavigationParams params); + + /** + * Unmute voice guidance. + */ boolean unmuteNavigation(in UnmuteNavigationParams params); + /** + * Run search for POI / Address. + * + * @param searchQuery (String) - search query string. + * @param searchType (int) - type of search. Values: + * SearchParams.SEARCH_TYPE_ALL - all kind of search + * SearchParams.SEARCH_TYPE_POI - POIs only + * SearchParams.SEARCH_TYPE_ADDRESS - addresses only + * + * @param latitude (double) - latitude of original search location. + * @param longitude (double) - longitude of original search location. + * @param radiusLevel (int) - value from 1 to 7. Default value = 1. + * @param totalLimit (int) - limit of returned search result rows. Default value = -1 (unlimited). + */ boolean search(in SearchParams params, IOsmAndAidlCallback callback); + + /** + * Do search and start navigation. + * + * @param startName (String) - name of the start point as it displays in OsmAnd's UI. Nullable. + * @param startLat (double) - latitude of the start point. If 0 - current location is used. + * @param startLon (double) - longitude of the start point. If 0 - current location is used. + * @param searchQuery (String) - Text of a query for searching a destination point. Sent as URI parameter. + * @param searchLat (double) - original location of search (latitude). Sent as URI parameter. + * @param searchLon (double) - original location of search (longitude). Sent as URI parameter. + * @param profile (String) - one of: "default", "car", "bicycle", "pedestrian", "aircraft", "boat", "hiking", "motorcycle", "truck". Nullable (default). + * @param force (boolean) - ask to stop current navigation if any. False - ask. True - don't ask. + */ boolean navigateSearch(in NavigateSearchParams params); + /** + * Method to register for periodical callbacks from OsmAnd + * + * @param updateTimeMS (long)- period of time in millisecond after which callback is triggered + * @param callback (IOsmAndCallback)- create and provide instance of {@link IOsmAndAidlCallback} interface + * @return id (long) - id of callback in OsmAnd. Needed to unsubscribe from updates. + */ long registerForUpdates(in long updateTimeMS, IOsmAndAidlCallback callback); + + /** + * Method to unregister from periodical callbacks from OsmAnd + * + * @param callbackId (long)- id of registered callback (provided by OsmAnd + * in {@link OsmAndAidlHelper#registerForUpdates(long, IOsmAndAidlCallback)}) + */ boolean unregisterFromUpdates(in long callbackId); + /** + * Method for adding image to the top of Osmand's NavDrawer. + * + * @param imageUri (String)- image's URI.toString + * + * @deprecated + * Use the {@link #setNavDrawerLogoWithParams(NavDrawerHeaderParams params)} method. + */ boolean setNavDrawerLogo(in String imageUri); + /** + * Method for selected UI elements (like QuickSearch button) to show. + * + * @param ids (List)- list of menu items keys from {@link OsmAndCustomizationConstants} + */ boolean setEnabledIds(in List ids); + + /** + * Method for selected UI elements (like QuickSearch button) to hide. + * + * @param ids (List)- list of menu items keys from {@link OsmAndCustomizationConstants} + */ boolean setDisabledIds(in List ids); + + /** + * Method to show selected NavDrawer's menu items. + * + * @param patterns (List) - list of menu items names from {@link OsmAndCustomizationConstants} + */ boolean setEnabledPatterns(in List patterns); + + /** + * Method to hide selected NavDrawer's menu items. + * + * @param patterns (List)- list of menu items names from {@link OsmAndCustomizationConstants} + */ boolean setDisabledPatterns(in List patterns); + /** + * Register OsmAnd widgets for visibility. + * + * @param widgetKey ()- widget id. + * @param appModKeys - list of OsmAnd Application modes widget active with. Could be "null" for all modes. + */ boolean regWidgetVisibility(in SetWidgetsParams params); + + /** + * Register OsmAnd widgets for availability. + * + * @param widgetKey (String) - widget id. + * @param appModKeys (List)- ist of OsmAnd Application modes widget active with. Could be "null" for all modes. + */ boolean regWidgetAvailability(in SetWidgetsParams params); + /** + * Add custom parameters for OsmAnd settings to associate with client app. + * + * @param sharedPreferencesName (String)- string with name of clint's app for shared preferences key + * @param bundle (Bundle)- bundle with keys from Settings IDs {@link OsmAndCustomizationConstants} and Settings params + */ boolean customizeOsmandSettings(in OsmandSettingsParams params); + /** + * Method to get list of gpx files currently registered (imported or created) in OsmAnd; + * + * @return list of gpx files + */ boolean getImportedGpx(out List files); + /** + * Method to get list of sqlitedb files registered in OsmAnd; + * + * @return list of sqlitedb files + */ boolean getSqliteDbFiles(out List files); + + /** + * Method to get list of currently active sqlitedb files + * + * @return list of sqlitedb files + */ boolean getActiveSqliteDbFiles(out List files); + + /** + * Method to show selected sqlitedb file as map overlay. + * + * @param fileName (String) - name of sqlitedb file + */ boolean showSqliteDbFile(String fileName); + + /** + * Method to hide sqlitedb file from map overlay. + * + * @param fileName (String) - name of sqlitedb file + */ boolean hideSqliteDbFile(String fileName); + /** + * Method for adding image to the top of OsmAnd's NavDrawer with additional params + * + * @param imageUri (String) - image's URI.toString + * @param packageName (String) - client's app package name + * @param intent (String) - intent for additional functionality on image click + * + */ boolean setNavDrawerLogoWithParams(in NavDrawerHeaderParams params); + + /** + * Method for adding functionality to "Powered by Osmand" logo in NavDrawer's footer + * (reset OsmAnd settings to pre-clinet app's state) + * + * @param packageName (String) - package name + * @param intent (String) - intent + * @param appName (String) - client's app name + */ boolean setNavDrawerFooterWithParams(in NavDrawerFooterParams params); + /** + * Restore default (pre-client) OsmAnd settings and state: + * clears features, widgets and settings customization, NavDraw logo. + */ boolean restoreOsmand(); + /** + * Method to change state of plug-ins in OsmAnd. + * + * @param pluginId (String) - id (name) of plugin. + * @param newState (int) - new state (0 - off, 1 - on). + */ boolean changePluginState(in PluginParams params); + /** + * Method to register for callback on OsmAnd initialization + * @param callback (IOsmAndAidlCallback) - create and provide instance of {@link IOsmAndAidlCallback} interface + */ boolean registerForOsmandInitListener(in IOsmAndAidlCallback callback); + /** + * Requests bitmap snap-shot of map with GPX file from provided URI in its center. + * You can set bitmap size, density and GPX lines color, but you need + * to manually download appropriate map in OsmAnd or background will be empty. + * Bitmap will be returned through callback {@link IOsmAndAidlCallback#onGpxBitmapCreated(AGpxBitmap)} + * + * @param gpxUri (Uri/File) - Uri for gpx file + * @param density (float) - image density. Recommended to use default metrics for device's display. + * @param widthPixels (int) - width of bitmap + * @param heightPixels (int) - height of bitmap + * @param color (int) - color in ARGB format + * @param callback (IOsmAndAidlCallback) - instance of callback from OsmAnd. + */ boolean getBitmapForGpx(in CreateGpxBitmapParams file, IOsmAndAidlCallback callback); + + /** + * Method to copy files to OsmAnd part by part. For now supports only sqlitedb format. + * Part size (bytearray) should not exceed 256k. + * + * @param fileName (String) - name of file + * @param filePartData (byte[]) - parts of file, byte[] with size 256k or less. + * @param startTime (long) - timestamp of copying start. + * @param isDone (boolean) - boolean to mark end of copying. + * @return number of last successfully received file part or error(-1). + */ + int copyFile(in CopyFileParams filePart); + + + /** + * Method to register for updates during navgation. Notifies user about distance to the next turn and its type. + * + * @params subscribeToUpdates (boolean) - boolean flag to subscribe or unsubscribe from updates + * @params callbackId (long) - id of callback, needed to unsubscribe from updates + * @params callback (IOsmAndAidlCallback) - callback to notify user on navigation data change + */ + long registerForNavigationUpdates(in ANavigationUpdateParams params, IOsmAndAidlCallback callback); } \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.aidl b/OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.aidl new file mode 100644 index 0000000000..a786325e98 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.copyfile; + +parcelable CopyFileParams; diff --git a/OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.java b/OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.java new file mode 100644 index 0000000000..e795d5b7b7 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/copyfile/CopyFileParams.java @@ -0,0 +1,78 @@ +package net.osmand.aidl.copyfile; + +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.NonNull; + +public class CopyFileParams implements Parcelable { + private String fileName; + private byte[] filePartData; + private long startTime; + private boolean done; + + public CopyFileParams(@NonNull String fileName, @NonNull byte[] filePartData, long startTime, boolean done) { + this.fileName = fileName; + this.filePartData = filePartData; + this.startTime = startTime; + this.done = done; + } + + public String getFileName() { + return fileName; + } + + public byte[] getFilePartData() { + return filePartData; + } + + public boolean isDone() { + return done; + } + + public long getStartTime() { + return startTime; + } + + protected CopyFileParams(Parcel in) { + fileName = in.readString(); + filePartData = in.createByteArray(); + startTime = in.readLong(); + done = in.readByte() == 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public CopyFileParams createFromParcel(Parcel in) { + return new CopyFileParams(in); + } + + @Override + public CopyFileParams[] newArray(int size) { + return new CopyFileParams[size]; + } + }; + + + @Override + public int describeContents() { + return 0; + } + + @Override + public String toString() { + return "CopyFileParams {" + + " fileName=" + fileName + + ", filePartData size=" + filePartData.length + + ", startTime=" + startTime + + ", done=" + done + + " }"; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(fileName); + dest.writeByteArray(filePartData); + dest.writeLong(startTime); + dest.writeByte((byte) (done ? 0 : 1)); + } +} diff --git a/OsmAnd-telegram/src/net/osmand/aidl/gpx/AGpxBitmap.java b/OsmAnd-telegram/src/net/osmand/aidl/gpx/AGpxBitmap.java index 2f423e126e..f4bdef433d 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/gpx/AGpxBitmap.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/gpx/AGpxBitmap.java @@ -21,10 +21,6 @@ public class AGpxBitmap implements Parcelable { return bitmap; } - public void setBitmap(Bitmap bitmap) { - this.bitmap = bitmap; - } - public static final Creator CREATOR = new Creator() { public AGpxBitmap createFromParcel(Parcel in) { diff --git a/OsmAnd-telegram/src/net/osmand/aidl/gpx/ASelectedGpxFile.java b/OsmAnd-telegram/src/net/osmand/aidl/gpx/ASelectedGpxFile.java index 54d51bf882..6ffc6e2a70 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/gpx/ASelectedGpxFile.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/gpx/ASelectedGpxFile.java @@ -2,15 +2,27 @@ package net.osmand.aidl.gpx; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; public class ASelectedGpxFile implements Parcelable { private String fileName; + private long modifiedTime; + private long fileSize; + private AGpxFileDetails details; - public ASelectedGpxFile(String fileName) { + public ASelectedGpxFile(@NonNull String fileName) { this.fileName = fileName; } + public ASelectedGpxFile(@NonNull String fileName, long modifiedTime, long fileSize, @Nullable AGpxFileDetails details) { + this.fileName = fileName; + this.modifiedTime = modifiedTime; + this.fileSize = fileSize; + this.details = details; + } + public ASelectedGpxFile(Parcel in) { readFromParcel(in); } @@ -30,12 +42,40 @@ public class ASelectedGpxFile implements Parcelable { return fileName; } + public long getModifiedTime() { + return modifiedTime; + } + + public long getFileSize() { + return fileSize; + } + + public AGpxFileDetails getDetails() { + return details; + } + public void writeToParcel(Parcel out, int flags) { out.writeString(fileName); + out.writeLong(modifiedTime); + out.writeLong(fileSize); + + out.writeByte((byte) (details != null ? 1 : 0)); + if (details != null) { + out.writeParcelable(details, flags); + } } private void readFromParcel(Parcel in) { fileName = in.readString(); + modifiedTime = in.readLong(); + fileSize = in.readLong(); + + boolean hasDetails= in.readByte() != 0; + if (hasDetails) { + details = in.readParcelable(AGpxFileDetails.class.getClassLoader()); + } else { + details = null; + } } public int describeContents() { diff --git a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/AMapLayer.java b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/AMapLayer.java index 8ab1b0ee26..f1c982fa3c 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/AMapLayer.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/AMapLayer.java @@ -66,6 +66,10 @@ public class AMapLayer implements Parcelable { return new ArrayList<>(points.values()); } + public AMapPoint getPoint(String pointId) { + return points.get(pointId); + } + public boolean hasPoint(String pointId) { return points.containsKey(pointId); } diff --git a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java index cda77501c5..b61ec928c7 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java @@ -11,8 +11,9 @@ import java.util.List; import java.util.Map; public class AMapPoint implements Parcelable { - public static final int POINT_IMAGE_SIZE_PX = 160; public static final String POINT_IMAGE_URI_PARAM = "point_image_uri_param"; + public static final String POINT_SPEED_PARAM = "point_speed_param"; + public static final String POINT_TYPE_ICON_NAME_PARAM = "point_type_icon_name_param"; public static final String POINT_STALE_LOC_PARAM = "point_stale_loc_param"; private String id; diff --git a/OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.aidl b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.aidl new file mode 100644 index 0000000000..b0793d6e1a --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.navigation; + +parcelable ADirectionInfo; diff --git a/OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.java b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.java new file mode 100644 index 0000000000..a5e7074f0e --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ADirectionInfo.java @@ -0,0 +1,73 @@ +package net.osmand.aidl.navigation; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ADirectionInfo implements Parcelable { + + private int distanceTo; //distance to next turn + private int turnType; //turn type + private boolean isLeftSide; //is movement left-sided + + public ADirectionInfo(int distanceTo, int turnType, boolean isLeftSide) { + this.distanceTo = distanceTo; + this.turnType = turnType; + this.isLeftSide = isLeftSide; + } + + protected ADirectionInfo(Parcel in) { + distanceTo = in.readInt(); + turnType = in.readInt(); + isLeftSide = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public ADirectionInfo createFromParcel(Parcel in) { + return new ADirectionInfo(in); + } + + @Override + public ADirectionInfo[] newArray(int size) { + return new ADirectionInfo[size]; + } + }; + + public int getDistanceTo() { + return distanceTo; + } + + public int getTurnType() { + return turnType; + } + + public boolean isLeftSide() { + return isLeftSide; + } + + public void setDistanceTo(int distanceTo) { + this.distanceTo = distanceTo; + } + + public void setTurnType(int turnType) { + this.turnType = turnType; + } + + public void setLeftSide(boolean leftSide) { + isLeftSide = leftSide; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(distanceTo); + dest.writeInt(turnType); + dest.writeByte((byte) (isLeftSide ? 1 : 0)); + } + + +} diff --git a/OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl new file mode 100644 index 0000000000..43f370d024 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.aidl @@ -0,0 +1,4 @@ + +package net.osmand.aidl.navigation; + +parcelable ANavigationUpdateParams; \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java new file mode 100644 index 0000000000..38c8f5ffe4 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/navigation/ANavigationUpdateParams.java @@ -0,0 +1,57 @@ +package net.osmand.aidl.navigation; + +import android.os.Parcel; +import android.os.Parcelable; + +public class ANavigationUpdateParams implements Parcelable { + + private boolean subscribeToUpdates = true; + private long callbackId = -1L; + + public ANavigationUpdateParams() { + } + + public long getCallbackId() { + return callbackId; + } + + public void setCallbackId(long callbackId) { + this.callbackId = callbackId; + } + + public void setSubscribeToUpdates(boolean subscribeToUpdates) { + this.subscribeToUpdates = subscribeToUpdates; + } + + public boolean isSubscribeToUpdates() { + return subscribeToUpdates; + } + + protected ANavigationUpdateParams(Parcel in) { + callbackId = in.readLong(); + subscribeToUpdates = in.readByte() != 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(callbackId); + dest.writeByte((byte) (subscribeToUpdates ? 1 : 0)); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public ANavigationUpdateParams createFromParcel(Parcel in) { + return new ANavigationUpdateParams(in); + } + + @Override + public ANavigationUpdateParams[] newArray(int size) { + return new ANavigationUpdateParams[size]; + } + }; +} diff --git a/OsmAnd-telegram/src/net/osmand/aidl/navigation/NavigateSearchParams.java b/OsmAnd-telegram/src/net/osmand/aidl/navigation/NavigateSearchParams.java index 1c539d08cc..b092bcd4eb 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/navigation/NavigateSearchParams.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/navigation/NavigateSearchParams.java @@ -9,14 +9,20 @@ public class NavigateSearchParams implements Parcelable { private double startLat; private double startLon; private String searchQuery; + private double searchLat; + private double searchLon; private String profile; private boolean force; - public NavigateSearchParams(String startName, double startLat, double startLon, String searchQuery, String profile, boolean force) { + public NavigateSearchParams(String startName, double startLat, double startLon, + String searchQuery, double searchLat, double searchLon, + String profile, boolean force) { this.startName = startName; this.startLat = startLat; this.startLon = startLon; this.searchQuery = searchQuery; + this.searchLat = searchLat; + this.searchLon = searchLon; this.profile = profile; this.force = force; } @@ -53,6 +59,14 @@ public class NavigateSearchParams implements Parcelable { return searchQuery; } + public double getSearchLat() { + return searchLat; + } + + public double getSearchLon() { + return searchLon; + } + public String getProfile() { return profile; } @@ -69,6 +83,8 @@ public class NavigateSearchParams implements Parcelable { out.writeString(searchQuery); out.writeString(profile); out.writeByte((byte) (force ? 1 : 0)); + out.writeDouble(searchLat); + out.writeDouble(searchLon); } private void readFromParcel(Parcel in) { @@ -78,6 +94,8 @@ public class NavigateSearchParams implements Parcelable { searchQuery = in.readString(); profile = in.readString(); force = in.readByte() != 0; + searchLat = in.readDouble(); + searchLon = in.readDouble(); } @Override diff --git a/OsmAnd-telegram/src/net/osmand/aidl/search/SearchParams.java b/OsmAnd-telegram/src/net/osmand/aidl/search/SearchParams.java index 32447f4b45..303cecb25c 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/search/SearchParams.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/search/SearchParams.java @@ -11,15 +11,15 @@ public class SearchParams implements Parcelable { private String searchQuery; private int searchType; - private double latutude; + private double latitude; private double longitude; private int radiusLevel = 1; private int totalLimit = -1; - public SearchParams(String searchQuery, int searchType, double latutude, double longitude, int radiusLevel, int totalLimit) { + public SearchParams(String searchQuery, int searchType, double latitude, double longitude, int radiusLevel, int totalLimit) { this.searchQuery = searchQuery; this.searchType = searchType; - this.latutude = latutude; + this.latitude = latitude; this.longitude = longitude; this.radiusLevel = radiusLevel; this.totalLimit = totalLimit; @@ -49,8 +49,8 @@ public class SearchParams implements Parcelable { return searchType; } - public double getLatutude() { - return latutude; + public double getLatitude() { + return latitude; } public double getLongitude() { @@ -69,7 +69,7 @@ public class SearchParams implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeString(searchQuery); out.writeInt(searchType); - out.writeDouble(latutude); + out.writeDouble(latitude); out.writeDouble(longitude); out.writeInt(radiusLevel); out.writeInt(totalLimit); @@ -78,7 +78,7 @@ public class SearchParams implements Parcelable { private void readFromParcel(Parcel in) { searchQuery = in.readString(); searchType = in.readInt(); - latutude = in.readDouble(); + latitude = in.readDouble(); longitude = in.readDouble(); radiusLevel = in.readInt(); totalLimit = in.readInt(); diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt index 9608affa9e..47576a96c2 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt @@ -106,6 +106,10 @@ class OsmandAidlHelper(private val app: TelegramApplication) { gpxBitmapCreatedListener!!.onGpxBitmapCreated(bitmap) } } + + override fun updateNavigationInfo(directionInfo: ADirectionInfo?) { + + } } fun setSearchCompleteListener(mSearchCompleteListener: SearchCompleteListener) { @@ -939,10 +943,10 @@ class OsmandAidlHelper(private val app: TelegramApplication) { return false } - fun navigateSearch(startName: String, startLat: Double, startLon: Double, searchQuery: String, profile: String, force: Boolean): Boolean { + fun navigateSearch(startName: String, startLat: Double, startLon: Double, searchQuery: String, searchLat: Double, searchLon: Double, profile: String, force: Boolean): Boolean { if (mIOsmAndAidlInterface != null) { try { - return mIOsmAndAidlInterface!!.navigateSearch(NavigateSearchParams(startName, startLat, startLon, searchQuery, profile, force)) + return mIOsmAndAidlInterface!!.navigateSearch(NavigateSearchParams(startName, startLat, startLon, searchQuery, searchLat, searchLon, profile, force)) } catch (e: RemoteException) { e.printStackTrace() } From 30b444bcd68b86e2b419126fa5d4011b42960718 Mon Sep 17 00:00:00 2001 From: Chumva Date: Sat, 20 Apr 2019 13:53:06 +0300 Subject: [PATCH 052/114] Add aidl methods for setting context menu buttons and update menu with map for AMapPoints --- OsmAnd-telegram/res/values/strings.xml | 4 + .../net/osmand/aidl/IOsmAndAidlCallback.aidl | 2 + .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 8 + .../aidl/contextmenu/AContextMenuButton.aidl | 3 + .../aidl/contextmenu/AContextMenuButton.java | 101 +++++++++ .../contextmenu/ContextMenuButtonsParams.aidl | 3 + .../contextmenu/ContextMenuButtonsParams.java | 105 ++++++++++ .../RemoveContextMenuButtonsParams.aidl | 3 + .../RemoveContextMenuButtonsParams.java | 53 +++++ .../UpdateContextMenuButtonsParams.aidl | 3 + .../UpdateContextMenuButtonsParams.java | 43 ++++ .../osmand/aidl/maplayer/point/AMapPoint.java | 12 +- .../maplayer/point/UpdateMapPointParams.java | 10 +- .../osmand/telegram/TelegramApplication.kt | 6 +- .../telegram/helpers/OsmandAidlHelper.kt | 109 +++++++++- .../telegram/helpers/ShowLocationHelper.kt | 196 ++++++++++++++---- .../telegram/helpers/TelegramUiHelper.kt | 56 ++++- .../telegram/utils/OsmandLocationUtils.kt | 1 + OsmAnd/res/layout/context_menu_buttons.xml | 61 ++++++ .../res/layout/map_context_menu_fragment.xml | 8 + .../net/osmand/aidl/IOsmAndAidlCallback.aidl | 2 + .../net/osmand/aidl/IOsmAndAidlInterface.aidl | 8 + OsmAnd/src/net/osmand/aidl/OsmandAidlApi.java | 134 +++++++++++- .../net/osmand/aidl/OsmandAidlService.java | 59 +++++- .../aidl/contextmenu/AContextMenuButton.aidl | 3 + .../aidl/contextmenu/AContextMenuButton.java | 101 +++++++++ .../contextmenu/ContextMenuButtonsParams.aidl | 3 + .../contextmenu/ContextMenuButtonsParams.java | 105 ++++++++++ .../RemoveContextMenuButtonsParams.aidl | 3 + .../RemoveContextMenuButtonsParams.java | 53 +++++ .../UpdateContextMenuButtonsParams.aidl | 3 + .../UpdateContextMenuButtonsParams.java | 45 ++++ .../osmand/aidl/maplayer/point/AMapPoint.java | 12 +- .../maplayer/point/UpdateMapPointParams.java | 10 +- .../osmand/plus/activities/MapActivity.java | 32 ++- .../plus/mapcontextmenu/MapContextMenu.java | 26 ++- .../MapContextMenuFragment.java | 64 +++++- .../plus/mapcontextmenu/MenuController.java | 7 +- .../controllers/AMapPointMenuController.java | 61 +++++- .../other/IContextMenuButtonListener.java | 5 + 40 files changed, 1430 insertions(+), 93 deletions(-) create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.java create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl create mode 100644 OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java create mode 100644 OsmAnd/res/layout/context_menu_buttons.xml create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.java create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl create mode 100644 OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java create mode 100644 OsmAnd/src/net/osmand/plus/mapcontextmenu/other/IContextMenuButtonListener.java diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index 486e235327..3712668b0a 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,5 +1,9 @@ + Direction + Precision + Altitude + Bearing Search contacts Search across all of your groups and contacts. Type contact or group name diff --git a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl index 87f6de79c4..029ad05a6c 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl +++ b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlCallback.aidl @@ -36,4 +36,6 @@ interface IOsmAndAidlCallback { * @return directionInfo - update on distance to next turn and turns type. */ void updateNavigationInfo(in ADirectionInfo directionInfo); + + void onContextMenuButtonClicked(in int buttonId, String pointId, String layerId); } \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl index 1ac8569bfc..4f9fe0e953 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl +++ b/OsmAnd-telegram/src/net/osmand/aidl/IOsmAndAidlInterface.aidl @@ -83,6 +83,10 @@ import net.osmand.aidl.copyfile.CopyFileParams; import net.osmand.aidl.navigation.ANavigationUpdateParams; +import net.osmand.aidl.contextmenu.ContextMenuButtonsParams; +import net.osmand.aidl.contextmenu.UpdateContextMenuButtonsParams; +import net.osmand.aidl.contextmenu.RemoveContextMenuButtonsParams; + // NOTE: Add new methods at the end of file!!! @@ -691,4 +695,8 @@ interface IOsmAndAidlInterface { * @params callback (IOsmAndAidlCallback) - callback to notify user on navigation data change */ long registerForNavigationUpdates(in ANavigationUpdateParams params, IOsmAndAidlCallback callback); + + long addContextMenuButtons(in ContextMenuButtonsParams params, IOsmAndAidlCallback callback); + boolean removeContextMenuButtons(in RemoveContextMenuButtonsParams params); + boolean updateContextMenuButtons(in UpdateContextMenuButtonsParams params); } \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl new file mode 100644 index 0000000000..4a8cbee665 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable AContextMenuButton; \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.java b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.java new file mode 100644 index 0000000000..b235116999 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/AContextMenuButton.java @@ -0,0 +1,101 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +public class AContextMenuButton implements Parcelable { + + private int buttonId; + + private String leftTextCaption; + private String rightTextCaption; + private String leftIconName; + private String rightIconName; + + private boolean needColorizeIcon; + private boolean enabled; + + public AContextMenuButton(int buttonId, String leftTextCaption, String rightTextCaption, String leftIconName, String rightIconName, boolean needColorizeIcon, boolean enabled) { + this.buttonId = buttonId; + this.leftTextCaption = leftTextCaption; + this.rightTextCaption = rightTextCaption; + this.leftIconName = leftIconName; + this.rightIconName = rightIconName; + this.needColorizeIcon = needColorizeIcon; + this.enabled = enabled; + } + + protected AContextMenuButton(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public AContextMenuButton createFromParcel(Parcel in) { + return new AContextMenuButton(in); + } + + @Override + public AContextMenuButton[] newArray(int size) { + return new AContextMenuButton[size]; + } + }; + + public int getButtonId() { + return buttonId; + } + + public String getLeftTextCaption() { + return leftTextCaption; + } + + public String getRightTextCaption() { + return rightTextCaption; + } + + public String getLeftIconName() { + return leftIconName; + } + + public String getRightIconName() { + return rightIconName; + } + + public boolean isNeedColorizeIcon() { + return needColorizeIcon; + } + + public boolean isEnabled() { + return enabled; + } + + public static Creator getCREATOR() { + return CREATOR; + } + + @Override + public void writeToParcel(Parcel dest, int f) { + dest.writeInt(buttonId); + dest.writeString(leftTextCaption); + dest.writeString(rightTextCaption); + dest.writeString(leftIconName); + dest.writeString(rightIconName); + dest.writeInt(needColorizeIcon ? 1 : 0); + dest.writeInt(enabled ? 1 : 0); + } + + private void readFromParcel(Parcel in) { + buttonId = in.readInt(); + leftTextCaption = in.readString(); + rightTextCaption = in.readString(); + leftIconName = in.readString(); + rightIconName = in.readString(); + needColorizeIcon = in.readInt() != 0; + enabled = in.readInt() != 0; + } + + @Override + public int describeContents() { + return 0; + } +} \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl new file mode 100644 index 0000000000..cf05b9db9c --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable ContextMenuButtonsParams; \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java new file mode 100644 index 0000000000..85cb9cb3e0 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java @@ -0,0 +1,105 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.ArrayList; +import java.util.List; + +public class ContextMenuButtonsParams implements Parcelable { + + private AContextMenuButton leftButton; + private AContextMenuButton rightButton; + + private String id; + private String appPackage; + private String layerId; + + private long callbackId = -1L; + + private List pointsIds = new ArrayList<>(); + + public ContextMenuButtonsParams(AContextMenuButton leftButton, AContextMenuButton rightButton, String id, String appPackage, String layerId, boolean followOpenedPoint, long callbackId, List pointsIds) { + this.leftButton = leftButton; + this.rightButton = rightButton; + this.id = id; + this.appPackage = appPackage; + this.layerId = layerId; + this.callbackId = callbackId; + this.pointsIds = pointsIds; + } + + public ContextMenuButtonsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public ContextMenuButtonsParams createFromParcel(Parcel in) { + return new ContextMenuButtonsParams(in); + } + + @Override + public ContextMenuButtonsParams[] newArray(int size) { + return new ContextMenuButtonsParams[size]; + } + }; + + public AContextMenuButton getLeftButton() { + return leftButton; + } + + public AContextMenuButton getRightButton() { + return rightButton; + } + + public String getId() { + return id; + } + + public String getAppPackage() { + return appPackage; + } + + public String getLayerId() { + return layerId; + } + + public long getCallbackId() { + return callbackId; + } + + public void setCallbackId(long callbackId) { + this.callbackId = callbackId; + } + + public List getPointsIds() { + return pointsIds; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(leftButton, flags); + dest.writeParcelable(rightButton, flags); + dest.writeString(id); + dest.writeString(appPackage); + dest.writeString(layerId); + dest.writeLong(callbackId); + dest.writeStringList(pointsIds); + } + + private void readFromParcel(Parcel in) { + leftButton = in.readParcelable(AContextMenuButton.class.getClassLoader()); + rightButton = in.readParcelable(AContextMenuButton.class.getClassLoader()); + id = in.readString(); + appPackage = in.readString(); + layerId = in.readString(); + callbackId = in.readLong(); + in.readStringList(pointsIds); + } + + @Override + public int describeContents() { + return 0; + } +} \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl new file mode 100644 index 0000000000..557a8e5113 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable RemoveContextMenuButtonsParams; \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java new file mode 100644 index 0000000000..33f3ab400c --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java @@ -0,0 +1,53 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +public class RemoveContextMenuButtonsParams implements Parcelable { + + private String paramsId; + + private long callbackId = -1L; + + public RemoveContextMenuButtonsParams(String paramsId, long callbackId) { + this.paramsId = paramsId; + this.callbackId = callbackId; + } + + public RemoveContextMenuButtonsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new + Creator() { + public RemoveContextMenuButtonsParams createFromParcel(Parcel in) { + return new RemoveContextMenuButtonsParams(in); + } + + public RemoveContextMenuButtonsParams[] newArray(int size) { + return new RemoveContextMenuButtonsParams[size]; + } + }; + + public String getParamsId() { + return paramsId; + } + + public long getCallbackId() { + return callbackId; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(paramsId); + dest.writeLong(callbackId); + } + + private void readFromParcel(Parcel in) { + paramsId = in.readString(); + callbackId = in.readLong(); + } + + public int describeContents() { + return 0; + } +} diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl new file mode 100644 index 0000000000..f5482b3452 --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable UpdateContextMenuButtonsParams; \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java new file mode 100644 index 0000000000..ce4d4a637c --- /dev/null +++ b/OsmAnd-telegram/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java @@ -0,0 +1,43 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +public class UpdateContextMenuButtonsParams implements Parcelable { + private ContextMenuButtonsParams buttonsParams; + + public UpdateContextMenuButtonsParams(ContextMenuButtonsParams widget) { + this.buttonsParams = widget; + } + + public UpdateContextMenuButtonsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new + Creator() { + public UpdateContextMenuButtonsParams createFromParcel(Parcel in) { + return new UpdateContextMenuButtonsParams(in); + } + + public UpdateContextMenuButtonsParams[] newArray(int size) { + return new UpdateContextMenuButtonsParams[size]; + } + }; + + public ContextMenuButtonsParams getContextMenuButtonsParams() { + return buttonsParams; + } + + public void writeToParcel(Parcel out, int flags) { + out.writeParcelable(buttonsParams, flags); + } + + private void readFromParcel(Parcel in) { + buttonsParams = in.readParcelable(ContextMenuButtonsParams.class.getClassLoader()); + } + + public int describeContents() { + return 0; + } +} diff --git a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java index b61ec928c7..9218391975 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/AMapPoint.java @@ -20,17 +20,19 @@ public class AMapPoint implements Parcelable { private String shortName; private String fullName; private String typeName; + private String layerId; private int color; private ALatLon location; private List details = new ArrayList<>(); private Map params = new HashMap<>(); - public AMapPoint(String id, String shortName, String fullName, String typeName, int color, - ALatLon location, List details, Map params) { + public AMapPoint(String id, String shortName, String fullName, String typeName, String layerId, + int color, ALatLon location, List details, Map params) { this.id = id; this.shortName = shortName; this.fullName = fullName; this.typeName = typeName; + this.layerId = layerId; this.color = color; this.location = location; if (details != null) { @@ -72,6 +74,10 @@ public class AMapPoint implements Parcelable { return typeName; } + public String getLayerId() { + return layerId; + } + public int getColor() { return color; } @@ -93,6 +99,7 @@ public class AMapPoint implements Parcelable { out.writeString(shortName); out.writeString(fullName); out.writeString(typeName); + out.writeString(layerId); out.writeInt(color); out.writeParcelable(location, flags); out.writeStringList(details); @@ -104,6 +111,7 @@ public class AMapPoint implements Parcelable { shortName = in.readString(); fullName = in.readString(); typeName = in.readString(); + layerId = in.readString(); color = in.readInt(); location = in.readParcelable(ALatLon.class.getClassLoader()); in.readStringList(details); diff --git a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java index 178af20b1d..a7b871a1d4 100644 --- a/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java +++ b/OsmAnd-telegram/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java @@ -6,10 +6,12 @@ import android.os.Parcelable; public class UpdateMapPointParams implements Parcelable { private String layerId; private AMapPoint point; + private boolean updateOpenedMenuAndMap; - public UpdateMapPointParams(String layerId, AMapPoint point) { + public UpdateMapPointParams(String layerId, AMapPoint point, boolean updateOpenedMenuAndMap) { this.layerId = layerId; this.point = point; + this.updateOpenedMenuAndMap = updateOpenedMenuAndMap; } public UpdateMapPointParams(Parcel in) { @@ -35,14 +37,20 @@ public class UpdateMapPointParams implements Parcelable { return point; } + public boolean isUpdateOpenedMenuAndMap() { + return updateOpenedMenuAndMap; + } + public void writeToParcel(Parcel out, int flags) { out.writeString(layerId); out.writeParcelable(point, flags); + out.writeInt(updateOpenedMenuAndMap ? 1 : 0); } private void readFromParcel(Parcel in) { layerId = in.readString(); point = in.readParcelable(AMapPoint.class.getClassLoader()); + updateOpenedMenuAndMap = in.readInt() != 0; } public int describeContents() { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt index eaa9c5bf88..3841899fd3 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt @@ -52,6 +52,7 @@ class TelegramApplication : Application(), OsmandHelperListener { listOf("ic_action_location_sharing_app"), listOf(-1) ) + showLocationHelper.addDirectionContextMenuButton() if (settings.hasAnyChatToShowOnMap()) { showLocationHelper.startShowingLocation() } @@ -138,7 +139,10 @@ class TelegramApplication : Application(), OsmandHelperListener { } override fun onOsmandConnectionStateChanged(connected: Boolean) { - showLocationHelper.setupMapLayer() + if (connected) { + showLocationHelper.setupMapLayer() + showLocationHelper.addDirectionContextMenuButton() + } } private fun startTelegramService(intent: Int, serviceOffInterval: Long = 0) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt index 47576a96c2..90abb86028 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt @@ -9,6 +9,9 @@ import android.os.IBinder import android.os.RemoteException import net.osmand.aidl.IOsmAndAidlCallback import net.osmand.aidl.IOsmAndAidlInterface +import net.osmand.aidl.contextmenu.AContextMenuButton +import net.osmand.aidl.contextmenu.ContextMenuButtonsParams +import net.osmand.aidl.contextmenu.RemoveContextMenuButtonsParams import net.osmand.aidl.favorite.AFavorite import net.osmand.aidl.favorite.AddFavoriteParams import net.osmand.aidl.favorite.RemoveFavoriteParams @@ -43,6 +46,7 @@ import net.osmand.aidl.note.TakePhotoNoteParams import net.osmand.aidl.search.SearchParams import net.osmand.aidl.search.SearchResult import net.osmand.telegram.TelegramApplication +import net.osmand.telegram.helpers.ShowLocationHelper.Companion.MAP_LAYER_ID import java.io.File import java.util.* @@ -61,7 +65,8 @@ class OsmandAidlHelper(private val app: TelegramApplication) { private var initialized: Boolean = false private var bound: Boolean = false - private var osmandCallbackId: Long = 0 + private var osmandUpdatesCallbackId: Long = -1 + private var osmandContextMenuCallbackId: Long = -1 var listener: OsmandHelperListener? = null @@ -81,6 +86,12 @@ class OsmandAidlHelper(private val app: TelegramApplication) { fun onGpxBitmapCreated(bitmap: AGpxBitmap) } + private var contextMenuButtonsListener: ContextMenuButtonsListener? = null + + interface ContextMenuButtonsListener { + fun onContextMenuButtonClicked(buttonId:Int, pointId: String, layerId: String) + } + private val mIOsmAndAidlCallback = object : IOsmAndAidlCallback.Stub() { @Throws(RemoteException::class) @@ -110,6 +121,12 @@ class OsmandAidlHelper(private val app: TelegramApplication) { override fun updateNavigationInfo(directionInfo: ADirectionInfo?) { } + + override fun onContextMenuButtonClicked(buttonId:Int, pointId: String, layerId: String) { + if (contextMenuButtonsListener != null) { + contextMenuButtonsListener!!.onContextMenuButtonClicked(buttonId, pointId, layerId) + } + } } fun setSearchCompleteListener(mSearchCompleteListener: SearchCompleteListener) { @@ -120,6 +137,10 @@ class OsmandAidlHelper(private val app: TelegramApplication) { this.gpxBitmapCreatedListener = gpxBitmapCreatedListener } + fun setContextMenuButtonsListener(contextMenuButtonsListener: ContextMenuButtonsListener) { + this.contextMenuButtonsListener = contextMenuButtonsListener + } + private var mUpdatesListener: UpdatesListener? = null interface UpdatesListener { @@ -130,7 +151,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { this.mUpdatesListener = mUpdatesListener } - fun updatesCallbackRegistered() = osmandCallbackId > 0 + fun updatesCallbackRegistered() = osmandUpdatesCallbackId > 0 /** * Class for interacting with the main interface of the service. */ @@ -411,6 +432,22 @@ class OsmandAidlHelper(private val app: TelegramApplication) { } catch (e: RemoteException) { e.printStackTrace() } + } + return false + } + + /** + * Add map marker at given location. + * + * @param marker - AMapMarker. + */ + fun addMapMarker(marker: AMapMarker): Boolean { + if (mIOsmAndAidlInterface != null) { + try { + return mIOsmAndAidlInterface!!.addMapMarker(AddMapMarkerParams(marker)) + } catch (e: RemoteException) { + e.printStackTrace() + } } return false @@ -436,6 +473,23 @@ class OsmandAidlHelper(private val app: TelegramApplication) { } catch (e: RemoteException) { e.printStackTrace() } + } + return false + } + + /** + * Update map marker at given location with name. + * + * @param markerPrev - AMapMarker (current marker). + * @param markerNew - AMapMarker (new marker). + */ + fun updateMapMarker(markerPrev: AMapMarker, markerNew: AMapMarker): Boolean { + if (mIOsmAndAidlInterface != null) { + try { + return mIOsmAndAidlInterface!!.updateMapMarker(UpdateMapMarkerParams(markerPrev, markerNew)) + } catch (e: RemoteException) { + e.printStackTrace() + } } return false @@ -615,7 +669,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { typeName: String, color: Int, location: ALatLon, details: List?, params: Map?): Boolean { if (mIOsmAndAidlInterface != null) { try { - val point = AMapPoint(pointId, shortName, fullName, typeName, color, location, details, params) + val point = AMapPoint(pointId, shortName, fullName, typeName, layerId, color, location, details, params) return mIOsmAndAidlInterface!!.showMapPoint(ShowMapPointParams(layerId, point)) } catch (e: RemoteException) { e.printStackTrace() @@ -640,7 +694,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { typeName: String, color: Int, location: ALatLon, details: List?, params: Map?): Boolean { if (mIOsmAndAidlInterface != null) { try { - val point = AMapPoint(pointId, shortName, fullName, typeName, color, location, details, params) + val point = AMapPoint(pointId, shortName, fullName, typeName, layerId, color, location, details, params) return mIOsmAndAidlInterface!!.addMapPoint(AddMapPointParams(layerId, point)) } catch (e: RemoteException) { e.printStackTrace() @@ -666,8 +720,8 @@ class OsmandAidlHelper(private val app: TelegramApplication) { typeName: String, color: Int, location: ALatLon, details: List?, params: Map?): Boolean { if (mIOsmAndAidlInterface != null) { try { - val point = AMapPoint(pointId, shortName, fullName, typeName, color, location, details, params) - return mIOsmAndAidlInterface!!.updateMapPoint(UpdateMapPointParams(layerId, point)) + val point = AMapPoint(pointId, shortName, fullName, typeName, layerId, color, location, details, params) + return mIOsmAndAidlInterface!!.updateMapPoint(UpdateMapPointParams(layerId, point, true)) } catch (e: RemoteException) { e.printStackTrace() } @@ -1074,8 +1128,8 @@ class OsmandAidlHelper(private val app: TelegramApplication) { fun registerForUpdates(): Boolean { if (mIOsmAndAidlInterface != null) { try { - osmandCallbackId = mIOsmAndAidlInterface!!.registerForUpdates(UPDATE_TIME_MS, mIOsmAndAidlCallback) - return osmandCallbackId > 0 + osmandUpdatesCallbackId = mIOsmAndAidlInterface!!.registerForUpdates(UPDATE_TIME_MS, mIOsmAndAidlCallback) + return osmandUpdatesCallbackId > 0 } catch (e: RemoteException) { e.printStackTrace() } @@ -1086,9 +1140,9 @@ class OsmandAidlHelper(private val app: TelegramApplication) { fun unregisterFromUpdates(): Boolean { if (mIOsmAndAidlInterface != null) { try { - val unregistered = mIOsmAndAidlInterface!!.unregisterFromUpdates(osmandCallbackId) + val unregistered = mIOsmAndAidlInterface!!.unregisterFromUpdates(osmandUpdatesCallbackId) if (unregistered) { - osmandCallbackId = 0 + osmandUpdatesCallbackId = 0 } return unregistered } catch (e: RemoteException) { @@ -1109,4 +1163,39 @@ class OsmandAidlHelper(private val app: TelegramApplication) { } return false } + + fun addContextMenuButtons( + appPackage: String,paramsId:String, + leftTextCaption: String, rightTextCaption: String, + leftIconName: String, rightIconName: String, + needColorizeIcon: Boolean, enabled: Boolean, buttonId: Int + ): Boolean { + if (mIOsmAndAidlInterface != null) { + try { + val leftButton = AContextMenuButton(buttonId, leftTextCaption, rightTextCaption, leftIconName, rightIconName, needColorizeIcon, enabled) + val params = ContextMenuButtonsParams(leftButton, null, paramsId, appPackage, MAP_LAYER_ID, true, osmandContextMenuCallbackId, mutableListOf()) + osmandContextMenuCallbackId = mIOsmAndAidlInterface!!.addContextMenuButtons(params, mIOsmAndAidlCallback) + return osmandContextMenuCallbackId >= 0 + } catch (e: RemoteException) { + e.printStackTrace() + } + } + return false + } + + fun removeContextMenuButtons(paramsId: String): Boolean { + if (mIOsmAndAidlInterface != null) { + try { + val params = RemoveContextMenuButtonsParams(paramsId, osmandContextMenuCallbackId) + val removed = mIOsmAndAidlInterface!!.removeContextMenuButtons(params) + if (removed) { + osmandContextMenuCallbackId = -1 + } + return removed + } catch (e: RemoteException) { + e.printStackTrace() + } + } + return false + } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt index baa27e4bd0..0089fa3280 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt @@ -6,15 +6,19 @@ import android.os.AsyncTask import android.text.TextUtils import net.osmand.aidl.map.ALatLon import net.osmand.aidl.maplayer.point.AMapPoint +import net.osmand.aidl.mapmarker.AMapMarker import net.osmand.telegram.R import net.osmand.telegram.TelegramApplication +import net.osmand.telegram.helpers.OsmandAidlHelper.ContextMenuButtonsListener import net.osmand.telegram.helpers.TelegramUiHelper.ListItem import net.osmand.telegram.utils.AndroidUtils +import net.osmand.telegram.utils.OsmandFormatter import net.osmand.telegram.utils.OsmandLocationUtils import net.osmand.telegram.utils.OsmandLocationUtils.MessageOsmAndBotLocation import net.osmand.telegram.utils.OsmandLocationUtils.MessageUserLocation import org.drinkless.td.libcore.telegram.TdApi import java.io.File +import java.util.* import java.util.concurrent.Executors class ShowLocationHelper(private val app: TelegramApplication) { @@ -23,23 +27,65 @@ class ShowLocationHelper(private val app: TelegramApplication) { const val MAP_LAYER_ID = "telegram_layer" const val MIN_OSMAND_CALLBACK_VERSION_CODE = 320 + + const val MAP_CONTEXT_MENU_BUTTON_ID = 1 + const val MAP_CONTEXT_MENU_BUTTONS_PARAMS_ID = "DIRECTION" + const val DIRECTION_ICON_ID = "ic_action_start_navigation" } private val telegramHelper = app.telegramHelper private val osmandAidlHelper = app.osmandAidlHelper private val executor = Executors.newSingleThreadExecutor() + private val points = mutableMapOf() + private val markers = mutableMapOf() + var showingLocation: Boolean = false private set private var forcedStop: Boolean = false + init { + app.osmandAidlHelper.setContextMenuButtonsListener(object : ContextMenuButtonsListener { + + override fun onContextMenuButtonClicked(buttonId: Int, pointId: String, layerId: String) { + updateDirectionMarker(pointId) + } + + }) + } + fun setupMapLayer() { osmandAidlHelper.execOsmandApi { osmandAidlHelper.addMapLayer(MAP_LAYER_ID, "Telegram", 5.5f, null) } } + private fun updateDirectionMarker(pointId: String) { + val message = points[pointId] + if (message != null) { + val aLatLon = getALatLonFromMessage(message.content) + val name = getNameFromMessage(message) + if (aLatLon != null) { + val marker = AMapMarker(ALatLon(aLatLon.latitude, aLatLon.longitude), name) + val markerPrev = markers[pointId] + var markerUpdated: Boolean + if (markerPrev != null) { + markerUpdated = app.osmandAidlHelper.updateMapMarker(markerPrev, marker) + if (!markerUpdated) { + app.osmandAidlHelper.removeMapMarker(markerPrev.latLon.latitude, markerPrev.latLon.longitude, name) + markerUpdated = app.osmandAidlHelper.addMapMarker(marker) + } + } else { + markerUpdated = app.osmandAidlHelper.addMapMarker(marker) + } + if (markerUpdated) { + markers[pointId] = marker + } + } + } + } + fun showLocationOnMap(item: ListItem, stale: Boolean = false) { if (item.latLon == null) { return @@ -53,8 +99,8 @@ class ShowLocationHelper(private val app: TelegramApplication) { item.chatTitle, Color.WHITE, ALatLon(item.latLon!!.latitude, item.latLon!!.longitude), - null, - generatePointParams(if (stale) item.grayscalePhotoPath else item.photoPath, stale) + generatePointDetails(item.bearing?.toFloat(), item.altitude?.toFloat(), item.precision?.toFloat()), + generatePointParams(if (stale) item.grayscalePhotoPath else item.photoPath, stale, item.speed?.toFloat()) ) } } @@ -77,61 +123,89 @@ class ShowLocationHelper(private val app: TelegramApplication) { fun addOrUpdateLocationOnMap(message: TdApi.Message, update: Boolean = false) { osmandAidlHelper.execOsmandApi { val chatId = message.chatId - val chatTitle = telegramHelper.getChat(message.chatId)?.title + val chat = telegramHelper.getChat(message.chatId) + val chatTitle = chat?.title + val isGroup = chat != null && telegramHelper.isGroup(chat) val content = message.content val date = OsmandLocationUtils.getLastUpdatedTime(message) val stale = System.currentTimeMillis() / 1000 - date > app.settings.staleLocTime - if (chatTitle != null && (content is TdApi.MessageLocation || (content is MessageUserLocation && content.isValid()))) { - var userName = "" - var photoPath: String? = null - val user = telegramHelper.getUser(OsmandLocationUtils.getSenderMessageId(message)) - if (user != null) { - userName = "${user.firstName} ${user.lastName}".trim() - if (userName.isEmpty()) { - userName = user.username + val aLatLon = getALatLonFromMessage(content) + val details = if (content is OsmandLocationUtils.MessageLocation) generatePointDetails(content.bearing.toFloat(), content.altitude.toFloat(), content.hdop.toFloat()) else null + val name = getNameFromMessage(message) + val senderId = OsmandLocationUtils.getSenderMessageId(message) + val pointId = if (content is MessageOsmAndBotLocation) "${chatId}_${content.deviceName}" else "${chatId}_$senderId" + + if (aLatLon != null && chatTitle != null) { + if ((content is TdApi.MessageLocation || (content is MessageUserLocation && content.isValid()))) { + var photoPath: String? = null + val user = telegramHelper.getUser(senderId) + if (user != null) { + photoPath = if (stale) { + telegramHelper.getUserGreyPhotoPath(user) + } else { + telegramHelper.getUserPhotoPath(user) + } } - if (userName.isEmpty()) { - userName = user.phoneNumber - } - photoPath = if (stale) { - telegramHelper.getUserGreyPhotoPath(user) - } else { - telegramHelper.getUserPhotoPath(user) - } - } - if (userName.isEmpty()) { - userName = OsmandLocationUtils.getSenderMessageId(message).toString() - } - setupMapLayer() - val params = generatePointParams(photoPath, stale) - val aLatLon = when (content) { - is TdApi.MessageLocation -> ALatLon(content.location.latitude, content.location.longitude) - is MessageUserLocation -> ALatLon(content.lat, content.lon) - else -> null - } - if (aLatLon != null) { + setupMapLayer() + val params = generatePointParams(photoPath, stale, if (content is MessageUserLocation) content.speed.toFloat() else null) + + val typeName = if (isGroup) chatTitle else OsmandFormatter.getListItemLiveTimeDescr(app, date, app.getString(R.string.last_response) + ": ") if (update) { - osmandAidlHelper.updateMapPoint(MAP_LAYER_ID, "${chatId}_${OsmandLocationUtils.getSenderMessageId(message)}", userName, userName, - chatTitle, Color.WHITE, aLatLon, null, params) + osmandAidlHelper.updateMapPoint(MAP_LAYER_ID, pointId, name, name, typeName, Color.WHITE, aLatLon, details, params) } else { - osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatId}_${OsmandLocationUtils.getSenderMessageId(message)}", userName, userName, - chatTitle, Color.WHITE, aLatLon, null, params) + osmandAidlHelper.addMapPoint(MAP_LAYER_ID, pointId, name, name, typeName, Color.WHITE, aLatLon, details, params) } + points[pointId] = message + } else if (content is MessageOsmAndBotLocation && content.isValid()) { + setupMapLayer() + val params = generatePointParams(null, stale, content.speed.toFloat()) + if (update) { + osmandAidlHelper.updateMapPoint(MAP_LAYER_ID, pointId, name, name, chatTitle, Color.WHITE, aLatLon, details, params) + } else { + osmandAidlHelper.addMapPoint(MAP_LAYER_ID, pointId, name, name, chatTitle, Color.WHITE, aLatLon, details, params) + } + points[pointId] = message } - } else if (chatTitle != null && content is MessageOsmAndBotLocation && content.isValid()) { - val name = content.deviceName - setupMapLayer() - if (update) { - osmandAidlHelper.updateMapPoint(MAP_LAYER_ID, "${chatId}_$name", name, name, - chatTitle, Color.WHITE, ALatLon(content.lat, content.lon), null, generatePointParams(null, stale)) - } else { - osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatId}_$name", name, name, - chatTitle, Color.WHITE, ALatLon(content.lat, content.lon), null, generatePointParams(null, stale)) + if (markers.containsKey(pointId)) { + updateDirectionMarker(pointId) } } } } + private fun getALatLonFromMessage(content: TdApi.MessageContent): ALatLon? { + return when (content) { + is TdApi.MessageLocation -> ALatLon(content.location.latitude, content.location.longitude) + is OsmandLocationUtils.MessageLocation -> ALatLon(content.lat, content.lon) + else -> null + } + } + + private fun getNameFromMessage(message: TdApi.Message): String { + var name = "" + val content = message.content + val senderId = OsmandLocationUtils.getSenderMessageId(message) + if ((content is TdApi.MessageLocation || (content is MessageUserLocation && content.isValid()))) { + val user = telegramHelper.getUser(senderId) + if (user != null) { + name = "${user.firstName} ${user.lastName}".trim() + if (name.isEmpty()) { + name = user.username + } + if (name.isEmpty()) { + name = user.phoneNumber + } + } + if (name.isEmpty()) { + name = senderId.toString() + } + } else if (content is MessageOsmAndBotLocation && content.isValid()) { + name = content.deviceName + } + + return name + } + fun showChatMessages(chatId: Long) { osmandAidlHelper.execOsmandApi { val messages = telegramHelper.getChatMessages(chatId) @@ -156,6 +230,14 @@ class ShowLocationHelper(private val app: TelegramApplication) { } } + fun addDirectionContextMenuButton() { + osmandAidlHelper.addContextMenuButtons(app.packageName, MAP_CONTEXT_MENU_BUTTONS_PARAMS_ID, app.getString(R.string.direction), "", DIRECTION_ICON_ID, "", true, true, MAP_CONTEXT_MENU_BUTTON_ID) + } + + fun removeDirectionContextMenuButton() { + osmandAidlHelper.removeContextMenuButtons(MAP_CONTEXT_MENU_BUTTONS_PARAMS_ID) + } + fun startShowingLocation() { if (!showingLocation && !forcedStop) { showingLocation = if (isUseOsmandCallback() && !app.settings.monitoringEnabled) { @@ -164,6 +246,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { app.startUserLocationService() true } + addDirectionContextMenuButton() } } @@ -176,6 +259,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { } else if (!app.settings.monitoringEnabled) { app.stopUserLocationService() } + removeDirectionContextMenuButton() } } @@ -253,17 +337,37 @@ class ShowLocationHelper(private val app: TelegramApplication) { } } - private fun generatePointParams(photoPath: String?, stale: Boolean): Map { + private fun generatePointDetails(bearing: Float?, altitude: Float?, precision: Float?): List { + val details = mutableListOf() + if (bearing != null && bearing != 0.0f) { + details.add(String.format(Locale.US, "${OsmandLocationUtils.BEARING_PREFIX}%.1f \n", bearing)) + } + if (altitude != null && altitude != 0.0f) { + details.add(String.format(Locale.US, "${OsmandLocationUtils.ALTITUDE_PREFIX}%.1f m\n", altitude)) + } + if (precision != null && precision != 0.0f) { + details.add(String.format(Locale.US, "${OsmandLocationUtils.HDOP_PREFIX}%d m\n", precision.toInt())) + } + + return details + } + + private fun generatePointParams(photoPath: String?, stale: Boolean, speed: Float?): Map { val photoUri = generatePhotoUri(photoPath, stale) app.grantUriPermission( app.settings.appToConnectPackage, photoUri, Intent.FLAG_GRANT_READ_URI_PERMISSION ) - return mapOf( + val params = mutableMapOf( AMapPoint.POINT_IMAGE_URI_PARAM to photoUri.toString(), AMapPoint.POINT_STALE_LOC_PARAM to stale.toString() ) + if (speed != 0.0f) { + params[AMapPoint.POINT_SPEED_PARAM] = speed.toString() + } + + return params } private fun generatePhotoUri(photoPath: String?, stale: Boolean) = diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt index 380fc6f2be..288d166bc1 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt @@ -71,6 +71,10 @@ object TelegramUiHelper { res.latLon = LatLon(content.location.latitude, content.location.longitude) } else if (content is MessageUserLocation) { res.latLon = LatLon(content.lat, content.lon) + res.speed = content.speed + res.bearing = content.bearing + res.altitude = content.altitude + res.precision = content.hdop } } if (user != null) { @@ -140,6 +144,10 @@ object TelegramUiHelper { chatTitle = chat.title name = content.deviceName latLon = LatLon(content.lat, content.lon) + speed = content.speed + bearing = content.bearing + altitude = content.altitude + precision = content.hdop placeholderId = R.drawable.img_user_picture lastUpdated = content.lastUpdated } @@ -158,11 +166,18 @@ object TelegramUiHelper { return LocationItem().apply { chatId = chat.id chatTitle = chat.title - name = TelegramUiHelper.getUserName(user) - latLon = when (content) { - is TdApi.MessageLocation -> LatLon(content.location.latitude, content.location.longitude) - is MessageUserLocation -> LatLon(content.lat, content.lon) - else -> null + name = getUserName(user) + when (content) { + is TdApi.MessageLocation -> { + latLon = LatLon(content.location.latitude, content.location.longitude) + } + is MessageUserLocation -> { + latLon = LatLon(content.lat, content.lon) + speed = content.speed + bearing = content.bearing + altitude = content.altitude + precision = content.hdop + } } photoPath = helper.getUserPhotoPath(user) grayscalePhotoPath = helper.getUserGreyPhotoPath(user) @@ -184,6 +199,10 @@ object TelegramUiHelper { chatTitle = chat.title name = content.deviceName latLon = LatLon(content.lat, content.lon) + speed = content.speed + bearing = content.bearing + altitude = content.altitude + precision = content.hdop photoPath = chat.photo?.small?.local?.path placeholderId = R.drawable.img_user_picture privateChat = helper.isPrivateChat(chat) || helper.isSecretChat(chat) @@ -205,11 +224,18 @@ object TelegramUiHelper { return ChatItem().apply { chatId = chat.id chatTitle = chat.title - name = TelegramUiHelper.getUserName(user) - latLon = when (content) { - is TdApi.MessageLocation -> LatLon(content.location.latitude, content.location.longitude) - is MessageUserLocation -> LatLon(content.lat, content.lon) - else -> null + name = getUserName(user) + when (content) { + is TdApi.MessageLocation -> { + latLon = LatLon(content.location.latitude, content.location.longitude) + } + is MessageUserLocation -> { + latLon = LatLon(content.lat, content.lon) + speed = content.speed + bearing = content.bearing + altitude = content.altitude + precision = content.hdop + } } if (helper.isGroup(chat)) { photoPath = helper.getUserPhotoPath(user) @@ -244,7 +270,7 @@ object TelegramUiHelper { photoPath = user?.profilePhoto?.small?.local?.path } if (user != null) { - name = TelegramUiHelper.getUserName(user) + name = getUserName(user) userId = user.id } userLocations = userLocation @@ -264,6 +290,14 @@ object TelegramUiHelper { internal set var latLon: LatLon? = null internal set + var bearing: Double? = null + internal set + var speed: Double? = null + internal set + var altitude: Double? = null + internal set + var precision: Double? = null + internal set var photoPath: String? = null internal set var grayscalePhotoPath: String? = null diff --git a/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt b/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt index f4a50e7a9d..c5bb6478e3 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandLocationUtils.kt @@ -29,6 +29,7 @@ object OsmandLocationUtils { const val SHARING_LINK = "https://play.google.com/store/apps/details?id=net.osmand.telegram" const val ALTITUDE_PREFIX = "Altitude: " + const val BEARING_PREFIX = "Bearing: " const val SPEED_PREFIX = "Speed: " const val HDOP_PREFIX = "Horizontal precision: " diff --git a/OsmAnd/res/layout/context_menu_buttons.xml b/OsmAnd/res/layout/context_menu_buttons.xml new file mode 100644 index 0000000000..6658418a97 --- /dev/null +++ b/OsmAnd/res/layout/context_menu_buttons.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/map_context_menu_fragment.xml b/OsmAnd/res/layout/map_context_menu_fragment.xml index ae20665fe1..579f2fd3a3 100644 --- a/OsmAnd/res/layout/map_context_menu_fragment.xml +++ b/OsmAnd/res/layout/map_context_menu_fragment.xml @@ -414,6 +414,14 @@ + + mapLayers = new ConcurrentHashMap<>(); private Map receivers = new TreeMap<>(); private Map connectedApps = new ConcurrentHashMap<>(); + private Map contextMenuButtonsParams = new ConcurrentHashMap<>(); + + private AMapPointUpdateListener aMapPointUpdateListener; private boolean mapActivityActive = false; @@ -209,6 +219,7 @@ public class OsmandAidlApi { registerRefreshMapReceiver(mapActivity); registerSetMapLocationReceiver(mapActivity); registerAddMapWidgetReceiver(mapActivity); + registerAddContextMenuButtonsReceiver(mapActivity); registerRemoveMapWidgetReceiver(mapActivity); registerAddMapLayerReceiver(mapActivity); registerRemoveMapLayerReceiver(mapActivity); @@ -228,6 +239,7 @@ public class OsmandAidlApi { registerHideSqliteDbFileReceiver(mapActivity); initOsmandTelegram(); app.getAppCustomization().addListener(mapActivity); + aMapPointUpdateListener = mapActivity; } public void onDestroyMapActivity(MapActivity mapActivity) { @@ -344,6 +356,27 @@ public class OsmandAidlApi { registerReceiver(addMapWidgetReceiver, mapActivity, AIDL_ADD_MAP_WIDGET); } + private void registerAddContextMenuButtonsReceiver(MapActivity mapActivity) { + final WeakReference mapActivityRef = new WeakReference<>(mapActivity); + BroadcastReceiver addContextMenuButtonsParamsReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + MapActivity mapActivity = mapActivityRef.get(); + String ContextMenuButtonsParamsId = intent.getStringExtra(AIDL_OBJECT_ID); + if (mapActivity != null && ContextMenuButtonsParamsId != null) { + ContextMenuButtonsParams buttonsParams = contextMenuButtonsParams.get(ContextMenuButtonsParamsId); + if (buttonsParams != null) { + MapContextMenu mapContextMenu = mapActivity.getContextMenu(); + if (mapContextMenu.isVisible()) { + mapContextMenu.updateData(); + } + } + } + } + }; + registerReceiver(addContextMenuButtonsParamsReceiver, mapActivity, AIDL_ADD_CONTEXT_MENU_BUTTONS); + } + private void registerReceiver(BroadcastReceiver rec, MapActivity ma, String filter) { receivers.put(filter, rec); @@ -1173,6 +1206,21 @@ public class OsmandAidlApi { return false; } + boolean updateMapPoint(String layerId, AMapPoint point, boolean updateOpenedMenuAndMap) { + if (point != null) { + AMapLayer layer = layers.get(layerId); + if (layer != null) { + layer.putPoint(point); + refreshMap(); + if (updateOpenedMenuAndMap && aMapPointUpdateListener != null) { + aMapPointUpdateListener.onAMapPointUpdated(point, layerId); + } + return true; + } + } + return false; + } + boolean removeMapPoint(String layerId, String pointId) { if (pointId != null) { AMapLayer layer = layers.get(layerId); @@ -1968,6 +2016,83 @@ public class OsmandAidlApi { } + public Map getContextMenuButtonsParams() { + return contextMenuButtonsParams; + } + + boolean addContextMenuButtons(ContextMenuButtonsParams buttonsParams, long callbackId) { + if (buttonsParams != null) { + if (contextMenuButtonsParams.containsKey(buttonsParams.getId())) { + updateContextMenuButtons(buttonsParams, callbackId); + } else { + addContextMenuButtonListener(buttonsParams, callbackId); + contextMenuButtonsParams.put(buttonsParams.getId(), buttonsParams); + Intent intent = new Intent(); + intent.setAction(AIDL_ADD_CONTEXT_MENU_BUTTONS); + intent.putExtra(AIDL_OBJECT_ID, buttonsParams.getId()); + app.sendBroadcast(intent); + } + return true; + } else { + return false; + } + } + + boolean removeContextMenuButtons(String buttonsParamsId, long callbackId) { + if (!Algorithms.isEmpty(buttonsParamsId) && contextMenuButtonsParams.containsKey(buttonsParamsId)) { + contextMenuButtonsParams.remove(buttonsParamsId); + contextMenuButtonsCallbacks.remove(callbackId); + Intent intent = new Intent(); + intent.setAction(AIDL_REMOVE_CONTEXT_MENU_BUTTONS); + intent.putExtra(AIDL_OBJECT_ID, buttonsParamsId); + app.sendBroadcast(intent); + return true; + } else { + return false; + } + } + + boolean updateContextMenuButtons(ContextMenuButtonsParams buttonsParams, long callbackId) { + if (buttonsParams != null && contextMenuButtonsParams.containsKey(buttonsParams.getId())) { + contextMenuButtonsParams.put(buttonsParams.getId(), buttonsParams); + addContextMenuButtonListener(buttonsParams, callbackId); + return true; + } else { + return false; + } + } + + private void addContextMenuButtonListener(ContextMenuButtonsParams buttonsParams, long callbackId) { + IContextMenuButtonListener listener = new IContextMenuButtonListener() { + + @Override + public void onContextMenuButtonClicked(int buttonId, String pointId, String layerId) { + if (aidlCallbackListener != null) { + for (OsmandAidlService.AidlCallbackParams cb : aidlCallbackListener.getAidlCallbacks().values()) { + if (!aidlCallbackListener.getAidlCallbacks().isEmpty() && (cb.getKey() & KEY_ON_CONTEXT_MENU_BUTTONS_CLICK) > 0) { + try { + cb.getCallback().onContextMenuButtonClicked(buttonId, pointId, layerId); + } catch (Exception e) { + LOG.debug(e.getMessage(), e); + } + } + } + } + } + }; + buttonsParams.setCallbackId(callbackId); + contextMenuButtonsCallbacks.put(callbackId, listener); + } + + private Map contextMenuButtonsCallbacks = new ConcurrentHashMap<>(); + + public void contextMenuCallbackButtonClicked(long callbackId, int buttonId, String pointId, String layerId) { + IContextMenuButtonListener contextMenuButtonListener = contextMenuButtonsCallbacks.get(callbackId); + if (contextMenuButtonListener != null) { + contextMenuButtonListener.onContextMenuButtonClicked(buttonId, pointId, layerId); + } + } + boolean getBitmapForGpx(final Uri gpxUri, final float density, final int widthPixels, final int heightPixels, final int color, final GpxBitmapCreatedCallback callback) { if (gpxUri == null || callback == null) { @@ -2236,4 +2361,7 @@ public class OsmandAidlApi { void onAppInitialized(); } + public interface AMapPointUpdateListener { + void onAMapPointUpdated(AMapPoint point, String layerId); + } } diff --git a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java index f70bbc76d3..347e1153fe 100644 --- a/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java +++ b/OsmAnd/src/net/osmand/aidl/OsmandAidlService.java @@ -10,13 +10,15 @@ import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; -import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import net.osmand.PlatformUtil; import net.osmand.aidl.OsmandAidlApi.GpxBitmapCreatedCallback; import net.osmand.aidl.OsmandAidlApi.OsmandAppInitCallback; import net.osmand.aidl.OsmandAidlApi.SearchCompleteCallback; import net.osmand.aidl.calculateroute.CalculateRouteParams; +import net.osmand.aidl.contextmenu.ContextMenuButtonsParams; +import net.osmand.aidl.contextmenu.RemoveContextMenuButtonsParams; +import net.osmand.aidl.contextmenu.UpdateContextMenuButtonsParams; import net.osmand.aidl.customization.OsmandSettingsParams; import net.osmand.aidl.customization.SetWidgetsParams; import net.osmand.aidl.favorite.AddFavoriteParams; @@ -93,6 +95,7 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { public static final int KEY_ON_UPDATE = 1; public static final int KEY_ON_NAV_DATA_UPDATE = 2; + public static final int KEY_ON_CONTEXT_MENU_BUTTONS_CLICK = 4; private Map callbacks = new ConcurrentHashMap<>(); private Handler mHandler = null; @@ -360,7 +363,7 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { public boolean updateMapPoint(UpdateMapPointParams params) { try { OsmandAidlApi api = getApi("updateMapPoint"); - return params != null && api != null && api.putMapPoint(params.getLayerId(), params.getPoint()); + return params != null && api != null && api.updateMapPoint(params.getLayerId(), params.getPoint(), params.isUpdateOpenedMenuAndMap()); } catch (Exception e) { handleException(e); return false; @@ -1058,8 +1061,58 @@ public class OsmandAidlService extends Service implements AidlCallbackListener { return UNKNOWN_API_ERROR; } } - }; + @Override + public long addContextMenuButtons(ContextMenuButtonsParams params, final IOsmAndAidlCallback callback) { + try { + OsmandAidlApi api = getApi("addContextMenuButtons"); + if (api != null && params != null) { + long callbackId = params.getCallbackId(); + if (callbackId == -1 || !callbacks.containsKey(callbackId)) { + callbackId = addAidlCallback(callback, KEY_ON_CONTEXT_MENU_BUTTONS_CLICK); + params.setCallbackId(callbackId); + } + boolean buttonsAdded = api.addContextMenuButtons(params, callbackId); + return buttonsAdded ? callbackId : -1; + } else { + return -1; + } + } catch (Exception e) { + handleException(e); + return UNKNOWN_API_ERROR; + } + } + + @Override + public boolean removeContextMenuButtons(RemoveContextMenuButtonsParams params) { + try { + OsmandAidlApi api = getApi("removeContextMenuButtons"); + if (params != null && api != null) { + long callbackId = params.getCallbackId(); + removeAidlCallback(callbackId); + return api.removeContextMenuButtons(params.getParamsId(), callbackId); + } + return false; + } catch (Exception e) { + return false; + } + } + + @Override + public boolean updateContextMenuButtons(UpdateContextMenuButtonsParams params) { + try { + OsmandAidlApi api = getApi("updateContextMenuButtons"); + if (params != null && api != null) { + ContextMenuButtonsParams buttonsParams = params.getContextMenuButtonsParams(); + return api.updateContextMenuButtons(buttonsParams, buttonsParams.getCallbackId()); + } + return false; + } catch (Exception e) { + handleException(e); + return false; + } + } + }; public static class AidlCallbackParams { private IOsmAndAidlCallback callback; diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl b/OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl new file mode 100644 index 0000000000..4a8cbee665 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable AContextMenuButton; \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.java b/OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.java new file mode 100644 index 0000000000..b235116999 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/AContextMenuButton.java @@ -0,0 +1,101 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +public class AContextMenuButton implements Parcelable { + + private int buttonId; + + private String leftTextCaption; + private String rightTextCaption; + private String leftIconName; + private String rightIconName; + + private boolean needColorizeIcon; + private boolean enabled; + + public AContextMenuButton(int buttonId, String leftTextCaption, String rightTextCaption, String leftIconName, String rightIconName, boolean needColorizeIcon, boolean enabled) { + this.buttonId = buttonId; + this.leftTextCaption = leftTextCaption; + this.rightTextCaption = rightTextCaption; + this.leftIconName = leftIconName; + this.rightIconName = rightIconName; + this.needColorizeIcon = needColorizeIcon; + this.enabled = enabled; + } + + protected AContextMenuButton(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public AContextMenuButton createFromParcel(Parcel in) { + return new AContextMenuButton(in); + } + + @Override + public AContextMenuButton[] newArray(int size) { + return new AContextMenuButton[size]; + } + }; + + public int getButtonId() { + return buttonId; + } + + public String getLeftTextCaption() { + return leftTextCaption; + } + + public String getRightTextCaption() { + return rightTextCaption; + } + + public String getLeftIconName() { + return leftIconName; + } + + public String getRightIconName() { + return rightIconName; + } + + public boolean isNeedColorizeIcon() { + return needColorizeIcon; + } + + public boolean isEnabled() { + return enabled; + } + + public static Creator getCREATOR() { + return CREATOR; + } + + @Override + public void writeToParcel(Parcel dest, int f) { + dest.writeInt(buttonId); + dest.writeString(leftTextCaption); + dest.writeString(rightTextCaption); + dest.writeString(leftIconName); + dest.writeString(rightIconName); + dest.writeInt(needColorizeIcon ? 1 : 0); + dest.writeInt(enabled ? 1 : 0); + } + + private void readFromParcel(Parcel in) { + buttonId = in.readInt(); + leftTextCaption = in.readString(); + rightTextCaption = in.readString(); + leftIconName = in.readString(); + rightIconName = in.readString(); + needColorizeIcon = in.readInt() != 0; + enabled = in.readInt() != 0; + } + + @Override + public int describeContents() { + return 0; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl b/OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl new file mode 100644 index 0000000000..cf05b9db9c --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable ContextMenuButtonsParams; \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java b/OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java new file mode 100644 index 0000000000..85cb9cb3e0 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/ContextMenuButtonsParams.java @@ -0,0 +1,105 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.ArrayList; +import java.util.List; + +public class ContextMenuButtonsParams implements Parcelable { + + private AContextMenuButton leftButton; + private AContextMenuButton rightButton; + + private String id; + private String appPackage; + private String layerId; + + private long callbackId = -1L; + + private List pointsIds = new ArrayList<>(); + + public ContextMenuButtonsParams(AContextMenuButton leftButton, AContextMenuButton rightButton, String id, String appPackage, String layerId, boolean followOpenedPoint, long callbackId, List pointsIds) { + this.leftButton = leftButton; + this.rightButton = rightButton; + this.id = id; + this.appPackage = appPackage; + this.layerId = layerId; + this.callbackId = callbackId; + this.pointsIds = pointsIds; + } + + public ContextMenuButtonsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new Creator() { + @Override + public ContextMenuButtonsParams createFromParcel(Parcel in) { + return new ContextMenuButtonsParams(in); + } + + @Override + public ContextMenuButtonsParams[] newArray(int size) { + return new ContextMenuButtonsParams[size]; + } + }; + + public AContextMenuButton getLeftButton() { + return leftButton; + } + + public AContextMenuButton getRightButton() { + return rightButton; + } + + public String getId() { + return id; + } + + public String getAppPackage() { + return appPackage; + } + + public String getLayerId() { + return layerId; + } + + public long getCallbackId() { + return callbackId; + } + + public void setCallbackId(long callbackId) { + this.callbackId = callbackId; + } + + public List getPointsIds() { + return pointsIds; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(leftButton, flags); + dest.writeParcelable(rightButton, flags); + dest.writeString(id); + dest.writeString(appPackage); + dest.writeString(layerId); + dest.writeLong(callbackId); + dest.writeStringList(pointsIds); + } + + private void readFromParcel(Parcel in) { + leftButton = in.readParcelable(AContextMenuButton.class.getClassLoader()); + rightButton = in.readParcelable(AContextMenuButton.class.getClassLoader()); + id = in.readString(); + appPackage = in.readString(); + layerId = in.readString(); + callbackId = in.readLong(); + in.readStringList(pointsIds); + } + + @Override + public int describeContents() { + return 0; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl b/OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl new file mode 100644 index 0000000000..557a8e5113 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable RemoveContextMenuButtonsParams; \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java b/OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java new file mode 100644 index 0000000000..33f3ab400c --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/RemoveContextMenuButtonsParams.java @@ -0,0 +1,53 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +public class RemoveContextMenuButtonsParams implements Parcelable { + + private String paramsId; + + private long callbackId = -1L; + + public RemoveContextMenuButtonsParams(String paramsId, long callbackId) { + this.paramsId = paramsId; + this.callbackId = callbackId; + } + + public RemoveContextMenuButtonsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new + Creator() { + public RemoveContextMenuButtonsParams createFromParcel(Parcel in) { + return new RemoveContextMenuButtonsParams(in); + } + + public RemoveContextMenuButtonsParams[] newArray(int size) { + return new RemoveContextMenuButtonsParams[size]; + } + }; + + public String getParamsId() { + return paramsId; + } + + public long getCallbackId() { + return callbackId; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(paramsId); + dest.writeLong(callbackId); + } + + private void readFromParcel(Parcel in) { + paramsId = in.readString(); + callbackId = in.readLong(); + } + + public int describeContents() { + return 0; + } +} diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl b/OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl new file mode 100644 index 0000000000..f5482b3452 --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.aidl @@ -0,0 +1,3 @@ +package net.osmand.aidl.contextmenu; + +parcelable UpdateContextMenuButtonsParams; \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java b/OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java new file mode 100644 index 0000000000..83d0009efc --- /dev/null +++ b/OsmAnd/src/net/osmand/aidl/contextmenu/UpdateContextMenuButtonsParams.java @@ -0,0 +1,45 @@ +package net.osmand.aidl.contextmenu; + +import android.os.Parcel; +import android.os.Parcelable; + +import net.osmand.aidl.mapwidget.AMapWidget; + +public class UpdateContextMenuButtonsParams implements Parcelable { + private ContextMenuButtonsParams buttonsParams; + + public UpdateContextMenuButtonsParams(ContextMenuButtonsParams widget) { + this.buttonsParams = widget; + } + + public UpdateContextMenuButtonsParams(Parcel in) { + readFromParcel(in); + } + + public static final Creator CREATOR = new + Creator() { + public UpdateContextMenuButtonsParams createFromParcel(Parcel in) { + return new UpdateContextMenuButtonsParams(in); + } + + public UpdateContextMenuButtonsParams[] newArray(int size) { + return new UpdateContextMenuButtonsParams[size]; + } + }; + + public ContextMenuButtonsParams getContextMenuButtonsParams() { + return buttonsParams; + } + + public void writeToParcel(Parcel out, int flags) { + out.writeParcelable(buttonsParams, flags); + } + + private void readFromParcel(Parcel in) { + buttonsParams = in.readParcelable(ContextMenuButtonsParams.class.getClassLoader()); + } + + public int describeContents() { + return 0; + } +} diff --git a/OsmAnd/src/net/osmand/aidl/maplayer/point/AMapPoint.java b/OsmAnd/src/net/osmand/aidl/maplayer/point/AMapPoint.java index b61ec928c7..9218391975 100644 --- a/OsmAnd/src/net/osmand/aidl/maplayer/point/AMapPoint.java +++ b/OsmAnd/src/net/osmand/aidl/maplayer/point/AMapPoint.java @@ -20,17 +20,19 @@ public class AMapPoint implements Parcelable { private String shortName; private String fullName; private String typeName; + private String layerId; private int color; private ALatLon location; private List details = new ArrayList<>(); private Map params = new HashMap<>(); - public AMapPoint(String id, String shortName, String fullName, String typeName, int color, - ALatLon location, List details, Map params) { + public AMapPoint(String id, String shortName, String fullName, String typeName, String layerId, + int color, ALatLon location, List details, Map params) { this.id = id; this.shortName = shortName; this.fullName = fullName; this.typeName = typeName; + this.layerId = layerId; this.color = color; this.location = location; if (details != null) { @@ -72,6 +74,10 @@ public class AMapPoint implements Parcelable { return typeName; } + public String getLayerId() { + return layerId; + } + public int getColor() { return color; } @@ -93,6 +99,7 @@ public class AMapPoint implements Parcelable { out.writeString(shortName); out.writeString(fullName); out.writeString(typeName); + out.writeString(layerId); out.writeInt(color); out.writeParcelable(location, flags); out.writeStringList(details); @@ -104,6 +111,7 @@ public class AMapPoint implements Parcelable { shortName = in.readString(); fullName = in.readString(); typeName = in.readString(); + layerId = in.readString(); color = in.readInt(); location = in.readParcelable(ALatLon.class.getClassLoader()); in.readStringList(details); diff --git a/OsmAnd/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java b/OsmAnd/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java index 178af20b1d..a7b871a1d4 100644 --- a/OsmAnd/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java +++ b/OsmAnd/src/net/osmand/aidl/maplayer/point/UpdateMapPointParams.java @@ -6,10 +6,12 @@ import android.os.Parcelable; public class UpdateMapPointParams implements Parcelable { private String layerId; private AMapPoint point; + private boolean updateOpenedMenuAndMap; - public UpdateMapPointParams(String layerId, AMapPoint point) { + public UpdateMapPointParams(String layerId, AMapPoint point, boolean updateOpenedMenuAndMap) { this.layerId = layerId; this.point = point; + this.updateOpenedMenuAndMap = updateOpenedMenuAndMap; } public UpdateMapPointParams(Parcel in) { @@ -35,14 +37,20 @@ public class UpdateMapPointParams implements Parcelable { return point; } + public boolean isUpdateOpenedMenuAndMap() { + return updateOpenedMenuAndMap; + } + public void writeToParcel(Parcel out, int flags) { out.writeString(layerId); out.writeParcelable(point, flags); + out.writeInt(updateOpenedMenuAndMap ? 1 : 0); } private void readFromParcel(Parcel in) { layerId = in.readString(); point = in.readParcelable(AMapPoint.class.getClassLoader()); + updateOpenedMenuAndMap = in.readInt() != 0; } public int describeContents() { diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index c600da334c..32faf729a8 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -47,6 +47,10 @@ import net.osmand.SecondSplashScreenFragment; import net.osmand.StateChangedListener; import net.osmand.ValueHolder; import net.osmand.access.MapAccessibilityActions; +import net.osmand.aidl.OsmandAidlApi.AMapPointUpdateListener; +import net.osmand.aidl.contextmenu.ContextMenuButtonsParams; +import net.osmand.aidl.map.ALatLon; +import net.osmand.aidl.maplayer.point.AMapPoint; import net.osmand.core.android.AtlasMapRendererView; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; @@ -117,6 +121,7 @@ import net.osmand.plus.search.QuickSearchDialogFragment; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType; import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint; +import net.osmand.plus.views.AidlMapLayer; import net.osmand.plus.views.AnimateDraggingMapThread; import net.osmand.plus.views.MapControlsLayer; import net.osmand.plus.views.MapInfoLayer; @@ -149,7 +154,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class MapActivity extends OsmandActionBarActivity implements DownloadEvents, - OnRequestPermissionsResultCallback, IRouteInformationListener, + OnRequestPermissionsResultCallback, IRouteInformationListener, AMapPointUpdateListener, MapMarkerChangedListener, OnDismissDialogFragmentListener, OnDrawMapListener, OsmAndAppCustomizationListener { public static final String INTENT_KEY_PARENT_MAP_ACTIVITY = "intent_parent_map_activity_key"; @@ -1785,6 +1790,31 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven refreshMap(); } + @Override + public void onAMapPointUpdated(final AMapPoint point, String layerId) { + if (canUpdateAMapPointMenu(point, layerId)) { + app.runInUIThread(new Runnable() { + @Override + public void run() { + ALatLon loc = point.getLocation(); + LatLon latLon = new LatLon(loc.getLatitude(), loc.getLongitude()); + PointDescription pointDescription = new PointDescription(PointDescription.POINT_TYPE_MARKER, point.getFullName()); + mapContextMenu.update(latLon, pointDescription, point); + mapContextMenu.centerMarkerLocation(); + } + }); + } + } + + private boolean canUpdateAMapPointMenu(AMapPoint point, String layerId) { + Object object = mapContextMenu.getObject(); + if (!mapContextMenu.isVisible() || !(object instanceof AMapPoint)) { + return false; + } + AMapPoint oldPoint = (AMapPoint) object; + return oldPoint.getLayerId().equals(layerId) && oldPoint.getId().equals(point.getId()); + } + private class ScreenOffReceiver extends BroadcastReceiver { @Override diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java index 0fe82579ca..88d480a951 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java @@ -7,10 +7,13 @@ import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.util.Pair; import android.view.View; import android.widget.LinearLayout; import net.osmand.CallbackWithObject; +import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.WptPt; import net.osmand.Location; import net.osmand.StateChangedListener; import net.osmand.data.Amenity; @@ -20,8 +23,6 @@ import net.osmand.data.PointDescription; import net.osmand.data.TransportStop; import net.osmand.plus.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; -import net.osmand.GPXUtilities.GPXFile; -import net.osmand.GPXUtilities.WptPt; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener; @@ -419,10 +420,14 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL active = false; } } else { - WeakReference fragmentRef = findMenuFragment(); - if (fragmentRef != null) { - fragmentRef.get().centerMarkerLocation(); - } + centerMarkerLocation(); + } + } + + public void centerMarkerLocation() { + WeakReference fragmentRef = findMenuFragment(); + if (fragmentRef != null) { + fragmentRef.get().centerMarkerLocation(); } } @@ -1386,6 +1391,15 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL } } + public List> getAdditionalButtonsControllers() { + MenuController menuController = getMenuController(); + if (menuController != null) { + return menuController.getAdditionalButtonsControllers(); + } else { + return null; + } + } + public TitleProgressController getTitleProgressController() { MenuController menuController = getMenuController(); if (menuController != null) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index 56d70ab19c..a5d9dc5fe0 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -14,7 +14,9 @@ import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; +import android.support.v7.view.ContextThemeWrapper; import android.text.TextUtils; +import android.util.Pair; import android.util.TypedValue; import android.view.GestureDetector; import android.view.Gravity; @@ -1083,6 +1085,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo TitleButtonController bottomTitleButtonController = menu.getBottomTitleButtonController(); TitleButtonController leftDownloadButtonController = menu.getLeftDownloadButtonController(); TitleButtonController rightDownloadButtonController = menu.getRightDownloadButtonController(); + List> additionalButtonsControllers = menu.getAdditionalButtonsControllers(); TitleProgressController titleProgressController = menu.getTitleProgressController(); // Title buttons @@ -1195,6 +1198,17 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo rightDownloadButtonView.setVisibility(View.INVISIBLE); } + final LinearLayout additionalButtonsContainer = (LinearLayout) view.findViewById(R.id.additional_buttons_container); + if (additionalButtonsControllers != null && !additionalButtonsControllers.isEmpty()) { + additionalButtonsContainer.removeAllViews(); + for (Pair buttonControllers : additionalButtonsControllers) { + attachButtonsRow(additionalButtonsContainer, buttonControllers.first, buttonControllers.second); + } + additionalButtonsContainer.setVisibility(View.VISIBLE); + } else { + additionalButtonsContainer.setVisibility(View.GONE); + } + // Progress bar final View titleProgressContainer = view.findViewById(R.id.title_progress_container); if (titleProgressController != null) { @@ -1222,6 +1236,46 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo } } + private void attachButtonsRow(ViewGroup container, final TitleButtonController leftButtonController, final TitleButtonController rightButtonController) { + ContextThemeWrapper ctx = new ContextThemeWrapper(getMapActivity(), !nightMode ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme); + LayoutInflater inflater = LayoutInflater.from(ctx); + View view = inflater.inflate(R.layout.context_menu_buttons, container, false); + + // Left button + final View leftButtonView = view.findViewById(R.id.additional_button_left_view); + final TextView leftButton = (TextView) view.findViewById(R.id.additional_button_left); + fillButtonInfo(leftButtonController, leftButtonView, leftButton); + + // Right button + final View rightButtonView = view.findViewById(R.id.additional_button_right_view); + final TextView rightButton = (TextView) view.findViewById(R.id.additional_button_right); + fillButtonInfo(rightButtonController, rightButtonView, rightButton); + + container.addView(view); + } + + private void fillButtonInfo(final TitleButtonController buttonController, View buttonView, TextView buttonText) { + if (buttonController != null) { + enableDisableButtons(buttonView, buttonText, buttonController.enabled); + buttonText.setText(buttonController.caption); + buttonView.setVisibility(buttonController.visible ? View.VISIBLE : View.INVISIBLE); + + Drawable leftIcon = buttonController.getLeftIcon(); + Drawable rightIcon = buttonController.getRightIcon(); + buttonText.setCompoundDrawablesWithIntrinsicBounds(leftIcon, null, rightIcon, null); + buttonText.setCompoundDrawablePadding(dpToPx(8f)); + ((LinearLayout) buttonView).setGravity(rightIcon != null ? Gravity.END : Gravity.START); + buttonView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + buttonController.buttonPressed(); + } + }); + } else { + buttonView.setVisibility(View.INVISIBLE); + } + } + private void buildHeader() { OsmandApplication app = getMyApplication(); if (app != null && view != null) { @@ -1479,6 +1533,12 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo titleBottomButtonHeight = titleBottomButtonContainer.getMeasuredHeight(); } + int additionalButtonsHeight = 0; + View additionalButtonsContainer = view.findViewById(R.id.additional_buttons_container); + if (additionalButtonsContainer.getVisibility() == View.VISIBLE) { + additionalButtonsHeight = additionalButtonsContainer.getMeasuredHeight(); + } + int titleProgressHeight = 0; View titleProgressContainer = view.findViewById(R.id.title_progress_container); if (titleProgressContainer.getVisibility() == View.VISIBLE) { @@ -1493,12 +1553,12 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo } newMenuTopViewHeight = menuTopViewHeightExcludingTitle + titleHeight + titleButtonHeight + downloadButtonsHeight - + titleBottomButtonHeight + titleProgressHeight + line3Height; + + titleBottomButtonHeight + additionalButtonsHeight + titleProgressHeight + line3Height; dy = Math.max(0, newMenuTopViewHeight - menuTopViewHeight - (newMenuTopShadowAllHeight - menuTopShadowAllHeight)); } else { menuTopViewHeightExcludingTitle = newMenuTopViewHeight - line1.getMeasuredHeight() - line2MeasuredHeight - - titleButtonHeight - downloadButtonsHeight - titleBottomButtonHeight - titleProgressHeight-line3Height; + - titleButtonHeight - downloadButtonsHeight - titleBottomButtonHeight - additionalButtonsHeight - titleProgressHeight-line3Height; menuTitleTopBottomPadding = (line1.getMeasuredHeight() - line1.getLineCount() * line1.getLineHeight()) + (line2MeasuredHeight - line2LineCount * line2LineHeight); menuButtonsHeight = view.findViewById(R.id.context_menu_bottom_buttons).getHeight() diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java index f4a92e5e77..c6a718f4d5 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java @@ -12,6 +12,7 @@ import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; +import android.util.Pair; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; @@ -79,7 +80,6 @@ import net.osmand.util.OpeningHoursParser.OpeningHours; import java.io.IOException; import java.lang.ref.WeakReference; -import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -111,6 +111,7 @@ public abstract class MenuController extends BaseMenuController implements Colla protected TitleButtonController leftDownloadButtonController; protected TitleButtonController rightDownloadButtonController; + protected List> additionalButtonsControllers; protected TitleProgressController titleProgressController; protected TopToolbarController toolbarController; @@ -356,6 +357,10 @@ public abstract class MenuController extends BaseMenuController implements Colla return rightDownloadButtonController; } + public List> getAdditionalButtonsControllers() { + return additionalButtonsControllers; + } + public TitleProgressController getTitleProgressController() { return titleProgressController; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AMapPointMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AMapPointMenuController.java index 1dfe9d3e82..45914a0246 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AMapPointMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AMapPointMenuController.java @@ -8,7 +8,10 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import android.util.Pair; +import net.osmand.aidl.contextmenu.AContextMenuButton; +import net.osmand.aidl.contextmenu.ContextMenuButtonsParams; import net.osmand.aidl.maplayer.point.AMapPoint; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; @@ -23,6 +26,9 @@ import net.osmand.util.Algorithms; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class AMapPointMenuController extends MenuController { @@ -33,10 +39,24 @@ public class AMapPointMenuController extends MenuController { private Drawable pointDrawable; - public AMapPointMenuController(@NonNull MapActivity mapActivity, @NonNull PointDescription pointDescription, @NonNull AMapPoint point) { + public AMapPointMenuController(@NonNull MapActivity mapActivity, @NonNull PointDescription pointDescription, @NonNull final AMapPoint point) { super(new MenuBuilder(mapActivity), pointDescription, mapActivity); this.point = point; pointDrawable = getPointDrawable(); + final OsmandApplication app = mapActivity.getMyApplication(); + Map buttonsParamsMap = app.getAidlApi().getContextMenuButtonsParams(); + if (!buttonsParamsMap.isEmpty()) { + additionalButtonsControllers = new ArrayList<>(); + for (ContextMenuButtonsParams buttonsParams : buttonsParamsMap.values()) { + List pointsIds = buttonsParams.getPointsIds(); + if (((pointsIds == null || pointsIds.isEmpty()) || pointsIds.contains(point.getId())) || buttonsParams.getLayerId().equals(point.getLayerId())) { + long callbackId = buttonsParams.getCallbackId(); + TitleButtonController leftButtonController = createAdditionButtonController(buttonsParams.getLeftButton(), callbackId); + TitleButtonController rightButtonController = createAdditionButtonController(buttonsParams.getRightButton(), callbackId); + additionalButtonsControllers.add(Pair.create(leftButtonController, rightButtonController)); + } + } + } } @Override @@ -138,13 +158,39 @@ public class AMapPointMenuController extends MenuController { return false; } + private TitleButtonController createAdditionButtonController(final AContextMenuButton contextMenuButton, final long callbackId) { + MapActivity mapActivity = getMapActivity(); + if (mapActivity == null || contextMenuButton == null) { + return null; + } + TitleButtonController titleButtonController = new TitleButtonController() { + @Override + public void buttonPressed() { + MapActivity mapActivity = getMapActivity(); + if (mapActivity != null) { + int buttonId = contextMenuButton.getButtonId(); + String pointId = point.getId(); + String layerId = point.getLayerId(); + mapActivity.getMyApplication().getAidlApi().contextMenuCallbackButtonClicked(callbackId, buttonId, pointId, layerId); + } + } + }; + titleButtonController.caption = contextMenuButton.getLeftTextCaption(); + titleButtonController.rightTextCaption = contextMenuButton.getRightTextCaption(); + titleButtonController.leftIconId = getIconIdByName(contextMenuButton.getLeftIconName()); + titleButtonController.rightIconId = getIconIdByName(contextMenuButton.getRightIconName()); + titleButtonController.enabled = contextMenuButton.isEnabled(); + titleButtonController.needColorizeIcon = contextMenuButton.isNeedColorizeIcon(); + + return titleButtonController; + } + private int getPointTypeIconId() { MapActivity activity = getMapActivity(); if (activity != null) { String iconName = point.getParams().get(AMapPoint.POINT_TYPE_ICON_NAME_PARAM); if (!TextUtils.isEmpty(iconName)) { - OsmandApplication app = activity.getMyApplication(); - return app.getResources().getIdentifier(iconName, "drawable", app.getPackageName()); + return getIconIdByName(iconName); } } if (!TextUtils.isEmpty(point.getShortName())) { @@ -153,6 +199,15 @@ public class AMapPointMenuController extends MenuController { return NO_ICON; } + private int getIconIdByName(String iconName) { + MapActivity activity = getMapActivity(); + if (activity != null && !TextUtils.isEmpty(iconName)) { + OsmandApplication app = activity.getMyApplication(); + return app.getResources().getIdentifier(iconName, "drawable", app.getPackageName()); + } + return 0; + } + private float getPointSpeed() { String speed = point.getParams().get(AMapPoint.POINT_SPEED_PARAM); if (!TextUtils.isEmpty(speed)) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/IContextMenuButtonListener.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/IContextMenuButtonListener.java new file mode 100644 index 0000000000..addd44daff --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/IContextMenuButtonListener.java @@ -0,0 +1,5 @@ +package net.osmand.plus.mapcontextmenu.other; + +public interface IContextMenuButtonListener { + void onContextMenuButtonClicked(int buttonId, String pointId, String layerId); +} \ No newline at end of file From 9dde5aac831e6b8387402d4aef8946f228426d5b Mon Sep 17 00:00:00 2001 From: Vyacheslav Date: Sat, 20 Apr 2019 10:36:42 +0000 Subject: [PATCH 053/114] Translated using Weblate (Russian) Currently translated at 99.7% (2741 of 2750 strings) --- OsmAnd/res/values-ru/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index c4e458d859..1d51e18d7a 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -1221,7 +1221,7 @@ OsmAnd+ карты и навигация Уменьшает \"шум\" компаса, но добавляет инерцию. Использовать фильтр Калмана - Прекратить навигацию + Остановить навигацию Использовать датчик магнитного поля Удалить точку время @@ -2049,7 +2049,7 @@ Разбиение на клипы Использовать разбиение на клипы Циклическая перезапись клипов при превышении заданного объема хранилища. - Поменять местами пункт отправления и пункт назначения + Обратить пункты старта и назначения Удалить Подземные объекты Данные недоступны @@ -2335,7 +2335,7 @@ Редактировать линию Добавить точку перед Добавить точку после - Параметры + Опции OsmAnd соединит точки с маршрутом для выбранного профиля. Сохранить точки, как точки маршрута или как линию. Выберите профиль навигации @@ -2670,7 +2670,7 @@ Ошибка импорта карты Карта импортирована Маршруты рядом с - Рядом + В пределах Введите долготу Введите широту Введите широту и долготу From bcc90bda6c45c29604d712a9ade7d12f03adaeab Mon Sep 17 00:00:00 2001 From: sergio Date: Sat, 20 Apr 2019 10:53:11 +0000 Subject: [PATCH 054/114] Translated using Weblate (Russian) Currently translated at 99.7% (2741 of 2750 strings) --- OsmAnd/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 1d51e18d7a..fba550058c 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -2903,7 +2903,7 @@ Сначала добавьте пункт назначения Поменять Показать больше - Треки на карте + Отображаемые треки Показать/скрыть GPX треки Скрыть GPX треки Показать GPX треки From 1c22f9f814af7b10a617b48cf824719878c7fcf3 Mon Sep 17 00:00:00 2001 From: crimean Date: Sat, 20 Apr 2019 18:03:33 +0300 Subject: [PATCH 055/114] Fix map zoom when chart zooms at route details --- .../osmand/plus/base/ContextMenuFragment.java | 4 +- .../other/TrackDetailsMenu.java | 31 ++++++--- .../MapRouteInfoMenuFragment.java | 4 +- .../RouteDetailsFragment.java | 66 +++++++++++++++---- .../cards/CardChartListener.java | 8 +++ .../cards/RouteStatisticCard.java | 12 +++- 6 files changed, 99 insertions(+), 26 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java index 183134f0e4..3de5833f19 100644 --- a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java @@ -878,7 +878,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { if (getActivity() == null) { return; } - calculateLayout(view); + calculateLayout(view, initLayout); if (!moving) { doLayoutMenu(); @@ -895,7 +895,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { } } - protected void calculateLayout(View view) { + protected void calculateLayout(View view, boolean initLayout) { menuFullHeight = mainView.getHeight(); menuBottomViewHeight = menuFullHeight; menuFullHeightMax = view.findViewById(R.id.route_menu_cards_container).getHeight() + diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index 4d280d6960..932b78a48a 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -338,14 +338,13 @@ public class TrackDetailsMenu { int tileBoxWidthPx = 0; int tileBoxHeightPx = 0; - TrackDetailsMenuFragment fragment = getMenuFragment(); - if (fragment != null) { - boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); - if (!portrait) { - tileBoxWidthPx = tb.getPixWidth() - fragment.getWidth(); - } else { - tileBoxHeightPx = tb.getPixHeight() - fragment.getHeight(); - } + boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); + if (!portrait) { + int width = getFragmentWidth(); + tileBoxWidthPx = width != -1 ? tb.getPixWidth() - width : 0; + } else { + int height = getFragmentHeight(); + tileBoxHeightPx = height != -1 ? tb.getPixHeight() - height : 0; } if (tileBoxHeightPx > 0 || tileBoxWidthPx > 0) { if (forceFit) { @@ -363,6 +362,22 @@ public class TrackDetailsMenu { } } + protected int getFragmentWidth() { + TrackDetailsMenuFragment fragment = getMenuFragment(); + if (fragment != null) { + return fragment.getWidth(); + } + return -1; + } + + protected int getFragmentHeight() { + TrackDetailsMenuFragment fragment = getMenuFragment(); + if (fragment != null) { + return fragment.getHeight(); + } + return -1; + } + public void refreshChart(LineChart chart, boolean forceFit) { MapActivity mapActivity = getMapActivity(); GpxDisplayItem gpxItem = getGpxItem(); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java index 12e5f2ea51..d0b11b84b5 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java @@ -246,11 +246,11 @@ public class MapRouteInfoMenuFragment extends ContextMenuFragment { } @Override - protected void calculateLayout(View view) { + protected void calculateLayout(View view, boolean initLayout) { menuTitleHeight = view.findViewById(R.id.route_menu_top_shadow_all).getHeight() + view.findViewById(R.id.control_buttons).getHeight() - view.findViewById(R.id.buttons_shadow).getHeight(); - super.calculateLayout(view); + super.calculateLayout(view, initLayout); } private void adjustMapPosition(int y) { diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java index 15ed87f13b..fd7a83fddc 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java @@ -35,6 +35,8 @@ import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; +import com.github.mikephil.charting.listener.ChartTouchListener; +import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture; import com.github.mikephil.charting.renderer.HorizontalBarChartRenderer; import com.github.mikephil.charting.utils.ViewPortHandler; @@ -120,12 +122,25 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT private RouteDetailsFragmentListener routeDetailsListener; private RouteStatisticCard statisticCard; private List routeInfoCards = new ArrayList<>(); - private TrackDetailsMenu trackDetailsMenu; + private RouteDetailsMenu routeDetailsMenu; public interface RouteDetailsFragmentListener { void onNavigationRequested(); } + private class RouteDetailsMenu extends TrackDetailsMenu { + + @Override + protected int getFragmentWidth() { + return getWidth(); + } + + @Override + protected int getFragmentHeight() { + return getMenuFullHeight(); + } + } + @Override public int getMainLayoutId() { return R.layout.route_info_layout; @@ -186,8 +201,8 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT MapActivity mapActivity = getMapActivity(); if (mapActivity != null && isPortrait()) { mapActivity.findViewById(R.id.bottom_controls_container).setVisibility(View.GONE); - if (trackDetailsMenu != null) { - trackDetailsMenu.setMapActivity(mapActivity); + if (routeDetailsMenu != null) { + routeDetailsMenu.setMapActivity(mapActivity); } } } @@ -197,8 +212,8 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT MapActivity mapActivity = getMapActivity(); if (mapActivity != null && isPortrait()) { mapActivity.findViewById(R.id.bottom_controls_container).setVisibility(View.VISIBLE); - if (trackDetailsMenu != null) { - trackDetailsMenu.setMapActivity(null); + if (routeDetailsMenu != null) { + routeDetailsMenu.setMapActivity(null); } } super.onPause(); @@ -376,17 +391,24 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT addRouteCard(cardsContainer, routeSmoothnessCard); } } - trackDetailsMenu = new TrackDetailsMenu(); + routeDetailsMenu = new RouteDetailsMenu(); GpxDisplayItem gpxItem = statisticCard.getGpxItem(); if (gpxItem != null) { - trackDetailsMenu.setGpxItem(gpxItem); + routeDetailsMenu.setGpxItem(gpxItem); } - trackDetailsMenu.setMapActivity(mapActivity); + routeDetailsMenu.setMapActivity(mapActivity); LineChart chart = statisticCard.getChart(); if (chart != null) { chart.setExtraRightOffset(16); chart.setExtraLeftOffset(16); - trackDetailsMenu.refreshChart(chart, true); + } + } + + @Override + protected void calculateLayout(View view, boolean initLayout) { + super.calculateLayout(view, initLayout); + if (!initLayout && getCurrentMenuState() != MenuState.FULL_SCREEN) { + refreshChart(false); } } @@ -1644,12 +1666,13 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT } } - private void refreshChart() { + private void refreshChart(boolean forceFit) { MapActivity mapActivity = getMapActivity(); - if (mapActivity != null && trackDetailsMenu != null && statisticCard != null) { + if (mapActivity != null && routeDetailsMenu != null && statisticCard != null && + !mapActivity.getMyApplication().getRoutingHelper().isFollowingMode()) { LineChart chart = statisticCard.getChart(); if (chart != null) { - trackDetailsMenu.refreshChart(chart, false); + routeDetailsMenu.refreshChart(chart, forceFit); mapActivity.refreshMap(); } } @@ -1670,7 +1693,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT @Override public void onValueSelected(BaseCard card, Entry e, Highlight h) { - refreshChart(); + refreshChart(false); highlightRouteInfoCharts(h); } @@ -1679,6 +1702,23 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT highlightRouteInfoCharts(null); } + @Override + public void onChartGestureStart(BaseCard card, MotionEvent me, ChartGesture lastPerformedGesture) { + } + + @Override + public void onChartGestureEnd(BaseCard card, MotionEvent me, ChartGesture lastPerformedGesture, boolean hasTranslated) { + if ((lastPerformedGesture == ChartGesture.DRAG && hasTranslated) || + lastPerformedGesture == ChartGesture.X_ZOOM || + lastPerformedGesture == ChartGesture.Y_ZOOM || + lastPerformedGesture == ChartGesture.PINCH_ZOOM || + lastPerformedGesture == ChartGesture.DOUBLE_TAP || + lastPerformedGesture == ChartGesture.ROTATE) { + + refreshChart(true); + } + } + public static class CumulativeInfo { public int distance; public int time; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java index aa6193b034..6b73428631 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/CardChartListener.java @@ -1,7 +1,11 @@ package net.osmand.plus.routepreparationmenu.cards; +import android.view.MotionEvent; + import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.listener.ChartTouchListener; +import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture; public interface CardChartListener { /** @@ -17,4 +21,8 @@ public interface CardChartListener { * Called when nothing has been selected or an "un-select" has been made. */ void onNothingSelected(BaseCard card); + + void onChartGestureStart(BaseCard card, MotionEvent me, ChartGesture lastPerformedGesture); + + void onChartGestureEnd(BaseCard card, MotionEvent me, ChartGesture lastPerformedGesture, boolean hasTranslated); } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java index 41c17a15ac..ce7a0a5cc6 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/RouteStatisticCard.java @@ -278,16 +278,21 @@ public class RouteStatisticCard extends BaseCard { }); mChart.setOnChartGestureListener(new OnChartGestureListener() { - + boolean hasTranslated = false; float highlightDrawX = -1; @Override public void onChartGestureStart(MotionEvent me, ChartGesture lastPerformedGesture) { + hasTranslated = false; if (mChart.getHighlighted() != null && mChart.getHighlighted().length > 0) { highlightDrawX = mChart.getHighlighted()[0].getDrawX(); } else { highlightDrawX = -1; } + CardChartListener chartListener = getChartListener(); + if (chartListener != null) { + chartListener.onChartGestureStart(RouteStatisticCard.this, me, lastPerformedGesture); + } } @Override @@ -299,6 +304,10 @@ public class RouteStatisticCard extends BaseCard { } else { gpxItem.chartHighlightPos = -1; } + CardChartListener chartListener = getChartListener(); + if (chartListener != null) { + chartListener.onChartGestureEnd(RouteStatisticCard.this, me, lastPerformedGesture, hasTranslated); + } } @Override @@ -323,6 +332,7 @@ public class RouteStatisticCard extends BaseCard { @Override public void onChartTranslate(MotionEvent me, float dX, float dY) { + hasTranslated = true; if (highlightDrawX != -1) { Highlight h = mChart.getHighlightByTouchPoint(highlightDrawX, 0f); if (h != null) { From cae6cf8b191292b93f06e31a2a60f8a994f3f84f Mon Sep 17 00:00:00 2001 From: crimean Date: Sat, 20 Apr 2019 21:48:32 +0300 Subject: [PATCH 056/114] Fix RP state when route calculates quickly --- .../osmand/plus/routepreparationmenu/MapRouteInfoMenu.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index bd19726243..6f72eacd80 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -91,7 +91,6 @@ import net.osmand.search.core.SearchResult; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; @@ -100,8 +99,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import static net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DRIVING_STYLE; - public class MapRouteInfoMenu implements IRouteInformationListener, CardListener { private static final int BUTTON_ANIMATION_DELAY = 2000; @@ -378,10 +375,10 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } public void routeCalculationStarted() { + setRouteCalculationInProgress(true); WeakReference fragmentRef = findMenuFragment(); MapRouteInfoMenuFragment fragment = fragmentRef != null ? fragmentRef.get() : null; if (fragmentRef != null && fragment.isVisible()) { - setRouteCalculationInProgress(true); fragment.updateRouteCalculationProgress(0); fragment.updateInfo(); } From 744535b7da7e9c130176821eabedc8f1481c02be Mon Sep 17 00:00:00 2001 From: syl Date: Sat, 20 Apr 2019 21:10:09 +0000 Subject: [PATCH 057/114] Translated using Weblate (French) Currently translated at 90.6% (3230 of 3565 strings) --- OsmAnd/res/values-fr/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml index 344f8fb873..ab79bc92b0 100644 --- a/OsmAnd/res/values-fr/phrases.xml +++ b/OsmAnd/res/values-fr/phrases.xml @@ -463,7 +463,7 @@ Magasin de literie Sex shop Herboriste - Magasin d\'ustensiles de cuisine + Magasin de cuisines Papeterie Magasin de vaisselle Guichet de billetterie From e0881f91ed97963252704f40841f50968408f9a8 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Sun, 21 Apr 2019 08:57:10 +0000 Subject: [PATCH 058/114] Translated using Weblate (Basque) Currently translated at 99.7% (2742 of 2750 strings) --- OsmAnd/res/values-eu/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml index d626e0f041..2ef4449ef4 100644 --- a/OsmAnd/res/values-eu/strings.xml +++ b/OsmAnd/res/values-eu/strings.xml @@ -3008,5 +3008,6 @@ Area honi dagokio: %1$s x %2$s Galtzada-harria Galtzadarria Legarra - + + Bidali egunkaria \ No newline at end of file From 0fc6a17020e21d559814a9bd285fac1d65a65cd6 Mon Sep 17 00:00:00 2001 From: jan madsen Date: Fri, 19 Apr 2019 16:14:21 +0000 Subject: [PATCH 059/114] Translated using Weblate (Danish) Currently translated at 99.7% (3556 of 3565 strings) --- OsmAnd/res/values-da/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-da/phrases.xml b/OsmAnd/res/values-da/phrases.xml index 9571042db4..27908f302a 100644 --- a/OsmAnd/res/values-da/phrases.xml +++ b/OsmAnd/res/values-da/phrases.xml @@ -3586,4 +3586,6 @@ Gasafbrænding;flaring Slettet objekt Strålebehandling + Redningsboks + Ja \ No newline at end of file From 7b731deba0e7c2d148b6e99c0558ca6c8be8adcc Mon Sep 17 00:00:00 2001 From: Famlam Date: Sat, 20 Apr 2019 17:11:19 +0000 Subject: [PATCH 060/114] Translated using Weblate (Dutch) Currently translated at 99.6% (2739 of 2750 strings) --- OsmAnd/res/values-nl/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-nl/strings.xml b/OsmAnd/res/values-nl/strings.xml index 04a5ad3a50..03d5b9f002 100644 --- a/OsmAnd/res/values-nl/strings.xml +++ b/OsmAnd/res/values-nl/strings.xml @@ -1307,7 +1307,7 @@ Wil je een nieuwe map maken op de toegestane locatie en de OsmAnd-bestanden daar Blokkeer wegen… Verberg %1$s heeft toestemming nodig om het scherm uit te kunnen schakelen (als onderdeel van de stroombesparende functie). - Beginscherm + Thuis Zoek naar Coördinaten Updates beschikbaar voor %1$s kaart(en) @@ -2920,4 +2920,5 @@ voor Gebied: %1$s x %2$s Guarani Vermijd straatkeien en kasseien Vermijd straatkeien en kasseien + Vermijd trams \ No newline at end of file From c04e377fc5788a80fdadedf02a804cafdb9b0081 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Sat, 20 Apr 2019 11:16:15 +0000 Subject: [PATCH 061/114] Translated using Weblate (Esperanto) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-eo/phrases.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index 5dd34c791c..9b82caaa02 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -147,7 +147,7 @@ Poŝtoficejo Poŝtkesto Lernejo - Infanĝardeno + Infanvartejo Universitato Aŭdhelpil-vendejo Herb-vendejo @@ -3538,7 +3538,7 @@ infanaj Atolo Telekontrolo de vojimposto - Infan-vartejo + Infan/bebo‑vartejo Signifo natura monumento orientiĝa punkto @@ -3571,4 +3571,7 @@ Gasbruliganta turo Forigita objekto per-radiad-kuracado (radioterapio) + Areo de grimpado + Tujhelpilo (ensovaĝe) + jes \ No newline at end of file From 95a886fc10ad5626deb1b21a342efcfe0ba29f35 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Fri, 19 Apr 2019 20:18:07 +0000 Subject: [PATCH 062/114] Translated using Weblate (German) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-de/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 16c218883b..1cc9bede68 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -3581,4 +3581,7 @@ Gasfackel/Fackel Gelöschtes Objekt Strahlentherapie + Kletterfelsen + Rettungskasten + Ja \ No newline at end of file From 7571f49dc903452be332df640e2333ba41472f63 Mon Sep 17 00:00:00 2001 From: Hakuchi Date: Sat, 20 Apr 2019 15:27:07 +0000 Subject: [PATCH 063/114] Translated using Weblate (German) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-de/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 1cc9bede68..459e70c007 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -1902,7 +1902,7 @@ Gebäude Grundhütte Tierschutz - Steinschlagschutz + Felsüberhang Sonnenschutz Feldhütte Unterstand-Typ: Zelt From 755687264adae87e82dfd1157fd31ccc11b1dae5 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Fri, 19 Apr 2019 18:47:45 +0000 Subject: [PATCH 064/114] Translated using Weblate (Polish) Currently translated at 99.9% (3564 of 3565 strings) --- OsmAnd/res/values-pl/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-pl/phrases.xml b/OsmAnd/res/values-pl/phrases.xml index 83f9b3bfc2..c9ba34c133 100644 --- a/OsmAnd/res/values-pl/phrases.xml +++ b/OsmAnd/res/values-pl/phrases.xml @@ -3577,4 +3577,6 @@ 3B 3B* Palnik gazowy + Wspinaczka na skały + Tak \ No newline at end of file From 44e1b27f7f77e506e998415c81dd29952619dc9f Mon Sep 17 00:00:00 2001 From: WaldiS Date: Fri, 19 Apr 2019 18:46:52 +0000 Subject: [PATCH 065/114] Translated using Weblate (Polish) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-pl/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 0755afbd5b..44d50f49a3 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3033,4 +3033,5 @@ Reprezentuje obszar: %1$s x %2$s Unikaj bruku i kostki brukowej Unikanie taksówek zbiorowych Unikanie taksówek zbiorowych + Wyślij dziennik \ No newline at end of file From e45d727b6247aa6731a9ce05bfb7b8e894eca94e Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 20 Apr 2019 07:13:50 +0000 Subject: [PATCH 066/114] Translated using Weblate (Portuguese) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-pt/strings.xml | 331 ++++++++++++++++--------------- 1 file changed, 176 insertions(+), 155 deletions(-) diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index 194e85cd6c..20c6822b21 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -53,7 +53,7 @@ Modo Dia/Noite Gostaria de descarregar {0} ficheiros ({1} MB)\? {0} objetos estão selecionados - Filtrar baixados + Descarregado Marcar tudo Atualizar Configure a exibição e configurações comuns para o app. @@ -64,10 +64,10 @@ Executar o serviço de segundo plano para usar OsmAnd enquanto o ecrã está desligado. Caminho mais rápido Ativar para calcular a rota mais rápida ou desactivar para a rota de poupança de combustível. - Zoom {0}: baixar {1} imagens ({2} MB ) - Baixar mapa - Zoom máximo para baixar - Não é possível fazer o download deste mapa + Zoom {0}: descarregar {1} quadrículas ({2} MB ) + Descarregar mapa + Zoom máximo para decarregar + Não é possível descarregar este mapa Processamento contínuo Mostrar processamento contínuo ao invés de imagem inteira de uma vez. Não foi possível desenhar a área selecionada @@ -168,7 +168,7 @@ Fazer retorno e seguir em frente Continuar - Download de regiões + Descarregar regiões Obrigado por usar OsmAnd. Descarrege dados regionais para a utilização offline através de \'Configrações\' → \'Gerir ficheiros de mapas\' para visualizar mapas, localizar endereços, procurar POIs, encontrar transportes públicos e muito mais. Aguardando o sinal… Procurar perto do atual centro do mapa @@ -220,23 +220,23 @@ Offline Internet Nível de zoom máx - Escolher um nível máximo de zoom para download - Distância total = %1$s \n tempo de viagem, = %2$dh %3$dm. - Escolha o sistema de navegação + Não navegar em quadrículas de mapa online para níveis de zoom além deste. + Distância total %1$s, tempo de viagem %2$d h %3$d min. + Escolha um serviço de navegação online ou offline. Serviço de navegação - Diretório do cartão SD inacessível - Quer fazer o download {0} - {1} ? - Dados para {0} já existem ({1}). Você quer fazer atualizá-los ({2}) ? + A pasta de armazenamento de dados no cartão de memória não está acessível! + Quer descarregar {0} - {1} \? + Já existem dados offline para {0} ({1}). Actualizá-los ({2})\? Endereço Descarregado - Baixando lista de regiões disponíveis… + Descarregando lista de regiões disponíveis… Não foi possível obter uma lista de regiões em https://osmand.net. Nada foi encontrado. Se não conseguir encontrar a sua região, pode fazê-lo você mesmo (ver https://osmand.net). O favorito foi modificado - Não existe nenhum favorito + Não existe nenhum Favorito Modificar Exibir rota - Iniciar navegação + Iniciar orientação Meio de transporte: Por favor, primeiro selecione um destino Navegação @@ -248,31 +248,31 @@ Carregando Ponto de Interesse… Falha na autorização Falha - Convertendo nomes em inglês… + Convertendo nomes locais/ingleses… Carregando ruas/prédios… Carregando códigos postais… Carregando ruas… Carregando cidades… POI - Erro ao gravar GPX - Erro de calculando a rota - Ocorreu um erro ao calcular a rota - Trajeto calculado vazio + Não foi possível gravar o ficheiro GPX + Não foi possível calcular a rota + Não foi possível calcular a rota + A rota calculada está vazia Nova rota calculada, distância Você alcançou o seu destino - Locais inválidos! + Coordenadas inválidas Voltar ao mapa do OsmAnd Fechar Carregando dados… Lendo dados locais… Uma execução anterior da aplicação foi interrompida inesperadamente. O ficheiro de log encontra-se em {0}. Por favor, informe o problema e inclua o ficheiro de log. - Salvando trilhas GPX no cartão SD… + Gravando o ficheiro GPX… Concluído - Utilizar Internet para calcular a rota + Utilize a Internet para calcular uma rota. Utilizar navegação online Sua palavra-passe OSM - Definir os parâmetros de conexão OpenStreetMap - Definir o idioma, atualizar os dados + Especifique as configurações de OpenStreetMap.org (OSM) necessárias para envios OSM. + Especifique o idioma, descargar/enviar dados. Dados OSM O nível de Zoom de acordo com a sua velocidade (enquanto o mapa é sincronizado com a posição atual). @@ -293,26 +293,26 @@ Nome do usuário Destino Adicionar aos \'Favoritos\' - Escolher entre os nomes nativos e inglês - Utilizar nomes em inglês - Configurações da aplicação + Escolher entre os nomes nativos e inglês. + Usar nomes em inglês + Configurações do aplicativo Pesquisar endereço Escolher edifício Escolher rua - Escolher cidade + Escolha a cidade ou o código postal Escolher país Mostrar ângulo de visão - Ativar a visualização em 3D do mapa + Ativar a visualização em 3D do mapa. Visualização em 3D Mostrar a camada superior últimamente selecionada de POI no mapa. Mostrar camada superior de POI - Escolha a fonte de imagens de mapa online ou offline + Escolha a fonte de imagens de mapa online ou offline. Fonte de imagens Origem do mapa - Utilizar Internet - Ver localização + Usar a Internet + Mostrar a sua posição Mostrar as coordenadas GPS no mapa - Use a Internet para baixar as imagens que faltam + Descarregar os blocos de mapas que faltam Aplicação de navegação Sair Pesquisar @@ -326,9 +326,9 @@ Escolher a rua transversal Locais mais próximos Explorar mapa - Carro - Bicicleta - Pedestre + Condução + Ciclismo + Caminhando Centro Embaixo Insira a latitude e longitude no formato selecionado (D - graus, M - minutos, S - segundos) @@ -349,13 +349,13 @@ Aplicar Adicionar Não - Digite o nome do favorito + Digite o nome do Favorito Favorito - O ponto \'\'{0}\'\' foi adicionado aos favoritos. - Modificar favorito - Apagar favorito - Você quer mesmo apagar este favorito \'%s\'? - Ponto favorito {0} apagado com sucesso. + Ponto Favorito \"{0}\" adicionado. + Modificar Favorito + Apagar Favorito + Apagar ponto favorito \'%s\'\? + Ponto favorito {0} apagado. Mensagem Autor Comentário adicionado @@ -363,14 +363,14 @@ Editar POI Criar POI Nó não pode ser encontrado ou POI não é um único nó - Você quer mesmo apagar {0} (comentário)? + Apagar {0} (comentário)\? Apagar o POI Apagar - POI apagado com sucesso + POI apagado Adicionar Modificar - Ação {0} bem-sucedida. - Ocorreu um erro inesperado durante a execução de ação {0}. + Ação {0} sucedida. + Não foi possível executar a acção {0}. Erro de entrada/saída na execução da acção {0}. As informações sobre o objeto não foram carregadas Aberto @@ -400,26 +400,29 @@ O mapa-base está selecionado para descarregar para que o aplicativo funcione. Quadrículas de mapa on-line e em cache Mapas de padrão (vector) - Activar plugin de \'mapas on-line\' para seleccionar diferentes fontes de mapas + Activar complemento de \'mapas on-line\' para seleccionar diferentes fontes de mapas Mapas On-line e Mosaicos Use mapas online (decarregar e cache tiles no cartão de memória). Mapas On-line Configurar fontes de mosaicos ou de mapas on-line. - "Com este plugin, pode ter acesso a muitos tipos de mapas on-line (também chamada de quadrícula ou ladrilho), de quadrículas pré-definidas do OpenStreetMap (como Mapnik) para imagens de satélite e camadas especiais, como mapas aquáticos, climáticos, geológicos, camadas de sombra de relevo, etc.\n\nQuaisquer desses mapas podem ser usados como mapa principal (base) para ser mostrado no OsmAnd, ou como uma sobreposição, ou sub-camada para outro mapa base (como o mapa off-line normal de OsmAnd). Para fazer qualquer sub-camada do mapa mais visível, certos elementos do mapa vetorial do OsmAnd podem facilmente ser ocultados através do menu \'Configurar mapa\'. -\n\nQuadrículas de mapas podem ser obtidas diretamente através de fontes on-line ou podem ser preparados para uso off-line (e copiadas manualmente para o diretório de dados do OsmAnd) como um banco de dados sqlite, que pode ser produzido por uma variedade de ferramentas de terceiros para preparação de mapas. " + Com este complemento, pode ter acesso a muitos tipos de mapas on-line (também chamada de quadrícula ou ladrilho), de quadrículas pré-definidas do OpenStreetMap (como Mapnik) para imagens de satélite e camadas especiais, como mapas aquáticos, climáticos, geológicos, camadas de sombra de relevo, etc. +\n +\nQuaisquer desses mapas podem ser usados como mapa principal (base) para ser mostrado no OsmAnd, ou como uma sobreposição, ou sub-camada para outro mapa base (como o mapa off-line normal de OsmAnd). Para fazer qualquer sub-camada do mapa mais visível, certos elementos do mapa vetorial do OsmAnd podem facilmente ser ocultados através do menu \'Configurar mapa\'. +\n +\nQuadrículas de mapas podem ser obtidas diretamente através de fontes on-line ou podem ser preparados para uso off-line (e copiadas manualmente para o diretório de dados do OsmAnd) como um banco de dados sqlite, que pode ser produzido por uma variedade de ferramentas de terceiros para preparação de mapas. Mostra as configurações para ativar o rastreamento em segundo plano e a navegação, despertando periodicamente o aparelho GPS (com o ecrã desligado). - Este plugin torna os recursos de acessibilidade do aparelho disponíveis diretamente no OsmAnd. Ele facilita, p. ex., o ajuste da velocidade de fala para vozes TTS, configurando a navegação no ecrã do teclado direcional, usando um trackball para controle de zoom, ou feedback texto-para-fala, por exemplo, para anunciar automaticamente a sua posição. - Este plugin exibe configurações para recursos de desenvolvimento e depuração como testar ou simular roteamento, o desempenho de renderização do ecrã ou solicitação de voz. Essas configurações são destinadas a desenvolvedores e não são necessárias para o usuário geral. - Gerenciar plugins - Plugins activam as configurações avançadas e funcionalidades adicionais. - Gerenciar plugins + Este complemento torna os recursos de acessibilidade do aparelho disponíveis diretamente no OsmAnd. Ele facilita, p. ex., o ajuste da velocidade de fala para vozes TTS, configurando a navegação no ecrã do teclado direcional, usando um trackball para controle de zoom, ou feedback texto-para-fala, por exemplo, para anunciar automaticamente a sua posição. + Este complemento exibe configurações para recursos de desenvolvimento e depuração como testar ou simular roteamento, o desempenho de renderização do ecrã ou solicitação de voz. Essas configurações são destinadas a desenvolvedores e não são necessárias para o usuário geral. + Complementos + Complementos activam as configurações avançadas e funcionalidades adicionais. + Complementos Este complemento do OsmAnd pode ser usado para fazer contribuições ao OSM como criar ou modificar POI, abertura ou comentários de erros do OSM e contribuir com ficheiros GPX gravados. OSM é um projeto de mapeamento mundial dirigido pela comunidade e de domínio público. Para mais detalhes, consulte https://openstreetmap.org. Participação ativa é apreciada e as contribuições podem ser feitas diretamente do OsmAnd, se você especificar suas credenciais pessoais de OSM no app. Mapas vectoriais são visualizados mais rápido. Podem não funcionar bem em alguns aparelhos. Selecione uma voz e teste reproduzindo os avisos Desenvolvimento OsmAnd Renderização nativa Testar comandos de voz - "Nenhum mapa vetorial presente para este local. Você pode baixar um em Configurações (\'Gerenciar ficheiros de mapas\') ou mudar para mapas online (activar mapas on-line do plugin para isso)." + Nenhum mapa vetorial presente para este local. Você pode descarregar um em Configurações (\'Gerenciar ficheiros de mapas\') ou mudar para o complemento \"mapas online\". Enviar ficheiros GPX para o OSM\? Visibilidade Etiquetas @@ -457,7 +460,7 @@ Noroeste norte-noroeste avançar - Frente à direita + frente à direita para a direita Trás direita Atrás @@ -595,7 +598,7 @@ Gerir ficheiros de mapas. Activar Desactivar - Download + Descarregamento Dados POI Dados de Endereço Dados de transporte público @@ -674,7 +677,7 @@ Local de armazenamento Todos os dados offline no aplicativo antigo instalado serão suportados pelo novo aplicativo, mas os pontos Favoritos devem ser exportados do aplicativo antigo e depois importados no novo aplicativo. Build {0} foi instalado ({1}). - Baixando construção… + Descarregando construção… Instalar OsmAnd - {0} de {1} {2} MB \? A busca da lista de OsmAnd builds falhou Carregando OsmAnd builds… @@ -716,7 +719,7 @@ PM AM Local de estacionamento - Este plugin grava onde o seu carro foi estacionado e quanto tempo de estacionamento resta (se houver um limite de tempo). + Este complemento grava onde o seu carro foi estacionado e quanto tempo de estacionamento resta (se houver um limite de tempo). \nA localização e o tempo ficam visíveis no painel de controle do OsmAnd e em um widget no ecrã do mapa. Um alarme pode ser adicionado ao calendário Android como lembrete. Local de estacionamento Marcar como local de estacionamento @@ -791,32 +794,32 @@ GPS intervalo de despertar: %s Contínuo e-mail - "OsmAnd (Direções OSM automatizadas de navegação) é uma aplicação de navegação livre, com acesso a uma ampla variedade de dados OpenStreetMap (OSM) globais. Todos os dados de mapas (mapas vectoriais ou imagens) podem ser armazenados no cartão de memória do telefone para uso off-line. OsmAnd também oferece roteamento off-line e on-line, incluindo a funcionalidade de roteamento curva-a-curva com orientação por voz. + OsmAnd (Direções OSM automatizadas de navegação) +\n +\nOsmAnd é uma aplicação de navegação livre, com acesso a uma ampla variedade de dados OpenStreetMap (OSM) globais. Todos os dados de mapas (mapas vectoriais ou imagens) podem ser armazenados no cartão de memória do telefone para uso off-line. OsmAnd também oferece roteamento off-line e on-line, incluindo a funcionalidade de roteamento curva-a-curva com orientação por voz. \n \nAlgumas das características principais: -\n- Completa funcionalidade offline (guarda os mapas obtidos, sejam eles vectoriais ou imagens, numa pasta seleccionável) +\n- Funcionalidade offline completa (guarda os mapas obtidos, sejam eles vectoriais ou imagens, numa pasta seleccionável) \n- Mapas vectoriais compactados disponíveis para o mundo inteiro -\n -\n- Faça o download de mapas de países ou regiões directamente no aplicativo -\n- Sobreposição de camadas de mapas diversos, como GPX ou trilhas de navegação, Pontos de Interesse (POI), Favoritos, Curvas de nível, paragens de transportes públicos, mapas adicionais com transparência personalizável +\n- Descarregamento de mapas de países ou regiões directamente no aplicativo +\n- Sobreposição de mapas diversos, como GPX ou trajectos de navegação, Pontos de Interesse (POI), Favoritos, Curvas de nível, paragens de transportes públicos, mapas adicionais com transparência personalizável \n- Pesquisa off-line para endereços e locais (POIs) -\n- Encaminhamento off-line para distâncias curtas (experimental) -\n- Modo de Carro, Bicicleta, e Pedestre -\n- Vista de dia/noite, com comutação automática (opcional) -\n- Zoom de mapa em função da velocidade (opcional) -\n- Alinhamento de mapa de acordo com bússola ou direção do movimento (opcional) -\n- Orientação de vias, aviso de limite de velocidade, vozes gravadas e TTS (opcional) -\n +\n- Encaminhamento off-line para distâncias médias +\n- Modo de Carro, Bicicleta, e Pedestre +\n- Vista de dia/noite, com comutação automática (opcional) +\n- Zoom de mapa em dependente da velocidade +\n- Alinhamento de mapa de acordo com bússola ou direção do movimento +\n- Orientação de faixas, aviso de limite de velocidade, vozes gravadas e TTS +\n \nLimitações desta versão gratuita de OsmAnd: -\n- Número de downloads de mapa limitado -\n- Sem acesso a POIs Wikipedia off-line. -\n -\n -\nOsmAnd está a em desenvolvimento activo, mas o nosso projecto e o seu progresso ainda depende de contribuições financeiras para financiar o desenvolvimento e testes de novas funcionalidades. Por favor, considere a compra de OsmAnd+, ou ajude a financiar novas funcionalidades específicas ou através duma doação no osmand.net. " +\n- Quantidade de descarregamentos de mapa limitado +\n- Sem acesso aos POIs Wikipedia off-line. +\n +\nOsmAnd está a em desenvolvimento activo, mas o nosso projecto e o seu progresso ainda depende de contribuições financeiras para o desenvolvimento e testes de novas funcionalidades. Por favor, considere a compra de OsmAnd+ ou ajude a financiar novas funcionalidades específicas ou através duma doação no osmand.net. Selecione um esquema de cores de estrada: Esquema de cores Ver direção para o destino - Ativar plugin de \"gravação de viagem\" para usar serviços de registro de posição (registro GPX, rastreamento on-line) + Ativar complemento de \"gravação de viagem\" para usar serviços de registro de posição (registro GPX, rastreamento on-line) Calcular rota possivelmente não-ideal em longas distâncias Ative o GPS nas configurações Serviços de registro @@ -856,7 +859,7 @@ O serviço de segundo plano OsmAnd ainda está em execução. Tambẽm pará-lo\? Fechar conjunto de alterações "Pesquisa mais povoações / código postal" - O plugin Dropbox permite sincronizar trilhos e anotações de vídeo/audio com a sua conta Dropbox. + O complemento Dropbox permite sincronizar trilhos e anotações de vídeo/audio com a sua conta Dropbox. Gravar vídeo Gravar audio Selecione a ação de widget padrão. @@ -890,10 +893,10 @@ Calcule rotas precisas sem falhas. Ainda com distância limitada e lenta. Roteamento preciso (alfa) Tire uma foto - Plugin Dropbox + Complemento Dropbox Alterar ordem - Por favor, considere comprar o plugin \'Curvas de Nível\' (Contour Lines) na loja do Market para apoiar o desenvolvimento. - Plugin curvas de nível + Por favor, considere comprar o complemento \'Curvas de Nível\' (Contour Lines) para apoiar o desenvolvimento. + Complemento curvas de nível Selecionar na altura Selecione o formato de saída de vídeo. Usar gravador do sistema para vídeo. @@ -906,23 +909,23 @@ Parar Iniciar Anotações de Áudio/vídeo - Plugin OsmAnd para curvas de nível off-line + Complemento OsmAnd para curvas de nível off-line Medição da distância Local para associar com a anotação ainda não está definido. \"Usar posição…\" para atribuir uma anotação para o local especificado. Anotações de áudio - O plugin de anotações de áudio/vídeo fornece a funcionalidade para tomar notas de áudio/fotografia/vídeo durante uma viagem, usando um botão no ecrã do mapa ou diretamente do menu de contexto para qualquer posição no mapa. + O complemento de anotações de áudio/vídeo fornece a funcionalidade para tomar notas de áudio/fotografia/vídeo durante uma viagem, usando um botão no ecrã do mapa ou diretamente do menu de contexto para qualquer posição no mapa. Anotações de audio/vídeo Partes Curvas de nível Foto %1$s de %2$s Capture uma foto - Este plugin disponibiliza \'Curvas de Nível\' e \'Sombreamento de relevo\', que podem ser aplicadas nos mapas standard do OsmAnd. -\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. -\n + Este complemento disponibiliza \'Curvas de Nível\' e \'Sombreamento de relevo\', que podem ser aplicadas nos mapas standard do OsmAnd. +\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. +\n \nOs dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). - Este plugin disponibiliza \'Curvas de Nível\' e \'Sombreamento de relevo\', que podem ser aplicadas nos mapas standard do OsmAnd. -\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. -\n + Este complemento disponibiliza \'Curvas de Nível\' e \'Sombreamento de relevo\', que podem ser aplicadas nos mapas standard do OsmAnd. +\nEstas funcionalidades podem ser apreciadas por atletas, caminhantes, e qualquer pessoa interessada na informação de relevo de uma paisagem. +\n \nOs dados globais (entre as latitudes 70° norte e 70° sul) são baseados nas medições do SRTM (Shuttle Radar Topography Mission) e do ASTER (Advanced Spaceborn Thermal Emission and Reflection Radiometer), um instrumento de imagens no \'Terra\', o satélite principal do Sistema de Observação da Terra da NASA. O ASTER é um esforço conjunto da NASA, do Ministério da Economia, Comércio e Indústria do Japão e do Sistema Espacial Japonês (J-spacesystems). Curvas de Nível Outros mapas @@ -948,7 +951,7 @@ Outras acções Camada de sombreamentos de relevo Informação de GPS - Não conectado ao Wi-Fi. Use a conexão atual com a Internet para fazer o download\? + Não conetado ao Wi-Fi. Use a conexão atual com a Internet para descarregar\? Configure como gravar suas viagens. Apagar local de destino Sombras de Colinas @@ -969,7 +972,7 @@ Nome do ficheiro GPX Ficheiro GPX gravado para {0} Calculadora de Distância e Ferramenta de Planeamento - Este plugin fornece um widget no ecrã do mapa que permite criar caminhos ao tocar no mapa, ou usar/modificar ficheiros GPX existentes, para planear uma viagem e medir a distância entre os pontos. Os resultados podem ser guardados como um ficheiro GPX, que pode ser usado posteriormente para orientação. + Este complemento fornece um widget no ecrã do mapa que permite criar caminhos ao tocar no mapa, ou usar/modificar ficheiros GPX existentes, para planear uma viagem e medir a distância entre os pontos. Os resultados podem ser guardados como um ficheiro GPX, que pode ser usado posteriormente para orientação. Seleccione a região de condução: EUA, Europa, Reino Unido, Ásia e outros. Região de condução Japão @@ -1019,10 +1022,10 @@ GPX Mapas OsmAnd & Navegação Mapas OsmAnd+ & Navegação - Baixando + Descarregando Password do OSM (opcional) Tipo de foco da câmera - Selecione o tipo de foco da câmera interna + Selecione o tipo de foco da câmera interna. Auto foco Foco hiperfocal Profundidade de visão estendida @@ -1030,7 +1033,7 @@ Foco Macro (close-up) A câmera tenta focalizar continuamente Emita som ao tirar foto - Escolha se emitir som quando tirar fotos + Escolha se pretende reproduzir um som ao tirar fotografias. Canadá Versão: Sobre @@ -1052,7 +1055,12 @@ Depuração FPS Lupa do mapa Mapa mundial - "→ → Osmand+ (OSM automatizados direções de navegação) ↵ ↵ → → OsmAnd+ é uma aplicação de navegação de código aberto, com acesso a uma ampla variedade de dados globais OpenStreetMap (OSM). Todos os dados cartográficos (mapas vectoriais ou de imagem) podem ser armazenados no cartão de memória do telefone para uso off-line. OsmAnd também oferece funcionalidade de roteamento off-line e on-line , incluindo orientação por voz curva-a-curva. ↵ ↵ → → OsmAnd + é a versão do aplicativo pago, ao comprá-lo você apoia o projecto, financia o desenvolvimento de novas funcionalidades, e recebe as últimas actualizações. ↵ ↵ → → Algumas das características principais: ↵ → → - funcionalidade off-line completa ( armazenar mapas vectoriais obtidos ou imagens numa pasta seleccionável) ↵ → → - mapas vectoriais compactos off-line disponíveis para todo o mundo ↵ → → - Download ilimitado de mapas de países ou regiões diretamente no aplicativo ↵ → → - Funcionalidade Wikipedia off-line (obter POIs Wikipedia) , ótimo para passeios ↵ → → - Sobreposição de várias camadas de mapas possíveis , como GPX ou trilhas de navegação, pontos de interesse, favoritos, curvas de nível, paragens de transportes públicos, mapas adicionais com transparência personalizável ↵ → → - Busca off-line de endereços e locais ( POIs) ↵ → → - Encaminhamento Off-line para distâncias curtas (experimental) ↵ → → - Modos de Carro, Bicicleta, e Pedestre↵ → → - Vista de mapa em modo dia / noite, com comutação automatizada (opcional)↵ → → - Zoom de mapa em função da velocidade (opcional)↵ → → - Alinhamento de mapa de acordo com a bússola ou direcção do movimento (opcional)↵ → → - Indicação de vias, aviso de limite de velocidade, vozes gravadas e TTS (opcional) " + Osmand+ (OSM automatizados direções de navegação) +\n +\n OsmAnd+ é uma aplicação de navegação de código aberto, com acesso a uma ampla variedade de dados globais OpenStreetMap (OSM). Todos os dados cartográficos (mapas vectoriais ou de imagem) podem ser armazenados no cartão de memória do telefone para uso off-line. OsmAnd também oferece funcionalidade de roteamento off-line e on-line , incluindo orientação por voz curva-a-curva. +\n +\n OsmAnd + é a versão do aplicativo pago, ao comprá-lo você apoia o projecto, financia o desenvolvimento de novas funcionalidades, e recebe as últimas actualizações. ↵ ↵ → → Algumas das características principais: ↵ → → - funcionalidade off-line completa ( armazenar mapas vectoriais obtidos ou imagens numa pasta seleccionável) ↵ → → - mapas vectoriais compactos off-line disponíveis para todo o mundo ↵ → → - Descarregamentos ilimitados de mapas de países ou regiões diretamente no aplicativo ↵ → → - Funcionalidade Wikipedia off-line (obter POIs Wikipedia) , ótimo para passeios ↵ → → - Sobreposição de várias camadas de mapas possíveis , como GPX ou trilhas de navegação, pontos de interesse, favoritos, curvas de nível, paragens de transportes públicos, mapas adicionais com transparência personalizável ↵ → → - Busca off-line de endereços e locais ( POIs) ↵ → → - Encaminhamento Off-line para distâncias curtas (experimental) ↵ → → - Modos de Carro, Bicicleta, e Pedestre↵ → → - Vista de mapa em modo dia / noite, com comutação automatizada (opcional)↵ → → - Zoom de mapa em função da velocidade (opcional)↵ → → - Alinhamento de mapa de acordo com a bússola ou direcção do movimento (opcional)↵ → → - Indicação de vias, aviso de limite de velocidade, vozes gravadas e TTS (opcional) +\n Sem zoom automático Aproximar Visão intermédia @@ -1123,9 +1131,9 @@ Evitar auto-estradas Peso máximo Especifique o limite de peso permitido para veículos em rotas. - Desde a versão KitKat você não pode fazer o download e actualização de mapa no local de armazenamento anterior (%s). Você deseja alterar para um local com permissão e copiar todos os ficheiros para lá\?          -\n Nota: Os ficheiros antigos permanecerão intocados.          -\n Nota: não será possível compartilhar ficheiros entre OsmAnd e OsmAnd + . + Desde a versão KitKat você não pode descarregar e atualizar de mapa no local de armazenamento anterior (%s). Você deseja alterar para um local com permissão e copiar todos os ficheiros para lá\?          +\n Nota 1: os ficheiros antigos permanecerão intocados (mas podem ser apagados manualmente). +\n Nota 2: não será possível compartilhar ficheiros entre OsmAnd e OsmAnd+ no novo armazenamento. Copiando o ficheiro (%s) para novo destino … Cópia de ficheiros Osmand para o novo destino (%s)… Copiando ficheiros Osmand… @@ -1245,7 +1253,7 @@ Posição geral de log para um ficheiro GPX pode ser ativada ou desativado usando o GPX gravação widget no ecrã do mapa. Intervalo de log Rotas de ônibus, trólebus - Este plugin ativa a funcionalidade para gravar e salvar os seus trajetos manualmente, tocando o widget de gravação GPX no ecrã do mapa, ou também fazendo automaticamente o registro de todas as suas rotas de navegação para um ficheiro GPX. + Este complemento ativa a funcionalidade para gravar e salvar os seus trajetos manualmente, tocando o widget de gravação GPX no ecrã do mapa, ou também fazendo automaticamente o registro de todas as suas rotas de navegação para um ficheiro GPX. \n \nTrajetos gravados podem ser compartilhadas com os seus amigos, ou serem usados para contribuições ao OSM. Atletas podem usar trajetos gravados para controlar os seus treinos. Algumas análises básicas do trajeto podem ser feitas diretamente no OsmAnd, como tempos de volta, velocidade média, etc. E, claro, trajetos também podem ser analisados mais tarde em ferramentas de terceiros. Gravação de viagem @@ -1271,15 +1279,15 @@ Evitar regras de roteamento da v1.9 REMOVA A TAG Não use as regras de roteamento introduzidas na v1.9. - Baixar mapas offline\? + Descarregar mapas offline\? Você baixou %1$s mapas Baixe um novo mapa Idioma do mapa Zona - Todos os Downloads + Todos os descarregamentos Atualizações Local - Não é possível baixar, por favor, verifique sua conexão com a internet. + Não é possível descarregar, por favor, verifique sua conexão com a internet. Todos os ficheiros foram atualizados Use o renderizador OpenGL Início @@ -1299,7 +1307,7 @@ Rotas Detalhes Elementos restantes - Você precisa de uma conexão com a internet para instalar este plugin. + Você precisa estar conectado à Internet para instalar este complemento. Para refletir corretamente seus sinais e regras de trânsito, por favor, selecione a região que você dirige: Números da casa Copiar os ficheiros de dados OsmAnd para o novo destino\? @@ -1322,9 +1330,9 @@ Pesquisar Mostrar descrição. Mensagem - A-GPS últimos dados baixados: %1$s + A-GPS últimos dados descarregados: %1$s Em diversos países (Alemanha, França, Itália, etc.) o uso de alertas de radar é proibido por lei. OsmAnd não assume qualquer responsabilidade se você violar a lei. Por favor, toque em \"sim\" somente se você pode aceitar o uso deste recurso. - Baixar mapas + Descarregar mapas Preparando pista dias atrás Ver @@ -1334,7 +1342,7 @@ Ir Configurações de navegação "Configurações gerais " - Baixar compilações noturnas. + Descarregar compilações noturnas. Especifique um servidor proxy. Gerenciador Transporte @@ -1404,8 +1412,8 @@ Pistas de esqui Livre %1$s Memória do aparelho - Para exibir mapas de esqui, o mapa offline especial precisa ser baixado - Para exibir mapas náuticos, o mapa offline especial precisa ser baixado + Para exibir mapas de esqui, o mapa offline especial precisa ser descarregado + Para exibir mapas náuticos, o mapa offline especial precisa ser descarregado Editar grupo Vaga de estacionamento Compilações @@ -1524,7 +1532,7 @@ Procurar endereço Ficheiro GPX com anotações de posições. Localizações - Plugins + Complementos Evitar de transporte de comboio Evitar usar transporte de comboio Perigo @@ -1565,10 +1573,10 @@ Há uma nova opção para controlar principalmente o aplicativo através do painel flexível (Dashboard) ou um menu estático. A sua escolha pode sempre ser alterada nas configurações do painel. Dashboard ou menu de controle Actualizar em cada - Apenas download com WiFi + Apenas descarregar com Wi-Fi Actualização sincronizada Actualizar agora - App não tem permissão para usar o cartão SD + OsmAnd não tem permissão para usar o cartão de memória Última atualização: %s Horário de actualização Última alteração de mapa: %s @@ -1595,7 +1603,17 @@ Cor pelo símbolo de caminhada de OSMC Sair Vai apagar %1$d anotação/anotações. Continuar\? - "Esta opção muda o estilo de mapa do Osmand para a \"visão Touring \', uma visão especial de alto detalhe, para viajantes e motoristas profissionais.\n\nEsta exibição fornece, em qualquer zoom de mapa, a quantidade máxima de informação de viagem disponível no mapa (particularmente estradas, trilhas, caminhos, e marcas de orientação).\n\nTambém separa claramente todos os tipos de estradas de forma inequívoca com um código de cores, que se revela útil para a condução de veículos grandes (por exemplo).\n\nOferece opções especiais de turismo, como mostrar ciclovias ou rotas alpinas de montanha.\n\nNão é necessário fazer download dum mapa especial, a exibição é feita a partir dos mapas padrão.\n\nEssa visão pode ser revertida, basta desactiva-la, ou alterar o estilo de mapa em \'Configurar mapa\'. " + Esta opção muda o estilo de mapa do Osmand para a \"visão Touring \', uma visão especial de alto detalhe, para viajantes e motoristas profissionais. +\n +\nEsta exibição fornece, em qualquer zoom de mapa, a quantidade máxima de informação de viagem disponível no mapa (particularmente estradas, trilhas, caminhos, e marcas de orientação). +\n +\nTambém separa claramente todos os tipos de estradas de forma inequívoca com um código de cores, que se revela útil para a condução de veículos grandes (por exemplo). +\n +\nOferece opções especiais de turismo, como mostrar ciclovias ou rotas alpinas de montanha. +\n +\nNão é necessário descarregar um mapa especial, a exibição é feita a partir dos mapas padrão. +\n +\nEssa visão pode ser revertida, basta desactiva-la, ou alterar o estilo de mapa em \'Configurar mapa\'. Estilo de estrada Nenhum desvio encontrado Ligar o ecrã do aparelho (se estiver desligado) ao aproximar a uma curva. @@ -1671,25 +1689,25 @@ Quer mesmo gravar POI sem o tipo de POI? Versões Comentários - Contactar-nos + Contato Legenda do mapa Artigos técnicos Perguntas mais frequentes Vista de mapa - Busca no mapa + Pesquisar no mapa Instalação e resolução de problemas FAQ Primeira utilização - Como descarregar mapas, definir configurações básicas - Configuração da navegação + Como descarregar mapas, definir configurações básicas. + Configuração da navegação. Planear uma viagem Complementos Funcionalidades - Ajude-nos a melhorar OsmAnd + Ajudar a melhorar OsmAnd Inserir nome do país Nova versão Primeiros passos com OsmAnd - Escolha onde quer guardar os ficheiros de mapas. + Escolha onde pretende guardar os ficheiros de mapas e de outros dados. Outros Ativar a navegação para mudanças do OsmAnd Live. Navegação OsmAnd Live @@ -1697,7 +1715,7 @@ Rumo magnético Período do anúncio automático Lista ramificada - Mostra os carregamentos gratuitos utilizados + Exibe a quantidade de descarregamentos gratuitos restantes. Anúncio automático inteligente Custo mensal Pagamento mensal @@ -1767,10 +1785,10 @@ Esperanto Descargas gratuitas utilizados Descargas - Tem a certeza que quer descarregar o mapa só de estradas, embora já tenha o mapa padrão (completo)? + O mapa só de estradas não é necessário, desde que tem o mapa padrão (completo). Descarregar na mesma\? Versão completa Mais tarde - COMPRAR + Comprar A descarregar - %1$d ficheiros Mostrar propaganda da versão gratuita Falta descarregar %1$s @@ -1903,11 +1921,11 @@ Ordenar por distância Favoritos de pesquisa Para observar relief sombreamento de relevo no mapa, precisa de descarregar o mapa de sobreposições de sombreamento de relevo desta região. - Para ver relief sobreamento de relevo no mapa, precisa de comprar e instalar o plugin \'Contour Lines\' + Para ver relief sobreamento de relevo no mapa, precisa de comprar e instalar o complemento \'Contour Lines\' Esconder do nível de zoom Descarregue o mapa de \'linha de contorno\' para esta região. - Plugin - Para ver as linhas de contorno no mapa, precisa de comprar e instalar o plugin de \'Linhas de Contorno\' + Complemento + Para ver as linhas de contorno no mapa, precisa de comprar e instalar o complemento de \'Linhas de Contorno\' Esquema de cores Mostrar a partir do nível de zoom Permitir acesso privado @@ -1937,7 +1955,7 @@ Tocando no botão de ação irá adicionar um destino ao localização do centro do ecrã. Destinos definidos anteriormente tornam-se o último ponto intermediário. Tocando neste botão de ação torna o centro do ecrã o novo destino de rota, substituindo o destino selecionado anteriormente (se houver). Tocando neste botão de ação torna o centro do ecrã o primeiro destino intermediário. - Sem camada superior + Sem sobreposição Sem subposição Erro Subscreva à nossa lista de e-mail sobre descontos da aplicação e ganhe 3 mapas adicionais! @@ -2073,7 +2091,7 @@ Comprar por %1$s Comprar por %1$s mês Obter descarregamentos ilimitados de mapas e atualizações de mapas mais do que uma vez por mês: semanal, diário, ou a cada hora. - Descarregamentos ilimitados de mapas, atualizações, e plugin Wikipedia. + Descarregamentos ilimitados de mapas, atualizações e complemento Wikipedia. Milhas/metros À procura de mapas… Deixe OsmAnd determinar a sua localização e sugerir mapas para descarregar para essa região. @@ -2118,7 +2136,7 @@ Você adicionou %1$s pontos. Digite um nome de ficheiro e toque em \"Gravar\". Por favor envie um screenshot da notificação para support@osmand.net Editar ações - Obter OsmAnd Live para desbloquear todos as funcionalidades: atualizações de mapas diários com downloads ilimitados, todos os plugins pagos e gratuitos, wikipedia, Wikivoyage e muito mais. + Obter OsmAnd Live para desbloquear todos as funcionalidades: atualizações de mapas diários com descarregamentos ilimitados, todos os complementos pagos e gratuitos, wikipedia, Wikivoyage e muito mais. A modificação do estilo padrão para aumentar o contraste de caminhos para pedestres e bicicletas. Usa codes do Mapnik legado. Marcador Esconder descrição completa @@ -2195,12 +2213,12 @@ Mostrar imagens Você cancelou sua assinatura do OsmAnd Live Renovar assinatura para continuar a utilizar todas as funcionalidades: - Com base nos artigos que você marcou, os mapas seguintes são recomendados para você fazer o download: + Com base nos artigos que você marcou, os mapas seguintes são recomendados para você descarregar: Mapas que você precisa Equipe do OsmAnd Destinos populares Aplicativo pago - Plugin pago + Complemento pago Há novos dados disponíveis da Wikivoyage, atualize-os para desfrutar. Descarregue guias de viagem da Wikivoyage para ver artigos sobre lugares ao redor do mundo sem uma conexão com a Internet. Atualização disponível @@ -2223,7 +2241,7 @@ Comprar - %1$s Assinar - %1$s Wikivoyage offline - Downloads ilimitados + Descarregamentos ilimitados A Wikipédia offline Linhas de contorno e mapas de sombreamento de relevo Desbloquear todas as características de OsmAnd @@ -2453,8 +2471,8 @@ \nUm complemento de mapa especial para OsmAnd fornecerá todas as marcas de navegação náutica e símbolos cartográficos, para o interior assim como para navegação próxima à costa. A descrição de cada marca de navegação fornece os detalhes necessários para identificá-las e o seu significado (categoria, forma, cor, sequência, referência, etc.). \n \nPara retornar a um estilo convencional de mapa do OsmAnd, simplesmente desative este complemento ou altere o \'Estilo de mapa\' em \'Configurar mapa\' quando desejado. - Este plugin para o OsmAnd coloca ao seu alcance detalhes de pistas de descida de esqui, de travessia, rotas de esqui alpino, teleféricos e elevadores de esqui. Rotas e pistas são mostradas com codificação de cores por dificuldade e retratadas em um estilo especial de mapa \'Inverno\' que assimila uma paisagem de inverno cor de neve. -\n + Este complemento para o OsmAnd coloca ao seu alcance detalhes de pistas de descida de esqui, de travessia, rotas de esqui alpino, teleféricos e elevadores de esqui. Rotas e pistas são mostradas com codificação de cores por dificuldade e retratadas em um estilo especial de mapa \'Inverno\' que assimila uma paisagem de inverno cor de neve. +\n \nAtivando esta mudança na visão do estilo de mapa de \'Inverno e esqui\', mostrando todas as características da paisagem em condições invernais. Essa visão pode ser revertida desativando aqui ou alterando o \'Estilo de mapa\' em \'Configurar mapa\' quando desejado. OLC inválido \n @@ -2544,7 +2562,7 @@ Hora intermediária OsmAnd (sigla em inglês de Direções de Navegação Automatizada do OSM) é um aplicativo de mapa e navegação com acesso a dados livres, mundiais e de alta qualidade do OpenStreetMap (OSM). \n -\nPoderá usar o navegador visual e por voz, exibir POIs (pontos de interesse), criar e gerenciar trilhas GPX, usar (através de plugin) curvas de nível e dados de altitude, escolher entre os modos motorista, ciclista e pedestre, editar o OSM e muito mais. +\nPoderá usar o navegador visual e por voz, exibir POIs (pontos de interesse), criar e gerenciar trilhas GPX, usar (através de complemento) curvas de nível e dados de altitude, escolher entre os modos motorista, ciclista e pedestre, editar o OSM e muito mais. Navegação GPS \n• Escolha entre modos off-line (sem tarifa de roaming quando estiver no exterior) ou on-line (mais rápido) \n• Orientação por voz passo-a-passo lhe guia ao longo do caminho (vozes gravadas e sintetizadas) @@ -2558,21 +2576,22 @@ \n• Grave ou carregue uma trilha GPX e siga-a \n Mapa -\n• Exibe POIs (ponto de interesse) perto de você +\n• Exibe POIs (ponto de interesse) perto de si \n• Ajusta o mapa na sua direção de movimento (ou bússola) \n• Mostra a sua posição e direção para onde está olhando \n• Compartilhe sua posição para que seus amigos possam encontrá-lo \n• Mantém seus lugares mais importantes em \'Favoritos\' \n• Permite-lhe escolher como exibir nomes no mapa: em inglês, local ou escrita fonética -\n• Exibe mapas on-line especializados, vista de satélite (do Bing), camadas diferentes como trilhas GPX de navegação/turismo e camadas adicionais com transparência personalizável +\n• Exibe mapas on-line especializados, vista de satélite (do Bing), sobreposições diferentes como trajectos GPX de navegação/turismo e camadas adicionais com transparência personalizável +\n Esqui -\n O plugin de mapas de ski OsmAnd Ski permite que você veja pistas de ski com nível de complexidade e algumas informações adicionais, como localização de elevadores e outras facilidades. +\n O complemento de mapas de ski OsmAnd Ski permite que você veja pistas de ski com nível de complexidade e algumas informações adicionais, como localização de elevadores e outras facilidades. Ciclismo \n • Encontre caminhos de bicicleta no mapa \n • Navegação por GPS no modo ciclismo constrói a sua rota utilizando caminhos de bicicleta \n • Ver a sua velocidade e altitude \n • Opção de gravação GPX permite-lhe gravar a sua viagem e compartilhá-la -\n • Através de plugin adicionais, você pode ativar curvas de nível e sombreamento de relevo +\n • Através de complementos adicionais, você pode ativar curvas de nível e sombreamento de relevo Passeio, caminhada, turismo pela cidade \n• O mapa mostra caminhos para passeios e caminhadas \n• A Wikipédia no seu idioma preferido pode dizer muito durante um turismo pela cidade @@ -2592,7 +2611,7 @@ \n• Oriente Médio: ** \n• África: ** \n• Antártida: * -\nA maioria dos países ao redor do globo é disponível para download! +\nA maioria dos países ao redor do globo é disponível para descarregar! \nObtenha um navegador confiável em seu país - seja a França, Alemanha, México, Reino Unido, Espanha, Holanda, EUA, Rússia, Brasil ou qualquer outro. OsmAnd+ (OSM Automated Navigation Directions) é um aplicativo de mapa e navegação com acesso a dados do OpenStreetMap (OSM) livre, em todo o mundo e de alta qualidade. \nDesfrute da navegação visual ou por voz, exibindo POIs (pontos de interesse), criando e gerenciando trilhas GPX, usando informação de altitude e curvas de nível, escolher entre modos dirigir, andar de bicicleta e pedestres, editar o OSM e muito mais. @@ -2630,9 +2649,9 @@ \n• Visualização de caminhos a pé, pistas de caminhadas e ciclovias, ideal para atividades ao ar livre \n• Roteamento e modos de exibição especiais para bicicleta e pedestres \n• Paradas de transporte público opcionais (autocarro, eléctrico, comboio) incluindo nomes de linhas -\n• Gravação opcional de viagem para ficheiro GPX local ou serviço on-line +\n• Gravação opcional de viagem para ficheiro GPX local ou serviço on-line \n• Exibição opcional de velocidade e altitudes -\n• Exibição de curvas de nível e sombreamento de relevo (via plugin adicional) +\n• Exibição de curvas de nível e sombreamento de relevo (via complemento adicional) Contribuia diretamente para o OSM \n• Avisar erros de dados \n• Fazer upload de trilhas GPX para o OSM diretamente do app @@ -2665,14 +2684,14 @@ Outros Lançado Instruções de voz - Adicionar favorito + Adicionar Favorito apagar Reabrir Tamanho da foto - Selecionar tamanho de imagem da foto + Selecionar tamanho de imagem da foto. Obter Recálculo de rota inteligente - Recalcular apenas a parte inicial da rota para viagens longas + Recalcular apenas a parte inicial da rota para viagens longas. Está a gostar do OsmAnd\? A sua opinião e o seu comentário são importantes para nós. Avalie este app @@ -2708,16 +2727,16 @@ Gravado em: %1$s POI será excluído quando você enviar suas alterações Mostrar dados do GPX - Número de linhas + Contagem de linhas Tem certeza\? Quaisquer alterações não gravadas serão perdidas. Continuar\? - Mesmo se você tem a versão paga você ainda pode ver o banner da versão gratuita - Favor ativar o plugin \'Mapa náutico\' - Favor ativar o plugin \'Curvas de nível\' + Exibe o banner da versão gratuita mesmo na versão paga. + Favor ativar o complemento \'Mapa náutico\' + Favor ativar o complemento \'Curvas de nível\' %1$.1f de %2$.1f MB %.1f MB Atualizar tudo (%1$s MB) - Nome contém muitas letras maiúsculas. Você quer continuar\? + O nome contém demasiadas letras maiúsculas. Continuar\? Ação rápida Ação %d Ecrã %d @@ -2730,13 +2749,13 @@ Nova notificação de foto Adicionar notificação OSM Ligar/desligar voz - Voz desligada - Voz ligada + Voz Desmuda + Voz muda Adicionar ponto de rota GPX Marcar estacionamento Adicionar ação Editar ação - Adicionar favorito + Adicionar Favorito Adicionar ação Apagar ação Tem certeza de que deseja apagar a ação \"%s\"\? @@ -2754,7 +2773,7 @@ Mostrar um diálogo intermediário " está gravado no " Lugar - Nome de ação rápida especificada já em uso foi mudado para %1$s para evitar a duplicação. + Nome de ação rápida especificada já está em uso, foi mudado para %1$s para evitar uma duplicação. Nome de ação rápida duplicado Tocar neste botão de ação mostra ou esconde os pontos favoritos no mapa. Tocar neste botão de ação mostra ou esconde POIs no mapa. @@ -2769,12 +2788,12 @@ Configurar mapa Navegação Deixe em branco para automaticamente usar o endereço ou nome de lugar. - Esta mensagem será autocompletada no campo de comentário. + Esta mensagem está incluída no campo de comentário. Mensagem Selecione a categoria para gravar o favorito. Selecione uma categoria opcional. Lista de POIs - Você pode adicionar uma ou mais categorias de POI para exibir no mapa. + Adicione uma ou mais categorias de POI para mostrar no mapa. Tocar no botão de ação irá percorrer a lista abaixo. Adicionar um estilo de mapa Parâmetros não podem ficar em branco @@ -2989,4 +3008,6 @@ Inclinação Evitar paralelepípedo Evitar paralelepípedo + Enviar log + Embarque na parada \ No newline at end of file From 538ce307abd9526adebc380fb2515f53752aa93b Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 20 Apr 2019 21:56:06 +0000 Subject: [PATCH 067/114] Translated using Weblate (Portuguese) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-pt/phrases.xml | 3901 +++++++++++++++++++++++++++--- 1 file changed, 3569 insertions(+), 332 deletions(-) diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml index d735e9f60d..7f28517e4e 100644 --- a/OsmAnd/res/values-pt/phrases.xml +++ b/OsmAnd/res/values-pt/phrases.xml @@ -1,332 +1,3569 @@ - -Loja - Mercearia e supermercado - Emergência - Meios de Transporte - Obstáculo na via - Posto de combustível - Transporte particular - Transporte público - Transporte aéreo - Transporte aquático - Bicicleta - Teleférico - Nós da rede de caminhada/ciclismo - Rotas de caminhada - Fiscalização de trânsito - Construção humana - Transportes em construção - Abastecimento de água - Energia eléctrica - Comunicações - Recolha de lixo - Uso da terra - Educação - Administrativo - Saúde - Escritório - Desporto - Turismo - Roteiro turístico - Alojamento - Acesso à Internet - Lazer - Clube - Alimentação - Cafetaria e restaurante - Serviço - Artesanato - Finanças - Natural - Náutico - Área militar - Wikipédia - Definido pelo utilizador - - Sítio paleontológico - - Padaria - Loja de bebidas alcoólicas - Queijaria - Loja de chocolates - Cafetaria - Loja de conveniência - Centro comercial - Loja de bebidas - Talho - Mercearia Deli - Loja de produtos agrícolas - Loja de verduras - Loja de produtos do mar - Confeitaria - Geladaria - Supermercado - Casa de chá - Loja de massas - Pastelaria - Leitaria - Máquina de venda automática - Loja de vinhos - - Livraria - Loja de bicicletas - Loja de Banda Desenhada - Loja de antiguidades - Loja de arte - Produtos de bebé - Loja de malas - Mobiliário de Casa de Banho - Loja de roupa de cama - Loja de moda - Câmaras e lentes - Loja de tapetes - Loja de caridade - Drogaria - Pronto a vestir - Vestuário infantil - Sapataria - Loja de velas - Loja de informática - Reprografia - Loja de cortinas - Loja de tecidos -Equipamento de mergulho - Artigos para casa - Portas - Loja erótica - Acessórios de moda - Equipamento de pesca - Florista - Loja de molduras - Artigos de voo livre - Artigos de aquecimento - Mobiliário - Centro de jardinagem - Móveis para jardim - Tabacaria - Aviso sonoro - Paragem de Autocarro - Paragem de Autocarro Eléctrico - Paragem de eléctrico - Oficial de Justiça - Fundo de pensão - Local de piquenique - Local de equitação - - Canalizador - Pedra notável - Farolim - Bóia de águas seguras - Navio-farol - Impasse - - Arquitectura: casa grande alemã - Estrutura maritíma - - ATM: sim - Loja de gás líquido - Loja genérica - Loja de presentes - Vidraceira - Loja de materiais de construção - Aparelhos auditivos - Ervanária - Loja Hi-Fi - Loja de artigos domésticos - Equipamentos de caça - Loja de decoração de interiores - Joalharia - Quiosque - Mobiliário de cozinha - Artigos de pele - Suprimentos médicos - Loja de telemóveis - Loja de Motas - Loja de Música - Instrumentos musicais - Agência de notícias - Óptica - Produtos orgânicos - Loja de Ar Livre - Loja de tintas - Loja de animais - Loja de fotografia - Loja de radiotecnia - Loja de artigos usados - Loja de mergulho - Fornecedor de navios - Artigos desportivos - Papelaria - Loja de utensílios de mesa - Bilheteira - Loja de brinquedos - Entreposto comercial - Loja de pneus - Loja de aspiradores - Loja de artigos variados - Loja de vídeos - Loja de persianas - Grande armazém - Loja de artigos electrónicos - Loja de artigos de energia - Loja de automóveis - Peças Auto - Loja de quadriciclos - Cosméticos - Mercado/feira - Loja de produtos secos - Relojoaria - Loja de artigos de piscina - Jogos - Modelos à escala - Troféus, prémios - Videojogos - Fogos de artifício - Armaria - Perfumaria - - Polícia - Bombeiros - Telefone de emergência - Boca de incêndio - Extintor de incêndio - Abafador de incêncio - Mangueira de incêndio - Reservatório de água contra incêndios - Caixa de sal-gema - Posto de ambulância - Serviço de emergência - Ponto de acesso de emergência - - Vau - Ponte pedonal sobre pedra - Passagem de montanha - Portão - Muralha - Cancela elevatória - Cabine de portagem - Alfândega - Lomba larga - Lomba curta - Abrandamento - Curva e contracurva - Banda sonora - Estreitamento - Ilha de trânsito - Semáforo - - Oficina Auto - Pneus - Inspecção de veículos - Lavagem de carro - Posto de combustível - Gasóleo - Diesel GPL - Gasóleo para pesados - Biodiesel - GPL - 80 Octanas - 91 Octanas - 92 Octanas - 95 Octanas - 98 Octanas - 100 Octanas - Gás Natural para veículos - Combustível 1:25 - Combustível 1:50 - Etanol - Metanol - Óleo vegetal combustível - E10 - E20 - E85 - Biogás - Hidrogénio líquido - Electricidade - Posto de carregamento - Rampa de veículo - Ar comprimido - Estacionamento - Tipo de combustível - Forma de pagamento - Adicional - Tipo de acesso à Internet - Cartões de combustível - Tipo de venda - Serviço de bicicletas - Tipo - Tipo - Tipo - Posição - Fonte de água - Forma de pagamento - Som - Tipo - Pavimentação tátil - Serviço - Sem escova - Automatizado - Tipo - Coberto - Estação de metro - Carga - Tipo - Transporte de bicicleta - Aquecimento - Bomba - Designação - Tipo - Tipo - Tipo - Especialidade - Característica - Tipo - Classificação de estrelas - Religião - Denominação - Tipo - Conteúdos - Adicional - Acampamento de escuteiros - Tipo - Gênero - Assentos ao ar livre - Taxa - Fumar - Entrega - Drive - in - Drive - through - Serviço de take-away - Cocktails - Microcervejaria - Serviço - Tipo - Resíduos aceites - Tipo - Lareira - Superfície - Nudismo - Dieta - Tipo de massagem - Tendas - Máquina de lavar roupa - Caravanas - Fornecimento de energia - Sistema médico - Prato - Tipo de pagamento (transporte) - Tipo - Ar comprimido - Aspirador - Característica - Cafetaria - Tipo - Serviços - Tipo de motocicleta - Animais aceites - Estado operacional - Tipo de combustível (aviação) - Self-Service - Capital - Dispensa - + + + Loja + Mercearia e supermercado + Emergência + Meios de Transporte + Obstáculo na via + Posto de gasolina + Transporte particular + Transporte público + Transporte aéreo + Transporte aquático + Bicicleta + Teleférico + Nós da rede de caminhada/ciclismo + Rotas de caminhada + Fiscalização de trânsito + Construção humana + Transportes em construção + Abastecimento de água + Energia eléctrica + Comunicações + Recolha de lixo + Uso da terra + Educação + Administrativo + Saúde + Escritório + Desporto + Turismo + Roteiro turístico + Alojamento + Acesso à Internet + Lazer + Clube + Alimentação + Cafetaria e restaurante + Serviço + Artesanato + Finanças + Natural + Náutico + Área militar + Wikipédia + Definido pelo utilizador + Sítio paleontológico + Padaria + Loja de bebidas alcoólicas + Queijaria + Loja de chocolates + Cafetaria + Loja de conveniência + Centro comercial + Loja de bebidas + Talho + Mercearia Deli + Loja de produtos agrícolas + Loja de verduras + Loja de produtos do mar + Doçaria + Geladaria + Supermercado + Casa de chá + Loja de massas + Pastelaria + Leitaria + Máquina de venda automática + Loja de vinhos + Livraria + Loja de bicicletas + Loja de Banda Desenhada + Loja de antiguidades + Loja de arte + Produtos de bebé + Loja de malas + Mobiliário de Casa de Banho + Loja de roupa de cama + Loja de moda + Câmaras e lentes + Loja de tapetes + Loja de caridade + Drogaria + Pronto a vestir + Vestuário infantil + Sapataria + Loja de velas + Loja de informática + Reprografia + Loja de cortinas + Loja de tecidos + Equipamento de mergulho + Artigos para casa + Portas + Loja erótica + Acessórios de moda + Equipamento de pesca + Florista + Loja de molduras + Artigos de voo livre + Artigos de aquecimento + Mobiliário + Centro de jardinagem + Móveis para jardim + Tabacaria + Faixa elevada + Paragem de Autocarro + Paragem de Autocarro Eléctrico + Paragem de eléctrico + Oficial de Justiça + Fundo de pensão + Local de piquenique + Local de equitação + Canalizador + Pedra notável + Farolim + Bóia de águas seguras + Navio-farol + Impasse + Arquitectura: casa grande alemã + Estrutura maritíma + ATM: sim + Loja de gás líquido + Loja genérica + Loja de presentes + Vidraceira + Loja de materiais de construção + Aparelhos auditivos + Ervanária + Loja Hi-Fi + Loja de artigos domésticos + Equipamentos de caça + Loja de decoração de interiores + Joalharia + Quiosque + Mobiliário de cozinha + Artigos de pele + Suprimentos médicos + Loja de telemóveis + Loja de Motas + Loja de Música + Instrumentos musicais + Agência de notícias + Óptica + Produtos orgânicos + Loja de Ar Livre + Loja de tintas + Loja de animais + Loja de fotografia + Loja de radiotecnia + Loja de artigos usados + Loja de mergulho + Fornecedor de navios + Artigos desportivos + Papelaria + Loja de utensílios de mesa + Bilheteira + Loja de brinquedos + Entreposto comercial + Loja de pneus + Loja de aspiradores + Loja de artigos variados + Loja de vídeos + Loja de persianas + Grande armazém + Loja de artigos electrónicos + Loja de artigos de energia + Loja de automóveis + Peças Auto + Loja de quadriciclos + Cosméticos + Mercado/feira + Loja de produtos secos + Relojoaria + Loja de artigos de piscina + Jogos + Modelos à escala + Troféus, prémios + Videojogos + Fogos de artifício + Armaria + Perfumaria + Polícia + Bombeiros + Telefone de emergência + Boca de incêndio + Extintor de incêndio + Abafador de incêncio + Mangueira de incêndio + Reservatório de água contra incêndios + Caixa de sal-gema + Posto de ambulância + Serviço de emergência + Ponto de acesso de emergência + Vau + Ponte pedonal sobre pedra + Passagem de montanha + Portão + Muralha + Cancela elevatória + Cabine de portagem + Alfândega + Lombada curta + Lombada rápida + Almofada + Curva e contracurva + Banda sonora + Estreitamento + Ilha de trânsito + Semáforo + Oficina Auto + Pneus + Inspecção de veículos + Lavagem de carro + Posto de combustível;Posto de abastecimento;Posto de gasolina;Bomba de gasolina + Gasóleo + Diesel GPL + Gasóleo para pesados + Biodiesel + GPL + 80 Octanas + 91 Octanas + 92 Octanas + 95 Octanas + 98 Octanas + 100 Octanas + Gás Natural para veículos + Combustível 1:25 + Combustível 1:50 + Etanol + Metanol + Óleo vegetal combustível + E10 + E20 + E85 + Biogás + Hidrogénio líquido + Electricidade + Posto de carregamento + Rampa de veículo + Ar comprimido + Estacionamento + Tipo de combustível + Forma de pagamento + Adicional + Tipo de acesso à Internet + Cartões de combustível + Tipo de venda + Serviço de bicicletas + Tipo + Tipo + Tipo + Posição + Fonte de água + Forma de pagamento + Som + Tipo + Pavimentação tátil + Serviço + Sem escova + Automatizado + Tipo + Coberto + Estação de metro + Carga + Tipo + Transporte de bicicleta + Aquecimento + Bomba + Designação + Tipo + Tipo + Tipo + Especialidade + Característica + Tipo + Classificação de estrelas + Religião + Denominação + Tipo + Conteúdos + Adicional + Acampamento de escuteiros + Tipo + Gênero + Assentos ao ar livre + Taxa + Fumar + Entrega + Drive - in + Drive - through + Serviço de take-away + Cocktails + Microcervejaria + Serviço + Tipo + Resíduos aceites + Tipo + Lareira + Superfície + Nudismo + Dieta + Tipo de massagem + Tendas + Máquina de lavar roupa + Caravanas + Fornecimento de energia + Sistema médico + Prato + Tipo de pagamento (transporte) + Tipo + Ar comprimido + Aspirador + Característica + Cafetaria + Tipo + Serviços + Tipo de motocicleta + Animais aceites + Estado operacional + Tipo de combustível (aviação) + Self-Service + Capital + Dispensa + Acampamento em área isolada + Dificuldade da pista + Preparação de pista + Sazonal + Característica da água + Especialidade de saúde + Visita domiciliar + Público-alvo + Finalidade + Barcos alugados + Tipo de abastecimento de água + Purificação de água + Acesso a local com água + Estilo de escalada + Tomada + Saída CHAdeMO + Saída tipo 2 + Saída combo tipo 2 + Saída do tipo 3 + Saída CEE azul + Saída Schuko + Serviços automotivos + Tipo de geleira + Tipo de checkpoint + Compra a granel + Tipo + Livros + Denotação + Estacionamento integrado + Categoria de dificuldade + Penhasco de escalada + Infraestrutura de emergência + Loja de especiarias + Loja de materiais artísticos + Loja de mel + Artigos religiosos + Estação de combustível de aeronaves + Posto de gasolina para embarcações + Estacionamento de moto + Entrada do estacionamento + Garagens + Parada de transporte público + Ponto de ônibus + Ponto de parada de transporte público + Ponto de bonde + Estação de transporte público + Estação rodoviária + Estação ferroviária + Plataforma ferroviária + Parada ferroviária + Entrada do metrô + Sim + Para-choque de via + Ponto de táxi + Aeroporto + Heliponto + Pista de pouso/decolagem + Terminal de aeroporto + Portão de embarque + Rampa náutica + Terminal de balsa + Farol + Estação de bicicletas públicas + Bicicletário + Estação teleférica + Teleférico + Telecabine + Telecadeira + Telesquis T-bar + Telesquis J-bar + Telesqui de prato + Teleférico misto + Telesquis + Telecorda + Teleférico de carga + Esteira rolante + Torre de teleférico + Túnel + Ponte + Radar + Balão de retorno + Saída de rodovia + Entroncamento + Área de repouso + Poço de água + Suporte para combate a incêndio + Estação de tratamento de água + Estaleiro + Estação de tratamento de esgoto + Reservatório elevado + Comporta de eclusa + Balão de retorno aquático + Vertedouro + Barragem + Moinho de água + Quebra-mar + Estacada + Subestação + Transformador + Cabine de distribuição elétrica + Usina de energia + Gerador de energia + Torre de transmissão + Poste de transmissão + Agência de correio + Caixa de correio + Telefone público + Torre de comunicação + Torre de observação + Campanário + Torre de resfriamento + Torre de iluminação + Central telefônica + Reciclagem + Centro de reciclagem + Contêiner + Vidro + Papel + Roupas + Latas + Garrafas de vidro + Plástico + Sucata de metal + Pilhas + Garrafas de plástico + Resíduos verdes + Resíduos (sacos pretos) + Embalagens de plástico + Jornal + Caixas + Papelão + Revistas + Embalagens de papel + Pequenos aparelhos + Madeira + Livros + Calçados + Alumínio + Orgânico + Embalagem longa vida + Resíduos de jardim + Lâmpadas de baixo consumo + Lâmpadas fluorescentes + Metal + Itens elétricos + Linha branca + Óleo de cozinha + Óleo do motor + Sacos plásticos + Resíduo perigoso + Telefones celulares + Mercúrio + Computadores + Pneus + TV, monitores + Tetrapak + Entulho + CDs + Resíduo de óleo + Garrafas + Cortiça + Cartuchos de impressão + Chapa metálica + Papel alumínio + Tinta + Isopor + Drogas + Adubo + Entulho (concreto) + Árvores de Natal + Lâmpadas incandescentes + Compensado + Poliéster + Gesso cartonado + Resíduo animal + Frigorífico e congelador + Móveis + Fraldas + Baterias de carro + Carros + Bicicletas + Aterro sanitário + Resíduos nucleares + Descarte de lixo + Lixeira + Área residencial + Área industrial + Área ferroviária + Área de negócios + Área de vendas + Pedreira + Vinha + Pomar + Horta urbana + Floresta manejada + Pátio de fazenda + Prado + Bacia + Canal artificial + Píer + Vigilância + Observatório + Astronômico + Torre + Mastro + Estação de medição ambiental + Radar + Guindaste + Construção + Terreno abandonado + Terreno virgem + Fábrica + Poço de mineração + Ádito de mineração + Poço de petróleo + Ponto de exame geográfico + Moinho de vento + Sapal + Lago artificial + Redes de críquete + Gasômetro + Silo + Silo trincheira + Tanque de armazenamento + Escola técnica + Escola de condutores + Escola infantil + Escola + Centro de treinamento + Universidade + Serviço social + Fórum jurídico + Prisão + Cartório de registro civil + Embaixada + Governo + Promotor de Justiça + Migração + Inspeção fiscal + Escritório administrativo + Aduana + País + Cidade grande + Sim + Cidade pequena + Povoado + Lugarejo + Moradia isolada + Bairro + Bairro menor + Vizinhança + Localidade + Loteamentos + Fazenda + Farmácia + Hospital + Consultório médico + Clínica + Primeiros socorros + Dentista + Clínica geriátrica + Roda dos expostos + Veterinária + Sanatório + Medicina alternativa + Audiologista + Banco de sangue + Centro médico + Obstetra + Terapeuta ocupacional + Optometrista + Fisioterapeuta + Podólogo + Psicoterapeuta + Reabilitação + Fonoaudiólogo + Instalação médica + Pediatria + Companhia + Seguro + Imobiliária + Advogado + Telecomunicação + ONG + Paço Municipal + Agência de empregos + Pesquisa + Escritório de TI + Jornal + Arquiteto + Agência de publicidade + Instituição de ensino + Estúdio + Casa de apostas + Área religiosa + Escritório de Associação + Escritório financeiro + Escritório de partido político + Tabelião + Escritório de fundação + Escritório de conselheiro fiscal + Estádio + Centro/clube esportivo + Campo de golfe + Pista de patinação no gelo + Quadra/Campo + Pista de esportes + Pista de atletismo + Pista de ciclismo + Hipódromo + Pista de corrida + Bolão + Boliche + Tiro com arco + Atletismo + Futebol americano + Futebol australiano + Base jumping + Beisebol + Basquete + Voleibol de praia + Bicicross + Bocha + Tigelas + Futebol canadense + Canoa + Xadrez + Escalada + Críquete + Croquete + Ciclismo + Mergulho + Mergulho + Corridas de cães + Hipismo + Hóquei em campo + Hóquei no gelo + Golfe + Ginástica + Handebol + Hóquei + Turfe + Patinação no gelo + Curling bávaro + Corfebol + Esporte automotivo + Poliesportivo + Orientação + Pádel + Parapente + Bocha/pelota + Esportes com raquete + Patinação sobre rodas + Remo + Rúgbi de 15 + Rúgbi de 13 + Vela + Tiro desportivo + Patinação + Skate + Esqui + Futebol + Surf + Natação + Tênis de mesa + Tênis + Tobogã + Voleibol + Museu + Memorial + Obra de arte + Sítio arqueológico + Campo de batalha histórico + Marco de fronteira + Canhão histórico + Castelo + Portão da cidade + Forte + Chafariz + Ruínas históricas + Pedra rúnica + Naufrágio + Navio histórico + Mina histórica + Monumento simbólico + Jardim zoológico + Aquário + Parque de diversões + Atração turística + Objeto turístico + Passeio de diversão + Animal (atração) + Roda-gigante + Carrossel + Labirinto + Montanha russa + Tobogã + Tobogã de verão + Carrossel swing + Trem (atração) + Tobogã aquático + Alojamento + Hotel + Guesthouse + Hostel + Hotel estrada + Abrigo de montanha + Chalé + Apartamento + Abrigo no deserto + Cabana + Galpão + Cabana de caça + Local de culto + Cristianismo + Judaísmo + Islamismo + Sikhismo + Budismo + Hinduísmo + Xintoísmo + Taoísmo + Vodu + Unitário-Universalismo + Multirreligiosa + Jainismo + Espiritualismo + Bahaísmo + Cientologismo + Paganismo + Tenrikyo + Zoroastrismo + Católica + Batista + Católica romana + Ortodoxo + Luterana + Sunita + Protestante + Metodista + Anglicana + Presbiteriana + Evangélica + Ortodoxa russa + Pentecostal + Mórmon + Testemunhas de Jeová + Ortodoxa grega + Reformada + Adventista do sétimo dia + Nova apostólica + Igreja da Inglaterra + Episcopal + Xiita + Unida + Greco-católica + Tibetana + Reformada unida + Igreja da Escócia + Exército da salvação + Igreja em cristo + Unida + Menonita + Quaker + Ortodoxa búlgara + Assembleia de deus + Sem denominação + Adventista + Nazarena + Metodista unida + Congregacional + Velhos crentes + Ortodoxa sérvia + Espírita + Apostólica armênia + Reformada neerlandesa + Apostólica + Reformista + Santos dos últimos dias + Igreja de cristo + Igreja unida de cristo + Ortodoxa georgiana + Científica + Ortodoxa romena + Ortodoxa etíope tewahido + Unitarista + Ortodoxa copta + Wesleyana + Shaktismo + Shingon shu + Maronita + Maaiana + Acesso à Internet: wifi + Acesso à Internet: terminal + Acesso à Internet: com fio + Acesso à Internet: público + Acesso à Internet: serviço + Com acesso à Internet + Sem acesso à Internet + Acesso à Internet pago + Acesso à Internet grátis + Mosteiro + Área religiosa + Cruz de beira de estrada + Capelinha de beira de estrada + Informação + Relógio + Agente de viagens + Mirante + Local de acampamento + Local de caravanas + Mesa de piquenique + Nascente + Fonte termal + Gêiser + Cemitério secular + Cemitério paroquial + Tumba + Abrigo contra intempéries + Funicular + Resort + Hanami + Adega de vinho + Vinícola + Clube de arte + Clube de astronomia + Clube de informática + Clube de jogos de tabuleiro + Moto clube + Clube desportivo + Clube de jogos + Automóvel clube + Clube de xadrez + Clube de cinema + Fã-clube + Clube de pesca + Clube de veteranos + Clube de Linux + Clube de teatro + Clube de história + Clube de música + Clube étnico + Clube de natureza + Clube de fotografia + Clube de caça + Clube de tiro + Clube de turismo + Clube de caridade + Loja maçônica + Clube de vela + Clube de escoteiros + Pista + Pista de descida + Pista nórdica + Pista de passeio + Pista de caminhada + Pista de trenó + Pista de trenó (carrinho) + Parque de neve + Pista de esqui infantil + Patim de gelo + Aluguel de esqui + Biblioteca + Centro de artes + Cinema + Cassino + Centro comunitário + Centro social + Teatro + Circo + Galeria de arte + Pista de dança + Danceteria;Casa noturna;Boate + Clube de striptease + Resort de esqui + Resort de praia + Cachorródromo + Local de pesca + Posto elevado de espera de caça + Porto + Marina + Minigolfe + Parquinho + Assento + Piscina + Parque aquático + Parque/praça + Área de recreação + Área verde + Cafeteria + Biergarten + Restaurante + Lanchonete + Bar + Boteco + Praça de alimentação + Fonte de água potável + Churrasqueira + Máquinas agrícolas + Cesteiro + Apicultor + Ferraria + Cervejaria + Estaleiro + Encadernador + Carpintaria + Colocador de carpete + Fornecedor de comida + Relojoaria + Costureira + Eletricista + Jardineiro + Vidraceiro + Artesão + Aquecimento, ventilação, ar condicionado + Isolação térmica + Joalheria + Chaveiro + Copiador de chaves + Serralheria + Ótica + Pintor + Instalador de parquet + Fotógrafo + Laboratório fotográfico + Gesseiro + Oleiro + Armador + Telhadista + Seleiro + Reparador de velas náuticas + Serraria + Montador de andaimes + Escultor + Sapataria + Construtor de estande + Canteiro + Fábrica de toldos + Vassoureiro + Alfaiataria + Ladrilheiro + Funilaria + Estofador + Relojoeiro + Fabricante de janelas + Funerária + Montagem de computadores + Salão de beleza + Manicura + Cabeleireiro + Salão de massagem + Estúdio de tatuagem + Lavagem de roupas a seco + Lavanderia + Aluguel de carros + Compartilhamento de carros + Ponto de compartilhamento de carros + Compartilhamento de barcos + Doca + Linha de corte florestal + Banheiro + Chuveiro + Sauna + Bordel + Área de fumantes + Necrotério + Crematório + Cyber café + Agência bancária + Caixa eletrônico + Caixa eletrônico + Terminal de pagamento + Financeira + Casa de penhores + Casa de câmbio + Contador + Pagamento em Bitcoin + Entrada de caverna + Cume + Passo de montanha + Vulcão + Cratera + Cumeeira + Geleira + Sumidouro + Queda-d\'água + Rio + Córrego + Corredeira + Promontório + Praia + Baía + Fiorde + Recife + Vale + Água + Zona úmida + Bosque nativo + Árvore + Reserva natural + Estreito + Ilha + Ilhéu + Ancoragem + Ancoradouro + Baliza cardinal + Baliza luminosa lateral + Baliza luminosa de águas seguras + Baliza luminosa de propósito especial + Cais + Marco náutico edifício + Marco náutico ponte + Bóia cardinal + Bóia de instalação + Bóia, perigo isolado + Bóia lateral + Bóia de propósito especial + Conhecença + Marca de distância + Doca seca + Dique náutico + Doca flutuante + Sinal de nevoeiro + Bacia do porto + Porto + Marco terrestre + Marco náutico luz + Marco náutico luz maior + Marco náutico luz menor + Marco náutico luz flutuante + Atracação + Eclusa + Marco náutico aviso + Trapiche + Marco náutico transponder + Marco náutico estação de rádio + Estação de sinal de tráfego + Estação de sinal de alerta + Instalação de pequenas embarcações + Marco náutico superior + Marco náutico rocha + Marco náutico naufrágio + Altura livre + Altura livre (fechada) + Altura livre (aberta) + Largura livre + Zona militar + Aeródromo militar + Casamata militar + Quartel + Zona de perigo + Estande de tiro militar + Área militar + Base naval militar + Sítio da explosão nuclear + Wikipédia + Wiki em Inglês + Wiki em Árabe + Wiki em Bielorusso + Wiki em Búlgaro + Wiki em Catalão + Wiki em Cebuano + Wiki em Tcheco + Wiki em Dinamarquês + Wiki em Alemão + Wiki em Grego + Wiki em Estoniano + Wiki em Espanhol + Wiki em Finlandês + Wiki em Francês + Wiki em Galego + Wiki em Hebraico + Wiki em Hindi + Wki em Croata + Wiki em Haitiano + Wiki em Húngaro + Wiki em Indonésia + Wiki em Italiano + Wiki em Japonês + Wiki em Coreano + Wiki em Lituano + Wiki em Letão + Wiki em Malaio + Wiki em neuaris + Wiki em holandês + Wiki em novo norueguês + Wiki em norueguês + Wiki em Polonês + Wiki em português + Wiki em Romeno + Wiki em Russo + Wiki em Eslovaco + Wiki em Esloveno + Wiki em Sérvio + Wiki em Sueco + Wiki em Suaíli + Wiki em Telugu + Wiki em Tailandês + Wiki em Turco + Wiki em Ucraniano + Wiki em Vietnamita + Wiki em Volapuque + Wiki em chinês + Wiki em africâner + Wiki em alemânico + Wiki em azeri + Wiki em bengali + Wiki em bishnupriya + Wiki em bretão + Wiki em bósnio + Wiki em galês + Wiki em esperanto + Wiki em basco + Wiki em persa + Wiki em frisão + Wiki em irlandês + Wiki em armênio + Wiki em islandês + Wiki em georgiano + Wiki em curdo + Wiki em latim + Wiki em luxemburguês + Wiki em macedônio + Wiki em malaiala + Wiki em marata + Wiki em baixo-saxão + Wiki em navajo + Wiki em osseta + Wiki em piamontês + Wiki em sardenho + Wiki em servo-croata + Wiki em albanês + Wiki em tâmil + Wiki em filipino + Wiki em wáray-wáray + Wiki em minangkabau + Wiki em cazaque + Wiki em uzbeque + Wiki em checheno + Wiki em urdu + Wiki em franco-provençal + Wiki em min nan + Wiki em malgaxe + Wiki em tártaro + Wiki em javanês + Wiki em quirguiz + Wiki em cantonês + Wiki em asturo-leonês + Wiki em tajique + Wiki em bashkir + Wiki em scots + Wiki em panjabi + Wiki em tchuvache + Wiki em lombardo + Wiki em birmanês + Wiki em iorubá + Wiki em aragonês + Wiki em nepalês + Wiki em guzerate + Wiki em siciliano + Wiki em bávaro + Wiki em mongol + Wiki em napolitano + Pilarete + Barreira para bicicleta + Barreira para moto + Bloqueio + Armadilha de ônibus + Mata-burro + Catraca de altura completa + Portão de colisão + Barreira geral + Travessia em cerca + Escombros + Barreira de Nova Jersey + Limitador de altura + Passagem para cavalos + Quebra-corpo + Portão de fortaleza + Cancela de balanço + Catraca + Pilaretes anti-carro (carroças passam) + Passagem em um muro ou uma cerca + Entrada principal + Entrada + Saída + Travessia de pedestres + Ponto de rede cicloviária internacional + Ponto de rede cicloviária nacional + Ponto de rede cicloviária regional + Ponto de rede cicloviária local + Ponto de rede internacional de caminhada + Ponto de rede nacional de caminhada + Ponto de rede regional de caminhada + Ponto de rede local de caminhada + Rota internacional de caminhada + Rota nacional de caminhada + Rota regional de caminhada + Rota local de caminhada + Referência de rota de caminhada + Horário de funcionamento + Horário de coleta + Descrição + Telefone + Site + Email + Fax + Facebook + Twitter + Skype + YouTube + Instagram + VKontakte + Google+ + Celular + Horário de serviço + Altura máxima + Peso máximo + Altura + Elevação acima do nível do mar + Abandonado + Objeto abandonado + Fora de uso + Operador + Bandeira + Sim + Não + Sim + Não + Supervisionado + Sem supervisão + Sim + Não + Estação seca + Estação chuvosa + Primavera + Verão + Outono + Inverno + Com semáforos + Sem controle de tráfego + Não sinalizado + Data de início/Inauguração + Acesso para cadeirantes + Sim + Não + Limitado + Atacado + Acesso privado + Acesso proibido + Acesso para trânsito local + Acesso permissivo + Acesso para cliente + Acesso para entrega + Acesso agrícola + Conteúdo: silagem + Conteúdo: água + Conteúdo: chorume + Conteúdo: óleo + Conteúdo: combustível + Conteúdo: estrume + Conteúdo: vinho + Conteúdo: esgoto + Conteúdo: gás + Conteúdo: biomassa + Conteúdo: águas residuais + Conteúdo: colheita + Conteúdo: forragens + Conteúdo: cerveja + Conteúdo: sal + Conteúdo: grão + Permitido + Proibido + Obrigatório + Habitual + Permissivo + Materiais de construção + Tubos e conexões + Madeiras + Implementos agrícolas + Telhas + População + Subterrâneo + Vários andares + Âncora + U-invertido + Suporte de roda + Prateleira + Edifício especial + Galpão + Poste de amarração + Informal + Latifoliadas + Acicular + Mista + Desfolhada + Espécies + Gênero + Táxon + Oliveira + Macieira + Palmeira oleaginosa + Laranjeira + Amendoeira + Bananeira + Aveleira + Coqueiro + Caquizeiro + Cerejeira + Nogueira + Ameixeira + Pessegueiro + Erveira + Coca + Kiwizeiro + Prado com pomar + Nectarineira + Mangueira + Seringueira + Tamareira + Cafeeiro + Romãzeira + Urbano + Rural + Fiscalização: semáforo + Fiscalização: velocidade máxima + Fiscalização: peso máximo + Fiscalização: distância mínima + Fiscalização: verificação + Fiscalização: acesso + Fiscalização: pedágio + Abrigo de animais + Cães + Gatos + Cães e gatos + Aves + Animais selvagens + Cavalos + Mamíferos + Peixes + Assentos + Encosto: sim + Encosto: não + Intermitente + Edifício + Fonte de energia: carvão + Fonte de energia: gás + Fonte de energia: nuclear + Fonte de energia: solar + Fonte de energia: hidráulica + Fonte de energia: vento + Fonte de energia: geotérmica + Fonte de energia: petróleo + Fonte de energia: diesel + Nome internacional + Nome nacional + Nome regional + Nome local + Nome antigo + Nome alternativo + Manual + Elétrica + Sem bomba + Sim + Mineral + Característica d\'água: barrenta + Sulfurosa + Ponto de água + Poste com direções + Painel + Mapa + Ponto de informação + Marca de caminho + Terminal + Marcador de rota + Mapa de caminhadas + Natureza + História + Placa + Audioguia + Mapa ciclístico + Modelo tátil + Mapa tátil + Quadro de avisos + Plantas + Geologia + Transporte público + Tecnologia + Astronomia + Sim + Sem lareira + Sim + Descoberto + Não permitido + Apenas do lado de fora + Permitido + Em sala separada + Em sala isolada + Dedicado aos fumantes + Pedágio + Sem pedágio + Pedágio para veículos pesados + Sim + Sem piso tátil + Sim + Não + Só quando permitido atravessar + Estação de resgate + Área de serviço + Mini-rotatória + Travessia de pedestres em ferrovia + Passagem em nível + Observatório de aves + Local de equitação + Área de lazer comum + Jardim + Urzal + Gramado + Relvado + Matagal + Lavoura + Desmatamento + Areia + Fruto caído + Árvores mortas + Lugar de passagem + Andar + Escala RTSA + Fácil + Intermediária + Avançada + Novato + Perito + Freeride + Clássica + Clássica+patinagem + Em área isolada + Scooter + Patinagem + Não + Mogul + Jardim residencial + Jardim comunitário + Jardim privado + Jardim botânico + Estilo de jardim: cozinha + Jardim de rosas + Jardim francês + Jardim inglês + Jardim japonês + Capacidade + Sim + Não há lugares reservados para pessoas com deficiência + Lugares reservados para pessoas com deficiência + Lugares reservados para mulheres + Não há lugares reservados para mulheres + Lugares reservados para mulheres + Lugares reservados para estudantes + Lugares reservados para professores + Lugares reservados para pais + Não há lugares reservados para pais + Lugares reservados para pais + Capacidade de cabine/cadeira/carro + Capacidade por hora + Tempo de viagem médio, minutos + Bolha + Sem bolha + Sim + Sem calefação + Permitido + Bicicleta: proibido + Permitido só no verão + Apenas entrada + Apenas saída + Entrada e saída + Acesso de verão: apenas entrada + Acesso de verão: apenas saída + Acesso de verão: entrada e saída + 1 (Turista) + 1S (Turista Superior) + 2 (Standard) + 2S (Standard Superior) + 3 (Conforto) + 3S (Conforto Superior) + 4 (Primeira Classe) + 4S (Primeira Classe Superior) + 5 (Luxo) + 5S (Luxo Superior) + Quartos + Motel + Moedas + Não aceita moedas + Moedas de $0,5 + Moedas de 50c, $1 e $2 + Cartão telefônico + Não aceita cartão telefônico + Cartão de crédito + Não aceita cartão de crédito + Cédulas + Não aceita nota promissória + Carteira eletrônica + Não aceita carteira eletrônica + Dinheiro + Não aceita dinheiro + Cartão de débito + Não aceita cartão de débito + Bitcoin + Não aceita Bitcoin + Visa + Não aceita cartão Visa + MasterCard + Não aceita cartão MasterCard + Cartão de crédito + Não aceita cartão de crédito + Cartão Maestro + Não aceita cartão Maestro + American Express (AMEX) + Não aceita cartão American Express (AMEX) + Diners Club + Não aceita cartão Diners Club + DKV + Não aceita DKV + UTA + Não aceita cartão UTA + Efectivo + Não aceita Efectivo + Girocard + Não aceita Girocard + Discover Card + Não aceita Discover Card + Visa Electron + Não aceita Visa Electron + Litecoin + Não aceita Litecoin + Cheque + Não aceita cheque + PIKEPASS + Não aceita PIKEPASS + PIKEPASS (designado) + Cartão Visa Débito + Não aceita cartão Visa Débito + Não aceita criptomoedas + Outros + Não aceita outras formas de pagamento + Routex + Não aceita cartão de combustível Routex + Bancomat + Não aceita Bancomat + IC Stored Fare + Não aceita cartão IC Stored Fare + Bilhetes pré-pagos + JCB + Não aceita cartão JCB + Laser + Não aceita cartão Laser + Quick + Não aceita cartão Quick + Eurowag + Não aceita cartão Eurowag + E-ZPass + Não aceita E-ZPass + Euroshell + Não aceita cartão de combustível Euroshell + KITCard + Não aceita KITCard + Westfalen + Não aceita cartão Westfalen + V PAY + Não aceita cartão V PAY + Dogecoin + Não aceita Dogecoin + Cibus + Não aceita cartão Cibus + Transferência eletrônica + Não aceita transferência eletrônica + Cartão de dinheiro (Geldkarte) + Não aceita cartão de dinheiro (Geldkarte) + Proton + Não aceita cartão Proton + AvantCard + Não aceita cartão AvantCard + MEP + Não aceita MEP + Minipay + Não aceita Minipay + MiniCash + Não aceita MiniCash + Moneo + Não aceita Moneo + Monedero 4B + Não aceita Monedero 4B + Monedero + Não aceita Monedero + BankAxess + Não aceita BankAxess + Coinkite + Não aceita Coinkite + Roadrunner + Não aceita cartão Roadrunner + SVG + Não aceita SVG + Aceita pagamento por SMS + Não aceita pagamento por SMS + OV-Chipkaart + Não aceita OV-Chipkaart + Oyster + Não aceita cartão Oyster + SUBE + Não aceita cartão SUBE + Via Verde + Não aceita Via Verde + Vale refeição + Não aceita vale refeição + PayPal + Não aceita PayPal + U-Key + Não aceita U-Key + Token + Não aceita Token + Cartões de presente + Não aceita cartão presente + Golden Crown + Não aceita cartão Golden Crown + PRO100 + Não aceita cartão PRO100 + Union Card + Não aceita Union Card + MTS-Money + Não aceita cartão MTS-Money + Yandex.Money + Não aceita Yandex.Money + Detalhes de pagamento + Salão de eventos + Vegetariano + Dieta vegetariana (alguns) + Apenas vegetariana + Vegetariana + Dieta vegetariana: não + Vegano + Apenas vegana + Vegana + Dieta vegana: não + Livre de glúten + Apenas livre de glúten + Livre de glúten + Dieta livre de glúten: não + Kosher + Apenas kosher + kosher + Dieta kosher: não + Halal + Apenas halal + Halal + Dieta halal: não + Livre de lactose + Apenas livre de lactose + Livre de lactose + Dieta livre de lactose: não + Piscitariana + Sim + Drive-in: não + Sim + Drive-thru: não + Nome da cervejaria + Sim + Sem microcervejaria + Sim + Para viagem + Sem para viagem + Apenas para viagem + Sim + Entrega + Sem entrega + Apenas entrega + Sim + Lugar ao ar livre: sim + Sem lugar ao ar livre + Lugar ao ar livre: terraço + Lugar ao ar livre: calçada + Lugar ao ar livre: calçadão + Lugar ao ar livre: jardim + Lugar ao ar livre: pátio + Sim + Artigos de segunda mão + Sem artigos de segunda mão + Apenas artigos de segunda mão + Peças + Representante + Retífica + Sem retífica + Retífica de veículos elétricos + Retífica de motos + Sim + Sem autoatendimento + Sim + Não automatizado + Serviço completo + Sim + Sem escova: não + Lavação de carro: não + Banho público + Masculino + Proibido para homens + Feminino + Proibido para mulheres + Interno + Ao ar livre + Sim + Sem banheiros + Acesso aos banheiros para cadeirantes: sim + Acesso aos banheiros para cadeirantes: não + Acesso aos banheiros: clientes + Acesso aos banheiros: permitido + Acesso aos banheiros: comunidade + Acesso aos banheiros: público + Fraldário + Com trocador de fralda + Sem trocador de fralda + Sala para trocar fralda + Limite de tempo de estacionamento + Bilhetes de estacionamento + Cigarros + Sacos para excremento + Bilhetes de transporte público + Bebidas + Doces + Retirada de encomenda e correspondência + Preservativos + Selos + Câmaras de ar para bicicleta + Comida + Bebidas e comida + Venda de combustível + Retirada de encomenda + Estação de correios + Leite + Moeda alongada + Pão + Gomas de mascar + Bilhetes de estacionamento; bilhetes de transportes públicos + Café + Bilhete de pedágio + Venda de bilhetes + Venda de água + Cartão telefônico + Comida para animais + Mapas de transporte público + Bebidas e doces + Comprovante + DVD + Velas + Brinquedos + Sorvete + Cartão SIM + Seção + Memorial de guerra + Placa comemorativa + Estátua + Pedra + Estela + Busto + Koshinto + Placa azul + Jizo + Cruzeiro + Veículo + Stolpersteine + Obelisco + Coluna + Estupa + Prasat + Decoração de fachada + Inscrição + Pedreira histórica + Agregado + Antimônio + Amianto + Barita + Basalto + Bauxita + Berilo + Bismuto + Cromita + Argila + Carvão + Cobre + Diamante + Rocha ornamental + Dolomita + Gás + Ouro + Grafite + Brita + Gesso + Minério de ferro + Chumbo + Linhite + Pedra calcária + Mármore + Mercúrio + Mica + Óleo mineral + Níquel + Petróleo + Opala + Turfa + Platina + Rádio + Rubi + Rutilo + Sal + Areia + Arenito + Sílica + Prata + Ardósia; minério de ferro; cobre + Ardósia + Pedra + Estanho + Tufa + Urânio + Vanádio + Água + Zinco + Zircão + Prado úmido + Pântano + Charco + Canavial + Brejo + Salina + Planície de maré + Pântano salgado + Mangue + Cadeia de pântanos + Pântano subeterrâneo + Pântano palsa + Lama + Areia + Cascalho + Rocha + Chaminé + Palmeira + Cipreste + Mastro de bandeira + Sim + Sem assento + Com lixeira + Sem lixeira + Transporte público + Piquenique + Contra intempéries + Alpendre + Cabana básica + Edifício + Esconderijo para observar vida silvestre + Rocha + Abrigo do sol + Abrigo de campo + Tipo de abrigo: tenda + Tipo de abrigo: abandonado + Wi-Fi + Por terminal + Por cabo + Tipo de acesso à Internet: público + Tipo de acesso à Internet: serviço + Sem acesso à Internet + Com acesso à Internet + Largura máxima + Código IATA + Código ICAO + Código FAA + Tipo de obra de arte: escultura + Tipo de obra de arte: estátua + Tipo de obra de arte: mural + Tipo de obra de arte: arquitetura + Tipo de obra de arte: pintura + Tipo de obra de arte: pedra + Tipo de obra de arte: busto + Tipo de obra de arte: instalação + Tipo de obra de arte: mosaico + Tipo de obra de arte: relevo + Tipo de obra de arte: grafite + Tipo de obra de arte: estela + Tipo de obra de arte: fonte + Largura + Arquiteto + Arquitetura: moderna + Arquitetura: neoclassicismo stalinista + Arquitetura: eclética + Arquitetura: nova objetividade + Arquitetura: contemporâneo + Arquitetura: construtivismo + Arquitetura: enxaimel + Arquitetura: art nouveau + Arquitetura: neoclassicismo + Arquitetura: vitoriana + Arquitetura: brutalista + Arquitetura: classicismo + Arquitetura: gótica + Arquitetura: russa antiga + Arquitetura: barroca + Arquitetura: pós-construtivismo + Arquitetura: estilo guilhermina + Arquitetura: renascentista + Arquitetura: românica + Túnel fluvial + Túnel rodoviário + Túnel para pedestre + Túnel ferroviário + Ponte rodoviária + Ponte para pedestre + Ponte para ciclista + Ponte ferroviária + Ponte fluvial + Estrutura de ponte: viga + Estrutura de ponte: suspensão simples + Estrutura de ponte: suspensão + Estrutura de ponte: arco + Estrutura de ponte: treliça + Estrutura de ponte: flutuante + Estrutura de ponte: corcunda + Estrutura de ponte: estaiada + Estrutura de ponte: passarela + Estrutura de ponte: madeira simples + Estrutura de ponte: viaduto + Estrutura de ponte: aqueduto + Estrutura de ponte: tronco + Tipo de ponte: móvel + Tipo de ponte móvel: basculante + Tipo de ponte móvel: giratória + Tipo de ponte móvel: elevatória + Tipo de ponte móvel: ponte levadiça + Tipo de ponte móvel: submersível + Tipo de ponte móvel: transportadora + Tipo de ponte móvel: retrátil + Iluminado: sim + Iluminado: não + Superfície: não pavimentada + Superfície: pavimentada + Superfície: asfalto + Superfície: concreto + Superfície: paralelepípedo + Superfície: piso de seixos + Superfície: piso intertravado + Superfície: cascalho + Superfície: pedra + Superfície: metal + Superfície: madeira + Superfície: brita + Superfície: brita fina + Superfície: solo compactado + Superfície: areia + Superfície: grama + Superfície: piso grama + Superfície: chão + Superfície: terra + Superfície: lama + Superfície: gelo + Superfície: sal + Superfície: neve + Ônibus + Táxi compartilhado + Trólebus + Bonde + Trem + Veículo leve sobre trilhos + Monotrilho + Funicular + Balsa + Metrô + Rota ferroviária + Objeto histórico + Vigilância: sim + Com loja + Varejo + Venda de bicicletas: não + Reparação + Conserto de bicicletas: não + Varejo + Aluguel de bicicletas: não + Bomba + Bomba de bicicleta: não + Ferramentas para reparação própria + Ferramentas para reparação de bicicleta DIY: não + Limpeza + Limpeza de bicicletas: não + Chaintool + Ferramenta para correia de bicicleta: não + Venda de bicicletas de segunda mão + Venda de bicicletas de segunda mão: não + Cobrança: sim + Cobrança: não + Estação de auto-reparo de bicicletas + Observatório de vida selvagem + Treinamento: idioma + Treinamento: música + Treinamento: dança + Treinamento: esporte + Treinamento: arte + Treinamento: cozinhar + Treinamento: computação + Treinamento: ioga + Treinamento: arte marcial + Treinamento: aviação + Treinamento: cabeleireiro + Monumento + Tipo: indústria petroleira + Tipo: poço + Tipo: fábrica + Tipo: indústria de gás + Tipo: madeira + Tipo: refinaria + Tipo: armazém + Tipo: guincho de veículos + Tipo: agricultura + Tipo: cervejaria + Tipo: olaria + Tipo: terminal de cargas intermodal + Tipo: serraria + Tipo: purificação de água + Tipo: porto + Tipo: depósito + Nota + Balneário + Embarque de animais + Tipo de embarque: cão + Tipo de embarque: gato + Tipo de embarque: cão, gato + Tipo de embarque: cavalo + Avião histórico + Com elevador + Sem elevador + Monumento técnico + Escritório de campismo + Aeródromo de modelos + Escritório do guia + Organização Governamental quase Autônoma + Escritório de consultoria + Escritório de cooperativa + Escritório de silvicultura + Escritório de logística + Secretaria paroquial + Escritório de publicidade + Combustível 91UL + Combustível 100LL + Autogás (GPL) + Combustível Jet A-1 + Combustível AdBlue + Combustível: madeira + Combustível: carvão vegetal + Combustível: carvão + Lâmpada de rua + Área de escape + Cultivo: arroz + Cultivo: grama + Cultivo: milho + Cultivo: cereais + Cultivo: cana de açúcar + Cultivo: trigo + Cultivo: soja + Cultivo: cevada + Cultivo: legumes + Cultivo: lúpulo + Cultivo: colza + Cultivo: beterraba + Cultivo: lavanda + Cultivo: chá + Cultivo: café + Cultivo: avícola + Cultivo: girassol + Cultivo: framboesa + Cultivo: tabaco + Cultivo: morango + Cultivo: legumes, flores + Cultivo: mandioca + Cultivo: amora + Cultivo: aspargo + Cultivo: flores + Vigilância: interior + Vigilância: exterior + Vigilância: público + Femininas + Roupa íntima + Masculinas + Vestidos de noiva + Esportivas + Bebês + Jeans + Vestuário de trabalho + Chapéus + Peles + Couro + Trajes + Tradicionais + Ternos + Maternidade + Vintage + Tamanho grande + Escolar + Roupas de banho + Meias + Camisas + Dança + Militares + Marco histórico + Crianças + femininos + esportivos + Masculinos + Ortopédicos + Mansão histórica + Tipo de castelo: majestoso + Tipo de castelo: defensivo + Tipo de castelo: fortaleza + Tipo de castelo: palácio + Tipo de castelo: kremlin + Tipo de castelo: defensivo, majestoso + Tipo de castelo: castra + Tipo de castelo: shiro + Tailandesa + Sexual + Chinesa + Terapêutica + Serviços de massagem + Serviços de sauna + Serviços de solário + Permitidas + Tendas não permitidas + Fogueira permitida + Fogueira proibida + Sim + Não + Sim + Não + Apenas grupos: sim + Apenas grupos: não + Sim + Máquina de lavar roupa: não + Sim + Chuveiro: sim + Chuveiro: não + Chuveiro: quente + Chuveiro: exterior + Chuveiro: frio + Chuveiro: interior + Sim + Caravanas: não + Improvisado: sim + Improvisado: não + Estação de descarga sanitária: sim + Estação de descarga sanitária: não + Sim + Fonte de energia: não + Fonte de energia (tomada): CEE 17 azul + Fonte de energia (tomada): CEE 7/4 + Fonte de energia (tomada): CEE 7/5 + Fonte de energia (tomada): NEMA 5-15 + Máximo de tendas + Máximo de caravanas + Permitido cães + Proibido cães + Serviços para refugiados + Refugiados: não + Moradia assistida + Assistência domiciliar + Alcance + Banco de alimentos + Abrigo + Assistência ambulatorial + Emprego protegido + Berçário + Idosos + Crianças + Órfãos + Deficientes + Pacientes com transtornos mentais + Jovens + Desabrigados + Migrantes + Desfavorecidos + Dependentes químicos + Desempregados + Portadores de doenças + Crianças e jovens + Filarmônica + Musical + Drama + Ópera + Cabaré + Fantoche + Comédia + Música de câmara + Marionete + Balé + Jogo de sombras + Coreto + Forno + Produto: tijolo + Produto: cal viva + Produto: couro + Produto: cal + Produto: cerveja + Produto: carvão vegetal + Produto: carne + Descrição para usuários cadeirantes + Descrição para cegos + Descrição para surdos + Escadas + Corrimão: sim + Corrimão: não + Rampa: sim + Rampa: não + Rampa para cadeirantes: sim + Rampa para cadeirantes: não + Rampa para rodas: sim + Rampa para rodas: não + Rampa para bicicletas: sim + Rampa para bicicletas: não + Rampa para bagagem: sim + Rampa para bagagem: não + Quantidade de degraus + Condição dos degraus: regular + Condição dos degraus: irregular + Condição dos degraus: acidentada + Moledro + Desfibrilador + Desfibrilador: sim + Tipo: túmulo de guerra + Tipo: túmulo + Tipo: escavação em rocha + Tipo: hipogeu + Tipo: catacumba + Tipo: columbário + Tipo: mausoléu + Tipo: sarcófago + Tipo: cripta + Tipo: pirâmide + Civilização: roma antiga (753 a.C. – 284 d.C.) + Civilização: nuráguica (XVIII a.C. – II d.C.) + Civilização: etrusca (XII – VI a.C.) + Civilização: pré-histórica + Civilização: grega antiga + Civilização: romana + Civilização: bizantina (285 d.C. – 1453 d.C.) + Civilização: imperial chinês (221 a.C. – 1911 d.C.) + Civilização: egípcia antiga (até 332 a.C.) + Civilização: celta + Civilização: romana ocidental (285 d.C – 476 d.C.) + Civilização: micênica + Civilização: dácios + Civilização: hérnicos + Civilização: grego-egípcia (332 a.C. – 30 a.C.) + Civilização: romana e egípcio bizantina + Civilização: heládica + Civilização: cíclades + Civilização: minóica + Civilization: tiahuanaco + Treinamento animal + Canino + Equino + Permitido cavalos + Proibido cavalos + Permitido animais + Proibido animais + Período histórico: nuráguico + Período histórico: idade da pedra / idade do bronze (indeterminado) + Período histórico: idade do bronze + Período histórico: principado (27 a.C. – 284 d.C.) + Período histórico: Grécia clássica (V – IV a.C.) + Período histórico: Grécia arcaica + Período histórico: idade do ferro + Período histórico: República romana (508 – 27 a.C.) + Período histórico: Grécia helenística + Período histórico: império novo (1550 – 1069 a.C.) + Período histórico: império médio (2055 – 1650 a.C.) + Período histórico: Egito pré-dinástico + Período histórico: período arcaico (3100 – 2686 a.C.) + Período histórico: império antigo (2686 – 2181 a.C.) + Período histórico: primeiro período intermediário (2181 – 2055 a.C.) + Período histórico: segundo período intermediário (1650 – 1550 a.C.) + Período histórico: terceiro período intermediário (1069 – 664 a.C.) + Período histórico: primeiro período persa + Período histórico: último período (664 – 332 a.C.) + Período histórico: segundo período persa + Período histórico: Alexandre, o Grande + Período histórico: Egito ptolemaico (305 – 30 a.C.) + Período histórico: Egito cristão + Período histórico: Egito bizantino (30 a.C. – 641 d.C.) + Período histórico: ocupação persa + Período histórico: período homérico (1100 – 800 a.C.) + Período histórico: Roma Grécia (146 a.C. – 330 d.C.) + Período histórico: Império Romano (753 – 509 a.C.) + Período histórico: dominato (285 – 476 d.C.) + Período histórico: aldeão (época I e II, 1580 a.C. – 133 d.C.) + Período histórico: urbano (época III, 133 – 374 d.C.) + Período histórico: clássico (época IV, 374 – 900 d.C.) + Período histórico: imperial (época V, 900 – 1200 d.C.) + Era histórica: paleolítico (2,6 milhões de anos – 10000 AP) + Era histórica: mesolítico + Era histórica: neolítico + Era histórica: idade do cobre (milênios IV-III a.C.) + Pedra histórica + Tipo: cruz de conciliação + Tipo: brasão + Material: madeira + Material: metal + Material: concreto armado + Material: concreto + Material: aço + Material: pedra + Material: alvenaria + Material: tijolo + Material: plástico + Material: arenito + Material: pedra de granito + Material: metal, madeira + Material: vidro + Material: bronze + Material: terra + Material: composto + Material: calcário + Material: mármore + Material: alumínio + Megálito + Túmulo + Fortificação + Assentamento + Cidade + Círculo de cabana + Necrópole + Petróglifo + Obra na terra + Tipo de megálito: menir + Tipo de megálito: dólmen + Tipo de megálito: nurague + Tipo de megálito: círculo de pedras + Tipo de megálito: tumba de passagem + Tipo de fortificação: colina + Tipo de fortificação: limes + Tipo de fortificação: arandela + Tipo de fortificação: vala circular + Pa (assentamento fortificado maori) + Fazenda histórica + Estação ferroviária histórica + Eira histórica + Forca histórica + Ferrovia histórica + Praça + Artista + Escultor + Tipo de edificação: igreja + Tipo de edificação: capela + Tipo de edificação: mesquita + Tipo de edificação: templo + Tipo de edificação: catedral + Tipo de edificação: mosteiro + Tipo de edificação: basílica + Tipo de edificação: sinagoga + Tipo de edificação: santuário + Cruz + Cruz de cimeira: sim + Antigo campo de detenção + Tipo: campo de concentração + Tipo: campo de prisioneiros de guerra + Tipo: campo de trabalho + Tipo: nazi + Tipo: gulag + Temperatura + Banho: sim + Banho: não + Armazenamento de barco + Transporte: Sim + Ponte ref + Ref. do túnel + Referência + Passageiros + Veículos + Bicicletas + Contêineres + Veículos pesados + Academia ao ar livre + Hackerspace + Conserto de eletrônicos + Loja de fogos de artifício + Comprimento + Clínica geral + Oftalmologia + Ginecologia + Medicina interna + Ortopedia + Otorrinolaringologia + Pediatria + Especialidade médica: sem pediatria + Dermatologia + Urologia + Cirurgia geral + Radiologia + Radioterapia + Psiquiatria + Neurologia + Dermatovenereología + Cardiologia + Traumatologia + Bioclínica + Osteopatia + Anestesia + Pneumologia + Cirurgia dental, oral e maxilofacial + Maternidade + Emergência e urgência + Sem emergência e urgência + Cirurgia plástica + Ortodontia + Fisioterapia + Bioquímica + Terapia ocupacional + Psiquiatria infantil + Fisiatria + Cirurgia maxilofacial + Radiologia diagnóstica + Gastroenterologia + Odontologia + Nefrologia (doenças renais) + Neurocirurgia + Neuropsiquiatria + Endocrinologia + Medicina nuclear + Anatomia patológica + Oncologia + Medicina tropical + Sem medicina tropical + Obstetrícia (pós-natal) + Sem obstetrícia (pós-natal) + Obstetrícia (pré-natal) + Sem obstetrícia (pré-natal) + Pediatria social + Sem pediatria social + Obstetrícia (cesariana) + Sem obstetrícia (cesariana) + Toxicologia clínica + Optometria + Patologia clínica + Fonoaudiologia + Terapia manual + Medicina esportiva + Podologia + Psiquiatria adulta + Acupuntura + Homeopatia + Medicina tradicional chinesa + Reiki + Fitoterapia + Quiropraxia + Naturopatia + Psicologia profunda + Comportamental + Medicina paliativa + Tipo de edificação: pirâmide + Academia + Exercício físico + Bilhar + Forno microondas: sim + Forno microondas: não + Aquecedor de água: sim + Aquecedor de água: não + Tipo: superficial + Box de garagem + Cobertura de veículos + Dojô + Jogos gaélicos + Corrida + Netball + Kartismo + Badminton + Judô + Golfe de disco + Futsal + Corrida de carrinho de controle remoto + Squash + Shuffleboard + Lacrosse + Pugilismo + Nome oficial + Dique + Pôster: compartimento florestal + Pôster: loteamento florestal + Inscrição: N + Inscrição: NO + Inscrição: O + Inscrição: SO + Inscrição: S + Inscrição: SE + Inscrição: E + Inscrição: NE + Em construção + Caixa eletrônico: não + Pira + Gabinete de rua + Comércio justo: sim + Comércio justo: não + Somento produtos de comércio justo + Bandy + Área protegida + Tipo de proteção + Objeto de proteção: histórico + Objeto de proteção: natureza + Objeto de proteção: habitat + Objeto de proteção: água + Explosão: país + Explosão: local + Tipo de explosão: subterrânea, escavação + Tipo de explosão: subterrânea, túnel + Tipo de explosão: atmosférica + Tipo de explosão: atmosférica, lançamento aéreo + Tipo de explosão: atmosférica, superfície, torre + Tipo de explosão: atmosférica, balão + Tipo de explosão: atmosférica, superfície + Tipo de explosão: atmosférica, superfície d\'água, barca + Tipo de explosão: subterrânea + Tipo de explosão: erupção de cratera (subsolo raso) + Tipo de explosão: atmosférica, foguete ou míssil + Tipo de explosão: espacial (mais de 80 km de altitude) + Tipo de explosão: subaquática + Data da explosão (UTC) + Nome do disparo (en) + Série de explosões + Propósito da explosão: relacionado com armas nucleares + Propósito da explosão: efeito das armas + Propósito da explosão: experimento de segurança + Propósito da explosão: investigação para aplicações pacíficas + Propósito da explosão: ciência básica + Propósito da explosão: aplicação industrial, escavação de cavidade + Propósito da explosão: aplicação industrial, sondagem sísmica + Propósito da explosão: aplicação industrial, estimulação de petróleo + Propósito da explosão: aplicação industrial + Propósito da explosão: aplicação industrial, movimentação de terra + Hora da explosão (UTC) + Produto da explosão + Buraco da explosão + Altura da erupção + Altitude do marco zero + Magnitude da conda do corpo + Salva de explosão: primeira detonação de um teste de salva + Salva de explosão: segunda ou posterior detonação de um teste de salva + Explosão: diâmetro de cratera + Explosão: ogiva + Explosão: dispositivo + Complemento + Viveiro de plantas + Sim + Ar comprimido: não + Sim + Sim + Aspirador de pó: não + Aspirador de pó + Voo livre (esporte) + Torneira de água + Operado por botões: sim + Operado por botões: não + Decolagem + Pouso + Pouso elevado + Reboque + Treinamento + Oficial: sim + Oficial: não + Parapente + Parapente: não + Asa-delta + Asa-delta: não + Rígido + Asa-delta rígida: não + Orientação do local para voo livre: N + Orientação do local para voo livre: NE + Orientação do local para voo livre: E + Orientação do local para voo livre: SE + Orientação do local para voo livre: S + Orientação do local para voo livre: SW + Orientação do local para voo livre: W + Orientação do local para voo livre: NW + Sem tempo de voo (voo livre) + Diretrizes para convidados: sim + Diretrizes para convidados: não + Solário + Estação de descarga sanitária + Ocidental + Chinês tradicional + Ayurveda + Kampo + Mongol tradicional + Tibetano tradicional + Sidda + Unani + Serviço de saúde: enfermagem: sim + Serviço de saúde: enfermagem: não + Serviço de saúde: aconselhamento: sim + Serviço de saúde: aconselhamento: não + Serviço de saúde: exame: sim + Serviço de saúde: exame: não + Serviço de saúde: cuidados infantis: sim + Serviço de saúde: cuidados infantis: não + Serviço de saúde: prevenção: sim + Serviço de saúde: prevenção: não + Serviço de saúde: vacinação: sim + Serviço de saúde: vacinação: não + Serviço de saúde: apoio: sim + Serviço de saúde: apoio: não + Serviço de saúde: teste: sim + Serviço de saúde: teste: não + Consultório médico + Tipo de instalação de saúde: hospital de campanha + Tipo de instalação de saúde: centro de aconselhamento + Tipo de instalação de saúde: laboratório + Tipo de instalação de saúde: terapia + Tipo de instalação de saúde: departamento + Tipo de instalação de saúde: farmácia + Tipo de instalação de saúde: primeiros socorros + Tipo de instalação de saúde: lar de idosos + Tipo de instalação de saúde: casa de grupo de apoio + Ponto de sucção + Subterrâneo + Coluna + Coluna seca + Lagoa + Parede + Kit de primeiros socorros + Balanças públicas + Função do profissional de saúde: assistente + Função do profissional de saúde: curandeiro + Função do profissional de saúde: parteira + Função do profissional de saúde: enfermeiro + Função do profissional de saúde: paramédico + Função do profissional de saúde: médico + Função do profissional de saúde: podologista + Função do profissional de saúde: psicólogo + Função do profissional de saúde: terapeuta + Função do profissional de saúde: médico assistente + Função do profissional de saúde: técnico + Função do profissional de saúde: bruxo + Aconselhamento (vício): sim + Aconselhamento (vício): não + Aconselhamento (pré-natal): sim + Aconselhamento (pré-natal): não + Aconselhamento (orientação infantil): sim + Aconselhamento (orientação infantil): não + Aconselhamento (casal): sim + Aconselhamento (casal): não + Aconselhamento (crise): sim + Aconselhamento (crise): não + Aconselhamento (drogas): sim + Aconselhamento (drogas): não + Aconselhamento (educação): sim + Aconselhamento (educação): não + Aconselhamento (família): sim + Aconselhamento (família): não + Aconselhamento (sem-teto): sim + Aconselhamento (sem-teto): não + Aconselhamento (imigrante): sim + Aconselhamento (imigrante): não + Aconselhamento (casamento): sim + Aconselhamento (casamento): não + Aconselhamento (nutrição): sim + Aconselhamento (nutrição): não + Aconselhamento (reabilitação): sim + Aconselhamento (reabilitação): não + Aconselhamento (sexual): sim + Aconselhamento (sexual): não + Aconselhamento (abuso sexual): sim + Aconselhamento (abuso sexual): não + Aconselhamento (vítima): sim + Aconselhamento (vítima): não + Aconselhamento (violência): sim + Aconselhamento (violência): não + Para bebês: sim + Para bebês: não + Para crianças pequenas: sim + Para crianças pequenas: não + Para crianças: sim + Para crianças: não + Para adultos: sim + Para adultos: não + Para mulheres: sim + Para mulheres: não + Para idosos: sim + Para idosos: não + Para meninas: sim + Para meninas: não + Para homens: sim + Para homens: não + Para meninos: sim + Para meninos: não + Capacidade (leitos) + Serviços de internamento: sim + Serviços de internamento: não + Serviços de internamento: somente + Aconselhamento: sim + Aconselhamento: não + sim + não + Sim + Visita domiciliar: não + Malária: sim + Malária: não + Ebola: sim + Ebola: não + Autismo: sim + Autismo: não + AIDS: sim + AIDS: não + Consultório médico + Escritório de terapeuta + Escritório de podologista + Escritório de curandeiro + Escritório de psicólogo + Serviço de enfermagem + Escritório de parteira + Diâmetro do hidrante + Pressão do hidrante + Número de hidrantes + Capacidade de vazão do hidrante + Calçada + Verde + Faixa de rolamento + Estacionamento + Rua + Subterrâneo + Estilo de hidrante: wsh + Rede de água + Lagoa + Ribeirão/Rio + Cisterna + Em serviço: sim + Tipo de gabinete: força + Tipo de gabinete: telecom + Tipo de gabinete: TV a cabo + Tipo de gabinete: gás + Tipo de gabinete: serviço postal + Tipo de gabinete: lixo + Tipo de gabinete: gestão de água + Tipo de gabinete: iluminação pública + Checkpoint militar + Armários + Suspenso + De roda + Profundidade + Sal + Sal: não + Designado + Rejeito de mineração + Acampamento de verão + Centro de recreação + Ativação do cruzamento: automático + Ativação do cruzamento: local + Ativação do cruzamento: remoto + Barreira do cruzamento: não + Barreira de cruzamento + Barreira do cruzamento: total + Barreira do cruzamento: metade + Barreira do cruzamento: dupla metade + Sinal sonoro + Sinal sonoro: não + Sinal luminoso + Sinal luminoso: não + Cruzamento sob demanda + Cruzamento sob demanda: não + Cruz de Santo André + Cruz de Santo André: não + Supervisão de cruzamento + Supervisão de cruzamento: não + Supervisão de cruzamento: atendente + Supervisão de cruzamento: câmera + Sim + Emite receitas: não + Internacional + Regional + Público + Militar + Militar/público + Privado + Pequeno vale + Poço de ventilação + Tipo de bomba: bomba de vareta + Tipo de bomba: Índia Mk II ou III> + Tipo de bomba: gravidade + Estilo de bomba: moderno + Estilo de bomba: histórico + Status da bomba: ok + Status da bomba: quebrado + Status da bomba: bloqueado + Troika + Cartão Troika não aceito + Telescópio + Óptico + Rádio + Gama + Diâmetro + Espectro + Uso: educação + Uso: espionagem + Uso: pesquisa + Uso: espionagem + Meteorológico + Gravitacional + Horticultura em estufa + Voltagem + Saída de energia + Saída: eletricidade + Potência de saída de água quente + Saída: água quente + Saída: vapor + Saída: ar quente + Saída: água fria + Potência de saída de ar comprimido + Saída: ar comprimido + Saída: vácuo + Potência de saída do biogás + Saída: biogás + Estação de bombeamento + Display: sim + Display: não + Display analógico + Display digital + Relógio de sol + Barômetro + Barômetro: não + Termômetro + Termômetro: não + Higrômetro + Higrômetro: não + Exibição de data + Exibição de data: não + Suporte: poste + Suporte: parede + Suporte: árvore + Suporte: pedestal + Suporte: de chão + Suporte: outdoor + Suporte: teto + Suporte: suspenso + Suporte: telhado + Suporte: torre + Exibição de informação ao passageiro: sim + Exibição de informação ao passageiro: não + Aquicultura + Aquicultura: camarão + Aquicultura: peixes + Aquicultura: mexilhões + Quadro de distribuição principal + Idade mínima + Sim + Não + Somente + Espelho de tráfego + Consulado + Consulado Geral + Consulado Honorário + Missão permanente + Delegação + Residência do embaixador + Alto comissariado + Operador do corpo de bombeiros + Tanque de água + Eliminação de dejetos: descarga + Eliminação de dejetos: latrina por poço + Eliminação de dejetos: químico + Eliminação de dejetos: balde + Comprimento + Wikipedia + Natal + Evento natalino + Mercado natalino + Pirâmide de Natal + Loja de Natal + Loja de árvores de Natal + Árvore de Natal + Natal: período para o evento + Natal: nota + Natal: horário de abertura + Natal: localização + Natal: site + Estante pública + Tipo: cabine telefônica + Tipo: caixa de leitura + Tipo: gabinete de madeira + Tipo: gabinete de metal + Tipo: prateleira + Cozinha + Pizza + Hambúrguer + Café + Sanduíche + Kebab + Döner kebab (shawarma) + Frango + Sorvete + Sushi + Peixes e fritas + Frutos do mar + Churrasco + Macarrão + Donut + Ramen + Crepe + Café da manhã + Gyudon + Bife + Tapas + Gastropub + Heuriger + Curry + Buschenschank + Grelhados + Bagel + Diner + Linguiças + Bolos + Panquecas + Massas + Fast-food + Sucos + Soba + Jantar fino + Chás + Loja de chás + Sopas + Tortas + Cachorro-quente + Delicatesse + Saladas + Iogurte gelado + Comida frita + Panquecas salgadas + Bistrô + Padaria + Cuscuz + Frango frito + Sobremesas + Cantina + Tacos + Piadina + Falafel + Smoothie + Souvlaki + Salgados + Iogurtes + Gyros + Empanadas + Crepes + Yakiniku + Suki + Udon + Brasserie + Chá de bolhas + Yakitori + Sagardotegia + Carnes + Asas + Waffles + Chocolate + Vinhos + Batatas + Brunch + Sandes + Pita + Fondue + Baguetes + Pastel + Burritos + Teriyaki + Xauarma + Local + Italiana + Chinês + Mexicana + Japonesa + Alemã + Indiana + Americana + Asiática + Francesa + Grega + Tailandesa + Internacional + Turca + Espanhola + Vietnamita + Coreana + Mediterrânea + Bávara + Libanesa + Russa + Filipina + Portuguesa + Georgiana + Polonesa + Brasileira + Árabe + Dinamarquesa + Indonésia + Africana + Caribenha + Argentina + Balcã + Peruana + Croata + Boliviana + Malgaxe + Persa + Marroquina + Austríaca + Malaia + Irlandesa + Etíope + Húngara + Laociana + Europeia + Uzbeque + Tcheca + Cubana + Britânica + Latino-americana + Nepalesa + Mongol + Oriente Médio + Ucraniana + Afegã + Belga + Basca + Suíça + Cantonesa + Sueca + Jamaicana + Armênia + Havaiana + Inglesa + Paquistanesa + Taiwanesa + Tex-mex + Holandesa + Síria + Australiana + Cajun + Egípcio + Senegalesa + Judaica + Búlgara + Tibetana + Lugar para alimentação de animais + Artigos de festas + Loja de materiais elétricos + Chaveiro + Luminárias + Casa lotérica + Local de jogos de azar + Tipo + Loteria + Pachinko + Caça-niqueis + Apostas + Bingo + Loja de cigarros eletrônicos + Locovotiva + Suplementos de nutrição + Estúdio de fotografia + Penhasco + Viveiro de animais + Viveiro de animais: cavalo + Viveiro de animais: ovelha + Tipo: cercado + Tipo: estábulo aberto + Construção: treliça + Construção: autônoma + Construção: parabólica + Construção: cúpula + Construção: escondido + Pátio ferroviário + Espaço de coworking + Sim + Vinho: sim + Vinho: varejo + Vinho servido + Escritório de fornecedor de energia + Reparo de eletrônicos: computadores + Reparo de eletrônicos: eletrodomésticos + Reparo de eletrônicos: telefone + Reparo de eletrônicos: TV + Acampamento de crianças + Escola de música + Escola de idiomas + Boia salva-vidas + Zoológico interativo + Reserva natural + Cativeiro + Parque safári + Aves + Aviário + Falcoaria + Répteis + Estandes + Vendas + Vendas: não + Vendas: sim; usado + Vendas: usado + Locação + Locação: não + Reparo + Reparo: não + Peças + Peças: não + Pneus + Pneus: não + Roupas para moto + Roupas para moto: não + Lambreta + Esportiva + Chopper + Off-road + Trail + Comum + Saída (eletricidade): não + Proprietário + Adoção: sim + Adoção: não + Soltura: sim + Soltura: não + Bases de lançamento + Direção: norte + Direção: norte-nordeste + Direção: nordeste + Direção: leste-nordeste + Direção: leste + Direção: leste-sudeste + Direção: sudeste + Direção: sul-sudeste + Direção: sul + Direção: sul-sudeste + Direção: sudoeste + Direção: oeste-sudoeste + Direção: oeste + Direção: oeste-noroeste + Direção: noroeste + Direção: norte-noroeste + Direção: para frente + Direção: para trás + Direção: sentido horário + Direção: sentido anti-horário + Direção: para cima + Direção: para baixo + Direção: entrada + Direção: saída + Direção: todas + Refúgio de inverno: sim + Refúgio de inverno: não + Reserva: requerida + Reserva: recomendada + Reserva: sim + Reserva: não + Reserva: somente membros + Leitos + Locação de barcos + Lanchas: sim + Lanchas: não + Casas-barco: sim + Casas-barco: não + Pedalinhos: sim + Pedalinhos: não + Jetskis: sim + Jetskis: não + Veleiros: sim + Veleiros: não + Bote: sim + Bote: não + Caiaques: sim + Caiaques: não + Canoa: sim + Canoa: não + Rede + Arquivo + Ministério + Serviço público + Seguridade social + Serviços sociais + Tesouro + Instituição de transporte + Instituição legislativa + Canal VHF + Desfiladeiro + Ravina + Área montanhosa + Argila + Tartan + Grama sintética + DecoTurf + Grelha metálica + Localização: subterrâneo + Localização: submerso + Localização: superficial + Localização: suspenso + Localização: teto + Localização: telhado + Localização: externo + Localização: interno + Localização: plataforma + Localização: quiosque + Localização: ponte + Localização: parede + Localização: entrada + Visibilidade: casa + Visibilidade: rua + Visibilidade: área + Aberto + Fechado + Restrito + Quebrado + Precisa de manutenção + Durabilidade do local com água: durável + Durabilidade do local com água: emergência + Nenhum + Cloro + Osmose reversa + Pastilha purificadora + Poço de água + Tubulação + Água corrente + Bomba + Poço artesiano + Caminhão pipa + Tanque de água + Água engarrafada + Comunidade + Família + Multifamília + Tomada: CEE azul + Tomada: CEE azul: corrente + Tomada: CEE azul: saída + Tomada: CEE vermelha 16A + Tomada: CEE vermelha 16A: corrente + Tomada: CEE vermelha 16A: saída + Tomada: CEE vermelha 32A + Tomada: CEE vermelha 32A: corrente + Tomada: CEE vermelha 32A: saída + Tomada: CEE vermelha 64A + Tomada: CEE vermelha 64A: corrente + Tomada: CEE vermelha 64A: saída + Tomada: CEE vermelha 125A + Tomada: CEE vermelha 125A: corrente + Tomada: CEE vermelha 125A: saída + Tomada: Tipo 1 + Tomada: Tipo 1: corrente + Tomada: Tipo 1: saída + Tomada: Tipo 1 combo + Tomada: Tipo 1 combo: corrente + Tomada: Tipo 1 combo: saída + Tomada: Tipo 2 + Tomada: Tipo 2: corrente + Tomada: Tipo 2: saída + Tomada: Tipo 2 combo + Tomada: Tipo 2 combo: corrente + Tomada: Tipo 2 combo: saída + Tomada: Tipo 3 + Tomada: Tipo 3: corrente + Tomada: Tipo 3: saída + Tomada: CHAdeMO + Tomada: CHAdeMO: corrente + Tomada: CHAdeMO: saída + Tomada: Padrão Tesla + Tomada: Padrão Tesla: corrente + Tomada: Padrão Tesla: saída + Tomada: Tesla Supercharger + Tomada: Tesla Supercharger: corrente + Tomada: Tesla Supercharger: saída + Tomada: Tesla Roadster + Tomada: Tesla Roadster: corrente + Tomada: Tesla Roadster: saída + Tomada: NEMA 5-15R + Tomada: NEMA 5-15R: corrente + Tomada: NEMA 5-15R: saída + Tomada: NEMA 5-20 + Tomada: NEMA 5-20: corrente + Tomada: NEMA 5-20: saída + Tomada: NEMA 14-30 + Tomada: NEMA 14-30: corrente + Tomada: NEMA 14-30: saída + Tomada: NEMA 14-50 + Tomada: NEMA 14-50: corrente + Tomada: NEMA 14-50: saída + Tomada: Schuko + Tomada: Schuko: corrente + Tomada: Schuko: saída + Tomada: BS 1363 + Tomada: BS 1363: corrente + Tomada: BS 1363: saída + Tomada: AS/NZS 3112 + Tomada: AS/NZS 3112: corrente + Tomada: AS/NZS 3112: saída + Carro: sim + Carro: não + Bicicleta: sim + Bicicleta: não + Scooter: sim + Scooter: não + Caminhão: sim + Caminhão: não + Taxa de estacionamento: sim + Taxa de estacionamento: não + Taxa de estacionamento + Amperagem + Saída do eletroposto + Tipo de mapa: topo + Tipo de mapa: rua + Tipo de mapa: esquema + Tipo de mapa: toposcópio + Cobertura do mapa: local + Cobertura do mapa: cidade + Cobertura do mapa: região + Eletroposto + Depósito + Caixa postal + Rua + Número da casa + Apartamento + Centro de pagamento + Transferência de dinheiro + CEP + Esporte: sim + Esporte: não + Bouldering: sim + Bouldering: não + Top-rope: sim + Top-rope: não + Tradicional: sim + Tradicional: não + Rotas multi-pitch: sim + Rotas multi-pitch: não + Gelo: sim + Gelo: não + Misto: sim + Misto: não + Psicobloc: sim + Psicobloc: não + Comprimento de escalada + Comprimento mín. de escalada + Comprimento máx. de escalada + Rocha de escalada: calcário + Rocha de escalada: granito + Rocha de escalada: arenito + Rocha de escalada: quartzito + Rocha de escalada: gnaisse + Rocha de escalada: pórfiro + Qualidade de escalada: sólido + Qualidade de escalada: frágil + Âncoras fixas: sim + Âncoras fixas: não + Orientação da parede: N + Orientação da parede: NL + Orientação da parede: L + Orientação da parede: SL + Orientação da parede: S + Orientação da parede: SO + Orientação da parede: O + Orientação da parede: NO + Registro de escalada no cume: sim + Registro de escalada no cume: não + Rotas de escalada + Circunferência + Diâmetro da copa + Tipo: agrícola + Tipo: perpétuo + Tipo: transição + Tipo: pastagem + Alimentos congelados + Loja de produtos agrícolas + Loja de lareiras + Loja de barcos + Loja de canábis + CEE azul + CEE vermelha 16A + CEE vermelha 32A + CEE vermelha 64A + CEE vermelha 125A + Tipo 1 + Tipo 1 combo + Tipo 2 + Tipo 2 combo + Tipo 3 + CHAdeMO + Padrão Tesla + Tesla Supercharger + Tesla Roadster + NEMA 5-15R + NEMA 5-20 + NEMA 14-30 + NEMA 14-50 + Schuko + BS 1363 + AS/NZS 3112 + Alta + Média + Baixa + Alta + Média + Baixa + Alta + Média + Baixa + Alta + Média + Baixo + Alto + Média + Baixa + Alta + Média + Baixa + Loja de revestimentos + Oleiro + Nome das corredeiras + Ponto de entrega da loja + Grelha de churrasco: sim + Companhia de água + Fliperama + Centro de jogos para adultos + Reparos automotivos + Troca de óleo + Venda de carros usados + Freios + Venda de carros novos + Diagnósticos + Peças automotivas + Baterias + Ar condicionado + Funilaria + Autoelétrico + Rodas + Vidros + Reparo de caminhões + Silenciador + Alinhamento + Reparo de transmissão + Motor + Seguro + Pneus + Tirolesa + Aventura com escalada + Via ferrata + Número do cabo + Dificuldade + Calota glaciar + Campo de gelo + Planalto + Vale + Saída + Costeiro + Montanha + Suspenso + Regenerado + Rocha + Plataforma + Remanescente + Língua de gelo + Ponto culminante + Ponto mais baixo + Inclinação média + Checkpoint de caminhada + Ponto de carimbo + Código + Caderno + Needler + Eletrônico + Curso + Rocha + Data final + Loja de eletrodomésticos + Afloramento + Sem contato + Não aceita Contactless + Perigo + Perigo nuclear + Risco de erosão + Risco de avalanche + Via escorregadia + Risco de inundação + Campo minado + Ruínas + Categorias + Colina + Conserto de sapatos + Sim + Somente + Subestação de oleoduto + Transmissão + Distribuição + Distribuição menor + Industrial + Transição + Tração + Conversor + Compensação + Compressão + Medição + Válvula + Grupo de válvulas + Medidor de inspeção + Recolhimento de campo + Produção de confeitos + Loja de atacado + Laboratório médico + Doação de sangue + Quadrinho + Antiquário + Religião + Acadêmicos + Crianças + Atol + Portal de pedágio + Creche + Monumento natural + Ponto de referência + Sim + Trem + Ônibus + Metrô + Via para veículos com alta ocupação + Bonde + Balsa + Fonte de energia: biomassa + н/к + н/к* + + 1А* + 1B + 1B* + + 2А* + 2B + 2B* + + 3А* + 3B + 3B* + Explosão de gás;Queimador de gás + Objeto excluído + Caixa de resgate + Sim + \ No newline at end of file From 67804ba496836f8fad4fb0816454cf3488686f46 Mon Sep 17 00:00:00 2001 From: Vyacheslav Date: Sat, 20 Apr 2019 10:29:20 +0000 Subject: [PATCH 068/114] Translated using Weblate (Russian) Currently translated at 99.1% (213 of 215 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/ru/ --- OsmAnd-telegram/res/values-ru/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-ru/strings.xml b/OsmAnd-telegram/res/values-ru/strings.xml index bba535d2c2..b964f33197 100644 --- a/OsmAnd-telegram/res/values-ru/strings.xml +++ b/OsmAnd-telegram/res/values-ru/strings.xml @@ -211,4 +211,8 @@ Морские мили Мили/метры Хронология + Искать контакты + Поиск среди всех ваших групп и контактов. + Введите контакт или название группы + Поиск \ No newline at end of file From c839ff496216357a9dde100991e94231914a9157 Mon Sep 17 00:00:00 2001 From: Matej U Date: Fri, 19 Apr 2019 12:56:58 +0000 Subject: [PATCH 069/114] Translated using Weblate (Slovenian) Currently translated at 43.7% (94 of 215 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/sl/ --- OsmAnd-telegram/res/values-sl/strings.xml | 190 +++++++++++----------- 1 file changed, 97 insertions(+), 93 deletions(-) diff --git a/OsmAnd-telegram/res/values-sl/strings.xml b/OsmAnd-telegram/res/values-sl/strings.xml index 04b19258f8..9a8385f65d 100644 --- a/OsmAnd-telegram/res/values-sl/strings.xml +++ b/OsmAnd-telegram/res/values-sl/strings.xml @@ -1,93 +1,97 @@ - -Izberite ime, ki ga še niste uporabili - Naprava %1$s je uspešno dodana. - Dodaj - Ni mogoče dodati nove naprave - Ime nove naprave je omejeno z 200 znaki. - Ime naprave je predolgo - Ime naprave mora biti dodeljeno - Ime naprave - Skrij - ID naprave je mogoče ustvariti in pogledati v odjemalcu Telegram z uporabo klepetalnega robota %1$s. %2$s - Nazadnje zabeleženo mesto: - Podatki so uspešno poslani in posodobljeni. - Ni mogoče pošiljati klepetov Telegram: - Poteka čakanje na odziv programa Telegram - Pošiljanje podatkov o trenutnem mestu - Začenjanje - Poteka določevanje mesta … - Poteka vzpostavljanje povezave na internet - Skoči na nastavitve - Kasneje - Ni še poslano - Ni še najdeno - Ponovno pošiljanje trenutnega mesta - Zadnje določeno mesto - Objavljanje stanja - Objavljanje: omogočeno - Stanje - Ni povezave z GPS - Ni vzpostavljene internetne povezave - Onemogoči - Shrani - Dodaj napravo - Objavi trenutno mesto kot - Ali se želite odjaviti iz storitve OsmAnd Tracker\? - Ime - Po razdalji - Po imenu - Po skupini - Razvrsti - Razvrsti po - Izbor različice OsmAnd za uporabo - Onemogoči vse objavljanje - Izklopi vse - Končaj - Zadnji odziv - Skupina - Pred odjavo storitve Telegram je treba vzpostaviti internetno povezavo. - Zapri - Povezan račun - Račun - v %1$s - Pokaži na zemljevidu - OsmAnd Online GPS Tracker - Telefonska številka - Telefonska številka v mednarodnem zapisu - Geslo - Koda - Overitvena koda - Namesti program OsmAnd - Pokaži uporabnike na zemljevidu - Dejavni klepeti - Overitev - Telefonsko številko programa Telegram je treba vpisati v mednarodnem zapisu - Dobrodošli - - yd - ft - mi - km - m - nmi - min/m - min/km - nmi/h - m/s - km/h - mph - Kilometri na uro - Milje na uro - Metri na sekundo - Minute na kilometer - Minute na miljo - Navtične milje na uro (vozli) - Milje/Čevlji - Milje/Jardi - Kilometri/Metri - Navtične milje - Milje/Metri - h - min - sek - + + + Izberite ime, ki ga še niste uporabili + Naprava %1$s je uspešno dodana. + Dodaj + Ni mogoče dodati nove naprave + Ime nove naprave je omejeno z 200 znaki. + Ime naprave je predolgo + Ime naprave mora biti dodeljeno + Ime naprave + Skrij + ID naprave je mogoče ustvariti in pogledati v odjemalcu Telegram z uporabo klepetalnega robota %1$s. %2$s + Nazadnje zabeleženo mesto: + Podatki so uspešno poslani in posodobljeni. + Ni mogoče pošiljati klepetov Telegram: + Poteka čakanje na odziv programa Telegram + Pošiljanje podatkov o trenutnem mestu + Začenjanje + Poteka določevanje mesta … + Poteka vzpostavljanje povezave na internet + Skoči na nastavitve + Kasneje + Ni še poslano + Ni še najdeno + Ponovno pošiljanje trenutnega mesta + Zadnje določeno mesto + Objavljanje stanja + Objavljanje: omogočeno + Stanje + Ni povezave z GPS + Ni vzpostavljene internetne povezave + Onemogoči + Shrani + Dodaj napravo + Objavi trenutno mesto kot + Ali se želite odjaviti iz storitve OsmAnd Tracker\? + Ime + Po razdalji + Po imenu + Po skupini + Razvrsti + Razvrsti po + Izbor različice OsmAnd za uporabo + Onemogoči vse objavljanje + Izklopi vse + Končaj + Zadnji odziv + Skupina + Pred odjavo storitve Telegram je treba vzpostaviti internetno povezavo. + Zapri + Povezan račun + Račun + v %1$s + Pokaži na zemljevidu + OsmAnd Online GPS Tracker + Telefonska številka + Telefonska številka v mednarodnem zapisu + Geslo + Koda + Overitvena koda + Namesti program OsmAnd + Pokaži uporabnike na zemljevidu + Dejavni klepeti + Overitev + Telefonsko številko programa Telegram je treba vpisati v mednarodnem zapisu + Dobrodošli + yd + ft + mi + km + m + nmi + min/m + min/km + nmi/h + m/s + km/h + mph + Kilometri na uro + Milje na uro + Metri na sekundo + Minute na kilometer + Minute na miljo + Navtične milje na uro (vozli) + Milje/Čevlji + Milje/Jardi + Kilometri/Metri + Navtične milje + Milje/Metri + h + min + sek + Iskanje stikov + Iskanje med skupinami in stiki + Iskanje + V redu + \ No newline at end of file From 647e641e0e4abbe2ba1dabdf18e41eeeff18a764 Mon Sep 17 00:00:00 2001 From: Matej U Date: Fri, 19 Apr 2019 12:55:05 +0000 Subject: [PATCH 070/114] Translated using Weblate (Slovenian) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-sl/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sl/strings.xml b/OsmAnd/res/values-sl/strings.xml index 38db1f7d14..995b040185 100644 --- a/OsmAnd/res/values-sl/strings.xml +++ b/OsmAnd/res/values-sl/strings.xml @@ -1500,7 +1500,7 @@ Sorazmerna velikost pomnilnika je %4$s MB (omejitev na androidu je %5$s MB, na d Podrobnosti A-GPS Upravljaj Uredi - Poišči + Iskanje Pokaži opis. Zadnja osvežitev podatkov A-GPS: %1$s V mnogih državah (na primer v Nemčiji, Franciji, Italiji in drugih) je uporaba kamer za merjenje hitrosti prepovedana z zakonom. Razvijalci programa ne sprejemamo odgovornosti za tako rabo. Potrdite uporabo le, če ste res prepričani v svoje ravnanje. @@ -3016,4 +3016,5 @@ Koda predstavlja območje: %1$s x %2$s \n• Prikaz azimuta pri merjenju razdalje \n \n + Pošlji dnevnik \ No newline at end of file From 142f9234f942a119aef631944bff330ccdcb6ae4 Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 20 Apr 2019 02:15:02 +0000 Subject: [PATCH 071/114] Translated using Weblate (Spanish) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-es/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 209c5482a7..e97015d911 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -3045,4 +3045,5 @@ \n \n • Visualización de medida «azimut» en «Medir distancia» \n + Enviar registro de problemas \ No newline at end of file From 51d5f81a3e7ac9a0bc7caacc70f596548a8aceea Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 20 Apr 2019 02:14:23 +0000 Subject: [PATCH 072/114] Translated using Weblate (Spanish) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-es/phrases.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index 79e543a117..f8bd6c2a20 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -3578,4 +3578,8 @@ 3B* Llamarada de gas;Quemado en antorcha Objeto borrado + Peñón de escalada + Radioterapia + Caja de rescate + \ No newline at end of file From 5d74aa4601e4a725e21c835026361267db6584d9 Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 20 Apr 2019 02:16:51 +0000 Subject: [PATCH 073/114] Translated using Weblate (Spanish) Currently translated at 100.0% (215 of 215 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/es/ --- OsmAnd-telegram/res/values-es/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-es/strings.xml b/OsmAnd-telegram/res/values-es/strings.xml index 751594abdd..83c9a47b23 100644 --- a/OsmAnd-telegram/res/values-es/strings.xml +++ b/OsmAnd-telegram/res/values-es/strings.xml @@ -212,4 +212,8 @@ Aspecto Mostrar puntos GPS Muestra la cantidad de puntos GPS recibidos y enviados. + Buscar contactos + Buscar en todos tus grupos y contactos. + Escriba el nombre del contacto o grupo + Buscar \ No newline at end of file From 53e868456b0a68555d2002e882cbc9847ef6fa61 Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 20 Apr 2019 02:13:55 +0000 Subject: [PATCH 074/114] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-es-rUS/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index 0712c78712..13e0ed000d 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -3585,4 +3585,7 @@ Llamarada de gas;Quemado en antorcha Radioterapia Objeto borrado + Peñón de escalada + Caja de rescate + \ No newline at end of file From 0d8cefe917bd7b4e0580df4262a6c05f97e543f1 Mon Sep 17 00:00:00 2001 From: Franco Date: Sat, 20 Apr 2019 02:13:18 +0000 Subject: [PATCH 075/114] Translated using Weblate (Spanish (Argentina)) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-es-rAR/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 4cf62ac1f7..130dd391e7 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -3585,4 +3585,7 @@ Llamarada de gas;Quemado en antorcha Objeto borrado Radioterapia + Peñón de escalada + Caja de rescate + \ No newline at end of file From 2115febddad8a53b5f75a59e588c451c19c3d584 Mon Sep 17 00:00:00 2001 From: ___ Date: Fri, 19 Apr 2019 17:39:00 +0000 Subject: [PATCH 076/114] Translated using Weblate (Ukrainian) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-uk/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml index 588b020a16..c76b4259dd 100644 --- a/OsmAnd/res/values-uk/phrases.xml +++ b/OsmAnd/res/values-uk/phrases.xml @@ -3566,4 +3566,7 @@ Газовий факел Видалений об\'єкт Променева терапія + Місце для скелелазіння + Рятувальна коробка + Так \ No newline at end of file From b64a9dfa51b2278dddd18ada6f311761132afe7b Mon Sep 17 00:00:00 2001 From: aceman444 Date: Sun, 21 Apr 2019 21:20:32 +0200 Subject: [PATCH 077/114] Remove 'commiting_way' from strings.xml The string 'commiting_way' seems unused, is not referenced in Java code of any OsmAnd repository. People do not know how to translate it (what the context is), and nobody replies to them at https://hosted.weblate.org/translate/osmand/main/sk/?type=nottranslated&offset=2#comments . Please check the string and remove it if it really isn't needed. --- OsmAnd/res/values/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 8771b08160..b6b6d36ba7 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -190,7 +190,6 @@ • Boat navigation: Support for waterway fairway\n\n • Other bugfixes\n\n - Committing way… Increase search radius to %1$s \"%1$s\", as well as your location.

No personal info is collected, search data is only used to improve the search algorithm.
]]>
From 20fbb153804c15d7a2cb09a9315ed1a15f301f3b Mon Sep 17 00:00:00 2001 From: crimean Date: Mon, 22 Apr 2019 10:54:47 +0300 Subject: [PATCH 078/114] Introduce getPixDensity method --- OsmAnd-java/src/main/java/net/osmand/data/RotatedTileBox.java | 4 ++++ OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java | 3 +-- .../osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java | 3 +-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/data/RotatedTileBox.java b/OsmAnd-java/src/main/java/net/osmand/data/RotatedTileBox.java index f7e432b6fd..b461099e5e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/RotatedTileBox.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/RotatedTileBox.java @@ -199,6 +199,10 @@ public class RotatedTileBox { return tile; } + public double getPixDensity() { + final double dist = getDistance(0, getPixHeight() / 2, getPixWidth(), getPixHeight() / 2); + return getPixWidth() / dist; + } public int getPixWidth() { return pixWidth; diff --git a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java index b1b232618e..b310063b13 100644 --- a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java @@ -375,8 +375,7 @@ public class RulerControlLayer extends OsmandMapLayer { } private void updateDistance(RotatedTileBox tb) { - final double dist = tb.getDistance(0, tb.getPixHeight() / 2, tb.getPixWidth(), tb.getPixHeight() / 2); - double pixDensity = tb.getPixWidth() / dist; + double pixDensity = tb.getPixDensity(); roundedDist = OsmAndFormatter.calculateRoundedDist(maxRadiusInDp / pixDensity, app); radius = (int) (pixDensity * roundedDist); updateText(); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java index 4de1f4d6bb..b74610bd87 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java @@ -1189,8 +1189,7 @@ public class RouteInfoWidgetsFactory { cacheRulerTileX = tb.getCenterTileX(); cacheRulerTileY = tb.getCenterTileY(); cacheMapDensity = mapDensity.get(); - final double dist = tb.getDistance(0, tb.getPixHeight() / 2, tb.getPixWidth(), tb.getPixHeight() / 2); - double pixDensity = tb.getPixWidth() / dist; + double pixDensity = tb.getPixDensity(); double roundedDist = OsmAndFormatter.calculateRoundedDist(maxWidth / pixDensity, view.getApplication()); From 42dfd7a9373fd47b1cbdfcf6b82df3135eec6fa7 Mon Sep 17 00:00:00 2001 From: crimean Date: Mon, 22 Apr 2019 12:17:07 +0300 Subject: [PATCH 079/114] Fix x-axis points on route/gpx --- .../other/TrackDetailsMenu.java | 58 ++++++++++++------- .../src/net/osmand/plus/views/GPXLayer.java | 30 ++++++---- .../src/net/osmand/plus/views/RouteLayer.java | 17 ++++-- 3 files changed, 69 insertions(+), 36 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index 932b78a48a..f35ed317c7 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -61,7 +61,7 @@ public class TrackDetailsMenu { @Nullable private TrackChartPoints trackChartPoints; @Nullable - private List xAxisPoints; + private List xAxisPoints; private int topMarginPx; private boolean visible; private boolean hidding; @@ -236,8 +236,8 @@ public class TrackDetailsMenu { return segment; } - private WptPt getPoint(LineChart chart, float pos) { - WptPt wpt = null; + private LatLon getLocationAtPos(LineChart chart, float pos) { + LatLon latLon = null; List ds = chart.getLineData().getDataSets(); GpxDisplayItem gpxItem = getGpxItem(); if (ds != null && ds.size() > 0 && gpxItem != null) { @@ -246,31 +246,50 @@ public class TrackDetailsMenu { if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME || gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) { float time = pos * 1000; - for (WptPt p : segment.points) { - if (p.time - gpxItem.analysis.startTime >= time) { - wpt = p; + WptPt previousPoint = null; + for (WptPt currentPoint : segment.points) { + long totalTime = currentPoint.time - gpxItem.analysis.startTime; + if (totalTime >= time) { + if (previousPoint != null) { + double percent = 1 - (totalTime - time) / (currentPoint.time - previousPoint.time); + double dLat = (currentPoint.lat - previousPoint.lat) * percent; + double dLon = (currentPoint.lon - previousPoint.lon) * percent; + latLon = new LatLon(previousPoint.lat + dLat, previousPoint.lon + dLon); + } else { + latLon = new LatLon(currentPoint.lat, currentPoint.lon); + } break; } + previousPoint = currentPoint; } } else { float distance = pos * dataSet.getDivX(); double previousSplitDistance = 0; + WptPt previousPoint = null; for (int i = 0; i < segment.points.size(); i++) { WptPt currentPoint = segment.points.get(i); - if (i != 0) { - WptPt previousPoint = segment.points.get(i - 1); + if (previousPoint != null) { if (currentPoint.distance < previousPoint.distance) { previousSplitDistance += previousPoint.distance; } } - if (previousSplitDistance + currentPoint.distance >= distance) { - wpt = currentPoint; + double totalDistance = previousSplitDistance + currentPoint.distance; + if (totalDistance >= distance) { + if (previousPoint != null) { + double percent = 1 - (totalDistance - distance) / (currentPoint.distance - previousPoint.distance); + double dLat = (currentPoint.lat - previousPoint.lat) * percent; + double dLon = (currentPoint.lon - previousPoint.lon) * percent; + latLon = new LatLon(previousPoint.lat + dLat, previousPoint.lon + dLon); + } else { + latLon = new LatLon(currentPoint.lat, currentPoint.lon); + } break; } + previousPoint = currentPoint; } } } - return wpt; + return latLon; } private QuadRect getRect(LineChart chart, float startPos, float endPos) { @@ -417,9 +436,8 @@ public class TrackDetailsMenu { } else { gpxItem.chartHighlightPos = highlights[0].getX(); } - WptPt wpt = getPoint(chart, gpxItem.chartHighlightPos); - if (wpt != null) { - location = new LatLon(wpt.lat, wpt.lon); + location = getLocationAtPos(chart, gpxItem.chartHighlightPos); + if (location != null) { trackChartPoints.setHighlightedPoint(location); } } else { @@ -434,7 +452,7 @@ public class TrackDetailsMenu { fitTrackOnMap(chart, location, forceFit); } - private List getXAxisPoints(LineChart chart) { + private List getXAxisPoints(LineChart chart) { float[] entries = chart.getXAxis().mEntries; float maxXValue = chart.getLineData().getXMax(); if (entries.length >= 2) { @@ -443,8 +461,8 @@ public class TrackDetailsMenu { xAxisPoints = new ArrayList<>(); float currentPointEntry = interval; while (currentPointEntry < maxXValue) { - WptPt pointToAdd = getPoint(chart, currentPointEntry); - xAxisPoints.add(pointToAdd); + LatLon location = getLocationAtPos(chart, currentPointEntry); + xAxisPoints.add(location); currentPointEntry += interval; } } @@ -740,12 +758,12 @@ public class TrackDetailsMenu { } public static class TrackChartPoints { - private List xAxisPoints; + private List xAxisPoints; private LatLon highlightedPoint; private int segmentColor; private GPXFile gpx; - public List getXAxisPoints() { + public List getXAxisPoints() { return xAxisPoints; } @@ -761,7 +779,7 @@ public class TrackDetailsMenu { return gpx; } - public void setXAxisPoints(List xAxisPoints) { + public void setXAxisPoints(List xAxisPoints) { this.xAxisPoints = xAxisPoints; } diff --git a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java index 626400cab9..f5ca3d2b72 100644 --- a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java @@ -1,8 +1,5 @@ package net.osmand.plus.views; -import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR; -import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR; - import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -24,16 +21,16 @@ import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.util.Pair; +import net.osmand.GPXUtilities; +import net.osmand.GPXUtilities.GPXFile; +import net.osmand.GPXUtilities.TrkSegment; +import net.osmand.GPXUtilities.WptPt; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.data.QuadRect; import net.osmand.data.QuadTree; import net.osmand.data.RotatedTileBox; import net.osmand.plus.GPXDatabase.GpxDataItem; -import net.osmand.GPXUtilities; -import net.osmand.GPXUtilities.GPXFile; -import net.osmand.GPXUtilities.TrkSegment; -import net.osmand.GPXUtilities.WptPt; import net.osmand.plus.GpxSelectionHelper; import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; @@ -60,6 +57,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR; +import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR; + public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider, ContextMenuLayer.IMoveObjectProvider, MapTextProvider { @@ -449,10 +449,14 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex paintGridCircle.setAlpha(255); QuadRect latLonBounds = tileBox.getLatLonBounds(); float r = 3 * tileBox.getDensity(); - List xAxisPoints = trackChartPoints.getXAxisPoints(); + List xAxisPoints = trackChartPoints.getXAxisPoints(); if (xAxisPoints != null) { + float density = (float) Math.ceil(tileBox.getDensity()); + float outerRadius = r + 2 * density; + float innerRadius = r + density; + QuadRect prevPointRect = null; for (int i = 0; i < xAxisPoints.size(); i++) { - WptPt axisPoint = xAxisPoints.get(i); + LatLon axisPoint = xAxisPoints.get(i); if (axisPoint != null) { if (axisPoint.getLatitude() >= latLonBounds.bottom && axisPoint.getLatitude() <= latLonBounds.top @@ -460,8 +464,12 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex && axisPoint.getLongitude() <= latLonBounds.right) { float x = tileBox.getPixXFromLatLon(axisPoint.getLatitude(), axisPoint.getLongitude()); float y = tileBox.getPixYFromLatLon(axisPoint.getLatitude(), axisPoint.getLongitude()); - canvas.drawCircle(x, y, r + 2 * (float) Math.ceil(tileBox.getDensity()), paintGridOuterCircle); - canvas.drawCircle(x, y, r + (float) Math.ceil(tileBox.getDensity()), paintGridCircle); + QuadRect pointRect = new QuadRect(x - outerRadius, y - outerRadius, x + outerRadius, y + outerRadius); + if (prevPointRect == null || !QuadRect.intersects(prevPointRect, pointRect)) { + canvas.drawCircle(x, y, outerRadius, paintGridOuterCircle); + canvas.drawCircle(x, y, innerRadius, paintGridCircle); + prevPointRect = pointRect; + } } } } diff --git a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java index d2b778dcbd..721d052ce1 100644 --- a/OsmAnd/src/net/osmand/plus/views/RouteLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RouteLayer.java @@ -16,7 +16,6 @@ import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.util.Pair; -import net.osmand.GPXUtilities.WptPt; import net.osmand.Location; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; @@ -225,18 +224,26 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont private void drawXAxisPoints(Canvas canvas, RotatedTileBox tileBox) { QuadRect latLonBounds = tileBox.getLatLonBounds(); - List xAxisPoints = trackChartPoints.getXAxisPoints(); + List xAxisPoints = trackChartPoints.getXAxisPoints(); float r = 3 * tileBox.getDensity(); + float density = (float) Math.ceil(tileBox.getDensity()); + float outerRadius = r + 2 * density; + float innerRadius = r + density; + QuadRect prevPointRect = null; for (int i = 0; i < xAxisPoints.size(); i++) { - WptPt axisPoint = xAxisPoints.get(i); + LatLon axisPoint = xAxisPoints.get(i); if (axisPoint.getLatitude() >= latLonBounds.bottom && axisPoint.getLatitude() <= latLonBounds.top && axisPoint.getLongitude() >= latLonBounds.left && axisPoint.getLongitude() <= latLonBounds.right) { float x = tileBox.getPixXFromLatLon(axisPoint.getLatitude(), axisPoint.getLongitude()); float y = tileBox.getPixYFromLatLon(axisPoint.getLatitude(), axisPoint.getLongitude()); - canvas.drawCircle(x, y, r + 2 * (float) Math.ceil(tileBox.getDensity()), paintGridOuterCircle); - canvas.drawCircle(x, y, r + (float) Math.ceil(tileBox.getDensity()), paintGridCircle); + QuadRect pointRect = new QuadRect(x - outerRadius, y - outerRadius, x + outerRadius, y + outerRadius); + if (prevPointRect == null || !QuadRect.intersects(prevPointRect, pointRect)) { + canvas.drawCircle(x, y, outerRadius, paintGridOuterCircle); + canvas.drawCircle(x, y, innerRadius, paintGridCircle); + prevPointRect = pointRect; + } } } } From edef0aac448a6122bc936265c8b73783cf3fdb73 Mon Sep 17 00:00:00 2001 From: crimean Date: Mon, 22 Apr 2019 12:33:31 +0300 Subject: [PATCH 080/114] Fix analyse route on map --- .../net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index f35ed317c7..c8f14361de 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -147,7 +147,7 @@ public class TrackDetailsMenu { if (mapActivity != null && gpxItem != null) { OsmandApplication app = mapActivity.getMyApplication(); GPXFile groupGpx = gpxItem.group.getGpx(); - if (groupGpx != null) { + if (groupGpx != null && !gpxItem.route) { gpxItem.wasHidden = app.getSelectedGpxHelper().getSelectedFileByPath(groupGpx.path) == null; app.getSelectedGpxHelper().setGpxFileToDisplay(groupGpx); } From 79c59aeb0aea9332a30da2a854288346b02410dd Mon Sep 17 00:00:00 2001 From: syl Date: Mon, 22 Apr 2019 12:28:30 +0000 Subject: [PATCH 081/114] Translated using Weblate (French) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-fr/strings.xml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 5fb55af2a5..9ae768572d 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1310,7 +1310,7 @@ Mémoire proportionnelle %4$s Mo (limite Android %5$s Mo, Dalvik %6$s Mo).h
Durée Distance - Lignes de bus, tramways, et navettes + Lignes de bus, trolleybus, et navettes Enregistrer l\'itinéraire dans un fichier GPX L\'enregistrement des positions dans un fichier GPX peut être activé ou désactivé depuis le gadget de la carte Intervalle d\'enregistrement @@ -1348,11 +1348,11 @@ Mémoire proportionnelle %4$s Mo (limite Android %5$s Mo, Dalvik %6$s Mo).Dans
Itinéraires Lignes de bus - Lignes de tramway + Lignes de trolleybus Itinéraires de chemin de fer - Voies de tramway + Voies de tram Voies partagées pour les taxis - Lignes de tramway et train + Lignes de tram et train Éviter les routes… Masquer Allumer l\'écran @@ -2069,7 +2069,7 @@ Si vous appréciez OsmAnd et OSM et que vous souhaitez soutenir ces projets, c\' Autre trace GPX … Apparence Bien - Transformer si le nom %1$s est absent + Translittérer si le nom %1$s est absent Calcul de l\'itinéraire Télécharger les points d\'intérêt Prenez la sortie %1$d @@ -2973,8 +2973,8 @@ représentant la zone : %1$s x %2$s
Millièmes angulaires Unités de mesure d\'angle Modifier l\'unité de mesure de l\'azimut. - Éviter le tramway - Éviter le tramway + Éviter le tram + Éviter le tram Éviter le bus Éviter le taxi partagé Éviter le taxi partagé @@ -2994,4 +2994,7 @@ représentant la zone : %1$s x %2$s
\n \n
Envoyer le journal + Éviter le bus et le trolleybus + Éviter les pavés + Éviter les pavés \ No newline at end of file From beb61359a70bedd0a3be21723ee283cc38c4d4df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Babos=20G=C3=A1bor?= Date: Mon, 22 Apr 2019 11:33:57 +0000 Subject: [PATCH 082/114] Translated using Weblate (Hungarian) Currently translated at 100.0% (219 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/hu/ --- OsmAnd-telegram/res/values-hu/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-hu/strings.xml b/OsmAnd-telegram/res/values-hu/strings.xml index f2ce94a8d6..841c75fe89 100644 --- a/OsmAnd-telegram/res/values-hu/strings.xml +++ b/OsmAnd-telegram/res/values-hu/strings.xml @@ -216,4 +216,8 @@ Aktív csevegések Engedélyezés Kérjük, nemzetközi formátumban adja meg a Telegramhoz használt telefonszámát + Irány + Pontosság + Magasság + Tájolás \ No newline at end of file From 575e450f914b3b28e1ca973c963d7640bbf36951 Mon Sep 17 00:00:00 2001 From: crimean Date: Mon, 22 Apr 2019 17:11:26 +0300 Subject: [PATCH 083/114] Added warning cards to RP --- OsmAnd/res/layout/warning_card.xml | 2 +- OsmAnd/res/values/strings.xml | 5 + .../MapRouteInfoMenu.java | 76 +++++++++++---- .../cards/LongDistanceWarningCard.java | 23 +++++ .../cards/PublicTransportBetaWarningCard.java | 27 ++++++ ...cTransportNotFoundSettingsWarningCard.java | 16 ++++ .../PublicTransportNotFoundWarningCard.java | 16 ++++ .../cards/WarningCard.java | 96 +++++++++++-------- 8 files changed, 203 insertions(+), 58 deletions(-) create mode 100644 OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/LongDistanceWarningCard.java create mode 100644 OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportBetaWarningCard.java create mode 100644 OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundSettingsWarningCard.java create mode 100644 OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundWarningCard.java diff --git a/OsmAnd/res/layout/warning_card.xml b/OsmAnd/res/layout/warning_card.xml index 9ea416e570..2f2c0811a0 100644 --- a/OsmAnd/res/layout/warning_card.xml +++ b/OsmAnd/res/layout/warning_card.xml @@ -38,7 +38,7 @@ tools:text="@string/public_transport_warning_title" /> + Unfortunately, OsmAnd could not find a route suitable for your settings. + Try the pedestrian navigation. + Try changing the settings. + Calculate pedestrian route + Transport type Send log Avoid trams Avoid trams diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index 6f72eacd80..52e1cbd138 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -71,12 +71,15 @@ import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; import net.osmand.plus.routepreparationmenu.cards.HistoryCard; import net.osmand.plus.routepreparationmenu.cards.HomeWorkCard; +import net.osmand.plus.routepreparationmenu.cards.LongDistanceWarningCard; import net.osmand.plus.routepreparationmenu.cards.MapMarkersCard; import net.osmand.plus.routepreparationmenu.cards.PreviousRouteCard; +import net.osmand.plus.routepreparationmenu.cards.PublicTransportBetaWarningCard; import net.osmand.plus.routepreparationmenu.cards.PublicTransportCard; +import net.osmand.plus.routepreparationmenu.cards.PublicTransportNotFoundSettingsWarningCard; +import net.osmand.plus.routepreparationmenu.cards.PublicTransportNotFoundWarningCard; import net.osmand.plus.routepreparationmenu.cards.SimpleRouteCard; import net.osmand.plus.routepreparationmenu.cards.TracksCard; -import net.osmand.plus.routepreparationmenu.cards.WarningCard; import net.osmand.plus.routing.IRouteInformationListener; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.TransportRoutingHelper; @@ -503,20 +506,40 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } else if (isTransportRouteCalculated()) { TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper(); List routes = transportRoutingHelper.getRoutes(); - for (int i = 0; i < routes.size(); i++) { - PublicTransportCard card = new PublicTransportCard(mapActivity, transportRoutingHelper.getStartLocation(), - transportRoutingHelper.getEndLocation(), routes.get(i), i); - card.setShowBottomShadow(i == routes.size() - 1); - card.setShowTopShadow(i != 0); - card.setListener(this); - menuCards.add(card); + if (routes != null && routes.size() > 0) { + for (int i = 0; i < routes.size(); i++) { + PublicTransportCard card = new PublicTransportCard(mapActivity, transportRoutingHelper.getStartLocation(), + transportRoutingHelper.getEndLocation(), routes.get(i), i); + card.setShowBottomShadow(i == routes.size() - 1); + card.setShowTopShadow(i != 0); + card.setListener(this); + menuCards.add(card); + } + bottomShadowVisible = routes.size() == 0; + } else { + RouteMenuAppModes mode = app.getRoutingOptionsHelper().modes.get(routingHelper.getAppMode()); + boolean avoidPTTypesCustomized = false; + for (LocalRoutingParameter parameter : mode.parameters) { + if (parameter instanceof AvoidPTTypesRoutingParameter) { + avoidPTTypesCustomized = true; + break; + } + } + if (avoidPTTypesCustomized) { + PublicTransportNotFoundSettingsWarningCard warningCard = new PublicTransportNotFoundSettingsWarningCard(mapActivity); + warningCard.setListener(this); + menuCards.add(warningCard); + } else { + PublicTransportNotFoundWarningCard warningCard = new PublicTransportNotFoundWarningCard(mapActivity); + warningCard.setListener(this); + menuCards.add(warningCard); + } } - bottomShadowVisible = routes.size() == 0; } else if (routeCalculationInProgress) { - if (app.getTargetPointsHelper().hasTooLongDistanceToNavigate() || routingHelper.isPublicTransportMode()) { - // WarningCard card - WarningCard warningCard = new WarningCard(mapActivity); - menuCards.add(warningCard); + if (app.getRoutingHelper().isPublicTransportMode()) { + menuCards.add(new PublicTransportBetaWarningCard(mapActivity)); + } else if (app.getTargetPointsHelper().hasTooLongDistanceToNavigate()) { + menuCards.add(new LongDistanceWarningCard(mapActivity)); } } else { // Home/work card @@ -631,6 +654,11 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } else if (card instanceof SimpleRouteCard) { hide(); ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), 0, MenuState.FULL_SCREEN); + } else if (card instanceof PublicTransportNotFoundWarningCard) { + updateApplicationMode(null, ApplicationMode.PEDESTRIAN); + } else if (card instanceof PublicTransportNotFoundSettingsWarningCard) { + AvoidRoadsBottomSheetDialogFragment avoidRoadsFragment = new AvoidRoadsBottomSheetDialogFragment(true); + avoidRoadsFragment.show(mapActivity.getSupportFragmentManager(), AvoidRoadsBottomSheetDialogFragment.TAG); } } } @@ -647,6 +675,15 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener return false; } + public boolean hasTransportRoutes() { + OsmandApplication app = getApp(); + if (app != null) { + List routes = app.getTransportRoutingHelper().getRoutes(); + return routes != null && routes.size() > 0; + } + return false; + } + public boolean isBasicRouteCalculated() { OsmandApplication app = getApp(); if (app != null) { @@ -868,7 +905,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener int color1; int color2; if (publicTransportMode) { - if (routeCalculated) { + if (routeCalculated && hasTransportRoutes()) { color1 = nightMode ? R.color.active_buttons_and_links_dark : R.color.active_buttons_and_links_light; AndroidUtils.setBackground(app, startButton, nightMode, R.color.card_and_list_background_light, R.color.card_and_list_background_dark); color2 = color1; @@ -1315,15 +1352,18 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { OsmandApplication app = mapActivity.getMyApplication(); - if (mapActivity.getPointToNavigate() != null) { - hide(); - } if (app.getRoutingHelper().isPublicTransportMode()) { - if (isTransportRouteCalculated()) { + if (isTransportRouteCalculated() && hasTransportRoutes()) { + if (mapActivity.getPointToNavigate() != null) { + hide(); + } ChooseRouteFragment.showFromRouteInfo(mapActivity.getSupportFragmentManager(), app.getTransportRoutingHelper().getCurrentRoute(), MenuState.HEADER_ONLY); } } else { + if (mapActivity.getPointToNavigate() != null) { + hide(); + } mapActivity.getMapLayers().getMapControlsLayer().startNavigation(); } } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/LongDistanceWarningCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/LongDistanceWarningCard.java new file mode 100644 index 0000000000..f34b5de5fb --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/LongDistanceWarningCard.java @@ -0,0 +1,23 @@ +package net.osmand.plus.routepreparationmenu.cards; + +import android.support.annotation.NonNull; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.routepreparationmenu.AddPointBottomSheetDialog; +import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; + +public class LongDistanceWarningCard extends WarningCard { + + public LongDistanceWarningCard(@NonNull MapActivity mapActivity) { + super(mapActivity); + imageId = R.drawable.ic_action_waypoint; + title = mapActivity.getString(R.string.route_is_too_long_v2); + linkText = mapActivity.getString(R.string.add_intermediate); + } + + @Override + protected void onLinkClicked() { + AddPointBottomSheetDialog.showInstance(mapActivity, MapRouteInfoMenu.PointType.INTERMEDIATE); + } +} diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportBetaWarningCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportBetaWarningCard.java new file mode 100644 index 0000000000..08e7861cfc --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportBetaWarningCard.java @@ -0,0 +1,27 @@ +package net.osmand.plus.routepreparationmenu.cards; + +import android.net.Uri; +import android.support.annotation.NonNull; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.wikipedia.WikipediaDialogFragment; + +public class PublicTransportBetaWarningCard extends WarningCard { + + private static final String OSMAND_BLOG_LINK = "https://osmand.net/blog/guideline-pt"; + + public PublicTransportBetaWarningCard(@NonNull MapActivity mapActivity) { + super(mapActivity); + imageId = R.drawable.ic_action_bus_dark; + title = mapActivity.getString(R.string.public_transport_warning_title); + linkText = mapActivity.getString(R.string.public_transport_warning_descr_blog); + startLinkIndex = linkText.lastIndexOf(" "); + endLinkIndex = linkText.length() - 1; + } + + @Override + protected void onLinkClicked() { + WikipediaDialogFragment.showFullArticle(mapActivity, Uri.parse(OSMAND_BLOG_LINK), nightMode); + } +} diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundSettingsWarningCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundSettingsWarningCard.java new file mode 100644 index 0000000000..883a0645a9 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundSettingsWarningCard.java @@ -0,0 +1,16 @@ +package net.osmand.plus.routepreparationmenu.cards; + +import android.support.annotation.NonNull; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; + +public class PublicTransportNotFoundSettingsWarningCard extends WarningCard { + + public PublicTransportNotFoundSettingsWarningCard(@NonNull MapActivity mapActivity) { + super(mapActivity); + imageId = R.drawable.ic_action_no_route; + title = mapActivity.getString(R.string.public_transport_no_route_title) + "\n\n" + mapActivity.getString(R.string.public_transport_try_change_settings); + linkText = mapActivity.getString(R.string.public_transport_type); + } +} diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundWarningCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundWarningCard.java new file mode 100644 index 0000000000..42f28cf001 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportNotFoundWarningCard.java @@ -0,0 +1,16 @@ +package net.osmand.plus.routepreparationmenu.cards; + +import android.support.annotation.NonNull; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; + +public class PublicTransportNotFoundWarningCard extends WarningCard { + + public PublicTransportNotFoundWarningCard(@NonNull MapActivity mapActivity) { + super(mapActivity); + imageId = R.drawable.ic_action_pedestrian_dark; + title = mapActivity.getString(R.string.public_transport_no_route_title) + "\n\n" + mapActivity.getString(R.string.public_transport_try_ped); + linkText = mapActivity.getString(R.string.public_transport_calc_pedestrian); + } +} diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java index f02032e257..7ad203f867 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/WarningCard.java @@ -1,7 +1,7 @@ package net.osmand.plus.routepreparationmenu.cards; import android.graphics.Typeface; -import android.net.Uri; +import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.text.SpannableString; import android.text.Spanned; @@ -15,18 +15,40 @@ import android.widget.TextView; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.routepreparationmenu.AddPointBottomSheetDialog; -import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType; -import net.osmand.plus.wikipedia.WikipediaDialogFragment; +import net.osmand.util.Algorithms; -public class WarningCard extends BaseCard { +public abstract class WarningCard extends BaseCard { - public static final String OSMAND_BLOG_LINK = "https://osmand.net/blog/guideline-pt"; + protected int imageId; + protected Drawable imageDrawable; + protected String title; + protected String linkText; + protected int startLinkIndex = -1; + protected int endLinkIndex; - public WarningCard(MapActivity mapActivity) { + protected WarningCard(@NonNull MapActivity mapActivity) { super(mapActivity); } + public int getImageId() { + return imageId; + } + + public Drawable getImageDrawable() { + return imageDrawable; + } + + public String getTitle() { + return title; + } + + public String getLinkText() { + return linkText; + } + + protected void onLinkClicked() { + } + @Override public int getCardLayoutId() { return R.layout.warning_card; @@ -36,13 +58,18 @@ public class WarningCard extends BaseCard { protected void updateContent() { ImageView icon = (ImageView) view.findViewById(R.id.warning_img); TextView warningTitle = (TextView) view.findViewById(R.id.warning_title); - TextView warningDescr = (TextView) view.findViewById(R.id.warning_descr); + TextView warningLink = (TextView) view.findViewById(R.id.warning_link); - if (app.getRoutingHelper().isPublicTransportMode()) { - icon.setImageDrawable(getContentIcon(R.drawable.ic_action_bus_dark)); - warningTitle.setText(R.string.public_transport_warning_title); + if (imageDrawable != null) { + icon.setImageDrawable(imageDrawable); + } else if (imageId != 0) { + icon.setImageDrawable(getContentIcon(imageId)); + } + warningTitle.setText(title); + warningLink.setVisibility(!Algorithms.isEmpty(title) ? View.VISIBLE : View.GONE); - String text = app.getString(R.string.public_transport_warning_descr_blog); + if (!Algorithms.isEmpty(linkText)) { + String text = linkText; SpannableString spannable = new SpannableString(text); ClickableSpan clickableSpan = new ClickableSpan() { @Override @@ -53,37 +80,28 @@ public class WarningCard extends BaseCard { @Override public void onClick(@NonNull View widget) { - WikipediaDialogFragment.showFullArticle(mapActivity, Uri.parse(OSMAND_BLOG_LINK), nightMode); + CardListener listener = getListener(); + if (listener != null) { + listener.onCardButtonPressed(WarningCard.this, 0); + } else { + onLinkClicked(); + } } }; - int startIndex = text.lastIndexOf(" "); - if (startIndex != -1) { - spannable.setSpan(clickableSpan, startIndex, text.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - spannable.setSpan(new StyleSpan(Typeface.BOLD), startIndex, text.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - warningDescr.setMovementMethod(LinkMovementMethod.getInstance()); + int startLinkIndex = this.startLinkIndex; + int endLinkIndex = this.endLinkIndex; + if (startLinkIndex < 0 || endLinkIndex == 0) { + startLinkIndex = 0; + endLinkIndex = text.length(); + warningLink.setTextSize(15); } - warningDescr.setText(spannable); + spannable.setSpan(clickableSpan, startLinkIndex, endLinkIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannable.setSpan(new StyleSpan(Typeface.BOLD), startLinkIndex, endLinkIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + warningLink.setMovementMethod(LinkMovementMethod.getInstance()); + warningLink.setText(spannable); + warningLink.setVisibility(View.VISIBLE); } else { - icon.setImageDrawable(getContentIcon(R.drawable.ic_action_waypoint)); - warningTitle.setText(R.string.route_is_too_long_v2); - SpannableString text = new SpannableString(app.getString(R.string.add_intermediate)); - ClickableSpan clickableSpan = new ClickableSpan() { - @Override - public void updateDrawState(@NonNull TextPaint ds) { - ds.setColor(getActiveColor()); - ds.setUnderlineText(false); - } - - @Override - public void onClick(@NonNull View widget) { - AddPointBottomSheetDialog.showInstance(mapActivity, PointType.INTERMEDIATE); - } - }; - text.setSpan(clickableSpan, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - text.setSpan(new StyleSpan(Typeface.BOLD), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - warningDescr.setMovementMethod(LinkMovementMethod.getInstance()); - warningDescr.setTextSize(15); - warningDescr.setText(text); + warningLink.setVisibility(View.GONE); } } } \ No newline at end of file From ae0c12902c25d75146a255e38efae59e7c085e8c Mon Sep 17 00:00:00 2001 From: crimean Date: Mon, 22 Apr 2019 18:19:22 +0300 Subject: [PATCH 084/114] Fix avoid types toolbar for PT --- .../osmand/plus/routepreparationmenu/RoutingOptionsHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java index 552702bfeb..8694228a8b 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RoutingOptionsHelper.java @@ -969,7 +969,7 @@ public class RoutingOptionsHelper { CAR(MuteSoundRoutingParameter.KEY, AvoidRoadsRoutingParameter.KEY), BICYCLE(MuteSoundRoutingParameter.KEY, DRIVING_STYLE, GeneralRouter.USE_HEIGHT_OBSTACLES), PEDESTRIAN(MuteSoundRoutingParameter.KEY, GeneralRouter.USE_HEIGHT_OBSTACLES), - PUBLIC_TRANSPORT(MuteSoundRoutingParameter.KEY), + PUBLIC_TRANSPORT(MuteSoundRoutingParameter.KEY, AvoidPTTypesRoutingParameter.KEY), BOAT(MuteSoundRoutingParameter.KEY), AIRCAFT(MuteSoundRoutingParameter.KEY), HIKING(MuteSoundRoutingParameter.KEY), From ea63ffcf4fb3ce7275d23d755ab61839f95a1e1c Mon Sep 17 00:00:00 2001 From: crimean Date: Mon, 22 Apr 2019 22:24:15 +0300 Subject: [PATCH 085/114] Added pedestrian route proposal card --- OsmAnd/res/layout/route_ped_info.xml | 108 ++++++++++++++++++ OsmAnd/res/values/strings.xml | 1 + .../MapRouteInfoMenu.java | 25 +++- .../RouteDetailsFragment.java | 2 +- .../cards/PedestrianRouteCard.java | 64 +++++++++++ 5 files changed, 196 insertions(+), 4 deletions(-) create mode 100644 OsmAnd/res/layout/route_ped_info.xml create mode 100644 OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PedestrianRouteCard.java diff --git a/OsmAnd/res/layout/route_ped_info.xml b/OsmAnd/res/layout/route_ped_info.xml new file mode 100644 index 0000000000..30b87231fc --- /dev/null +++ b/OsmAnd/res/layout/route_ped_info.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 73c73a75da..ae0641a2eb 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + The route by foot is approximately %1$s and it could be faster than by public transport Unfortunately, OsmAnd could not find a route suitable for your settings. Try the pedestrian navigation. Try changing the settings. diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index 52e1cbd138..2d71bd0ce1 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -73,6 +73,7 @@ import net.osmand.plus.routepreparationmenu.cards.HistoryCard; import net.osmand.plus.routepreparationmenu.cards.HomeWorkCard; import net.osmand.plus.routepreparationmenu.cards.LongDistanceWarningCard; import net.osmand.plus.routepreparationmenu.cards.MapMarkersCard; +import net.osmand.plus.routepreparationmenu.cards.PedestrianRouteCard; import net.osmand.plus.routepreparationmenu.cards.PreviousRouteCard; import net.osmand.plus.routepreparationmenu.cards.PublicTransportBetaWarningCard; import net.osmand.plus.routepreparationmenu.cards.PublicTransportCard; @@ -90,6 +91,7 @@ import net.osmand.router.GeneralRouter.RoutingParameter; import net.osmand.router.TransportRoutePlanner.TransportRouteResult; import net.osmand.search.SearchUICore.SearchResultCollection; import net.osmand.search.core.SearchResult; +import net.osmand.util.MapUtils; import java.io.IOException; import java.lang.ref.WeakReference; @@ -106,6 +108,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener private static final int BUTTON_ANIMATION_DELAY = 2000; public static final int DEFAULT_MENU_STATE = 0; + private static final int MAX_PEDESTRIAN_ROUTE_DURATION = 30 * 60; public static int directionInfo = -1; public static boolean chooseRoutesVisible = false; @@ -507,14 +510,28 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper(); List routes = transportRoutingHelper.getRoutes(); if (routes != null && routes.size() > 0) { + TransportRouteResult route = routes.get(0); + int walkTimeReal = transportRoutingHelper.getWalkingTime(route.getSegments()); + int walkTimePT = (int) route.getWalkTime(); + int walkTime = walkTimeReal > 0 ? walkTimeReal : walkTimePT; + int travelTime = (int) route.getTravelTime() + walkTime; + LatLon startLocation = transportRoutingHelper.getStartLocation(); + LatLon endLocation = transportRoutingHelper.getEndLocation(); + int approxPedestrianTime = (int) MapUtils.getDistance(startLocation, endLocation); + boolean showPedestrianCard = approxPedestrianTime < travelTime + 60 && approxPedestrianTime < MAX_PEDESTRIAN_ROUTE_DURATION; for (int i = 0; i < routes.size(); i++) { - PublicTransportCard card = new PublicTransportCard(mapActivity, transportRoutingHelper.getStartLocation(), - transportRoutingHelper.getEndLocation(), routes.get(i), i); - card.setShowBottomShadow(i == routes.size() - 1); + route = routes.get(i); + PublicTransportCard card = new PublicTransportCard(mapActivity, startLocation, endLocation, route, i); + card.setShowBottomShadow(i == routes.size() - 1 && !showPedestrianCard); card.setShowTopShadow(i != 0); card.setListener(this); menuCards.add(card); } + if (showPedestrianCard) { + PedestrianRouteCard pedestrianRouteCard = new PedestrianRouteCard(mapActivity, approxPedestrianTime); + pedestrianRouteCard.setListener(this); + menuCards.add(pedestrianRouteCard); + } bottomShadowVisible = routes.size() == 0; } else { RouteMenuAppModes mode = app.getRoutingOptionsHelper().modes.get(routingHelper.getAppMode()); @@ -659,6 +676,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener } else if (card instanceof PublicTransportNotFoundSettingsWarningCard) { AvoidRoadsBottomSheetDialogFragment avoidRoadsFragment = new AvoidRoadsBottomSheetDialogFragment(true); avoidRoadsFragment.show(mapActivity.getSupportFragmentManager(), AvoidRoadsBottomSheetDialogFragment.TAG); + } else if (card instanceof PedestrianRouteCard) { + updateApplicationMode(null, ApplicationMode.PEDESTRIAN); } } } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java index fd7a83fddc..a75a44ca42 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java @@ -35,7 +35,6 @@ import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; -import com.github.mikephil.charting.listener.ChartTouchListener; import com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture; import com.github.mikephil.charting.renderer.HorizontalBarChartRenderer; import com.github.mikephil.charting.utils.ViewPortHandler; @@ -214,6 +213,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT mapActivity.findViewById(R.id.bottom_controls_container).setVisibility(View.VISIBLE); if (routeDetailsMenu != null) { routeDetailsMenu.setMapActivity(null); + mapActivity.getMapLayers().getMapInfoLayer().setTrackChartPoints(null); } } super.onPause(); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PedestrianRouteCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PedestrianRouteCard.java new file mode 100644 index 0000000000..03608c7ca5 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PedestrianRouteCard.java @@ -0,0 +1,64 @@ +package net.osmand.plus.routepreparationmenu.cards; + +import android.graphics.Typeface; +import android.os.Build; +import android.support.annotation.NonNull; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.StyleSpan; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.TextView; + +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmAndFormatter; +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; + +public class PedestrianRouteCard extends BaseCard { + + private int approxPedestrianTime; + + public PedestrianRouteCard(@NonNull MapActivity mapActivity, int approxPedestrianTime) { + super(mapActivity); + this.approxPedestrianTime = approxPedestrianTime; + } + + @Override + public int getCardLayoutId() { + return R.layout.route_ped_info; + } + + @Override + protected void updateContent() { + TextView titleView = (TextView) view.findViewById(R.id.title); + String text = app.getString(R.string.public_transport_ped_route_title); + String formattedDuration = OsmAndFormatter.getFormattedDuration(approxPedestrianTime, app); + int start = text.indexOf("%1$s"); + int end = start + formattedDuration.length(); + text = text.replace("%1$s", formattedDuration); + SpannableString spannable = new SpannableString(text); + spannable.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + titleView.setText(spannable); + + FrameLayout button = view.findViewById(R.id.button); + View buttonDescr = view.findViewById(R.id.button_descr); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CardListener listener = getListener(); + if (listener != null) { + listener.onCardButtonPressed(PedestrianRouteCard.this, 0); + } + } + }); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { + AndroidUtils.setBackground(app, button, nightMode, R.drawable.btn_border_light, R.drawable.btn_border_dark); + AndroidUtils.setBackground(app, buttonDescr, nightMode, R.drawable.ripple_light, R.drawable.ripple_dark); + } else { + AndroidUtils.setBackground(app, buttonDescr, nightMode, R.drawable.btn_border_trans_light, R.drawable.btn_border_trans_dark); + } + view.findViewById(R.id.card_divider).setVisibility(View.VISIBLE); + view.findViewById(R.id.top_divider).setVisibility(View.GONE); + } +} From 8c2578fd20d4d594b9135fed6e28816a0b8e943a Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 21 Apr 2019 16:07:52 +0000 Subject: [PATCH 086/114] Translated using Weblate (German) Currently translated at 100.0% (219 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/de/ --- OsmAnd-telegram/res/values-de/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-de/strings.xml b/OsmAnd-telegram/res/values-de/strings.xml index bef6e4a34b..82bcd0b557 100644 --- a/OsmAnd-telegram/res/values-de/strings.xml +++ b/OsmAnd-telegram/res/values-de/strings.xml @@ -217,4 +217,8 @@ Alle Gruppen und Kontakte durchsuchen. Kontakt- oder Gruppenname eingeben Suchen + Richtung + Genauigkeit + Höhe + Peilung \ No newline at end of file From 934de899cb94df754e36e8f40ec42b0cad83e68a Mon Sep 17 00:00:00 2001 From: crimean Date: Tue, 23 Apr 2019 14:11:47 +0300 Subject: [PATCH 087/114] Fix app dir changing UI --- .../res/layout/dash_storage_type_fragment.xml | 14 +- OsmAnd/res/values/strings.xml | 10 +- .../dashboard/DashChooseAppDirFragment.java | 144 ++++++++++++++---- 3 files changed, 135 insertions(+), 33 deletions(-) diff --git a/OsmAnd/res/layout/dash_storage_type_fragment.xml b/OsmAnd/res/layout/dash_storage_type_fragment.xml index d435152e80..166ce7af99 100644 --- a/OsmAnd/res/layout/dash_storage_type_fragment.xml +++ b/OsmAnd/res/layout/dash_storage_type_fragment.xml @@ -102,17 +102,25 @@ android:id="@+id/copy_maps" style="@style/DashboardGeneralButton" android:gravity="center" - android:text="@string/shared_string_copy" + android:text="@string/move_maps" osmand:textAllCapsCompat="true" osmand:typeface="@string/font_roboto_medium"/> + + diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index ae0641a2eb..ff8155ea88 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,12 @@ Thx - Hardy --> + Moved %1$d files (%2$s). + Copied %1$d files (%2$s). + Failed to copy %1$d files (%2$s). + %1$d files (%2$s) are present at previous location \'%3$s\'. + Move maps + Don\'t move The route by foot is approximately %1$s and it could be faster than by public transport Unfortunately, OsmAnd could not find a route suitable for your settings. Try the pedestrian navigation. @@ -1170,9 +1176,9 @@ Color by OSMC hiking symbol Log Off House numbers - Copy OsmAnd data files to the new destination? + Move OsmAnd data files to the new destination? Maps could not be created in specified directory - Copying files failed + Moving files failed External storage Multiuser storage Internal app memory diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java b/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java index c34a4988e6..0fabf870ec 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashChooseAppDirFragment.java @@ -1,6 +1,7 @@ package net.osmand.plus.dashboard; import android.Manifest; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.app.Dialog; @@ -11,6 +12,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.StatFs; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; @@ -26,7 +28,6 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import net.osmand.IndexConstants; import net.osmand.ValueHolder; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -58,7 +59,8 @@ public class DashChooseAppDirFragment { MessageFormat formatGb = new MessageFormat("{0, number,#.##} GB", Locale.US); private View copyMapsBtn; private ImageView editBtn; - private View confirmBtn; + private View dontCopyMapsBtn; + private View cancelBtn; private boolean mapsCopied = false; private TextView warningReadonly; private int type = -1; @@ -110,20 +112,6 @@ public class DashChooseAppDirFragment { } locationDesc.setText(selectedFile.getAbsolutePath() + " \u2022 " + getFreeSpace(selectedFile)); boolean copyFiles = !currentAppFile.getAbsolutePath().equals(selectedFile.getAbsolutePath()) && !mapsCopied; - if (copyFiles) { - copyFiles = false; - File[] lf = currentAppFile.listFiles(); - if (lf != null) { - for (File f : lf) { - if (f != null) { - if (f.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) { - copyFiles = true; - break; - } - } - } - } - } warningReadonly.setVisibility(copyFiles ? View.VISIBLE : View.GONE); if (copyFiles) { if (!OsmandSettings.isWritable(currentAppFile)) { @@ -135,6 +123,7 @@ public class DashChooseAppDirFragment { } copyMapsBtn.setVisibility(copyFiles ? View.VISIBLE : View.GONE); + dontCopyMapsBtn.setVisibility(copyFiles ? View.VISIBLE : View.GONE); } public View initView(LayoutInflater inflater, ViewGroup container, @@ -159,7 +148,8 @@ public class DashChooseAppDirFragment { } editBtn = (ImageView) view.findViewById(R.id.edit_icon); copyMapsBtn = view.findViewById(R.id.copy_maps); - confirmBtn = view.findViewById(R.id.confirm); + dontCopyMapsBtn = view.findViewById(R.id.dont_copy_maps); + cancelBtn = view.findViewById(R.id.cancel); addListeners(); processPermissionGranted(); updateView(); @@ -320,8 +310,50 @@ public class DashChooseAppDirFragment { copyMapsBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { - MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, currentAppFile, - selectedFile) { + @SuppressLint("StaticFieldLeak") + MoveFilesToDifferentDirectory task = new MoveFilesToDifferentDirectory(activity, currentAppFile, selectedFile) { + + private MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US); + + @NonNull + private String getFormattedSize(long sizeBytes) { + int size = (int) ((sizeBytes + 512) >> 10); + if (size >= 0) { + if (size > 100) { + return formatMb.format(new Object[]{(float) size / (1 << 10)}); + } else { + return size + " kB"; + } + } + return ""; + } + + private void showResultsDialog() { + StringBuilder sb = new StringBuilder(); + int moved = getMovedCount(); + int copied = getCopiedCount(); + int failed = getFailedCount(); + sb.append(activity.getString(R.string.files_moved, moved, getFormattedSize(getMovedSize()))).append("\n"); + if (copied > 0) { + sb.append(activity.getString(R.string.files_copied, copied, getFormattedSize(getCopiedSize()))).append("\n"); + } + if (failed > 0) { + sb.append(activity.getString(R.string.files_failed, failed, getFormattedSize(getFailedSize()))).append("\n"); + } + if (copied > 0 || failed > 0) { + int count = copied + failed; + sb.append(activity.getString(R.string.files_present, count, getFormattedSize(getCopiedSize() + getFailedSize()), selectedFile.getAbsolutePath())); + } + AlertDialog.Builder bld = new AlertDialog.Builder(activity); + bld.setMessage(sb.toString()); + bld.setPositiveButton(R.string.shared_string_restart, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + getConfirmListener(true).onClick(v); + } + }); + bld.show(); + } @Override protected void onPostExecute(Boolean result) { @@ -330,8 +362,13 @@ public class DashChooseAppDirFragment { mapsCopied = true; getMyApplication().getResourceManager().resetStoreDirectory(); // immediately proceed with change (to not loose where maps are currently located) - getConfirmListener().onClick(v); + if (getCopiedCount() > 0 || getFailedCount() > 0) { + showResultsDialog(); + } else { + getConfirmListener(false).onClick(v); + } } else { + showResultsDialog(); Toast.makeText(activity, R.string.copying_osmand_file_failed, Toast.LENGTH_SHORT).show(); updateView(); @@ -342,11 +379,18 @@ public class DashChooseAppDirFragment { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); - confirmBtn.setOnClickListener(getConfirmListener()); - + dontCopyMapsBtn.setOnClickListener(getConfirmListener(false)); + cancelBtn.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (dlg != null) { + dlg.dismiss(); + } + } + }); } - public OnClickListener getConfirmListener() { + public OnClickListener getConfirmListener(final boolean silentRestart) { return new View.OnClickListener() { @Override @@ -363,13 +407,16 @@ public class DashChooseAppDirFragment { ((FragmentActivity) activity).getSupportFragmentManager().beginTransaction() .remove(fragment).commit(); } - getMyApplication().restartApp(activity); + if (silentRestart) { + android.os.Process.killProcess(android.os.Process.myPid()); + } else { + getMyApplication().restartApp(activity); + } } else { Toast.makeText(activity, R.string.specified_directiory_not_writeable, Toast.LENGTH_LONG).show(); } - - if(dlg != null) { + if (dlg != null) { dlg.dismiss(); } } @@ -440,6 +487,12 @@ public class DashChooseAppDirFragment { private File from; protected ProgressImplementation progress; private Runnable runOnSuccess; + private int movedCount; + private long movedSize; + private int copiedCount; + private long copiedSize; + private int failedCount; + private long failedSize; public MoveFilesToDifferentDirectory(Context ctx, File from, File to) { this.ctx = ctx; @@ -450,9 +503,36 @@ public class DashChooseAppDirFragment { public void setRunOnSuccess(Runnable runOnSuccess) { this.runOnSuccess = runOnSuccess; } - + + public int getMovedCount() { + return movedCount; + } + + public int getCopiedCount() { + return copiedCount; + } + + public int getFailedCount() { + return failedCount; + } + + public long getMovedSize() { + return movedSize; + } + + public long getCopiedSize() { + return copiedSize; + } + + public long getFailedSize() { + return failedSize; + } + @Override protected void onPreExecute() { + movedCount = 0; + copiedCount = 0; + failedCount = 0; progress = ProgressImplementation.createProgressDialog( ctx, ctx.getString(R.string.copying_osmand_files), ctx.getString(R.string.copying_osmand_files_descr, to.getPath()), @@ -493,12 +573,15 @@ public class DashChooseAppDirFragment { } f.delete(); } else if (f.isFile()) { - if(t.exists()) { + if (t.exists()) { Algorithms.removeAllFiles(t); } boolean rnm = false; + long fileSize = f.length(); try { rnm = f.renameTo(t); + movedCount++; + movedSize += fileSize; } catch(RuntimeException e) { } if (!rnm) { @@ -507,6 +590,11 @@ public class DashChooseAppDirFragment { try { progress.startTask(ctx.getString(R.string.copying_osmand_one_file_descr, t.getName()), (int) (f.length() / 1024)); Algorithms.streamCopy(fin, fout, progress, 1024); + copiedCount++; + copiedSize += fileSize; + } catch (IOException e) { + failedCount++; + failedSize += fileSize; } finally { fin.close(); fout.close(); From 6cd750db46b300f163cd87a7c31d26a910604338 Mon Sep 17 00:00:00 2001 From: vshcherb Date: Tue, 23 Apr 2019 13:47:16 +0200 Subject: [PATCH 088/114] Update dash_storage_type_fragment.xml --- .../res/layout/dash_storage_type_fragment.xml | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/OsmAnd/res/layout/dash_storage_type_fragment.xml b/OsmAnd/res/layout/dash_storage_type_fragment.xml index 166ce7af99..73e48f9a9e 100644 --- a/OsmAnd/res/layout/dash_storage_type_fragment.xml +++ b/OsmAnd/res/layout/dash_storage_type_fragment.xml @@ -98,21 +98,7 @@ android:layout_height="1dp" android:layout_weight="1"/> - - - + + + + + - \ No newline at end of file + From de89766dbd12f6e624c9eca27777830ff863dba3 Mon Sep 17 00:00:00 2001 From: Chumva Date: Tue, 23 Apr 2019 15:39:50 +0300 Subject: [PATCH 089/114] Fix #6853 --- .../java/net/osmand/data/TransportRoute.java | 26 +++++++------ .../res/layout/transport_stop_route_item.xml | 1 + .../MapContextMenuFragment.java | 37 +++++++++++++++---- .../plus/mapcontextmenu/MenuBuilder.java | 3 +- .../TransportStopRouteAdapter.java | 2 +- .../RouteDetailsFragment.java | 2 +- .../cards/PublicTransportCard.java | 2 +- 7 files changed, 50 insertions(+), 23 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/data/TransportRoute.java b/OsmAnd-java/src/main/java/net/osmand/data/TransportRoute.java index b58237dfe0..a353148bce 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/TransportRoute.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/TransportRoute.java @@ -1,5 +1,10 @@ package net.osmand.data; +import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Way; +import net.osmand.util.Algorithms; +import net.osmand.util.MapUtils; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -7,11 +12,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import net.osmand.osm.edit.Node; -import net.osmand.osm.edit.Way; -import net.osmand.util.Algorithms; -import net.osmand.util.MapUtils; - public class TransportRoute extends MapObject { private List forwardStops = new ArrayList(); private String ref; @@ -221,17 +221,19 @@ public class TransportRoute extends MapObject { return d; } - public String getAdjustedRouteRef() { - if (ref != null) { - int charPos = ref.lastIndexOf(':'); + public String getAdjustedRouteRef(boolean small) { + String adjustedRef = getRef(); + if (adjustedRef != null) { + int charPos = adjustedRef.lastIndexOf(':'); if (charPos != -1) { - ref = ref.substring(0, charPos); + adjustedRef = adjustedRef.substring(0, charPos); } - if (ref.length() > 4) { - ref = ref.substring(0, 4); + int maxRefLength = small ? 5 : 8; + if (adjustedRef.length() > maxRefLength) { + adjustedRef = adjustedRef.substring(0, maxRefLength - 1) + "…"; } } - return ref; + return adjustedRef; } public boolean compareRoute(TransportRoute thatObj) { diff --git a/OsmAnd/res/layout/transport_stop_route_item.xml b/OsmAnd/res/layout/transport_stop_route_item.xml index 2e0440c0a8..fdbc20636a 100644 --- a/OsmAnd/res/layout/transport_stop_route_item.xml +++ b/OsmAnd/res/layout/transport_stop_route_item.xml @@ -14,6 +14,7 @@ android:textSize="@dimen/default_sub_text_size_small" tools:text="3" android:gravity="center" + android:maxLines="1" android:id="@+id/transport_stop_route_text" android:background="@drawable/transport_stop_route_bg" android:layout_width="match_parent" diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index 56d70ab19c..d08abc29e0 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -1339,14 +1339,16 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo if (!transportBadgesCreated) { List localTransportStopRoutes = menu.getLocalTransportStopRoutes(); List nearbyTransportStopRoutes = menu.getNearbyTransportStopRoutes(); - int localColumnsPerRow = getRoutesBadgesColumnsPerRow(null); int maxLocalRows = 0; - if (localTransportStopRoutes != null) { + if (localTransportStopRoutes != null && !localTransportStopRoutes.isEmpty()) { List localFilteredTransportStopRoutes = filterTransportRoutes(localTransportStopRoutes); + int minBadgeWidth = getMinBadgeWidth(localFilteredTransportStopRoutes); + int localColumnsPerRow = getRoutesBadgesColumnsPerRow(null, minBadgeWidth); maxLocalRows = (int) Math.round(Math.ceil((double) localFilteredTransportStopRoutes.size() / localColumnsPerRow)); + localTransportStopRoutesGrid.setColumnWidth(minBadgeWidth); updateLocalRoutesBadges(localFilteredTransportStopRoutes, localColumnsPerRow); } - if (nearbyTransportStopRoutes != null) { + if (nearbyTransportStopRoutes != null && !nearbyTransportStopRoutes.isEmpty()) { updateNearbyRoutesBadges(maxLocalRows, filterNearbyTransportRoutes(nearbyTransportStopRoutes, localTransportStopRoutes)); } transportBadgesCreated = true; @@ -1380,7 +1382,8 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo String nearInDistance = getString(R.string.transport_nearby_routes) + " " + OsmAndFormatter.getFormattedDistance(TransportStopController.SHOW_STOPS_RADIUS_METERS, getMyApplication()) + ":"; nearbyRoutesWithinTv.setText(nearInDistance); - int nearbyColumnsPerRow = getRoutesBadgesColumnsPerRow(nearInDistance); + int minBadgeWidth = getMinBadgeWidth(nearbyTransportStopRoutes); + int nearbyColumnsPerRow = getRoutesBadgesColumnsPerRow(nearInDistance, minBadgeWidth); int maxNearbyRows = Math.min(3, 6 - maxLocalRows); int nearbyMaxItems = maxNearbyRows * nearbyColumnsPerRow - 1; TransportStopRouteAdapter adapter; @@ -1389,6 +1392,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo } else { adapter = createTransportStopRouteAdapter(nearbyTransportStopRoutes, false); } + nearbyTransportStopRoutesGrid.setColumnWidth(minBadgeWidth); nearbyTransportStopRoutesGrid.setAdapter(adapter); nearbyTransportStopRoutesGrid.setVisibility(View.VISIBLE); nearbyRoutesLayout.setVisibility(View.VISIBLE); @@ -1397,9 +1401,8 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo } } - private int getRoutesBadgesColumnsPerRow(@Nullable String nearInDistance) { + private int getRoutesBadgesColumnsPerRow(@Nullable String nearInDistance, int minBadgeWidth) { try { - double badgeWidth = getResources().getDimension(R.dimen.context_menu_transport_grid_item_width); double gridSpacing = getResources().getDimension(R.dimen.context_menu_transport_grid_spacing); double gridPadding = getResources().getDimension(R.dimen.context_menu_padding_margin_default); int availableSpace; @@ -1410,11 +1413,31 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo double paddingTv = getResources().getDimension(R.dimen.context_menu_padding_margin_small); availableSpace = (int) (routesBadgesContainer.getWidth() - gridPadding * 2 - paddingTv - textWidth); } - return (int) ((availableSpace + gridSpacing) / (badgeWidth + gridSpacing)); + return (int) ((availableSpace + gridSpacing) / (minBadgeWidth + gridSpacing)); } catch (Resources.NotFoundException e) { return -1; } } + + private int getMinBadgeWidth(List transportStopRoutes) { + try { + int minBadgeWidth = getResources().getDimensionPixelSize(R.dimen.context_menu_transport_grid_item_width); + int textPadding = getResources().getDimensionPixelSize(R.dimen.context_menu_subtitle_margin); + float textSizeSmall = getResources().getDimensionPixelSize(R.dimen.default_sub_text_size_small); + + for (TransportStopRoute transportStopRoute : transportStopRoutes) { + String routeRef = transportStopRoute.route.getAdjustedRouteRef(false); + int textWidth = AndroidUtils.getTextWidth(textSizeSmall, routeRef) + textPadding * 2; + if (textWidth > minBadgeWidth) { + minBadgeWidth = textWidth; + } + } + + return minBadgeWidth; + } catch (Resources.NotFoundException e) { + return dpToPx(32); + } + } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void runLayoutListener() { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index e9d029ed40..48aea13a2d 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -796,6 +796,7 @@ public class MenuBuilder { transportRect.setTypeface(FontCache.getRobotoMedium(view.getContext())); transportRect.setTextColor(Color.WHITE); transportRect.setTextSize(10); + transportRect.setMaxLines(1); GradientDrawable shape = new GradientDrawable(); shape.setShape(GradientDrawable.RECTANGLE); @@ -805,7 +806,7 @@ public class MenuBuilder { transportRect.setTextColor(UiUtilities.getContrastColor(app, bgColor, true)); transportRect.setBackgroundDrawable(shape); - transportRect.setText(route.route.getAdjustedRouteRef()); + transportRect.setText(route.route.getAdjustedRouteRef(true)); baseView.addView(transportRect); LinearLayout infoView = new LinearLayout(view.getContext()); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/TransportStopRouteAdapter.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/TransportStopRouteAdapter.java index be3fa3b7d6..5ba498bbba 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/TransportStopRouteAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/TransportStopRouteAdapter.java @@ -45,7 +45,7 @@ public class TransportStopRouteAdapter extends ArrayAdapter { int bgColor = 0; if (object instanceof TransportStopRoute) { TransportStopRoute transportStopRoute = (TransportStopRoute) object; - routeRef = transportStopRoute.route.getAdjustedRouteRef(); + routeRef = transportStopRoute.route.getAdjustedRouteRef(false); bgColor = transportStopRoute.getColor(app, nightMode); } else if (object instanceof String) { routeRef = (String) object; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java index a75a44ca42..eebfa1eaae 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java @@ -1453,7 +1453,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT OsmandApplication app = mapActivity.getMyApplication(); LinearLayout convertView = (LinearLayout) mapActivity.getLayoutInflater().inflate(R.layout.transport_stop_route_item_with_icon, null, false); if (transportStopRoute != null) { - String routeRef = transportStopRoute.route.getAdjustedRouteRef(); + String routeRef = transportStopRoute.route.getAdjustedRouteRef(true); int bgColor = transportStopRoute.getColor(app, isNightMode()); TextView transportStopRouteTextView = (TextView) convertView.findViewById(R.id.transport_stop_route_text); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java index 792cbd59ea..2bcd283f00 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java @@ -272,7 +272,7 @@ public class PublicTransportCard extends BaseCard { TransportRoute transportRoute = segment.route; TransportStopRoute transportStopRoute = TransportStopRoute.getTransportStopRoute(transportRoute, segment.getStart()); - String routeRef = segment.route.getAdjustedRouteRef(); + String routeRef = segment.route.getAdjustedRouteRef(true); int bgColor = transportStopRoute.getColor(app, nightMode); TextView transportStopRouteTextView = (TextView) bageView.findViewById(R.id.transport_stop_route_text); From 8e734f19f5de78b37bcd55c7b13165550cf9ca49 Mon Sep 17 00:00:00 2001 From: syl Date: Mon, 22 Apr 2019 12:42:32 +0000 Subject: [PATCH 090/114] Translated using Weblate (French) Currently translated at 91.6% (3265 of 3565 strings) --- OsmAnd/res/values-fr/phrases.xml | 40 ++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml index ab79bc92b0..5c13a8baab 100644 --- a/OsmAnd/res/values-fr/phrases.xml +++ b/OsmAnd/res/values-fr/phrases.xml @@ -540,7 +540,7 @@ Barrière de péage Rampe pour véhicules Arrêt de trolleybus - Arrêt de tramway + Arrêt de tram Remontée mécanique Colonne d\'alimentation Migration @@ -3205,7 +3205,7 @@ Magasin de vente en gros Laboratoire médical Don du sang - Académique + Scolaire Enfants Nom du tir (anglais) Sidda @@ -3249,4 +3249,40 @@ Salve d\'explosion : première détonation d\'un test de salve Salve d\'explosion : deuxième détonation ou détonation ultérieure d\'un test de salve Explosion : dispositif + Services de santé : soutien : oui + Services de santé : soutien : non + Services de santé : test : oui + Services de santé : test : non + Type d\'établissement de santé : département + Transport + Distribution + Traction + Conversion + Compensation + Bande dessinée + Ancien + Religion + Oui + Train + Bus + Métro + VOM + Tram + Ferry + Source d\'énergie : biomasse + н/к + н/к* + + 1А* + + 1Б* + + 2А* + + 2Б* + + 3А* + + 3Б* + Oui \ No newline at end of file From 668c4ff03a638f6a6b606b2e76614fd12973e271 Mon Sep 17 00:00:00 2001 From: Zmicer Turok Date: Tue, 23 Apr 2019 18:58:29 +0000 Subject: [PATCH 091/114] Translated using Weblate (Belarusian) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-be/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index c9e51959eb..a2d6c55296 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -3032,4 +3032,5 @@ \n • Пры вымярэнні адлегласці будзе адлюстроўвацца азімут \n \n + Адправіць журнал \ No newline at end of file From 71a26d0af99c46593eee1acd1116c582e5383e14 Mon Sep 17 00:00:00 2001 From: josep constanti Date: Sun, 21 Apr 2019 15:50:46 +0000 Subject: [PATCH 092/114] Translated using Weblate (Catalan) Currently translated at 100.0% (219 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/ca/ --- OsmAnd-telegram/res/values-ca/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-ca/strings.xml b/OsmAnd-telegram/res/values-ca/strings.xml index 815b73873e..a2399368b0 100644 --- a/OsmAnd-telegram/res/values-ca/strings.xml +++ b/OsmAnd-telegram/res/values-ca/strings.xml @@ -217,4 +217,8 @@ OsmAnd Tracker us permet compartir la vostra posició i veure la dels altres a OsmAnd.

L\'aplicació utilitza l\'API de Telegram, per tant us cal un compte de Telegram.
+ Adreça + Precisió + Altitud + Trajectòria \ No newline at end of file From bdf290a8d88570e93d0a615178a78d085aad092c Mon Sep 17 00:00:00 2001 From: Boyuan Yang <073plan@gmail.com> Date: Sun, 21 Apr 2019 13:37:17 +0000 Subject: [PATCH 093/114] Translated using Weblate (Chinese (Simplified)) Currently translated at 70.9% (1949 of 2750 strings) --- OsmAnd/res/values-zh-rCN/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index f998f5ea10..c3d015cd93 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -876,14 +876,14 @@ 移除 阅读更多 增加时间跨度 - 道路堵塞 + 道路被阻塞 选择 隐藏 POI 图标 项目已移除 项目已移除 全部撤销 类型 - 起始标点 + 起始点 未选取 存储大小 可用地图 @@ -1300,8 +1300,8 @@ 选择设置对应场景 允许私有访问 重量限制 - 避开阶梯 - 避开阶梯 + 避免阶梯 + 避免阶梯 避开边界穿越 避免穿越边境线进入其它国家 指定路线上允许的车辆重量 From 8b022de8a79151a7e3fdd336d5a1415521b4956c Mon Sep 17 00:00:00 2001 From: Boyuan Yang <073plan@gmail.com> Date: Sun, 21 Apr 2019 13:44:04 +0000 Subject: [PATCH 094/114] Translated using Weblate (Chinese (Simplified)) Currently translated at 1.7% (62 of 3565 strings) --- OsmAnd/res/values-zh-rCN/phrases.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OsmAnd/res/values-zh-rCN/phrases.xml b/OsmAnd/res/values-zh-rCN/phrases.xml index b55ebe113f..9f1f53bca6 100644 --- a/OsmAnd/res/values-zh-rCN/phrases.xml +++ b/OsmAnd/res/values-zh-rCN/phrases.xml @@ -56,4 +56,12 @@ 火车 公交 地铁 + 类型 + 类型 + 支付类型(交通) + 自助餐厅 + 水净化 + 交通 + 公共交通 + 教育 \ No newline at end of file From 23a50c31e967d2e5b2a8c50801792b3d19d03011 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 23 Apr 2019 02:28:21 +0000 Subject: [PATCH 095/114] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-zh-rTW/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml index 015e31a145..bd8496cefb 100644 --- a/OsmAnd/res/values-zh-rTW/phrases.xml +++ b/OsmAnd/res/values-zh-rTW/phrases.xml @@ -3577,4 +3577,7 @@ 3Б* 燃燒塔 已刪除的物件 + 攀岩 + 急救箱 + \ No newline at end of file From 9ab37992783eb70003a0622d939841782b7cd84f Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 23 Apr 2019 02:24:59 +0000 Subject: [PATCH 096/114] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index cf725cfb82..ec1ccaa4e7 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -268,7 +268,7 @@ 點鐘 精確性 - 海拔高度 + 高度 沒有數據 橫向 (8 個扇區) 順時鐘 (12 個扇區) From 86239db95a78f2ee9c54a42757d201f3324ec0db Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 23 Apr 2019 02:23:34 +0000 Subject: [PATCH 097/114] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (219 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/zh_Hant/ --- OsmAnd-telegram/res/values-zh-rTW/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-zh-rTW/strings.xml b/OsmAnd-telegram/res/values-zh-rTW/strings.xml index 8be91c7f30..eb8fd80bb6 100644 --- a/OsmAnd-telegram/res/values-zh-rTW/strings.xml +++ b/OsmAnd-telegram/res/values-zh-rTW/strings.xml @@ -218,4 +218,8 @@ 搜尋您所有的群組與聯絡人。 輸入聯絡人或群組名稱 搜尋 + 方向 + 精確 + 高度 + 方位 \ No newline at end of file From d777ad3a3256f3cbedc3e0024f258462f5a0071d Mon Sep 17 00:00:00 2001 From: jan madsen Date: Mon, 22 Apr 2019 05:47:39 +0000 Subject: [PATCH 098/114] Translated using Weblate (Danish) Currently translated at 99.1% (217 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/da/ --- OsmAnd-telegram/res/values-da/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd-telegram/res/values-da/strings.xml b/OsmAnd-telegram/res/values-da/strings.xml index b68ebcc8a0..ca4b742713 100644 --- a/OsmAnd-telegram/res/values-da/strings.xml +++ b/OsmAnd-telegram/res/values-da/strings.xml @@ -217,4 +217,7 @@ Søg på tværs af alle grupper og kontaktpersoner. Skriv navnet på kontakt eller gruppe Søg + Retning + Højde + Kurs \ No newline at end of file From c87598c326cad2e32c4abec4e9d5b1b5c6e30f66 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Mon, 22 Apr 2019 20:49:17 +0000 Subject: [PATCH 099/114] Translated using Weblate (Esperanto) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-eo/phrases.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index 9b82caaa02..e9955fb56e 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -1069,8 +1069,8 @@ ne jes ne - gardata - negardata + Gardata + Negardata jes ne seka sezono @@ -1079,9 +1079,9 @@ somero aŭtuno vintro - Trafiklumoj - Sen trafiklumoj - Nemarkita + kun trafiklumoj + sen trafiklumoj + nemarkita Ekestis je jes ne @@ -1294,7 +1294,7 @@ Mezuma vojaĝ-tempo (en minutoj) Tegmenteto Sen tegmenteto - Jes + jes Sen hejtado jes Bicikloj: malpermesataj @@ -2086,8 +2086,8 @@ Civilizo: Ciklada kulturo Civilizo: Minoa kulturo Civilizo: Tiahuanaco-kulturo - Hundoj - Ĉevaloj + hundoj + ĉevaloj Ĉevaloj permesataj Ĉevaloj malpermesataj Bestoj permesitaj @@ -2755,8 +2755,8 @@ Pagmaniero Aldona Materialoj-por-metio-vendejo - Ŝargo: jes - Ŝargo: ne + ŝargo + ŝargo: ne Brulaĵ-tipo (avia) Brulaĵ-kartoj Interret-aliro @@ -2769,7 +2769,7 @@ Fonto de akvo Pagmaniero Sono - Speco + Speco de stratpasejo Reliefo por blinduloj Servo Senbrosa @@ -2779,7 +2779,7 @@ Kovrita Metroa stacio Portaĵo de - Speco + Speco de bicikl‑parkumejo Transportado de bicikloj Hejtado Pumpilo @@ -2814,9 +2814,9 @@ Kokteloj Metia bierfarejeto Servo - Speco + Speco de recikligejo Akceptataj ruboj - Speco + Speco de ŝirmejo Kameno Sezona Akvospeco @@ -3167,7 +3167,7 @@ Akvoskoteroj: ne Velboatoj: jes Velboatoj: ne - Remboatoj :jes + Remboatoj: jes Remboatoj: ne Kajakoj: jes Kajakoj: ne @@ -3539,7 +3539,7 @@ Atolo Telekontrolo de vojimposto Infan/bebo‑vartejo - Signifo + Signifo de arbo natura monumento orientiĝa punkto Parkumu kaj veturu (P+R) From c2487fc9985e87ca7e7225027fa4009ebe2e83cb Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Mon, 22 Apr 2019 13:13:50 +0000 Subject: [PATCH 100/114] Translated using Weblate (French) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-fr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 9ae768572d..fd43ebef46 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1310,7 +1310,7 @@ Mémoire proportionnelle %4$s Mo (limite Android %5$s Mo, Dalvik %6$s Mo).h Durée Distance - Lignes de bus, trolleybus, et navettes + Lignes de bus, trolleybus et navettes Enregistrer l\'itinéraire dans un fichier GPX L\'enregistrement des positions dans un fichier GPX peut être activé ou désactivé depuis le gadget de la carte Intervalle d\'enregistrement @@ -1350,7 +1350,7 @@ Mémoire proportionnelle %4$s Mo (limite Android %5$s Mo, Dalvik %6$s Mo).Lignes de bus Lignes de trolleybus Itinéraires de chemin de fer - Voies de tram + Lignes de tram Voies partagées pour les taxis Lignes de tram et train Éviter les routes… From 44699694521ad729dde38495339713c799b27ad3 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sun, 21 Apr 2019 11:30:27 +0000 Subject: [PATCH 101/114] Translated using Weblate (Hebrew) Currently translated at 99.5% (218 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/he/ --- OsmAnd-telegram/res/values-he/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-he/strings.xml b/OsmAnd-telegram/res/values-he/strings.xml index 042975ffb2..2f0a092be0 100644 --- a/OsmAnd-telegram/res/values-he/strings.xml +++ b/OsmAnd-telegram/res/values-he/strings.xml @@ -216,4 +216,8 @@ חיפוש בין כל הקבוצות ואנשי הקשר שלך. נא להקליד שם איש קשר או קבוצה חיפוש + כיוון + דיוק + גובה + תכווין \ No newline at end of file From e1502c4245085b52fe713ad5265e7fa4b7156047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Babos=20G=C3=A1bor?= Date: Mon, 22 Apr 2019 11:31:49 +0000 Subject: [PATCH 102/114] Translated using Weblate (Hungarian) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-hu/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index 96a26a48f9..37079e21ca 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -3572,4 +3572,7 @@ Sugárkezelés Ellenőrző mérőműszer Kutakból jövő anyag gyűjtőhelye + Mászószikla + Hegyi mentőláda + Igen \ No newline at end of file From 861654d6403f5513adbf137e71aaffcf6654c76a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Sun, 21 Apr 2019 22:43:54 +0000 Subject: [PATCH 103/114] Translated using Weblate (Icelandic) Currently translated at 100.0% (3565 of 3565 strings) --- OsmAnd/res/values-is/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index 7f12ecee3b..7ca02e3147 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -3563,4 +3563,7 @@ Gaslogi;Gasbrennarar Eytt atriði Geislameðferð + Klifursvæði + Björgunarkassi + \ No newline at end of file From a64c7a98928ccc24581723da4b28374d83b6df1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Sun, 21 Apr 2019 22:42:20 +0000 Subject: [PATCH 104/114] Translated using Weblate (Icelandic) Currently translated at 100.0% (2750 of 2750 strings) --- OsmAnd/res/values-is/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index 92033c10bb..dc50dba206 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3040,4 +3040,5 @@ Stendur fyrir svæði: %1$s x %2$s \n • Birting áttarhorns við mælingu vegalengda \n \n + Senda atvikaskrá \ No newline at end of file From 3144eb3dd9f1d012d659cf13b15a8ff4f823f61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Sun, 21 Apr 2019 14:37:37 +0000 Subject: [PATCH 105/114] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.8% (212 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/nb_NO/ --- OsmAnd-telegram/res/values-nb/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-nb/strings.xml b/OsmAnd-telegram/res/values-nb/strings.xml index 0b9c0c1c08..8c05b8cdf7 100644 --- a/OsmAnd-telegram/res/values-nb/strings.xml +++ b/OsmAnd-telegram/res/values-nb/strings.xml @@ -217,4 +217,8 @@ Søk gjennom alle dine grupper og kontakter. Skriv kontakt- eller gruppenavn Søk + Retning + Nøyaktighet + Høyde + Kurs \ No newline at end of file From 809a4517ed240bc1bb0bcc0187107df289badeac Mon Sep 17 00:00:00 2001 From: iman Date: Mon, 22 Apr 2019 14:35:45 +0000 Subject: [PATCH 106/114] Translated using Weblate (Persian) Currently translated at 99.9% (2749 of 2750 strings) --- OsmAnd/res/values-fa/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index b572e9feeb..ebac73eebe 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -712,7 +712,7 @@ برخی جزئیات نقشهٔ بُرداری (جاده‌ها و...) را در زوم‌های کمتر نشان می‌دهد. نقطه‌های برگزیده حذف شد. آیا از حذف %1$d نقطهٔ برگزیده و %2$d گروه مطمئن هستید؟ - نقشه پایهٔ جهان را دانلود کنید تا نمایی از سراسر جهان با امکان بزرگ‌نمایی اندک داشته باشید. + نقشه پایهٔ جهان را دانلود کنید تا نمایی از سراسر جهان با بزرگ‌نمایی کم داشته باشید. نسخهٔ محلی بازکردن داده‌های جدید… یکی از سرویس‌های مسیریابی آنلاین را انتخاب کرده‌اید اما به اینترنت متصل نیستید. @@ -2787,14 +2787,14 @@ گرفتن دسترسی نامحدود به ارزیابی همگانی نسخهٔ بتا خوش آمدید نقشه‌های منحنی تراز و سایه‌روشن - با پرداخت %1$s مقاله‌های ویکی‌سفر را دانلود کنید تا آن‌ها را آفلاین بخوانید. + مقاله‌های ویکی‌سفر %1$s را دانلود کنید تا آن‌ها را آفلاین بخوانید. دریافت داده‌های ویکی‌پدیا بازکردن مقالهٔ آنلاین این مقاله را در مرورگر اینترنت مشاهده کنید. این منطقه جست‌وجو به‌دنبال مقالهٔ همخوان از ویکی مقاله پیدا نشد - چگونه مقاله‌های ویکی‌پدیا را باز کنیم؟ + مقاله‌های ویکی‌پدیا چگونه باز شوند؟ مقصدهای محبوب تیم OsmAnd بر اساس مقالاتی که نشانک زده‌اید، پیشنهاد می‌کنیم این نقشه‌ها را دانلود کنید: From 46f5422ad3da49e35bc2cfbac211b01f75ff1421 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Tue, 23 Apr 2019 09:11:39 +0000 Subject: [PATCH 107/114] Translated using Weblate (Polish) Currently translated at 99.5% (218 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/pl/ --- OsmAnd-telegram/res/values-pl/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd-telegram/res/values-pl/strings.xml b/OsmAnd-telegram/res/values-pl/strings.xml index c6e37bc364..1742317041 100644 --- a/OsmAnd-telegram/res/values-pl/strings.xml +++ b/OsmAnd-telegram/res/values-pl/strings.xml @@ -219,4 +219,7 @@ Przeszukaj wszystkie swoje grupy i kontakty. Wpisz nazwę kontaktu lub grupy Szukaj + Kierunek + Precyzja + Wysokość \ No newline at end of file From 3df6ed697def1d2ff6d467c3d58483d208780040 Mon Sep 17 00:00:00 2001 From: Verdulo Date: Sun, 21 Apr 2019 11:31:36 +0000 Subject: [PATCH 108/114] Translated using Weblate (Polish) Currently translated at 99.9% (3564 of 3565 strings) --- OsmAnd/res/values-pl/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-pl/phrases.xml b/OsmAnd/res/values-pl/phrases.xml index c9ba34c133..0472080201 100644 --- a/OsmAnd/res/values-pl/phrases.xml +++ b/OsmAnd/res/values-pl/phrases.xml @@ -3511,7 +3511,7 @@ Ruiny Nauka jazdy Wzgórze - ATM + Bankomat Naprawa obuwia Zakup hurtowy Rodzaj From 22d9688d9741086402013439f443b0a91a216523 Mon Sep 17 00:00:00 2001 From: Razvan D Date: Sun, 21 Apr 2019 14:30:04 +0000 Subject: [PATCH 109/114] Translated using Weblate (Romanian) Currently translated at 71.8% (1974 of 2750 strings) --- OsmAnd/res/values-ro/strings.xml | 649 ++++++++++++++++++++----------- 1 file changed, 415 insertions(+), 234 deletions(-) diff --git a/OsmAnd/res/values-ro/strings.xml b/OsmAnd/res/values-ro/strings.xml index eeb60be659..3454fe7c75 100644 --- a/OsmAnd/res/values-ro/strings.xml +++ b/OsmAnd/res/values-ro/strings.xml @@ -1,7 +1,7 @@ - Serviciul sleep încă rulează în background. Doriți să-l opriți? - Închide setul de modificări + Serviciul de fundal OsmAnd încă funcționează. Doriți să-l opriți\? + Închideți setul de modificări Aplicația ZXing Barcode Scanner nu este instalată. Doriți să o descărcați din Market? Selectați o schemă de culori pentru drumuri: Schema de culori drumuri @@ -13,13 +13,13 @@ Nu există rută Șterge punctul intermediar Destinația %1$s - Punct intermediar %1$s + Destinație intermediară %1$s Adaugă ca ultim punct intermediar Adaugă ca prim punct intermediar Adaugă ca ultimă destinație Adaugă ca primă destinație Înlocuiește destinația curentă - Aveți deja stabilită o destinație. + Ați stabilit deja o destinație: Puncte intermediare Punctul intermediar %1$s este prea departe de vreun drum. Ați ajuns la punctul intermediar @@ -36,7 +36,7 @@ Restaurante Atracții turistice Servicii auto - Produse alimentare + Magazin de alimente Pentru turiști Stații de carburanți Atenționări trafic… @@ -132,7 +132,7 @@ AM Locul de parcare Acest plugin permite memorarea locului unde ați parcat mașina. - Plugin poziție parcare + Poziție parcare Marchează ca poziție parcare Ștergeți un marker de parcare Public @@ -167,10 +167,10 @@ Doriți să întrerupeți descărcarea fișierului? Mulțumim pentru că folosiți OsmAnd. Pentru a beneficia de toate funcționalitățile acestei aplicații aveți nevoie de un set de date regionale pe care le puteți descărca via \'Setări\' -> \'Organizează fișierele cu hărți\'. După aceea veți putea să vizualizați hărți, să găsiți adrese, să localizați puncte de interes (POI), și să găsiți transport public. Harta de bază (basemap) este necesară pentru corecta funcționare a aplicației și a fost automat selectată pentru descărcare. - Nu s-a găsit nimic. Dacă nu puteți localiza harta regiunii care vă interesează, o puteți crea dvs. (vedeți http://osmand.net). + Nu s-a găsit nimic. Dacă nu puteți localiza harta regiunii care vă interesează, o puteți crea dvs. (vedeți https://osmand.net). Hărți raster și online Hărți offline (vectoriale) - Descarcă și organizează hărțile offline stocate pe dispozitivul tău + Descărcați și gestionați fișiere de hărți offline stocate pe dispozitiv. Activează plugin-ul pentru hărți online ca să beneficiezi și de alte surse de date Hărți online și în format raster Folosește hărți online (descarcă și salvează porțiuni de hartă pe cardul SD) @@ -307,7 +307,7 @@ Mod standby Folosit pentru ca OsmAnd să poată funcționa când telefonul este în standby Nu există spațiu suficient pentru descărcarea a %1$s MB (liber: %2$s). - Sigur s-au descărcat {0} fișiere? Necesită {1} MB permanent. În prezent sunt {2} MB disponibili. + Descarc {0} fișiere\? Necesită {1} MB permanent. (În prezent sunt {2} MB disponibili.) Temă transparentă Librăria nativă nu este suportată de acest dispozitiv. Se inițializează librăria nativă… @@ -348,7 +348,7 @@ Ultima afișare a hărții Origine: Căutare în împrejurimi - Salvează ruta ca traseu GPX + Salvați ca fișier GPX nou Rută salvată cu succes ca \'%1$s\'. Numele fișierului: Există un fișier cu același nume. @@ -368,14 +368,16 @@ Nu, mulțumesc Lipsește harta lumii de bază - conține întreg globul la nivel mic de zoom. Vă rog să considerați descărcarea hărții World_basemap_*.obf pentru a completa mediul de lucru. Datele locale, (\'offline\'), lipsesc de pe cardul SD. Vă rog să considerați descărcarea acestora pentru a putea folosi hărți offline. - \n\nApăsați prelung pentru afișarea opțiunilor + " +\n +\nApăsați lung pentru afișarea opțiunilor" Ediție %1$d din %2$d element(e) dezactivate cu succes. %1$d din %2$d element(e) șterse cu succes. %1$d din %2$d element(e) activate cu succes. Niciun element de %1$s Sunteți pe cale de a %1$s %2$s element(e). Continuați? - Organizează fișierele cu hărți + Organizați fișierele cu hărți. Activați Dezactivați Descărcați @@ -394,7 +396,7 @@ Info depanare randare Afișare date despre performanțele procesului de randare Dezarhivare date noi… - Este selectat un serviciu de navigație online dar nu există conexiune la Internet. + Este selectat un serviciu de navigație online, dar nu sunteți conectat la Internet. Limba nu este suportată Limba selectată nu este suportată de motorul Android TTS selectat. Doriți să mergeți la Market și să căutați un alt motor TTS? Dacă nu, se va folosi limba TTS curentă. Lipsă date despre limbă @@ -422,7 +424,7 @@ Alege harta de deasupra Harta este deja instalată, setările vor fi actualizate Selectați porțiunile de hartă raster pentru instalare sau actualizare - Pentru această operație este nevoie de o conexiune la internet iar aceasta nu este disponibilă + Nu se poate efectua operațiunea fără conexiune la Internet. Instalați mai multe… Nivelul de zoom pentru comutarea la harta vectorială offline Nivel zoom hartă vectorială @@ -431,7 +433,7 @@ Nu s-a putut analiza informația geo \'%s\' Căutare adrese folosind hărți offline Conform dispozitiv - Selectare limbă de afișare (vă rog reporniți OsmAnd după modificare) + Selectați limba de afișare (are efect atunci când OsmAnd este repornit). Limba de afișare Următorul Precedentul @@ -444,11 +446,11 @@ ft mph mi - Distribuie poziția curentă folosind + Distribuiți locația folosind Poziția: %1$s\n%2$s Pentru a vizualiza poziția curentă deschideți linkul într-un browser de internet %1$s sau urmăriți linkul android %2$s Trimite poziția curentă - Distribuie poziția curentă + Distribuiți locația Waypoint \'\'{0}\'\' adăugat cu succes Adaugă un waypoint la un traseu GPX înregistrat Adaugă waypoint GPX @@ -477,7 +479,7 @@ Indexare hărți… Indexare POI… Indexare transport… - A survenit o eroare de citire/scriere + Eroare de citire/scriere km km/h m @@ -594,7 +596,7 @@ Filtrează Sunetul e activ Sunetul e inactiv - Alegeți vocea pentru ghidare folosită la navigare + Alegeți vocea pentru ghidare folosită la navigare. Vocea pentru ghidare Se inițializează vocea… Versiune de voce nesuportată @@ -636,7 +638,7 @@ Lungime itinerariu Transport OK - Arată pe hartă stațiile mijloacelor de transport public + Afișați opririle de transport public pe hartă. Arată stații transport public Aplicația pentru navigare OsmAnd POI actualizate cu succes (au fost încărcate {0}) @@ -667,11 +669,11 @@ Distanța totală %1$s,\n timp %2$d h %3$d m. Alegeți un serviciu de rutare online sau offline Serviciu de rutare - Directorul de pe cardul SD unde se salvează date nu este accesibil! + Directorul de pe cardul de memorie unde se salvează datele nu este accesibil! Descărcați {0} - {1} ? Harta offline pentru {0} există deja ({1}). Doriți să o actualizați ({2}) ? Adresă - Descărcare efectuată cu succes + Descărcate Se descarcă lista hărților disponibile… Lista hărților disponibile nu s-a descărcat de la osmand.net. Punctul favorit a fost editat @@ -702,7 +704,7 @@ Ați ajuns la destinație Coordonatele nu sunt valide! Înapoi la harta OsmAnd - Închide + Închideți Se încarcă date… Se citesc date locale… Ultima rulare OsmAnd s-a terminat anormal. Fișierul log este în {0}. Vă rog să raportați acest lucru și să atașați fișierul log. @@ -716,16 +718,16 @@ Editare OSM Setări adiționale Setări - Se salvează traseul curent pe cardul SD - Salvează traseul GPX curent + Salvează traseul curent ca fișier GPX acum. + Salvează traseul curent Interval de salvare a poziției in timpul navigării - Se alege intervalul de timp de salvare a poziției în timpul navigării - Traseele vor fi salvate în directorul tracks în timpul navigării - Salvează traseul GPX in timpul navigării + Alegeți intervalul de logare pentru înregistrarea traseului în timpul navigării. + Traseele vor fi salvate în directorul traseelor în timpul navigării. + Înregistrează automat traseul în timpul navigării Actualizare hartă Reîncarcă porțiunile de hartă raster Punct țintă - Adaugă la Favorite + Adaugă la \'Favorite\' Alege între folosirea pe hartă a denumirilor în limba nativă sau în engleză Denumiri pe hartă în engleză Setări aplicație @@ -781,7 +783,7 @@ Actualizează hartă Creează POI Da - Anulează + Anulați Aplică Adaugă Nu @@ -794,8 +796,8 @@ Punctul favorit {0} a fost șters. Mesaj Nume autor - Comentariul a fost adăugat cu succes - Eroare: comentariul nu a fost adăugat + Comentariu adăugat + Nu s-a putut adăuga comentariul Editare POI Creează POI POI-ul nu poate fi găsit sau punctul de interes nu este singular @@ -839,7 +841,7 @@ Dezactivează afișarea limitelor administrative 5-9 Curbe de nivel părți - Plugin SRTM + Contur Linii Alte hărți Hărți SRTM Plugin note audio @@ -889,13 +891,13 @@ Evită drumurile cu taxă Evită drumurile cu taxă Evită drumurile neasfaltate - Evită drumurile neasfaltate + Evită drumurile neasfaltate. Evită feriboturile Evită feriboturile Evită autostrăzile Evită autostrăzile Limită greutate - Specifică limita de greutate pentru vehicule permisă pe rute + Specificați limita permisă a greutății vehiculului pe rute. Începând cu versiunea de Android 4.4 (KitKat) nu poți descărca și actualiza harta în directorul de stocare anterior (%s). Vrei să modifici locația de stocare la un permisivă și să copiezi toate fișierele OsmAnd acolo?\n Nota 1: Fișierele vechi vor rămâne nemodificate (dar pot fi șterse manual). \n Nota 2: În noua locație de stocare nu va fi posibilă partajarea fișierelor între OsmAnd și OsmAnd+. Se copiază fișierul (%s) la noua destinație… @@ -905,7 +907,7 @@ Camion Preferințe navigație Preferințe rutare - Specifică rata de vorbire pentru TTS + Specifică rata de vorbire pentru TTS. Rată vorbire Profile aplicație Drumeție @@ -917,7 +919,7 @@ Vă rog, mai întâi calculați ruta Simulează folosind ruta calculată Simulează folosind traseul GPX - Reține alegerea mea + Reține alegerea și sau Prea apropiat @@ -934,7 +936,7 @@ Alege una existentă… Definește/Editează… Informații depanare FPS - Selectați regiunea de conducere: US, Europa, UK, Asia și altele + Selectați regiunea de conducere: USA, Europa, UK, Asia și altele. Regiunea de conducere Japonia Statele Unite @@ -978,7 +980,7 @@ %1$d fișiere rămase Mai puteți descărca %1$d fișiere Versiune completă - Anulează rută + Anulați ruta Oprește navigarea Șterge destinația Stradă @@ -1008,13 +1010,13 @@ Poza %1$s %2$s Faceți o poză Faceți o poză - Doriți să utilizați traseul afișat pentru navigare? + Utilizați traseul afișat pentru navigare\? Adaugă ca și punct destinație Selectează pe hartă Favorite Preferă autostrăzi Preferă autostrăzi - Dezactivează rutarea în 2 faze pentru navigarea auto + Dezactivează rutarea în două faze pentru navigarea auto. Dezactivează rutarea complexă Baliză Limită viteză @@ -1024,21 +1026,21 @@ Limitator viteză Cameră trafic Avertizare trafic - Anunță punctele favoritele apropiate - Anunță punctele de interes apropiate + Favorite apropiate + Puncte de interes apropiate Avertizări trafic - Opresc modul sleep al GPS-ului? + Opriți modul de fundal GPS\? Oprire Intreabă intotdeauna - Alege intervalul de logare pentru inregistrarea generala a track-urilor(activat prin intermediul widget-ului de inregistrare GPX) + Alege intervalul de logare pentru înregistrarea generală a traseelor (activat prin intermediul widget-ului de înregistrare GPX). Interval general de logare - Activează modul sleep al GPS-ului + Activați modul de fundal GPS Salveaza track-ul intr-un fișier GPX - Salvarea pozitiei generale intr-un fișier GPX poate fi activată prin intermediul widget-ului de inregistrare GPX de pe fereastra hărții + Salvarea pozitiei generale într-un fișier GPX poate fi activată prin intermediul widget-ului de inregistrare GPX de pe fereastra hărții. Interval de salvare Autobuz, troleibuz, rute de transfer Înregistrare călătorie - Configurare mod înregistrare călătorie + Configurare mod înregistrare călătorii. h Durată Distanță @@ -1050,89 +1052,91 @@ Mașină Bicicletă Pieton - Cladiri colorate + Colorare clădiri după tip Coninuați navigația Întrerupeți navigația - Limba de afișare preferată + Limba preferată pentru hartă Nume locale Intervalul de trezire al GPS-ului Călătorii - Inregistrează călătoriile + Înregistrarea călătoriei Rute metrou Păstrează - Limba preferată pentru marcajele de pe hartă ( daca nu sunt disponibile se va comuta în limba Engleză sau pe denumirile locale) + Limba preferată pentru etichetele de pe hartă (dacă nu sunt disponibile, vor fi utilizate numele în limba engleză sau denumirile locale). Înainte Acasă - Se trimite monitorizarea catre un serviciu web dacă înregistrarea GPX este activată. + Se trimit datele de monitorizarea către un serviciu web dacă înregistrarea GPX este activată. Monitorizare online (GPS necesar) Porniți monitorizarea online Opriți monitorizarea online Porniți înregistrarea GPX Opriți înregistrarea GPX Începeți un segment nou - Ascunde clădirile - Acunde drumurile care nu sunt pentru vehicule - Ascunde textul + Clădiri + drumurile care nu sunt pentru vehicule + Text Clădirile la nivel de zoom 15 Mai multe detalii Mai puține detalii - Ascunde restricțiile de acces - Arată restricțiile de acces + Restricții de acces + Arată restricțiile de acces și taxele de trecere Arată calitatea drumului Arată suprafața drumului Arată rutele pentru biciclete - Nu a fost gasit nimic de descărcat, vă rugăm să verificați conexiunea la internet. + Descărcările nu au fost găsite, verificați conexiunea la Internet. Selectați pentru afișare Intervalul de împărțire Sortare după distanță Sortare după nume - Arată butoanele de zoom în timpul navigării + Arată butoanele de zoom în timpul navigării. Arată butoanele de zoom - Salvează ca grup sau favorite - Selectează punctele de reper - Etichete puncte + Salvează ca grup de Favorite + Selectați destinațiile + Etichete deasupra POI Încărcare %1$s… Ora curentă Punct de reper - Niciun fișier GPX selectat. Pentru a selecta țineți apăsat pe un track disponibil. - \n\nȚineți apăsat pentru a vedea pe hartă + Nu s-au selectat fișiere GPX. Selectează unul printr-o atingere lungă. + " +\n +\nApăsați lung pentru a vizualiza pe hartă" Selectat selectat Porniți ghidarea asistată automat - "Subtrack-uri: %1$s " - "Puncte de reper: %1$s " - "Distanță: %1$s (%2$s points) " - "Timp pornire: %1$tF, %1$tT " - "Timp sosire: %1$tF, %1$tT " - "Viteza medie: %1$s " - "Viteza maximă: %1$s " + Subtrack-uri: %1$s + Puncte de reper: %1$s + Distanță: %1$s (%2$s puncte) + Timp pornire: %1$tF, %1$tT + Timp sosire: %1$tF, %1$tT + Viteza medie: %1$s + Viteza maximă: %1$s Altitudinea medie: %1$s Segment Salvează înregistrările cu o singură atingere a ecranului. Arată setările pentru înregistrarea traseelor și stocarea locală în fișiere GPX folosind un serviciu web. Tip de focalizare al camerei - Selectați tipul de focalizare al camerei interne + Selectați modul de focalizare al camerei interne. Auto focalizare Focalizare hiperfocală Focalizarea este setata la infinit Macro(de aproape) mod de focalizare Camera focalizează in mod continuu Sunet la fotografiere - Ascunde paduri si arbori + Păduri și arbori Limită altitudine: %1$s Coboară/urcă: %1$s Interval de timp: %1$s - " %1$s puncte" + %1$s puncte Punct %1$s %1$s ↵\nPuncte rută %2$s %1$s ↵\nPuncte %1$s ↵\nTrack %2$s - Favoritele mele + Favorite Locurile mele Roz Maro Culoare afișare Nume puncte favorite duplicate - Am schimbat numele punctelor favorite în %1$s pentru a evita numele duplicate. + Numele Favorit specificat este deja în uz, a fost schimbat în %1$s pentru a evita duplicarea. Setați mărimea textului pe hartă. Mărimea textului Lumină stradală @@ -1140,20 +1144,20 @@ Puncte Poziția mea Acasă - Anunţă treceri pietonale + Treceri pietonale Stil drum Implicit Portocaliu Trecere de cale ferată Trecere de pietoni - Descarcă o versiune de test - Configurare un proxy internet de comunicare + Descarcă o versiune de test. + Specificați un server proxy. Confidenţialitate - Arată trecerile peste calea ferata - Arată trecerile pietonale + Treceri peste calea ferată + Treceri pietonale Atlas rutier american - Nu folosi reguli de rute introduse in v1.9 - Vrei să descărci hărţi offline? + Nu folosiți reguli de rute introduse in v1.9. + Descărcați hărțile offline\? Aţi descărcat %1$s hărţi Descarcă hartă nouă Gestionează @@ -1176,7 +1180,7 @@ Niciodată Evită drumurile… Rute tren - Partajează rutele de taxi + Distribuiți rutele de taxi Rute troleibuz Rute autobuz Ascunde @@ -1195,14 +1199,14 @@ Logat ca %1$s Toleranță limită de viteză Imprimă ruta - Activează Proxy-ul HTTP + Activați proxy-ul HTTP Gazdă Proxy Port Proxy - Configurează numărul pentru portul proxy (de ex. 8118) + Configurați numărul portului proxy (de ex. 8118). Swahili Ebraică Timpul în mişcare: %1$s - Traseul Gpx este gol + Fișier GPX gol Traseele mele Format invalid: %s "Parolă OSM (opţional)" @@ -1210,8 +1214,8 @@ Atlas rutier german Versiuni Rute tramvai - Configurare proxy HTTP pentru toate solicitările de rețea - Configurează gazda proxy-ului (de ex. 127.0.0.1) + Configurați un proxy HTTP pentru toate solicitările de rețea. + Configurează gazda proxy-ului (de ex. 127.0.0.1). zile Conectare Arată întotdeauna poziția în centru @@ -1252,7 +1256,7 @@ Letonă Lituaniană Marathi - Norvegiană + Norvegiană Bokmål Persană Poloneză Portugheză @@ -1272,20 +1276,20 @@ America de Nord - Canada Europa - Italia Europa - Marea Britanie - Se calculează segment de traseu OsmAnd fără Internet + Calcularea fără Internet a segmentului de rute OsmAnd Implicit(13) Implicit(cyan translucid) Culoare GPX Pluginuri Evită rutele de tren Pericol - Evită rutele de tren + Evitați utilizarea trenurilor de transfer Nu sunt actualizări disponibile Lățime GPX Actualizări in timp real Bold contur Locații - Fișier GPX cu notițe de locații + Fișier GPX cu notițe de locații. Roșu Roșu translucid Portocaliu translucid @@ -1301,15 +1305,15 @@ Albastru translucid Violet Violet translucid - Pentru a aplica modificările, este nevoie să restartați aplicația. + Reporniți aplicația manual pentru a aplica toate modificările. Deschisă Închisă Piemontez Bengali Sărbo-Croată - Aveți descărcate informații vechi din Wikipedia, incompatibile. Doriți să le arhivați? - Doriți să descărcați informații adiționale din Wikipedia (%1$s MB) ? - Serviciul de localizare este oprit. Doriți să îl activați? + Aveți date vechi incompatibile Wikipedia. Doriți să le arhivați\? + Descărcați informații adiționale din Wikipedia (%1$s MB) \? + Serviciul de localizare nu este pornit. Doriți să îl activați\? Alegeti de pe harta Arata la pornire Salvați offline @@ -1325,18 +1329,18 @@ Neselectat Înregistrări divizate Utilizează înregistrări divizate - Suprascrie clipurile când spațiul utilizat depășește memoria de stocare + Suprascrie clipurile când spațiul utilizat depășește memoria de stocare. Lungime clip - Lungimea fiecărei înregistrări nu va mai specifica intervalul de timp + Limită superioară pentru clipurile înregistrate. Mărimea memoriei de stocare - Dimensiunea spațiului de stocare pentru toate clipurile înregistrate + Dimensiunea spațiului de stocare pentru toate clipurile înregistrate. Actualizări live Hărți disponibile Selectează vocea pentru ghidare - Selectează sau descarcă vocea pentru ghidări pentru limba ta - Selectează drumurile pe care dorești sa le eviți pe perioada navigării + Selectați sau descărcați vocea pentru ghidare pentru limba dvs. + Selectați drumurile pe care dorești să le eviți pe perioada navigării. Sunet - Aplicația nu are permisiunea de a accesa datele de localizare. + Aplicația nu are permisiunea de a accesa datele despre locație. Aplicația nu are permisiunea de a accesa camera. Aplicația nu are permisiunea de a accesa microfonul. Distanța: @@ -1348,14 +1352,14 @@ Calitate slabă Calitate mare Calitate înregistrării video - Selectează calitatea înregistrării video + Selectați calitatea video. Format audio - Selectează formatul audio + Selectați formatul audio. Rata de biți audio - Selectează rata de biți audio - Te rog specifică corect POI(punct de interes) sau ignoră-l + Selectează rata de biți audio. + Vă rog specificați tipul corect POI(punct de interes) sau ignorați-l. Butonul de meniu lansează panoul frontal, nu meniul propriu-zis - \'Închide\' Lansează direct de pe ecranul cu harta + \"Oprit\" lansează direct ecranul hărții. Copiat în clipboard Nota OSM comentată Nota OSM ștearsă @@ -1364,12 +1368,12 @@ Crează notă Adaugă comentariu Redeschide nota - Închide nota - Notă creată cu succes - Eroare: nota nu a fost creată - Nota a fost închisă cu succes - Eroare: nota nu a fost închisă - Trimite + Închideți nota + Notă creată + Nu s-a putut crea nota + Notă închisă + Nota nu a putut fi închisă + Comite Ștergi punctul de referință GPX? Editează punctul de referință GPX Locație @@ -1378,20 +1382,20 @@ Macedonian Citește mai multe Ce-i nou în - Ascunde obiectele propuse + Obiecte propuse Actualizează Încarcă (upload) Punct de interes OSM creat Harta de bază a lumii (ce acoperă întreaga lume fără detalii) lipsește sau învechită. Luați în considerare descărcarea completă a hărții de bază(World basemap). Cod QR Hartă descărcată - Harta pentru %1$s a fost descărcată, acum puteți începe să o utilizați. - Afișează harta + Harta %1$s este gata de utilizare. + Afișați harta Trimite - Numele categoriei specificate există deja. Vă rugăm folosiți un alt nume. - Simulează ca și când aplicația ar fi pentru prima oară lansată, celelalte setari rămân neschimbate + Utilizați un nume de categorie care nu există deja. + Simulează ca și când aplicația ar fi pentru prima oară lansată, celelalte setari rămân neschimbate. Simulează lansarea inițială - Împărtășește locația + Distribuie locația Numele categoriei Adaugă o nouă categorie Regiuni @@ -1401,26 +1405,26 @@ Vizualizarea liniilor de contur e dezactivată Adaugă nou Selectează categorie - Definește sistemul de măsurare a vitezei - Măsurarea vitezei + Definiți unitatea de măsură a vitezei. + Unitate de viteză Mile marine Kilometri pe oră Mile pe oră Metri pe secundă Minute pe kilometru Minute pe milă - Mile marine pe oră (knot) - nm/h - nm (nanometru) + Mile marine pe oră (noduri) + kn + nmi min/m min/km m/s Înregistrează călătoria Navigare - Rulează în fundal + Rulați în fundal Informații favorite - Oprește simularea poziției - Simulează utilizând o rută calculată sau o înregistrare GPX + Oprește simularea poziției tale. + Simulează utilizând o rută calculată sau o înregistrare GPX. Adresa căutată Frigiană Albaneză (Tosk) @@ -1442,12 +1446,12 @@ Luxemburgheză Osețiană Limba Esperanto - Spaniolă argentiniană + Spaniolă (Argentina) Dialect Bokmål (Norvegia) Limba Volapuk Tailandeză Limba Telugu - Norvegiană (Nynorsk) + Norvegiană Nynorsk Nepaleză Newar / Nepal Bhasa Malaieziană Haitiană @@ -1464,10 +1468,10 @@ Șterge editarea OSM Dezactivată Colorează în funcție de destinația calătoriei - Colorează în funcție de OSMC + Colorează în funcție de simbolul de drumeție OSMC Deconectare - Ascunde numarul casei - Dorești ca OsmAnd să copie de asemenea și fișierele de date la noua destinație? + Numărul caselor + Copiați fișierele de date OsmAnd la noua destinație\? Hărțile nu pot fi create în directorul selectat Copierea fișierelor a eșuat Memoria externă @@ -1486,82 +1490,83 @@ Editează Locații Căutare - Vezi descrierea + Arată descrierea. Mesaj Datele A-GPS ultimele descărcate: %1$s - În multe țari (Germania, Franța, Italia și altele) utilizarea avertizărilor pentru camerele radar nu este permisă de lege. OsmAnd nu este responsabilă pentru încălcarea legii în acest sens. Apasă Da dacă îți asumi răspunderea pentru a utiliza această funcție. + În multe țari (Germania, Franța, Italia și altele) utilizarea avertizărilor pentru camerele radar este ilegală. OsmAnd nu este responsabilă pentru încălcarea legii în acest sens. Apasă \'Da\' dacă îți asumi răspunderea pentru a utiliza această funcție. Descarcă hărți Pentru a reflecta corect semnele si reglementările de trafic, alege regiunea în care conduci: - OsmAnd oferă vizualizarea și navigarea hărții fără internet la nivel global! + OsmAnd oferă vizualizarea și navigarea hărții globale fără internet. Bun venit Ruta curentă Schimbările OSM adăugate in setul de schimbări locale Marchează pentru ștergere Sigur dorești ștergerea notelor %1$d? - Dorești încărcarea (upload) pe OSM a %1$d. Ești sigur? - Dorești ștergerea istoricului? + Veți încărca %1$d modificări în OSM. Sunteți sigur\? + Sterg istoricul\? Donații Numărul de benecifiari Modificări %1$s, grad %2$s, toate modificările %3$s Gradul modificărilor OSM - Semnare live OSM - Semnează-te - Ne trebuie pentru a vă oferii informații despre contribuții + Abonament OsmAnd Live + Abonează-te + Necesar pentru a vă oferii informații despre contribuții. Nume Public - Nu arăta numele meu în rapoarte + Nu afișa numele meu în rapoarte Suport local Cost lunar Plata lunară Activ Inactiv - Vă rugăm să introduceți adresa de email validă - Vă rugăm să introduceți Numele Public - Vă mulțumim pentru abonarea la actualizări live! - O parte din donația d-voastră va fii trimisă către utilizatorii OSM care fac modificări pe harta din zonă + Vă rugăm să introduceți o adresă de e-mail validă + Vă rugăm să introduceți numele public + Vă mulțumim că ați sprijinit OsmAnd! +\nPentru a activa toate funcționalitățiile noi, trebuie să reporniți OsmAnd. + O parte din donația dvs. va fii trimisă către utilizatorii OSM care fac modificări pe harta din zonă. Setări de abonament - Vă rugăm să achiziționați mai întâi abonamentul OSM Live + Vă rugăm să achiziționați mai întâi abonamentul OsmAnd Live Acest abonament permite actualizări orare pentru toate hărțile din întreaga lume. O mare parte din venit merge înapoi la comunitate OSM și va fii plătită fiecare contribuție OSM. În cazul în care vă plac OsmAnd și OSM și doriți să le susțineți, aceasta este o modalitate perfectă să o faceți. - Selectați marcatorul pe hartă + Selectați marcajul pe hartă Alți marcatori Încarcă anonim - Arată seekbar-ul transparent + Afișați bara de căutare transparentă Spațiu insuficient! E nevoie de {3} MB temporar și {1} MB permanent. În prezent, sunt doar {2} MB disponibili. - Sigur sunt {0} fișier(e) descărcate? Necesită {3} MB temporar și {1} MB permanent. În prezent sunt {2} MB disponibili. + Descarc {0} fișier(e)\? Necesită {3} MB temporar și {1} MB permanent. (În prezent sunt {2} MB disponibili.) Nu puteți încărca anonim notele d-voastră OSM dacă folosiți profilul d-voastră OpenStreetMap.org Încărcați note OSM Bara de instrumente Widget-uri (dispozitive mici) - Doriți să adăugați toate punctele la markerii hărții? - Adaugă la markerii hărții - Selectează markerii hărții + Doriți să adăugați toate punctele la marcajele de hartă\? + Adaugă la marcajele de hartă + Selectați marcajele de hartă Ordine inversă - Doriți să ștergeți toate marcajele active? - Doriți să goliți istoricul markerilor? - Markerii activi - Markerii hărții - Markerii hărții + Eliminați toate marcajele active\? + Eliminați istoricul marcajelor de hartă\? + Marcajele active + Marcaje de hartă + Marcaj de hartă Este recomandat să dezactivați redarea de poligoane. Arată rutele de MTB Arată poligoanele - Găsește o parcare + Găsește parcare Stare Salvează schimbările Adresa de email - Ascunde obiectele subterane - Data nu e valabilă + Obiecte subterane + Datele nu sunt disponibile Elimină Citește mai mult - Poți elimina actualizările descărcate și să revii la harta originală + Eliminați actualizările descărcate și reveniți la harta originală Adaugă intervalul de timp Drum blocat Selectează Inversează punctul de plecare și destinația - Ascunde pictogramele POI - Specifică timpul de așteptare pentru a rămâne pe ecran planificarea traseului + Pictograme POI + Specifică timpul de așteptare pentru a rămâne pe ecran planificarea traseului. Începe navigarea rând pe rând după… Pleacă Întârziat - Action create + Acțiune creați Modificat Șters Editări OSM @@ -1574,21 +1579,22 @@ Vizitează înainte Simulează poziția ta Lista lată - Lat %1$s\n Lon %2$s - Întrebări frecvente, schimbări recente și altele + Lat %1$s +\nLon %2$s + Întrebări frecvente, schimbări recente și altele. Setări de navigație Setări generale - Nu folosi + Nu folosiți Permite Dezactiv Permis Nepermis - Deselect + Deselectați Deselect tot - Împărtășește + Distribuiți Export - A apărut o eroare neașteptată + Eroare neașteptată Acțiunea {0} Căzut Adresa @@ -1629,9 +1635,9 @@ Adaugă poze Adăugați ca punct de pornire Actual - Adaugă ultima oprire de-a lungul rutei - Adauga prima oprire de-a lungul rutei - Mută destinația sus și creează o destinație + Adaugă o oprire intermediară + Adaugă oprirea inițială + Mutați destinația sus și creați-o Arată notele incheiate Arată/ascunde notele OSM pe hartă. GPX - disponibill pentru export catre JOSM sau alte editoare OSM. @@ -1654,9 +1660,9 @@ Toate punctele grupului Deschide de la Deschide până - Se va închide la - Se va deschide la - Se va deschide la + Închide la + Se deschide la + Se deschide la Acțiuni adiționale Fișier GPX cu datele și coordonatele notelor selectate. Fișier GPX cu datele și coordonatele tuturor notelor. @@ -1676,26 +1682,26 @@ Note după dată După dată După tip - Cautând trackuri cu puncte intermediare + "Se caută trasee cu puncte intermediare" Mai mult Apariția pe hartă - Selectează un track pentru a-i adăuga un punct intermediar la marcaje. (Numai trackurile cu puncte intermediare sunt listate.) - Selectează o categorie de favorite pentru a fi adaugată la marcaje. - Puncte intermediare pentru track + Selectați un traseu pentru a-i adăuga un punct intermediar la marcaje. + Selectați o categorie de Favorite pentru a fi adaugate la marcaje. + Puncte intermediare traseu Categorie favorite Adaugă un grup - Puteți importa grupuri din favorite sau puncte intermediare de trackuri + Importați grupuri din Favorite sau puncte intermediare GPX. Creează marcaje de hartă! - Atinge lung sau scurt pe locații, apoi atinge butonul pentru steagul marcajului. + Atingeți lung sau scurt pe Locații, apoi atingeți butonul pentru steagul marcajului. Importă grupuri - Puteți importa grupuri favorite sau puncte intermediare de trackuri ca marcaje. + Importați grupuri Favorite sau puncte intermediare ca marcaje. Marcajele marcate ca trecute vor apărea pe această fereastră. Două Una - Afișați linii de ghidare de la poziția actuală către locatia marcajului. - Afișați una sau doua săgeți care sa indice direcția către marcajele active. + Afișați linii direcționale de la poziția actuală către locația marcajului. + Afișați una sau doua săgeți care să indice direcția către marcajele active. Alegeți cum sa fie afișată distanța către marcajele active. - Alegeți câti indicatori de direcție săa fie afișați. + Alegeți câti indicatori de direcție să fie afișați. Numărul digiților zecimali Dreapta Stânga @@ -1703,12 +1709,12 @@ Lipește Schimbă automat la câmpul urmator dupa ce introduceți %1$d digiți zecimali. %1$d digiți - Mergi la câmpul următor + Câmpul următor Redenumește marcaj O atingere pe hartă activează butoanele de control și widgeturi-le. - Modul fereastră completă + Modul ecran întreg Marcaj trecut - poate fi importat ca puncte Favorite, sau ca fișier track. + pot fi importate ca Favorite sau ca fișier GPX. Importă ca fișier GPX Importă ca Favorite Importă fișier @@ -1718,30 +1724,30 @@ Vizualizare Punctele intermediare adăugate la marcajele hărții Format greșit - Road + Drum Arată harta - Ruta este calculată + Ruta a fost calculată Dus-întors Trebuie sa adăugați cel puțin un marcaj pentru a utilza această funcție. - O exceptie a avut loc: nota nu a fost modificată + Nu s-a putut modifica nota Modifică nota Modifică nota OMS Copiază punctul de pornire ca destinație. Format coordonate Foloseste tastatura sistemului - Alege formatul coordonatelor. Puteți oricând schimba din Opțiuni. + Alege formatul coordonatelor. Puteți oricând schimba din \'Opțiuni\'. Introducere rapidă a coordonatelor Evită drumurile cu polei și traversarile râurilor Evită drumurile cu polei și traversarile râurilor. Planul rutei - Introduce coordonatele + Introduceți coordonatele este salvat - Exportă coordonatele intr-un fișier specificat aici: - Salvează ca track - Grupul va fi șters după următorul restart al aplicației. - Arată liniile de ghidare + Exportați marcajele dvs. în următorul fișier GPX: + Salvați ca fișier GPX + Grupul va dispărea data viitoare când porniți aplicația. + Afișați liniile direcționale Arată săgețile pe hartă - Șterge din marcajele hărții + Eliminați din marcajele hărții descende ascende Dată adaugată @@ -1761,52 +1767,51 @@ Adauga punct inainte Adaugă punct după OsmAnd va conecta punctele cu rutele pentru profilul selectat. - Puteți salva punctele fie ca rută sau ca linie. + Salvați punctele fie ca puncte de traseu, fie ca linii. Selectează profilul de navigație Adăugați cel puțin un punct. Nume fișier GPX: Arată pe hartă după salvare Navigați pe hartă și adăugați puncte - Reluare/pauză navigație + Pauză/reluare navigație Atingeți acest buton pentru pauză sau reluare navigație. - Arată dialog finalizare Navigație/ + Afișați dialogul \'Navigare terminată\' Atingeți acest buton pentru pornire sau incheiere navigație. Stochează lunar track-urile înregistrate in foldere - Stochează trackurile înregistrate lunar în sub-foldere (ca 2017-01). - Cache tile - Nume utilizator greșit! + Stocați traseele înregistrate lunar în sub-foldere (ca 2018-01). + + Nume utilizator greșit Vedeți doar imaginile adăugate Dată Scrie nume utilizator Vedeți doar imaginile adaugate de - Puteți filtra imaginile după utilizator sau după dată. Filtrele se aplica doar pentru zoom apropiat. + "Filtrați imaginile după utilizator, după dată sau după tip. Active doar pentru zoom apropiat." Osmand nu poate importa fișierul. Vă rugăm să verificați dacă OsmAnd are permisiuni de citire din această locație. Distanța corectată Imagine Mapillary Deschide Mapillary Înbunătățiți acoperirea foto cu Mapillary - Puteți face propriile fotografii sau serii de fotografii si să le atașați la aceasta locație pe hartă. -\nPentru asta, trebuie să instalați aplicația Mapillary de pe Magazinul Google Play. + Instalați Mapillary pentru a adăuga una sau mai multe fotografii în această locație a hărții. Fotografii online Nu avem imagini pentru această locație. Contribuiți cu propriile imagini la nivelul străzii pentru această locatie cu Mapillary. Widget Mapillary - Permite contribuția rapidă pentru Mapillary. + Permite contribuții rapide la Mapillary. Imagini online la nivelul străzii pentru oricine. Descoperiți locuri, colaborați, captați lumea. Mapillary - Destinația dumneavoastră se află intr-o zonă cu acces privat. Doriți să acordati accesul la străzi private pentru această ruta? + Destinația dumneavoastră se află intr-o zonă cu acces privat. Acordați accesul la străzi private pentru această ruta\? Reporniți căutarea Măriți aria de căutare - Nimic găsit :( + Nimic găsit Modifică criteriile de căutare sau mărește aria de căutare. - Arată/ascunde notele OSM + Comutare note OSM Arată notele OSM Ascunde notele OSM - Atingând butonul pe ecran, notele OSM de pe hartă vor fi afișate sau ascunse. + Atingând acest buton de acțiune, se afișează sau se ascund notele OSM de pe hartă. Sortat după distanță - Caută favorite - Pentru a vedea relieful pe hartă, trebuie să descărcați harta cu relieful 3D pentru această regiune. - Pentru a vedea relieful pe hartă, trebuie să cumparați si să instalați extensia Contour Lines + Caută Favorite + Pentru a vedea relieful pe hartă, descărcați harta cu relieful 3D pentru această regiune. + Pentru a vedea relieful pe hartă, trebuie să cumparați si să instalați extensia \'Contour Lines\' Ascunde de la nivelul de zoom Extensie Schemă culori @@ -1821,10 +1826,10 @@ Selectează strada în %1$s Scrie adresa - Scrie orașul + Introduceți orașul Scrie codul poștal Orașe apropiate - Selectează oraș + Selectați orașul Selectează cod poștal Auto zoom hartă pornit/oprit Activare auto zoom hartă @@ -1835,20 +1840,20 @@ Eroare Vizibil Restaurare cumpărături - Fonturi pentru hartă + Fonturi hartă Conducere pe dreapta Automatic Nu trimite statistici de utilizare anonime ale aplicației - OsmAnd colecteaza informații despre părțile din aplicatie folosite. Locația dumneavoastră si datele introduse în aplicație nu vor fi niciodată trimise, sau detalii despre zona in care vă aflați, căutari sau descărcări. + OsmAnd colectează informații despre părțile din aplicatie folosite. Locația dumneavoastră și datele introduse în aplicație nu vor fi niciodată trimise, sau detalii despre zona în care vă aflați, căutari sau descărcări. Nu arăta mesaje la pornire Opțiuni parcare - "Va muțumim pentru că ați cumpărat versiunea completă OsmAnd! " + Va muțumim pentru că ați cumpărat versiunea plătită OsmAnd. Deluros Mai puțin deluros Plat Rute scurte Echilibrat - Teren preferat: plat sau deluros + Teren preferat: plat sau deluros. Pantă Adaugă dosar nou Track(pistă) @@ -1858,15 +1863,15 @@ Ora de pornire Ora de oprire Culoare - Selectează dosarul cu track-uri + Selectați folderul fișierului GPX Fișierul nu poate fi mutat. Mută Track-uri Stil de conducere Timp Distanța totală - Punct(e) șterse cu succes. - Puncte proeminente ale acestei rute + Punct(e) șters(e). + Puncte intermediare, puncte de interes, caracteristici numite Trecerea timpului Interval de timp Urmează să ștegeți %1$d punct(e). Sunteți sigur(ă)? @@ -1965,7 +1970,7 @@ Tren Pista curentă Nivel baterie - Schimbă poziția marker-ului + Schimbați poziția marcajului Indicații audio Navigație live OsmAnd Destinația nu este setată @@ -2000,7 +2005,7 @@ Redenumirea a eșuat. zile în urmă Înapoi la hartă - Distribuie nota + Distribuiți nota Locație: \n Lat %1$s \n Lon %2$s @@ -2029,7 +2034,7 @@ Chineză (Hong Kong) Evită treptele Evită treptele - Evită trecerea graniței + Evită trecerea granițelor Evită trecerea granițelor naționale Limită înălțime Australia @@ -2044,9 +2049,9 @@ Întrerupeți muzica OsmAnd Hărți și Navigație OsmAnd+ Hărți și Navigație - Distribuie ruta ca și fișier GPX + Distribuiți ruta ca și fișier GPX Traseu distribuit prin OsmAnd - + Donați pentru a vedea funcționalități noi implementate în aplicație. Devreme Normal Târziu @@ -2058,7 +2063,7 @@ Lansat Mesaje vocale Adauga Favorite - șterge + șters Redeschide Trebuie să vă conectați la Internet pentru a instala acest plugin. Obțineți @@ -2113,7 +2118,7 @@ Instalare şi depanare Articole tehnice Versiuni - Feedback + Părere Contact Legendă hartă Actualizare @@ -2123,4 +2128,180 @@ OsmAnd nu are permisiunea de a utiliza cardul de memorie Ultima actualizare: %s + Trimiteți jurnalul + Evită tramvaiele + Evită tramvaiele + Evită autobuzele + Evită autobuzele și troleibuzele + Evită taxi-urile partajate + Evită taxi-urile partajate + Evită trenurile + Evită trenurile + Evită metro-urile + Evită transportul subteran și transportul feroviar ușor + Evită feriboturile + Evită feriboturile + Grade + Miliradiani + Unități de măsură unghiulare + Modificați unitatea de măsura a azimutului. + Selectați tipurile de transport public evitate la navigare: + %s mod + Evitați tipurile de transport… + Mergi + Aflați mai multe despre modul în care OsmAnd calculează rutele în blogul nostru. + În prezent, navigația pentru transportul public este în testare beta, așteptați erori și inexactități. + Adăugați punct intermediar + %1$d transferuri + Adăugați puncte de început și de sfârșit + Adăugați punctul de pornire + Selectați punctul de pornire + Nepavat + Nisip + Iarbă + Concasor de iarbă + Sol + Pământ + Noroi + Gheață + Sare + Zăpadă + Asfalt + Pavat + Beton + Piatră cubică + Piatră cubică + Pietriș + Piatră + Metal + Lemn + Pietriș + Pietriș fin + Compactat + Excelent + Bună + Intermediar + Proastă + Foarte proastă + Oribilă + Foarte oribilă + De netrecut + Autostradă + Drumul de stat + Drum + Stradă + Service + Trotuar + Traseu + Pași + Cale + Pistă de ciclism + Nedefinit + Activați modificările OsmAnd Live pentru transportul public. + Transport public OsmAnd Live + Ora din zi + După %1$s + Pas cu pas + Tipuri drum + Ieșire la + Îmbarcați-vă la oprirea + Schimbați + Afișați mai multe + Trasee afișate + Afișați/Ascundeți traseele GPX + Ascundeți traseele GPX + Afișați traseele GPX + Vă rugăm să adăugați destinația mai întâi + Ruta anterioară + Adăugați acasă + Adăugați serviciu + Serviciu + t + Capacitate + Lățime + Înălțime + Schimbați startul și destinația + Adăugați destinație + Adăugați intermediar + Adăugați punctul de plecare + Punct intermediar + Transferuri + Pe jos + Cale + Puncte de interes (POI) + Se calculează ruta… + Transport public + Selectați un drum pe care doriți să îl evitați în timpul navigării, fie pe hartă, fie din lista de mai jos: + Afișați de-a lungul rutei + Simulați navigația + Alegeți fișierul traseu pe care să-l urmăriți + Anunțuri vocale + Destinații intermediare + Sosire la %1$s + Abonamente + de OsmAnd + Planuri și Prețuri + Lunar + O dată la trei luni + Anual + %1$s / lună + %1$.2f %2$s / lună + Salvați %1$s. + Abonament curent + Reînnoire lunară + Se reînnoiește trimestrial + Se reînnoiește anual + %1$.2f %2$s + Selectați perioada de plată convenabilă pentru dvs.: + O parte din venit se duce la contribuabilii OpenStreetMap. + Ștergeți marcajul hărții \'%s\'\? + Editați marcajul de pe hartă + Aplicații terțe + Căutați strada + Selectați mai întâi orașul + Restaurați + "Acordați OsmAnd acces la locația pentru a continua." + Mulțumim pentru părerea dvs + Creșteți raza de căutare la %1$s + Lume + Punctul %1$s șters + Salvați ca și traseu + Obțineți OsmAnd Live pentru a debloca toate funcționalitățiile: actualizări zilnice a hărților cu descărcări nelimitate, toate pluginurile contra-cost și gratuite, Wikipedia, Wikivoyage și multe altele. + Actualizări de hărți: în fiecare lună + + Actualizări de hărți: fiecare oră + + O singură plată + Odată achiziționat, acesta va fi permanent disponibil pentru dvs. + Hărți cu Linii de contur și Relief + Ghiduri de călătorie + Căutare: țară, oraș, provincie + Ghiduri de călătorie + Riglă circulară + Permiteți autostrăzile + Permiteți autostrăzile. + Introduceți orașul, adresa, numele POI + Abonament perceput pe lună. Anulați-l pe Google Play în orice moment. + Utilizați un mod eficient de combustibil (de obicei mai scurt). + Negru + Lansează + Pornesc navigarea de-a lungul traseului\? + OLC invalid +\n + Selectați marja de toleranță la limita de viteză, deasupra căreia veți primi un avertisment vocal. + Specificați înălțimea vehiculului care va fi permisă pe rute. + Configurați pentru a anunța numele străzilor, avertismentele de trafic (opriri forțate, limitatoare de viteza), avertizări radar, limitele de viteză. + Reduce zgomotul în citirile busolei, dar adaugă inerție. + Timp intermediar de sosire + Re-anunțați instrucțiunile de navigare la intervale regulate. + Configurați dashboard-ul + Cum să descarcați hărți, setați setările de bază. + Configurați navigația. + Planificarea unei călătorii + Căutarea pe hartă + Acțiune rapidă + Adăugați fișiere GPX + Importați fișiere GPX sau înregistrați trasee. + Adăugați favorite + Importați Favorite sau adăugați prin marcarea punctelor pe hartă. \ No newline at end of file From 30dd6f47b3aa902b9e85c10834474b5babd9b696 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Sun, 21 Apr 2019 11:47:11 +0000 Subject: [PATCH 110/114] Translated using Weblate (Sardinian) Currently translated at 99.7% (3555 of 3565 strings) --- OsmAnd/res/values-sc/phrases.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml index 77bccda1f9..5f6d7053dd 100644 --- a/OsmAnd/res/values-sc/phrases.xml +++ b/OsmAnd/res/values-sc/phrases.xml @@ -3576,4 +3576,7 @@ Frama de gas;Tortza de brusiadura Ogetu iscantzelladu Radioterapia + Falèsia + Iscàtula de sarvatàgiu + Eja \ No newline at end of file From ed84833440308ee51f3f114757632875a48893b4 Mon Sep 17 00:00:00 2001 From: Ajeje Brazorf Date: Sun, 21 Apr 2019 11:46:31 +0000 Subject: [PATCH 111/114] Translated using Weblate (Sardinian) Currently translated at 99.1% (217 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/sc/ --- OsmAnd-telegram/res/values-sc/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd-telegram/res/values-sc/strings.xml b/OsmAnd-telegram/res/values-sc/strings.xml index f6a2eedc23..3d10e54872 100644 --- a/OsmAnd-telegram/res/values-sc/strings.xml +++ b/OsmAnd-telegram/res/values-sc/strings.xml @@ -216,4 +216,6 @@ Chirca intre totu sos grupos e sos cuntatos tuos. Iscrie su nùmene de unu cuntatu o de unu grupu Chirca + Pretzisione + Artària \ No newline at end of file From 8d0a0a689735de62817e32fa372385783db4969c Mon Sep 17 00:00:00 2001 From: ace shadow Date: Sun, 21 Apr 2019 19:12:42 +0000 Subject: [PATCH 112/114] Translated using Weblate (Slovak) Currently translated at 99.9% (2749 of 2750 strings) --- OsmAnd/res/values-sk/strings.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index d3e6ce31a8..026482031a 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -1839,7 +1839,7 @@ Dĺžka %2$s Posledná zmena mapy: %s Každú hodinu Každý deň - Raz za týždeň + Každý týždeň Ráno V noci Typ @@ -1857,7 +1857,7 @@ Dĺžka %2$s Ikony bodov záujmu (POI) Počet prispievateľov Počet zmien - Výkaz pre + Prehľad za Údaje nie sú k dispozícii Stav Uložiť zmeny @@ -1895,12 +1895,12 @@ Dĺžka %2$s Počet príjemcov Počet úprav %1$s, pozícia %2$s, celkový počet úprav %3$s Pozícia medzi editormi OSM - Predplatné v OsmAnd Live + Predplatné OsmAnd Live Registrovať Potrebné pre poskytnutie Vám informácií o príspevkoch. Verejné meno - Nezobrazovať moje meno v hláseniach - Región podpory + Nezobrazovať moje meno v prehľadoch + Podporovaný región Mesačná cena Mesačná platba Aktívne @@ -1924,9 +1924,9 @@ Dĺžka %2$s Posunúť ↓ Prosím pridajte mapové značky pomocou mapy Nenašli sa žiadne body cesty - Hlásenie + Prehľad Aplikácia teraz má povolenie zapisovať do externého úložiska, ale je potrebný reštart aplikácie. - Plné hlásenie + Podrobný prehľad Meno a heslo pre OpenStreetMap Názov súboru obsahuje nepovolený znak Tenké @@ -3015,4 +3015,5 @@ Zodpovedá oblasti: %1$s x %2$s \n \n • Zobrazenie azimutu v meraní vzdialenosti \n + Odoslať záznam \ No newline at end of file From e537822be1bfdc5e0862959c26470366787218be Mon Sep 17 00:00:00 2001 From: Franco Date: Mon, 22 Apr 2019 17:43:46 +0000 Subject: [PATCH 113/114] Translated using Weblate (Spanish) Currently translated at 100.0% (219 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/es/ --- OsmAnd-telegram/res/values-es/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-es/strings.xml b/OsmAnd-telegram/res/values-es/strings.xml index 83c9a47b23..256ece647c 100644 --- a/OsmAnd-telegram/res/values-es/strings.xml +++ b/OsmAnd-telegram/res/values-es/strings.xml @@ -216,4 +216,8 @@ Buscar en todos tus grupos y contactos. Escriba el nombre del contacto o grupo Buscar + Dirección + Precisión + Altitud + Rumbo \ No newline at end of file From 17d75a9c9863ce72a30e0bc29f1787f696099493 Mon Sep 17 00:00:00 2001 From: Franco Date: Mon, 22 Apr 2019 17:42:03 +0000 Subject: [PATCH 114/114] Translated using Weblate (Spanish (American)) Currently translated at 100.0% (219 of 219 strings) Translation: OsmAnd/Telegram Translate-URL: https://hosted.weblate.org/projects/osmand/telegram/es_US/ --- OsmAnd-telegram/res/values-es-rUS/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OsmAnd-telegram/res/values-es-rUS/strings.xml b/OsmAnd-telegram/res/values-es-rUS/strings.xml index d413701d43..1f382cf468 100644 --- a/OsmAnd-telegram/res/values-es-rUS/strings.xml +++ b/OsmAnd-telegram/res/values-es-rUS/strings.xml @@ -216,4 +216,8 @@ Busca en todos tus grupos y contactos. Escribe el nombre del contacto o grupo Buscar + Dirección + Precisión + Altitud + Rumbo \ No newline at end of file