{"record":{"id":"97065473df6b7c6d","repo":"material-components/material-components-android","slug":"invalid-slide-direction-slideedge","errorCode":null,"errorMessage":"Invalid slide direction: > slideEdge <","messagePattern":"Invalid slide direction: > slideEdge <","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"lib/java/com/google/android/material/transition/SlideDistanceProvider.java","lineNumber":152,"sourceCode":"        return createTranslationYAnimator(view, originalY - slideDistance, originalY, originalY);\n      case Gravity.RIGHT:\n        return createTranslationXAnimator(view, originalX - slideDistance, originalX, originalX);\n      case Gravity.BOTTOM:\n        return createTranslationYAnimator(view, originalY + slideDistance, originalY, originalY);\n      case Gravity.START:\n        return createTranslationXAnimator(\n            view,\n            isRtl(sceneRoot) ? originalX + slideDistance : originalX - slideDistance,\n            originalX,\n            originalX);\n      case Gravity.END:\n        return createTranslationXAnimator(\n            view,\n            isRtl(sceneRoot) ? originalX - slideDistance : originalX + slideDistance,\n            originalX,\n            originalX);\n      default:\n        throw new IllegalArgumentException(\"Invalid slide direction: \" + slideEdge);\n    }\n  }\n\n  private static Animator createTranslationDisappearAnimator(\n      View sceneRoot, View view, @GravityFlag int slideEdge, @Px int slideDistance) {\n    final float originalX = view.getTranslationX();\n    final float originalY = view.getTranslationY();\n    switch (slideEdge) {\n      case Gravity.LEFT:\n        return createTranslationXAnimator(view, originalX, originalX - slideDistance, originalX);\n      case Gravity.TOP:\n        return createTranslationYAnimator(view, originalY, originalY + slideDistance, originalY);\n      case Gravity.RIGHT:\n        return createTranslationXAnimator(view, originalX, originalX + slideDistance, originalX);\n      case Gravity.BOTTOM:\n        return createTranslationYAnimator(view, originalY, originalY - slideDistance, originalY);\n      case Gravity.START:\n        return createTranslationXAnimator(","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/material-components/material-components-android/blob/ac7e18efeefb331850c561faf9ab8bf81d27ba68/lib/java/com/google/android/material/transition/SlideDistanceProvider.java#L134-L170","documentation":"SlideDistanceProvider.createTranslationAppearAnimator (SlideDistanceProvider.java:152) switches on the slide edge gravity to build the appear translation. Only Gravity.LEFT, TOP, RIGHT, BOTTOM, START and END are handled; any other gravity flag (or combination, or 0) falls to default and throws IllegalArgumentException when the transition's appear animation is created.","triggerScenarios":"Calling provider.setSlideEdge(g) with values like Gravity.CENTER, Gravity.FILL, a bitmask combination (Gravity.TOP | Gravity.START), or 0, then running a transition that triggers createAppear(); passing a clip-screen-edge gravity from window flags by mistake.","commonSituations":"Reusing gravity constants from unrelated layout code; using GravityCompat constants not in the supported set; passing composite gravity flags computed at runtime.","solutions":["Use one of the six supported absolutes: Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM, Gravity.START, Gravity.END.","Normalize dynamic gravities before calling setSlideEdge: extract the single supported direction or fall back to a default.","Never pass combined gravity masks — this API expects exactly one edge."],"exampleFix":"// before\nprovider.setSlideEdge(Gravity.CENTER); // then transition crashes in createAppear\n\n// after\nprovider.setSlideEdge(Gravity.BOTTOM);","handlingStrategy":"validation","validationCode":"static boolean isSupportedSlideEdge(int edge) {\n  return edge == Gravity.LEFT || edge == Gravity.TOP || edge == Gravity.RIGHT\n      || edge == Gravity.BOTTOM || edge == Gravity.START || edge == Gravity.END;\n}\nif (!isSupportedSlideEdge(edge)) edge = Gravity.BOTTOM; // or fail fast with a clear message\nprovider.setSlideEdge(edge);","typeGuard":"static @GravityFlag int coerceSlideEdge(int candidate) {\n  return isSupportedSlideEdge(candidate) ? candidate : Gravity.BOTTOM;\n}","tryCatchPattern":null,"preventionTips":["Restrict slide edges to the six supported gravity absolutes.","Reject composite gravity masks before they reach setSlideEdge.","Centralize transition construction so edge validation happens in one place."],"tags":["android","material-components","slide-edge","gravity","transition"],"backgroundTag":null,"analyzedSha":"ac7e18efeefb331850c561faf9ab8bf81d27ba68","analyzedAt":"2026-08-14T15:35:35.735Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}