5 package com.andrew.apollo.grid.fragments;
\r
7 import android.content.BroadcastReceiver;
\r
8 import android.content.Context;
\r
9 import android.content.Intent;
\r
10 import android.content.IntentFilter;
\r
11 import android.database.Cursor;
\r
12 import android.net.Uri;
\r
13 import android.os.AsyncTask;
\r
14 import android.os.Bundle;
\r
15 import android.provider.BaseColumns;
\r
16 import android.provider.MediaStore.Audio;
\r
17 import android.provider.MediaStore.Audio.AlbumColumns;
\r
18 import android.support.v4.app.Fragment;
\r
19 import android.support.v4.app.LoaderManager.LoaderCallbacks;
\r
20 import android.support.v4.content.CursorLoader;
\r
21 import android.support.v4.content.Loader;
\r
22 import android.view.ContextMenu;
\r
23 import android.view.ContextMenu.ContextMenuInfo;
\r
24 import android.view.LayoutInflater;
\r
25 import android.view.MenuItem;
\r
26 import android.view.View;
\r
27 import android.view.ViewGroup;
\r
28 import android.widget.AdapterView;
\r
29 import android.widget.AdapterView.OnItemClickListener;
\r
30 import android.widget.GridView;
\r
31 import android.widget.ImageView;
\r
32 import android.widget.TextView;
\r
34 import com.andrew.apollo.R;
\r
35 import com.andrew.apollo.activities.TracksBrowser;
\r
36 import com.andrew.apollo.adapters.AlbumAdapter;
\r
37 import com.andrew.apollo.service.ApolloService;
\r
38 import com.andrew.apollo.tasks.GetCachedImages;
\r
39 import com.andrew.apollo.tasks.LastfmGetAlbumImages;
\r
40 import com.andrew.apollo.utils.ApolloUtils;
\r
41 import com.andrew.apollo.utils.MusicUtils;
\r
43 import static com.andrew.apollo.Constants.ALBUM_IMAGE;
\r
44 import static com.andrew.apollo.Constants.ALBUM_KEY;
\r
45 import static com.andrew.apollo.Constants.ARTIST_KEY;
\r
46 import static com.andrew.apollo.Constants.INTENT_ADD_TO_PLAYLIST;
\r
47 import static com.andrew.apollo.Constants.INTENT_PLAYLIST_LIST;
\r
48 import static com.andrew.apollo.Constants.MIME_TYPE;
\r
49 import static com.andrew.apollo.Constants.UP_STARTS_ALBUM_ACTIVITY;
\r
52 * @author Andrew Neal
\r
54 public class AlbumsFragment extends Fragment implements LoaderCallbacks<Cursor>,
\r
55 OnItemClickListener {
\r
58 private AlbumAdapter mAlbumAdapter;
\r
61 private GridView mGridView;
\r
64 private Cursor mCursor;
\r
67 private final int PLAY_SELECTION = 3;
\r
69 private final int ADD_TO_PLAYLIST = 4;
\r
71 private final int SEARCH = 5;
\r
74 private String mCurrentAlbumId;
\r
77 public static int mAlbumIdIndex, mAlbumNameIndex, mArtistNameIndex;
\r
80 public AlbumsFragment() {
\r
83 public AlbumsFragment(Bundle args) {
\r
88 public void onActivityCreated(Bundle savedInstanceState) {
\r
89 super.onActivityCreated(savedInstanceState);
\r
91 mAlbumAdapter = new AlbumAdapter(getActivity(), R.layout.gridview_items, null,
\r
92 new String[] {}, new int[] {}, 0);
\r
93 mGridView.setOnCreateContextMenuListener(this);
\r
94 mGridView.setOnItemClickListener(this);
\r
95 mGridView.setTextFilterEnabled(true);
\r
96 mGridView.setAdapter(mAlbumAdapter);
\r
99 getLoaderManager().initLoader(0, null, this);
\r
103 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
\r
104 View root = inflater.inflate(R.layout.gridview, container, false);
\r
105 mGridView = (GridView)root.findViewById(R.id.gridview);
\r
110 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
\r
111 String[] projection = {
\r
112 BaseColumns._ID, AlbumColumns.ALBUM, AlbumColumns.ARTIST, AlbumColumns.ALBUM_ART
\r
114 Uri uri = Audio.Albums.EXTERNAL_CONTENT_URI;
\r
115 String sortOrder = Audio.Albums.DEFAULT_SORT_ORDER;
\r
116 return new CursorLoader(getActivity(), uri, projection, null, null, sortOrder);
\r
120 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
\r
121 // Check for database errors
\r
122 if (data == null) {
\r
126 mAlbumIdIndex = data.getColumnIndexOrThrow(BaseColumns._ID);
\r
127 mAlbumNameIndex = data.getColumnIndexOrThrow(AlbumColumns.ALBUM);
\r
128 mArtistNameIndex = data.getColumnIndexOrThrow(AlbumColumns.ARTIST);
\r
129 mAlbumAdapter.changeCursor(data);
\r
134 public void onLoaderReset(Loader<Cursor> loader) {
\r
135 if (mAlbumAdapter != null)
\r
136 mAlbumAdapter.changeCursor(null);
\r
140 public void onSaveInstanceState(Bundle outState) {
\r
141 outState.putAll(getArguments() != null ? getArguments() : new Bundle());
\r
142 super.onSaveInstanceState(outState);
\r
146 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
\r
151 * Update the list as needed
\r
153 private final BroadcastReceiver mMediaStatusReceiver = new BroadcastReceiver() {
\r
156 public void onReceive(Context context, Intent intent) {
\r
157 if (mGridView != null) {
\r
158 mAlbumAdapter.notifyDataSetChanged();
\r
165 public void onStart() {
\r
167 IntentFilter filter = new IntentFilter();
\r
168 filter.addAction(ApolloService.META_CHANGED);
\r
169 filter.addAction(ApolloService.PLAYSTATE_CHANGED);
\r
170 getActivity().registerReceiver(mMediaStatusReceiver, filter);
\r
174 public void onStop() {
\r
175 getActivity().unregisterReceiver(mMediaStatusReceiver);
\r
183 private void tracksBrowser(long id) {
\r
185 String artistName = mCursor.getString(mArtistNameIndex);
\r
186 String albumName = mCursor.getString(mAlbumNameIndex);
\r
188 Bundle bundle = new Bundle();
\r
189 bundle.putString(MIME_TYPE, Audio.Albums.CONTENT_TYPE);
\r
190 bundle.putString(ARTIST_KEY, artistName);
\r
191 bundle.putString(ALBUM_KEY, albumName);
\r
192 bundle.putLong(BaseColumns._ID, id);
\r
193 bundle.putBoolean(UP_STARTS_ALBUM_ACTIVITY, true);
\r
195 Intent intent = new Intent(Intent.ACTION_VIEW);
\r
196 intent.setClass(getActivity(), TracksBrowser.class);
\r
197 intent.putExtras(bundle);
\r
198 getActivity().startActivity(intent);
\r
202 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
\r
203 menu.add(0, PLAY_SELECTION, 0, getResources().getString(R.string.play_all));
\r
204 menu.add(0, ADD_TO_PLAYLIST, 0, getResources().getString(R.string.add_to_playlist));
\r
205 menu.add(0, SEARCH, 0, getResources().getString(R.string.search));
\r
207 mCurrentAlbumId = mCursor.getString(mCursor.getColumnIndexOrThrow(BaseColumns._ID));
\r
209 menu.setHeaderView(setHeaderLayout());
\r
210 super.onCreateContextMenu(menu, v, menuInfo);
\r
214 public boolean onContextItemSelected(MenuItem item) {
\r
215 switch (item.getItemId()) {
\r
216 case PLAY_SELECTION: {
\r
217 long[] list = MusicUtils.getSongListForAlbum(getActivity(),
\r
218 Long.parseLong(mCurrentAlbumId));
\r
219 MusicUtils.playAll(getActivity(), list, 0);
\r
222 case ADD_TO_PLAYLIST: {
\r
223 Intent intent = new Intent(INTENT_ADD_TO_PLAYLIST);
\r
224 long[] list = MusicUtils.getSongListForAlbum(getActivity(),
\r
225 Long.parseLong(mCurrentAlbumId));
\r
226 intent.putExtra(INTENT_PLAYLIST_LIST, list);
\r
227 getActivity().startActivity(intent);
\r
231 MusicUtils.doSearch(getActivity(), mCursor, mAlbumNameIndex);
\r
237 return super.onContextItemSelected(item);
\r
241 * @return A custom ContextMenu header
\r
243 public View setHeaderLayout() {
\r
245 String albumName = mCursor.getString(mAlbumNameIndex);
\r
247 String artistName = mCursor.getString(mArtistNameIndex);
\r
249 // Inflate the header View
\r
250 LayoutInflater inflater = getActivity().getLayoutInflater();
\r
251 View header = inflater.inflate(R.layout.context_menu_header, null, false);
\r
254 ImageView headerImage = (ImageView)header.findViewById(R.id.header_image);
\r
256 // Only download images we don't already have
\r
257 if (ApolloUtils.getImageURL(albumName, ALBUM_IMAGE, getActivity()) == null)
\r
258 new LastfmGetAlbumImages(getActivity(), null, 0).executeOnExecutor(
\r
259 AsyncTask.THREAD_POOL_EXECUTOR, artistName, albumName);
\r
261 // Get and set cached image
\r
262 new GetCachedImages(getActivity(), 1, headerImage).executeOnExecutor(
\r
263 AsyncTask.THREAD_POOL_EXECUTOR, albumName);
\r
266 TextView headerText = (TextView)header.findViewById(R.id.header_text);
\r
267 headerText.setText(albumName);
\r
268 headerText.setBackgroundColor(getResources().getColor(R.color.transparent_black));
\r