OSDN Git Service

1cc7d78372f07e810edcf47fa5b4815797f36fbc
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / grid / fragments / AlbumsFragment.java
1 /**\r
2  * \r
3  */\r
4 \r
5 package com.andrew.apollo.grid.fragments;\r
6 \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
33 \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
42 \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
50 \r
51 /**\r
52  * @author Andrew Neal\r
53  */\r
54 public class AlbumsFragment extends Fragment implements LoaderCallbacks<Cursor>,\r
55         OnItemClickListener {\r
56 \r
57     // Adapter\r
58     private AlbumAdapter mAlbumAdapter;\r
59 \r
60     // GridView\r
61     private GridView mGridView;\r
62 \r
63     // Cursor\r
64     private Cursor mCursor;\r
65 \r
66     // Options\r
67     private final int PLAY_SELECTION = 3;\r
68 \r
69     private final int ADD_TO_PLAYLIST = 4;\r
70 \r
71     private final int SEARCH = 5;\r
72 \r
73     // Album ID\r
74     private String mCurrentAlbumId;\r
75 \r
76     // Audio columns\r
77     public static int mAlbumIdIndex, mAlbumNameIndex, mArtistNameIndex;\r
78 \r
79     // Bundle\r
80     public AlbumsFragment() {\r
81     }\r
82 \r
83     public AlbumsFragment(Bundle args) {\r
84         setArguments(args);\r
85     }\r
86 \r
87     @Override\r
88     public void onActivityCreated(Bundle savedInstanceState) {\r
89         super.onActivityCreated(savedInstanceState);\r
90         // AlbumAdapter\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
97 \r
98         // Important!\r
99         getLoaderManager().initLoader(0, null, this);\r
100     }\r
101 \r
102     @Override\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
106         return root;\r
107     }\r
108 \r
109     @Override\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
113         };\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
117     }\r
118 \r
119     @Override\r
120     public void onLoadFinished(Loader<Cursor> loader, Cursor data) {\r
121         // Check for database errors\r
122         if (data == null) {\r
123             return;\r
124         }\r
125 \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
130         mCursor = data;\r
131     }\r
132 \r
133     @Override\r
134     public void onLoaderReset(Loader<Cursor> loader) {\r
135         if (mAlbumAdapter != null)\r
136             mAlbumAdapter.changeCursor(null);\r
137     }\r
138 \r
139     @Override\r
140     public void onSaveInstanceState(Bundle outState) {\r
141         outState.putAll(getArguments() != null ? getArguments() : new Bundle());\r
142         super.onSaveInstanceState(outState);\r
143     }\r
144 \r
145     @Override\r
146     public void onItemClick(AdapterView<?> parent, View v, int position, long id) {\r
147         tracksBrowser(id);\r
148     }\r
149 \r
150     /**\r
151      * Update the list as needed\r
152      */\r
153     private final BroadcastReceiver mMediaStatusReceiver = new BroadcastReceiver() {\r
154 \r
155         @Override\r
156         public void onReceive(Context context, Intent intent) {\r
157             if (mGridView != null) {\r
158                 mAlbumAdapter.notifyDataSetChanged();\r
159             }\r
160         }\r
161 \r
162     };\r
163 \r
164     @Override\r
165     public void onStart() {\r
166         super.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
171     }\r
172 \r
173     @Override\r
174     public void onStop() {\r
175         getActivity().unregisterReceiver(mMediaStatusReceiver);\r
176         super.onStop();\r
177     }\r
178 \r
179     /**\r
180      * @param index\r
181      * @param id\r
182      */\r
183     private void tracksBrowser(long id) {\r
184 \r
185         String artistName = mCursor.getString(mArtistNameIndex);\r
186         String albumName = mCursor.getString(mAlbumNameIndex);\r
187 \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
194 \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
199     }\r
200 \r
201     @Override\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
206 \r
207         mCurrentAlbumId = mCursor.getString(mCursor.getColumnIndexOrThrow(BaseColumns._ID));\r
208 \r
209         menu.setHeaderView(setHeaderLayout());\r
210         super.onCreateContextMenu(menu, v, menuInfo);\r
211     }\r
212 \r
213     @Override\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
220                 break;\r
221             }\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
228                 break;\r
229             }\r
230             case SEARCH: {\r
231                 MusicUtils.doSearch(getActivity(), mCursor, mAlbumNameIndex);\r
232                 break;\r
233             }\r
234             default:\r
235                 break;\r
236         }\r
237         return super.onContextItemSelected(item);\r
238     }\r
239 \r
240     /**\r
241      * @return A custom ContextMenu header\r
242      */\r
243     public View setHeaderLayout() {\r
244         // Get album name\r
245         String albumName = mCursor.getString(mAlbumNameIndex);\r
246         // Get artist name\r
247         String artistName = mCursor.getString(mArtistNameIndex);\r
248 \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
252 \r
253         // Artist image\r
254         ImageView headerImage = (ImageView)header.findViewById(R.id.header_image);\r
255 \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
260 \r
261         // Get and set cached image\r
262         new GetCachedImages(getActivity(), 1, headerImage).executeOnExecutor(\r
263                 AsyncTask.THREAD_POOL_EXECUTOR, albumName);\r
264 \r
265         // Set artist name\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
269         return header;\r
270     }\r
271 }\r