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