OSDN Git Service

Eleven: Add loading dialogs to all fragments
[android-x86/packages-apps-Eleven.git] / src / com / cyngn / eleven / ui / fragments / AlbumDetailFragment.java
1 package com.cyngn.eleven.ui.fragments;
2
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;
9
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;
24
25 import java.util.List;
26
27 public class AlbumDetailFragment extends BaseFragment {
28     private static final int LOADER_ID = 1;
29
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;
41
42     @Override
43     protected int getLayoutToInflate() {
44         return R.layout.activity_album_detail;
45     }
46
47     @Override
48     protected String getTitle() {
49         return getArguments().getString(Config.ARTIST_NAME);
50     }
51
52     @Override
53     protected void onViewCreated() {
54         super.onViewCreated();
55
56         Bundle arguments = getArguments();
57         String artistName = arguments.getString(Config.ARTIST_NAME);
58
59         setupPopupMenuHelper();
60         setupHeader(artistName, arguments);
61         setupSongList();
62
63         LoaderManager lm = getLoaderManager();
64         lm.initLoader(LOADER_ID, arguments, mSongAdapter);
65     }
66
67     private void setupHeader(String artist, Bundle arguments) {
68         mAlbumId = arguments.getLong(Config.ID);
69         mArtistName = artist;
70         mAlbumName = arguments.getString(Config.NAME);
71         String year = arguments.getString(Config.ALBUM_YEAR);
72         int songCount = arguments.getInt(Config.SONG_COUNT);
73
74         ImageView albumArt = (ImageView)mRootView.findViewById(R.id.album_art);
75         albumArt.setContentDescription(mAlbumName);
76         ImageFetcher.getInstance(getActivity()).loadAlbumImage(artist, mAlbumName, mAlbumId, albumArt);
77
78         TextView title = (TextView)mRootView.findViewById(R.id.title);
79         title.setText(mAlbumName);
80
81         setupCountAndYear(mRootView, year, songCount);
82
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);
86
87         mPopupMenuButton = (PopupMenuButton)mRootView.findViewById(R.id.overflow);
88         mPopupMenuButton.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
89             @Override
90             public void onPopupMenuClicked(View v, int position) {
91                 mHeaderPopupMenuHelper.showPopupMenu(v, position);
92             }
93         });
94     }
95
96     private void setupCountAndYear(View root, String year, int songCount) {
97         TextView songCountAndYear = (TextView)root.findViewById(R.id.song_count_and_year);
98         if(songCount > 0) {
99             String countText = getResources().
100                     getQuantityString(R.plurals.Nsongs, songCount, songCount);
101             if(year == null) {
102                 songCountAndYear.setText(countText);
103             } else {
104                 songCountAndYear.setText(getString(R.string.combine_two_strings, countText, year));
105             }
106         } else if(year != null) {
107             songCountAndYear.setText(year);
108         }
109     }
110
111     private void setupPopupMenuHelper() {
112         mPopupMenuHelper = new SongPopupMenuHelper(getActivity(), getChildFragmentManager()) {
113             @Override
114             public Song getSong(int position) {
115                 return mSongAdapter.getItem(position);
116             }
117         };
118
119         mHeaderPopupMenuHelper = new AlbumPopupMenuHelper(getActivity(), getChildFragmentManager()) {
120             public Album getAlbum(int position) {
121                 return new Album(mAlbumId, mAlbumName, mArtistName, -1, null);
122             }
123         };
124     }
125
126     private void setupSongList() {
127         mSongs = (ListView)mRootView.findViewById(R.id.songs);
128         mSongAdapter = new AlbumDetailSongAdapter(getActivity(), this) {
129             @Override
130             protected void onLoading() {
131                 mLoadingEmptyContainer.showLoading();
132             }
133
134             @Override
135             protected void onNoResults() {
136                 getContainingActivity().postRemoveFragment(AlbumDetailFragment.this);
137             }
138         };
139         mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
140             @Override
141             public void onPopupMenuClicked(View v, int position) {
142                 mPopupMenuHelper.showPopupMenu(v, position);
143             }
144         });
145         mSongs.setAdapter(mSongAdapter);
146         mSongs.setOnItemClickListener(mSongAdapter);
147         mLoadingEmptyContainer =
148                 (LoadingEmptyContainer)mRootView.findViewById(R.id.loading_empty_container);
149         mSongs.setEmptyView(mLoadingEmptyContainer);
150     }
151
152     /** called back by song loader */
153     public void update(List<Song> songs) {
154         /** compute total run time for album */
155         int duration = 0;
156         for(Song s : songs) { duration += s.mDuration; }
157         updateDuration(duration);
158
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);
162         }
163     }
164
165     public void updateDuration(int duration) {
166         int mins = Math.round(duration/60);
167         int hours = mins/60;
168         mins %= 60;
169
170         String durationText = (hours == 0)
171             ? getString(R.string.duration_album_mins_only, mins)
172             : getString(R.string.duration_album_hour_mins, hours, mins);
173
174         mAlbumDuration.setText(durationText);
175     }
176
177     @Override
178     public void restartLoader() {
179         getLoaderManager().restartLoader(LOADER_ID, getArguments(), mSongAdapter);
180     }
181 }