Commit 4a02c5ff by jbibik Committed by Rohit Singh

Extend Player interface, overloading 4 device-volume methods with flags

Previously, ExoPlayerImpl had volume flags hardcoded to SHOW_UI, but now the developer can choose what happens on volume change. The old methods have been deprecated.

PiperOrigin-RevId: 523974358
parent e7727f40
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle"
dependencies { dependencies {
api 'com.google.android.gms:play-services-cast-framework:21.2.0' api 'com.google.android.gms:play-services-cast-framework:21.3.0'
implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion
implementation project(modulePrefix + 'library-common') implementation project(modulePrefix + 'library-common')
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
......
...@@ -753,22 +753,50 @@ public final class CastPlayer extends BasePlayer { ...@@ -753,22 +753,50 @@ public final class CastPlayer extends BasePlayer {
return false; return false;
} }
/** This method is not supported and does nothing. */ /**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceVolume(int volume) {} public void setDeviceVolume(int volume) {}
/** This method is not supported and does nothing. */ /** This method is not supported and does nothing. */
@Override @Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void increaseDeviceVolume() {} public void increaseDeviceVolume() {}
/** This method is not supported and does nothing. */ /** This method is not supported and does nothing. */
@Override @Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void decreaseDeviceVolume() {} public void decreaseDeviceVolume() {}
/** This method is not supported and does nothing. */ /** This method is not supported and does nothing. */
@Override @Override
public void decreaseDeviceVolume(@C.VolumeFlags int flags) {}
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override
public void setDeviceMuted(boolean muted) {} public void setDeviceMuted(boolean muted) {}
/** This method is not supported and does nothing. */
@Override
public void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {}
// Internal methods. // Internal methods.
// Call deprecated callbacks. // Call deprecated callbacks.
......
...@@ -405,6 +405,37 @@ public final class C { ...@@ -405,6 +405,37 @@ public final class C {
public static final int STREAM_TYPE_DEFAULT = STREAM_TYPE_MUSIC; public static final int STREAM_TYPE_DEFAULT = STREAM_TYPE_MUSIC;
/** /**
* Volume flags to be used when setting or adjusting device volume. The value can be either 0 or a
* combination of the following flags: {@link #VOLUME_FLAG_SHOW_UI}, {@link
* #VOLUME_FLAG_ALLOW_RINGER_MODES}, {@link #VOLUME_FLAG_PLAY_SOUND}, {@link
* #VOLUME_FLAG_REMOVE_SOUND_AND_VIBRATE}, {@link #VOLUME_FLAG_VIBRATE}.
*/
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target({TYPE_USE})
@IntDef(
flag = true,
value = {
VOLUME_FLAG_SHOW_UI,
VOLUME_FLAG_ALLOW_RINGER_MODES,
VOLUME_FLAG_PLAY_SOUND,
VOLUME_FLAG_REMOVE_SOUND_AND_VIBRATE,
VOLUME_FLAG_VIBRATE,
})
public @interface VolumeFlags {}
/** See {@link AudioManager#FLAG_SHOW_UI}. */
public static final int VOLUME_FLAG_SHOW_UI = AudioManager.FLAG_SHOW_UI;
/** See {@link AudioManager#FLAG_ALLOW_RINGER_MODES}. */
public static final int VOLUME_FLAG_ALLOW_RINGER_MODES = AudioManager.FLAG_ALLOW_RINGER_MODES;
/** See {@link AudioManager#FLAG_PLAY_SOUND}. */
public static final int VOLUME_FLAG_PLAY_SOUND = AudioManager.FLAG_PLAY_SOUND;
/** See {@link AudioManager#FLAG_REMOVE_SOUND_AND_VIBRATE}. */
public static final int VOLUME_FLAG_REMOVE_SOUND_AND_VIBRATE =
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE;
/** See {@link AudioManager#FLAG_VIBRATE}. */
public static final int VOLUME_FLAG_VIBRATE = AudioManager.FLAG_VIBRATE;
/**
* Content types for audio attributes. One of: * Content types for audio attributes. One of:
* *
* <ul> * <ul>
......
...@@ -848,30 +848,66 @@ public class ForwardingPlayer implements Player { ...@@ -848,30 +848,66 @@ public class ForwardingPlayer implements Player {
return player.isDeviceMuted(); return player.isDeviceMuted();
} }
/** Calls {@link Player#setDeviceVolume(int)} on the delegate. */ /**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceVolume(int volume) { public void setDeviceVolume(int volume) {
player.setDeviceVolume(volume); player.setDeviceVolume(volume);
} }
/** Calls {@link Player#increaseDeviceVolume()} on the delegate. */ /** Calls {@link Player#setDeviceVolume(int, int)} on the delegate. */
@Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {
player.setDeviceVolume(volume, flags);
}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override @Override
public void increaseDeviceVolume() { public void increaseDeviceVolume() {
player.increaseDeviceVolume(); player.increaseDeviceVolume();
} }
/** Calls {@link Player#decreaseDeviceVolume()} on the delegate. */ /** Calls {@link Player#increaseDeviceVolume(int)} on the delegate. */
@Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {
player.increaseDeviceVolume(flags);
}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override @Override
public void decreaseDeviceVolume() { public void decreaseDeviceVolume() {
player.decreaseDeviceVolume(); player.decreaseDeviceVolume();
} }
/** Calls {@link Player#setDeviceMuted(boolean)} on the delegate. */ /** Calls {@link Player#decreaseDeviceVolume(int)} on the delegate. */
@Override
public void decreaseDeviceVolume(@C.VolumeFlags int flags) {
player.decreaseDeviceVolume(flags);
}
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceMuted(boolean muted) { public void setDeviceMuted(boolean muted) {
player.setDeviceMuted(muted); player.setDeviceMuted(muted);
} }
/** Calls {@link Player#setDeviceMuted(boolean, int)} on the delegate. */
@Override
public void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
player.setDeviceMuted(muted, flags);
}
/** Returns the {@link Player} to which operations are forwarded. */ /** Returns the {@link Player} to which operations are forwarded. */
public Player getWrappedPlayer() { public Player getWrappedPlayer() {
return player; return player;
......
...@@ -378,7 +378,9 @@ public interface Player { ...@@ -378,7 +378,9 @@ public interface Player {
COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME, COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT, COMMAND_GET_TEXT,
COMMAND_SET_TRACK_SELECTION_PARAMETERS, COMMAND_SET_TRACK_SELECTION_PARAMETERS,
...@@ -1426,7 +1428,9 @@ public interface Player { ...@@ -1426,7 +1428,9 @@ public interface Player {
* <li>{@link #COMMAND_GET_DEVICE_VOLUME} * <li>{@link #COMMAND_GET_DEVICE_VOLUME}
* <li>{@link #COMMAND_SET_VOLUME} * <li>{@link #COMMAND_SET_VOLUME}
* <li>{@link #COMMAND_SET_DEVICE_VOLUME} * <li>{@link #COMMAND_SET_DEVICE_VOLUME}
* <li>{@link #COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS}
* <li>{@link #COMMAND_ADJUST_DEVICE_VOLUME} * <li>{@link #COMMAND_ADJUST_DEVICE_VOLUME}
* <li>{@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS}
* <li>{@link #COMMAND_SET_VIDEO_SURFACE} * <li>{@link #COMMAND_SET_VIDEO_SURFACE}
* <li>{@link #COMMAND_GET_TEXT} * <li>{@link #COMMAND_GET_TEXT}
* <li>{@link #COMMAND_SET_TRACK_SELECTION_PARAMETERS} * <li>{@link #COMMAND_SET_TRACK_SELECTION_PARAMETERS}
...@@ -1470,7 +1474,9 @@ public interface Player { ...@@ -1470,7 +1474,9 @@ public interface Player {
COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME, COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT, COMMAND_GET_TEXT,
COMMAND_SET_TRACK_SELECTION_PARAMETERS, COMMAND_SET_TRACK_SELECTION_PARAMETERS,
...@@ -1776,27 +1782,36 @@ public interface Player { ...@@ -1776,27 +1782,36 @@ public interface Player {
* #isCommandAvailable(int) available}. * #isCommandAvailable(int) available}.
*/ */
int COMMAND_SET_VOLUME = 24; int COMMAND_SET_VOLUME = 24;
/**
* @deprecated Use {@link #COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS} instead.
*/
@Deprecated int COMMAND_SET_DEVICE_VOLUME = 25;
/** /**
* Command to set the device volume. * Command to set the device volume with volume flags.
* *
* <p>The {@link #setDeviceVolume(int)} method must only be called if this command is {@linkplain * <p>The {@link #setDeviceVolume(int, int)} method must only be called if this command is
* #isCommandAvailable(int) available}. * {@linkplain #isCommandAvailable(int) available}.
*/ */
int COMMAND_SET_DEVICE_VOLUME = 25; int COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS = 33;
/** /**
* Command to increase and decrease the device volume and mute it. * @deprecated Use {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} instead.
*/
@Deprecated int COMMAND_ADJUST_DEVICE_VOLUME = 26;
/**
* Command to increase and decrease the device volume and mute it with volume flags.
* *
* <p>The following methods must only be called if this command is {@linkplain * <p>The following methods must only be called if this command is {@linkplain
* #isCommandAvailable(int) available}: * #isCommandAvailable(int) available}:
* *
* <ul> * <ul>
* <li>{@link #increaseDeviceVolume()} * <li>{@link #increaseDeviceVolume(int)}
* <li>{@link #decreaseDeviceVolume()} * <li>{@link #decreaseDeviceVolume(int)}
* <li>{@link #setDeviceMuted(boolean)} * <li>{@link #setDeviceMuted(boolean, int)}
* </ul> * </ul>
*/ */
int COMMAND_ADJUST_DEVICE_VOLUME = 26; int COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS = 34;
/** /**
* Command to set and clear the surface on which to render the video. * Command to set and clear the surface on which to render the video.
...@@ -3067,36 +3082,68 @@ public interface Player { ...@@ -3067,36 +3082,68 @@ public interface Player {
boolean isDeviceMuted(); boolean isDeviceMuted();
/** /**
* Sets the volume of the device. * @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
void setDeviceVolume(@IntRange(from = 0) int volume);
/**
* Sets the volume of the device with volume flags.
* *
* <p>This method must only be called if {@link #COMMAND_SET_DEVICE_VOLUME} is {@linkplain * <p>This method must only be called if {@link #COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS} is
* #getAvailableCommands() available}. * {@linkplain #getAvailableCommands() available}.
* *
* @param volume The volume to set. * @param volume The volume to set.
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
void setDeviceVolume(@IntRange(from = 0) int volume); void setDeviceVolume(@IntRange(from = 0) int volume, int flags);
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
void increaseDeviceVolume();
/** /**
* Increases the volume of the device. * Increases the volume of the device.
* *
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME} is {@linkplain * <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is
* #getAvailableCommands() available}. * {@linkplain #getAvailableCommands() available}.
*
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
void increaseDeviceVolume(); void increaseDeviceVolume(@C.VolumeFlags int flags);
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
void decreaseDeviceVolume();
/** /**
* Decreases the volume of the device. * Decreases the volume of the device.
* *
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME} is {@linkplain * <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is
* #getAvailableCommands() available}. * {@linkplain #getAvailableCommands() available}.
*
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
void decreaseDeviceVolume(); void decreaseDeviceVolume(@C.VolumeFlags int flags);
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
void setDeviceMuted(boolean muted);
/** /**
* Sets the mute state of the device. * Sets the mute state of the device.
* *
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME} is {@linkplain * <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is
* #getAvailableCommands() available}. * {@linkplain #getAvailableCommands() available}.
*
* @param muted Whether to set the device to be muted or not
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
void setDeviceMuted(boolean muted); void setDeviceMuted(boolean muted, @C.VolumeFlags int flags);
} }
...@@ -2664,6 +2664,10 @@ public abstract class SimpleBasePlayer extends BasePlayer { ...@@ -2664,6 +2664,10 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return state.isDeviceMuted; return state.isDeviceMuted;
} }
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override @Override
public final void setDeviceVolume(int volume) { public final void setDeviceVolume(int volume) {
verifyApplicationThreadAndInitState(); verifyApplicationThreadAndInitState();
...@@ -2673,11 +2677,28 @@ public abstract class SimpleBasePlayer extends BasePlayer { ...@@ -2673,11 +2677,28 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return; return;
} }
updateStateForPendingOperation( updateStateForPendingOperation(
/* pendingOperation= */ handleSetDeviceVolume(volume), /* pendingOperation= */ handleSetDeviceVolume(volume, C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () -> state.buildUpon().setDeviceVolume(volume).build()); /* placeholderStateSupplier= */ () -> state.buildUpon().setDeviceVolume(volume).build());
} }
@Override @Override
public final void setDeviceVolume(int volume, @C.VolumeFlags int flags) {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
State state = this.state;
if (!shouldHandleCommand(Player.COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)) {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleSetDeviceVolume(volume, flags),
/* placeholderStateSupplier= */ () -> state.buildUpon().setDeviceVolume(volume).build());
}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public final void increaseDeviceVolume() { public final void increaseDeviceVolume() {
verifyApplicationThreadAndInitState(); verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value. // Use a local copy to ensure the lambda below uses the current state value.
...@@ -2686,12 +2707,30 @@ public abstract class SimpleBasePlayer extends BasePlayer { ...@@ -2686,12 +2707,30 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return; return;
} }
updateStateForPendingOperation( updateStateForPendingOperation(
/* pendingOperation= */ handleIncreaseDeviceVolume(), /* pendingOperation= */ handleIncreaseDeviceVolume(C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () -> /* placeholderStateSupplier= */ () ->
state.buildUpon().setDeviceVolume(state.deviceVolume + 1).build()); state.buildUpon().setDeviceVolume(state.deviceVolume + 1).build());
} }
@Override @Override
public final void increaseDeviceVolume(@C.VolumeFlags int flags) {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
State state = this.state;
if (!shouldHandleCommand(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)) {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleIncreaseDeviceVolume(flags),
/* placeholderStateSupplier= */ () ->
state.buildUpon().setDeviceVolume(state.deviceVolume + 1).build());
}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public final void decreaseDeviceVolume() { public final void decreaseDeviceVolume() {
verifyApplicationThreadAndInitState(); verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value. // Use a local copy to ensure the lambda below uses the current state value.
...@@ -2700,12 +2739,30 @@ public abstract class SimpleBasePlayer extends BasePlayer { ...@@ -2700,12 +2739,30 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return; return;
} }
updateStateForPendingOperation( updateStateForPendingOperation(
/* pendingOperation= */ handleDecreaseDeviceVolume(), /* pendingOperation= */ handleDecreaseDeviceVolume(C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () -> /* placeholderStateSupplier= */ () ->
state.buildUpon().setDeviceVolume(max(0, state.deviceVolume - 1)).build()); state.buildUpon().setDeviceVolume(max(0, state.deviceVolume - 1)).build());
} }
@Override @Override
public final void decreaseDeviceVolume(@C.VolumeFlags int flags) {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
State state = this.state;
if (!shouldHandleCommand(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)) {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleDecreaseDeviceVolume(flags),
/* placeholderStateSupplier= */ () ->
state.buildUpon().setDeviceVolume(max(0, state.deviceVolume - 1)).build());
}
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override
public final void setDeviceMuted(boolean muted) { public final void setDeviceMuted(boolean muted) {
verifyApplicationThreadAndInitState(); verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value. // Use a local copy to ensure the lambda below uses the current state value.
...@@ -2714,7 +2771,20 @@ public abstract class SimpleBasePlayer extends BasePlayer { ...@@ -2714,7 +2771,20 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return; return;
} }
updateStateForPendingOperation( updateStateForPendingOperation(
/* pendingOperation= */ handleSetDeviceMuted(muted), /* pendingOperation= */ handleSetDeviceMuted(muted, C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () -> state.buildUpon().setIsDeviceMuted(muted).build());
}
@Override
public final void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
State state = this.state;
if (!shouldHandleCommand(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)) {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleSetDeviceMuted(muted, flags),
/* placeholderStateSupplier= */ () -> state.buildUpon().setIsDeviceMuted(muted).build()); /* placeholderStateSupplier= */ () -> state.buildUpon().setIsDeviceMuted(muted).build());
} }
...@@ -2931,60 +3001,78 @@ public abstract class SimpleBasePlayer extends BasePlayer { ...@@ -2931,60 +3001,78 @@ public abstract class SimpleBasePlayer extends BasePlayer {
} }
/** /**
* Handles calls to {@link Player#setDeviceVolume}. * Handles calls to {@link Player#setDeviceVolume(int)} and {@link Player#setDeviceVolume(int,
* int)}.
* *
* <p>Will only be called if {@link Player#COMMAND_SET_DEVICE_VOLUME} is available. * <p>Will only be called if {@link Player#COMMAND_SET_DEVICE_VOLUME} or {@link
* Player#COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS} is available.
* *
* @param deviceVolume The requested device volume. * @param deviceVolume The requested device volume.
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
* @return A {@link ListenableFuture} indicating the completion of all immediate {@link State} * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}
* changes caused by this call. * changes caused by this call.
*/ */
@ForOverride @ForOverride
protected ListenableFuture<?> handleSetDeviceVolume(@IntRange(from = 0) int deviceVolume) { protected ListenableFuture<?> handleSetDeviceVolume(
throw new IllegalStateException("Missing implementation to handle COMMAND_SET_DEVICE_VOLUME"); @IntRange(from = 0) int deviceVolume, int flags) {
throw new IllegalStateException(
"Missing implementation to handle COMMAND_SET_DEVICE_VOLUME or"
+ " COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS");
} }
/** /**
* Handles calls to {@link Player#increaseDeviceVolume()}. * Handles calls to {@link Player#increaseDeviceVolume()} and {@link
* Player#increaseDeviceVolume(int)}.
* *
* <p>Will only be called if {@link Player#COMMAND_ADJUST_DEVICE_VOLUME} is available. * <p>Will only be called if {@link Player#COMMAND_ADJUST_DEVICE_VOLUME} or {@link
* Player#COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is available.
* *
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
* @return A {@link ListenableFuture} indicating the completion of all immediate {@link State} * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}
* changes caused by this call. * changes caused by this call.
*/ */
@ForOverride @ForOverride
protected ListenableFuture<?> handleIncreaseDeviceVolume() { protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
throw new IllegalStateException( throw new IllegalStateException(
"Missing implementation to handle COMMAND_ADJUST_DEVICE_VOLUME"); "Missing implementation to handle COMMAND_ADJUST_DEVICE_VOLUME or"
+ " COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS");
} }
/** /**
* Handles calls to {@link Player#decreaseDeviceVolume()}. * Handles calls to {@link Player#decreaseDeviceVolume()} and {@link
* Player#decreaseDeviceVolume(int)}.
* *
* <p>Will only be called if {@link Player#COMMAND_ADJUST_DEVICE_VOLUME} is available. * <p>Will only be called if {@link Player#COMMAND_ADJUST_DEVICE_VOLUME} or {@link
* Player#COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is available.
* *
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
* @return A {@link ListenableFuture} indicating the completion of all immediate {@link State} * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}
* changes caused by this call. * changes caused by this call.
*/ */
@ForOverride @ForOverride
protected ListenableFuture<?> handleDecreaseDeviceVolume() { protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
throw new IllegalStateException( throw new IllegalStateException(
"Missing implementation to handle COMMAND_ADJUST_DEVICE_VOLUME"); "Missing implementation to handle COMMAND_ADJUST_DEVICE_VOLUME or"
+ " COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS");
} }
/** /**
* Handles calls to {@link Player#setDeviceMuted}. * Handles calls to {@link Player#setDeviceMuted(boolean)} and {@link
* Player#setDeviceMuted(boolean, int)}.
* *
* <p>Will only be called if {@link Player#COMMAND_ADJUST_DEVICE_VOLUME} is available. * <p>Will only be called if {@link Player#COMMAND_ADJUST_DEVICE_VOLUME} or {@link
* Player#COMMAND_ADJUST_DEVICE_VOLUME} is available.
* *
* @param muted Whether the device was requested to be muted. * @param muted Whether the device was requested to be muted.
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
* @return A {@link ListenableFuture} indicating the completion of all immediate {@link State} * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}
* changes caused by this call. * changes caused by this call.
*/ */
@ForOverride @ForOverride
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) { protected ListenableFuture<?> handleSetDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
throw new IllegalStateException( throw new IllegalStateException(
"Missing implementation to handle COMMAND_ADJUST_DEVICE_VOLUME"); "Missing implementation to handle COMMAND_ADJUST_DEVICE_VOLUME or"
+ " COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS");
} }
/** /**
......
...@@ -3197,6 +3197,8 @@ public class SimpleBasePlayerTest { ...@@ -3197,6 +3197,8 @@ public class SimpleBasePlayerTest {
.build(); .build();
// Set a different one to the one requested to ensure the updated state is used. // Set a different one to the one requested to ensure the updated state is used.
State updatedState = state.buildUpon().setDeviceVolume(6).build(); State updatedState = state.buildUpon().setDeviceVolume(6).build();
AtomicInteger flagsFromHandlerRef = new AtomicInteger();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
private State playerState = state; private State playerState = state;
...@@ -3207,18 +3209,20 @@ public class SimpleBasePlayerTest { ...@@ -3207,18 +3209,20 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleSetDeviceVolume(int volume) { protected ListenableFuture<?> handleSetDeviceVolume(int volume, int flags) {
playerState = updatedState; playerState = updatedState;
flagsFromHandlerRef.set(flags);
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
}; };
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.setDeviceVolume(3); player.setDeviceVolume(3, volumeFlags);
assertThat(player.getDeviceVolume()).isEqualTo(6); assertThat(player.getDeviceVolume()).isEqualTo(6);
verify(listener).onDeviceVolumeChanged(6, /* muted= */ false); verify(listener).onDeviceVolumeChanged(6, /* muted= */ false);
assertThat(flagsFromHandlerRef.get()).isEqualTo(volumeFlags);
verifyNoMoreInteractions(listener); verifyNoMoreInteractions(listener);
} }
...@@ -3229,6 +3233,8 @@ public class SimpleBasePlayerTest { ...@@ -3229,6 +3233,8 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(new Commands.Builder().addAllCommands().build()) .setAvailableCommands(new Commands.Builder().addAllCommands().build())
.build(); .build();
// Set a new volume to see a difference between the placeholder and new state. // Set a new volume to see a difference between the placeholder and new state.
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
AtomicInteger flagsFromHandlerRef = new AtomicInteger();
State updatedState = state.buildUpon().setDeviceVolume(6).build(); State updatedState = state.buildUpon().setDeviceVolume(6).build();
SettableFuture<?> future = SettableFuture.create(); SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player = SimpleBasePlayer player =
...@@ -3239,18 +3245,20 @@ public class SimpleBasePlayerTest { ...@@ -3239,18 +3245,20 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleSetDeviceVolume(int volume) { protected ListenableFuture<?> handleSetDeviceVolume(int volume, int flags) {
flagsFromHandlerRef.set(flags);
return future; return future;
} }
}; };
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.setDeviceVolume(3); player.setDeviceVolume(3, volumeFlags);
// Verify placeholder state and listener calls. // Verify placeholder state and listener calls.
assertThat(player.getDeviceVolume()).isEqualTo(3); assertThat(player.getDeviceVolume()).isEqualTo(3);
verify(listener).onDeviceVolumeChanged(3, /* muted= */ false); verify(listener).onDeviceVolumeChanged(3, /* muted= */ false);
assertThat(flagsFromHandlerRef.get()).isEqualTo(volumeFlags);
verifyNoMoreInteractions(listener); verifyNoMoreInteractions(listener);
future.set(null); future.set(null);
...@@ -3268,9 +3276,11 @@ public class SimpleBasePlayerTest { ...@@ -3268,9 +3276,11 @@ public class SimpleBasePlayerTest {
.setAvailableCommands( .setAvailableCommands(
new Commands.Builder() new Commands.Builder()
.addAllCommands() .addAllCommands()
.remove(Player.COMMAND_SET_DEVICE_VOLUME) .remove(Player.COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)
.build()) .build())
.build(); .build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_REMOVE_SOUND_AND_VIBRATE;
AtomicInteger flagsFromHandlerRef = new AtomicInteger();
AtomicBoolean callForwarded = new AtomicBoolean(); AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3280,14 +3290,16 @@ public class SimpleBasePlayerTest { ...@@ -3280,14 +3290,16 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleSetDeviceVolume(int volume) { protected ListenableFuture<?> handleSetDeviceVolume(int volume, int flags) {
callForwarded.set(true); callForwarded.set(true);
flagsFromHandlerRef.set(flags);
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
}; };
player.setDeviceVolume(3); player.setDeviceVolume(3, volumeFlags);
assertThat(flagsFromHandlerRef.get()).isEqualTo(0); // no flags have been passed
assertThat(callForwarded.get()).isFalse(); assertThat(callForwarded.get()).isFalse();
} }
...@@ -3299,6 +3311,7 @@ public class SimpleBasePlayerTest { ...@@ -3299,6 +3311,7 @@ public class SimpleBasePlayerTest {
.setDeviceVolume(3) .setDeviceVolume(3)
.build(); .build();
// Set a different one to the one requested to ensure the updated state is used. // Set a different one to the one requested to ensure the updated state is used.
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_PLAY_SOUND;
State updatedState = state.buildUpon().setDeviceVolume(6).build(); State updatedState = state.buildUpon().setDeviceVolume(6).build();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3310,7 +3323,7 @@ public class SimpleBasePlayerTest { ...@@ -3310,7 +3323,7 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleIncreaseDeviceVolume() { protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
playerState = updatedState; playerState = updatedState;
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
...@@ -3318,7 +3331,7 @@ public class SimpleBasePlayerTest { ...@@ -3318,7 +3331,7 @@ public class SimpleBasePlayerTest {
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.increaseDeviceVolume(); player.increaseDeviceVolume(volumeFlags);
assertThat(player.getDeviceVolume()).isEqualTo(6); assertThat(player.getDeviceVolume()).isEqualTo(6);
verify(listener).onDeviceVolumeChanged(6, /* muted= */ false); verify(listener).onDeviceVolumeChanged(6, /* muted= */ false);
...@@ -3333,6 +3346,7 @@ public class SimpleBasePlayerTest { ...@@ -3333,6 +3346,7 @@ public class SimpleBasePlayerTest {
.setDeviceVolume(3) .setDeviceVolume(3)
.build(); .build();
// Set a new volume to see a difference between the placeholder and new state. // Set a new volume to see a difference between the placeholder and new state.
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_PLAY_SOUND;
State updatedState = state.buildUpon().setDeviceVolume(6).build(); State updatedState = state.buildUpon().setDeviceVolume(6).build();
SettableFuture<?> future = SettableFuture.create(); SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player = SimpleBasePlayer player =
...@@ -3343,14 +3357,14 @@ public class SimpleBasePlayerTest { ...@@ -3343,14 +3357,14 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleIncreaseDeviceVolume() { protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
return future; return future;
} }
}; };
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.increaseDeviceVolume(); player.increaseDeviceVolume(volumeFlags);
// Verify placeholder state and listener calls. // Verify placeholder state and listener calls.
assertThat(player.getDeviceVolume()).isEqualTo(4); assertThat(player.getDeviceVolume()).isEqualTo(4);
...@@ -3372,9 +3386,10 @@ public class SimpleBasePlayerTest { ...@@ -3372,9 +3386,10 @@ public class SimpleBasePlayerTest {
.setAvailableCommands( .setAvailableCommands(
new Commands.Builder() new Commands.Builder()
.addAllCommands() .addAllCommands()
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME) .remove(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)
.build()) .build())
.build(); .build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_PLAY_SOUND;
AtomicBoolean callForwarded = new AtomicBoolean(); AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3384,13 +3399,13 @@ public class SimpleBasePlayerTest { ...@@ -3384,13 +3399,13 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleIncreaseDeviceVolume() { protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
callForwarded.set(true); callForwarded.set(true);
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
}; };
player.increaseDeviceVolume(); player.increaseDeviceVolume(volumeFlags);
assertThat(callForwarded.get()).isFalse(); assertThat(callForwarded.get()).isFalse();
} }
...@@ -3404,6 +3419,7 @@ public class SimpleBasePlayerTest { ...@@ -3404,6 +3419,7 @@ public class SimpleBasePlayerTest {
.build(); .build();
// Set a different one to the one requested to ensure the updated state is used. // Set a different one to the one requested to ensure the updated state is used.
State updatedState = state.buildUpon().setDeviceVolume(1).build(); State updatedState = state.buildUpon().setDeviceVolume(1).build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_PLAY_SOUND;
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
private State playerState = state; private State playerState = state;
...@@ -3414,7 +3430,7 @@ public class SimpleBasePlayerTest { ...@@ -3414,7 +3430,7 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleDecreaseDeviceVolume() { protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
playerState = updatedState; playerState = updatedState;
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
...@@ -3422,7 +3438,7 @@ public class SimpleBasePlayerTest { ...@@ -3422,7 +3438,7 @@ public class SimpleBasePlayerTest {
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.decreaseDeviceVolume(); player.decreaseDeviceVolume(volumeFlags);
assertThat(player.getDeviceVolume()).isEqualTo(1); assertThat(player.getDeviceVolume()).isEqualTo(1);
verify(listener).onDeviceVolumeChanged(1, /* muted= */ false); verify(listener).onDeviceVolumeChanged(1, /* muted= */ false);
...@@ -3437,6 +3453,7 @@ public class SimpleBasePlayerTest { ...@@ -3437,6 +3453,7 @@ public class SimpleBasePlayerTest {
.setDeviceVolume(3) .setDeviceVolume(3)
.build(); .build();
// Set a new volume to see a difference between the placeholder and new state. // Set a new volume to see a difference between the placeholder and new state.
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
State updatedState = state.buildUpon().setDeviceVolume(1).build(); State updatedState = state.buildUpon().setDeviceVolume(1).build();
SettableFuture<?> future = SettableFuture.create(); SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player = SimpleBasePlayer player =
...@@ -3447,14 +3464,14 @@ public class SimpleBasePlayerTest { ...@@ -3447,14 +3464,14 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleDecreaseDeviceVolume() { protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
return future; return future;
} }
}; };
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.decreaseDeviceVolume(); player.decreaseDeviceVolume(volumeFlags);
// Verify placeholder state and listener calls. // Verify placeholder state and listener calls.
assertThat(player.getDeviceVolume()).isEqualTo(2); assertThat(player.getDeviceVolume()).isEqualTo(2);
...@@ -3476,9 +3493,10 @@ public class SimpleBasePlayerTest { ...@@ -3476,9 +3493,10 @@ public class SimpleBasePlayerTest {
.setAvailableCommands( .setAvailableCommands(
new Commands.Builder() new Commands.Builder()
.addAllCommands() .addAllCommands()
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME) .remove(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)
.build()) .build())
.build(); .build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
AtomicBoolean callForwarded = new AtomicBoolean(); AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3488,13 +3506,13 @@ public class SimpleBasePlayerTest { ...@@ -3488,13 +3506,13 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleDecreaseDeviceVolume() { protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
callForwarded.set(true); callForwarded.set(true);
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
}; };
player.decreaseDeviceVolume(); player.decreaseDeviceVolume(volumeFlags);
assertThat(callForwarded.get()).isFalse(); assertThat(callForwarded.get()).isFalse();
} }
...@@ -3506,6 +3524,7 @@ public class SimpleBasePlayerTest { ...@@ -3506,6 +3524,7 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(new Commands.Builder().addAllCommands().build()) .setAvailableCommands(new Commands.Builder().addAllCommands().build())
.build(); .build();
// Also change the volume to ensure the updated state is used. // Also change the volume to ensure the updated state is used.
int volumeFlags = C.VOLUME_FLAG_VIBRATE;
State updatedState = state.buildUpon().setIsDeviceMuted(true).setDeviceVolume(6).build(); State updatedState = state.buildUpon().setIsDeviceMuted(true).setDeviceVolume(6).build();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3517,7 +3536,8 @@ public class SimpleBasePlayerTest { ...@@ -3517,7 +3536,8 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) { protected ListenableFuture<?> handleSetDeviceMuted(
boolean muted, @C.VolumeFlags int flags) {
playerState = updatedState; playerState = updatedState;
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
...@@ -3525,7 +3545,7 @@ public class SimpleBasePlayerTest { ...@@ -3525,7 +3545,7 @@ public class SimpleBasePlayerTest {
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.setDeviceMuted(true); player.setDeviceMuted(true, volumeFlags);
assertThat(player.isDeviceMuted()).isTrue(); assertThat(player.isDeviceMuted()).isTrue();
assertThat(player.getDeviceVolume()).isEqualTo(6); assertThat(player.getDeviceVolume()).isEqualTo(6);
...@@ -3539,6 +3559,7 @@ public class SimpleBasePlayerTest { ...@@ -3539,6 +3559,7 @@ public class SimpleBasePlayerTest {
new State.Builder() new State.Builder()
.setAvailableCommands(new Commands.Builder().addAllCommands().build()) .setAvailableCommands(new Commands.Builder().addAllCommands().build())
.build(); .build();
int volumeFlags = C.VOLUME_FLAG_VIBRATE;
SettableFuture<?> future = SettableFuture.create(); SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3550,14 +3571,15 @@ public class SimpleBasePlayerTest { ...@@ -3550,14 +3571,15 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) { protected ListenableFuture<?> handleSetDeviceMuted(
boolean muted, @C.VolumeFlags int flags) {
return future; return future;
} }
}; };
Listener listener = mock(Listener.class); Listener listener = mock(Listener.class);
player.addListener(listener); player.addListener(listener);
player.setDeviceMuted(true); player.setDeviceMuted(true, volumeFlags);
// Verify placeholder state and listener calls. // Verify placeholder state and listener calls.
assertThat(player.isDeviceMuted()).isTrue(); assertThat(player.isDeviceMuted()).isTrue();
...@@ -3579,9 +3601,10 @@ public class SimpleBasePlayerTest { ...@@ -3579,9 +3601,10 @@ public class SimpleBasePlayerTest {
.setAvailableCommands( .setAvailableCommands(
new Commands.Builder() new Commands.Builder()
.addAllCommands() .addAllCommands()
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME) .remove(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)
.build()) .build())
.build(); .build();
int volumeFlags = C.VOLUME_FLAG_VIBRATE;
AtomicBoolean callForwarded = new AtomicBoolean(); AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player = SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) { new SimpleBasePlayer(Looper.myLooper()) {
...@@ -3591,13 +3614,14 @@ public class SimpleBasePlayerTest { ...@@ -3591,13 +3614,14 @@ public class SimpleBasePlayerTest {
} }
@Override @Override
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) { protected ListenableFuture<?> handleSetDeviceMuted(
boolean muted, @C.VolumeFlags int flags) {
callForwarded.set(true); callForwarded.set(true);
return Futures.immediateVoidFuture(); return Futures.immediateVoidFuture();
} }
}; };
player.setDeviceMuted(true); player.setDeviceMuted(true, volumeFlags);
assertThat(callForwarded.get()).isFalse(); assertThat(callForwarded.get()).isFalse();
} }
......
...@@ -101,11 +101,12 @@ public class StreamVolumeManagerTest { ...@@ -101,11 +101,12 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) { if (minVolume == maxVolume) {
return; return;
} }
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
int oldVolume = streamVolumeManager.getVolume(); int oldVolume = streamVolumeManager.getVolume();
int targetVolume = oldVolume == maxVolume ? minVolume : maxVolume; int targetVolume = oldVolume == maxVolume ? minVolume : maxVolume;
streamVolumeManager.setVolume(targetVolume); streamVolumeManager.setVolume(targetVolume, volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume);
assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume); assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume);
...@@ -120,11 +121,12 @@ public class StreamVolumeManagerTest { ...@@ -120,11 +121,12 @@ public class StreamVolumeManagerTest {
int maxVolume = streamVolumeManager.getMaxVolume(); int maxVolume = streamVolumeManager.getMaxVolume();
int minVolume = streamVolumeManager.getMinVolume(); int minVolume = streamVolumeManager.getMinVolume();
int oldVolume = streamVolumeManager.getVolume(); int oldVolume = streamVolumeManager.getVolume();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume + 1); streamVolumeManager.setVolume(maxVolume + 1, volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(oldVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(oldVolume);
streamVolumeManager.setVolume(minVolume - 1); streamVolumeManager.setVolume(minVolume - 1, volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(oldVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(oldVolume);
}); });
} }
...@@ -138,11 +140,12 @@ public class StreamVolumeManagerTest { ...@@ -138,11 +140,12 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) { if (minVolume == maxVolume) {
return; return;
} }
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(minVolume); streamVolumeManager.setVolume(minVolume, volumeFlags);
int targetVolume = minVolume + 1; int targetVolume = minVolume + 1;
streamVolumeManager.increaseVolume(); streamVolumeManager.increaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume);
assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume); assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume);
...@@ -155,9 +158,10 @@ public class StreamVolumeManagerTest { ...@@ -155,9 +158,10 @@ public class StreamVolumeManagerTest {
testThread.runOnMainThread( testThread.runOnMainThread(
() -> { () -> {
int maxVolume = streamVolumeManager.getMaxVolume(); int maxVolume = streamVolumeManager.getMaxVolume();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume); streamVolumeManager.setVolume(maxVolume, volumeFlags);
streamVolumeManager.increaseVolume(); streamVolumeManager.increaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(maxVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(maxVolume);
}); });
...@@ -172,11 +176,12 @@ public class StreamVolumeManagerTest { ...@@ -172,11 +176,12 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) { if (minVolume == maxVolume) {
return; return;
} }
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume); streamVolumeManager.setVolume(maxVolume, volumeFlags);
int targetVolume = maxVolume - 1; int targetVolume = maxVolume - 1;
streamVolumeManager.decreaseVolume(); streamVolumeManager.decreaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume);
assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume); assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume);
...@@ -189,9 +194,10 @@ public class StreamVolumeManagerTest { ...@@ -189,9 +194,10 @@ public class StreamVolumeManagerTest {
testThread.runOnMainThread( testThread.runOnMainThread(
() -> { () -> {
int minVolume = streamVolumeManager.getMinVolume(); int minVolume = streamVolumeManager.getMinVolume();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(minVolume); streamVolumeManager.setVolume(minVolume, volumeFlags);
streamVolumeManager.decreaseVolume(); streamVolumeManager.decreaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(minVolume); assertThat(streamVolumeManager.getVolume()).isEqualTo(minVolume);
}); });
...@@ -206,15 +212,16 @@ public class StreamVolumeManagerTest { ...@@ -206,15 +212,16 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume || minVolume > 0) { if (minVolume == maxVolume || minVolume > 0) {
return; return;
} }
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume); streamVolumeManager.setVolume(maxVolume, volumeFlags);
assertThat(streamVolumeManager.isMuted()).isFalse(); assertThat(streamVolumeManager.isMuted()).isFalse();
streamVolumeManager.setMuted(true); streamVolumeManager.setMuted(true, volumeFlags);
assertThat(streamVolumeManager.isMuted()).isTrue(); assertThat(streamVolumeManager.isMuted()).isTrue();
assertThat(testListener.lastStreamVolumeMuted).isTrue(); assertThat(testListener.lastStreamVolumeMuted).isTrue();
streamVolumeManager.setMuted(false); streamVolumeManager.setMuted(false, volumeFlags);
assertThat(streamVolumeManager.isMuted()).isFalse(); assertThat(streamVolumeManager.isMuted()).isFalse();
assertThat(testListener.lastStreamVolumeMuted).isFalse(); assertThat(testListener.lastStreamVolumeMuted).isFalse();
assertThat(testListener.lastStreamVolume).isEqualTo(maxVolume); assertThat(testListener.lastStreamVolume).isEqualTo(maxVolume);
...@@ -230,6 +237,7 @@ public class StreamVolumeManagerTest { ...@@ -230,6 +237,7 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) { if (minVolume == maxVolume) {
return; return;
} }
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
int testStreamType = C.STREAM_TYPE_ALARM; int testStreamType = C.STREAM_TYPE_ALARM;
int testStreamVolume = audioManager.getStreamVolume(testStreamType); int testStreamVolume = audioManager.getStreamVolume(testStreamType);
...@@ -237,7 +245,7 @@ public class StreamVolumeManagerTest { ...@@ -237,7 +245,7 @@ public class StreamVolumeManagerTest {
int oldVolume = streamVolumeManager.getVolume(); int oldVolume = streamVolumeManager.getVolume();
if (oldVolume == testStreamVolume) { if (oldVolume == testStreamVolume) {
int differentVolume = oldVolume == minVolume ? maxVolume : minVolume; int differentVolume = oldVolume == minVolume ? maxVolume : minVolume;
streamVolumeManager.setVolume(differentVolume); streamVolumeManager.setVolume(differentVolume, volumeFlags);
} }
streamVolumeManager.setStreamType(testStreamType); streamVolumeManager.setStreamType(testStreamType);
......
...@@ -298,7 +298,9 @@ import java.util.concurrent.TimeoutException; ...@@ -298,7 +298,9 @@ import java.util.concurrent.TimeoutException;
COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME, COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT, COMMAND_GET_TEXT,
COMMAND_RELEASE) COMMAND_RELEASE)
...@@ -1692,28 +1694,68 @@ import java.util.concurrent.TimeoutException; ...@@ -1692,28 +1694,68 @@ import java.util.concurrent.TimeoutException;
return streamVolumeManager.isMuted(); return streamVolumeManager.isMuted();
} }
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceVolume(int volume) { public void setDeviceVolume(int volume) {
verifyApplicationThread(); verifyApplicationThread();
streamVolumeManager.setVolume(volume); streamVolumeManager.setVolume(volume, C.VOLUME_FLAG_SHOW_UI);
}
@Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {
verifyApplicationThread();
streamVolumeManager.setVolume(volume, flags);
} }
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override @Override
public void increaseDeviceVolume() { public void increaseDeviceVolume() {
verifyApplicationThread(); verifyApplicationThread();
streamVolumeManager.increaseVolume(); streamVolumeManager.increaseVolume(C.VOLUME_FLAG_SHOW_UI);
}
@Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {
verifyApplicationThread();
streamVolumeManager.increaseVolume(flags);
} }
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override @Override
public void decreaseDeviceVolume() { public void decreaseDeviceVolume() {
verifyApplicationThread(); verifyApplicationThread();
streamVolumeManager.decreaseVolume(); streamVolumeManager.decreaseVolume(C.VOLUME_FLAG_SHOW_UI);
}
@Override
public void decreaseDeviceVolume(@C.VolumeFlags int flags) {
verifyApplicationThread();
streamVolumeManager.decreaseVolume(flags);
} }
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceMuted(boolean muted) { public void setDeviceMuted(boolean muted) {
verifyApplicationThread(); verifyApplicationThread();
streamVolumeManager.setMuted(muted); streamVolumeManager.setMuted(muted, C.VOLUME_FLAG_SHOW_UI);
}
@Override
public void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
verifyApplicationThread();
streamVolumeManager.setMuted(muted, flags);
} }
@Override @Override
......
...@@ -1266,6 +1266,10 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -1266,6 +1266,10 @@ public class SimpleExoPlayer extends BasePlayer
return player.isDeviceMuted(); return player.isDeviceMuted();
} }
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceVolume(int volume) { public void setDeviceVolume(int volume) {
blockUntilConstructorFinished(); blockUntilConstructorFinished();
...@@ -1273,24 +1277,60 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -1273,24 +1277,60 @@ public class SimpleExoPlayer extends BasePlayer
} }
@Override @Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {
blockUntilConstructorFinished();
player.setDeviceVolume(volume, flags);
}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void increaseDeviceVolume() { public void increaseDeviceVolume() {
blockUntilConstructorFinished(); blockUntilConstructorFinished();
player.increaseDeviceVolume(); player.increaseDeviceVolume();
} }
@Override @Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {
blockUntilConstructorFinished();
player.increaseDeviceVolume(flags);
}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void decreaseDeviceVolume() { public void decreaseDeviceVolume() {
blockUntilConstructorFinished(); blockUntilConstructorFinished();
player.decreaseDeviceVolume(); player.decreaseDeviceVolume();
} }
@Override @Override
public void decreaseDeviceVolume(@C.VolumeFlags int flags) {
blockUntilConstructorFinished();
player.decreaseDeviceVolume(flags);
}
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override
public void setDeviceMuted(boolean muted) { public void setDeviceMuted(boolean muted) {
blockUntilConstructorFinished(); blockUntilConstructorFinished();
player.setDeviceMuted(muted); player.setDeviceMuted(muted);
} }
@Override @Override
public void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
blockUntilConstructorFinished();
player.setDeviceMuted(muted, flags);
}
@Override
public boolean isTunnelingEnabled() { public boolean isTunnelingEnabled() {
blockUntilConstructorFinished(); blockUntilConstructorFinished();
return player.isTunnelingEnabled(); return player.isTunnelingEnabled();
......
...@@ -45,9 +45,6 @@ import com.google.android.exoplayer2.util.Util; ...@@ -45,9 +45,6 @@ import com.google.android.exoplayer2.util.Util;
// Copied from AudioManager#VOLUME_CHANGED_ACTION // Copied from AudioManager#VOLUME_CHANGED_ACTION
private static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION"; private static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION";
// TODO(b/153317944): Allow users to override these flags.
private static final int VOLUME_FLAGS = AudioManager.FLAG_SHOW_UI;
private final Context applicationContext; private final Context applicationContext;
private final Handler eventHandler; private final Handler eventHandler;
private final Listener listener; private final Listener listener;
...@@ -119,46 +116,58 @@ import com.google.android.exoplayer2.util.Util; ...@@ -119,46 +116,58 @@ import com.google.android.exoplayer2.util.Util;
} }
/** /**
* Sets the volume with the given value for the current audio stream. The value should be between * Sets the volume with the given value for the current audio stream with specified volume flags.
* {@link #getMinVolume()} and {@link #getMaxVolume()}, otherwise it will be ignored. *
* @param volume The value should be between {@link #getMinVolume()} and {@link #getMaxVolume()},
* otherwise the volume will not be changed.
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
public void setVolume(int volume) { public void setVolume(int volume, @C.VolumeFlags int flags) {
if (volume < getMinVolume() || volume > getMaxVolume()) { if (volume < getMinVolume() || volume > getMaxVolume()) {
return; return;
} }
audioManager.setStreamVolume(streamType, volume, VOLUME_FLAGS); audioManager.setStreamVolume(streamType, volume, flags);
updateVolumeAndNotifyIfChanged(); updateVolumeAndNotifyIfChanged();
} }
/** /**
* Increases the volume by one for the current audio stream. It will be ignored if the current * Increases the volume by one for the current audio stream with specified volume flags. If the
* volume is equal to {@link #getMaxVolume()}. * current volume is equal to {@link #getMaxVolume()}, it will not be increased.
*
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
public void increaseVolume() { public void increaseVolume(@C.VolumeFlags int flags) {
if (volume >= getMaxVolume()) { if (volume >= getMaxVolume()) {
return; return;
} }
audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_RAISE, VOLUME_FLAGS); audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_RAISE, flags);
updateVolumeAndNotifyIfChanged(); updateVolumeAndNotifyIfChanged();
} }
/** /**
* Decreases the volume by one for the current audio stream. It will be ignored if the current * Decreases the volume by one for the current audio stream with specified volume flags. If the
* volume is equal to {@link #getMinVolume()}. * current volume is equal to {@link #getMinVolume()}, it will be be decreased.
*
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/ */
public void decreaseVolume() { public void decreaseVolume(@C.VolumeFlags int flags) {
if (volume <= getMinVolume()) { if (volume <= getMinVolume()) {
return; return;
} }
audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_LOWER, VOLUME_FLAGS); audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_LOWER, flags);
updateVolumeAndNotifyIfChanged(); updateVolumeAndNotifyIfChanged();
} }
/** Sets the mute state of the current audio stream. */ /**
public void setMuted(boolean muted) { * Sets the mute state of the current audio stream with specified volume flags.
*
* @param muted Whether to mute or to unmute the stream.
* @param flags Either 0 or a bitwise combination of one or more {@link C.VolumeFlags}.
*/
public void setMuted(boolean muted, @C.VolumeFlags int flags) {
if (Util.SDK_INT >= 23) { if (Util.SDK_INT >= 23) {
audioManager.adjustStreamVolume( audioManager.adjustStreamVolume(
streamType, muted ? AudioManager.ADJUST_MUTE : AudioManager.ADJUST_UNMUTE, VOLUME_FLAGS); streamType, muted ? AudioManager.ADJUST_MUTE : AudioManager.ADJUST_UNMUTE, flags);
} else { } else {
audioManager.setStreamMute(streamType, muted); audioManager.setStreamMute(streamType, muted);
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import static com.google.android.exoplayer2.Player.COMMAND_ADJUST_DEVICE_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_ADJUST_DEVICE_VOLUME;
import static com.google.android.exoplayer2.Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS;
import static com.google.android.exoplayer2.Player.COMMAND_CHANGE_MEDIA_ITEMS; import static com.google.android.exoplayer2.Player.COMMAND_CHANGE_MEDIA_ITEMS;
import static com.google.android.exoplayer2.Player.COMMAND_GET_AUDIO_ATTRIBUTES; import static com.google.android.exoplayer2.Player.COMMAND_GET_AUDIO_ATTRIBUTES;
import static com.google.android.exoplayer2.Player.COMMAND_GET_CURRENT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_GET_CURRENT_MEDIA_ITEM;
...@@ -38,6 +39,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_IT ...@@ -38,6 +39,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_IT
import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS;
import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM;
import static com.google.android.exoplayer2.Player.COMMAND_SET_DEVICE_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_SET_DEVICE_VOLUME;
import static com.google.android.exoplayer2.Player.COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS;
import static com.google.android.exoplayer2.Player.COMMAND_SET_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SET_MEDIA_ITEM;
import static com.google.android.exoplayer2.Player.COMMAND_SET_PLAYLIST_METADATA; import static com.google.android.exoplayer2.Player.COMMAND_SET_PLAYLIST_METADATA;
import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE;
...@@ -12241,11 +12243,13 @@ public final class ExoPlayerTest { ...@@ -12241,11 +12243,13 @@ public final class ExoPlayerTest {
player.addListener(listener); player.addListener(listener);
int deviceVolume = player.getDeviceVolume(); int deviceVolume = player.getDeviceVolume();
int noVolumeFlags = 0;
int volumeFlags = C.VOLUME_FLAG_PLAY_SOUND | C.VOLUME_FLAG_VIBRATE;
try { try {
player.setDeviceVolume(deviceVolume + 1); // No-op if at max volume. player.setDeviceVolume(deviceVolume + 1, noVolumeFlags); // No-op if at max volume.
player.setDeviceVolume(deviceVolume - 1); // No-op if at min volume. player.setDeviceVolume(deviceVolume - 1, noVolumeFlags); // No-op if at min volume.
} finally { } finally {
player.setDeviceVolume(deviceVolume); // Restore original volume. player.setDeviceVolume(deviceVolume, volumeFlags); // Restore original volume.
} }
player.release(); player.release();
...@@ -12416,7 +12420,9 @@ public final class ExoPlayerTest { ...@@ -12416,7 +12420,9 @@ public final class ExoPlayerTest {
COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME, COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT, COMMAND_GET_TEXT,
COMMAND_SET_TRACK_SELECTION_PARAMETERS, COMMAND_SET_TRACK_SELECTION_PARAMETERS,
......
...@@ -22,6 +22,7 @@ import android.view.SurfaceView; ...@@ -22,6 +22,7 @@ import android.view.SurfaceView;
import android.view.TextureView; import android.view.TextureView;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.BasePlayer; import com.google.android.exoplayer2.BasePlayer;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DeviceInfo; import com.google.android.exoplayer2.DeviceInfo;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.MediaMetadata;
...@@ -368,23 +369,59 @@ public class StubPlayer extends BasePlayer { ...@@ -368,23 +369,59 @@ public class StubPlayer extends BasePlayer {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override @Override
public void setDeviceVolume(int volume) { public void setDeviceVolume(int volume) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override @Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {
throw new UnsupportedOperationException();
}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void increaseDeviceVolume() { public void increaseDeviceVolume() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override @Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {
throw new UnsupportedOperationException();
}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void decreaseDeviceVolume() { public void decreaseDeviceVolume() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override @Override
public void decreaseDeviceVolume(@C.VolumeFlags int flags) {
throw new UnsupportedOperationException();
}
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override
public void setDeviceMuted(boolean muted) { public void setDeviceMuted(boolean muted) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
throw new UnsupportedOperationException();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment