OSDN Git Service

overhaul
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / activities / TracksBrowser.java
1 /**\r
2  * \r
3  */\r
4 \r
5 package com.andrew.apollo.activities;\r
6 \r
7 import android.content.BroadcastReceiver;\r
8 import android.content.ComponentName;\r
9 import android.content.Context;\r
10 import android.content.Intent;\r
11 import android.content.IntentFilter;\r
12 import android.content.ServiceConnection;\r
13 import android.content.pm.ActivityInfo;\r
14 import android.content.res.Resources;\r
15 import android.graphics.Bitmap;\r
16 import android.graphics.BitmapFactory;\r
17 import android.graphics.drawable.AnimationDrawable;\r
18 import android.media.AudioManager;\r
19 import android.os.AsyncTask;\r
20 import android.os.Bundle;\r
21 import android.os.IBinder;\r
22 import android.os.SystemClock;\r
23 import android.provider.BaseColumns;\r
24 import android.provider.MediaStore.Audio;\r
25 import android.support.v4.app.FragmentActivity;\r
26 import android.support.v4.view.ViewPager;\r
27 import android.view.MenuItem;\r
28 import android.view.View;\r
29 import android.view.View.OnClickListener;\r
30 import android.widget.FrameLayout;\r
31 import android.widget.ImageView;\r
32 import android.widget.RelativeLayout;\r
33 import android.widget.TextView;\r
34 \r
35 import com.andrew.apollo.BottomActionBarControlsFragment;\r
36 import com.andrew.apollo.BottomActionBarFragment;\r
37 import com.andrew.apollo.Constants;\r
38 import com.andrew.apollo.IApolloService;\r
39 import com.andrew.apollo.R;\r
40 import com.andrew.apollo.adapters.PagerAdapter;\r
41 import com.andrew.apollo.list.fragments.ArtistAlbumsFragment;\r
42 import com.andrew.apollo.list.fragments.TracksFragment;\r
43 import com.andrew.apollo.service.ApolloService;\r
44 import com.andrew.apollo.service.ServiceToken;\r
45 import com.andrew.apollo.tasks.GetCachedImages;\r
46 import com.andrew.apollo.tasks.LastfmGetAlbumImages;\r
47 import com.andrew.apollo.tasks.LastfmGetArtistImagesOriginal;\r
48 import com.andrew.apollo.utils.ApolloUtils;\r
49 import com.andrew.apollo.utils.MusicUtils;\r
50 import com.andrew.apollo.utils.ThemeUtils;\r
51 \r
52 /**\r
53  * @author Andrew Neal\r
54  * @Note This displays specific track or album listings\r
55  */\r
56 public class TracksBrowser extends FragmentActivity implements Constants, ServiceConnection {\r
57 \r
58     // Bundle\r
59     private Bundle bundle;\r
60 \r
61     private Intent intent;\r
62 \r
63     private String mimeType;\r
64 \r
65     private ServiceToken mToken;\r
66 \r
67     private final long[] mHits = new long[3];\r
68 \r
69     @Override\r
70     protected void onCreate(Bundle icicle) {\r
71         // Landscape mode on phone isn't ready\r
72         if (!ApolloUtils.isTablet(this))\r
73             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\r
74 \r
75         // Control Media volume\r
76         setVolumeControlStream(AudioManager.STREAM_MUSIC);\r
77 \r
78         // Layout\r
79         setContentView(R.layout.track_browser);\r
80 \r
81         // Important!\r
82         whatBundle(icicle);\r
83 \r
84         // Update the colorstrip color\r
85         initColorstrip();\r
86 \r
87         // Update the ActionBar\r
88         initActionBar();\r
89 \r
90         // Update the half_and_half layout\r
91         initUpperHalf();\r
92 \r
93         // Important!\r
94         initPager();\r
95 \r
96         // Update the BottomActionBar\r
97         initBottomActionBar();\r
98         super.onCreate(icicle);\r
99     }\r
100 \r
101     @Override\r
102     public void onSaveInstanceState(Bundle outcicle) {\r
103         outcicle.putAll(bundle);\r
104         super.onSaveInstanceState(outcicle);\r
105     }\r
106 \r
107     @Override\r
108     public void onServiceConnected(ComponentName name, IBinder obj) {\r
109         MusicUtils.mService = IApolloService.Stub.asInterface(obj);\r
110     }\r
111 \r
112     @Override\r
113     public void onServiceDisconnected(ComponentName name) {\r
114         MusicUtils.mService = null;\r
115     }\r
116 \r
117     /**\r
118      * Update next BottomActionBar as needed\r
119      */\r
120     private final BroadcastReceiver mMediaStatusReceiver = new BroadcastReceiver() {\r
121 \r
122         @Override\r
123         public void onReceive(Context context, Intent intent) {\r
124             if (ApolloUtils.isArtist(mimeType) || ApolloUtils.isAlbum(mimeType))\r
125                 setArtistImage();\r
126         }\r
127 \r
128     };\r
129 \r
130     @Override\r
131     protected void onStart() {\r
132         // Bind to Service\r
133         mToken = MusicUtils.bindToService(this, this);\r
134 \r
135         IntentFilter filter = new IntentFilter();\r
136         filter.addAction(ApolloService.META_CHANGED);\r
137         registerReceiver(mMediaStatusReceiver, filter);\r
138 \r
139         setTitle();\r
140         super.onStart();\r
141     }\r
142 \r
143     @Override\r
144     protected void onStop() {\r
145         // Unbind\r
146         if (MusicUtils.mService != null)\r
147             MusicUtils.unbindFromService(mToken);\r
148 \r
149         unregisterReceiver(mMediaStatusReceiver);\r
150         super.onStop();\r
151     }\r
152 \r
153     @Override\r
154     public boolean onOptionsItemSelected(MenuItem item) {\r
155         switch (item.getItemId()) {\r
156             case android.R.id.home:\r
157                 // Artist ID\r
158                 long id = ApolloUtils.getArtistId(getArtist(), ARTIST_ID, this);\r
159                 if (ApolloUtils.isAlbum(mimeType) && id != 0)\r
160                     tracksBrowser(id);\r
161                 super.onBackPressed();\r
162                 break;\r
163             default:\r
164                 break;\r
165         }\r
166         return super.onOptionsItemSelected(item);\r
167     }\r
168 \r
169     /**\r
170      * @param icicle\r
171      * @return what Bundle we're dealing with\r
172      */\r
173     public void whatBundle(Bundle icicle) {\r
174         intent = getIntent();\r
175         bundle = icicle != null ? icicle : intent.getExtras();\r
176         if (bundle == null) {\r
177             bundle = new Bundle();\r
178         }\r
179         if (bundle.getString(INTENT_ACTION) == null) {\r
180             bundle.putString(INTENT_ACTION, intent.getAction());\r
181         }\r
182         if (bundle.getString(MIME_TYPE) == null) {\r
183             bundle.putString(MIME_TYPE, intent.getType());\r
184         }\r
185         mimeType = bundle.getString(MIME_TYPE);\r
186     }\r
187 \r
188     /**\r
189      * For the theme chooser\r
190      */\r
191     private void initColorstrip() {\r
192         FrameLayout mColorstrip = (FrameLayout)findViewById(R.id.colorstrip);\r
193         mColorstrip.setBackgroundColor(getResources().getColor(R.color.holo_blue_dark));\r
194         ThemeUtils.setBackgroundColor(this, mColorstrip, "colorstrip");\r
195     }\r
196 \r
197     /**\r
198      * Set the ActionBar title\r
199      */\r
200     private void initActionBar() {\r
201         ApolloUtils.showUpTitleOnly(getActionBar());\r
202 \r
203         // The ActionBar Title and UP ids are hidden.\r
204         int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");\r
205         int upId = Resources.getSystem().getIdentifier("up", "id", "android");\r
206 \r
207         TextView actionBarTitle = (TextView)findViewById(titleId);\r
208         ImageView actionBarUp = (ImageView)findViewById(upId);\r
209 \r
210         // Theme chooser\r
211         ThemeUtils.setActionBarBackground(this, getActionBar(), "action_bar_background");\r
212         ThemeUtils.setTextColor(this, actionBarTitle, "action_bar_title_color");\r
213         ThemeUtils.initThemeChooser(this, actionBarUp, "action_bar_up", THEME_ITEM_BACKGROUND);\r
214 \r
215     }\r
216 \r
217     /**\r
218      * Sets up the @half_and_half.xml layout\r
219      */\r
220     private void initUpperHalf() {\r
221 \r
222         if (ApolloUtils.isArtist(mimeType)) {\r
223             // Get next artist image\r
224         } else if (ApolloUtils.isAlbum(mimeType)) {\r
225             // Album image\r
226             setAlbumImage();\r
227 \r
228             // Artist name\r
229             TextView mArtistName = (TextView)findViewById(R.id.half_artist_image_text);\r
230             mArtistName.setVisibility(View.VISIBLE);\r
231             mArtistName.setText(getArtist());\r
232             mArtistName.setBackgroundColor(getResources().getColor(R.color.transparent_black));\r
233 \r
234             // Album name\r
235             TextView mAlbumName = (TextView)findViewById(R.id.half_album_image_text);\r
236             mAlbumName.setText(getAlbum());\r
237             mAlbumName.setBackgroundColor(getResources().getColor(R.color.transparent_black));\r
238 \r
239             // Album half container\r
240             RelativeLayout mSecondHalfContainer = (RelativeLayout)findViewById(R.id.album_half_container);\r
241             // Show the second half while viewing an album\r
242             mSecondHalfContainer.setVisibility(View.VISIBLE);\r
243         } else {\r
244             // Set the logo\r
245             setPromoImage();\r
246         }\r
247     }\r
248 \r
249     /**\r
250      * Initiate ViewPager and PagerAdapter\r
251      */\r
252     private void initPager() {\r
253         // Initiate PagerAdapter\r
254         PagerAdapter mPagerAdapter = new PagerAdapter(getSupportFragmentManager());\r
255         if (ApolloUtils.isArtist(mimeType))\r
256             // Show all albums for an artist\r
257             mPagerAdapter.addFragment(new ArtistAlbumsFragment(bundle));\r
258         // Show the tracks for an artist or album\r
259         mPagerAdapter.addFragment(new TracksFragment(bundle));\r
260 \r
261         // Set up ViewPager\r
262         ViewPager mViewPager = (ViewPager)findViewById(R.id.viewPager);\r
263         mViewPager.setPageMargin(getResources().getInteger(R.integer.viewpager_margin_width));\r
264         mViewPager.setPageMarginDrawable(R.drawable.viewpager_margin);\r
265         mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount());\r
266         mViewPager.setAdapter(mPagerAdapter);\r
267 \r
268         // Theme chooser\r
269         ThemeUtils.initThemeChooser(this, mViewPager, "viewpager", THEME_ITEM_BACKGROUND);\r
270         ThemeUtils.setMarginDrawable(this, mViewPager, "viewpager_margin");\r
271     }\r
272 \r
273     /**\r
274      * Initiate the BottomActionBar\r
275      */\r
276     private void initBottomActionBar() {\r
277         PagerAdapter pagerAdatper = new PagerAdapter(getSupportFragmentManager());\r
278         pagerAdatper.addFragment(new BottomActionBarFragment());\r
279         pagerAdatper.addFragment(new BottomActionBarControlsFragment());\r
280         ViewPager viewPager = (ViewPager)findViewById(R.id.bottomActionBarPager);\r
281         viewPager.setAdapter(pagerAdatper);\r
282     }\r
283 \r
284     /**\r
285      * @return artist name from Bundle\r
286      */\r
287     public String getArtist() {\r
288         if (bundle.getString(ARTIST_KEY) != null)\r
289             return bundle.getString(ARTIST_KEY);\r
290         return getResources().getString(R.string.app_name);\r
291     }\r
292 \r
293     /**\r
294      * @return album name from Bundle\r
295      */\r
296     public String getAlbum() {\r
297         if (bundle.getString(ALBUM_KEY) != null)\r
298             return bundle.getString(ALBUM_KEY);\r
299         return getResources().getString(R.string.app_name);\r
300     }\r
301 \r
302     /**\r
303      * @return genre name from Bundle\r
304      */\r
305     public String getGenre() {\r
306         if (bundle.getString(GENRE_KEY) != null)\r
307             return bundle.getString(GENRE_KEY);\r
308         return getResources().getString(R.string.app_name);\r
309     }\r
310 \r
311     /**\r
312      * @return playlist name from Bundle\r
313      */\r
314     public String getPlaylist() {\r
315         if (bundle.getString(PLAYLIST_NAME) != null)\r
316             return bundle.getString(PLAYLIST_NAME);\r
317         return getResources().getString(R.string.app_name);\r
318     }\r
319 \r
320     /**\r
321      * Set the header when viewing a genre\r
322      */\r
323     public void setPromoImage() {\r
324 \r
325         // Artist image & Genre image\r
326         ImageView mFirstHalfImage = (ImageView)findViewById(R.id.half_artist_image);\r
327 \r
328         Bitmap header = BitmapFactory.decodeResource(getResources(), R.drawable.promo);\r
329         ApolloUtils.runnableBackground(mFirstHalfImage, header);\r
330     }\r
331 \r
332     /**\r
333      * Cache and set artist image\r
334      */\r
335     public void setArtistImage() {\r
336 \r
337         // Artist image & Genre image\r
338         final ImageView mFirstHalfImage = (ImageView)findViewById(R.id.half_artist_image);\r
339 \r
340         mFirstHalfImage.post(new Runnable() {\r
341             @Override\r
342             public void run() {\r
343                 // Only download images we don't already have\r
344                 if (ApolloUtils.getImageURL(getArtist(), ARTIST_IMAGE_ORIGINAL, TracksBrowser.this) == null)\r
345                     new LastfmGetArtistImagesOriginal(TracksBrowser.this, mFirstHalfImage)\r
346                             .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getArtist());\r
347                 // Get and set cached image\r
348                 new GetCachedImages(TracksBrowser.this, 0, mFirstHalfImage).executeOnExecutor(\r
349                         AsyncTask.THREAD_POOL_EXECUTOR, getArtist());\r
350             }\r
351         });\r
352 \r
353         mFirstHalfImage.setOnClickListener(new OnClickListener() {\r
354 \r
355             @Override\r
356             public void onClick(View v) {\r
357                 System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);\r
358                 mHits[mHits.length - 1] = SystemClock.uptimeMillis();\r
359                 if (mHits[0] >= (SystemClock.uptimeMillis() - 250)) {\r
360                     AnimationDrawable meow = ApolloUtils.getNyanCat(TracksBrowser.this);\r
361                     mFirstHalfImage.setImageDrawable(meow);\r
362                     meow.start();\r
363                 }\r
364             }\r
365         });\r
366     }\r
367 \r
368     /**\r
369      * Cache and set album image\r
370      */\r
371     public void setAlbumImage() {\r
372 \r
373         // Album image\r
374         final ImageView mSecondHalfImage = (ImageView)findViewById(R.id.half_album_image);\r
375 \r
376         mSecondHalfImage.post(new Runnable() {\r
377             @Override\r
378             public void run() {\r
379                 // Only download images we don't already have\r
380                 if (ApolloUtils.getImageURL(getAlbum(), ALBUM_IMAGE, TracksBrowser.this) == null)\r
381                     new LastfmGetAlbumImages(TracksBrowser.this, mSecondHalfImage, 1)\r
382                             .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getArtist(),\r
383                                     getAlbum());\r
384                 // Get and set cached image\r
385                 new GetCachedImages(TracksBrowser.this, 1, mSecondHalfImage).executeOnExecutor(\r
386                         AsyncTask.THREAD_POOL_EXECUTOR, getAlbum());\r
387             }\r
388         });\r
389     }\r
390 \r
391     /**\r
392      * Return here from viewing the tracks for an album and view all albums and\r
393      * tracks for the same artist\r
394      */\r
395     private void tracksBrowser(long id) {\r
396 \r
397         bundle.putString(MIME_TYPE, Audio.Artists.CONTENT_TYPE);\r
398         bundle.putString(ARTIST_KEY, getArtist());\r
399         bundle.putLong(BaseColumns._ID, id);\r
400 \r
401         Intent intent = new Intent(Intent.ACTION_VIEW);\r
402         intent.setClass(this, TracksBrowser.class);\r
403         intent.putExtras(bundle);\r
404         startActivity(intent);\r
405     }\r
406 \r
407     /**\r
408      * Set the correct title\r
409      */\r
410     private void setTitle() {\r
411         String name;\r
412         long id;\r
413         if (Audio.Playlists.CONTENT_TYPE.equals(mimeType)) {\r
414             id = bundle.getLong(BaseColumns._ID);\r
415             switch ((int)id) {\r
416                 case (int)PLAYLIST_QUEUE:\r
417                     setTitle(R.string.nowplaying);\r
418                     return;\r
419                 case (int)PLAYLIST_FAVORITES:\r
420                     setTitle(R.string.favorite);\r
421                     return;\r
422                 default:\r
423                     if (id < 0) {\r
424                         setTitle(R.string.app_name);\r
425                         return;\r
426                     }\r
427             }\r
428             name = MusicUtils.getPlaylistName(this, id);\r
429         } else if (Audio.Artists.CONTENT_TYPE.equals(mimeType)) {\r
430             id = bundle.getLong(BaseColumns._ID);\r
431             name = MusicUtils.getArtistName(this, id, true);\r
432         } else if (Audio.Albums.CONTENT_TYPE.equals(mimeType)) {\r
433             id = bundle.getLong(BaseColumns._ID);\r
434             name = MusicUtils.getAlbumName(this, id, true);\r
435         } else if (Audio.Genres.CONTENT_TYPE.equals(mimeType)) {\r
436             id = bundle.getLong(BaseColumns._ID);\r
437             name = MusicUtils.parseGenreName(this, MusicUtils.getGenreName(this, id, true));\r
438         } else {\r
439             setTitle(R.string.app_name);\r
440             return;\r
441         }\r
442         setTitle(name);\r
443     }\r
444 }\r