package com.robert.maps.applib.tileprovider;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.andnav.osm.views.util.StreamUtils;
import android.os.Handler;
import android.os.Message;
import com.robert.maps.applib.utils.SimpleThreadFactory;
public class TileURLGeneratorYANDEXTRAFFIC extends TileURLGeneratorBase {
private static final String YANDEX_STAT_URL = "http://jgo.maps.yandex.net/trf/stat.js";
private Long mLastUpdateTime;
private String mTimeStamp;
private ExecutorService mThreadPool = Executors.newSingleThreadExecutor(new SimpleThreadFactory("TileURLGeneratorYANDEXTRAFFIC"));
private Handler mCallbackHandler = null;
public TileURLGeneratorYANDEXTRAFFIC(String mName) {
super(mName);
mLastUpdateTime = 0L;
mTimeStamp = "";
}
@Override
public String Get(int x, int y, int z) {
return new StringBuilder().append(mName)
.append("&x=")
.append(x)
.append("&y=")
.append(y)
.append("&z=")
.append(z)
.append("&tm=")
.append(get_ts(60))
.toString();
}
public void setCallbackHandler(final Handler aCallbackHandler) {
mCallbackHandler = aCallbackHandler;
}
public void Free() {
mCallbackHandler = null;
mThreadPool.shutdown();
}
private boolean ts_update_needed(int delta){
Date d = new Date();
Long now = d.getTime();
if(now - mLastUpdateTime > delta*1000){
mLastUpdateTime = now;
return true;
}
return false;
}
private String get_ts(int delta){
if (ts_update_needed(delta)) {
mThreadPool.execute(new Runnable() {
public void run() {
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new URL(YANDEX_STAT_URL).openStream(), StreamUtils.IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, StreamUtils.IO_BUFFER_SIZE);
StreamUtils.copy(in, out);
out.flush();
String str = dataStream.toString();
//JSONObject json = new JSONObject(str.replace("YMaps.TrafficLoader.onLoad(\"stat\",", "").replace("});", "}"));
int start = str.indexOf("timestamp:");
start = str.indexOf("\"", start) + 1;
int end = str.indexOf("\"", start);
mTimeStamp = str.substring(start, end);
} catch (Exception e) {
e.printStackTrace();
} finally {
StreamUtils.closeStream(in);
StreamUtils.closeStream(out);
}
if(mCallbackHandler != null)
Message.obtain(mCallbackHandler, MessageHandlerConstants.MAPTILEFSLOADER_SUCCESS_ID).sendToTarget();
}
});
}
return mTimeStamp;
}
}