package com.smartisanos.sidebar.view; 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 com.smartisanos.sidebar.R; import com.smartisanos.sidebar.util.DataManager.RecentUpdateListener; import com.smartisanos.sidebar.util.IEmpty; import com.smartisanos.sidebar.util.ImageInfo; import com.smartisanos.sidebar.util.ImageLoader; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.RecentPhotoManager; import com.smartisanos.sidebar.util.Utils; import android.content.Context; import android.content.res.Resources; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; public class RecentPhotoAdapter extends BaseAdapter { private static final LOG log = LOG.getInstance(RecentPhotoAdapter.class); private static final int[] sNeedExpandNumber = new int[] { 30, 30, 60, 60, 60 }; private Context mContext; private RecentPhotoManager mPhotoManager; private List<ImageInfo> mImageInfoList = new ArrayList<ImageInfo>(); private boolean[] mExpand = new boolean[Utils.Interval.DAY_INTERVAL.length]; private Map<Integer, List<ImageInfo>> mIntervals = new HashMap<Integer, List<ImageInfo>>(); private int mFirstInterval; private ImageLoader mImageLoader; private Handler mHandler; private IEmpty mEmpty; public RecentPhotoAdapter(Context context, IEmpty empty) { mContext = context; mEmpty = empty; mHandler = new Handler(Looper.getMainLooper()); mPhotoManager = RecentPhotoManager.getInstance(mContext); int maxPhotoSize = mContext.getResources().getDimensionPixelSize(R.dimen.recent_photo_size); mImageLoader = new ImageLoader(maxPhotoSize); mImageInfoList = mPhotoManager.getImageList(); updateDataList(); mPhotoManager.addListener(new RecentUpdateListener() { @Override public void onUpdate() { mHandler.post(new Runnable(){ @Override public void run() { mImageInfoList = mPhotoManager.getImageList(); updateDataList(); notifyDataSetChanged(); } }); } }); notifyEmpty(); } public void shrink() { Arrays.fill(mExpand, false); notifyDataSetChanged(); } private void updateDataList() { mIntervals.clear(); mFirstInterval = Integer.MAX_VALUE; long now = System.currentTimeMillis(); for (int i = 0; i < mImageInfoList.size(); i++) { ImageInfo info = mImageInfoList.get(i); int interval = Utils.Interval.getInterval(now, info.time); List<ImageInfo> list = mIntervals.get(interval); if (list == null) { list = new ArrayList<ImageInfo>(); mIntervals.put(interval, list); mFirstInterval = Math.min(mFirstInterval, interval); } list.add(info); } } 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) { View view = convertView; ViewHolder vh = null; if(view == null) { view = LayoutInflater.from(mContext).inflate(R.layout.photo_line, null); vh = new ViewHolder(); vh.dateView = (TextView)view.findViewById(R.id.date); vh.subView[0] = (PhotoLineSubView)view.findViewById(R.id.photo_line_sub_view_1); vh.subView[1] = (PhotoLineSubView)view.findViewById(R.id.photo_line_sub_view_2); vh.subView[2] = (PhotoLineSubView)view.findViewById(R.id.photo_line_sub_view_3); view.setTag(vh); } else { vh = (ViewHolder) view.getTag(); } vh.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) { // show date vh.dateView.setText(Utils.Interval.LABEL_INTERVAL[our_interval]); vh.dateView.setVisibility(View.VISIBLE); } List<ImageInfo> intervalInfos = mIntervals.get(our_interval); boolean expand = mExpand[our_interval]; int startIndex = interval_line * 3; int needExpandNumber = sNeedExpandNumber[our_interval]; if(our_interval == mFirstInterval) { startIndex -= 1; needExpandNumber -- ; } int starti = 0; if(position == 0) { vh.subView[0].showOpenGallery(); starti ++ ; } int size = intervalInfos.size(); if (!expand) { size = Math.min(needExpandNumber, intervalInfos.size()); } for(int i = starti; i < 3; ++ i) { int index = startIndex + i; if(index < size) { if(interval_line * 3 + i == sNeedExpandNumber[our_interval] - 1) { if(intervalInfos.size() > needExpandNumber && !expand) { // show expand button; vh.subView[i].showMorePhoto(new showMoreListener(our_interval, vh.subView[i], intervalInfos.get(index))); continue; } } // set Image vh.subView[i].setImageLoader(mImageLoader); vh.subView[i].showPhoto(intervalInfos.get(index)); } else { // NA; } } return view; } public void clearCache() { if (mImageLoader != null) { mImageLoader.clearCache(); } } private int getIntervalCount(int i) { List<ImageInfo> list = mIntervals.get(i); if(list != null) { // consider expand later .. int line = (list.size() + (i == mFirstInterval ? 1 : 0) + 2) / 3; if(mExpand[i]) { return line; } else { return Math.min(line, (sNeedExpandNumber[i] + 2) / 3); } } return 0; } class ViewHolder { public TextView dateView; public PhotoLineSubView[] subView; public ViewHolder() { subView = new PhotoLineSubView[3]; } public void reset() { dateView.setVisibility(View.GONE); for(PhotoLineSubView view : subView) { view.reset(); } } } class showMoreListener implements View.OnClickListener { private int mInterval; private PhotoLineSubView mView; private ImageInfo mInfo; public showMoreListener(int interval, PhotoLineSubView view, ImageInfo imageinfo) { mInterval = interval; mView = view; mInfo = imageinfo; } @Override public void onClick(View v) { mExpand[mInterval] = true; notifyDataSetChanged(); mView.reset(); mView.setImageLoader(mImageLoader); mView.showPhoto(mInfo); } } }