package com.erakk.lnreader.adapter;
import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.erakk.lnreader.Constants;
import com.erakk.lnreader.R;
import com.erakk.lnreader.UIHelper;
import com.erakk.lnreader.dao.NovelsDao;
import com.erakk.lnreader.helper.Util;
import com.erakk.lnreader.model.PageModel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class PageModelAdapter extends ArrayAdapter<PageModel> {
private static final String TAG = PageModelAdapter.class.toString();
private final Context context;
private int layoutResourceId;
public List<PageModel> data;
private PageModel[] originalData = new PageModel[0];
public PageModelAdapter(Context context, int resourceId, List<PageModel> objects) {
super(context, resourceId, objects);
this.layoutResourceId = resourceId;
this.context = context;
this.data = objects;
this.originalData = objects.toArray(originalData);
filterData();
Log.d(TAG, "created with " + objects.size() + " items");
}
public void setLayout(int resourceId) {
this.layoutResourceId = resourceId;
}
@Override
public void addAll(PageModel... objects) {
synchronized (this) {
if (data == null) {
data = new ArrayList<PageModel>();
}
for (PageModel pageModel : objects) {
data.add(pageModel);
}
}
this.notifyDataSetChanged();
}
@Override
public void addAll(Collection<? extends PageModel> objects) {
synchronized (this) {
if (data == null) {
data = new ArrayList<PageModel>();
}
data.addAll(objects);
}
this.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
PageModelHolder holder = null;
final PageModel page = data.get(position);
if (null == row) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new PageModelHolder();
holder.txtNovel = (TextView) row.findViewById(R.id.novel_name);
holder.txtLastUpdate = (TextView) row.findViewById(R.id.novel_last_update);
holder.txtLastCheck = (TextView) row.findViewById(R.id.novel_last_check);
holder.chkIsWatched = (CheckBox) row.findViewById(R.id.novel_is_watched);
holder.ivExternal = (ImageView) row.findViewById(R.id.is_external);
holder.ivHasUpdates = (ImageView) row.findViewById(R.id.novel_has_updates);
} else {
holder = (PageModelHolder) row.getTag();
}
if (holder.txtNovel != null) {
holder.txtNovel.setText(page.getTitle());
if (page.isHighlighted()) {
holder.txtNovel.setTypeface(null, Typeface.BOLD);
holder.txtNovel.setTextSize(20);
holder.txtNovel.setText("⇒" + holder.txtNovel.getText());
}
// set color
holder.txtNovel.setTextColor(Constants.COLOR_UNREAD);
if(!Util.isStringNullOrEmpty(page.getStatus())) {
if(page.getStatus().equalsIgnoreCase("abandoned")) {
holder.txtNovel.setTextColor(Constants.COLOR_ABANDONED);
}
}
if (page.isMissing()) {
holder.txtNovel.setTextColor(Constants.COLOR_MISSING);
}
if (page.isRedlink()) {
holder.txtNovel.setTextColor(Constants.COLOR_REDLINK);
}
if (page.isExternal()) {
holder.txtNovel.setTextColor(Constants.COLOR_EXTERNAL);
}
}
if (holder.txtLastUpdate != null) {
holder.txtLastUpdate.setText(context.getResources().getString(R.string.last_update) + ": " + Util.formatDateForDisplay(context, page.getLastUpdate()));
}
if (holder.txtLastCheck != null) {
holder.txtLastCheck.setText(context.getResources().getString(R.string.last_check) + ": " + Util.formatDateForDisplay(context, page.getLastCheck()));
}
if (holder.chkIsWatched != null) {
// Log.d(TAG, page.getId() + " " + page.getTitle() + " isWatched: " + page.isWatched());
holder.chkIsWatched.setOnCheckedChangeListener(null);
holder.chkIsWatched.setChecked(page.isWatched());
holder.chkIsWatched.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(context, "Added to watch list: " + page.getTitle(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Removed from watch list: " + page.getTitle(), Toast.LENGTH_SHORT).show();
}
// update the db!
page.setWatched(isChecked);
NovelsDao.getInstance().updatePageModel(page);
}
});
}
if (holder.ivExternal != null) {
if (page.isExternal()) {
holder.ivExternal.setVisibility(View.VISIBLE);
//UIHelper.setColorFilter(holder.ivExternal);
} else {
holder.ivExternal.setVisibility(View.GONE);
}
}
if (holder.ivHasUpdates != null) {
if (page.getUpdateCount() > 0) {
holder.ivHasUpdates.setVisibility(View.VISIBLE);
//UIHelper.setColorFilter(holder.ivHasUpdates);
} else {
holder.ivHasUpdates.setVisibility(View.GONE);
}
}
row.setTag(holder);
return row;
}
public List<PageModel> allData;
public void filterData(String query) {
// keep the original data
if(allData == null || allData.size() < data.size()) {
allData = new ArrayList<PageModel>();
allData.addAll(data);
}
if(Util.isStringNullOrEmpty(query)) {
// restore data
data.clear();
if(allData.size() > data.size()) {
data.addAll(allData);
}
}
else {
query = query.toLowerCase();
this.clear();
data.clear();
for(PageModel item : allData) {
if(item.getTitle().toLowerCase().contains(query)) data.add(item);
}
}
super.notifyDataSetChanged();
Log.d(TAG, "Filtered result : " + data.size());
}
public void filterData() {
this.clear();
data.clear();
for (PageModel item : originalData) {
if (!item.isHighlighted()) {
if (!UIHelper.getShowRedlink(getContext()) && item.isRedlink())
continue;
if (!UIHelper.getShowMissing(getContext()) && item.isMissing())
continue;
if (!UIHelper.getShowExternal(getContext()) && item.isExternal())
continue;
}
data.add(item);
}
super.notifyDataSetChanged();
Log.d(TAG, "Filtered result : " + data.size());
}
// somehow if enabled, will trigger the db 2x (first load and after load)
@Override
public void notifyDataSetChanged() {
synchronized (this) {
// refresh the data
Log.d(TAG, "Refreshing data: " + data.size() + " items");
if (!UIHelper.getQuickLoad(context)) {
for (int i = 0; i < data.size(); ++i) {
try {
PageModel temp = NovelsDao.getInstance().getPageModel(data.get(i), null);
temp.setUpdateCount(data.get(i).getUpdateCount());
data.set(i, temp);
} catch (Exception e) {
Log.e(TAG, "Error when refreshing PageModel: " + data.get(i).getPage(), e);
}
}
}
super.notifyDataSetChanged();
}
}
static class PageModelHolder {
TextView txtNovel;
TextView txtLastUpdate;
TextView txtLastCheck;
CheckBox chkIsWatched;
ImageView ivExternal;
ImageView ivHasUpdates;
}
public void setResourceId(int id) {
this.layoutResourceId = id;
}
}