package com.smartisanos.sidebar.view; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.smartisanos.sidebar.R; import com.smartisanos.sidebar.util.FileInfo; import com.smartisanos.sidebar.util.IEmpty; import com.smartisanos.sidebar.util.ImageInfo; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.RecentFileManager; import com.smartisanos.sidebar.util.Utils; public class RecentFileAdapter extends BaseAdapter { private static final LOG log = LOG.getInstance(RecentFileAdapter.class); private static final int[] sNeedExpandNumber = new int[] { 15, 15, 30, 30, 60 }; private Context mContext; private RecentFileManager mFileManager; private List<FileInfo> mFileInfoList = new ArrayList<FileInfo>(); private boolean[] mExpand = new boolean[Utils.Interval.DAY_INTERVAL.length]; private Map<Integer, List<FileInfo>> mIntervals = new HashMap<Integer, List<FileInfo>>(); private Handler mHandler; private IEmpty mEmpty; public RecentFileAdapter(Context context, IEmpty empty) { mContext = context; mEmpty = empty; mHandler = new Handler(Looper.getMainLooper()); mFileManager = RecentFileManager.getInstance(mContext); mFileManager.addListener(new RecentFileManager.RecentUpdateListener() { @Override public void onUpdate() { mHandler.post(new Runnable() { @Override public void run() { updateDataList(); } }); } }); updateDataList(); notifyEmpty(); } private void updateDataList() { mFileInfoList = mFileManager.getFileList(); Collections.sort(mFileInfoList); mIntervals.clear(); long now = System.currentTimeMillis(); for (int i = 0; i < mFileInfoList.size(); i++) { FileInfo info = mFileInfoList.get(i); int interval = Utils.Interval.getInterval(now, info.lastTime); List<FileInfo> list = mIntervals.get(interval); if (list == null) { list = new ArrayList<FileInfo>(); mIntervals.put(interval, list); } list.add(info); } notifyDataSetChanged(); } 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; } public void shrink() { Arrays.fill(mExpand, false); notifyDataSetChanged(); } private int getIntervalCount(int i) { List<FileInfo> 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; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new RecentFileItemView(mContext); } RecentFileItemView rfiv = (RecentFileItemView) convertView; rfiv.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) { rfiv.showDate(Utils.Interval.LABEL_INTERVAL[our_interval]); } List<FileInfo> intervalInfos = mIntervals.get(our_interval); if(interval_line == sNeedExpandNumber[our_interval] - 1 && !mExpand[our_interval] && interval_line != intervalInfos.size() - 1) { rfiv.showMoreTag(new showMoreListener(our_interval, rfiv, intervalInfos.get(interval_line))); } else { rfiv.showItem(intervalInfos.get(interval_line)); } return rfiv; } class showMoreListener implements View.OnClickListener { private int mInterval; private RecentFileItemView mView; private FileInfo mInfo; public showMoreListener(int interval, RecentFileItemView view, FileInfo fileInfo) { mInterval = interval; mView = view; mInfo = fileInfo; } @Override public void onClick(View v) { mView.reset(); mView.showItem(mInfo); mExpand[mInterval] = true; notifyDataSetChanged(); } } }