ArtistAlbumBrowserActivity.java revision d99bc1e9481c68514a4e5eea4c3f429843b701b4
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
19792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport com.android.music.QueryBrowserActivity.QueryListAdapter.QueryHandler;
20792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.ExpandableListActivity;
22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.SearchManager;
23792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.AsyncQueryHandler;
24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver;
25792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ContentResolver;
26792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context;
27792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent;
28792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.IntentFilter;
29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.res.Resources;
30792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.Cursor;
31792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.CursorWrapper;
32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.BitmapDrawable;
33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.Drawable;
34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager;
35792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.MediaFile;
36792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.net.Uri;
37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Bundle;
38792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler;
39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message;
40792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore;
41792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.util.Log;
42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu;
43792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Menu;
44792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem;
45792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.SubMenu;
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.ContextMenu.ContextMenuInfo;
50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.CursorAdapter;
51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.CursorTreeAdapter;
52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListAdapter;
53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListView;
54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView;
55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SectionIndexer;
56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SimpleCursorTreeAdapter;
57792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView;
58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListView.ExpandableListContextMenuInfo;
59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport java.text.Collator;
61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class ArtistAlbumBrowserActivity extends ExpandableListActivity
64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        implements View.OnCreateContextMenuListener, MusicUtils.Defs
65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project{
66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistId;
67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistName;
68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentAlbumId;
69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentAlbumName;
70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistNameForAlbum;
719882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen    boolean mIsUnknownArtist;
729882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen    boolean mIsUnknownAlbum;
73792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private ArtistAlbumListAdapter mAdapter;
74792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private boolean mAdapterSent;
75792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private final static int SEARCH = CHILD_MENU_BASE;
76792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public ArtistAlbumBrowserActivity()
78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    {
79792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
80792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
81792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    /** Called when the activity is first created. */
82792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreate(Bundle icicle) {
84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreate(icicle);
85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setVolumeControlStream(AudioManager.STREAM_MUSIC);
87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (icicle != null) {
88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = icicle.getString("selectedalbum");
89792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumName = icicle.getString("selectedalbumname");
90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = icicle.getString("selectedartist");
91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistName = icicle.getString("selectedartistname");
92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.bindToService(this);
94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
97792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addDataScheme("file");
100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mScanListener, f);
101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setContentView(R.layout.media_picker_activity_expanding);
103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ExpandableListView lv = getExpandableListView();
104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setFastScrollEnabled(true);
105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setOnCreateContextMenuListener(this);
106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setTextFilterEnabled(true);
107792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter = (ArtistAlbumListAdapter) getLastNonConfigurationInstance();
109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mAdapter == null) {
110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            //Log.i("@@@", "starting query");
111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAdapter = new ArtistAlbumListAdapter(
112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    getApplication(),
113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    this,
114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    null, // cursor
115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    R.layout.track_list_item_group,
116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new String[] {},
117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new int[] {},
118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    R.layout.track_list_item_child,
119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new String[] {},
120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new int[] {});
121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setTitle(R.string.working_artists);
123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getArtistCursor(mAdapter.getQueryHandler(), null);
124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAdapter.setActivity(this);
126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor = mAdapter.getCursor();
128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (mArtistCursor != null) {
129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                init(mArtistCursor);
130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getArtistCursor(mAdapter.getQueryHandler(), null);
132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public Object onRetainNonConfigurationInstance() {
138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapterSent = true;
139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return mAdapter;
140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onSaveInstanceState(Bundle outcicle) {
144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // need to store the selected item so we don't lose it in case
145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // of an orientation switch. Otherwise we could lose it while
146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // in the middle of specifying a playlist to add the item to.
147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedalbum", mCurrentAlbumId);
148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedalbumname", mCurrentAlbumName);
149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedartist", mCurrentArtistId);
150792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedartistname", mCurrentArtistName);
151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onSaveInstanceState(outcicle);
152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onDestroy() {
156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.unbindFromService(this);
1570e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // If we have an adapter and didn't send it off to another activity yet, we should
1580e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // close its cursor, which we do by assigning a null cursor to it. Doing this
1590e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // instead of closing the cursor directly keeps the framework from accessing
1600e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // the closed cursor later.
1618e732ffd92d538aaa9376b560b0ff2fc5ac78c43Marco Nelissen        if (!mAdapterSent && mAdapter != null) {
1620e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            mAdapter.changeCursor(null);
163792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
1640164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // Because we pass the adapter to the next activity, we need to make
1650164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // sure it doesn't keep a reference to this activity. We can do this
1660164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // by clearing its DatasetObservers, which setListAdapter(null) does.
1670164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        setListAdapter(null);
1680164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        mAdapter = null;
169792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mScanListener);
1709882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        setListAdapter(null);
171792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onDestroy();
172792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
173792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
174792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
175792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onResume() {
176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onResume();
177792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
178792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.META_CHANGED);
179792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.QUEUE_CHANGED);
180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mTrackListListener, f);
181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mTrackListListener.onReceive(null, null);
182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
183792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.setSpinnerState(this);
184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mTrackListListener = new BroadcastReceiver() {
187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getExpandableListView().invalidateViews();
190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mScanListener = new BroadcastReceiver() {
193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.setSpinnerState(ArtistAlbumBrowserActivity.this);
196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessage(0);
197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.clearAlbumArtCache();
199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
203792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Handler mReScanHandler = new Handler() {
204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void handleMessage(Message msg) {
20642bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            if (mAdapter != null) {
20742bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen                getArtistCursor(mAdapter.getQueryHandler(), null);
20842bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            }
209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onPause() {
214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mTrackListListener);
215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mReScanHandler.removeCallbacksAndMessages(null);
216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onPause();
217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void init(Cursor c) {
220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
22142bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        if (mAdapter == null) {
22242bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            return;
22342bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        }
224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter.changeCursor(c); // also sets mArtistCursor
225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mArtistCursor == null) {
227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.displayDatabaseError(this);
228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            closeContextMenu();
229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessageDelayed(0, 1000);
230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
233792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.hideDatabaseError(this);
234792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle();
235792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
236792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
237792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private void setTitle() {
238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle(R.string.artists_title);
239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mCurrentAlbumId = Long.valueOf(id).toString();
245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent = new Intent(Intent.ACTION_PICK);
247792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
248792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.putExtra("album", mCurrentAlbumId);
249792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor c = (Cursor) getExpandableListAdapter().getChild(groupPosition, childPosition);
250792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String album = c.getString(c.getColumnIndex(MediaStore.Audio.Albums.ALBUM));
2516a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project        if (album == null || album.equals(MediaFile.UNKNOWN_STRING)) {
252792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // unknown album, so we should include the artist ID to limit the songs to songs only by that artist
253792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(groupPosition);
254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndex(MediaStore.Audio.Artists._ID));
255792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            intent.putExtra("artist", mCurrentArtistId);
256792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(intent);
258792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
259792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreateOptionsMenu(menu);
264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, GOTO_START, 0, R.string.goto_start).setIcon(R.drawable.ic_menu_music_library);
265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, GOTO_PLAYBACK, 0, R.string.goto_playback).setIcon(R.drawable.ic_menu_playback);
266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle);
267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
271792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.findItem(GOTO_PLAYBACK).setVisible(MusicUtils.isMusicLoaded());
273792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onPrepareOptionsMenu(menu);
274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent;
279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor cursor;
280792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case GOTO_START:
282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent = new Intent();
283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, MusicBrowserActivity.class);
284792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
285792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivity(intent);
286792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
287792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case GOTO_PLAYBACK:
289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent = new Intent("com.android.music.PLAYBACK_VIEWER");
290792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivity(intent);
291792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
293792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SHUFFLE_ALL:
294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
295792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        new String [] { MediaStore.Audio.Media._ID},
296792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.IS_MUSIC + "=1", null,
297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
298792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (cursor != null) {
299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MusicUtils.shuffleAll(this, cursor);
300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cursor.close();
301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
302792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
303792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
304792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onOptionsItemSelected(item);
305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
309792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.makePlaylistMenu(this, sub);
312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
314792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ExpandableListContextMenuInfo mi = (ExpandableListContextMenuInfo) menuInfoIn;
315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int itemtype = ExpandableListView.getPackedPositionType(mi.packedPosition);
317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int gpos = ExpandableListView.getPackedPositionGroup(mi.packedPosition);
318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int cpos = ExpandableListView.getPackedPositionChild(mi.packedPosition);
319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (gpos == -1) {
321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // this shouldn't happen
322792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Log.d("Artist/Album", "no group");
323792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return;
324792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
325792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            gpos = gpos - getExpandableListView().getHeaderViewsCount();
326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(gpos);
327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistName = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = null;
3309882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownArtist = mCurrentArtistName == null ||
3319882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                    mCurrentArtistName.equals(MediaFile.UNKNOWN_STRING);
3329882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownAlbum = true;
3339882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownArtist) {
334c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(getString(R.string.unknown_artist_name));
335c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            } else {
336c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(mCurrentArtistName);
3379882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                menu.add(0, SEARCH, 0, R.string.search_title);
338c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            }
339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cpos == -1) {
342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // this shouldn't happen
343792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Log.d("Artist/Album", "no child");
344792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return;
345792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
346792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = (Cursor) getExpandableListAdapter().getChild(gpos, cpos);
347792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            c.moveToPosition(cpos);
348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = null;
349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = Long.valueOf(mi.id).toString();
350792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
351792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            gpos = gpos - getExpandableListView().getHeaderViewsCount();
352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(gpos);
353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistNameForAlbum = mArtistCursor.getString(
354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
3559882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownArtist = mCurrentArtistNameForAlbum == null ||
3569882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                    mCurrentArtistNameForAlbum.equals(MediaFile.UNKNOWN_STRING);
3579882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownAlbum = mCurrentAlbumName == null ||
3589882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                    mCurrentAlbumName.equals(MediaFile.UNKNOWN_STRING);
3599882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownAlbum) {
360c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(getString(R.string.unknown_album_name));
361c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            } else {
362c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(mCurrentAlbumName);
363c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            }
3649882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (!mIsUnknownAlbum || !mIsUnknownArtist) {
3659882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                menu.add(0, SEARCH, 0, R.string.search_title);
3669882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            }
367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
368792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
369792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
370792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
371792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
372792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
373792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAY_SELECTION: {
374792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // play everything by the selected artist
375bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list =
376792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mCurrentArtistId != null ?
377bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
378bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
379792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.playAll(this, list, 0);
381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
384792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case QUEUE: {
385bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list =
386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mCurrentArtistId != null ?
387bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
388bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToCurrentPlaylist(this, list);
390792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
391792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST: {
394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, CreatePlaylist.class);
396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, NEW_PLAYLIST);
397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
398792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
400792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAYLIST_SELECTED: {
401bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list =
402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mCurrentArtistId != null ?
403bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
404bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
405bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long playlist = item.getIntent().getLongExtra("playlist", 0);
406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToPlaylist(this, list, playlist);
407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
409792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
410792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case DELETE_ITEM: {
411bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list;
412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String desc;
413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mCurrentArtistId != null) {
414bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    String f = getString(R.string.delete_artist_desc);
416792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    desc = String.format(f, mCurrentArtistName);
417792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
418bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    String f = getString(R.string.delete_album_desc);
420792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    desc = String.format(f, mCurrentAlbumName);
421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Bundle b = new Bundle();
423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                b.putString("description", desc);
424bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                b.putLongArray("items", list);
425792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
426792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, DeleteItems.class);
427792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.putExtras(b);
428792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, -1);
429792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
430792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
431792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
432792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SEARCH:
433792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                doSearch();
434792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
435792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
436792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onContextItemSelected(item);
437792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
438792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
439792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    void doSearch() {
440792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        CharSequence title = null;
441792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String query = null;
442792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
443792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent i = new Intent();
444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
4454341b5006cffbbd016688d4533f6de68d9d4c49bMarco Nelissen        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
446792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
447792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mCurrentArtistId != null) {
448792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            title = mCurrentArtistName;
449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            query = mCurrentArtistName;
450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistName);
451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
4539882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownAlbum) {
4549882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                title = query = mCurrentArtistNameForAlbum;
4559882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            } else {
4569882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                title = query = mCurrentAlbumName;
4579882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                if (!mIsUnknownArtist) {
4589882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                    query = query + " " + mCurrentArtistNameForAlbum;
4599882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                }
4609882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            }
461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
462792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
463792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
464792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
465792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        title = getString(R.string.mediasearch, title);
466792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.putExtra(SearchManager.QUERY, query);
467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
468792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(Intent.createChooser(i, title));
469792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
471792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
472792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (requestCode) {
474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SCAN_DONE:
475792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_CANCELED) {
476792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    finish();
477792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
478792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    getArtistCursor(mAdapter.getQueryHandler(), null);
479792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
480792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
481792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
482792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST:
483792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_OK) {
484792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    Uri uri = intent.getData();
485792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (uri != null) {
486bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                        long [] list = null;
487792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        if (mCurrentArtistId != null) {
488bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                            list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        } else if (mCurrentAlbumId != null) {
490bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                            list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        }
492bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                        MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment()));
493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
495792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
496792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor getArtistCursor(AsyncQueryHandler async, String filter) {
500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        StringBuilder where = new StringBuilder();
502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        where.append(MediaStore.Audio.Artists.ARTIST + " != ''");
503792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // Add in the filtering constraints
505792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String [] keywords = null;
506792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (filter != null) {
507792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String [] searchWords = filter.split(" ");
508792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            keywords = new String[searchWords.length];
509792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Collator col = Collator.getInstance();
510792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            col.setStrength(Collator.PRIMARY);
511792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            for (int i = 0; i < searchWords.length; i++) {
512792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                keywords[i] = '%' + MediaStore.Audio.keyFor(searchWords[i]) + '%';
513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
514792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            for (int i = 0; i < searchWords.length; i++) {
515792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                where.append(" AND ");
516792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                where.append(MediaStore.Audio.Media.ARTIST_KEY + " LIKE ?");
517792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
518792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
519792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
520792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String whereclause = where.toString();
521792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String[] cols = new String[] {
522792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists._ID,
523792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.ARTIST,
524792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.NUMBER_OF_ALBUMS,
525792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.NUMBER_OF_TRACKS
526792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        };
527792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor ret = null;
528792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (async != null) {
529792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            async.startQuery(0, null, MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
530792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cols, whereclause , keywords, MediaStore.Audio.Artists.ARTIST_KEY);
531792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
532792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ret = MusicUtils.query(this, MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
533792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cols, whereclause , keywords, MediaStore.Audio.Artists.ARTIST_KEY);
534792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
535792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return ret;
536792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
537792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
538792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    static class ArtistAlbumListAdapter extends SimpleCursorTreeAdapter implements SectionIndexer {
539792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
540792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Drawable mNowPlayingOverlay;
541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final BitmapDrawable mDefaultAlbumIcon;
542792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupArtistIdIdx;
543792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupArtistIdx;
544792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupAlbumIdx;
545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupSongIdx;
546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Context mContext;
547792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Resources mResources;
548792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mAlbumSongSeparator;
549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownAlbum;
550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownArtist;
551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final StringBuilder mBuffer = new StringBuilder();
552792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs = new Object[1];
553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs3 = new Object[3];
554792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private MusicAlphabetIndexer mIndexer;
555792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private ArtistAlbumBrowserActivity mActivity;
556792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private AsyncQueryHandler mQueryHandler;
557792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private String mConstraint = null;
558792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private boolean mConstraintIsValid = false;
559792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
560756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen        static class ViewHolder {
561792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line1;
562792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line2;
563792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView play_indicator;
564792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView icon;
565792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
566792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
567792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        class QueryHandler extends AsyncQueryHandler {
568792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            QueryHandler(ContentResolver res) {
569792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super(res);
570792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
571792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
572792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            @Override
573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
574792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                //Log.i("@@@", "query complete");
575792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.init(cursor);
576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
577792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ArtistAlbumListAdapter(Context context, ArtistAlbumBrowserActivity currentactivity,
580792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Cursor cursor, int glayout, String[] gfrom, int[] gto,
581792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                int clayout, String[] cfrom, int[] cto) {
582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            super(context, cursor, glayout, gfrom, gto, clayout, cfrom, cto);
583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = currentactivity;
584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mQueryHandler = new QueryHandler(context.getContentResolver());
585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
586792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Resources r = context.getResources();
587792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon = (BitmapDrawable) r.getDrawable(R.drawable.albumart_mp_unknown_list);
589792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // no filter or dither, it's a lot faster and we can't tell the difference
590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setFilterBitmap(false);
591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setDither(false);
592792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mContext = context;
594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getColumnIndices(cursor);
595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mResources = context.getResources();
596792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAlbumSongSeparator = context.getString(R.string.albumsongseparator);
597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownAlbum = context.getString(R.string.unknown_album_name);
598792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownArtist = context.getString(R.string.unknown_artist_name);
599792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
600792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
601792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private void getColumnIndices(Cursor cursor) {
602792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != null) {
603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupArtistIdIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID);
604792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST);
605792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS);
606792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupSongIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS);
607792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mIndexer != null) {
608792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mIndexer.setCursor(cursor);
609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mIndexer = new MusicAlphabetIndexer(cursor, mGroupArtistIdx,
611792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                            mResources.getString(com.android.internal.R.string.fast_scroll_alphabet));
612792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
613792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
614792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
615792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
616792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void setActivity(ArtistAlbumBrowserActivity newactivity) {
617792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = newactivity;
618792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
619792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
620792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public AsyncQueryHandler getQueryHandler() {
621792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mQueryHandler;
622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
626792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            View v = super.newGroupView(context, cursor, isExpanded, parent);
627792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = (ImageView) v.findViewById(R.id.icon);
628792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewGroup.LayoutParams p = iv.getLayoutParams();
629792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            p.width = ViewGroup.LayoutParams.WRAP_CONTENT;
630792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
631792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = new ViewHolder();
632792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1 = (TextView) v.findViewById(R.id.line1);
633792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2 = (TextView) v.findViewById(R.id.line2);
634792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
635792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon = (ImageView) v.findViewById(R.id.icon);
636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setPadding(0, 0, 1, 0);
637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            v.setTag(vh);
638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return v;
639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
640792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public View newChildView(Context context, Cursor cursor, boolean isLastChild,
643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                ViewGroup parent) {
644792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            View v = super.newChildView(context, cursor, isLastChild, parent);
645792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = new ViewHolder();
646792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1 = (TextView) v.findViewById(R.id.line1);
647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2 = (TextView) v.findViewById(R.id.line2);
648792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon = (ImageView) v.findViewById(R.id.icon);
650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setBackgroundDrawable(mDefaultAlbumIcon);
651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setPadding(0, 0, 1, 0);
652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            v.setTag(vh);
653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return v;
654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
656792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
657792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindGroupView(View view, Context context, Cursor cursor, boolean isexpanded) {
658792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
659792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
660792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
661792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String artist = cursor.getString(mGroupArtistIdx);
662792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayartist = artist;
6636a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project            boolean unknown = artist == null || artist.equals(MediaFile.UNKNOWN_STRING);
664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
665792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayartist = mUnknownArtist;
666792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
667792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayartist);
668792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
669792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numalbums = cursor.getInt(mGroupAlbumIdx);
670792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numsongs = cursor.getInt(mGroupSongIdx);
671792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
672792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String songs_albums = MusicUtils.makeAlbumsLabel(context,
673792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    numalbums, numsongs, unknown);
674792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
675792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(songs_albums);
676792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
677bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentartistid = MusicUtils.getCurrentArtistId();
678bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long artistid = cursor.getLong(mGroupArtistIdIdx);
679792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentartistid == artistid && !isexpanded) {
680792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                vh.play_indicator.setImageDrawable(mNowPlayingOverlay);
681792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
682792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                vh.play_indicator.setImageDrawable(null);
683792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
684792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
685792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
686792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
687792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindChildView(View view, Context context, Cursor cursor, boolean islast) {
688792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
689792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
690792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
691792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
692792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayname = name;
6936a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project            boolean unknown = name == null || name.equals(MediaFile.UNKNOWN_STRING);
694792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
695792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayname = mUnknownAlbum;
696792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
697792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayname);
698792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
699792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numsongs = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
700792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numartistsongs = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST));
701792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
702792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            final StringBuilder builder = mBuffer;
703792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            builder.delete(0, builder.length());
704792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
705792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                numsongs = numartistsongs;
706792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
707792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
708792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (numsongs == 1) {
709792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                builder.append(context.getString(R.string.onesong));
710792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
711792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (numsongs == numartistsongs) {
712792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    final Object[] args = mFormatArgs;
713792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[0] = numsongs;
714792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    builder.append(mResources.getQuantityString(R.plurals.Nsongs, numsongs, args));
715792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
716792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    final Object[] args = mFormatArgs3;
717792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[0] = numsongs;
718792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[1] = numartistsongs;
719792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[2] = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
720792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    builder.append(mResources.getQuantityString(R.plurals.Nsongscomp, numsongs, args));
721792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
722792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
723792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(builder.toString());
724792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
725792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = vh.icon;
726792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // We don't actually need the path to the thumbnail file,
727792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // we just use it to see if there is album art or not
728792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String art = cursor.getString(cursor.getColumnIndexOrThrow(
729792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.ALBUM_ART));
730792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown || art == null || art.length() == 0) {
731792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setBackgroundDrawable(mDefaultAlbumIcon);
732792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
733792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
734bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long artIndex = cursor.getLong(0);
735792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Drawable d = MusicUtils.getCachedArtwork(context, artIndex, mDefaultAlbumIcon);
736792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(d);
737792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
738792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
739bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentalbumid = MusicUtils.getCurrentAlbumId();
740bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long aid = cursor.getLong(0);
741792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            iv = vh.play_indicator;
742792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentalbumid == aid) {
743792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(mNowPlayingOverlay);
744792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
745792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
746792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
747792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
748792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
749792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
750792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
751792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        protected Cursor getChildrenCursor(Cursor groupCursor) {
752792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
753bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long id = groupCursor.getLong(groupCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
754792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
755792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String[] cols = new String[] {
756792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums._ID,
757792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.ALBUM,
758792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.NUMBER_OF_SONGS,
759792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST,
760792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.ALBUM_ART
761792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            };
762792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = MusicUtils.query(mActivity,
763792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Artists.Albums.getContentUri("external", id),
764792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
765792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
766792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            class MyCursorWrapper extends CursorWrapper {
767792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String mArtistName;
768792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                int mMagicColumnIdx;
769792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MyCursorWrapper(Cursor c, String artist) {
770792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    super(c);
771792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mArtistName = artist;
7726a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project                    if (mArtistName == null || mArtistName.equals(MediaFile.UNKNOWN_STRING)) {
773792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        mArtistName = mUnknownArtist;
774792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
775792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mMagicColumnIdx = c.getColumnCount();
776792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
777792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
778792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
779792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public String getString(int columnIndex) {
780792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (columnIndex != mMagicColumnIdx) {
781792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return super.getString(columnIndex);
782792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
783792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return mArtistName;
784792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
785792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
786792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
787792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public int getColumnIndexOrThrow(String name) {
7886a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project                    if (MediaStore.Audio.Albums.ARTIST.equals(name)) {
789792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return mMagicColumnIdx;
790792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
791792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return super.getColumnIndexOrThrow(name);
792792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
793792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
794792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
795792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public String getColumnName(int idx) {
796792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (idx != mMagicColumnIdx) {
797792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return super.getColumnName(idx);
798792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
799792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return MediaStore.Audio.Albums.ARTIST;
800792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
801792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
802792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
803792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public int getColumnCount() {
804792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return super.getColumnCount() + 1;
805792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
806792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
807792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return new MyCursorWrapper(c, groupCursor.getString(mGroupArtistIdx));
808792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
809792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
810792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
811792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void changeCursor(Cursor cursor) {
812d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen            if (mActivity.isFinishing() && cursor != null) {
813d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor.close();
814d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor = null;
8150e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            }
816792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != mActivity.mArtistCursor) {
817792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.mArtistCursor = cursor;
818792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getColumnIndices(cursor);
819792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super.changeCursor(cursor);
820792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
821792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
822792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
823792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
824792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
825792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String s = constraint.toString();
826792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (mConstraintIsValid && (
827792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    (s == null && mConstraint == null) ||
828792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    (s != null && s.equals(mConstraint)))) {
829792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return getCursor();
830792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
831792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = mActivity.getArtistCursor(null, s);
832792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraint = s;
833792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraintIsValid = true;
834792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return c;
835792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
836792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
837792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Object[] getSections() {
838792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getSections();
839792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
840792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
841792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getPositionForSection(int sectionIndex) {
842792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getPositionForSection(sectionIndex);
843792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
844792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
845792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getSectionForPosition(int position) {
846792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return 0;
847792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
848792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
849792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
850792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor mArtistCursor;
851792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project}
852792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
853