1 package com.cyngn.eleven.ui.activities;
3 import android.app.ActionBar;
4 import android.database.Cursor;
5 import android.net.Uri;
6 import android.os.AsyncTask;
7 import android.os.Bundle;
8 import android.provider.MediaStore;
9 import android.support.v4.app.FragmentManager;
10 import android.support.v4.app.LoaderManager;
11 import android.view.MenuItem;
12 import android.view.View;
13 import android.widget.ImageView;
14 import android.widget.ListView;
15 import android.widget.TextView;
17 import com.cyngn.eleven.Config;
18 import com.cyngn.eleven.MusicStateListener;
19 import com.cyngn.eleven.R;
20 import com.cyngn.eleven.adapters.AlbumDetailSongAdapter;
21 import com.cyngn.eleven.adapters.DetailSongAdapter;
22 import com.cyngn.eleven.cache.ImageFetcher;
23 import com.cyngn.eleven.menu.DeleteDialog;
24 import com.cyngn.eleven.model.Album;
25 import com.cyngn.eleven.model.Song;
26 import com.cyngn.eleven.utils.AlbumPopupMenuHelper;
27 import com.cyngn.eleven.utils.GenreFetcher;
28 import com.cyngn.eleven.utils.MusicUtils;
29 import com.cyngn.eleven.utils.PopupMenuHelper;
30 import com.cyngn.eleven.utils.SongPopupMenuHelper;
31 import com.cyngn.eleven.widgets.IPopupMenuCallback;
32 import com.cyngn.eleven.widgets.PopupMenuButton;
34 import java.util.List;
35 import java.util.Locale;
37 public class AlbumDetailActivity extends SlidingPanelActivity implements MusicStateListener {
38 private static final int LOADER_ID = 1;
40 private ListView mSongs;
41 private DetailSongAdapter mSongAdapter;
42 private TextView mAlbumDuration;
43 private TextView mGenre;
44 private PopupMenuHelper mPopupMenuHelper;
45 private PopupMenuButton mPopupMenuButton;
46 private PopupMenuHelper mHeaderPopupMenuHelper;
47 private long mAlbumId;
48 private String mArtistName;
49 private String mAlbumName;
52 protected void onCreate(Bundle savedInstanceState) {
53 super.onCreate(savedInstanceState);
55 Bundle arguments = getIntent().getExtras();
56 String artistName = arguments.getString(Config.ARTIST_NAME);
58 setupActionBar(artistName);
60 View root = findViewById(R.id.activity_base_content);
62 setupPopupMenuHelper();
63 setupHeader(root, artistName, arguments);
66 LoaderManager lm = getSupportLoaderManager();
67 lm.initLoader(LOADER_ID, arguments, mSongAdapter);
69 // listen to music state changes
70 setMusicStateListenerListener(this);
73 private void setupHeader(View root, String artist, Bundle arguments) {
74 mAlbumId = arguments.getLong(Config.ID);
76 mAlbumName = arguments.getString(Config.NAME);
77 String year = arguments.getString(Config.ALBUM_YEAR);
78 int songCount = arguments.getInt(Config.SONG_COUNT);
80 ImageView albumArt = (ImageView)root.findViewById(R.id.album_art);
81 albumArt.setContentDescription(mAlbumName);
82 ImageFetcher.getInstance(this).loadAlbumImage(artist, mAlbumName, mAlbumId, albumArt);
84 TextView title = (TextView)root.findViewById(R.id.title);
85 title.setText(mAlbumName);
87 setupCountAndYear(root, year, songCount);
89 // will be updated once we have song data
90 mAlbumDuration = (TextView)root.findViewById(R.id.duration);
91 mGenre = (TextView)root.findViewById(R.id.genre);
93 mPopupMenuButton = (PopupMenuButton)root.findViewById(R.id.overflow);
94 mPopupMenuButton.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
96 public void onPopupMenuClicked(View v, int position) {
97 mHeaderPopupMenuHelper.showPopupMenu(v, position);
102 private void setupCountAndYear(View root, String year, int songCount) {
103 TextView songCountAndYear = (TextView)root.findViewById(R.id.song_count_and_year);
105 String countText = getResources().
106 getQuantityString(R.plurals.Nsongs, songCount, songCount);
108 songCountAndYear.setText(countText);
110 songCountAndYear.setText(getString(R.string.combine_two_strings, countText, year));
112 } else if(year != null) {
113 songCountAndYear.setText(year);
117 private void setupPopupMenuHelper() {
118 mPopupMenuHelper = new SongPopupMenuHelper(this, getSupportFragmentManager()) {
120 public Song getSong(int position) {
121 return mSongAdapter.getItem(position);
125 mHeaderPopupMenuHelper = new AlbumPopupMenuHelper(this, getSupportFragmentManager()) {
126 public Album getAlbum(int position) {
127 return new Album(mAlbumId, mAlbumName, mArtistName, -1, null);
132 private void setupSongList(View root) {
133 mSongs = (ListView)root.findViewById(R.id.songs);
134 mSongAdapter = new AlbumDetailSongAdapter(this);
135 mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
137 public void onPopupMenuClicked(View v, int position) {
138 mPopupMenuHelper.showPopupMenu(v, position);
141 mSongs.setAdapter(mSongAdapter);
142 mSongs.setOnItemClickListener(mSongAdapter);
146 protected int getLayoutToInflate() { return R.layout.activity_album_detail; }
148 protected void setupActionBar(String name) {
149 ActionBar actionBar = getActionBar();
150 actionBar.setTitle(name.toUpperCase(Locale.getDefault()));
151 actionBar.setIcon(R.drawable.ic_action_back);
152 actionBar.setHomeButtonEnabled(true);
155 /** cause action bar icon tap to act like back -- boo-urns! */
157 public boolean onOptionsItemSelected(MenuItem item) {
158 switch (item.getItemId()) {
159 case android.R.id.home:
163 return super.onOptionsItemSelected(item);
167 /** called back by song loader */
168 public void update(List<Song> songs) {
169 /** compute total run time for album */
171 for(Song s : songs) { duration += s.mDuration; }
172 updateDuration(duration);
174 /** use the first song on the album to get a genre */
175 if(!songs.isEmpty()) {
176 GenreFetcher.fetch(this, (int)songs.get(0).mSongId, mGenre);
178 // no songs, quit this page
183 public void updateDuration(int duration) {
184 int mins = Math.round(duration/60);
188 String durationText = (hours == 0)
189 ? getString(R.string.duration_album_mins_only, mins)
190 : getString(R.string.duration_album_hour_mins, hours, mins);
192 mAlbumDuration.setText(durationText);
196 public void restartLoader() {
197 getSupportLoaderManager().restartLoader(LOADER_ID, getIntent().getExtras(), mSongAdapter);
201 public void onMetaChanged() {