package cgeo.geocaching.log; import cgeo.geocaching.ImagesActivity; import cgeo.geocaching.R; import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.network.SmileyImage; import cgeo.geocaching.ui.AbstractCachingListViewPageViewCreator; import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod; import cgeo.geocaching.ui.DecryptTextClickListener; import cgeo.geocaching.ui.UserActionsClickListener; import cgeo.geocaching.utils.Formatter; import cgeo.geocaching.utils.TextUtils; import cgeo.geocaching.utils.UnknownTagsHandler; import org.apache.commons.lang3.StringEscapeUtils; import android.text.Html; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public abstract class LogsViewCreator extends AbstractCachingListViewPageViewCreator { protected final AbstractActionBarActivity activity; public LogsViewCreator(final AbstractActionBarActivity activity) { this.activity = activity; } @Override public ListView getDispatchedView(final ViewGroup parentView) { if (!isValid()) { return null; } final List<LogEntry> logs = getLogs(); view = (ListView) activity.getLayoutInflater().inflate(R.layout.logs_page, parentView, false); addHeaderView(); view.setAdapter(new ArrayAdapter<LogEntry>(activity, R.layout.logs_item, logs) { @Override public View getView(final int position, final View convertView, final ViewGroup parent) { View rowView = convertView; if (rowView == null) { rowView = activity.getLayoutInflater().inflate(R.layout.logs_item, parent, false); } LogViewHolder holder = (LogViewHolder) rowView.getTag(); if (holder == null) { holder = new LogViewHolder(rowView); } holder.setPosition(position); final LogEntry log = getItem(position); fillViewHolder(convertView, holder, log); final View logView = rowView.findViewById(R.id.log); activity.addContextMenu(logView); return rowView; } }); return view; } protected void fillViewHolder(@SuppressWarnings("unused") final View convertView, final LogViewHolder holder, final LogEntry log) { if (log.date > 0) { holder.date.setText(Formatter.formatShortDateVerbally(log.date)); holder.date.setVisibility(View.VISIBLE); } else { holder.date.setVisibility(View.GONE); } holder.type.setText(log.getType().getL10n()); holder.author.setText(StringEscapeUtils.unescapeHtml4(log.author)); fillCountOrLocation(holder, log); // log text, avoid parsing HTML if not necessary if (TextUtils.containsHtml(log.log)) { final UnknownTagsHandler unknownTagsHandler = new UnknownTagsHandler(); holder.text.setText(TextUtils.trimSpanned(Html.fromHtml(log.getDisplayText(), new SmileyImage(getGeocode(), holder.text), unknownTagsHandler)), TextView.BufferType.SPANNABLE); } else { holder.text.setText(log.log, TextView.BufferType.SPANNABLE); } // images if (log.hasLogImages()) { holder.images.setText(log.getImageTitles()); holder.images.setVisibility(View.VISIBLE); holder.images.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { ImagesActivity.startActivity(activity, getGeocode(), new ArrayList<>(log.getLogImages())); } }); } else { holder.images.setVisibility(View.GONE); } // colored marker final int marker = log.getType().markerId; if (marker != 0) { holder.marker.setVisibility(View.VISIBLE); holder.marker.setImageResource(marker); } else { holder.marker.setVisibility(View.GONE); } holder.author.setOnClickListener(createUserActionsListener()); holder.text.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance()); holder.text.setOnClickListener(new DecryptTextClickListener(holder.text)); activity.registerForContextMenu(holder.text); } protected abstract UserActionsClickListener createUserActionsListener(); protected abstract String getGeocode(); protected abstract List<LogEntry> getLogs(); protected abstract void addHeaderView(); protected abstract void fillCountOrLocation(LogViewHolder holder, final LogEntry log); protected abstract boolean isValid(); }