From c12df440175c340549f5cf826b98febd582b660d Mon Sep 17 00:00:00 2001 From: Fares Alhassen Date: Mon, 13 Jul 2026 13:37:25 -0700 Subject: [PATCH] Internal change PiperOrigin-RevId: 947216644 --- .../main/java/com/bumptech/glide/Glide.java | 11 ++++- .../glide/load/engine/ActiveResources.java | 40 +++++++++++++++++++ .../glide/load/engine/BitmapInfo.java | 27 +++++++++++++ .../bumptech/glide/load/engine/Engine.java | 7 ++++ .../bitmap_recycle/AttributeStrategy.java | 16 ++++++++ .../engine/bitmap_recycle/BitmapPool.java | 6 +++ .../bitmap_recycle/BitmapPoolAdapter.java | 9 +++++ .../bitmap_recycle/GroupedLinkedMap.java | 16 ++++++++ .../engine/bitmap_recycle/LruBitmapPool.java | 8 ++++ .../bitmap_recycle/LruPoolStrategy.java | 4 ++ .../bitmap_recycle/SizeConfigStrategy.java | 16 ++++++++ .../engine/bitmap_recycle/SizeStrategy.java | 16 ++++++++ .../load/engine/cache/LruResourceCache.java | 31 ++++++++++++++ .../glide/load/engine/cache/MemoryCache.java | 5 +++ .../load/engine/cache/MemoryCacheAdapter.java | 8 ++++ .../engine/cache/MemoryCacheEntryInfo.java | 14 +++++++ .../com/bumptech/glide/util/LruCache.java | 31 ++++++++++++++ .../glide/load/engine/EngineTest.java | 5 ++- .../bitmap_recycle/GroupedLinkedMapTest.java | 34 ++++++++++++++++ .../bitmap_recycle/LruBitmapPoolTest.java | 10 +++++ .../glide/load/engine/cache/LruCacheTest.java | 12 ++++-- .../engine/cache/LruResourceCacheTest.java | 7 +++- 22 files changed, 324 insertions(+), 9 deletions(-) create mode 100644 library/src/main/java/com/bumptech/glide/load/engine/BitmapInfo.java create mode 100644 library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheEntryInfo.java diff --git a/library/src/main/java/com/bumptech/glide/Glide.java b/library/src/main/java/com/bumptech/glide/Glide.java index 066d02f788..054861d415 100644 --- a/library/src/main/java/com/bumptech/glide/Glide.java +++ b/library/src/main/java/com/bumptech/glide/Glide.java @@ -194,7 +194,6 @@ public static void init(@NonNull Context context, @NonNull GlideBuilder builder) } } - @VisibleForTesting public static synchronized boolean isInitialized() { return glide != null; } @@ -401,6 +400,16 @@ public ArrayPool getArrayPool() { return arrayPool; } + @NonNull + public Engine getEngine() { + return engine; + } + + @NonNull + public MemoryCache getMemoryCache() { + return memoryCache; + } + /** * @return The context associated with this instance. */ diff --git a/library/src/main/java/com/bumptech/glide/load/engine/ActiveResources.java b/library/src/main/java/com/bumptech/glide/load/engine/ActiveResources.java index 3a4c2f1867..bdb6c85491 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/ActiveResources.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/ActiveResources.java @@ -1,5 +1,7 @@ package com.bumptech.glide.load.engine; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; import android.os.Process; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -11,7 +13,9 @@ import com.bumptech.glide.util.Synthetic; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; @@ -103,6 +107,42 @@ synchronized EngineResource get(Key key) { return active; } + synchronized Map> getActiveResources() { + Map> result = new HashMap<>(); + for (Map.Entry entry : activeEngineResources.entrySet()) { + EngineResource resource = entry.getValue().get(); + if (resource != null) { + result.put(entry.getKey(), resource); + } + } + return result; + } + + synchronized List getActiveBitmapInfos() { + List result = new ArrayList<>(); + for (ResourceWeakReference ref : activeEngineResources.values()) { + EngineResource engineResource = ref.get(); + if (engineResource != null) { + Bitmap bitmap = getBitmap(engineResource.getResource()); + if (bitmap != null) { + result.add(new BitmapInfo(bitmap)); + } + } + } + return result; + } + + @Nullable + private static Bitmap getBitmap(Resource resource) { + Object value = resource.get(); + if (value instanceof Bitmap) { + return (Bitmap) value; + } else if (value instanceof BitmapDrawable) { + return ((BitmapDrawable) value).getBitmap(); + } + return null; + } + @SuppressWarnings({"WeakerAccess", "SynchronizeOnNonFinalField"}) @Synthetic void cleanupActiveReference(@NonNull ResourceWeakReference ref) { diff --git a/library/src/main/java/com/bumptech/glide/load/engine/BitmapInfo.java b/library/src/main/java/com/bumptech/glide/load/engine/BitmapInfo.java new file mode 100644 index 0000000000..b6ba633f0c --- /dev/null +++ b/library/src/main/java/com/bumptech/glide/load/engine/BitmapInfo.java @@ -0,0 +1,27 @@ +package com.bumptech.glide.load.engine; + +import android.graphics.Bitmap; +import android.os.Build; +import androidx.annotation.Nullable; + +/** Metadata of a Bitmap, captured safely. */ +public final class BitmapInfo { + public final int width; + public final int height; + @Nullable public final Bitmap.Config config; + public final int byteCount; + public final boolean hasMipMap; + @Nullable public final String colorSpace; + + public BitmapInfo(Bitmap bitmap) { + this.width = bitmap.getWidth(); + this.height = bitmap.getHeight(); + this.config = bitmap.getConfig(); + this.byteCount = bitmap.getAllocationByteCount(); + this.hasMipMap = Build.VERSION.SDK_INT >= 17 && bitmap.hasMipMap(); + this.colorSpace = + Build.VERSION.SDK_INT >= 26 && bitmap.getColorSpace() != null + ? bitmap.getColorSpace().getName() + : null; + } +} diff --git a/library/src/main/java/com/bumptech/glide/load/engine/Engine.java b/library/src/main/java/com/bumptech/glide/load/engine/Engine.java index cdedb29fbb..1788896d74 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/Engine.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/Engine.java @@ -24,6 +24,7 @@ import com.bumptech.glide.util.Synthetic; import com.bumptech.glide.util.Util; import com.bumptech.glide.util.pool.FactoryPools; +import java.util.List; import java.util.Map; import java.util.concurrent.Executor; @@ -462,6 +463,12 @@ public void onResourceReleased(Key cacheKey, EngineResource resource) { } } + /** Returns a list of metadata for currently active bitmaps. */ + @NonNull + public List getActiveBitmapInfos() { + return activeResources.getActiveBitmapInfos(); + } + public void clearDiskCache() { diskCacheProvider.getDiskCache().clear(); } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/AttributeStrategy.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/AttributeStrategy.java index 896b13f838..c0e77ba84c 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/AttributeStrategy.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/AttributeStrategy.java @@ -2,8 +2,11 @@ import android.graphics.Bitmap; import androidx.annotation.VisibleForTesting; +import com.bumptech.glide.load.engine.BitmapInfo; import com.bumptech.glide.util.Synthetic; import com.bumptech.glide.util.Util; +import java.util.ArrayList; +import java.util.List; /** * A strategy for reusing bitmaps that requires any returned bitmap's dimensions to exactly match @@ -32,6 +35,19 @@ public Bitmap removeLast() { return groupedMap.removeLast(); } + @Override + public List getPooledBitmapInfos() { + final List result = new ArrayList<>(); + groupedMap.forEach( + new GroupedLinkedMap.ValueConsumer() { + @Override + public void accept(Bitmap bitmap) { + result.add(new BitmapInfo(bitmap)); + } + }); + return result; + } + @Override public String logBitmap(Bitmap bitmap) { return getBitmapString(bitmap); diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPool.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPool.java index 83c449525e..72a3bec95b 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPool.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPool.java @@ -2,6 +2,8 @@ import android.graphics.Bitmap; import androidx.annotation.NonNull; +import com.bumptech.glide.load.engine.BitmapInfo; +import java.util.List; /** An interface for a pool that allows users to reuse {@link android.graphics.Bitmap} objects. */ public interface BitmapPool { @@ -97,4 +99,8 @@ public interface BitmapPool { * @see android.content.ComponentCallbacks2 */ void trimMemory(int level); + + /** Returns a list of metadata for all bitmaps currently in the pool. */ + @NonNull + List getPooledBitmapInfos(); } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPoolAdapter.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPoolAdapter.java index cedbba2728..a847908e2e 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPoolAdapter.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/BitmapPoolAdapter.java @@ -2,6 +2,9 @@ import android.graphics.Bitmap; import androidx.annotation.NonNull; +import com.bumptech.glide.load.engine.BitmapInfo; +import java.util.Collections; +import java.util.List; /** * An {@link com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool BitmapPool} implementation @@ -45,4 +48,10 @@ public void clearMemory() { public void trimMemory(int level) { // Do nothing. } + + @NonNull + @Override + public List getPooledBitmapInfos() { + return Collections.emptyList(); + } } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap.java index e07a793d72..2daaac874a 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap.java @@ -77,6 +77,22 @@ public V removeLast() { return null; } + public void forEach(ValueConsumer consumer) { + LinkedEntry current = head.next; + while (!current.equals(head)) { + if (current.values != null) { + for (V value : current.values) { + consumer.accept(value); + } + } + current = current.next; + } + } + + interface ValueConsumer { + void accept(V value); + } + @Override public String toString() { StringBuilder sb = new StringBuilder("GroupedLinkedMap( "); diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool.java index 17f96f518c..060bdce946 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool.java @@ -9,10 +9,12 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.load.engine.BitmapInfo; import com.bumptech.glide.util.Synthetic; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -256,6 +258,12 @@ public void trimMemory(int level) { } } + @NonNull + @Override + public synchronized List getPooledBitmapInfos() { + return strategy.getPooledBitmapInfos(); + } + private synchronized void trimToSize(long size) { while (currentSize > size) { final Bitmap removed = strategy.removeLast(); diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruPoolStrategy.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruPoolStrategy.java index 375f8d359a..f37dadc094 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruPoolStrategy.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/LruPoolStrategy.java @@ -2,6 +2,8 @@ import android.graphics.Bitmap; import androidx.annotation.Nullable; +import com.bumptech.glide.load.engine.BitmapInfo; +import java.util.List; interface LruPoolStrategy { void put(Bitmap bitmap); @@ -17,4 +19,6 @@ interface LruPoolStrategy { String logBitmap(int width, int height, Bitmap.Config config); int getSize(Bitmap bitmap); + + List getPooledBitmapInfos(); } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy.java index 992d41ddf2..40604903c1 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy.java @@ -6,10 +6,13 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; +import com.bumptech.glide.load.engine.BitmapInfo; import com.bumptech.glide.util.Synthetic; import com.bumptech.glide.util.Util; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.NavigableMap; import java.util.TreeMap; @@ -114,6 +117,19 @@ public Bitmap removeLast() { return removed; } + @Override + public List getPooledBitmapInfos() { + final List result = new ArrayList<>(); + groupedMap.forEach( + new GroupedLinkedMap.ValueConsumer() { + @Override + public void accept(Bitmap bitmap) { + result.add(new BitmapInfo(bitmap)); + } + }); + return result; + } + private void decrementBitmapOfSize(Integer size, Bitmap removed) { Bitmap.Config config = removed.getConfig(); NavigableMap sizes = getSizesForConfig(config); diff --git a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeStrategy.java b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeStrategy.java index 7987f507da..020df853fa 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeStrategy.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/bitmap_recycle/SizeStrategy.java @@ -5,8 +5,11 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; +import com.bumptech.glide.load.engine.BitmapInfo; import com.bumptech.glide.util.Synthetic; import com.bumptech.glide.util.Util; +import java.util.ArrayList; +import java.util.List; import java.util.NavigableMap; /** @@ -67,6 +70,19 @@ public Bitmap removeLast() { return removed; } + @Override + public List getPooledBitmapInfos() { + final List result = new ArrayList<>(); + groupedMap.forEach( + new GroupedLinkedMap.ValueConsumer() { + @Override + public void accept(Bitmap bitmap) { + result.add(new BitmapInfo(bitmap)); + } + }); + return result; + } + private void decrementBitmapOfSize(Integer size) { Integer current = sortedSizes.get(size); if (current == 1) { diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/LruResourceCache.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/LruResourceCache.java index 8d052c4cad..af764e3a2d 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/LruResourceCache.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/LruResourceCache.java @@ -1,11 +1,16 @@ package com.bumptech.glide.load.engine.cache; import android.annotation.SuppressLint; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.bumptech.glide.load.Key; +import com.bumptech.glide.load.engine.BitmapInfo; import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.util.LruCache; +import java.util.ArrayList; +import java.util.List; /** An LRU in memory cache for {@link com.bumptech.glide.load.engine.Resource}s. */ public class LruResourceCache extends LruCache> implements MemoryCache { @@ -56,4 +61,30 @@ public void trimMemory(int level) { trimToSize(getMaxSize() / 2); } } + + @NonNull + @Override + public synchronized List getCacheEntryInfos() { + List result = new ArrayList<>(); + for (LruCache.EntryInfo> entry : super.getSnapshot()) { + if (entry.value != null) { + Bitmap bitmap = getBitmap(entry.value); + if (bitmap != null) { + result.add(new MemoryCacheEntryInfo(new BitmapInfo(bitmap), entry.lastAccessedTimestamp)); + } + } + } + return result; + } + + @Nullable + private static Bitmap getBitmap(Resource resource) { + Object value = resource.get(); + if (value instanceof Bitmap) { + return (Bitmap) value; + } else if (value instanceof BitmapDrawable) { + return ((BitmapDrawable) value).getBitmap(); + } + return null; + } } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCache.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCache.java index 1fa69362fd..5f7deecf51 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCache.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCache.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.engine.Resource; +import java.util.List; /** An interface for adding and removing resources from an in memory cache. */ public interface MemoryCache { @@ -64,4 +65,8 @@ interface ResourceRemovedListener { * android.content.ComponentCallbacks2}. */ void trimMemory(int level); + + /** Returns a snapshot of the current cache entry metadata. */ + @NonNull + List getCacheEntryInfos(); } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheAdapter.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheAdapter.java index d19c73ed1b..7623de116a 100644 --- a/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheAdapter.java +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheAdapter.java @@ -4,6 +4,8 @@ import androidx.annotation.Nullable; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.engine.Resource; +import java.util.Collections; +import java.util.List; /** A simple class that ignores all puts and returns null for all gets. */ public class MemoryCacheAdapter implements MemoryCache { @@ -54,4 +56,10 @@ public void clearMemory() { public void trimMemory(int level) { // Do nothing. } + + @NonNull + @Override + public List getCacheEntryInfos() { + return Collections.emptyList(); + } } diff --git a/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheEntryInfo.java b/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheEntryInfo.java new file mode 100644 index 0000000000..43f574ca44 --- /dev/null +++ b/library/src/main/java/com/bumptech/glide/load/engine/cache/MemoryCacheEntryInfo.java @@ -0,0 +1,14 @@ +package com.bumptech.glide.load.engine.cache; + +import com.bumptech.glide.load.engine.BitmapInfo; + +/** Metadata of a cached bitmap entry in the Memory Cache. */ +public final class MemoryCacheEntryInfo { + public final BitmapInfo bitmapInfo; + public final long lastAccessedTimestamp; + + public MemoryCacheEntryInfo(BitmapInfo bitmapInfo, long lastAccessedTimestamp) { + this.bitmapInfo = bitmapInfo; + this.lastAccessedTimestamp = lastAccessedTimestamp; + } +} diff --git a/library/src/main/java/com/bumptech/glide/util/LruCache.java b/library/src/main/java/com/bumptech/glide/util/LruCache.java index d171c3ba7f..bc1f9ec80c 100644 --- a/library/src/main/java/com/bumptech/glide/util/LruCache.java +++ b/library/src/main/java/com/bumptech/glide/util/LruCache.java @@ -1,9 +1,12 @@ package com.bumptech.glide.util; +import android.os.SystemClock; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; /** @@ -99,6 +102,9 @@ public synchronized boolean contains(@NonNull T key) { @Nullable public synchronized Y get(@NonNull T key) { Entry entry = cache.get(key); + if (entry != null) { + entry.lastAccessedTimestamp = SystemClock.elapsedRealtime(); + } return entry != null ? entry.value : null; } @@ -170,6 +176,29 @@ public void clearMemory() { trimToSize(0); } + /** Value and metadata for an entry in the cache. */ + public static final class EntryInfo { + public final Y value; + public final long lastAccessedTimestamp; + + public EntryInfo(Y value, long lastAccessedTimestamp) { + this.value = value; + this.lastAccessedTimestamp = lastAccessedTimestamp; + } + } + + /** Returns a snapshot of the current cache entries. */ + @NonNull + public synchronized List> getSnapshot() { + List> result = new ArrayList<>(cache.size()); + for (Entry entry : cache.values()) { + if (entry != null) { + result.add(new EntryInfo<>(entry.value, entry.lastAccessedTimestamp)); + } + } + return result; + } + /** * Removes the least recently used items from the cache until the current size is less than the * given size. @@ -198,11 +227,13 @@ private void evict() { static final class Entry { final Y value; final int size; + long lastAccessedTimestamp; @Synthetic Entry(Y value, int size) { this.value = value; this.size = size; + this.lastAccessedTimestamp = SystemClock.elapsedRealtime(); } } } diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/EngineTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/EngineTest.java index 78f89e2bd6..10c45337f2 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/EngineTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/EngineTest.java @@ -434,9 +434,10 @@ public void testReleaseReleasesEngineResource() { verify(engineResource).release(); } - @Test(expected = IllegalArgumentException.class) + @Test public void testThrowsIfAskedToReleaseNonEngineResource() { - harness.getEngine().release(mockResource()); + org.junit.Assert.assertThrows( + IllegalArgumentException.class, () -> harness.getEngine().release(mockResource())); } @Test diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMapTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMapTest.java index 8438edf0a3..fff9f631c7 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMapTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMapTest.java @@ -85,6 +85,40 @@ public void testAddingAnEntryDoesNotMakeItMostRecentlyUsed() { assertThat(map.removeLast()).isEqualTo(secondValue); } + @Test + public void testForEachEmptyMap() { + final java.util.List visited = new java.util.ArrayList<>(); + map.forEach( + new GroupedLinkedMap.ValueConsumer() { + @Override + public void accept(Object value) { + visited.add(value); + } + }); + assertThat(visited).isEmpty(); + } + + @Test + public void testForEachVisitsAllValues() { + Key firstKey = new Key("key", 1, 1); + Integer firstValue = 10; + map.put(firstKey, firstValue); + + Key secondKey = new Key("key2", 2, 2); + Integer secondValue = 20; + map.put(secondKey, secondValue); + + final java.util.List visited = new java.util.ArrayList<>(); + map.forEach( + new GroupedLinkedMap.ValueConsumer() { + @Override + public void accept(Object value) { + visited.add(value); + } + }); + assertThat(visited).containsExactly(firstValue, secondValue); + } + private static final class Key implements Poolable { private final String key; diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPoolTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPoolTest.java index 6956086069..c9f94792a2 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPoolTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPoolTest.java @@ -14,6 +14,7 @@ import static org.mockito.Mockito.when; import android.graphics.Bitmap; +import com.bumptech.glide.load.engine.BitmapInfo; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; @@ -281,5 +282,14 @@ public String logBitmap(int width, int height, Bitmap.Config config) { public int getSize(Bitmap bitmap) { return 1; } + + @Override + public List getPooledBitmapInfos() { + List result = new ArrayList<>(); + for (Bitmap bitmap : bitmaps) { + result.add(new BitmapInfo(bitmap)); + } + return result; + } } } diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruCacheTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruCacheTest.java index 9d16afff3d..38f683426c 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruCacheTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruCacheTest.java @@ -1,5 +1,6 @@ package com.bumptech.glide.load.engine.cache; +import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -20,9 +21,11 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; -@RunWith(JUnit4.class) +@RunWith(RobolectricTestRunner.class) +@Config(sdk = ROBOLECTRIC_SDK) public class LruCacheTest { private static final int SIZE = 10; private LruCache cache; @@ -265,9 +268,10 @@ public void testCanResetSizeDynamically() { verify(listener, times((sizeMultiplier * SIZE) - SIZE)).onItemRemoved(any()); } - @Test(expected = IllegalArgumentException.class) + @Test public void testThrowsIfMultiplierLessThanZero() { - cache.setSizeMultiplier(-1); + org.junit.Assert.assertThrows( + IllegalArgumentException.class, () -> cache.setSizeMultiplier(-1)); } @Test diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruResourceCacheTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruResourceCacheTest.java index 2927a73c8c..02f3c1d2b0 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruResourceCacheTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/cache/LruResourceCacheTest.java @@ -1,5 +1,6 @@ package com.bumptech.glide.load.engine.cache; +import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; import static com.bumptech.glide.load.engine.cache.MemoryCache.ResourceRemovedListener; import static com.bumptech.glide.tests.Util.anyResource; import static com.bumptech.glide.tests.Util.mockResource; @@ -21,9 +22,11 @@ import java.security.MessageDigest; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; -@RunWith(JUnit4.class) +@RunWith(RobolectricTestRunner.class) +@Config(sdk = ROBOLECTRIC_SDK) public class LruResourceCacheTest { @Test