/documentation/RockLockTutorial/RockLock_00/src/com/marvin/rocklock/TagStructuredSongPicker.java

http://eyes-free.googlecode.com/ · Java · 435 lines · 382 code · 32 blank · 21 comment · 94 complexity · 794ae78d14fc0457d86e8d47e83b57a5 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.app.Activity;
  18. import android.content.SharedPreferences;
  19. import android.content.SharedPreferences.Editor;
  20. import android.database.Cursor;
  21. import android.preference.PreferenceManager;
  22. import android.provider.MediaStore;
  23. import android.provider.MediaStore.MediaColumns;
  24. import android.provider.MediaStore.Audio.AudioColumns;
  25. import android.util.Log;
  26. /**
  27. * SongPicker implementation that uses the tags in the music files to organize
  28. * the music.
  29. *
  30. * @author clchen@google.com (Charles L. Chen)
  31. */
  32. public class TagStructuredSongPicker implements SongPicker {
  33. private static final String PREF_ARTIST = "TAG_ARTIST";
  34. private static final String PREF_ALBUM = "TAG_ALBUM";
  35. private static final String PREF_TRACK = "TAG_TRACK";
  36. private static final int ARTIST = 0;
  37. private static final int ALBUM = 1;
  38. private static final int TRACK = 2;
  39. private static final int FILEPATH = 3;
  40. private Cursor musicCursor;
  41. private String currentArtist = "";
  42. private String currentAlbum = "";
  43. private String currentTrack = "";
  44. private Editor editor;
  45. private boolean taggedMusicAvailable = true;
  46. public TagStructuredSongPicker(Activity parentActivity) {
  47. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(parentActivity);
  48. editor = prefs.edit();
  49. String[] proj = {
  50. AudioColumns.ARTIST, AudioColumns.ALBUM, MediaColumns.TITLE, MediaColumns.DATA
  51. };
  52. taggedMusicAvailable = true;
  53. musicCursor = parentActivity.managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
  54. proj, null, null, null);
  55. if (musicCursor == null) {
  56. taggedMusicAvailable = false;
  57. return;
  58. }
  59. taggedMusicAvailable = musicCursor.moveToFirst();
  60. if (!taggedMusicAvailable) {
  61. return;
  62. }
  63. if (!restoreFromPrefs(prefs)) {
  64. musicCursor.moveToFirst();
  65. currentArtist = musicCursor.getString(ARTIST);
  66. currentAlbum = musicCursor.getString(ALBUM);
  67. currentTrack = musicCursor.getString(TRACK);
  68. }
  69. }
  70. private boolean restoreFromPrefs(SharedPreferences prefs) {
  71. musicCursor.moveToFirst();
  72. currentArtist = prefs.getString(PREF_ARTIST, "");
  73. currentAlbum = prefs.getString(PREF_ALBUM, "");
  74. currentTrack = prefs.getString(PREF_TRACK, "");
  75. while (musicCursor.moveToNext()) {
  76. if (musicCursor.getString(ARTIST).equals(currentArtist)
  77. && musicCursor.getString(ALBUM).equals(currentAlbum)
  78. && musicCursor.getString(TRACK).equals(currentTrack)) {
  79. return true;
  80. }
  81. }
  82. return false;
  83. }
  84. public String peekNextArtist() {
  85. if (!taggedMusicAvailable) {
  86. return "";
  87. }
  88. int initialPosition = musicCursor.getPosition();
  89. while (musicCursor.moveToNext()) {
  90. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  91. String artist = musicCursor.getString(ARTIST);
  92. musicCursor.moveToPosition(initialPosition);
  93. return artist;
  94. }
  95. }
  96. musicCursor.moveToFirst();
  97. while (musicCursor.getPosition() < initialPosition) {
  98. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  99. String artist = musicCursor.getString(ARTIST);
  100. musicCursor.moveToPosition(initialPosition);
  101. return artist;
  102. }
  103. musicCursor.moveToNext();
  104. }
  105. return musicCursor.getString(ARTIST);
  106. }
  107. public String goNextArtist() {
  108. if (!taggedMusicAvailable) {
  109. return "";
  110. }
  111. int initialPosition = musicCursor.getPosition();
  112. while (musicCursor.moveToNext()) {
  113. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  114. currentArtist = musicCursor.getString(ARTIST);
  115. return currentArtist;
  116. }
  117. }
  118. musicCursor.moveToFirst();
  119. while (musicCursor.getPosition() < initialPosition) {
  120. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  121. currentArtist = musicCursor.getString(ARTIST);
  122. return currentArtist;
  123. }
  124. musicCursor.moveToNext();
  125. }
  126. currentArtist = musicCursor.getString(ARTIST);
  127. return currentArtist;
  128. }
  129. public String peekPrevArtist() {
  130. if (!taggedMusicAvailable) {
  131. return "";
  132. }
  133. int initialPosition = musicCursor.getPosition();
  134. while (musicCursor.moveToPrevious()) {
  135. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  136. String artist = musicCursor.getString(ARTIST);
  137. musicCursor.moveToPosition(initialPosition);
  138. return artist;
  139. }
  140. }
  141. musicCursor.moveToLast();
  142. while (musicCursor.getPosition() > initialPosition) {
  143. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  144. String artist = musicCursor.getString(ARTIST);
  145. musicCursor.moveToPosition(initialPosition);
  146. return artist;
  147. }
  148. musicCursor.moveToPrevious();
  149. }
  150. return musicCursor.getString(ARTIST);
  151. }
  152. public String goPrevArtist() {
  153. if (!taggedMusicAvailable) {
  154. return "";
  155. }
  156. int initialPosition = musicCursor.getPosition();
  157. while (musicCursor.moveToPrevious()) {
  158. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  159. currentArtist = musicCursor.getString(ARTIST);
  160. return currentArtist;
  161. }
  162. }
  163. musicCursor.moveToLast();
  164. while (musicCursor.getPosition() > initialPosition) {
  165. if (!musicCursor.getString(ARTIST).equals(currentArtist)) {
  166. currentArtist = musicCursor.getString(ARTIST);
  167. return currentArtist;
  168. }
  169. musicCursor.moveToPrevious();
  170. }
  171. currentArtist = musicCursor.getString(ARTIST);
  172. return currentArtist;
  173. }
  174. public String peekNextAlbum() {
  175. if (!taggedMusicAvailable) {
  176. return "";
  177. }
  178. int initialPosition = musicCursor.getPosition();
  179. while (musicCursor.moveToNext()) {
  180. if (musicCursor.getString(ARTIST).equals(currentArtist)
  181. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  182. String album = musicCursor.getString(ALBUM);
  183. musicCursor.moveToPosition(initialPosition);
  184. return album;
  185. }
  186. }
  187. musicCursor.moveToFirst();
  188. while (musicCursor.getPosition() < initialPosition) {
  189. if (musicCursor.getString(ARTIST).equals(currentArtist)
  190. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  191. String album = musicCursor.getString(ALBUM);
  192. musicCursor.moveToPosition(initialPosition);
  193. return album;
  194. }
  195. musicCursor.moveToNext();
  196. }
  197. return musicCursor.getString(ALBUM);
  198. }
  199. public String goNextAlbum() {
  200. if (!taggedMusicAvailable) {
  201. return "";
  202. }
  203. int initialPosition = musicCursor.getPosition();
  204. while (musicCursor.moveToNext()) {
  205. if (musicCursor.getString(ARTIST).equals(currentArtist)
  206. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  207. currentAlbum = musicCursor.getString(ALBUM);
  208. return currentAlbum;
  209. }
  210. }
  211. musicCursor.moveToFirst();
  212. while (musicCursor.getPosition() < initialPosition) {
  213. if (musicCursor.getString(ARTIST).equals(currentArtist)
  214. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  215. currentAlbum = musicCursor.getString(ALBUM);
  216. return currentAlbum;
  217. }
  218. musicCursor.moveToNext();
  219. }
  220. currentAlbum = musicCursor.getString(ALBUM);
  221. return currentAlbum;
  222. }
  223. public String peekPrevAlbum() {
  224. if (!taggedMusicAvailable) {
  225. return "";
  226. }
  227. int initialPosition = musicCursor.getPosition();
  228. while (musicCursor.moveToPrevious()) {
  229. if (musicCursor.getString(ARTIST).equals(currentArtist)
  230. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  231. String album = musicCursor.getString(ALBUM);
  232. musicCursor.moveToPosition(initialPosition);
  233. return album;
  234. }
  235. }
  236. musicCursor.moveToLast();
  237. while (musicCursor.getPosition() > initialPosition) {
  238. if (musicCursor.getString(ARTIST).equals(currentArtist)
  239. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  240. String album = musicCursor.getString(ALBUM);
  241. musicCursor.moveToPosition(initialPosition);
  242. return album;
  243. }
  244. musicCursor.moveToPrevious();
  245. }
  246. return musicCursor.getString(ALBUM);
  247. }
  248. public String goPrevAlbum() {
  249. if (!taggedMusicAvailable) {
  250. return "";
  251. }
  252. int initialPosition = musicCursor.getPosition();
  253. while (musicCursor.moveToPrevious()) {
  254. if (musicCursor.getString(ARTIST).equals(currentArtist)
  255. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  256. currentAlbum = musicCursor.getString(ALBUM);
  257. return currentAlbum;
  258. }
  259. }
  260. musicCursor.moveToLast();
  261. while (musicCursor.getPosition() > initialPosition) {
  262. if (musicCursor.getString(ARTIST).equals(currentArtist)
  263. && !musicCursor.getString(ALBUM).equals(currentAlbum)) {
  264. currentAlbum = musicCursor.getString(ALBUM);
  265. return currentAlbum;
  266. }
  267. musicCursor.moveToPrevious();
  268. }
  269. currentAlbum = musicCursor.getString(ALBUM);
  270. return currentAlbum;
  271. }
  272. public String peekNextTrack() {
  273. if (!taggedMusicAvailable) {
  274. return "";
  275. }
  276. int initialPosition = musicCursor.getPosition();
  277. while (musicCursor.moveToNext()) {
  278. if (musicCursor.getString(ARTIST).equals(currentArtist)
  279. && musicCursor.getString(ALBUM).equals(currentAlbum)
  280. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  281. String track = musicCursor.getString(TRACK);
  282. musicCursor.moveToPosition(initialPosition);
  283. Log.e("peek end 0", musicCursor.getPosition() + " " + getCurrentSongInfo());
  284. return track;
  285. }
  286. }
  287. musicCursor.moveToFirst();
  288. while (musicCursor.getPosition() < initialPosition) {
  289. if (musicCursor.getString(ARTIST).equals(currentArtist)
  290. && musicCursor.getString(ALBUM).equals(currentAlbum)
  291. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  292. String track = musicCursor.getString(TRACK);
  293. musicCursor.moveToPosition(initialPosition);
  294. Log.e("peek end 1", musicCursor.getPosition() + " " + getCurrentSongInfo());
  295. return track;
  296. }
  297. musicCursor.moveToNext();
  298. }
  299. Log.e("peek end 2", musicCursor.getPosition() + " " + getCurrentSongInfo());
  300. return musicCursor.getString(TRACK);
  301. }
  302. public String goNextTrack() {
  303. if (!taggedMusicAvailable) {
  304. return "";
  305. }
  306. int initialPosition = musicCursor.getPosition();
  307. while (musicCursor.moveToNext()) {
  308. if (musicCursor.getString(ARTIST).equals(currentArtist)
  309. && musicCursor.getString(ALBUM).equals(currentAlbum)
  310. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  311. currentTrack = musicCursor.getString(TRACK);
  312. return currentTrack;
  313. }
  314. }
  315. musicCursor.moveToFirst();
  316. while (musicCursor.getPosition() < initialPosition) {
  317. if (musicCursor.getString(ARTIST).equals(currentArtist)
  318. && musicCursor.getString(ALBUM).equals(currentAlbum)
  319. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  320. currentTrack = musicCursor.getString(TRACK);
  321. return currentTrack;
  322. }
  323. musicCursor.moveToNext();
  324. }
  325. currentTrack = musicCursor.getString(TRACK);
  326. return currentTrack;
  327. }
  328. public String peekPrevTrack() {
  329. if (!taggedMusicAvailable) {
  330. return "";
  331. }
  332. int initialPosition = musicCursor.getPosition();
  333. while (musicCursor.moveToPrevious()) {
  334. if (musicCursor.getString(ARTIST).equals(currentArtist)
  335. && musicCursor.getString(ALBUM).equals(currentAlbum)
  336. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  337. String track = musicCursor.getString(TRACK);
  338. musicCursor.moveToPosition(initialPosition);
  339. return track;
  340. }
  341. }
  342. musicCursor.moveToLast();
  343. while (musicCursor.getPosition() > initialPosition) {
  344. if (musicCursor.getString(ARTIST).equals(currentArtist)
  345. && musicCursor.getString(ALBUM).equals(currentAlbum)
  346. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  347. String track = musicCursor.getString(TRACK);
  348. musicCursor.moveToPosition(initialPosition);
  349. return track;
  350. }
  351. musicCursor.moveToPrevious();
  352. }
  353. return musicCursor.getString(TRACK);
  354. }
  355. public String goPrevTrack() {
  356. if (!taggedMusicAvailable) {
  357. return "";
  358. }
  359. int initialPosition = musicCursor.getPosition();
  360. while (musicCursor.moveToPrevious()) {
  361. if (musicCursor.getString(ARTIST).equals(currentArtist)
  362. && musicCursor.getString(ALBUM).equals(currentAlbum)
  363. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  364. currentTrack = musicCursor.getString(TRACK);
  365. return currentTrack;
  366. }
  367. }
  368. musicCursor.moveToLast();
  369. while (musicCursor.getPosition() > initialPosition) {
  370. if (musicCursor.getString(ARTIST).equals(currentArtist)
  371. && musicCursor.getString(ALBUM).equals(currentAlbum)
  372. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  373. currentTrack = musicCursor.getString(TRACK);
  374. return currentTrack;
  375. }
  376. musicCursor.moveToPrevious();
  377. }
  378. currentTrack = musicCursor.getString(TRACK);
  379. return currentTrack;
  380. }
  381. public String getCurrentSongFile() {
  382. if (!taggedMusicAvailable) {
  383. return "";
  384. }
  385. currentArtist = musicCursor.getString(ARTIST);
  386. currentAlbum = musicCursor.getString(ALBUM);
  387. currentTrack = musicCursor.getString(TRACK);
  388. editor.putString(PREF_ARTIST, currentArtist);
  389. editor.putString(PREF_ALBUM, currentAlbum);
  390. editor.putString(PREF_TRACK, currentTrack);
  391. editor.commit();
  392. return musicCursor.getString(FILEPATH);
  393. }
  394. public String getCurrentSongInfo() {
  395. if (!taggedMusicAvailable) {
  396. return "";
  397. }
  398. currentArtist = musicCursor.getString(ARTIST);
  399. currentAlbum = musicCursor.getString(ALBUM);
  400. currentTrack = musicCursor.getString(TRACK);
  401. return currentArtist + " - " + currentAlbum + " - " + currentTrack;
  402. }
  403. }