package net.coding.program.user;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.view.MenuItemCompat;
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.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.SectionIndexer;
import android.widget.TextView;
import com.loopj.android.http.RequestParams;
import com.melnykov.fab.FloatingActionButton;
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.HtmlContent;
import net.coding.program.common.ui.BackActivity;
import net.coding.program.message.MessageListActivity;
import net.coding.program.model.AccountInfo;
import net.coding.program.model.UserObject;
import net.coding.program.third.sidebar.IndexableListView;
import net.coding.program.third.sidebar.StringMatcher;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
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.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
/*
* 粉丝,关注的人列表
*/
@EActivity(R.layout.activity_users_list)
public class UsersListActivity extends BackActivity implements FootUpdate.LoadMore {
public static final String HOST_FOLLOW = Global.HOST_API + "/user/follow?";
public static final String HOST_UNFOLLOW = Global.HOST_API + "/user/unfollow?";
public static final String TAG_USER_FOLLOWS = "TAG_USER_FOLLOWS";
public static final String TAG_USER_FANS = "TAG_USER_FANS";
public static final String RESULT_EXTRA_NAME = "name";
public static final String RESULT_EXTRA_USESR = "RESULT_EXTRA_USESR";
private static final String TAG_RELAY_MESSAGE = "TAG_RELAY_MESSAGE";
final String HOST_FOLLOWS = Global.HOST_API + "/user/friends?pageSize=500";
final String HOST_FANS = Global.HOST_API + "/user/followers?pageSize=500";
final int RESULT_REQUEST_ADD = 1;
final int RESULT_REQUEST_DETAIL = 2;
@Extra
Friend type;
@Extra
boolean select;
@Extra
boolean hideFollowButton; // 隐藏互相关注按钮,用于发私信选人的界面
@Extra
String titleName = ""; // 设置title
@Extra
String relayString = "";
@Extra
String statUrl; // 收藏项目的人
@Extra
UserParams mUserParam;
ArrayList<UserObject> mData = new ArrayList<>();
ArrayList<UserObject> mSearchData = new ArrayList<>();
@ViewById
IndexableListView listView;
@ViewById
FloatingActionButton floatButton;
UserAdapter adapter = new UserAdapter();
@Override
protected void initSetting() {
super.initSetting();
mData.clear();
mSearchData.clear();
adapter.notifyDataSetChanged();
}
@AfterViews
protected final void initUsersListActivity() {
if (mUserParam != null && mUserParam.mUser.global_key.equals("coding")) {
showButtomToast("这个不能看:)");
finish();
}
if (isMyFriendList()) {
mData = AccountInfo.loadFriends(this, getType());
mSearchData = new ArrayList<>(mData);
}
if (mData.isEmpty()) {
showDialogLoading();
}
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setTitle();
// mFootUpdate.init(listView, mInflater, this);
adapter.initSection();
listView.setAdapter(adapter);
listView.setFastScrollEnabled(true);
listView.setFastScrollAlwaysVisible(true);
loadMore();
if (type == Friend.Follow && isMyFriendList()) {
floatButton.attachToListView(listView);
} else {
floatButton.setVisibility(View.GONE);
}
if (select) {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent();
UserObject user = (UserObject) parent.getItemAtPosition(position);
intent.putExtra(RESULT_EXTRA_NAME, user.name);
intent.putExtra(RESULT_EXTRA_USESR, user);
setResult(Activity.RESULT_OK, intent);
finish();
}
});
} else if (!relayString.isEmpty()) {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent();
final UserObject user = (UserObject) parent.getItemAtPosition(position);
showDialog("转发", "转发给" + user.name, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Global.MessageParse messageParse = HtmlContent.parseMessage(relayString);
// String urls = "";
// for (String item : messageParse.uris) {
// urls += item + "/n";
// }
RequestParams params = new RequestParams();
String text = messageParse.text;
for (String url : messageParse.uris) {
String photoTemplate = "\n![图片](%s)";
text += String.format(photoTemplate, url);
}
params.put("content", text);
params.put("receiver_global_key", user.global_key);
postNetwork(MessageListActivity.HOST_MESSAGE_SEND, params, TAG_RELAY_MESSAGE);
showProgressBar(true, "发送中...");
}
});
}
});
} else {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String globalKey = ((UserObject) parent.getItemAtPosition(position)).global_key;
UserDetailActivity_.intent(UsersListActivity.this)
.globalKey(globalKey)
.startForResult(RESULT_REQUEST_DETAIL);
}
});
}
}
private boolean isMyFriendList() {
return (mUserParam == null ||
mUserParam.mUser.global_key.equals(MyApp.sUserObject.global_key)) &&
statUrl == null;
}
@Override
public void loadMore() {
if (statUrl != null) {
getNetwork(statUrl, statUrl);
} else if (mUserParam == null) {
if (type == Friend.Fans) {
getNextPageNetwork(HOST_FANS, HOST_FANS);
} else {
getNextPageNetwork(HOST_FOLLOWS, HOST_FOLLOWS);
}
} else {
if (mUserParam.isFans()) {
String url = String.format(Global.HOST_API + "/user/followers/%s?pageSize=500", mUserParam.mUser.global_key);
getNextPageNetwork(url, TAG_USER_FANS);
} else {
String url = String.format(Global.HOST_API + "/user/friends/%s?pageSize=500", mUserParam.mUser.global_key);
getNextPageNetwork(url, TAG_USER_FOLLOWS);
}
}
}
void setTitle() {
if (!titleName.isEmpty()) {
getSupportActionBar().setTitle(titleName);
return;
}
String title;
if (mUserParam == null) {
if (type == Friend.Fans) {
title = "我的粉丝";
} else {
title = "我关注的人";
}
} else {
final String format = "%s%s";
String type = mUserParam.isFans() ? "的粉丝" : "关注的人";
title = String.format(format, mUserParam.mUser.name, type);
}
getSupportActionBar().setTitle(title);
}
private Friend getType() {
Friend friendType = type;
if (friendType == null) {
friendType = mUserParam.mType;
}
return friendType;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(type == Friend.Follow ? R.menu.users_follow : R.menu.users_fans,
menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchItem.setIcon(R.drawable.ic_menu_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
try { // 更改搜索按钮的icon
int searchImgId = getResources().getIdentifier("android:id/search_button", null, null);
ImageView v = (ImageView) searchView.findViewById(searchImgId);
v.setImageResource(R.drawable.ic_menu_search);
} catch (Exception e) {
Global.errorLog(e);
}
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return true;
}
@Override
public boolean onQueryTextChange(String s) {
searchItem(s);
return true;
}
});
return true;
}
private void searchItem(String s) {
s = s.toLowerCase();
mSearchData.clear();
for (UserObject item : mData) {
if (item.global_key.toLowerCase().contains(s) ||
item.name.toLowerCase().contains(s)) {
mSearchData.add(item);
}
}
adapter.notifyDataSetChanged();
}
@OnActivityResult(RESULT_REQUEST_ADD)
void result(int result) {
if (result == RESULT_OK) {
initSetting();
loadMore();
}
}
@OnActivityResult(RESULT_REQUEST_DETAIL)
void resultDETAIL(int result) {
if (result == RESULT_OK) {
initSetting();
loadMore();
}
}
@Click
public final void floatButton() {
action_add();
}
@OptionsItem
void action_add() {
startActivityForResult(new Intent(this, AddFollowActivity_.class), RESULT_REQUEST_ADD);
}
@Override
public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException {
if (tag.equals(HOST_FOLLOWS) ||
tag.equals(HOST_FANS) ||
tag.equals(TAG_USER_FANS) ||
tag.equals(TAG_USER_FOLLOWS)) {
if (code == 0) {
JSONArray array = respanse.getJSONObject("data").getJSONArray("list");
mData.clear();
for (int i = 0; i < array.length(); ++i) {
UserObject user = new UserObject(array.getJSONObject(i));
mData.add(user);
}
Collections.sort(mData);
if (isMyFriendList()) {
AccountInfo.saveFriends(this, mData, getType());
}
mSearchData = new ArrayList<>(mData);
} else {
showErrorMsg(code, respanse);
}
adapter.notifyDataSetChanged();
hideProgressDialog();
} else if (tag.equals(HOST_FOLLOW)) {
if (code == 0) {
showButtomToast(R.string.follow_success);
mSearchData.get(pos).followed = true;
} else {
showButtomToast(R.string.follow_fail);
}
adapter.notifyDataSetChanged();
} else if (tag.equals(HOST_UNFOLLOW)) {
if (code == 0) {
showButtomToast(R.string.unfollow_success);
mSearchData.get(pos).followed = false;
} else {
showButtomToast(R.string.unfollow_fail);
}
adapter.notifyDataSetChanged();
} else if (tag.equals(TAG_RELAY_MESSAGE)) {
showProgressBar(false);
if (code == 0) {
// Message.MessageObject item = new Message.MessageObject(respanse.getJSONObject("data"));
// UsersListFragment.ReadedUserId.setReadedUser(item.friend.global_key, item);
showMiddleToast("发送成功");
finish();
} else {
showErrorMsg(code, respanse);
}
} else if (tag.equals(statUrl)) {
showProgressBar(false);
hideProgressDialog();
if (code == 0) {
JSONArray json = respanse.optJSONArray("data");
for (int i = 0; i < json.length(); ++i) {
UserObject userObject = new UserObject(json.getJSONObject(i));
mData.add(userObject);
}
Collections.sort(mData);
mSearchData = new ArrayList<>(mData);
adapter.notifyDataSetChanged();
} else {
showErrorMsg(code, respanse);
}
}
}
public enum Friend {
Follow, Fans
}
public static class UserParams implements Serializable {
public UserObject mUser;
private Friend mType;
public UserParams(UserObject user, Friend mType) {
this.mUser = user;
this.mType = mType;
}
public String getName() {
return mUser.name;
}
public boolean isFans() {
return mType == Friend.Fans;
}
}
static class ViewHolder {
ImageView icon;
TextView name;
CheckBox mutual;
TextView divideTitle;
}
class UserAdapter extends BaseAdapter implements SectionIndexer, StickyListHeadersAdapter {
private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private ArrayList<String> mSectionTitle = new ArrayList<>();
private ArrayList<Integer> mSectionId = new ArrayList<>();
public void initSection() {
mSectionTitle.clear();
mSectionId.clear();
if (mData.size() > 0) {
String lastLetter = "";
for (int i = 0; i < mData.size(); ++i) {
UserObject item = mData.get(i);
if (!item.getFirstLetter().equals(lastLetter)) {
lastLetter = item.getFirstLetter();
mSectionTitle.add(item.getFirstLetter());
mSectionId.add(i);
}
}
}
}
@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(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.activity_users_list_item, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.mutual = (CheckBox) convertView.findViewById(R.id.followMutual);
if (hideFollowButton) {
holder.mutual.setVisibility(View.INVISIBLE);
}
holder.divideTitle = (TextView) convertView.findViewById(R.id.divideTitle);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final UserObject data = mSearchData.get(position);
if (isSection(position)) {
holder.divideTitle.setVisibility(View.VISIBLE);
holder.divideTitle.setText(data.getFirstLetter());
} else {
holder.divideTitle.setVisibility(View.GONE);
}
holder.name.setText(data.name);
iconfromNetwork(holder.icon, data.avatar);
if (!hideFollowButton) {
int drawableId = data.follow ? R.drawable.checkbox_fans : R.drawable.checkbox_follow;
holder.mutual.setButtonDrawable(drawableId);
holder.mutual.setChecked(data.followed);
holder.mutual.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestParams params = new RequestParams();
params.put("users", data.global_key);
if (((CheckBox) v).isChecked()) {
postNetwork(HOST_FOLLOW, params, HOST_FOLLOW, position, null);
} else {
postNetwork(HOST_UNFOLLOW, params, HOST_UNFOLLOW, position, null);
}
}
});
}
return convertView;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
initSection();
}
private boolean isSection(int pos) {
if (getCount() == 0) {
return true;
}
if (pos == 0) {
return true;
}
String currentItem = mData.get(pos).getFirstLetter();
String preItem = mData.get(pos - 1).getFirstLetter();
return !currentItem.equals(preItem);
}
@Override
public int getPositionForSection(int section) {
// If there is no item for current section, previous section will be selected
for (int i = section; i >= 0; i--) {
for (int j = 0; j < getCount(); j++) {
if (i == 0) {
// For numeric section
for (int k = 0; k <= 9; k++) {
if (StringMatcher.match(((UserObject) getItem(j)).getFirstLetter().toUpperCase(), String.valueOf(k)))
return j;
}
} else {
if (StringMatcher.match(((UserObject) getItem(j)).getFirstLetter().toUpperCase(), String.valueOf(mSections.charAt(i))))
return j;
}
}
}
return 0;
}
@Override
public int getSectionForPosition(int position) {
return 0;
}
@Override
public Object[] getSections() {
String[] sections = new String[mSections.length()];
for (int i = 0; i < mSections.length(); i++)
sections[i] = String.valueOf(mSections.charAt(i));
return sections;
}
@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
HeaderViewHolder holder;
if (convertView == null) {
holder = new HeaderViewHolder();
convertView = getLayoutInflater().inflate(R.layout.fragment_project_dynamic_list_head, parent, false);
holder.mHead = (TextView) convertView.findViewById(R.id.head);
convertView.setTag(holder);
} else {
holder = (HeaderViewHolder) convertView.getTag();
}
holder.mHead.setText(mSectionTitle.get(getSectionForPosition(position)));
return convertView;
}
@Override
public long getHeaderId(int i) {
return getSectionForPosition(i);
}
class HeaderViewHolder {
TextView mHead;
}
}
}