{"record":{"id":"4bb5aaa5c499d327","repo":"material-components/material-components-android","slug":"invalid-fit-mode-fitmode-4bb5aa","errorCode":null,"errorMessage":"Invalid fit mode: > fitMode <","messagePattern":"Invalid fit mode: > fitMode <","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"lib/java/com/google/android/material/transition/platform/FitModeEvaluators.java","lineNumber":137,"sourceCode":"        public void applyMask(RectF maskBounds, float maskMultiplier, FitModeResult fitModeResult) {\n          float currentWidthDiff =\n              Math.abs(fitModeResult.currentEndWidth - fitModeResult.currentStartWidth);\n          maskBounds.left += currentWidthDiff / 2 * maskMultiplier;\n          maskBounds.right -= currentWidthDiff / 2 * maskMultiplier;\n        }\n      };\n\n  static FitModeEvaluator get(\n      @FitMode int fitMode, boolean entering, RectF startBounds, RectF endBounds) {\n    switch (fitMode) {\n      case FIT_MODE_AUTO:\n        return shouldAutoFitToWidth(entering, startBounds, endBounds) ? WIDTH : HEIGHT;\n      case FIT_MODE_WIDTH:\n        return WIDTH;\n      case FIT_MODE_HEIGHT:\n        return HEIGHT;\n      default:\n        throw new IllegalArgumentException(\"Invalid fit mode: \" + fitMode);\n    }\n  }\n\n  private static boolean shouldAutoFitToWidth(\n      boolean entering, RectF startBounds, RectF endBounds) {\n    float startWidth = startBounds.width();\n    float startHeight = startBounds.height();\n    float endWidth = endBounds.width();\n    float endHeight = endBounds.height();\n\n    float endHeightFitToWidth = endHeight * startWidth / endWidth;\n    float startHeightFitToWidth = startHeight * endWidth / startWidth;\n    return entering ? endHeightFitToWidth >= startHeight : startHeightFitToWidth >= endHeight;\n  }\n\n  private FitModeEvaluators() {}\n}\n","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/material-components/material-components-android/blob/ac7e18efeefb331850c561faf9ab8bf81d27ba68/lib/java/com/google/android/material/transition/platform/FitModeEvaluators.java#L119-L155","documentation":"Platform-package counterpart of the fit-mode evaluator (transition/platform/FitModeEvaluators.java:137) used by com.google.android.material.transition.platform.MaterialContainerTransform. It accepts only FIT_MODE_AUTO/WIDTH/HEIGHT; FIT_MODE_AUTO internally chooses WIDTH or HEIGHT by comparing fitted aspect ratios. Any other fitMode int reaches the default branch and throws IllegalArgumentException.","triggerScenarios":"Calling setFitMode() on the platform MaterialContainerTransform with a raw or out-of-range int; reusing a fade-mode or axis constant in place of a fit-mode constant; deserialized fitMode values passed unchecked.","commonSituations":"Numeric hardcoding; constants confused across the two transition packages (platform vs androidx); config-driven transition styling with unvalidated ints.","solutions":["Pass only MaterialContainerTransform.FIT_MODE_AUTO / FIT_MODE_WIDTH / FIT_MODE_HEIGHT (platform variant).","Whitelist-check external values before calling setFitMode().","Annotate wrapper params with @FitMode for compile-time checks."],"exampleFix":"// before\ntransform.setFitMode(2 + 2);\n\n// after\ntransform.setFitMode(MaterialContainerTransform.FIT_MODE_HEIGHT);","handlingStrategy":"validation","validationCode":"import com.google.android.material.transition.platform.MaterialContainerTransform;\n\nstatic boolean isValidPlatformFitMode(int m) {\n  return m == MaterialContainerTransform.FIT_MODE_AUTO\n      || m == MaterialContainerTransform.FIT_MODE_WIDTH\n      || m == MaterialContainerTransform.FIT_MODE_HEIGHT;\n}\nif (isValidPlatformFitMode(cfg)) transform.setFitMode(cfg); else transform.setFitMode(MaterialContainerTransform.FIT_MODE_AUTO);","typeGuard":"static int coercePlatformFitMode(int candidate) {\n  return isValidPlatformFitMode(candidate) ? candidate : MaterialContainerTransform.FIT_MODE_AUTO;\n}","tryCatchPattern":null,"preventionTips":["Use the FIT_MODE_* constants of the exact class you instantiate.","Keep fit-mode and fade-mode config in separate typed fields.","Unit-test config parsing with out-of-range ints."],"tags":["android","material-components","platform-transitions","container-transform","fit-mode","enum-validation"],"backgroundTag":null,"analyzedSha":"ac7e18efeefb331850c561faf9ab8bf81d27ba68","analyzedAt":"2026-08-14T15:35:35.735Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}