{"record":{"id":"24aefec0d3abf227","repo":"google/ExoPlayer","slug":"missing-implementation-to-handle-command-set-repea","errorCode":null,"errorMessage":"Missing implementation to handle COMMAND_SET_REPEAT_MODE","messagePattern":"Missing implementation to handle COMMAND_SET_REPEAT_MODE","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java","lineNumber":2980,"sourceCode":"   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleRelease() {\n    throw new IllegalStateException(\"Missing implementation to handle COMMAND_RELEASE\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setRepeatMode}.\n   *\n   * <p>Will only be called if {@link Player#COMMAND_SET_REPEAT_MODE} is available.\n   *\n   * @param repeatMode The requested {@link RepeatMode}.\n   * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}\n   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetRepeatMode(@RepeatMode int repeatMode) {\n    throw new IllegalStateException(\"Missing implementation to handle COMMAND_SET_REPEAT_MODE\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setShuffleModeEnabled}.\n   *\n   * <p>Will only be called if {@link Player#COMMAND_SET_SHUFFLE_MODE} is available.\n   *\n   * @param shuffleModeEnabled Whether shuffle mode was requested to be enabled.\n   * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}\n   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetShuffleModeEnabled(boolean shuffleModeEnabled) {\n    throw new IllegalStateException(\"Missing implementation to handle COMMAND_SET_SHUFFLE_MODE\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setPlaybackParameters} or {@link Player#setPlaybackSpeed}.","sourceCodeStart":2962,"sourceCodeEnd":2998,"githubUrl":"https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java#L2962-L2998","documentation":"Default handler for Player.setRepeatMode(...) in SimpleBasePlayer throws when handleSetRepeatMode is missing while COMMAND_SET_REPEAT_MODE is advertised. The base class enforces the one-handler-per-available-command contract by failing fast.","triggerScenarios":"player.setRepeatMode(Player.REPEAT_MODE_ALL) (e.g. from a UI toggle or a media controller) on a SimpleBasePlayer subclass that did not override handleSetRepeatMode but left COMMAND_SET_REPEAT_MODE in its State.","commonSituations":"Custom players that do not support repeat but copy the default command set; UI controllers that automatically call setRepeatMode on player connection.","solutions":["Override handleSetRepeatMode(int repeatMode), persist it in your state, and return the state-update future.","If repeat is unsupported, build your State without COMMAND_SET_REPEAT_MODE so Player.setRepeatMode becomes a no-op for callers.","Remember repeat mode interacts with getNextMediaItemIndex logic — implement both consistently."],"exampleFix":"// before\n// no override; controller calls setRepeatMode(REPEAT_MODE_ALL) -> throws\n\n// after\n@Override\nprotected ListenableFuture<?> handleSetRepeatMode(@RepeatMode int repeatMode) {\n  return updateStateAndNotify(state.buildUpon().setRepeatMode(repeatMode).build());\n}","handlingStrategy":"validation","validationCode":"if (!supportsRepeat) commands.remove(Player.COMMAND_SET_REPEAT_MODE);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Implement handleSetRepeatMode() or exclude COMMAND_SET_REPEAT_MODE.","Watch for controllers/UIs that set repeat mode automatically on connect.","Keep repeat mode consistent with your next/previous index resolution."],"tags":["simplebaseplayer","custom-player","repeat-mode","media3","contract"],"backgroundTag":null,"analyzedSha":"dd430f7053a1a3958deea3ead6a0565150c06bfc","analyzedAt":"2026-08-14T12:22:02.982Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}