package com.smartisanos.sidebar.view; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.content.CopyHistoryItem; import android.os.Handler; import android.os.Looper; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.smartisanos.sidebar.util.IEmpty; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.RecentClipManager; import com.smartisanos.sidebar.util.Utils; public class ClipboardAdapter extends BaseAdapter{ private static LOG log = LOG.getInstance(ClipboardAdapter.class); private static final int[] sNeedExpandNumber = new int[] { 15, 15, 30, 30, 60 }; private Context mContext; private RecentClipManager mClipManager; private List<CopyHistoryItem> mCopyHistoryItemList = new ArrayList<CopyHistoryItem>(); private boolean[] mExpand = new boolean[Utils.Interval.DAY_INTERVAL.length]; private Map<Integer, List<CopyHistoryItem>> mIntervals = new HashMap<Integer, List<CopyHistoryItem>>(); private Handler mHandler; private IEmpty mEmpty; public ClipboardAdapter(Context context, IEmpty empty){ mContext = context; mEmpty = empty; mHandler = new Handler(Looper.getMainLooper()); mClipManager = RecentClipManager.getInstance(mContext); mClipManager.addListener(new RecentClipManager.RecentUpdateListener(){ @Override public void onUpdate() { mHandler.post(new Runnable(){ @Override public void run() { updateDataList(); } }); } }); updateDataList(); notifyEmpty(); } public void shrink() { Arrays.fill(mExpand, false); notifyDataSetChanged(); } private void updateDataList() { mCopyHistoryItemList = mClipManager.getCopyList(); mIntervals.clear(); long now = System.currentTimeMillis(); for (int i = 0; i < mCopyHistoryItemList.size(); i++) { CopyHistoryItem item = mCopyHistoryItemList.get(i); int interval = Utils.Interval.getInterval(now, item.mTimeStamp); List<CopyHistoryItem> list = mIntervals.get(interval); if (list == null) { list = new ArrayList<CopyHistoryItem>(); mIntervals.put(interval, list); } list.add(item); } notifyDataSetChanged(); } private int getIntervalCount(int i) { List<CopyHistoryItem> list = mIntervals.get(i); if(list != null) { int line = list.size(); if(mExpand[i]) { return line; } else { return Math.min(line, sNeedExpandNumber[i]); } } return 0; } private void notifyEmpty() { if (mEmpty != null) { mEmpty.setEmpty(getCount() == 0); } } @Override public void notifyDataSetChanged() { notifyEmpty(); super.notifyDataSetChanged(); } @Override public int getCount() { int total = 0; for(int i = 0; i < Utils.Interval.DAY_INTERVAL.length; ++ i) { total += getIntervalCount(i); } return total; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new ClipboardItemView(mContext); } ClipboardItemView civ = (ClipboardItemView) convertView; civ.reset(); int now = 0; int our_interval = 0; int interval_line = 0; for(int i = 0; i < Utils.Interval.DAY_INTERVAL.length; ++ i) { if(now + getIntervalCount(i) > position) { our_interval = i; interval_line = position - now; break; } now += getIntervalCount(i); } if(interval_line == 0) { civ.showDate(Utils.Interval.LABEL_INTERVAL[our_interval]); } List<CopyHistoryItem> intervalInfos = mIntervals.get(our_interval); if(interval_line == sNeedExpandNumber[our_interval] - 1 && !mExpand[our_interval] && interval_line != intervalInfos.size() - 1) { civ.showMoreTag(new showMoreListener(our_interval, civ, intervalInfos.get(interval_line))); } else { civ.showItem(intervalInfos.get(interval_line)); } return civ; } class showMoreListener implements View.OnClickListener { private int mInterval; private ClipboardItemView mView; private CopyHistoryItem mItem; public showMoreListener(int interval, ClipboardItemView view, CopyHistoryItem item) { mInterval = interval; mView = view; mItem = item; } @Override public void onClick(View v) { mView.reset(); mView.showItem(mItem); mExpand[mInterval] = true; notifyDataSetChanged(); } } }