24
24
import com .bumptech .glide .util .Util ;
25
25
import com .bumptech .glide .util .pool .FactoryPools ;
26
26
import com .bumptech .glide .util .pool .StateVerifier ;
27
+ import java .util .List ;
27
28
28
29
/**
29
30
* A {@link Request} that loads a {@link com.bumptech.glide.load.engine.Resource} into a given
@@ -103,7 +104,7 @@ private enum Status {
103
104
private int overrideHeight ;
104
105
private Priority priority ;
105
106
private Target <R > target ;
106
- private RequestListener <R > requestListener ;
107
+ @ Nullable private List < RequestListener <R >> requestListeners ;
107
108
private Engine engine ;
108
109
private TransitionFactory <? super R > animationFactory ;
109
110
private Resource <R > resource ;
@@ -127,7 +128,7 @@ public static <R> SingleRequest<R> obtain(
127
128
Priority priority ,
128
129
Target <R > target ,
129
130
RequestListener <R > targetListener ,
130
- RequestListener <R > requestListener ,
131
+ @ Nullable List < RequestListener <R >> requestListeners ,
131
132
RequestCoordinator requestCoordinator ,
132
133
Engine engine ,
133
134
TransitionFactory <? super R > animationFactory ) {
@@ -147,7 +148,7 @@ public static <R> SingleRequest<R> obtain(
147
148
priority ,
148
149
target ,
149
150
targetListener ,
150
- requestListener ,
151
+ requestListeners ,
151
152
requestCoordinator ,
152
153
engine ,
153
154
animationFactory );
@@ -171,7 +172,7 @@ private void init(
171
172
Priority priority ,
172
173
Target <R > target ,
173
174
RequestListener <R > targetListener ,
174
- RequestListener <R > requestListener ,
175
+ @ Nullable List < RequestListener <R >> requestListeners ,
175
176
RequestCoordinator requestCoordinator ,
176
177
Engine engine ,
177
178
TransitionFactory <? super R > animationFactory ) {
@@ -185,7 +186,7 @@ private void init(
185
186
this .priority = priority ;
186
187
this .target = target ;
187
188
this .targetListener = targetListener ;
188
- this .requestListener = requestListener ;
189
+ this .requestListeners = requestListeners ;
189
190
this .requestCoordinator = requestCoordinator ;
190
191
this .engine = engine ;
191
192
this .animationFactory = animationFactory ;
@@ -209,7 +210,7 @@ public void recycle() {
209
210
overrideWidth = -1 ;
210
211
overrideHeight = -1 ;
211
212
target = null ;
212
- requestListener = null ;
213
+ requestListeners = null ;
213
214
targetListener = null ;
214
215
requestCoordinator = null ;
215
216
animationFactory = null ;
@@ -570,10 +571,18 @@ private void onResourceReady(Resource<R> resource, R result, DataSource dataSour
570
571
571
572
isCallingCallbacks = true ;
572
573
try {
573
- if ((requestListener == null
574
- || !requestListener .onResourceReady (result , model , target , dataSource , isFirstResource ))
575
- && (targetListener == null
576
- || !targetListener .onResourceReady (result , model , target , dataSource , isFirstResource ))) {
574
+ boolean anyListenerHandledUpdatingTarget = false ;
575
+ if (requestListeners != null ) {
576
+ for (RequestListener <R > listener : requestListeners ) {
577
+ anyListenerHandledUpdatingTarget |=
578
+ listener .onResourceReady (result , model , target , dataSource , isFirstResource );
579
+ }
580
+ }
581
+ anyListenerHandledUpdatingTarget |=
582
+ targetListener != null
583
+ && targetListener .onResourceReady (result , model , target , dataSource , isFirstResource );
584
+
585
+ if (!anyListenerHandledUpdatingTarget ) {
577
586
Transition <? super R > animation =
578
587
animationFactory .build (dataSource , isFirstResource );
579
588
target .onResourceReady (result , animation );
@@ -609,10 +618,18 @@ private void onLoadFailed(GlideException e, int maxLogLevel) {
609
618
isCallingCallbacks = true ;
610
619
try {
611
620
//TODO: what if this is a thumbnail request?
612
- if ((requestListener == null
613
- || !requestListener .onLoadFailed (e , model , target , isFirstReadyResource ()))
614
- && (targetListener == null
615
- || !targetListener .onLoadFailed (e , model , target , isFirstReadyResource ()))) {
621
+ boolean anyListenerHandledUpdatingTarget = false ;
622
+ if (requestListeners != null ) {
623
+ for (RequestListener <R > listener : requestListeners ) {
624
+ anyListenerHandledUpdatingTarget |=
625
+ listener .onLoadFailed (e , model , target , isFirstReadyResource ());
626
+ }
627
+ }
628
+ anyListenerHandledUpdatingTarget |=
629
+ targetListener != null
630
+ && targetListener .onLoadFailed (e , model , target , isFirstReadyResource ());
631
+
632
+ if (!anyListenerHandledUpdatingTarget ) {
616
633
setErrorPlaceholder ();
617
634
}
618
635
} finally {
@@ -633,14 +650,19 @@ public boolean isEquivalentTo(Request o) {
633
650
&& requestOptions .equals (that .requestOptions )
634
651
&& priority == that .priority
635
652
// We do not want to require that RequestListeners implement equals/hashcode, so we don't
636
- // compare them using equals(). We can however, at least assert that the request listener
637
- // is either present or not present in both requests.
638
- && (requestListener != null
639
- ? that .requestListener != null : that .requestListener == null );
653
+ // compare them using equals(). We can however, at least assert that the same amount of
654
+ // request listeners are present in both requests
655
+ && listenerCountEquals (this , that );
640
656
}
641
657
return false ;
642
658
}
643
659
660
+ private static boolean listenerCountEquals (SingleRequest <?> first , SingleRequest <?> second ) {
661
+ int firstListenerCount = first .requestListeners == null ? 0 : first .requestListeners .size ();
662
+ int secondListenerCount = second .requestListeners == null ? 0 : second .requestListeners .size ();
663
+ return firstListenerCount == secondListenerCount ;
664
+ }
665
+
644
666
private void logV (String message ) {
645
667
Log .v (TAG , message + " this: " + tag );
646
668
}
0 commit comments