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; } }