material-components/material-components-android · error · IllegalArgumentException

Invalid fade mode: > fadeMode <

Error message

Invalid fade mode: > fadeMode <

What it means

This is the platform (android.transition, non-A androidx) copy of FadeModeEvaluators at transition/platform/FadeModeEvaluators.java:92. It resolves the fade strategy for a MaterialContainerTransform built with the platform transition API; only FADE_MODE_IN/OUT/CROSS/THROUGH are valid, and any other int throws IllegalArgumentException from the default branch. Same semantics as the androidx copy, different import path.

Source

Thrown at lib/java/com/google/android/material/transition/platform/FadeModeEvaluators.java:92

              fadeStartFraction + fadeFractionDiff * threshold;
          int startAlpha = lerp(255, 0, fadeStartFraction, fadeFractionThreshold, progress);
          int endAlpha = lerp(0, 255, fadeFractionThreshold, fadeEndFraction, progress);
          return FadeModeResult.startOnTop(startAlpha, endAlpha);
        }
      };

  static FadeModeEvaluator get(@FadeMode int fadeMode, boolean entering) {
    switch (fadeMode) {
      case FADE_MODE_IN:
        return entering ? IN : OUT;
      case FADE_MODE_OUT:
        return entering ? OUT : IN;
      case FADE_MODE_CROSS:
        return CROSS;
      case FADE_MODE_THROUGH:
        return THROUGH;
      default:
        throw new IllegalArgumentException("Invalid fade mode: " + fadeMode);
    }
  }

  private FadeModeEvaluators() {}
}

View on GitHub (pinned to ac7e18efee)

Solutions

  1. Use the constants on the platform MaterialContainerTransform class you instantiated.
  2. Validate dynamic values are within the four valid constants before setFadeMode().
  3. Standardize on either the platform or androidx transition package across the codebase to avoid constant mix-ups.

Example fix

// before
import com.google.android.material.transition.platform.MaterialContainerTransform;
transform.setFadeMode(11);

// after
import com.google.android.material.transition.platform.MaterialContainerTransform;
transform.setFadeMode(MaterialContainerTransform.FADE_MODE_CROSS);
Defensive patterns

Strategy: validation

Validate before calling

static boolean isValidPlatformFadeMode(int m) {
  return m >= com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_IN
      && m <= com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_THROUGH;
}
if (isValidPlatformFadeMode(raw)) transform.setFadeMode(raw); else transform.setFadeMode(com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_IN);

Type guard

static int coercePlatformFadeMode(int candidate) {
  switch (candidate) {
    case com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_IN:
    case com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_OUT:
    case com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_CROSS:
    case com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_THROUGH:
      return candidate;
    default: return com.google.android.material.transition.platform.MaterialContainerTransform.FADE_MODE_IN;
  }
}

Prevention

When it happens

Trigger: Using com.google.android.material.transition.platform.MaterialContainerTransform and calling setFadeMode() with an int outside the FADE_MODE_* constant set; sharing a config int between androidx and platform transform classes whose constant spaces were assumed identical.

Common situations: Apps mixing platform and androidx transition classes; hardcoded ints copied from snippets that used the other variant; remote-config supplied fade mode without validation.

Related errors


AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14). Data as JSON: /api/errors/d9a120dbc54eb038. Report an issue: GitHub.