📄 trackbrowseractivity.java
字号:
mTrackCursor.moveToPosition(to); int toidx = mTrackCursor.getInt(colidx); mTrackCursor.moveToPosition(from);// mTrackCursor.updateInt(colidx, toidx); for (int i = from - 1; i >= to; i--) { mTrackCursor.moveToPosition(i);// mTrackCursor.updateInt(colidx, i + 1); }// mTrackCursor.commitUpdates(); } } } }; private TouchInterceptor.RemoveListener mRemoveListener = new TouchInterceptor.RemoveListener() { public void remove(int which) { removePlaylistItem(which); } }; 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(); mTrackCursor.moveToPosition(which);// mTrackCursor.deleteRow();// mTrackCursor.commitUpdates(); v.setVisibility(View.VISIBLE); mTrackList.invalidateViews(); } private BroadcastReceiver mTrackListListener = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { getListView().invalidateViews(); } }; private BroadcastReceiver mNowPlayingListener = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MediaPlaybackService.META_CHANGED)) { getListView().invalidateViews(); } else if (intent.getAction().equals(MediaPlaybackService.QUEUE_CHANGED)) { if (mDeletedOneRow) { // This is the notification for a single row that was // deleted previously, which is already reflected in // the UI. mDeletedOneRow = false; return; } mTrackCursor.close(); mTrackCursor = new NowPlayingCursor(MusicUtils.sService, mCursorCols); if (mTrackCursor.getCount() == 0) { finish(); return; } ((TrackListAdapter)getListAdapter()).changeCursor(mTrackCursor); getListView().invalidateViews(); } } }; public void onCreateContextMenu(ContextMenu menu, View view, 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); AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn; mSelectedPosition = mi.position; mTrackCursor.moveToPosition(mSelectedPosition); int id_idx = mTrackCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID); if (id_idx < 0 ) { mSelectedId = mi.id; } else { mSelectedId = mTrackCursor.getInt(id_idx); } mCurrentTrackName = mTrackCursor.getString(mTrackCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); menu.setHeaderTitle(mCurrentTrackName); } @Override public boolean onContextItemSelected(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(); b.putString("description", mCurrentTrackName); 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; } return super.onContextItemSelected(item); } // In order to use alt-up/down as a shortcut for moving the selected item // in the list, we need to override dispatchKeyEvent, not onKeyDown. // (onKeyDown never sees these events, since they are handled by the list) @Override public boolean dispatchKeyEvent(KeyEvent event) { if (mPlaylist != null && event.getMetaState() != 0 /* && event.isDown() */) { 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); } 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(); mTrackCursor.moveToPosition(curpos);// mTrackCursor.deleteRow();// mTrackCursor.commitUpdates(); v.setVisibility(View.VISIBLE); mTrackList.invalidateViews(); } else { // remove track from playlist mTrackCursor.moveToPosition(curpos);// mTrackCursor.deleteRow();// mTrackCursor.commitUpdates(); curcount--; if (curcount == 0) { finish(); } else { mTrackList.setSelection(curpos < curcount ? curpos : curcount); } } } 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.getColumnIndex(MediaStore.Audio.Playlists.Members.PLAY_ORDER); mTrackCursor.moveToPosition(curpos); int currentplayidx = mTrackCursor.getInt(colidx); if (up) {// mTrackCursor.updateInt(colidx, currentplayidx - 1); mTrackCursor.moveToPrevious(); } else {// mTrackCursor.updateInt(colidx, currentplayidx + 1); mTrackCursor.moveToNext(); }// mTrackCursor.updateInt(colidx, currentplayidx);// mTrackCursor.commitUpdates(); } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { if (mTrackCursor.getCount() == 0) { return; } MusicUtils.playAll(this, mTrackCursor, position); } @Override public boolean onCreateOptionsMenu(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(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(R.drawable.ic_menu_save); if (mPlaylist.equals("nowplaying")) { menu.add(0, CLEAR_PLAYLIST, 0, R.string.clear_playlist).setIcon(R.drawable.ic_menu_clear_playlist); } } return true; } @Override public boolean onOptionsItemSelected(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.imusic.playing"); 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); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { switch (requestCode) { case SCAN_DONE: if (resultCode == RESULT_CANCELED) { finish(); } else { init(); } break; case NEW_PLAYLIST: if (resultCode == RESULT_OK) { Uri uri = Uri.parse(intent.getAction()); 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 = Uri.parse(intent.getAction()); if (uri != null) { int [] list = MusicUtils.getSongListForCursor(mTrackCursor); int plid = Integer.parseInt(uri.getLastPathSegment()); MusicUtils.addToPlaylist(this, list, plid); } } break; } } private Cursor getTrackCursor(String filterstring) { 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 (filterstring != null) { String [] searchWords = filterstring.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 ?");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -