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.
14 package com.cyanogenmod.eleven.ui.fragments;
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;
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;
43 import java.util.List;
46 * This class is used to display all of the playlists on a user's device.
48 * @author Andrew Neal (andrewdneal@gmail.com)
50 public class PlaylistFragment extends MusicBrowserFragment implements
51 LoaderCallbacks<List<Playlist>>,
52 OnItemClickListener, MusicStateListener {
55 * The adapter for the list
57 private PlaylistAdapter mAdapter;
62 private ListView mListView;
67 private PopupMenuHelper mPopupMenuHelper;
70 * This holds the loading progress bar as well as the no results message
72 private LoadingEmptyContainer mLoadingEmptyContainer;
75 * Empty constructor as per the {@link Fragment} documentation
77 public PlaylistFragment() {
81 public int getLoaderId() {
82 return PagerAdapter.MusicFragments.PLAYLIST.ordinal();
89 public void onCreate(final Bundle savedInstanceState) {
90 super.onCreate(savedInstanceState);
91 mPopupMenuHelper = new PlaylistPopupMenuHelper(getActivity(), getFragmentManager(), null) {
93 public Playlist getPlaylist(int position) {
94 return mAdapter.getItem(position);
99 mAdapter = new PlaylistAdapter(getActivity());
100 mAdapter.setPopupMenuClickedListener(new IPopupMenuCallback.IListener() {
102 public void onPopupMenuClicked(View v, int position) {
103 mPopupMenuHelper.showPopupMenu(v, position);
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);
129 // Register the music status listener
130 ((BaseActivity)getActivity()).setMusicStateListenerListener(this);
136 public void onDestroyView() {
137 super.onDestroyView();
139 ((BaseActivity)getActivity()).removeMusicStateListenerListener(this);
147 public void onActivityCreated(final Bundle savedInstanceState) {
148 super.onActivityCreated(savedInstanceState);
149 // Enable the options menu
150 setHasOptionsMenu(true);
152 initLoader(null, this);
159 public void onItemClick(final AdapterView<?> parent, final View view, final int position,
161 Playlist playlist = mAdapter.getItem(position);
163 SmartPlaylistType playlistType = SmartPlaylistType.getTypeById(playlist.mPlaylistId);
164 if (playlistType != null) {
165 NavUtils.openSmartPlaylist(getActivity(), playlistType);
167 NavUtils.openPlaylist(getActivity(), playlist.mPlaylistId, playlist.mPlaylistName);
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());
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();
194 // Add the data to the adpater
195 for (final Playlist playlist : data) {
196 mAdapter.add(playlist);
199 mAdapter.buildCache();
206 public void onLoaderReset(final Loader<List<Playlist>> loader) {
207 // Clear the data in the adapter
215 public void restartLoader() {
216 restartLoader(null, this);
220 public void onPlaylistChanged() {
228 public void onMetaChanged() {