package com.erakk.lnreader.adapter; import android.app.Activity; import android.app.AlarmManager; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Typeface; import android.preference.PreferenceManager; 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.TextView; import com.erakk.lnreader.Constants; import com.erakk.lnreader.R; import com.erakk.lnreader.helper.Util; import com.erakk.lnreader.model.UpdateInfoModel; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; public class UpdateInfoModelAdapter extends ArrayAdapter<UpdateInfoModel> { private static final String TAG = UpdateInfoModelAdapter.class.toString(); // private static final String TAG = PageModelAdapter.class.toString(); private final Context context; private int layoutResourceId; private final Date now; long repeatTime = 0; public List<UpdateInfoModel> data; private UpdateInfoModel[] originalData = new UpdateInfoModel[0]; boolean showUpdate = true; boolean showNew = true; boolean showDeleted = true; boolean showExternal = true; public UpdateInfoModelAdapter(Context context, int resourceId, List<UpdateInfoModel> objects) { super(context, resourceId, objects); this.layoutResourceId = resourceId; this.context = context; this.data = objects; this.originalData = data.toArray(originalData); now = new Date(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); String updatesIntervalStr = preferences.getString(Constants.PREF_UPDATE_INTERVAL, "0"); int updatesInterval = Integer.parseInt(updatesIntervalStr); switch (updatesInterval) { case 1: repeatTime = AlarmManager.INTERVAL_FIFTEEN_MINUTES; break; case 2: repeatTime = AlarmManager.INTERVAL_HALF_HOUR; break; case 3: repeatTime = AlarmManager.INTERVAL_HOUR; break; case 4: repeatTime = AlarmManager.INTERVAL_HALF_DAY; break; case 5: repeatTime = AlarmManager.INTERVAL_DAY; break; default: break; } } public void filterUpdated(boolean value) { this.showUpdate = value; Log.d(TAG, "Filter Updated: " + showUpdate); filterData(); } public void filterNew(boolean value) { this.showNew = value; filterData(); } public void filterDeleted(boolean value) { this.showDeleted = value; filterData(); } public void filterExternal(boolean value) { this.showExternal = value; filterData(); } private void filterData() { this.clear(); data.clear(); for (UpdateInfoModel item : originalData) { switch (item.getUpdateType()) { case New: if (showNew && (!item.isExternal() || showExternal)) add(item); break; case NewNovel: if (showNew) add(item); break; case Updated: if (showUpdate && (!item.isExternal() || showExternal)) add(item); break; case UpdateTos: if (showUpdate) add(item); break; case Deleted: if (showDeleted && (!item.isExternal() || showExternal)) add(item); break; default: add(item); break; } } super.notifyDataSetChanged(); } public void setLayout(int resourceId) { this.layoutResourceId = resourceId; } @Override public void addAll(UpdateInfoModel... objects) { synchronized (this) { if (data == null) { data = new ArrayList<UpdateInfoModel>(); } for (UpdateInfoModel item : objects) { data.add(item); } this.notifyDataSetChanged(); } } @Override public void addAll(Collection<? extends UpdateInfoModel> objects) { synchronized (this) { if (data == null) { data = new ArrayList<UpdateInfoModel>(); } data.addAll(objects); this.notifyDataSetChanged(); } } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); convertView = inflater.inflate(layoutResourceId, parent, false); } final UpdateInfoModel page = data.get(position); boolean freshData = false; if (now.getTime() - page.getUpdateDate().getTime() <= repeatTime) { freshData = true; } UpdateInfoModelHolder holder = new UpdateInfoModelHolder(); holder.txtUpdateType = (TextView) convertView.findViewById(R.id.update_type); if (holder.txtUpdateType != null) { switch (page.getUpdateType()) { case New: holder.txtUpdateType.setText("New Chapter"); break; case NewNovel: holder.txtUpdateType.setText("New Novel"); break; case Updated: holder.txtUpdateType.setText("Updated Chapter"); break; case UpdateTos: holder.txtUpdateType.setText("TOS Updated"); break; case Deleted: holder.txtUpdateType.setText("Deleted Chapter"); break; default: holder.txtUpdateType.setText("Unknown!"); break; } if (freshData) holder.txtUpdateType.setTypeface(null, Typeface.BOLD); } holder.txtUpdateTitle = (TextView) convertView.findViewById(R.id.update_chapter); if (holder.txtUpdateTitle != null) { holder.txtUpdateTitle.setText(page.getUpdateTitle()); if (freshData) holder.txtUpdateTitle.setTypeface(null, Typeface.BOLD); if (page.getUpdatePage().contains("&redlink=1")) holder.txtUpdateTitle.setTextColor(Constants.COLOR_REDLINK); else { holder.txtUpdateTitle.setTextColor(Constants.COLOR_UNREAD); } // check external based on title // TODO: need to moved the value to db if (page.getUpdateTitle().endsWith(" - EXTERNAL LINK")) { page.setExternal(true); } else { page.setExternal(false); } } holder.txtUpdateDate = (TextView) convertView.findViewById(R.id.update_date); if (holder.txtUpdateDate != null) { holder.txtUpdateDate.setText(context.getResources().getString(R.string.updated) + " " + Util.formatDateForDisplay(context, page.getUpdateDate())); } holder.chkSelected = (CheckBox) convertView.findViewById(R.id.chk_selection); if (holder.chkSelected != null) { // holder.txtUpdateDate.setText("Update:" + Util.formatDateForDisplay(page.getUpdateDate())); holder.chkSelected.setChecked(page.isSelected()); holder.chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { page.setSelected(isChecked); } }); } // row.setTag(holder); return convertView; } static class UpdateInfoModelHolder { TextView txtUpdateType; TextView txtUpdateTitle; TextView txtUpdateDate; CheckBox chkSelected; } public void setResourceId(int id) { this.layoutResourceId = id; } }