OSDN Git Service

Eleven: Add loading dialogs to all fragments
[android-x86/packages-apps-Eleven.git] / src / com / cyngn / eleven / ui / fragments / ArtistDetailFragment.java
1 package com.cyngn.eleven.ui.fragments;
2
3 import android.os.Bundle;
4 import android.support.v4.app.LoaderManager;
5 import android.support.v7.widget.LinearLayoutManager;
6 import android.support.v7.widget.RecyclerView;
7 import android.view.LayoutInflater;
8 import android.view.View;
9 import android.view.ViewGroup;
10 import android.widget.ImageView;
11 import android.widget.ListView;
12
13 import com.cyngn.eleven.Config;
14 import com.cyngn.eleven.R;
15 import com.cyngn.eleven.adapters.ArtistDetailAlbumAdapter;
16 import com.cyngn.eleven.adapters.ArtistDetailSongAdapter;
17 import com.cyngn.eleven.cache.ImageFetcher;
18 import com.cyngn.eleven.menu.FragmentMenuItems;
19 import com.cyngn.eleven.model.Album;
20 import com.cyngn.eleven.model.Song;
21 import com.cyngn.eleven.utils.AlbumPopupMenuHelper;
22 import com.cyngn.eleven.utils.SongPopupMenuHelper;
23 import com.cyngn.eleven.widgets.IPopupMenuCallback;
24 import com.cyngn.eleven.widgets.LoadingEmptyContainer;
25
26 import java.util.TreeSet;
27
28 public class ArtistDetailFragment extends DetailFragment {
29     private final int ALBUM_LOADER_ID = 0;
30     private final int SONG_LOADER_ID = 1;
31     private ImageView mHero;
32     private View mHeader;
33
34     private ListView mSongs;
35     private ArtistDetailSongAdapter mSongAdapter;
36
37     private RecyclerView mAlbums;
38     private ArtistDetailAlbumAdapter mAlbumAdapter;
39
40     private SongPopupMenuHelper mSongPopupMenuHelper;
41     private AlbumPopupMenuHelper mAlbumPopupMenuHelper;
42
43     private LoadingEmptyContainer mLoadingEmptyContainer;
44
45     @Override
46     protected int getLayoutToInflate() { return R.layout.activity_artist_detail; }
47
48     @Override
49     protected String getTitle() {
50         return getArguments().getString(Config.ARTIST_NAME);
51     }
52
53     @Override
54     protected void onViewCreated() {
55         super.onViewCreated();
56
57         getContainingActivity().setFragmentPadding(false);
58
59         Bundle arguments = getArguments();
60         String artistName = arguments.getString(Config.ARTIST_NAME);
61
62         setupPopupMenuHelpers();
63         setupSongList();
64         setupAlbumList();
65         setupHero(artistName);
66
67         LoaderManager lm = getLoaderManager();
68         lm.initLoader(ALBUM_LOADER_ID, arguments, mAlbumAdapter);
69         lm.initLoader(SONG_LOADER_ID, arguments, mSongAdapter);
70     }
71
72     private void setupHero(String artistName) {
73         mHero = (ImageView)mHeader.findViewById(R.id.hero);
74         mHero.setContentDescription(artistName);
75         ImageFetcher.getInstance(getActivity()).loadArtistImage(artistName, mHero);
76     }
77
78     private void setupAlbumList() {
79         mAlbums = (RecyclerView) mHeader.findViewById(R.id.albums);
80         mAlbums.setHasFixedSize(true);
81         mAlbums.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
82         mAlbumAdapter = new ArtistDetailAlbumAdapter(getActivity());
83         mAlbumAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
84             @Override
85             public void onPopupMenuClicked(View v, int position) {
86                 mAlbumPopupMenuHelper.showPopupMenu(v, position);
87             }
88         });
89         mAlbums.setAdapter(mAlbumAdapter);
90     }
91
92     private void setupSongList() {
93         mSongs = (ListView)mRootView.findViewById(R.id.songs);
94         mHeader = (ViewGroup)LayoutInflater.from(getActivity()).
95                 inflate(R.layout.artist_detail_header, mSongs, false);
96         mSongs.addHeaderView(mHeader);
97         mSongs.setOnScrollListener(this);
98         mSongAdapter = new ArtistDetailSongAdapter(getActivity()) {
99             @Override
100             protected void onLoading() {
101                 mLoadingEmptyContainer.showLoading();
102             }
103
104             @Override
105             protected void onNoResults() {
106                 // no results - because the user deleted the last item - pop our fragment
107                 // from the stack
108                 getContainingActivity().postRemoveFragment(ArtistDetailFragment.this);
109             }
110         };
111         mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
112             @Override
113             public void onPopupMenuClicked(View v, int position) {
114                 mSongPopupMenuHelper.showPopupMenu(v, position);
115             }
116         });
117         mSongs.setAdapter(mSongAdapter);
118         mSongs.setOnItemClickListener(mSongAdapter);
119         mLoadingEmptyContainer =
120                 (LoadingEmptyContainer)mRootView.findViewById(R.id.loading_empty_container);
121         mSongs.setEmptyView(mLoadingEmptyContainer);
122     }
123
124     private void setupPopupMenuHelpers() {
125         mSongPopupMenuHelper = new SongPopupMenuHelper(getActivity(), getChildFragmentManager()) {
126             @Override
127             public Song getSong(int position) {
128                 return mSongAdapter.getItem(position);
129             }
130
131             @Override
132             protected void updateMenuIds(PopupMenuType type, TreeSet<Integer> set) {
133                 super.updateMenuIds(type, set);
134
135                 // since we are already on the artist page, this item doesn't make sense
136                 set.remove(FragmentMenuItems.MORE_BY_ARTIST);
137             }
138         };
139
140         mAlbumPopupMenuHelper = new AlbumPopupMenuHelper(getActivity(), getChildFragmentManager()) {
141             @Override
142             public Album getAlbum(int position) {
143                 return mAlbumAdapter.getItem(position);
144             }
145
146             @Override
147             protected void updateMenuIds(PopupMenuType type, TreeSet<Integer> set) {
148                 super.updateMenuIds(type, set);
149
150                 // since we are already on the artist page, this item doesn't make sense
151                 set.remove(FragmentMenuItems.MORE_BY_ARTIST);
152             }
153         };
154     }
155
156     // TODO: change this class to use the same header strategy as PlaylistDetail
157     protected int getHeaderHeight() { return 0; }
158
159     protected void setHeaderPosition(float y) {  }
160
161     @Override
162     public void restartLoader() {
163         Bundle arguments = getArguments();
164         LoaderManager lm = getLoaderManager();
165         lm.restartLoader(ALBUM_LOADER_ID, arguments, mAlbumAdapter);
166         lm.restartLoader(SONG_LOADER_ID, arguments, mSongAdapter);
167     }
168 }