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