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 @@
apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle"
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 project(modulePrefix + 'library-common')
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
......
......@@ -753,22 +753,50 @@ public final class CastPlayer extends BasePlayer {
return false;
}
/** This method is not supported and does nothing. */
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override
public void setDeviceVolume(int volume) {}
/** This method is not supported and does nothing. */
@Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void increaseDeviceVolume() {}
/** This method is not supported and does nothing. */
@Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void decreaseDeviceVolume() {}
/** This method is not supported and does nothing. */
@Override
public void decreaseDeviceVolume(@C.VolumeFlags int flags) {}
/**
* @deprecated Use {@link #setDeviceMuted(boolean, int)} instead.
*/
@Deprecated
@Override
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.
// Call deprecated callbacks.
......
......@@ -405,6 +405,37 @@ public final class C {
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:
*
* <ul>
......
......@@ -848,30 +848,66 @@ public class ForwardingPlayer implements Player {
return player.isDeviceMuted();
}
/** Calls {@link Player#setDeviceVolume(int)} on the delegate. */
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override
public void setDeviceVolume(int 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
public void 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
public void 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
public void setDeviceMuted(boolean 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. */
public Player getWrappedPlayer() {
return player;
......
......@@ -378,7 +378,9 @@ public interface Player {
COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT,
COMMAND_SET_TRACK_SELECTION_PARAMETERS,
......@@ -1426,7 +1428,9 @@ public interface Player {
* <li>{@link #COMMAND_GET_DEVICE_VOLUME}
* <li>{@link #COMMAND_SET_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_WITH_FLAGS}
* <li>{@link #COMMAND_SET_VIDEO_SURFACE}
* <li>{@link #COMMAND_GET_TEXT}
* <li>{@link #COMMAND_SET_TRACK_SELECTION_PARAMETERS}
......@@ -1470,7 +1474,9 @@ public interface Player {
COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT,
COMMAND_SET_TRACK_SELECTION_PARAMETERS,
......@@ -1776,27 +1782,36 @@ public interface Player {
* #isCommandAvailable(int) available}.
*/
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
* #isCommandAvailable(int) available}.
* <p>The {@link #setDeviceVolume(int, int)} method must only be called if this command is
* {@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
* #isCommandAvailable(int) available}:
*
* <ul>
* <li>{@link #increaseDeviceVolume()}
* <li>{@link #decreaseDeviceVolume()}
* <li>{@link #setDeviceMuted(boolean)}
* <li>{@link #increaseDeviceVolume(int)}
* <li>{@link #decreaseDeviceVolume(int)}
* <li>{@link #setDeviceMuted(boolean, int)}
* </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.
......@@ -3067,36 +3082,68 @@ public interface Player {
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
* #getAvailableCommands() available}.
* <p>This method must only be called if {@link #COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS} is
* {@linkplain #getAvailableCommands() available}.
*
* @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.
*
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME} is {@linkplain
* #getAvailableCommands() available}.
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is
* {@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.
*
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME} is {@linkplain
* #getAvailableCommands() available}.
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is
* {@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.
*
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME} is {@linkplain
* #getAvailableCommands() available}.
* <p>This method must only be called if {@link #COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS} is
* {@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 {
return state.isDeviceMuted;
}
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override
public final void setDeviceVolume(int volume) {
verifyApplicationThreadAndInitState();
......@@ -2673,11 +2677,28 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleSetDeviceVolume(volume),
/* pendingOperation= */ handleSetDeviceVolume(volume, C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () -> state.buildUpon().setDeviceVolume(volume).build());
}
@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() {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
......@@ -2686,12 +2707,30 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleIncreaseDeviceVolume(),
/* pendingOperation= */ handleIncreaseDeviceVolume(C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () ->
state.buildUpon().setDeviceVolume(state.deviceVolume + 1).build());
}
@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() {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
......@@ -2700,12 +2739,30 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return;
}
updateStateForPendingOperation(
/* pendingOperation= */ handleDecreaseDeviceVolume(),
/* pendingOperation= */ handleDecreaseDeviceVolume(C.VOLUME_FLAG_SHOW_UI),
/* placeholderStateSupplier= */ () ->
state.buildUpon().setDeviceVolume(max(0, state.deviceVolume - 1)).build());
}
@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) {
verifyApplicationThreadAndInitState();
// Use a local copy to ensure the lambda below uses the current state value.
......@@ -2714,7 +2771,20 @@ public abstract class SimpleBasePlayer extends BasePlayer {
return;
}
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());
}
......@@ -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 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}
* changes caused by this call.
*/
@ForOverride
protected ListenableFuture<?> handleSetDeviceVolume(@IntRange(from = 0) int deviceVolume) {
throw new IllegalStateException("Missing implementation to handle COMMAND_SET_DEVICE_VOLUME");
protected ListenableFuture<?> handleSetDeviceVolume(
@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}
* changes caused by this call.
*/
@ForOverride
protected ListenableFuture<?> handleIncreaseDeviceVolume() {
protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
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}
* changes caused by this call.
*/
@ForOverride
protected ListenableFuture<?> handleDecreaseDeviceVolume() {
protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
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 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}
* changes caused by this call.
*/
@ForOverride
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) {
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
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 {
.build();
// Set a different one to the one requested to ensure the updated state is used.
State updatedState = state.buildUpon().setDeviceVolume(6).build();
AtomicInteger flagsFromHandlerRef = new AtomicInteger();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
private State playerState = state;
......@@ -3207,18 +3209,20 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleSetDeviceVolume(int volume) {
protected ListenableFuture<?> handleSetDeviceVolume(int volume, int flags) {
playerState = updatedState;
flagsFromHandlerRef.set(flags);
return Futures.immediateVoidFuture();
}
};
Listener listener = mock(Listener.class);
player.addListener(listener);
player.setDeviceVolume(3);
player.setDeviceVolume(3, volumeFlags);
assertThat(player.getDeviceVolume()).isEqualTo(6);
verify(listener).onDeviceVolumeChanged(6, /* muted= */ false);
assertThat(flagsFromHandlerRef.get()).isEqualTo(volumeFlags);
verifyNoMoreInteractions(listener);
}
......@@ -3229,6 +3233,8 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(new Commands.Builder().addAllCommands().build())
.build();
// 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();
SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player =
......@@ -3239,18 +3245,20 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleSetDeviceVolume(int volume) {
protected ListenableFuture<?> handleSetDeviceVolume(int volume, int flags) {
flagsFromHandlerRef.set(flags);
return future;
}
};
Listener listener = mock(Listener.class);
player.addListener(listener);
player.setDeviceVolume(3);
player.setDeviceVolume(3, volumeFlags);
// Verify placeholder state and listener calls.
assertThat(player.getDeviceVolume()).isEqualTo(3);
verify(listener).onDeviceVolumeChanged(3, /* muted= */ false);
assertThat(flagsFromHandlerRef.get()).isEqualTo(volumeFlags);
verifyNoMoreInteractions(listener);
future.set(null);
......@@ -3268,9 +3276,11 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(
new Commands.Builder()
.addAllCommands()
.remove(Player.COMMAND_SET_DEVICE_VOLUME)
.remove(Player.COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)
.build())
.build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_REMOVE_SOUND_AND_VIBRATE;
AtomicInteger flagsFromHandlerRef = new AtomicInteger();
AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3280,14 +3290,16 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleSetDeviceVolume(int volume) {
protected ListenableFuture<?> handleSetDeviceVolume(int volume, int flags) {
callForwarded.set(true);
flagsFromHandlerRef.set(flags);
return Futures.immediateVoidFuture();
}
};
player.setDeviceVolume(3);
player.setDeviceVolume(3, volumeFlags);
assertThat(flagsFromHandlerRef.get()).isEqualTo(0); // no flags have been passed
assertThat(callForwarded.get()).isFalse();
}
......@@ -3299,6 +3311,7 @@ public class SimpleBasePlayerTest {
.setDeviceVolume(3)
.build();
// 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();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3310,7 +3323,7 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleIncreaseDeviceVolume() {
protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
playerState = updatedState;
return Futures.immediateVoidFuture();
}
......@@ -3318,7 +3331,7 @@ public class SimpleBasePlayerTest {
Listener listener = mock(Listener.class);
player.addListener(listener);
player.increaseDeviceVolume();
player.increaseDeviceVolume(volumeFlags);
assertThat(player.getDeviceVolume()).isEqualTo(6);
verify(listener).onDeviceVolumeChanged(6, /* muted= */ false);
......@@ -3333,6 +3346,7 @@ public class SimpleBasePlayerTest {
.setDeviceVolume(3)
.build();
// 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();
SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player =
......@@ -3343,14 +3357,14 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleIncreaseDeviceVolume() {
protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
return future;
}
};
Listener listener = mock(Listener.class);
player.addListener(listener);
player.increaseDeviceVolume();
player.increaseDeviceVolume(volumeFlags);
// Verify placeholder state and listener calls.
assertThat(player.getDeviceVolume()).isEqualTo(4);
......@@ -3372,9 +3386,10 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(
new Commands.Builder()
.addAllCommands()
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME)
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)
.build())
.build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_PLAY_SOUND;
AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3384,13 +3399,13 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleIncreaseDeviceVolume() {
protected ListenableFuture<?> handleIncreaseDeviceVolume(@C.VolumeFlags int flags) {
callForwarded.set(true);
return Futures.immediateVoidFuture();
}
};
player.increaseDeviceVolume();
player.increaseDeviceVolume(volumeFlags);
assertThat(callForwarded.get()).isFalse();
}
......@@ -3404,6 +3419,7 @@ public class SimpleBasePlayerTest {
.build();
// Set a different one to the one requested to ensure the updated state is used.
State updatedState = state.buildUpon().setDeviceVolume(1).build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_PLAY_SOUND;
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
private State playerState = state;
......@@ -3414,7 +3430,7 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleDecreaseDeviceVolume() {
protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
playerState = updatedState;
return Futures.immediateVoidFuture();
}
......@@ -3422,7 +3438,7 @@ public class SimpleBasePlayerTest {
Listener listener = mock(Listener.class);
player.addListener(listener);
player.decreaseDeviceVolume();
player.decreaseDeviceVolume(volumeFlags);
assertThat(player.getDeviceVolume()).isEqualTo(1);
verify(listener).onDeviceVolumeChanged(1, /* muted= */ false);
......@@ -3437,6 +3453,7 @@ public class SimpleBasePlayerTest {
.setDeviceVolume(3)
.build();
// 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();
SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player =
......@@ -3447,14 +3464,14 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleDecreaseDeviceVolume() {
protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
return future;
}
};
Listener listener = mock(Listener.class);
player.addListener(listener);
player.decreaseDeviceVolume();
player.decreaseDeviceVolume(volumeFlags);
// Verify placeholder state and listener calls.
assertThat(player.getDeviceVolume()).isEqualTo(2);
......@@ -3476,9 +3493,10 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(
new Commands.Builder()
.addAllCommands()
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME)
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)
.build())
.build();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3488,13 +3506,13 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleDecreaseDeviceVolume() {
protected ListenableFuture<?> handleDecreaseDeviceVolume(@C.VolumeFlags int flags) {
callForwarded.set(true);
return Futures.immediateVoidFuture();
}
};
player.decreaseDeviceVolume();
player.decreaseDeviceVolume(volumeFlags);
assertThat(callForwarded.get()).isFalse();
}
......@@ -3506,6 +3524,7 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(new Commands.Builder().addAllCommands().build())
.build();
// 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();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3517,7 +3536,8 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) {
protected ListenableFuture<?> handleSetDeviceMuted(
boolean muted, @C.VolumeFlags int flags) {
playerState = updatedState;
return Futures.immediateVoidFuture();
}
......@@ -3525,7 +3545,7 @@ public class SimpleBasePlayerTest {
Listener listener = mock(Listener.class);
player.addListener(listener);
player.setDeviceMuted(true);
player.setDeviceMuted(true, volumeFlags);
assertThat(player.isDeviceMuted()).isTrue();
assertThat(player.getDeviceVolume()).isEqualTo(6);
......@@ -3539,6 +3559,7 @@ public class SimpleBasePlayerTest {
new State.Builder()
.setAvailableCommands(new Commands.Builder().addAllCommands().build())
.build();
int volumeFlags = C.VOLUME_FLAG_VIBRATE;
SettableFuture<?> future = SettableFuture.create();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3550,14 +3571,15 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) {
protected ListenableFuture<?> handleSetDeviceMuted(
boolean muted, @C.VolumeFlags int flags) {
return future;
}
};
Listener listener = mock(Listener.class);
player.addListener(listener);
player.setDeviceMuted(true);
player.setDeviceMuted(true, volumeFlags);
// Verify placeholder state and listener calls.
assertThat(player.isDeviceMuted()).isTrue();
......@@ -3579,9 +3601,10 @@ public class SimpleBasePlayerTest {
.setAvailableCommands(
new Commands.Builder()
.addAllCommands()
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME)
.remove(Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)
.build())
.build();
int volumeFlags = C.VOLUME_FLAG_VIBRATE;
AtomicBoolean callForwarded = new AtomicBoolean();
SimpleBasePlayer player =
new SimpleBasePlayer(Looper.myLooper()) {
......@@ -3591,13 +3614,14 @@ public class SimpleBasePlayerTest {
}
@Override
protected ListenableFuture<?> handleSetDeviceMuted(boolean muted) {
protected ListenableFuture<?> handleSetDeviceMuted(
boolean muted, @C.VolumeFlags int flags) {
callForwarded.set(true);
return Futures.immediateVoidFuture();
}
};
player.setDeviceMuted(true);
player.setDeviceMuted(true, volumeFlags);
assertThat(callForwarded.get()).isFalse();
}
......
......@@ -101,11 +101,12 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) {
return;
}
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
int oldVolume = streamVolumeManager.getVolume();
int targetVolume = oldVolume == maxVolume ? minVolume : maxVolume;
streamVolumeManager.setVolume(targetVolume);
streamVolumeManager.setVolume(targetVolume, volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume);
assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume);
......@@ -120,11 +121,12 @@ public class StreamVolumeManagerTest {
int maxVolume = streamVolumeManager.getMaxVolume();
int minVolume = streamVolumeManager.getMinVolume();
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);
streamVolumeManager.setVolume(minVolume - 1);
streamVolumeManager.setVolume(minVolume - 1, volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(oldVolume);
});
}
......@@ -138,11 +140,12 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) {
return;
}
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(minVolume);
streamVolumeManager.setVolume(minVolume, volumeFlags);
int targetVolume = minVolume + 1;
streamVolumeManager.increaseVolume();
streamVolumeManager.increaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume);
assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume);
......@@ -155,9 +158,10 @@ public class StreamVolumeManagerTest {
testThread.runOnMainThread(
() -> {
int maxVolume = streamVolumeManager.getMaxVolume();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume);
streamVolumeManager.increaseVolume();
streamVolumeManager.setVolume(maxVolume, volumeFlags);
streamVolumeManager.increaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(maxVolume);
});
......@@ -172,11 +176,12 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) {
return;
}
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume);
streamVolumeManager.setVolume(maxVolume, volumeFlags);
int targetVolume = maxVolume - 1;
streamVolumeManager.decreaseVolume();
streamVolumeManager.decreaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(targetVolume);
assertThat(testListener.lastStreamVolume).isEqualTo(targetVolume);
......@@ -189,9 +194,10 @@ public class StreamVolumeManagerTest {
testThread.runOnMainThread(
() -> {
int minVolume = streamVolumeManager.getMinVolume();
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(minVolume);
streamVolumeManager.decreaseVolume();
streamVolumeManager.setVolume(minVolume, volumeFlags);
streamVolumeManager.decreaseVolume(volumeFlags);
assertThat(streamVolumeManager.getVolume()).isEqualTo(minVolume);
});
......@@ -206,15 +212,16 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume || minVolume > 0) {
return;
}
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
streamVolumeManager.setVolume(maxVolume);
streamVolumeManager.setVolume(maxVolume, volumeFlags);
assertThat(streamVolumeManager.isMuted()).isFalse();
streamVolumeManager.setMuted(true);
streamVolumeManager.setMuted(true, volumeFlags);
assertThat(streamVolumeManager.isMuted()).isTrue();
assertThat(testListener.lastStreamVolumeMuted).isTrue();
streamVolumeManager.setMuted(false);
streamVolumeManager.setMuted(false, volumeFlags);
assertThat(streamVolumeManager.isMuted()).isFalse();
assertThat(testListener.lastStreamVolumeMuted).isFalse();
assertThat(testListener.lastStreamVolume).isEqualTo(maxVolume);
......@@ -230,6 +237,7 @@ public class StreamVolumeManagerTest {
if (minVolume == maxVolume) {
return;
}
int volumeFlags = C.VOLUME_FLAG_SHOW_UI | C.VOLUME_FLAG_VIBRATE;
int testStreamType = C.STREAM_TYPE_ALARM;
int testStreamVolume = audioManager.getStreamVolume(testStreamType);
......@@ -237,7 +245,7 @@ public class StreamVolumeManagerTest {
int oldVolume = streamVolumeManager.getVolume();
if (oldVolume == testStreamVolume) {
int differentVolume = oldVolume == minVolume ? maxVolume : minVolume;
streamVolumeManager.setVolume(differentVolume);
streamVolumeManager.setVolume(differentVolume, volumeFlags);
}
streamVolumeManager.setStreamType(testStreamType);
......
......@@ -298,7 +298,9 @@ import java.util.concurrent.TimeoutException;
COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT,
COMMAND_RELEASE)
......@@ -1692,28 +1694,68 @@ import java.util.concurrent.TimeoutException;
return streamVolumeManager.isMuted();
}
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override
public void setDeviceVolume(int volume) {
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
public void increaseDeviceVolume() {
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
public void decreaseDeviceVolume() {
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
public void setDeviceMuted(boolean muted) {
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
......
......@@ -1266,6 +1266,10 @@ public class SimpleExoPlayer extends BasePlayer
return player.isDeviceMuted();
}
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override
public void setDeviceVolume(int volume) {
blockUntilConstructorFinished();
......@@ -1273,24 +1277,60 @@ public class SimpleExoPlayer extends BasePlayer
}
@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() {
blockUntilConstructorFinished();
player.increaseDeviceVolume();
}
@Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {
blockUntilConstructorFinished();
player.increaseDeviceVolume(flags);
}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void decreaseDeviceVolume() {
blockUntilConstructorFinished();
player.decreaseDeviceVolume();
}
@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) {
blockUntilConstructorFinished();
player.setDeviceMuted(muted);
}
@Override
public void setDeviceMuted(boolean muted, @C.VolumeFlags int flags) {
blockUntilConstructorFinished();
player.setDeviceMuted(muted, flags);
}
@Override
public boolean isTunnelingEnabled() {
blockUntilConstructorFinished();
return player.isTunnelingEnabled();
......
......@@ -45,9 +45,6 @@ import com.google.android.exoplayer2.util.Util;
// Copied from AudioManager#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 Handler eventHandler;
private final Listener listener;
......@@ -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
* {@link #getMinVolume()} and {@link #getMaxVolume()}, otherwise it will be ignored.
* Sets the volume with the given value for the current audio stream with specified volume flags.
*
* @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()) {
return;
}
audioManager.setStreamVolume(streamType, volume, VOLUME_FLAGS);
audioManager.setStreamVolume(streamType, volume, flags);
updateVolumeAndNotifyIfChanged();
}
/**
* Increases the volume by one for the current audio stream. It will be ignored if the current
* volume is equal to {@link #getMaxVolume()}.
* Increases the volume by one for the current audio stream with specified volume flags. If the
* 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()) {
return;
}
audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_RAISE, VOLUME_FLAGS);
audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_RAISE, flags);
updateVolumeAndNotifyIfChanged();
}
/**
* Decreases the volume by one for the current audio stream. It will be ignored if the current
* volume is equal to {@link #getMinVolume()}.
* Decreases the volume by one for the current audio stream with specified volume flags. If the
* 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()) {
return;
}
audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_LOWER, VOLUME_FLAGS);
audioManager.adjustStreamVolume(streamType, AudioManager.ADJUST_LOWER, flags);
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) {
audioManager.adjustStreamVolume(
streamType, muted ? AudioManager.ADJUST_MUTE : AudioManager.ADJUST_UNMUTE, VOLUME_FLAGS);
streamType, muted ? AudioManager.ADJUST_MUTE : AudioManager.ADJUST_UNMUTE, flags);
} else {
audioManager.setStreamMute(streamType, muted);
}
......
......@@ -16,6 +16,7 @@
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_WITH_FLAGS;
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_CURRENT_MEDIA_ITEM;
......@@ -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_MEDIA_ITEM;
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_PLAYLIST_METADATA;
import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE;
......@@ -12241,11 +12243,13 @@ public final class ExoPlayerTest {
player.addListener(listener);
int deviceVolume = player.getDeviceVolume();
int noVolumeFlags = 0;
int volumeFlags = C.VOLUME_FLAG_PLAY_SOUND | C.VOLUME_FLAG_VIBRATE;
try {
player.setDeviceVolume(deviceVolume + 1); // 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 max volume.
player.setDeviceVolume(deviceVolume - 1, noVolumeFlags); // No-op if at min volume.
} finally {
player.setDeviceVolume(deviceVolume); // Restore original volume.
player.setDeviceVolume(deviceVolume, volumeFlags); // Restore original volume.
}
player.release();
......@@ -12416,7 +12420,9 @@ public final class ExoPlayerTest {
COMMAND_GET_DEVICE_VOLUME,
COMMAND_SET_VOLUME,
COMMAND_SET_DEVICE_VOLUME,
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_ADJUST_DEVICE_VOLUME,
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS,
COMMAND_SET_VIDEO_SURFACE,
COMMAND_GET_TEXT,
COMMAND_SET_TRACK_SELECTION_PARAMETERS,
......
......@@ -22,6 +22,7 @@ import android.view.SurfaceView;
import android.view.TextureView;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.BasePlayer;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DeviceInfo;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.MediaMetadata;
......@@ -368,23 +369,59 @@ public class StubPlayer extends BasePlayer {
throw new UnsupportedOperationException();
}
/**
* @deprecated Use {@link #setDeviceVolume(int, int)} instead.
*/
@Deprecated
@Override
public void setDeviceVolume(int volume) {
throw new UnsupportedOperationException();
}
@Override
public void setDeviceVolume(int volume, @C.VolumeFlags int flags) {
throw new UnsupportedOperationException();
}
/**
* @deprecated Use {@link #increaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void increaseDeviceVolume() {
throw new UnsupportedOperationException();
}
@Override
public void increaseDeviceVolume(@C.VolumeFlags int flags) {
throw new UnsupportedOperationException();
}
/**
* @deprecated Use {@link #decreaseDeviceVolume(int)} instead.
*/
@Deprecated
@Override
public void decreaseDeviceVolume() {
throw new UnsupportedOperationException();
}
@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) {
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