MapView base layer is now a TileLayer

- extract MapView base layer into TileLayer
- extract MapTile loading from GLRenderer
- move all tile layer related classes to layers.tile.*
- make Overlay subclass of InputLayer, which extends Layer
This commit is contained in:
Hannes Janetzek
2013-04-21 23:20:23 +02:00
parent 1c779f2f60
commit 6eb3b9221b
32 changed files with 1398 additions and 1340 deletions

View File

@@ -21,7 +21,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
import org.oscim.core.MapPosition;
import org.oscim.core.PointF;
import org.oscim.overlay.Overlay;
import org.oscim.layers.InputLayer;
import org.oscim.layers.Layer;
import org.oscim.overlay.Overlay.Snappable;
import org.oscim.renderer.overlays.RenderOverlay;
@@ -32,45 +33,45 @@ import android.view.GestureDetector.OnGestureListener;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class LayerManager extends AbstractList<Overlay> implements OnGestureListener,
public class LayerManager extends AbstractList<Layer> implements OnGestureListener,
OnDoubleTapListener {
private final GestureDetector mGestureDetector;
private final CopyOnWriteArrayList<Overlay> mOverlayList;
private final CopyOnWriteArrayList<Layer> mLayerList;
LayerManager(Context context) {
mOverlayList = new CopyOnWriteArrayList<Overlay>();
mLayerList = new CopyOnWriteArrayList<Layer>();
mGestureDetector = new GestureDetector(context, this);
mGestureDetector.setOnDoubleTapListener(this);
}
@Override
public synchronized Overlay get(final int pIndex) {
return mOverlayList.get(pIndex);
public synchronized Layer get(final int pIndex) {
return mLayerList.get(pIndex);
}
@Override
public synchronized int size() {
return mOverlayList.size();
return mLayerList.size();
}
@Override
public synchronized void add(final int pIndex, final Overlay pElement) {
mOverlayList.add(pIndex, pElement);
mDirtyOverlays = true;
public synchronized void add(final int pIndex, final Layer pElement) {
mLayerList.add(pIndex, pElement);
mDirtyLayers = true;
}
@Override
public synchronized Overlay remove(final int pIndex) {
mDirtyOverlays = true;
return mOverlayList.remove(pIndex);
public synchronized Layer remove(final int pIndex) {
mDirtyLayers = true;
return mLayerList.remove(pIndex);
}
@Override
public synchronized Overlay set(final int pIndex, final Overlay pElement) {
mDirtyOverlays = true;
return mOverlayList.set(pIndex, pElement);
public synchronized Layer set(final int pIndex, final Layer pElement) {
mDirtyLayers = true;
return mLayerList.set(pIndex, pElement);
}
public boolean handleMotionEvent(MotionEvent e) {
@@ -84,59 +85,68 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
return false;
}
private boolean mDirtyOverlays;
private boolean mDirtyLayers;
private RenderOverlay[] mDrawLayers;
public RenderOverlay[] getRenderLayers() {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
return mDrawLayers;
}
public void onDetach() {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (Layer o : mLayers)
o.onDetach();
}
Overlay[] mOverlays;
Layer[] mLayers;
InputLayer[] mInputLayer;
private synchronized void updateOverlays() {
if (!mDirtyOverlays)
private synchronized void updateLayers() {
if (!mDirtyLayers)
return;
mOverlays = new Overlay[mOverlayList.size()];
mLayers = new Layer[mLayerList.size()];
int numRenderLayers = 0;
int numInputLayers = 0;
for (int i = 0, n = mOverlayList.size(); i < n; i++) {
Overlay o = mOverlayList.get(i);
for (int i = 0, n = mLayerList.size(); i < n; i++) {
Layer o = mLayerList.get(i);
if (o.getLayer() != null)
numRenderLayers++;
mOverlays[n - i - 1] = o;
if (o instanceof InputLayer)
numInputLayers++;
mLayers[n - i - 1] = o;
}
mDrawLayers = new RenderOverlay[numRenderLayers];
mInputLayer = new InputLayer[numInputLayers];
for (int i = 0, cnt = 0, n = mOverlayList.size(); i < n; i++) {
Overlay o = mOverlayList.get(i);
for (int i = 0, cntR = 0, cntI = 0, n = mLayerList.size(); i < n; i++) {
Layer o = mLayerList.get(i);
RenderOverlay l = o.getLayer();
if (l != null)
mDrawLayers[cnt++] = l;
mDrawLayers[cntR++] = l;
if (o instanceof InputLayer)
mInputLayer[cntI++] = (InputLayer)o;
}
mDirtyOverlays = false;
mDirtyLayers = false;
}
public boolean onTouchEvent(final MotionEvent event) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onTouchEvent(event))
return true;
@@ -144,10 +154,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
}
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onKeyDown(keyCode, event))
return true;
@@ -155,10 +165,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
}
public boolean onKeyUp(final int keyCode, final KeyEvent event) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onKeyUp(keyCode, event))
return true;
@@ -166,10 +176,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
}
public boolean onTrackballEvent(final MotionEvent event) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onTrackballEvent(event))
return true;
@@ -177,10 +187,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
}
public boolean onSnapToItem(final int x, final int y, final PointF snapPoint) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o instanceof Snappable)
if (((Snappable) o).onSnapToItem(x, y, snapPoint))
return true;
@@ -192,10 +202,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public boolean onDoubleTap(final MotionEvent e) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onDoubleTap(e))
return true;
@@ -204,10 +214,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public boolean onDoubleTapEvent(final MotionEvent e) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onDoubleTapEvent(e))
return true;
@@ -216,10 +226,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public boolean onSingleTapConfirmed(final MotionEvent e) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onSingleTapConfirmed(e))
return true;
@@ -230,10 +240,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public boolean onDown(final MotionEvent pEvent) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onDown(pEvent))
return true;
@@ -243,10 +253,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public boolean onFling(final MotionEvent pEvent1, final MotionEvent pEvent2,
final float pVelocityX, final float pVelocityY) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onFling(pEvent1, pEvent2, pVelocityX, pVelocityY))
return true;
@@ -255,10 +265,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public void onLongPress(final MotionEvent pEvent) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onLongPress(pEvent))
return;
}
@@ -266,10 +276,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public boolean onScroll(final MotionEvent pEvent1, final MotionEvent pEvent2,
final float pDistanceX, final float pDistanceY) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onScroll(pEvent1, pEvent2, pDistanceX, pDistanceY))
return true;
@@ -278,20 +288,20 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
@Override
public void onShowPress(final MotionEvent pEvent) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
o.onShowPress(pEvent);
}
@Override
public boolean onSingleTapUp(final MotionEvent pEvent) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
for (InputLayer o : mInputLayer)
if (o.onSingleTapUp(pEvent))
return true;
@@ -299,52 +309,62 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
}
public void onUpdate(MapPosition mapPosition, boolean changed) {
if (mDirtyOverlays)
updateOverlays();
if (mDirtyLayers)
updateLayers();
for (Overlay o : mOverlays)
o.onUpdate(mapPosition, changed);
for (Layer l : mLayers)
l.onUpdate(mapPosition, changed);
}
public void destroy() {
if (mDirtyLayers)
updateLayers();
for (Layer l : mLayers){
l.destroy();
}
}
// /**
// * Gets the optional TilesOverlay class.
// * Gets the optional TilesLayer class.
// *
// * @return the tilesOverlay
// * @return the tilesLayer
// */
// public TilesOverlay getTilesOverlay() {
// return mTilesOverlay;
// public TilesLayer getTilesLayer() {
// return mTilesLayer;
// }
//
// /**
// * Sets the optional TilesOverlay class. If set, this overlay will be
// * Sets the optional TilesLayer class. If set, this overlay will be
// drawn before all other
// * overlays and will not be included in the editable list of overlays and
// can't be cleared
// * except by a subsequent call to setTilesOverlay().
// * except by a subsequent call to setTilesLayer().
// *
// * @param tilesOverlay
// * the tilesOverlay to set
// * @param tilesLayer
// * the tilesLayer to set
// */
// public void setTilesOverlay(final TilesOverlay tilesOverlay) {
// mTilesOverlay = tilesOverlay;
// public void setTilesLayer(final TilesLayer tilesLayer) {
// mTilesLayer = tilesLayer;
// }
// public void onDraw(final Canvas c, final MapView pMapView) {
// // if ((mTilesOverlay != null) && mTilesOverlay.isEnabled()) {
// // mTilesOverlay.draw(c, pMapView, true);
// // if ((mTilesLayer != null) && mTilesLayer.isEnabled()) {
// // mTilesLayer.draw(c, pMapView, true);
// // }
// //
// // if ((mTilesOverlay != null) && mTilesOverlay.isEnabled()) {
// // mTilesOverlay.draw(c, pMapView, false);
// // if ((mTilesLayer != null) && mTilesLayer.isEnabled()) {
// // mTilesLayer.draw(c, pMapView, false);
// // }
//
// for (final Overlay overlay : mOverlayList) {
// for (final Layer overlay : mLayerList) {
// if (overlay.isEnabled()) {
// overlay.draw(c, pMapView, true);
// }
// }
//
// for (final Overlay overlay : mOverlayList) {
// for (final Layer overlay : mLayerList) {
// if (overlay.isEnabled()) {
// overlay.draw(c, pMapView, false);
// }
@@ -355,10 +375,10 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
// ** Options Menu **//
// public void setOptionsMenusEnabled(final boolean pEnabled) {
// for (final Overlay overlay : mOverlayList) {
// if ((overlay instanceof IOverlayMenuProvider)
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()) {
// ((IOverlayMenuProvider) overlay).setOptionsMenuEnabled(pEnabled);
// for (final Layer overlay : mLayerList) {
// if ((overlay instanceof ILayerMenuProvider)
// && ((ILayerMenuProvider) overlay).isOptionsMenuEnabled()) {
// ((ILayerMenuProvider) overlay).setOptionsMenuEnabled(pEnabled);
// }
// }
// }
@@ -367,19 +387,19 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
// menuIdOffset,
// final MapView mapView) {
// boolean result = true;
// for (final Overlay overlay : this.overlaysReversed()) {
// if ((overlay instanceof IOverlayMenuProvider)
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()) {
// result &= ((IOverlayMenuProvider) overlay).onCreateOptionsMenu(pMenu,
// for (final Layer overlay : this.overlaysReversed()) {
// if ((overlay instanceof ILayerMenuProvider)
// && ((ILayerMenuProvider) overlay).isOptionsMenuEnabled()) {
// result &= ((ILayerMenuProvider) overlay).onCreateOptionsMenu(pMenu,
// menuIdOffset,
// mapView);
// }
// }
//
// if ((mTilesOverlay != null) && (mTilesOverlay instanceof
// IOverlayMenuProvider)
// && ((IOverlayMenuProvider) mTilesOverlay).isOptionsMenuEnabled()) {
// result &= mTilesOverlay.onCreateOptionsMenu(pMenu, menuIdOffset,
// if ((mTilesLayer != null) && (mTilesLayer instanceof
// ILayerMenuProvider)
// && ((ILayerMenuProvider) mTilesLayer).isOptionsMenuEnabled()) {
// result &= mTilesLayer.onCreateOptionsMenu(pMenu, menuIdOffset,
// mapView);
// }
//
@@ -389,18 +409,18 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
// public boolean onPrepareOptionsMenu(final Menu pMenu, final int
// menuIdOffset,
// final MapView mapView) {
// for (final Overlay overlay : this.overlaysReversed()) {
// if ((overlay instanceof IOverlayMenuProvider)
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()) {
// ((IOverlayMenuProvider) overlay).onPrepareOptionsMenu(pMenu,
// for (final Layer overlay : this.overlaysReversed()) {
// if ((overlay instanceof ILayerMenuProvider)
// && ((ILayerMenuProvider) overlay).isOptionsMenuEnabled()) {
// ((ILayerMenuProvider) overlay).onPrepareOptionsMenu(pMenu,
// menuIdOffset, mapView);
// }
// }
//
// if ((mTilesOverlay != null) && (mTilesOverlay instanceof
// IOverlayMenuProvider)
// && ((IOverlayMenuProvider) mTilesOverlay).isOptionsMenuEnabled()) {
// mTilesOverlay.onPrepareOptionsMenu(pMenu, menuIdOffset, mapView);
// if ((mTilesLayer != null) && (mTilesLayer instanceof
// ILayerMenuProvider)
// && ((ILayerMenuProvider) mTilesLayer).isOptionsMenuEnabled()) {
// mTilesLayer.onPrepareOptionsMenu(pMenu, menuIdOffset, mapView);
// }
//
// return true;
@@ -409,20 +429,20 @@ public class LayerManager extends AbstractList<Overlay> implements OnGestureList
// public boolean onOptionsItemSelected(final MenuItem item, final int
// menuIdOffset,
// final MapView mapView) {
// for (final Overlay overlay : this.overlaysReversed()) {
// if ((overlay instanceof IOverlayMenuProvider)
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()
// && ((IOverlayMenuProvider) overlay).onOptionsItemSelected(item,
// for (final Layer overlay : this.overlaysReversed()) {
// if ((overlay instanceof ILayerMenuProvider)
// && ((ILayerMenuProvider) overlay).isOptionsMenuEnabled()
// && ((ILayerMenuProvider) overlay).onOptionsItemSelected(item,
// menuIdOffset,
// mapView)) {
// return true;
// }
// }
//
// if ((mTilesOverlay != null)
// && (mTilesOverlay instanceof IOverlayMenuProvider)
// && ((IOverlayMenuProvider) mTilesOverlay).isOptionsMenuEnabled()
// && ((IOverlayMenuProvider) mTilesOverlay).onOptionsItemSelected(item,
// if ((mTilesLayer != null)
// && (mTilesLayer instanceof ILayerMenuProvider)
// && ((ILayerMenuProvider) mTilesLayer).isOptionsMenuEnabled()
// && ((ILayerMenuProvider) mTilesLayer).onOptionsItemSelected(item,
// menuIdOffset,
// mapView)) {
// return true;

View File

@@ -14,11 +14,8 @@
*/
package org.oscim.view;
import java.io.FileNotFoundException;
import org.oscim.core.GeoPoint;
import org.oscim.core.MapPosition;
import org.oscim.theme.InternalRenderTheme;
import android.app.Activity;
import android.content.SharedPreferences;
@@ -78,7 +75,7 @@ public abstract class MapActivity extends Activity {
editor.putInt(KEY_LONGITUDE, geoPoint.longitudeE6);
editor.putFloat(KEY_MAP_SCALE, (float)mapPosition.scale);
editor.putString(KEY_THEME, mMapView.getRenderTheme());
//editor.putString(KEY_THEME, mMapView.getRenderTheme());
editor.commit();
}
@@ -121,21 +118,21 @@ public abstract class MapActivity extends Activity {
mMapView.getMapViewPosition().setMapPosition(mapPosition);
}
String theme = sharedPreferences.getString(KEY_THEME,
InternalRenderTheme.DEFAULT.name());
//String theme = sharedPreferences.getString(KEY_THEME,
// InternalRenderTheme.DEFAULT.name());
if (theme.startsWith("/")) {
try {
mapView.setRenderTheme(theme);
} catch (FileNotFoundException e) {
mapView.setRenderTheme(InternalRenderTheme.DEFAULT);
}
} else {
try {
mapView.setRenderTheme(InternalRenderTheme.valueOf(theme));
} catch (IllegalArgumentException e) {
mapView.setRenderTheme(InternalRenderTheme.DEFAULT);
}
}
// if (theme.startsWith("/")) {
// try {
// mapView.setRenderTheme(theme);
// } catch (FileNotFoundException e) {
// mapView.setRenderTheme(InternalRenderTheme.DEFAULT);
// }
// } else {
// try {
// mapView.setRenderTheme(InternalRenderTheme.valueOf(theme));
// } catch (IllegalArgumentException e) {
// mapView.setRenderTheme(InternalRenderTheme.DEFAULT);
// }
// }
}
}

