package com.robert.maps.applib.overlays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.andnav.osm.util.GeoPoint;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.os.Handler;
import android.os.Message;
import com.robert.maps.applib.MainActivity;
import com.robert.maps.applib.kml.PoiManager;
import com.robert.maps.applib.kml.Track;
import com.robert.maps.applib.utils.SimpleThreadFactory;
import com.robert.maps.applib.utils.Ut;
import com.robert.maps.applib.view.TileView;
import com.robert.maps.applib.view.TileViewOverlay;
public class TrackOverlay extends TileViewOverlay {
private Paint[] mPaints;
private int mLastZoom;
private Path[] mPaths;
private Track[] mTracks;
private Point mBaseCoords;
private GeoPoint mBaseLocation;
private PoiManager mPoiManager;
private TrackThread mThread;
private boolean mThreadRunned = false;
private TileView mOsmv;
private Handler mMainMapActivityCallbackHandler;
private boolean mStopDraw = false;
private com.robert.maps.applib.view.TileView.OpenStreetMapViewProjection mProjection;
protected ExecutorService mThreadExecutor = Executors.newSingleThreadExecutor(new SimpleThreadFactory("TrackOverlay"));
private class TrackThread extends Thread {
@Override
public void run() {
Ut.d("run TrackThread");
mPaths = null;
if(mTracks == null){
mTracks = mPoiManager.getTrackChecked(false);
if(mTracks == null){
Ut.d("Track is null. Stoped??");
mThreadRunned = false;
mStopDraw = true;
return;
}
Ut.d("Track loaded");
}
try {
mPaths = new Path[mTracks.length];
mPaints = new Paint[mTracks.length];
for(int i = 0; i < mTracks.length; i++) {
if (mTracks[i] != null) {
try {
mPaths[i] = mProjection.toPixelsTrackPoints(mPoiManager.getGeoDatabase().getTrackPoints(mTracks[i].getId()), mBaseCoords, mBaseLocation);
mPaints[i] = new Paint();
mPaints[i].setAntiAlias(true);
mPaints[i].setStyle(Paint.Style.STROKE);
mPaints[i].setStrokeCap(Paint.Cap.ROUND);
mPaints[i].setColor(mTracks[i].Color);
mPaints[i].setStrokeWidth(mTracks[i].Width);
mPaints[i].setAlpha(Color.alpha(mTracks[i].ColorShadow));
mPaints[i].setShadowLayer((float) mTracks[i].ShadowRadius, 0, 0, mTracks[i].ColorShadow);
Message.obtain(mMainMapActivityCallbackHandler, Ut.MAPTILEFSLOADER_SUCCESS_ID).sendToTarget();
} catch (Exception e) {
mPaths[i] = null;
}
} else
mPaths[i] = null;
}
} catch (Exception e) {
e.printStackTrace();
}
mThreadRunned = false;
}
}
public TrackOverlay(MainActivity mainActivity, PoiManager poiManager, Handler aHandler) {
mMainMapActivityCallbackHandler = aHandler;
mTracks = null;
mPoiManager = poiManager;
mBaseCoords = new Point();
mBaseLocation = new GeoPoint(0, 0);
mLastZoom = -1;
mThread = new TrackThread();
mThread.setName("Track thread");
}
@Override
public void Free() {
if(mPoiManager != null)
mPoiManager.StopProcessing();
if(mProjection != null)
mProjection.StopProcessing();
mThreadExecutor.shutdown();
super.Free();
}
public void setStopDraw(boolean stopdraw){
mStopDraw = stopdraw;
}
@Override
protected void onDraw(Canvas c, TileView osmv) {
if(mStopDraw) return;
if (!mThreadRunned && (mTracks == null || mLastZoom != osmv.getZoomLevel())) {
mPaths = null;
mLastZoom = osmv.getZoomLevel();
mOsmv = osmv;
mProjection = mOsmv.getProjection();
mThreadRunned = true;
mThreadExecutor.execute(mThread);
return;
}
if(mPaths == null)
return;
final com.robert.maps.applib.view.TileView.OpenStreetMapViewProjection pj = osmv.getProjection();
final Point screenCoords = new Point();
pj.toPixels(mBaseLocation, screenCoords);
c.save();
if(screenCoords.x != mBaseCoords.x && screenCoords.y != mBaseCoords.y){
c.translate(screenCoords.x - mBaseCoords.x, screenCoords.y - mBaseCoords.y);
c.scale((float)osmv.mTouchScale, (float)osmv.mTouchScale, mBaseCoords.x, mBaseCoords.y);
};
for(int i = 0; i < mPaths.length; i++)
if(mPaths[i] != null && mPaints[i] != null)
c.drawPath(mPaths[i], mPaints[i]);
c.restore();
}
@Override
protected void onDrawFinished(Canvas c, TileView osmv) {
}
public void clearTrack(){
mTracks = null;
}
}