private static boolean isEquivalentUtil()

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;
  }