package net.coding.program.project.detail.merge; import android.content.DialogInterface; import android.content.Intent; import android.view.View; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.loopj.android.http.RequestParams; import net.coding.program.R; import net.coding.program.common.BlankViewDisplay; import net.coding.program.common.ClickSmallImage; import net.coding.program.common.Global; import net.coding.program.common.MyImageGetter; import net.coding.program.common.comment.BaseCommentParam; import net.coding.program.common.network.NetworkImpl; import net.coding.program.common.ui.BackActivity; import net.coding.program.model.BaseComment; import net.coding.program.model.Commit; import net.coding.program.model.DiffFile; import net.coding.program.model.RequestData; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.ItemClick; import org.androidannotations.annotations.ViewById; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.Serializable; import java.util.ArrayList; @EActivity(R.layout.activity_commit_file_list) //@OptionsMenu(R.menu.menu_commit_file_list) public class CommitFileListActivity extends BackActivity { public static final int RESULT_COMMENT = 1; private static final String HOST_COMMIT_FILES = "HOST_COMMIT_FILES"; private static final String HOST_MERGE_COMMENTS = "HOST_MERGE_COMMENTS"; private static final String HOST_DELETE_COMMENT = "HOST_DELETE_COMMENT"; private static final String HOST_COMMIT_DETAIL = "HOST_COMMIT_DETAIL"; @Extra Commit mCommit; @Extra String mProjectPath = ""; @Extra String mCommitUrl; @ViewById ListView listView; @ViewById View blankLayout; CommitFileAdapter mAdapter; private View mListHead; private View.OnClickListener mOnClickItem = new View.OnClickListener() { @Override public void onClick(View v) { final BaseComment item = (BaseComment) v.getTag(); if (item.isMy()) { showDialog("merge", "删除评论?", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String url = Commit.getHttpDeleteComment(mProjectPath, item.id); deleteNetwork(url, HOST_DELETE_COMMENT, item); } }); } else { startSendCommentActivity(); } } }; @ItemClick public final void listView(Object data) { if (data instanceof DiffFile.DiffSingleFile) { DiffFile.DiffSingleFile fileData = (DiffFile.DiffSingleFile) data; MergeFileDetailActivity_ .intent(CommitFileListActivity.this) .mProjectPath(mProjectPath) .mSingleFile(fileData) .start(); } } @AfterViews protected final void initCommitFileListActivity() { if (mCommit != null) { initByCommit(); } else { String s = mCommitUrl.split("#")[0]; s = s.replace("/u/", "/api/user/") .replace("/p/", "/project/"); int start = s.indexOf("/user/"); int end = s.indexOf("/git/"); mProjectPath = s.substring(start, end); getNetwork(s, HOST_COMMIT_DETAIL); showDialogLoading(); } } private void initByCommit() { BaseCommentParam param = new BaseCommentParam(new ClickSmallImage(this), mOnClickItem, new MyImageGetter(this), getImageLoad(), mOnClickUser); mAdapter = new CommitFileAdapter(param); initListhead(); initListFooter(); listView.setAdapter(mAdapter); getNetwork(mCommit.getHttpFiles(mProjectPath), HOST_COMMIT_FILES); getNetwork(mCommit.getHttpComments(mProjectPath), HOST_MERGE_COMMENTS); } private void initListFooter() { View footer = mInflater.inflate(R.layout.activity_merge_detail_footer, null); listView.addFooterView(footer, null, false); footer.findViewById(R.id.itemAddComment).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startSendCommentActivity(); } }); } private void startSendCommentActivity() { CommentActivity.CommentParam param = createCommentParam(); CommentActivity_.intent(CommitFileListActivity.this).mParam(param).startForResult(RESULT_COMMENT); } private CommentActivity.CommentParam createCommentParam() { return new CommitCommentParam(mProjectPath, mCommit.getCommitId()); } private void initListhead() { mListHead = mInflater.inflate(R.layout.commit_file_list_head, listView, false); listView.addHeaderView(mListHead, null, false); bindData(mListHead, R.id.title, mCommit.getTitle()); bindData(mListHead, R.id.icon, mCommit.getIcon()); bindData(mListHead, R.id.name, mCommit.getName()); bindData(mListHead, R.id.time, Global.dayToNow(mCommit.getCommitTime(), "创建%s")); bindData(mListHead, R.id.mergeId, mCommit.getCommitIdPrefix()); String preString = ""; bindData(mListHead, R.id.preView, preString); } private void bindData(View view, int textViewId, String text) { View v = view.findViewById(textViewId); if (v instanceof TextView) { TextView textview = (TextView) v; textview.setText(text); } else if (v instanceof ImageView) { ImageView icon = (ImageView) v; imagefromNetwork(icon, text); } } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(HOST_COMMIT_FILES)) { if (code == 0) { DiffFile diffFile = new DiffFile(respanse.getJSONObject("data")); findViewById(R.id.preView); String s = String.format("%d 个文件,共 %d 新增和 %d 删除", diffFile.getFileCount(), diffFile.getInsertions(), diffFile.getDeletions()); bindData(mListHead, R.id.preView, s); mAdapter.setFilesCount(diffFile.getFiles().size()); mAdapter.insertDataUpdate((ArrayList) diffFile.getFiles()); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_MERGE_COMMENTS)) { if (code == 0) { JSONArray json = respanse.getJSONObject("data").getJSONArray("commitComments"); ArrayList<Object> arrayData = new ArrayList<>(); for (int i = 0; i < json.length(); ++i) { BaseComment comment = new BaseComment(json.getJSONObject(i)); arrayData.add(comment); } mAdapter.appendDataUpdate(arrayData); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_DELETE_COMMENT)) { if (code == 0) { mAdapter.removeDataUpdate(data); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_COMMIT_DETAIL)) { hideProgressDialog(); if (code == 0) { JSONObject jsonDetail = respanse.getJSONObject("data").getJSONObject("commitDetail"); mCommit = new Commit(jsonDetail); initByCommit(); } else { if (code == NetworkImpl.ERROR_PERMISSION_DENIED) { BlankViewDisplay.setBlank(0, this, true, blankLayout, null, "无权访问\n请联系项目管理员进行代码权限设置"); } else { BlankViewDisplay.setBlank(0, this, true, blankLayout, null); } } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_COMMENT) { if (resultCode == RESULT_OK) { try { String commentString = (String) data.getSerializableExtra("data"); JSONObject json = new JSONObject(commentString); BaseComment comment = new BaseComment(json); mAdapter.appendSingeDataUpdate(comment); } catch (Exception e) { showButtomToast("" + e.toString()); } } } } static class CommitCommentParam extends CommentActivity.CommentParam implements Serializable { private String mProjectPath = ""; private String mCommitId = ""; public CommitCommentParam(String mProjectPath, String mCommitId) { this.mProjectPath = mProjectPath; this.mCommitId = mCommitId; } @Override public RequestData getSendCommentParam(String input) { String url = Commit.getHttpSendComment(mProjectPath); RequestParams params = new RequestParams(); params.put("commitId", mCommitId); params.put("noteable_type", "Commit"); params.put("content", input); params.put("position", 0); params.put("line", 0); return new RequestData(url, params); } @Override public String getAtSome() { return ""; } @Override public String getAtSomeUrl() { // return Global.HOST_API + mProjectPath + "/relationships/context?context_type=pull_request_comment&item_id=" // + mCommitId; return Global.HOST_API + mProjectPath + "/members?page=1&pageSize=200"; } @Override public String getProjectPath() { return mProjectPath; } @Override public boolean isPublicProject() { return true; } } }