15480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreypackage com.xtremelabs.robolectric.shadows; 25480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey 3de5801b718e5e760af7b851c87872907255e1d80Michael Portuesiimport android.content.Context; 45480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreyimport android.media.MediaPlayer; 5de5801b718e5e760af7b851c87872907255e1d80Michael Portuesiimport android.net.Uri; 6de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 75480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreyimport com.xtremelabs.robolectric.internal.Implementation; 85480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreyimport com.xtremelabs.robolectric.internal.Implements; 9de5801b718e5e760af7b851c87872907255e1d80Michael Portuesiimport com.xtremelabs.robolectric.internal.RealObject; 105480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey 1189428ada6e76f6e5a80573ce629a2aad3c8284c6Michael Portuesiimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 125480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey 13de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi/** 14de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Shadows the Android {@code MediaPlayer} class. 15de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 165480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey@Implements(MediaPlayer.class) 175480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphreypublic class ShadowMediaPlayer { 1840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 197598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz @RealObject private MediaPlayer player; 207598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz 21de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private boolean playing; 22de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private boolean prepared; 23de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private int currentPosition; 24de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private Uri sourceUri; 25de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private int sourceResId; 26de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private MediaPlayer.OnCompletionListener completionListener; 27de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi private MediaPlayer.OnPreparedListener preparedListener; 28de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 29de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 30de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public static MediaPlayer create(Context context, int resId) { 31de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi MediaPlayer mp = new MediaPlayer(); 3289428ada6e76f6e5a80573ce629a2aad3c8284c6Michael Portuesi shadowOf(mp).sourceResId = resId; 33de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi try { 34de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi mp.prepare(); 35de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } catch (Exception e) { return null; } 36de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 37de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return mp; 38de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 39de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 40de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 41de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public static MediaPlayer create(Context context, Uri uri) { 42de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi MediaPlayer mp = new MediaPlayer(); 43de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi try { 44de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi mp.setDataSource(context, uri); 45de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi mp.prepare(); 46de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } catch (Exception e) { return null; } 47de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 48de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return mp; 49de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 50de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 51de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void __constructor__() { 52de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi playing = true; 53de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 54de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 55de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 56de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void setDataSource(Context context, Uri uri) { 57de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi this.sourceUri = uri; 58de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 59de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 60de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 61de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) { 62de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi completionListener = listener; 63de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 64de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 65de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 66de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void setOnPreparedListener(MediaPlayer.OnPreparedListener listener) { 67de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi preparedListener = listener; 68de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 69de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 70de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 71de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public boolean isPlaying() { 72de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return playing; 73de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 74de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 75de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 76de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void prepare() { 77de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi prepared = true; 78de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi invokePreparedListener(); 79de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 80de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 81de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 82de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Test cases are expected to simulate completion of the 'prepare' phase 83de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * by manually invoking {@code #invokePreparedListener}. 84de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 85de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 86de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void prepareAsync() { 87de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi prepared = true; 88de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 89de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 90de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 9189428ada6e76f6e5a80573ce629a2aad3c8284c6Michael Portuesi public void start() { 92de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi playing = true; 93de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 94de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 95de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 96de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void pause() { 97de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi playing = false; 98de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 99de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 100de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 101de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void release() { 102de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi playing = false; 103de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi prepared = false; 104de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 10540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 106de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 107de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void reset() { 108de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi playing = false; 109de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi prepared = false; 110de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 11140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 112de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 113de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void stop() { 114de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi playing = false; 115de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 116de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 117de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi @Implementation 11840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams public int getCurrentPosition() { 11940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams return currentPosition; 12040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams } 12140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 12240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams public void setCurrentPosition(int position) { 12340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams currentPosition = position; 12440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams } 125de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 126de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 127de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Non-Android accessor. Use for assertions. 128de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * @return 129de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 130de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public Uri getSourceUri() { 131de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return sourceUri; 132de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 133de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 134de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 135de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Non-Android accessor. Use for assertions. 136de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * @return 137de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 138de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public int getSourceResId() { 139de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return sourceResId; 140de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 141de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 142de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 143de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Non-Android accessor. Use for assertions. 144de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * @return 145de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 146de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public boolean isPrepared() { 147de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return prepared; 148de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 149de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 150de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 151de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Non-Android accessor. Use for assertions. 152de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * @return 153de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 154de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public MediaPlayer.OnCompletionListener getOnCompletionListener() { 155de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return completionListener; 156de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 157de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 158de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 159de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Non-Android accessor. Use for assertions. 160de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * @return 161de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 162de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public MediaPlayer.OnPreparedListener getOnPreparedListener() { 163de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi return preparedListener; 164de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 165de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 166de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 167de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Allows test cases to simulate 'prepared' state by invoking callback. 168de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 169de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void invokePreparedListener() { 170de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi if (preparedListener == null) return; 171de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi preparedListener.onPrepared( player ); 172de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 173de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi 174de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi /** 175de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi * Allows test cases to simulate 'completed' state by invoking callback. 176de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi */ 177de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi public void invokeCompletionListener() { 178de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi if (completionListener == null) return; 179de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi completionListener.onCompletion( player ); 180de5801b718e5e760af7b851c87872907255e1d80Michael Portuesi } 1815480630a30500f34f6e03ed218d80f5ad843ed87Rich Humphrey} 182