View File

@@ -15,41 +15,21 @@
*/
package org.oscim.view;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.oscim.core.BoundingBox;
import org.oscim.core.GeoPoint;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.database.IMapDatabase;
import org.oscim.database.MapDatabaseFactory;
import org.oscim.database.MapDatabases;
import org.oscim.database.MapInfo;
import org.oscim.database.MapOptions;
import org.oscim.database.OpenResult;
import org.oscim.generator.JobQueue;
import org.oscim.generator.JobTile;
import org.oscim.generator.MapWorker;
import org.oscim.generator.TileGenerator;
import org.oscim.layers.Layer;
import org.oscim.layers.tile.TileGenerator;
import org.oscim.layers.tile.TileLayer;
import org.oscim.overlay.BuildingOverlay;
import org.oscim.overlay.LabelingOverlay;
import org.oscim.overlay.Overlay;
import org.oscim.renderer.GLRenderer;
import org.oscim.renderer.GLView;
import org.oscim.renderer.TileManager;
import org.oscim.theme.ExternalRenderTheme;
import org.oscim.theme.InternalRenderTheme;
import org.oscim.theme.RenderTheme;
import org.oscim.theme.RenderThemeHandler;
import org.oscim.theme.Theme;
import org.oscim.utils.AndroidUtils;
import org.xml.sax.SAXException;
import android.content.Context;
import android.util.AttributeSet;
@@ -68,43 +48,28 @@ public class MapView extends RelativeLayout {
public static final boolean debugFrameTime = false;
public static final boolean testRegionZoom = false;
private static final boolean debugDatabase = false;
public boolean mRotationEnabled = false;
public boolean mCompassEnabled = false;
public boolean enablePagedFling = false;
private final GLView mGLView;
private final LayerManager mLayerManager;
private final MapViewPosition mMapViewPosition;
private final MapPosition mMapPosition;
//private final MapZoomControls mMapZoomControls;
private final Compass mCompass;
private final TileManager mTileManager;
private final LayerManager mLayerManager;
final GLView mGLView;
private final JobQueue mJobQueue;
// TODO use 1 download and 1 generator thread instead
private final MapWorker mMapWorkers[];
private final int mNumMapWorkers = 4;
private MapOptions mMapOptions;
private IMapDatabase mMapDatabase;
private String mRenderTheme;
private DebugSettings mDebugSettings;
private boolean mClearMap;
private int mWidth;
private int mHeight;
// FIXME: keep until old pbmap reader is removed
public static boolean enableClosePolygons = false;
public final float dpi;
public static float dpi;
/**
* @param context
@@ -152,21 +117,12 @@ public class MapView extends RelativeLayout {
mCompass = new Compass(mapActivity, this);
mJobQueue = new JobQueue();
mTileManager = new TileManager(this);
mGLView = new GLView(context, this);
mMapWorkers = new MapWorker[mNumMapWorkers];
mDebugSettings = new DebugSettings();
TileGenerator.setDebugSettings(mDebugSettings);
for (int i = 0; i < mNumMapWorkers; i++) {
TileGenerator tileGenerator = new TileGenerator();
mMapWorkers[i] = new MapWorker(i, mJobQueue, tileGenerator, mTileManager);
mMapWorkers[i].start();
}
// FIXME
TileGenerator.setDebugSettings(mDebugSettings);
mapActivity.registerMapView(this);
@@ -176,7 +132,19 @@ public class MapView extends RelativeLayout {
addView(mGLView, params);
mLayerManager.add(new MapEventLayer(this));
requestRedraw();
}
public TileLayer setBaseMap(MapOptions options){
TileLayer baseLayer = new TileLayer(this);
baseLayer.setMapDatabase(options);
mLayerManager.add(0,new MapEventLayer(this));
mLayerManager.add(1,baseLayer);
//mMapZoomControls = new MapZoomControls(mapActivity, this);
//mMapZoomControls.setShowMapZoomControls(true);
@@ -184,41 +152,14 @@ public class MapView extends RelativeLayout {
//mLayerManager.add(new GenericOverlay(this, new GridOverlay(this)));
mLayerManager.add(new BuildingOverlay(this));
mLayerManager.add(new LabelingOverlay(this));
mLayerManager.add(new BuildingOverlay(this, baseLayer.getTileLayer()));
mLayerManager.add(new LabelingOverlay(this, baseLayer.getTileLayer()));
//mLayerManager.add(new GenericOverlay(this, new TileOverlay(this)));
//mLayerManager.add(new GenericOverlay(this, new CustomOverlay(this)));
//mLayerManager.add(new MapLensOverlay(this));
//PathOverlay path = new PathOverlay(this, Color.RED);
//path.addGreatCircle(new GeoPoint(53.1, 8.8), new GeoPoint(53.1, -110.0));
//mLayerManager.add(path);
//path = new PathOverlay(this, Color.GREEN);
//path.addGreatCircle(new GeoPoint(53.1, 140), new GeoPoint(53.1, -110.0));
//mLayerManager.add(path);
//mLayerManager.add(new GenericOverlay(this, new AtlasTest(this)));
clearMap();
return baseLayer;
}
void destroy() {
mTileManager.destroy();
for (MapWorker mapWorker : mMapWorkers) {
mapWorker.pause();
mapWorker.interrupt();
mapWorker.getTileGenerator().getMapDatabase().close();
try {
mapWorker.join(10000);
} catch (InterruptedException e) {
// restore the interrupted status
Thread.currentThread().interrupt();
}
}
mLayerManager.destroy();
}
private boolean mPausing = false;
@@ -226,18 +167,12 @@ public class MapView extends RelativeLayout {
void onPause() {
mPausing = true;
Log.d(TAG, "onPause");
mJobQueue.clear();
mapWorkersPause(true);
if (this.mCompassEnabled)
mCompass.disable();
}
void onResume() {
Log.d(TAG, "onResume");
mapWorkersProceed();
if (this.mCompassEnabled)
mCompass.enable();
@@ -247,7 +182,7 @@ public class MapView extends RelativeLayout {
public void onStop() {
Log.d(TAG, "onStop");
//mTileManager.destroy();
//mLayerManager.destroy();
}
@Override
@@ -264,9 +199,6 @@ public class MapView extends RelativeLayout {
int oldWidth, int oldHeight) {
Log.d(TAG, "onSizeChanged: " + width + "x" + height);
mJobQueue.clear();
mapWorkersPause(true);
super.onSizeChanged(width, height, oldWidth, oldHeight);
mWidth = width;
@@ -274,9 +206,6 @@ public class MapView extends RelativeLayout {
if (width != 0 && height != 0)
mMapViewPosition.setViewport(width, height);
clearMap();
mapWorkersProceed();
}
public void render() {
@@ -315,6 +244,24 @@ public class MapView extends RelativeLayout {
return mRotationEnabled;
}
boolean mWaitRedraw;
Runnable mRedrawRequest = new Runnable() {
@Override
public void run() {
mWaitRedraw = false;
redrawMap(true);
}
};
public void requestRedraw(){
if (!mWaitRedraw){
mWaitRedraw = true;
post(mRedrawRequest);
}
}
/**
* Calculates all necessary tiles and adds jobs accordingly.
*
@@ -324,33 +271,27 @@ public class MapView extends RelativeLayout {
if (mPausing || mWidth == 0 || mHeight == 0)
return;
if (forceRedraw)
boolean changed = false;
if (forceRedraw){
render();
if (mClearMap) {
mTileManager.init(mWidth, mHeight);
mClearMap = false;
// make sure mMapPosition will be updated
mMapPosition.zoomLevel = -1;
// TODO clear overlays
changed = true;
}
// if (mClearMap) {
// mTileManager.init(mWidth, mHeight);
// mClearMap = false;
//
// // make sure mMapPosition will be updated
// mMapPosition.zoomLevel = -1;
//
// // TODO clear overlays
// }
boolean changed = mMapViewPosition.getMapPosition(mMapPosition);
changed |= mMapViewPosition.getMapPosition(mMapPosition);
// required when not changed?
if (AndroidUtils.currentThreadIsUiThread())
mLayerManager.onUpdate(mMapPosition, changed);
if (changed) {
mTileManager.update(mMapPosition);
}
}
private void clearMap() {
// clear tile and overlay data before next draw
mClearMap = true;
}
/**
@@ -360,7 +301,7 @@ public class MapView extends RelativeLayout {
public void setDebugSettings(DebugSettings debugSettings) {
mDebugSettings = debugSettings;
TileGenerator.setDebugSettings(debugSettings);
clearMap();
//clearMap();
}
/**
@@ -370,184 +311,10 @@ public class MapView extends RelativeLayout {
return mDebugSettings;
}
public Map<String, String> getMapOptions() {
return mMapOptions;
}
public MapPosition getMapFileCenter() {
if (mMapDatabase == null)
return null;
MapInfo mapInfo = mMapDatabase.getMapInfo();
if (mapInfo == null)
return null;
GeoPoint startPos = mapInfo.startPosition;
if (startPos == null)
startPos = mapInfo.mapCenter;
if (startPos == null)
startPos = new GeoPoint(0, 0);
MapPosition mapPosition = new MapPosition();
mapPosition.setPosition(startPos);
if (mapInfo.startZoomLevel == null)
mapPosition.setZoomLevel(12);
else
mapPosition.setZoomLevel((mapInfo.startZoomLevel).byteValue());
return mapPosition;
}
public void setMapPosition(MapPosition mapPosition) {
mMapViewPosition.setMapPosition(mapPosition);
}
/**
* Sets the MapDatabase for this MapView.
*
* @param options
* the new MapDatabase options.
* @return true if MapDatabase changed
*/
public boolean setMapDatabase(MapOptions options) {
if (debugDatabase)
return false;
Log.i(TAG, "setMapDatabase: " + options.db.name());
if (mMapOptions != null && mMapOptions.equals(options))
return true;
mapWorkersPause(true);
mJobQueue.clear();
mMapOptions = options;
mMapDatabase = null;
for (int i = 0; i < mNumMapWorkers; i++) {
MapWorker mapWorker = mMapWorkers[i];
IMapDatabase mapDatabase = MapDatabaseFactory
.createMapDatabase(options.db);
OpenResult result = mapDatabase.open(options);
if (result != OpenResult.SUCCESS) {
Log.d(TAG, "failed open db: " + result.getErrorMessage());
}
TileGenerator tileGenerator = mapWorker.getTileGenerator();
tileGenerator.setMapDatabase(mapDatabase);
// TODO this could be done in a cleaner way..
if (mMapDatabase == null)
mMapDatabase = mapDatabase;
}
if (options.db == MapDatabases.OSCIMAP_READER ||
options.db == MapDatabases.MAP_READER)
MapView.enableClosePolygons = true;
else
MapView.enableClosePolygons = false;
clearMap();
mapWorkersProceed();
return true;
}
public String getRenderTheme() {
return mRenderTheme;
}
/**
* Sets the internal theme which is used for rendering the map.
*
* @param internalRenderTheme
* the internal rendering theme.
* @return ...
* @throws IllegalArgumentException
* if the supplied internalRenderTheme is null.
*/
public boolean setRenderTheme(InternalRenderTheme internalRenderTheme) {
if (internalRenderTheme == null) {
throw new IllegalArgumentException("render theme must not be null");
}
if (internalRenderTheme.name() == mRenderTheme)
return true;
boolean ret = setRenderTheme((Theme) internalRenderTheme);
if (ret) {
mRenderTheme = internalRenderTheme.name();
}
clearMap();
return ret;
}
/**
* Sets the theme file which is used for rendering the map.
*
* @param renderThemePath
* the path to the XML file which defines the rendering theme.
* @throws IllegalArgumentException
* if the supplied internalRenderTheme is null.
* @throws FileNotFoundException
* if the supplied file does not exist, is a directory or cannot
* be read.
*/
public void setRenderTheme(String renderThemePath) throws FileNotFoundException {
if (renderThemePath == null) {
throw new IllegalArgumentException("render theme path must not be null");
}
boolean ret = setRenderTheme(new ExternalRenderTheme(renderThemePath));
if (ret) {
mRenderTheme = renderThemePath;
}
clearMap();
}
private boolean setRenderTheme(Theme theme) {
mapWorkersPause(true);
InputStream inputStream = null;
try {
inputStream = theme.getRenderThemeAsStream();
RenderTheme t = RenderThemeHandler.getRenderTheme(inputStream);
t.scaleTextSize(1 + (dpi / 240 - 1) * 0.5f);
// FIXME
GLRenderer.setRenderTheme(t);
TileGenerator.setRenderTheme(t);
return true;
} catch (ParserConfigurationException e) {
Log.e(TAG, e.getMessage());
} catch (SAXException e) {
Log.e(TAG, e.getMessage());
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
Log.e(TAG, e.getMessage());
}
mapWorkersProceed();
}
return false;
}
/**
* Sets the center of the MapView and triggers a redraw.
*
@@ -567,45 +334,6 @@ public class MapView extends RelativeLayout {
return mMapViewPosition;
}
/**
* add jobs and remember MapWorkers that stuff needs to be done
*
* @param jobs
* tile jobs
*/
public void addJobs(JobTile[] jobs) {
if (jobs == null) {
mJobQueue.clear();
return;
}
mJobQueue.setJobs(jobs);
for (int i = 0; i < mNumMapWorkers; i++) {
MapWorker m = mMapWorkers[i];
synchronized (m) {
m.notify();
}
}
}
private void mapWorkersPause(boolean wait) {
for (MapWorker mapWorker : mMapWorkers) {
if (!mapWorker.isPausing())
mapWorker.pause();
}
if (wait) {
for (MapWorker mapWorker : mMapWorkers) {
if (!mapWorker.isPausing())
mapWorker.awaitPausing();
}
}
}
private void mapWorkersProceed() {
for (MapWorker mapWorker : mMapWorkers)
mapWorker.proceed();
}
/**
* You can add/remove/reorder your Overlays using the List of
* {@link Overlay}. The first (index 0) Overlay gets drawn first, the one
@@ -613,7 +341,7 @@ public class MapView extends RelativeLayout {
*
* @return ...
*/
public List<Overlay> getOverlays() {
public List<Layer> getOverlays() {
return this.getOverlayManager();
}
@@ -621,10 +349,6 @@ public class MapView extends RelativeLayout {
return mLayerManager;
}
public TileManager getTileManager() {
return mTileManager;
}
/**
* @return estimated visible axis aligned bounding box
*/