package net.coding.program.project.detail; import android.content.DialogInterface; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import com.loopj.android.http.RequestParams; import net.coding.program.R; import net.coding.program.common.Global; import net.coding.program.common.ui.BackActivity; import net.coding.program.common.umeng.UmengEvent; import net.coding.program.model.AccountInfo; import net.coding.program.model.ProjectObject; import net.coding.program.model.TopicLabelObject; import net.coding.program.model.TopicObject; import net.coding.program.third.EmojiFilter; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.InstanceState; import org.androidannotations.annotations.OnActivityResult; import org.json.JSONException; import org.json.JSONObject; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @EActivity(R.layout.activity_topic_add) public class TopicAddActivity extends BackActivity implements TopicEditFragment.SaveData, TopicLabelBar.Controller { final String HOST_TOPIC_NEW = Global.HOST_API + "/project/%s/topic?parent=0"; final String HOST_TOPIC_EDIT = Global.HOST_API + "/topic/%d"; final int RESULT_LABEL = 1000; @Extra protected ProjectObject projectObject; @Extra protected TopicObject topicObject; @InstanceState protected boolean labelsHasChanged; String url = ""; String HOST_TOPIC_DETAIL_CONTENT = Global.HOST_API + "/topic/%d?type=1"; TopicEditFragment editFragment; TopicPreviewFragment previewFragment; private TopicData modifyData = new TopicData(); @NonNull public static StringBuilder getLabelsParam(List<TopicLabelObject> labels) { StringBuilder pickLabels = new StringBuilder(); if (labels != null && labels.size() > 0) { pickLabels.append(labels.get(0).id); for (int i = 1; i < labels.size(); ++i) { pickLabels.append(","); pickLabels.append(labels.get(i).id); } } return pickLabels; } @AfterViews protected void initTopicAddActivity() { ActionBar actionBar = getSupportActionBar(); if (isNewTopic()) { ArrayList<TopicDraft> drafts = AccountInfo.loadTopicDraft(this, getProjectPath(), getTopicId()); if (!drafts.isEmpty()) { TopicDraft draft = drafts.get(0); modifyData.content = draft.mContent; modifyData.title = draft.mTitle; } } editFragment = TopicEditFragment_.builder().build(); previewFragment = TopicPreviewFragment_.builder().build(); if (isNewTopic()) { actionBar.setTitle(R.string.topic_create); url = String.format(HOST_TOPIC_NEW, getTopicId()); getSupportFragmentManager().beginTransaction().replace(R.id.container, editFragment).commit(); } else { actionBar.setTitle(R.string.topic_edit); url = String.format(HOST_TOPIC_EDIT, topicObject.id); getNetwork(String.format(HOST_TOPIC_DETAIL_CONTENT, topicObject.id), HOST_TOPIC_DETAIL_CONTENT); } } @Override public void onBackPressed() { if (labelsHasChanged || editFragment.isContentModify()) { if (isNewTopic()) { showDialog("讨论", "保存为草稿?", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { TopicDraft draft = editFragment.generalDraft(); AccountInfo.saveTopicDraft(TopicAddActivity.this, draft, getProjectPath(), getTopicId()); finish(); } }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { AccountInfo.deleteTopicDraft(TopicAddActivity.this, getProjectPath(), getTopicId()); finish(); } }, "保存", "取消", "删除草稿"); } else { showDialog("讨论", "确定放弃此次编辑?", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); } } else { finish(); } } private boolean isNewTopic() { return topicObject == null; } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { showProgressBar(false); if (tag.equals(HOST_TOPIC_NEW) || tag.equals(HOST_TOPIC_EDIT)) { if (code == 0) { if (tag.equals(HOST_TOPIC_NEW)) { umengEvent(UmengEvent.TOPIC, "新建讨论"); } else if (tag.equals(HOST_TOPIC_EDIT)) { umengEvent(UmengEvent.TOPIC, "修改讨论"); } AccountInfo.deleteTopicDraft(TopicAddActivity.this, getProjectPath(), getTopicId()); Intent intent = new Intent(); TopicObject topic = new TopicObject(respanse.getJSONObject("data")); intent.putExtra("topic", topic); setResult(RESULT_OK, intent); finish(); showSuccess(); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_TOPIC_DETAIL_CONTENT)) { if (code == 0) { topicObject = new TopicObject(respanse.optJSONObject("data")); modifyData = new TopicData(topicObject); getSupportFragmentManager().beginTransaction().replace(R.id.container, editFragment).commit(); } else { showErrorMsg(code, respanse); } } } protected int getTopicId() { return projectObject.getId(); } protected void showSuccess() { } protected String getSendingTip() { return "正在发表讨论..."; } @Override public boolean canShowLabels() { return true; } @Override public boolean canEditLabels() { return true; } @Override public void onEditLabels(TopicLabelBar view) { TopicLabelActivity_.intent(this) .labelType(TopicLabelActivity.LabelType.Topic) .projectPath(projectObject.getProjectPath()) .id(isNewTopic() ? 0 : topicObject.id) .checkedLabels(modifyData != null ? modifyData.labels : isNewTopic() ? null : topicObject.labels) .startForResult(RESULT_LABEL); } @Override public void onRemoveLabel(TopicLabelBar view, int labelId) { view.removeLabel(labelId); for (TopicLabelObject item : modifyData.labels) { if (item.id == labelId) { modifyData.labels.remove(item); break; } } labelsHasChanged = true; saveLabelsIfCancel(); } private void saveLabelsIfCancel() { Intent intent = new Intent(); intent.putExtra("labels", new ArrayList<>(modifyData.labels)); setResult(RESULT_CANCELED, intent); } protected String getExtraString() { return ""; } @Override public void saveData(TopicData data) { modifyData = data; } @Override public TopicData loadData() { return modifyData; } @Override public void switchPreview() { getSupportFragmentManager().beginTransaction().replace(R.id.container, previewFragment).commit(); } @Override public void switchEdit() { getSupportFragmentManager().beginTransaction().replace(R.id.container, editFragment).commit(); } @Override public void exit() { String titleString = modifyData.title; if (EmojiFilter.containsEmptyEmoji(this, titleString, "标题不能为空", "标题不能包含表情")) { return; } String contentString = modifyData.content; if (EmojiFilter.containsEmptyEmoji(this, contentString, "内容不能为空", "内容不能包含表情")) { return; } Global.hideSoftKeyboard(this); StringBuilder pickLabels = getLabelsParam(modifyData.labels); RequestParams params = new RequestParams(); params.put("title", titleString); contentString += getExtraString(); params.put("content", contentString); params.put("label", pickLabels); if (isNewTopic()) { postNetwork(url, params, HOST_TOPIC_NEW); } else { putNetwork(url, params, HOST_TOPIC_EDIT); } showProgressBar(true, getSendingTip()); } @Override public String getProjectPath() { return projectObject.getProjectPath(); } @Override public boolean isProjectPublic() { return projectObject.isPublic(); } @OnActivityResult(RESULT_LABEL) protected void onResultLabel(int code, @OnActivityResult.Extra ArrayList<TopicLabelObject> labels) { if (code == RESULT_OK) { modifyData.labels = labels; editFragment.updateLabels(modifyData.labels); previewFragment.updateLabels(modifyData.labels); labelsHasChanged = true; saveLabelsIfCancel(); } } public static class TopicData implements Serializable { public ArrayList<TopicLabelObject> labels = new ArrayList<>(); public String title = ""; public String content = ""; public TopicData(TopicObject topicObject) { this.title = topicObject.title; this.content = topicObject.content; this.labels = topicObject.labels; } public TopicData(String title, String content, ArrayList<TopicLabelObject> labels) { this.title = title; this.content = content; this.labels = labels; } public TopicData() { } } public static class TopicDraft implements Serializable { String mTitle; String mContent; public TopicDraft(String mTitle, String mContent) { this.mTitle = mTitle; this.mContent = mContent; } } }