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