197 lines
6.2 KiB
Java
197 lines
6.2 KiB
Java
![]() |
/*
|
||
|
* Copyright (C) 2014 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
package android.media;
|
||
|
|
||
|
import android.annotation.IntDef;
|
||
|
import android.annotation.Nullable;
|
||
|
import android.media.MediaRouter2.RoutingController;
|
||
|
import android.media.session.MediaSession;
|
||
|
|
||
|
import java.lang.annotation.Retention;
|
||
|
import java.lang.annotation.RetentionPolicy;
|
||
|
|
||
|
/**
|
||
|
* Handles requests to adjust or set the volume on a session. This is also used
|
||
|
* to push volume updates back to the session. The provider must call
|
||
|
* {@link #setCurrentVolume(int)} each time the volume being provided changes.
|
||
|
* <p>
|
||
|
* You can set a volume provider on a session by calling
|
||
|
* {@link MediaSession#setPlaybackToRemote}.
|
||
|
*/
|
||
|
public abstract class VolumeProvider {
|
||
|
|
||
|
/**
|
||
|
* @hide
|
||
|
*/
|
||
|
@IntDef({VOLUME_CONTROL_FIXED, VOLUME_CONTROL_RELATIVE, VOLUME_CONTROL_ABSOLUTE})
|
||
|
@Retention(RetentionPolicy.SOURCE)
|
||
|
public @interface ControlType {}
|
||
|
|
||
|
/**
|
||
|
* The volume is fixed and can not be modified. Requests to change volume
|
||
|
* should be ignored.
|
||
|
*/
|
||
|
public static final int VOLUME_CONTROL_FIXED = 0;
|
||
|
|
||
|
/**
|
||
|
* The volume control uses relative adjustment via
|
||
|
* {@link #onAdjustVolume(int)}. Attempts to set the volume to a specific
|
||
|
* value should be ignored.
|
||
|
*/
|
||
|
public static final int VOLUME_CONTROL_RELATIVE = 1;
|
||
|
|
||
|
/**
|
||
|
* The volume control uses an absolute value. It may be adjusted using
|
||
|
* {@link #onAdjustVolume(int)} or set directly using
|
||
|
* {@link #onSetVolumeTo(int)}.
|
||
|
*/
|
||
|
public static final int VOLUME_CONTROL_ABSOLUTE = 2;
|
||
|
|
||
|
private final int mControlType;
|
||
|
private final int mMaxVolume;
|
||
|
private final String mControlId;
|
||
|
private int mCurrentVolume;
|
||
|
private Callback mCallback;
|
||
|
|
||
|
/**
|
||
|
* Creates a new volume provider for handling volume events.
|
||
|
*
|
||
|
* @param volumeControl See {@link #getVolumeControl()}.
|
||
|
* @param maxVolume The maximum allowed volume.
|
||
|
* @param currentVolume The current volume on the output.
|
||
|
*/
|
||
|
public VolumeProvider(@ControlType int volumeControl, int maxVolume, int currentVolume) {
|
||
|
this(volumeControl, maxVolume, currentVolume, null);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new volume provider for handling volume events.
|
||
|
*
|
||
|
* @param volumeControl See {@link #getVolumeControl()}.
|
||
|
* @param maxVolume The maximum allowed volume.
|
||
|
* @param currentVolume The current volume on the output.
|
||
|
* @param volumeControlId See {@link #getVolumeControlId()}.
|
||
|
*/
|
||
|
public VolumeProvider(
|
||
|
@ControlType int volumeControl,
|
||
|
int maxVolume,
|
||
|
int currentVolume,
|
||
|
@Nullable String volumeControlId) {
|
||
|
mControlType = volumeControl;
|
||
|
mMaxVolume = maxVolume;
|
||
|
mCurrentVolume = currentVolume;
|
||
|
mControlId = volumeControlId;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the volume control type that this volume provider uses.
|
||
|
*
|
||
|
* <p>One of {@link #VOLUME_CONTROL_FIXED}, {@link #VOLUME_CONTROL_ABSOLUTE}, or {@link
|
||
|
* #VOLUME_CONTROL_RELATIVE}.
|
||
|
*
|
||
|
* @return The volume control type for this volume provider
|
||
|
*/
|
||
|
@ControlType
|
||
|
public final int getVolumeControl() {
|
||
|
return mControlType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the maximum volume this provider allows.
|
||
|
*
|
||
|
* @return The max allowed volume.
|
||
|
*/
|
||
|
public final int getMaxVolume() {
|
||
|
return mMaxVolume;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the current volume. This will be the last value set by
|
||
|
* {@link #setCurrentVolume(int)}.
|
||
|
*
|
||
|
* @return The current volume.
|
||
|
*/
|
||
|
public final int getCurrentVolume() {
|
||
|
return mCurrentVolume;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Notifies the system that the current volume has been changed. This must be called every time
|
||
|
* the volume changes to ensure it is displayed properly.
|
||
|
*
|
||
|
* @param currentVolume The current volume on the output.
|
||
|
*/
|
||
|
public final void setCurrentVolume(int currentVolume) {
|
||
|
mCurrentVolume = currentVolume;
|
||
|
if (mCallback != null) {
|
||
|
mCallback.onVolumeChanged(this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the {@link RoutingController#getId() routing controller id} of the {@link
|
||
|
* RoutingController} associated with this volume provider, or null if unset.
|
||
|
*
|
||
|
* <p>This id allows mapping this volume provider to a routing controller, which provides
|
||
|
* information about the media route and allows controlling its volume.
|
||
|
*/
|
||
|
@Nullable
|
||
|
public final String getVolumeControlId() {
|
||
|
return mControlId;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Override to handle requests to set the volume of the current output.
|
||
|
* After the volume has been modified {@link #setCurrentVolume} must be
|
||
|
* called to notify the system.
|
||
|
*
|
||
|
* @param volume The volume to set the output to.
|
||
|
*/
|
||
|
public void onSetVolumeTo(int volume) {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Override to handle requests to adjust the volume of the current output.
|
||
|
* Direction will be one of {@link AudioManager#ADJUST_LOWER},
|
||
|
* {@link AudioManager#ADJUST_RAISE}, {@link AudioManager#ADJUST_SAME}.
|
||
|
* After the volume has been modified {@link #setCurrentVolume} must be
|
||
|
* called to notify the system.
|
||
|
*
|
||
|
* @param direction The direction to change the volume in.
|
||
|
*/
|
||
|
public void onAdjustVolume(int direction) {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets a callback to receive volume changes.
|
||
|
* @hide
|
||
|
*/
|
||
|
public void setCallback(Callback callback) {
|
||
|
mCallback = callback;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Listens for changes to the volume.
|
||
|
* @hide
|
||
|
*/
|
||
|
public abstract static class Callback {
|
||
|
/**
|
||
|
* Called when volume changed.
|
||
|
*/
|
||
|
public abstract void onVolumeChanged(VolumeProvider volumeProvider);
|
||
|
}
|
||
|
}
|