package com.chrome.codereview.issuelists; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Typeface; import android.support.v4.content.LocalBroadcastManager; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.chrome.codereview.R; import com.chrome.codereview.model.Issue; import com.chrome.codereview.model.Reviewer; import com.chrome.codereview.requests.ServerCaller; import com.chrome.codereview.utils.DateUtils; import com.chrome.codereview.utils.SwipeListAdapter; import com.chrome.codereview.utils.ViewUtils; import java.util.ArrayList; import java.util.List; /** * Created by sergeyv on 10/8/14. */ public class IssuesAdapter extends SwipeListAdapter { private List<Issue> issues = new ArrayList<Issue>(); private LayoutInflater inflater; private Context context; private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int issueId = intent.getIntExtra(ServerCaller.EXTRA_ISSUE_ID, -1); long time = intent.getLongExtra(ServerCaller.EXTRA_MODIFICATION_TIME, 0l); for (Issue issue: issues) { if (issue.id() == issueId) { issue.setLastModified(time); notifyDataSetChanged(); return; } } } }; public IssuesAdapter(Context context) { this.context = context; inflater = LayoutInflater.from(context); IntentFilter filter = new IntentFilter(); filter.addAction(ServerCaller.ACTION_UPDATE_ISSUE_MODIFICATION_TIME); LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter); } @Override public boolean isItemSwipable(int position) { return true; } @Override public void remove(int position) { issues.remove(position); notifyDataSetChanged(); } @Override public int getCount() { return issues.size(); } @Override public Issue getItem(int position) { return issues.get(position); } @Override public long getItemId(int position) { return getItem(position).id(); } @Override public View getView(int position, View convertView, ViewGroup parent) { Issue issue = getItem(position); if (convertView == null) { convertView = inflater.inflate(R.layout.issue_item, parent, false); } ViewUtils.setText(convertView, R.id.subject, issue.subject()); ViewUtils.setText(convertView, R.id.owner, issue.owner()); ViewUtils.setText(convertView, R.id.issue_id, issue.id() + " by "); TextView reviewers = (TextView) convertView.findViewById(R.id.reviewers); reviewers.setText(reviewersSpannable(issue.reviewers()), TextView.BufferType.SPANNABLE); ViewUtils.setText(convertView, R.id.modified, DateUtils.createAgoText(context, issue.lastModified())); return convertView; } @Override public boolean hasStableIds() { return true; } public Spannable reviewersSpannable(List<Reviewer> reviewers) { SpannableStringBuilder builder = new SpannableStringBuilder(); String reviewersPrefix = context.getString(R.string.reviewers); builder.append(reviewersPrefix + " "); builder.setSpan(new StyleSpan(Typeface.BOLD), 0, builder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); boolean firstReviewer = true; for (Reviewer reviewer : reviewers) { if (!firstReviewer) { builder.append(", "); } int start = builder.length(); int end = builder.length() + reviewer.name().length(); builder.append(reviewer.name()); if (reviewer.decoration() != null) { builder.setSpan(new ForegroundColorSpan(reviewer.decoration().color(context)), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } firstReviewer = false; } return builder; } public void setIssues(List<Issue> issues) { if (issues == null) { this.issues.clear(); } else { this.issues = issues; } notifyDataSetChanged(); } }