package com.erakk.lnreader.adapter;
import android.content.Context;
import android.preference.PreferenceManager;
import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseExpandableListAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
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.BookModel;
import com.erakk.lnreader.model.PageModel;
import java.util.ArrayList;
public class BookModelAdapter extends BaseExpandableListAdapter {
private static final String HIDDEN_VOLUME = "%hidden_volume%";
static class BookModelChildViewHolder {
TextView txtNovel;
ViewGroup vgChapter;
ImageView ivFinishedReading;
ImageView ivExternal;
ImageView ivIsDownloaded;
ImageView ivHasUpdates;
TextView tvLastUpdate;
TextView tvLastCheck;
TextView tvUrl;
int defaultColor;
}
static class BookModelGroupViewHolder {
TextView txtNovel;
ViewGroup container;
ImageView ivHasUpdates;
}
private static final String TAG = BookModelAdapter.class.toString();
private final Context context;
private final ArrayList<BookModel> groups;
public BookModelAdapter(Context context, ArrayList<BookModel> groups) {
this.context = context;
this.groups = groups;
}
public void refreshData() {
for (int i = 0; i < groups.size(); ++i) {
ArrayList<PageModel> chapters = groups.get(i).getChapterCollection();
for (int j = 0; j < chapters.size(); ++j)
try {
PageModel temp = NovelsDao.getInstance().getPageModel(chapters.get(j), null);
chapters.set(j, temp);
} catch (Exception e) {
Log.e(TAG, "Error when refreshing PageModel: " + chapters.get(j).getPage(), e);
}
}
}
public void addItem(PageModel item, BookModel group) {
if (!groups.contains(group)) {
groups.add(group);
}
int index = groups.indexOf(group);
ArrayList<PageModel> ch = groups.get(index).getChapterCollection();
ch.add(item);
groups.get(index).setChapterCollection(ch);
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
PageModel child = getChild(groupPosition, childPosition);
View view = convertView;
BookModelChildViewHolder holder;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int resourceId = R.layout.item_expand_chapter;
view = inflater.inflate(resourceId, null);
holder = new BookModelChildViewHolder();
holder.txtNovel = (TextView) view.findViewById(R.id.novel_chapter);
holder.defaultColor = holder.txtNovel.getTextColors().getDefaultColor();
holder.vgChapter = (ViewGroup) view.findViewById(R.id.novel_chapter_container);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
// Converts 8dp into px
int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, context.getResources().getDisplayMetrics());
holder.ivFinishedReading = new ImageView(context);
holder.ivFinishedReading.setImageResource(R.drawable.ic_finished_reading);
holder.ivFinishedReading.setScaleType(ImageView.ScaleType.CENTER);
holder.ivFinishedReading.setPadding(padding, padding, padding, padding);
holder.ivFinishedReading.setLayoutParams(params);
holder.ivExternal = new ImageView(context);
holder.ivExternal.setImageResource(R.drawable.ic_is_external);
holder.ivExternal.setScaleType(ImageView.ScaleType.CENTER);
holder.ivExternal.setPadding(padding, padding, padding, padding);
holder.ivExternal.setLayoutParams(params);
holder.ivIsDownloaded = new ImageView(context);
holder.ivIsDownloaded.setImageResource(R.drawable.ic_downloaded);
holder.ivIsDownloaded.setScaleType(ImageView.ScaleType.CENTER);
holder.ivIsDownloaded.setPadding(padding, padding, padding, padding);
holder.ivIsDownloaded.setLayoutParams(params);
holder.ivHasUpdates = new ImageView(context);
holder.ivHasUpdates.setImageResource(R.drawable.ic_update_avaliable);
holder.ivHasUpdates.setScaleType(ImageView.ScaleType.CENTER);
holder.ivHasUpdates.setPadding(padding, padding, padding, padding);
holder.ivHasUpdates.setLayoutParams(params);
holder.tvLastUpdate = (TextView) view.findViewById(R.id.novel_last_update);
holder.tvLastCheck = (TextView) view.findViewById(R.id.novel_last_check);
holder.tvUrl = (TextView) view.findViewById(R.id.novel_url);
view.setTag(holder);
} else {
holder = (BookModelChildViewHolder) view.getTag();
ViewGroup ivparent = (ViewGroup) holder.ivIsDownloaded.getParent();
if (ivparent != null)
ivparent.removeView(holder.ivIsDownloaded);
ivparent = (ViewGroup) holder.ivFinishedReading.getParent();
if (ivparent != null)
ivparent.removeView(holder.ivFinishedReading);
ivparent = (ViewGroup) holder.ivExternal.getParent();
if (ivparent != null)
ivparent.removeView(holder.ivExternal);
ivparent = (ViewGroup) holder.ivHasUpdates.getParent();
if (ivparent != null)
ivparent.removeView(holder.ivHasUpdates);
holder.txtNovel.setTextColor(holder.defaultColor);
}
TextView tv = holder.txtNovel;
tv.setText(child.getTitle());
tv.setTag(child.getPage());
/*
* DYNAMIC ICON ADDITION
*
* This will creating icons without a 8dp padding, then send it over to the end of the list container.
* To reorder the icons, simply reorder when they get added in. The first will be the one farthest to the left.
* Addition command: container.addView([insert ImageView]);
*/
ViewGroup container = holder.vgChapter;
if (holder.ivFinishedReading != null) {
if (child.isFinishedRead()) {
container.addView(holder.ivFinishedReading);
//UIHelper.setColorFilter(holder.ivFinishedReading);
}
}
if (child.isMissing()) {
tv.setTextColor(Constants.COLOR_MISSING);
}
if (child.isRedlink()) {
tv.setTextColor(Constants.COLOR_REDLINK);
}
if (child.isExternal()) {
container.addView(holder.ivExternal);
//UIHelper.setColorFilter(holder.ivExternal);
String wacName = Util.getSavedWacName(child.getPage());
if (!Util.isStringNullOrEmpty(wacName)) {
child.setDownloaded(true);
}
if (holder.tvUrl != null) {
holder.tvUrl.setText(child.getPage());
holder.tvUrl.setVisibility(View.VISIBLE);
}
} else {
if (holder.tvUrl != null) {
holder.tvUrl.setText("");
holder.tvUrl.setVisibility(View.GONE);
}
}
// Log.d("getChildView", "Downloaded " + child.getTitle() + " id " + child.getId() + " : " +
// child.isDownloaded() );
if (holder.ivIsDownloaded != null && holder.ivHasUpdates != null) {
if (child.isDownloaded()) {
if (NovelsDao.getInstance().isContentUpdated(child)) {
container.addView(holder.ivHasUpdates);
}
container.addView(holder.ivIsDownloaded);
}
//UIHelper.setColorFilter(holder.ivIsDownloaded);
//UIHelper.setColorFilter(holder.ivHasUpdates);
}
TextView tvLastUpdate = holder.tvLastUpdate;
if (tvLastUpdate != null) {
tvLastUpdate.setText(context.getResources().getString(R.string.last_update) + ": " + Util.formatDateForDisplay(context, child.getLastUpdate()));
}
TextView tvLastCheck = holder.tvLastCheck;
if (tvLastCheck != null) {
tvLastCheck.setText(context.getResources().getString(R.string.last_check) + ": " + Util.formatDateForDisplay(context, child.getLastCheck()));
}
return view;
}
@Override
public int getChildrenCount(int groupPosition) {
boolean showExternal = UIHelper.getShowExternal(context);
boolean showMissing = UIHelper.getShowMissing(context);
boolean showRedlink = UIHelper.getShowRedlink(context);
ArrayList<PageModel> chList = groups.get(groupPosition).getChapterCollection();
int count = 0;
for (PageModel pageModel : chList) {
if (pageModel.isExternal() && !showExternal) {
continue;
} else if (!pageModel.isExternal() && pageModel.isMissing() && !showMissing) {
continue;
} else if (pageModel.isRedlink() && !showRedlink) {
continue;
}
++count;
}
return count;
}
@Override
public PageModel getChild(int groupPosition, int childPosition) {
boolean showExternal = UIHelper.getShowExternal(context);
boolean showMissing = UIHelper.getShowMissing(context);
boolean showRedlink = UIHelper.getShowRedlink(context);
ArrayList<PageModel> chList = groups.get(groupPosition).getChapterCollection();
int count = 0;
for (int i = 0; i < chList.size(); ++i) {
PageModel temp = chList.get(i);
if (temp.isExternal() && !showExternal) {
continue;
} else if (!temp.isExternal() && temp.isMissing() && !showMissing) {
continue;
} else if (temp.isRedlink() && !showRedlink) {
continue;
}
if (count == childPosition) {
return temp;
}
++count;
}
return chList.get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public BookModel getGroup(int groupPosition) {
return groups.get(groupPosition);
}
@Override
public int getGroupCount() {
return groups.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isLastChild, View view, ViewGroup parent) {
BookModelGroupViewHolder holder;
// check if book is empty or not
BookModel group = getGroup(groupPosition);
ArrayList<PageModel> chapterList = group.getChapterCollection();
boolean isHideEmptyVolume = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Constants.PREF_HIDE_EMPTY_VOLUME, false);
if (isHideEmptyVolume && (chapterList == null || chapterList.size() == 0)) {
// return empty layout if no chapter.
FrameLayout f = new FrameLayout(context);
f.setTag(HIDDEN_VOLUME);
return f;
}
if (view == null || view.getTag().equals(HIDDEN_VOLUME)) {
LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inf.inflate(R.layout.item_expand_volume, null);
holder = new BookModelGroupViewHolder();
holder.txtNovel = (TextView) view.findViewById(R.id.novel_volume);
holder.container = (ViewGroup) view.findViewById(R.id.novel_volume_container);
holder.ivHasUpdates = new ImageView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
// Converts 8dp into px
int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, context.getResources().getDisplayMetrics());
holder.ivHasUpdates.setImageResource(R.drawable.ic_update_avaliable);
holder.ivHasUpdates.setScaleType(ImageView.ScaleType.CENTER);
holder.ivHasUpdates.setPadding(padding, padding, padding, padding);
holder.ivHasUpdates.setLayoutParams(params);
view.setTag(holder);
} else {
holder = (BookModelGroupViewHolder) view.getTag();
}
TextView tv = holder.txtNovel;
tv.setText(group.getTitle());
ViewGroup container = holder.container;
ImageView ivHasUpdates = holder.ivHasUpdates;
// check if any chapter has updates
for (PageModel pageModel : chapterList) {
ViewGroup currParent = (ViewGroup) ivHasUpdates.getParent();
if (currParent != null)
currParent.removeView(ivHasUpdates);
container.addView(ivHasUpdates);
//if (NovelsDao.getInstance().isContentUpdated(pageModel)) {
if (pageModel.isUpdated()) {
ivHasUpdates.setVisibility(View.VISIBLE);
//UIHelper.setColorFilter(ivHasUpdates);
break;
} else {
ivHasUpdates.setVisibility(View.GONE);
}
}
// check if all chapter is read
boolean readAll = true;
for (PageModel pageModel : chapterList) {
if (pageModel.getPage().endsWith("&action=edit&redlink=1"))
continue;
if (!pageModel.isFinishedRead()) {
readAll = false;
break;
}
}
if (readAll) {
tv.setTextColor(Constants.COLOR_READ);
} else {
tv.setTextColor(Constants.COLOR_UNREAD);
}
return view;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int arg0, int arg1) {
return true;
}
}