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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user