1792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/*
2792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *
4792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * you may not use this file except in compliance with the License.
6792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * You may obtain a copy of the License at
7792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *
8792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project *
10792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * See the License for the specific language governing permissions and
14792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * limitations under the License.
15792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */
16792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
17792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpackage com.android.music;
18792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
19f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissenimport com.android.music.MusicUtils.ServiceToken;
20f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen
21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.ListActivity;
22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.SearchManager;
23792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.AsyncQueryHandler;
24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver;
25ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ComponentName;
26792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ContentResolver;
27792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context;
28792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent;
29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.IntentFilter;
30ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.content.ServiceConnection;
31792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.res.Resources;
32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.database.Cursor;
33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.Bitmap;
34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.BitmapFactory;
35792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.BitmapDrawable;
36792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.drawable.Drawable;
37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager;
38792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.net.Uri;
39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Bundle;
40792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler;
41ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.os.IBinder;
42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message;
43792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore;
4489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissenimport android.text.TextUtils;
459882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissenimport android.util.Log;
46792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu;
47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Menu;
48792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem;
49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.SubMenu;
50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.View;
51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewGroup;
52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Window;
53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo;
54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.Adapter;
55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.AlphabetIndexer;
56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.CursorAdapter;
57ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissenimport android.widget.ExpandableListView;
58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView;
59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ListAdapter;
60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ListView;
61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SectionIndexer;
62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SimpleCursorAdapter;
63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView;
64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.AdapterView.AdapterContextMenuInfo;
65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport java.text.Collator;
67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class AlbumBrowserActivity extends ListActivity
69b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        implements View.OnCreateContextMenuListener, MusicUtils.Defs, ServiceConnection {
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 AlbumListAdapter 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
82b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He    public AlbumBrowserActivity() {}
83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    /** Called when the activity is first created. */
85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
86b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He    public void onCreate(Bundle icicle) {
87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (icicle != null) {
88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mCurrentAlbumId = icicle.getString("selectedalbum");
89792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistId = icicle.getString("artist");
90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mArtistId = getIntent().getStringExtra("artist");
92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreate(icicle);
94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
95ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        requestWindowFeature(Window.FEATURE_NO_TITLE);
96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setVolumeControlStream(AudioManager.STREAM_MUSIC);
97f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen        mToken = MusicUtils.bindToService(this, this);
98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addDataScheme("file");
104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mScanListener, f);
105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setContentView(R.layout.media_picker_activity);
107ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.updateButtonBar(this, R.id.albumtab);
108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        ListView lv = getListView();
109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setOnCreateContextMenuListener(this);
110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        lv.setTextFilterEnabled(true);
111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter = (AlbumListAdapter) getLastNonConfigurationInstance();
113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mAdapter == null) {
114b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            // Log.i("@@@", "starting query");
115b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            mAdapter = new AlbumListAdapter(getApplication(), this, R.layout.track_list_item,
116b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    mAlbumCursor, new String[] {}, new int[] {});
117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setListAdapter(mAdapter);
118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setTitle(R.string.working_albums);
119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getAlbumCursor(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            mAlbumCursor = mAdapter.getCursor();
124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (mAlbumCursor != null) {
125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                init(mAlbumCursor);
126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getAlbumCursor(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("artist", mArtistId);
145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onSaveInstanceState(outcicle);
146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onDestroy() {
150ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        ListView lv = getListView();
1519e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        if (lv != null) {
1529e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen            mLastListPosCourse = lv.getFirstVisiblePosition();
15323b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            View cv = lv.getChildAt(0);
15423b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            if (cv != null) {
15523b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen                mLastListPosFine = cv.getTop();
15623b531ec31c406f96fca82bfb9b04e26d05187b4Marco Nelissen            }
1579e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        }
158f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen        MusicUtils.unbindFromService(mToken);
1590e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // If we have an adapter and didn't send it off to another activity yet, we should
1600e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // close its cursor, which we do by assigning a null cursor to it. Doing this
1610e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // instead of closing the cursor directly keeps the framework from accessing
1620e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen        // the closed cursor later.
1638e732ffd92d538aaa9376b560b0ff2fc5ac78c43Marco Nelissen        if (!mAdapterSent && mAdapter != null) {
1640e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            mAdapter.changeCursor(null);
165792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
1660164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // Because we pass the adapter to the next activity, we need to make
1670164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // sure it doesn't keep a reference to this activity. We can do this
1680164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        // by clearing its DatasetObservers, which setListAdapter(null) does.
1690164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        setListAdapter(null);
1700164ebfdcf374bc2b65e7c86d02b597059c25e44Marco Nelissen        mAdapter = null;
171792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mScanListener);
172792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onDestroy();
173792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
174b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
175792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onResume() {
177792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onResume();
178792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        IntentFilter f = new IntentFilter();
179792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.META_CHANGED);
180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        f.addAction(MediaPlaybackService.QUEUE_CHANGED);
181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        registerReceiver(mTrackListListener, f);
182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mTrackListListener.onReceive(null, null);
183792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.setSpinnerState(this);
185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mTrackListListener = new BroadcastReceiver() {
188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getListView().invalidateViews();
191ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            MusicUtils.updateNowPlaying(AlbumBrowserActivity.this);
192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private BroadcastReceiver mScanListener = new BroadcastReceiver() {
195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void onReceive(Context context, Intent intent) {
197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.setSpinnerState(AlbumBrowserActivity.this);
198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessage(0);
199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.clearAlbumArtCache();
201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
203792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
204b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Handler mReScanHandler = new Handler() {
206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void handleMessage(Message msg) {
20842bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            if (mAdapter != null) {
20942bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen                getAlbumCursor(mAdapter.getQueryHandler(), null);
21042bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            }
211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    };
213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onPause() {
216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        unregisterReceiver(mTrackListListener);
217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mReScanHandler.removeCallbacksAndMessages(null);
218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onPause();
219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
221792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void init(Cursor c) {
22242bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        if (mAdapter == null) {
22342bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen            return;
22442bcc218ce4c330cc609326d168e288f3559c64fMarco Nelissen        }
225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAdapter.changeCursor(c); // also sets mAlbumCursor
226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mAlbumCursor == null) {
228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            MusicUtils.displayDatabaseError(this);
229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            closeContextMenu();
230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mReScanHandler.sendEmptyMessageDelayed(0, 1000);
231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return;
232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
233ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
234ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        // restore previous position
235ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        if (mLastListPosCourse >= 0) {
236ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            getListView().setSelectionFromTop(mLastListPosCourse, mLastListPosFine);
237ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            mLastListPosCourse = -1;
238ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        }
239ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.hideDatabaseError(this);
2419e0f1fde0956ee7f5b76b77df7aea9b936e2c3a9Marco Nelissen        MusicUtils.updateButtonBar(this, R.id.albumtab);
242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        setTitle();
243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private void setTitle() {
246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        CharSequence fancyName = "";
247792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mAlbumCursor != null && mAlbumCursor.getCount() > 0) {
248792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAlbumCursor.moveToFirst();
2499165ac8d0d4f9c90d9b190b837a90fec3a0c0c0dMarco Nelissen            fancyName = mAlbumCursor.getString(
2509165ac8d0d4f9c90d9b190b837a90fec3a0c0c0dMarco Nelissen                    mAlbumCursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST));
251f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen            if (fancyName == null || fancyName.equals(MediaStore.UNKNOWN_STRING))
252792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                fancyName = getText(R.string.unknown_artist_name);
253792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
255792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mArtistId != null && fancyName != null)
256792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setTitle(fancyName);
257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        else
258792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            setTitle(R.string.albums_title);
259792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
2609882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen
261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        MusicUtils.makePlaylistMenu(this, sub);
266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn;
269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mAlbumCursor.moveToPosition(mi.position);
270b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        mCurrentAlbumId = mAlbumCursor.getString(
271b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
272b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        mCurrentAlbumName = mAlbumCursor.getString(
273b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        mCurrentArtistNameForAlbum = mAlbumCursor.getString(
275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST));
276b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        mIsUnknownArtist = mCurrentArtistNameForAlbum == null
277b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                || mCurrentArtistNameForAlbum.equals(MediaStore.UNKNOWN_STRING);
278b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        mIsUnknownAlbum =
279b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                mCurrentAlbumName == null || mCurrentAlbumName.equals(MediaStore.UNKNOWN_STRING);
2809882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        if (mIsUnknownAlbum) {
281c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            menu.setHeaderTitle(getString(R.string.unknown_album_name));
282c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer        } else {
283c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer            menu.setHeaderTitle(mCurrentAlbumName);
284c8aa837a48287ad94ee0dcacb525b420a908a06dEric Fischer        }
2859882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        if (!mIsUnknownAlbum || !mIsUnknownArtist) {
2869882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            menu.add(0, SEARCH, 0, R.string.search_title);
2879882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        }
288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
290792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
291792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
293792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAY_SELECTION: {
294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                // play the selected album
295b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
296792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.playAll(this, list, 0);
297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
298792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case QUEUE: {
301b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
302792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToCurrentPlaylist(this, list);
303792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
304792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST: {
307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, CreatePlaylist.class);
309792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, NEW_PLAYLIST);
310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case PLAYLIST_SELECTED: {
314b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
315bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                long playlist = item.getIntent().getLongExtra("playlist", 0);
316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                MusicUtils.addToPlaylist(this, list, playlist);
317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case DELETE_ITEM: {
320b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                long[] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
321ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                String f;
322ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                if (android.os.Environment.isExternalStorageRemovable()) {
323ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    f = getString(R.string.delete_album_desc);
324ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                } else {
325ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                    f = getString(R.string.delete_album_desc_nosdcard);
326ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer                }
327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                String desc = String.format(f, mCurrentAlbumName);
328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Bundle b = new Bundle();
329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                b.putString("description", desc);
330bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                b.putLongArray("items", list);
331792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                Intent intent = new Intent();
332792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.setClass(this, DeleteItems.class);
333792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                intent.putExtras(b);
334792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                startActivityForResult(intent, -1);
335792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SEARCH:
338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                doSearch();
339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onContextItemSelected(item);
342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
343792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
344792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    void doSearch() {
345792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        CharSequence title = null;
3469882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        String query = "";
347b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent i = new Intent();
349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
3504341b5006cffbbd016688d4533f6de68d9d4c49bMarco Nelissen        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
351b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
3529882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        title = "";
3539882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        if (!mIsUnknownAlbum) {
3549882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            query = mCurrentAlbumName;
3559882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
3569882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            title = mCurrentAlbumName;
3579882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        }
358b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        if (!mIsUnknownArtist) {
3599882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            query = query + " " + mCurrentArtistNameForAlbum;
3609882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
3619882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen            title = title + " " + mCurrentArtistNameForAlbum;
3629882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        }
3639882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        // Since we hide the 'search' menu item when both album and artist are
3649882f540844f6a613eeb5edf5f076d1dcc72bf9fMarco Nelissen        // unknown, the query and title strings will have at least one of those.
365792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
366792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        title = getString(R.string.mediasearch, title);
367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        i.putExtra(SearchManager.QUERY, query);
368792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
369792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(Intent.createChooser(i, title));
370792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
371792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
372792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
373792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
374792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (requestCode) {
375792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SCAN_DONE:
376792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_CANCELED) {
377792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    finish();
378792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
379792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    getAlbumCursor(mAdapter.getQueryHandler(), null);
380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
383792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case NEW_PLAYLIST:
384792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (resultCode == RESULT_OK) {
385792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    Uri uri = intent.getData();
386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    if (uri != null) {
387b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        long[] list = MusicUtils.getSongListForAlbum(
388b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                this, Long.parseLong(mCurrentAlbumId));
389b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        MusicUtils.addToPlaylist(
390b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                this, list, Long.parseLong(uri.getLastPathSegment()));
391792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    }
392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                break;
394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
398b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He    protected void onListItemClick(ListView l, View v, int position, long id) {
399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent = new Intent(Intent.ACTION_PICK);
400792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
401792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.putExtra("album", Long.valueOf(id).toString());
402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        intent.putExtra("artist", mArtistId);
403792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        startActivity(intent);
404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        super.onCreateOptionsMenu(menu);
409b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        menu.add(0, PARTY_SHUFFLE, 0,
410b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu()
411792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        menu.add(0, SHUFFLE_ALL, 0, R.string.shuffle_all).setIcon(R.drawable.ic_menu_shuffle);
412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return true;
413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
414792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
416792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
417ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.setPartyShuffleMenuIcon(menu);
418792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onPrepareOptionsMenu(menu);
419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
420792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    @Override
422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Intent intent;
424792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor cursor;
425792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        switch (item.getItemId()) {
426ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen            case PARTY_SHUFFLE:
427ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen                MusicUtils.togglePartyShuffle();
428ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen                break;
429792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
430792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            case SHUFFLE_ALL:
431792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                cursor = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
432b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        new String[] {MediaStore.Audio.Media._ID},
433792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.IS_MUSIC + "=1", null,
434792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                        MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
435792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (cursor != null) {
436792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    MusicUtils.shuffleAll(this, cursor);
437792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    cursor.close();
438792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
439792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return true;
440792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
441792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return super.onOptionsItemSelected(item);
442792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
443792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor getAlbumCursor(AsyncQueryHandler async, String filter) {
445b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        String[] cols = new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ARTIST,
446b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ALBUM_ART};
44789f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen
448792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        Cursor ret = null;
449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        if (mArtistId != null) {
450b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            Uri uri = MediaStore.Audio.Artists.Albums.getContentUri(
451b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    "external", Long.valueOf(mArtistId));
45289f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            if (!TextUtils.isEmpty(filter)) {
45389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen                uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build();
45489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            }
455792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (async != null) {
456b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                async.startQuery(
457b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        0, null, uri, cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
458792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
459b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                ret = MusicUtils.query(
460b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        this, uri, cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
462792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        } else {
46389f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
46489f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            if (!TextUtils.isEmpty(filter)) {
46589f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen                uri = uri.buildUpon().appendQueryParameter("filter", Uri.encode(filter)).build();
46689f6c66505717689d9ea3f3d8e81709616b3e588Marco Nelissen            }
467792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (async != null) {
468b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                async.startQuery(
469b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        0, null, uri, cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
471b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                ret = MusicUtils.query(
472b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                        this, uri, cols, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
475792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        return ret;
476792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
477b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
478792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    static class AlbumListAdapter extends SimpleCursorAdapter implements SectionIndexer {
479792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Drawable mNowPlayingOverlay;
480792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final BitmapDrawable mDefaultAlbumIcon;
481792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mAlbumIdx;
482792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mArtistIdx;
483792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private int mAlbumArtIndex;
484792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Resources mResources;
485792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final StringBuilder mStringBuilder = new StringBuilder();
486792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownAlbum;
487792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mUnknownArtist;
488792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final String mAlbumSongSeparator;
489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private final Object[] mFormatArgs = new Object[1];
490792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private AlphabetIndexer mIndexer;
491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private AlbumBrowserActivity mActivity;
492792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private AsyncQueryHandler mQueryHandler;
493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private String mConstraint = null;
494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private boolean mConstraintIsValid = false;
495b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
496756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen        static class ViewHolder {
497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line1;
498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            TextView line2;
499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView play_indicator;
500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView icon;
501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
503792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        class QueryHandler extends AsyncQueryHandler {
504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            QueryHandler(ContentResolver res) {
505792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super(res);
506792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
507b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
508792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            @Override
509792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
510b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                // Log.i("@@@", "query complete");
511792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.init(cursor);
512792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
514792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
515b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He        AlbumListAdapter(Context context, AlbumBrowserActivity currentactivity, int layout,
516b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                Cursor cursor, String[] from, int[] to) {
517792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            super(context, layout, cursor, from, to);
518792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
519792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = currentactivity;
520792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mQueryHandler = new QueryHandler(context.getContentResolver());
521b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
522792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownAlbum = context.getString(R.string.unknown_album_name);
523792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mUnknownArtist = context.getString(R.string.unknown_artist_name);
524792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mAlbumSongSeparator = context.getString(R.string.albumsongseparator);
525792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
526792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Resources r = context.getResources();
527792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
528792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
529792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Bitmap b = BitmapFactory.decodeResource(r, R.drawable.albumart_mp_unknown_list);
5305df7af3460fe05fb8ceea426b90286b7bafd9827Marco Nelissen            mDefaultAlbumIcon = new BitmapDrawable(context.getResources(), b);
531792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // no filter or dither, it's a lot faster and we can't tell the difference
532792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setFilterBitmap(false);
533792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mDefaultAlbumIcon.setDither(false);
534792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            getColumnIndices(cursor);
535792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mResources = context.getResources();
536792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
537792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
538792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        private void getColumnIndices(Cursor cursor) {
539792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != null) {
540792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM);
541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST);
542792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mAlbumArtIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART);
543b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
544792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                if (mIndexer != null) {
545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                    mIndexer.setCursor(cursor);
546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                } else {
547b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                    mIndexer = new MusicAlphabetIndexer(
548b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                            cursor, mAlbumIdx, mResources.getString(R.string.fast_scroll_alphabet));
549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                }
550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
552b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void setActivity(AlbumBrowserActivity newactivity) {
554792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mActivity = newactivity;
555792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
556b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
557792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public AsyncQueryHandler getQueryHandler() {
558792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mQueryHandler;
559792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
560792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
561792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
562792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public View newView(Context context, Cursor cursor, ViewGroup parent) {
563b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            View v = super.newView(context, cursor, parent);
564b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            ViewHolder vh = new ViewHolder();
565b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            vh.line1 = (TextView) v.findViewById(R.id.line1);
566b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            vh.line2 = (TextView) v.findViewById(R.id.line2);
567b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
568b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            vh.icon = (ImageView) v.findViewById(R.id.icon);
569b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            vh.icon.setBackgroundDrawable(mDefaultAlbumIcon);
570b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            vh.icon.setPadding(0, 0, 1, 0);
571b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            v.setTag(vh);
572b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            return v;
573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
574792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
575792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void bindView(View view, Context context, Cursor cursor) {
577792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ViewHolder vh = (ViewHolder) view.getTag();
578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String name = cursor.getString(mAlbumIdx);
580792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String displayname = name;
581b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            boolean unknown = name == null || name.equals(MediaStore.UNKNOWN_STRING);
582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown) {
583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayname = mUnknownAlbum;
584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line1.setText(displayname);
586b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
587792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            name = cursor.getString(mArtistIdx);
588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            displayname = name;
589f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen            if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                displayname = mUnknownArtist;
591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
592792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            vh.line2.setText(displayname);
593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            ImageView iv = vh.icon;
595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // We don't actually need the path to the thumbnail file,
596792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            // we just use it to see if there is album art or not
597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String art = cursor.getString(mAlbumArtIndex);
598bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long aid = cursor.getLong(0);
599792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (unknown || art == null || art.length() == 0) {
600792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
601792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
602bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen                Drawable d = MusicUtils.getCachedArtwork(context, aid, mDefaultAlbumIcon);
603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(d);
604792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
605b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
606bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen            long currentalbumid = MusicUtils.getCurrentAlbumId();
607792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            iv = vh.play_indicator;
608792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (currentalbumid == aid) {
609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(mNowPlayingOverlay);
610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            } else {
611792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                iv.setImageDrawable(null);
612792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
613792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
614b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
615792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
616792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public void changeCursor(Cursor cursor) {
617d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen            if (mActivity.isFinishing() && cursor != null) {
618d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor.close();
619d99bc1e9481c68514a4e5eea4c3f429843b701b4Marco Nelissen                cursor = null;
6200e17578179270916b49a7b7c3bc5b7b106dcd22cMarco Nelissen            }
621792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            if (cursor != mActivity.mAlbumCursor) {
622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                mActivity.mAlbumCursor = cursor;
623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                getColumnIndices(cursor);
624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                super.changeCursor(cursor);
625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
626792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
627b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
628792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        @Override
629792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
630792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            String s = constraint.toString();
631b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He            if (mConstraintIsValid && ((s == null && mConstraint == null)
632b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He                                              || (s != null && s.equals(mConstraint)))) {
633792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project                return getCursor();
634792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            }
635792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            Cursor c = mActivity.getAlbumCursor(null, s);
636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraint = s;
637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            mConstraintIsValid = true;
638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return c;
639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
640b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public Object[] getSections() {
642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getSections();
643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
644b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
645792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getPositionForSection(int section) {
646792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return mIndexer.getPositionForSection(section);
647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
648b0fba8b212a649f41c7cad4c9e7c33e94ca29bb0Jack He
649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        public int getSectionForPosition(int position) {
650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project            return 0;
651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project        }
652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    }
653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project
654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private Cursor mAlbumCursor;
655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project    private String mArtistId;
656ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
657ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    public void onServiceConnected(ComponentName name, IBinder service) {
658ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        MusicUtils.updateNowPlaying(this);
659ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    }
660ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen
661ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    public void onServiceDisconnected(ComponentName name) {
662ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen        finish();
663ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen    }
664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project}
665