package net.coding.program.project.detail.merge;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.loopj.android.http.RequestParams;
import net.coding.program.FootUpdate;
import net.coding.program.MyApp;
import net.coding.program.R;
import net.coding.program.common.BlankViewDisplay;
import net.coding.program.common.Global;
import net.coding.program.common.base.CustomMoreFragment;
import net.coding.program.model.Merge;
import net.coding.program.model.TaskObject;
import net.coding.program.model.UserObject;
import net.coding.program.project.detail.MembersSelectActivity_;
import net.coding.program.project.detail.UserDynamicActivity_;
import net.coding.program.user.UserDetailActivity_;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
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.util.ArrayList;
import java.util.List;
@EFragment(R.layout.common_refresh_listview)
public class MergeReviewerListFragment extends CustomMoreFragment implements FootUpdate.LoadMore {
static final int RESULT_ADD_USER = 111;
static final int RESULT_MODIFY_AUTHORITY = 112;
static final String TAG_URL_REVIEWER = "TAG_URL_REVIEWER";
static final String TAG_URL_REVIEW_GOOD = "TAG_URL_REVIEWGOOD";
static final String TAG_URL_REVIEW_BAD = "TAG_URL_REVIEWBAD";
static final String TAG_URL_ADD_REVIEWER = "TAG_URL_ADD_REVIEWER";
static final String TAG_URL_DEL_REVIEWER = "TAG_URL_DEL_REVIEWER";
static final String TAG_URL_MEMBER = "TAG_URL_MEMBER";
String urlMembers;
@FragmentArg
Merge mMerge;
// 为true表示是添加或删除评审者,为false表示评审者列表
@FragmentArg
boolean mSelect;
@ViewById
ListView listView;
@ViewById
View blankLayout;
ArrayList<Object> mSearchData = new ArrayList<>();
ArrayList<Merge.Reviewer> mReviewers = new ArrayList<>();
ArrayList<TaskObject.Members> mMembers= new ArrayList<>();
ArrayList<String> mReviewerKey = new ArrayList<>();
BaseAdapter adapter = new BaseAdapter() {
private View.OnClickListener quitProject = v -> {
// new AlertDialog.Builder(getActivity())
// .setTitle("退出项目")
// .setMessage(String.format("您确定要退出 %s 项目吗?", mProjectObject.name))
// .setPositiveButton("确定", (dialog1, which) -> {
// RequestParams params = new RequestParams();
// postNetwork(urlQuit, params, urlQuit);
// })
// .setNegativeButton("取消", null)
// .show();
};
@Override
public int getCount() {
return mSearchData.size();
}
@Override
public Object getItem(int position) {
return mSearchData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.fragment_reviewers_list_item, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.alias = (TextView) convertView.findViewById(R.id.alias);
//holder.desc = (TextView) convertView.findViewById(R.id.desc);
holder.ic = (ImageView) convertView.findViewById(R.id.ic);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.invitee = convertView.findViewById(R.id.is_invitee);
// holder.icon.setOnClickListener(mOnClickUser);
// holder.icon.setFocusable(false);
holder.reviewerStatus = (TextView) convertView.findViewById(R.id.reviewer_status);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Object object = mSearchData.get(position);
UserObject user = null;
holder.ic.setVisibility(View.GONE);
if (mSelect) {
if (object instanceof TaskObject.Members) {
TaskObject.Members data = (TaskObject.Members) object;
user = data.user;
TaskObject.Members.Type memberType = data.getType();
int iconRes = memberType.getIcon();
if (iconRes == 0) {
holder.ic.setVisibility(View.GONE);
} else {
holder.ic.setVisibility(View.VISIBLE);
holder.ic.setImageResource(iconRes);
}
if (!data.alias.isEmpty()) {
holder.alias.setText(data.alias);
holder.alias.setVisibility(View.VISIBLE);
} else {
holder.alias.setVisibility(View.GONE);
}
}
if (user != null) {
holder.reviewerStatus.setText("");
holder.reviewerStatus.setBackgroundResource(R.drawable.select_reviewer_list_checked);
if (mReviewerKey.contains(user.global_key)) {
holder.reviewerStatus.setVisibility(View.VISIBLE);
} else {
holder.reviewerStatus.setVisibility(View.GONE);
}
if (user.global_key.equals(MyApp.sUserObject.global_key)) {
}
}
holder.invitee.setVisibility(View.GONE);
} else {
if (object instanceof Merge.Reviewer) {
Merge.Reviewer reviewer = (Merge.Reviewer) object;
user = reviewer.user;
holder.ic.setVisibility(View.GONE);
holder.alias.setVisibility(View.GONE);
String volunteer = reviewer.volunteer;
int value = reviewer.value;
if (value > 0) {
if (TextUtils.equals(volunteer, "invitee")) {
holder.invitee.setVisibility(View.VISIBLE);
} else{
holder.invitee.setVisibility(View.GONE);
}
holder.reviewerStatus.setText("+1");
holder.reviewerStatus.setTextColor(getResources().getColor(R.color.font_green_2));
} else {
holder.reviewerStatus.setText("未评审");
holder.reviewerStatus.setTextColor(getResources().getColor(R.color.font_black_9));
holder.invitee.setVisibility(View.GONE);
}
}
holder.reviewerStatus.setBackgroundColor(0);
holder.reviewerStatus.setVisibility(View.VISIBLE);
if (user != null && user.global_key.equals(MyApp.sUserObject.global_key)) {
}
}
if (user != null) {
holder.name.setText(user.name);
iconfromNetwork(holder.icon, user.avatar);
holder.icon.setTag(user.global_key);
}
if (mSearchData.size() - 1 == position) {
loadMore();
}
return convertView;
}
};
@AfterViews
protected void init() {
getActivity().setTitle(mSelect ? "添加评审者" : "评审者");
initRefreshLayout();
resetAllData();
if (mSearchData.isEmpty()) {
showDialogLoading();
}
listView.setAdapter(adapter);
AdapterView.OnItemClickListener mListClickJump;
if (mSelect) {
mListClickJump = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TaskObject.Members member = (TaskObject.Members) mSearchData.get(position);
if (!mReviewerKey.contains(member.user.global_key)) {
addReviewer(member);
} else {
for (Merge.Reviewer r : mReviewers) {
if (r.user.global_key.equals(member.user.global_key)) {
if (mReviewerKey.contains(member.user.global_key)) {
removeReviewer(r);
}
break;
}
}
// showButtomToast("已是评审者,长按移除评审者。");
}
}
};
} else {
mListClickJump = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Merge.Reviewer reviewer = (Merge.Reviewer) mSearchData.get(position);
// UserDynamicActivity_
// .intent(getActivity())
// .mProjectObject(mProjectObject)
// .mMember((TaskObject.Members) mSearchData.get(position))
// .start();
if (reviewer.user.global_key.equals(MyApp.sUserObject.global_key) && !isDealed()) {
if (reviewer.value <= 0) {
postNetwork(mMerge.getHttpReviewGood(), new RequestParams(), TAG_URL_REVIEW_GOOD, 0, reviewer);
} else {
deleteNetwork(mMerge.getHttpReviewGood(), TAG_URL_REVIEW_BAD, reviewer);
}
} else {
UserDetailActivity_.intent(MergeReviewerListFragment.this)
.globalKey(reviewer.user.global_key).start();
}
}
};
}
listView.setOnItemClickListener(mListClickJump);
if (!mSelect && !isDealed()) {
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, final long id) {
Merge.Reviewer reviewer = null;
if (mSelect) {
TaskObject.Members member = (TaskObject.Members) mSearchData.get(position);
for (Merge.Reviewer r : mReviewers) {
if (r.user.global_key.equals(member.user.global_key)) {
if (mReviewerKey.contains(member.user.global_key))
reviewer = r;
else
break;
break;
}
}
} else {
reviewer = (Merge.Reviewer) mSearchData.get(position);
}
if (reviewer != null && reviewer.volunteer.equals("invitee")) {
String[] items;
DialogInterface.OnClickListener clicks;
items = new String[]{
"移除评审者"
};
final Merge.Reviewer finalReviewer = reviewer;
clicks = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
removeReviewer(finalReviewer);
}
};
new AlertDialog.Builder(getActivity())
.setItems(items, clicks)
.show();
return true;
} else {
return false;
}
}
});
}
if (mMerge != null) {
urlMembers = Global.HOST_API + mMerge.getProjectPath() + "/members?pagesize=1000";
setHasOptionsMenu(true);
onRefresh();
} else { // mMergeUrl 不为空
getActivity().finish();
}
}
private void removeReviewer(Merge.Reviewer reviewer) {
UserObject user = reviewer.user;
deleteNetwork(mMerge.getHttpDelReviewer() + "?user_id=" + user.id, TAG_URL_DEL_REVIEWER, reviewer);
}
private void addReviewer(TaskObject.Members member) {
UserObject user = member.user;
// #22 去掉弹窗,直接发请求。
// showProgressBar(true);
RequestParams params = new RequestParams("user_id", String.valueOf(user.id));
postNetwork(mMerge.getHttpAddReviewer(), params, TAG_URL_ADD_REVIEWER, 0, member);
// new AlertDialog.Builder(getActivity())
// .setMessage(String.format("添加评审者 %s ?", user.name))
// .setPositiveButton("确定", (dialog2, which1) -> {
//
// })
// .setNegativeButton("取消", null)
// .create().show();
}
public void search(String input) {
mSearchData.clear();
if (input.isEmpty()) {
resetAllData();
} else {
for (Object item : mSelect ? mMembers : mReviewers) {
UserObject user;
if (item instanceof TaskObject.Members) {
user = ((TaskObject.Members) item).user;
} else {
user = (UserObject) item;
}
if (user.global_key.toLowerCase().contains(input) ||
user.name.toLowerCase().contains(input)) {
mSearchData.add(item);
}
}
}
adapter.notifyDataSetChanged();
}
private boolean requestCreateByMe() {
return mMerge.authorIsMe();
}
@OptionsItem
void action_add() {
Intent intent = new Intent(getActivity(), MembersSelectActivity_.class);
intent.putExtra("mMerge", mMerge);
intent.putExtra("mSelect", true);
startActivityForResult(intent, RESULT_ADD_USER);
}
@OnActivityResult(RESULT_ADD_USER)
void onResultAddUser(int resultCode) {
if (resultCode == Activity.RESULT_OK) {
onRefresh();
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (!mSelect && !isDealed()) {
inflater.inflate(R.menu.users, menu);
}
super.onCreateOptionsMenu(menu, inflater);
}
public boolean isDealed() {
return mMerge.isMergeTreate() || mMerge.isCanceled();
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (!mSelect) {
menu.findItem(R.id.action_search).setVisible(false);
}
}
@Override
public void onRefresh() {
initSetting();
loadMore();
getNetwork(mMerge.getHttpReviewers(), TAG_URL_REVIEWER);
}
@Override
public void loadMore() {
if (mSelect) {
getNextPageNetwork(urlMembers, TAG_URL_MEMBER);
}
}
@Override
public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException {
if (tag.equals(TAG_URL_REVIEWER)) {
List theData = mSelect ? mMembers : mReviewers;
hideProgressDialog();
setRefreshing(false);
if (code == 0) {
if (isLoadingFirstPage(tag)) {
mReviewers.clear();
}
JSONObject dataObject = respanse.optJSONObject("data");
if (dataObject != null) {
JSONArray members;
members = respanse.getJSONObject("data").optJSONArray("reviewers");
mReviewerKey.clear();
if (members != null) {
for (int i = 0; i < members.length(); ++i) {
Merge.Reviewer member = new Merge.Reviewer(members.optJSONObject(i));
if (member.user.global_key.equals(mMerge.getAuthor().global_key)) {
continue;
}
mReviewers.add(member);
mReviewerKey.add(member.user.global_key);
}
}
members = respanse.optJSONObject("data").optJSONArray("volunteer_reviewers");
for (int i = 0; i < members.length(); ++i) {
Merge.Reviewer volunteer = new Merge.Reviewer(members.getJSONObject(i));
mReviewers.add(volunteer);
}
// AccountInfo.saveProjectMembers(getActivity(), (ArrayList) mData, mProjectObject.getId());
}
resetAllData();
BlankViewDisplay.setBlank(theData.size(), this, true, blankLayout, null);
adapter.notifyDataSetChanged();
} else {
BlankViewDisplay.setBlank(theData.size(), this, true, blankLayout, null);
showErrorMsg(code, respanse);
}
} else if (tag.equals(TAG_URL_MEMBER)) {
hideProgressDialog();
setRefreshing(false);
if (code == 0) {
if (isLoadingFirstPage(tag)) {
mMembers.clear();
}
JSONObject dataObject = respanse.optJSONObject("data");
// 项目成员的数据是 data - list,包了两层
if (dataObject != null) {
JSONArray members;
members = respanse.getJSONObject("data").getJSONArray("list");
for (int i = 0; i < members.length(); ++i) {
TaskObject.Members member = new TaskObject.Members(members.getJSONObject(i));
if (member.user.global_key.equals(mMerge.getAuthor().global_key)) {
continue;
}
if (member.getType() == TaskObject.Members.Type.limited) {
continue;
}
if (member.isOwner()) {
mMembers.add(0, member);
} else {
mMembers.add(member);
}
}
}
resetAllData();
BlankViewDisplay.setBlank(mMembers.size(), this, true, blankLayout, null);
adapter.notifyDataSetChanged();
} else {
BlankViewDisplay.setBlank(mMembers.size(), this, true, blankLayout, null);
showErrorMsg(code, respanse);
}
} else if (tag.equals(TAG_URL_DEL_REVIEWER)) {
getActivity().setResult(Activity.RESULT_OK);
showProgressBar(false);
if (code == 0) {
Merge.Reviewer reviewer = (Merge.Reviewer) data;
mReviewers.remove(reviewer);
mReviewerKey.remove(reviewer.user.global_key);
reviewer.volunteer = "volunteer";
if (reviewer.value == 0) {
mSearchData.remove(reviewer);
}
adapter.notifyDataSetChanged();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(TAG_URL_ADD_REVIEWER)) {
getActivity().setResult(Activity.RESULT_OK);
showProgressBar(false);
if (code == 0) {
TaskObject.Members member = (TaskObject.Members) data;
UserObject user = member.user;
Merge.Reviewer reviewer = null;
for (Merge.Reviewer r : mReviewers) {
if (r.user.global_key.equals(member.user.global_key)) {
reviewer = r;
if (!mReviewerKey.contains(user.global_key)) {
mReviewerKey.add(user.global_key);
}
break;
}
}
if (reviewer == null) {
reviewer = new Merge.Reviewer(user);
mReviewers.add(reviewer);
mReviewerKey.add(user.global_key);
}
adapter.notifyDataSetChanged();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(TAG_URL_REVIEW_GOOD) || tag.equals(TAG_URL_REVIEW_BAD)) {
getActivity().setResult(Activity.RESULT_OK);
showProgressBar(false);
if (code == 0) {
onRefresh();
} else {
showErrorMsg(code, respanse);
}
}
}
@Override
protected String getLink() {
return mMerge.getHttpReviewers();
}
private void resetAllData() {
mSearchData.clear();
mSearchData.addAll(mSelect ? mMembers : mReviewers);
}
static class ViewHolder {
ImageView icon;
TextView name;
TextView alias;
ImageView ic;
TextView reviewerStatus;
View invitee;
}
}