package net.oschina.gitapp.ui;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import net.oschina.gitapp.AppException;
import net.oschina.gitapp.R;
import net.oschina.gitapp.bean.Issue;
import net.oschina.gitapp.bean.Milestone;
import net.oschina.gitapp.bean.Project;
import net.oschina.gitapp.bean.User;
import net.oschina.gitapp.common.Contanst;
import net.oschina.gitapp.common.StringUtils;
import net.oschina.gitapp.common.UIHelper;
import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity;
public class IssueEditActivity extends BaseActionBarActivity implements OnClickListener {
private InputMethodManager imm;
private Project mProject;
private Issue mIssue;
private ProgressBar mLoading;
private ScrollView mScrollView;
private EditText mIssueTitle;
private TextView mIssueAssigneeName;//被指派人
private LinearLayout mIssueLLAssignee;
private TextView mIssueMilestone;//里程碑
private LinearLayout mIssueLLMilestone;
private EditText mIssueBody;
private Button mPub;
private TextWatcher mTextWatcher;
private ProgressDialog mLoadSome;
private AlertDialog.Builder mAssigneeDialog;
private ArrayList<User> mAssigneesList;
private AlertDialog.Builder mMilestoneDialog;
private ArrayList<Milestone> mMilestonesList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_issue_edit);
imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
init();
initViewData();
}
private void init() {
Intent intent = getIntent();
mProject = (Project) intent.getSerializableExtra(Contanst.PROJECT);
mIssue = (Issue) intent.getSerializableExtra(Contanst.ISSUE);
mLoading = (ProgressBar) findViewById(R.id.issue_edit_loading);
mScrollView = (ScrollView) findViewById(R.id.issue_edit_sv_issue_content);
mIssueTitle = (EditText) findViewById(R.id.issue_edit_title);
mIssueAssigneeName = (TextView) findViewById(R.id.issue_edit_assignee_name);
mIssueLLAssignee = (LinearLayout) findViewById(R.id.issue_edit_ll_assignee);
mIssueMilestone = (TextView) findViewById(R.id.issue_edit_milestone);
mIssueLLMilestone = (LinearLayout) findViewById(R.id.issue_edit_ll_milestone);
mIssueBody = (EditText) findViewById(R.id.issue_edit_body);
mPub = (Button) findViewById(R.id.issue_edit_pub);
mIssueLLAssignee.setOnClickListener(this);
mIssueLLMilestone.setOnClickListener(this);
mPub.setOnClickListener(this);
mTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
if (StringUtils.isEmpty(mIssueTitle.getText().toString()) || StringUtils.isEmpty(mIssueBody.getText().toString())) {
mPub.setEnabled(false);
} else {
mPub.setEnabled(true);
}
}
};
mIssueTitle.addTextChangedListener(mTextWatcher);
mIssueBody.addTextChangedListener(mTextWatcher);
mLoadSome = new ProgressDialog(getActivity());
mLoadSome.setCancelable(true);
mLoadSome.setCanceledOnTouchOutside(false);
}
private void initViewData() {
if (mIssue != null) {
mActionBar.setTitle("Isssue");
} else {
newIssue();
}
mActionBar.setSubtitle(mProject.getOwner().getName() + "/" + mProject.getName());
mLoading.setVisibility(View.GONE);
mScrollView.setVisibility(View.VISIBLE);
}
private void newIssue() {
mActionBar.setTitle("新增Isssue");
mIssueAssigneeName.setText("选择用户");
mIssueMilestone.setText("选择里程碑");
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.issue_edit_ll_assignee:
loadAssignees();
break;
case R.id.issue_edit_ll_milestone:
loadMilestones();
break;
case R.id.issue_edit_pub:
pubCreateIssue();
break;
default:
break;
}
}
// 加载协作者
private void loadAssignees() {
//异步
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg =new Message();
try {
msg.what = 1;
if (mAssigneesList == null) {
msg.obj = getGitApplication().getProjectMembers(mProject.getId());
} else {
msg.obj = mAssigneesList;
}
} catch (Exception e) {
msg.what = -1;
msg.obj = e;
}
return msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mLoadSome.setMessage("加载协作者...");
if (mAssigneesList == null) {
mLoadSome.show();
}
if (mAssigneeDialog == null) {
mAssigneeDialog = new AlertDialog.Builder(getActivity()).setTitle("选择被指派人");
}
}
@SuppressWarnings("unchecked")
@Override
protected void onPostExecute(Message msg) {
super.onPostExecute(msg);
if (mLoadSome != null) mLoadSome.dismiss();
if (msg.what == 1) {
mAssigneesList = (ArrayList<User>) msg.obj;
final String[] arrays = new String[mAssigneesList.size()];
int index = -1;
for (int i = 0; i < arrays.length; i ++) {
arrays[i] = mAssigneesList.get(i).getName();
if (arrays[i].equalsIgnoreCase((String) mIssueAssigneeName.getText())) index = i;
}
mAssigneeDialog.setSingleChoiceItems(arrays, index, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mIssueAssigneeName.setTag(mAssigneesList.get(which).getId());
mIssueAssigneeName.setText(arrays[which]);
}
}).setNegativeButton("取消", null)
.setPositiveButton("清除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mIssueAssigneeName.setTag(null);
mIssueAssigneeName.setText("选择用户");
}
});
mAssigneeDialog.show();
} else {
if (msg.obj instanceof AppException) {
((AppException)msg.obj).makeToast(getActivity());
} else {
UIHelper.ToastMessage(getGitApplication(), "加载协作者失败");
}
}
}
}.execute();
}
// 加载里程碑
private void loadMilestones() {
//异步
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg =new Message();
try {
msg.what = 1;
if (mMilestonesList == null) {
msg.obj = getGitApplication().getProjectMilestone(mProject.getId());
} else {
msg.obj = mMilestonesList;
}
} catch (Exception e) {
msg.what = -1;
msg.obj = e;
}
return msg;
}
@Override
protected void onPreExecute() {
mLoadSome.setMessage("加载里程碑...");
if (mMilestonesList == null) {
mLoadSome.show();
}
if (mMilestoneDialog == null) {
mMilestoneDialog = new AlertDialog.Builder(getActivity()).setTitle("选择里程碑");
}
}
@SuppressWarnings("unchecked")
@Override
protected void onPostExecute(Message msg) {
if (mLoadSome != null) mLoadSome.dismiss();
if (msg.what == 1) {
mMilestonesList = (ArrayList<Milestone>) msg.obj;
final String[] arrays = new String[mMilestonesList.size()];
int index = -1;
for (int i = 0; i < arrays.length; i ++) {
arrays[i] = mMilestonesList.get(i).getTitle();
if (arrays[i].equalsIgnoreCase((String) mIssueAssigneeName.getText())) index = i;
}
mMilestoneDialog.setSingleChoiceItems(arrays, index, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mIssueMilestone.setTag(mMilestonesList.get(which).getId());
mIssueMilestone.setText(arrays[which]);
}
}).setNegativeButton("取消", null)
.setPositiveButton("清除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
mIssueMilestone.setTag(null);
mIssueMilestone.setText("选择里程碑");
}
});
mMilestoneDialog.show();
} else {
if (msg.obj instanceof AppException) {
((AppException)msg.obj).makeToast(getActivity());
} else {
UIHelper.ToastMessage(getGitApplication(), "加载里程碑失败");
}
}
}
}.execute();
}
private void pubCreateIssue() {
if (!getGitApplication().isLogin()) {
UIHelper.showLoginActivity(IssueEditActivity.this);
return;
}
//异步
new AsyncTask<Void, Void, Message>() {
@Override
protected Message doInBackground(Void... params) {
Message msg =new Message();
try {
msg.what = 1;
String title = mIssueTitle.getText().toString();
String description = mIssueBody.getText().toString();
String assignee_id = (String) mIssueAssigneeName.getTag();
String milestone_id = (String) mIssueMilestone.getTag();
msg.obj = getGitApplication().pubCreateIssue(mProject.getId(), title, description, assignee_id, milestone_id);
} catch (Exception e) {
msg.what = -1;
msg.obj = e;
}
return msg;
}
@Override
protected void onPreExecute() {
mLoadSome.setMessage("正在创建Issue...");
mLoadSome.show();
}
@Override
protected void onPostExecute(Message msg) {
if (mLoadSome != null) mLoadSome.dismiss();
if (msg.what == 1) {
Issue issue = (Issue) msg.obj;
if (issue != null) {
UIHelper.showIssueDetail(getGitApplication(), mProject, issue, null, null);
UIHelper.ToastMessage(getGitApplication(), "创建成功");
getActivity().finish();
}
} else {
if (msg.obj instanceof AppException) {
((AppException)msg.obj).makeToast(getActivity());
} else {
UIHelper.ToastMessage(getGitApplication(), "创建issue失败");
}
}
}
}.execute();
}
}