package org.wikipedia.media; import android.support.annotation.NonNull; public class DefaultAvPlayer implements AvPlayer { @NonNull private final AvPlayerImplementation player; @NonNull private final State state = new State(); public DefaultAvPlayer(@NonNull AvPlayerImplementation player) { this.player = player; } @Override public void deinit() { if (state.isInit()) { player.deinit(); state.setDeinit(); } } @Override public void init() { if (state.isDeinit()) { player.init(); state.setInit(); } } @Override public void load(@NonNull String path, @NonNull final Callback callback, @NonNull final ErrorCallback errorCallback) { init(); if (!state.isLoading(path) && !state.isLoaded(path)) { state.setLoading(path); player.load(path, new Callback() { @Override public void onSuccess() { state.setLoaded(); if (state.isPlaying()) { player.play(new StopCallbackWrapper(callback), new StopErrorCallbackWrapper(errorCallback)); } else { callback.onSuccess(); } } }, new ErrorCallback() { @Override public void onError() { state.setInit(); errorCallback.onError(); } }); } } @Override public void stop() { if (state.isLoaded() && !state.isStopped()) { player.stop(); } state.setStopped(); } @Override public void play(@NonNull Callback callback, @NonNull ErrorCallback errorCallback) { if (state.isLoaded() && !state.isPlaying()) { state.setPlaying(); player.play(new StopCallbackWrapper(callback), new StopErrorCallbackWrapper(errorCallback)); } else { state.setPlaying(); } } @Override public void play(@NonNull String path, @NonNull Callback callback, @NonNull ErrorCallback errorCallback) { play(callback, errorCallback); load(path, callback, errorCallback); } @Override public void pause() { if (state.isLoaded() && state.isPlaying()) { player.pause(); } state.setPaused(); } private class StopCallbackWrapper implements Callback { @NonNull private final Callback callback; StopCallbackWrapper(@NonNull Callback callback) { this.callback = callback; } @Override public void onSuccess() { state.setStopped(); callback.onSuccess(); } } private class StopErrorCallbackWrapper implements ErrorCallback { @NonNull private final ErrorCallback errorCallback; StopErrorCallbackWrapper(@NonNull ErrorCallback errorCallback) { this.errorCallback = errorCallback; } @Override public void onError() { state.setStopped(); errorCallback.onError(); } } }