From b73ac2da9c68d78b8b71b7b606514b3d4e165c9e Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Mon, 1 Dec 2014 19:41:51 +0200 Subject: [PATCH 01/24] Fix some issues with new rendering --- .../core/android/MapRendererContext.java | 521 +++++++----------- .../osmand/plus/activities/MapActivity.java | 103 +--- .../osmand/plus/dialogs/ConfigureMapMenu.java | 4 +- .../osmand/plus/helpers/WakeLockHelper.java | 103 ++++ .../osmand/plus/render/MapVectorLayer.java | 19 + .../osmand/plus/render/NativeCppLibrary.java | 0 .../net/osmand/plus/routing/VoiceRouter.java | 55 +- .../plus/views/AnimateDraggingMapThread.java | 20 +- .../views/corenative/NativeCoreContext.java | 61 +- 9 files changed, 423 insertions(+), 463 deletions(-) create mode 100755 OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java mode change 100644 => 100755 OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java diff --git a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java index 9719e523f6..173474f3d5 100644 --- a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java +++ b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java @@ -13,10 +13,18 @@ import net.osmand.core.jni.MapPresentationEnvironment; import net.osmand.core.jni.MapPrimitivesProvider; import net.osmand.core.jni.MapPrimitiviser; import net.osmand.core.jni.MapRasterLayerProvider_Software; +import net.osmand.core.jni.MapStylesCollection; import net.osmand.core.jni.ObfMapObjectsProvider; import net.osmand.core.jni.QStringStringHash; import net.osmand.core.jni.MapPresentationEnvironment.LanguagePreference; import net.osmand.core.jni.ResolvedMapStyle; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.OsmandSettings.CommonPreference; +import net.osmand.plus.render.RendererRegistry; +import net.osmand.render.RenderingRuleProperty; +import net.osmand.render.RenderingRulesStorage; +import net.osmand.util.Algorithms; /** * Context container and utility class for MapRendererView and derivatives. @@ -26,32 +34,61 @@ import net.osmand.core.jni.ResolvedMapStyle; */ public class MapRendererContext { - public MapRendererContext() { - } - - public MapRendererContext(MapRendererView mapRendererView) { - _mapRendererView = mapRendererView; - } + private static final int OBF_RASTER_LAYER = 0; + private OsmandApplication app; /** - * Synchronisation object used to perform state changes atomically + * Cached map styles per name */ - private final Object _syncObject = new Object(); + private Map mapStyles = new HashMap(); + + /** + * Reference to OBF map symbols provider (if used) + */ + private IMapTiledSymbolsProvider obfMapSymbolsProvider; + + /** + * Map styles collection + */ + private MapStylesCollection mapStylesCollection; + + /** + * Reference to map presentation environment (if used) + */ + private MapPresentationEnvironment mapPresentationEnvironment; + + /** + * Reference to OBFs collection (if present) + */ + private IObfsCollection obfsCollection; /** * Reference to map renderer view that is currently managed by this * context */ - private MapRendererView _mapRendererView; + private MapRendererView mapRendererView; + + + /** + * Display density factor + */ + private float displayDensityFactor = 1; /** - * Get currently bound map renderer view - * @return Reference to MapRendererView + * Reference tile size on screen in pixels */ - public MapRendererView getMapRendererView() { - synchronized (_syncObject) { - return _mapRendererView; - } + private float referenceTileSizef = 256; + + /** + * Raster tile size in texels + */ + private int rasterTileSize = 256; + + private CachedMapPresentation presentationObjectParams; + + + public MapRendererContext(OsmandApplication app) { + this.app = app; } /** @@ -59,266 +96,149 @@ public class MapRendererContext { * @param mapRendererView Reference to MapRendererView */ public void setMapRendererView(MapRendererView mapRendererView) { - synchronized (_syncObject) { - boolean update = (_mapRendererView != mapRendererView); - if (!update) - return; - - _mapRendererView = mapRendererView; - if (_mapRendererView != null) - apply(); + boolean update = (this.mapRendererView != mapRendererView); + if (!update) { + return; + } + this.mapRendererView = mapRendererView; + if (mapRendererView != null) { + apply(); } } - /** - * Display density factor - */ - private float _displayDensityFactor = 1; - /** - * Reference tile size on screen in pixels - */ - private float _referenceTileSize = 256; - - /** - * Raster tile size in texels - */ - private int _rasterTileSize = 256; + private class CachedMapPresentation { + String langId ; + LanguagePreference langPref; + ResolvedMapStyle mapStyle; + double displayDensityFactor; + + public CachedMapPresentation(String langId, + LanguagePreference langPref, ResolvedMapStyle mapStyle, + double displayDensityFactor) { + this.langId = langId; + this.langPref = langPref; + this.mapStyle = mapStyle; + this.displayDensityFactor = displayDensityFactor; + } + + + public boolean equalsFields(CachedMapPresentation other ) { + if (Double.doubleToLongBits(displayDensityFactor) != Double + .doubleToLongBits(other.displayDensityFactor)) + return false; + if (langId == null) { + if (other.langId != null) + return false; + } else if (!langId.equals(other.langId)) + return false; + if (langPref != other.langPref) + return false; + if (mapStyle == null) { + if (other.mapStyle != null) + return false; + } else if (!mapStyle.equals(other.mapStyle)) + return false; + return true; + } + + } - /** - * Get current display density factor - * @return Display density factor - */ - public float getDisplayDensityFactor() { - synchronized (_syncObject) { - return _displayDensityFactor; - } - } /** * Set display density factor and update context (if needed) * @param displayDensityFactor New display density factor */ public void setDisplayDensityFactor(float displayDensityFactor) { - synchronized (_syncObject) { - boolean update = (_displayDensityFactor != displayDensityFactor); - if (!update) - return; - - _displayDensityFactor = displayDensityFactor; - _referenceTileSize = 256.0f * _displayDensityFactor; - _rasterTileSize = Integer.highestOneBit((int)_referenceTileSize - 1) * 2; - - if (_mapRendererView instanceof AtlasMapRendererView) - ((AtlasMapRendererView)_mapRendererView).setReferenceTileSizeOnScreenInPixels(_referenceTileSize); - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } + this.displayDensityFactor = displayDensityFactor; + referenceTileSizef = 256.0f * displayDensityFactor; + rasterTileSize = Integer.highestOneBit((int) referenceTileSizef - 1) * 2; + + if (mapRendererView instanceof AtlasMapRendererView) + ((AtlasMapRendererView) mapRendererView) + .setReferenceTileSizeOnScreenInPixels(referenceTileSizef); + if (mapPresentationEnvironment != null) + updateMapPresentationEnvironment(); } - /** - * Reference to resolved map style (if used) - */ - private ResolvedMapStyle _mapStyle; - - /** - * Get current map style - * @return Reference to current map style - */ - public ResolvedMapStyle getMapStyle() { - synchronized (_syncObject) { - return _mapStyle; - } - } - - /** - * Set map style and update context (if needed) - * @param mapStyle - */ - public void setMapStyle(ResolvedMapStyle mapStyle) { - synchronized (_syncObject) { - boolean update = (_mapStyle != mapStyle); - if (!update) - return; - - _mapStyle = mapStyle; - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Reference to map style settings (if present) - */ - private Map _mapStyleSettings; - - /** - * Get current map style settings - * @return - */ - public Map getMapStyleSettings() { - synchronized (_syncObject) { - if (_mapStyleSettings == null) - return null; - return Collections.unmodifiableMap(_mapStyleSettings); - } - } - - /** - * Set map style settings and update context (if needed) - * @param mapStyleSettings Map style settings - */ - public void setMapStyleSettings(Map mapStyleSettings) { - synchronized (_syncObject) { - boolean update = !_mapStyleSettings.equals(mapStyleSettings); - if (!update) - return; - - _mapStyleSettings = new HashMap(mapStyleSettings); - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Locale language - */ - private String _localeLanguageId = "en"; - - /** - * Get current locale language - * @return Locale language identifier - */ - public String getLocaleLanguageId() { - synchronized (_syncObject) { - return _localeLanguageId; - } - } - - /** - * Set current locale language and update context (if needed) - * @param localeLanguageId Locale language identifier - */ - public void setLocaleLanguageId(String localeLanguageId) { - synchronized (_syncObject) { - boolean update = !_localeLanguageId.equals(localeLanguageId); - if (!update) - return; - - _localeLanguageId = localeLanguageId; - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Language preference - */ - private LanguagePreference _languagePreference = LanguagePreference.LocalizedAndNative; - - /** - * Get current language preference - * @return Language preference - */ - public LanguagePreference getLanguagePreference() { - synchronized (_syncObject) { - return _languagePreference; - } - } - - /** - * Set language preference and update context (if needed) - * @param languagePreference - */ - public void setLanguagePreference(LanguagePreference languagePreference) { - synchronized (_syncObject) { - boolean update = (_languagePreference != languagePreference); - if (!update) - return; - - _languagePreference = languagePreference; - if (_mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - } - - /** - * Reference to OBFs collection (if present) - */ - private IObfsCollection _obfsCollection; - - /** - * Get current OBFs collection - * @return OBFs collection - */ - public IObfsCollection getObfsCollection() { - synchronized (_syncObject) { - return _obfsCollection; - } - } - - /** - * Set OBFs collection and update context (if needed) - * @param obfsCollection - */ - public void setObfsCollection(IObfsCollection obfsCollection) { - synchronized (_syncObject) { - boolean update = (_obfsCollection != obfsCollection); - if (!update) - return; - - _obfsCollection = obfsCollection; - if (_obfMapObjectsProvider != null) - updateObfMapObjectsProvider(); - } - } - - /** - * Reference to map presentation environment (if used) - */ - private MapPresentationEnvironment _mapPresentationEnvironment; + /** * Update map presentation environment and everything that depends on it */ private void updateMapPresentationEnvironment() { // Create new map presentation environment - _mapPresentationEnvironment = new MapPresentationEnvironment( - _mapStyle, - _displayDensityFactor, - _localeLanguageId, - _languagePreference); - - // Apply map style settings - if (_mapStyleSettings != null) { - QStringStringHash convertedStyleSettings = new QStringStringHash(); - for (Iterator> itSetting = _mapStyleSettings - .entrySet().iterator(); itSetting.hasNext();) { - Map.Entry setting = itSetting.next(); - convertedStyleSettings.set(setting.getKey(), setting.getValue()); - } - _mapPresentationEnvironment.setSettings(convertedStyleSettings); + String langId = app.getSettings().MAP_PREFERRED_LOCALE.get(); + // TODO make setting + LanguagePreference langPref = LanguagePreference.LocalizedOrNative; + String rendName = app.getSettings().RENDERER.get(); + if(rendName.length() == 0 || rendName.equals(RendererRegistry.DEFAULT_RENDER)) { + rendName = "default"; + } + if(!mapStyles.containsKey(rendName)) { + mapStyles.put(rendName, mapStylesCollection.getResolvedStyleByName(rendName)); + } + ResolvedMapStyle mapStyle = mapStyles.get(rendName); + CachedMapPresentation pres = new CachedMapPresentation(langId, langPref, mapStyle, displayDensityFactor); + if (this.presentationObjectParams == null + || !this.presentationObjectParams.equalsFields(pres)) { + this.presentationObjectParams = pres; + mapPresentationEnvironment = new MapPresentationEnvironment( + mapStyle, displayDensityFactor, langId, langPref); } + // Apply map style settings + OsmandSettings prefs = app.getSettings(); + RenderingRulesStorage storage = app.getRendererRegistry() + .getCurrentSelectedRenderer(); + Map props = new HashMap(); + for (RenderingRuleProperty customProp : storage.PROPS.getCustomRules()) { + if (customProp.isBoolean()) { + CommonPreference pref = prefs + .getCustomRenderBooleanProperty(customProp + .getAttrName()); + props.put(customProp.getAttrName(), pref.get() + ""); + } else { + CommonPreference settings = prefs + .getCustomRenderProperty(customProp.getAttrName()); + String res = settings.get(); + if (!Algorithms.isEmpty(res)) { + props.put(customProp.getAttrName(), res); + } + } + } + + QStringStringHash convertedStyleSettings = new QStringStringHash(); + for (Iterator> itSetting = props.entrySet() + .iterator(); itSetting.hasNext();) { + Map.Entry setting = itSetting.next(); + convertedStyleSettings.set(setting.getKey(), setting.getValue()); + } + if(nightMode) { + convertedStyleSettings.set("nightMode", "true"); + } + mapPresentationEnvironment.setSettings(convertedStyleSettings); + // Update all dependencies - if (_mapPrimitiviser != null) + if (mapPrimitiviser != null) { updateMapPrimitiviser(); + } } /** * Reference to map primitiviser (if used) */ - private MapPrimitiviser _mapPrimitiviser; + private MapPrimitiviser mapPrimitiviser; /** * Update map primitiviser and everything that depends on it */ private void updateMapPrimitiviser() { // Create new map primitiviser - _mapPrimitiviser = new MapPrimitiviser(_mapPresentationEnvironment); + mapPrimitiviser = new MapPrimitiviser(mapPresentationEnvironment); // Update all dependencies - if (_mapPrimitivesProvider != null) + if (mapPrimitivesProvider != null) updateMapPrimitivesProvider(); } @@ -332,146 +252,123 @@ public class MapRendererContext { */ private void updateObfMapObjectsProvider() { _obfMapObjectsProvider = new ObfMapObjectsProvider( - _obfsCollection); + obfsCollection); // Update all dependencies - if (_mapPrimitivesProvider != null) + if (mapPrimitivesProvider != null) updateMapPrimitivesProvider(); } /** * Reference to map primitives provider (if used) */ - private MapPrimitivesProvider _mapPrimitivesProvider; + private MapPrimitivesProvider mapPrimitivesProvider; /** * Update map primitives provider and everything that depends on it */ private void updateMapPrimitivesProvider() { // Create new map primitives provider - _mapPrimitivesProvider = new MapPrimitivesProvider( + mapPrimitivesProvider = new MapPrimitivesProvider( _obfMapObjectsProvider, - _mapPrimitiviser, - _rasterTileSize); + mapPrimitiviser, + rasterTileSize); // Update all dependencies - if (_obfMapRasterLayerProvider != null) + if (obfMapRasterLayerProvider != null) updateObfMapRasterLayerProvider(); - if (_obfMapSymbolsProvider != null) + if (obfMapSymbolsProvider != null) updateObfMapSymbolsProvider(); } /** * Reference to OBF map raster layer provider (if used) */ - private IRasterMapLayerProvider _obfMapRasterLayerProvider; + private IRasterMapLayerProvider obfMapRasterLayerProvider; /** * Index of OBF map raster layer in bound map renderer view (if set) */ - private Integer _obfMapRasterLayer; + private Integer obfMapRasterLayer; + private boolean nightMode; /** * Update OBF map raster layer provider and everything that depends on it */ private void updateObfMapRasterLayerProvider() { // Create new OBF map raster layer provider - _obfMapRasterLayerProvider = new MapRasterLayerProvider_Software( - _mapPrimitivesProvider); + obfMapRasterLayerProvider = new MapRasterLayerProvider_Software( + mapPrimitivesProvider); // In case there's bound view and configured layer, perform setup - if(_mapRendererView != null && _obfMapRasterLayer != null) - _mapRendererView.setMapLayerProvider(_obfMapRasterLayer, _obfMapRasterLayerProvider); + if(mapRendererView != null && obfMapRasterLayer != null) + mapRendererView.setMapLayerProvider(obfMapRasterLayer, obfMapRasterLayerProvider); } - /** - * Reference to OBF map symbols provider (if used) - */ - private IMapTiledSymbolsProvider _obfMapSymbolsProvider; + /** * Update OBF map symbols provider and everything that depends on it */ private void updateObfMapSymbolsProvider() { // If there's current provider and bound view, remove it - if (_obfMapSymbolsProvider != null && _mapRendererView != null) - _mapRendererView.removeSymbolsProvider(_obfMapSymbolsProvider); + if (obfMapSymbolsProvider != null && mapRendererView != null) + mapRendererView.removeSymbolsProvider(obfMapSymbolsProvider); // Create new OBF map symbols provider - _obfMapSymbolsProvider = new MapObjectsSymbolsProvider( - _mapPrimitivesProvider, - _referenceTileSize); + obfMapSymbolsProvider = new MapObjectsSymbolsProvider( + mapPrimitivesProvider, + referenceTileSizef); // If there's bound view, add new provider - if (_mapRendererView != null) - _mapRendererView.addSymbolsProvider(_obfMapSymbolsProvider); + if (mapRendererView != null) + mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); } /** * Apply current context to view */ private void apply() { - if (_mapRendererView instanceof AtlasMapRendererView) - ((AtlasMapRendererView)_mapRendererView).setReferenceTileSizeOnScreenInPixels(_referenceTileSize); + if (mapRendererView instanceof AtlasMapRendererView) + ((AtlasMapRendererView)mapRendererView).setReferenceTileSizeOnScreenInPixels(referenceTileSizef); // Layers - if (_obfMapRasterLayer != null && _obfMapRasterLayerProvider != null) - _mapRendererView.setMapLayerProvider(_obfMapRasterLayer, _obfMapRasterLayerProvider); + if (obfMapRasterLayer != null && obfMapRasterLayerProvider != null) + mapRendererView.setMapLayerProvider(obfMapRasterLayer, obfMapRasterLayerProvider); // Symbols - if (_obfMapSymbolsProvider != null) - _mapRendererView.addSymbolsProvider(_obfMapSymbolsProvider); + if (obfMapSymbolsProvider != null) + mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); } /** * Setup OBF map on layer 0 with symbols * @param obfsCollection OBFs collection */ - public void setupObfMap(ResolvedMapStyle mapStyle, IObfsCollection obfsCollection) { - setupObfMap(mapStyle, obfsCollection, 0, true); + public void setupObfMap(MapStylesCollection mapStylesCollection, IObfsCollection obfsCollection) { + this.obfsCollection = obfsCollection; + this.mapStylesCollection = mapStylesCollection; + this.obfMapRasterLayer = OBF_RASTER_LAYER; + updateMapPresentationEnvironment(); + updateMapPrimitiviser(); + updateMapPrimitivesProvider(); + updateObfMapObjectsProvider(); + updateObfMapRasterLayerProvider(); + updateObfMapSymbolsProvider(); } - /** - * Setup OBF map on specified layer with optional symbols - * @param obfsCollection OBFs collection - * @param layer Layer index - * @param withSymbols True if with symbols, false otherwise - */ - public void setupObfMap(ResolvedMapStyle mapStyle, - IObfsCollection obfsCollection, - int layer, - boolean withSymbols) { - synchronized (_syncObject) { - boolean update = false; - - if (_mapStyle != mapStyle) { - _mapStyle = mapStyle; - update = true; - } - - if (_obfsCollection != obfsCollection) { - _obfsCollection = obfsCollection; - update = true; - } - - if (_obfMapRasterLayer == null || _obfMapRasterLayer != layer) { - _obfMapRasterLayer = layer; - update = true; - } - - if (withSymbols != (_obfMapSymbolsProvider != null)) { - update = true; - } - - if (!update) - return; - + public void updateMapSettings() { + if (mapPresentationEnvironment != null) { updateMapPresentationEnvironment(); - updateMapPrimitiviser(); - updateMapPrimitivesProvider(); - updateObfMapObjectsProvider(); - updateObfMapRasterLayerProvider(); - updateObfMapSymbolsProvider(); } } + + public boolean isNightMode() { + return nightMode; + } + + public void setNightMode(boolean nightMode) { + this.nightMode = nightMode; + updateMapSettings(); + } } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 6e790a50f9..f5287d7d9c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -37,6 +37,7 @@ import net.osmand.plus.activities.search.SearchActivity; import net.osmand.plus.base.FailSafeFuntions; import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.helpers.GpxImportHelper; +import net.osmand.plus.helpers.WakeLockHelper; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.routing.RoutingHelper; @@ -81,8 +82,7 @@ import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.Toast; -public class MapActivity extends AccessibleActivity implements - VoiceRouter.VoiceMessageListener { +public class MapActivity extends AccessibleActivity { private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1; private static final int LONG_KEYPRESS_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 2; @@ -114,13 +114,9 @@ public class MapActivity extends AccessibleActivity implements private StateChangedListener applicationModeListener; private FrameLayout lockView; private GpxImportHelper gpxImportHelper; - private PowerManager.WakeLock wakeLock = null; - private ReleaseWakeLocksRunnable releaseWakeLocksRunnable = new ReleaseWakeLocksRunnable(); - private boolean active = false; + private WakeLockHelper wakeLockHelper ; private boolean intentLocation = false; - private DevicePolicyManager mDevicePolicyManager; - private ComponentName mDeviceAdmin; private Notification getNotification() { Intent notificationIndent = new Intent(this, getMyApplication().getAppCustomization().getMapActivity()); @@ -229,9 +225,8 @@ public class MapActivity extends AccessibleActivity implements gpxImportHelper = new GpxImportHelper(this, getMyApplication(), getMapView()); mapActions.prepareStartOptionsMenu(); - - mDeviceAdmin = new ComponentName(getApplicationContext(), DeviceAdminRecv.class); - mDevicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); + + wakeLockHelper = new WakeLockHelper(getMyApplication()); } @@ -571,11 +566,7 @@ public class MapActivity extends AccessibleActivity implements @Override protected void onStart() { super.onStart(); - active = true; - if (wakeLock == null) { - VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); - voiceRouter.removeVoiceMessageListener(this); - } + wakeLockHelper.onStart(this); } protected void setProgressDlg(Dialog progressDlg) { @@ -598,11 +589,7 @@ public class MapActivity extends AccessibleActivity implements progressDlg.dismiss(); progressDlg = null; } - if (!isFinishing() && (settings.WAKE_ON_VOICE_INT.get() > 0)) { - VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); - voiceRouter.addVoiceMessageListener(this); - } - active = false; + wakeLockHelper.onStop(this); super.onStop(); } @@ -671,16 +658,7 @@ public class MapActivity extends AccessibleActivity implements public void updateApplicationModeSettings() { changeKeyguardFlags(); - // update vector renderer - RendererRegistry registry = app.getRendererRegistry(); - RenderingRulesStorage newRenderer = registry.getRenderer(settings.RENDERER.get()); - if (newRenderer == null) { - newRenderer = registry.defaultRender(); - } - if (registry.getCurrentSelectedRenderer() != newRenderer) { - registry.setCurrentSelectedRender(newRenderer); - app.getResourceManager().getRenderer().clearCache(); - } + updateMapSettings(); mapViewTrackingUtilities.updateSettings(); app.getRoutingHelper().setAppMode(settings.getApplicationMode()); if (mapLayers.getMapInfoLayer() != null) { @@ -697,6 +675,22 @@ public class MapActivity extends AccessibleActivity implements }); getMapView().refreshMap(true); } + + public void updateMapSettings() { + // update vector renderer + RendererRegistry registry = app.getRendererRegistry(); + RenderingRulesStorage newRenderer = registry.getRenderer(settings.RENDERER.get()); + if (newRenderer == null) { + newRenderer = registry.defaultRender(); + } + if(mapView.getMapRenderer() != null) { + NativeCoreContext.getMapRendererContext().updateMapSettings(); + } + if (registry.getCurrentSelectedRenderer() != newRenderer) { + registry.setCurrentSelectedRender(newRenderer); + app.getResourceManager().getRenderer().clearCache(); + } + } @Override @@ -825,54 +819,5 @@ public class MapActivity extends AccessibleActivity implements return getWindow().getDecorView().findViewById(android.R.id.content); } - @Override - public void onVoiceMessage() { - final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); - if (screenPowerSave > 0) { - uiHandler.removeCallbacks(releaseWakeLocksRunnable); - if (!active && wakeLock == null) { - PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); - wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK - | PowerManager.ACQUIRE_CAUSES_WAKEUP, - "OsmAndOnVoiceWakeupTag"); - wakeLock.acquire(); - } - - uiHandler.postDelayed(releaseWakeLocksRunnable, - screenPowerSave * 1000L); - } - } - - private void releaseWakeLocks() { - if (wakeLock != null) { - wakeLock.release(); - wakeLock = null; - } - - if (mDevicePolicyManager != null && mDeviceAdmin != null) { - final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); - if (screenPowerSave > 0 && settings.MAP_ACTIVITY_ENABLED.get()) { - if (mDevicePolicyManager.isAdminActive(mDeviceAdmin)) { - try { - mDevicePolicyManager.lockNow(); - } catch (SecurityException e) { -// Log.d(TAG, -// "SecurityException: No device admin permission to lock the screen!"); - } - } else { -// Log.d(TAG, -// "No device admin permission to lock the screen!"); - } - } - } - } - - private class ReleaseWakeLocksRunnable implements Runnable { - - @Override - public void run() { - releaseWakeLocks(); - } - } } diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java index 6d26e5696b..3c77b04d38 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/ConfigureMapMenu.java @@ -166,6 +166,7 @@ public class ConfigureMapMenu { protected void refreshMapComplete(final MapActivity activity) { activity.getMyApplication().getResourceManager().getRenderer().clearCache(); + activity.updateMapSettings(); activity.getMapView().refreshMap(true); } @@ -368,8 +369,7 @@ public class ConfigureMapMenu { @Override public void onClick(DialogInterface dialog, int which) { pref.set(p.getPossibleValues()[which]); - app.getResourceManager().getRenderer().clearCache(); - view.refreshMap(true); + refreshMapComplete(activity); adapter.setItemDescription(pos, SettingsActivity.getStringPropertyValue(activity, pref.get())); dialog.dismiss(); ad.notifyDataSetInvalidated(); diff --git a/OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java new file mode 100755 index 0000000000..73c4c64463 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/helpers/WakeLockHelper.java @@ -0,0 +1,103 @@ +package net.osmand.plus.helpers; + +import net.osmand.plus.DeviceAdminRecv; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; +import net.osmand.plus.routing.VoiceRouter; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; +import android.os.Handler; +import android.os.PowerManager; + +@SuppressLint("NewApi") +public class WakeLockHelper implements VoiceRouter.VoiceMessageListener { + + private PowerManager.WakeLock wakeLock = null; + private ReleaseWakeLocksRunnable releaseWakeLocksRunnable = new ReleaseWakeLocksRunnable(); + private DevicePolicyManager mDevicePolicyManager; + private ComponentName mDeviceAdmin; + private Handler uiHandler; + private OsmandApplication app; + private boolean active; + + public WakeLockHelper(OsmandApplication app){ + uiHandler = new Handler(); + this.app = app; + mDeviceAdmin = new ComponentName(app, DeviceAdminRecv.class); + mDevicePolicyManager = (DevicePolicyManager) app.getSystemService(Context.DEVICE_POLICY_SERVICE); + } + + private void releaseWakeLocks() { + if (wakeLock != null) { + wakeLock.release(); + wakeLock = null; + } + + if (mDevicePolicyManager != null && mDeviceAdmin != null) { + OsmandSettings settings = app.getSettings(); + final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); + if (screenPowerSave > 0 && settings.MAP_ACTIVITY_ENABLED.get()) { + if (mDevicePolicyManager.isAdminActive(mDeviceAdmin)) { + try { + mDevicePolicyManager.lockNow(); + } catch (SecurityException e) { +// Log.d(TAG, +// "SecurityException: No device admin permission to lock the screen!"); + } + } else { +// Log.d(TAG, +// "No device admin permission to lock the screen!"); + } + } + } + } + + private class ReleaseWakeLocksRunnable implements Runnable { + + @Override + public void run() { + releaseWakeLocks(); + } + } + + public void onStart(Activity a) { + this.active = true; + if (wakeLock == null) { + VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); + voiceRouter.removeVoiceMessageListener(this); + } + } + + public void onStop(Activity a) { + this.active = false; + OsmandSettings settings = app.getSettings(); + if (!a.isFinishing() && (settings.WAKE_ON_VOICE_INT.get() > 0)) { + VoiceRouter voiceRouter = app.getRoutingHelper().getVoiceRouter(); + voiceRouter.addVoiceMessageListener(this); + } + } + + @Override + public void onVoiceMessage() { + OsmandSettings settings = app.getSettings(); + final Integer screenPowerSave = settings.WAKE_ON_VOICE_INT.get(); + if (screenPowerSave > 0) { + uiHandler.removeCallbacks(releaseWakeLocksRunnable); + + if (!active && wakeLock == null) { + PowerManager pm = (PowerManager) app.getSystemService(Context.POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK + | PowerManager.ACQUIRE_CAUSES_WAKEUP, + "OsmAndOnVoiceWakeupTag"); + wakeLock.acquire(); + } + + uiHandler.postDelayed(releaseWakeLocksRunnable, + screenPowerSave * 1000L); + } + } + +} diff --git a/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java b/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java index 4a195a6b9f..b8a3d5e090 100644 --- a/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java +++ b/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java @@ -9,11 +9,13 @@ import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.views.BaseMapLayer; import net.osmand.plus.views.MapTileLayer; import net.osmand.plus.views.OsmandMapTileView; +import net.osmand.plus.views.corenative.NativeCoreContext; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.RectF; +import android.view.MotionEvent; public class MapVectorLayer extends BaseMapLayer { @@ -80,6 +82,20 @@ public class MapVectorLayer extends BaseMapLayer { } + @Override + public boolean onTouchEvent(MotionEvent event, RotatedTileBox tileBox) { + final MapRendererView mapRenderer = view.getMapRenderer(); + if (mapRenderer != null) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mapRenderer.suspendSymbolsUpdate(); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mapRenderer.resumeSymbolsUpdate(); + } + } + + return false; + } + @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tilesRect, DrawSettings drawSettings) { @@ -92,6 +108,9 @@ public class MapVectorLayer extends BaseMapLayer { } else { final MapRendererView mapRenderer = view.getMapRenderer(); if (mapRenderer != null) { + if(NativeCoreContext.getMapRendererContext().isNightMode() != drawSettings.isNightMode()) { + NativeCoreContext.getMapRendererContext().setNightMode(drawSettings.isNightMode()); + } // opengl renderer mapRenderer.setTarget(new PointI(tilesRect.getCenter31X(), tilesRect.getCenter31Y())); mapRenderer.setAzimuth(-tilesRect.getRotate()); diff --git a/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java b/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java old mode 100644 new mode 100755 diff --git a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java index f945cb4e43..0271fd28e1 100644 --- a/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java +++ b/OsmAnd/src/net/osmand/plus/routing/VoiceRouter.java @@ -4,6 +4,7 @@ package net.osmand.plus.routing; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import net.osmand.Location; import net.osmand.binary.RouteDataObject; @@ -76,8 +77,7 @@ public class VoiceRouter { public interface VoiceMessageListener { void onVoiceMessage(); } - private List voiceMessageListeners; - private Handler handler; + private ConcurrentHashMap voiceMessageListeners; public VoiceRouter(RoutingHelper router, final OsmandSettings settings, CommandPlayer player) { this.router = router; @@ -85,12 +85,7 @@ public class VoiceRouter { this.settings = settings; empty = new Struct(""); - voiceMessageListeners = new ArrayList(); - Looper looper = Looper.myLooper(); - if (looper == null) { - looper = Looper.getMainLooper(); - } - handler = new Handler(looper); + voiceMessageListeners = new ConcurrentHashMap(); } public void setPlayer(CommandPlayer player) { @@ -847,46 +842,24 @@ public class VoiceRouter { } public void addVoiceMessageListener(VoiceMessageListener voiceMessageListener) { - synchronized (voiceMessageListeners) { - if (!voiceMessageListeners.contains(voiceMessageListener)) { - voiceMessageListeners.add(voiceMessageListener); - } - } + voiceMessageListeners.put(voiceMessageListener, null); } public void removeVoiceMessageListener(VoiceMessageListener voiceMessageListener) { - synchronized (voiceMessageListeners) { - if (voiceMessageListeners.contains(voiceMessageListener)) { - voiceMessageListeners.remove(voiceMessageListener); - } - } + voiceMessageListeners.remove(voiceMessageListener); } public void notifyOnVoiceMessage() { - handler.post(new Runnable() { - - @Override - public void run() { - synchronized (voiceMessageListeners) { - for (final VoiceMessageListener voiceMessageListener : voiceMessageListeners) { - Runnable closure = new Runnable() { - public void run() { - if (settings.WAKE_ON_VOICE_INT.get() > 0) { - synchronized (voiceMessageListeners) { - if (voiceMessageListeners - .contains(voiceMessageListener) - && (settings.WAKE_ON_VOICE_INT.get() > 0)) { - voiceMessageListener - .onVoiceMessage(); - } - } - } - } - }; - handler.post(closure); + if (settings.WAKE_ON_VOICE_INT.get() > 0) { + router.getApplication().runInUIThread(new Runnable() { + @Override + public void run() { + for (VoiceMessageListener lnt : voiceMessageListeners + .keySet()) { + lnt.onVoiceMessage(); } } - } - }); + }); + } } } diff --git a/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java b/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java index 53fdf2ed02..89de94d564 100644 --- a/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java +++ b/OsmAnd/src/net/osmand/plus/views/AnimateDraggingMapThread.java @@ -1,6 +1,7 @@ package net.osmand.plus.views; import net.osmand.PlatformUtil; +import net.osmand.core.android.MapRendererView; import net.osmand.data.RotatedTileBox; import net.osmand.util.MapUtils; @@ -8,6 +9,7 @@ import org.apache.commons.logging.Log; import android.os.SystemClock; import android.util.FloatMath; +import android.view.MotionEvent; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.LinearInterpolator; @@ -103,10 +105,12 @@ public class AnimateDraggingMapThread { @Override public void run() { - try { + try { + suspendUpdate(); runnable.run(); } finally { currentThread = null; + resumeUpdate(); } } }, "Animating Thread"); @@ -305,6 +309,20 @@ public class AnimateDraggingMapThread { targetZoomScale = 0; } + private void suspendUpdate() { + final MapRendererView mapRenderer = tileView.getMapRenderer(); + if (mapRenderer != null) { + mapRenderer.suspendSymbolsUpdate(); + } + } + + private void resumeUpdate() { + final MapRendererView mapRenderer = tileView.getMapRenderer(); + if (mapRenderer != null) { + mapRenderer.resumeSymbolsUpdate(); + } + } + private void setTargetValues(int zoom, double zoomScale, double lat, double lon){ targetIntZoom = zoom; targetZoomScale = zoomScale; diff --git a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java index 775ec8fad1..c660c749a2 100644 --- a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java +++ b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java @@ -6,6 +6,7 @@ import android.content.Context; import android.util.DisplayMetrics; import android.util.Log; import android.view.WindowManager; +import net.osmand.IndexConstants; import net.osmand.core.android.CoreResourcesFromAndroidAssetsCustom; import net.osmand.core.android.MapRendererContext; import net.osmand.core.android.NativeCore; @@ -23,6 +24,8 @@ public class NativeCoreContext { private static boolean init; + private static MapRendererContext mapRendererContext; + public static boolean isInit() { return init; } @@ -52,42 +55,44 @@ public class NativeCoreContext { WindowManager mgr = (WindowManager)app.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); mgr.getDefaultDisplay().getMetrics(dm); - - // Get device display density factor -// DisplayMetrics displayMetrics = new DisplayMetrics(); -// act.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - DisplayMetrics displayMetrics = app.getResources().getDisplayMetrics(); - // TODO getSettings().getSettingsZoomScale() + Math.sqrt(Math.max(0, getDensity() - 1)) - float scaleCoefficient = displayMetrics.density; - if (Math.min(dm.widthPixels / (dm.density * 160), dm.heightPixels / (dm.density * 160)) > 2.5f) { - // large screen - scaleCoefficient *= 1.5f; - } - float displayDensityFactor = scaleCoefficient; + float displayDensityFactor = (float) Math.pow(2, (app.getSettings().getSettingsZoomScale() + Math.sqrt(Math.max(0, dm.density - 1)))); - _obfsCollection = new ObfsCollection(); - _obfsCollection.addDirectory(directory.getAbsolutePath(), false); + ObfsCollection obfsCollection = new ObfsCollection(); + obfsCollection.addDirectory(directory.getAbsolutePath(), false); - _mapStylesCollection = new MapStylesCollection(); - - _mapRendererContext = new MapRendererContext(); - _mapRendererContext.setDisplayDensityFactor(displayDensityFactor); - _mapRendererContext.setupObfMap( - _mapStylesCollection.getResolvedStyleByName("default"), - _obfsCollection); + MapStylesCollection mapStylesCollection = setupMapStyleCollection(app); + mapRendererContext = new MapRendererContext(app); + mapRendererContext.setDisplayDensityFactor(displayDensityFactor); + mapRendererContext.setupObfMap(mapStylesCollection, obfsCollection); init = true; } } } - - private static MapStylesCollection _mapStylesCollection; - - private static ObfsCollection _obfsCollection; - - private static MapRendererContext _mapRendererContext; + + private static MapStylesCollection setupMapStyleCollection( + OsmandApplication app) { + MapStylesCollection mapStylesCollection = new MapStylesCollection(); + // Alexey TODO +// internalRenderers.put("Touring-view_(more-contrast-and-details)", "Touring-view_(more-contrast-and-details)" +".render.xml"); +// internalRenderers.put("UniRS", "UniRS" + ".render.xml"); +// internalRenderers.put("LightRS", "LightRS" + ".render.xml"); +// internalRenderers.put("High-contrast-roads", "High-contrast-roads" + ".render.xml"); +// internalRenderers.put("Winter-and-ski", "Winter-and-ski" + ".render.xml"); + File renderers = app.getAppPath(IndexConstants.RENDERERS_DIR); + File[] lf = renderers.listFiles(); + if(lf != null) { + for(File f : lf) { + if(f.getName().endsWith(IndexConstants.RENDERER_INDEX_EXT)) { + mapStylesCollection.addStyleFromFile(f.getAbsolutePath()); + } + } + } + return mapStylesCollection; + } + public static MapRendererContext getMapRendererContext() { - return _mapRendererContext; + return mapRendererContext; } } From 39985aabc1755cfce13341d36dd68d87c6829213 Mon Sep 17 00:00:00 2001 From: stephan 75 Date: Mon, 1 Dec 2014 18:11:42 +0100 Subject: [PATCH 02/24] Translated using Weblate (German) Currently translated at 99.9% (1566 of 1567 strings) --- OsmAnd/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 3c027aead9..6f7cf174ed 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -1,4 +1,4 @@ - + Geschwindigkeitsbegrenzung Grenzkontrolle @@ -1950,7 +1950,7 @@ Afghanistan, Ägypten, Albanien, Algerien, Andorra, Angola, Anguilla, Antigua an GPX-Route umkehren Derzeitiges Ziel verwenden Gesamten Track durchlaufen - Keine GPX-Dateien gefunden in /tracks-Ordner + Keine GPX-Dateien gefunden im /tracks-Ordner GPX-Dateiname GPX-Datei erfolgreich gespeichert unter {0} Berechnen des ersten und letzten Abschnitts der OsmAnd-Route From 1626b17e260d1c7830f5fa2db0532071a16b18ab Mon Sep 17 00:00:00 2001 From: 8c6311e901274f6baef2068792c8ab Date: Mon, 1 Dec 2014 15:47:41 +0100 Subject: [PATCH 03/24] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.3% (1024 of 1567 strings) --- OsmAnd/res/values-nb/strings.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index 96e097cefa..c1d0be96a4 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -1,4 +1,4 @@ - + Velg fargeskjema for veier: Veifargeskjema Vis retning til målet @@ -1067,5 +1067,11 @@ Last ned Bruk sikker forbindelse med server Bruk https - Skal OsmAnd forsøke å kopiere datafilene til det nye stedet? - + Skal OsmAnd også kopiere datafilene til det nye stedet? + Nærmeste vei ble ikke funnet + Hjem + Kart + Søk etter + VIS KART + Koordinater + From b6272c39b5168d872cfb98f26b013dd93492f330 Mon Sep 17 00:00:00 2001 From: Lu Ca Date: Mon, 1 Dec 2014 17:03:27 +0100 Subject: [PATCH 04/24] Translated using Weblate (Sardinian) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-sc/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml index 311646a348..1d5053ba3b 100644 --- a/OsmAnd/res/values-sc/strings.xml +++ b/OsmAnd/res/values-sc/strings.xml @@ -1787,5 +1787,5 @@ Si cussigiat de annànghere unu o prus puntos intermedios pro megiorare sas pres AMMUSTRA TOTU Coordinatas Mapas - No est istada agatada peruna istada a curtzu + No est istada agatada peruna istrada a curtzu From de4c76cf38c42050c2c8d09b877151d028d64e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20B=C3=A1thory?= Date: Mon, 1 Dec 2014 23:07:08 +0100 Subject: [PATCH 05/24] Translated using Weblate (Hungarian) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-hu/strings.xml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 7283f229db..47d861e500 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -1,4 +1,4 @@ - + "A 0.7.2 kiadás változásai: \n\t- Natív renderelő minden eszközre \n\t- Offline POI szerkesztés @@ -1812,4 +1812,14 @@ " Az OsmAnd (OSM Automated Navigation Directions) egy térkép és navigációs alkalmazás, ingyenes, világméretű és jó minőségű OpenStreetMap (OSM) térképpel. Az összes térképadat offline tárolható az eszköz memóriakártyáján. GPS használatával az OsmAnd képes útvonaltervezésre, vizuális és hangnavigációra, mindezt autós, kerékpáros és gyalogos módban. Az összes főbb funkció működik online és offline (internetkapcsolat nélkül) is.\n\nAz OsmAnd+ az alkalmazás fizetős változata. A megvételével támogatod a projektet, megalapozod új funkciók fejlesztését, és megkapod a legújabb frissítéseket. Ha vársárlás előtt kipróbálnád az alkalmazást, telepítsd az OsmAndot.\n\nNéhány főbb funkció:\n\nNavigáció\n- Működik online (gyorsabb) vagy offline (nincs internet roaming díj külföldön)\n- Turn-by-turn hangnavigáció felvett, vagy gépi hanggal (utóbbihoz TTS felolvasó szükséges)\n- Sávkijelzés, utcanévkijelzés, várható érkezési idő\n- Köztes útpontok megadásának lehetősége\n- Automatikus újratervezés, ha letértél az útról\n- Keresés helyekre cím alapján, típus szerint (étterem, hotel, benzinkút, múzeum), vagy koordináta alapján\n\nTérkép nézet\n- A pozíciód és irányod megjelenítése a térképen\n- A térkép forgatása választható iránytű, vagy mozgásirány alapján\n- Fontos helyek mentése Kedvencként\n- POI-k (érdekes helyek) megjelenítése a környékeden\n- Online (csempés) térképek megjelenítése\n- Műhold nézet (Bing)\n- Különféle rátét térképek állítható átlátszósággal, felvett GPX nyomvonalak\n- Helynevek megjelenítése saját nyelven, angolul, vagy fonetikus átírásban\n\nOpenStreetMap és Wikipédia adatok\n- Minőségi információk az egész világról a legjobb közösségi projektektől\n- OpenStreetMap térképek az egész földről országonkénti vagy régió szerinti bontásban\n- Wikipédia POI-k városnézéshez (nem elérhető az ingyenes verzióban)\n- Korlátlan ingyenes letöltés közvetlenül az alkalmazásból (az ingyenes verzióban 16 térképfájlra korlátozva)\n- Folyamatosan frissülő térképek (legalább havonta egyszer)\n- Kompakt offline vektoros térképek\n- Választható teljes térkép vagy csak úthálózat (például teljes Japán 700 MB, de az úthálózat csak 200 MB)\n- Támogatja az online vagy előre letárolt csempés térképeket\n\nBiztonsági funkciók\n- Választható automata nappal/éjjel nézet váltás\n- Választható sebességhatár kijelzés, túllépés esetén figyelmeztetéssel\n- Választható sebességfüggő nagyítás\n- Pozíciód megosztása, hogy a barátaid megtaláljanak\n\nKerékpáros és gyalogos funkciók\n- Szabadtéri tevékenységekhez a térképek tartalmazzák a gyalogos, túra, és kerékpáros ösvényeket\n- Külön gyalogos és kerékpáros tervezés és megjelenítés\n- Tömegközlekedési megállók vonalnevekkel\n- Utazás felvétele GPX fájlba vagy online szolgáltatásra\n- Sebesség és tengerszint feletti magasság megjelenítés\n- Szintvonalak és domborzatárnyékolás megjelenítése (plugin telepítése szükséges)\n\nKözvetlen OpenStreetMap közreműködés\n- Térképhibák jelentése\n- GPX nyomvonalak feltöltése OSM-re közvetlenül az alkalmazásból\n- POI-k felvétele és feltöltése közvetlenül OSM-be (vagy később offline)\n\nAz OsmAnd nyílt forráskódú és aktív fejlesztés alatt áll. Bárki közreműködhet hibák jelentésével, fordításokkal, vagy új funkciók fejlesztésével. A projekt haladása függ az anyagi hozzájárulásoktól is, megalapozva a fejlesztést, kódolást, és az új funkciók tesztelését. Az OsmAnd+ megvásárlásával segítheted, hogy az alkalmazás még szuperebb legyen! Az osmand.net-en lehetőség van konkrét funkció támogatására és általános adományozásra is.\n\nHozzávetőleges térképi lefedettség és minőség:\n- Nyugat-Európa: ****\n- Kelet-Európa: ***\n- Oroszország: ***\n- Észak-Amerika: ***\n- Dél-Amerika: **\n- Ázsia: **\n- Japán & Korea: ***\n- Közel-Kelet: **\n- Afrika: **\n- Antarktisz: *\n\nTámogatott országok listája (alapvetően az egész világ!):\nAfganisztán, Albánia, Algéria, Amerikai Egyesült Államok, Andorra, Anglia, Angola, Anguilla, Antigua és Barbuda, Argentína, Aruba, Ausztrália, Ausztria, Azerbajdzsán, Bahamák, Bahrein, Banglades, Barbados, Belgium, Belize, Benin, Bhután, Bissau-Guinea, Bolívia, Bonaire, Bosznia és Hercegovina, Botswana, Brazília, Brit Virgin-szigetek, Brunei, Bulgária, Burkina Faso, Burundi, Chile, Ciprus, Comore-szigetek, Costa Rica, Curaçao, Csád, Csehország, Dánia, Dél-afrikai Köztársaság, Déli-Georgia, Dél-Szudán, Dominika, Dominikai Köztársaság, Dzsibuti, Ecuador, Egyesült Arab Emírségek, Egyesült Királyság, Egyiptom, El Salvador, Elefántcsontpart, Egyenlítői-Guinea, Eritrea, Észtország, Etiópia, Fehéroroszország, Fiji-szigetek, Finnország, Franciaország, Francia Polinézia, Fülöp-szigetek, Gabon, Gambia, Ghána, Gibraltár, Görögország, Grenada, Grönland, Grúzia, Guadeloupe, Guam, Guatemala, Guernsey, Guinea, Guyana, Haiti, Hollandia, Holland Antillák, Honduras, Horvátország, Hongkong, India, Indonézia, Irak, Irán, Írország, Izland, Izrael, Jamaica, Japán, Jemen, Jersey, Jordánia, Kambodzsa, Kamerun, Kanada, Katar, Kazahsztán, Kelet-Timor, Kenya, Kína, Kiribati, Kirgizisztán, Észak Korea és Dél Korea, Kolumbia, Kongó, Koszovó, Közép-afrikai Köztársaság, Kuba, Kuvait, Laosz, Lengyelország, Lesotho, Lettország, Libanon, Libéria, Líbia, Lichtenstein, Litvánia, Luxemburg, Macedónia, Madagaszkár, Makaó, Magyarország, Malajzia, Malawi, Maldív-szigetek, Mali, Málta, Man-szigetek, Marokkó, Martinique, Mauritánia, Mauritius, Mayotte, Mexikó, Mianmar, Mikronézia, Moldova, Monaco, Mongólia, Montenegró, Monserrat, Mozambik, Namíbia, Nauru, Németország, Nepál, Nicaragua, Niger, Nigéria, Norvégia, Nyugat-Szahara, Olaszország, Omán, Oroszország, Örményország, Pakisztán, Palau, Palesztina, Panama, Pápua Új-Guinea, Paraguay, Peru, Portugália, Puerto Rico, Románia, Ruanda, Saint-Barthélemy, Szent Ilona, Saint Kitts és Nevis, Saint Lucia, Saint-Martin, Saint-Pierre és Miquelon, Saint Vincent és a Grenadine-szigetek, San Marino, Seychelle-szigetek, Sierra Leone, Spanyolország, Srí Lanka, Suriname, Svájc, Svédország, Szamoa, Szaúd-Arábia, Szenegál, Szerbia, Szingapúr, Szíria, Szlovákia, Szlovénia, Szomália, Szudán, Szváziföld, Tajvan, Tádzsikisztán, Tanzánia, Thaiföld, Tokelau-szigetek, Togo, Tonga, Törökország, Trinidad és Tobago, Tunézia, Tuvalu, Türkmenisztán, Uganda, Új-Kaledónia, Új-Zéland, Ukrajna, Uruguay, Üzbegisztán, Vanuatu, Vatikán, Venezuela, Vietnam, Wallis és Fortuna, Zambia, Zimbabwe, Zöld-foki Köztársaság " Az %1$s számára engedély szükséges a képernyő kikapcsolásához energiatakarékossági célból. Soha - + Nem található út a közelben + Kezdőlap + Biztonságos kapcsolat a szerverrel + https használata + Haladó + Térképek + Keresés + MUTASD A TÉRKÉPET + MUTASD MIND + Koordináták + From 00fcb90a7eb853a2432343ecee40b6ca492633ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20B=C3=A1thory?= Date: Mon, 1 Dec 2014 23:23:29 +0100 Subject: [PATCH 06/24] Translated using Weblate (Hungarian) Currently translated at 100% (0 of 0 strings) Created new translation. --- OsmAnd/res/values-hu/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 OsmAnd/res/values-hu/phrases.xml diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/OsmAnd/res/values-hu/phrases.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From ec88fb9c74e156bbab9c44353133d32d1ae49195 Mon Sep 17 00:00:00 2001 From: Konfrare Albert Date: Mon, 1 Dec 2014 20:03:50 +0100 Subject: [PATCH 07/24] Translated using Weblate (Catalan) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-ca/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index 58e3effcb3..b85ec8d747 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -1901,5 +1901,5 @@ La llista de països inclosos (bàsicament tot el món!): Afganistan, Albània, MOSTRA\'LS TOTS Coordenades Mapes - No s\'ha trobat cap ruta aprop + No s\'ha trobat cap ruta a prop From 756d4b5cd0e444d7cf9a37d822edea8830191830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20B=C3=A1thory?= Date: Mon, 1 Dec 2014 23:22:11 +0100 Subject: [PATCH 08/24] Translated using Weblate (Hungarian) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-hu/strings.xml | 63 ++++++-------------------------- 1 file changed, 11 insertions(+), 52 deletions(-) diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml index 47d861e500..4e6ecfa853 100644 --- a/OsmAnd/res/values-hu/strings.xml +++ b/OsmAnd/res/values-hu/strings.xml @@ -424,7 +424,7 @@ OsmAnd offline útvonaltervező használata nagy távolságokra is (kísérleti funkció) Az OsmAnd offline útvonaltervezője kísérleti funkció és nem működik 20 kilométernél nagyobb távolságban.\n\nÁtmenetileg átállítva online Cluodmade-re. Nem található a megadott könyvtár. - Tárolási könyvtár + Adatok tárolási helye OsmAnd verzió {0} sikeresen telepítve ({1}). Összeállítás letöltése… @@ -480,7 +480,7 @@ Hang Nincs betöltött vektoros térkép Útvonal GPX alapján - Nem található GPX fálj /osmand/tracks könyvtárban + Nem található GPX fálj a tracks könyvtárban GPX útvonal… GPX adat olvasási hiba Vektoros OSM térkép @@ -601,7 +601,7 @@ Épület: {0}, {1}, {2} Kedvenc Mindent töröl - Előzmény + Előzmények Adat feltöltése… Feltöltés… Semmi sem található @@ -616,7 +616,7 @@ Teljes távolság %1$s, utazási idő %2$d ó. %3$d p. Online vagy offline útvonaltervező szolgáltatás kiválasztása Útvonaltervező - Nem található könyvtár az SD kártyán mentésre + Az adattárolási könyvtár nem elérhető az SD kártyán Letöltés {0} - {1} ? >Már létezik indexadat {0} régióhoz ({1}). Szeretné frissíteni ({2})? Cím @@ -684,7 +684,7 @@ Jelenlegi útvonal mentése Válassz naplózási időközt a navigáció alatti útvonalrögzítéshez Rögzítési sűrűség navigáció közben - Az útvonalak navigáció közben kerülnek mentésre a track könyvtárba + Az útvonalak navigáció közben kerülnek mentésre a tracks könyvtárba Útvonal naplózása GPX fájlba navigáció közben Térkép frissítés Térképcsempe újraolvasása @@ -999,49 +999,8 @@ \n\nAz OsmAnd saját forrásokat is támogat. Globális mobil térkép és navigáció, offline és online OSM térképekkel - - OsmAnd (OSM Automated Navigation Directions) - - Az OsmAnd egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. - - Néhány fontosabb funkció: - - Teljesen offline működés (a letöltött vektoros és raszteres térképek választható könyvtárban tárolhatók) - - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - - Az ország vagy régió térképei letölthetők közvetlenül az alkalmazásból - - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - - Címek és helyek offline kereshetősége - - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - - Autós, kerékpáros és gyalogos módok: - - Opcionális automata nappali/éjszakai nézetváltással - - Opcionális sebességfüggő nagyítással - - Opcionális térképforgatással a mozgás vagy az iránytű alapján - - Az OsmAnd ingyenes változatának korlátozásai: - - Korlátozott számú vektoros térképletöltés - - Offline Wikipédia cikkek nem elérhetőek - - Az OsmAnd folyamatosan fejlesztés alatt áll és a projektünk nagyban függ a pénzügyi támogatásoktól, amiből finanszírozhatók a fejlesztések és az új funkciók tesztelése. Kérlek, fontold meg az OsmAnd+ megvásárlását, vagy egy-egy funkció támogatását az osmand.net oldalon - - - OsmAnd+ (OSM Automated Navigation Directions) - - Az OsmAnd+ egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. - - Az OsmAnd+ az alkalmazás fizetős változata, aminek megvásárlásával támogatod a projektet, az új funkciók fejlesztésének finanszírozását és megkapod a legújabb frissítéseket. - - Néhány fontosabb funkció: - - Teljesen offline működés (a letöltött vektoros és raszteres térképek választható könyvtárban tárolhatók) - - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - - Az ország vagy régió térképei korlátlan számban letölthetők, közvetlenül az alkalmazásból - - Offline Wikipédia szócikkek letöltése, ami hasznos segítség városnézéshez - - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - - Címek és helyek offline kereshetősége - - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - - Autós, kerékpáros és gyalogos módok: - - Opcionális automata nappali/éjszakai nézetváltással - - Opcionális sebességfüggő nagyítással - - Opcionális térképforgatással a mozgás vagy az iránytű alapján - +" OsmAnd (OSM Automated Navigation Directions) Az OsmAnd egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. Néhány fontosabb funkció: - Teljesen offline működés (a letöltött vektoros és raszteres térképek az eszközön tárolódnak) - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - Az ország vagy régió térképei letölthetők közvetlenül az alkalmazásból - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - Címek és helyek offline kereshetősége - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - Autós, kerékpáros és gyalogos módok: - Opcionális automata nappali/éjszakai nézetváltással - Opcionális sebességfüggő nagyítással - Opcionális térképforgatással a mozgás vagy az iránytű alapján Az OsmAnd ingyenes változatának korlátozásai: - Korlátozott számú vektoros térképletöltés - Offline Wikipédia cikkek nem elérhetőek Az OsmAnd folyamatosan fejlesztés alatt áll és a projektünk nagyban függ a pénzügyi támogatásoktól, amiből finanszírozhatók a fejlesztések és az új funkciók tesztelése. Kérlek, fontold meg az OsmAnd+ megvásárlását, vagy egy-egy funkció támogatását az osmand.net oldalon " +" OsmAnd+ (OSM Automated Navigation Directions) Az OsmAnd+ egy nyílt forráskódú navigációs alkalmazás az OpenStreetMap (OSM) adatainak széleskörű használatával. Bármelyik térképadat (vektoros és raszteres térképek) tárolható a készülék memóriakártyáján offline használatra. Az OsmAnd továbbá lehetővé teszi az offline és online útvonaltervezést is, részletes hangutasításokkal. Az OsmAnd+ az alkalmazás fizetős változata, aminek megvásárlásával támogatod a projektet, az új funkciók fejlesztésének finanszírozását és megkapod a legújabb frissítéseket. Néhány fontosabb funkció: - Teljesen offline működés (a letöltött vektoros és raszteres térképek az eszközön tárolódnak) - A kompakt, offline vektoros térképek az egész világhoz elérhetőek - Az ország vagy régió térképei korlátlan számban letölthetők, közvetlenül az alkalmazásból - Offline Wikipédia szócikkek letöltése, ami hasznos segítség városnézéshez - Számos rávetíthető térképréteg, mint GPX-ek, navigációs útvonalak, POI-k (érdekes helyek), kedvencek, szintvonalak, tömegközlekedési megállók, további térképek beállítható átlátszósággal - Címek és helyek offline kereshetősége - Offline útvonaltervezés rövidebb távolságokra (kísérleti) - Autós, kerékpáros és gyalogos módok: - Opcionális automata nappali/éjszakai nézetváltással - Opcionális sebességfüggő nagyítással - Opcionális térképforgatással a mozgás vagy az iránytű alapján " Globális mobil térkép és navigáció, offline és online OSM térképekkel Autópályák elkerülése "A 0.8.3 kiadás változásai: @@ -1435,10 +1394,10 @@ Az Android 4.4 KitKat verzió óta nem lehet térképet letölteni és frissíteni a korábbi helyre (%s). Szeretnéd az összes fájlt egy engedélyezett helyre másolni? \n Megjegyzés: a régi fájlok érintetlenül maradnak. \n Megjegyzés: nem lehetséges az OsmAnd és OsmAnd+ között fájlokat megosztani. - Az OsmAnd megpróbálja az adatokat új helyre másolni. Szeretnéd? - %s fájl másolás új helyre… - OsmAnd fájlok másolása új helyre (%s) - OsmAnd fájlok másolása + Szeretnéd, hogy az OsmAnd az adatokat az új helyre másolja? + %s fájl másolása az új helyre… + OsmAnd adatainak másolása új helyre (%s) + OsmAnd adatok másolása OsmAnd offline útvonal tervezése Teherautó Navigációs beállítások From bd0aaf15bb7f72da2d37216694a78fe4ae063a97 Mon Sep 17 00:00:00 2001 From: jan madsen Date: Mon, 1 Dec 2014 21:35:21 +0100 Subject: [PATCH 09/24] Translated using Weblate (Danish) Currently translated at 100.0% (586 of 586 strings) --- OsmAnd/res/values-da/phrases.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd/res/values-da/phrases.xml b/OsmAnd/res/values-da/phrases.xml index ebb1697b96..af5a6d2fef 100644 --- a/OsmAnd/res/values-da/phrases.xml +++ b/OsmAnd/res/values-da/phrases.xml @@ -66,7 +66,7 @@ Optiker Økologiske fødevarer Fritidsbeklædning - Maling + Malerværksted Dyrehandel Radiodele Genbrugsbutik From 5a53fb41a49a3a6363914dc69bd10eb39e476d68 Mon Sep 17 00:00:00 2001 From: Lu Ca Date: Mon, 1 Dec 2014 22:19:33 +0100 Subject: [PATCH 10/24] Translated using Weblate (Sardinian) Currently translated at 52.0% (305 of 586 strings) --- OsmAnd/res/values-sc/phrases.xml | 189 +++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml index 9ba02c7ead..6b139a21a0 100644 --- a/OsmAnd/res/values-sc/phrases.xml +++ b/OsmAnd/res/values-sc/phrases.xml @@ -134,4 +134,193 @@ Parchègiu bitzicletas Gondola + Istatzione sciovia + Funivia + Ascensore carrotzina + Sciovia a àncora + Sciovia a J + Sciovia a piatellu + Sciovia ammesturada + Sciovia + Sciovia a fune + Sciovia pro ogetos + Sciovia a tapete + + Galleria + Ponte + + Autovelox + Retunda pro furriada de martza + Putzu + Impiantu ìdricu + Depuradore de sas abbas + Turre ìdrica + Diga + Mulinu ad abba + + Trasformadore + Tzentrale elètrica + Ufìtziu postale + Telèfonu + Turre telecomunicatziones + Tzentralinu telefònicu + + Osservatòriu astronòmicu + Fraigada + Fàbrica + Intrada de una galleria minerària + Putzu petrolìferu + Puntu geodèticu + Mulinu a bentu + Cava + Bìngia + Fruttedu + Salina + Campu de cricket inghiriadu dae retzas + + Iscola de ghia + Iscola + Collègiu + Universidade + + Tribunale + Càrtzere + Anàgrafe + Ambassada + Ufìtziu pùblicu + Ufitziale giuditziàriu + Pùblicu ministeru + Ufìtziu migratzione + Guàrdia de finàntzia + Ufìtziu amministrativu + Tzitade cabu-de-logu de provìntzia + Tzitade + Bidda + Bidditzolu + Domo/os isolada/as + Apendìtziu + Bighinadu + Localidade + + Potecaria + Ospidale + Dutore + Clìnica + Dentista + Veterinàriu + Sanatòriu + Meighina alternativa + Banca de su sàmbene + Tzentru mèdicu + Levadora + Optometrista + Fisioterapista + Podòlogu + Psicoterapèuta + Riabilitassione + Logopedista + Istrutura mèdica + + Asseguratzione + Butega immobiliare + Abogadu + ONG + Munitzìpiu + Ufìtziu pro su traballu + Ufìtziu IT + Redatzione de giornale + Istùdiu de architetura + Agentzia de publitzidade + Istitudu iscolàsticu + Istùdiu de registratzione + Iscummissas + + Istàdiu + Tzentru isportìvu + Campu de golf + Pista pro patinare in astra + Pista pro cùrrere + Pista pro bitziclètas + Pista pro caddos + Atlètica + Football australianu + Baseball + Basket + Botzas + Canoa + Iscacos + Cricket + Croquet + Tziclismu + Cursa de sos canes + Equitassione + Golf + Ginnàstica + Hockey + Cursas de sos caddos + Patinàgiu in s\'astra + Korfbal + Prus isports + Paddle tènnis + Pelota + Racquetball + Patinàgiu a rodas + Canotàgiu + Rugby a 15 + Rugby a 13 + Patinàgiu + Skateboard + Fubalu + Piscina + Tennis + Toboga + Museu + Attràida turìstica + Memoriale + Opera d\'arte + Giassu/situ archeològicu + Campu de batalla + Pedra de làcana + Casteddu + Ghenna de intrada a sa tzitade + Forte + Funtana + Ruinas istòricas + Pedra rùnica + Nave istòrica + Cava istòrica + Monumentu + Zoo + Parcu a tema + + Albergo + Posada + Motel + Chalet + + Logu de cultu + Logu de cultu: cristianu + Logu de cultu: ebreu + Logu de cultu: musulmanu + Logu de cultu: sikh + Logu de cultu: buddista + Logu de cultu: induista + Logu de cultu: shintoista + Logu de cultu: taoista + Monastèriu/Muristene + Monastèriu/Muristene istòricu + Rughe istòrica + Tabernàculu istòricu + Informatziones turìsticas + Relògiu + Agentzia de biàgios + Puntu panoràmicu + Campègiu + Tretu pro caravan e camper + Logu atretzadu pro picnic + Mitza + Geyser + Campusantu + Campusantu + Funiculare From 31086faff24389d82497cea4671a83ca823e3324 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 2 Dec 2014 07:53:01 +0100 Subject: [PATCH 11/24] Slight refactor native core context --- .../core/android/MapRendererContext.java | 442 +++++++----------- .../plus/activities/DashboardActivity.java | 4 + .../plus/activities/MapActivityLayers.java | 2 - .../plus/dashboard/DashBaseFragment.java | 1 + .../osmand/plus/render/NativeCppLibrary.java | 23 - .../views/corenative/NativeCoreContext.java | 6 +- 6 files changed, 173 insertions(+), 305 deletions(-) delete mode 100755 OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java diff --git a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java index 173474f3d5..434e5c07f3 100644 --- a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java +++ b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java @@ -1,6 +1,5 @@ package net.osmand.core.android; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -10,13 +9,13 @@ import net.osmand.core.jni.IObfsCollection; import net.osmand.core.jni.IRasterMapLayerProvider; import net.osmand.core.jni.MapObjectsSymbolsProvider; import net.osmand.core.jni.MapPresentationEnvironment; +import net.osmand.core.jni.MapPresentationEnvironment.LanguagePreference; import net.osmand.core.jni.MapPrimitivesProvider; import net.osmand.core.jni.MapPrimitiviser; import net.osmand.core.jni.MapRasterLayerProvider_Software; import net.osmand.core.jni.MapStylesCollection; import net.osmand.core.jni.ObfMapObjectsProvider; import net.osmand.core.jni.QStringStringHash; -import net.osmand.core.jni.MapPresentationEnvironment.LanguagePreference; import net.osmand.core.jni.ResolvedMapStyle; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -28,7 +27,6 @@ import net.osmand.util.Algorithms; /** * Context container and utility class for MapRendererView and derivatives. - * * @author Alexey Pelykh * */ @@ -37,58 +35,27 @@ public class MapRendererContext { private static final int OBF_RASTER_LAYER = 0; private OsmandApplication app; - /** - * Cached map styles per name - */ - private Map mapStyles = new HashMap(); - - /** - * Reference to OBF map symbols provider (if used) - */ - private IMapTiledSymbolsProvider obfMapSymbolsProvider; - - /** - * Map styles collection - */ + // input parameters private MapStylesCollection mapStylesCollection; - - /** - * Reference to map presentation environment (if used) - */ - private MapPresentationEnvironment mapPresentationEnvironment; - - /** - * Reference to OBFs collection (if present) - */ private IObfsCollection obfsCollection; - /** - * Reference to map renderer view that is currently managed by this - * context - */ + private boolean nightMode; + private final float density; + + // ached objects + private Map mapStyles = new HashMap(); + private CachedMapPresentation presentationObjectParams; + private MapPresentationEnvironment mapPresentationEnvironment; + + private IMapTiledSymbolsProvider obfMapSymbolsProvider; + private IRasterMapLayerProvider obfMapRasterLayerProvider; private MapRendererView mapRendererView; - - /** - * Display density factor - */ - private float displayDensityFactor = 1; + private float cachedReferenceTileSize; - /** - * Reference tile size on screen in pixels - */ - private float referenceTileSizef = 256; - - /** - * Raster tile size in texels - */ - private int rasterTileSize = 256; - - private CachedMapPresentation presentationObjectParams; - - - public MapRendererContext(OsmandApplication app) { + public MapRendererContext(OsmandApplication app, float density) { this.app = app; + this.density = density; } /** @@ -102,7 +69,157 @@ public class MapRendererContext { } this.mapRendererView = mapRendererView; if (mapRendererView != null) { - apply(); + applyCurrentContextToView(); + } + } + + public boolean isNightMode() { + return nightMode; + } + + public void setNightMode(boolean nightMode) { + this.nightMode = nightMode; + updateMapSettings(); + } + + public void updateMapSettings() { + if (mapRendererView instanceof AtlasMapRendererView && cachedReferenceTileSize != getReferenceTileSize()) { + ((AtlasMapRendererView) mapRendererView).setReferenceTileSizeOnScreenInPixels(getReferenceTileSize()); + } + if(mapPresentationEnvironment != null) { + updateMapPresentationEnvironment(); + } + } + + /** + * Setup OBF map on layer 0 with symbols + * @param obfsCollection OBFs collection + */ + public void setupObfMap(MapStylesCollection mapStylesCollection, IObfsCollection obfsCollection) { + this.obfsCollection = obfsCollection; + this.mapStylesCollection = mapStylesCollection; + updateMapPresentationEnvironment(); + recreateRasterAndSymbolsProvider(); + } + + protected float getDisplayDensityFactor() { + return (float) Math.pow(2, Math.sqrt((app.getSettings().getSettingsZoomScale() + density))); + } + + protected int getRasterTileSize() { + return Integer.highestOneBit((int) getReferenceTileSize() - 1) * 2; + } + + private float getReferenceTileSize() { + return 256 * getDisplayDensityFactor(); + } + + /** + * Update map presentation environment and everything that depends on it + */ + private void updateMapPresentationEnvironment() { + float displayDensityFactor = getDisplayDensityFactor(); + // Create new map presentation environment + String langId = app.getSettings().MAP_PREFERRED_LOCALE.get(); + // TODO make setting + LanguagePreference langPref = LanguagePreference.LocalizedOrNative; + String rendName = app.getSettings().RENDERER.get(); + if (rendName.length() == 0 || rendName.equals(RendererRegistry.DEFAULT_RENDER)) { + rendName = "default"; + } + if (!mapStyles.containsKey(rendName)) { + mapStyles.put(rendName, mapStylesCollection.getResolvedStyleByName(rendName)); + } + ResolvedMapStyle mapStyle = mapStyles.get(rendName); + CachedMapPresentation pres = new CachedMapPresentation(langId, langPref, mapStyle, displayDensityFactor); + if (this.presentationObjectParams == null || !this.presentationObjectParams.equalsFields(pres)) { + this.presentationObjectParams = pres; + mapPresentationEnvironment = new MapPresentationEnvironment(mapStyle, displayDensityFactor, langId, + langPref); + } + + QStringStringHash convertedStyleSettings = getMapStyleSettings(); + mapPresentationEnvironment.setSettings(convertedStyleSettings); + + if (obfMapRasterLayerProvider != null || obfMapSymbolsProvider != null) { + recreateRasterAndSymbolsProvider(); + } + } + + protected QStringStringHash getMapStyleSettings() { + // Apply map style settings + OsmandSettings prefs = app.getSettings(); + RenderingRulesStorage storage = app.getRendererRegistry().getCurrentSelectedRenderer(); + Map props = new HashMap(); + for (RenderingRuleProperty customProp : storage.PROPS.getCustomRules()) { + if (customProp.isBoolean()) { + CommonPreference pref = prefs.getCustomRenderBooleanProperty(customProp.getAttrName()); + props.put(customProp.getAttrName(), pref.get() + ""); + } else { + CommonPreference settings = prefs.getCustomRenderProperty(customProp.getAttrName()); + String res = settings.get(); + if (!Algorithms.isEmpty(res)) { + props.put(customProp.getAttrName(), res); + } + } + } + + QStringStringHash convertedStyleSettings = new QStringStringHash(); + for (Iterator> itSetting = props.entrySet().iterator(); itSetting.hasNext();) { + Map.Entry setting = itSetting.next(); + convertedStyleSettings.set(setting.getKey(), setting.getValue()); + } + if (nightMode) { + convertedStyleSettings.set("nightMode", "true"); + } + return convertedStyleSettings; + } + + private void recreateRasterAndSymbolsProvider() { + // Create new map primitiviser + MapPrimitiviser mapPrimitiviser = new MapPrimitiviser(mapPresentationEnvironment); + ObfMapObjectsProvider obfMapObjectsProvider = new ObfMapObjectsProvider(obfsCollection); + // Create new map primitives provider + MapPrimitivesProvider mapPrimitivesProvider = new MapPrimitivesProvider(obfMapObjectsProvider, mapPrimitiviser, + getRasterTileSize()); + updateObfMapRasterLayerProvider(mapPrimitivesProvider); + updateObfMapSymbolsProvider(mapPrimitivesProvider); + } + + private void updateObfMapRasterLayerProvider(MapPrimitivesProvider mapPrimitivesProvider) { + // Create new OBF map raster layer provider + obfMapRasterLayerProvider = new MapRasterLayerProvider_Software(mapPrimitivesProvider); + // In case there's bound view and configured layer, perform setup + if (mapRendererView != null) { + mapRendererView.setMapLayerProvider(OBF_RASTER_LAYER, obfMapRasterLayerProvider); + } + } + + private void updateObfMapSymbolsProvider(MapPrimitivesProvider mapPrimitivesProvider) { + // If there's current provider and bound view, remove it + if (obfMapSymbolsProvider != null && mapRendererView != null) { + mapRendererView.removeSymbolsProvider(obfMapSymbolsProvider); + } + // Create new OBF map symbols provider + obfMapSymbolsProvider = new MapObjectsSymbolsProvider(mapPrimitivesProvider, getReferenceTileSize()); + // If there's bound view, add new provider + if (mapRendererView != null) { + mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); + } + } + + private void applyCurrentContextToView() { + if (mapRendererView instanceof AtlasMapRendererView) { + cachedReferenceTileSize = getReferenceTileSize(); + ((AtlasMapRendererView)mapRendererView).setReferenceTileSizeOnScreenInPixels(cachedReferenceTileSize); + } + // Layers + if (obfMapRasterLayerProvider != null) { + mapRendererView.setMapLayerProvider(OBF_RASTER_LAYER, obfMapRasterLayerProvider); + } + // Symbols + if (obfMapSymbolsProvider != null) { + mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); } } @@ -143,232 +260,5 @@ public class MapRendererContext { } } - - /** - * Set display density factor and update context (if needed) - * @param displayDensityFactor New display density factor - */ - public void setDisplayDensityFactor(float displayDensityFactor) { - this.displayDensityFactor = displayDensityFactor; - referenceTileSizef = 256.0f * displayDensityFactor; - rasterTileSize = Integer.highestOneBit((int) referenceTileSizef - 1) * 2; - - if (mapRendererView instanceof AtlasMapRendererView) - ((AtlasMapRendererView) mapRendererView) - .setReferenceTileSizeOnScreenInPixels(referenceTileSizef); - if (mapPresentationEnvironment != null) - updateMapPresentationEnvironment(); - } - - - - /** - * Update map presentation environment and everything that depends on it - */ - private void updateMapPresentationEnvironment() { - // Create new map presentation environment - String langId = app.getSettings().MAP_PREFERRED_LOCALE.get(); - // TODO make setting - LanguagePreference langPref = LanguagePreference.LocalizedOrNative; - String rendName = app.getSettings().RENDERER.get(); - if(rendName.length() == 0 || rendName.equals(RendererRegistry.DEFAULT_RENDER)) { - rendName = "default"; - } - if(!mapStyles.containsKey(rendName)) { - mapStyles.put(rendName, mapStylesCollection.getResolvedStyleByName(rendName)); - } - ResolvedMapStyle mapStyle = mapStyles.get(rendName); - CachedMapPresentation pres = new CachedMapPresentation(langId, langPref, mapStyle, displayDensityFactor); - if (this.presentationObjectParams == null - || !this.presentationObjectParams.equalsFields(pres)) { - this.presentationObjectParams = pres; - mapPresentationEnvironment = new MapPresentationEnvironment( - mapStyle, displayDensityFactor, langId, langPref); - } - - // Apply map style settings - OsmandSettings prefs = app.getSettings(); - RenderingRulesStorage storage = app.getRendererRegistry() - .getCurrentSelectedRenderer(); - Map props = new HashMap(); - for (RenderingRuleProperty customProp : storage.PROPS.getCustomRules()) { - if (customProp.isBoolean()) { - CommonPreference pref = prefs - .getCustomRenderBooleanProperty(customProp - .getAttrName()); - props.put(customProp.getAttrName(), pref.get() + ""); - } else { - CommonPreference settings = prefs - .getCustomRenderProperty(customProp.getAttrName()); - String res = settings.get(); - if (!Algorithms.isEmpty(res)) { - props.put(customProp.getAttrName(), res); - } - } - } - - QStringStringHash convertedStyleSettings = new QStringStringHash(); - for (Iterator> itSetting = props.entrySet() - .iterator(); itSetting.hasNext();) { - Map.Entry setting = itSetting.next(); - convertedStyleSettings.set(setting.getKey(), setting.getValue()); - } - if(nightMode) { - convertedStyleSettings.set("nightMode", "true"); - } - mapPresentationEnvironment.setSettings(convertedStyleSettings); - - // Update all dependencies - if (mapPrimitiviser != null) { - updateMapPrimitiviser(); - } - } - - /** - * Reference to map primitiviser (if used) - */ - private MapPrimitiviser mapPrimitiviser; - - /** - * Update map primitiviser and everything that depends on it - */ - private void updateMapPrimitiviser() { - // Create new map primitiviser - mapPrimitiviser = new MapPrimitiviser(mapPresentationEnvironment); - - // Update all dependencies - if (mapPrimitivesProvider != null) - updateMapPrimitivesProvider(); - } - - /** - * Reference to OBF map objects provider (if used) - */ - private ObfMapObjectsProvider _obfMapObjectsProvider; - - /** - * Update OBF map objects provider and everything that depends on it - */ - private void updateObfMapObjectsProvider() { - _obfMapObjectsProvider = new ObfMapObjectsProvider( - obfsCollection); - - // Update all dependencies - if (mapPrimitivesProvider != null) - updateMapPrimitivesProvider(); - } - - /** - * Reference to map primitives provider (if used) - */ - private MapPrimitivesProvider mapPrimitivesProvider; - - /** - * Update map primitives provider and everything that depends on it - */ - private void updateMapPrimitivesProvider() { - // Create new map primitives provider - mapPrimitivesProvider = new MapPrimitivesProvider( - _obfMapObjectsProvider, - mapPrimitiviser, - rasterTileSize); - - // Update all dependencies - if (obfMapRasterLayerProvider != null) - updateObfMapRasterLayerProvider(); - if (obfMapSymbolsProvider != null) - updateObfMapSymbolsProvider(); - } - - /** - * Reference to OBF map raster layer provider (if used) - */ - private IRasterMapLayerProvider obfMapRasterLayerProvider; - - /** - * Index of OBF map raster layer in bound map renderer view (if set) - */ - private Integer obfMapRasterLayer; - private boolean nightMode; - - /** - * Update OBF map raster layer provider and everything that depends on it - */ - private void updateObfMapRasterLayerProvider() { - // Create new OBF map raster layer provider - obfMapRasterLayerProvider = new MapRasterLayerProvider_Software( - mapPrimitivesProvider); - - // In case there's bound view and configured layer, perform setup - if(mapRendererView != null && obfMapRasterLayer != null) - mapRendererView.setMapLayerProvider(obfMapRasterLayer, obfMapRasterLayerProvider); - } - - - - /** - * Update OBF map symbols provider and everything that depends on it - */ - private void updateObfMapSymbolsProvider() { - // If there's current provider and bound view, remove it - if (obfMapSymbolsProvider != null && mapRendererView != null) - mapRendererView.removeSymbolsProvider(obfMapSymbolsProvider); - - // Create new OBF map symbols provider - obfMapSymbolsProvider = new MapObjectsSymbolsProvider( - mapPrimitivesProvider, - referenceTileSizef); - - // If there's bound view, add new provider - if (mapRendererView != null) - mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); - } - - /** - * Apply current context to view - */ - private void apply() { - if (mapRendererView instanceof AtlasMapRendererView) - ((AtlasMapRendererView)mapRendererView).setReferenceTileSizeOnScreenInPixels(referenceTileSizef); - - // Layers - if (obfMapRasterLayer != null && obfMapRasterLayerProvider != null) - mapRendererView.setMapLayerProvider(obfMapRasterLayer, obfMapRasterLayerProvider); - - // Symbols - if (obfMapSymbolsProvider != null) - mapRendererView.addSymbolsProvider(obfMapSymbolsProvider); - } - - /** - * Setup OBF map on layer 0 with symbols - * @param obfsCollection OBFs collection - */ - public void setupObfMap(MapStylesCollection mapStylesCollection, IObfsCollection obfsCollection) { - this.obfsCollection = obfsCollection; - this.mapStylesCollection = mapStylesCollection; - this.obfMapRasterLayer = OBF_RASTER_LAYER; - updateMapPresentationEnvironment(); - updateMapPrimitiviser(); - updateMapPrimitivesProvider(); - updateObfMapObjectsProvider(); - updateObfMapRasterLayerProvider(); - updateObfMapSymbolsProvider(); - } - - public void updateMapSettings() { - if (mapPresentationEnvironment != null) { - updateMapPresentationEnvironment(); - } - } - - public boolean isNightMode() { - return nightMode; - } - - public void setNightMode(boolean nightMode) { - this.nightMode = nightMode; - updateMapSettings(); - } } diff --git a/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java b/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java index 37c7982f0d..d6d3d61188 100644 --- a/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/DashboardActivity.java @@ -11,6 +11,7 @@ import java.util.Random; import net.osmand.access.AccessibleAlertBuilder; import net.osmand.plus.OsmAndAppCustomization; +import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -74,6 +75,7 @@ public class DashboardActivity extends BaseDownloadActivity { private static final int SETTINGS_ID = 1; private static final int EXIT_ID = 2; private ProgressDialog startProgressDialog; + private OsmAndLocationProvider lp; @Override protected void onCreate(Bundle savedInstanceState) { @@ -93,6 +95,7 @@ public class DashboardActivity extends BaseDownloadActivity { return; } setContentView(R.layout.dashboard); + lp = getMyApplication().getLocationProvider(); final String textVersion = Version.getFullVersion(getMyApplication()); getSupportActionBar().setTitle(textVersion); @@ -103,6 +106,7 @@ public class DashboardActivity extends BaseDownloadActivity { setupContributionVersion(); addFragments(); initApp(this, getMyApplication()); + } @Override diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java index fec550a9cd..877d705065 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityLayers.java @@ -58,8 +58,6 @@ import android.widget.Toast; * Object is responsible to maintain layers using by map activity */ public class MapActivityLayers { - - private final MapActivity activity; diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java b/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java index 945619c13c..e137d983bc 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashBaseFragment.java @@ -11,4 +11,5 @@ public class DashBaseFragment extends SherlockFragment { public OsmandApplication getMyApplication(){ return (OsmandApplication) getActivity().getApplication(); } + } diff --git a/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java b/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java deleted file mode 100755 index 20cbb7662d..0000000000 --- a/OsmAnd/src/net/osmand/plus/render/NativeCppLibrary.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.osmand.plus.render; - -import net.osmand.NativeLibrary; - -/** - * Created by Denis on 02.10.2014. - */ -public class NativeCppLibrary extends NativeLibrary { - - public NativeCppLibrary(boolean newLibrary) { - super(newLibrary); - } - - public static void loadLibrary(String name) { - try { - System.out.println("Loading " + name); - System.loadLibrary(name); - } catch( UnsatisfiedLinkError e ) { - System.err.println("Failed to load '"+name + "':" + e); - throw e; - } - } -} diff --git a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java index c660c749a2..937f4208f9 100644 --- a/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java +++ b/OsmAnd/src/net/osmand/plus/views/corenative/NativeCoreContext.java @@ -55,16 +55,14 @@ public class NativeCoreContext { WindowManager mgr = (WindowManager)app.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); mgr.getDefaultDisplay().getMetrics(dm); - float displayDensityFactor = (float) Math.pow(2, (app.getSettings().getSettingsZoomScale() + Math.sqrt(Math.max(0, dm.density - 1)))); + float density = Math.max(0, dm.density - 1); ObfsCollection obfsCollection = new ObfsCollection(); obfsCollection.addDirectory(directory.getAbsolutePath(), false); MapStylesCollection mapStylesCollection = setupMapStyleCollection(app); - mapRendererContext = new MapRendererContext(app); - mapRendererContext.setDisplayDensityFactor(displayDensityFactor); + mapRendererContext = new MapRendererContext(app, density); mapRendererContext.setupObfMap(mapStylesCollection, obfsCollection); - init = true; } } From 9a4409536d5ad5b808a498d351b1684d67121aca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20B=C3=A1thory?= Date: Tue, 2 Dec 2014 01:15:13 +0100 Subject: [PATCH 12/24] Translated using Weblate (Hungarian) Currently translated at 37.3% (219 of 586 strings) --- OsmAnd/res/values-hu/phrases.xml | 237 ++++++++++++++++++++++++++++++- 1 file changed, 235 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index a6b3daec93..2935ffbfca 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -1,2 +1,235 @@ - - \ No newline at end of file + +Régészeti lelőhely + + Pékség + Kisbolt + Bevásárlóközpont + Italbolt + Hentes + Delikatesz bolt + Farm bolt + Zöldséges + Halárus + Cukrászda + Fagyizó + Szupermarket + Teabolt + Tejtermék bolt + Árusító automata + + Könyvesbolt + Kerékpárbolt + Anime bolt + Antikvárius + Drogéria + Fénymásoló + Virágárus + Kertészet + Ajándékbolt + Háztartási bolt + Ékszerbolt + Motorkerékpár kereskedés + Sportbolt + Jegyárus + Dohánybolt + Játékbolt + 100 forintos bolt + Áruház + Autókereskedés + Autóalkatrész + Piac + Rendőrség + Tűzoltóság + Segélykérő telefon + Tűzcsap + Mentőállomás + Gázló + Hágó + Kapu + Városfal + Sorompó + Fizetőkapu + Határellenőrzés + Villanyrendőr + + Autószerviz + Autógumis + Autómosó + Benzinkút + Elektromos töltőállomás + Sűrített levegő + Parkoló + Motor parkoló + Parkolóház bejárat + Garázsok + + Tömegközlekedési megálló + Buszmegálló + Trolimegálló + Villamosmegálló + Metró lejárat + Metrómegálló + Taxidroszt + + Repülőtér + Kifutópálya + Utasterminál + Reptér kapu + + Sólya + Kompkikötő + Világítótorony + + Kerékpárkölcsönző + Kerékpárparkoló + + Alagút + Híd + + Traffipax + Autópálya csomópont + + Víztorony + Posta + Postaláda + Telefon + Távközlési torony + Hulladékgyűjtő + Szeméttelep + Móló + Szélmalom + Kőfejtő + Szőlős + Gyümölcsös + Sólepárló + Iskola + Óvoda + Egyetem + + Bíróság + Börtön + Nagykövetség + Nagyváros + Város + Falu + Falucska + Lakatlan hely + + Gyógyszertár + Kórház + Orvos + Klinika + Fogorvos + Állatorvos + Szanatórium + Városháza + Stadion + Sportközpont + Golfpálya + Műjégpálya + Pálya + Versenypálya + Múzeum + Turistalátványosság + Emlékmű + Műalkotás + Kastély + Városkapu + Erőd + Szökőkút + Romok + Műemlék + Állatkert + Vidámpark + + Hotel + Vendégház + Motel + Menedékház + Istentiszteleti hely + Istentiszteleti hely: keresztény + Istentiszteleti hely: zsidó + Istentiszteleti hely: muszlim + Istentiszteleti hely: szikh + Istentiszteleti hely: buddhista + Istentiszteleti hely: hindu + Istentiszteleti hely: sintoista + Istentiszteleti hely: taoista + Kolostor + Útmenti kereszt + Turistainformáció + Óra + Kilátóhely + Kemping + Lakóautó hely + Piknikezőhely + Forrás + Hőforrás + Gejzír + Temető + Sírkert + Menedék + Sikló + Könyvtár + Mozi + Kaszinó + Közösségi ház + Színház + Cirkusz + Strand + Vadászles + Kishajókikötő + Minigolf + Játszótér + Úszómedence + Park + + Kávézó + Sörkert + Étterem + Gyorsétterem + Bár + Kocsma + Ivóvíz + Méhész + Patkolókovács + Sörfőzde + Könyvkötő + Asztalos + Órás + Ruhakészítő + Villanyszerelő + Kertész + Ékszerész + Zárjavító + Kulcsmásoló + Fotográfus + Fotólabor + Vízvezeték szerelő + Tetőfedő + Cipész + Fodrász + Autókölcsönző + Bank + Bankautomata + Pénzváltó + Könyvelő + Barlangbejárat + Hegycsúcs + Nyereg + Vulkán + Kráter + Gerinc + Gleccser + Víznyelő + Vízesés + Folyó + Patak + Strand + Öböl + Fjord + Zátony + Láp + Természetvédelmi terület + Sziget + From 1c9cbfcd5bc58bfd75051ed1ee3800c59ea66a50 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Tue, 2 Dec 2014 08:09:31 +0100 Subject: [PATCH 13/24] Update to use opengl render by default --- OsmAnd/res/values/strings.xml | 4 ++-- .../osmand/core/android/MapRendererContext.java | 10 ++++------ .../src/net/osmand/plus/OsmandApplication.java | 10 +++++----- OsmAnd/src/net/osmand/plus/OsmandSettings.java | 5 +++-- .../net/osmand/plus/activities/MapActivity.java | 2 +- .../activities/SettingsGeneralActivity.java | 4 +++- .../SettingsDevelopmentActivity.java | 2 -- .../net/osmand/plus/render/MapVectorLayer.java | 17 +---------------- .../osmand/plus/views/OsmandMapTileView.java | 8 ++++++++ 9 files changed, 27 insertions(+), 35 deletions(-) diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 2c8a381588..28486f279c 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -9,6 +9,8 @@ 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy --> + Use opengl rendering + Use hardware accelerated opengl rendering (may not work on some device) Nearest road was not found Home Use secure connection with server @@ -72,8 +74,6 @@ Print route Favorite point name duplicate We changed your favorite point name to %1$s to avoid duplicated names. - Use native rendering - Use C++ rendering instead of Java Set the text size on the map. Text size Speed limit diff --git a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java index 434e5c07f3..287dd66e28 100644 --- a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java +++ b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java @@ -73,13 +73,11 @@ public class MapRendererContext { } } - public boolean isNightMode() { - return nightMode; - } - public void setNightMode(boolean nightMode) { - this.nightMode = nightMode; - updateMapSettings(); + if (nightMode != this.nightMode) { + this.nightMode = nightMode; + updateMapSettings(); + } } public void updateMapSettings() { diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 57e9d9c572..ee149efca1 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -557,16 +557,16 @@ public class OsmandApplication extends Application { } if (!"qnx".equals(System.getProperty("os.name"))) { - if (osmandSettings.USE_NATIVE_RENDER.get()) { - if (!osmandSettings.CPP_RENDER_FAILED.get()) { - osmandSettings.CPP_RENDER_FAILED.set(true); + if (osmandSettings.USE_OPENGL_RENDER.get()) { + if (!osmandSettings.OPENGL_RENDER_FAILED.get()) { + osmandSettings.OPENGL_RENDER_FAILED.set(true); boolean success = NativeCoreContext.tryCatchInit(this); if (success) { - osmandSettings.CPP_RENDER_FAILED.set(false); + osmandSettings.OPENGL_RENDER_FAILED.set(false); } } else { // try next time once again ? - osmandSettings.CPP_RENDER_FAILED.set(false); + osmandSettings.OPENGL_RENDER_FAILED.set(false); warnings.add("Native OpenGL library is not supported. Please try again after exit"); } } diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index 67fb16b20b..87848dcecf 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -1719,9 +1719,10 @@ public class OsmandSettings { public final OsmandPreference NATIVE_RENDERING_FAILED = new BooleanPreference("native_rendering_failed_init", false).makeGlobal(); - public final OsmandPreference USE_NATIVE_RENDER = new BooleanPreference("use_native_render", false).makeGlobal().cache(); + public final OsmandPreference USE_OPENGL_RENDER = new BooleanPreference("use_opengl_render", + Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH).makeGlobal().cache(); - public final OsmandPreference CPP_RENDER_FAILED = new BooleanPreference("cpp_render_failed", false).makeGlobal().cache(); + public final OsmandPreference OPENGL_RENDER_FAILED = new BooleanPreference("opengl_render_failed", false).makeGlobal().cache(); // this value string is synchronized with settings_pref.xml preference name diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index f5287d7d9c..d08d08685c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -148,7 +148,7 @@ public class MapActivity extends AccessibleActivity { app.checkApplicationIsBeingInitialized(this, startProgressDialog); parseLaunchIntentLocation(); - if(settings.USE_NATIVE_RENDER.get() && NativeCoreContext.isInit()) { + if(settings.USE_OPENGL_RENDER.get() && NativeCoreContext.isInit()) { ViewStub stub = (ViewStub) findViewById(R.id.atlasMapRendererViewStub); atlasMapRendererView = (AtlasMapRendererView) stub.inflate(); OsmAndMapLayersView ml = (OsmAndMapLayersView) findViewById(R.id.MapLayersView); diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index 8b1e712e3d..8a204be7de 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -24,7 +24,6 @@ import net.osmand.plus.Version; import net.osmand.plus.base.SuggestExternalDirectoryDialog; import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.download.DownloadActivityType; -import net.osmand.plus.download.DownloadIndexFragment; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.voice.CommandPlayer; @@ -331,6 +330,9 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { } misc.addPreference(nativeCheckbox); + final CheckBoxPreference openGlRender = createCheckBoxPreference(settings.USE_OPENGL_RENDER, R.string.use_opengl_render,R.string.use_opengl_render_descr); + misc.addPreference(openGlRender); + int nav = getResources().getConfiguration().navigation; if (nav == Configuration.NAVIGATION_DPAD || nav == Configuration.NAVIGATION_TRACKBALL || nav == Configuration.NAVIGATION_WHEEL || diff --git a/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java b/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java index 038ee7feaf..1d69db36bb 100644 --- a/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java +++ b/OsmAnd/src/net/osmand/plus/development/SettingsDevelopmentActivity.java @@ -41,8 +41,6 @@ public class SettingsDevelopmentActivity extends SettingsBaseActivity { cat.addPreference(createCheckBoxPreference(settings.USE_MAGNETIC_FIELD_SENSOR_COMPASS, R.string.use_magnetic_sensor, R.string.use_magnetic_sensor_descr)); - cat.addPreference(createCheckBoxPreference(settings.USE_NATIVE_RENDER, R.string.use_native_render,R.string.use_native_render_descr)); - Preference pref = new Preference(this); pref.setTitle(R.string.test_voice_prompts); pref.setSummary(R.string.play_commands_of_currently_selected_voice); diff --git a/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java b/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java index b8a3d5e090..a31e4371a2 100644 --- a/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java +++ b/OsmAnd/src/net/osmand/plus/render/MapVectorLayer.java @@ -82,19 +82,6 @@ public class MapVectorLayer extends BaseMapLayer { } - @Override - public boolean onTouchEvent(MotionEvent event, RotatedTileBox tileBox) { - final MapRendererView mapRenderer = view.getMapRenderer(); - if (mapRenderer != null) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - mapRenderer.suspendSymbolsUpdate(); - } else if (event.getAction() == MotionEvent.ACTION_UP) { - mapRenderer.resumeSymbolsUpdate(); - } - } - - return false; - } @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tilesRect, @@ -108,9 +95,7 @@ public class MapVectorLayer extends BaseMapLayer { } else { final MapRendererView mapRenderer = view.getMapRenderer(); if (mapRenderer != null) { - if(NativeCoreContext.getMapRendererContext().isNightMode() != drawSettings.isNightMode()) { - NativeCoreContext.getMapRendererContext().setNightMode(drawSettings.isNightMode()); - } + NativeCoreContext.getMapRendererContext().setNightMode(drawSettings.isNightMode()); // opengl renderer mapRenderer.setTarget(new PointI(tilesRect.getCenter31X(), tilesRect.getCenter31Y())); mapRenderer.setAzimuth(-tilesRect.getRotate()); diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 00967d98dc..65f157a763 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -719,6 +719,14 @@ public class OsmandMapTileView implements IMapDownloaderCallback { } public boolean onTouchEvent(MotionEvent event) { + if (mapRenderer != null) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mapRenderer.suspendSymbolsUpdate(); + } else if (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL) { + mapRenderer.resumeSymbolsUpdate(); + } + } if (twoFingerTapDetector.onTouchEvent(event)) { return true; } From 2ad15c57e1b9c06d46190227793fc6c9ca636a3e Mon Sep 17 00:00:00 2001 From: josep constanti Date: Tue, 2 Dec 2014 08:26:42 +0100 Subject: [PATCH 14/24] Translated using Weblate (Catalan) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-ca/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml index b85ec8d747..05b3d85f7f 100644 --- a/OsmAnd/res/values-ca/strings.xml +++ b/OsmAnd/res/values-ca/strings.xml @@ -1902,4 +1902,6 @@ La llista de països inclosos (bàsicament tot el món!): Afganistan, Albània, Coordenades Mapes No s\'ha trobat cap ruta a prop + Ús de renderització OpenGL + Ús de renderitació OpenGL per accelerador gràfic (no funciona a tots els dispositius) From 298f7858d7b800654a66660e721fde91cf314bc2 Mon Sep 17 00:00:00 2001 From: jan madsen Date: Tue, 2 Dec 2014 08:45:13 +0100 Subject: [PATCH 15/24] Translated using Weblate (Danish) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-da/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index bf175ea0f1..b6411a7219 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -1851,4 +1851,6 @@ Koordinater Kort Nærmeste vej blev ikke fundet + Brug OpenGL optegning + Brug hardware accelereret OpenGL optegning (virker muligvis ikke på alle enheder) From ef9e5786928e76ffe39b54c7440584ffefa435ed Mon Sep 17 00:00:00 2001 From: Jurijus Date: Tue, 2 Dec 2014 09:12:36 +0100 Subject: [PATCH 16/24] Translated using Weblate (Lithuanian) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-lt/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-lt/strings.xml b/OsmAnd/res/values-lt/strings.xml index c41494bf06..559733bad1 100644 --- a/OsmAnd/res/values-lt/strings.xml +++ b/OsmAnd/res/values-lt/strings.xml @@ -1851,4 +1851,6 @@ RODYTI VISKĄ Koordinatės Nerastas trumpiausias kelias + Naudoti OpenGL vaizdavimą + Naudoti aparatinį OpenGL vaizdavimą (gali neveikti kai kurioje įrangoje) From b8d89c8c9fc4c03703b71ad97a7053ff4ee679b5 Mon Sep 17 00:00:00 2001 From: Viktar Palstsiuk Date: Tue, 2 Dec 2014 09:32:45 +0100 Subject: [PATCH 17/24] Translated using Weblate (Belarusian) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-be/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index 58c258c4f5..471ef2f5ea 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -1960,4 +1960,6 @@ OsmAnd мае адкрыты зыходны код і актыўна разві ПАКАЗАЦЬ УСЁ Каардынаты Бліжэйшая дарога не была знойдзена + Выкарыстоўваць OpenGL + Выкарыстоўваць апаратнае паскарэньне OpenGL (можа не працаваць на некаторых прыстасаваньнях) From ff2c78fcdef144f79b9aad0180abab4de1b15720 Mon Sep 17 00:00:00 2001 From: Ivan Gonzalez Martin Date: Tue, 2 Dec 2014 10:21:50 +0100 Subject: [PATCH 18/24] Translated using Weblate (Spanish) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-es/strings.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index f8f253523b..859f8461b7 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -1,4 +1,4 @@ - + Configura pantalla @@ -1884,4 +1884,7 @@ Afganistán, Albania, Alemania, Andorra, Angola, Anguila, Antigua y Barbuda, Ant MOSTRAR MAPA MOSTRAR TODO Coordenadas - + Usar renderizado opengl + Usar renderizado opengl acelerado por hardware (podría no funcionar en algunos dispositivos) + No se ha encontrado la carretera más cercana + From 100260b1042eaec40c1ff2ba8eefa1324962bf4e Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Tue, 2 Dec 2014 11:01:45 +0100 Subject: [PATCH 19/24] Translated using Weblate (French) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-fr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index efd62d4ddf..4ae1905026 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -1867,4 +1867,6 @@ Afghanistan, Albanie, Algérie, Allemagne, Andorre, Angola, Anguilla, Antigua-et Coordonnées Cartes Aucune route n\'a été trouvée à proximité + Utiliser le rendu OpenGL + Utiliser le rendu matériel accéléré OpenGL (cette option peut être inefficace sur certains appareils) From f476fcee83737d75514d389502d387e146a80332 Mon Sep 17 00:00:00 2001 From: Mirco Zorzo Date: Tue, 2 Dec 2014 11:37:42 +0100 Subject: [PATCH 20/24] Translated using Weblate (Italian) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-it/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 86c6b6743f..f76837b919 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -2034,4 +2034,6 @@ Si consiglia di aggiungere uno o più punti intermedi per migliorarne le prestaz Cerca MOSTRA LA MAPPA Non è stata trovata una strada nelle vicinanze + Utilizzare il rendering opengl + Utilizzare il rendering opengl accelerato via hardware (potrebbe non funzionare in alcuni dispositivi) From f62efaea921e734eecab2083cd160a8af5a016c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=20=EC=A1=B0?= Date: Tue, 2 Dec 2014 12:19:35 +0100 Subject: [PATCH 21/24] Translated using Weblate (Korean) Currently translated at 100.0% (1567 of 1567 strings) --- OsmAnd/res/values-ko/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OsmAnd/res/values-ko/strings.xml b/OsmAnd/res/values-ko/strings.xml index 8fa944d3b8..6dfb86e823 100644 --- a/OsmAnd/res/values-ko/strings.xml +++ b/OsmAnd/res/values-ko/strings.xml @@ -2090,4 +2090,6 @@ 모두 표시 좌표 가장 가까운 도로를 찾을 수 없습니다 + Opengl 렌더링 사용 + 하드웨어로 가속된 opengl 렌더링 사용 (일부 장치에는 작동 하지 않을 수 있습니다) From 5254823b75d62163d15cee111667f3de72342689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=20=EC=A1=B0?= Date: Tue, 2 Dec 2014 12:47:20 +0100 Subject: [PATCH 22/24] Translated using Weblate (Korean) Currently translated at 100% (0 of 0 strings) Created new translation. --- OsmAnd/res/values-ko/phrases.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 OsmAnd/res/values-ko/phrases.xml diff --git a/OsmAnd/res/values-ko/phrases.xml b/OsmAnd/res/values-ko/phrases.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/OsmAnd/res/values-ko/phrases.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From ea498705438b69355f2a4d8b603cb3caf9c3e269 Mon Sep 17 00:00:00 2001 From: Ivan Vantu5z Date: Tue, 2 Dec 2014 11:06:01 +0100 Subject: [PATCH 23/24] Translated using Weblate (Russian) Currently translated at 99.6% (1562 of 1567 strings) --- OsmAnd/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index c760e4b43e..a75d2db58d 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -1,4 +1,4 @@ - + Использовать безопасное соединение с сервером Использовать https @@ -440,7 +440,7 @@ Экстренные службы Развлечения Финансы - Геокэшинг + Геокэшинг (игра) Здоровье Историческое Землепользование @@ -1411,7 +1411,7 @@ Укажите массу автомобиля разрешенную на маршрутах Отображение карты - Навигационный знак + Навигационные знаки (водоемы) Отключить сложную маршрутизацию Указать скорость произношения для TTS Установки навигации From cad08ee58e4258ac7d8fd15c3da4ff5f856b9f69 Mon Sep 17 00:00:00 2001 From: Ivan Vantu5z Date: Tue, 2 Dec 2014 11:00:52 +0100 Subject: [PATCH 24/24] Translated using Weblate (Russian) Currently translated at 93.8% (550 of 586 strings) --- OsmAnd/res/values-ru/phrases.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml index b437d77a57..9653243fde 100644 --- a/OsmAnd/res/values-ru/phrases.xml +++ b/OsmAnd/res/values-ru/phrases.xml @@ -582,12 +582,12 @@ Причал - + Уведомление - + Радиостанция - + Сигнал опасности @@ -601,9 +601,9 @@ Военно-морская база Место ядерного взрыва Город - Город + Город (небольшой) Деревня - Деревня + Деревня (небольшая) Хутор Урочище @@ -619,4 +619,5 @@ Астрономическая обсерватория Горячий источник Гейзер + Спортивная дорожка