blob: 49b1a19b330d690e1f53a5f1d27b506d11b55156 [file] [log] [blame]
/*
* Copyright 2018 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 androidx.media;
import android.util.ArrayMap;
import androidx.annotation.NonNull;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
/**
* A mock implementation of {@link MediaPlayerBase} for testing.
*/
public class MockPlayer extends MediaPlayerBase {
public final CountDownLatch mCountDownLatch;
public boolean mPlayCalled;
public boolean mPauseCalled;
public boolean mResetCalled;
public boolean mPrepareCalled;
public boolean mSeekToCalled;
public boolean mSetPlaybackSpeedCalled;
public long mSeekPosition;
public long mCurrentPosition;
public long mBufferedPosition;
public float mPlaybackSpeed = 1.0f;
public @PlayerState int mLastPlayerState;
public @BuffState int mLastBufferingState;
public ArrayMap<PlayerEventCallback, Executor> mCallbacks = new ArrayMap<>();
private AudioAttributesCompat mAudioAttributes;
public MockPlayer(int count) {
mCountDownLatch = (count > 0) ? new CountDownLatch(count) : null;
}
@Override
public void close() {
// no-op
}
@Override
public void reset() {
mResetCalled = true;
if (mCountDownLatch != null) {
mCountDownLatch.countDown();
}
}
@Override
public void play() {
mPlayCalled = true;
if (mCountDownLatch != null) {
mCountDownLatch.countDown();
}
}
@Override
public void pause() {
mPauseCalled = true;
if (mCountDownLatch != null) {
mCountDownLatch.countDown();
}
}
@Override
public void prepare() {
mPrepareCalled = true;
if (mCountDownLatch != null) {
mCountDownLatch.countDown();
}
}
@Override
public void seekTo(long pos) {
mSeekToCalled = true;
mSeekPosition = pos;
if (mCountDownLatch != null) {
mCountDownLatch.countDown();
}
}
@Override
public void skipToNext() {
// No-op. This skipToNext() means 'skip to next item in the setNextDataSources()'
}
@Override
public int getPlayerState() {
return mLastPlayerState;
}
@Override
public long getCurrentPosition() {
return mCurrentPosition;
}
@Override
public long getBufferedPosition() {
return mBufferedPosition;
}
@Override
public float getPlaybackSpeed() {
return mPlaybackSpeed;
}
@Override
public int getBufferingState() {
return mLastBufferingState;
}
@Override
public void registerPlayerEventCallback(@NonNull Executor executor,
@NonNull PlayerEventCallback callback) {
if (callback == null || executor == null) {
throw new IllegalArgumentException("callback=" + callback + " executor=" + executor);
}
mCallbacks.put(callback, executor);
}
@Override
public void unregisterPlayerEventCallback(@NonNull PlayerEventCallback callback) {
mCallbacks.remove(callback);
}
public void notifyPlaybackState(final int state) {
mLastPlayerState = state;
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
executor.execute(new Runnable() {
@Override
public void run() {
callback.onPlayerStateChanged(MockPlayer.this, state);
}
});
}
}
public void notifyBufferingState(final MediaItem2 item, final int bufferingState) {
mLastBufferingState = bufferingState;
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
executor.execute(new Runnable() {
@Override
public void run() {
callback.onBufferingStateChanged(
MockPlayer.this, item.getDataSourceDesc(), bufferingState);
}
});
}
}
public void notifyCurrentDataSourceChanged(final DataSourceDesc dsd) {
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
executor.execute(new Runnable() {
@Override
public void run() {
callback.onCurrentDataSourceChanged(MockPlayer.this, dsd);
}
});
}
}
public void notifyMediaPrepared(final DataSourceDesc dsd) {
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
executor.execute(new Runnable() {
@Override
public void run() {
callback.onMediaPrepared(MockPlayer.this, dsd);
}
});
}
}
public void notifyBufferingStateChanged(final DataSourceDesc dsd,
final @BuffState int buffState) {
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
executor.execute(new Runnable() {
@Override
public void run() {
callback.onBufferingStateChanged(MockPlayer.this, dsd, buffState);
}
});
}
}
public void notifyPlaybackSpeedChanged(final float speed) {
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
executor.execute(new Runnable() {
@Override
public void run() {
callback.onPlaybackSpeedChanged(MockPlayer.this, speed);
}
});
}
}
public void notifyError(int what) {
for (int i = 0; i < mCallbacks.size(); i++) {
final PlayerEventCallback callback = mCallbacks.keyAt(i);
final Executor executor = mCallbacks.valueAt(i);
// TODO: Uncomment or remove
//executor.execute(() -> callback.onError(null, what, 0));
}
}
@Override
public void setAudioAttributes(AudioAttributesCompat attributes) {
mAudioAttributes = attributes;
}
@Override
public AudioAttributesCompat getAudioAttributes() {
return mAudioAttributes;
}
@Override
public void setDataSource(@NonNull DataSourceDesc dsd) {
// TODO: Implement this
}
@Override
public void setNextDataSource(@NonNull DataSourceDesc dsd) {
// TODO: Implement this
}
@Override
public void setNextDataSources(@NonNull List<DataSourceDesc> dsds) {
// TODO: Implement this
}
@Override
public DataSourceDesc getCurrentDataSource() {
// TODO: Implement this
return null;
}
@Override
public void loopCurrent(boolean loop) {
// TODO: implement this
}
@Override
public void setPlaybackSpeed(float speed) {
mSetPlaybackSpeedCalled = true;
mPlaybackSpeed = speed;
if (mCountDownLatch != null) {
mCountDownLatch.countDown();
}
}
@Override
public void setPlayerVolume(float volume) {
// TODO: implement this
}
@Override
public float getPlayerVolume() {
// TODO: implement this
return -1;
}
}