package com.netease.nim.uikit.team.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; import com.netease.nim.uikit.NimUIKit; import com.netease.nim.uikit.R; import com.netease.nim.uikit.cache.SimpleCallback; import com.netease.nim.uikit.cache.TeamDataCache; import com.netease.nim.uikit.common.activity.UI; import com.netease.nim.uikit.common.adapter.TAdapterDelegate; import com.netease.nim.uikit.common.adapter.TViewHolder; import com.netease.nim.uikit.model.ToolBarOptions; import com.netease.nim.uikit.team.adapter.TeamMemberAdapter; import com.netease.nim.uikit.team.adapter.TeamMemberAdapter.TeamMemberItem; import com.netease.nim.uikit.team.helper.TeamHelper; import com.netease.nim.uikit.team.ui.TeamInfoGridView; import com.netease.nim.uikit.team.viewholder.TeamMemberHolder; import com.netease.nim.uikit.uinfo.UserInfoHelper; import com.netease.nim.uikit.uinfo.UserInfoObservable; import com.netease.nimlib.sdk.team.constant.TeamMemberType; import com.netease.nimlib.sdk.team.model.Team; import com.netease.nimlib.sdk.team.model.TeamMember; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 群成员列表界面 * Created by hzxuwen on 2015/3/17. */ public class AdvancedTeamMemberActivity extends UI implements TAdapterDelegate, TeamMemberAdapter.RemoveMemberCallback, TeamMemberAdapter.AddMemberCallback, TeamMemberHolder.TeamMemberHolderEventListener { // constant private static final String EXTRA_ID = "EXTRA_ID"; public static final String EXTRA_DATA = "EXTRA_DATA"; // data source private String teamId; private List<TeamMember> members; private TeamMemberAdapter adapter; private List<String> memberAccounts; private List<TeamMemberAdapter.TeamMemberItem> dataSource; private String creator; private List<String> managerList; // state private boolean isSelfAdmin = false; private boolean isSelfManager = false; private boolean isMemberChange = false; private UserInfoObservable.UserInfoObserver userInfoObserver; public static void startActivityForResult(Activity context, String tid, int resCode) { Intent intent = new Intent(); intent.putExtra(EXTRA_ID, tid); intent.setClass(context, AdvancedTeamMemberActivity.class); context.startActivityForResult(intent, resCode); } /** * *********************************lifeCycle******************************************* */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nim_team_member_grid_layout); ToolBarOptions options = new ToolBarOptions(); options.titleId = R.string.team_member; setToolBar(R.id.toolbar, options); parseIntentData(); loadTeamInfo(); initAdapter(); findViews(); registerUserInfoChangedObserver(true); requestData(); } @Override protected void onDestroy() { registerUserInfoChangedObserver(false); super.onDestroy(); } @Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra(EXTRA_DATA, isMemberChange); setResult(Activity.RESULT_OK, intent); super.onBackPressed(); } private void parseIntentData() { teamId = getIntent().getStringExtra(EXTRA_ID); } private void loadTeamInfo() { Team team = TeamDataCache.getInstance().getTeamById(teamId); if (team != null) { creator = team.getCreator(); } } private void findViews() { TeamInfoGridView teamInfoGridView = (TeamInfoGridView) findViewById(R.id.team_member_grid); teamInfoGridView.setSelector(R.color.transparent); teamInfoGridView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == 0) { adapter.notifyDataSetChanged(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); teamInfoGridView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP && adapter.getMode() == TeamMemberAdapter.Mode.DELETE) { adapter.setMode(TeamMemberAdapter.Mode.NORMAL); adapter.notifyDataSetChanged(); return true; } return false; } }); teamInfoGridView.setAdapter(adapter); } private void initAdapter() { memberAccounts = new ArrayList<>(); members = new ArrayList<>(); dataSource = new ArrayList<>(); managerList = new ArrayList<>(); adapter = new TeamMemberAdapter(this, dataSource, this, this, this); adapter.setEventListener(this); } private void updateTeamMember(final List<TeamMember> members) { if (members != null && members.isEmpty()) { return; } addTeamMembers(members, true); } private void addTeamMembers(final List<TeamMember> m, boolean clear) { if (m == null || m.isEmpty()) { return; } if (clear) { this.members.clear(); this.memberAccounts.clear(); } // add if (this.members.isEmpty()) { this.members.addAll(m); } else { for (TeamMember tm : m) { if (!this.memberAccounts.contains(tm.getAccount())) { this.members.add(tm); } } } // sort Collections.sort(this.members, TeamHelper.teamMemberComparator); // accounts, manager, creator this.memberAccounts.clear(); this.managerList.clear(); for (TeamMember tm : members) { initManagerList(tm); if (tm.getAccount().equals(NimUIKit.getAccount())) { if (tm.getType() == TeamMemberType.Manager) { isSelfManager = true; } else if (tm.getType() == TeamMemberType.Owner) { isSelfAdmin = true; creator = NimUIKit.getAccount(); } } this.memberAccounts.add(tm.getAccount()); } updateTeamMemberDataSource(); } /** * 初始化管理员列表 * * @param tm 群成员 */ private void initManagerList(TeamMember tm) { if (tm.getType() == TeamMemberType.Manager) { managerList.add(tm.getAccount()); } } private void updateTeamMemberDataSource() { if (members.size() <= 0) { return; } dataSource.clear(); // member item for (String account : memberAccounts) { dataSource.add(new TeamMemberItem(TeamMemberAdapter.TeamMemberItemTag .NORMAL, teamId, account, initMemberIdentity(account))); } // refresh adapter.notifyDataSetChanged(); } /** * 初始化成员身份 * * @param account 帐号 * @return String */ private String initMemberIdentity(String account) { String identity; if (creator.equals(account)) { identity = TeamMemberHolder.OWNER; } else if (managerList.contains(account)) { identity = TeamMemberHolder.ADMIN; } else { identity = null; } return identity; } @Override public void onAddMember() { } @Override public void onRemoveMember(String account) { } /** * ******************************加载数据******************************* */ private void requestData() { TeamDataCache.getInstance().fetchTeamMemberList(teamId, new SimpleCallback<List<TeamMember>>() { @Override public void onResult(boolean success, List<TeamMember> members) { if (success && members != null && !members.isEmpty()) { updateTeamMember(members); } } }); } /** * ************************ TAdapterDelegate ************************** */ @Override public int getViewTypeCount() { return 1; } @Override public Class<? extends TViewHolder> viewHolderAtPosition(int position) { return TeamMemberHolder.class; } @Override public boolean enabled(int position) { return false; } @Override public void onHeadImageViewClick(String account) { AdvancedTeamMemberInfoActivity.startActivityForResult(AdvancedTeamMemberActivity.this, account, teamId); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case AdvancedTeamMemberInfoActivity.REQ_CODE_REMOVE_MEMBER: boolean isSetAdmin = data.getBooleanExtra(AdvancedTeamMemberInfoActivity.EXTRA_ISADMIN, false); boolean isRemoveMember = data.getBooleanExtra(AdvancedTeamMemberInfoActivity.EXTRA_ISREMOVE, false); String account = data.getStringExtra(EXTRA_ID); refreshAdmin(isSetAdmin, account); if (isRemoveMember) { removeMember(account); } break; default: break; } } } /** * 移除群成员成功后,删除列表中的群成员 */ private void removeMember(String account) { if (TextUtils.isEmpty(account)) { return; } for (TeamMemberItem item : dataSource) { if (item.getAccount() != null && item.getAccount().equals(account)) { dataSource.remove(item); isMemberChange = true; break; } } adapter.notifyDataSetChanged(); } /** * 是否设置了管理员刷新界面 * * @param isSetAdmin 是否设置为管理员 * @param account 帐号 */ private void refreshAdmin(boolean isSetAdmin, String account) { if (isSetAdmin) { if (managerList.contains(account)) { return; } managerList.add(account); isMemberChange = true; updateTeamMemberDataSource(); } else { if (managerList.contains(account)) { managerList.remove(account); isMemberChange = true; updateTeamMemberDataSource(); } } } private void registerUserInfoChangedObserver(boolean register) { if (register) { if (userInfoObserver == null) { userInfoObserver = new UserInfoObservable.UserInfoObserver() { @Override public void onUserInfoChanged(List<String> accounts) { adapter.notifyDataSetChanged(); } }; } UserInfoHelper.registerObserver(userInfoObserver); } else { UserInfoHelper.unregisterObserver(userInfoObserver); } } }