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

http://eyes-free.googlecode.com/ · Java · 432 lines · 379 code · 32 blank · 21 comment · 96 complexity · 92a5bf747e1d272c7ec02112c1dbe706 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.Audio.AudioColumns;
  24. import android.provider.MediaStore.MediaColumns;
  25. /**
  26. * SongPicker implementation that uses the tags in the music files to organize
  27. * the music.
  28. *
  29. * @author clchen@google.com (Charles L. Chen)
  30. */
  31. public class TagStructuredSongPicker implements SongPicker {
  32. private static final String PREF_ARTIST = "TAG_ARTIST";
  33. private static final String PREF_ALBUM = "TAG_ALBUM";
  34. private static final String PREF_TRACK = "TAG_TRACK";
  35. private static final int ARTIST = 0;
  36. private static final int ALBUM = 1;
  37. private static final int TRACK = 2;
  38. private static final int FILEPATH = 3;
  39. private Cursor musicCursor;
  40. private String currentArtist = "";
  41. private String currentAlbum = "";
  42. private String currentTrack = "";
  43. private Editor editor;
  44. private boolean taggedMusicAvailable = true;
  45. public TagStructuredSongPicker(Activity parentActivity) {
  46. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(parentActivity);
  47. editor = prefs.edit();
  48. String[] proj = {
  49. AudioColumns.ARTIST, AudioColumns.ALBUM, MediaColumns.TITLE, MediaColumns.DATA
  50. };
  51. taggedMusicAvailable = true;
  52. musicCursor = parentActivity.managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
  53. proj, null, null, null);
  54. if (musicCursor == null) {
  55. taggedMusicAvailable = false;
  56. return;
  57. }
  58. taggedMusicAvailable = musicCursor.moveToFirst();
  59. if (!taggedMusicAvailable) {
  60. return;
  61. }
  62. if (!restoreFromPrefs(prefs)) {
  63. musicCursor.moveToFirst();
  64. currentArtist = musicCursor.getString(ARTIST);
  65. currentAlbum = musicCursor.getString(ALBUM);
  66. currentTrack = musicCursor.getString(TRACK);
  67. }
  68. }
  69. private boolean restoreFromPrefs(SharedPreferences prefs) {
  70. musicCursor.moveToFirst();
  71. currentArtist = prefs.getString(PREF_ARTIST, "");
  72. currentAlbum = prefs.getString(PREF_ALBUM, "");
  73. currentTrack = prefs.getString(PREF_TRACK, "");
  74. while (musicCursor.moveToNext()) {
  75. if ((musicCursor.getString(ARTIST) != null)
  76. && 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. return track;
  284. }
  285. }
  286. musicCursor.moveToFirst();
  287. while (musicCursor.getPosition() < initialPosition) {
  288. if (musicCursor.getString(ARTIST).equals(currentArtist)
  289. && musicCursor.getString(ALBUM).equals(currentAlbum)
  290. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  291. String track = musicCursor.getString(TRACK);
  292. musicCursor.moveToPosition(initialPosition);
  293. return track;
  294. }
  295. musicCursor.moveToNext();
  296. }
  297. return musicCursor.getString(TRACK);
  298. }
  299. public String goNextTrack() {
  300. if (!taggedMusicAvailable) {
  301. return "";
  302. }
  303. int initialPosition = musicCursor.getPosition();
  304. while (musicCursor.moveToNext()) {
  305. if (musicCursor.getString(ARTIST).equals(currentArtist)
  306. && musicCursor.getString(ALBUM).equals(currentAlbum)
  307. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  308. currentTrack = musicCursor.getString(TRACK);
  309. return currentTrack;
  310. }
  311. }
  312. musicCursor.moveToFirst();
  313. while (musicCursor.getPosition() < initialPosition) {
  314. if (musicCursor.getString(ARTIST).equals(currentArtist)
  315. && musicCursor.getString(ALBUM).equals(currentAlbum)
  316. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  317. currentTrack = musicCursor.getString(TRACK);
  318. return currentTrack;
  319. }
  320. musicCursor.moveToNext();
  321. }
  322. currentTrack = musicCursor.getString(TRACK);
  323. return currentTrack;
  324. }
  325. public String peekPrevTrack() {
  326. if (!taggedMusicAvailable) {
  327. return "";
  328. }
  329. int initialPosition = musicCursor.getPosition();
  330. while (musicCursor.moveToPrevious()) {
  331. if (musicCursor.getString(ARTIST).equals(currentArtist)
  332. && musicCursor.getString(ALBUM).equals(currentAlbum)
  333. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  334. String track = musicCursor.getString(TRACK);
  335. musicCursor.moveToPosition(initialPosition);
  336. return track;
  337. }
  338. }
  339. musicCursor.moveToLast();
  340. while (musicCursor.getPosition() > initialPosition) {
  341. if (musicCursor.getString(ARTIST).equals(currentArtist)
  342. && musicCursor.getString(ALBUM).equals(currentAlbum)
  343. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  344. String track = musicCursor.getString(TRACK);
  345. musicCursor.moveToPosition(initialPosition);
  346. return track;
  347. }
  348. musicCursor.moveToPrevious();
  349. }
  350. return musicCursor.getString(TRACK);
  351. }
  352. public String goPrevTrack() {
  353. if (!taggedMusicAvailable) {
  354. return "";
  355. }
  356. int initialPosition = musicCursor.getPosition();
  357. while (musicCursor.moveToPrevious()) {
  358. if (musicCursor.getString(ARTIST).equals(currentArtist)
  359. && musicCursor.getString(ALBUM).equals(currentAlbum)
  360. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  361. currentTrack = musicCursor.getString(TRACK);
  362. return currentTrack;
  363. }
  364. }
  365. musicCursor.moveToLast();
  366. while (musicCursor.getPosition() > initialPosition) {
  367. if (musicCursor.getString(ARTIST).equals(currentArtist)
  368. && musicCursor.getString(ALBUM).equals(currentAlbum)
  369. && !musicCursor.getString(TRACK).equals(currentTrack)) {
  370. currentTrack = musicCursor.getString(TRACK);
  371. return currentTrack;
  372. }
  373. musicCursor.moveToPrevious();
  374. }
  375. currentTrack = musicCursor.getString(TRACK);
  376. return currentTrack;
  377. }
  378. public String getCurrentSongFile() {
  379. if (!taggedMusicAvailable) {
  380. return "";
  381. }
  382. currentArtist = musicCursor.getString(ARTIST);
  383. currentAlbum = musicCursor.getString(ALBUM);
  384. currentTrack = musicCursor.getString(TRACK);
  385. editor.putString(PREF_ARTIST, currentArtist);
  386. editor.putString(PREF_ALBUM, currentAlbum);
  387. editor.putString(PREF_TRACK, currentTrack);
  388. editor.commit();
  389. return musicCursor.getString(FILEPATH);
  390. }
  391. public String getCurrentSongInfo() {
  392. if (!taggedMusicAvailable) {
  393. return "";
  394. }
  395. currentArtist = musicCursor.getString(ARTIST);
  396. currentAlbum = musicCursor.getString(ALBUM);
  397. currentTrack = musicCursor.getString(TRACK);
  398. return currentArtist + "\n" + currentAlbum + "\n" + currentTrack;
  399. }
  400. }