aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Newberger <alann@google.com>2014-11-12 21:54:37 +0000
committerandroid-build-merger <android-build-merger@google.com>2014-11-12 21:54:37 +0000
commit2e9a1399a2c4d60d08bd4815c8c3ae1e0ef5a461 (patch)
tree4d5d5d6aa2ddcd577f2e6177681f21ce542daa07
parent474e217811664f6f62bb7801c5785b236f924226 (diff)
parent56058fb1edadec8c92e604e74bde41cdf612a78e (diff)
downloadglide-2e9a1399a2c4d60d08bd4815c8c3ae1e0ef5a461.tar.gz
Add support for recursive thumbnail calls.
automerge: 56058fb * commit '56058fb1edadec8c92e604e74bde41cdf612a78e': Add support for recursive thumbnail calls.
-rw-r--r--library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java70
-rw-r--r--library/src/main/java/com/bumptech/glide/request/ThumbnailRequestCoordinator.java31
2 files changed, 59 insertions, 42 deletions
diff --git a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java
index ba25c8db..a16469e7 100644
--- a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java
+++ b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java
@@ -550,17 +550,28 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
return into(glide.buildImageViewTarget(view, transcodeClass));
}
- private Request buildRequest(Target<TranscodeType> target) {
- final Request result;
+ private Priority getThumbnailPriority() {
+ final Priority result;
+ if (priority == Priority.LOW) {
+ result = Priority.NORMAL;
+ } else if (priority == Priority.NORMAL) {
+ result = Priority.HIGH;
+ } else {
+ result = Priority.IMMEDIATE;
+ }
+ return result;
+ }
+ private Request buildRequest(Target<TranscodeType> target) {
if (priority == null) {
priority = Priority.NORMAL;
}
+ return buildRequestRecursive(target, null);
+ }
+ private Request buildRequestRecursive(Target<TranscodeType> target, ThumbnailRequestCoordinator parentCoordinator) {
if (thumbnailRequestBuilder != null) {
- ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator();
- Request fullRequest = buildRequest(target, sizeMultiplier, priority, requestCoordinator);
-
+ // Recursive case: contains a potentially recursive thumbnail request builder.
if (thumbnailRequestBuilder.animationFactory.equals(NoAnimation.getFactory())) {
thumbnailRequestBuilder.animationFactory = animationFactory;
}
@@ -573,48 +584,31 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
thumbnailRequestBuilder.priority = getThumbnailPriority();
}
- Request thumbnailRequest = thumbnailRequestBuilder.buildRequest(target,
- thumbnailRequestBuilder.sizeMultiplier, thumbnailRequestBuilder.priority, requestCoordinator);
-
- requestCoordinator.setRequests(fullRequest, thumbnailRequest);
- result = requestCoordinator;
+ ThumbnailRequestCoordinator coordinator = new ThumbnailRequestCoordinator(parentCoordinator);
+ Request fullRequest = obtainRequest(target, sizeMultiplier, priority, coordinator);
+ // Recursively generate thumbnail requests.
+ Request thumbRequest = thumbnailRequestBuilder.buildRequestRecursive(target, coordinator);
+ coordinator.setRequests(fullRequest, thumbRequest);
+ return coordinator;
} else if (thumbSizeMultiplier != null) {
- ThumbnailRequestCoordinator requestCoordinator = new ThumbnailRequestCoordinator();
- Request fullRequest = buildRequest(target, sizeMultiplier, priority, requestCoordinator);
- Request thumbnailRequest = buildRequest(target, thumbSizeMultiplier, getThumbnailPriority(),
- requestCoordinator);
- requestCoordinator.setRequests(fullRequest, thumbnailRequest);
- result = requestCoordinator;
+ // Base case: thumbnail multiplier generates a thumbnail request, but cannot recurse.
+ ThumbnailRequestCoordinator coordinator = new ThumbnailRequestCoordinator(parentCoordinator);
+ Request fullRequest = obtainRequest(target, sizeMultiplier, priority, coordinator);
+ Request thumbnailRequest = obtainRequest(target, thumbSizeMultiplier, getThumbnailPriority(), coordinator);
+ coordinator.setRequests(fullRequest, thumbnailRequest);
+ return coordinator;
} else {
- result = buildRequest(target, sizeMultiplier, priority, null);
+ // Base case: no thumbnail.
+ return obtainRequest(target, sizeMultiplier, priority, parentCoordinator);
}
- return result;
}
- private Priority getThumbnailPriority() {
- final Priority result;
- if (priority == Priority.LOW) {
- result = Priority.NORMAL;
- } else if (priority == Priority.NORMAL) {
- result = Priority.HIGH;
- } else {
- result = Priority.IMMEDIATE;
- }
- return result;
- }
-
- private Request buildRequest(Target<TranscodeType> target, float sizeMultiplier, Priority priority,
+ private <Z> Request obtainRequest(Target<TranscodeType> target, float sizeMultiplier, Priority priority,
RequestCoordinator requestCoordinator) {
if (model == null) {
- return buildRequestForDataType(target, loadProvider, sizeMultiplier, priority, null);
- } else {
- return buildRequestForDataType(target, loadProvider, sizeMultiplier, priority, requestCoordinator);
+ requestCoordinator = null;
}
- }
- private <Z> Request buildRequestForDataType(Target<TranscodeType> target,
- LoadProvider<ModelType, Z, ResourceType, TranscodeType> loadProvider, float sizeMultiplier,
- Priority priority, RequestCoordinator requestCoordinator) {
return GenericRequest.obtain(
loadProvider,
model,
diff --git a/library/src/main/java/com/bumptech/glide/request/ThumbnailRequestCoordinator.java b/library/src/main/java/com/bumptech/glide/request/ThumbnailRequestCoordinator.java
index 319211b1..d5ec86c1 100644
--- a/library/src/main/java/com/bumptech/glide/request/ThumbnailRequestCoordinator.java
+++ b/library/src/main/java/com/bumptech/glide/request/ThumbnailRequestCoordinator.java
@@ -7,6 +7,15 @@ package com.bumptech.glide.request;
public class ThumbnailRequestCoordinator implements RequestCoordinator, Request {
private Request full;
private Request thumb;
+ private RequestCoordinator coordinator;
+
+ public ThumbnailRequestCoordinator() {
+ this(null);
+ }
+
+ public ThumbnailRequestCoordinator(RequestCoordinator coordinator) {
+ this.coordinator = coordinator;
+ }
public void setRequests(Request full, Request thumb) {
this.full = full;
@@ -15,17 +24,29 @@ public class ThumbnailRequestCoordinator implements RequestCoordinator, Request
@Override
public boolean canSetImage(Request request) {
- return request == full || !full.isComplete();
+ return parentCanSetImage() && (request == full || !full.isComplete());
+ }
+
+ private boolean parentCanSetImage() {
+ return coordinator == null || coordinator.canSetImage(this);
}
@Override
public boolean canSetPlaceholder(Request request) {
- return request == full && !isAnyRequestComplete();
+ return parentCanSetPlaceholder() && (request == full && !isAnyRequestComplete());
+ }
+
+ private boolean parentCanSetPlaceholder() {
+ return coordinator == null || coordinator.canSetPlaceholder(this);
}
@Override
public boolean isAnyRequestComplete() {
- return full.isComplete() || thumb.isComplete();
+ return parentIsAnyRequestComplete() || full.isComplete() || thumb.isComplete();
+ }
+
+ private boolean parentIsAnyRequestComplete() {
+ return coordinator != null && coordinator.isAnyRequestComplete();
}
@Override
@@ -51,7 +72,9 @@ public class ThumbnailRequestCoordinator implements RequestCoordinator, Request
@Override
public boolean isComplete() {
- return full.isComplete();
+ // TODO: this is a little strange, but we often want to avoid restarting the request or
+ // setting placeholders even if only the thumb is complete.
+ return full.isComplete() || thumb.isComplete();
}
@Override