public class SpectatorView extends ConstraintLayout {
private ImageView ivArrowLeft;
private RecyclerView rvSpectator;
private ImageView ivArrowRight;
private SpectatorAdapter adapter;
private LinearLayoutManager linearLayoutManager;
private List<MeetingUserInfo> datas;
private int firstVisiblePos;
private int lastVisiblePos;
private OnItemLongClickListener listener;
public SpectatorView(@NonNull @NotNull Context context, @Nullable @org.jetbrains.annotations.Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
}
private void initView(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.layout_spectator, this);
ivArrowLeft = view.findViewById(R.id.iv_arrow_left);
rvSpectator = view.findViewById(R.id.rv_spectator);
ivArrowRight = view.findViewById(R.id.iv_arrow_right);
linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
rvSpectator.setLayoutManager(linearLayoutManager);
rvSpectator.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL_LIST, R.drawable.shape_recyc_hor_divider_16dp));
RecycleViewScrollListener scrollListener = new RecycleViewScrollListener(LinearLayoutManager.HORIZONTAL);
scrollListener.setOnScrollStateListener(isScrolling -> {
if (isScrolling) {
refreshArrowVisible();
}
});
rvSpectator.addOnScrollListener(scrollListener);
datas = new ArrayList<>();
adapter = new SpectatorAdapter();
rvSpectator.setAdapter(adapter);
adapter.setOnLongClickListener((view1, userId, x, y) -> {
if (null != listener) listener.onItemLongClick(view1, userId, x, y);
});
}
public void addUser(String userId) {
if (!isExistUser(userId)) {
MeetingUserInfo userInfo = new MeetingUserInfo();
userInfo.setUserId(userId);
datas.add(userInfo);
if (datas.size() == 1) {
adapter.setData(datas);
} else {
adapter.notifyDataSetChanged();
}
refreshArrowVisible();
}
}
public void removeUser(String userId) {
if (isExistUser(userId)) {
datas.remove(getUser(userId));
adapter.notifyDataSetChanged();
refreshArrowVisible();
}
}
public void removeUser(String userId, int position) {
if (isExistUser(userId)) {
datas.remove(position);
adapter.notifyDataSetChanged();
refreshArrowVisible();
}
}
public void updateUser(String userId) {
if (isExistUser(userId)) {
MeetingUserInfo userInfo = getUser(userId);
userInfo.setName(MeetingManager.getInstance().getUser(userId).getName());
userInfo.setAvatarUrl(MeetingManager.getInstance().getUser(userId).getAvatarUrl());
int position = datas.indexOf(userInfo);
adapter.notifyItemChanged(position);
}
}
private void refreshArrowVisible() {
rvSpectator.post(() -> {
firstVisiblePos = linearLayoutManager.findFirstVisibleItemPosition();
lastVisiblePos = linearLayoutManager.findLastVisibleItemPosition();
ivArrowLeft.setVisibility(firstVisiblePos > 0 ? View.VISIBLE : View.GONE);
ivArrowRight.setVisibility(lastVisiblePos == datas.size() - 1 ? View.GONE : View.VISIBLE);
});
}
public void replace(String oldUserId, String newUserId, boolean isSuccess) {
MeetingUserInfo userInfo = getUser(oldUserId);
if (null != userInfo) {
int position = getUserPosition(oldUserId);
userInfo.setVisible(true);
if (isSuccess) {
userInfo.setUserId(newUserId);
userInfo.setName(MeetingManager.getInstance().getUser(newUserId).getName());
userInfo.setAvatarUrl(MeetingManager.getInstance().getUser(newUserId).getAvatarUrl());
}
adapter.notifyItemChanged(position);
}
}
public boolean isExistUser(String userId) {
for (int i = 0; i < datas.size(); i++) {
if (userId.equals(datas.get(i).getUserId())) {
return true;
}
}
return false;
}
public MeetingUserInfo getUser(String userId) {
for (int i = 0; i < datas.size(); i++) {
if (userId.equals(datas.get(i).getUserId())) {
return datas.get(i);
}
}
return null;
}
public int getUserPosition(String userId) {
for (int i = 0; i < datas.size(); i++) {
if (userId.equals(datas.get(i).getUserId())) {
return i;
}
}
return -1;
}
public List<MeetingUserInfo> getData() {
return datas;
}
public void setActiveVoice(String userId, boolean isMaxVoice) {
if (isMaxVoice) {
for (int i = 0; i < datas.size(); i++) {
datas.get(i).setMaxVoice(userId.equals(datas.get(i).getUserId()));
}
} else {
for (int i = 0; i < datas.size(); i++) {
datas.get(i).setMaxVoice(false);
}
}
adapter.notifyDataSetChanged();
}
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
this.listener = listener;
}
public interface OnItemLongClickListener {
void onItemLongClick(View view, String userId, int x, int y);
}
}