提交 1bd66cb3 编写于 作者: S Sam Judd

Always return new copy in DrawableResource.

Fixes #276
上级 b6763aea
package com.bumptech.glide.load.resource.drawable; package com.bumptech.glide.load.resource.drawable;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
...@@ -38,18 +39,18 @@ public class DrawableResourceTest { ...@@ -38,18 +39,18 @@ public class DrawableResourceTest {
} }
@Test @Test
public void testReturnsDrawableOnFirstGet() { public void testDoesNotReturnOriginalDrawableOnGet() {
assertEquals(drawable, resource.get()); when(drawable.getConstantState()).thenReturn(mock(Drawable.ConstantState.class));
assertNotEquals(drawable, resource.get());
} }
@Test @Test
public void testReturnsNewDrawableOnSecondGet() { public void testReturnsNewDrawableOnGet() {
GifDrawable expected = mock(GifDrawable.class); GifDrawable expected = mock(GifDrawable.class);
Drawable.ConstantState constantState = mock(Drawable.ConstantState.class); Drawable.ConstantState constantState = mock(Drawable.ConstantState.class);
when(constantState.newDrawable()).thenReturn(expected); when(constantState.newDrawable()).thenReturn(expected);
when(drawable.getConstantState()).thenReturn(constantState); when(drawable.getConstantState()).thenReturn(constantState);
assertEquals(drawable, resource.get());
assertEquals(expected, resource.get()); assertEquals(expected, resource.get());
verify(drawable).getConstantState(); verify(drawable).getConstantState();
......
...@@ -6,7 +6,6 @@ import static org.mockito.Mockito.mock; ...@@ -6,7 +6,6 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import com.bumptech.glide.util.Util; import com.bumptech.glide.util.Util;
...@@ -29,22 +28,6 @@ public class GifDrawableResourceTest { ...@@ -29,22 +28,6 @@ public class GifDrawableResourceTest {
resource = new GifDrawableResource(drawable); resource = new GifDrawableResource(drawable);
} }
@Test
public void testReturnsDrawableOnFirstGet() {
assertEquals(drawable, resource.get());
}
@Test
public void testReturnsNewDrawableOnSecondGet() {
GifDrawable expected = mock(GifDrawable.class);
Drawable.ConstantState constantState = mock(Drawable.ConstantState.class);
when(constantState.newDrawable()).thenReturn(expected);
when(drawable.getConstantState()).thenReturn(constantState);
resource.get();
assertEquals(expected, resource.get());
}
@Test @Test
public void testReturnsDrawableSizePlusFirstFrameSize() { public void testReturnsDrawableSizePlusFirstFrameSize() {
final int size = 2134; final int size = 2134;
......
...@@ -15,7 +15,6 @@ import com.bumptech.glide.load.engine.Resource; ...@@ -15,7 +15,6 @@ import com.bumptech.glide.load.engine.Resource;
*/ */
public abstract class DrawableResource<T extends Drawable> implements Resource<T> { public abstract class DrawableResource<T extends Drawable> implements Resource<T> {
protected final T drawable; protected final T drawable;
private boolean returnedOriginalDrawable;
public DrawableResource(T drawable) { public DrawableResource(T drawable) {
if (drawable == null) { if (drawable == null) {
...@@ -25,14 +24,11 @@ public abstract class DrawableResource<T extends Drawable> implements Resource<T ...@@ -25,14 +24,11 @@ public abstract class DrawableResource<T extends Drawable> implements Resource<T
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
// drawables should always return a copy of the same class
@Override @Override
public final T get() { public final T get() {
if (!returnedOriginalDrawable) { // Drawables contain temporary state related to how they're being displayed (alpha, color filter etc), so
returnedOriginalDrawable = true; // return a new copy each time. If we ever return the original drawable, it's temporary state may be changed
return drawable; // and subsequent copies may end up with that temporary state. See #276.
} else {
return (T) drawable.getConstantState().newDrawable(); return (T) drawable.getConstantState().newDrawable();
} }
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册