OSDN Git Service

Eleven: Add the context menu items to the 2nd layer
[android-x86/packages-apps-Eleven.git] / src / com / cyngn / eleven / adapters / DetailSongAdapter.java
1 package com.cyngn.eleven.adapters;
2
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;
13
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;
21
22 import java.util.Collections;
23 import java.util.List;
24
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;
33
34     public DetailSongAdapter(final Activity activity) {
35         mActivity = activity;
36         mImageFetcher = ApolloUtils.getImageFetcher(activity);
37         mInflater = LayoutInflater.from(activity);
38     }
39
40     @Override
41     public int getCount() { return mSongs.size(); }
42
43     @Override
44     public Song getItem(int pos) { return mSongs.get(pos); }
45
46     @Override
47     public long getItemId(int pos) { return pos; }
48
49     @Override
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));
54         }
55
56         Holder holder = (Holder)convertView.getTag();
57
58         Song song = getItem(pos);
59         holder.update(song);
60         holder.popupMenuButton.setPopupMenuClickedListener(mListener);
61         holder.popupMenuButton.setPosition(pos);
62
63         return convertView;
64     }
65
66     protected abstract int rowLayoutId();
67
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;
77         }
78         MusicUtils.playAll(mActivity, toPlay, -1, false);
79     }
80
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();
86             }
87
88             return;
89         }
90         mSongs = songs;
91         notifyDataSetChanged();
92     }
93
94     @Override // LoaderCallbacks
95     public void onLoaderReset(Loader<List<Song>> loader) {
96         mSongs = Collections.emptyList();
97         notifyDataSetChanged();
98         mImageFetcher.flush();
99     }
100
101     @Override
102     public void setPopupMenuClickedListener(IListener listener) {
103         mListener = listener;
104     }
105
106     public void setOnEmptyAdapterListener(IEmptyAdapterCallback callback) {
107         mEmptyCallback = callback;
108     }
109
110     protected abstract Holder newHolder(View root, ImageFetcher fetcher);
111
112     protected static abstract class Holder {
113         protected ImageFetcher fetcher;
114         protected TextView title;
115         protected PopupMenuButton popupMenuButton;
116
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);
121         }
122
123         protected abstract void update(Song song);
124     }
125 }