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.adapters;
14 import android.app.Activity;
15 import android.os.Bundle;
16 import android.support.v4.app.Fragment;
17 import android.support.v4.app.FragmentActivity;
18 import android.support.v4.app.FragmentPagerAdapter;
19 import android.util.SparseArray;
20 import android.view.ViewGroup;
22 import com.cyngn.eleven.R;
23 import com.cyngn.eleven.ui.fragments.AlbumFragment;
24 import com.cyngn.eleven.ui.fragments.ArtistFragment;
25 import com.cyngn.eleven.ui.fragments.GenreFragment;
26 import com.cyngn.eleven.ui.fragments.PlaylistFragment;
27 import com.cyngn.eleven.ui.fragments.RecentFragment;
28 import com.cyngn.eleven.ui.fragments.SongFragment;
29 import com.cyngn.eleven.utils.Lists;
31 import java.lang.ref.WeakReference;
32 import java.util.List;
33 import java.util.Locale;
36 * A {@link FragmentPagerAdapter} class for swiping between playlists, recent,
37 * artists, albums, songs, and genre {@link Fragment}s on phones.<br/>
39 public class PagerAdapter extends FragmentPagerAdapter {
41 private final SparseArray<WeakReference<Fragment>> mFragmentArray = new SparseArray<WeakReference<Fragment>>();
43 private final List<Holder> mHolderList = Lists.newArrayList();
45 private final FragmentActivity mFragmentActivity;
47 private int mCurrentPage;
50 * Constructor of <code>PagerAdatper<code>
52 * @param fragmentActivity The {@link Activity} of the
55 public PagerAdapter(final FragmentActivity fragmentActivity) {
56 super(fragmentActivity.getSupportFragmentManager());
57 mFragmentActivity = fragmentActivity;
61 * Method that adds a new fragment class to the viewer (the fragment is
62 * internally instantiate)
64 * @param className The full qualified name of fragment class.
65 * @param params The instantiate params.
67 @SuppressWarnings("synthetic-access")
68 public void add(final Class<? extends Fragment> className, final Bundle params) {
69 final Holder mHolder = new Holder();
70 mHolder.mClassName = className.getName();
71 mHolder.mParams = params;
73 final int mPosition = mHolderList.size();
74 mHolderList.add(mPosition, mHolder);
75 notifyDataSetChanged();
79 * Method that returns the {@link Fragment} in the argument
82 * @param position The position of the fragment to return.
83 * @return Fragment The {@link Fragment} in the argument position.
85 public Fragment getFragment(final int position) {
86 final WeakReference<Fragment> mWeakFragment = mFragmentArray.get(position);
87 if (mWeakFragment != null && mWeakFragment.get() != null) {
88 return mWeakFragment.get();
90 return getItem(position);
97 public Object instantiateItem(final ViewGroup container, final int position) {
98 final Fragment mFragment = (Fragment)super.instantiateItem(container, position);
99 final WeakReference<Fragment> mWeakFragment = mFragmentArray.get(position);
100 if (mWeakFragment != null) {
101 mWeakFragment.clear();
103 mFragmentArray.put(position, new WeakReference<Fragment>(mFragment));
111 public Fragment getItem(final int position) {
112 final Holder mCurrentHolder = mHolderList.get(position);
113 final Fragment mFragment = Fragment.instantiate(mFragmentActivity,
114 mCurrentHolder.mClassName, mCurrentHolder.mParams);
122 public void destroyItem(final ViewGroup container, final int position, final Object object) {
123 super.destroyItem(container, position, object);
124 final WeakReference<Fragment> mWeakFragment = mFragmentArray.get(position);
125 if (mWeakFragment != null) {
126 mWeakFragment.clear();
134 public int getCount() {
135 return mHolderList.size();
142 public CharSequence getPageTitle(final int position) {
143 return mFragmentActivity.getResources().getStringArray(R.array.page_titles)[position]
144 .toUpperCase(Locale.getDefault());
148 * Method that returns the current page position.
150 * @return int The current page.
152 public int getCurrentPage() {
157 * Method that sets the current page position.
159 * @param currentPage The current page.
161 protected void setCurrentPage(final int currentPage) {
162 mCurrentPage = currentPage;
166 * An enumeration of all the main fragments supported.
168 public enum MusicFragments {
170 * The artist fragment
172 ARTIST(ArtistFragment.class),
176 ALBUM(AlbumFragment.class),
180 SONG(SongFragment.class),
182 * The playlist fragment
184 PLAYLIST(PlaylistFragment.class);
186 private Class<? extends Fragment> mFragmentClass;
189 * Constructor of <code>MusicFragments</code>
191 * @param fragmentClass The fragment class
193 private MusicFragments(final Class<? extends Fragment> fragmentClass) {
194 mFragmentClass = fragmentClass;
198 * Method that returns the fragment class.
200 * @return Class<? extends Fragment> The fragment class.
202 public Class<? extends Fragment> getFragmentClass() {
203 return mFragmentClass;
209 * A private class with information about fragment initialization
211 private final static class Holder {