package com.seafile.seadroid2.ui.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.common.collect.Lists;
import com.seafile.seadroid2.R;
import com.seafile.seadroid2.data.DataManager;
import com.seafile.seadroid2.data.SeafCachedFile;
import com.seafile.seadroid2.data.SeafDirent;
import com.seafile.seadroid2.data.SeafItem;
import com.seafile.seadroid2.ui.NavContext;
import com.seafile.seadroid2.ui.activity.BrowserActivity;
import com.seafile.seadroid2.util.Utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class SeafItemCheckableAdapter extends BaseAdapter {
public interface OnCheckedChangeListener {
void onCheckedChanged(SeafItem item, boolean isChecked);
}
private ArrayList<SeafItemWrap> items;
private BrowserActivity mActivity;
private OnCheckedChangeListener listener = null;
public SeafItemCheckableAdapter(BrowserActivity mActivity) {
this.mActivity = mActivity;
items = Lists.newArrayList();
}
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
this.listener = listener;
}
@Override
public int getCount() {
return items.size();
}
@Override
public boolean isEmpty() {
return items.isEmpty();
}
public void addEntry(SeafItem entry) {
SeafItemWrap w = new SeafItemWrap(entry);
items.add(w);
// Collections.sort(items);
notifyDataSetChanged();
}
public void add(SeafItem entry) {
SeafItemWrap w = new SeafItemWrap(entry);
items.add(w);
}
public void notifyChanged() {
notifyDataSetChanged();
}
@Override
public SeafItem getItem(int position) {
return items.get(position).item;
}
public void setItem(SeafItem item, int listviewPosition) {
SeafItemWrap w = new SeafItemWrap(item);
items.set(listviewPosition, w);
notifyDataSetChanged();
}
@Override
public long getItemId(int position) {
return position;
}
public int getNumSelected() {
int i = 0;
for (SeafItemWrap w : items) {
if (w.seleted)
i++;
}
return i;
}
public List<SeafItem> getSelectedItems() {
List<SeafItem> r = Lists.newArrayList();
for (SeafItemWrap w : items) {
if (w.seleted)
r.add(w.item);
}
return r;
}
public void removeSelectedItems() {
List<SeafItemWrap> tmp = Lists.newArrayList();
for (SeafItemWrap w : items) {
if (w.seleted)
tmp.add(w);
}
items.removeAll(tmp);
notifyDataSetChanged();
}
public void clear() {
items.clear();
}
private View getDirentView(SeafItemWrap w, View convertView,
ViewGroup parent, int position) {
View view = convertView;
Viewholder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(mActivity).inflate(R.layout.list_item_entry_check, null);
TextView title = (TextView) view.findViewById(R.id.list_item_title);
TextView subtitle = (TextView) view.findViewById(R.id.list_item_subtitle);
ImageView icon = (ImageView) view.findViewById(R.id.list_item_icon);
CheckBox ck = (CheckBox) view.findViewById(R.id.list_item_checkbox);
viewHolder = new Viewholder(title, subtitle, icon, ck);
view.setTag(viewHolder);
} else {
viewHolder = (Viewholder) convertView.getTag();
}
viewHolder.title.setText(w.item.getTitle());
SeafDirent dirent = (SeafDirent) w.item;
if (dirent.isDir()) {
viewHolder.subtitle.setText("");
} else {
NavContext nav = mActivity.getNavContext();
DataManager dataManager = mActivity.getDataManager();
String repoName = nav.getRepoName();
String repoID = nav.getRepoID();
String filePath = Utils.pathJoin(nav.getDirPath(), dirent.name);
File file = dataManager.getLocalRepoFile(repoName, repoID, filePath);
if (file.exists())
viewHolder.subtitle.setText(dirent.getSubtitle() + " cached");
else
viewHolder.subtitle.setText(dirent.getSubtitle());
}
viewHolder.icon.setImageResource(dirent.getIcon());
viewHolder.checkbox.setChecked(w.isSelected());
return view;
}
private View getCacheView(SeafItemWrap w, View convertView,
ViewGroup parent, int position) {
View view = convertView;
final Viewholder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(mActivity).inflate(R.layout.list_item_entry_check, null);
TextView title = (TextView) view.findViewById(R.id.list_item_title);
TextView subtitle = (TextView) view.findViewById(R.id.list_item_subtitle);
ImageView icon = (ImageView) view.findViewById(R.id.list_item_icon);
CheckBox ck = (CheckBox) view.findViewById(R.id.list_item_checkbox);
viewHolder = new Viewholder(title, subtitle, icon, ck);
view.setTag(viewHolder);
ck.setTag(items.get(position));
ck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SeafItemWrap w = (SeafItemWrap)viewHolder.checkbox.getTag();
w.setSeleted(isChecked);
if (listener != null) {
listener.onCheckedChanged(w.item, isChecked);
}
}
});
} else {
viewHolder = (Viewholder) convertView.getTag();
viewHolder.checkbox.setTag(w);
}
viewHolder.title.setText(w.item.getTitle());
viewHolder.subtitle.setText(w.item.getSubtitle());
viewHolder.icon.setImageResource(w.item.getIcon());
viewHolder.checkbox.setChecked(w.isSelected());
return view;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SeafItemWrap w = items.get(position);
if (w.item instanceof SeafCachedFile) {
return getCacheView(w, convertView, parent, position);
} else {
return getDirentView(w, convertView, parent, position);
}
}
private class Viewholder {
TextView title, subtitle;
ImageView icon;
CheckBox checkbox;
public Viewholder(TextView title, TextView subtitle, ImageView icon, CheckBox checkbox) {
this.icon = icon;
this.title = title;
this.subtitle = subtitle;
this.checkbox = checkbox;
}
}
public class SeafItemWrap {
SeafItem item;
boolean seleted;
public SeafItemWrap(SeafItem item) {
this.item = item;
seleted = false;
}
public void setSeleted(boolean selected) {
this.seleted = selected;
}
public boolean isSelected() {
return seleted;
}
}
}