package net.coding.program.task.add; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.text.Editable; import android.text.Html; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import com.loopj.android.http.RequestParams; import com.nostra13.universalimageloader.core.ImageLoader; import net.coding.program.common.util.DensityUtil; import net.coding.program.MyApp; import net.coding.program.R; import net.coding.program.common.BlankViewDisplay; import net.coding.program.common.ClickSmallImage; import net.coding.program.common.CommentBackup; import net.coding.program.common.DatePickerFragment; import net.coding.program.common.Global; import net.coding.program.common.HtmlContent; import net.coding.program.common.MyImageGetter; import net.coding.program.common.PhotoOperate; import net.coding.program.common.StartActivity; import net.coding.program.common.TextWatcherAt; import net.coding.program.common.base.MyJsonResponse; import net.coding.program.common.enter.EnterLayout; import net.coding.program.common.enter.ImageCommentLayout; import net.coding.program.common.enter.SimpleTextWatcher; import net.coding.program.common.network.MyAsyncHttpClient; import net.coding.program.common.photopick.ImageInfo; 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.AttachmentFileObject; import net.coding.program.model.DynamicObject; import net.coding.program.model.ProjectObject; import net.coding.program.model.RefResourceObject; import net.coding.program.model.TaskObject; import net.coding.program.model.TopicLabelObject; import net.coding.program.model.UserObject; import net.coding.program.project.detail.MembersActivity_; import net.coding.program.project.detail.TaskListFragment; import net.coding.program.project.detail.TopicAddActivity; import net.coding.program.project.detail.TopicLabelActivity; import net.coding.program.project.detail.TopicLabelActivity_; import net.coding.program.project.detail.TopicLabelBar; import net.coding.program.task.TaskDescriptionActivity_; import net.coding.program.third.EmojiFilter; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.ViewById; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import static net.coding.program.common.util.LogUtils.makeLogTag; @EActivity(R.layout.activity_task_add) public class TaskAddActivity extends BackActivity implements StartActivity, DatePickerFragment.DateSet, NewTaskParam { private static final String TAG = makeLogTag(TaskAddActivity.class); public static final String RESULT_GLOBARKEY = "RESULT_GLOBARKEY"; public static final int RESULT_REQUEST_FOLLOW = 1002; public static final int RESULT_REQUEST_SELECT_USER = 3; public static final int RESULT_REQUEST_DESCRIPTION = 4; public static final int RESULT_REQUEST_DESCRIPTION_CREATE = 5; public static final int RESULT_REQUEST_PICK_PROJECT = 6; public static final int RESULT_LABEL = 7; public static final int RESULT_REQUEST_PICK_WATCH_USER = 8; public static final int RESULT_RESUSE_REFRESOURCE = 9; private static final String TAG_HTTP_REMOVE_LABEL = "TAG_HTTP_REMOVE_LABEL"; final String HOST_COMMENT_ADD = Global.HOST_API + "/task/%s/comment"; private final MyImageGetter myImageGetter = new MyImageGetter(this); private final ClickSmallImage onClickImage = new ClickSmallImage(this); public static final int priorityDrawable[] = new int[]{ R.drawable.ic_task_priority_0, R.drawable.ic_task_priority_1, R.drawable.ic_task_priority_2, R.drawable.ic_task_priority_3 }; final String HOST_TASK_ADD = Global.HOST_API + "%s/task"; final String HOST_FORMAT_TASK_COMMENT = Global.HOST_API + "/activity/task/%s?last_id=999999999"; final String HOST_TASK_UPDATE = Global.HOST_API + "/task/%s/update"; final String TAG_TASK_UPDATE = "TAG_TASK_UPDATE"; final String hostDeleteComment = Global.HOST_API + "/task/%s/comment/%s"; final String tagTaskDetail = "tagTaskDetail"; final String HOST_PREVIEW = Global.HOST_API + "/markdown/preview"; @ViewById protected View blankLayout; @Extra TaskObject.SingleTask mSingleTask; @Extra ProjectObject mProjectObject = new ProjectObject(); @Extra UserObject mUserOwner; @Extra TaskJumpParams mJumpParams; @Extra boolean canPickProject = true; @ViewById ListView listView; View mHeadView; EditText title; TopicLabelBar labelBar; TaskAttrItem layoutProjectName; TaskAttrItem layoutName; TaskAttrItem layoutPriovity; TaskAttrItem layoutDeadline; TaskAttrItem layoutPhase; TaskAttrItem layoutWatch; ViewGroup layoutRefResourceParent; TextView description; ViewGroup descriptionLayout; TextView descriptionButton; TaskObject.TaskDescription descriptionData = new TaskObject.TaskDescription(); TaskObject.TaskDescription descriptionDataNew = new TaskObject.TaskDescription(); TaskParams mNewParam; TaskParams mOldParam; ImageCommentLayout mEnterComment; String HOST_DESCRIPTER = Global.HOST_API + "/task/%s/description"; MenuItem mMenuSave; String urlComments = ""; private ArrayList<UserObject> watchUsers = new ArrayList<>(); @Bean PriorityAdapter mPriorityAdapter; @Bean StatusAdapter mStatusAdapter; ArrayList<DynamicObject.DynamicTask> mData = new ArrayList<>(); HashMap<String, String> mSendedImages = new HashMap<>(); String tagUrlCommentPhoto = ""; boolean mTaskNoFound = false; private View.OnClickListener mOnClickComment = new View.OnClickListener() { @Override public void onClick(View v) { final TaskObject.TaskComment comment = (TaskObject.TaskComment) v.getTag(); if (comment.isMy()) { showDialog("任务", "删除评论?", (dialog, which) -> { String url = String.format(hostDeleteComment, comment.taskId, comment.id); deleteNetwork(url, hostDeleteComment, comment.id); }); } else { EnterLayout mEnterLayout = mEnterComment.getEnterLayout(); mEnterLayout.content.setTag(comment); String format = "回复 %s"; mEnterLayout.content.setHint(String.format(format, comment.owner.name)); mEnterLayout.restoreLoad(comment); mEnterLayout.popKeyboard(); } } }; BaseAdapter commentAdpter = new BaseAdapter() { @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { DynamicObject.DynamicTask task = mData.get(position); if (task.target_type.equals("TaskComment")) { return 0; } else { return 1; } } @Override public int getViewTypeCount() { return 2; } @Override public View getView(int position, View convertView, ViewGroup parent) { int count = getCount(); if (getItemViewType(position) == 0) { CommentHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.activity_task_comment_much_image_task, parent, false); holder = new CommentHolder(convertView, mOnClickComment, myImageGetter, getImageLoad(), mOnClickUser, onClickImage); convertView.setTag(R.id.layout, holder); } else { holder = (CommentHolder) convertView.getTag(R.id.layout); } TaskObject.TaskComment data = mData.get(position).getTaskComment(); holder.setContent(data); holder.updateLine(position, count); return convertView; } else { TaskListHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.task_list_item_dynamic, parent, false); holder = new TaskListHolder(convertView); } else { holder = (TaskListHolder) convertView.getTag(TaskListHolder.getTagId()); } DynamicObject.DynamicTask data = mData.get(position); holder.mContent.setText(data.dynamicTitle()); int iconResId = R.drawable.ic_task_dynamic_update; try { String resName = "ic_task_dynamic_" + data.action; Field field = R.drawable.class.getField(resName); iconResId = Integer.parseInt(field.get(null).toString()); } catch (Exception e) { Global.errorLog(e); } holder.mIcon.setImageResource(iconResId); holder.updateLine(position, count); return convertView; } } }; private View.OnClickListener onClickCreateDescription = new View.OnClickListener() { @Override public void onClick(View v) { if (noSelectProject()) { showMiddleToast(R.string.pick_project_first); return; } TaskDescriptionActivity_ .intent(TaskAddActivity.this) .taskId(0) .projectPath(mSingleTask.project.getProjectPath()) .descriptionData(descriptionDataNew) .startForResult(RESULT_REQUEST_DESCRIPTION_CREATE); } }; @Override public TaskParams getNewParam() { return mNewParam; } @AfterViews protected final void initTaskAddActivity() { initControl(); if (mSingleTask != null) { initData(); } else if (mJumpParams != null) { // 跳转过来的,要先取得任务数据 requestTaskFromNetwork(); } else { mSingleTask = new TaskObject.SingleTask(); if (!mProjectObject.isEmpty()) { mSingleTask.project = mProjectObject; mSingleTask.project_id = mProjectObject.getId(); mSingleTask.priority = mProjectObject.getId(); } initData(); } } private void requestTaskFromNetwork() { final String hostTaskDetail = Global.HOST_API + "/user/%s/project/%s/task/%s"; String url = String.format(hostTaskDetail, mJumpParams.userKey, mJumpParams.projectName, mJumpParams.taskId); getNetwork(url, tagTaskDetail); showDialogLoading(); } private void initControl() { mEnterComment = new ImageCommentLayout(this, v -> sendCommentAll(), getImageLoad()); // 单独提出来是因为弹出软键盘时,由于head太长,导致 title 会被顶到消失,现在的解决方法是 edit作为一个单独的head加载 View headEdit = mInflater.inflate(R.layout.activity_task_add_head_edit, listView, false); title = (EditText) headEdit.findViewById(R.id.title); labelBar = (TopicLabelBar) headEdit.findViewById(R.id.labelBar); listView.addHeaderView(headEdit, null, false); mHeadView = mInflater.inflate(R.layout.activity_task_add_head, listView, false); layoutProjectName = (TaskAttrItem) mHeadView.findViewById(R.id.layoutProjectName); layoutName = (TaskAttrItem) mHeadView.findViewById(R.id.layoutName); layoutPriovity = (TaskAttrItem) mHeadView.findViewById(R.id.layoutPriovity); layoutDeadline = (TaskAttrItem) mHeadView.findViewById(R.id.layoutDeadline); layoutPhase = (TaskAttrItem) mHeadView.findViewById(R.id.layoutPhase); layoutWatch = (TaskAttrItem) mHeadView.findViewById(R.id.layoutWatch); layoutRefResourceParent = (ViewGroup) mHeadView.findViewById(R.id.layoutRefResourceParent); layoutRefResourceParent.setOnClickListener(clickRefResource); descriptionLayout = (ViewGroup) mHeadView.findViewById(R.id.descriptionLayout); description = (TextView) mHeadView.findViewById(R.id.description); descriptionButton = (TextView) mHeadView.findViewById(R.id.descriptionButton); listView.addHeaderView(mHeadView, null, false); View gap = new View(this); gap.setMinimumHeight(DensityUtil.dip2px(this, 20)); gap.setBackgroundResource(R.color.divide); listView.addFooterView(gap); } private void updateLabels(List<TopicLabelObject> labels) { labelBar.bind(labels, new TopicLabelBar.Controller() { @Override public boolean canShowLabels() { return true; } @Override public boolean canEditLabels() { return true; } @Override public void onEditLabels(TopicLabelBar view) { if (!mSingleTask.project.isEmpty()) { TopicLabelActivity_.intent(TaskAddActivity.this) .labelType(TopicLabelActivity.LabelType.Task) .projectPath(mSingleTask.project.getProjectPath()) .id(mSingleTask.getId()) .checkedLabels(mSingleTask.labels) .startForResult(RESULT_LABEL); } else { showMiddleToast("请先选择项目"); } } @Override public void onRemoveLabel(TopicLabelBar view, int labelId) { String url = mSingleTask.getHttpRemoveLabal(labelId); deleteNetwork(url, TAG_HTTP_REMOVE_LABEL, labelId); } }); } private void updateSendButton() { if (title.getText().toString().isEmpty() || isContentUnmodify() || mSingleTask.project.isEmpty()) { enableSendButton(false); } else { enableSendButton(true); } } private boolean isContentUnmodify() { return ((mNewParam != null && mNewParam.equals(mOldParam)) && !descripChange()) || mTaskNoFound; } private boolean descripChange() { return !mSingleTask.isEmpty() && !descriptionData.markdown.equals(descriptionDataNew.markdown); } private void enableSendButton(boolean enable) { if (mMenuSave == null) { return; } if (enable) { mMenuSave.setIcon(R.drawable.ic_menu_ok); mMenuSave.setEnabled(true); } else { mMenuSave.setIcon(R.drawable.ic_menu_ok_unable); mMenuSave.setEnabled(false); } } void initData() { if (mSingleTask.isEmpty()) { if (mUserOwner.id == 0) { mSingleTask.owner = AccountInfo.loadAccount(this); } else { mSingleTask.owner = mUserOwner; } mSingleTask.owner_id = mSingleTask.owner.id; mSingleTask.priority = 1; // 默认优先级是 1:正常处理 } updateLabels(mSingleTask.labels); invalidateOptionsMenu(); mNewParam = new TaskParams(mSingleTask); mOldParam = new TaskParams(mSingleTask); mEnterComment.getEnterLayout().content.addTextChangedListener(new TextWatcherAt(this, this, RESULT_REQUEST_FOLLOW, mSingleTask.project)); setHeadData(); listView.setAdapter(commentAdpter); selectMember(); if (mSingleTask.isEmpty()) { setActionBarTitle("新建任务"); layoutPhase.setText2("未完成"); layoutPhase.setVisibility(View.GONE); mEnterComment.hide(); findViewById(R.id.line2_comment_off).setVisibility(View.VISIBLE); findViewById(R.id.line2_comment_on).setVisibility(View.GONE); findViewById(R.id.descriptionLayout).setVisibility(View.GONE); } else { setActionBarTitle(mSingleTask.project.name); title.setText(mSingleTask.content); setStatus(); setPriority(); layoutPhase.setVisibility(View.VISIBLE); findViewById(R.id.line2_comment_off).setVisibility(View.GONE); findViewById(R.id.line2_comment_on).setVisibility(View.VISIBLE); } setDeadline(); initDescription(); // 获取任务的评论 if (!mSingleTask.isEmpty()) { urlComments = String.format(HOST_FORMAT_TASK_COMMENT, mSingleTask.getId()); updateDynamicFromNetwork(); } if (!mSingleTask.isEmpty()) { CommentBackup.BackupParam param = new CommentBackup.BackupParam(CommentBackup.Type.Task, mSingleTask.getId(), 0); EnterLayout mEnterLayout = mEnterComment.getEnterLayout(); mEnterLayout.content.setTag(param); mEnterLayout.restoreLoad(param); } TextView time = (TextView) mHeadView.findViewById(R.id.time); TextView createName = (TextView) mHeadView.findViewById(R.id.createrName); if (mSingleTask.isEmpty()) { createName.setText(mNewParam.owner.name); time.setText("现在"); } else { createName.setText(mSingleTask.creator.name); time.setText(Global.dayToNow(mSingleTask.created_at)); } TextView refrenceId = (TextView) mHeadView.findViewById(R.id.referenceId); if (mSingleTask.isEmpty()) { refrenceId.setVisibility(View.GONE); } else { refrenceId.setVisibility(View.VISIBLE); refrenceId.setText(mSingleTask.getNumber()); } // 设置任务的关注者 watchUserUpdateFromNetwork(); uiBindDataWatch(); uiBindDataProject(); if (!canPickProject) { layoutProjectName.setVisibility(View.GONE); } updateRefResourceNetwork(); } private void watchUserUpdateFromNetwork() { if (mSingleTask.isEmpty()) { return; } ProjectObject project = mSingleTask.project; String url = String.format(project.getHttpProjectApi() + "/task/%d/watchers?pageSize=1000", mSingleTask.getId()); MyAsyncHttpClient.get(this, url, new MyJsonResponse(TaskAddActivity.this) { @Override public void onMySuccess(JSONObject response) { super.onMySuccess(response); watchUsers.clear(); JSONArray jsonList = response.optJSONObject("data").optJSONArray("list"); if (jsonList != null && jsonList.length() > 0) { for (int i = 0; i < jsonList.length(); ++i) { watchUsers.add(new UserObject(jsonList.optJSONObject(i))); } } uiBindDataWatch(); } }); } private void uiBindDataWatch() { int watchUserCount = watchUsers.size(); String countString; if (watchUserCount == 0) { countString = "添加"; } else { countString = String.format("%d人关注", watchUserCount); } layoutWatch.setText2(countString); } private void updateDynamicFromNetwork() { getNetwork(urlComments, HOST_FORMAT_TASK_COMMENT); } private void initDescription() { // if (mSingleTask.isEmpty()) { // descriptionLayout.setOnClickListener(onClickCreateDescription); // } else { // if (mSingleTask.has_description) { // description.setText("载入备注中..."); // HOST_DESCRIPTER = String.format(HOST_DESCRIPTER, mSingleTask.getCreateTime()); // getNetwork(HOST_DESCRIPTER, HOST_DESCRIPTER); // } else { // descriptionLayout.setOnClickListener(onClickCreateDescription); // } // } if (mSingleTask.isEmpty()) { descriptionButtonUpdate(false); descriptionButton.setOnClickListener(onClickCreateDescription); } else { if (mSingleTask.has_description) { descriptionButtonUpdate(true); HOST_DESCRIPTER = String.format(HOST_DESCRIPTER, mSingleTask.getId()); getNetwork(HOST_DESCRIPTER, HOST_DESCRIPTER); } else { descriptionButtonUpdate(false); descriptionButton.setOnClickListener(onClickCreateDescription); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mTaskNoFound) { MenuInflater menuInflater = getMenuInflater(); if (mJumpParams == null && mSingleTask.isEmpty()) { menuInflater.inflate(R.menu.task_add, menu); } else { menuInflater.inflate(R.menu.task_add_edit, menu); if (mSingleTask != null && !mSingleTask.isEmpty() && !mSingleTask.creator.isMe()) { menu.findItem(R.id.action_delete).setVisible(false); } } mMenuSave = menu.findItem(R.id.action_save); updateSendButton(); } return super.onCreateOptionsMenu(menu); } private void deleteTask() { showDialog("任务", "删除任务?", (dialog, which) -> { TaskObject.SingleTask task = mSingleTask; String url = String.format(TaskListFragment.hostTaskDelete, task.project.owner_user_name, task.project.name, task.getId()); deleteNetwork(url, TaskListFragment.hostTaskDelete); showProgressBar(true, "删除任务中..."); }); } private void setHeadData() { title.addTextChangedListener(new SimpleTextWatcher() { @Override public void afterTextChanged(Editable s) { mNewParam.content = s.toString(); updateSendButton(); } }); title.setText(""); // if (mSingleTask.isEmpty() && mSingleTask.project.isEmpty() && mProjectObject.isEmpty()) { // layoutProjectName.setVisibility(View.VISIBLE); layoutProjectName.setOnClickListener(v -> PickProjectActivity_.intent(TaskAddActivity.this) .startForResult(RESULT_REQUEST_PICK_PROJECT)); // } else { // layoutProjectName.setVisibility(View.GONE); // } layoutName.setOnClickListener(v -> { if (noSelectProject()) { showMiddleToast(R.string.pick_project_first); return; } MembersActivity_ .intent(TaskAddActivity.this) .mProjectObjectId(mSingleTask.project_id) .startForResult(RESULT_REQUEST_SELECT_USER); }); layoutPhase.setOnClickListener(v -> popListSelectDialog(mStatusAdapter, (dialog, which) -> { if (which == 0) { mNewParam.status = TaskObject.STATUS_PRECESS; // "未完成" } else { mNewParam.status = TaskObject.STATUS_FINISH; } setStatus(); updateSendButton(); })); layoutDeadline.setOnClickListener(v -> { DialogFragment newFragment = new DatePickerFragment(); Bundle bundle = new Bundle(); bundle.putString("date", mNewParam.deadline); bundle.putBoolean("clear", true); newFragment.setArguments(bundle); newFragment.setCancelable(true); newFragment.show(getSupportFragmentManager(), "datePicker"); getSupportFragmentManager().executePendingTransactions(); }); layoutPriovity.setOnClickListener(v -> popListSelectDialog( mPriorityAdapter, (dialog, which) -> { mNewParam.priority = priorityDrawable.length - 1 - which; setPriority(); updateSendButton(); })); layoutWatch.setOnClickListener(v -> { if (noSelectProject()) { showMiddleToast(R.string.pick_project_first); return; } WatcherListActivity_.intent(TaskAddActivity.this) .mProjectObjectId(mSingleTask.project_id) .mTaskId(mSingleTask.getId()) .mWatchUsers(watchUsers) .startForResult(RESULT_REQUEST_PICK_WATCH_USER); }); } private boolean noSelectProject() { return mSingleTask.project.isEmpty(); } private void setStatus() { layoutPhase.setText2(mNewParam.status == 1 ? "未完成" : "已完成"); } public void dateSetResult(String date, boolean clear) { if (clear) { mNewParam.deadline = ""; } else { mNewParam.deadline = date; } setDeadline(); updateSendButton(); } private void setPriority() { String[] strings_priority = getResources().getStringArray(R.array.strings_priority); String priority = strings_priority[strings_priority.length - 1]; if (mNewParam.priority < strings_priority.length) { priority = strings_priority[mNewParam.priority]; } layoutPriovity.setText2(priority); } private void setDeadline() { String s = mNewParam.deadline; if (s.isEmpty()) { s = "未指定"; } layoutDeadline.setText2(s); } private void setDescription() { Global.MessageParse parseData = HtmlContent.parseReplacePhoto(descriptionDataNew.description); description.setText(Html.fromHtml(parseData.text, myImageGetter, Global.tagHandler)); } @OptionsItem void action_save() { String content = title.getText().toString(); if (EmojiFilter.containsEmoji(this, content)) { return; } Global.popSoftkeyboard(this, title, false); if (mSingleTask.isEmpty()) { String url = String.format(HOST_TASK_ADD, mSingleTask.project.backend_project_path); RequestParams params = new RequestParams(); params.put("content", content); params.put("status", mNewParam.status); params.put("priority", mNewParam.priority); params.put("owner_id", mNewParam.ownerId); params.put("deadline", mNewParam.deadline); if (!descriptionDataNew.markdown.isEmpty()) { params.put("description", descriptionDataNew.markdown); } StringBuilder labels = TopicAddActivity.getLabelsParam(mSingleTask.labels); if (labels.length() > 0) { params.put("labels", labels); } postNetwork(url, params, HOST_TASK_ADD); showProgressBar(R.string.create_task_ing); } else { String url = String.format(HOST_TASK_UPDATE, mSingleTask.getId()); RequestParams params = new RequestParams(); if (!content.equals(mSingleTask.content)) { params.put("content", content); } if (mNewParam.status != mSingleTask.status) { params.put("status", mNewParam.status); } if (mNewParam.priority != mSingleTask.priority) { params.put("priority", mNewParam.priority); } if (mNewParam.ownerId != (mSingleTask.owner_id)) { params.put("owner_id", mNewParam.ownerId); } if (!mNewParam.deadline.equals(mSingleTask.deadline)) { params.put("deadline", mNewParam.deadline); } String oldData = descriptionData.markdown; if (oldData != null && !oldData.equals(descriptionDataNew.markdown)) { params.put("description", descriptionDataNew.markdown); } putNetwork(url, params, TAG_TASK_UPDATE); showProgressBar(R.string.modify_task_ing); } } @OptionsItem void action_copy() { final String urlTemplate = Global.HOST + "/u/%s/p/%s/task/%d"; String url = String.format(urlTemplate, mSingleTask.project.owner_user_name, mSingleTask.project.name, mSingleTask.getId()); Global.copy(this, url); showButtomToast("已复制 " + url); } @OptionsItem void action_delete() { deleteTask(); } void selectMember() { if (noSelectProject()) { layoutName.setText2(R.string.no_pick); layoutName.getImage().setImageResource(R.drawable.ic_task_user); } else { layoutName.setText2(mNewParam.owner.name); ImageLoader.getInstance().displayImage(Global.makeSmallUrlSquare(mNewParam.owner.avatar, getResources().getDimensionPixelSize(R.dimen.task_add_user_icon_width)), layoutName.getImage()); } } private void closeActivity(String msg) { Intent intent = new Intent(); if (mNewParam != null && mNewParam.owner != null) { // 友盟显示有可能为空 intent.putExtra(RESULT_GLOBARKEY, mNewParam.owner.global_key); setResult(Activity.RESULT_OK, intent); } if (!msg.isEmpty()) { showButtomToast(msg); } finish(); } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(HOST_TASK_ADD)) { showProgressBar(false); if (code == 0) { umengEvent(UmengEvent.TASK, "新建任务"); closeActivity("新建任务成功"); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_FORMAT_TASK_COMMENT)) { if (code == 0) { mData.clear(); JSONArray jsonArray = respanse.getJSONArray("data"); for (int i = 0; i < jsonArray.length(); ++i) { mData.add(new DynamicObject.DynamicTask(jsonArray.getJSONObject(i))); } commentAdpter.notifyDataSetChanged(); updateDynamicFromNetwork(); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_COMMENT_ADD)) { showProgressBar(false); if (code == 0) { umengEvent(UmengEvent.TASK, "新建任务评论"); EnterLayout mEnterLayout = mEnterComment.getEnterLayout(); mEnterLayout.restoreDelete(data); mEnterLayout.clearContent(); mEnterLayout.hideKeyboard(); mEnterLayout.content.setHint(""); mEnterLayout.content.setTag(null); mEnterComment.clearContent(); commentAdpter.notifyDataSetChanged(); updateDynamicFromNetwork(); updateRefResourceNetwork(); } else { showErrorMsg(code, respanse); } } else if (tag.equals(hostDeleteComment)) { if (code == 0) { umengEvent(UmengEvent.TASK, "删除任务评论"); int commentId = (int) data; for (int i = 0; i < mData.size(); ++i) { if (mData.get(i).id == (commentId)) { mData.remove(i); break; } } commentAdpter.notifyDataSetChanged(); showButtomToast("删除成功"); updateDynamicFromNetwork(); } else { showErrorMsg(code, respanse); } } else if (tag.equals(TAG_TASK_UPDATE)) { showProgressBar(false); if (code == 0) { umengEvent(UmengEvent.TASK, "修改任务"); closeActivity("修改任务成功"); } else { showErrorMsg(code, respanse); } } else if (tag.equals(TaskListFragment.hostTaskDelete)) { showProgressBar(false); if (code == 0) { umengEvent(UmengEvent.TASK, "删除任务"); closeActivity("删除任务成功"); } else { showErrorMsg(code, respanse); } } else if (tag.equals(tagTaskDetail)) { final View.OnClickListener onClickRetry = v -> requestTaskFromNetwork(); if (code == 0) { mSingleTask = new TaskObject.SingleTask(respanse.getJSONObject("data")); initData(); BlankViewDisplay.setBlank(1, this, true, blankLayout, onClickRetry); } else { showErrorMsg(code, respanse); if (code == 1600) { mEnterComment.hide(); mTaskNoFound = true; invalidateOptionsMenu(); BlankViewDisplay.setBlank(0, this, false, blankLayout, onClickRetry, "任务不存在"); } else { BlankViewDisplay.setBlank(0, this, false, blankLayout, onClickRetry); } } hideProgressDialog(); } else if (tag.equals(HOST_DESCRIPTER)) { if (code == 0) { descriptionData = new TaskObject.TaskDescription(respanse.getJSONObject("data")); descriptionDataNew = new TaskObject.TaskDescription(descriptionData); setDescription(); descriptionButtonUpdate(false); descriptionButton.setOnClickListener(v -> TaskDescriptionActivity_ .intent(TaskAddActivity.this) .descriptionData(descriptionDataNew) .taskId(mSingleTask.getId()) .projectPath(mSingleTask.project.getProjectPath()) .startForResult(RESULT_REQUEST_DESCRIPTION)); } else { showErrorMsg(code, respanse); } } else if (tag.equals(HOST_PREVIEW)) { if (code == 0) { descriptionDataNew.description = respanse.optString("data", ""); setDescription(); } else { showButtomToast("发生错误"); } hideProgressDialog(); } else if (tag.equals(tagUrlCommentPhoto)) { if (code == 0) { String fileUri; if (mSingleTask.project.isPublic()) { fileUri = respanse.optString("data", ""); } else { AttachmentFileObject fileObject = new AttachmentFileObject(respanse.optJSONObject("data")); fileUri = fileObject.owner_preview; } String mdPhotoUri = String.format("\n![图片](%s)", fileUri); mSendedImages.put((String) data, mdPhotoUri); sendCommentAll(); } else { showErrorMsg(code, respanse); showProgressBar(false); } } else if (tag.equals(TAG_HTTP_REMOVE_LABEL)) { if (code == 0) { int labelId = (int) data; labelBar.removeLabel(labelId); mSingleTask.removeLabel(labelId); } else { showErrorMsg(code, respanse); } } } private void descriptionButtonUpdate(boolean loading) { if (!loading && descriptionDataNew.markdown.isEmpty()) { descriptionButton.setText("添加描述"); descriptionButton.setTextColor(getResources().getColor(R.color.font_black_6)); } else { descriptionButton.setText("查看描述"); descriptionButton.setTextColor(getResources().getColor(R.color.font_green)); } } @OnActivityResult(RESULT_REQUEST_PICK_PROJECT) final void pickProject(int result, Intent data) { if (result == RESULT_OK) { ProjectObject project = (ProjectObject) data.getSerializableExtra("data"); mSingleTask.project = project; mSingleTask.project_id = project.getId(); TaskObject.Members member = new TaskObject.Members(MyApp.sUserObject); setPickUser(member); uiBindDataProject(); } } private void uiBindDataProject() { if (mSingleTask.project.isEmpty()) { return; } iconfromNetwork(layoutProjectName.getImage(), mSingleTask.project.icon); layoutProjectName.setText2(mSingleTask.project.name); updateLabels(mSingleTask.labels); } @OnActivityResult(ImageCommentLayout.RESULT_REQUEST_COMMENT_IMAGE) final void commentImage(int result, Intent data) { if (result == RESULT_OK) { mEnterComment.onActivityResult( ImageCommentLayout.RESULT_REQUEST_COMMENT_IMAGE, data); } } @OnActivityResult(ImageCommentLayout.RESULT_REQUEST_COMMENT_IMAGE_DETAIL) final void commentImageDetail(int result, Intent data) { if (result == RESULT_OK) { mEnterComment.onActivityResult( ImageCommentLayout.RESULT_REQUEST_COMMENT_IMAGE_DETAIL, data); } } @OnActivityResult(RESULT_REQUEST_DESCRIPTION) void resultDescription(int result, Intent data) { if (result == RESULT_OK) { updateDescriptionFromResult(data); updateSendButton(); updateRefResourceNetwork(); } } @OnActivityResult(RESULT_REQUEST_DESCRIPTION_CREATE) void resultDescriptionCreate(int result, Intent data) { if (result == RESULT_OK) { updateDescriptionFromResult(data); updateSendButton(); updateRefResourceNetwork(); } } @OnActivityResult(RESULT_LABEL) void resultLabels(int result, @OnActivityResult.Extra ArrayList<TopicLabelObject> labels) { if (result == RESULT_OK) { mSingleTask.labels = labels; updateLabels(labels); } } @OnActivityResult(RESULT_REQUEST_PICK_WATCH_USER) void resultWatchUser(int result, @OnActivityResult.Extra ArrayList<UserObject> resultData) { if (result == RESULT_OK) { watchUsers = resultData; uiBindDataWatch(); } } @OnActivityResult(RESULT_REQUEST_SELECT_USER) void resultSelectUser(int resultCode, @OnActivityResult.Extra TaskObject.Members members) { if (resultCode == Activity.RESULT_OK) { setPickUser(members); } } @OnActivityResult(RESULT_REQUEST_FOLLOW) void resultRequestFollow(int resultCode, @OnActivityResult.Extra String name) { if (resultCode == RESULT_OK) { mEnterComment.getEnterLayout().insertText(name); } } @OnActivityResult(RESULT_RESUSE_REFRESOURCE) void resultRefResource(int resultCode, @OnActivityResult.Extra ArrayList<RefResourceObject> resultData) { if (resultCode == RESULT_OK) { refResourceList = resultData; updateRefResourceUI(); } } private ArrayList<RefResourceObject> refResourceList = new ArrayList<>(); private void updateRefResourceNetwork() { if (mSingleTask.isEmpty()) { return; } String url = mSingleTask.project.getHttpProjectApi() + "/resource_reference/" + mSingleTask.getNumberValue(); 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() { if (mSingleTask.isEmpty()) { return; } if (refResourceList.isEmpty()) { layoutRefResourceParent.setVisibility(View.GONE); } else { layoutRefResourceParent.setVisibility(View.VISIBLE); TaskAttrItem item = (TaskAttrItem) layoutRefResourceParent.findViewById(R.id.layoutRefResource); item.setText2(refResourceList.size() + "个资源"); } } View.OnClickListener clickRefResource = v -> { RefResourceActivity.Param param = new RefResourceActivity.Param(mSingleTask.project.getProjectPath(), mSingleTask.getNumberValue()); RefResourceActivity_.intent(TaskAddActivity.this) .mData(refResourceList) .mParam(param) .startForResult(RESULT_RESUSE_REFRESOURCE); }; void updateDescriptionFromResult(Intent data) { descriptionDataNew.markdown = data.getStringExtra("data"); RequestParams params = new RequestParams(); params.put("content", descriptionDataNew.markdown); postNetwork(HOST_PREVIEW, params, HOST_PREVIEW); descriptionButtonUpdate(false); } private void setPickUser(TaskObject.Members member) { mNewParam.ownerId = member.user.id; mNewParam.owner = member.user; selectMember(); updateSendButton(); } @Override public void onBackPressed() { if (!isContentUnmodify()) { showDialog("任务", "确定放弃此次编辑?", (dialog, which) -> closeActivity("")); } else { closeActivity(""); } } private void popListSelectDialog(BaseAdapter selectsAdapter, DialogInterface.OnClickListener clickList) { new AlertDialog.Builder(this) .setAdapter(selectsAdapter, clickList) .show(); } private void sendComment(String input) { mEnterComment.getEnterLayout().hideKeyboard(); if (mSingleTask == null) { showButtomToast("发送评论失败"); return; } EnterLayout mEnterLayout = mEnterComment.getEnterLayout(); String s = input; if (EmojiFilter.containsEmptyEmoji(this, s)) { showProgressBar(false); return; } Object item = mEnterLayout.content.getTag(); if (item != null && (item instanceof TaskObject.TaskComment)) { TaskObject.TaskComment comment = (TaskObject.TaskComment) item; s = Global.encodeInput(comment.owner.name, s); } else { s = Global.encodeInput("", s); } RequestParams params = new RequestParams(); params.put("content", s); postNetwork(String.format(HOST_COMMENT_ADD, mSingleTask.getId()), params, HOST_COMMENT_ADD, 0, item); showProgressBar(R.string.sending_comment); } private void sendCommentAll() { showProgressBar(true); ArrayList<ImageInfo> photos = mEnterComment.getPickPhotos(); for (ImageInfo item : photos) { String imagePath = item.path; if (!mSendedImages.containsKey(imagePath)) { try { String url = mSingleTask.project.getHttpUploadPhoto(); RequestParams params = new RequestParams(); params.put("dir", 0); Uri uri = Uri.parse(imagePath); File file = new PhotoOperate(this).scal(uri); params.put("file", file); tagUrlCommentPhoto = imagePath; // tag必须不同,否则无法调用下一次 postNetwork(url, params, tagUrlCommentPhoto, 0, imagePath); showProgressBar(true); } catch (Exception e) { showProgressBar(false); } return; } } String send = mEnterComment.getEnterLayout().getContent(); for (ImageInfo item : photos) { send += mSendedImages.get(item.path); } sendComment(send); } }