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.
12 package com.andrew.apollo.ui.fragments.phone;
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;
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;
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}
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)
50 public class MusicBrowserPhoneFragment extends Fragment implements
51 OnCenterItemClickListener {
56 private ViewPager mViewPager;
61 private PagerAdapter mPagerAdapter;
66 private ThemeUtils mResources;
68 private PreferenceUtils mPreferences;
71 * Empty constructor as per the {@link Fragment} documentation
73 public MusicBrowserPhoneFragment() {
80 public void onCreate(final Bundle savedInstanceState) {
81 super.onCreate(savedInstanceState);
82 // Get the preferences
83 mPreferences = PreferenceUtils.getInstance(getActivity());
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);
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);
103 // Initialize the ViewPager
104 mViewPager = (ViewPager)rootView.findViewById(R.id.fragment_home_phone_pager);
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());
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);
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);
138 public void onPause() {
140 // Save the last page the use was on
141 mPreferences.setStartPage(mViewPager.getCurrentItem());
148 public void onPrepareOptionsMenu(final Menu menu) {
149 super.onPrepareOptionsMenu(menu);
150 mResources.setFavoriteIcon(menu);
157 public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
158 super.onCreateOptionsMenu(menu, inflater);
160 inflater.inflate(R.menu.favorite, menu);
162 inflater.inflate(R.menu.shuffle, menu);
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);
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());
187 case R.id.menu_favorite:
188 // Toggle the current track as a favorite and update the menu
190 MusicUtils.toggleFavorite();
191 getActivity().invalidateOptionsMenu();
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();
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();
217 case R.id.menu_sort_by_artist:
219 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_ARTIST);
220 getAlbumFragment().refresh();
221 } else if (isSongPage()) {
222 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ARTIST);
223 getSongFragment().refresh();
226 case R.id.menu_sort_by_album:
228 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ALBUM);
229 getSongFragment().refresh();
232 case R.id.menu_sort_by_year:
234 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_YEAR);
235 getAlbumFragment().refresh();
236 } else if (isSongPage()) {
237 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_YEAR);
238 getSongFragment().refresh();
241 case R.id.menu_sort_by_duration:
243 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_DURATION);
244 getSongFragment().refresh();
247 case R.id.menu_sort_by_number_of_songs:
248 if (isArtistPage()) {
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();
257 case R.id.menu_sort_by_number_of_albums:
258 if (isArtistPage()) {
260 .setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_NUMBER_OF_ALBUMS);
261 getArtistFragment().refresh();
264 case R.id.menu_sort_by_filename:
266 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_FILENAME);
267 getSongFragment().refresh();
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");
278 NavUtils.goHome(getActivity());
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");
288 NavUtils.goHome(getActivity());
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");
298 NavUtils.goHome(getActivity());
303 return super.onOptionsItemSelected(item);
310 public void onCenterItemClick(final int position) {
311 // If on the artist fragment, scrolls to the current artist
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();
323 private boolean isArtistPage() {
324 return mViewPager.getCurrentItem() == 2;
327 private ArtistFragment getArtistFragment() {
328 return (ArtistFragment)mPagerAdapter.getFragment(2);
331 private boolean isAlbumPage() {
332 return mViewPager.getCurrentItem() == 3;
335 private AlbumFragment getAlbumFragment() {
336 return (AlbumFragment)mPagerAdapter.getFragment(3);
339 private boolean isSongPage() {
340 return mViewPager.getCurrentItem() == 4;
343 private SongFragment getSongFragment() {
344 return (SongFragment)mPagerAdapter.getFragment(4);
347 private boolean isRecentPage() {
348 return mViewPager.getCurrentItem() == 1;