1 package com.cyngn.eleven.ui.fragments;
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;
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;
26 import java.util.TreeSet;
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;
34 private ListView mSongs;
35 private ArtistDetailSongAdapter mSongAdapter;
37 private RecyclerView mAlbums;
38 private ArtistDetailAlbumAdapter mAlbumAdapter;
40 private SongPopupMenuHelper mSongPopupMenuHelper;
41 private AlbumPopupMenuHelper mAlbumPopupMenuHelper;
43 private LoadingEmptyContainer mLoadingEmptyContainer;
46 protected int getLayoutToInflate() { return R.layout.activity_artist_detail; }
49 protected String getTitle() {
50 return getArguments().getString(Config.ARTIST_NAME);
54 protected void onViewCreated() {
55 super.onViewCreated();
57 getContainingActivity().setFragmentPadding(false);
59 Bundle arguments = getArguments();
60 String artistName = arguments.getString(Config.ARTIST_NAME);
62 setupPopupMenuHelpers();
65 setupHero(artistName);
67 LoaderManager lm = getLoaderManager();
68 lm.initLoader(ALBUM_LOADER_ID, arguments, mAlbumAdapter);
69 lm.initLoader(SONG_LOADER_ID, arguments, mSongAdapter);
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);
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() {
85 public void onPopupMenuClicked(View v, int position) {
86 mAlbumPopupMenuHelper.showPopupMenu(v, position);
89 mAlbums.setAdapter(mAlbumAdapter);
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()) {
100 protected void onLoading() {
101 mLoadingEmptyContainer.showLoading();
105 protected void onNoResults() {
106 // no results - because the user deleted the last item - pop our fragment
108 getContainingActivity().postRemoveFragment(ArtistDetailFragment.this);
111 mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
113 public void onPopupMenuClicked(View v, int position) {
114 mSongPopupMenuHelper.showPopupMenu(v, position);
117 mSongs.setAdapter(mSongAdapter);
118 mSongs.setOnItemClickListener(mSongAdapter);
119 mLoadingEmptyContainer =
120 (LoadingEmptyContainer)mRootView.findViewById(R.id.loading_empty_container);
121 mSongs.setEmptyView(mLoadingEmptyContainer);
124 private void setupPopupMenuHelpers() {
125 mSongPopupMenuHelper = new SongPopupMenuHelper(getActivity(), getChildFragmentManager()) {
127 public Song getSong(int position) {
128 return mSongAdapter.getItem(position);
132 protected void updateMenuIds(PopupMenuType type, TreeSet<Integer> set) {
133 super.updateMenuIds(type, set);
135 // since we are already on the artist page, this item doesn't make sense
136 set.remove(FragmentMenuItems.MORE_BY_ARTIST);
140 mAlbumPopupMenuHelper = new AlbumPopupMenuHelper(getActivity(), getChildFragmentManager()) {
142 public Album getAlbum(int position) {
143 return mAlbumAdapter.getItem(position);
147 protected void updateMenuIds(PopupMenuType type, TreeSet<Integer> set) {
148 super.updateMenuIds(type, set);
150 // since we are already on the artist page, this item doesn't make sense
151 set.remove(FragmentMenuItems.MORE_BY_ARTIST);
156 // TODO: change this class to use the same header strategy as PlaylistDetail
157 protected int getHeaderHeight() { return 0; }
159 protected void setHeaderPosition(float y) { }
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);