OSDN Git Service

88517c82da837622ac9b9da0a546f2e897148d9d
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / AudioPlayerFragment.java
1 /**\r
2  * \r
3  */\r
4 \r
5 package com.andrew.apollo;\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.os.AsyncTask;\r
12 import android.os.Bundle;\r
13 import android.os.Handler;\r
14 import android.os.Message;\r
15 import android.os.RemoteException;\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.Fragment;\r
20 import android.view.LayoutInflater;\r
21 import android.view.View;\r
22 import android.view.View.OnClickListener;\r
23 import android.view.ViewGroup;\r
24 import android.widget.ImageButton;\r
25 import android.widget.ImageView;\r
26 import android.widget.SeekBar;\r
27 import android.widget.SeekBar.OnSeekBarChangeListener;\r
28 import android.widget.TextView;\r
29 import android.widget.Toast;\r
30 \r
31 import com.andrew.apollo.activities.TracksBrowser;\r
32 import com.andrew.apollo.service.ApolloService;\r
33 import com.andrew.apollo.tasks.GetCachedImages;\r
34 import com.andrew.apollo.tasks.LastfmGetAlbumImages;\r
35 import com.andrew.apollo.ui.widgets.RepeatingImageButton;\r
36 import com.andrew.apollo.utils.ApolloUtils;\r
37 import com.andrew.apollo.utils.MusicUtils;\r
38 import com.andrew.apollo.utils.ThemeUtils;\r
39 \r
40 import static com.andrew.apollo.Constants.ALBUM_KEY;\r
41 import static com.andrew.apollo.Constants.ALBUM_IMAGE;\r
42 import static com.andrew.apollo.Constants.ARTIST_ID;\r
43 import static com.andrew.apollo.Constants.ARTIST_KEY;\r
44 import static com.andrew.apollo.Constants.MIME_TYPE;\r
45 \r
46 /**\r
47  * @author Andrew Neal\r
48  */\r
49 public class AudioPlayerFragment extends Fragment {\r
50 \r
51     // Track, album, and artist name\r
52     private TextView mTrackName, mAlbumArtistName;\r
53 \r
54     // Total and current time\r
55     private TextView mTotalTime, mCurrentTime;\r
56 \r
57     // Album art\r
58     private ImageView mAlbumArt;\r
59 \r
60     // Controls\r
61     private ImageButton mRepeat, mPlay, mShuffle;\r
62 \r
63     private RepeatingImageButton mPrev, mNext;\r
64 \r
65     // Progress\r
66     private SeekBar mProgress;\r
67 \r
68     // Where we are in the track\r
69     private long mDuration, mLastSeekEventTime, mPosOverride = -1, mStartSeekPos = 0;\r
70 \r
71     private boolean mFromTouch, paused = false;\r
72 \r
73     // Handler\r
74     private static final int REFRESH = 1, UPDATEINFO = 2;\r
75 \r
76     // Notify if repeat or shuffle changes\r
77     private Toast mToast;\r
78 \r
79     @Override\r
80     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\r
81         View root = inflater.inflate(R.layout.audio_player, container, false);\r
82 \r
83         mTrackName = (TextView)root.findViewById(R.id.audio_player_track);\r
84         mTrackName.setOnClickListener(new OnClickListener() {\r
85 \r
86             @Override\r
87             public void onClick(View v) {\r
88                 tracksBrowser();\r
89             }\r
90         });\r
91         mAlbumArtistName = (TextView)root.findViewById(R.id.audio_player_album_artist);\r
92         mAlbumArtistName.setOnClickListener(new OnClickListener() {\r
93 \r
94             @Override\r
95             public void onClick(View v) {\r
96                 tracksBrowserArtist();\r
97             }\r
98         });\r
99 \r
100         mTotalTime = (TextView)root.findViewById(R.id.audio_player_total_time);\r
101         mCurrentTime = (TextView)root.findViewById(R.id.audio_player_current_time);\r
102 \r
103         mAlbumArt = (ImageView)root.findViewById(R.id.audio_player_album_art);\r
104 \r
105         mRepeat = (ImageButton)root.findViewById(R.id.audio_player_repeat);\r
106         mPrev = (RepeatingImageButton)root.findViewById(R.id.audio_player_prev);\r
107         mPlay = (ImageButton)root.findViewById(R.id.audio_player_play);\r
108         mNext = (RepeatingImageButton)root.findViewById(R.id.audio_player_next);\r
109         mShuffle = (ImageButton)root.findViewById(R.id.audio_player_shuffle);\r
110 \r
111         mRepeat.setOnClickListener(new OnClickListener() {\r
112 \r
113             @Override\r
114             public void onClick(View v) {\r
115                 cycleRepeat();\r
116             }\r
117         });\r
118 \r
119         mPrev.setRepeatListener(mRewListener, 260);\r
120         mPrev.setOnClickListener(new OnClickListener() {\r
121 \r
122             @Override\r
123             public void onClick(View v) {\r
124                 if (MusicUtils.mService == null)\r
125                     return;\r
126                 try {\r
127                     if (MusicUtils.mService.position() < 2000) {\r
128                         MusicUtils.mService.prev();\r
129                     } else {\r
130                         MusicUtils.mService.seek(0);\r
131                         MusicUtils.mService.play();\r
132                     }\r
133                 } catch (RemoteException ex) {\r
134                     ex.printStackTrace();\r
135                 }\r
136             }\r
137         });\r
138 \r
139         mPlay.setOnClickListener(new OnClickListener() {\r
140 \r
141             @Override\r
142             public void onClick(View v) {\r
143                 doPauseResume();\r
144             }\r
145         });\r
146 \r
147         mNext.setRepeatListener(mFfwdListener, 260);\r
148         mNext.setOnClickListener(new OnClickListener() {\r
149 \r
150             @Override\r
151             public void onClick(View v) {\r
152                 if (MusicUtils.mService == null)\r
153                     return;\r
154                 try {\r
155                     MusicUtils.mService.next();\r
156                 } catch (RemoteException ex) {\r
157                     ex.printStackTrace();\r
158                 }\r
159             }\r
160         });\r
161 \r
162         mShuffle.setOnClickListener(new OnClickListener() {\r
163 \r
164             @Override\r
165             public void onClick(View v) {\r
166                 toggleShuffle();\r
167             }\r
168         });\r
169 \r
170         mProgress = (SeekBar)root.findViewById(android.R.id.progress);\r
171         if (mProgress instanceof SeekBar) {\r
172             SeekBar seeker = mProgress;\r
173             seeker.setOnSeekBarChangeListener(mSeekListener);\r
174         }\r
175         mProgress.setMax(1000);\r
176 \r
177         // Theme chooser\r
178         ThemeUtils.setImageButton(getActivity(), mPrev, "apollo_previous");\r
179         ThemeUtils.setImageButton(getActivity(), mNext, "apollo_next");\r
180         ThemeUtils.setProgessDrawable(getActivity(), mProgress, "apollo_seekbar_background");\r
181         return root;\r
182     }\r
183 \r
184     /**\r
185      * Update everything as the meta or playstate changes\r
186      */\r
187     private final BroadcastReceiver mStatusListener = new BroadcastReceiver() {\r
188         @Override\r
189         public void onReceive(Context context, Intent intent) {\r
190             if (intent.getAction().equals(ApolloService.META_CHANGED))\r
191                 mHandler.sendMessage(mHandler.obtainMessage(UPDATEINFO));\r
192             setPauseButtonImage();\r
193             setShuffleButtonImage();\r
194             setRepeatButtonImage();\r
195         }\r
196     };\r
197 \r
198     @Override\r
199     public void onStart() {\r
200         super.onStart();\r
201         IntentFilter f = new IntentFilter();\r
202         f.addAction(ApolloService.PLAYSTATE_CHANGED);\r
203         f.addAction(ApolloService.META_CHANGED);\r
204         getActivity().registerReceiver(mStatusListener, new IntentFilter(f));\r
205 \r
206         long next = refreshNow();\r
207         queueNextRefresh(next);\r
208     }\r
209 \r
210     @Override\r
211     public void onDestroy() {\r
212         super.onDestroy();\r
213         paused = true;\r
214         mHandler.removeMessages(REFRESH);\r
215         getActivity().unregisterReceiver(mStatusListener);\r
216     }\r
217 \r
218     /**\r
219      * Cycle repeat states\r
220      */\r
221     private void cycleRepeat() {\r
222         if (MusicUtils.mService == null) {\r
223             return;\r
224         }\r
225         try {\r
226             int mode = MusicUtils.mService.getRepeatMode();\r
227             if (mode == ApolloService.REPEAT_NONE) {\r
228                 MusicUtils.mService.setRepeatMode(ApolloService.REPEAT_ALL);\r
229                 ApolloUtils.showToast(R.string.repeat_all, mToast, getActivity());\r
230             } else if (mode == ApolloService.REPEAT_ALL) {\r
231                 MusicUtils.mService.setRepeatMode(ApolloService.REPEAT_CURRENT);\r
232                 if (MusicUtils.mService.getShuffleMode() != ApolloService.SHUFFLE_NONE) {\r
233                     MusicUtils.mService.setShuffleMode(ApolloService.SHUFFLE_NONE);\r
234                     setShuffleButtonImage();\r
235                 }\r
236                 ApolloUtils.showToast(R.string.repeat_one, mToast, getActivity());\r
237             } else {\r
238                 MusicUtils.mService.setRepeatMode(ApolloService.REPEAT_NONE);\r
239                 ApolloUtils.showToast(R.string.repeat_off, mToast, getActivity());\r
240             }\r
241             setRepeatButtonImage();\r
242         } catch (RemoteException ex) {\r
243             ex.printStackTrace();\r
244         }\r
245 \r
246     }\r
247 \r
248     /**\r
249      * Scan backwards\r
250      */\r
251     private final RepeatingImageButton.RepeatListener mRewListener = new RepeatingImageButton.RepeatListener() {\r
252         @Override\r
253         public void onRepeat(View v, long howlong, int repcnt) {\r
254             scanBackward(repcnt, howlong);\r
255         }\r
256     };\r
257 \r
258     /**\r
259      * Play and pause music\r
260      */\r
261     private void doPauseResume() {\r
262         try {\r
263             if (MusicUtils.mService != null) {\r
264                 if (MusicUtils.mService.isPlaying()) {\r
265                     MusicUtils.mService.pause();\r
266                 } else {\r
267                     MusicUtils.mService.play();\r
268                 }\r
269             }\r
270             refreshNow();\r
271             setPauseButtonImage();\r
272         } catch (RemoteException ex) {\r
273             ex.printStackTrace();\r
274         }\r
275     }\r
276 \r
277     /**\r
278      * Scan forwards\r
279      */\r
280     private final RepeatingImageButton.RepeatListener mFfwdListener = new RepeatingImageButton.RepeatListener() {\r
281         @Override\r
282         public void onRepeat(View v, long howlong, int repcnt) {\r
283             scanForward(repcnt, howlong);\r
284         }\r
285     };\r
286 \r
287     /**\r
288      * Set the shuffle mode\r
289      */\r
290     private void toggleShuffle() {\r
291         if (MusicUtils.mService == null) {\r
292             return;\r
293         }\r
294         try {\r
295             int shuffle = MusicUtils.mService.getShuffleMode();\r
296             if (shuffle == ApolloService.SHUFFLE_NONE) {\r
297                 MusicUtils.mService.setShuffleMode(ApolloService.SHUFFLE_NORMAL);\r
298                 if (MusicUtils.mService.getRepeatMode() == ApolloService.REPEAT_CURRENT) {\r
299                     MusicUtils.mService.setRepeatMode(ApolloService.REPEAT_ALL);\r
300                     setRepeatButtonImage();\r
301                 }\r
302                 ApolloUtils.showToast(R.string.shuffle_on, mToast, getActivity());\r
303             } else if (shuffle == ApolloService.SHUFFLE_NORMAL\r
304                     || shuffle == ApolloService.SHUFFLE_AUTO) {\r
305                 MusicUtils.mService.setShuffleMode(ApolloService.SHUFFLE_NONE);\r
306                 ApolloUtils.showToast(R.string.shuffle_off, mToast, getActivity());\r
307             }\r
308             setShuffleButtonImage();\r
309         } catch (RemoteException ex) {\r
310             ex.printStackTrace();\r
311         }\r
312     }\r
313 \r
314     private void scanBackward(int repcnt, long delta) {\r
315         if (MusicUtils.mService == null)\r
316             return;\r
317         try {\r
318             if (repcnt == 0) {\r
319                 mStartSeekPos = MusicUtils.mService.position();\r
320                 mLastSeekEventTime = 0;\r
321             } else {\r
322                 if (delta < 5000) {\r
323                     // seek at 10x speed for the first 5 seconds\r
324                     delta = delta * 10;\r
325                 } else {\r
326                     // seek at 40x after that\r
327                     delta = 50000 + (delta - 5000) * 40;\r
328                 }\r
329                 long newpos = mStartSeekPos - delta;\r
330                 if (newpos < 0) {\r
331                     // move to previous track\r
332                     MusicUtils.mService.prev();\r
333                     long duration = MusicUtils.mService.duration();\r
334                     mStartSeekPos += duration;\r
335                     newpos += duration;\r
336                 }\r
337                 if (((delta - mLastSeekEventTime) > 250) || repcnt < 0) {\r
338                     MusicUtils.mService.seek(newpos);\r
339                     mLastSeekEventTime = delta;\r
340                 }\r
341                 if (repcnt >= 0) {\r
342                     mPosOverride = newpos;\r
343                 } else {\r
344                     mPosOverride = -1;\r
345                 }\r
346                 refreshNow();\r
347             }\r
348         } catch (RemoteException ex) {\r
349             ex.printStackTrace();\r
350         }\r
351     }\r
352 \r
353     private void scanForward(int repcnt, long delta) {\r
354         if (MusicUtils.mService == null)\r
355             return;\r
356         try {\r
357             if (repcnt == 0) {\r
358                 mStartSeekPos = MusicUtils.mService.position();\r
359                 mLastSeekEventTime = 0;\r
360             } else {\r
361                 if (delta < 5000) {\r
362                     // seek at 10x speed for the first 5 seconds\r
363                     delta = delta * 10;\r
364                 } else {\r
365                     // seek at 40x after that\r
366                     delta = 50000 + (delta - 5000) * 40;\r
367                 }\r
368                 long newpos = mStartSeekPos + delta;\r
369                 long duration = MusicUtils.mService.duration();\r
370                 if (newpos >= duration) {\r
371                     // move to next track\r
372                     MusicUtils.mService.next();\r
373                     mStartSeekPos -= duration; // is OK to go negative\r
374                     newpos -= duration;\r
375                 }\r
376                 if (((delta - mLastSeekEventTime) > 250) || repcnt < 0) {\r
377                     MusicUtils.mService.seek(newpos);\r
378                     mLastSeekEventTime = delta;\r
379                 }\r
380                 if (repcnt >= 0) {\r
381                     mPosOverride = newpos;\r
382                 } else {\r
383                     mPosOverride = -1;\r
384                 }\r
385                 refreshNow();\r
386             }\r
387         } catch (RemoteException ex) {\r
388             ex.printStackTrace();\r
389         }\r
390     }\r
391 \r
392     /**\r
393      * Set the repeat images\r
394      */\r
395     private void setRepeatButtonImage() {\r
396         if (MusicUtils.mService == null)\r
397             return;\r
398         try {\r
399             switch (MusicUtils.mService.getRepeatMode()) {\r
400                 case ApolloService.REPEAT_ALL:\r
401                     mRepeat.setImageResource(R.drawable.apollo_holo_light_repeat_all);\r
402                     break;\r
403                 case ApolloService.REPEAT_CURRENT:\r
404                     mRepeat.setImageResource(R.drawable.apollo_holo_light_repeat_one);\r
405                     break;\r
406                 default:\r
407                     mRepeat.setImageResource(R.drawable.apollo_holo_light_repeat_normal);\r
408                     // Theme chooser\r
409                     ThemeUtils.setImageButton(getActivity(), mRepeat, "apollo_repeat_normal");\r
410                     break;\r
411             }\r
412         } catch (RemoteException ex) {\r
413             ex.printStackTrace();\r
414         }\r
415     }\r
416 \r
417     /**\r
418      * Set the shuffle images\r
419      */\r
420     private void setShuffleButtonImage() {\r
421         if (MusicUtils.mService == null)\r
422             return;\r
423         try {\r
424             switch (MusicUtils.mService.getShuffleMode()) {\r
425                 case ApolloService.SHUFFLE_NONE:\r
426                     mShuffle.setImageResource(R.drawable.apollo_holo_light_shuffle_normal);\r
427                     // Theme chooser\r
428                     ThemeUtils.setImageButton(getActivity(), mShuffle, "apollo_shuffle_normal");\r
429                     break;\r
430                 case ApolloService.SHUFFLE_AUTO:\r
431                     mShuffle.setImageResource(R.drawable.apollo_holo_light_shuffle_on);\r
432                     break;\r
433                 default:\r
434                     mShuffle.setImageResource(R.drawable.apollo_holo_light_shuffle_on);\r
435                     break;\r
436             }\r
437         } catch (RemoteException ex) {\r
438             ex.printStackTrace();\r
439         }\r
440     }\r
441 \r
442     /**\r
443      * Set the play and pause image\r
444      */\r
445     private void setPauseButtonImage() {\r
446         try {\r
447             if (MusicUtils.mService != null && MusicUtils.mService.isPlaying()) {\r
448                 mPlay.setImageResource(R.drawable.apollo_holo_light_pause);\r
449                 // Theme chooser\r
450                 ThemeUtils.setImageButton(getActivity(), mPlay, "apollo_pause");\r
451             } else {\r
452                 mPlay.setImageResource(R.drawable.apollo_holo_light_play);\r
453                 // Theme chooser\r
454                 ThemeUtils.setImageButton(getActivity(), mPlay, "apollo_play");\r
455             }\r
456         } catch (RemoteException ex) {\r
457             ex.printStackTrace();\r
458         }\r
459     }\r
460 \r
461     /**\r
462      * @param delay\r
463      */\r
464     private void queueNextRefresh(long delay) {\r
465         if (!paused) {\r
466             Message msg = mHandler.obtainMessage(REFRESH);\r
467             mHandler.removeMessages(REFRESH);\r
468             mHandler.sendMessageDelayed(msg, delay);\r
469         }\r
470     }\r
471 \r
472     /**\r
473      * We need to refresh the time via a Handler\r
474      */\r
475     private final Handler mHandler = new Handler() {\r
476         @Override\r
477         public void handleMessage(Message msg) {\r
478             switch (msg.what) {\r
479                 case REFRESH:\r
480                     long next = refreshNow();\r
481                     queueNextRefresh(next);\r
482                     break;\r
483                 case UPDATEINFO:\r
484                     updateMusicInfo();\r
485                     break;\r
486                 default:\r
487                     break;\r
488             }\r
489         }\r
490     };\r
491 \r
492     /**\r
493      * Drag to a specfic duration\r
494      */\r
495     private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {\r
496         @Override\r
497         public void onStartTrackingTouch(SeekBar bar) {\r
498             mLastSeekEventTime = 0;\r
499             mFromTouch = true;\r
500         }\r
501 \r
502         @Override\r
503         public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {\r
504             if (!fromuser || (MusicUtils.mService == null))\r
505                 return;\r
506             long now = SystemClock.elapsedRealtime();\r
507             if ((now - mLastSeekEventTime) > 250) {\r
508                 mLastSeekEventTime = now;\r
509                 mPosOverride = mDuration * progress / 1000;\r
510                 try {\r
511                     MusicUtils.mService.seek(mPosOverride);\r
512                 } catch (RemoteException ex) {\r
513                     ex.printStackTrace();\r
514                 }\r
515 \r
516                 if (!mFromTouch) {\r
517                     refreshNow();\r
518                     mPosOverride = -1;\r
519                 }\r
520             }\r
521         }\r
522 \r
523         @Override\r
524         public void onStopTrackingTouch(SeekBar bar) {\r
525             mPosOverride = -1;\r
526             mFromTouch = false;\r
527         }\r
528     };\r
529 \r
530     /**\r
531      * @return current time\r
532      */\r
533     private long refreshNow() {\r
534         if (MusicUtils.mService == null)\r
535             return 500;\r
536         try {\r
537             long pos = mPosOverride < 0 ? MusicUtils.mService.position() : mPosOverride;\r
538             long remaining = 1000 - (pos % 1000);\r
539             if ((pos >= 0) && (mDuration > 0)) {\r
540                 mCurrentTime.setText(MusicUtils.makeTimeString(getActivity(), pos / 1000));\r
541 \r
542                 if (MusicUtils.mService.isPlaying()) {\r
543                     mCurrentTime.setVisibility(View.VISIBLE);\r
544                     mCurrentTime.setTextColor(getResources().getColor(R.color.transparent_black));\r
545                     // Theme chooser\r
546                     ThemeUtils.setTextColor(getActivity(), mCurrentTime, "audio_player_text_color");\r
547                 } else {\r
548                     // blink the counter\r
549                     int col = mCurrentTime.getCurrentTextColor();\r
550                     mCurrentTime.setTextColor(col == getResources().getColor(\r
551                             R.color.transparent_black) ? getResources().getColor(\r
552                             R.color.holo_blue_dark) : getResources().getColor(\r
553                             R.color.transparent_black));\r
554                     remaining = 500;\r
555                     // Theme chooser\r
556                     ThemeUtils.setTextColor(getActivity(), mCurrentTime, "audio_player_text_color");\r
557                 }\r
558 \r
559                 mProgress.setProgress((int)(1000 * pos / mDuration));\r
560             } else {\r
561                 mCurrentTime.setText("--:--");\r
562                 mProgress.setProgress(1000);\r
563             }\r
564             return remaining;\r
565         } catch (RemoteException ex) {\r
566             ex.printStackTrace();\r
567         }\r
568         return 500;\r
569     }\r
570 \r
571     /**\r
572      * Update what's playing\r
573      */\r
574     private void updateMusicInfo() {\r
575         if (MusicUtils.mService == null) {\r
576             return;\r
577         }\r
578 \r
579         String artistName = MusicUtils.getArtistName();\r
580         String albumName = MusicUtils.getAlbumName();\r
581         String trackName = MusicUtils.getTrackName();\r
582         mTrackName.setText(trackName);\r
583         mAlbumArtistName.setText(albumName + " - " + artistName);\r
584         mDuration = MusicUtils.getDuration();\r
585         mTotalTime.setText(MusicUtils.makeTimeString(getActivity(), mDuration / 1000));\r
586 \r
587         if (ApolloUtils.getImageURL(albumName, ALBUM_IMAGE, getActivity()) == null)\r
588             new LastfmGetAlbumImages(getActivity(), mAlbumArt, 1).executeOnExecutor(\r
589                     AsyncTask.THREAD_POOL_EXECUTOR, artistName, albumName);\r
590 \r
591         new GetCachedImages(getActivity(), 1, mAlbumArt).executeOnExecutor(\r
592                 AsyncTask.THREAD_POOL_EXECUTOR, albumName);\r
593 \r
594         // Theme chooser\r
595         ThemeUtils.setTextColor(getActivity(), mTrackName, "audio_player_text_color");\r
596         ThemeUtils.setTextColor(getActivity(), mAlbumArtistName, "audio_player_text_color");\r
597         ThemeUtils.setTextColor(getActivity(), mTotalTime, "audio_player_text_color");\r
598 \r
599     }\r
600 \r
601     /**\r
602      * Takes you into the @TracksBrowser to view all of the tracks on the\r
603      * current album\r
604      */\r
605     private void tracksBrowser() {\r
606 \r
607         String artistName = MusicUtils.getArtistName();\r
608         String albumName = MusicUtils.getAlbumName();\r
609         long id = MusicUtils.getCurrentAlbumId();\r
610 \r
611         Bundle bundle = new Bundle();\r
612         bundle.putString(MIME_TYPE, Audio.Albums.CONTENT_TYPE);\r
613         bundle.putString(ARTIST_KEY, artistName);\r
614         bundle.putString(ALBUM_KEY, albumName);\r
615         bundle.putLong(BaseColumns._ID, id);\r
616 \r
617         Intent intent = new Intent(Intent.ACTION_VIEW);\r
618         intent.setClass(getActivity(), TracksBrowser.class);\r
619         intent.putExtras(bundle);\r
620         getActivity().startActivity(intent);\r
621     }\r
622 \r
623     /**\r
624      * Takes you into the @TracksBrowser to view all of the tracks and albums by\r
625      * the current artist\r
626      */\r
627     private void tracksBrowserArtist() {\r
628 \r
629         String artistName = MusicUtils.getArtistName();\r
630         long id = MusicUtils.getCurrentArtistId();\r
631 \r
632         Bundle bundle = new Bundle();\r
633         bundle.putString(MIME_TYPE, Audio.Artists.CONTENT_TYPE);\r
634         bundle.putString(ARTIST_KEY, artistName);\r
635         bundle.putLong(BaseColumns._ID, id);\r
636 \r
637         ApolloUtils.setArtistId(artistName, id, ARTIST_ID, getActivity());\r
638 \r
639         Intent intent = new Intent(Intent.ACTION_VIEW);\r
640         intent.setClass(getActivity(), TracksBrowser.class);\r
641         intent.putExtras(bundle);\r
642         getActivity().startActivity(intent);\r
643     }\r
644 }\r