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;
33 public DetailSongAdapter(final Activity activity) {
35 mImageFetcher = ApolloUtils.getImageFetcher(activity);
36 mInflater = LayoutInflater.from(activity);
40 public int getCount() { return mSongs.size(); }
43 public Song getItem(int pos) { return mSongs.get(pos); }
46 public long getItemId(int pos) { return pos; }
49 public View getView(int pos, View convertView, ViewGroup parent) {
50 if(convertView == null) {
51 convertView = mInflater.inflate(rowLayoutId(), parent, false);
52 convertView.setTag(newHolder(convertView, mImageFetcher));
55 Holder holder = (Holder)convertView.getTag();
57 Song song = getItem(pos);
59 holder.popupMenuButton.setPopupMenuClickedListener(mListener);
60 holder.popupMenuButton.setPosition(pos);
65 protected abstract int rowLayoutId();
66 protected abstract void onLoading();
67 protected abstract void onNoResults();
69 @Override // OnItemClickListener
70 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
71 // id is in this case the index in the underlying collection,
72 // which is what we are interested in here -- so use as position
73 int position = (int)id;
74 // play clicked song and enqueue all following songs
75 long[] toPlay = new long[getCount() - position];
76 for(int i = 0; i < toPlay.length; i++) {
77 toPlay[i] = getItem(position + i).mSongId;
79 MusicUtils.playAll(mActivity, toPlay, -1, false);
82 @Override // LoaderCallbacks
83 public void onLoadFinished(Loader<List<Song>> loader, List<Song> songs) {
84 if (songs.isEmpty()) {
89 notifyDataSetChanged();
92 @Override // LoaderCallbacks
93 public void onLoaderReset(Loader<List<Song>> loader) {
94 mSongs = Collections.emptyList();
95 notifyDataSetChanged();
96 mImageFetcher.flush();
100 public void setPopupMenuClickedListener(IListener listener) {
101 mListener = listener;
104 protected abstract Holder newHolder(View root, ImageFetcher fetcher);
106 protected static abstract class Holder {
107 protected ImageFetcher fetcher;
108 protected TextView title;
109 protected PopupMenuButton popupMenuButton;
111 protected Holder(View root, ImageFetcher fetcher) {
112 this.fetcher = fetcher;
113 title = (TextView)root.findViewById(R.id.title);
114 popupMenuButton = (PopupMenuButton)root.findViewById(R.id.overflow);
117 protected abstract void update(Song song);