Skip to content

Commit 8d6d9ad

Browse files
committed
Merge pull request square#399 from codecrafters/targetAction
fix square#397, make TargetAction use errorResId and errorDrawable
2 parents d066c11 + 55543d3 commit 8d6d9ad

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

picasso/src/main/java/com/squareup/picasso/RequestCreator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,8 @@ public void into(Target target) {
329329

330330
target.onPrepareLoad(drawable);
331331

332-
Action action = new TargetAction(picasso, target, finalData, skipMemoryCache, requestKey);
332+
Action action = new TargetAction(picasso, target, finalData, skipMemoryCache, errorResId,
333+
errorDrawable, requestKey);
333334
picasso.enqueueAndSubmit(action);
334335
}
335336

picasso/src/main/java/com/squareup/picasso/Target.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,21 @@ public interface Target {
3737
*/
3838
void onBitmapLoaded(Bitmap bitmap, LoadedFrom from);
3939

40-
/** Callback indicating the image could not be successfully loaded. */
40+
/**
41+
* Callback indicating the image could not be successfully loaded.
42+
* <p/>
43+
* <strong>Note:</strong> The passed {@link Drawable} may be {@code null} if none has been
44+
* specified via {@link RequestCreator#error(android.graphics.drawable.Drawable)}
45+
* or {@link RequestCreator#error(int)}.
46+
*/
4147
void onBitmapFailed(Drawable errorDrawable);
4248

43-
/** Callback invoked right before your request is submitted. */
49+
/**
50+
* Callback invoked right before your request is submitted.
51+
* <p/>
52+
* <strong>Note:</strong> The passed {@link Drawable} may be {@code null} if none has been
53+
* specified via {@link RequestCreator#placeholder(android.graphics.drawable.Drawable)}
54+
* or {@link RequestCreator#placeholder(int)}.
55+
*/
4456
void onPrepareLoad(Drawable placeHolderDrawable);
4557
}

picasso/src/main/java/com/squareup/picasso/TargetAction.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
package com.squareup.picasso;
1717

1818
import android.graphics.Bitmap;
19+
import android.graphics.drawable.Drawable;
1920

2021
final class TargetAction extends Action<Target> {
2122

22-
TargetAction(Picasso picasso, Target target, Request data, boolean skipCache, String key) {
23-
super(picasso, target, data, skipCache, false, 0, null, key);
23+
TargetAction(Picasso picasso, Target target, Request data, boolean skipCache,
24+
int errorResId, Drawable errorDrawable, String key) {
25+
super(picasso, target, data, skipCache, false, errorResId, errorDrawable, key);
2426
}
2527

2628
@Override void complete(Bitmap result, Picasso.LoadedFrom from) {
@@ -40,7 +42,11 @@ final class TargetAction extends Action<Target> {
4042
@Override void error() {
4143
Target target = getTarget();
4244
if (target != null) {
43-
target.onBitmapFailed(errorDrawable);
45+
if (errorResId != 0) {
46+
target.onBitmapFailed(picasso.context.getResources().getDrawable(errorResId));
47+
} else {
48+
target.onBitmapFailed(errorDrawable);
49+
}
4450
}
4551
}
4652
}

picasso/src/test/java/com/squareup/picasso/TargetActionTest.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package com.squareup.picasso;
1717

18+
import android.content.Context;
19+
import android.content.res.Resources;
1820
import android.graphics.Bitmap;
1921
import android.graphics.drawable.Drawable;
2022
import org.junit.Test;
@@ -23,13 +25,16 @@
2325
import org.robolectric.annotation.Config;
2426

2527
import static com.squareup.picasso.Picasso.LoadedFrom.MEMORY;
28+
import static com.squareup.picasso.Picasso.RequestTransformer.IDENTITY;
2629
import static com.squareup.picasso.TestUtils.BITMAP_1;
2730
import static com.squareup.picasso.TestUtils.BITMAP_3;
31+
import static com.squareup.picasso.TestUtils.RESOURCE_ID_1;
2832
import static com.squareup.picasso.TestUtils.URI_KEY_1;
2933
import static com.squareup.picasso.TestUtils.mockTarget;
3034
import static org.junit.Assert.fail;
3135
import static org.mockito.Mockito.mock;
3236
import static org.mockito.Mockito.verify;
37+
import static org.mockito.Mockito.when;
3338

3439
@RunWith(RobolectricTestRunner.class)
3540
@Config(manifest = Config.NONE)
@@ -38,24 +43,42 @@ public class TargetActionTest {
3843
@Test(expected = AssertionError.class)
3944
public void throwsErrorWithNullResult() throws Exception {
4045
TargetAction request =
41-
new TargetAction(mock(Picasso.class), mockTarget(), null, false, URI_KEY_1);
46+
new TargetAction(mock(Picasso.class), mockTarget(), null, false, 0, null, URI_KEY_1);
4247
request.complete(null, MEMORY);
4348
}
4449

4550
@Test
4651
public void invokesSuccessIfTargetIsNotNull() throws Exception {
4752
Target target = mockTarget();
48-
TargetAction request = new TargetAction(mock(Picasso.class), target, null, false, URI_KEY_1);
53+
TargetAction request = new TargetAction(mock(Picasso.class), target, null, false, 0, null, URI_KEY_1);
4954
request.complete(BITMAP_3, MEMORY);
5055
verify(target).onBitmapLoaded(BITMAP_3, MEMORY);
5156
}
5257

5358
@Test
54-
public void invokesErrorIfTargetIsNotNull() throws Exception {
59+
public void invokesOnBitmapFailedIfTargetIsNotNullWithErrorDrawable() throws Exception {
60+
Drawable errorDrawable = mock(Drawable.class);
5561
Target target = mockTarget();
56-
TargetAction request = new TargetAction(mock(Picasso.class), target, null, false, URI_KEY_1);
62+
TargetAction request = new TargetAction(mock(Picasso.class), target, null, false, 0, errorDrawable, URI_KEY_1);
5763
request.error();
58-
verify(target).onBitmapFailed(null);
64+
verify(target).onBitmapFailed(errorDrawable);
65+
}
66+
67+
@Test
68+
public void invokesOnBitmapFailedIfTargetIsNotNullWithErrorResourceId() throws Exception {
69+
Drawable errorDrawable = mock(Drawable.class);
70+
Target target = mockTarget();
71+
Context context = mock(Context.class);
72+
Picasso picasso =
73+
new Picasso(context, mock(Dispatcher.class), Cache.NONE, null, IDENTITY,
74+
mock(Stats.class), true);
75+
Resources res = mock(Resources.class);
76+
TargetAction request = new TargetAction(picasso, target, null, false, RESOURCE_ID_1, null, URI_KEY_1);
77+
78+
when(context.getResources()).thenReturn(res);
79+
when(res.getDrawable(RESOURCE_ID_1)).thenReturn(errorDrawable);
80+
request.error();
81+
verify(target).onBitmapFailed(errorDrawable);
5982
}
6083

6184
@Test public void recyclingInSuccessThrowsException() {
@@ -74,7 +97,7 @@ public void invokesErrorIfTargetIsNotNull() throws Exception {
7497
};
7598
Picasso picasso = mock(Picasso.class);
7699

77-
TargetAction tr = new TargetAction(picasso, bad, null, false, URI_KEY_1);
100+
TargetAction tr = new TargetAction(picasso, bad, null, false, 0, null, URI_KEY_1);
78101
try {
79102
tr.complete(BITMAP_1, MEMORY);
80103
fail();

0 commit comments

Comments
 (0)