OSDN Git Service

Eleven: Add the context menu items to the 2nd layer
[android-x86/packages-apps-Eleven.git] / src / com / cyngn / eleven / ui / activities / AlbumDetailActivity.java
1 package com.cyngn.eleven.ui.activities;
2
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;
16
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;
33
34 import java.util.List;
35 import java.util.Locale;
36
37 public class AlbumDetailActivity extends SlidingPanelActivity implements MusicStateListener {
38     private static final int LOADER_ID = 1;
39
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;
50
51     @Override
52     protected void onCreate(Bundle savedInstanceState) {
53         super.onCreate(savedInstanceState);
54
55         Bundle arguments = getIntent().getExtras();
56         String artistName = arguments.getString(Config.ARTIST_NAME);
57
58         setupActionBar(artistName);
59
60         View root = findViewById(R.id.activity_base_content);
61
62         setupPopupMenuHelper();
63         setupHeader(root, artistName, arguments);
64         setupSongList(root);
65
66         LoaderManager lm = getSupportLoaderManager();
67         lm.initLoader(LOADER_ID, arguments, mSongAdapter);
68
69         // listen to music state changes
70         setMusicStateListenerListener(this);
71     }
72
73     private void setupHeader(View root, String artist, Bundle arguments) {
74         mAlbumId = arguments.getLong(Config.ID);
75         mArtistName = artist;
76         mAlbumName = arguments.getString(Config.NAME);
77         String year = arguments.getString(Config.ALBUM_YEAR);
78         int songCount = arguments.getInt(Config.SONG_COUNT);
79
80         ImageView albumArt = (ImageView)root.findViewById(R.id.album_art);
81         albumArt.setContentDescription(mAlbumName);
82         ImageFetcher.getInstance(this).loadAlbumImage(artist, mAlbumName, mAlbumId, albumArt);
83
84         TextView title = (TextView)root.findViewById(R.id.title);
85         title.setText(mAlbumName);
86
87         setupCountAndYear(root, year, songCount);
88
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);
92
93         mPopupMenuButton = (PopupMenuButton)root.findViewById(R.id.overflow);
94         mPopupMenuButton.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
95             @Override
96             public void onPopupMenuClicked(View v, int position) {
97                 mHeaderPopupMenuHelper.showPopupMenu(v, position);
98             }
99         });
100     }
101
102     private void setupCountAndYear(View root, String year, int songCount) {
103         TextView songCountAndYear = (TextView)root.findViewById(R.id.song_count_and_year);
104         if(songCount > 0) {
105             String countText = getResources().
106                     getQuantityString(R.plurals.Nsongs, songCount, songCount);
107             if(year == null) {
108                 songCountAndYear.setText(countText);
109             } else {
110                 songCountAndYear.setText(getString(R.string.combine_two_strings, countText, year));
111             }
112         } else if(year != null) {
113             songCountAndYear.setText(year);
114         }
115     }
116
117     private void setupPopupMenuHelper() {
118         mPopupMenuHelper = new SongPopupMenuHelper(this, getSupportFragmentManager()) {
119             @Override
120             public Song getSong(int position) {
121                 return mSongAdapter.getItem(position);
122             }
123         };
124
125         mHeaderPopupMenuHelper = new AlbumPopupMenuHelper(this, getSupportFragmentManager()) {
126             public Album getAlbum(int position) {
127                 return new Album(mAlbumId, mAlbumName, mArtistName, -1, null);
128             }
129         };
130     }
131
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() {
136             @Override
137             public void onPopupMenuClicked(View v, int position) {
138                 mPopupMenuHelper.showPopupMenu(v, position);
139             }
140         });
141         mSongs.setAdapter(mSongAdapter);
142         mSongs.setOnItemClickListener(mSongAdapter);
143     }
144
145     @Override
146     protected int getLayoutToInflate() { return R.layout.activity_album_detail; }
147
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);
153     }
154
155     /** cause action bar icon tap to act like back -- boo-urns! */
156     @Override
157     public boolean onOptionsItemSelected(MenuItem item) {
158         switch (item.getItemId()) {
159             case android.R.id.home:
160                 finish();
161                 return true;
162             default:
163                 return super.onOptionsItemSelected(item);
164         }
165     }
166
167     /** called back by song loader */
168     public void update(List<Song> songs) {
169         /** compute total run time for album */
170         int duration = 0;
171         for(Song s : songs) { duration += s.mDuration; }
172         updateDuration(duration);
173
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);
177         } else {
178             // no songs, quit this page
179             finish();
180         }
181     }
182
183     public void updateDuration(int duration) {
184         int mins = Math.round(duration/60);
185         int hours = mins/60;
186         mins %= 60;
187
188         String durationText = (hours == 0)
189             ? getString(R.string.duration_album_mins_only, mins)
190             : getString(R.string.duration_album_hour_mins, hours, mins);
191
192         mAlbumDuration.setText(durationText);
193     }
194
195     @Override
196     public void restartLoader() {
197         getSupportLoaderManager().restartLoader(LOADER_ID, getIntent().getExtras(), mSongAdapter);
198     }
199
200     @Override
201     public void onMetaChanged() {
202
203     }
204 }