12afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linpackage com.xtremelabs.robolectric.shadows;
22afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
3d698df6daecfc469b84ace2c7fdaff79e85f21eaKathy Linimport static org.junit.Assert.assertThat;
42afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport android.media.MediaPlayer;
52afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport android.net.Uri;
62afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport android.widget.VideoView;
72afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
82afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport com.xtremelabs.robolectric.internal.Implementation;
92afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linimport com.xtremelabs.robolectric.internal.Implements;
102afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
112afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin@Implements(VideoView.class)
122afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin@SuppressWarnings({"UnusedDeclaration"})
132afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Linpublic class ShadowVideoView extends ShadowSurfaceView {
142afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
152afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private MediaPlayer.OnCompletionListener completionListner;
162afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private MediaPlayer.OnErrorListener errorListener;
172afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private MediaPlayer.OnPreparedListener preparedListener;
182afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
192afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private Uri uri;
2077f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	private String path;
212afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
222afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public static final int STOP = 0;
232afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public static final int START = 1;
242afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public static final int SUSPEND = 2;
252afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public static final int PAUSE = 3;
262afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public static final int RESUME = 4;
272afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
282afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private int currentState = -1;
292afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private int prevState;
302afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
312afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
322afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) {
33d698df6daecfc469b84ace2c7fdaff79e85f21eaKathy Lin		preparedListener = l;
342afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
35d698df6daecfc469b84ace2c7fdaff79e85f21eaKathy Lin
362afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
372afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void setOnErrorListener(MediaPlayer.OnErrorListener l) {
382afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		errorListener = l;
392afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
402afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
412afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
422afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void setOnCompletionListener(MediaPlayer.OnCompletionListener l) {
432afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		completionListner = l;
442afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
452afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
462afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
4777f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	public void setVideoPath(String path) {
4877f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi		this.path = path;
4977f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	}
5077f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi
5177f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	@Implementation
522afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void setVideoURI(Uri uri) {
532afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		this.uri = uri;
542afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
552afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
562afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
572afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void start() {
582afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		savePrevState();
592afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		currentState = ShadowVideoView.START;
602afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
612afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
622afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
632afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void stopPlayback() {
642afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		savePrevState();
652afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		currentState = ShadowVideoView.STOP;
662afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
672afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
682afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
692afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void suspend() {
702afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		savePrevState();
712afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		currentState = ShadowVideoView.SUSPEND;
722afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
732afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
742afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
752afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void pause() {
762afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		savePrevState();
772afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		currentState = ShadowVideoView.PAUSE;
782afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
792afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
802afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
812afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public void resume() {
822afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		savePrevState();
832afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		currentState = ShadowVideoView.RESUME;
842afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
852afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
862afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	@Implementation
872afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public boolean isPlaying() {
882afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		return (currentState == ShadowVideoView.START);
892afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
90781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin
91781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin	@Implementation
92781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin	public boolean canPause() {
93781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin		return (currentState != ShadowVideoView.PAUSE &&
94781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin				currentState != ShadowVideoView.STOP &&
95781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin				currentState != ShadowVideoView.SUSPEND);
96781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin	}
97781a29512b5ed5e75a439d5bdb71fd8d7912e4b5Kathy Lin
982afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
992afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1002afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
1012afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public MediaPlayer.OnPreparedListener getOnPreparedListener() {
1022afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		return preparedListener;
1032afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1042afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1052afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
1062afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1072afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * @return
1082afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
1092afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public MediaPlayer.OnErrorListener getOnErrorListener() {
1102afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		return errorListener;
1112afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1122afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1132afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
1142afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1152afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * @return
1162afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
1172afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public MediaPlayer.OnCompletionListener getOnCompletionListener() {
1182afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		return completionListner;
1192afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1202afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1212afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
1222afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1232afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * @return
1242afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
12577f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	public String getVideoPath() {
12677f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi		return path;
12777f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	}
12877f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi
12977f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	/**
13077f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	 * Non-Android accessor.
13177f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	 * @return
13277f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi	 */
1332afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public String getVideoURIString() {
13477f65e6034fcfcf9f736356cf081f261327520feMichael Portuesi		return uri == null ? null : uri.toString();
1352afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1362afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1372afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
1382afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1392afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * @return
1402afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
1412afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public int getCurrentVideoState() {
1422afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		return currentState;
1432afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1442afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1452afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
1462afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1472afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * @return
1482afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
1492afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	public int getPrevVideoState() {
1502afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		return prevState;
1512afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1522afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1532afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	/**
1542afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 * Non-Android accessor.
1552afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	 */
1562afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	private void savePrevState() {
1572afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin		prevState = currentState;
1582afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin	}
1592afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin
1602afd69b7f52c3c4c1fbe17f46e84d0cb178d3adeKathy Lin}
161