blob: 2a55d08cb5720017add12caa4db784909d6b7d51 [file] [log] [blame]
The Android Open Source Project792a2202009-03-03 19:32:30 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of 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,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.music;
18
19import android.app.ListActivity;
20import android.app.SearchManager;
21import android.content.AsyncQueryHandler;
22import android.content.BroadcastReceiver;
23import android.content.ContentResolver;
24import android.content.Context;
25import android.content.Intent;
26import android.content.IntentFilter;
27import android.content.res.Resources;
28import android.database.Cursor;
29import android.graphics.Bitmap;
30import android.graphics.BitmapFactory;
31import android.graphics.drawable.BitmapDrawable;
32import android.graphics.drawable.Drawable;
33import android.media.AudioManager;
34import android.media.MediaFile;
35import android.net.Uri;
36import android.os.Bundle;
37import android.os.Handler;
38import android.os.Message;
39import android.provider.MediaStore;
40import android.view.ContextMenu;
41import android.view.Menu;
42import android.view.MenuItem;
43import android.view.SubMenu;
44import android.view.View;
45import android.view.ViewGroup;
46import android.view.Window;
47import android.view.ContextMenu.ContextMenuInfo;
48import android.widget.Adapter;
49import android.widget.AlphabetIndexer;
50import android.widget.CursorAdapter;
51import android.widget.ImageView;
52import android.widget.ListAdapter;
53import android.widget.ListView;
54import android.widget.SectionIndexer;
55import android.widget.SimpleCursorAdapter;
56import android.widget.TextView;
57import android.widget.AdapterView.AdapterContextMenuInfo;
58
59import java.text.Collator;
60
61public class AlbumBrowserActivity extends ListActivity
62 implements View.OnCreateContextMenuListener, MusicUtils.Defs
63{
64 private String mCurrentAlbumId;
65 private String mCurrentAlbumName;
66 private String mCurrentArtistNameForAlbum;
67 private AlbumListAdapter mAdapter;
68 private boolean mAdapterSent;
69 private final static int SEARCH = CHILD_MENU_BASE;
70
71 public AlbumBrowserActivity()
72 {
73 }
74
75 /** Called when the activity is first created. */
76 @Override
77 public void onCreate(Bundle icicle)
78 {
79 if (icicle != null) {
80 mCurrentAlbumId = icicle.getString("selectedalbum");
81 mArtistId = icicle.getString("artist");
82 } else {
83 mArtistId = getIntent().getStringExtra("artist");
84 }
85 super.onCreate(icicle);
86 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
87 setVolumeControlStream(AudioManager.STREAM_MUSIC);
88 MusicUtils.bindToService(this);
89
90 IntentFilter f = new IntentFilter();
91 f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
92 f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
93 f.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
94 f.addDataScheme("file");
95 registerReceiver(mScanListener, f);
96
97 setContentView(R.layout.media_picker_activity);
98 ListView lv = getListView();
99 lv.setFastScrollEnabled(true);
100 lv.setOnCreateContextMenuListener(this);
101 lv.setTextFilterEnabled(true);
102
103 mAdapter = (AlbumListAdapter) getLastNonConfigurationInstance();
104 if (mAdapter == null) {
105 //Log.i("@@@", "starting query");
106 mAdapter = new AlbumListAdapter(
107 getApplication(),
108 this,
109 R.layout.track_list_item,
110 mAlbumCursor,
111 new String[] {},
112 new int[] {});
113 setListAdapter(mAdapter);
114 setTitle(R.string.working_albums);
115 getAlbumCursor(mAdapter.getQueryHandler(), null);
116 } else {
117 mAdapter.setActivity(this);
118 setListAdapter(mAdapter);
119 mAlbumCursor = mAdapter.getCursor();
120 if (mAlbumCursor != null) {
121 init(mAlbumCursor);
122 } else {
123 getAlbumCursor(mAdapter.getQueryHandler(), null);
124 }
125 }
126 }
127
128 @Override
129 public Object onRetainNonConfigurationInstance() {
130 mAdapterSent = true;
131 return mAdapter;
132 }
133
134 @Override
135 public void onSaveInstanceState(Bundle outcicle) {
136 // need to store the selected item so we don't lose it in case
137 // of an orientation switch. Otherwise we could lose it while
138 // in the middle of specifying a playlist to add the item to.
139 outcicle.putString("selectedalbum", mCurrentAlbumId);
140 outcicle.putString("artist", mArtistId);
141 super.onSaveInstanceState(outcicle);
142 }
143
144 @Override
145 public void onDestroy() {
146 MusicUtils.unbindFromService(this);
147 if (!mAdapterSent) {
148 Cursor c = mAdapter.getCursor();
149 if (c != null) {
150 c.close();
151 }
152 }
153 unregisterReceiver(mScanListener);
154 super.onDestroy();
155 }
156
157 @Override
158 public void onResume() {
159 super.onResume();
160 IntentFilter f = new IntentFilter();
161 f.addAction(MediaPlaybackService.META_CHANGED);
162 f.addAction(MediaPlaybackService.QUEUE_CHANGED);
163 registerReceiver(mTrackListListener, f);
164 mTrackListListener.onReceive(null, null);
165
166 MusicUtils.setSpinnerState(this);
167 }
168
169 private BroadcastReceiver mTrackListListener = new BroadcastReceiver() {
170 @Override
171 public void onReceive(Context context, Intent intent) {
172 getListView().invalidateViews();
173 }
174 };
175 private BroadcastReceiver mScanListener = new BroadcastReceiver() {
176 @Override
177 public void onReceive(Context context, Intent intent) {
178 MusicUtils.setSpinnerState(AlbumBrowserActivity.this);
179 mReScanHandler.sendEmptyMessage(0);
180 if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
181 MusicUtils.clearAlbumArtCache();
182 }
183 }
184 };
185
186 private Handler mReScanHandler = new Handler() {
187 @Override
188 public void handleMessage(Message msg) {
189 getAlbumCursor(mAdapter.getQueryHandler(), null);
190 }
191 };
192
193 @Override
194 public void onPause() {
195 unregisterReceiver(mTrackListListener);
196 mReScanHandler.removeCallbacksAndMessages(null);
197 super.onPause();
198 }
199
200 public void init(Cursor c) {
201
202 mAdapter.changeCursor(c); // also sets mAlbumCursor
203
204 if (mAlbumCursor == null) {
205 MusicUtils.displayDatabaseError(this);
206 closeContextMenu();
207 mReScanHandler.sendEmptyMessageDelayed(0, 1000);
208 return;
209 }
210
211 MusicUtils.hideDatabaseError(this);
212 setTitle();
213 }
214
215 private void setTitle() {
216 CharSequence fancyName = "";
217 if (mAlbumCursor != null && mAlbumCursor.getCount() > 0) {
218 mAlbumCursor.moveToFirst();
219 fancyName = mAlbumCursor.getString(3);
The Android Open Source Project6a9c41c2009-03-09 11:52:14 -0700220 if (fancyName == null || fancyName.equals(MediaFile.UNKNOWN_STRING))
The Android Open Source Project792a2202009-03-03 19:32:30 -0800221 fancyName = getText(R.string.unknown_artist_name);
222 }
223
224 if (mArtistId != null && fancyName != null)
225 setTitle(fancyName);
226 else
227 setTitle(R.string.albums_title);
228 }
229
230 @Override
231 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
232 menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
233 SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
234 MusicUtils.makePlaylistMenu(this, sub);
235 menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
236 menu.add(0, SEARCH, 0, R.string.search_title);
237
238 AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn;
239 mAlbumCursor.moveToPosition(mi.position);
240 mCurrentAlbumId = mAlbumCursor.getString(mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
241 mCurrentAlbumName = mAlbumCursor.getString(mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
242 mCurrentArtistNameForAlbum = mAlbumCursor.getString(
243 mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST));
Eric Fischerc8aa8372009-06-17 16:34:12 -0700244 if (mCurrentAlbumName == null || mCurrentAlbumName.equals(MediaFile.UNKNOWN_STRING)) {
245 menu.setHeaderTitle(getString(R.string.unknown_album_name));
246 } else {
247 menu.setHeaderTitle(mCurrentAlbumName);
248 }
The Android Open Source Project792a2202009-03-03 19:32:30 -0800249 }
250
251 @Override
252 public boolean onContextItemSelected(MenuItem item) {
253 switch (item.getItemId()) {
254 case PLAY_SELECTION: {
255 // play the selected album
Marco Nelissenbd447b62009-06-29 14:52:05 -0700256 long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
The Android Open Source Project792a2202009-03-03 19:32:30 -0800257 MusicUtils.playAll(this, list, 0);
258 return true;
259 }
260
261 case QUEUE: {
Marco Nelissenbd447b62009-06-29 14:52:05 -0700262 long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
The Android Open Source Project792a2202009-03-03 19:32:30 -0800263 MusicUtils.addToCurrentPlaylist(this, list);
264 return true;
265 }
266
267 case NEW_PLAYLIST: {
268 Intent intent = new Intent();
269 intent.setClass(this, CreatePlaylist.class);
270 startActivityForResult(intent, NEW_PLAYLIST);
271 return true;
272 }
273
274 case PLAYLIST_SELECTED: {
Marco Nelissenbd447b62009-06-29 14:52:05 -0700275 long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
276 long playlist = item.getIntent().getLongExtra("playlist", 0);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800277 MusicUtils.addToPlaylist(this, list, playlist);
278 return true;
279 }
280 case DELETE_ITEM: {
Marco Nelissenbd447b62009-06-29 14:52:05 -0700281 long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
The Android Open Source Project792a2202009-03-03 19:32:30 -0800282 String f = getString(R.string.delete_album_desc);
283 String desc = String.format(f, mCurrentAlbumName);
284 Bundle b = new Bundle();
285 b.putString("description", desc);
Marco Nelissenbd447b62009-06-29 14:52:05 -0700286 b.putLongArray("items", list);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800287 Intent intent = new Intent();
288 intent.setClass(this, DeleteItems.class);
289 intent.putExtras(b);
290 startActivityForResult(intent, -1);
291 return true;
292 }
293 case SEARCH:
294 doSearch();
295 return true;
296
297 }
298 return super.onContextItemSelected(item);
299 }
300
301 void doSearch() {
302 CharSequence title = null;
303 String query = null;
304
305 Intent i = new Intent();
306 i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
Marco Nelissen4341b502009-05-06 14:57:37 -0700307 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800308
309 title = mCurrentAlbumName;
310 query = mCurrentArtistNameForAlbum + " " + mCurrentAlbumName;
311 i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
312 i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
313 i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
314 title = getString(R.string.mediasearch, title);
315 i.putExtra(SearchManager.QUERY, query);
316
317 startActivity(Intent.createChooser(i, title));
318 }
319
320 @Override
321 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
322 switch (requestCode) {
323 case SCAN_DONE:
324 if (resultCode == RESULT_CANCELED) {
325 finish();
326 } else {
327 getAlbumCursor(mAdapter.getQueryHandler(), null);
328 }
329 break;
330
331 case NEW_PLAYLIST:
332 if (resultCode == RESULT_OK) {
333 Uri uri = intent.getData();
334 if (uri != null) {
Marco Nelissenbd447b62009-06-29 14:52:05 -0700335 long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
336 MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment()));
The Android Open Source Project792a2202009-03-03 19:32:30 -0800337 }
338 }
339 break;
340 }
341 }
342
343 @Override
344 protected void onListItemClick(ListView l, View v, int position, long id)
345 {
The Android Open Source Project792a2202009-03-03 19:32:30 -0800346 Intent intent = new Intent(Intent.ACTION_PICK);
347 intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
348 intent.putExtra("album", Long.valueOf(id).toString());
349 intent.putExtra("artist", mArtistId);
350 startActivity(intent);
351 }
352
353 @Override
354 public boolean onCreateOptionsMenu(Menu menu) {
355 super.onCreateOptionsMenu(menu);
356 menu.add(0, GOTO_START, 0, R.string.goto_start).setIcon(R.drawable.ic_menu_music_library);
357 menu.add(0, GOTO_PLAYBACK, 0, R.string.goto_playback).setIcon(R.drawable.ic_menu_playback);
358 menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle);
359 return true;
360 }
361
362 @Override
363 public boolean onPrepareOptionsMenu(Menu menu) {
364 menu.findItem(GOTO_PLAYBACK).setVisible(MusicUtils.isMusicLoaded());
365 return super.onPrepareOptionsMenu(menu);
366 }
367
368 @Override
369 public boolean onOptionsItemSelected(MenuItem item) {
370 Intent intent;
371 Cursor cursor;
372 switch (item.getItemId()) {
373 case GOTO_START:
374 intent = new Intent();
375 intent.setClass(this, MusicBrowserActivity.class);
376 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
377 startActivity(intent);
378 return true;
379
380 case GOTO_PLAYBACK:
381 intent = new Intent("com.android.music.PLAYBACK_VIEWER");
382 startActivity(intent);
383 return true;
384
385 case SHUFFLE_ALL:
386 cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
387 new String [] { MediaStore.Audio.Media._ID},
388 MediaStore.Audio.Media.IS_MUSIC + "=1", null,
389 MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
390 if (cursor != null) {
391 MusicUtils.shuffleAll(this, cursor);
392 cursor.close();
393 }
394 return true;
395 }
396 return super.onOptionsItemSelected(item);
397 }
398
399 private Cursor getAlbumCursor(AsyncQueryHandler async, String filter) {
400 StringBuilder where = new StringBuilder();
401 where.append(MediaStore.Audio.Albums.ALBUM + " != ''");
402
403 // Add in the filtering constraints
404 String [] keywords = null;
405 if (filter != null) {
406 String [] searchWords = filter.split(" ");
407 keywords = new String[searchWords.length];
408 Collator col = Collator.getInstance();
409 col.setStrength(Collator.PRIMARY);
410 for (int i = 0; i < searchWords.length; i++) {
411 keywords[i] = '%' + MediaStore.Audio.keyFor(searchWords[i]) + '%';
412 }
413 for (int i = 0; i < searchWords.length; i++) {
414 where.append(" AND ");
415 where.append(MediaStore.Audio.Media.ARTIST_KEY + "||");
416 where.append(MediaStore.Audio.Media.ALBUM_KEY + " LIKE ?");
417 }
418 }
419
420 String whereclause = where.toString();
421
422 String[] cols = new String[] {
423 MediaStore.Audio.Albums._ID,
The Android Open Source Project792a2202009-03-03 19:32:30 -0800424 MediaStore.Audio.Albums.ARTIST,
Marco Nelissen756c3f52009-05-14 10:07:23 -0700425 MediaStore.Audio.Albums.ALBUM,
The Android Open Source Project792a2202009-03-03 19:32:30 -0800426 MediaStore.Audio.Albums.ALBUM_ART
427 };
428 Cursor ret = null;
429 if (mArtistId != null) {
430 if (async != null) {
431 async.startQuery(0, null,
432 MediaStore.Audio.Artists.Albums.getContentUri("external",
433 Long.valueOf(mArtistId)),
434 cols, whereclause, keywords, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
435 } else {
436 ret = MusicUtils.query(this,
437 MediaStore.Audio.Artists.Albums.getContentUri("external",
438 Long.valueOf(mArtistId)),
439 cols, whereclause, keywords, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
440 }
441 } else {
442 if (async != null) {
443 async.startQuery(0, null,
444 MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
445 cols, whereclause, keywords, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
446 } else {
447 ret = MusicUtils.query(this, MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
448 cols, whereclause, keywords, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
449 }
450 }
451 return ret;
452 }
453
454 static class AlbumListAdapter extends SimpleCursorAdapter implements SectionIndexer {
455
456 private final Drawable mNowPlayingOverlay;
457 private final BitmapDrawable mDefaultAlbumIcon;
458 private int mAlbumIdx;
459 private int mArtistIdx;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800460 private int mAlbumArtIndex;
461 private final Resources mResources;
462 private final StringBuilder mStringBuilder = new StringBuilder();
463 private final String mUnknownAlbum;
464 private final String mUnknownArtist;
465 private final String mAlbumSongSeparator;
466 private final Object[] mFormatArgs = new Object[1];
467 private AlphabetIndexer mIndexer;
468 private AlbumBrowserActivity mActivity;
469 private AsyncQueryHandler mQueryHandler;
470 private String mConstraint = null;
471 private boolean mConstraintIsValid = false;
472
Marco Nelissen756c3f52009-05-14 10:07:23 -0700473 static class ViewHolder {
The Android Open Source Project792a2202009-03-03 19:32:30 -0800474 TextView line1;
475 TextView line2;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800476 ImageView play_indicator;
477 ImageView icon;
478 }
479
480 class QueryHandler extends AsyncQueryHandler {
481 QueryHandler(ContentResolver res) {
482 super(res);
483 }
484
485 @Override
486 protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
487 //Log.i("@@@", "query complete");
488 mActivity.init(cursor);
489 }
490 }
491
492 AlbumListAdapter(Context context, AlbumBrowserActivity currentactivity,
493 int layout, Cursor cursor, String[] from, int[] to) {
494 super(context, layout, cursor, from, to);
495
496 mActivity = currentactivity;
497 mQueryHandler = new QueryHandler(context.getContentResolver());
498
499 mUnknownAlbum = context.getString(R.string.unknown_album_name);
500 mUnknownArtist = context.getString(R.string.unknown_artist_name);
501 mAlbumSongSeparator = context.getString(R.string.albumsongseparator);
502
503 Resources r = context.getResources();
504 mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
505
506 Bitmap b = BitmapFactory.decodeResource(r, R.drawable.albumart_mp_unknown_list);
507 mDefaultAlbumIcon = new BitmapDrawable(b);
508 // no filter or dither, it's a lot faster and we can't tell the difference
509 mDefaultAlbumIcon.setFilterBitmap(false);
510 mDefaultAlbumIcon.setDither(false);
511 getColumnIndices(cursor);
512 mResources = context.getResources();
513 }
514
515 private void getColumnIndices(Cursor cursor) {
516 if (cursor != null) {
517 mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM);
518 mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800519 mAlbumArtIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART);
520
521 if (mIndexer != null) {
522 mIndexer.setCursor(cursor);
523 } else {
524 mIndexer = new MusicAlphabetIndexer(cursor, mAlbumIdx, mResources.getString(
525 com.android.internal.R.string.fast_scroll_alphabet));
526 }
527 }
528 }
529
530 public void setActivity(AlbumBrowserActivity newactivity) {
531 mActivity = newactivity;
532 }
533
534 public AsyncQueryHandler getQueryHandler() {
535 return mQueryHandler;
536 }
537
538 @Override
539 public View newView(Context context, Cursor cursor, ViewGroup parent) {
540 View v = super.newView(context, cursor, parent);
541 ViewHolder vh = new ViewHolder();
542 vh.line1 = (TextView) v.findViewById(R.id.line1);
543 vh.line2 = (TextView) v.findViewById(R.id.line2);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800544 vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
545 vh.icon = (ImageView) v.findViewById(R.id.icon);
546 vh.icon.setBackgroundDrawable(mDefaultAlbumIcon);
547 vh.icon.setPadding(0, 0, 1, 0);
548 v.setTag(vh);
549 return v;
550 }
551
552 @Override
553 public void bindView(View view, Context context, Cursor cursor) {
554
555 ViewHolder vh = (ViewHolder) view.getTag();
556
557 String name = cursor.getString(mAlbumIdx);
558 String displayname = name;
The Android Open Source Project6a9c41c2009-03-09 11:52:14 -0700559 boolean unknown = name == null || name.equals(MediaFile.UNKNOWN_STRING);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800560 if (unknown) {
561 displayname = mUnknownAlbum;
562 }
563 vh.line1.setText(displayname);
564
565 name = cursor.getString(mArtistIdx);
566 displayname = name;
The Android Open Source Project6a9c41c2009-03-09 11:52:14 -0700567 if (name == null || name.equals(MediaFile.UNKNOWN_STRING)) {
The Android Open Source Project792a2202009-03-03 19:32:30 -0800568 displayname = mUnknownArtist;
569 }
570 vh.line2.setText(displayname);
571
572 ImageView iv = vh.icon;
573 // We don't actually need the path to the thumbnail file,
574 // we just use it to see if there is album art or not
575 String art = cursor.getString(mAlbumArtIndex);
Marco Nelissenbd447b62009-06-29 14:52:05 -0700576 long aid = cursor.getLong(0);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800577 if (unknown || art == null || art.length() == 0) {
578 iv.setImageDrawable(null);
579 } else {
Marco Nelissenbd447b62009-06-29 14:52:05 -0700580 Drawable d = MusicUtils.getCachedArtwork(context, aid, mDefaultAlbumIcon);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800581 iv.setImageDrawable(d);
582 }
583
Marco Nelissenbd447b62009-06-29 14:52:05 -0700584 long currentalbumid = MusicUtils.getCurrentAlbumId();
The Android Open Source Project792a2202009-03-03 19:32:30 -0800585 iv = vh.play_indicator;
586 if (currentalbumid == aid) {
587 iv.setImageDrawable(mNowPlayingOverlay);
588 } else {
589 iv.setImageDrawable(null);
590 }
591 }
592
593 @Override
594 public void changeCursor(Cursor cursor) {
595 if (cursor != mActivity.mAlbumCursor) {
596 mActivity.mAlbumCursor = cursor;
597 getColumnIndices(cursor);
598 super.changeCursor(cursor);
599 }
600 }
601
602 @Override
603 public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
604 String s = constraint.toString();
605 if (mConstraintIsValid && (
606 (s == null && mConstraint == null) ||
607 (s != null && s.equals(mConstraint)))) {
608 return getCursor();
609 }
610 Cursor c = mActivity.getAlbumCursor(null, s);
611 mConstraint = s;
612 mConstraintIsValid = true;
613 return c;
614 }
615
616 public Object[] getSections() {
617 return mIndexer.getSections();
618 }
619
620 public int getPositionForSection(int section) {
621 return mIndexer.getPositionForSection(section);
622 }
623
624 public int getSectionForPosition(int position) {
625 return 0;
626 }
627 }
628
629 private Cursor mAlbumCursor;
630 private String mArtistId;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800631}
632