| /* |
| * 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(); |
| } |
| } |