OSDN Git Service

Eleven: Cleanup all the whitespace
[android-x86/packages-apps-Eleven.git] / src / com / cyanogenmod / eleven / ui / fragments / ArtistDetailFragment.java
1 /*
2 * Copyright (C) 2014 The CyanogenMod Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.cyanogenmod.eleven.ui.fragments;
17
18 import android.os.Build;
19 import android.os.Bundle;
20 import android.support.v4.app.LoaderManager;
21 import android.support.v7.widget.LinearLayoutManager;
22 import android.support.v7.widget.RecyclerView;
23 import android.view.LayoutInflater;
24 import android.view.View;
25 import android.view.ViewGroup;
26 import android.view.ViewTreeObserver;
27 import android.widget.ImageView;
28 import android.widget.ListView;
29 import com.cyanogenmod.eleven.Config;
30 import com.cyanogenmod.eleven.R;
31 import com.cyanogenmod.eleven.adapters.ArtistDetailAlbumAdapter;
32 import com.cyanogenmod.eleven.adapters.ArtistDetailSongAdapter;
33 import com.cyanogenmod.eleven.adapters.PagerAdapter;
34 import com.cyanogenmod.eleven.cache.ImageFetcher;
35 import com.cyanogenmod.eleven.menu.FragmentMenuItems;
36 import com.cyanogenmod.eleven.model.Album;
37 import com.cyanogenmod.eleven.model.Artist;
38 import com.cyanogenmod.eleven.model.Song;
39 import com.cyanogenmod.eleven.utils.AlbumPopupMenuHelper;
40 import com.cyanogenmod.eleven.utils.ArtistPopupMenuHelper;
41 import com.cyanogenmod.eleven.utils.MusicUtils;
42 import com.cyanogenmod.eleven.utils.PopupMenuHelper;
43 import com.cyanogenmod.eleven.utils.SongPopupMenuHelper;
44 import com.cyanogenmod.eleven.widgets.IPopupMenuCallback;
45 import com.cyanogenmod.eleven.widgets.LoadingEmptyContainer;
46
47 import java.util.TreeSet;
48
49 public class ArtistDetailFragment extends FadingBarFragment implements IChildFragment {
50     private final int ALBUM_LOADER_ID = 0;
51     private final int SONG_LOADER_ID = 1;
52
53     private long mArtistId;
54     private String mArtistName;
55
56     private ImageView mHero;
57     private View mHeader;
58
59     private ListView mSongs;
60     private ArtistDetailSongAdapter mSongAdapter;
61
62     private RecyclerView mAlbums;
63     private ArtistDetailAlbumAdapter mAlbumAdapter;
64
65     private PopupMenuHelper mSongPopupMenuHelper;
66     private PopupMenuHelper mAlbumPopupMenuHelper;
67
68     private LoadingEmptyContainer mLoadingEmptyContainer;
69
70     @Override
71     protected int getLayoutToInflate() { return R.layout.activity_artist_detail; }
72
73     @Override
74     protected String getTitle() {
75         return getArguments().getString(Config.ARTIST_NAME);
76     }
77
78     protected long getArtistId() {
79         return getArguments().getLong(Config.ID);
80     }
81
82     @Override
83     protected void onViewCreated() {
84         super.onViewCreated();
85
86         getContainingActivity().setFragmentPadding(false);
87
88         Bundle arguments = getArguments();
89         mArtistName = arguments.getString(Config.ARTIST_NAME);
90         mArtistId = arguments.getLong(Config.ID);
91
92         setupPopupMenuHelpers();
93         setupSongList();
94         setupAlbumList();
95         setupHero(mArtistName);
96
97         LoaderManager lm = getLoaderManager();
98         lm.initLoader(ALBUM_LOADER_ID, arguments, mAlbumAdapter);
99         lm.initLoader(SONG_LOADER_ID, arguments, mSongAdapter);
100     }
101
102     @Override // DetailFragment
103     protected PopupMenuHelper createActionMenuHelper() {
104         return new ArtistPopupMenuHelper(getActivity(), getChildFragmentManager()) {
105             public Artist getArtist(int position) {
106                 return new Artist(mArtistId, mArtistName, 0, 0);
107             }
108         };
109     }
110
111     @Override // DetailFragment
112     protected int getShuffleTitleId() { return R.string.menu_shuffle_artist; }
113
114     @Override // DetailFragment
115     protected void playShuffled() {
116         MusicUtils.playArtist(getActivity(), mArtistId, -1, true);
117     }
118
119     private void setupHero(String artistName) {
120         mHero = (ImageView)mHeader.findViewById(R.id.hero);
121         mHero.setContentDescription(artistName);
122         // initiate loading the artist image
123         // since the artist image needs to be scaled to the image view bounds, we need to wait till the first layout
124         // traversal to be able to get the image view dimensions in the helper method that scales the image
125         mHero.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() {
126             @Override
127             public void onGlobalLayout() {
128                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
129                     mHero.getViewTreeObserver().removeOnGlobalLayoutListener(this);
130                 } else {
131                     mHero.getViewTreeObserver().removeGlobalOnLayoutListener(this);
132                 }
133                 ImageFetcher.getInstance(getActivity()).loadArtistImage(mArtistName, mHero, true);
134             }
135         });
136     }
137
138     private void setupAlbumList() {
139         mAlbums = (RecyclerView) mHeader.findViewById(R.id.albums);
140         mAlbums.setHasFixedSize(true);
141         mAlbums.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
142         mAlbumAdapter = new ArtistDetailAlbumAdapter(getActivity());
143         mAlbumAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
144             @Override
145             public void onPopupMenuClicked(View v, int position) {
146                 mAlbumPopupMenuHelper.showPopupMenu(v, position);
147             }
148         });
149         mAlbums.setAdapter(mAlbumAdapter);
150     }
151
152     private void setupSongList() {
153         mSongs = (ListView)mRootView.findViewById(R.id.songs);
154         mHeader = LayoutInflater.from(getActivity()).
155                 inflate(R.layout.artist_detail_header, mSongs, false);
156         mSongs.addHeaderView(mHeader);
157         mSongs.setOnScrollListener(this);
158         mSongAdapter = new ArtistDetailSongAdapter(getActivity()) {
159             @Override
160             protected void onLoading() {
161                 mLoadingEmptyContainer.showLoading();
162             }
163
164             @Override
165             protected void onNoResults() {
166                 // no results - because the user deleted the last item - pop our fragment
167                 // from the stack
168                 getContainingActivity().postRemoveFragment(ArtistDetailFragment.this);
169             }
170         };
171         mSongAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
172             @Override
173             public void onPopupMenuClicked(View v, int position) {
174                 mSongPopupMenuHelper.showPopupMenu(v, position);
175             }
176         });
177         mSongs.setAdapter(mSongAdapter);
178         mSongs.setOnItemClickListener(mSongAdapter);
179         mLoadingEmptyContainer =
180                 (LoadingEmptyContainer)mRootView.findViewById(R.id.loading_empty_container);
181         mSongs.setEmptyView(mLoadingEmptyContainer);
182     }
183
184     private void setupPopupMenuHelpers() {
185         mSongPopupMenuHelper = new SongPopupMenuHelper(getActivity(), getChildFragmentManager()) {
186             @Override
187             public Song getSong(int position) {
188                 return mSongAdapter.getItem(position);
189             }
190
191             @Override
192             protected long getSourceId() {
193                 return getArtistId();
194             }
195
196             @Override
197             protected Config.IdType getSourceType() {
198                 return Config.IdType.Artist;
199             }
200
201             @Override
202             protected void updateMenuIds(PopupMenuType type, TreeSet<Integer> set) {
203                 super.updateMenuIds(type, set);
204
205                 // since we are already on the artist page, this item doesn't make sense
206                 set.remove(FragmentMenuItems.MORE_BY_ARTIST);
207             }
208         };
209
210         mAlbumPopupMenuHelper = new AlbumPopupMenuHelper(getActivity(), getChildFragmentManager()) {
211             @Override
212             public Album getAlbum(int position) {
213                 return mAlbumAdapter.getItem(position);
214             }
215
216             @Override
217             protected void updateMenuIds(PopupMenuType type, TreeSet<Integer> set) {
218                 super.updateMenuIds(type, set);
219
220                 // since we are already on the artist page, this item doesn't make sense
221                 set.remove(FragmentMenuItems.MORE_BY_ARTIST);
222             }
223         };
224     }
225
226     // TODO: change this class to use the same header strategy as PlaylistDetail
227     protected int getHeaderHeight() { return mHero.getHeight(); }
228
229     protected void setHeaderPosition(float y) {  }
230
231     @Override
232     public void restartLoader() {
233         Bundle arguments = getArguments();
234         LoaderManager lm = getLoaderManager();
235         lm.restartLoader(ALBUM_LOADER_ID, arguments, mAlbumAdapter);
236         lm.restartLoader(SONG_LOADER_ID, arguments, mSongAdapter);
237
238         ImageFetcher.getInstance(getActivity()).loadArtistImage(mArtistName, mHero, true);
239     }
240
241     @Override
242     public void onMetaChanged() {
243         super.onMetaChanged();
244
245         mSongAdapter.setCurrentlyPlayingTrack(MusicUtils.getCurrentTrack());
246     }
247
248     @Override
249     public PagerAdapter.MusicFragments getMusicFragmentParent() {
250         return PagerAdapter.MusicFragments.ARTIST;
251     }
252 }