/*****************************************************************************
* BitmapCache.java
*****************************************************************************
* Copyright © 2012 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
package org.videolan.vlc.util;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.view.View;
import org.videolan.libvlc.util.AndroidUtil;
import org.videolan.vlc.VLCApplication;
public class BitmapCache {
public final static String TAG = "VLC/BitmapCache";
private final static boolean LOG_ENABLED = false;
private static BitmapCache mInstance;
private final LruCache<String, Bitmap> mMemCache;
public static BitmapCache getInstance() {
if (mInstance == null)
mInstance = new BitmapCache();
return mInstance;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private BitmapCache() {
// Get memory class of this device, exceeding this amount will throw an
// OutOfMemory exception.
final ActivityManager am = ((ActivityManager) VLCApplication.getAppContext().getSystemService(
Context.ACTIVITY_SERVICE));
final int memClass = AndroidUtil.isHoneycombOrLater() ? am.getLargeMemoryClass() : am.getMemoryClass();
// Use 1/5th of the available memory for this memory cache.
final int cacheSize = 1024 * 1024 * memClass / 5;
Log.d(TAG, "LRUCache size sets to " + cacheSize);
mMemCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
public Bitmap getBitmapFromMemCache(String key) {
final Bitmap b = mMemCache.get(key);
if (LOG_ENABLED)
Log.d(TAG, (b == null) ? "Cache miss" : "Cache found");
if (b != null && b.isRecycled()) {
/* A recycled bitmap cannot be used again */
mMemCache.remove(key);
return null;
}
return b;
}
public void addBitmapToMemCache(String key, Bitmap bitmap) {
if (key != null && bitmap != null && getBitmapFromMemCache(key) == null)
mMemCache.put(key, bitmap);
}
private Bitmap getBitmapFromMemCache(int resId) {
return getBitmapFromMemCache("res:" + resId);
}
private void addBitmapToMemCache(int resId, Bitmap bitmap) {
addBitmapToMemCache("res:" + resId, bitmap);
}
public void clear() {
mMemCache.evictAll();
}
public static Bitmap getFromResource(View v, int resId) {
BitmapCache cache = BitmapCache.getInstance();
Bitmap bitmap = cache.getBitmapFromMemCache(resId);
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(v.getResources(), resId);
cache.addBitmapToMemCache(resId, bitmap);
}
return bitmap;
}
}