package com.airlocksoftware.hackernews.adapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import android.content.Context;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.airlocksoftware.hackernews.R;
import com.airlocksoftware.hackernews.activity.MainActivity;
import com.airlocksoftware.hackernews.activity.MainActivity.CommentsTab;
import com.airlocksoftware.hackernews.model.SearchItem;
import com.airlocksoftware.holo.type.FontText;
import com.airlocksoftware.holo.utils.ViewUtils;
import org.apache.commons.lang3.StringUtils;
/** Adapter for SearchFragment. Displays **/
public class SearchAdapter extends BaseAdapter {
Context mContext;
List<SearchItem> mSearchItems = new ArrayList<SearchItem>();
private boolean moreLink;
private static final String TAG = SearchAdapter.class.getSimpleName();
private static final int ITEM_TYPE_INVALID = -1;
private static final int ITEM_TYPE_STORY = 0;
private static final int ITEM_TYPE_COMMENT = 1;
private static final int ITEM_TYPE_MORE = 2;
public SearchAdapter(Context context) {
mContext = context;
}
@Override
public int getCount() {
return mSearchItems.size() + ((moreLink) ? 1 : 0);
}
@Override
public boolean isEnabled(int position) {
return false;
}
@Override
public SearchItem getItem(int position) {
return mSearchItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup container) {
LayoutInflater inflater = LayoutInflater.from(mContext);
SearchItem item = getItem(position);
int viewType = getItemViewTypeBySearchItem(item);
switch (viewType) {
case ITEM_TYPE_STORY:
StoryHolder sHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.vw_story, container, false);
ViewUtils.fixBackgroundRepeat(convertView);
sHolder = getNewStoryHolder(convertView);
if (convertView != null) {
convertView.setTag(sHolder);
}
} else {
sHolder = (StoryHolder) convertView.getTag();
}
bindStoryView(item, sHolder);
break;
case ITEM_TYPE_COMMENT:
CommentHolder cHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.vw_comment_search, container, false);
ViewUtils.fixBackgroundRepeat(convertView);
cHolder = getNewCommentsHolder(convertView);
if (convertView != null) {
convertView.setTag(cHolder);
}
} else {
cHolder = (CommentHolder) convertView.getTag();
}
bindCommentsView(item, cHolder);
break;
case ITEM_TYPE_MORE:
if (convertView == null) {
convertView = inflater.inflate(R.layout.vw_more_link, container, false);
}
break;
case ITEM_TYPE_INVALID:
convertView = inflater.inflate(R.layout.vw_invalid_story, container, false);
break;
}
return convertView;
}
private void bindCommentsView(SearchItem item, CommentHolder cHolder) {
// if thread is [dead], there will be no item.discussion.title
if (item.story_id != null && item.story_url != null) {
cHolder.title.setVisibility(View.VISIBLE);
cHolder.title.setText("on: " + item.story_title);
} else {
cHolder.title.setVisibility(View.GONE);
}
cHolder.username.setText(item.author);
cHolder.comment.setText(Html.fromHtml(item.comment_text));
cHolder.item = item;
}
private void bindStoryView(SearchItem item, StoryHolder sHolder) {
sHolder.title.setText(item.title);
sHolder.numPoints.setText(Long.toString(item.points));
sHolder.numComments.setText(Long.toString(item.num_comments));
sHolder.domain.setText(item.domain());
sHolder.item = item;
}
private CommentHolder getNewCommentsHolder(View convertView) {
CommentHolder cHolder;
cHolder = new CommentHolder();
cHolder.username = (FontText) convertView.findViewById(R.id.txt_username);
cHolder.comment = (FontText) convertView.findViewById(R.id.txt_comment);
cHolder.title = (FontText) convertView.findViewById(R.id.txt_title);
cHolder.title.setTag(cHolder);
cHolder.title.setOnClickListener(mCommentListener);
return cHolder;
}
private StoryHolder getNewStoryHolder(View convertView) {
StoryHolder sHolder;
sHolder = new StoryHolder();
sHolder.title = (FontText) convertView.findViewById(R.id.txt_title);
sHolder.numPoints = (FontText) convertView.findViewById(R.id.txt_num_pts);
sHolder.numComments = (FontText) convertView.findViewById(R.id.txt_num_comments);
sHolder.domain = (FontText) convertView.findViewById(R.id.txt_domain);
sHolder.commentsButton = convertView.findViewById(R.id.btn_comments);
sHolder.webButton = convertView.findViewById(R.id.btn_web);
sHolder.commentsButton.setTag(sHolder);
sHolder.webButton.setTag(sHolder);
sHolder.commentsButton.setOnClickListener(mStoryListener);
sHolder.webButton.setOnClickListener(mStoryListener);
return sHolder;
}
@Override
public int getItemViewType(int position) {
if (position == mSearchItems.size()) return ITEM_TYPE_MORE;
else return getItemViewTypeBySearchItem(getItem(position));
}
private int getItemViewTypeBySearchItem(SearchItem item) {
if (item.isComment()) {
return ITEM_TYPE_COMMENT;
} else if (item.isTextPost() || item.isArticlePost()) {
return ITEM_TYPE_STORY;
} else {
Log.d(TAG, "Received a search result that isn't a comment or a submission.");
return ITEM_TYPE_INVALID;
}
}
@Override
public int getViewTypeCount() {
return 3;
}
public void add(SearchItem item) {
mSearchItems.add(item);
notifyDataSetChanged();
}
public void addAll(Collection<SearchItem> items) {
mSearchItems.addAll(items);
notifyDataSetChanged();
}
public void clear() {
mSearchItems.clear();
notifyDataSetChanged();
}
private class StoryHolder {
public SearchItem item;
public FontText title, numPoints, numComments, domain;
public View commentsButton, webButton;
}
private class CommentHolder {
public SearchItem item;
public FontText username, comment, title;
}
public View.OnClickListener mStoryListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
StoryHolder holder = (StoryHolder) v.getTag();
CommentsTab tab = v.getId() == R.id.btn_comments ? CommentsTab.COMMENTS : CommentsTab.ARTICLE;
MainActivity.startCommentsActivity(
mContext,
null,
Long.valueOf(holder.item.objectID),
holder.item.url,
tab
);
}
};
public View.OnClickListener mCommentListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
CommentHolder holder = (CommentHolder) v.getTag();
MainActivity.startCommentsActivity(
mContext,
null,
Long.valueOf(holder.item.story_id),
holder.item.story_url,
CommentsTab.COMMENTS
);
}
};
}