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; 253fdd97fb21031de30e604d470fc8458b814e6587Marco 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; 303fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissenimport android.content.ServiceConnection; 31792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.Cursor; 33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.DatabaseUtils; 34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager; 35792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.net.Uri; 36792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Bundle; 37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler; 383fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissenimport android.os.IBinder; 39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message; 401968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissenimport android.provider.BaseColumns; 41792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore; 42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.text.TextUtils; 43792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.util.Log; 44792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.KeyEvent; 45792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem; 46792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.View; 47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewGroup; 48792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Window; 49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewGroup.OnHierarchyChangeListener; 50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView; 51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ListView; 52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SimpleCursorAdapter; 53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView; 54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport java.util.ArrayList; 56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 573fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissenpublic class QueryBrowserActivity extends ListActivity 583fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissenimplements MusicUtils.Defs, ServiceConnection 59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project{ 60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int PLAY_NOW = 0; 61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int ADD_TO_QUEUE = 1; 62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int PLAY_NEXT = 2; 63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int PLAY_ARTIST = 3; 64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int EXPLORE_ARTIST = 4; 65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int PLAY_ALBUM = 5; 66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int EXPLORE_ALBUM = 6; 67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final static int REQUERY = 3; 68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private QueryListAdapter mAdapter; 69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mAdapterSent; 70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mFilterString = ""; 71f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen private ServiceToken mToken; 72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 73792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public QueryBrowserActivity() 74792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 75792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 76792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project /** Called when the activity is first created. */ 78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 79792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onCreate(Bundle icicle) 80792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 81792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreate(icicle); 82792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setVolumeControlStream(AudioManager.STREAM_MUSIC); 833fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen mAdapter = (QueryListAdapter) getLastNonConfigurationInstance(); 84f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen mToken = MusicUtils.bindToService(this, this); 853fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen // defer the real work until we're bound to the service 863fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen } 873fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen 883fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen 893fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen public void onServiceConnected(ComponentName name, IBinder service) { 90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project IntentFilter f = new IntentFilter(); 91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); 92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addDataScheme("file"); 94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project registerReceiver(mScanListener, f); 95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 963fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen Intent intent = getIntent(); 979882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen String action = intent != null ? intent.getAction() : null; 983fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen 999882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (Intent.ACTION_VIEW.equals(action)) { 1003fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen // this is something we got from the search bar 1013fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen Uri uri = intent.getData(); 1023fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen String path = uri.toString(); 1033fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen if (path.startsWith("content://media/external/audio/media/")) { 1043fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen // This is a specific file 1053fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen String id = uri.getLastPathSegment(); 106bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = new long[] { Long.valueOf(id) }; 1073fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen MusicUtils.playAll(this, list, 0); 1083fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen finish(); 1093fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen return; 1103fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen } else if (path.startsWith("content://media/external/audio/albums/")) { 1113fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen // This is an album, show the songs on it 1123fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen Intent i = new Intent(Intent.ACTION_PICK); 1133fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen i.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track"); 1143fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen i.putExtra("album", uri.getLastPathSegment()); 1153fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen startActivity(i); 1163fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen finish(); 1173fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen return; 1183fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen } else if (path.startsWith("content://media/external/audio/artists/")) { 1193fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen // This is an artist, show the albums for that artist 1203fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen Intent i = new Intent(Intent.ACTION_PICK); 1213fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen i.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album"); 1223fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen i.putExtra("artist", uri.getLastPathSegment()); 1233fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen startActivity(i); 1243fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen finish(); 1253fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen return; 126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1289882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen 1293fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen mFilterString = intent.getStringExtra(SearchManager.QUERY); 1309882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)) { 1319882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen String focus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); 1329882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); 1339882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); 1349882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); 1359882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (focus != null) { 1369882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (focus.startsWith("audio/") && title != null) { 1379882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mFilterString = title; 1389882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } else if (focus.equals(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE)) { 1399882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (album != null) { 1409882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mFilterString = album; 1419882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (artist != null) { 1429882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mFilterString = mFilterString + " " + artist; 1439882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 1449882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 1459882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } else if (focus.equals(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)) { 1469882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen if (artist != null) { 1479882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen mFilterString = artist; 1489882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 1499882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 1509882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 1519882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen } 152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setContentView(R.layout.query_activity); 154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackList = getListView(); 155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackList.setTextFilterEnabled(true); 156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mAdapter == null) { 157792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter = new QueryListAdapter( 158792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getApplication(), 159792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project this, 160792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project R.layout.track_list_item, 161792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project null, // cursor 162792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new String[] {}, 163792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new int[] {}); 164792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(mAdapter); 165792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (TextUtils.isEmpty(mFilterString)) { 166792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getQueryCursor(mAdapter.getQueryHandler(), null); 167792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 168792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackList.setFilterText(mFilterString); 169792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mFilterString = null; 170792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 171792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 172792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter.setActivity(this); 173792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(mAdapter); 174792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueryCursor = mAdapter.getCursor(); 175792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mQueryCursor != null) { 176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project init(mQueryCursor); 177792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 178792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getQueryCursor(mAdapter.getQueryHandler(), mFilterString); 179792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1823fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen 1833fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen public void onServiceDisconnected(ComponentName name) { 1843fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen 1853fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen } 1863fdd97fb21031de30e604d470fc8458b814e6587Marco Nelissen 187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Object onRetainNonConfigurationInstance() { 189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapterSent = true; 190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mAdapter; 191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onPause() { 195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.removeCallbacksAndMessages(null); 196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onPause(); 197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onDestroy() { 201f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen MusicUtils.unbindFromService(mToken); 202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project unregisterReceiver(mScanListener); 2030e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // If we have an adapter and didn't send it off to another activity yet, we should 2040e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // close its cursor, which we do by assigning a null cursor to it. Doing this 2050e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // instead of closing the cursor directly keeps the framework from accessing 2060e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen // the closed cursor later. 207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mAdapterSent && mAdapter != null) { 2080e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen mAdapter.changeCursor(null); 209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 2100164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // Because we pass the adapter to the next activity, we need to make 2110164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // sure it doesn't keep a reference to this activity. We can do this 2120164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen // by clearing its DatasetObservers, which setListAdapter(null) does. 2130164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen setListAdapter(null); 2140164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen mAdapter = null; 2150e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen super.onDestroy(); 216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project /* 219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * This listener gets called when the media scanner starts up, and when the 220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * sd card is unmounted. 221792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */ 222792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private BroadcastReceiver mScanListener = new BroadcastReceiver() { 223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setSpinnerState(QueryBrowserActivity.this); 226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.sendEmptyMessage(0); 227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Handler mReScanHandler = new Handler() { 231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) { 23342bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen if (mAdapter != null) { 23442bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen getQueryCursor(mAdapter.getQueryHandler(), null); 23542bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen } 236792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // if the query results in a null cursor, onQueryComplete() will 237792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // call init(), which will post a delayed message to this handler 238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // in order to try again. 239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (requestCode) { 245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case SCAN_DONE: 246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (resultCode == RESULT_CANCELED) { 247792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 248792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 249792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project getQueryCursor(mAdapter.getQueryHandler(), null); 250792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 251792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 252792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 253792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 255792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void init(Cursor c) { 25642bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen 25742bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen if (mAdapter == null) { 25842bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen return; 25942bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen } 260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAdapter.changeCursor(c); 261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mQueryCursor == null) { 263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.displayDatabaseError(this); 264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setListAdapter(null); 265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mReScanHandler.sendEmptyMessageDelayed(0, 1000); 266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.hideDatabaseError(this); 269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 271792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onListItemClick(ListView l, View v, int position, long id) 273792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Dialog doesn't allow us to wait for a result, so we need to store 275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // the info we need for when the dialog posts its result 276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueryCursor.moveToPosition(position); 277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mQueryCursor.isBeforeFirst() || mQueryCursor.isAfterLast()) { 278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 280792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String selectedType = mQueryCursor.getString(mQueryCursor.getColumnIndexOrThrow( 281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.MIME_TYPE)); 282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if ("artist".equals(selectedType)) { 284792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_PICK); 2859882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 286792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album"); 287792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtra("artist", Long.valueOf(id).toString()); 288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(intent); 289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if ("album".equals(selectedType)) { 290792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_PICK); 2919882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track"); 293792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtra("album", Long.valueOf(id).toString()); 294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(intent); 295792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (position >= 0 && id >= 0){ 296bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = new long[] { id }; 297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.playAll(this, list, 0); 298792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Log.e("QueryBrowser", "invalid position/id: " + position + "/" + id); 300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 302792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 303792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 304792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (item.getItemId()) { 306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case USE_AS_RINGTONE: { 307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Set the system setting to make this the current ringtone 308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setRingtone(this, mTrackList.getSelectedItemId()); 309792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onOptionsItemSelected(item); 314792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Cursor getQueryCursor(AsyncQueryHandler async, String filter) { 317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (filter == null) { 318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project filter = ""; 319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String[] ccols = new String[] { 3211968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen BaseColumns._ID, // this will be the artist, album or track ID 322792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.MIME_TYPE, // mimetype of audio file, or "artist" or "album" 3231968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Artists.ARTIST, 3241968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Albums.ALBUM, 3251968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Media.TITLE, 326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project "data1", 327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project "data2" 328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 3301968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen Uri search = Uri.parse("content://media/external/audio/search/fancy/" + 3311968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen Uri.encode(filter)); 332792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 333792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor ret = null; 334792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (async != null) { 335792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project async.startQuery(0, null, search, ccols, null, null, null); 336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ret = MusicUtils.query(this, search, ccols, null, null, null); 338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return ret; 340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project static class QueryListAdapter extends SimpleCursorAdapter { 343792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private QueryBrowserActivity mActivity = null; 344792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AsyncQueryHandler mQueryHandler; 345792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private String mConstraint = null; 346792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mConstraintIsValid = false; 347792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project class QueryHandler extends AsyncQueryHandler { 349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project QueryHandler(ContentResolver res) { 350792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(res); 351792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 355792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity.init(cursor); 356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 359792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project QueryListAdapter(Context context, QueryBrowserActivity currentactivity, 360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int layout, Cursor cursor, String[] from, int[] to) { 361792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(context, layout, cursor, from, to); 362792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity = currentactivity; 363792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueryHandler = new QueryHandler(context.getContentResolver()); 364792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 365792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 366792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void setActivity(QueryBrowserActivity newactivity) { 367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity = newactivity; 368792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 369792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 370792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public AsyncQueryHandler getQueryHandler() { 371792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mQueryHandler; 372792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 373792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 374792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 375792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void bindView(View view, Context context, Cursor cursor) { 376792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 377792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView tv1 = (TextView) view.findViewById(R.id.line1); 378792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView tv2 = (TextView) view.findViewById(R.id.line2); 379792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ImageView iv = (ImageView) view.findViewById(R.id.icon); 380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ViewGroup.LayoutParams p = iv.getLayoutParams(); 381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (p == null) { 382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // seen this happen, not sure why 383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project DatabaseUtils.dumpCursor(cursor); 384792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 385792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project p.width = ViewGroup.LayoutParams.WRAP_CONTENT; 387792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project p.height = ViewGroup.LayoutParams.WRAP_CONTENT; 388792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String mimetype = cursor.getString(cursor.getColumnIndexOrThrow( 390792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MediaStore.Audio.Media.MIME_TYPE)); 391792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mimetype == null) { 393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mimetype = "audio/"; 394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mimetype.equals("artist")) { 396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageResource(R.drawable.ic_mp_artist_list); 397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String name = cursor.getString(cursor.getColumnIndexOrThrow( 3981968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Artists.ARTIST)); 399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String displayname = name; 4006a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project boolean isunknown = false; 401f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) { 402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = context.getString(R.string.unknown_artist_name); 4036a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project isunknown = true; 404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv1.setText(displayname); 406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int numalbums = cursor.getInt(cursor.getColumnIndexOrThrow("data1")); 408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int numsongs = cursor.getInt(cursor.getColumnIndexOrThrow("data2")); 409792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 410792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String songs_albums = MusicUtils.makeAlbumsSongsLabel(context, 4116a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project numalbums, numsongs, isunknown); 412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv2.setText(songs_albums); 414792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (mimetype.equals("album")) { 416792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageResource(R.drawable.albumart_mp_unknown_list); 417792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String name = cursor.getString(cursor.getColumnIndexOrThrow( 4181968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Albums.ALBUM)); 419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String displayname = name; 420f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) { 421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = context.getString(R.string.unknown_album_name); 422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv1.setText(displayname); 424792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 4251968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen name = cursor.getString(cursor.getColumnIndexOrThrow( 4261968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Artists.ARTIST)); 427792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = name; 428f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) { 429792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = context.getString(R.string.unknown_artist_name); 430792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 431792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv2.setText(displayname); 432792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 433792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if(mimetype.startsWith("audio/") || 434792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mimetype.equals("application/ogg") || 435792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mimetype.equals("application/x-ogg")) { 436792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project iv.setImageResource(R.drawable.ic_mp_song_list); 437792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String name = cursor.getString(cursor.getColumnIndexOrThrow( 4381968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Media.TITLE)); 439792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv1.setText(name); 440792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 4411968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen String displayname = cursor.getString(cursor.getColumnIndexOrThrow( 4421968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Artists.ARTIST)); 443f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (displayname == null || displayname.equals(MediaStore.UNKNOWN_STRING)) { 444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project displayname = context.getString(R.string.unknown_artist_name); 445792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 4461968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen name = cursor.getString(cursor.getColumnIndexOrThrow( 4471968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen MediaStore.Audio.Albums.ALBUM)); 448f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) { 4491968e38c437d7419ba01e5b7c1081f01ae618783Marco Nelissen name = context.getString(R.string.unknown_album_name); 450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv2.setText(displayname + " - " + name); 452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 453792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 454792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 455792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void changeCursor(Cursor cursor) { 456d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen if (mActivity.isFinishing() && cursor != null) { 457d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen cursor.close(); 458d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen cursor = null; 4590e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen } 460792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (cursor != mActivity.mQueryCursor) { 461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mActivity.mQueryCursor = cursor; 462792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.changeCursor(cursor); 463792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 464792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 465792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 466792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String s = constraint.toString(); 468792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mConstraintIsValid && ( 469792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project (s == null && mConstraint == null) || 470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project (s != null && s.equals(mConstraint)))) { 471792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return getCursor(); 472792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Cursor c = mActivity.getQueryCursor(null, s); 474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mConstraint = s; 475792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mConstraintIsValid = true; 476792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return c; 477792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 478792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 479792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 480792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ListView mTrackList; 481792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Cursor mQueryCursor; 482792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project} 483792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 484