package org.pyneo.tabulae.map; import android.util.Log; import java.io.File; import java.net.HttpURLConnection; import org.mapsforge.map.android.graphics.AndroidGraphicFactory; import org.mapsforge.map.android.util.AndroidUtil; import org.mapsforge.map.android.view.MapView; import org.mapsforge.map.layer.TileLayer; import org.mapsforge.map.layer.cache.FileSystemTileCache; import org.mapsforge.map.layer.cache.InMemoryTileCache; import org.mapsforge.map.layer.cache.TileCache; import org.mapsforge.map.layer.cache.TwoLevelTileCache; import org.mapsforge.map.layer.download.TileDownloadLayer; import org.pyneo.tabulae.Tabulae; import static org.pyneo.tabulae.map.Constants.*; /** * Base of the layers, adds features like proper hide, force zoom limits, ... */ abstract class LayerBase { protected MapView mapView; protected TileLayer tileLayer; protected TileCache tileCache; protected InMemoryTileCache memCache; static { HttpURLConnection.setFollowRedirects(false); // TODO: use con.setInstanceFollowRedirects(false); } LayerBase(Tabulae activity, MapView mapView, boolean persistant) { this.mapView = mapView; if (persistant) { int size = AndroidUtil.getMinimumCacheSize(activity, mapView.getModel().displayModel.getTileSize(), mapView.getModel().frameBufferModel.getOverdrawFactor(), 1f); //if (DEBUG) Log.d(TAG, "LayerBase.LayerBase minmal cache size=" + size); memCache = new InMemoryTileCache(size); tileCache = new TwoLevelTileCache( memCache, new FileSystemTileCache(99999, new File(activity.getTilesDir(), getId()), AndroidGraphicFactory.INSTANCE, true) ); } else { tileCache = AndroidUtil.createTileCache(activity, getId(), mapView.getModel().displayModel.getTileSize(), 1f, mapView.getModel().frameBufferModel.getOverdrawFactor()); } } byte getZoomLevelMin() { return MIN_ZOOM; } byte getZoomLevelMax() { return MAX_ZOOM; } abstract String getId(); void setVisible(boolean visible) { tileLayer.setVisible(visible); if (visible) { mapView.getModel().mapViewPosition.setZoomLevelMin(getZoomLevelMin()); mapView.getModel().mapViewPosition.setZoomLevelMax(getZoomLevelMax()); } else { if (memCache != null) memCache.purge(); } } void onDestroy() { mapView.getLayerManager().getLayers().remove(tileLayer); tileLayer.onDestroy(); tileCache.destroy(); } public void onPause() { if (tileLayer instanceof TileDownloadLayer) ((TileDownloadLayer) tileLayer).onPause(); } public void onResume() { if (tileLayer instanceof TileDownloadLayer) ((TileDownloadLayer) tileLayer).onResume(); } }