diff options
author | Alan Newberger <alann@google.com> | 2014-11-12 21:54:37 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2014-11-12 21:54:37 +0000 |
commit | 2e9a1399a2c4d60d08bd4815c8c3ae1e0ef5a461 (patch) | |
tree | 4d5d5d6aa2ddcd577f2e6177681f21ce542daa07 | |
parent | 474e217811664f6f62bb7801c5785b236f924226 (diff) | |
parent | 56058fb1edadec8c92e604e74bde41cdf612a78e (diff) | |
download | glide-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.java | 70 | ||||
-rw-r--r-- | library/src/main/java/com/bumptech/glide/request/ThumbnailRequestCoordinator.java | 31 |
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 |