OSDN Git Service

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