Recorded painted path should not mutate.
diff --git a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java
index e41f742..995bce9 100644
--- a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java
+++ b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java
@@ -161,7 +161,7 @@
@Implementation
public void drawPath(Path path, Paint paint) {
- pathPaintEvents.add(new PathPaintHistoryEvent(new Path(path), paint));
+ pathPaintEvents.add(new PathPaintHistoryEvent(new Path(path), new Paint(paint)));
separateLines();
appendDescription("Path " + shadowOf(path).getPoints().toString());
diff --git a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java
index 5576fae..1f37c18 100644
--- a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java
+++ b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java
@@ -12,6 +12,7 @@
import org.robolectric.util.ReflectionHelpers.ClassParameter;
import static android.os.Build.VERSION_CODES.N;
+import static org.robolectric.Shadows.shadowOf;
/**
* Shadow for {@link android.graphics.Paint}.
@@ -44,10 +45,31 @@
public void __constructor__(int flags) {
this.flags = flags;
- antiAlias = (flags & Paint.ANTI_ALIAS_FLAG) == Paint.ANTI_ALIAS_FLAG;
Shadow.invokeConstructor(Paint.class, paint, ClassParameter.from(int.class, flags));
}
+ public void __constructor__(Paint paint) {
+ ShadowPaint other = shadowOf(paint);
+ this.color = other.color;
+ this.style = other.style;
+ this.cap = other.cap;
+ this.join = other.join;
+ this.width = other.width;
+ this.shadowRadius = other.shadowRadius;
+ this.shadowDx = other.shadowDx;
+ this.shadowDy = other.shadowDy;
+ this.shadowColor = other.shadowColor;
+ this.shader = other.shader;
+ this.alpha = other.alpha;
+ this.filter = other.filter;
+ this.antiAlias = other.antiAlias;
+ this.dither = other.dither;
+ this.flags = other.flags;
+ this.pathEffect = other.pathEffect;
+
+ Shadow.invokeConstructor(Paint.class, paint, ClassParameter.from(Paint.class, paint));
+ }
+
@Implementation(minSdk = N)
public static long nInit() {
return 1;
@@ -59,6 +81,11 @@
}
@Implementation
+ public void setFlags(int flags) {
+ this.flags = flags;
+ }
+
+ @Implementation
public Shader setShader(Shader shader) {
this.shader = shader;
return shader;
@@ -245,7 +272,7 @@
@Implementation
public void setAntiAlias(boolean antiAlias) {
- this.antiAlias = antiAlias;
+ this.flags = (flags & ~Paint.ANTI_ALIAS_FLAG) | (antiAlias ? Paint.ANTI_ALIAS_FLAG : 0);
}
@Implementation
@@ -260,7 +287,7 @@
@Implementation
public final boolean isAntiAlias() {
- return antiAlias;
+ return (flags & Paint.ANTI_ALIAS_FLAG) == Paint.ANTI_ALIAS_FLAG;
}
@Implementation
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
index eb385c9..643f7c8 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
@@ -101,13 +101,21 @@
path.lineTo(10, 10);
Paint paint = new Paint();
+ paint.setColor(Color.RED);
paint.setAlpha(7);
canvas.drawPath(path, paint);
+ // changing the values on this Paint shouldn't affect recorded painted path
+ paint.setColor(Color.BLUE);
+ paint.setAlpha(8);
+
ShadowCanvas shadow = shadowOf(canvas);
assertThat(shadow.getPathPaintHistoryCount()).isEqualTo(1);
- assertEquals(shadowOf(shadow.getDrawnPath(0)).getPoints().get(0), new ShadowPath.Point(10, 10, LINE_TO));
- assertThat(shadow.getDrawnPathPaint(0)).isEqualTo(paint);
+ ShadowPath drawnPath = shadowOf(shadow.getDrawnPath(0));
+ assertEquals(drawnPath.getPoints().get(0), new ShadowPath.Point(10, 10, LINE_TO));
+ Paint drawnPathPaint = shadow.getDrawnPathPaint(0);
+ assertThat(drawnPathPaint.getColor()).isEqualTo(Color.RED);
+ assertThat(drawnPathPaint.getAlpha()).isEqualTo(7);
}
@Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
index a427c37..e1985b9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
@@ -1,5 +1,6 @@
package org.robolectric.shadows;
+import android.graphics.Color;
import android.graphics.Paint;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -31,6 +32,8 @@
ShadowPaint shadowPaint = shadowOf(paint);
shadowPaint.setAntiAlias(true);
assertTrue(paint.isAntiAlias());
+ shadowPaint.setAntiAlias(false);
+ assertFalse(paint.isAntiAlias());
}
@Test
@@ -43,6 +46,19 @@
}
@Test
+ public void testCtorWithPaint() {
+ Paint paint = new Paint();
+ paint.setColor(Color.RED);
+ paint.setAlpha(72);
+ paint.setFlags(2345);
+
+ Paint other = new Paint(paint);
+ assertThat(other.getColor()).isEqualTo(Color.RED);
+ assertThat(other.getAlpha()).isEqualTo(72);
+ assertThat(other.getFlags()).isEqualTo(2345);
+ }
+
+ @Test
public void shouldGetAndSetTextAlignment() throws Exception {
Paint paint = Shadow.newInstanceOf(Paint.class);
assertThat(paint.getTextAlign()).isEqualTo(Paint.Align.LEFT);