1792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/*
2792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *
4792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * you may not use this file except in compliance with the License.
6792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * You may obtain a copy of the License at
7792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *
8792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *
10792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * See the License for the specific language governing permissions and
14792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * limitations under the License.
15792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */
16792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
17792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpackage com.android.music;
18792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
19f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissenimport com.android.music.MusicUtils.ServiceToken;
20792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport com.android.music.QueryBrowserActivity.QueryListAdapter.QueryHandler;
21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.ExpandableListActivity;
23792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.SearchManager;
24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.AsyncQueryHandler;
25792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver;
26ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ComponentName;
27792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ContentResolver;
28792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context;
29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent;
30792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.IntentFilter;
31ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ServiceConnection;
32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.res.Resources;
33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.Cursor;
34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.CursorWrapper;
35792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.BitmapDrawable;
36792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.Drawable;
37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager;
38792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.net.Uri;
39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Bundle;
40792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler;
41ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.IBinder;
42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message;
43ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.Parcel;
44ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.Parcelable;
45792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore;
4689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissenimport android.text.TextUtils;
47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.util.Log;
48ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.util.SparseArray;
49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu;
50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Menu;
51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem;
52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.SubMenu;
53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.View;
54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewGroup;
55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Window;
56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo;
57792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListView;
58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView;
59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SectionIndexer;
60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SimpleCursorTreeAdapter;
61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView;
62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ExpandableListView.ExpandableListContextMenuInfo;
63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport java.text.Collator;
65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class ArtistAlbumBrowserActivity extends ExpandableListActivity
68ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        implements View.OnCreateContextMenuListener, MusicUtils.Defs, ServiceConnection
69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project{
70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistId;
71792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistName;
72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentAlbumId;
73792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentAlbumName;
74792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistNameForAlbum;
759882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen    boolean mIsUnknownArtist;
769882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen    boolean mIsUnknownAlbum;
77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private ArtistAlbumListAdapter mAdapter;
78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private boolean mAdapterSent;
79792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private final static int SEARCH = CHILD_MENU_BASE;
80ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    private static int mLastListPosCourse = -1;
81ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    private static int mLastListPosFine = -1;
82f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen    private ServiceToken mToken;
83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    /** Called when the activity is first created. */
85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreate(Bundle icicle) {
87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreate(icicle);
88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
89ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        requestWindowFeature(Window.FEATURE_NO_TITLE);
90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setVolumeControlStream(AudioManager.STREAM_MUSIC);
91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (icicle != null) {
92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = icicle.getString("selectedalbum");
93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumName = icicle.getString("selectedalbumname");
94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = icicle.getString("selectedartist");
95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistName = icicle.getString("selectedartistname");
96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
97f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen        mToken = MusicUtils.bindToService(this, this);
98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addDataScheme("file");
104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mScanListener, f);
105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setContentView(R.layout.media_picker_activity_expanding);
107ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.updateButtonBar(this, R.id.artisttab);
108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ExpandableListView lv = getExpandableListView();
109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setOnCreateContextMenuListener(this);
110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setTextFilterEnabled(true);
111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter = (ArtistAlbumListAdapter) getLastNonConfigurationInstance();
113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mAdapter == null) {
114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            //Log.i("@@@", "starting query");
115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAdapter = new ArtistAlbumListAdapter(
116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    getApplication(),
117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    this,
118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    null, // cursor
119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    R.layout.track_list_item_group,
120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new String[] {},
121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new int[] {},
122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    R.layout.track_list_item_child,
123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new String[] {},
124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    new int[] {});
125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setTitle(R.string.working_artists);
127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getArtistCursor(mAdapter.getQueryHandler(), null);
128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAdapter.setActivity(this);
130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor = mAdapter.getCursor();
132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (mArtistCursor != null) {
133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                init(mArtistCursor);
134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getArtistCursor(mAdapter.getQueryHandler(), null);
136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public Object onRetainNonConfigurationInstance() {
142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapterSent = true;
143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return mAdapter;
144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onSaveInstanceState(Bundle outcicle) {
148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // need to store the selected item so we don't lose it in case
149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // of an orientation switch. Otherwise we could lose it while
150792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // in the middle of specifying a playlist to add the item to.
151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedalbum", mCurrentAlbumId);
152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedalbumname", mCurrentAlbumName);
153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedartist", mCurrentArtistId);
154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedartistname", mCurrentArtistName);
155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onSaveInstanceState(outcicle);
156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
157792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
158792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
159792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onDestroy() {
160ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        ExpandableListView lv = getExpandableListView();
1619e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        if (lv != null) {
1629e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen            mLastListPosCourse = lv.getFirstVisiblePosition();
16323b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            View cv = lv.getChildAt(0);
16423b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            if (cv != null) {
16523b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen                mLastListPosFine = cv.getTop();
16623b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            }
1679e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        }
168ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
169f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen        MusicUtils.unbindFromService(mToken);
1700e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // If we have an adapter and didn't send it off to another activity yet, we should
1710e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // close its cursor, which we do by assigning a null cursor to it. Doing this
1720e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // instead of closing the cursor directly keeps the framework from accessing
1730e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // the closed cursor later.
1748e732ffd92d538aaa9376b560b0ff2fc5ac78c43Marco Nelissen        if (!mAdapterSent && mAdapter != null) {
1750e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            mAdapter.changeCursor(null);
176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
1770164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // Because we pass the adapter to the next activity, we need to make
1780164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // sure it doesn't keep a reference to this activity. We can do this
1790164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // by clearing its DatasetObservers, which setListAdapter(null) does.
1800164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        setListAdapter(null);
1810164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        mAdapter = null;
182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mScanListener);
1839882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        setListAdapter(null);
184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onDestroy();
185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onResume() {
189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onResume();
190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.META_CHANGED);
192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.QUEUE_CHANGED);
193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mTrackListListener, f);
194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mTrackListListener.onReceive(null, null);
195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.setSpinnerState(this);
197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mTrackListListener = new BroadcastReceiver() {
200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getExpandableListView().invalidateViews();
203ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            MusicUtils.updateNowPlaying(ArtistAlbumBrowserActivity.this);
204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mScanListener = new BroadcastReceiver() {
207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
208792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.setSpinnerState(ArtistAlbumBrowserActivity.this);
210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessage(0);
211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.clearAlbumArtCache();
213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Handler mReScanHandler = new Handler() {
218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void handleMessage(Message msg) {
22042bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            if (mAdapter != null) {
22142bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen                getArtistCursor(mAdapter.getQueryHandler(), null);
22242bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            }
223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onPause() {
228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mTrackListListener);
229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mReScanHandler.removeCallbacksAndMessages(null);
230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onPause();
231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
233792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void init(Cursor c) {
234792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
23542bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        if (mAdapter == null) {
23642bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            return;
23742bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        }
238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter.changeCursor(c); // also sets mArtistCursor
239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mArtistCursor == null) {
241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.displayDatabaseError(this);
242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            closeContextMenu();
243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessageDelayed(0, 1000);
244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
247ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        // restore previous position
248ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        if (mLastListPosCourse >= 0) {
249ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            ExpandableListView elv = getExpandableListView();
250ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            elv.setSelectionFromTop(mLastListPosCourse, mLastListPosFine);
251ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            mLastListPosCourse = -1;
252ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        }
253ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.hideDatabaseError(this);
2559e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        MusicUtils.updateButtonBar(this, R.id.artisttab);
256792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle();
257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
258792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
259792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private void setTitle() {
260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle(R.string.artists_title);
261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mCurrentAlbumId = Long.valueOf(id).toString();
267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent = new Intent(Intent.ACTION_PICK);
269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.putExtra("album", mCurrentAlbumId);
271792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor c = (Cursor) getExpandableListAdapter().getChild(groupPosition, childPosition);
272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String album = c.getString(c.getColumnIndex(MediaStore.Audio.Albums.ALBUM));
273f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen        if (album == null || album.equals(MediaStore.UNKNOWN_STRING)) {
274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // unknown album, so we should include the artist ID to limit the songs to songs only by that artist
275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(groupPosition);
276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndex(MediaStore.Audio.Artists._ID));
277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            intent.putExtra("artist", mCurrentArtistId);
278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(intent);
280792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
284792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
285792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreateOptionsMenu(menu);
286ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        menu.add(0, PARTY_SHUFFLE, 0, R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu()
287792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle);
288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
290792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
291792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
293ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.setPartyShuffleMenuIcon(menu);
294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onPrepareOptionsMenu(menu);
295792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
296792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
298792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent;
300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor cursor;
301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
302ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            case PARTY_SHUFFLE:
303ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen                MusicUtils.togglePartyShuffle();
304ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen                break;
305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SHUFFLE_ALL:
307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        new String [] { MediaStore.Audio.Media._ID},
309792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.IS_MUSIC + "=1", null,
310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (cursor != null) {
312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MusicUtils.shuffleAll(this, cursor);
313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cursor.close();
314792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onOptionsItemSelected(item);
318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
322792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
323792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
324792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.makePlaylistMenu(this, sub);
325792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ExpandableListContextMenuInfo mi = (ExpandableListContextMenuInfo) menuInfoIn;
328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int itemtype = ExpandableListView.getPackedPositionType(mi.packedPosition);
330792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int gpos = ExpandableListView.getPackedPositionGroup(mi.packedPosition);
331792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int cpos = ExpandableListView.getPackedPositionChild(mi.packedPosition);
332792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
333792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (gpos == -1) {
334792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // this shouldn't happen
335792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Log.d("Artist/Album", "no group");
336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return;
337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            gpos = gpos - getExpandableListView().getHeaderViewsCount();
339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(gpos);
340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistName = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = null;
3439882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownArtist = mCurrentArtistName == null ||
344f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen                    mCurrentArtistName.equals(MediaStore.UNKNOWN_STRING);
3459882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownAlbum = true;
3469882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownArtist) {
347c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(getString(R.string.unknown_artist_name));
348c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            } else {
349c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(mCurrentArtistName);
3509882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                menu.add(0, SEARCH, 0, R.string.search_title);
351c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            }
352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cpos == -1) {
355792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // this shouldn't happen
356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Log.d("Artist/Album", "no child");
357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return;
358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
359792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = (Cursor) getExpandableListAdapter().getChild(gpos, cpos);
360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            c.moveToPosition(cpos);
361792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = null;
362792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = Long.valueOf(mi.id).toString();
363792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
364792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            gpos = gpos - getExpandableListView().getHeaderViewsCount();
365792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(gpos);
366792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistNameForAlbum = mArtistCursor.getString(
367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
3689882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownArtist = mCurrentArtistNameForAlbum == null ||
369f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen                    mCurrentArtistNameForAlbum.equals(MediaStore.UNKNOWN_STRING);
3709882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownAlbum = mCurrentAlbumName == null ||
371f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen                    mCurrentAlbumName.equals(MediaStore.UNKNOWN_STRING);
3729882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownAlbum) {
373c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(getString(R.string.unknown_album_name));
374c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            } else {
375c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(mCurrentAlbumName);
376c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            }
3779882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (!mIsUnknownAlbum || !mIsUnknownArtist) {
3789882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                menu.add(0, SEARCH, 0, R.string.search_title);
3799882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            }
380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
384792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
385792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAY_SELECTION: {
387792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // play everything by the selected artist
388bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list =
389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mCurrentArtistId != null ?
390bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
391bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.playAll(this, list, 0);
394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case QUEUE: {
398bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list =
399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mCurrentArtistId != null ?
400bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
401bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToCurrentPlaylist(this, list);
403792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST: {
407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, CreatePlaylist.class);
409792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, NEW_PLAYLIST);
410792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
411792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAYLIST_SELECTED: {
414bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list =
415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mCurrentArtistId != null ?
416bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
417bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
418bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long playlist = item.getIntent().getLongExtra("playlist", 0);
419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToPlaylist(this, list, playlist);
420792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case DELETE_ITEM: {
424bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long [] list;
425792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String desc;
426792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mCurrentArtistId != null) {
427bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
428ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    String f;
429ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    if (android.os.Environment.isExternalStorageRemovable()) {
430ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_artist_desc);
431ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    } else {
432ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_artist_desc_nosdcard);
433ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    }
434792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    desc = String.format(f, mCurrentArtistName);
435792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
436bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
437ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    String f;
438ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    if (android.os.Environment.isExternalStorageRemovable()) {
439ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_album_desc);
440ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    } else {
441ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_album_desc_nosdcard);
442ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    }
443ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer
444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    desc = String.format(f, mCurrentAlbumName);
445792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
446792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Bundle b = new Bundle();
447792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                b.putString("description", desc);
448bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                b.putLongArray("items", list);
449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, DeleteItems.class);
451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.putExtras(b);
452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, -1);
453792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
454792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
455792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
456792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SEARCH:
457792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                doSearch();
458792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
459792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
460792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onContextItemSelected(item);
461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
462792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
463792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    void doSearch() {
464792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        CharSequence title = null;
465792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String query = null;
466792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent i = new Intent();
468792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
4694341b5006cffbbd016688d4533f6de68d9d4c49bMarco Nelissen        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
471792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mCurrentArtistId != null) {
472792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            title = mCurrentArtistName;
473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            query = mCurrentArtistName;
474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistName);
475792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
476792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
4779882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownAlbum) {
4789882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                title = query = mCurrentArtistNameForAlbum;
4799882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            } else {
4809882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                title = query = mCurrentAlbumName;
4819882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                if (!mIsUnknownArtist) {
4829882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                    query = query + " " + mCurrentArtistNameForAlbum;
4839882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                }
4849882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            }
485792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
486792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
487792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
488792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        title = getString(R.string.mediasearch, title);
490792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.putExtra(SearchManager.QUERY, query);
491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
492792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(Intent.createChooser(i, title));
493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
495792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
496792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (requestCode) {
498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SCAN_DONE:
499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_CANCELED) {
500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    finish();
501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    getArtistCursor(mAdapter.getQueryHandler(), null);
503792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
505792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
506792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST:
507792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_OK) {
508792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    Uri uri = intent.getData();
509792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (uri != null) {
510bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                        long [] list = null;
511792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        if (mCurrentArtistId != null) {
512bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                            list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        } else if (mCurrentAlbumId != null) {
514bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                            list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
515792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        }
516bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                        MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment()));
517792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
518792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
519792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
520792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
521792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
522792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
523792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor getArtistCursor(AsyncQueryHandler async, String filter) {
524792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
525792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String[] cols = new String[] {
526792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists._ID,
527792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.ARTIST,
528792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.NUMBER_OF_ALBUMS,
529792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.NUMBER_OF_TRACKS
530792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        };
53189f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen
53289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen        Uri uri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
53389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen        if (!TextUtils.isEmpty(filter)) {
53489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build();
53589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen        }
53689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen
537792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor ret = null;
538792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (async != null) {
53989f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            async.startQuery(0, null, uri,
54089f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen                    cols, null , null, MediaStore.Audio.Artists.ARTIST_KEY);
541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
54289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            ret = MusicUtils.query(this, uri,
54389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen                    cols, null , null, MediaStore.Audio.Artists.ARTIST_KEY);
544792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return ret;
546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
547792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
548792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    static class ArtistAlbumListAdapter extends SimpleCursorTreeAdapter implements SectionIndexer {
549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Drawable mNowPlayingOverlay;
551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final BitmapDrawable mDefaultAlbumIcon;
552792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupArtistIdIdx;
553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupArtistIdx;
554792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupAlbumIdx;
555792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupSongIdx;
556792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Context mContext;
557792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Resources mResources;
558792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mAlbumSongSeparator;
559792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownAlbum;
560792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownArtist;
561792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final StringBuilder mBuffer = new StringBuilder();
562792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs = new Object[1];
563792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs3 = new Object[3];
564792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private MusicAlphabetIndexer mIndexer;
565792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private ArtistAlbumBrowserActivity mActivity;
566792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private AsyncQueryHandler mQueryHandler;
567792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private String mConstraint = null;
568792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private boolean mConstraintIsValid = false;
569792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
570756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen        static class ViewHolder {
571792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line1;
572792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line2;
573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView play_indicator;
574792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView icon;
575792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
577792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        class QueryHandler extends AsyncQueryHandler {
578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            QueryHandler(ContentResolver res) {
579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super(res);
580792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
581792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            @Override
583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                //Log.i("@@@", "query complete");
585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.init(cursor);
586792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
587792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
589792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ArtistAlbumListAdapter(Context context, ArtistAlbumBrowserActivity currentactivity,
590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Cursor cursor, int glayout, String[] gfrom, int[] gto,
591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                int clayout, String[] cfrom, int[] cto) {
592792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            super(context, cursor, glayout, gfrom, gto, clayout, cfrom, cto);
593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = currentactivity;
594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mQueryHandler = new QueryHandler(context.getContentResolver());
595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
596792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Resources r = context.getResources();
597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
598792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon = (BitmapDrawable) r.getDrawable(R.drawable.albumart_mp_unknown_list);
599792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // no filter or dither, it's a lot faster and we can't tell the difference
600792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setFilterBitmap(false);
601792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setDither(false);
602792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mContext = context;
604792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getColumnIndices(cursor);
605792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mResources = context.getResources();
606792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAlbumSongSeparator = context.getString(R.string.albumsongseparator);
607792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownAlbum = context.getString(R.string.unknown_album_name);
608792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownArtist = context.getString(R.string.unknown_artist_name);
609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
611792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private void getColumnIndices(Cursor cursor) {
612792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != null) {
613792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupArtistIdIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID);
614792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST);
615792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS);
616792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupSongIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS);
617792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mIndexer != null) {
618792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mIndexer.setCursor(cursor);
619792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
620792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mIndexer = new MusicAlphabetIndexer(cursor, mGroupArtistIdx,
6213d4b2625018856a506a203e046550afd2d9d8a92Marco Nelissen                            mResources.getString(R.string.fast_scroll_alphabet));
622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
626792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void setActivity(ArtistAlbumBrowserActivity newactivity) {
627792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = newactivity;
628792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
629792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
630792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public AsyncQueryHandler getQueryHandler() {
631792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mQueryHandler;
632792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
633792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
634792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
635792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            View v = super.newGroupView(context, cursor, isExpanded, parent);
637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = (ImageView) v.findViewById(R.id.icon);
638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewGroup.LayoutParams p = iv.getLayoutParams();
639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            p.width = ViewGroup.LayoutParams.WRAP_CONTENT;
640792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = new ViewHolder();
642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1 = (TextView) v.findViewById(R.id.line1);
643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2 = (TextView) v.findViewById(R.id.line2);
644792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
645792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon = (ImageView) v.findViewById(R.id.icon);
646792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setPadding(0, 0, 1, 0);
647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            v.setTag(vh);
648792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return v;
649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public View newChildView(Context context, Cursor cursor, boolean isLastChild,
653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                ViewGroup parent) {
654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            View v = super.newChildView(context, cursor, isLastChild, parent);
655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = new ViewHolder();
656792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1 = (TextView) v.findViewById(R.id.line1);
657792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2 = (TextView) v.findViewById(R.id.line2);
658792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
659792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon = (ImageView) v.findViewById(R.id.icon);
660792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setBackgroundDrawable(mDefaultAlbumIcon);
661792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setPadding(0, 0, 1, 0);
662792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            v.setTag(vh);
663792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return v;
664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
665792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
666792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
667792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindGroupView(View view, Context context, Cursor cursor, boolean isexpanded) {
668792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
669792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
670792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
671792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String artist = cursor.getString(mGroupArtistIdx);
672792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayartist = artist;
673f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen            boolean unknown = artist == null || artist.equals(MediaStore.UNKNOWN_STRING);
674792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
675792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayartist = mUnknownArtist;
676792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
677792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayartist);
678792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
679792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numalbums = cursor.getInt(mGroupAlbumIdx);
680792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numsongs = cursor.getInt(mGroupSongIdx);
681792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
682792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String songs_albums = MusicUtils.makeAlbumsLabel(context,
683792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    numalbums, numsongs, unknown);
684792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
685792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(songs_albums);
686792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
687bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentartistid = MusicUtils.getCurrentArtistId();
688bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long artistid = cursor.getLong(mGroupArtistIdIdx);
689792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentartistid == artistid && !isexpanded) {
690792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                vh.play_indicator.setImageDrawable(mNowPlayingOverlay);
691792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
692792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                vh.play_indicator.setImageDrawable(null);
693792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
694792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
695792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
696792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
697792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindChildView(View view, Context context, Cursor cursor, boolean islast) {
698792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
699792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
700792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
701792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
702792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayname = name;
703f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen            boolean unknown = name == null || name.equals(MediaStore.UNKNOWN_STRING);
704792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
705792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayname = mUnknownAlbum;
706792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
707792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayname);
708792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
709792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numsongs = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
710792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numartistsongs = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST));
711792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
712792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            final StringBuilder builder = mBuffer;
713792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            builder.delete(0, builder.length());
714792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
715792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                numsongs = numartistsongs;
716792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
717792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
718792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (numsongs == 1) {
719792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                builder.append(context.getString(R.string.onesong));
720792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
721792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (numsongs == numartistsongs) {
722792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    final Object[] args = mFormatArgs;
723792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[0] = numsongs;
724792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    builder.append(mResources.getQuantityString(R.plurals.Nsongs, numsongs, args));
725792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
726792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    final Object[] args = mFormatArgs3;
727792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[0] = numsongs;
728792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[1] = numartistsongs;
729792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[2] = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
730792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    builder.append(mResources.getQuantityString(R.plurals.Nsongscomp, numsongs, args));
731792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
732792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
733792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(builder.toString());
734792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
735792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = vh.icon;
736792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // We don't actually need the path to the thumbnail file,
737792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // we just use it to see if there is album art or not
738792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String art = cursor.getString(cursor.getColumnIndexOrThrow(
739792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.ALBUM_ART));
740792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown || art == null || art.length() == 0) {
741792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setBackgroundDrawable(mDefaultAlbumIcon);
742792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
743792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
744bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long artIndex = cursor.getLong(0);
745792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Drawable d = MusicUtils.getCachedArtwork(context, artIndex, mDefaultAlbumIcon);
746792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(d);
747792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
748792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
749bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentalbumid = MusicUtils.getCurrentAlbumId();
750bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long aid = cursor.getLong(0);
751792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            iv = vh.play_indicator;
752792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentalbumid == aid) {
753792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(mNowPlayingOverlay);
754792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
755792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
756792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
757792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
758792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
759792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
760792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
761792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        protected Cursor getChildrenCursor(Cursor groupCursor) {
762792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
763bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long id = groupCursor.getLong(groupCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
764792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
765792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String[] cols = new String[] {
766792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums._ID,
767792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.ALBUM,
768792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.NUMBER_OF_SONGS,
769792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST,
770792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.ALBUM_ART
771792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            };
772792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = MusicUtils.query(mActivity,
773792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Artists.Albums.getContentUri("external", id),
774792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
775792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
776792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            class MyCursorWrapper extends CursorWrapper {
777792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String mArtistName;
778792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                int mMagicColumnIdx;
779792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MyCursorWrapper(Cursor c, String artist) {
780792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    super(c);
781792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mArtistName = artist;
782f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen                    if (mArtistName == null || mArtistName.equals(MediaStore.UNKNOWN_STRING)) {
783792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        mArtistName = mUnknownArtist;
784792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
785792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mMagicColumnIdx = c.getColumnCount();
786792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
787792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
788792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
789792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public String getString(int columnIndex) {
790792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (columnIndex != mMagicColumnIdx) {
791792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return super.getString(columnIndex);
792792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
793792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return mArtistName;
794792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
795792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
796792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
797792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public int getColumnIndexOrThrow(String name) {
7986a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project                    if (MediaStore.Audio.Albums.ARTIST.equals(name)) {
799792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return mMagicColumnIdx;
800792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
801792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return super.getColumnIndexOrThrow(name);
802792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
803792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
804792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
805792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public String getColumnName(int idx) {
806792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (idx != mMagicColumnIdx) {
807792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return super.getColumnName(idx);
808792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
809792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return MediaStore.Audio.Albums.ARTIST;
810792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
811792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
812792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
813792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public int getColumnCount() {
814792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return super.getColumnCount() + 1;
815792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
816792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
817792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return new MyCursorWrapper(c, groupCursor.getString(mGroupArtistIdx));
818792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
819792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
820792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
821792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void changeCursor(Cursor cursor) {
822d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen            if (mActivity.isFinishing() && cursor != null) {
823d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor.close();
824d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor = null;
8250e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            }
826792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != mActivity.mArtistCursor) {
827792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.mArtistCursor = cursor;
828792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getColumnIndices(cursor);
829792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super.changeCursor(cursor);
830792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
831792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
832792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
833792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
834792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
835792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String s = constraint.toString();
836792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (mConstraintIsValid && (
837792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    (s == null && mConstraint == null) ||
838792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    (s != null && s.equals(mConstraint)))) {
839792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return getCursor();
840792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
841792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = mActivity.getArtistCursor(null, s);
842792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraint = s;
843792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraintIsValid = true;
844792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return c;
845792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
846792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
847792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Object[] getSections() {
848792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getSections();
849792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
850792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
851792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getPositionForSection(int sectionIndex) {
852792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getPositionForSection(sectionIndex);
853792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
854792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
855792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getSectionForPosition(int position) {
856792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return 0;
857792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
858792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
859792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
860792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor mArtistCursor;
861ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
862ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    public void onServiceConnected(ComponentName name, IBinder service) {
863ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.updateNowPlaying(this);
864ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    }
865ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
866ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    public void onServiceDisconnected(ComponentName name) {
867ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        finish();
868ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    }
869792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project}
870792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
871