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; 20f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen 21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.ListActivity; 22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.SearchManager; 23792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.AsyncQueryHandler; 24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver; 25ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ComponentName; 26792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ContentResolver; 27792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context; 28792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent; 29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.IntentFilter; 30ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ServiceConnection; 31792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.res.Resources; 32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.Cursor; 33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.Bitmap; 34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.BitmapFactory; 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; 43792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore; 4489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissenimport android.text.TextUtils; 459882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissenimport android.util.Log; 46792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu; 47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Menu; 48792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem; 49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.SubMenu; 50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.View; 51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewGroup; 52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Window; 53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.Adapter; 55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.AlphabetIndexer; 56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.CursorAdapter; 57ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.widget.ExpandableListView; 58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView; 59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ListAdapter; 60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ListView; 61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SectionIndexer; 62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SimpleCursorAdapter; 63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView; 64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.AdapterView.AdapterContextMenuInfo; 65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport java.text.Collator; 67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class AlbumBrowserActivity extends ListActivity 69ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen implements View.OnCreateContextMenuListener, MusicUtils.Defs, ServiceConnection 70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project{ 71792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentAlbumId; 72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentAlbumName; 73792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mCurrentArtistNameForAlbum; 749882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen boolean mIsUnknownArtist; 759882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen boolean mIsUnknownAlbum; 76792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AlbumListAdapter mAdapter; 77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mAdapterSent; 78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int SEARCH = CHILD_MENU_BASE; 79ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen private static int mLastListPosCourse = -1; 80ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen private static int mLastListPosFine = -1; 81f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen private ServiceToken mToken; 82792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public AlbumBrowserActivity() 84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project /** Called when the activity is first created. */ 88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 89792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onCreate(Bundle icicle) 90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (icicle != null) { 92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumId = icicle.getString("selectedalbum"); 93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistId = icicle.getString("artist"); 94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistId = getIntent().getStringExtra("artist"); 96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 97792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreate(icicle); 98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 99ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen requestWindowFeature(Window.FEATURE_NO_TITLE); 100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setVolumeControlStream(AudioManager.STREAM_MUSIC); 101f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen mToken = MusicUtils.bindToService(this, this); 102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project IntentFilter f = new IntentFilter(); 104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); 105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); 106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 107792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addDataScheme("file"); 108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project registerReceiver(mScanListener, f); 109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setContentView(R.layout.media_picker_activity); 111ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.updateButtonBar(this, R.id.albumtab); 112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ListView lv = getListView(); 113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lv.setOnCreateContextMenuListener(this); 114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lv.setTextFilterEnabled(true); 115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter = (AlbumListAdapter) getLastNonConfigurationInstance(); 117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mAdapter == null) { 118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project //Log.i("@@@", "starting query"); 119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter = new AlbumListAdapter( 120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getApplication(), 121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project this, 122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project R.layout.track_list_item, 123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumCursor, 124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new String[] {}, 125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new int[] {}); 126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(mAdapter); 127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(R.string.working_albums); 128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getAlbumCursor(mAdapter.getQueryHandler(), null); 129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter.setActivity(this); 131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(mAdapter); 132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumCursor = mAdapter.getCursor(); 133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mAlbumCursor != null) { 134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project init(mAlbumCursor); 135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getAlbumCursor(mAdapter.getQueryHandler(), null); 137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Object onRetainNonConfigurationInstance() { 143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapterSent = true; 144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mAdapter; 145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onSaveInstanceState(Bundle outcicle) { 149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // need to store the selected item so we don't lose it in case 150792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // of an orientation switch. Otherwise we could lose it while 151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // in the middle of specifying a playlist to add the item to. 152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project outcicle.putString("selectedalbum", mCurrentAlbumId); 153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project outcicle.putString("artist", mArtistId); 154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onSaveInstanceState(outcicle); 155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 157792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 158792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onDestroy() { 159ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen ListView lv = getListView(); 1609e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen if (lv != null) { 1619e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen mLastListPosCourse = lv.getFirstVisiblePosition(); 16223b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen View cv = lv.getChildAt(0); 16323b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen if (cv != null) { 16423b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen mLastListPosFine = cv.getTop(); 16523b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen } 1669e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen } 167f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen MusicUtils.unbindFromService(mToken); 1680e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // If we have an adapter and didn't send it off to another activity yet, we should 1690e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // close its cursor, which we do by assigning a null cursor to it. Doing this 1700e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // instead of closing the cursor directly keeps the framework from accessing 1710e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // the closed cursor later. 1728e732ffd92d538aaa9376b560b0ff2fc5ac78c43Marco Nelissen if (!mAdapterSent && mAdapter != null) { 1730e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen mAdapter.changeCursor(null); 174792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1750164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // Because we pass the adapter to the next activity, we need to make 1760164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // sure it doesn't keep a reference to this activity. We can do this 1770164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // by clearing its DatasetObservers, which setListAdapter(null) does. 1780164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen setListAdapter(null); 1790164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen mAdapter = null; 180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project unregisterReceiver(mScanListener); 181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onDestroy(); 182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 183792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onResume() { 186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onResume(); 187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project IntentFilter f = new IntentFilter(); 188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(MediaPlaybackService.META_CHANGED); 189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(MediaPlaybackService.QUEUE_CHANGED); 190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project registerReceiver(mTrackListListener, f); 191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackListListener.onReceive(null, null); 192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setSpinnerState(this); 194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private BroadcastReceiver mTrackListListener = new BroadcastReceiver() { 197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getListView().invalidateViews(); 200ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.updateNowPlaying(AlbumBrowserActivity.this); 201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 203792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private BroadcastReceiver mScanListener = new BroadcastReceiver() { 204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setSpinnerState(AlbumBrowserActivity.this); 207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.sendEmptyMessage(0); 208792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) { 209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.clearAlbumArtCache(); 210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Handler mReScanHandler = new Handler() { 215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) { 21742bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen if (mAdapter != null) { 21842bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen getAlbumCursor(mAdapter.getQueryHandler(), null); 21942bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen } 220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 221792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 222792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onPause() { 225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project unregisterReceiver(mTrackListListener); 226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.removeCallbacksAndMessages(null); 227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onPause(); 228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void init(Cursor c) { 231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 23242bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen if (mAdapter == null) { 23342bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen return; 23442bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen } 235792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter.changeCursor(c); // also sets mAlbumCursor 236792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 237792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mAlbumCursor == null) { 238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.displayDatabaseError(this); 239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project closeContextMenu(); 240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.sendEmptyMessageDelayed(0, 1000); 241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 243ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 244ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen // restore previous position 245ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen if (mLastListPosCourse >= 0) { 246ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen getListView().setSelectionFromTop(mLastListPosCourse, mLastListPosFine); 247ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen mLastListPosCourse = -1; 248ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen } 249ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 250792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.hideDatabaseError(this); 2519e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen MusicUtils.updateButtonBar(this, R.id.albumtab); 252792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(); 253792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 255792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void setTitle() { 256792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project CharSequence fancyName = ""; 257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mAlbumCursor != null && mAlbumCursor.getCount() > 0) { 258792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumCursor.moveToFirst(); 2599165ac8d0d4f9c90d9b190b837a90fec3a0c0c0dMarco Nelissen fancyName = mAlbumCursor.getString( 2609165ac8d0d4f9c90d9b190b837a90fec3a0c0c0dMarco Nelissen mAlbumCursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST)); 261f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (fancyName == null || fancyName.equals(MediaStore.UNKNOWN_STRING)) 262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project fancyName = getText(R.string.unknown_artist_name); 263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mArtistId != null && fancyName != null) 266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(fancyName); 267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else 268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setTitle(R.string.albums_title); 269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 2709882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen 271792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) { 273792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project menu.add(0, PLAY_SELECTION, 0, R.string.play_selection); 274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist); 275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.makePlaylistMenu(this, sub); 276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project menu.add(0, DELETE_ITEM, 0, R.string.delete_item); 277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn; 279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumCursor.moveToPosition(mi.position); 280792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumId = mAlbumCursor.getString(mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID)); 281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentAlbumName = mAlbumCursor.getString(mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM)); 282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentArtistNameForAlbum = mAlbumCursor.getString( 283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST)); 2849882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mIsUnknownArtist = mCurrentArtistNameForAlbum == null || 285f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen mCurrentArtistNameForAlbum.equals(MediaStore.UNKNOWN_STRING); 2869882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mIsUnknownAlbum = mCurrentAlbumName == null || 287f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen mCurrentAlbumName.equals(MediaStore.UNKNOWN_STRING); 2889882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (mIsUnknownAlbum) { 289c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer menu.setHeaderTitle(getString(R.string.unknown_album_name)); 290c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer } else { 291c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer menu.setHeaderTitle(mCurrentAlbumName); 292c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer } 2939882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (!mIsUnknownAlbum || !mIsUnknownArtist) { 2949882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen menu.add(0, SEARCH, 0, R.string.search_title); 2959882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 296792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 298792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (item.getItemId()) { 301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case PLAY_SELECTION: { 302792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // play the selected album 303bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 304792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.playAll(this, list, 0); 305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case QUEUE: { 309bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.addToCurrentPlaylist(this, list); 311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 314792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case NEW_PLAYLIST: { 315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(); 316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, CreatePlaylist.class); 317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivityForResult(intent, NEW_PLAYLIST); 318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case PLAYLIST_SELECTED: { 322bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 323bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long playlist = item.getIntent().getLongExtra("playlist", 0); 324792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.addToPlaylist(this, list, playlist); 325792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case DELETE_ITEM: { 328bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 329ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer String f; 330ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer if (android.os.Environment.isExternalStorageRemovable()) { 331ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_album_desc); 332ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } else { 333ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_album_desc_nosdcard); 334ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } 335792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String desc = String.format(f, mCurrentAlbumName); 336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Bundle b = new Bundle(); 337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project b.putString("description", desc); 338bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen b.putLongArray("items", list); 339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(); 340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, DeleteItems.class); 341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtras(b); 342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivityForResult(intent, -1); 343792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 344792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 345792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SEARCH: 346792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project doSearch(); 347792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 350792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onContextItemSelected(item); 351792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project void doSearch() { 354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project CharSequence title = null; 3559882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen String query = ""; 356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(); 358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH); 3594341b5006cffbbd016688d4533f6de68d9d4c49bMarco Nelissen i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 3619882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen title = ""; 3629882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (!mIsUnknownAlbum) { 3639882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen query = mCurrentAlbumName; 3649882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName); 3659882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen title = mCurrentAlbumName; 3669882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 3679882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if(!mIsUnknownArtist) { 3689882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen query = query + " " + mCurrentArtistNameForAlbum; 3699882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum); 3709882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen title = title + " " + mCurrentArtistNameForAlbum; 3719882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 3729882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen // Since we hide the 'search' menu item when both album and artist are 3739882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen // unknown, the query and title strings will have at least one of those. 374792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE); 375792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = getString(R.string.mediasearch, title); 376792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(SearchManager.QUERY, query); 377792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 378792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(Intent.createChooser(i, title)); 379792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (requestCode) { 384792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SCAN_DONE: 385792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (resultCode == RESULT_CANCELED) { 386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 387792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 388792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getAlbumCursor(mAdapter.getQueryHandler(), null); 389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 390792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 391792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case NEW_PLAYLIST: 393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (resultCode == RESULT_OK) { 394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Uri uri = intent.getData(); 395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (uri != null) { 396bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId)); 397bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment())); 398792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 400792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 401792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 403792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onListItemClick(ListView l, View v, int position, long id) 406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_PICK); 408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track"); 409792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtra("album", Long.valueOf(id).toString()); 410792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtra("artist", mArtistId); 411792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(intent); 412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 414792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 416792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreateOptionsMenu(menu); 417ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen menu.add(0, PARTY_SHUFFLE, 0, R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu() 418792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle); 419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 420792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onPrepareOptionsMenu(Menu menu) { 424ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.setPartyShuffleMenuIcon(menu); 425792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onPrepareOptionsMenu(menu); 426792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 427792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 428792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 429792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 430792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent; 431792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor cursor; 432792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (item.getItemId()) { 433ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen case PARTY_SHUFFLE: 434ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.togglePartyShuffle(); 435ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen break; 436792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 437792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SHUFFLE_ALL: 438792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 439792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new String [] { MediaStore.Audio.Media._ID}, 440792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.IS_MUSIC + "=1", null, 441792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.DEFAULT_SORT_ORDER); 442792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != null) { 443792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.shuffleAll(this, cursor); 444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project cursor.close(); 445792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 446792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 447792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 448792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onOptionsItemSelected(item); 449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Cursor getAlbumCursor(AsyncQueryHandler async, String filter) { 452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String[] cols = new String[] { 453792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums._ID, 454792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.ARTIST, 455756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen MediaStore.Audio.Albums.ALBUM, 456792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Albums.ALBUM_ART 457792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 45889f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen 45989f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen 460792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor ret = null; 461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mArtistId != null) { 46289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen Uri uri = MediaStore.Audio.Artists.Albums.getContentUri("external", 46389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen Long.valueOf(mArtistId)); 46489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen if (!TextUtils.isEmpty(filter)) { 46589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build(); 46689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen } 467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (async != null) { 46889f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen async.startQuery(0, null, uri, 46989f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER); 470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 47189f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen ret = MusicUtils.query(this, uri, 47289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER); 473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 47589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI; 47689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen if (!TextUtils.isEmpty(filter)) { 47789f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build(); 47889f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen } 479792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (async != null) { 480792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project async.startQuery(0, null, 48189f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen uri, 48289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER); 483792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 48489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen ret = MusicUtils.query(this, uri, 48589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER); 486792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 487792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 488792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return ret; 489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 490792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project static class AlbumListAdapter extends SimpleCursorAdapter implements SectionIndexer { 492792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Drawable mNowPlayingOverlay; 494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final BitmapDrawable mDefaultAlbumIcon; 495792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mAlbumIdx; 496792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mArtistIdx; 497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mAlbumArtIndex; 498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Resources mResources; 499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final StringBuilder mStringBuilder = new StringBuilder(); 500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final String mUnknownAlbum; 501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final String mUnknownArtist; 502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final String mAlbumSongSeparator; 503792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Object[] mFormatArgs = new Object[1]; 504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AlphabetIndexer mIndexer; 505792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AlbumBrowserActivity mActivity; 506792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AsyncQueryHandler mQueryHandler; 507792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mConstraint = null; 508792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mConstraintIsValid = false; 509792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 510756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen static class ViewHolder { 511792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView line1; 512792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView line2; 513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView play_indicator; 514792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView icon; 515792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 516792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 517792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project class QueryHandler extends AsyncQueryHandler { 518792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project QueryHandler(ContentResolver res) { 519792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(res); 520792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 521792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 522792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 523792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 524792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project //Log.i("@@@", "query complete"); 525792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity.init(cursor); 526792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 527792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 528792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 529792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project AlbumListAdapter(Context context, AlbumBrowserActivity currentactivity, 530792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int layout, Cursor cursor, String[] from, int[] to) { 531792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(context, layout, cursor, from, to); 532792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 533792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity = currentactivity; 534792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueryHandler = new QueryHandler(context.getContentResolver()); 535792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 536792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mUnknownAlbum = context.getString(R.string.unknown_album_name); 537792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mUnknownArtist = context.getString(R.string.unknown_artist_name); 538792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumSongSeparator = context.getString(R.string.albumsongseparator); 539792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 540792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Resources r = context.getResources(); 541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list); 542792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 543792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Bitmap b = BitmapFactory.decodeResource(r, R.drawable.albumart_mp_unknown_list); 5445df7af3460fe05fb8ceea426b90286b7bafd9827Marco Nelissen mDefaultAlbumIcon = new BitmapDrawable(context.getResources(), b); 545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // no filter or dither, it's a lot faster and we can't tell the difference 546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDefaultAlbumIcon.setFilterBitmap(false); 547792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDefaultAlbumIcon.setDither(false); 548792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getColumnIndices(cursor); 549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mResources = context.getResources(); 550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 552792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void getColumnIndices(Cursor cursor) { 553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != null) { 554792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM); 555792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST); 556792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumArtIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART); 557792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 558792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mIndexer != null) { 559792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mIndexer.setCursor(cursor); 560792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 561792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mIndexer = new MusicAlphabetIndexer(cursor, mAlbumIdx, mResources.getString( 5623d4b2625018856a506a203e046550afd2d9d8a92Marco Nelissen R.string.fast_scroll_alphabet)); 563792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 564792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 565792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 566792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 567792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void setActivity(AlbumBrowserActivity newactivity) { 568792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity = newactivity; 569792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 570792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 571792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public AsyncQueryHandler getQueryHandler() { 572792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mQueryHandler; 573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 574792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 575792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public View newView(Context context, Cursor cursor, ViewGroup parent) { 577792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project View v = super.newView(context, cursor, parent); 578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewHolder vh = new ViewHolder(); 579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line1 = (TextView) v.findViewById(R.id.line1); 580792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line2 = (TextView) v.findViewById(R.id.line2); 581792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator); 582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon = (ImageView) v.findViewById(R.id.icon); 583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon.setBackgroundDrawable(mDefaultAlbumIcon); 584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.icon.setPadding(0, 0, 1, 0); 585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setTag(vh); 586792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return v; 587792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 589792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void bindView(View view, Context context, Cursor cursor) { 591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 592792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewHolder vh = (ViewHolder) view.getTag(); 593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String name = cursor.getString(mAlbumIdx); 595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String displayname = name; 596f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen boolean unknown = name == null || name.equals(MediaStore.UNKNOWN_STRING); 597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (unknown) { 598792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = mUnknownAlbum; 599792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 600792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line1.setText(displayname); 601792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 602792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project name = cursor.getString(mArtistIdx); 603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = name; 604f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) { 605792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = mUnknownArtist; 606792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 607792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vh.line2.setText(displayname); 608792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView iv = vh.icon; 610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // We don't actually need the path to the thumbnail file, 611792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // we just use it to see if there is album art or not 612792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String art = cursor.getString(mAlbumArtIndex); 613bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long aid = cursor.getLong(0); 614792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (unknown || art == null || art.length() == 0) { 615792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(null); 616792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 617bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen Drawable d = MusicUtils.getCachedArtwork(context, aid, mDefaultAlbumIcon); 618792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(d); 619792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 620792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 621bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long currentalbumid = MusicUtils.getCurrentAlbumId(); 622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv = vh.play_indicator; 623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (currentalbumid == aid) { 624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(mNowPlayingOverlay); 625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 626792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageDrawable(null); 627792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 628792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 629792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 630792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 631792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void changeCursor(Cursor cursor) { 632d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen if (mActivity.isFinishing() && cursor != null) { 633d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen cursor.close(); 634d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen cursor = null; 6350e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen } 636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != mActivity.mAlbumCursor) { 637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity.mAlbumCursor = cursor; 638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getColumnIndices(cursor); 639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.changeCursor(cursor); 640792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 644792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 645792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String s = constraint.toString(); 646792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mConstraintIsValid && ( 647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project (s == null && mConstraint == null) || 648792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project (s != null && s.equals(mConstraint)))) { 649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return getCursor(); 650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor c = mActivity.getAlbumCursor(null, s); 652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mConstraint = s; 653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mConstraintIsValid = true; 654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return c; 655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 656792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 657792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Object[] getSections() { 658792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mIndexer.getSections(); 659792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 660792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 661792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public int getPositionForSection(int section) { 662792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mIndexer.getPositionForSection(section); 663792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 665792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public int getSectionForPosition(int position) { 666792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return 0; 667792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 668792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 669792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 670792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Cursor mAlbumCursor; 671792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mArtistId; 672ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 673ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen public void onServiceConnected(ComponentName name, IBinder service) { 674ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.updateNowPlaying(this); 675ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen } 676ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen 677ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen public void onServiceDisconnected(ComponentName name) { 678ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen finish(); 679ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen } 680792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project} 681792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 682