package com.alorma.github.ui.adapter.issues;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.alorma.github.sdk.bean.dto.response.Issue;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.sdk.bean.issue.IssueStoryDetail;
import com.alorma.github.sdk.bean.issue.Story;
import com.alorma.github.ui.adapter.issues.holders.CommentHolder;
import com.alorma.github.ui.adapter.issues.holders.Holder;
import com.alorma.github.ui.adapter.issues.holders.LabelsHolder;
import com.alorma.github.ui.adapter.issues.holders.ReviewCommentHolder;
import com.alorma.github.ui.adapter.issues.holders.TimelineHolder;
import com.alorma.github.ui.listeners.IssueCommentRequestListener;
import com.alorma.github.ui.listeners.IssueDetailRequestListener;
import com.alorma.github.ui.view.issue.IssueCommentView;
import com.alorma.github.ui.view.issue.IssueStoryLabelDetailView;
import com.alorma.github.ui.view.issue.IssueTimelineView;
import com.alorma.github.ui.view.issue.ReviewCommentView;
import core.repositories.Permissions;
public abstract class StoryDetailAdapter<K extends Issue> extends RecyclerView.Adapter<Holder<K>> {
private static final int VIEW_ISSUE = 0;
private static final int VIEW_COMMENT = 1;
private static final int VIEW_EVENT = 2;
private static final int VIEW_LABELED_LIST = 3;
private static final int VIEW_REVIEW_COMMENT = 4;
private static final int VIEW_REVIEW_COMMENTS = 5;
private final LayoutInflater mInflater;
private Context context;
private Story<K> story;
private RepoInfo repoInfo;
private IssueDetailRequestListener issueDetailRequestListener;
private IssueCommentRequestListener issueCommentRequestListener;
public StoryDetailAdapter(Context context, LayoutInflater inflater, Story<K> story, RepoInfo repoInfo,
IssueDetailRequestListener issueDetailRequestListener, IssueCommentRequestListener issueCommentRequestListener) {
this.context = context;
this.story = story;
this.repoInfo = repoInfo;
this.issueDetailRequestListener = issueDetailRequestListener;
this.mInflater = inflater;
this.issueCommentRequestListener = issueCommentRequestListener;
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewGroup.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
if (params.width == RecyclerView.LayoutParams.MATCH_PARENT) {
params.width = parent.getWidth();
}
if (params.height == RecyclerView.LayoutParams.MATCH_PARENT) {
params.height = parent.getHeight();
}
switch (viewType) {
case VIEW_ISSUE:
return createItemHolder(context, params, story, repoInfo.permissions, issueDetailRequestListener);
case VIEW_COMMENT:
IssueCommentView issueCommentView = new IssueCommentView(context);
issueCommentView.setIssueCommentRequestListener(issueCommentRequestListener);
issueCommentView.setLayoutParams(params);
return new CommentHolder(issueCommentView);
case VIEW_EVENT:
IssueTimelineView issueTimelineView = new IssueTimelineView(context);
issueTimelineView.setLayoutParams(params);
return new TimelineHolder(issueTimelineView);
case VIEW_REVIEW_COMMENT:
case VIEW_REVIEW_COMMENTS:
ReviewCommentView reviewCommentView = new ReviewCommentView(context, parent);
reviewCommentView.setLayoutParams(params);
return new ReviewCommentHolder(reviewCommentView);
case VIEW_LABELED_LIST:
IssueStoryLabelDetailView labelDetailView = new IssueStoryLabelDetailView(context);
labelDetailView.setLayoutParams(params);
return new LabelsHolder(labelDetailView);
default:
return new Holder<K>(mInflater.inflate(android.R.layout.simple_list_item_1, parent, false)) {
@Override
public void setIssue(RepoInfo repoInfo, Issue issue) {
}
@Override
public void setDetail(IssueStoryDetail detail) {
}
};
}
}
protected abstract Holder<K> createItemHolder(Context context, ViewGroup.LayoutParams params, Story<K> story, Permissions permissions,
IssueDetailRequestListener issueDetailRequestListener);
@Override
public void onBindViewHolder(Holder<K> holder, int position) {
try {
holder.setIssue(repoInfo, story.item);
} catch (Exception e) {
e.printStackTrace();
}
if (position > 0) {
IssueStoryDetail issueStoryDetail = story.details.get(position - 1);
holder.setDetail(issueStoryDetail);
}
}
@Override
public int getItemCount() {
return story != null ? story.details.size() + 1 : 0;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_ISSUE;
} else {
IssueStoryDetail issueStoryDetail = story.details.get(position - 1);
if (issueStoryDetail.getType().equals("commented")) {
return VIEW_COMMENT;
} else if (issueStoryDetail.getType().equals("review_comment")) {
return VIEW_REVIEW_COMMENT;
} else if (issueStoryDetail.getType().equals("review_comments")) {
return VIEW_REVIEW_COMMENTS;
} else if (issueStoryDetail.isList()) {
if (issueStoryDetail.getType().equals("labeled") || issueStoryDetail.getType().equals("unlabeled")) {
return VIEW_LABELED_LIST;
}
}
return VIEW_EVENT;
}
}
}