{"record":{"id":"6a81b0fce8686117","repo":"material-components/material-components-android","slug":"invalid-fade-mode-fademode","errorCode":null,"errorMessage":"Invalid fade mode: > fadeMode <","messagePattern":"Invalid fade mode: > fadeMode <","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"lib/java/com/google/android/material/transition/FadeModeEvaluators.java","lineNumber":87,"sourceCode":"              fadeStartFraction + fadeFractionDiff * threshold;\n          int startAlpha = lerp(255, 0, fadeStartFraction, fadeFractionThreshold, progress);\n          int endAlpha = lerp(0, 255, fadeFractionThreshold, fadeEndFraction, progress);\n          return FadeModeResult.startOnTop(startAlpha, endAlpha);\n        }\n      };\n\n  static FadeModeEvaluator get(@FadeMode int fadeMode, boolean entering) {\n    switch (fadeMode) {\n      case FADE_MODE_IN:\n        return entering ? IN : OUT;\n      case FADE_MODE_OUT:\n        return entering ? OUT : IN;\n      case FADE_MODE_CROSS:\n        return CROSS;\n      case FADE_MODE_THROUGH:\n        return THROUGH;\n      default:\n        throw new IllegalArgumentException(\"Invalid fade mode: \" + fadeMode);\n    }\n  }\n\n  private FadeModeEvaluators() {}\n}\n","sourceCodeStart":69,"sourceCodeEnd":93,"githubUrl":"https://github.com/material-components/material-components-android/blob/ac7e18efeefb331850c561faf9ab8bf81d27ba68/lib/java/com/google/android/material/transition/FadeModeEvaluators.java#L69-L93","documentation":"FadeModeEvaluators.get (FadeModeEvaluators.java:87) resolves how start/end views fade during a MaterialContainerTransform. Only the four @FadeMode constants (FADE_MODE_IN, FADE_MODE_OUT, FADE_MODE_CROSS, FADE_MODE_THROUGH) are valid; any other int hits the default branch and throws IllegalArgumentException. The value flows in from MaterialContainerTransform.setFadeMode().","triggerScenarios":"Calling transform.setFadeMode(n) with a raw int that is not one of MaterialContainerTransform.FADE_MODE_*; passing a persisted or bundled fadeMode that was corrupted; version drift where a custom constant was hardcoded numerically.","commonSituations":"Hardcoding 3 thinking it means THROUGH when valid values are 0-3 defined by annotation; copying an int from an older snippet; storing fadeMode in preferences/remote config without validation.","solutions":["Use the declared constants: MaterialContainerTransform.FADE_MODE_IN / FADE_MODE_OUT / FADE_MODE_CROSS / FADE_MODE_THROUGH.","Validate externally sourced values against the 0..3 range before calling setFadeMode().","Lint against raw ints: annotate your own wrapper parameter with @FadeMode so Android Studio enforces the constant set."],"exampleFix":"// before\ntransform.setFadeMode(7);\n\n// after\ntransform.setFadeMode(MaterialContainerTransform.FADE_MODE_THROUGH);","handlingStrategy":"validation","validationCode":"static boolean isValidFadeMode(int m) {\n  return m >= MaterialContainerTransform.FADE_MODE_IN\n      && m <= MaterialContainerTransform.FADE_MODE_THROUGH;\n}\nif (isValidFadeMode(raw)) transform.setFadeMode(raw); else transform.setFadeMode(MaterialContainerTransform.FADE_MODE_IN);","typeGuard":"static @FadeMode int coerceFadeMode(int candidate) {\n  switch (candidate) {\n    case MaterialContainerTransform.FADE_MODE_IN:\n    case MaterialContainerTransform.FADE_MODE_OUT:\n    case MaterialContainerTransform.FADE_MODE_CROSS:\n    case MaterialContainerTransform.FADE_MODE_THROUGH:\n      return candidate;\n    default: return MaterialContainerTransform.FADE_MODE_IN;\n  }\n}","tryCatchPattern":null,"preventionTips":["Only pass MaterialContainerTransform.FADE_MODE_* constants.","Validate remote/persisted ints before use.","Expose an @FadeMode-annotated parameter in your transition factory for compile-time safety."],"tags":["android","material-components","container-transform","fade-mode","enum-validation"],"backgroundTag":null,"analyzedSha":"ac7e18efeefb331850c561faf9ab8bf81d27ba68","analyzedAt":"2026-08-14T15:35:35.735Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}