1 package com.cyngn.eleven.ui.fragments;
3 import android.os.Bundle;
4 import android.support.v4.app.LoaderManager;
5 import android.view.View;
6 import android.widget.ImageView;
7 import android.widget.ListView;
8 import android.widget.TextView;
10 import com.cyngn.eleven.Config;
11 import com.cyngn.eleven.R;
12 import com.cyngn.eleven.adapters.AlbumDetailSongAdapter;
13 import com.cyngn.eleven.adapters.DetailSongAdapter;
14 import com.cyngn.eleven.cache.ImageFetcher;
15 import com.cyngn.eleven.model.Album;
16 import com.cyngn.eleven.model.Song;
17 import com.cyngn.eleven.utils.AlbumPopupMenuHelper;
18 import com.cyngn.eleven.utils.GenreFetcher;
19 import com.cyngn.eleven.utils.PopupMenuHelper;
20 import com.cyngn.eleven.utils.SongPopupMenuHelper;
21 import com.cyngn.eleven.widgets.IPopupMenuCallback;
22 import com.cyngn.eleven.widgets.LoadingEmptyContainer;
23 import com.cyngn.eleven.widgets.PopupMenuButton;
25 import java.util.List;
27 public class AlbumDetailFragment extends BaseFragment {
28 private static final int LOADER_ID = 1;
30 private ListView mSongs;
31 private DetailSongAdapter mSongAdapter;
32 private TextView mAlbumDuration;
33 private TextView mGenre;
34 private PopupMenuHelper mPopupMenuHelper;
35 private PopupMenuButton mPopupMenuButton;
36 private PopupMenuHelper mHeaderPopupMenuHelper;
37 private long mAlbumId;
38 private String mArtistName;
39 private String mAlbumName;
40 private LoadingEmptyContainer mLoadingEmptyContainer;
43 protected int getLayoutToInflate() {
44 return R.layout.activity_album_detail;
48 protected String getTitle() {
49 return getArguments().getString(Config.ARTIST_NAME);
53 protected void onViewCreated() {
54 super.onViewCreated();
56 Bundle arguments = getArguments();
57 String artistName = arguments.getString(Config.ARTIST_NAME);
59 setupPopupMenuHelper();
60 setupHeader(artistName, arguments);
63 LoaderManager lm = getLoaderManager();
64 lm.initLoader(LOADER_ID, arguments, mSongAdapter);
67 private void setupHeader(String artist, Bundle arguments) {
68 mAlbumId = arguments.getLong(Config.ID);
70 mAlbumName = arguments.getString(Config.NAME);
71 String year = arguments.getString(Config.ALBUM_YEAR);
72 int songCount = arguments.getInt(Config.SONG_COUNT);
74 ImageView albumArt = (ImageView)mRootView.findViewById(R.id.album_art);
75 albumArt.setContentDescription(mAlbumName);
76 ImageFetcher.getInstance(getActivity()).loadAlbumImage(artist, mAlbumName, mAlbumId, albumArt);
78 TextView title = (TextView)mRootView.findViewById(R.id.title);
79 title.setText(mAlbumName);
81 setupCountAndYear(mRootView, year, songCount);
83 // will be updated once we have song data
84 mAlbumDuration = (TextView)mRootView.findViewById(R.id.duration);
85 mGenre = (TextView)mRootView.findViewById(R.id.genre);
87 mPopupMenuButton = (PopupMenuButton)mRootView.findViewById(R.id.overflow);
88 mPopupMenuButton.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
90 public void onPopupMenuClicked(View v, int position) {
91 mHeaderPopupMenuHelper.showPopupMenu(v, position);
96 private void setupCountAndYear(View root, String year, int songCount) {
97 TextView songCountAndYear = (TextView)root.findViewById(R.id.song_count_and_year);
99 String countText = getResources().
100 getQuantityString(R.plurals.Nsongs, songCount, songCount);
102 songCountAndYear.setText(countText);
104 songCountAndYear.setText(getString(R.string.combine_two_strings, countText, year));
106 } else if(year != null) {
107 songCountAndYear.setText(year);
111 private void setupPopupMenuHelper() {
112 mPopupMenuHelper = new SongPopupMenuHelper(getActivity(), getChildFragmentManager()) {
114 public Song getSong(int position) {
115 return mSongAdapter.getItem(position);
119 mHeaderPopupMenuHelper = new AlbumPopupMenuHelper(getActivity(), getChildFragmentManager()) {
120 public Album getAlbum(int position) {
121 return new Album(mAlbumId, mAlbumName, mArtistName, -1, null);
126 private void setupSongList() {
127 mSongs = (ListView)mRootView.findViewById(R.id.songs);
128 mSongAdapter = new AlbumDetailSongAdapter(getActivity(), this) {
130 protected void onLoading() {
131 mLoadingEmptyContainer.showLoading();
135 protected void onNoResults() {
136 getContainingActivity().postRemoveFragment(AlbumDetailFragment.this);
139 mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
141 public void onPopupMenuClicked(View v, int position) {
142 mPopupMenuHelper.showPopupMenu(v, position);
145 mSongs.setAdapter(mSongAdapter);
146 mSongs.setOnItemClickListener(mSongAdapter);
147 mLoadingEmptyContainer =
148 (LoadingEmptyContainer)mRootView.findViewById(R.id.loading_empty_container);
149 mSongs.setEmptyView(mLoadingEmptyContainer);
152 /** called back by song loader */
153 public void update(List<Song> songs) {
154 /** compute total run time for album */
156 for(Song s : songs) { duration += s.mDuration; }
157 updateDuration(duration);
159 /** use the first song on the album to get a genre */
160 if(!songs.isEmpty()) {
161 GenreFetcher.fetch(getActivity(), (int) songs.get(0).mSongId, mGenre);
165 public void updateDuration(int duration) {
166 int mins = Math.round(duration/60);
170 String durationText = (hours == 0)
171 ? getString(R.string.duration_album_mins_only, mins)
172 : getString(R.string.duration_album_hour_mins, hours, mins);
174 mAlbumDuration.setText(durationText);
178 public void restartLoader() {
179 getLoaderManager().restartLoader(LOADER_ID, getArguments(), mSongAdapter);