package com.seafile.seadroid2.ui.adapter;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.google.common.collect.Lists;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.seafile.seadroid2.R;
import com.seafile.seadroid2.data.SeafEvent;
import com.seafile.seadroid2.data.SeafItem;
import com.seafile.seadroid2.ui.activity.BrowserActivity;
import com.seafile.seadroid2.ui.widget.CircleImageView;
import com.seafile.seadroid2.util.Utils;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Adapter for Activities tab
*/
public class ActivitiesItemAdapter extends BaseAdapter {
public static final String DEBUG_TAG = ActivitiesItemAdapter.class.getSimpleName();
public static final int REFRESH_ON_NONE = 0;
public static final int REFRESH_ON_PULL_DOWN = 1;
public static final int REFRESH_ON_PULL_UP = 2;
private int state = REFRESH_ON_NONE;
private ArrayList<SeafEvent> items;
private BrowserActivity mActivity;
private ImageLoader loader;
private DisplayImageOptions options;
public ActivitiesItemAdapter(BrowserActivity activity) {
this.mActivity = activity;
items = Lists.newArrayList();
loader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.extraForDownloader(mActivity.getAccount())
.showStubImage(R.drawable.default_avatar)
.showImageOnLoading(R.drawable.default_avatar)
.showImageForEmptyUri(R.drawable.default_avatar)
.showImageOnFail(R.drawable.default_avatar)
.resetViewBeforeLoading()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.build();
}
@Override
public int getCount() {
return items.size() + 1;
}
public void clear() {
items.clear();
}
public void add(SeafEvent entry) {
items.add(entry);
}
public void notifyChanged() {
notifyDataSetChanged();
}
@Override
public SeafItem getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void setItems(List<SeafEvent> events) {
items.clear();
items.addAll(events);
}
private LinearLayout mFooterView;
public void setFooterViewLoading(boolean more) {
ProgressBar progress = (ProgressBar) mFooterView.findViewById(R.id.progressbar);
TextView text = (TextView) mFooterView.findViewById(R.id.text);
if (more) {
mFooterView.setVisibility(View.VISIBLE);
progress.setVisibility(View.VISIBLE);
text.setVisibility(View.VISIBLE);
} else {
progress.setVisibility(View.GONE);
mFooterView.setVisibility(View.GONE);
text.setVisibility(View.GONE);
}
}
public void setState(int state) {
this.state = state;
}
public View getFooterView() {
return this.mFooterView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (position == getCount() - 1) {
this.mFooterView = (LinearLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_load_more, null);
switch (state) {
case REFRESH_ON_NONE:
case REFRESH_ON_PULL_DOWN:
setFooterViewLoading(false);
break;
case REFRESH_ON_PULL_UP:
setFooterViewLoading(true);
break;
}
return mFooterView;
}
if (position < 0) {
position = 0;
}
final SeafEvent item = items.get(position);
View view = convertView;
// TODO optimize by setting tags
final ViewHolder viewHolder;
view = LayoutInflater.from(mActivity).inflate(R.layout.list_item_activities, null);
TextView title = (TextView) view.findViewById(R.id.tv_activities_mod_desc);
TextView nick = (TextView) view.findViewById(R.id.tv_activities_nick);
TextView date = (TextView) view.findViewById(R.id.tv_activities_date);
TextView repoName = (TextView) view.findViewById(R.id.tv_activities_repo_name);
CircleImageView icon = (CircleImageView) view.findViewById(R.id.iv_activities_avatar);
viewHolder = new ViewHolder(title, nick, date, repoName, icon);
view.setTag(viewHolder);
if (!TextUtils.isEmpty(item.getAvatar())) {
final String avatar = parseAvatar(item.getAvatar());
loader.displayImage(avatar, viewHolder.icon, options);
} else {
// show a place holder indicating the error
loader.displayImage(item.getAvatar(), viewHolder.icon, options);
}
viewHolder.title.setText(item.getDesc());
viewHolder.nick.setText(item.getNick());
if (!TextUtils.isEmpty(item.getTime_relative())) {
final String relative = parseRelativeTime(item.getTime_relative());
viewHolder.date.setText(relative);
viewHolder.date.setVisibility(View.VISIBLE);
} else {
viewHolder.date.setVisibility(View.GONE);
}
viewHolder.repoName.setText(item.getRepo_name());
return view;
}
private String parseAvatar(@NonNull String avatar) {
// <img src="/seahub/image-view/avatars/7/9/dc411b7a64a20963ccff32563e38d6/resized/36/bamboo_5.png" width="36" height="36" class="avatar" />
String re1 = ".*?"; // Non-greedy match on filler
String re2 = "(src)"; // Variable Name 1
String re3 = ".*?"; // Non-greedy match on filler
String re4 = "((?:\\/[\\w\\.\\-]+)+)"; // Unix Path 1
Pattern p = Pattern.compile(re1 + re2 + re3 + re4, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(avatar);
if (m.find()) {
String avatarPath = m.group(2);
return Utils.pathJoin(mActivity.getAccount().getServer(), avatarPath);
} else return avatar;
}
private String parseRelativeTime(@NonNull String relativeTime) {
String regex = "(<[^>]+>)";
final String[] split = relativeTime.split(regex);
if (split.length > 1) {
return split[1];
} else return relativeTime;
}
private class ViewHolder {
TextView title, nick, date, repoName;
ImageView icon;
public ViewHolder(TextView title, TextView nick, TextView date, TextView repoName, ImageView icon) {
super();
this.icon = icon;
this.title = title;
this.nick = nick;
this.date = date;
this.repoName = repoName;
}
}
}