package org.mozilla.osmdroid.tileprovider.tilesource; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.Drawable; import org.mozilla.mozstumbler.BuildConfig; import org.mozilla.mozstumbler.service.core.logging.ClientLog; import org.mozilla.mozstumbler.svclocator.services.log.LoggerUtil; import org.mozilla.osmdroid.ResourceProxy; import org.mozilla.osmdroid.ResourceProxy.string; import org.mozilla.osmdroid.tileprovider.BitmapPool; import org.mozilla.osmdroid.tileprovider.MapTile; import org.mozilla.osmdroid.tileprovider.ReusableBitmapDrawable; import org.mozilla.osmdroid.tileprovider.constants.OSMConstants; import java.util.Random; public abstract class BitmapTileSourceBase implements ITileSource, OSMConstants { private static final String LOG_TAG = LoggerUtil.makeLogTag(BitmapTileSourceBase.class); private static int globalOrdinal = 0; protected final String mName; protected final String mImageFilenameEnding; protected final Random random = new Random(); private final int mMinimumZoomLevel; private final int mMaximumZoomLevel; private final int mOrdinal; private final int mTileSizePixels; private final string mResourceId; /** * Constructor * * @param aName a human-friendly name for this tile source * @param aResourceId resource id used to get the localized name of this tile source * @param aZoomMinLevel the minimum zoom level this tile source can provide * @param aZoomMaxLevel the maximum zoom level this tile source can provide * @param aTileSizePixels the tile size in pixels this tile source provides * @param aImageFilenameEnding the file name extension used when constructing the filename */ public BitmapTileSourceBase(final String aName, final string aResourceId, final int aZoomMinLevel, final int aZoomMaxLevel, final int aTileSizePixels, final String aImageFilenameEnding) { mResourceId = aResourceId; mOrdinal = globalOrdinal++; mName = aName; mMinimumZoomLevel = aZoomMinLevel; mMaximumZoomLevel = aZoomMaxLevel; mTileSizePixels = aTileSizePixels; mImageFilenameEnding = aImageFilenameEnding; } @Override public int ordinal() { return mOrdinal; } @Override public String name() { return mName; } public String pathBase() { return mName; } public String imageFilenameEnding() { return mImageFilenameEnding; } @Override public int getMinimumZoomLevel() { return mMinimumZoomLevel; } @Override public int getMaximumZoomLevel() { return mMaximumZoomLevel; } @Override public int getTileSizePixels() { return mTileSizePixels; } @Override public String localizedName(final ResourceProxy proxy) { return proxy.getString(mResourceId); } @Override public Drawable getDrawable(final byte[] tileBytes) { try { // default implementation will load the file as a bitmap and create // a BitmapDrawable from it BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); BitmapPool.getInstance().applyReusableOptions(bitmapOptions); final Bitmap bitmap = BitmapFactory.decodeByteArray(tileBytes, 0, tileBytes.length, bitmapOptions); if (bitmap != null) { if (BuildConfig.LABEL_MAP_TILES) { // Write the tile name directly onto the bitmap int w = bitmap.getWidth(); int h = bitmap.getHeight(); Paint bgPaint = new Paint(); bgPaint.setColor(Color.BLACK); //transparent black,change opacity by changing hex value "AA" between "00" and "FF" bgPaint.setAlpha(128); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(24); paint.setAntiAlias(true); paint.setUnderlineText(false); // should draw background first,order is important int border = (int) ((int) (w * 0.01) + 0.5); int left = border; int right = w - border; int bottom = h - border; int top = border; canvas.drawRect(left, top, right, bottom, bgPaint); /* File f = new File(aFilePath); File parentDir = f.getParentFile(); File zoomDir = parentDir.getParentFile(); try { if (((OnlineTileSourceBase) this).mBaseUrls[0].contains("cloudfront")) { canvas.drawText("Cover: " + zoomDir.getName() + "/" + parentDir.getName() + "/" + f.getName(), 10, h - 15, paint); } else { canvas.drawText("Map: " + zoomDir.getName() + "/" + parentDir.getName() + "/" + f.getName(), 10, h - 45, paint); } } catch (ClassCastException ccex) { Log.e(LOG_TAG, "Casting error", ccex); } */ } return new ReusableBitmapDrawable(bitmap); } } catch (final OutOfMemoryError e) { ClientLog.e(LOG_TAG, "OutOfMemoryError loading bitmap", e); System.gc(); } return null; } @Override public String getTileRelativeFilenameString(final MapTile tile) { final StringBuilder sb = new StringBuilder(); sb.append(pathBase()); sb.append('/'); sb.append(tile.getZoomLevel()); sb.append('/'); sb.append(tile.getX()); sb.append('/'); sb.append(tile.getY()); sb.append(imageFilenameEnding()); return sb.toString(); } public final class LowMemoryException extends Exception { private static final long serialVersionUID = 146526524087765134L; public LowMemoryException(final String pDetailMessage) { super(pDetailMessage); } public LowMemoryException(final Throwable pThrowable) { super(pThrowable); } } }