/documentation/RockLockTutorial/StepByStep/src/com/marvin/rocklock/MusicPlayer.java

http://eyes-free.googlecode.com/ · Java · 293 lines · 233 code · 38 blank · 22 comment · 75 complexity · 1fc2064da8ade3e4f5b0069a1db14248 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 cycleSongPicker() {
  77. if (!tPickerAvailable && !dPickerAvailable) {
  78. return -1;
  79. }
  80. if (songPickerType == ROCKLOCK_PLAYLIST) {
  81. picker = tPicker;
  82. songPickerType = TAGGED_PLAYLIST;
  83. } else {
  84. picker = dPicker;
  85. songPickerType = ROCKLOCK_PLAYLIST;
  86. }
  87. if (tPickerAvailable && !dPickerAvailable) {
  88. picker = tPicker;
  89. songPickerType = TAGGED_PLAYLIST;
  90. } else if (!tPickerAvailable && dPickerAvailable) {
  91. picker = dPicker;
  92. songPickerType = ROCKLOCK_PLAYLIST;
  93. }
  94. editor.putInt(PREF_PLAYLIST, songPickerType);
  95. editor.commit();
  96. return songPickerType;
  97. }
  98. public void togglePlayPause() {
  99. if (!tPickerAvailable && !dPickerAvailable) {
  100. return;
  101. }
  102. if (player != null) {
  103. if (player.isPlaying()) {
  104. player.pause();
  105. } else {
  106. player.start();
  107. }
  108. } else {
  109. play(picker.getCurrentSongFile());
  110. }
  111. }
  112. public boolean isPlaying() {
  113. if (!tPickerAvailable && !dPickerAvailable) {
  114. return false;
  115. }
  116. if (player != null) {
  117. return player.isPlaying();
  118. }
  119. return false;
  120. }
  121. public synchronized void stop() {
  122. if (!tPickerAvailable && !dPickerAvailable) {
  123. return;
  124. }
  125. if (player != null) {
  126. player.release();
  127. player = null;
  128. }
  129. }
  130. public void seekForward() {
  131. if (!tPickerAvailable && !dPickerAvailable) {
  132. return;
  133. }
  134. if (player != null) {
  135. player.seekTo(player.getCurrentPosition() + 3000);
  136. }
  137. }
  138. public void seekBackward() {
  139. if (!tPickerAvailable && !dPickerAvailable) {
  140. return;
  141. }
  142. if (player != null) {
  143. player.seekTo(player.getCurrentPosition() - 3000);
  144. }
  145. }
  146. public void nextTrack() {
  147. if (!tPickerAvailable && !dPickerAvailable) {
  148. return;
  149. }
  150. picker.goNextTrack();
  151. play(picker.getCurrentSongFile());
  152. }
  153. public void prevTrack() {
  154. if (!tPickerAvailable && !dPickerAvailable) {
  155. return;
  156. }
  157. picker.goPrevTrack();
  158. play(picker.getCurrentSongFile());
  159. }
  160. public void nextAlbum() {
  161. if (!tPickerAvailable && !dPickerAvailable) {
  162. return;
  163. }
  164. picker.goNextAlbum();
  165. play(picker.getCurrentSongFile());
  166. }
  167. public void prevAlbum() {
  168. if (!tPickerAvailable && !dPickerAvailable) {
  169. return;
  170. }
  171. picker.goPrevAlbum();
  172. play(picker.getCurrentSongFile());
  173. }
  174. public void nextArtist() {
  175. if (!tPickerAvailable && !dPickerAvailable) {
  176. return;
  177. }
  178. picker.goNextArtist();
  179. play(picker.getCurrentSongFile());
  180. }
  181. public void prevArtist() {
  182. if (!tPickerAvailable && !dPickerAvailable) {
  183. return;
  184. }
  185. picker.goPrevArtist();
  186. play(picker.getCurrentSongFile());
  187. }
  188. private synchronized void play(String filename) {
  189. if (!tPickerAvailable && !dPickerAvailable) {
  190. return;
  191. }
  192. try {
  193. if (player != null) {
  194. player.release();
  195. }
  196. player = MediaPlayer.create(parent, Uri.parse(filename));
  197. if (player == null) {
  198. return;
  199. }
  200. player.setOnCompletionListener(new OnCompletionListener() {
  201. @Override
  202. public void onCompletion(MediaPlayer mp) {
  203. nextTrack();
  204. parent.updateDisplayText(null, null, false);
  205. }
  206. });
  207. player.start();
  208. } catch (IllegalStateException e) {
  209. // TODO Auto-generated catch block
  210. e.printStackTrace();
  211. }
  212. }
  213. public String getNextArtistName() {
  214. if (!tPickerAvailable && !dPickerAvailable) {
  215. return "";
  216. }
  217. return picker.peekNextArtist();
  218. }
  219. public String getPrevArtistName() {
  220. if (!tPickerAvailable && !dPickerAvailable) {
  221. return "";
  222. }
  223. return picker.peekPrevArtist();
  224. }
  225. public String getNextAlbumName() {
  226. if (!tPickerAvailable && !dPickerAvailable) {
  227. return "";
  228. }
  229. return picker.peekNextAlbum();
  230. }
  231. public String getPrevAlbumName() {
  232. if (!tPickerAvailable && !dPickerAvailable) {
  233. return "";
  234. }
  235. return picker.peekPrevAlbum();
  236. }
  237. public String getNextTrackName() {
  238. if (!tPickerAvailable && !dPickerAvailable) {
  239. return "";
  240. }
  241. return picker.peekNextTrack();
  242. }
  243. public String getPrevTrackName() {
  244. if (!tPickerAvailable && !dPickerAvailable) {
  245. return "";
  246. }
  247. return picker.peekPrevTrack();
  248. }
  249. public String getCurrentSongInfo() {
  250. if (!tPickerAvailable && !dPickerAvailable) {
  251. return "";
  252. }
  253. return picker.getCurrentSongInfo();
  254. }
  255. }