OSDN Git Service

d56aefe363ba10df88f7324eeae85b6478a63547
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / ui / fragments / phone / MusicBrowserPhoneFragment.java
1 /*
2  * Copyright (C) 2012 Andrew Neal Licensed under the Apache License, Version 2.0
3  * (the "License"); you may not use this file except in compliance with the
4  * License. You may obtain a copy of the License at
5  * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
6  * or agreed to in writing, software distributed under the License is
7  * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8  * KIND, either express or implied. See the License for the specific language
9  * governing permissions and limitations under the License.
10  */
11
12 package com.andrew.apollo.ui.fragments.phone;
13
14 import android.os.Bundle;
15 import android.support.v4.app.Fragment;
16 import android.support.v4.view.ViewPager;
17 import android.view.LayoutInflater;
18 import android.view.Menu;
19 import android.view.MenuInflater;
20 import android.view.MenuItem;
21 import android.view.View;
22 import android.view.ViewGroup;
23
24 import com.andrew.apollo.R;
25 import com.andrew.apollo.adapters.PagerAdapter;
26 import com.andrew.apollo.adapters.PagerAdapter.MusicFragments;
27 import com.andrew.apollo.ui.fragments.AlbumFragment;
28 import com.andrew.apollo.ui.fragments.ArtistFragment;
29 import com.andrew.apollo.ui.fragments.SongFragment;
30 import com.andrew.apollo.utils.MusicUtils;
31 import com.andrew.apollo.utils.NavUtils;
32 import com.andrew.apollo.utils.PreferenceUtils;
33 import com.andrew.apollo.utils.SortOrder;
34 import com.andrew.apollo.utils.ThemeUtils;
35 import com.viewpagerindicator.TitlePageIndicator;
36 import com.viewpagerindicator.TitlePageIndicator.OnCenterItemClickListener;
37
38 /**
39  * This class is used to hold the {@link ViewPager} used for swiping between the
40  * playlists, recent, artists, albums, songs, and genre {@link Fragment}
41  * s for phones.
42  * 
43  * @NOTE: The reason the sort orders are taken care of in this fragment rather
44  *        than the individual fragments is to keep from showing all of the menu
45  *        items on tablet interfaces. That being said, I have a tablet interface
46  *        worked out, but I'm going to keep it in the Play Store version of
47  *        Apollo for a couple of weeks or so before merging it with CM.
48  * @author Andrew Neal (andrewdneal@gmail.com)
49  */
50 public class MusicBrowserPhoneFragment extends Fragment implements
51         OnCenterItemClickListener {
52
53     /**
54      * Pager
55      */
56     private ViewPager mViewPager;
57
58     /**
59      * VP's adapter
60      */
61     private PagerAdapter mPagerAdapter;
62
63     /**
64      * Theme resources
65      */
66     private ThemeUtils mResources;
67
68     private PreferenceUtils mPreferences;
69
70     /**
71      * Empty constructor as per the {@link Fragment} documentation
72      */
73     public MusicBrowserPhoneFragment() {
74     }
75
76     /**
77      * {@inheritDoc}
78      */
79     @Override
80     public void onCreate(final Bundle savedInstanceState) {
81         super.onCreate(savedInstanceState);
82         // Get the preferences
83         mPreferences = PreferenceUtils.getInstance(getActivity());
84     }
85
86     /**
87      * {@inheritDoc}
88      */
89     @Override
90     public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
91             final Bundle savedInstanceState) {
92         // The View for the fragment's UI
93         final ViewGroup rootView = (ViewGroup)inflater.inflate(
94                 R.layout.fragment_music_browser_phone, container, false);
95
96         // Initialize the adapter
97         mPagerAdapter = new PagerAdapter(getActivity());
98         final MusicFragments[] mFragments = MusicFragments.values();
99         for (final MusicFragments mFragment : mFragments) {
100             mPagerAdapter.add(mFragment.getFragmentClass(), null);
101         }
102
103         // Initialize the ViewPager
104         mViewPager = (ViewPager)rootView.findViewById(R.id.fragment_home_phone_pager);
105         // Attch the adapter
106         mViewPager.setAdapter(mPagerAdapter);
107         // Offscreen pager loading limit
108         mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount() - 1);
109         // Start on the last page the user was on
110         mViewPager.setCurrentItem(mPreferences.getStartPage());
111
112         // Initialze the TPI
113         final TitlePageIndicator pageIndicator = (TitlePageIndicator)rootView
114                 .findViewById(R.id.fragment_home_phone_pager_titles);
115         // Attach the ViewPager
116         pageIndicator.setViewPager(mViewPager);
117         // Scroll to the current artist, album, or song
118         pageIndicator.setOnCenterItemClickListener(this);
119         return rootView;
120     }
121
122     /**
123      * {@inheritDoc}
124      */
125     @Override
126     public void onActivityCreated(final Bundle savedInstanceState) {
127         super.onActivityCreated(savedInstanceState);
128         // Initialze the theme resources
129         mResources = new ThemeUtils(getActivity());
130         // Enable the options menu
131         setHasOptionsMenu(true);
132     }
133
134     /**
135      * {@inheritDoc}
136      */
137     @Override
138     public void onPause() {
139         super.onPause();
140         // Save the last page the use was on
141         mPreferences.setStartPage(mViewPager.getCurrentItem());
142     }
143
144     /**
145      * {@inheritDoc}
146      */
147     @Override
148     public void onPrepareOptionsMenu(final Menu menu) {
149         super.onPrepareOptionsMenu(menu);
150         mResources.setFavoriteIcon(menu);
151     }
152
153     /**
154      * {@inheritDoc}
155      */
156     @Override
157     public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
158         super.onCreateOptionsMenu(menu, inflater);
159         // Favorite action
160         inflater.inflate(R.menu.favorite, menu);
161         // Shuffle all
162         inflater.inflate(R.menu.shuffle, menu);
163         // Sort orders
164         if (isRecentPage()) {
165             inflater.inflate(R.menu.view_as, menu);
166         } else if (isArtistPage()) {
167             inflater.inflate(R.menu.artist_sort_by, menu);
168             inflater.inflate(R.menu.view_as, menu);
169         } else if (isAlbumPage()) {
170             inflater.inflate(R.menu.album_sort_by, menu);
171             inflater.inflate(R.menu.view_as, menu);
172         } else if (isSongPage()) {
173             inflater.inflate(R.menu.song_sort_by, menu);
174         }
175     }
176
177     /**
178      * {@inheritDoc}
179      */
180     @Override
181     public boolean onOptionsItemSelected(final MenuItem item) {
182         switch (item.getItemId()) {
183             case R.id.menu_shuffle:
184                 // Shuffle all the songs
185                 MusicUtils.shuffleAll(getActivity());
186                 return true;
187             case R.id.menu_favorite:
188                 // Toggle the current track as a favorite and update the menu
189                 // item
190                 MusicUtils.toggleFavorite();
191                 getActivity().invalidateOptionsMenu();
192                 return true;
193             case R.id.menu_sort_by_az:
194                 if (isArtistPage()) {
195                     mPreferences.setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_A_Z);
196                     getArtistFragment().refresh();
197                 } else if (isAlbumPage()) {
198                     mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_A_Z);
199                     getAlbumFragment().refresh();
200                 } else if (isSongPage()) {
201                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_A_Z);
202                     getSongFragment().refresh();
203                 }
204                 return true;
205             case R.id.menu_sort_by_za:
206                 if (isArtistPage()) {
207                     mPreferences.setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_Z_A);
208                     getArtistFragment().refresh();
209                 } else if (isAlbumPage()) {
210                     mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_Z_A);
211                     getAlbumFragment().refresh();
212                 } else if (isSongPage()) {
213                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_Z_A);
214                     getSongFragment().refresh();
215                 }
216                 return true;
217             case R.id.menu_sort_by_artist:
218                 if (isAlbumPage()) {
219                     mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_ARTIST);
220                     getAlbumFragment().refresh();
221                 } else if (isSongPage()) {
222                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ARTIST);
223                     getSongFragment().refresh();
224                 }
225                 return true;
226             case R.id.menu_sort_by_album:
227                 if (isSongPage()) {
228                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ALBUM);
229                     getSongFragment().refresh();
230                 }
231                 return true;
232             case R.id.menu_sort_by_year:
233                 if (isAlbumPage()) {
234                     mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_YEAR);
235                     getAlbumFragment().refresh();
236                 } else if (isSongPage()) {
237                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_YEAR);
238                     getSongFragment().refresh();
239                 }
240                 return true;
241             case R.id.menu_sort_by_duration:
242                 if (isSongPage()) {
243                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_DURATION);
244                     getSongFragment().refresh();
245                 }
246                 return true;
247             case R.id.menu_sort_by_number_of_songs:
248                 if (isArtistPage()) {
249                     mPreferences
250                             .setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_NUMBER_OF_SONGS);
251                     getArtistFragment().refresh();
252                 } else if (isAlbumPage()) {
253                     mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_NUMBER_OF_SONGS);
254                     getAlbumFragment().refresh();
255                 }
256                 return true;
257             case R.id.menu_sort_by_number_of_albums:
258                 if (isArtistPage()) {
259                     mPreferences
260                             .setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_NUMBER_OF_ALBUMS);
261                     getArtistFragment().refresh();
262                 }
263                 return true;
264             case R.id.menu_sort_by_filename:
265                 if(isSongPage()) {
266                     mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_FILENAME);
267                     getSongFragment().refresh();
268                 }
269                 return true;
270             case R.id.menu_view_as_simple:
271                 if (isRecentPage()) {
272                     mPreferences.setRecentLayout("simple");
273                 } else if (isArtistPage()) {
274                     mPreferences.setArtistLayout("simple");
275                 } else if (isAlbumPage()) {
276                     mPreferences.setAlbumLayout("simple");
277                 }
278                 NavUtils.goHome(getActivity());
279                 return true;
280             case R.id.menu_view_as_detailed:
281                 if (isRecentPage()) {
282                     mPreferences.setRecentLayout("detailed");
283                 } else if (isArtistPage()) {
284                     mPreferences.setArtistLayout("detailed");
285                 } else if (isAlbumPage()) {
286                     mPreferences.setAlbumLayout("detailed");
287                 }
288                 NavUtils.goHome(getActivity());
289                 return true;
290             case R.id.menu_view_as_grid:
291                 if (isRecentPage()) {
292                     mPreferences.setRecentLayout("grid");
293                 } else if (isArtistPage()) {
294                     mPreferences.setArtistLayout("grid");
295                 } else if (isAlbumPage()) {
296                     mPreferences.setAlbumLayout("grid");
297                 }
298                 NavUtils.goHome(getActivity());
299                 return true;
300             default:
301                 break;
302         }
303         return super.onOptionsItemSelected(item);
304     }
305
306     /**
307      * {@inheritDoc}
308      */
309     @Override
310     public void onCenterItemClick(final int position) {
311         // If on the artist fragment, scrolls to the current artist
312         if (position == 2) {
313             getArtistFragment().scrollToCurrentArtist();
314             // If on the album fragment, scrolls to the current album
315         } else if (position == 3) {
316             getAlbumFragment().scrollToCurrentAlbum();
317             // If on the song fragment, scrolls to the current song
318         } else if (position == 4) {
319             getSongFragment().scrollToCurrentSong();
320         }
321     }
322
323     private boolean isArtistPage() {
324         return mViewPager.getCurrentItem() == 2;
325     }
326
327     private ArtistFragment getArtistFragment() {
328         return (ArtistFragment)mPagerAdapter.getFragment(2);
329     }
330
331     private boolean isAlbumPage() {
332         return mViewPager.getCurrentItem() == 3;
333     }
334
335     private AlbumFragment getAlbumFragment() {
336         return (AlbumFragment)mPagerAdapter.getFragment(3);
337     }
338
339     private boolean isSongPage() {
340         return mViewPager.getCurrentItem() == 4;
341     }
342
343     private SongFragment getSongFragment() {
344         return (SongFragment)mPagerAdapter.getFragment(4);
345     }
346
347     private boolean isRecentPage() {
348         return mViewPager.getCurrentItem() == 1;
349     }
350 }