OSDN Git Service

aba8dbdea679694dc7b9fc32be750a9229c2adac
[android-x86/packages-apps-Eleven.git] / src / com / cyanogenmod / eleven / ui / fragments / PlaylistFragment.java
1 /*
2  * Copyright (C) 2012 Andrew Neal
3  * Copyright (C) 2014 The CyanogenMod Project
4  * Licensed under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with the
6  * License. You may obtain a copy of the License at
7  * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
8  * or agreed to in writing, software distributed under the License is
9  * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
10  * KIND, either express or implied. See the License for the specific language
11  * governing permissions and limitations under the License.
12  */
13
14 package com.cyanogenmod.eleven.ui.fragments;
15
16 import android.os.Bundle;
17 import android.support.v4.app.Fragment;
18 import android.support.v4.app.LoaderManager.LoaderCallbacks;
19 import android.support.v4.content.Loader;
20 import android.view.LayoutInflater;
21 import android.view.View;
22 import android.view.ViewGroup;
23 import android.widget.AdapterView;
24 import android.widget.AdapterView.OnItemClickListener;
25 import android.widget.ListView;
26
27 import com.cyanogenmod.eleven.Config.SmartPlaylistType;
28 import com.cyanogenmod.eleven.MusicStateListener;
29 import com.cyanogenmod.eleven.R;
30 import com.cyanogenmod.eleven.adapters.PagerAdapter;
31 import com.cyanogenmod.eleven.adapters.PlaylistAdapter;
32 import com.cyanogenmod.eleven.loaders.PlaylistLoader;
33 import com.cyanogenmod.eleven.model.Playlist;
34 import com.cyanogenmod.eleven.recycler.RecycleHolder;
35 import com.cyanogenmod.eleven.ui.activities.BaseActivity;
36 import com.cyanogenmod.eleven.ui.fragments.phone.MusicBrowserFragment;
37 import com.cyanogenmod.eleven.utils.NavUtils;
38 import com.cyanogenmod.eleven.utils.PlaylistPopupMenuHelper;
39 import com.cyanogenmod.eleven.utils.PopupMenuHelper;
40 import com.cyanogenmod.eleven.widgets.IPopupMenuCallback;
41 import com.cyanogenmod.eleven.widgets.LoadingEmptyContainer;
42
43 import java.util.List;
44
45 /**
46  * This class is used to display all of the playlists on a user's device.
47  *
48  * @author Andrew Neal (andrewdneal@gmail.com)
49  */
50 public class PlaylistFragment extends MusicBrowserFragment implements
51         LoaderCallbacks<List<Playlist>>,
52         OnItemClickListener, MusicStateListener {
53
54     /**
55      * The adapter for the list
56      */
57     private PlaylistAdapter mAdapter;
58
59     /**
60      * The list view
61      */
62     private ListView mListView;
63
64     /**
65      * Pop up menu helper
66      */
67     private PopupMenuHelper mPopupMenuHelper;
68
69     /**
70      * This holds the loading progress bar as well as the no results message
71      */
72     private LoadingEmptyContainer mLoadingEmptyContainer;
73
74     /**
75      * Empty constructor as per the {@link Fragment} documentation
76      */
77     public PlaylistFragment() {
78     }
79
80     @Override
81     public int getLoaderId() {
82         return PagerAdapter.MusicFragments.PLAYLIST.ordinal();
83     }
84
85     /**
86      * {@inheritDoc}
87      */
88     @Override
89     public void onCreate(final Bundle savedInstanceState) {
90         super.onCreate(savedInstanceState);
91         mPopupMenuHelper = new PlaylistPopupMenuHelper(getActivity(), getFragmentManager(), null) {
92             @Override
93             public Playlist getPlaylist(int position) {
94                 return mAdapter.getItem(position);
95             }
96         };
97
98         // Create the adapter
99         mAdapter = new PlaylistAdapter(getActivity());
100         mAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
101             @Override
102             public void onPopupMenuClicked(View v, int position) {
103                 mPopupMenuHelper.showPopupMenu(v, position);
104             }
105         });
106     }
107
108     /**
109      * {@inheritDoc}
110      */
111     @Override
112     public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
113             final Bundle savedInstanceState) {
114         // The View for the fragment's UI
115         final ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.list_base, null);
116         // Initialize the list
117         mListView = (ListView)rootView.findViewById(R.id.list_base);
118         // Set the data behind the grid
119         mListView.setAdapter(mAdapter);
120         // Release any references to the recycled Views
121         mListView.setRecyclerListener(new RecycleHolder());
122         // Play the selected song
123         mListView.setOnItemClickListener(this);
124         // Setup the loading and empty state
125         mLoadingEmptyContainer =
126                 (LoadingEmptyContainer)rootView.findViewById(R.id.loading_empty_container);
127         mListView.setEmptyView(mLoadingEmptyContainer);
128
129         // Register the music status listener
130         ((BaseActivity)getActivity()).setMusicStateListenerListener(this);
131
132         return rootView;
133     }
134
135     @Override
136     public void onDestroyView() {
137         super.onDestroyView();
138
139         ((BaseActivity)getActivity()).removeMusicStateListenerListener(this);
140     }
141
142
143     /**
144      * {@inheritDoc}
145      */
146     @Override
147     public void onActivityCreated(final Bundle savedInstanceState) {
148         super.onActivityCreated(savedInstanceState);
149         // Enable the options menu
150         setHasOptionsMenu(true);
151         // Start the loader
152         initLoader(null, this);
153     }
154
155     /**
156      * {@inheritDoc}
157      */
158     @Override
159     public void onItemClick(final AdapterView<?> parent, final View view, final int position,
160             final long id) {
161         Playlist playlist = mAdapter.getItem(position);
162
163         SmartPlaylistType playlistType = SmartPlaylistType.getTypeById(playlist.mPlaylistId);
164         if (playlistType != null) {
165             NavUtils.openSmartPlaylist(getActivity(), playlistType);
166         } else {
167             NavUtils.openPlaylist(getActivity(), playlist.mPlaylistId, playlist.mPlaylistName);
168         }
169     }
170
171     /**
172      * {@inheritDoc}
173      */
174     @Override
175     public Loader<List<Playlist>> onCreateLoader(final int id, final Bundle args) {
176         // show the loading progress bar
177         mLoadingEmptyContainer.showLoading();
178         return new PlaylistLoader(getActivity());
179     }
180
181     /**
182      * {@inheritDoc}
183      */
184     @Override
185     public void onLoadFinished(final Loader<List<Playlist>> loader, final List<Playlist> data) {
186         // Check for any errors
187         if (data.isEmpty()) {
188             mLoadingEmptyContainer.showNoResults();
189             return;
190         }
191
192         // Start fresh
193         mAdapter.unload();
194         // Add the data to the adpater
195         for (final Playlist playlist : data) {
196             mAdapter.add(playlist);
197         }
198         // Build the cache
199         mAdapter.buildCache();
200     }
201
202     /**
203      * {@inheritDoc}
204      */
205     @Override
206     public void onLoaderReset(final Loader<List<Playlist>> loader) {
207         // Clear the data in the adapter
208         mAdapter.unload();
209     }
210
211     /**
212      * {@inheritDoc}
213      */
214     @Override
215     public void restartLoader() {
216         restartLoader(null, this);
217     }
218
219     @Override
220     public void onPlaylistChanged() {
221         restartLoader();
222     }
223
224     /**
225      * {@inheritDoc}
226      */
227     @Override
228     public void onMetaChanged() {
229         // Nothing to do
230     }
231 }