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