package net.coding.program.project.detail.merge;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.loopj.android.http.RequestParams;
import net.coding.program.common.BlankViewDisplay;
import net.coding.program.common.network.NetworkImpl;
import net.coding.program.common.util.DensityUtil;
import net.coding.program.MyApp;
import net.coding.program.R;
import net.coding.program.common.ClickSmallImage;
import net.coding.program.common.Global;
import net.coding.program.common.LongClickLinkMovementMethod;
import net.coding.program.common.MyImageGetter;
import net.coding.program.common.RedPointTip;
import net.coding.program.common.base.MyJsonResponse;
import net.coding.program.common.comment.BaseCommentParam;
import net.coding.program.common.htmltext.URLSpanNoUnderline;
import net.coding.program.common.network.MyAsyncHttpClient;
import net.coding.program.common.ui.BackActivity;
import net.coding.program.common.umeng.UmengEvent;
import net.coding.program.common.widget.DataAdapter;
import net.coding.program.common.widget.ListItem1;
import net.coding.program.model.BaseComment;
import net.coding.program.model.DiffFile;
import net.coding.program.model.DynamicObject;
import net.coding.program.model.Merge;
import net.coding.program.model.MergeDetail;
import net.coding.program.model.ProjectObject;
import net.coding.program.model.RefResourceObject;
import net.coding.program.model.RequestData;
import net.coding.program.project.detail.MembersSelectActivity_;
import net.coding.program.project.git.CommitListActivity_;
import net.coding.program.task.add.CommentHolder;
import net.coding.program.task.add.RefResourceActivity;
import net.coding.program.task.add.RefResourceActivity_;
import net.coding.program.user.UserDetailActivity_;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.OnActivityResult;
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;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import de.hdodenhof.circleimageview.CircleImageView;
@EActivity(R.layout.activity_merge_detail)
//@OptionsMenu(R.menu.menu_merge_detail)
public class MergeDetailActivity extends BackActivity {
public static final int RESULT_COMMENT = 1;
public static final int RESULT_MERGE = 2;
public static final int RESULT_RESUSE_REFRESOURCE = 3;
// private static final String HOST_MERGE_COMMENTS = "HOST_MERGE_COMMENTS";
private static final String HOST_MERGE_REFUSE = "HOST_MERGE_REFUSE";
private static final String HOST_MERGE_CANNEL = "HOST_MERGE_CANNEL";
private static final String HOST_MERGE_DETAIL = "HOST_MERGE_DETAIL";
private static final String HOST_DELETE_COMMENT = "HOST_DELETE_COMMENT";
private static final String TAG_REVIEW_GOOD = "TAG_REVIEW_GOOD";
@Extra
ProjectObject mProject;
@Extra
Merge mMerge;
@Extra
String mMergeUrl;
@ViewById
View actionLayout;
@ViewById
View actionAccept;
@ViewById
View actionRefuse;
@ViewById
View actionCancel;
@ViewById
View actionAuth;
@ViewById
View actionCancelAuth;
@ViewById
View blankLayout;
@ViewById
ListView listView;
DataAdapter mAdapter;
MyImageGetter myImageGetter = new MyImageGetter(this);
private ArrayList<RefResourceObject> refResourceList = new ArrayList<>();
private ArrayList<Merge.Reviewer> reviewerList = new ArrayList<>();
private ArrayList<DynamicObject.DynamicMergeRequest> dynamicList = new ArrayList<>();
Comparator<DynamicObject.DynamicBaseObject> mDynamicSorter = new Comparator<DynamicObject.DynamicBaseObject>() {
@Override
public int compare(DynamicObject.DynamicBaseObject lhs, DynamicObject.DynamicBaseObject rhs) {
return (int) (lhs.created_at - rhs.created_at);
}
};
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 = mMerge.getHttpDeleteComment(item.id);
deleteNetwork(url, HOST_DELETE_COMMENT, item);
}
});
} else {
String name = item.owner.name;
CommentActivity.CommentParam param = createParam(name);
CommentActivity_.intent(MergeDetailActivity.this).mParam(param).startForResult(RESULT_COMMENT);
}
}
};
private MergeDetail mMergeDetail;
private TextView mergeContent;
private View mergeContentDivide;
private View.OnClickListener mOnClickComment = new View.OnClickListener() {
@Override
public void onClick(View v) {
final DynamicObject.DynamicMergeRequest comment = (DynamicObject.DynamicMergeRequest) v.getTag();
if (comment != null && comment.user.global_key.equals(MyApp.sUserObject.global_key)) {
showDialog("Merge Request", "删除评论?", (dialog, which) -> {
String url = mMerge.getHttpDeleteComment(comment.id);
deleteNetwork(url, HOST_DELETE_COMMENT, comment);
});
} else {
}
}
};
private final ClickSmallImage onClickImage = new ClickSmallImage(this);
DataAdapter<DynamicObject.DynamicMergeRequest> commentAdpter = new DataAdapter<DynamicObject.DynamicMergeRequest>() {
@Override
public int getItemViewType(int position) {
DynamicObject.DynamicMergeRequest data =
(DynamicObject.DynamicMergeRequest) getItem(position);
if (data.action.equals("comment")) {
return 1;
} else if (data.action.equals("comment_commit")) {
return 2;
} else {
return 0;
}
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int count = getCount();
int type = getItemViewType(position);
DynamicObject.DynamicMergeRequest data =
(DynamicObject.DynamicMergeRequest) getItem(position);
DynamicHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(type == 1 ?
R.layout.activity_task_comment_much_image_task :
R.layout.task_list_item_dynamic, parent, false);
holder = new DynamicHolder(convertView);
convertView.setTag(R.id.Commentlayout, holder);
CommentHolder commentHolder = new CommentHolder(convertView, mOnClickComment, myImageGetter, getImageLoad(), mOnClickUser, onClickImage);
convertView.setTag(R.id.flowLayout, commentHolder);
} else {
holder = (DynamicHolder) convertView.getTag(R.id.Commentlayout);
}
holder.updateLine(position, count);
if (type == 1) {
CommentHolder commentHolder = (CommentHolder) convertView.getTag(R.id.flowLayout);
commentHolder.setContent(data);
return convertView;
} else {
holder.mContent.setText(data.title());
int iconResId = data.action_icon;
holder.mIcon.setImageResource(iconResId);
holder.updateLine(position, count);
if (type == 2) {
holder.mContent2.setText(data.content(myImageGetter));
holder.mContent2.setVisibility(View.VISIBLE);
holder.mContent2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DiffFile.DiffSingleFile fileData =
((DynamicObject.DynamicMergeRequestCommentCommit) data).getDiffSingleFile();
MergeFileDetailActivity_
.intent(MergeDetailActivity.this)
.mProjectPath(mMerge.getProjectPath())
.mergeIid(mMerge.getIid())
.mSingleFile(fileData)
.start();
}
});
} else {
holder.mContent2.setVisibility(View.GONE);
}
return convertView;
}
}
};
class DynamicHolder {
public ImageView mIcon;
public TextView mContent;
public TextView mContent2;
private View timeLineUp;
private View timeLineDown;
public DynamicHolder(View convertView) {
mIcon = (ImageView) convertView.findViewById(R.id.icon);
mContent = (TextView) convertView.findViewById(R.id.content);
mContent2 = (TextView) convertView.findViewById(R.id.linkContent);
mContent.setMovementMethod(LongClickLinkMovementMethod.getInstance());
timeLineUp = convertView.findViewById(R.id.timeLineUp);
timeLineDown = convertView.findViewById(R.id.timeLineDown);
}
public void updateLine(int position, int count) {
switch (count) {
case 1:
setLine(false, false);
break;
default:
if (position == 0) {
setLine(false, true);
} else if (position == count - 1) {
setLine(true, false);
} else {
setLine(true, true);
}
break;
}
}
private void setLine(boolean up, boolean down) {
timeLineUp.setVisibility(up ? View.VISIBLE : View.INVISIBLE);
timeLineDown.setVisibility(down ? View.VISIBLE : View.INVISIBLE);
}
}
@AfterViews
protected final void initMergeDetailActivity() {
String httpReviewers;
if (mMerge != null) {
initByMereData();
getNetwork(mMerge.getHttpDetail(), HOST_MERGE_DETAIL);
httpReviewers = mMerge.getHttpReviewers();
} else {
showDialogLoading();
String baseGit = URLSpanNoUnderline.generateAbsolute(mMergeUrl);
getNetwork(baseGit + "/base", HOST_MERGE_DETAIL);
// httpReviewers = baseGit + "/reviewers";
}
}
private void initByMereData() {
getSupportActionBar().setTitle(mMerge.getTitleIId());
View mListHead = mInflater.inflate(R.layout.activity_merge_detail_head, null);
initHead(mListHead);
listView.addHeaderView(mListHead, null, false);
View footer = mInflater.inflate(R.layout.activity_merge_detail_footer, null);
footer.findViewById(R.id.gap_to_list).setVisibility(View.GONE);
listView.addFooterView(footer, null, false);
initFooter(footer);
BaseCommentParam param = new BaseCommentParam(new ClickSmallImage(this), mOnClickItem, myImageGetter, getImageLoad(), mOnClickUser);
mAdapter = commentAdpter; //new MergeRequestDynamicAdapter(this, myImageGetter);
// mAdapter.setHasMore(false);
listView.setAdapter(mAdapter);
// listView.setAreHeadersSticky(false);
listView.setDividerHeight(0);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
DynamicObject.DynamicBaseObject activity =
(DynamicObject.DynamicBaseObject) mAdapter.getItem(position);
if (activity.user.global_key.equals(MyApp.sUserObject.global_key) && "comment".equals(activity.action)) {
showDialog(mMerge.getTitle(), "删除评论?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String url = mMerge.getHttpDeleteComment(activity.id);
deleteNetwork(url, HOST_DELETE_COMMENT, activity);
}
});
} else {
String name = activity.user.name;
CommentActivity.CommentParam param = createParam(name);
CommentActivity_.intent(MergeDetailActivity.this).mParam(param).startForResult(RESULT_COMMENT);
}
}
});
updateReviewer();
if (mMerge == null || mMerge.isPull()) {
findViewById(R.id.itemRefResourceLayout).setVisibility(View.GONE);
return;
} else {
findViewById(R.id.itemRefResourceLayout).setVisibility(View.VISIBLE);
}
setActionStyle(false, false, false, false, false);
refreshActivities();
}
private void updateBottomBarStyle() {
if (mMergeDetail == null) {
return;
}
boolean author_can_edit = mMergeDetail.isCanEditSrcBranch();
boolean canEdit = mMergeDetail.isCanEdit();
boolean canEditSrc = mMergeDetail.isCanEditSrcBranch();
boolean isMyMerge = mMerge.authorIsMe();
int granted = mMerge.getGranted();
boolean showCancel = mMerge.authorIsMe();
boolean showMerge = canEdit || ( granted == 1 && mMerge.authorIsMe());
boolean showRefuse = canEdit;
boolean showAuth = canEdit && granted == 0 && !mMerge.authorIsMe() && !mMergeDetail.authorCanEdit();
boolean showCancelAuth = canEdit && granted == 1 && !mMerge.authorIsMe() && !mMergeDetail.authorCanEdit();
if (mMerge.isStyleCanMerge()) {
setActionStyle(showMerge, showRefuse, showCancel, showAuth, showCancelAuth);
} else if (mMerge.isStyleCannotMerge()) {
setActionStyle(null, canEdit, canEditSrc, showAuth, showCancelAuth);
} else {
setActionStyle(false, false, false, false, false);
}
}
/**
* @param accept 这个参数可以为 null,代表不可合并,但是显示合并按钮,并 50% 透明
*/
private void setActionStyle(Boolean accept, boolean refuse, boolean cancel, boolean auth, boolean cancelAuth) {
if (!refuse && accept != null && !accept && !cancel && !auth && !cancelAuth) {
actionLayout.setVisibility(View.GONE);
} else {
if (accept != null) {
actionAccept.setVisibility(accept ? View.VISIBLE : View.GONE);
actionAccept.setAlpha(1f);
actionAccept.setTag(null);
} else {
actionAccept.setVisibility(View.VISIBLE);
actionAccept.setTag("Coding 不能帮你在线自动合并这个请求。");
actionAccept.setAlpha(.5f);
}
actionLayout.setVisibility(View.VISIBLE);
actionRefuse.setVisibility(refuse ? View.VISIBLE : View.GONE);
actionCancel.setVisibility(cancel ? View.VISIBLE : View.GONE);
actionAuth.setVisibility(auth ? View.VISIBLE : View.GONE);
actionCancelAuth.setVisibility(cancelAuth ? View.VISIBLE : View.GONE);
}
}
@Click
protected final void actionAccept(View view) {
if (view.getTag() == null) {
MergeAcceptActivity_.intent(this).mMergeDetail(mMergeDetail).startForResult(RESULT_MERGE);
} else {
showDialog("提示", "Coding 不能帮你在线自动合并这个请求。", null, null, "知道了", null);
}
}
@Click
protected final void actionRefuse() {
showDialog(mMerge.getTitle(), "确定要拒绝吗?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String host = mMerge.getHttpRefuse();
postNetwork(host, HOST_MERGE_REFUSE);
}
});
}
@Click
protected final void actionCancel() {
showDialog(mMerge.getTitle(), "确定要取消吗?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String host = mMerge.getHttpCancel();
postNetwork(host, HOST_MERGE_CANNEL);
}
});
}
@Click
protected final void actionAuth() {
showDialog(mMerge.getTitle(), "确定要授权吗?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String host = mMerge.getHttpGrant();
// postNetwork(host, HOST_MERGE_CANNEL);
MyAsyncHttpClient.post(MergeDetailActivity.this, host, new MyJsonResponse(MergeDetailActivity.this) {
@Override
public void onMySuccess(JSONObject response) {
setResult(RESULT_OK);
mMerge.setGranted(1);
actionAuth.setVisibility(View.GONE);
actionCancelAuth.setVisibility(View.VISIBLE);
}
});
}
});
}
@Click
protected final void actionCancelAuth() {
showDialog(mMerge.getTitle(), "确定要撤消授权吗?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String host = mMerge.getHttpGrant();
// postNetwork(host, HOST_MERGE_CANNEL);
MyAsyncHttpClient.delete(MergeDetailActivity.this, host, new MyJsonResponse(MergeDetailActivity.this) {
@Override
public void onMySuccess(JSONObject response) {
setResult(RESULT_OK);
mMerge.setGranted(0);
actionAuth.setVisibility(View.VISIBLE);
actionCancelAuth.setVisibility(View.GONE);
}
});
}
});
}
private void initHead(View head) {
head.findViewById(R.id.itemCommit).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CommitListActivity_.intent(MergeDetailActivity.this).mMerge(mMerge).start();
}
});
ListItem1 itemFiles = (ListItem1) head.findViewById(R.id.itemFile);
itemFiles.showBadge(RedPointTip.show(this, RedPointTip.Type.MergeFile320));
itemFiles.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RedPointTip.markUsed(MergeDetailActivity.this, RedPointTip.Type.MergeFile320);
((ListItem1) v).showBadge(false);
MergeFileListActivity_.intent(MergeDetailActivity.this).mMerge(mMerge).start();
}
});
((TextView) head.findViewById(R.id.title)).setText(mMerge.getTitleSpannable());
ImageView imageView = (ImageView) head.findViewById(R.id.icon);
iconfromNetwork(imageView, mMerge.getAuthor().avatar);
((TextView) head.findViewById(R.id.time)).setText(Global.dayToNowCreate(mMerge.getCreatedAt()));
TextView styleView = (TextView) head.findViewById(R.id.mergeStyle);
String[] styles = Merge.STYLES;
final String[] styleStrings = new String[]{
"已合并",
"已拒绝",
"可合并",
"不可合并",
"已取消"
};
final String[] actionStrings = new String[]{
"已合并",
"已拒绝",
"已拒绝",
"已拒绝",
"已取消"
};
String action = "";
final int[] styleColors = new int[]{
0xff3bbd79, 0xfffb3b30, 0xff3bbd79, 0xffac8cd3, 0xff666666
};
for (int i = 0; i < styles.length; ++i) {
if (mMerge.getMergeStatus().equals(styles[i])) {
styleView.setText(styleStrings[i]);
styleView.setTextColor(styleColors[i]);
action = actionStrings[i];
}
}
String src = mMerge.getSrcBranch();
String desc = mMerge.getDescBranch();
((TextView) head.findViewById(R.id.branchSrc)).setText(src);
((TextView) head.findViewById(R.id.branchDesc)).setText(desc);
((TextView) head.findViewById(R.id.mergeActionUser)).setText(mMerge.getActionAuthor().name);
String mergeActionMessage = String.format(" %s %s这个%s", Global.dayToNow(mMerge.getAction_at()),
action, ProjectObject.getTitle(mMerge.isPull()));
((TextView) head.findViewById(R.id.mergeLog)).setText(mergeActionMessage);
View mergeTreate = head.findViewById(R.id.mergeTreate);
if (mMerge.isMergeTreate()) {
mergeTreate.setVisibility(View.VISIBLE);
int color;
int iconRes;
if (mMerge.isMergeAccept()) {
color = R.color.merge_green;
iconRes = R.drawable.ic_listitem_merge_accept;
} else {
color = R.color.merge_red;
iconRes = R.drawable.ic_listitem_merge_refuse;
}
head.findViewById(R.id.mergeIcon0).setBackgroundResource(color);
head.findViewById(R.id.mergeIcon1).setBackgroundResource(iconRes);
} else {
mergeTreate.setVisibility(View.GONE);
}
// 取到 detail 后再显示
mergeContent = (TextView) head.findViewById(R.id.mergeContent);
mergeContent.setVisibility(View.GONE);
mergeContentDivide = head.findViewById(R.id.mergeContentDivide);
mergeContentDivide.setVisibility(View.GONE);
head.findViewById(R.id.itemRefResource).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RefResourceActivity.Param param = new RefResourceActivity.Param(mMerge.getProjectPath(),
mMerge.getIid());
RefResourceActivity_.intent(MergeDetailActivity.this)
.mData(refResourceList)
.mParam(param)
.startForResult(RESULT_RESUSE_REFRESOURCE);
}
});
}
private void initFooter(View footer) {
footer.findViewById(R.id.itemAddComment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CommentActivity.CommentParam param = createParam("");
CommentActivity_.intent(MergeDetailActivity.this).mParam(param).startForResult(RESULT_COMMENT);
}
});
}
public CommentActivity.CommentParam createParam(final String atSomeOne) {
return new MergeCommentParam(mMerge, atSomeOne);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RESULT_COMMENT) {
if (resultCode == RESULT_OK) {
String commentString = (String) data.getSerializableExtra("data");
try {
JSONObject json = new JSONObject(commentString);
DynamicObject.DynamicMergeRequest comment = new DynamicObject.DynamicMergeRequest(json, true);
mAdapter.appendData(comment);
mAdapter.notifyDataSetChanged();
} catch (Exception e) {
showButtomToast("" + e.toString());
}
}
} else if (requestCode == RESULT_MERGE) {
if (resultCode == RESULT_OK) {
finishAndUpdateList();
}
}
}
@Override
public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException {
if (tag.equals(HOST_DELETE_COMMENT)) {
if (code == 0) {
mAdapter.removeDataUpdate((DynamicObject.DynamicMergeRequest) data);
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(HOST_MERGE_REFUSE)) {
umengEvent(UmengEvent.CODE, "拒绝mrpr");
if (code == 0) {
finishAndUpdateList();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(HOST_MERGE_CANNEL)) {
umengEvent(UmengEvent.CODE, "取消mrpr");
if (code == 0) {
finishAndUpdateList();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(HOST_MERGE_DETAIL)) {
hideProgressDialog();
if (code == 0) {
mMergeDetail = new MergeDetail(respanse.optJSONObject("data"));
if (mMerge == null) {
mMerge = mMergeDetail.getMerge();
initByMereData();
} else {
mMerge = mMergeDetail.getMerge();
}
updateBottomBarStyle();
Spannable spanContent = Global.changeHyperlinkColor(mMergeDetail.getContent());
if (spanContent.length() == 0) {
mergeContent.setVisibility(View.GONE);
mergeContentDivide.setVisibility(View.GONE);
} else {
mergeContent.setVisibility(View.VISIBLE);
mergeContentDivide.setVisibility(View.VISIBLE);
mergeContent.setText(spanContent);
}
refreshReviewers();
refreshRefResource();
} else {
showErrorMsg(code, respanse);
if (code == NetworkImpl.ERROR_PERMISSION_DENIED) {
BlankViewDisplay.setBlank(0, this, true, blankLayout, null, "无权访问\n请联系项目管理员进行代码权限设置");
} else {
BlankViewDisplay.setBlank(0, this, true, blankLayout, null);
}
}
} else if (tag.equals(TAG_REVIEW_GOOD)) {
if (code == 0) {
refreshReviewers();
}
}
}
private void refreshRefResource() {
if (!mMerge.isPull()) {
String url = Global.HOST_API + mMerge.getProjectPath() + "/resource_reference/" + mMerge.getIid();
MyAsyncHttpClient.get(this, url, new MyJsonResponse(this) {
@Override
public void onMySuccess(JSONObject response) {
super.onMySuccess(response);
refResourceList.clear();
JSONObject jsonData = response.optJSONObject("data");
Iterator<String> iter = jsonData.keys();
while (iter.hasNext()) {
String key = iter.next();
JSONArray array = jsonData.optJSONArray(key);
for (int i = 0; i < array.length(); ++i) {
JSONObject item = array.optJSONObject(i);
try {
refResourceList.add(new RefResourceObject(item));
} catch (Exception e) {
Global.errorLog(e);
}
}
}
updateRefResourceUI();
}
});
}
}
private void updateRefResourceUI() {
View item = findViewById(R.id.itemRefResourceLayout);
if (refResourceList.isEmpty()) {
item.setVisibility(View.GONE);
} else {
item.setVisibility(View.VISIBLE);
((TextView) item.findViewById(R.id.text2)).setText(refResourceList.size() + "个资源");
item.findViewById(R.id.text2).setVisibility(View.VISIBLE);
}
}
private void refreshReviewers() {
if (!mMerge.isPull()) {
MyAsyncHttpClient.get(this, mMerge.getHttpReviewers(), new MyJsonResponse(this) {
@Override
public void onMySuccess(JSONObject response) {
Log.d("reviewers", response.toString());
JSONArray json = null;
try {
json = response.optJSONObject("data").optJSONArray("reviewers");
ArrayList<Merge.Reviewer> arrayData = new ArrayList<>();
for (int i = 0; i < json.length(); ++i) {
Merge.Reviewer user = new Merge.Reviewer(json.getJSONObject(i));
arrayData.add(user);
}
json = response.optJSONObject("data").optJSONArray("volunteer_reviewers");
for (int i = 0; i < json.length(); ++i) {
Merge.Reviewer user = new Merge.Reviewer(json.getJSONObject(i));
arrayData.add(user);
}
reviewerList = arrayData;
updateReviewer();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} else {
updateReviewer();
}
}
private void refreshActivities() {
dynamicList.clear();
String commentsUrl = mMerge.getHttpComments();
String activitiesUrl = mMerge.getHttpActivities();
MyJsonResponse activityResponse = new MyJsonResponse(this) {
@Override
public void onMySuccess(JSONObject response) {
try {
JSONArray json = response.getJSONArray("data");
for (int i = 0; i < json.length(); ++i) {
Object object = json.get(i);
JSONObject activityJson = null;
boolean isCommentCommit = false;
if (object instanceof JSONArray) { // comment 的结构是 data : [ [comment] , [comment]]
activityJson = ((JSONArray) object).getJSONObject(0);
if (activityJson.has("diff_html")) {
isCommentCommit = true;
activityJson.put("action" , "comment_commit");
} else {
activityJson.put("action" , "comment");
}
} else if (object instanceof JSONObject) { // activity 的结构是 data : [ activity , activity]
activityJson = (JSONObject) object;
}
DynamicObject.DynamicMergeRequest activity =
isCommentCommit ?
new DynamicObject.DynamicMergeRequestCommentCommit(activityJson) :
new DynamicObject.DynamicMergeRequest(activityJson);
dynamicList.add(activity);
Collections.sort(dynamicList, mDynamicSorter);
}
if (dynamicList.size() > 0) {
listView.findViewById(R.id.gap_to_list).setVisibility(View.VISIBLE);
} else {
listView.findViewById(R.id.gap_to_list).setVisibility(View.GONE);
}
mAdapter.resetData(dynamicList);
} catch (JSONException e) {
e.printStackTrace();
}
}
};
MyAsyncHttpClient.get(this, activitiesUrl, activityResponse);
MyAsyncHttpClient.get(this, commentsUrl, activityResponse);
}
private void finishAndUpdateList() {
setResult(RESULT_OK);
finish();
}
private static class MergeCommentParam extends CommentActivity.CommentParam implements Serializable {
private Merge mMerge;
private String atSomeOne;
public MergeCommentParam(Merge mMerge, String atSomeOne) {
this.mMerge = mMerge;
this.atSomeOne = atSomeOne;
}
@Override
public RequestData getSendCommentParam(String input) {
RequestData request = mMerge.getHttpSendComment();
request.setContent(input);
return request;
}
@Override
public String getAtSome() {
return atSomeOne;
}
@Override
public String getAtSomeUrl() {
return mMerge.getMergeAtMemberUrl();
}
@Override
public String getProjectPath() {
return mMerge.getProjectPath();
}
@Override
public boolean isPublicProject() {
return mMerge.isPull();
}
}
private void updateReviewer() {
if (mMerge == null || mMerge.isPull()) {
findViewById(R.id.reviewer_layout).setVisibility(View.GONE);
return;
} else {
findViewById(R.id.reviewer_layout).setVisibility(View.VISIBLE);
}
ListItem1 reviewers = (ListItem1) findViewById(R.id.itemReviewer);
int role = 0;
if (mMerge.isMergeTreate() || mMerge.isCanceled()) {
role = 0;
} else if (mMerge.authorIsMe()) {
role = 1;
} else {
role = 2;
if (reviewerList != null) {
for (Merge.Reviewer reviewer : reviewerList) {
if (MyApp.sUserObject.id == reviewer.user.id) {
if (reviewer.value > 0)
role = 3;
break;
}
}
}
}
if (role > 0) {
TextView tv = (TextView) reviewers.findViewById(R.id.text2);
tv.setVisibility(View.VISIBLE);
View arrow = reviewers.findViewById(R.id.arrow);
if (role == 1) {
tv.setText("添加");
tv.setTextColor(getResources().getColor(R.color.font_black_9));
tv.setCompoundDrawables(null, null, null, null);
arrow.setVisibility(View.VISIBLE);
} else if (role == 3) {
tv.setText("撤消 +1 ");
tv.setTextColor(getResources().getColor(R.color.green));
tv.setCompoundDrawables(null, null, null, null);
arrow.setVisibility(View.GONE);
} else if (role == 2) {
tv.setText("+1 ");
Drawable up = getResources().getDrawable(R.drawable.thumb_up);
up.setBounds(0, 0, up.getMinimumWidth(), up.getMinimumHeight());
tv.setCompoundDrawables(up, null, null, null);
arrow.setVisibility(View.GONE);
tv.setTextColor(getResources().getColor(R.color.green));
}
tv.setGravity(Gravity.CENTER);
} else {
TextView tv = (TextView) reviewers.findViewById(R.id.text2);
tv.setVisibility(View.GONE);
View arrow = reviewers.findViewById(R.id.arrow);
if (arrow != null) {
arrow.setVisibility(View.VISIBLE);
}
}
final int roleFinal = role;
reviewers.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (roleFinal == 0) {
Intent intent = new Intent(MergeDetailActivity.this, MembersSelectActivity_.class);
intent.putExtra("mMerge", mMerge);
startActivityForResult(intent, MergeReviewerListFragment.RESULT_ADD_USER);
} else if (roleFinal == 1) {
Intent intent = new Intent(MergeDetailActivity.this, MembersSelectActivity_.class);
intent.putExtra("mMerge", mMerge);
intent.putExtra("mSelect", true);
startActivityForResult(intent, MergeReviewerListFragment.RESULT_ADD_USER);
} else if (roleFinal == 2) {
postNetwork(mMerge.getHttpReviewGood(), new RequestParams(), TAG_REVIEW_GOOD);
} else if (roleFinal == 3) {
deleteNetwork(mMerge.getHttpReviewGood(), TAG_REVIEW_GOOD);
}
}
});
LinearLayout reviewersLayout = (LinearLayout) findViewById(R.id.reviewers);
reviewersLayout.removeAllViews();
if (reviewerList != null && reviewerList.size() > 0) {
int imageSize = DensityUtil.dip2px(this, 33);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(imageSize, imageSize);
lp.rightMargin = DensityUtil.dip2px(this, 8);
int addedCount = 0;
int shouldShowCount = getResources().getInteger(R.integer.max_reviewer_count);
boolean shouldShowMore = false;
if (reviewerList.size() > shouldShowCount) {
shouldShowMore = true;
shouldShowCount = shouldShowCount - 1;
} else {
shouldShowCount = reviewerList.size();
}
for (int i = 0; i < shouldShowCount ; i ++) {
Merge.Reviewer reviewer = reviewerList.get(i);
if (reviewer.user.global_key.equals(mMerge.getAuthor().global_key)) {
continue;
}
CircleImageView circleImageView = new CircleImageView(this);
circleImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserDetailActivity_.intent(MergeDetailActivity.this)
.globalKey(reviewer.user.global_key).start();
}
});
if ("invitee".equals(reviewer.volunteer) && reviewer.value > 0) {
FrameLayout container = new FrameLayout(this);
container.addView(circleImageView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
ImageView thumb = new ImageView(this);
thumb.setImageResource(R.drawable.thumb_uped);
container.addView(thumb, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.RIGHT));
reviewersLayout.addView(container, lp);
} else {
reviewersLayout.addView(circleImageView, lp);
}
addedCount ++;
iconfromNetwork(circleImageView, reviewer.user.avatar);
}
if (shouldShowMore) {
ImageView more = new ImageView(this);
more.setImageResource(R.drawable.round_more);
reviewersLayout.addView(more, lp);
}
if (addedCount > 0) {
findViewById(R.id.reviewer_divide).setVisibility(View.VISIBLE);
reviewersLayout.setVisibility(View.VISIBLE);
reviewersLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MergeDetailActivity.this, MembersSelectActivity_.class);
intent.putExtra("mMerge", mMerge);
startActivityForResult(intent, MergeReviewerListFragment.RESULT_ADD_USER);
}
});
} else {
findViewById(R.id.reviewer_divide).setVisibility(View.GONE);
reviewersLayout.setVisibility(View.GONE);
}
} else {
findViewById(R.id.reviewer_divide).setVisibility(View.GONE);
reviewersLayout.setVisibility(View.GONE);
}
}
@OnActivityResult(RESULT_RESUSE_REFRESOURCE)
void resultRefResource(int resultCode, @OnActivityResult.Extra ArrayList<RefResourceObject> resultData) {
if (resultCode == RESULT_OK) {
refResourceList = resultData;
updateRefResourceUI();
}
}
@OnActivityResult(MergeReviewerListFragment.RESULT_ADD_USER)
public void onAddReviewer(int result) {
if (result == Activity.RESULT_OK) {
refreshReviewers();
}
}
}