OSDN Git Service

Eleven: Add loading dialogs to all fragments
[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
33     public DetailSongAdapter(final Activity activity) {
34         mActivity = activity;
35         mImageFetcher = ApolloUtils.getImageFetcher(activity);
36         mInflater = LayoutInflater.from(activity);
37     }
38
39     @Override
40     public int getCount() { return mSongs.size(); }
41
42     @Override
43     public Song getItem(int pos) { return mSongs.get(pos); }
44
45     @Override
46     public long getItemId(int pos) { return pos; }
47
48     @Override
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));
53         }
54
55         Holder holder = (Holder)convertView.getTag();
56
57         Song song = getItem(pos);
58         holder.update(song);
59         holder.popupMenuButton.setPopupMenuClickedListener(mListener);
60         holder.popupMenuButton.setPosition(pos);
61
62         return convertView;
63     }
64
65     protected abstract int rowLayoutId();
66     protected abstract void onLoading();
67     protected abstract void onNoResults();
68
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;
78         }
79         MusicUtils.playAll(mActivity, toPlay, -1, false);
80     }
81
82     @Override // LoaderCallbacks
83     public void onLoadFinished(Loader<List<Song>> loader, List<Song> songs) {
84         if (songs.isEmpty()) {
85             onNoResults();
86             return;
87         }
88         mSongs = songs;
89         notifyDataSetChanged();
90     }
91
92     @Override // LoaderCallbacks
93     public void onLoaderReset(Loader<List<Song>> loader) {
94         mSongs = Collections.emptyList();
95         notifyDataSetChanged();
96         mImageFetcher.flush();
97     }
98
99     @Override
100     public void setPopupMenuClickedListener(IListener listener) {
101         mListener = listener;
102     }
103
104     protected abstract Holder newHolder(View root, ImageFetcher fetcher);
105
106     protected static abstract class Holder {
107         protected ImageFetcher fetcher;
108         protected TextView title;
109         protected PopupMenuButton popupMenuButton;
110
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);
115         }
116
117         protected abstract void update(Song song);
118     }
119 }