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.cyngn.eleven.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.Menu;
18 import android.view.MenuInflater;
19 import android.view.MenuItem;
21 import com.cyngn.eleven.R;
22 import com.cyngn.eleven.adapters.PagerAdapter;
23 import com.cyngn.eleven.adapters.PagerAdapter.MusicFragments;
24 import com.cyngn.eleven.menu.CreateNewPlaylist;
25 import com.cyngn.eleven.ui.fragments.AlbumFragment;
26 import com.cyngn.eleven.ui.fragments.ArtistFragment;
27 import com.cyngn.eleven.ui.fragments.BaseFragment;
28 import com.cyngn.eleven.ui.fragments.SongFragment;
29 import com.cyngn.eleven.utils.MusicUtils;
30 import com.cyngn.eleven.utils.PreferenceUtils;
31 import com.cyngn.eleven.utils.SortOrder;
32 import com.viewpagerindicator.TabPageIndicator;
35 * This class is used to hold the {@link ViewPager} used for swiping between the
36 * playlists, recent, artists, albums, songs, and genre {@link Fragment}
39 * @NOTE: The reason the sort orders are taken care of in this fragment rather
40 * than the individual fragments is to keep from showing all of the menu
41 * items on tablet interfaces. That being said, I have a tablet interface
42 * worked out, but I'm going to keep it in the Play Store version of
43 * Apollo for a couple of weeks or so before merging it with CM.
44 * @author Andrew Neal (andrewdneal@gmail.com)
46 public class MusicBrowserPhoneFragment extends BaseFragment {
51 private ViewPager mViewPager;
56 private PagerAdapter mPagerAdapter;
58 private PreferenceUtils mPreferences;
61 * Empty constructor as per the {@link Fragment} documentation
63 public MusicBrowserPhoneFragment() {
67 protected int getLayoutToInflate() {
68 return R.layout.fragment_music_browser_phone;
72 protected String getTitle() {
73 return getString(R.string.app_name);
80 public void onCreate(final Bundle savedInstanceState) {
81 super.onCreate(savedInstanceState);
82 // Get the preferences
83 mPreferences = PreferenceUtils.getInstance(getActivity());
87 protected void onViewCreated() {
88 super.onViewCreated();
90 if (mPagerAdapter == null) {
91 // Initialize the adapter
92 mPagerAdapter = new PagerAdapter(getActivity(), getChildFragmentManager());
93 final MusicFragments[] mFragments = MusicFragments.values();
94 for (final MusicFragments mFragment : mFragments) {
95 mPagerAdapter.add(mFragment.getFragmentClass(), null);
99 // Initialize the ViewPager
100 mViewPager = (ViewPager)mRootView.findViewById(R.id.fragment_home_phone_pager);
102 mViewPager.setAdapter(mPagerAdapter);
103 // Offscreen pager loading limit
104 mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount() - 1);
105 // Start on the last page the user was on
106 mViewPager.setCurrentItem(mPreferences.getStartPage());
109 final TabPageIndicator pageIndicator = (TabPageIndicator)mRootView
110 .findViewById(R.id.fragment_home_phone_pager_titles);
111 // Attach the ViewPager
112 pageIndicator.setViewPager(mViewPager);
119 public void onActivityCreated(final Bundle savedInstanceState) {
120 super.onActivityCreated(savedInstanceState);
121 // Enable the options menu
122 setHasOptionsMenu(true);
129 public void onPause() {
131 // Save the last page the use was on
132 mPreferences.setStartPage(mViewPager.getCurrentItem());
139 public void onPrepareOptionsMenu(final Menu menu) {
140 super.onPrepareOptionsMenu(menu);
147 public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
148 super.onCreateOptionsMenu(menu, inflater);
150 inflater.inflate(R.menu.shuffle_all, menu); // Shuffle all
151 if (isArtistPage()) {
152 inflater.inflate(R.menu.artist_sort_by, menu);
153 } else if (isAlbumPage()) {
154 inflater.inflate(R.menu.album_sort_by, menu);
155 } else if (isSongPage()) {
156 inflater.inflate(R.menu.song_sort_by, menu);
157 } else if (isPlaylistPage()) {
158 inflater.inflate(R.menu.new_playlist, menu);
166 public boolean onOptionsItemSelected(final MenuItem item) {
167 switch (item.getItemId()) {
168 case R.id.menu_shuffle_all:
169 // Shuffle all the songs
170 MusicUtils.shuffleAll(getActivity());
172 case R.id.menu_sort_by_az:
173 if (isArtistPage()) {
174 mPreferences.setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_A_Z);
175 getArtistFragment().refresh();
176 } else if (isAlbumPage()) {
177 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_A_Z);
178 getAlbumFragment().refresh();
179 } else if (isSongPage()) {
180 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_A_Z);
181 getSongFragment().refresh();
184 case R.id.menu_sort_by_za:
185 if (isArtistPage()) {
186 mPreferences.setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_Z_A);
187 getArtistFragment().refresh();
188 } else if (isAlbumPage()) {
189 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_Z_A);
190 getAlbumFragment().refresh();
191 } else if (isSongPage()) {
192 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_Z_A);
193 getSongFragment().refresh();
196 case R.id.menu_sort_by_artist:
198 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_ARTIST);
199 getAlbumFragment().refresh();
200 } else if (isSongPage()) {
201 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ARTIST);
202 getSongFragment().refresh();
205 case R.id.menu_sort_by_album:
207 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ALBUM);
208 getSongFragment().refresh();
211 case R.id.menu_sort_by_year:
213 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_YEAR);
214 getAlbumFragment().refresh();
215 } else if (isSongPage()) {
216 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_YEAR);
217 getSongFragment().refresh();
220 case R.id.menu_sort_by_duration:
222 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_DURATION);
223 getSongFragment().refresh();
226 case R.id.menu_sort_by_number_of_songs:
227 if (isArtistPage()) {
229 .setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_NUMBER_OF_SONGS);
230 getArtistFragment().refresh();
231 } else if (isAlbumPage()) {
232 mPreferences.setAlbumSortOrder(SortOrder.AlbumSortOrder.ALBUM_NUMBER_OF_SONGS);
233 getAlbumFragment().refresh();
236 case R.id.menu_sort_by_number_of_albums:
237 if (isArtistPage()) {
239 .setArtistSortOrder(SortOrder.ArtistSortOrder.ARTIST_NUMBER_OF_ALBUMS);
240 getArtistFragment().refresh();
243 case R.id.menu_sort_by_filename:
245 mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_FILENAME);
246 getSongFragment().refresh();
249 case R.id.menu_new_playlist:
250 if(isPlaylistPage()) {
251 CreateNewPlaylist.getInstance(new long[0]).show(getFragmentManager(), "CreatePlaylist");
257 return super.onOptionsItemSelected(item);
260 private boolean isArtistPage() {
261 return mViewPager.getCurrentItem() == MusicFragments.ARTIST.ordinal();
264 public ArtistFragment getArtistFragment() {
265 return (ArtistFragment)mPagerAdapter.getFragment(MusicFragments.ARTIST.ordinal());
268 private boolean isAlbumPage() {
269 return mViewPager.getCurrentItem() == MusicFragments.ALBUM.ordinal();
272 public AlbumFragment getAlbumFragment() {
273 return (AlbumFragment)mPagerAdapter.getFragment(MusicFragments.ALBUM.ordinal());
276 private boolean isSongPage() {
277 return mViewPager.getCurrentItem() == MusicFragments.SONG.ordinal();
280 public SongFragment getSongFragment() {
281 return (SongFragment)mPagerAdapter.getFragment(MusicFragments.SONG.ordinal());
285 public void restartLoader() {
289 private boolean isPlaylistPage() {
290 return mViewPager.getCurrentItem() == MusicFragments.PLAYLIST.ordinal();