/* * Copyright 2012 GitHub Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.mobile.ui.commit; import static com.github.kevinsawicki.wishlist.ViewUpdater.FORMAT_INT; import android.content.res.Resources; import android.text.TextUtils; import android.view.LayoutInflater; import com.github.kevinsawicki.wishlist.MultiTypeAdapter; import com.github.kevinsawicki.wishlist.ViewUtils; import com.github.mobile.R.color; import com.github.mobile.R.id; import com.github.mobile.R.layout; import com.github.mobile.core.commit.FullCommitFile; import com.github.mobile.ui.StyledText; import com.github.mobile.util.AvatarLoader; import com.github.mobile.util.HttpImageGetter; import com.github.mobile.util.TimeUtils; import java.util.List; import org.eclipse.egit.github.core.CommitComment; import org.eclipse.egit.github.core.CommitFile; /** * Adapter to display a list of files changed in commits */ public class CommitFileListAdapter extends MultiTypeAdapter { private static final int TYPE_FILE_HEADER = 0; private static final int TYPE_FILE_LINE = 1; private static final int TYPE_LINE_COMMENT = 2; private static final int TYPE_COMMENT = 3; private final DiffStyler diffStyler; private final HttpImageGetter imageGetter; private final AvatarLoader avatars; private final int addTextColor; private final int removeTextColor; /** * @param inflater * @param diffStyler * @param avatars * @param imageGetter */ public CommitFileListAdapter(final LayoutInflater inflater, final DiffStyler diffStyler, final AvatarLoader avatars, final HttpImageGetter imageGetter) { super(inflater); this.diffStyler = diffStyler; this.avatars = avatars; this.imageGetter = imageGetter; Resources resources = inflater.getContext().getResources(); addTextColor = resources.getColor(color.diff_add_text); removeTextColor = resources.getColor(color.diff_remove_text); } @Override public int getViewTypeCount() { return 4; } @Override public long getItemId(int position) { switch (getItemViewType(position)) { case TYPE_FILE_HEADER: String sha = ((CommitFile) getItem(position)).getSha(); if (!TextUtils.isEmpty(sha)) return sha.hashCode(); else return super.getItemId(position); case TYPE_COMMENT: case TYPE_LINE_COMMENT: return ((CommitComment) getItem(position)).getId(); default: return super.getItemId(position); } } /** * Add file to adapter * * @param file */ public void addItem(final FullCommitFile file) { addItem(TYPE_FILE_HEADER, file.getFile()); List<CharSequence> lines = diffStyler.get(file.getFile().getFilename()); int number = 0; for (CharSequence line : lines) { addItem(TYPE_FILE_LINE, line); for (CommitComment comment : file.get(number)) addItem(TYPE_LINE_COMMENT, comment); number++; } } /** * Add file to adapter * * @param file */ public void addItem(final CommitFile file) { addItem(TYPE_FILE_HEADER, file); addItems(TYPE_FILE_LINE, diffStyler.get(file.getFilename())); } /** * Add comment to adapter * * @param comment */ public void addComment(final CommitComment comment) { addItem(TYPE_COMMENT, comment); } @Override protected int getChildLayoutId(final int type) { switch (type) { case TYPE_FILE_HEADER: return layout.commit_diff_file_header; case TYPE_FILE_LINE: return layout.commit_diff_line; case TYPE_LINE_COMMENT: return layout.diff_comment_item; case TYPE_COMMENT: return layout.commit_comment_item; default: return -1; } } @Override protected int[] getChildViewIds(final int type) { switch (type) { case TYPE_FILE_HEADER: return new int[] { id.tv_name, id.tv_folder, id.tv_stats }; case TYPE_FILE_LINE: return new int[] { id.tv_diff }; case TYPE_LINE_COMMENT: case TYPE_COMMENT: return new int[] { id.tv_comment_body, id.iv_avatar, id.tv_comment_author, id.tv_comment_date }; default: return null; } } @Override protected void update(final int position, final Object item, final int type) { switch (type) { case TYPE_FILE_HEADER: CommitFile file = (CommitFile) item; String path = file.getFilename(); int lastSlash = path.lastIndexOf('/'); if (lastSlash != -1) { setText(0, path.substring(lastSlash + 1)); ViewUtils.setGone(setText(1, path.substring(0, lastSlash + 1)), false); } else { setText(0, path); setGone(1, true); } StyledText stats = new StyledText(); stats.foreground('+', addTextColor); stats.foreground(FORMAT_INT.format(file.getAdditions()), addTextColor); stats.append(' ').append(' ').append(' '); stats.foreground('-', removeTextColor); stats.foreground(FORMAT_INT.format(file.getDeletions()), removeTextColor); setText(2, stats); return; case TYPE_FILE_LINE: CharSequence text = (CharSequence) item; diffStyler.updateColors((CharSequence) item, setText(0, text)); return; case TYPE_LINE_COMMENT: case TYPE_COMMENT: CommitComment comment = (CommitComment) item; avatars.bind(imageView(1), comment.getUser()); setText(2, comment.getUser().getLogin()); setText(3, TimeUtils.getRelativeTime(comment.getUpdatedAt())); imageGetter.bind(textView(0), comment.getBodyHtml(), comment.getId()); return; } } }