From 1d8ab811bfe21a5b72562928a54e1c8fd84f3141 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 2 Sep 2021 16:19:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=88=BF=E9=97=B4=E5=86=85?= =?UTF-8?q?=E8=B6=85=E7=AE=A1=E6=9D=83=E9=99=90=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/ButtonItemFactory.java | 26 ++++----- .../erban/avroom/activity/AVRoomActivity.java | 1 + .../activity/RoomManagerListActivity.java | 2 +- .../avroom/activity/RoomSettingActivity.java | 19 ++++--- .../avroom/presenter/AvRoomPresenter.java | 36 +++++++++++-- .../presenter/RoomManagerPresenter.java | 54 +++++++++++++------ .../manager/AvRoomDataManager.java | 52 +++++++++++++++++- .../room/model/AvRoomModel.java | 23 ++++---- .../room/model/RoomBaseModel.java | 1 + .../room/model/inteface/IAvRoomModel.java | 3 +- .../util/SAdminOptUtil.java | 4 +- 11 files changed, 165 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java b/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java index ad56417b7..e64e59cfd 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java @@ -120,13 +120,15 @@ public class ButtonItemFactory { boolean no_mark_manager = false; //黑名单 boolean mart_black = false; + boolean isTargetRoomAdmin = AvRoomDataManager.get().isRoomAdmin(account); boolean isTargetRoomOwner = AvRoomDataManager.get().isRoomOwner(account); + boolean isTargetSuperAdmin = AvRoomDataManager.get().isSuperAdmin(account); //资料卡片需要房间操作的按钮,不去判断是否在房间内 - if (AvRoomDataManager.get().isRoomOwner()) { + if (AvRoomDataManager.get().isRoomOwner() || AvRoomDataManager.get().isSuperAdmin()) { //房主操作 //点击不是自己 - if (isNeedRoomItem) { + if (isNeedRoomItem && !isTargetSuperAdmin) { //提出房间 kickOutRoom = true; //管理员 @@ -142,7 +144,7 @@ public class ButtonItemFactory { } else if (AvRoomDataManager.get().isRoomAdmin()) { //管理员操作 //不是自己 - if (!isTargetRoomAdmin && !isTargetRoomOwner) { + if (!isTargetRoomAdmin && !isTargetRoomOwner && !isTargetSuperAdmin) { //非房主或管理员 if (isNeedRoomItem) { //踢出房间 @@ -151,10 +153,8 @@ public class ButtonItemFactory { mart_black = true; } } - } else { - //游客操作 - //不是自己 } + if (gift) { if (!SuperAdminUtil.isSuperAdmin()) { buttonItems.add(createSendGiftItem(context, uid, isInRoom, listener)); @@ -165,10 +165,7 @@ public class ButtonItemFactory { } // 私聊 buttonItems.add(createPrivateChatItem(context, account, isInRoom)); - //装扮 - /* if (!SuperAdminUtil.isSuperAdmin()) { - buttonItems.add(createSendDecorationItem(context, uid)); - }*/ + //关注 buttonItems.add(createAttentItem()); @@ -408,7 +405,12 @@ public class ButtonItemFactory { if (mark) { StatisticManager.Instance().onEvent(StatisticsProtocol.Event.data_card_set_admin_click, "资料卡片-设置管理员"); } - IMNetEaseManager.get().markManagerListBySdk(roomId, account, mark, null); + if (AvRoomDataManager.get().isSuperAdmin()) { + AvRoomModel.get().markManager(Long.parseLong(account), mark).subscribe(); + } else { + IMNetEaseManager.get().markManagerListBySdk(roomId, account, mark, null); + + } }); } @@ -426,7 +428,7 @@ public class ButtonItemFactory { () -> { Single single; - if (SuperAdminUtil.isSuperAdmin()) { + if (SuperAdminUtil.isSuperAdmin() || AvRoomDataManager.get().isSuperAdmin()) { //超管拉黑 single = AvRoomModel.get().markBlack(JavaUtil.str2long(account)); SuperAdminModel superAdminModel = new SuperAdminModel(); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java index 7c350cfbf..3b17af312 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java @@ -1138,6 +1138,7 @@ public class AVRoomActivity extends BaseMvpActivity { /** * 进入云信聊天室回调 */ + @SuppressLint("CheckResult") public void enterRoom(RoomInfo roomInfo, int fromType, String fromNick, String fromUid) { if (roomInfo == null) { if (getMvpView() != null) @@ -132,16 +136,15 @@ public class AvRoomPresenter extends BaseMvpPresenter { StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_LIST_TYPE, "区分房间类型:" + roomInfo.getRoomTypeLable()); - Observable enterRoomObservable = mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid); - - Disposable subscribe = enterRoomObservable.flatMap(this::dealServerMicInfo) + mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid) + .flatMap(this::dealServerMicInfo) .map(this::dealMicMemberFromIMNet) .flatMap(this::dealMicChatRoomMemberFromIMNet) .compose(bindUntilEvent(PresenterEvent.DESTROY)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(roomQueueInfoSparseArray -> { long uid = AuthModel.get().getCurrentUid(); - AudioEngineManager.get().startRtcEngine(uid,roomInfo.getAudioSdkType()); + AudioEngineManager.get().startRtcEngine(uid, roomInfo.getAudioSdkType()); if (getMvpView() != null) { getMvpView().enterRoomSuccess(); } @@ -429,6 +432,31 @@ public class AvRoomPresenter extends BaseMvpPresenter { mAvRoomModel.getNormalChatMember(String.valueOf(roomInfo.getRoomId()), currentUid); } + /** + * 获取房间内固定成员列表 + */ + @SuppressLint("CheckResult") + public void getSuperAdminList() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return; + } + HallModel.get().getRoomSuperAdminList(roomInfo.getUid()) + .compose(bindToLifecycle()) + .toObservable() + .flatMap(Observable::fromIterable) + .map(superAdminInfo -> { + ChatRoomMember chatRoomMember = new ChatRoomMember(); + chatRoomMember.setAccount(String.valueOf(superAdminInfo.getUid())); + chatRoomMember.setAvatar(superAdminInfo.getAvatar()); + chatRoomMember.setNick(superAdminInfo.getNick()); + return chatRoomMember; + }) + .toList() + .subscribe(chatRoomMembers -> AvRoomDataManager.get().setAllRoomSuperAdminList(chatRoomMembers)); + } + + private void startGetOnlineMemberNumberJob() { Observable.interval(1, 10, TimeUnit.SECONDS, Schedulers.from(ThreadPoolManager.instance().getScheduleExecutor())) .subscribe(new Observer() { diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java index fadf3b494..2c18d34fe 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java @@ -3,10 +3,13 @@ package com.yizhuan.erban.avroom.presenter; import android.annotation.SuppressLint; import android.text.TextUtils; +import com.netease.nim.uikit.common.util.C; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; import com.yizhuan.erban.avroom.view.IRoomManagerView; import com.yizhuan.erban.base.BaseMvpPresenter; +import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; +import com.yizhuan.xchat_android_core.room.model.AvRoomModel; import com.yizhuan.xchat_android_core.room.model.RoomBaseModel; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; @@ -22,6 +25,7 @@ import java.util.Map; import io.reactivex.Single; import io.reactivex.SingleSource; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; @@ -62,6 +66,9 @@ public class RoomManagerPresenter extends BaseMvpPresenter { if (info != null && info.isSuperAdmin()) { map.put(String.valueOf(info.getUid()), true); } + if (info != null && AvRoomDataManager.get().isSuperAdmin(String.valueOf(info.getUid()))) { + map.put(String.valueOf(info.getUid()), true); + } } Iterator iterator = paramList.iterator(); while (iterator.hasNext()) { @@ -78,7 +85,6 @@ public class RoomManagerPresenter extends BaseMvpPresenter { .observeOn(AndroidSchedulers.mainThread()) .compose(this.bindUntilEvent(PresenterEvent.DESTROY)) .subscribe(chatRoomMemberList -> { - AvRoomDataManager.get().mRoomManagerList = chatRoomMemberList; if (getMvpView() != null) { getMvpView().queryManagerListSuccess(chatRoomMemberList); } @@ -95,23 +101,41 @@ public class RoomManagerPresenter extends BaseMvpPresenter { * * @param roomId * @param account - * @param mark true:设置管理员 ,false:移除管理员 */ - public void markManagerList(long roomId, String account, boolean mark) { - mRoomBaseModel.markManagerList(roomId, account, mark, new CallBack() { - @Override - public void onSuccess(ChatRoomMember data) { - if (getMvpView() != null) { - getMvpView().markManagerListSuccess(data); + @SuppressLint("CheckResult") + public void removeManagerList(long roomId, String account) { + if (AvRoomDataManager.get().isSuperAdmin()) { + AvRoomModel.get().markManager(Long.parseLong(account),false).subscribe( + s -> { + if (getMvpView() != null) { + ChatRoomMember chatRoomMember = new ChatRoomMember(); + chatRoomMember.setAccount(account); + getMvpView().markManagerListSuccess(chatRoomMember); + } + }, + e -> { + if (getMvpView() != null) { + getMvpView().markManagerListFail(-1, e.getMessage()); + } + } + ); + } else { + mRoomBaseModel.markManagerList(roomId, account, false, new CallBack() { + @Override + public void onSuccess(ChatRoomMember data) { + if (getMvpView() != null) { + getMvpView().markManagerListSuccess(data); + } } - } - @Override - public void onFail(int code, String error) { - if (getMvpView() != null) { - getMvpView().markManagerListFail(code, error); + @Override + public void onFail(int code, String error) { + if (getMvpView() != null) { + getMvpView().markManagerListFail(code, error); + } } - } - }); + }); + } + } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index 05a30e91d..1b3997a0e 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -7,6 +7,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.netease.nimlib.sdk.NIMChatRoomSDK; @@ -90,6 +91,12 @@ public final class AvRoomDataManager { * 房间所有人员 */ public List mRoomAllMemberList; + + /** + * 房间所有超管 + */ + @NonNull + public final List roomSuperAdminList = new ArrayList<>(); /** * 麦序位置信息:对应的位置,坑位信息(用户成员,坑位状态) */ @@ -655,6 +662,47 @@ public final class AvRoomDataManager { return isRoomAdmin(account) || isRoomOwner(account); } + public void setAllRoomSuperAdminList(List data) { + roomSuperAdminList.clear(); + roomSuperAdminList.addAll(data); + } + + public void addRoomSuperAdmin(ChatRoomMember member) { + roomSuperAdminList.add(member); + } + + public void removeRoomSuperAdmin(String account) { + for (int i = 0; i < roomSuperAdminList.size(); i++) { + ChatRoomMember chatRoomMember = roomSuperAdminList.get(i); + if (chatRoomMember.getAccount().equals(account)) { + roomSuperAdminList.remove(i); + break; + } + } + } + + /** + * 自己是否是房间超管 + * + * @return - + */ + public boolean isSuperAdmin() { + return isSuperAdmin(String.valueOf(AuthModel.get().getCurrentUid())); + } + + /** + * 是否是房间超管 + * + * @return - + */ + public boolean isSuperAdmin(String account) { + if (roomSuperAdminList.isEmpty()) return false; + for (ChatRoomMember chatRoomMember : roomSuperAdminList) { + if (chatRoomMember.getAccount().equals(account)) return true; + } + return false; + } + /** * 判断坑位是否被锁了 */ @@ -842,7 +890,7 @@ public final class AvRoomDataManager { * @return */ public boolean isQueuingMicro() { - return isRoomInQueuingMicMode(mCurrentRoomInfo); + return isRoomInQueuingMicMode(mCurrentRoomInfo); } /** @@ -854,7 +902,7 @@ public final class AvRoomDataManager { public boolean isRoomInQueuingMicMode(RoomInfo roomInfo) { if (roomInfo == null) return false; return roomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE - ||roomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE; + || roomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE; } public void addManagerMember(ChatRoomMember member) { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java index d0f502bb0..6c6be9e91 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java @@ -444,9 +444,9 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { /** * 该接口每次最多返回200个数据,房间黑名单过多会导致200个不够用,做个分页加载(云信房间固定成员最多为1000个) * - * @param roomId 房间id + * @param roomId 房间id * @param currentUid 当前用户id - * @param time 固定成员列表用updateTime + * @param time 固定成员列表用updateTime */ private void loadNormalChatMember(String roomId, final long currentUid, long time) { NIMChatRoomSDK.getChatRoomService() @@ -540,9 +540,9 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { * 设置管理员/拉黑 * 1: 设置为管理员;2:设置普通等级用户;-1:设为黑名单用户;-2:设为禁言用户 */ - private Single setRole(long targetUid, int opt, String notifyExt) { + private Single setRole(long targetUid, int opt, boolean isSet, String notifyExt) { return mRoomService.setChatRoomRole(AvRoomDataManager.get().getRoomUid(), - targetUid, opt, notifyExt) + targetUid, opt, isSet, notifyExt) .compose(RxHelper.handleIgnoreData()); } @@ -556,12 +556,7 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { KickOutExtBean bean = new KickOutExtBean(); bean.setRole(1); bean.setHandleUid(String.valueOf(AuthModel.get().getCurrentUid())); - return setRole(targetUid, -1, new Gson().toJson(bean)); - } - - @Override - public Single markManager(long targetUid) { - return setRole(targetUid, 1, null); + return setRole(targetUid, -1, true, new Gson().toJson(bean)); } /** @@ -571,9 +566,15 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { */ @Override public Single removeBlack(long targetUid) { - return setRole(targetUid, 2, null); + return setRole(targetUid, 1, false, null); } + @Override + public Single markManager(long targetUid,boolean isSet) { + return setRole(targetUid, 1, isSet, null); + } + + @Override public Single>> getPartyRoomList(long uid) { return mRoomService.getPartyRoomList(uid).compose(RxHelper.handleSchedulers()); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java index 49c8d8156..b2a0d2920 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java @@ -1011,6 +1011,7 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { Single> setChatRoomRole(@Query("roomUid") long roomUid, @Query("targetUid") long targetUid, @Query("opt") int opt, + @Query("isSet") boolean isSet, @Query("notifyExt") String notifyExt); /** diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java index 42b0a318a..ff31f6a12 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java @@ -115,8 +115,9 @@ public interface IAvRoomModel extends IModel { /** * 通过服务器接口设置为管理员 * @param targetUid 被拉黑的uid + * @param isSet true 设置管理, false 取消管理 */ - Single markManager(long targetUid); + Single markManager(long targetUid,boolean isSet); /** * 通过服务器接口移除拉黑 diff --git a/core/src/model_super_admin/java/com.yizhuan.xchat_android_core.super_admin/util/SAdminOptUtil.java b/core/src/model_super_admin/java/com.yizhuan.xchat_android_core.super_admin/util/SAdminOptUtil.java index 5399db9b0..d0d03b81c 100644 --- a/core/src/model_super_admin/java/com.yizhuan.xchat_android_core.super_admin/util/SAdminOptUtil.java +++ b/core/src/model_super_admin/java/com.yizhuan.xchat_android_core.super_admin/util/SAdminOptUtil.java @@ -56,7 +56,7 @@ public class SAdminOptUtil { Single single; if (!AvRoomDataManager.get().isRoomAdmin()) { //将超管设置为房间管理员 - single = AvRoomModel.get().markManager(AuthModel.get().getCurrentUid()); + single = AvRoomModel.get().markManager(AuthModel.get().getCurrentUid(),true); } else { single = Single.just(""); } @@ -91,7 +91,7 @@ public class SAdminOptUtil { * @return - */ public static boolean kickOutRoomAdmin(String kickUid, String nick) { - if (!SuperAdminUtil.isSuperAdmin()) { + if (!SuperAdminUtil.isSuperAdmin() && !AvRoomDataManager.get().isSuperAdmin()) { return false; } if (!AvRoomDataManager.get().isRoomAdmin(kickUid)) {