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 Projectpublic class ArtistAlbumBrowserActivity extends ExpandableListActivity
67b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        implements View.OnCreateContextMenuListener, MusicUtils.Defs, ServiceConnection {
68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistId;
69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistName;
70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentAlbumId;
71792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentAlbumName;
72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mCurrentArtistNameForAlbum;
739882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen    boolean mIsUnknownArtist;
749882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen    boolean mIsUnknownAlbum;
75792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private ArtistAlbumListAdapter mAdapter;
76792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private boolean mAdapterSent;
77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private final static int SEARCH = CHILD_MENU_BASE;
78ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    private static int mLastListPosCourse = -1;
79ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    private static int mLastListPosFine = -1;
80f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen    private ServiceToken mToken;
81792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
82792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    /** Called when the activity is first created. */
83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreate(Bundle icicle) {
85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreate(icicle);
86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
87ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        requestWindowFeature(Window.FEATURE_NO_TITLE);
88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setVolumeControlStream(AudioManager.STREAM_MUSIC);
89792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (icicle != null) {
90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = icicle.getString("selectedalbum");
91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumName = icicle.getString("selectedalbumname");
92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = icicle.getString("selectedartist");
93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistName = icicle.getString("selectedartistname");
94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
95f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen        mToken = MusicUtils.bindToService(this, this);
96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
97792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addDataScheme("file");
102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mScanListener, f);
103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setContentView(R.layout.media_picker_activity_expanding);
105ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.updateButtonBar(this, R.id.artisttab);
106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ExpandableListView lv = getExpandableListView();
107792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setOnCreateContextMenuListener(this);
108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setTextFilterEnabled(true);
109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter = (ArtistAlbumListAdapter) getLastNonConfigurationInstance();
111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mAdapter == null) {
112b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            // Log.i("@@@", "starting query");
113b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mAdapter = new ArtistAlbumListAdapter(getApplication(), this,
114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    null, // cursor
115b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    R.layout.track_list_item_group, new String[] {}, new int[] {},
116b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    R.layout.track_list_item_child, new String[] {}, new int[] {});
117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setTitle(R.string.working_artists);
119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getArtistCursor(mAdapter.getQueryHandler(), null);
120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAdapter.setActivity(this);
122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor = mAdapter.getCursor();
124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (mArtistCursor != null) {
125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                init(mArtistCursor);
126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getArtistCursor(mAdapter.getQueryHandler(), null);
128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public Object onRetainNonConfigurationInstance() {
134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapterSent = true;
135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return mAdapter;
136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
137b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onSaveInstanceState(Bundle outcicle) {
140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // need to store the selected item so we don't lose it in case
141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // of an orientation switch. Otherwise we could lose it while
142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        // in the middle of specifying a playlist to add the item to.
143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedalbum", mCurrentAlbumId);
144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedalbumname", mCurrentAlbumName);
145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedartist", mCurrentArtistId);
146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        outcicle.putString("selectedartistname", mCurrentArtistName);
147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onSaveInstanceState(outcicle);
148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
150792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onDestroy() {
152ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        ExpandableListView lv = getExpandableListView();
1539e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        if (lv != null) {
1549e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen            mLastListPosCourse = lv.getFirstVisiblePosition();
15523b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            View cv = lv.getChildAt(0);
15623b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            if (cv != null) {
15723b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen                mLastListPosFine = cv.getTop();
15823b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            }
1599e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        }
160b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
161f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen        MusicUtils.unbindFromService(mToken);
1620e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // If we have an adapter and didn't send it off to another activity yet, we should
1630e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // close its cursor, which we do by assigning a null cursor to it. Doing this
1640e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // instead of closing the cursor directly keeps the framework from accessing
1650e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // the closed cursor later.
1668e732ffd92d538aaa9376b560b0ff2fc5ac78c43Marco Nelissen        if (!mAdapterSent && mAdapter != null) {
1670e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            mAdapter.changeCursor(null);
168792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
1690164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // Because we pass the adapter to the next activity, we need to make
1700164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // sure it doesn't keep a reference to this activity. We can do this
1710164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // by clearing its DatasetObservers, which setListAdapter(null) does.
1720164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        setListAdapter(null);
1730164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        mAdapter = null;
174792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mScanListener);
1759882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        setListAdapter(null);
176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onDestroy();
177792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
178b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
179792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onResume() {
181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onResume();
182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
183792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.META_CHANGED);
184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.QUEUE_CHANGED);
185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mTrackListListener, f);
186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mTrackListListener.onReceive(null, null);
187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.setSpinnerState(this);
189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mTrackListListener = new BroadcastReceiver() {
192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getExpandableListView().invalidateViews();
195ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            MusicUtils.updateNowPlaying(ArtistAlbumBrowserActivity.this);
196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mScanListener = new BroadcastReceiver() {
199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.setSpinnerState(ArtistAlbumBrowserActivity.this);
202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessage(0);
203792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.clearAlbumArtCache();
205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
208b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Handler mReScanHandler = new Handler() {
210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void handleMessage(Message msg) {
21242bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            if (mAdapter != null) {
21342bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen                getArtistCursor(mAdapter.getQueryHandler(), null);
21442bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            }
215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onPause() {
220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mTrackListListener);
221792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mReScanHandler.removeCallbacksAndMessages(null);
222792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onPause();
223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
225b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He    public void init(Cursor c) {
22642bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        if (mAdapter == null) {
22742bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            return;
22842bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        }
229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter.changeCursor(c); // also sets mArtistCursor
230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mArtistCursor == null) {
232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.displayDatabaseError(this);
233792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            closeContextMenu();
234792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessageDelayed(0, 1000);
235792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
236792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
237792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
238ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        // restore previous position
239ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        if (mLastListPosCourse >= 0) {
240ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            ExpandableListView elv = getExpandableListView();
241ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            elv.setSelectionFromTop(mLastListPosCourse, mLastListPosFine);
242ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            mLastListPosCourse = -1;
243ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        }
244ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.hideDatabaseError(this);
2469e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        MusicUtils.updateButtonBar(this, R.id.artisttab);
247792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle();
248792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
249792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
250792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private void setTitle() {
251792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle(R.string.artists_title);
252792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
253792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
254b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He    @Override
255b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He    public boolean onChildClick(
256b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mCurrentAlbumId = Long.valueOf(id).toString();
258b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
259792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent = new Intent(Intent.ACTION_PICK);
260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.putExtra("album", mCurrentAlbumId);
262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor c = (Cursor) getExpandableListAdapter().getChild(groupPosition, childPosition);
263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String album = c.getString(c.getColumnIndex(MediaStore.Audio.Albums.ALBUM));
264f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen        if (album == null || album.equals(MediaStore.UNKNOWN_STRING)) {
265b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            // unknown album, so we should include the artist ID to limit the songs to songs only by
266b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            // that artist
267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(groupPosition);
268b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mCurrentArtistId = mArtistCursor.getString(
269b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    mArtistCursor.getColumnIndex(MediaStore.Audio.Artists._ID));
270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            intent.putExtra("artist", mCurrentArtistId);
271792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(intent);
273792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
275b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreateOptionsMenu(menu);
279b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        menu.add(0, PARTY_SHUFFLE, 0,
280b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu()
281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle);
282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
284b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
285792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
286792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
287ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.setPartyShuffleMenuIcon(menu);
288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onPrepareOptionsMenu(menu);
289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
290792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
291792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
293792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent;
294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor cursor;
295792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
296ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            case PARTY_SHUFFLE:
297ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen                MusicUtils.togglePartyShuffle();
298ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen                break;
299b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SHUFFLE_ALL:
301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
302b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        new String[] {MediaStore.Audio.Media._ID},
303792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.IS_MUSIC + "=1", null,
304792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (cursor != null) {
306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MusicUtils.shuffleAll(this, cursor);
307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cursor.close();
308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
309792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onOptionsItemSelected(item);
312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
314792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.makePlaylistMenu(this, sub);
319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
320b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ExpandableListContextMenuInfo mi = (ExpandableListContextMenuInfo) menuInfoIn;
322b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
323792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int itemtype = ExpandableListView.getPackedPositionType(mi.packedPosition);
324792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int gpos = ExpandableListView.getPackedPositionGroup(mi.packedPosition);
325792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        int cpos = ExpandableListView.getPackedPositionChild(mi.packedPosition);
326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (gpos == -1) {
328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // this shouldn't happen
329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Log.d("Artist/Album", "no group");
330792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return;
331792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
332792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            gpos = gpos - getExpandableListView().getHeaderViewsCount();
333792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(gpos);
334b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mCurrentArtistId = mArtistCursor.getString(
335b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
336b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mCurrentArtistName = mArtistCursor.getString(
337b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = null;
339b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mIsUnknownArtist = mCurrentArtistName == null
340b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    || mCurrentArtistName.equals(MediaStore.UNKNOWN_STRING);
3419882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            mIsUnknownAlbum = true;
3429882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownArtist) {
343c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(getString(R.string.unknown_artist_name));
344c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            } else {
345c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(mCurrentArtistName);
3469882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                menu.add(0, SEARCH, 0, R.string.search_title);
347c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            }
348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
350792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cpos == -1) {
351792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // this shouldn't happen
352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Log.d("Artist/Album", "no child");
353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return;
354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
355792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = (Cursor) getExpandableListAdapter().getChild(gpos, cpos);
356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            c.moveToPosition(cpos);
357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistId = null;
358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = Long.valueOf(mi.id).toString();
359792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumName = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            gpos = gpos - getExpandableListView().getHeaderViewsCount();
361792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistCursor.moveToPosition(gpos);
362792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentArtistNameForAlbum = mArtistCursor.getString(
363792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
364b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mIsUnknownArtist = mCurrentArtistNameForAlbum == null
365b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    || mCurrentArtistNameForAlbum.equals(MediaStore.UNKNOWN_STRING);
366b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mIsUnknownAlbum = mCurrentAlbumName == null
367b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    || mCurrentAlbumName.equals(MediaStore.UNKNOWN_STRING);
3689882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownAlbum) {
369c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(getString(R.string.unknown_album_name));
370c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            } else {
371c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer                menu.setHeaderTitle(mCurrentAlbumName);
372c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            }
3739882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (!mIsUnknownAlbum || !mIsUnknownArtist) {
3749882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                menu.add(0, SEARCH, 0, R.string.search_title);
3759882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            }
376792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
377792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
378792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
379792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAY_SELECTION: {
383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // play everything by the selected artist
384b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = mCurrentArtistId != null
385b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        ? MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
386b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
387b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
388792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.playAll(this, list, 0);
389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
390792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
391792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case QUEUE: {
393b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = mCurrentArtistId != null
394b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        ? MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
395b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToCurrentPlaylist(this, list);
397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
398792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
400792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST: {
401792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, CreatePlaylist.class);
403792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, NEW_PLAYLIST);
404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAYLIST_SELECTED: {
408b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = mCurrentArtistId != null
409b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        ? MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
410b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
411bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long playlist = item.getIntent().getLongExtra("playlist", 0);
412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToPlaylist(this, list, playlist);
413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
414792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
415b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
416792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case DELETE_ITEM: {
417b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list;
418792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String desc;
419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mCurrentArtistId != null) {
420bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
421ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    String f;
422ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    if (android.os.Environment.isExternalStorageRemovable()) {
423ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_artist_desc);
424ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    } else {
425ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_artist_desc_nosdcard);
426ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    }
427792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    desc = String.format(f, mCurrentArtistName);
428792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
429bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                    list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
430ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    String f;
431ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    if (android.os.Environment.isExternalStorageRemovable()) {
432ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_album_desc);
433ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    } else {
434ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                        f = getString(R.string.delete_album_desc_nosdcard);
435ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    }
436b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
437792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    desc = String.format(f, mCurrentAlbumName);
438792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
439792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Bundle b = new Bundle();
440792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                b.putString("description", desc);
441bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                b.putLongArray("items", list);
442792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
443792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, DeleteItems.class);
444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.putExtras(b);
445792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, -1);
446792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
447792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
448b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SEARCH:
450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                doSearch();
451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
453792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onContextItemSelected(item);
454792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
455792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
456792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    void doSearch() {
457792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        CharSequence title = null;
458792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        String query = null;
459b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
460792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent i = new Intent();
461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
4624341b5006cffbbd016688d4533f6de68d9d4c49bMarco Nelissen        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
463b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
464792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mCurrentArtistId != null) {
465792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            title = mCurrentArtistName;
466792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            query = mCurrentArtistName;
467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistName);
468792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
469792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
4709882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            if (mIsUnknownAlbum) {
4719882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                title = query = mCurrentArtistNameForAlbum;
4729882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            } else {
4739882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                title = query = mCurrentAlbumName;
4749882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                if (!mIsUnknownArtist) {
4759882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                    query = query + " " + mCurrentArtistNameForAlbum;
4769882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen                }
4779882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            }
478792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
479792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
480792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
481792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
482792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        title = getString(R.string.mediasearch, title);
483792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.putExtra(SearchManager.QUERY, query);
484792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
485792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(Intent.createChooser(i, title));
486792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
487b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
488792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
490792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (requestCode) {
491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SCAN_DONE:
492792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_CANCELED) {
493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    finish();
494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
495792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    getArtistCursor(mAdapter.getQueryHandler(), null);
496792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST:
500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_OK) {
501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    Uri uri = intent.getData();
502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (uri != null) {
503b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        long[] list = null;
504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        if (mCurrentArtistId != null) {
505b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                            list = MusicUtils.getSongListForArtist(
506b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                    this, Long.parseLong(mCurrentArtistId));
507792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        } else if (mCurrentAlbumId != null) {
508b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                            list = MusicUtils.getSongListForAlbum(
509b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                    this, Long.parseLong(mCurrentAlbumId));
510792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        }
511b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        MusicUtils.addToPlaylist(
512b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                this, list, Long.parseLong(uri.getLastPathSegment()));
513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
514792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
515792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
516792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
517792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
518792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
519792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor getArtistCursor(AsyncQueryHandler async, String filter) {
520b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        String[] cols = new String[] {MediaStore.Audio.Artists._ID, MediaStore.Audio.Artists.ARTIST,
521792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MediaStore.Audio.Artists.NUMBER_OF_ALBUMS,
522b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                MediaStore.Audio.Artists.NUMBER_OF_TRACKS};
52389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen
52489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen        Uri uri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
52589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen        if (!TextUtils.isEmpty(filter)) {
52689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build();
52789f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen        }
52889f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen
529792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor ret = null;
530792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (async != null) {
531b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            async.startQuery(0, null, uri, cols, null, null, MediaStore.Audio.Artists.ARTIST_KEY);
532792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
533b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            ret = MusicUtils.query(
534b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    this, uri, cols, null, null, MediaStore.Audio.Artists.ARTIST_KEY);
535792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
536792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return ret;
537792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
538b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
539792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    static class ArtistAlbumListAdapter extends SimpleCursorTreeAdapter implements SectionIndexer {
540792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Drawable mNowPlayingOverlay;
541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final BitmapDrawable mDefaultAlbumIcon;
542792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupArtistIdIdx;
543792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupArtistIdx;
544792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupAlbumIdx;
545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mGroupSongIdx;
546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Context mContext;
547792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Resources mResources;
548792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mAlbumSongSeparator;
549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownAlbum;
550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownArtist;
551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final StringBuilder mBuffer = new StringBuilder();
552792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs = new Object[1];
553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs3 = new Object[3];
554792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private MusicAlphabetIndexer mIndexer;
555792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private ArtistAlbumBrowserActivity mActivity;
556792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private AsyncQueryHandler mQueryHandler;
557792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private String mConstraint = null;
558792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private boolean mConstraintIsValid = false;
559b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
560756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen        static class ViewHolder {
561792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line1;
562792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line2;
563792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView play_indicator;
564792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView icon;
565792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
566792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
567792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        class QueryHandler extends AsyncQueryHandler {
568792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            QueryHandler(ContentResolver res) {
569792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super(res);
570792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
571b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
572792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            @Override
573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
574b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                // Log.i("@@@", "query complete");
575792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.init(cursor);
576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
577792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ArtistAlbumListAdapter(Context context, ArtistAlbumBrowserActivity currentactivity,
580b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                Cursor cursor, int glayout, String[] gfrom, int[] gto, int clayout, String[] cfrom,
581b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                int[] cto) {
582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            super(context, cursor, glayout, gfrom, gto, clayout, cfrom, cto);
583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = currentactivity;
584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mQueryHandler = new QueryHandler(context.getContentResolver());
585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
586792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Resources r = context.getResources();
587792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon = (BitmapDrawable) r.getDrawable(R.drawable.albumart_mp_unknown_list);
589792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // no filter or dither, it's a lot faster and we can't tell the difference
590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setFilterBitmap(false);
591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setDither(false);
592b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mContext = context;
594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getColumnIndices(cursor);
595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mResources = context.getResources();
596792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAlbumSongSeparator = context.getString(R.string.albumsongseparator);
597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownAlbum = context.getString(R.string.unknown_album_name);
598792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownArtist = context.getString(R.string.unknown_artist_name);
599792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
600b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
601792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private void getColumnIndices(Cursor cursor) {
602792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != null) {
603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupArtistIdIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID);
604792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mGroupArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST);
605b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                mGroupAlbumIdx =
606b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS);
607b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                mGroupSongIdx =
608b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS);
609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mIndexer != null) {
610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mIndexer.setCursor(cursor);
611792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
612b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    mIndexer = new MusicAlphabetIndexer(cursor, mGroupArtistIdx,
6133d4b2625018856a506a203e046550afd2d9d8a92Marco Nelissen                            mResources.getString(R.string.fast_scroll_alphabet));
614792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
615792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
616792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
617b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
618792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void setActivity(ArtistAlbumBrowserActivity newactivity) {
619792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = newactivity;
620792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
621b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public AsyncQueryHandler getQueryHandler() {
623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mQueryHandler;
624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
626792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
627b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        public View newGroupView(
628b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
629792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            View v = super.newGroupView(context, cursor, isExpanded, parent);
630792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = (ImageView) v.findViewById(R.id.icon);
631792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewGroup.LayoutParams p = iv.getLayoutParams();
632792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            p.width = ViewGroup.LayoutParams.WRAP_CONTENT;
633792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
634792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = new ViewHolder();
635792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1 = (TextView) v.findViewById(R.id.line1);
636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2 = (TextView) v.findViewById(R.id.line2);
637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon = (ImageView) v.findViewById(R.id.icon);
639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setPadding(0, 0, 1, 0);
640792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            v.setTag(vh);
641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return v;
642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
644792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
645b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        public View newChildView(
646b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                Context context, Cursor cursor, boolean isLastChild, ViewGroup parent) {
647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            View v = super.newChildView(context, cursor, isLastChild, parent);
648792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = new ViewHolder();
649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1 = (TextView) v.findViewById(R.id.line1);
650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2 = (TextView) v.findViewById(R.id.line2);
651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon = (ImageView) v.findViewById(R.id.icon);
653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setBackgroundDrawable(mDefaultAlbumIcon);
654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.icon.setPadding(0, 0, 1, 0);
655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            v.setTag(vh);
656792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return v;
657792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
658b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
659792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
660792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindGroupView(View view, Context context, Cursor cursor, boolean isexpanded) {
661792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
662792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
663792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String artist = cursor.getString(mGroupArtistIdx);
664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayartist = artist;
665f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen            boolean unknown = artist == null || artist.equals(MediaStore.UNKNOWN_STRING);
666792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
667792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayartist = mUnknownArtist;
668792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
669792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayartist);
670792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
671792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numalbums = cursor.getInt(mGroupAlbumIdx);
672792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            int numsongs = cursor.getInt(mGroupSongIdx);
673b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
674b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            String songs_albums = MusicUtils.makeAlbumsLabel(context, numalbums, numsongs, unknown);
675b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
676792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(songs_albums);
677b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
678bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentartistid = MusicUtils.getCurrentArtistId();
679bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long artistid = cursor.getLong(mGroupArtistIdIdx);
680792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentartistid == artistid && !isexpanded) {
681792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                vh.play_indicator.setImageDrawable(mNowPlayingOverlay);
682792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
683792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                vh.play_indicator.setImageDrawable(null);
684792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
685792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
686792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
687792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
688792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindChildView(View view, Context context, Cursor cursor, boolean islast) {
689792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
690792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
691b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            String name =
692b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
693792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayname = name;
694b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            boolean unknown = name == null || name.equals(MediaStore.UNKNOWN_STRING);
695792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
696792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayname = mUnknownAlbum;
697792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
698792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayname);
699792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
700b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            int numsongs = cursor.getInt(
701b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
702b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            int numartistsongs = cursor.getInt(cursor.getColumnIndexOrThrow(
703b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST));
704792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
705792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            final StringBuilder builder = mBuffer;
706792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            builder.delete(0, builder.length());
707792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
708792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                numsongs = numartistsongs;
709792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
710b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
711792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (numsongs == 1) {
712792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                builder.append(context.getString(R.string.onesong));
713792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
714792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (numsongs == numartistsongs) {
715792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    final Object[] args = mFormatArgs;
716792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[0] = numsongs;
717792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    builder.append(mResources.getQuantityString(R.plurals.Nsongs, numsongs, args));
718792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
719792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    final Object[] args = mFormatArgs3;
720792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[0] = numsongs;
721792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    args[1] = numartistsongs;
722b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    args[2] = cursor.getString(
723b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                            cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
724b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    builder.append(
725b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                            mResources.getQuantityString(R.plurals.Nsongscomp, numsongs, args));
726792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
727792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
728792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(builder.toString());
729b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
730792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = vh.icon;
731792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // We don't actually need the path to the thumbnail file,
732792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // we just use it to see if there is album art or not
733b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            String art = cursor.getString(
734b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART));
735792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown || art == null || art.length() == 0) {
736792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setBackgroundDrawable(mDefaultAlbumIcon);
737792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
738792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
739bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long artIndex = cursor.getLong(0);
740792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Drawable d = MusicUtils.getCachedArtwork(context, artIndex, mDefaultAlbumIcon);
741792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(d);
742792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
743792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
744bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentalbumid = MusicUtils.getCurrentAlbumId();
745bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long aid = cursor.getLong(0);
746792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            iv = vh.play_indicator;
747792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentalbumid == aid) {
748792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(mNowPlayingOverlay);
749792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
750792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
751792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
752792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
753792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
754792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
755792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        protected Cursor getChildrenCursor(Cursor groupCursor) {
756b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            long id = groupCursor.getLong(
757b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    groupCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
758b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
759b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            String[] cols = new String[] {MediaStore.Audio.Albums._ID,
760b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.NUMBER_OF_SONGS,
761792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MediaStore.Audio.Albums.NUMBER_OF_SONGS_FOR_ARTIST,
762b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    MediaStore.Audio.Albums.ALBUM_ART};
763792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = MusicUtils.query(mActivity,
764b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    MediaStore.Audio.Artists.Albums.getContentUri("external", id), cols, null, null,
765b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
766b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
767792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            class MyCursorWrapper extends CursorWrapper {
768792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String mArtistName;
769792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                int mMagicColumnIdx;
770792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MyCursorWrapper(Cursor c, String artist) {
771792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    super(c);
772792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mArtistName = artist;
773f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen                    if (mArtistName == null || mArtistName.equals(MediaStore.UNKNOWN_STRING)) {
774792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        mArtistName = mUnknownArtist;
775792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
776792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mMagicColumnIdx = c.getColumnCount();
777792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
778b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
779792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
780792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public String getString(int columnIndex) {
781792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (columnIndex != mMagicColumnIdx) {
782792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return super.getString(columnIndex);
783792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
784792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return mArtistName;
785792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
786b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
787792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
788792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public int getColumnIndexOrThrow(String name) {
7896a9c41ccabded4f0d25288ad98788a1994824bb7The Android Open Source Project                    if (MediaStore.Audio.Albums.ARTIST.equals(name)) {
790792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return mMagicColumnIdx;
791792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
792b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    return super.getColumnIndexOrThrow(name);
793792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
794b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
795792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
796792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public String getColumnName(int idx) {
797792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (idx != mMagicColumnIdx) {
798792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        return super.getColumnName(idx);
799792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
800792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return MediaStore.Audio.Albums.ARTIST;
801792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
802b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
803792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                @Override
804792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                public int getColumnCount() {
805792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    return super.getColumnCount() + 1;
806792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
807792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
808792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return new MyCursorWrapper(c, groupCursor.getString(mGroupArtistIdx));
809792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
810792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
811792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
812792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void changeCursor(Cursor cursor) {
813d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen            if (mActivity.isFinishing() && cursor != null) {
814d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor.close();
815d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor = null;
8160e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            }
817792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != mActivity.mArtistCursor) {
818792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.mArtistCursor = cursor;
819792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getColumnIndices(cursor);
820792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super.changeCursor(cursor);
821792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
822792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
823b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
824792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
825792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
826792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String s = constraint.toString();
827b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            if (mConstraintIsValid && ((s == null && mConstraint == null)
828b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                              || (s != null && s.equals(mConstraint)))) {
829792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return getCursor();
830792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
831792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = mActivity.getArtistCursor(null, s);
832792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraint = s;
833792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraintIsValid = true;
834792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return c;
835792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
836792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
837792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Object[] getSections() {
838792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getSections();
839792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
840b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
841792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getPositionForSection(int sectionIndex) {
842792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getPositionForSection(sectionIndex);
843792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
844b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
845792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getSectionForPosition(int position) {
846792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return 0;
847792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
848792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
849b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
850792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor mArtistCursor;
851ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
852ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    public void onServiceConnected(ComponentName name, IBinder service) {
853ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.updateNowPlaying(this);
854ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    }
855ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
856ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    public void onServiceDisconnected(ComponentName name) {
857ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        finish();
858ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    }
859792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project}
860