@@ -78,14 +78,16 @@ public void tearDown() {
78
78
@ NonNull
79
79
private GifFrameLoader createGifFrameLoader (Handler handler ) {
80
80
Glide glide = getGlideSingleton ();
81
- return new GifFrameLoader (
81
+ GifFrameLoader result = new GifFrameLoader (
82
82
glide .getBitmapPool (),
83
83
requestManager ,
84
84
gifDecoder ,
85
85
handler ,
86
86
requestBuilder ,
87
87
transformation ,
88
88
firstFrame );
89
+ result .subscribe (callback );
90
+ return result ;
89
91
}
90
92
91
93
private static Glide getGlideSingleton () {
@@ -95,10 +97,11 @@ private static Glide getGlideSingleton() {
95
97
@ SuppressWarnings ("unchecked" )
96
98
@ Test
97
99
public void testSetFrameTransformationSetsTransformationOnRequestBuilder () {
100
+ verify (requestBuilder , times (2 )).apply (isA (RequestOptions .class ));
98
101
Transformation <Bitmap > transformation = mock (Transformation .class );
99
102
loader .setFrameTransformation (transformation , firstFrame );
100
103
101
- verify (requestBuilder , times (2 )).apply (isA (RequestOptions .class ));
104
+ verify (requestBuilder , times (3 )).apply (isA (RequestOptions .class ));
102
105
}
103
106
104
107
@ Test (expected = NullPointerException .class )
@@ -115,15 +118,11 @@ public void testReturnsSizeFromGifDecoderAndCurrentFrame() {
115
118
116
119
@ Test
117
120
public void testStartGetsNextFrameIfNotStartedAndWithNoLoadPending () {
118
- loader .subscribe (callback );
119
-
120
121
verify (requestBuilder ).into (aTarget ());
121
122
}
122
123
123
124
@ Test
124
125
public void testGetNextFrameIncrementsSignatureAndAdvancesDecoderBeforeStartingLoad () {
125
- loader .subscribe (callback );
126
-
127
126
InOrder order = inOrder (gifDecoder , requestBuilder );
128
127
order .verify (gifDecoder ).advance ();
129
128
order .verify (requestBuilder ).apply (isA (RequestOptions .class ));
@@ -147,22 +146,22 @@ public void testGetCurrentFrameReturnsCurrentBitmapAfterLoadHasCompleted() {
147
146
148
147
@ Test
149
148
public void testStartDoesNotStartIfAlreadyRunning () {
150
- loader .subscribe (callback );
151
149
loader .subscribe (mock (FrameCallback .class ));
152
150
153
151
verify (requestBuilder , times (1 )).into (aTarget ());
154
152
}
155
153
156
154
@ Test
157
155
public void testGetNextFrameDoesNotStartLoadIfLoaderIsNotRunning () {
156
+ verify (requestBuilder , times (1 )).into (aTarget ());
157
+ loader .unsubscribe (callback );
158
158
loader .onFrameReady (mock (DelayTarget .class ));
159
159
160
- verify (requestBuilder , never ( )).into (aTarget ());
160
+ verify (requestBuilder , times ( 1 )).into (aTarget ());
161
161
}
162
162
163
163
@ Test
164
164
public void testGetNextFrameDoesNotStartLoadIfLoadIsInProgress () {
165
- loader .subscribe (callback );
166
165
loader .unsubscribe (callback );
167
166
loader .subscribe (callback );
168
167
@@ -171,7 +170,6 @@ public void testGetNextFrameDoesNotStartLoadIfLoadIsInProgress() {
171
170
172
171
@ Test
173
172
public void testGetNextFrameDoesStartLoadIfRestartedAndNoLoadIsInProgress () {
174
- loader .subscribe (callback );
175
173
loader .unsubscribe (callback );
176
174
177
175
loader .onFrameReady (mock (DelayTarget .class ));
@@ -182,7 +180,6 @@ public void testGetNextFrameDoesStartLoadIfRestartedAndNoLoadIsInProgress() {
182
180
183
181
@ Test
184
182
public void testGetNextFrameDoesStartLoadAfterLoadCompletesIfStarted () {
185
- loader .subscribe (callback );
186
183
loader .onFrameReady (mock (DelayTarget .class ));
187
184
188
185
verify (requestBuilder , times (2 )).into (aTarget ());
@@ -269,6 +266,97 @@ public void testClearsCompletedLoadOnFrameReadyIfCleared() {
269
266
assertNull (loader .getCurrentFrame ());
270
267
}
271
268
269
+ @ Test
270
+ public void onFrameReady_whenNotRunning_doesNotClearPreviouslyLoadedImage () {
271
+ loader = createGifFrameLoader (/*handler=*/ null );
272
+ DelayTarget loaded = mock (DelayTarget .class );
273
+ when (loaded .getResource ()).thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
274
+ loader .onFrameReady (loaded );
275
+ loader .unsubscribe (callback );
276
+
277
+ DelayTarget nextFrame = mock (DelayTarget .class );
278
+ when (nextFrame .getResource ())
279
+ .thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
280
+ loader .onFrameReady (nextFrame );
281
+ verify (requestManager , never ()).clear (loaded );
282
+ }
283
+
284
+ @ Test
285
+ public void onFrameReady_whenNotRunning_clearsPendingFrameOnClear () {
286
+ loader = createGifFrameLoader (/*handler=*/ null );
287
+ DelayTarget loaded = mock (DelayTarget .class );
288
+ when (loaded .getResource ()).thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
289
+ loader .onFrameReady (loaded );
290
+ loader .unsubscribe (callback );
291
+
292
+ DelayTarget nextFrame = mock (DelayTarget .class );
293
+ when (nextFrame .getResource ())
294
+ .thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
295
+ loader .onFrameReady (nextFrame );
296
+
297
+ loader .clear ();
298
+ verify (requestManager ).clear (loaded );
299
+ verify (requestManager ).clear (nextFrame );
300
+ }
301
+
302
+ @ Test
303
+ public void onFrameReady_whenNotRunning_clearsOldFrameOnStart () {
304
+ loader = createGifFrameLoader (/*handler=*/ null );
305
+ DelayTarget loaded = mock (DelayTarget .class );
306
+ when (loaded .getResource ()).thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
307
+ loader .onFrameReady (loaded );
308
+ loader .unsubscribe (callback );
309
+
310
+ DelayTarget nextFrame = mock (DelayTarget .class );
311
+ when (nextFrame .getResource ())
312
+ .thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
313
+ loader .onFrameReady (nextFrame );
314
+
315
+ loader .subscribe (callback );
316
+ verify (requestManager ).clear (loaded );
317
+ }
318
+
319
+ @ Test
320
+ public void onFrameReady_whenNotRunning_callsFrameReadyWithNewFrameOnStart () {
321
+ loader = createGifFrameLoader (/*handler=*/ null );
322
+ DelayTarget loaded = mock (DelayTarget .class );
323
+ when (loaded .getResource ()).thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
324
+ loader .onFrameReady (loaded );
325
+ loader .unsubscribe (callback );
326
+
327
+ DelayTarget nextFrame = mock (DelayTarget .class );
328
+ Bitmap expected = Bitmap .createBitmap (200 , 200 , Bitmap .Config .ARGB_8888 );
329
+ when (nextFrame .getResource ())
330
+ .thenReturn (expected );
331
+ loader .onFrameReady (nextFrame );
332
+
333
+ verify (callback , times (1 )).onFrameReady ();
334
+ loader .subscribe (callback );
335
+ verify (callback , times (2 )).onFrameReady ();
336
+ assertThat (loader .getCurrentFrame ()).isEqualTo (expected );
337
+ }
338
+
339
+ @ Test
340
+ public void startFromFirstFrame_withPendingFrame_clearsPendingFrame () {
341
+ loader = createGifFrameLoader (/*handler=*/ null );
342
+ DelayTarget loaded = mock (DelayTarget .class );
343
+ when (loaded .getResource ()).thenReturn (Bitmap .createBitmap (100 , 100 , Bitmap .Config .ARGB_8888 ));
344
+ loader .onFrameReady (loaded );
345
+ loader .unsubscribe (callback );
346
+
347
+ DelayTarget nextFrame = mock (DelayTarget .class );
348
+ Bitmap expected = Bitmap .createBitmap (200 , 200 , Bitmap .Config .ARGB_8888 );
349
+ when (nextFrame .getResource ())
350
+ .thenReturn (expected );
351
+ loader .onFrameReady (nextFrame );
352
+
353
+ loader .setNextStartFromFirstFrame ();
354
+ verify (requestManager ).clear (nextFrame );
355
+
356
+ loader .subscribe (callback );
357
+ verify (callback , times (1 )).onFrameReady ();
358
+ }
359
+
272
360
@ SuppressWarnings ("unchecked" )
273
361
private static Target <Bitmap > aTarget () {
274
362
return isA (Target .class );
0 commit comments