5 package com.andrew.apollo.activities;
\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
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
53 * @author Andrew Neal
\r
54 * @Note This displays specific track or album listings
\r
56 public class TracksBrowser extends FragmentActivity implements Constants, ServiceConnection {
\r
59 private Bundle bundle;
\r
61 private Intent intent;
\r
63 private String mimeType;
\r
65 private ServiceToken mToken;
\r
67 private final long[] mHits = new long[3];
\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
75 // Control Media volume
\r
76 setVolumeControlStream(AudioManager.STREAM_MUSIC);
\r
79 setContentView(R.layout.track_browser);
\r
84 // Update the colorstrip color
\r
87 // Update the ActionBar
\r
90 // Update the half_and_half layout
\r
96 // Update the BottomActionBar
\r
97 initBottomActionBar();
\r
98 super.onCreate(icicle);
\r
102 public void onSaveInstanceState(Bundle outcicle) {
\r
103 outcicle.putAll(bundle);
\r
104 super.onSaveInstanceState(outcicle);
\r
108 public void onServiceConnected(ComponentName name, IBinder obj) {
\r
109 MusicUtils.mService = IApolloService.Stub.asInterface(obj);
\r
113 public void onServiceDisconnected(ComponentName name) {
\r
114 MusicUtils.mService = null;
\r
118 * Update next BottomActionBar as needed
\r
120 private final BroadcastReceiver mMediaStatusReceiver = new BroadcastReceiver() {
\r
123 public void onReceive(Context context, Intent intent) {
\r
124 if (ApolloUtils.isArtist(mimeType) || ApolloUtils.isAlbum(mimeType))
\r
131 protected void onStart() {
\r
133 mToken = MusicUtils.bindToService(this, this);
\r
135 IntentFilter filter = new IntentFilter();
\r
136 filter.addAction(ApolloService.META_CHANGED);
\r
137 registerReceiver(mMediaStatusReceiver, filter);
\r
144 protected void onStop() {
\r
146 if (MusicUtils.mService != null)
\r
147 MusicUtils.unbindFromService(mToken);
\r
149 unregisterReceiver(mMediaStatusReceiver);
\r
154 public boolean onOptionsItemSelected(MenuItem item) {
\r
155 switch (item.getItemId()) {
\r
156 case android.R.id.home:
\r
158 long id = ApolloUtils.getArtistId(getArtist(), ARTIST_ID, this);
\r
159 if (ApolloUtils.isAlbum(mimeType) && id != 0)
\r
161 super.onBackPressed();
\r
166 return super.onOptionsItemSelected(item);
\r
171 * @return what Bundle we're dealing with
\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
179 if (bundle.getString(INTENT_ACTION) == null) {
\r
180 bundle.putString(INTENT_ACTION, intent.getAction());
\r
182 if (bundle.getString(MIME_TYPE) == null) {
\r
183 bundle.putString(MIME_TYPE, intent.getType());
\r
185 mimeType = bundle.getString(MIME_TYPE);
\r
189 * For the theme chooser
\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
198 * Set the ActionBar title
\r
200 private void initActionBar() {
\r
201 ApolloUtils.showUpTitleOnly(getActionBar());
\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
207 TextView actionBarTitle = (TextView)findViewById(titleId);
\r
208 ImageView actionBarUp = (ImageView)findViewById(upId);
\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
218 * Sets up the @half_and_half.xml layout
\r
220 private void initUpperHalf() {
\r
222 if (ApolloUtils.isArtist(mimeType)) {
\r
223 // Get next artist image
\r
224 } else if (ApolloUtils.isAlbum(mimeType)) {
\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
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
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
250 * Initiate ViewPager and PagerAdapter
\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
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
269 ThemeUtils.initThemeChooser(this, mViewPager, "viewpager", THEME_ITEM_BACKGROUND);
\r
270 ThemeUtils.setMarginDrawable(this, mViewPager, "viewpager_margin");
\r
274 * Initiate the BottomActionBar
\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
285 * @return artist name from Bundle
\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
294 * @return album name from Bundle
\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
303 * @return genre name from Bundle
\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
312 * @return playlist name from Bundle
\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
321 * Set the header when viewing a genre
\r
323 public void setPromoImage() {
\r
325 // Artist image & Genre image
\r
326 ImageView mFirstHalfImage = (ImageView)findViewById(R.id.half_artist_image);
\r
328 Bitmap header = BitmapFactory.decodeResource(getResources(), R.drawable.promo);
\r
329 ApolloUtils.runnableBackground(mFirstHalfImage, header);
\r
333 * Cache and set artist image
\r
335 public void setArtistImage() {
\r
337 // Artist image & Genre image
\r
338 final ImageView mFirstHalfImage = (ImageView)findViewById(R.id.half_artist_image);
\r
340 mFirstHalfImage.post(new Runnable() {
\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
353 mFirstHalfImage.setOnClickListener(new OnClickListener() {
\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
369 * Cache and set album image
\r
371 public void setAlbumImage() {
\r
374 final ImageView mSecondHalfImage = (ImageView)findViewById(R.id.half_album_image);
\r
376 mSecondHalfImage.post(new Runnable() {
\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
384 // Get and set cached image
\r
385 new GetCachedImages(TracksBrowser.this, 1, mSecondHalfImage).executeOnExecutor(
\r
386 AsyncTask.THREAD_POOL_EXECUTOR, getAlbum());
\r
392 * Return here from viewing the tracks for an album and view all albums and
\r
393 * tracks for the same artist
\r
395 private void tracksBrowser(long id) {
\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
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
408 * Set the correct title
\r
410 private void setTitle() {
\r
413 if (Audio.Playlists.CONTENT_TYPE.equals(mimeType)) {
\r
414 id = bundle.getLong(BaseColumns._ID);
\r
416 case (int)PLAYLIST_QUEUE:
\r
417 setTitle(R.string.nowplaying);
\r
419 case (int)PLAYLIST_FAVORITES:
\r
420 setTitle(R.string.favorite);
\r
424 setTitle(R.string.app_name);
\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
439 setTitle(R.string.app_name);
\r