in litho-core/src/main/java/com/facebook/litho/ComponentUtils.java [127:219]
private static boolean isEquivalentUtil(
Field field, Class<?> classType, @Nullable Object val1, @Nullable Object val2) {
@Comparable.Type int comparableType;
try {
comparableType = field.getAnnotation(Comparable.class).type();
} catch (IncompatibleClassChangeError | NullPointerException ignore) {
/**
* Libraries which uses annotations is facing this intermittently in Lollypop 5.0, 5.0.1 &
* 5.0.2). Google closed this saying it is infeasible to fix this in older OS versions.
*
* <p>https://issuetracker.google.com/issues/37045084
* https://github.com/google/gson/issues/726
*/
return false;
}
switch (comparableType) {
case Comparable.FLOAT:
if (Float.compare((Float) val1, (Float) val2) != 0) {
return false;
}
break;
case Comparable.DOUBLE:
if (Double.compare((Double) val1, (Double) val2) != 0) {
return false;
}
break;
case Comparable.ARRAY:
if (!areArraysEquals(classType, val1, val2)) {
return false;
}
break;
case Comparable.PRIMITIVE:
if (!val1.equals(val2)) {
return false;
}
break;
case Comparable.COMPARABLE_DRAWABLE:
if (!((ComparableDrawable) val1).isEquivalentTo((ComparableDrawable) val2)) {
return false;
}
break;
case Comparable.COLLECTION_COMPLEVEL_0:
final Collection c1 = (Collection) val1;
final Collection c2 = (Collection) val2;
if (c1 != null ? !c1.equals(c2) : c2 != null) {
return false;
}
break;
case Comparable.COLLECTION_COMPLEVEL_1:
case Comparable.COLLECTION_COMPLEVEL_2:
case Comparable.COLLECTION_COMPLEVEL_3:
case Comparable.COLLECTION_COMPLEVEL_4:
// N.B. This relies on the IntDef to be in increasing order.
int level = comparableType - Comparable.COLLECTION_COMPLEVEL_0;
if (!areComponentCollectionsEquals(level, (Collection) val1, (Collection) val2)) {
return false;
}
break;
case Comparable.COMPONENT:
if (val1 != null ? !((Component) val1).isEquivalentTo((Component) val2) : val2 != null) {
return false;
}
break;
case Comparable.SECTION:
if (val1 != null ? !((Equivalence) val1).isEquivalentTo(val2) : val2 != null) {
return false;
}
break;
case Comparable.EVENT_HANDLER:
case Comparable.EVENT_HANDLER_IN_PARAMETERIZED_TYPE:
if (val1 != null
? !((EventHandler) val1).isEquivalentTo((EventHandler) val2)
: val2 != null) {
return false;
}
break;
case Comparable.OTHER:
if (val1 != null ? !val1.equals(val2) : val2 != null) {
return false;
}
break;
}
return true;
}