package net.coding.program.project.detail;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
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.EditText;
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.Global;
import net.coding.program.common.base.CustomMoreFragment;
import net.coding.program.common.base.MyJsonResponse;
import net.coding.program.common.network.MyAsyncHttpClient;
import net.coding.program.common.umeng.UmengEvent;
import net.coding.program.message.MessageListActivity_;
import net.coding.program.model.ProjectObject;
import net.coding.program.model.TaskObject;
import net.coding.program.model.UserObject;
import net.coding.program.project.ProjectFragment;
import net.coding.program.project.ProjectHomeActivity;
import net.coding.program.user.AddFollowActivity_;
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;
@EFragment(R.layout.common_refresh_listview)
public class MembersListFragment extends CustomMoreFragment implements FootUpdate.LoadMore {
static final int RESULT_ADD_USER = 111;
static final int RESULT_MODIFY_AUTHORITY = 112;
final String urlDeleteUser = Global.HOST_API + "/project/%d/kickout/%d";
String urlMembers = Global.HOST_API + "/project/%d/members?pagesize=1000";
String urlQuit = Global.HOST_API + "/project/%d/quit";
@FragmentArg
ProjectObject mProjectObject;
@FragmentArg
String mMergeUrl;
// 为true表示是用@选成员,为false表示项目成员列表
@FragmentArg
boolean mSelect;
@ViewById
ListView listView;
ArrayList<Object> mSearchData = new ArrayList<>();
ArrayList<Object> mData = new ArrayList<>();
TaskObject.Members mMySelf = new TaskObject.Members();
BaseAdapter adapter = new BaseAdapter() {
private View.OnClickListener sendMessage = v -> {
UserObject user = (UserObject) v.getTag();
Intent intent = new Intent(getActivity(), MessageListActivity_.class);
intent.putExtra("mUserObject", user);
startActivity(intent);
};
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_members_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.icon.setOnClickListener(mOnClickUser);
// holder.icon.setFocusable(false);
holder.btn = (ImageView) convertView.findViewById(R.id.btn);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Object object = mSearchData.get(position);
UserObject user;
holder.ic.setVisibility(View.GONE);
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);
}
} else { // (object instanceof UserObject)
user = (UserObject) object;
}
holder.name.setText(user.name);
iconfromNetwork(holder.icon, user.avatar);
holder.icon.setTag(user.global_key);
if (mSearchData.size() - 1 == position) {
loadMore();
}
if (mSelect) {
holder.btn.setVisibility(View.GONE);
} else if (user.name.equals(MyApp.sUserObject.name)) {
holder.btn.setImageResource(R.drawable.ic_member_list_quit);
holder.btn.setOnClickListener(quitProject);
if (object instanceof TaskObject.Members) {
TaskObject.Members data = (TaskObject.Members) object;
if (data.isOwner()) {
holder.btn.setVisibility(View.GONE);
} else {
holder.btn.setVisibility(View.VISIBLE);
}
}
} else {
holder.btn.setImageResource(R.drawable.ic_send_message);
holder.btn.setTag(user);
holder.btn.setOnClickListener(sendMessage);
holder.btn.setVisibility(View.VISIBLE);
}
return convertView;
}
};
@AfterViews
protected void init() {
initRefreshLayout();
mData = new ArrayList<>();
mSearchData = new ArrayList<>(mData);
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) {
Intent intent = new Intent();
UserObject userObject;
Object object = mSearchData.get((int) id);
if (object instanceof TaskObject.Members) {
userObject = ((TaskObject.Members) object).user;
} else {
userObject = (UserObject) object;
}
intent.putExtra("name", userObject.name);
getActivity().setResult(Activity.RESULT_OK, intent);
getActivity().finish();
}
};
} else {
mListClickJump = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
UserDynamicActivity_
.intent(getActivity())
.mProjectObject(mProjectObject)
.mMember((TaskObject.Members) mSearchData.get(position))
.start();
}
};
}
listView.setOnItemClickListener(mListClickJump);
if (!mSelect) {
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, final long id) {
TaskObject.Members member = (TaskObject.Members) mSearchData.get((int) id);
// if (member.user.isMe()) {
// return true;
// }
if (mMySelf.getType() != TaskObject.Members.Type.ower
&& mMySelf.getType() != TaskObject.Members.Type.manager) {
return true;
}
String[] items;
DialogInterface.OnClickListener clicks;
switch (mMySelf.getType()) {
case ower:
if (member.isMe()) {
items = new String[]{
"修改备注"
};
} else {
items = new String[]{
"修改备注",
"设置权限",
"移除成员"
};
}
clicks = (dialog1, which) -> {
if (which == 0) {
modifyMemberAlias(member);
} else if (which == 1) {
modifyMemberAuthority(member);
} else {
removeMember(member);
}
};
break;
case manager:
if (member.getType() == TaskObject.Members.Type.manager
|| member.getType() == TaskObject.Members.Type.ower) {
items = new String[]{
"修改备注"
};
clicks = (dialog1, which) -> {
if (which == 0) {
modifyMemberAlias(member);
}
};
} else {
items = new String[]{
"修改备注",
"设置权限",
"移除成员"
};
clicks = (dialog1, which) -> {
if (which == 0) {
modifyMemberAlias(member);
} else if (which == 1) {
modifyMemberAuthority(member);
} else {
removeMember(member);
}
};
}
break;
default:
return true;
}
new AlertDialog.Builder(getActivity())
.setItems(items, clicks)
.show();
return true;
}
});
}
if (mProjectObject != null) {
urlMembers = String.format(urlMembers, mProjectObject.getId());
urlQuit = String.format(urlQuit, mProjectObject.getId());
} else { // mMergeUrl 不为空
urlMembers = mMergeUrl;
}
loadMore();
setHasOptionsMenu(true);
}
private void modifyMemberAuthority(TaskObject.Members member) {
MemberAuthorityActivity_.intent(this)
.member(member)
.me(mMySelf)
.projectId(mProjectObject.getId())
.startForResult(RESULT_MODIFY_AUTHORITY);
}
private void modifyMemberAlias(TaskObject.Members member) {
UserObject user = member.user;
View v = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_input_alias, null);
EditText input = (EditText) v.findViewById(R.id.edit1);
input.setText(member.alias);
new AlertDialog.Builder(getActivity())
.setMessage("修改备注")
.setView(v)
.setPositiveButton("确定", (dialog2, which1) -> {
String inputString = input.getText().toString();
String url = String.format(Global.HOST_API + "/project/%s/members/update_alias/%s",
mProjectObject.getId(), user.id);
RequestParams params = new RequestParams();
params.put("alias", inputString);
MyAsyncHttpClient.post(getActivity(), url, params, new MyJsonResponse(getActivity()) {
@Override
public void onMySuccess(JSONObject response) {
super.onMySuccess(response);
member.alias = inputString;
adapter.notifyDataSetChanged();
}
@Override
public void onFinish() {
showProgressBar(false);
}
});
showProgressBar(true);
})
.setNegativeButton("取消", null)
.show();
}
private void removeMember(TaskObject.Members member) {
UserObject user = member.user;
new AlertDialog.Builder(getActivity())
.setMessage(String.format("确定移除 %s ?", user.name))
.setPositiveButton("确定", (dialog2, which1) -> {
String url = String.format(urlDeleteUser, mProjectObject.getId(), user.id);
postNetwork(url, new RequestParams(), urlDeleteUser, -1, member);
showProgressBar(true);
})
.setNegativeButton("取消", null)
.create().show();
}
public void search(String input) {
mSearchData.clear();
if (input.isEmpty()) {
mSearchData.addAll(mData);
} else {
for (Object item : mData) {
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();
}
@Override
public void loadMore() {
getNextPageNetwork(urlMembers, urlMembers);
}
private boolean projectCreateByMe() {
String myGlobalKey = MyApp.sUserObject.global_key;
return mProjectObject != null
&& (mProjectObject.owner_user_name.equals(myGlobalKey)
|| mProjectObject.getOwner().global_key.equals(myGlobalKey));
}
@OptionsItem
void action_add() {
Intent intent = new Intent(getActivity(), AddFollowActivity_.class);
intent.putExtra("mProjectObject", mProjectObject);
startActivityForResult(intent, RESULT_ADD_USER);
}
@OnActivityResult(RESULT_ADD_USER)
void onResultAddUser(int resultCode) {
if (resultCode == Activity.RESULT_OK) {
onRefresh();
}
}
@OnActivityResult(RESULT_MODIFY_AUTHORITY)
void onResultModifyAuthority(int resultCode) {
if (resultCode == Activity.RESULT_OK) {
onRefresh();
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (!mSelect) {
if (projectCreateByMe()) {
inflater.inflate(R.menu.users, menu);
} else {
inflater.inflate(R.menu.common_more, menu);
}
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onRefresh() {
initSetting();
getNetwork(urlMembers, urlMembers);
}
@Override
public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException {
if (tag.equals(urlMembers)) {
hideProgressDialog();
setRefreshing(false);
if (code == 0) {
if (isLoadingFirstPage(tag)) {
mData.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.isOwner()) {
mData.add(0, member);
} else {
mData.add(member);
}
if (member.isMe()) {
mMySelf = member;
}
}
// AccountInfo.saveProjectMembers(getActivity(), (ArrayList) mData, mProjectObject.getId());
} else { // merge 的at他人列表只用 data 包了一层
JSONArray members = respanse.getJSONArray("data");
for (int i = 0; i < members.length(); ++i) {
UserObject member = new UserObject(members.getJSONObject(i));
mData.add(member);
}
}
mSearchData.clear();
mSearchData.addAll(mData);
adapter.notifyDataSetChanged();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(urlQuit)) {
if (code == 0) {
umengEvent(UmengEvent.PROJECT, "退出项目");
showButtomToast("成功退出项目");
Intent intent = new Intent();
intent.setAction(ProjectFragment.RECEIVER_INTENT_REFRESH_PROJECT);
intent.setAction(ProjectHomeActivity.BROADCAST_CLOSE);
getActivity().sendBroadcast(intent);
getActivity().onBackPressed();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(urlDeleteUser)) {
showProgressBar(false);
if (code == 0) {
umengEvent(UmengEvent.PROJECT, "移除成员");
mSearchData.remove(data);
adapter.notifyDataSetChanged();
} else {
showErrorMsg(code, respanse);
}
}
}
@Override
protected String getLink() {
return Global.HOST + mProjectObject.project_path + "/members";
}
static class ViewHolder {
ImageView icon;
TextView name;
TextView alias;
ImageView ic;
ImageView btn;
}
}