OSDN Git Service

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