// Created by plusminus on 17:58:57 - 25.09.2008
package org.osmdroid.tileprovider;

import org.osmdroid.tileprovider.constants.OpenStreetMapTileProviderConstants;

import android.graphics.drawable.Drawable;

/**
 * 
 * @author Nicolas Gramlich
 * 
 */
public class MapTileCache implements OpenStreetMapTileProviderConstants {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	protected LRUMapTileCache mCachedTiles;

	// ===========================================================
	// Constructors
	// ===========================================================

	public MapTileCache() {
		this(CACHE_MAPTILECOUNT_DEFAULT);
	}

	/**
	 * @param aMaximumCacheSize
	 *            Maximum amount of MapTiles to be hold within.
	 */
	public MapTileCache(final int aMaximumCacheSize) {
		this.mCachedTiles = new LRUMapTileCache(aMaximumCacheSize);
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	public void ensureCapacity(final int aCapacity) {
		synchronized (mCachedTiles) {
			mCachedTiles.ensureCapacity(aCapacity);
		}
	}

	public Drawable getMapTile(final MapTile aTile) {
		synchronized (mCachedTiles) {
			return this.mCachedTiles.get(aTile);
		}
	}

	public void putTile(final MapTile aTile, final Drawable aDrawable) {
		if (aDrawable != null) {
			synchronized (mCachedTiles) {
				this.mCachedTiles.put(aTile, aDrawable);
			}
		}
	}

	// ===========================================================
	// Methods from SuperClass/Interfaces
	// ===========================================================

	// ===========================================================
	// Methods
	// ===========================================================

	public boolean containsTile(final MapTile aTile) {
		synchronized (mCachedTiles) {
			return this.mCachedTiles.containsKey(aTile);
		}
	}

	public void clear() {
		synchronized (mCachedTiles) {
			this.mCachedTiles.clear();
		}
	}

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}

@@ -624,16 +624,80 @@
 ====%0D%0A%0D%0A
+%09protected final Object mCachedTilesLockObject = new Object();%0D%0A
 %09protect
@@ -730,16 +730,16 @@
 Tiles;%0D%0A
-
 %0D%0A%09// ==
@@ -1402,32 +1402,42 @@
 ed (mCachedTiles
+LockObject
 ) %7B%0D%0A%09%09%09mCachedT
@@ -1552,32 +1552,42 @@
 ed (mCachedTiles
+LockObject
 ) %7B%0D%0A%09%09%09return t
@@ -1747,32 +1747,42 @@
 ed (mCachedTiles
+LockObject
 ) %7B%0D%0A%09%09%09%09this.mC
@@ -2223,32 +2223,42 @@
 ed (mCachedTiles
+LockObject
 ) %7B%0D%0A%09%09%09return t
@@ -2326,24 +2326,24 @@
  clear() %7B%0D%0A
-
 %09%09synchroniz
@@ -2358,16 +2358,26 @@
 hedTiles
+LockObject
 ) %7B%0D%0A%09%09%09

Add an explicit lock object for the tile cache in MapTileCache.