1792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/* 2792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 4792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * you may not use this file except in compliance with the License. 6792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * You may obtain a copy of the License at 7792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 8792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 10792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * See the License for the specific language governing permissions and 14792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * limitations under the License. 15792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */ 16792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 17792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpackage com.android.music; 18792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 19f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissenimport com.android.music.MusicUtils.ServiceToken; 20792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport com.android.music.QueryBrowserActivity.QueryListAdapter.QueryHandler; 21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.ExpandableListActivity; 23792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.SearchManager; 24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.AsyncQueryHandler; 25792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver; 26ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ComponentName; 27792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ContentResolver; 28792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context; 29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent; 30792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.IntentFilter; 31ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ServiceConnection; 32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.res.Resources; 33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.Cursor; 34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.CursorWrapper; 35792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.BitmapDrawable; 36792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.Drawable; 37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager; 38792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.net.Uri; 39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Bundle; 40792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler; 41ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.IBinder; 42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message; 43ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.Parcel; 44ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.Parcelable; 45792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore; 4689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissenimport android.text.TextUtils; 47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.util.Log; 48ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.util.SparseArray; 49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu; 50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Menu; 51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem; 52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.SubMenu; 53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.View; 54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewGroup; 55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Window; 56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 57792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListView; 58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView; 59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SectionIndexer; 60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SimpleCursorTreeAdapter; 61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView; 62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListView.ExpandableListContextMenuInfo; 63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport java.text.Collator; 65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class ArtistAlbumBrowserActivity extends ExpandableListActivity 68ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen implements View.OnCreateContextMenuListener, MusicUtils.Defs, ServiceConnection 69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project{ 70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentArtistId; 71792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentArtistName; 72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentAlbumId; 73792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentAlbumName; 74792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentArtistNameForAlbum; 759882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen boolean mIsUnknownArtist; 769882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen boolean mIsUnknownAlbum; 77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ArtistAlbumListAdapter mAdapter; 78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mAdapterSent; 79792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int SEARCH = CHILD_MENU_BASE; 80ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen private static int mLastListPosCourse = -1; 81ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen private static int mLastListPosFine = -1; 82f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen private ServiceToken mToken; 83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project /** Called when the activity is first created. */ 85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onCreate(Bundle icicle) { 87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreate(icicle); 88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 89ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen requestWindowFeature(Window.FEATURE_NO_TITLE); 90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setVolumeControlStream(AudioManager.STREAM_MUSIC); 91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (icicle != null) { 92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumId = icicle.getString("selectedalbum"); 93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumName = icicle.getString("selectedalbumname"); 94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId = icicle.getString("selectedartist"); 95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistName = icicle.getString("selectedartistname"); 96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 97f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen mToken = MusicUtils.bindToService(this, this); 98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project IntentFilter f = new IntentFilter(); 100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); 101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); 102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addDataScheme("file"); 104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project registerReceiver(mScanListener, f); 105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setContentView(R.layout.media_picker_activity_expanding); 107ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.updateButtonBar(this, R.id.artisttab); 108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ExpandableListView lv = getExpandableListView(); 109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lv.setOnCreateContextMenuListener(this); 110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lv.setTextFilterEnabled(true); 111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter = (ArtistAlbumListAdapter) getLastNonConfigurationInstance(); 113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mAdapter == null) { 114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project //Log.i("@@@", "starting query"); 115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter = new ArtistAlbumListAdapter( 116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getApplication(), 117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project this, 118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project null, // cursor 119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project R.layout.track_list_item_group, 120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new String[] {}, 121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new int[] {}, 122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project R.layout.track_list_item_child, 123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new String[] {}, 124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new int[] {}); 125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(mAdapter); 126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(R.string.working_artists); 127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getArtistCursor(mAdapter.getQueryHandler(), null); 128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter.setActivity(this); 130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(mAdapter); 131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistCursor = mAdapter.getCursor(); 132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mArtistCursor != null) { 133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project init(mArtistCursor); 134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getArtistCursor(mAdapter.getQueryHandler(), null); 136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Object onRetainNonConfigurationInstance() { 142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapterSent = true; 143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mAdapter; 144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onSaveInstanceState(Bundle outcicle) { 148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // need to store the selected item so we don't lose it in case 149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // of an orientation switch. Otherwise we could lose it while 150792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // in the middle of specifying a playlist to add the item to. 151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project outcicle.putString("selectedalbum", mCurrentAlbumId); 152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project outcicle.putString("selectedalbumname", mCurrentAlbumName); 153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project outcicle.putString("selectedartist", mCurrentArtistId); 154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project outcicle.putString("selectedartistname", mCurrentArtistName); 155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onSaveInstanceState(outcicle); 156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 157792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 158792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 159792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onDestroy() { 160ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen ExpandableListView lv = getExpandableListView(); 1619e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen if (lv != null) { 1629e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen mLastListPosCourse = lv.getFirstVisiblePosition(); 16323b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen View cv = lv.getChildAt(0); 16423b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen if (cv != null) { 16523b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen mLastListPosFine = cv.getTop(); 16623b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen } 1679e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen } 168ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 169f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen MusicUtils.unbindFromService(mToken); 1700e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // If we have an adapter and didn't send it off to another activity yet, we should 1710e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // close its cursor, which we do by assigning a null cursor to it. Doing this 1720e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // instead of closing the cursor directly keeps the framework from accessing 1730e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // the closed cursor later. 1748e732ffd92d538aaa9376b560b0ff2fc5ac78c43Marco Nelissen if (!mAdapterSent && mAdapter != null) { 1750e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen mAdapter.changeCursor(null); 176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1770164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // Because we pass the adapter to the next activity, we need to make 1780164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // sure it doesn't keep a reference to this activity. We can do this 1790164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // by clearing its DatasetObservers, which setListAdapter(null) does. 1800164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen setListAdapter(null); 1810164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen mAdapter = null; 182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project unregisterReceiver(mScanListener); 1839882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen setListAdapter(null); 184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onDestroy(); 185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onResume() { 189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onResume(); 190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project IntentFilter f = new IntentFilter(); 191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(MediaPlaybackService.META_CHANGED); 192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(MediaPlaybackService.QUEUE_CHANGED); 193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project registerReceiver(mTrackListListener, f); 194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackListListener.onReceive(null, null); 195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setSpinnerState(this); 197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private BroadcastReceiver mTrackListListener = new BroadcastReceiver() { 200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getExpandableListView().invalidateViews(); 203ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.updateNowPlaying(ArtistAlbumBrowserActivity.this); 204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private BroadcastReceiver mScanListener = new BroadcastReceiver() { 207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 208792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setSpinnerState(ArtistAlbumBrowserActivity.this); 210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.sendEmptyMessage(0); 211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) { 212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.clearAlbumArtCache(); 213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Handler mReScanHandler = new Handler() { 218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) { 22042bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen if (mAdapter != null) { 22142bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen getArtistCursor(mAdapter.getQueryHandler(), null); 22242bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen } 223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onPause() { 228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project unregisterReceiver(mTrackListListener); 229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.removeCallbacksAndMessages(null); 230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onPause(); 231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 233792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void init(Cursor c) { 234792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 23542bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen if (mAdapter == null) { 23642bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen return; 23742bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen } 238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter.changeCursor(c); // also sets mArtistCursor 239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mArtistCursor == null) { 241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.displayDatabaseError(this); 242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project closeContextMenu(); 243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.sendEmptyMessageDelayed(0, 1000); 244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 247ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen // restore previous position 248ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen if (mLastListPosCourse >= 0) { 249ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen ExpandableListView elv = getExpandableListView(); 250ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen elv.setSelectionFromTop(mLastListPosCourse, mLastListPosFine); 251ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen mLastListPosCourse = -1; 252ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen } 253ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.hideDatabaseError(this); 2559e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen MusicUtils.updateButtonBar(this, R.id.artisttab); 256792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(); 257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 258792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 259792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void setTitle() { 260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(R.string.artists_title); 261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumId = Long.valueOf(id).toString(); 267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_PICK); 269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track"); 270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtra("album", mCurrentAlbumId); 271792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor c = (Cursor) getExpandableListAdapter().getChild(groupPosition, childPosition); 272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String album = c.getString(c.getColumnIndex(MediaStore.Audio.Albums.ALBUM)); 273f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (album == null || album.equals(MediaStore.UNKNOWN_STRING)) { 274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // unknown album, so we should include the artist ID to limit the songs to songs only by that artist 275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistCursor.moveToPosition(groupPosition); 276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndex(MediaStore.Audio.Artists._ID)); 277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtra("artist", mCurrentArtistId); 278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(intent); 280792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 284792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 285792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreateOptionsMenu(menu); 286ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen menu.add(0, PARTY_SHUFFLE, 0, R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu() 287792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle); 288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 290792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 291792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onPrepareOptionsMenu(Menu menu) { 293ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.setPartyShuffleMenuIcon(menu); 294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onPrepareOptionsMenu(menu); 295792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 296792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 298792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent; 300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor cursor; 301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (item.getItemId()) { 302ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen case PARTY_SHUFFLE: 303ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.togglePartyShuffle(); 304ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen break; 305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SHUFFLE_ALL: 307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new String [] { MediaStore.Audio.Media._ID}, 309792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.IS_MUSIC + "=1", null, 310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.DEFAULT_SORT_ORDER); 311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != null) { 312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.shuffleAll(this, cursor); 313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project cursor.close(); 314792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onOptionsItemSelected(item); 318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) { 322792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project menu.add(0, PLAY_SELECTION, 0, R.string.play_selection); 323792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist); 324792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.makePlaylistMenu(this, sub); 325792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project menu.add(0, DELETE_ITEM, 0, R.string.delete_item); 326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ExpandableListContextMenuInfo mi = (ExpandableListContextMenuInfo) menuInfoIn; 328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int itemtype = ExpandableListView.getPackedPositionType(mi.packedPosition); 330792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int gpos = ExpandableListView.getPackedPositionGroup(mi.packedPosition); 331792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int cpos = ExpandableListView.getPackedPositionChild(mi.packedPosition); 332792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { 333792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (gpos == -1) { 334792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // this shouldn't happen 335792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Log.d("Artist/Album", "no group"); 336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project gpos = gpos - getExpandableListView().getHeaderViewsCount(); 339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistCursor.moveToPosition(gpos); 340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID)); 341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistName = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST)); 342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumId = null; 3439882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mIsUnknownArtist = mCurrentArtistName == null || 344f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen mCurrentArtistName.equals(MediaStore.UNKNOWN_STRING); 3459882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mIsUnknownAlbum = true; 3469882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (mIsUnknownArtist) { 347c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer menu.setHeaderTitle(getString(R.string.unknown_artist_name)); 348c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer } else { 349c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer menu.setHeaderTitle(mCurrentArtistName); 3509882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen menu.add(0, SEARCH, 0, R.string.search_title); 351c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer } 352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cpos == -1) { 355792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // this shouldn't happen 356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Log.d("Artist/Album", "no child"); 357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 359792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor c = (Cursor) getExpandableListAdapter().getChild(gpos, cpos); 360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project c.moveToPosition(cpos); 361792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId = null; 362792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumId = Long.valueOf(mi.id).toString(); 363792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM)); 364792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project gpos = gpos - getExpandableListView().getHeaderViewsCount(); 365792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistCursor.moveToPosition(gpos); 366792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistNameForAlbum = mArtistCursor.getString( 367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST)); 3689882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mIsUnknownArtist = mCurrentArtistNameForAlbum == null || 369f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen mCurrentArtistNameForAlbum.equals(MediaStore.UNKNOWN_STRING); 3709882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mIsUnknownAlbum = mCurrentAlbumName == null || 371f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen mCurrentAlbumName.equals(MediaStore.UNKNOWN_STRING); 3729882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (mIsUnknownAlbum) { 373c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer menu.setHeaderTitle(getString(R.string.unknown_album_name)); 374c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer } else { 375c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer menu.setHeaderTitle(mCurrentAlbumName); 376c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer } 3779882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (!mIsUnknownAlbum || !mIsUnknownArtist) { 3789882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen menu.add(0, SEARCH, 0, R.string.search_title); 3799882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 384792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 385792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (item.getItemId()) { 386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case PLAY_SELECTION: { 387792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // play everything by the selected artist 388bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = 389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId != null ? 390bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId)) 391bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.playAll(this, list, 0); 394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case QUEUE: { 398bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = 399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId != null ? 400bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId)) 401bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.addToCurrentPlaylist(this, list); 403792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case NEW_PLAYLIST: { 407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(); 408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, CreatePlaylist.class); 409792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivityForResult(intent, NEW_PLAYLIST); 410792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 411792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case PLAYLIST_SELECTED: { 414bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = 415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistId != null ? 416bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId)) 417bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 418bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long playlist = item.getIntent().getLongExtra("playlist", 0); 419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.addToPlaylist(this, list, playlist); 420792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case DELETE_ITEM: { 424bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list; 425792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String desc; 426792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mCurrentArtistId != null) { 427bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId)); 428ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer String f; 429ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer if (android.os.Environment.isExternalStorageRemovable()) { 430ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_artist_desc); 431ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } else { 432ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_artist_desc_nosdcard); 433ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } 434792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project desc = String.format(f, mCurrentArtistName); 435792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 436bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 437ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer String f; 438ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer if (android.os.Environment.isExternalStorageRemovable()) { 439ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_album_desc); 440ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } else { 441ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_album_desc_nosdcard); 442ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } 443ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer 444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project desc = String.format(f, mCurrentAlbumName); 445792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 446792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Bundle b = new Bundle(); 447792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project b.putString("description", desc); 448bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen b.putLongArray("items", list); 449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(); 450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, DeleteItems.class); 451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtras(b); 452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivityForResult(intent, -1); 453792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 454792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 455792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 456792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SEARCH: 457792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project doSearch(); 458792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 459792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 460792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onContextItemSelected(item); 461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 462792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 463792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project void doSearch() { 464792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project CharSequence title = null; 465792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String query = null; 466792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(); 468792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH); 4694341b5006cffbbd016688d4533f6de68d9d4c49bMarco Nelissen i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 471792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mCurrentArtistId != null) { 472792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = mCurrentArtistName; 473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project query = mCurrentArtistName; 474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistName); 475792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); 476792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 4779882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (mIsUnknownAlbum) { 4789882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen title = query = mCurrentArtistNameForAlbum; 4799882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } else { 4809882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen title = query = mCurrentAlbumName; 4819882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (!mIsUnknownArtist) { 4829882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen query = query + " " + mCurrentArtistNameForAlbum; 4839882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 4849882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 485792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum); 486792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName); 487792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE); 488792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = getString(R.string.mediasearch, title); 490792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(SearchManager.QUERY, query); 491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 492792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(Intent.createChooser(i, title)); 493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 495792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 496792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (requestCode) { 498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SCAN_DONE: 499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (resultCode == RESULT_CANCELED) { 500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getArtistCursor(mAdapter.getQueryHandler(), null); 503792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 505792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 506792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case NEW_PLAYLIST: 507792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (resultCode == RESULT_OK) { 508792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Uri uri = intent.getData(); 509792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (uri != null) { 510bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = null; 511792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mCurrentArtistId != null) { 512bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId)); 513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (mCurrentAlbumId != null) { 514bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 515792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 516bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment())); 517792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 518792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 519792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 520792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 521792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 522792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 523792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Cursor getArtistCursor(AsyncQueryHandler async, String filter) { 524792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 525792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String[] cols = new String[] { 526792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Artists._ID, 527792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Artists.ARTIST, 528792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Artists.NUMBER_OF_ALBUMS, 529792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Artists.NUMBER_OF_TRACKS 530792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 53189f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen 53289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen Uri uri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI; 53389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen if (!TextUtils.isEmpty(filter)) { 53489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build(); 53589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen } 53689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen 537792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor ret = null; 538792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (async != null) { 53989f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen async.startQuery(0, null, uri, 54089f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen cols, null , null, MediaStore.Audio.Artists.ARTIST_KEY); 541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 54289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen ret = MusicUtils.query(this, uri, 54389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen cols, null , null, MediaStore.Audio.Artists.ARTIST_KEY); 544792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return ret; 546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 547792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 548792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project static class ArtistAlbumListAdapter extends SimpleCursorTreeAdapter implements SectionIndexer { 549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Drawable mNowPlayingOverlay; 551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final BitmapDrawable mDefaultAlbumIcon; 552792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mGroupArtistIdIdx; 553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mGroupArtistIdx; 554792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mGroupAlbumIdx; 555792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mGroupSongIdx; 556792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Context mContext; 557792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Resources mResources; 558792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final String mAlbumSongSeparator; 559792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final String mUnknownAlbum; 560792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final String mUnknownArtist; 561792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final StringBuilder mBuffer = new StringBuilder(); 562792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Object[] mFormatArgs = new Object[1]; 563792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Object[] mFormatArgs3 = new Object[3]; 564792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private MusicAlphabetIndexer mIndexer; 565792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ArtistAlbumBrowserActivity mActivity; 566792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AsyncQueryHandler mQueryHandler; 567792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mConstraint = null; 568792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mConstraintIsValid = false; 569792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 570756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen static class ViewHolder { 571792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView line1; 572792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView line2; 573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView play_indicator; 574792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView icon; 575792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 577792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project class QueryHandler extends AsyncQueryHandler { 578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project QueryHandler(ContentResolver res) { 579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(res); 580792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 581792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project //Log.i("@@@", "query complete"); 585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity.init(cursor); 586792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 587792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 589792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ArtistAlbumListAdapter(Context context, ArtistAlbumBrowserActivity currentactivity, 590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor cursor, int glayout, String[] gfrom, int[] gto, 591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int clayout, String[] cfrom, int[] cto) { 592792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(context, cursor, glayout, gfrom, gto, clayout, cfrom, cto); 593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity = currentactivity; 594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueryHandler = new QueryHandler(context.getContentResolver()); 595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 596792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Resources r = context.getResources(); 597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list); 598792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDefaultAlbumIcon = (BitmapDrawable) r.getDrawable(R.drawable.albumart_mp_unknown_list); 599792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // no filter or dither, it's a lot faster and we can't tell the difference 600792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDefaultAlbumIcon.setFilterBitmap(false); 601792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDefaultAlbumIcon.setDither(false); 602792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mContext = context; 604792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getColumnIndices(cursor); 605792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mResources = context.getResources(); 606792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumSongSeparator = context.getString(R.string.albumsongseparator); 607792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mUnknownAlbum = context.getString(R.string.unknown_album_name); 608792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mUnknownArtist = context.getString(R.string.unknown_artist_name); 609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 611792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void getColumnIndices(Cursor cursor) { 612792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != null) { 613792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mGroupArtistIdIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID); 614792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mGroupArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST); 615792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mGroupAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS); 616792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mGroupSongIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS); 617792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mIndexer != null) { 618792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mIndexer.setCursor(cursor); 619792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 620792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mIndexer = new MusicAlphabetIndexer(cursor, mGroupArtistIdx, 6213d4b2625018856a506a203e046550afd2d9d8a92Marco Nelissen mResources.getString(R.string.fast_scroll_alphabet)); 622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 626792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void setActivity(ArtistAlbumBrowserActivity newactivity) { 627792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity = newactivity; 628792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 629792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 630792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public AsyncQueryHandler getQueryHandler() { 631792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mQueryHandler; 632792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 633792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 634792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 635792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) { 636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project View v = super.newGroupView(context, cursor, isExpanded, parent); 637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView iv = (ImageView) v.findViewById(R.id.icon); 638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewGroup.LayoutParams p = iv.getLayoutParams(); 639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project p.width = ViewGroup.LayoutParams.WRAP_CONTENT; 640792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project p.height = ViewGroup.LayoutParams.WRAP_CONTENT; 641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewHolder vh = new ViewHolder(); 642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line1 = (TextView) v.findViewById(R.id.line1); 643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line2 = (TextView) v.findViewById(R.id.line2); 644792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator); 645792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon = (ImageView) v.findViewById(R.id.icon); 646792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon.setPadding(0, 0, 1, 0); 647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setTag(vh); 648792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return v; 649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public View newChildView(Context context, Cursor cursor, boolean isLastChild, 653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewGroup parent) { 654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project View v = super.newChildView(context, cursor, isLastChild, parent); 655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewHolder vh = new ViewHolder(); 656792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line1 = (TextView) v.findViewById(R.id.line1); 657792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line2 = (TextView) v.findViewById(R.id.line2); 658792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator); 659792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon = (ImageView) v.findViewById(R.id.icon); 660792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon.setBackgroundDrawable(mDefaultAlbumIcon); 661792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon.setPadding(0, 0, 1, 0); 662792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setTag(vh); 663792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return v; 664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 665792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 666792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 667792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void bindGroupView(View view, Context context, Cursor cursor, boolean isexpanded) { 668792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 669792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewHolder vh = (ViewHolder) view.getTag(); 670792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 671792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String artist = cursor.getString(mGroupArtistIdx); 672792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String displayartist = artist; 673f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen boolean unknown = artist == null || artist.equals(MediaStore.UNKNOWN_STRING); 674792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (unknown) { 675792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayartist = mUnknownArtist; 676792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 677792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line1.setText(displayartist); 678792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 679792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int numalbums = cursor.getInt(mGroupAlbumIdx); 680792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int numsongs = cursor.getInt(mGroupSongIdx); 681792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 682792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String songs_albums = MusicUtils.makeAlbumsLabel(context, 683792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project numalbums, numsongs, unknown); 684792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 685792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line2.setText(songs_albums); 686792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 687bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long currentartistid = MusicUtils.getCurrentArtistId(); 688bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long artistid = cursor.getLong(mGroupArtistIdIdx); 689792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (currentartistid == artistid && !isexpanded) { 690792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.play_indicator.setImageDrawable(mNowPlayingOverlay); 691792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 692792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.play_indicator.setImageDrawable(null); 693792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 694792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 695792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 696792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 697792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void bindChildView(View view, Context context, Cursor cursor, boolean islast) { 698792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 699792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewHolder vh = (ViewHolder) view.getTag(); 700792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 701792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM)); 702792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String displayname = name; 703f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen boolean unknown = name == null || name.equals(MediaStore.UNKNOWN_STRING); 704792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (unknown) { 705792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = mUnknownAlbum; 706792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 707792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line1.setText(displayname); 708792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 709792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int numsongs = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS)); 710792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int numartistsongs = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST)); 711792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 712792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project final StringBuilder builder = mBuffer; 713792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project builder.delete(0, builder.length()); 714792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (unknown) { 715792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project numsongs = numartistsongs; 716792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 717792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 718792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (numsongs == 1) { 719792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project builder.append(context.getString(R.string.onesong)); 720792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 721792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (numsongs == numartistsongs) { 722792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project final Object[] args = mFormatArgs; 723792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project args[0] = numsongs; 724792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project builder.append(mResources.getQuantityString(R.plurals.Nsongs, numsongs, args)); 725792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 726792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project final Object[] args = mFormatArgs3; 727792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project args[0] = numsongs; 728792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project args[1] = numartistsongs; 729792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project args[2] = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST)); 730792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project builder.append(mResources.getQuantityString(R.plurals.Nsongscomp, numsongs, args)); 731792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 732792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 733792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line2.setText(builder.toString()); 734792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 735792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView iv = vh.icon; 736792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // We don't actually need the path to the thumbnail file, 737792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // we just use it to see if there is album art or not 738792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String art = cursor.getString(cursor.getColumnIndexOrThrow( 739792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.ALBUM_ART)); 740792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (unknown || art == null || art.length() == 0) { 741792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setBackgroundDrawable(mDefaultAlbumIcon); 742792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(null); 743792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 744bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long artIndex = cursor.getLong(0); 745792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Drawable d = MusicUtils.getCachedArtwork(context, artIndex, mDefaultAlbumIcon); 746792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(d); 747792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 748792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 749bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long currentalbumid = MusicUtils.getCurrentAlbumId(); 750bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long aid = cursor.getLong(0); 751792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv = vh.play_indicator; 752792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (currentalbumid == aid) { 753792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(mNowPlayingOverlay); 754792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 755792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(null); 756792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 757792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 758792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 759792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 760792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 761792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected Cursor getChildrenCursor(Cursor groupCursor) { 762792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 763bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long id = groupCursor.getLong(groupCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID)); 764792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 765792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String[] cols = new String[] { 766792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums._ID, 767792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.ALBUM, 768792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.NUMBER_OF_SONGS, 769792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST, 770792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.ALBUM_ART 771792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 772792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor c = MusicUtils.query(mActivity, 773792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Artists.Albums.getContentUri("external", id), 774792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER); 775792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 776792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project class MyCursorWrapper extends CursorWrapper { 777792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String mArtistName; 778792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int mMagicColumnIdx; 779792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MyCursorWrapper(Cursor c, String artist) { 780792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(c); 781792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistName = artist; 782f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (mArtistName == null || mArtistName.equals(MediaStore.UNKNOWN_STRING)) { 783792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistName = mUnknownArtist; 784792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 785792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mMagicColumnIdx = c.getColumnCount(); 786792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 787792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 788792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 789792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public String getString(int columnIndex) { 790792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (columnIndex != mMagicColumnIdx) { 791792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.getString(columnIndex); 792792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 793792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mArtistName; 794792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 795792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 796792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 797792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public int getColumnIndexOrThrow(String name) { 7986a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project if (MediaStore.Audio.Albums.ARTIST.equals(name)) { 799792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mMagicColumnIdx; 800792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 801792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.getColumnIndexOrThrow(name); 802792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 803792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 804792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 805792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public String getColumnName(int idx) { 806792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (idx != mMagicColumnIdx) { 807792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.getColumnName(idx); 808792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 809792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return MediaStore.Audio.Albums.ARTIST; 810792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 811792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 812792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 813792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public int getColumnCount() { 814792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.getColumnCount() + 1; 815792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 816792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 817792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return new MyCursorWrapper(c, groupCursor.getString(mGroupArtistIdx)); 818792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 819792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 820792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 821792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void changeCursor(Cursor cursor) { 822d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen if (mActivity.isFinishing() && cursor != null) { 823d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen cursor.close(); 824d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen cursor = null; 8250e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen } 826792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != mActivity.mArtistCursor) { 827792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity.mArtistCursor = cursor; 828792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getColumnIndices(cursor); 829792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.changeCursor(cursor); 830792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 831792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 832792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 833792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 834792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 835792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String s = constraint.toString(); 836792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mConstraintIsValid && ( 837792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project (s == null && mConstraint == null) || 838792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project (s != null && s.equals(mConstraint)))) { 839792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return getCursor(); 840792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 841792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor c = mActivity.getArtistCursor(null, s); 842792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mConstraint = s; 843792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mConstraintIsValid = true; 844792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return c; 845792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 846792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 847792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Object[] getSections() { 848792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mIndexer.getSections(); 849792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 850792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 851792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public int getPositionForSection(int sectionIndex) { 852792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mIndexer.getPositionForSection(sectionIndex); 853792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 854792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 855792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public int getSectionForPosition(int position) { 856792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return 0; 857792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 858792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 859792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 860792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Cursor mArtistCursor; 861ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 862ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen public void onServiceConnected(ComponentName name, IBinder service) { 863ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.updateNowPlaying(this); 864ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen } 865ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 866ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen public void onServiceDisconnected(ComponentName name) { 867ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen finish(); 868ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen } 869792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project} 870792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 871