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.R;
19 import com.cyngn.eleven.adapters.AlbumDetailSongAdapter;
20 import com.cyngn.eleven.adapters.DetailSongAdapter;
21 import com.cyngn.eleven.cache.ImageFetcher;
22 import com.cyngn.eleven.menu.DeleteDialog;
23 import com.cyngn.eleven.model.Album;
24 import com.cyngn.eleven.model.Song;
25 import com.cyngn.eleven.utils.AlbumPopupMenuHelper;
26 import com.cyngn.eleven.utils.GenreFetcher;
27 import com.cyngn.eleven.utils.MusicUtils;
28 import com.cyngn.eleven.utils.PopupMenuHelper;
29 import com.cyngn.eleven.utils.SongPopupMenuHelper;
30 import com.cyngn.eleven.widgets.IPopupMenuCallback;
31 import com.cyngn.eleven.widgets.PopupMenuButton;
33 import java.util.List;
34 import java.util.Locale;
36 public class AlbumDetailActivity extends SlidingPanelActivity {
37 private static final int LOADER_ID = 1;
39 private ListView mSongs;
40 private DetailSongAdapter mSongAdapter;
41 private TextView mAlbumDuration;
42 private TextView mGenre;
43 private PopupMenuHelper mPopupMenuHelper;
44 private PopupMenuButton mPopupMenuButton;
45 private PopupMenuHelper mHeaderPopupMenuHelper;
46 private long mAlbumId;
47 private String mArtistName;
48 private String mAlbumName;
51 protected void onCreate(Bundle savedInstanceState) {
52 super.onCreate(savedInstanceState);
54 Bundle arguments = getIntent().getExtras();
55 String artistName = arguments.getString(Config.ARTIST_NAME);
57 setupActionBar(artistName);
59 View root = findViewById(R.id.activity_base_content);
61 setupPopupMenuHelper();
62 setupHeader(root, artistName, arguments);
65 LoaderManager lm = getSupportLoaderManager();
66 lm.initLoader(LOADER_ID, arguments, mSongAdapter);
69 private void setupHeader(View root, String artist, Bundle arguments) {
70 mAlbumId = arguments.getLong(Config.ID);
72 mAlbumName = arguments.getString(Config.NAME);
73 String year = arguments.getString(Config.ALBUM_YEAR);
74 int songCount = arguments.getInt(Config.SONG_COUNT);
76 ImageView albumArt = (ImageView)root.findViewById(R.id.album_art);
77 albumArt.setContentDescription(mAlbumName);
78 ImageFetcher.getInstance(this).loadAlbumImage(artist, mAlbumName, mAlbumId, albumArt);
80 TextView title = (TextView)root.findViewById(R.id.title);
81 title.setText(mAlbumName);
83 setupCountAndYear(root, year, songCount);
85 // will be updated once we have song data
86 mAlbumDuration = (TextView)root.findViewById(R.id.duration);
87 mGenre = (TextView)root.findViewById(R.id.genre);
89 mPopupMenuButton = (PopupMenuButton)root.findViewById(R.id.overflow);
90 mPopupMenuButton.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
92 public void onPopupMenuClicked(View v, int position) {
93 mHeaderPopupMenuHelper.showPopupMenu(v, position);
98 private void setupCountAndYear(View root, String year, int songCount) {
99 TextView songCountAndYear = (TextView)root.findViewById(R.id.song_count_and_year);
101 String countText = getResources().
102 getQuantityString(R.plurals.Nsongs, songCount, songCount);
104 songCountAndYear.setText(countText);
106 songCountAndYear.setText(getString(R.string.combine_two_strings, countText, year));
108 } else if(year != null) {
109 songCountAndYear.setText(year);
113 private void setupPopupMenuHelper() {
114 mPopupMenuHelper = new SongPopupMenuHelper(this, getSupportFragmentManager()) {
116 public Song getSong(int position) {
117 return mSongAdapter.getItem(position);
121 mHeaderPopupMenuHelper = new AlbumPopupMenuHelper(this, getSupportFragmentManager()) {
122 public Album getAlbum(int position) {
123 return new Album(mAlbumId, mAlbumName, mArtistName, -1, null);
128 private void setupSongList(View root) {
129 mSongs = (ListView)root.findViewById(R.id.songs);
130 mSongAdapter = new AlbumDetailSongAdapter(this);
131 mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
133 public void onPopupMenuClicked(View v, int position) {
134 mPopupMenuHelper.showPopupMenu(v, position);
137 mSongs.setAdapter(mSongAdapter);
138 mSongs.setOnItemClickListener(mSongAdapter);
142 protected int getLayoutToInflate() { return R.layout.activity_album_detail; }
144 protected void setupActionBar(String name) {
145 ActionBar actionBar = getActionBar();
146 actionBar.setTitle(name.toUpperCase(Locale.getDefault()));
147 actionBar.setIcon(R.drawable.ic_action_back);
148 actionBar.setHomeButtonEnabled(true);
151 /** cause action bar icon tap to act like back -- boo-urns! */
153 public boolean onOptionsItemSelected(MenuItem item) {
154 switch (item.getItemId()) {
155 case android.R.id.home:
159 return super.onOptionsItemSelected(item);
163 /** called back by song loader */
164 public void update(List<Song> songs) {
165 /** compute total run time for album */
167 for(Song s : songs) { duration += s.mDuration; }
168 updateDuration(duration);
170 /** use the first song on the album to get a genre */
171 if(!songs.isEmpty()) {
172 GenreFetcher.fetch(this, (int)songs.get(0).mSongId, mGenre);
174 // no songs, quit this page
179 public void updateDuration(int duration) {
180 int mins = Math.round(duration/60);
184 String durationText = (hours == 0)
185 ? getString(R.string.duration_album_mins_only, mins)
186 : getString(R.string.duration_album_hour_mins, hours, mins);
188 mAlbumDuration.setText(durationText);
192 public void restartLoader() {
193 super.restartLoader();
195 getSupportLoaderManager().restartLoader(LOADER_ID, getIntent().getExtras(), mSongAdapter);