TrackBrowserActivitypublic class TrackBrowserActivity extends android.app.ListActivity implements View.OnCreateContextMenuListener, android.content.ServiceConnection, MusicUtils.Defs
Fields Summary |
---|
private final int | Q_SELECTED | private final int | Q_ALL | private final int | SAVE_AS_PLAYLIST | private final int | PLAY_ALL | private final int | CLEAR_PLAYLIST | private final int | REMOVE | private final int | SEARCH | private static final String | LOGTAG | private String[] | mCursorCols | private String[] | mPlaylistMemberCols | private boolean | mDeletedOneRow | private boolean | mEditMode | private String | mCurrentTrackName | private String | mCurrentAlbumName | private String | mCurrentArtistNameForAlbum | private android.widget.ListView | mTrackList | private android.database.Cursor | mTrackCursor | private TrackListAdapter | mAdapter | private boolean | mAdapterSent | private String | mAlbumId | private String | mArtistId | private String | mPlaylist | private String | mGenre | private String | mSortOrder | private int | mSelectedPosition | private long | mSelectedId | private android.content.BroadcastReceiver | mScanListener | private android.os.Handler | mReScanHandler | private TouchInterceptor.DragListener | mDragListener | private TouchInterceptor.DropListener | mDropListener | private TouchInterceptor.RemoveListener | mRemoveListener | private android.content.BroadcastReceiver | mTrackListListener | private android.content.BroadcastReceiver | mNowPlayingListener |
Constructors Summary |
---|
public TrackBrowserActivity()
|
Methods Summary |
---|
public boolean | dispatchKeyEvent(android.view.KeyEvent event)
if (mPlaylist != null && event.getMetaState() != 0 &&
event.getAction() == KeyEvent.ACTION_DOWN) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_DPAD_UP:
moveItem(true);
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
moveItem(false);
return true;
case KeyEvent.KEYCODE_DEL:
removeItem();
return true;
}
}
return super.dispatchKeyEvent(event);
| void | doSearch()
CharSequence title = null;
String query = null;
Intent i = new Intent();
i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
title = mCurrentAlbumName;
query = mCurrentArtistNameForAlbum + " " + mCurrentAlbumName;
i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, "audio/*");
title = getString(R.string.mediasearch, title);
i.putExtra(SearchManager.QUERY, query);
startActivity(Intent.createChooser(i, title));
| private android.database.Cursor | getTrackCursor(android.content.AsyncQueryHandler async, java.lang.String filter)
Cursor ret = null;
mSortOrder = MediaStore.Audio.Media.TITLE_KEY;
StringBuilder where = new StringBuilder();
where.append(MediaStore.Audio.Media.TITLE + " != ''");
// Add in the filtering constraints
String [] keywords = null;
if (filter != null) {
String [] searchWords = filter.split(" ");
keywords = new String[searchWords.length];
Collator col = Collator.getInstance();
col.setStrength(Collator.PRIMARY);
for (int i = 0; i < searchWords.length; i++) {
keywords[i] = '%" + MediaStore.Audio.keyFor(searchWords[i]) + '%";
}
for (int i = 0; i < searchWords.length; i++) {
where.append(" AND ");
where.append(MediaStore.Audio.Media.ARTIST_KEY + "||");
where.append(MediaStore.Audio.Media.ALBUM_KEY + "||");
where.append(MediaStore.Audio.Media.TITLE_KEY + " LIKE ?");
}
}
if (mGenre != null) {
mSortOrder = MediaStore.Audio.Genres.Members.DEFAULT_SORT_ORDER;
if (async != null) {
async.startQuery(0, null,
MediaStore.Audio.Genres.Members.getContentUri("external",
Integer.valueOf(mGenre)),
mCursorCols, where.toString(), keywords, mSortOrder);
ret = null;
} else {
ret = MusicUtils.query(this,
MediaStore.Audio.Genres.Members.getContentUri("external", Integer.valueOf(mGenre)),
mCursorCols, where.toString(), keywords, mSortOrder);
}
} else if (mPlaylist != null) {
if (mPlaylist.equals("nowplaying")) {
if (MusicUtils.sService != null) {
ret = new NowPlayingCursor(MusicUtils.sService, mCursorCols);
if (ret.getCount() == 0) {
finish();
}
} else {
// Nothing is playing.
}
} else if (mPlaylist.equals("podcasts")) {
where.append(" AND " + MediaStore.Audio.Media.IS_PODCAST + "=1");
if (async != null) {
async.startQuery(0, null,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
ret = null;
} else {
ret = MusicUtils.query(this,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
}
} else if (mPlaylist.equals("recentlyadded")) {
// do a query for all songs added in the last X weeks
int X = MusicUtils.getIntPref(this, "numweeks", 2) * (3600 * 24 * 7);
where.append(" AND " + MediaStore.MediaColumns.DATE_ADDED + ">");
where.append(System.currentTimeMillis() / 1000 - X);
if (async != null) {
async.startQuery(0, null,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
ret = null;
} else {
ret = MusicUtils.query(this,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
}
} else {
mSortOrder = MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER;
if (async != null) {
async.startQuery(0, null,
MediaStore.Audio.Playlists.Members.getContentUri("external", Long.valueOf(mPlaylist)),
mPlaylistMemberCols, where.toString(), keywords, mSortOrder);
ret = null;
} else {
ret = MusicUtils.query(this,
MediaStore.Audio.Playlists.Members.getContentUri("external", Long.valueOf(mPlaylist)),
mPlaylistMemberCols, where.toString(), keywords, mSortOrder);
}
}
} else {
if (mAlbumId != null) {
where.append(" AND " + MediaStore.Audio.Media.ALBUM_ID + "=" + mAlbumId);
mSortOrder = MediaStore.Audio.Media.TRACK + ", " + mSortOrder;
}
if (mArtistId != null) {
where.append(" AND " + MediaStore.Audio.Media.ARTIST_ID + "=" + mArtistId);
}
where.append(" AND " + MediaStore.Audio.Media.IS_MUSIC + "=1");
if (async != null) {
async.startQuery(0, null,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
mCursorCols, where.toString() , keywords, mSortOrder);
ret = null;
} else {
ret = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
mCursorCols, where.toString() , keywords, mSortOrder);
}
}
// This special case is for the "nowplaying" cursor, which cannot be handled
// asynchronously using AsyncQueryHandler, so we do some extra initialization here.
if (ret != null && async != null) {
init(ret);
setTitle();
}
return ret;
| public void | init(android.database.Cursor newCursor)
mAdapter.changeCursor(newCursor); // also sets mTrackCursor
if (mTrackCursor == null) {
MusicUtils.displayDatabaseError(this);
closeContextMenu();
mReScanHandler.sendEmptyMessageDelayed(0, 1000);
return;
}
MusicUtils.hideDatabaseError(this);
setTitle();
// When showing the queue, position the selection on the currently playing track
// Otherwise, position the selection on the first matching artist, if any
IntentFilter f = new IntentFilter();
f.addAction(MediaPlaybackService.META_CHANGED);
f.addAction(MediaPlaybackService.QUEUE_CHANGED);
if ("nowplaying".equals(mPlaylist)) {
try {
int cur = MusicUtils.sService.getQueuePosition();
setSelection(cur);
registerReceiver(mNowPlayingListener, new IntentFilter(f));
mNowPlayingListener.onReceive(this, new Intent(MediaPlaybackService.META_CHANGED));
} catch (RemoteException ex) {
}
} else {
String key = getIntent().getStringExtra("artist");
if (key != null) {
int keyidx = mTrackCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST_ID);
mTrackCursor.moveToFirst();
while (! mTrackCursor.isAfterLast()) {
String artist = mTrackCursor.getString(keyidx);
if (artist.equals(key)) {
setSelection(mTrackCursor.getPosition());
break;
}
mTrackCursor.moveToNext();
}
}
registerReceiver(mTrackListListener, new IntentFilter(f));
mTrackListListener.onReceive(this, new Intent(MediaPlaybackService.META_CHANGED));
}
| private void | moveItem(boolean up)
int curcount = mTrackCursor.getCount();
int curpos = mTrackList.getSelectedItemPosition();
if ( (up && curpos < 1) || (!up && curpos >= curcount - 1)) {
return;
}
if (mTrackCursor instanceof NowPlayingCursor) {
NowPlayingCursor c = (NowPlayingCursor) mTrackCursor;
c.moveItem(curpos, up ? curpos - 1 : curpos + 1);
((TrackListAdapter)getListAdapter()).notifyDataSetChanged();
getListView().invalidateViews();
mDeletedOneRow = true;
if (up) {
mTrackList.setSelection(curpos - 1);
} else {
mTrackList.setSelection(curpos + 1);
}
} else {
int colidx = mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Playlists.Members.PLAY_ORDER);
mTrackCursor.moveToPosition(curpos);
int currentplayidx = mTrackCursor.getInt(colidx);
Uri baseUri = MediaStore.Audio.Playlists.Members.getContentUri("external",
Long.valueOf(mPlaylist));
ContentValues values = new ContentValues();
String where = MediaStore.Audio.Playlists.Members._ID + "=?";
String [] wherearg = new String[1];
ContentResolver res = getContentResolver();
if (up) {
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, currentplayidx - 1);
wherearg[0] = mTrackCursor.getString(0);
res.update(baseUri, values, where, wherearg);
mTrackCursor.moveToPrevious();
} else {
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, currentplayidx + 1);
wherearg[0] = mTrackCursor.getString(0);
res.update(baseUri, values, where, wherearg);
mTrackCursor.moveToNext();
}
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, currentplayidx);
wherearg[0] = mTrackCursor.getString(0);
res.update(baseUri, values, where, wherearg);
}
| protected void | onActivityResult(int requestCode, int resultCode, android.content.Intent intent)
switch (requestCode) {
case SCAN_DONE:
if (resultCode == RESULT_CANCELED) {
finish();
} else {
getTrackCursor(mAdapter.getQueryHandler(), null);
}
break;
case NEW_PLAYLIST:
if (resultCode == RESULT_OK) {
Uri uri = intent.getData();
if (uri != null) {
int [] list = new int[] { (int) mSelectedId };
MusicUtils.addToPlaylist(this, list, Integer.valueOf(uri.getLastPathSegment()));
}
}
break;
case SAVE_AS_PLAYLIST:
if (resultCode == RESULT_OK) {
Uri uri = intent.getData();
if (uri != null) {
int [] list = MusicUtils.getSongListForCursor(mTrackCursor);
int plid = Integer.parseInt(uri.getLastPathSegment());
MusicUtils.addToPlaylist(this, list, plid);
}
}
break;
}
| public boolean | onContextItemSelected(android.view.MenuItem item)
switch (item.getItemId()) {
case PLAY_SELECTION: {
// play the track
int position = mSelectedPosition;
MusicUtils.playAll(this, mTrackCursor, position);
return true;
}
case QUEUE: {
int [] list = new int[] { (int) mSelectedId };
MusicUtils.addToCurrentPlaylist(this, list);
return true;
}
case NEW_PLAYLIST: {
Intent intent = new Intent();
intent.setClass(this, CreatePlaylist.class);
startActivityForResult(intent, NEW_PLAYLIST);
return true;
}
case PLAYLIST_SELECTED: {
int [] list = new int[] { (int) mSelectedId };
int playlist = item.getIntent().getIntExtra("playlist", 0);
MusicUtils.addToPlaylist(this, list, playlist);
return true;
}
case USE_AS_RINGTONE:
// Set the system setting to make this the current ringtone
MusicUtils.setRingtone(this, mSelectedId);
return true;
case DELETE_ITEM: {
int [] list = new int[1];
list[0] = (int) mSelectedId;
Bundle b = new Bundle();
String f = getString(R.string.delete_song_desc);
String desc = String.format(f, mCurrentTrackName);
b.putString("description", desc);
b.putIntArray("items", list);
Intent intent = new Intent();
intent.setClass(this, DeleteItems.class);
intent.putExtras(b);
startActivityForResult(intent, -1);
return true;
}
case REMOVE:
removePlaylistItem(mSelectedPosition);
return true;
case SEARCH:
doSearch();
return true;
}
return super.onContextItemSelected(item);
| public void | onCreate(android.os.Bundle icicle)Called when the activity is first created.
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
if (icicle != null) {
mSelectedId = icicle.getLong("selectedtrack");
mAlbumId = icicle.getString("album");
mArtistId = icicle.getString("artist");
mPlaylist = icicle.getString("playlist");
mGenre = icicle.getString("genre");
mEditMode = icicle.getBoolean("editmode", false);
} else {
mAlbumId = getIntent().getStringExtra("album");
// If we have an album, show everything on the album, not just stuff
// by a particular artist.
Intent intent = getIntent();
mArtistId = intent.getStringExtra("artist");
mPlaylist = intent.getStringExtra("playlist");
mGenre = intent.getStringExtra("genre");
mEditMode = intent.getAction().equals(Intent.ACTION_EDIT);
}
mCursorCols = new String[] {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.TITLE_KEY,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ARTIST_ID,
MediaStore.Audio.Media.DURATION
};
mPlaylistMemberCols = new String[] {
MediaStore.Audio.Playlists.Members._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.TITLE_KEY,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ARTIST_ID,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Playlists.Members.PLAY_ORDER,
MediaStore.Audio.Playlists.Members.AUDIO_ID
};
setContentView(R.layout.media_picker_activity);
mTrackList = getListView();
mTrackList.setOnCreateContextMenuListener(this);
if (mEditMode) {
//((TouchInterceptor) mTrackList).setDragListener(mDragListener);
((TouchInterceptor) mTrackList).setDropListener(mDropListener);
((TouchInterceptor) mTrackList).setRemoveListener(mRemoveListener);
mTrackList.setCacheColorHint(0);
} else {
mTrackList.setTextFilterEnabled(true);
}
mAdapter = (TrackListAdapter) getLastNonConfigurationInstance();
if (mAdapter != null) {
mAdapter.setActivity(this);
setListAdapter(mAdapter);
}
MusicUtils.bindToService(this, this);
| public void | onCreateContextMenu(android.view.ContextMenu menu, android.view.View view, android.view.ContextMenu.ContextMenuInfo menuInfoIn)
menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
MusicUtils.makePlaylistMenu(this, sub);
if (mEditMode) {
menu.add(0, REMOVE, 0, R.string.remove_from_playlist);
}
menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
menu.add(0, SEARCH, 0, R.string.search_title);
AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn;
mSelectedPosition = mi.position;
mTrackCursor.moveToPosition(mSelectedPosition);
try {
int id_idx = mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Playlists.Members.AUDIO_ID);
mSelectedId = mTrackCursor.getInt(id_idx);
} catch (IllegalArgumentException ex) {
mSelectedId = mi.id;
}
mCurrentAlbumName = mTrackCursor.getString(mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Media.ALBUM));
mCurrentArtistNameForAlbum = mTrackCursor.getString(mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Media.ARTIST));
mCurrentTrackName = mTrackCursor.getString(mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Media.TITLE));
menu.setHeaderTitle(mCurrentTrackName);
| public boolean | onCreateOptionsMenu(android.view.Menu menu)
/* This activity is used for a number of different browsing modes, and the menu can
* be different for each of them:
* - all tracks, optionally restricted to an album, artist or playlist
* - the list of currently playing songs
*/
super.onCreateOptionsMenu(menu);
if (mPlaylist == null) {
menu.add(0, PLAY_ALL, 0, R.string.play_all).setIcon(com.android.internal.R.drawable.ic_menu_play_clip);
}
menu.add(0, GOTO_START, 0, R.string.goto_start).setIcon(R.drawable.ic_menu_music_library);
menu.add(0, GOTO_PLAYBACK, 0, R.string.goto_playback).setIcon(R.drawable.ic_menu_playback)
.setVisible(MusicUtils.isMusicLoaded());
menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle);
if (mPlaylist != null) {
menu.add(0, SAVE_AS_PLAYLIST, 0, R.string.save_as_playlist).setIcon(android.R.drawable.ic_menu_save);
if (mPlaylist.equals("nowplaying")) {
menu.add(0, CLEAR_PLAYLIST, 0, R.string.clear_playlist).setIcon(com.android.internal.R.drawable.ic_menu_clear_playlist);
}
}
return true;
| public void | onDestroy()
MusicUtils.unbindFromService(this);
try {
if ("nowplaying".equals(mPlaylist)) {
unregisterReceiverSafe(mNowPlayingListener);
} else {
unregisterReceiverSafe(mTrackListListener);
}
} catch (IllegalArgumentException ex) {
// we end up here in case we never registered the listeners
}
// if we didn't send the adapter off to another activity, we should
// close the cursor
if (!mAdapterSent) {
Cursor c = mAdapter.getCursor();
if (c != null) {
c.close();
}
}
unregisterReceiverSafe(mScanListener);
super.onDestroy();
| protected void | onListItemClick(android.widget.ListView l, android.view.View v, int position, long id)
if (mTrackCursor.getCount() == 0) {
return;
}
MusicUtils.playAll(this, mTrackCursor, position);
| public boolean | onOptionsItemSelected(android.view.MenuItem item)
Intent intent;
Cursor cursor;
switch (item.getItemId()) {
case PLAY_ALL: {
MusicUtils.playAll(this, mTrackCursor);
return true;
}
case GOTO_START:
intent = new Intent();
intent.setClass(this, MusicBrowserActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case GOTO_PLAYBACK:
intent = new Intent("com.android.music.PLAYBACK_VIEWER");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case SHUFFLE_ALL:
// Should 'shuffle all' shuffle ALL, or only the tracks shown?
cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String [] { MediaStore.Audio.Media._ID},
MediaStore.Audio.Media.IS_MUSIC + "=1", null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if (cursor != null) {
MusicUtils.shuffleAll(this, cursor);
cursor.close();
}
return true;
case SAVE_AS_PLAYLIST:
intent = new Intent();
intent.setClass(this, CreatePlaylist.class);
startActivityForResult(intent, SAVE_AS_PLAYLIST);
return true;
case CLEAR_PLAYLIST:
// We only clear the current playlist
MusicUtils.clearQueue();
return true;
}
return super.onOptionsItemSelected(item);
| public void | onPause()
mReScanHandler.removeCallbacksAndMessages(null);
super.onPause();
| public void | onResume()
super.onResume();
if (mTrackCursor != null) {
getListView().invalidateViews();
}
MusicUtils.setSpinnerState(this);
| public java.lang.Object | onRetainNonConfigurationInstance()
TrackListAdapter a = mAdapter;
mAdapterSent = true;
return a;
| public void | onSaveInstanceState(android.os.Bundle outcicle)
// need to store the selected item so we don't lose it in case
// of an orientation switch. Otherwise we could lose it while
// in the middle of specifying a playlist to add the item to.
outcicle.putLong("selectedtrack", mSelectedId);
outcicle.putString("artist", mArtistId);
outcicle.putString("album", mAlbumId);
outcicle.putString("playlist", mPlaylist);
outcicle.putString("genre", mGenre);
outcicle.putBoolean("editmode", mEditMode);
super.onSaveInstanceState(outcicle);
| public void | onServiceConnected(android.content.ComponentName name, android.os.IBinder service)
IntentFilter f = new IntentFilter();
f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
f.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
f.addDataScheme("file");
registerReceiver(mScanListener, f);
if (mAdapter == null) {
//Log.i("@@@", "starting query");
mAdapter = new TrackListAdapter(
getApplication(), // need to use application context to avoid leaks
this,
mEditMode ? R.layout.edit_track_list_item : R.layout.track_list_item,
null, // cursor
new String[] {},
new int[] {},
"nowplaying".equals(mPlaylist),
mPlaylist != null &&
!(mPlaylist.equals("podcasts") || mPlaylist.equals("recentlyadded")));
setListAdapter(mAdapter);
setTitle(R.string.working_songs);
getTrackCursor(mAdapter.getQueryHandler(), null);
} else {
mTrackCursor = mAdapter.getCursor();
// If mTrackCursor is null, this can be because it doesn't have
// a cursor yet (because the initial query that sets its cursor
// is still in progress), or because the query failed.
// In order to not flash the error dialog at the user for the
// first case, simply retry the query when the cursor is null.
// Worst case, we end up doing the same query twice.
if (mTrackCursor != null) {
init(mTrackCursor);
} else {
setTitle(R.string.working_songs);
getTrackCursor(mAdapter.getQueryHandler(), null);
}
}
| public void | onServiceDisconnected(android.content.ComponentName name)
// we can't really function without the service, so don't
finish();
| private void | removeItem()
int curcount = mTrackCursor.getCount();
int curpos = mTrackList.getSelectedItemPosition();
if (curcount == 0 || curpos < 0) {
return;
}
if ("nowplaying".equals(mPlaylist)) {
// remove track from queue
// Work around bug 902971. To get quick visual feedback
// of the deletion of the item, hide the selected view.
try {
if (curpos != MusicUtils.sService.getQueuePosition()) {
mDeletedOneRow = true;
}
} catch (RemoteException ex) {
}
View v = mTrackList.getSelectedView();
v.setVisibility(View.GONE);
mTrackList.invalidateViews();
((NowPlayingCursor)mTrackCursor).removeItem(curpos);
v.setVisibility(View.VISIBLE);
mTrackList.invalidateViews();
} else {
// remove track from playlist
int colidx = mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Playlists.Members._ID);
mTrackCursor.moveToPosition(curpos);
long id = mTrackCursor.getLong(colidx);
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
Long.valueOf(mPlaylist));
getContentResolver().delete(
ContentUris.withAppendedId(uri, id), null, null);
curcount--;
if (curcount == 0) {
finish();
} else {
mTrackList.setSelection(curpos < curcount ? curpos : curcount);
}
}
| private void | removePlaylistItem(int which)
View v = mTrackList.getChildAt(which - mTrackList.getFirstVisiblePosition());
try {
if (MusicUtils.sService != null
&& which != MusicUtils.sService.getQueuePosition()) {
mDeletedOneRow = true;
}
} catch (RemoteException e) {
// Service died, so nothing playing.
mDeletedOneRow = true;
}
v.setVisibility(View.GONE);
mTrackList.invalidateViews();
if (mTrackCursor instanceof NowPlayingCursor) {
((NowPlayingCursor)mTrackCursor).removeItem(which);
} else {
int colidx = mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Playlists.Members._ID);
mTrackCursor.moveToPosition(which);
long id = mTrackCursor.getLong(colidx);
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
Long.valueOf(mPlaylist));
getContentResolver().delete(
ContentUris.withAppendedId(uri, id), null, null);
}
v.setVisibility(View.VISIBLE);
mTrackList.invalidateViews();
| private void | setTitle()
CharSequence fancyName = null;
if (mAlbumId != null) {
int numresults = mTrackCursor != null ? mTrackCursor.getCount() : 0;
if (numresults > 0) {
mTrackCursor.moveToFirst();
int idx = mTrackCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
fancyName = mTrackCursor.getString(idx);
// For compilation albums show only the album title,
// but for regular albums show "artist - album".
// To determine whether something is a compilation
// album, do a query for the artist + album of the
// first item, and see if it returns the same number
// of results as the album query.
String where = MediaStore.Audio.Media.ALBUM_ID + "='" + mAlbumId +
"' AND " + MediaStore.Audio.Media.ARTIST_ID + "=" +
mTrackCursor.getLong(mTrackCursor.getColumnIndexOrThrow(
MediaStore.Audio.Media.ARTIST_ID));
Cursor cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Audio.Media.ALBUM}, where, null, null);
if (cursor != null) {
if (cursor.getCount() != numresults) {
// compilation album
fancyName = mTrackCursor.getString(idx);
}
cursor.deactivate();
}
if (fancyName == null || fancyName.equals(MediaFile.UNKNOWN_STRING)) {
fancyName = getString(R.string.unknown_album_name);
}
}
} else if (mPlaylist != null) {
if (mPlaylist.equals("nowplaying")) {
if (MusicUtils.getCurrentShuffleMode() == MediaPlaybackService.SHUFFLE_AUTO) {
fancyName = getText(R.string.partyshuffle_title);
} else {
fancyName = getText(R.string.nowplaying_title);
}
} else if (mPlaylist.equals("podcasts")){
fancyName = getText(R.string.podcasts_title);
} else if (mPlaylist.equals("recentlyadded")){
fancyName = getText(R.string.recentlyadded_title);
} else {
String [] cols = new String [] {
MediaStore.Audio.Playlists.NAME
};
Cursor cursor = MusicUtils.query(this,
ContentUris.withAppendedId(Playlists.EXTERNAL_CONTENT_URI, Long.valueOf(mPlaylist)),
cols, null, null, null);
if (cursor != null) {
if (cursor.getCount() != 0) {
cursor.moveToFirst();
fancyName = cursor.getString(0);
}
cursor.deactivate();
}
}
} else if (mGenre != null) {
String [] cols = new String [] {
MediaStore.Audio.Genres.NAME
};
Cursor cursor = MusicUtils.query(this,
ContentUris.withAppendedId(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, Long.valueOf(mGenre)),
cols, null, null, null);
if (cursor != null) {
if (cursor.getCount() != 0) {
cursor.moveToFirst();
fancyName = cursor.getString(0);
}
cursor.deactivate();
}
}
if (fancyName != null) {
setTitle(fancyName);
} else {
setTitle(R.string.tracks_title);
}
| private void | unregisterReceiverSafe(android.content.BroadcastReceiver receiver)Unregister a receiver, but eat the exception that is thrown if the
receiver was never registered to begin with. This is a little easier
than keeping track of whether the receivers have actually been
registered by the time onDestroy() is called.
try {
unregisterReceiver(receiver);
} catch (IllegalArgumentException e) {
// ignore
}
|
|