Skip to content

Commit d84034d

Browse files
sjuddglide-copybara-robot
authored andcommitted
Add isAlternateCacheKey to a new ExperimentalRequestListener interface.
PiperOrigin-RevId: 319301011
1 parent 85868bd commit d84034d

File tree

10 files changed

+195
-77
lines changed

10 files changed

+195
-77
lines changed

library/src/main/java/com/bumptech/glide/load/engine/DecodeJob.java

+12-6
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class DecodeJob<R>
7676
private volatile DataFetcherGenerator currentGenerator;
7777
private volatile boolean isCallbackNotified;
7878
private volatile boolean isCancelled;
79+
private boolean isLoadingFromAlternateCacheKey;
7980

8081
DecodeJob(DiskCacheProvider diskCacheProvider, Pools.Pool<DecodeJob<?>> pool) {
8182
this.diskCacheProvider = diskCacheProvider;
@@ -332,9 +333,10 @@ private void notifyFailed() {
332333
onLoadFailed();
333334
}
334335

335-
private void notifyComplete(Resource<R> resource, DataSource dataSource) {
336+
private void notifyComplete(
337+
Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
336338
setNotifiedOrThrow();
337-
callback.onResourceReady(resource, dataSource);
339+
callback.onResourceReady(resource, dataSource, isLoadedFromAlternateCacheKey);
338340
}
339341

340342
private void setNotifiedOrThrow() {
@@ -381,6 +383,8 @@ public void onDataFetcherReady(
381383
this.currentFetcher = fetcher;
382384
this.currentDataSource = dataSource;
383385
this.currentAttemptingKey = attemptedKey;
386+
this.isLoadingFromAlternateCacheKey = sourceKey != decodeHelper.getCacheKeys().get(0);
387+
384388
if (Thread.currentThread() != currentThread) {
385389
runReason = RunReason.DECODE_DATA;
386390
callback.reschedule(this);
@@ -429,13 +433,14 @@ private void decodeFromRetrievedData() {
429433
throwables.add(e);
430434
}
431435
if (resource != null) {
432-
notifyEncodeAndRelease(resource, currentDataSource);
436+
notifyEncodeAndRelease(resource, currentDataSource, isLoadingFromAlternateCacheKey);
433437
} else {
434438
runGenerators();
435439
}
436440
}
437441

438-
private void notifyEncodeAndRelease(Resource<R> resource, DataSource dataSource) {
442+
private void notifyEncodeAndRelease(
443+
Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
439444
if (resource instanceof Initializable) {
440445
((Initializable) resource).initialize();
441446
}
@@ -447,7 +452,7 @@ private void notifyEncodeAndRelease(Resource<R> resource, DataSource dataSource)
447452
result = lockedResource;
448453
}
449454

450-
notifyComplete(result, dataSource);
455+
notifyComplete(result, dataSource, isLoadedFromAlternateCacheKey);
451456

452457
stage = Stage.ENCODE;
453458
try {
@@ -710,7 +715,8 @@ void clear() {
710715

711716
interface Callback<R> {
712717

713-
void onResourceReady(Resource<R> resource, DataSource dataSource);
718+
void onResourceReady(
719+
Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey);
714720

715721
void onLoadFailed(GlideException e);
716722

library/src/main/java/com/bumptech/glide/load/engine/Engine.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,8 @@ public <R> LoadStatus load(
217217

218218
// Avoid calling back while holding the engine lock, doing so makes it easier for callers to
219219
// deadlock.
220-
cb.onResourceReady(memoryResource, DataSource.MEMORY_CACHE);
220+
cb.onResourceReady(
221+
memoryResource, DataSource.MEMORY_CACHE, /* isLoadedFromAlternateCacheKey= */ false);
221222
return null;
222223
}
223224

library/src/main/java/com/bumptech/glide/load/engine/EngineJob.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class EngineJob<R> implements DecodeJob.Callback<R>, Poolable {
6969

7070
// Checked primarily on the main thread, but also on other threads in reschedule.
7171
private volatile boolean isCancelled;
72+
private boolean isLoadedFromAlternateCacheKey;
7273

7374
EngineJob(
7475
GlideExecutor diskCacheExecutor,
@@ -155,7 +156,7 @@ void callCallbackOnResourceReady(ResourceCallback cb) {
155156
// This is overly broad, some Glide code is actually called here, but it's much
156157
// simpler to encapsulate here than to do so at the actual call point in the
157158
// Request implementation.
158-
cb.onResourceReady(engineResource, dataSource);
159+
cb.onResourceReady(engineResource, dataSource, isLoadedFromAlternateCacheKey);
159160
} catch (Throwable t) {
160161
throw new CallbackException(t);
161162
}
@@ -304,6 +305,7 @@ private synchronized void release() {
304305
hasLoadFailed = false;
305306
isCancelled = false;
306307
hasResource = false;
308+
isLoadedFromAlternateCacheKey = false;
307309
decodeJob.release(/*isRemovedFromQueue=*/ false);
308310
decodeJob = null;
309311
exception = null;
@@ -312,10 +314,12 @@ private synchronized void release() {
312314
}
313315

314316
@Override
315-
public void onResourceReady(Resource<R> resource, DataSource dataSource) {
317+
public void onResourceReady(
318+
Resource<R> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
316319
synchronized (this) {
317320
this.resource = resource;
318321
this.dataSource = dataSource;
322+
this.isLoadedFromAlternateCacheKey = isLoadedFromAlternateCacheKey;
319323
}
320324
notifyCallbacksOfResult();
321325
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.bumptech.glide.request;
2+
3+
import com.bumptech.glide.load.DataSource;
4+
import com.bumptech.glide.request.target.Target;
5+
6+
/**
7+
* An extension of {@link RequestListener} with additional parameters.
8+
*
9+
* <p>All equivalent methods are called at the relevant time by Glide. Implementations therefore
10+
* should only implement one version of each method.
11+
*
12+
* @param <ResourceT> The type of resource that will be loaded for the request.
13+
* @deprecated Not ready for public consumption, avoid using this class. It may be removed at any
14+
* time.
15+
*/
16+
@Deprecated
17+
public abstract class ExperimentalRequestListener<ResourceT> implements RequestListener<ResourceT> {
18+
19+
/**
20+
* Identical to {@link #onResourceReady(Object, Object, Target, DataSource, boolean)} except that
21+
* {@code isAlternateCacheKey} is provided.
22+
*
23+
* @param isAlternateCacheKey True if the data was obtained from the disk cache using an alternate
24+
* cache key provided by a {@link com.bumptech.glide.load.model.ModelLoader} via {@link
25+
* com.bumptech.glide.load.model.ModelLoader.LoadData#alternateKeys}. Valid only if {@code
26+
* dataSource} is {@link DataSource#DATA_DISK_CACHE} or {@link
27+
* DataSource#RESOURCE_DISK_CACHE}.
28+
*/
29+
public abstract boolean onResourceReady(
30+
ResourceT resource,
31+
Object model,
32+
Target<ResourceT> target,
33+
DataSource dataSource,
34+
boolean isFirstResource,
35+
boolean isAlternateCacheKey);
36+
}

library/src/main/java/com/bumptech/glide/request/ResourceCallback.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public interface ResourceCallback {
1515
*
1616
* @param resource The loaded resource.
1717
*/
18-
void onResourceReady(Resource<?> resource, DataSource dataSource);
18+
void onResourceReady(
19+
Resource<?> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey);
1920

2021
/**
2122
* Called when a resource fails to load successfully.

library/src/main/java/com/bumptech/glide/request/SingleRequest.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ public void begin() {
237237
// that the view size has changed will need to explicitly clear the View or Target before
238238
// starting the new load.
239239
if (status == Status.COMPLETE) {
240-
onResourceReady(resource, DataSource.MEMORY_CACHE);
240+
onResourceReady(
241+
resource, DataSource.MEMORY_CACHE, /* isLoadedFromAlternateCacheKey= */ false);
241242
return;
242243
}
243244

@@ -520,7 +521,8 @@ private void notifyLoadFailed() {
520521
/** A callback method that should never be invoked directly. */
521522
@SuppressWarnings("unchecked")
522523
@Override
523-
public void onResourceReady(Resource<?> resource, DataSource dataSource) {
524+
public void onResourceReady(
525+
Resource<?> resource, DataSource dataSource, boolean isLoadedFromAlternateCacheKey) {
524526
stateVerifier.throwIfRecycled();
525527
Resource<?> toRelease = null;
526528
try {
@@ -572,7 +574,8 @@ public void onResourceReady(Resource<?> resource, DataSource dataSource) {
572574
return;
573575
}
574576

575-
onResourceReady((Resource<R>) resource, (R) received, dataSource);
577+
onResourceReady(
578+
(Resource<R>) resource, (R) received, dataSource, isLoadedFromAlternateCacheKey);
576579
}
577580
} finally {
578581
if (toRelease != null) {
@@ -582,14 +585,18 @@ public void onResourceReady(Resource<?> resource, DataSource dataSource) {
582585
}
583586

584587
/**
585-
* Internal {@link #onResourceReady(Resource, DataSource)} where arguments are known to be safe.
588+
* Internal {@link #onResourceReady(Resource, DataSource, boolean)} where arguments are known to
589+
* be safe.
586590
*
587591
* @param resource original {@link Resource}, never <code>null</code>
588592
* @param result object returned by {@link Resource#get()}, checked for type and never <code>null
589593
* </code>
590594
*/
595+
// We're using experimental APIs...
596+
@SuppressWarnings({"deprecation", "PMD.UnusedFormalParameter"})
591597
@GuardedBy("requestLock")
592-
private void onResourceReady(Resource<R> resource, R result, DataSource dataSource) {
598+
private void onResourceReady(
599+
Resource<R> resource, R result, DataSource dataSource, boolean isAlternateCacheKey) {
593600
// We must call isFirstReadyResource before setting status.
594601
boolean isFirstResource = isFirstReadyResource();
595602
status = Status.COMPLETE;

library/test/src/test/java/com/bumptech/glide/RequestBuilderTest.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,12 @@ public void runTest() {
128128
public void testMultipleRequestListeners() {
129129
getNullModelRequest().addListener(listener1).addListener(listener2).into(target);
130130
verify(requestManager).track(any(Target.class), requestCaptor.capture());
131-
requestCaptor.getValue().onResourceReady(new SimpleResource<>(new Object()), DataSource.LOCAL);
131+
requestCaptor
132+
.getValue()
133+
.onResourceReady(
134+
new SimpleResource<>(new Object()),
135+
DataSource.LOCAL,
136+
/*isLoadedFromAlternateCacheKey=*/ false);
132137

133138
verify(listener1)
134139
.onResourceReady(any(), any(), isA(Target.class), isA(DataSource.class), anyBoolean());
@@ -140,7 +145,12 @@ public void testMultipleRequestListeners() {
140145
public void testListenerApiOverridesListeners() {
141146
getNullModelRequest().addListener(listener1).listener(listener2).into(target);
142147
verify(requestManager).track(any(Target.class), requestCaptor.capture());
143-
requestCaptor.getValue().onResourceReady(new SimpleResource<>(new Object()), DataSource.LOCAL);
148+
requestCaptor
149+
.getValue()
150+
.onResourceReady(
151+
new SimpleResource<>(new Object()),
152+
DataSource.LOCAL,
153+
/*isLoadedFromAlternateCacheKey=*/ false);
144154

145155
// The #listener API removes any previous listeners, so the first listener should not be called.
146156
verify(listener1, never())

0 commit comments

Comments
 (0)