package org.mozilla.osmdroid.tileprovider; import android.content.Context; import org.mozilla.mozstumbler.svclocator.services.log.LoggerUtil; import org.mozilla.osmdroid.tileprovider.modules.INetworkAvailablityCheck; import org.mozilla.osmdroid.tileprovider.modules.NetworkAvailabliltyCheck; import org.mozilla.osmdroid.tileprovider.modules.SmartFSProvider; import org.mozilla.osmdroid.tileprovider.modules.TileDownloaderDelegate; import org.mozilla.osmdroid.tileprovider.modules.TileIOFacade; import org.mozilla.osmdroid.tileprovider.tilesource.ITileSource; import org.mozilla.osmdroid.tileprovider.tilesource.TileSourceFactory; import org.mozilla.osmdroid.tileprovider.util.SimpleRegisterReceiver; /** * This top-level tile provider implements a basic tile request chain which includes a * {@link SmartFSProvider}. * * @author Marc Kurtz */ public class BetterTileProvider extends BetterMapTileProviderArray implements IMapTileProviderCallback { private static final String LOG_TAG = LoggerUtil.makeLogTag(BetterTileProvider.class); public BetterTileProvider(final Context pContext) { // @TODO vng - this needs to be deleted as we are getting the // wrong tile source sometimes, and rely on some caller to // properly set the TileSource. This is a potential source of // race conditions. this(pContext, TileSourceFactory.DEFAULT_TILE_SOURCE); } public BetterTileProvider(final Context pContext, final ITileSource pTileSource) { this(new SimpleRegisterReceiver(pContext), new NetworkAvailabliltyCheck(pContext), pTileSource); } public BetterTileProvider(final IRegisterReceiver pRegisterReceiver, final INetworkAvailablityCheck aNetworkAvailablityCheck, final ITileSource pTileSource) { super(pTileSource, pRegisterReceiver); final TileIOFacade tileIOFacade = new TileIOFacade(); final SmartFSProvider smartProvider = new SmartFSProvider(pRegisterReceiver, pTileSource); // @TODO vng - something screwy is happening. Passing in the // pTileSource into TileDownloaderDelegate here gives us the // wrong tilesource when we try to write to disk. Something // must be clobbering the tilesource dynamically. // // The pTileSource being passed into SmartFSProvider must be // incorrect - which means that the single argument // constructor - BetterTileProvider(pContext) must be being // used. This mostly affects the overlay architecture as the // MozStumbler's MapFragment does dynamic substitution of the // TileSource. // // Suggested refactoring - create an interface that inherits // from ITileSource that provides a callback hooks. // In particular, we want a TileSource to subscribe to zoom // level changes a generic Map<String, String> callback so // that we can pass the equivalent of intents back without // having to implement bits of android. // // After that, remove the option to construct the TileProvider // with just a context. We never want to allow // TileSourceFactory.DEFAULT_TILE_SOURCE to be used. // // Once that is done, we should be able to remove all the // hacks in the MozStumbler MapFragment which swap the // TileSource within the TileProvider. TileDownloaderDelegate tileDelegate = new TileDownloaderDelegate(aNetworkAvailablityCheck, tileIOFacade); smartProvider.configureDelegate(tileDelegate); mTileProviderList.add(smartProvider); } }