package com.robert.maps.applib.tileprovider; import org.andnav.osm.util.BoundingBoxE6; import org.andnav.osm.util.GeoPoint; import org.andnav.osm.views.util.Util; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.preference.PreferenceManager; import com.robert.maps.applib.MainPreferences; import com.robert.maps.applib.R; import com.robert.maps.applib.utils.RException; import com.robert.maps.applib.utils.Ut; public class TileSource extends TileSourceBase { private TileProviderBase mTileProvider; private TileURLGeneratorBase mTileURLGenerator; private TileSourceBase mTileSourceBaseOverlay; private TileSource mTileSourceForTileOverlay; public TileSource(Context ctx, String aId) throws SQLiteException, RException { this(ctx, aId, true, true); } public TileSource(Context ctx, String aId, boolean aShowOverlay) throws SQLiteException, RException { this(ctx, aId, aShowOverlay, true); } public TileSource(Context ctx, String aId, boolean aShowOverlay, boolean aNeedTileProvider) throws SQLiteException, RException { super(ctx, aId); final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx); if(MAP_TYPE == MIXMAP_PAIR) { final MapTileMemCache tileCache = new MapTileMemCache(); mTileURLGenerator = initTileURLGenerator(this, pref); final TileProviderBase provider = initTileProvider(ctx, this, mTileURLGenerator, null); if(aShowOverlay) { final TileSourceBase tileSourceBase = new TileSourceBase(ctx, OVERLAYID); if (this.PROJECTION == tileSourceBase.PROJECTION && (int) (1E6 * this.OFFSET_LAT) == (int) (1E6 * tileSourceBase.OFFSET_LAT) && (int) (1E6 * this.OFFSET_LON) == (int) (1E6 * tileSourceBase.OFFSET_LON) ) { mTileSourceBaseOverlay = tileSourceBase; final TileURLGeneratorBase layerURLGenerator = initTileURLGenerator(mTileSourceBaseOverlay, pref); final TileProviderBase layerProvider = initTileProvider(ctx, mTileSourceBaseOverlay, layerURLGenerator, null); mTileProvider = new TileProviderDual(ctx, this.ID, provider, layerProvider, tileCache); } else { mTileURLGenerator = initTileURLGenerator(this, pref); mTileProvider = initTileProvider(ctx, this, mTileURLGenerator, null); mTileSourceBaseOverlay = null; mTileSourceForTileOverlay = new TileSource(ctx, OVERLAYID); } } else { mTileProvider = aNeedTileProvider ? initTileProvider(ctx, this, mTileURLGenerator, null) : null; } } else { mTileURLGenerator = initTileURLGenerator(this, pref); mTileProvider = aNeedTileProvider ? initTileProvider(ctx, this, mTileURLGenerator, null) : null; mTileSourceBaseOverlay = null; } } public TileSource(Context ctx, String aId, String aLayerId) throws SQLiteException, RException { super(ctx, aId); final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx); final TileSourceBase tileSourceBase = new TileSourceBase(ctx, aLayerId); if (this.PROJECTION == tileSourceBase.PROJECTION && (int) (1E6 * this.OFFSET_LAT) == (int) (1E6 * tileSourceBase.OFFSET_LAT) && (int) (1E6 * this.OFFSET_LON) == (int) (1E6 * tileSourceBase.OFFSET_LON) ) { final MapTileMemCache tileCache = new MapTileMemCache(); mTileURLGenerator = initTileURLGenerator(this, pref); final TileProviderBase provider = initTileProvider(ctx, this, mTileURLGenerator, null); mTileSourceBaseOverlay = tileSourceBase; final TileURLGeneratorBase layerURLGenerator = initTileURLGenerator(mTileSourceBaseOverlay, pref); final TileProviderBase layerProvider = initTileProvider(ctx, mTileSourceBaseOverlay, layerURLGenerator, null); mTileProvider = new TileProviderDual(ctx, this.ID, provider, layerProvider, tileCache); } else { mTileURLGenerator = initTileURLGenerator(this, pref); mTileProvider = initTileProvider(ctx, this, mTileURLGenerator, null); mTileSourceBaseOverlay = null; mTileSourceForTileOverlay = new TileSource(ctx, aLayerId); } // final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx); // // final MapTileMemCache tileCache = new MapTileMemCache(); // mTileURLGenerator = initTileURLGenerator(this, pref); // final TileProviderBase provider = initTileProvider(ctx, this, mTileURLGenerator, null); // // mTileSourceOverlay = new TileSourceBase(ctx, aLayerId); // final TileURLGeneratorBase layerURLGenerator = initTileURLGenerator(mTileSourceOverlay, pref); // final TileProviderBase layerProvider = initTileProvider(ctx, mTileSourceOverlay, layerURLGenerator, null); // // mTileProvider = new TileProviderDual(ctx, this.ID, provider, layerProvider, tileCache); } public TileSource getTileSourceForTileOverlay() { final TileSource tileSource = mTileSourceForTileOverlay; mTileSourceForTileOverlay = null; return tileSource; } public TileSourceBase getTileSourceBaseOverlay() { return mTileSourceBaseOverlay; } public String getOverlayName() { return mTileSourceBaseOverlay == null ? "" : mTileSourceBaseOverlay.ID; } private TileProviderBase initTileProvider(Context ctx, TileSourceBase tileSource, TileURLGeneratorBase aTileURLGenerator, MapTileMemCache aTileCache) throws SQLiteException, RException { TileProviderBase provider = null; switch(tileSource.TILE_SOURCE_TYPE) { case 0: if(tileSource.LAYER) provider = new TileProviderInet(ctx, aTileURLGenerator, CacheDatabaseName(tileSource), aTileCache, null); else provider = new TileProviderInet(ctx, aTileURLGenerator, CacheDatabaseName(tileSource), aTileCache); break; case 3: provider = new TileProviderMNM(ctx, tileSource.BASEURL, tileSource.ID, aTileCache); provider.updateMapParams(this); break; case 4: provider = new TileProviderTAR(ctx, tileSource.BASEURL, tileSource.ID, aTileCache); provider.updateMapParams(this); break; case 5: provider = new TileProviderSQLITEDB(ctx, tileSource.BASEURL, tileSource.ID, aTileCache); provider.updateMapParams(this); break; case 6: provider = new TileProviderBase(ctx); provider.setLoadingMapTile(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.r_blank)); break; default: provider = new TileProviderBase(ctx); } return provider; } private TileURLGeneratorBase initTileURLGenerator(TileSourceBase tileSource, SharedPreferences pref) { TileURLGeneratorBase generator = null; if(tileSource.TILE_SOURCE_TYPE == 0) { switch(tileSource.URL_BUILDER_TYPE) { case 0: generator = new TileURLGeneratorOSM(tileSource.BASEURL, tileSource.IMAGE_FILENAMEENDING); break; case 1: generator = new TileURLGeneratorGOOGLEMAP(tileSource.BASEURL, tileSource.GOOGLE_LANG_CODE, pref.getString(MainPreferences.PREF_PREDEFMAPS_ + tileSource.ID + "_googlescale", "1")); break; case 2: generator = new TileURLGeneratorYANDEX(tileSource.BASEURL, tileSource.IMAGE_FILENAMEENDING); break; case 3: generator = new TileURLGeneratorYANDEXTRAFFIC(tileSource.BASEURL); break; case 4: generator = new TileURLGeneratorGOOGLESAT(tileSource.BASEURL, tileSource.GOOGLE_LANG_CODE); break; case 5: generator = new TileURLGeneratorOrdnanceSurveyMap(tileSource.BASEURL, tileSource.ZOOM_MINLEVEL); break; case 6: generator = new TileURLGeneratorMS(tileSource.BASEURL, tileSource.IMAGE_FILENAMEENDING); break; case 7: generator = new TileURLGeneratorDOCELUPL(tileSource.BASEURL); break; case 8: generator = new TileURLGeneratorVFR(tileSource.BASEURL); break; case 9: generator = new TileURLGeneratorAVC(tileSource.BASEURL, tileSource.IMAGE_FILENAMEENDING); break; case 10: generator = new TileURLGeneratorSovMilMap(tileSource.BASEURL); break; case 11: generator = new TileURLGeneratorVFRCB(tileSource.BASEURL, tileSource.IMAGE_FILENAMEENDING); break; case 12: generator = new TileURLGeneratorCustom(tileSource.BASEURL); break; case 13: generator = null; break; } } return generator; } private String CacheDatabaseName(TileSourceBase aTileSource) { if(!aTileSource.mOnlineMapCacheEnabled && !aTileSource.LAYER) // Cache Enabled? return null; if(aTileSource.TIMEDEPENDENT) return null; if(aTileSource.CACHE.trim().equalsIgnoreCase("")) return aTileSource.ID; else return aTileSource.CACHE; } public void setReloadTileMode(boolean reloadTileMode) { mTileProvider.mReloadTileMode = reloadTileMode; } public Bitmap getTile(final int x, final int y, final int z) { return mTileProvider.getTile(x, y, z); } public void Free() { if(mTileProvider != null) mTileProvider.Free(); } protected void finalize() throws Throwable { Ut.d("TileSource finalize"); super.finalize(); } public int getZOOM_MINLEVEL() { return ZOOM_MINLEVEL; } public int getZOOM_MAXLEVEL() { return ZOOM_MAXLEVEL; } public int getTileSizePx(int mZoom) { return MAPTILE_SIZEPX; } public int getTileUpperBound(final int zoomLevel) { // if (this.URL_BUILDER_TYPE == 5) { // return OpenSpaceUpperBoundArray[zoomLevel - ZOOM_MINLEVEL]; // } else return (int) Math.pow(2, zoomLevel); } public void setHandler(Handler mTileMapHandler) { mTileProvider.setHandler(mTileMapHandler); } public TileProviderBase getTileProvider() { return mTileProvider; } public TileURLGeneratorBase getTileURLGenerator () { return mTileURLGenerator; } public void postIndex() { mTileProvider.updateMapParams(this); } public GeoPoint findTheMap(int zoomLevel) { if(mTileProvider instanceof TileProviderSQLITEDB) { final int[] coord = ((TileProviderSQLITEDB) mTileProvider).findTheMap(zoomLevel); final BoundingBoxE6 bb = Util.getBoundingBoxFromMapTile(coord, zoomLevel, PROJECTION); return new GeoPoint(bb.getLatSouthE6(), bb.getLonEastE6()); } return null; } }