package com.malmstein.yahnac.stories;
import android.database.Cursor;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import com.malmstein.yahnac.R;
import com.malmstein.yahnac.data.DataPersister;
import com.malmstein.yahnac.data.updater.LoginSharedPreferences;
import com.malmstein.yahnac.injection.Inject;
import com.malmstein.yahnac.model.Story;
import com.malmstein.yahnac.model.TimeAgo;
import com.malmstein.yahnac.views.recyclerview.adapter.CursorRecyclerAdapter;
import com.novoda.notils.caster.Views;
public class StoriesAdapter extends CursorRecyclerAdapter<StoriesAdapter.ViewHolder> {
private final StoryListener listener;
private final TimeAgo timeAgo;
private LoginSharedPreferences loginSharedPreferences;
public StoriesAdapter(Cursor cursor, StoryListener listener, TimeAgo timeAgo) {
super(cursor);
this.listener = listener;
this.timeAgo = timeAgo;
this.loginSharedPreferences = LoginSharedPreferences.newInstance();
}
@Override
public void onBindViewHolderCursor(final ViewHolder holder, Cursor cursor) {
final Story story = Story.from(cursor);
bindTitle(holder, story);
bindVote(holder, story);
bindCardClickListener(holder, story);
bindShare(holder, story);
bindBookmark(holder, story);
bindStoryOrJob(holder, story);
bindStorySource(holder, story);
}
private void bindCardClickListener(ViewHolder holder, final Story story) {
holder.card.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (story.isHackerNewsLocalItem()) {
listener.onCommentsClicked(story);
} else {
listener.onContentClicked(story);
}
}
});
}
private void bindShare(ViewHolder holder, final Story story) {
holder.share_action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onShareClicked(story.createShareIntent());
}
});
}
private void bindBookmark(ViewHolder holder, final Story story) {
holder.bookmark_action.setSelected(story.isBookmark());
holder.bookmark_action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataPersister persister = Inject.dataPersister();
if (story.isBookmark()) {
persister.removeBookmark(story);
listener.onBookmarkRemoved(story);
} else {
persister.addBookmark(story);
listener.onBookmarkAdded(story);
}
}
});
}
private void bindStorySource(ViewHolder holder, final Story story) {
if (story.isHackerNewsLocalItem()) {
holder.external_action.setVisibility(View.GONE);
} else {
holder.external_action.setVisibility(View.VISIBLE);
holder.external_action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onExternalLinkClicked(story);
}
});
}
}
private void bindStoryOrJob(final ViewHolder holder, final Story story) {
if (story.isStoryAJob()) {
holder.user.setVisibility(View.GONE);
holder.timeAgo.setVisibility(View.GONE);
holder.score.setVisibility(View.GONE);
holder.comments_text.setVisibility(View.GONE);
} else {
holder.user.setText(holder.user.getResources().getString(R.string.story_by, story.getSubmitter()));
holder.timeAgo.setText(timeAgo.timeAgo(story.getTimeAgo()));
holder.score.setText(holder.score.getResources().getString(R.string.story_points, story.getScore()));
holder.comments_text.setText(holder.user.getResources().getQuantityString(R.plurals.story_comments, story.getComments(), story.getComments()));
holder.comments_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onCommentsClicked(holder.title, story);
}
});
}
}
private void bindTitle(ViewHolder holder, Story story) {
holder.title.setTextColor(story.isRead() ?
holder.title.getResources().getColor(R.color.grey) :
holder.title.getResources().getColor(R.color.black));
holder.title.setText(story.getTitle());
}
private void bindVote(ViewHolder holder, final Story story) {
if (loginSharedPreferences.isLoggedIn()) {
if (story.isVoted()) {
holder.vote_action.setImageResource(R.drawable.ic_voted);
holder.vote_action.setEnabled(false);
} else {
holder.vote_action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onStoryVoteClicked(story);
}
});
}
if (story.isJob()) {
holder.vote_action.setVisibility(View.GONE);
}
} else {
holder.vote_action.setVisibility(View.GONE);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_story_item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public final TextView title;
public final TextView user;
public final TextView timeAgo;
public final TextView score;
public final View card;
public final View external_action;
public final View share_action;
public final View bookmark_action;
public final ImageButton vote_action;
public final TextView comments_text;
public ViewHolder(View view) {
super(view);
title = Views.findById(view, R.id.article_title);
user = Views.findById(view, R.id.article_user);
timeAgo = Views.findById(view, R.id.article_time);
score = Views.findById(view, R.id.article_score);
card = Views.findById(view, R.id.article_card_root);
external_action = Views.findById(view, R.id.article_external_action);
share_action = Views.findById(view, R.id.article_share_action);
bookmark_action = Views.findById(view, R.id.article_bookmark_action);
comments_text = Views.findById(view, R.id.article_comments_label);
vote_action = Views.findById(view, R.id.article_vote_action);
}
}
}