Fix crash with hashCode() of PorterDuffColorFilter
Because the shadow does not invoke the real constructor, mode was null.
diff --git a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPorterDuffColorFilter.java b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPorterDuffColorFilter.java
index fcd5e98..618328a 100644
--- a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPorterDuffColorFilter.java
+++ b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPorterDuffColorFilter.java
@@ -28,6 +28,11 @@
this.mode = mode;
}
+ @Implementation
+ public int hashCode() {
+ return 31 * mode.hashCode() + color;
+ }
+
/**
* Non-Android accessor.
*
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPorterDuffColorFilterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPorterDuffColorFilterTest.java
index 213e608..df82ac0 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPorterDuffColorFilterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPorterDuffColorFilterTest.java
@@ -36,4 +36,20 @@
filter.setMode(PorterDuff.Mode.DST_IN);
assertThat(filter.getMode()).isEqualTo(PorterDuff.Mode.DST_IN);
}
+
+ @Test
+ public void hashCode_returnsDifferentValuesForDifferentModes() {
+ PorterDuffColorFilter addFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.ADD);
+ PorterDuffColorFilter dstFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DST);
+
+ assertThat(addFilter.hashCode()).isNotEqualTo(dstFilter.hashCode());
+ }
+
+ @Test
+ public void hashCode_returnsDifferentValuesForDifferentColors() {
+ PorterDuffColorFilter blueFilter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.ADD);
+ PorterDuffColorFilter redFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.ADD);
+
+ assertThat(blueFilter.hashCode()).isNotEqualTo(redFilter.hashCode());
+ }
}