/documentation/tutorial/MusicFileBrowser/MusicFileBrowser_Tutorial0/src/com/google/marvin/tutorials/musicFileBrowser0/MusicFileBrowser.java

http://eyes-free.googlecode.com/ · Java · 209 lines · 173 code · 21 blank · 15 comment · 36 complexity · 38715b6f12424b6843deeef62511d78c MD5 · raw file

  1. package com.google.marvin.tutorials.musicFileBrowser0;
  2. /**
  3. * Basic Music File Browser - No speech, no gestures.
  4. *
  5. * File browsing code is based on a tutorial from anddev.org by Nicolas Gramlich
  6. * http://www.anddev.org/building_an_android_filebrowser_list-based_ -t67.html
  7. *
  8. * @author clchen@google.com (Charles L. Chen)
  9. */
  10. import java.io.File;
  11. import java.util.ArrayList;
  12. import java.util.Collections;
  13. import java.util.List;
  14. import android.app.Activity;
  15. import android.content.Context;
  16. import android.media.MediaPlayer;
  17. import android.net.Uri;
  18. import android.os.Bundle;
  19. import android.os.Vibrator;
  20. import android.view.KeyEvent;
  21. import android.view.MotionEvent;
  22. import android.view.View;
  23. import android.widget.AdapterView;
  24. import android.widget.ArrayAdapter;
  25. import android.widget.ListView;
  26. import android.widget.Toast;
  27. import android.widget.AdapterView.OnItemClickListener;
  28. public class MusicFileBrowser extends Activity {
  29. private static final long[] VIBE_PATTERN = {0, 10, 70, 80};
  30. private Vibrator vibe;
  31. private List<String> directoryEntries = new ArrayList<String>();
  32. private File currentDirectory = new File("/sdcard/");
  33. private MediaPlayer mp = new MediaPlayer();
  34. private int lastPosition;
  35. private String lastPlayedFilename = "";
  36. private ListView myList;
  37. /** Called when the activity is first created. */
  38. @Override
  39. public void onCreate(Bundle icicle) {
  40. super.onCreate(icicle);
  41. myList = new ListView(this);
  42. myList.setOnItemClickListener(new OnItemClickListener() {
  43. public void onItemClick(AdapterView<?> l, View v, int position, long id) {
  44. if (position == 0) {
  45. playNext();
  46. } else if (position == 1) {
  47. upOneLevel();
  48. } else {
  49. lastPosition = position;
  50. File clickedFile =
  51. new File(currentDirectory.getAbsolutePath() + directoryEntries.get(position));
  52. if (clickedFile != null) {
  53. browseTo(clickedFile);
  54. }
  55. }
  56. }
  57. });
  58. setContentView(myList);
  59. lastPosition = 0;
  60. vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
  61. browseTo(new File("/sdcard/"));
  62. }
  63. /**
  64. * This function browses up one level according to the field: currentDirectory
  65. * Returns whether or not navigation occurred.
  66. */
  67. private boolean upOneLevel() {
  68. String parent = this.currentDirectory.getParent();
  69. if (parent.equals("/")) {
  70. browseTo(new File("/sdcard/"));
  71. return false;
  72. } else if (this.currentDirectory.getParent() != null) {
  73. this.browseTo(this.currentDirectory.getParentFile());
  74. }
  75. return true;
  76. }
  77. private void browseTo(final File aDirectory) {
  78. if (aDirectory.isDirectory()) {
  79. this.currentDirectory = aDirectory;
  80. fill(aDirectory.listFiles());
  81. lastPosition = 0;
  82. myList.setSelection(0);
  83. } else {
  84. togglePlaying(aDirectory);
  85. }
  86. }
  87. private void togglePlaying(final File aFile) {
  88. if (mp.isPlaying()) {
  89. mp.stop();
  90. } else {
  91. lastPlayedFilename = aFile.getAbsolutePath();
  92. mp = MediaPlayer.create(this, Uri.parse(lastPlayedFilename));
  93. mp.start();
  94. }
  95. }
  96. private void playNext() {
  97. if (mp.isPlaying()) {
  98. mp.stop();
  99. }
  100. int i = lastPosition;
  101. i++;
  102. String path = this.currentDirectory.getAbsolutePath();
  103. while (i < this.directoryEntries.size()) {
  104. String filename = this.directoryEntries.get(i);
  105. File currentFile = new File(path + filename);
  106. if (currentFile.isFile()) {
  107. lastPosition = i;
  108. togglePlaying(currentFile);
  109. return;
  110. }
  111. i++;
  112. }
  113. i = 0;
  114. while (i <= lastPosition) {
  115. String filename = this.directoryEntries.get(i);
  116. File currentFile = new File(path + filename);
  117. if (currentFile.isFile()) {
  118. lastPosition = i;
  119. togglePlaying(currentFile);
  120. return;
  121. }
  122. i++;
  123. }
  124. Toast.makeText(this, R.string.no_files, 1).show();
  125. }
  126. private void fill(File[] files) {
  127. this.directoryEntries.clear();
  128. // Add the top two choices
  129. this.directoryEntries.add(currentDirectory.getAbsolutePath());
  130. if (this.currentDirectory.getParent() != null) {
  131. this.directoryEntries.add(" up one level");
  132. }
  133. int currentPathStringLength = this.currentDirectory.getAbsolutePath().length();
  134. List<String> directories = new ArrayList<String>();
  135. for (File file : files) {
  136. if (file.isDirectory()) {
  137. String filename = file.getAbsolutePath().substring(currentPathStringLength);
  138. if (!filename.startsWith("/.")) {
  139. directories.add(filename);
  140. }
  141. }
  142. }
  143. Collections.sort(directories);
  144. this.directoryEntries.addAll(directories);
  145. List<String> audioFiles = new ArrayList<String>();
  146. for (File file : files) {
  147. if (file.getPath().endsWith(".mp3")) {
  148. String filename = file.getAbsolutePath().substring(currentPathStringLength);
  149. if (!filename.startsWith("/.")) {
  150. audioFiles.add(filename);
  151. }
  152. }
  153. }
  154. Collections.sort(audioFiles);
  155. this.directoryEntries.addAll(audioFiles);
  156. ArrayAdapter<String> directoryList =
  157. new ArrayAdapter<String>(this, R.layout.file_row, this.directoryEntries);
  158. myList.setAdapter(directoryList);
  159. }
  160. @Override
  161. public boolean onTrackballEvent(MotionEvent event) {
  162. int selectedId = myList.getSelectedItemPosition();
  163. if (selectedId == -1) {
  164. selectedId = 0;
  165. }
  166. if (lastPosition != selectedId) {
  167. lastPosition = selectedId;
  168. vibe.vibrate(VIBE_PATTERN, -1);
  169. String filename = directoryEntries.get(selectedId);
  170. }
  171. return super.onTrackballEvent(event);
  172. }
  173. @Override
  174. public boolean onKeyDown(int keyCode, KeyEvent event) {
  175. if (keyCode == KeyEvent.KEYCODE_BACK) {
  176. // Pressing back should go up a level, not quit the app
  177. if (upOneLevel()) {
  178. return true;
  179. }
  180. }
  181. return super.onKeyDown(keyCode, event);
  182. }
  183. @Override
  184. public void onDestroy(){
  185. mp.stop();
  186. super.onDestroy();
  187. }
  188. }