1 package com.cyngn.eleven.adapters;
3 import android.app.Activity;
4 import android.support.v4.app.LoaderManager.LoaderCallbacks;
5 import android.support.v4.content.Loader;
6 import android.view.LayoutInflater;
7 import android.view.View;
8 import android.view.ViewGroup;
9 import android.widget.AdapterView;
10 import android.widget.AdapterView.OnItemClickListener;
11 import android.widget.BaseAdapter;
12 import android.widget.TextView;
14 import com.cyngn.eleven.R;
15 import com.cyngn.eleven.cache.ImageFetcher;
16 import com.cyngn.eleven.model.Song;
17 import com.cyngn.eleven.utils.ApolloUtils;
18 import com.cyngn.eleven.utils.MusicUtils;
19 import com.cyngn.eleven.widgets.IPopupMenuCallback;
20 import com.cyngn.eleven.widgets.PopupMenuButton;
22 import java.util.Collections;
23 import java.util.List;
25 public abstract class DetailSongAdapter extends BaseAdapter
26 implements LoaderCallbacks<List<Song>>, OnItemClickListener, IPopupMenuCallback {
27 protected final Activity mActivity;
28 private final ImageFetcher mImageFetcher;
29 private final LayoutInflater mInflater;
30 private List<Song> mSongs = Collections.emptyList();
31 private IListener mListener;
32 private IEmptyAdapterCallback mEmptyCallback;
34 public DetailSongAdapter(final Activity activity) {
36 mImageFetcher = ApolloUtils.getImageFetcher(activity);
37 mInflater = LayoutInflater.from(activity);
41 public int getCount() { return mSongs.size(); }
44 public Song getItem(int pos) { return mSongs.get(pos); }
47 public long getItemId(int pos) { return pos; }
50 public View getView(int pos, View convertView, ViewGroup parent) {
51 if(convertView == null) {
52 convertView = mInflater.inflate(rowLayoutId(), parent, false);
53 convertView.setTag(newHolder(convertView, mImageFetcher));
56 Holder holder = (Holder)convertView.getTag();
58 Song song = getItem(pos);
60 holder.popupMenuButton.setPopupMenuClickedListener(mListener);
61 holder.popupMenuButton.setPosition(pos);
66 protected abstract int rowLayoutId();
68 @Override // OnItemClickListener
69 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
70 // id is in this case the index in the underlying collection,
71 // which is what we are interested in here -- so use as position
72 int position = (int)id;
73 // play clicked song and enqueue all following songs
74 long[] toPlay = new long[getCount() - position];
75 for(int i = 0; i < toPlay.length; i++) {
76 toPlay[i] = getItem(position + i).mSongId;
78 MusicUtils.playAll(mActivity, toPlay, -1, false);
81 @Override // LoaderCallbacks
82 public void onLoadFinished(Loader<List<Song>> loader, List<Song> songs) {
83 if (songs.isEmpty()) {
84 if (mEmptyCallback != null) {
85 mEmptyCallback.onEmptyAdapter();
91 notifyDataSetChanged();
94 @Override // LoaderCallbacks
95 public void onLoaderReset(Loader<List<Song>> loader) {
96 mSongs = Collections.emptyList();
97 notifyDataSetChanged();
98 mImageFetcher.flush();
102 public void setPopupMenuClickedListener(IListener listener) {
103 mListener = listener;
106 public void setOnEmptyAdapterListener(IEmptyAdapterCallback callback) {
107 mEmptyCallback = callback;
110 protected abstract Holder newHolder(View root, ImageFetcher fetcher);
112 protected static abstract class Holder {
113 protected ImageFetcher fetcher;
114 protected TextView title;
115 protected PopupMenuButton popupMenuButton;
117 protected Holder(View root, ImageFetcher fetcher) {
118 this.fetcher = fetcher;
119 title = (TextView)root.findViewById(R.id.title);
120 popupMenuButton = (PopupMenuButton)root.findViewById(R.id.overflow);
123 protected abstract void update(Song song);