package net.coding.program.user; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.loopj.android.http.RequestParams; import net.coding.program.R; import net.coding.program.common.Global; import net.coding.program.common.WeakRefHander; import net.coding.program.common.ui.BackActivity; import net.coding.program.common.umeng.UmengEvent; import net.coding.program.model.ProjectObject; import net.coding.program.model.UserObject; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.OnActivityResult; 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; @EActivity(R.layout.activity_add_follow) public class AddFollowActivity extends BackActivity implements Handler.Callback { public static final int RESULT_USER_DETAIL = 1000; String HOST_SEARCH_USER = Global.HOST_API + "/user/search?key=%s"; String urlAddUser = ""; ArrayList<UserObject> mData = new ArrayList<>(); boolean mNeedUpdate = false; @Extra ProjectObject mProjectObject; @ViewById ListView listView; int flag = 0; Handler mHandler; BaseAdapter baseAdapter; @AfterViews protected final void initAddFollowActivity() { mHandler = new WeakRefHander(this); if (mProjectObject == null) { baseAdapter = new FollowAdapter(this, true, mData); listView.setOnItemClickListener((parent, view, position, id) -> { UserObject userObject = mData.get((int) id); UserDetailActivity_ .intent(AddFollowActivity.this) .globalKey(userObject.global_key) .startForResult(RESULT_USER_DETAIL); }); } else { urlAddUser = Global.HOST_API + mProjectObject.getProjectPath() + "/members/gk/add"; setActionBarTitle("添加项目成员"); baseAdapter = new FollowAdapter(this, false, mData); listView.setOnItemClickListener((parent, view, position, id) -> { final UserObject data = mData.get((int) id); new AlertDialog.Builder(this) .setMessage(String.format("添加项目成员 %s ?", data.name)) .setPositiveButton("确定", (dialog, which) -> { RequestParams params = new RequestParams(); params.put("users", data.global_key); postNetwork(urlAddUser, params, urlAddUser, -1, data); }) .setNegativeButton("取消", null) .show(); }); } listView.setAdapter(baseAdapter); } @Override public boolean handleMessage(Message msg) { if (msg.what == flag) { getNetwork(String.format(HOST_SEARCH_USER, Global.encodeUtf8((String) msg.obj)), HOST_SEARCH_USER); } return true; } @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(HOST_SEARCH_USER)) { if (code == 0) { JSONArray jsonArray = respanse.getJSONArray("data"); mData.clear(); for (int i = 0; i < jsonArray.length(); ++i) { UserObject user = new UserObject(jsonArray.getJSONObject(i)); mData.add(user); } } else { showErrorMsg(code, respanse); } baseAdapter.notifyDataSetChanged(); } else if (tag.equals(UsersListActivity.HOST_FOLLOW)) { if (code == 0) { umengEvent(UmengEvent.PROJECT, "关注他人"); mNeedUpdate = true; showButtomToast(R.string.follow_success); ((UserObject) data).followed = true; } else { showButtomToast(R.string.follow_fail); } baseAdapter.notifyDataSetChanged(); } else if (tag.equals(UsersListActivity.HOST_UNFOLLOW)) { umengEvent(UmengEvent.USER, "取消关注"); if (code == 0) { mNeedUpdate = true; showButtomToast("取消关注成功"); ((UserObject) data).followed = false; } else { showButtomToast("取消关注失败"); } baseAdapter.notifyDataSetChanged(); } else if (tag.equals(urlAddUser)) { if (code == 0) { umengEvent(UmengEvent.PROJECT, "添加成员"); mNeedUpdate = true; showMiddleToast(String.format("添加项目成员 %s 成功", ((UserObject) data).name)); } else { showErrorMsg(code, respanse); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.add_follow_activity, menu); MenuItem menuItem = menu.findItem(R.id.action_search); menuItem.expandActionView(); SearchView searchView = (SearchView) menuItem.getActionView(); searchView.onActionViewExpanded(); searchView.setIconified(false); searchView.setQueryHint("用户名,邮箱,昵称"); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return true; } @Override public boolean onQueryTextChange(String s) { search(s); return true; } }); MenuItemCompat.setOnActionExpandListener(menuItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { onBackPressed(); return false; } }); return true; } void search(String s) { if (s == null || s.replaceAll(" ", "").replaceAll(" ", "").isEmpty()) { return; } int flagHandler = ++flag; Message message = Message.obtain(mHandler, flagHandler, s); mHandler.sendMessageDelayed(message, 1000); } @Override public void onBackPressed() { setResult(mNeedUpdate ? RESULT_OK : RESULT_CANCELED); finish(); } @OnActivityResult(RESULT_USER_DETAIL) protected final void resultUserDetail(int result, Intent data) { if (result == RESULT_OK) { Object object = data.getSerializableExtra("data"); if (object instanceof UserObject) { UserObject user = (UserObject) object; for (int i = 0; i < mData.size(); ++i) { if (user.global_key.equals(mData.get(i).global_key)) { mData.add(i, user); mData.remove(i + 1); baseAdapter.notifyDataSetChanged(); return; } } } } } static class ViewHolder { ImageView icon; TextView name; CheckBox mutual; } private class FollowAdapter extends ArrayAdapter<UserObject> { boolean mShowFollowButton = true; public FollowAdapter(Context context, boolean showFollowButton, List<UserObject> objects) { super(context, 0, objects); mShowFollowButton = showFollowButton; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.activity_add_follow_list_item, parent, false); holder = new ViewHolder(); holder.icon = (ImageView) convertView.findViewById(R.id.icon); holder.name = (TextView) convertView.findViewById(R.id.name); holder.mutual = (CheckBox) convertView.findViewById(R.id.followed); if (mShowFollowButton) { holder.mutual.setVisibility(View.VISIBLE); holder.mutual.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserObject user = (UserObject) v.getTag(R.id.followed); RequestParams params = new RequestParams(); params.put("users", user.global_key); if (((CheckBox) v).isChecked()) { postNetwork(UsersListActivity.HOST_FOLLOW, params, UsersListActivity.HOST_FOLLOW, -1, user); } else { postNetwork(UsersListActivity.HOST_UNFOLLOW, params, UsersListActivity.HOST_UNFOLLOW, -1, user); } } }); } else { holder.mutual.setVisibility(View.INVISIBLE); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final UserObject data = getItem(position); iconfromNetwork(holder.icon, data.avatar); holder.name.setText(String.format("%s - %s", data.name, data.global_key)); if (mShowFollowButton) { int drawableId = data.follow ? R.drawable.checkbox_fans : R.drawable.checkbox_follow; holder.mutual.setButtonDrawable(drawableId); holder.mutual.setChecked(data.followed); holder.mutual.setTag(R.id.followed, data); } return convertView; } } }