5 package com.andrew.apollo.activities;
\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
42 import static com.andrew.apollo.Constants.*;
\r
45 * @author Andrew Neal
\r
46 * @Note This displays specific track or album listings
\r
48 public class TracksBrowser extends FragmentActivity implements ServiceConnection {
\r
51 private Bundle bundle;
\r
53 private Intent intent;
\r
55 private String mimeType;
\r
57 private ServiceToken mToken;
\r
59 private final long[] mHits = new long[3];
\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
67 // Control Media volume
\r
68 setVolumeControlStream(AudioManager.STREAM_MUSIC);
\r
71 setContentView(R.layout.track_browser);
\r
76 // Update the colorstrip color
\r
79 // Update the ActionBar
\r
82 // Update the half_and_half layout
\r
88 // Update the BottomActionBar
\r
89 initBottomActionBar();
\r
90 super.onCreate(icicle);
\r
94 public void onSaveInstanceState(Bundle outcicle) {
\r
95 outcicle.putAll(bundle);
\r
96 super.onSaveInstanceState(outcicle);
\r
100 public void onServiceConnected(ComponentName name, IBinder obj) {
\r
101 MusicUtils.mService = IApolloService.Stub.asInterface(obj);
\r
105 public void onServiceDisconnected(ComponentName name) {
\r
106 MusicUtils.mService = null;
\r
110 * Update next BottomActionBar as needed
\r
112 private final BroadcastReceiver mMediaStatusReceiver = new BroadcastReceiver() {
\r
115 public void onReceive(Context context, Intent intent) {
\r
116 if (ApolloUtils.isArtist(mimeType) || ApolloUtils.isAlbum(mimeType))
\r
123 protected void onStart() {
\r
125 mToken = MusicUtils.bindToService(this, this);
\r
127 IntentFilter filter = new IntentFilter();
\r
128 filter.addAction(ApolloService.META_CHANGED);
\r
129 registerReceiver(mMediaStatusReceiver, filter);
\r
136 protected void onStop() {
\r
138 if (MusicUtils.mService != null)
\r
139 MusicUtils.unbindFromService(mToken);
\r
141 unregisterReceiver(mMediaStatusReceiver);
\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
153 long artistID = ApolloUtils.getArtistId(getArtist(), ARTIST_ID, this);
\r
154 if (ApolloUtils.isAlbum(mimeType) && artistID != 0)
\r
155 tracksBrowser(artistID);
\r
161 return super.onOptionsItemSelected(item);
\r
166 * @return what Bundle we're dealing with
\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
174 if (bundle.getString(INTENT_ACTION) == null) {
\r
175 bundle.putString(INTENT_ACTION, intent.getAction());
\r
177 if (bundle.getString(MIME_TYPE) == null) {
\r
178 bundle.putString(MIME_TYPE, intent.getType());
\r
180 mimeType = bundle.getString(MIME_TYPE);
\r
184 * For the theme chooser
\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
193 * Set the ActionBar title
\r
195 private void initActionBar() {
\r
196 ApolloUtils.showUpTitleOnly(getActionBar());
\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
202 TextView actionBarTitle = (TextView)findViewById(titleId);
\r
203 ImageView actionBarUp = (ImageView)findViewById(upId);
\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
213 * Sets up the @half_and_half.xml layout
\r
215 private void initUpperHalf() {
\r
217 if (ApolloUtils.isArtist(mimeType)) {
\r
218 // Get next artist image
\r
219 } else if (ApolloUtils.isAlbum(mimeType)) {
\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
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
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
245 * Initiate ViewPager and PagerAdapter
\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
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
264 ThemeUtils.initThemeChooser(this, mViewPager, "viewpager", THEME_ITEM_BACKGROUND);
\r
265 ThemeUtils.setMarginDrawable(this, mViewPager, "viewpager_margin");
\r
269 * Initiate the BottomActionBar
\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
280 * @return artist name from Bundle
\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
289 * @return album name from Bundle
\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
298 * @return genre name from Bundle
\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
307 * @return playlist name from Bundle
\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
316 * Set the header when viewing a genre
\r
318 public void setPromoImage() {
\r
320 // Artist image & Genre image
\r
321 ImageView mFirstHalfImage = (ImageView)findViewById(R.id.half_artist_image);
\r
323 Bitmap header = BitmapFactory.decodeResource(getResources(), R.drawable.promo);
\r
324 ApolloUtils.runnableBackground(mFirstHalfImage, header);
\r
328 * Cache and set artist image
\r
330 public void setArtistImage() {
\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
336 mFirstHalfImage.setOnClickListener(new OnClickListener() {
\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
352 * Cache and set album image
\r
354 public void setAlbumImage() {
\r
357 final ImageView mSecondHalfImage = (ImageView)findViewById(R.id.half_album_image);
\r
358 ImageUtils.setAlbumImage(mSecondHalfImage, getArtist(), getAlbum());
\r
362 * Return here from viewing the tracks for an album and view all albums and
\r
363 * tracks for the same artist
\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
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
377 * Set the correct title
\r
379 private void setTitle() {
\r
382 if (Audio.Playlists.CONTENT_TYPE.equals(mimeType)) {
\r
383 id = bundle.getLong(BaseColumns._ID);
\r
385 case (int)PLAYLIST_QUEUE:
\r
386 setTitle(R.string.nowplaying);
\r
388 case (int)PLAYLIST_FAVORITES:
\r
389 setTitle(R.string.favorite);
\r
393 setTitle(R.string.app_name);
\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
408 setTitle(R.string.app_name);
\r