/RockLock/src/com/marvin/rocklock/MusicPlayer.java

http://eyes-free.googlecode.com/ · Java · 303 lines · 241 code · 39 blank · 23 comment · 75 complexity · a5f92a8d43af039fda0e2a7936c7d01c MD5 · raw file

  1. /*
  2. * Copyright (C) 2010 Google Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.marvin.rocklock;
  17. import android.content.Context;
  18. import android.content.SharedPreferences;
  19. import android.content.SharedPreferences.Editor;
  20. import android.media.MediaPlayer;
  21. import android.media.MediaPlayer.OnCompletionListener;
  22. import android.net.Uri;
  23. import android.preference.PreferenceManager;
  24. /**
  25. * Music player abstraction that takes care of using the MediaPlayer and the
  26. * SongPickers.
  27. *
  28. * @author clchen@google.com (Charles L. Chen)
  29. */
  30. public class MusicPlayer {
  31. private static final String PREF_PLAYLIST = "LAST_PLAYLIST";
  32. public static final int ROCKLOCK_PLAYLIST = 0;
  33. public static final int TAGGED_PLAYLIST = 1;
  34. private MediaPlayer player;
  35. private SongPicker picker;
  36. private DirectoryStructuredSongPicker dPicker;
  37. private boolean dPickerAvailable;
  38. private TagStructuredSongPicker tPicker;
  39. boolean tPickerAvailable;
  40. private int songPickerType;
  41. private RockLockActivity parent;
  42. private Editor editor;
  43. public MusicPlayer(Context ctx) {
  44. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
  45. editor = prefs.edit();
  46. parent = (RockLockActivity) ctx;
  47. dPicker = new DirectoryStructuredSongPicker(parent);
  48. tPicker = new TagStructuredSongPicker(parent);
  49. if (prefs.getInt(PREF_PLAYLIST, ROCKLOCK_PLAYLIST) == ROCKLOCK_PLAYLIST) {
  50. picker = dPicker;
  51. songPickerType = ROCKLOCK_PLAYLIST;
  52. } else {
  53. picker = tPicker;
  54. songPickerType = TAGGED_PLAYLIST;
  55. }
  56. dPickerAvailable = true;
  57. tPickerAvailable = true;
  58. if (dPicker.peekNextAlbum().length() < 1) {
  59. dPickerAvailable = false;
  60. }
  61. if (tPicker.peekNextAlbum().length() < 1) {
  62. tPickerAvailable = false;
  63. }
  64. if (tPickerAvailable && !dPickerAvailable) {
  65. picker = tPicker;
  66. songPickerType = TAGGED_PLAYLIST;
  67. editor.putInt(PREF_PLAYLIST, TAGGED_PLAYLIST);
  68. editor.commit();
  69. } else if (!tPickerAvailable && dPickerAvailable) {
  70. picker = dPicker;
  71. songPickerType = TAGGED_PLAYLIST;
  72. editor.putInt(PREF_PLAYLIST, TAGGED_PLAYLIST);
  73. editor.commit();
  74. }
  75. }
  76. public int getSongPickerType(){
  77. return songPickerType;
  78. }
  79. public int cycleSongPicker() {
  80. if (!tPickerAvailable && !dPickerAvailable) {
  81. return -1;
  82. }
  83. if (songPickerType == ROCKLOCK_PLAYLIST) {
  84. picker = tPicker;
  85. songPickerType = TAGGED_PLAYLIST;
  86. } else {
  87. picker = dPicker;
  88. songPickerType = ROCKLOCK_PLAYLIST;
  89. }
  90. if (tPickerAvailable && !dPickerAvailable) {
  91. picker = tPicker;
  92. songPickerType = TAGGED_PLAYLIST;
  93. } else if (!tPickerAvailable && dPickerAvailable) {
  94. picker = dPicker;
  95. songPickerType = ROCKLOCK_PLAYLIST;
  96. }
  97. editor.putInt(PREF_PLAYLIST, songPickerType);
  98. editor.commit();
  99. return songPickerType;
  100. }
  101. public void togglePlayPause() {
  102. if (!tPickerAvailable && !dPickerAvailable) {
  103. return;
  104. }
  105. if (player != null) {
  106. if (player.isPlaying()) {
  107. player.pause();
  108. } else {
  109. player.start();
  110. }
  111. } else {
  112. play(picker.getCurrentSongFile());
  113. }
  114. }
  115. public boolean isPlaying() {
  116. if (!tPickerAvailable && !dPickerAvailable) {
  117. return false;
  118. }
  119. if (player != null) {
  120. return player.isPlaying();
  121. }
  122. return false;
  123. }
  124. public synchronized void stop() {
  125. if (!tPickerAvailable && !dPickerAvailable) {
  126. return;
  127. }
  128. if (player != null) {
  129. player.release();
  130. player = null;
  131. }
  132. }
  133. public void seekForward() {
  134. if (!tPickerAvailable && !dPickerAvailable) {
  135. return;
  136. }
  137. if (player != null) {
  138. try {
  139. player.seekTo(player.getCurrentPosition() + 3000);
  140. } catch (IllegalStateException e) {
  141. // Unable to seek, so just do nothing.
  142. }
  143. }
  144. }
  145. public void seekBackward() {
  146. if (!tPickerAvailable && !dPickerAvailable) {
  147. return;
  148. }
  149. if (player != null) {
  150. try {
  151. player.seekTo(player.getCurrentPosition() - 3000);
  152. } catch (IllegalStateException e) {
  153. // Unable to seek, so just do nothing.
  154. }
  155. }
  156. }
  157. public void nextTrack() {
  158. if (!tPickerAvailable && !dPickerAvailable) {
  159. return;
  160. }
  161. picker.goNextTrack();
  162. play(picker.getCurrentSongFile());
  163. }
  164. public void prevTrack() {
  165. if (!tPickerAvailable && !dPickerAvailable) {
  166. return;
  167. }
  168. picker.goPrevTrack();
  169. play(picker.getCurrentSongFile());
  170. }
  171. public void nextAlbum() {
  172. if (!tPickerAvailable && !dPickerAvailable) {
  173. return;
  174. }
  175. picker.goNextAlbum();
  176. play(picker.getCurrentSongFile());
  177. }
  178. public void prevAlbum() {
  179. if (!tPickerAvailable && !dPickerAvailable) {
  180. return;
  181. }
  182. picker.goPrevAlbum();
  183. play(picker.getCurrentSongFile());
  184. }
  185. public void nextArtist() {
  186. if (!tPickerAvailable && !dPickerAvailable) {
  187. return;
  188. }
  189. picker.goNextArtist();
  190. play(picker.getCurrentSongFile());
  191. }
  192. public void prevArtist() {
  193. if (!tPickerAvailable && !dPickerAvailable) {
  194. return;
  195. }
  196. picker.goPrevArtist();
  197. play(picker.getCurrentSongFile());
  198. }
  199. private synchronized void play(String filename) {
  200. if (!tPickerAvailable && !dPickerAvailable) {
  201. return;
  202. }
  203. try {
  204. if (player != null) {
  205. player.release();
  206. }
  207. player = MediaPlayer.create(parent, Uri.parse(filename));
  208. if (player == null) {
  209. return;
  210. }
  211. player.setOnCompletionListener(new OnCompletionListener() {
  212. public void onCompletion(MediaPlayer mp) {
  213. nextTrack();
  214. parent.updateDisplayText(null, null, false);
  215. }
  216. });
  217. player.start();
  218. } catch (IllegalStateException e) {
  219. e.printStackTrace();
  220. }
  221. }
  222. public String getNextArtistName() {
  223. if (!tPickerAvailable && !dPickerAvailable) {
  224. return "";
  225. }
  226. return picker.peekNextArtist();
  227. }
  228. public String getPrevArtistName() {
  229. if (!tPickerAvailable && !dPickerAvailable) {
  230. return "";
  231. }
  232. return picker.peekPrevArtist();
  233. }
  234. public String getNextAlbumName() {
  235. if (!tPickerAvailable && !dPickerAvailable) {
  236. return "";
  237. }
  238. return picker.peekNextAlbum();
  239. }
  240. public String getPrevAlbumName() {
  241. if (!tPickerAvailable && !dPickerAvailable) {
  242. return "";
  243. }
  244. return picker.peekPrevAlbum();
  245. }
  246. public String getNextTrackName() {
  247. if (!tPickerAvailable && !dPickerAvailable) {
  248. return "";
  249. }
  250. return picker.peekNextTrack();
  251. }
  252. public String getPrevTrackName() {
  253. if (!tPickerAvailable && !dPickerAvailable) {
  254. return "";
  255. }
  256. return picker.peekPrevTrack();
  257. }
  258. public String getCurrentSongInfo() {
  259. if (!tPickerAvailable && !dPickerAvailable) {
  260. return "";
  261. }
  262. return picker.getCurrentSongInfo();
  263. }
  264. }