blob: 53d47bae1eb3183b6707d99d17ac0b68945673a5 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.activityscenetransitionbasic;
import com.android.volley.toolbox.ImageLoader;
import android.graphics.Bitmap;
import android.util.LruCache;
import java.util.Map;
/**
* An image memory cache implementation for Volley which allows the retrieval of entires via a URL.
* Volley internally inserts items with a key which is a combination of a the size of the image,
* and the url.
*
* This class provide the method {@link #getBitmapFromUrl(String)} which allows the retrieval of
* a bitmap solely on the URL.
*/
public class ImageMemoryCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
/**
* Singleton instance which has it's maximum size set to be 1/8th of the allowed memory size.
*/
public static final ImageMemoryCache INSTANCE = new ImageMemoryCache(
(int) (Runtime.getRuntime().maxMemory() / 8));
// Cache the last created snapshot
private Map<String, Bitmap> mLastSnapshot;
private ImageMemoryCache(int maxSize) {
super(maxSize);
}
public Bitmap getBitmapFromUrl(String url) {
// If we do not have a snapshot to use, generate one
if (mLastSnapshot == null) {
mLastSnapshot = snapshot();
}
// Iterate through the snapshot to find any entries which match our url
for (Map.Entry<String, Bitmap> entry : mLastSnapshot.entrySet()) {
if (url.equals(extractUrl(entry.getKey()))) {
// We've found an entry with the same url, return the bitmap
return entry.getValue();
}
}
// We didn't find an entry, so return null
return null;
}
@Override
public Bitmap getBitmap(String key) {
return get(key);
}
@Override
public void putBitmap(String key, Bitmap bitmap) {
put(key, bitmap);
// An entry has been added, so invalidate the snapshot
mLastSnapshot = null;
}
@Override
protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
super.entryRemoved(evicted, key, oldValue, newValue);
// An entry has been removed, so invalidate the snapshot
mLastSnapshot = null;
}
private static String extractUrl(String key) {
return key.substring(key.indexOf("http"));
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getAllocationByteCount();
}
}