package it.fdev.unisaconnect.map;
import it.fdev.unisaconnect.FragmentMap;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.res.AssetManager;
import com.google.android.gms.maps.model.Tile;
import com.google.android.gms.maps.model.TileProvider;
public class GoogleMapOverlayMapTileProvider implements TileProvider {
private static final int TILE_WIDTH = 256;
private static final int TILE_HEIGHT = 256;
private static final int BUFFER_SIZE = 16 * 1024;
private AssetManager assets;
private String tilesFolder;
public GoogleMapOverlayMapTileProvider(AssetManager assets, String tilesFolderName) {
this.assets = assets;
this.tilesFolder = tilesFolderName;
}
@Override
public Tile getTile(int x, int y, int zoom) {
/* conversion from TMS to XYZ tiles */
y = (int) ((Math.pow(2, zoom)) - y - 1);
if (!existsTile(x, y, zoom)) {
return null;
} else {
byte[] image = readTileImage(x, y, zoom);
return image == null ? null : new Tile(TILE_WIDTH, TILE_HEIGHT, image);
}
}
private byte[] readTileImage(int x, int y, int zoom) {
InputStream in = null;
ByteArrayOutputStream buffer = null;
try {
in = assets.open(getTileFilename(x, y, zoom));
buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[BUFFER_SIZE];
while ((nRead = in.read(data, 0, BUFFER_SIZE)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
} finally {
if (in != null)
try {
in.close();
} catch (Exception ignored) {
}
if (buffer != null)
try {
buffer.close();
} catch (Exception ignored) {
}
}
}
private String getTileFilename(int x, int y, int zoom) {
return tilesFolder + "/" + zoom + '/' + x + '/' + y + ".png";
}
private boolean existsTile(int x, int y, int zoom) {
int minZoom = FragmentMap.MIN_ZOOM;
int maxZoom = FragmentMap.MAX_ZOOM;
if ((zoom < minZoom || zoom > maxZoom)) {
return false;
}
return true;
}
}