From afdf3093a18742f2f67f0170f778945a47665a46 Mon Sep 17 00:00:00 2001 From: max Date: Wed, 26 Jun 2024 20:34:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E8=81=9A=E4=BC=9A?= =?UTF-8?q?=E6=88=BF=E3=80=81=E7=8B=82=E6=AC=A2=E6=88=BF=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/activity/RoomTypeSwitchActivity.kt | 19 ++- .../avroom/adapter/BaseMicroViewAdapter.java | 8 +- .../avroom/dialog/PKSelectPeopleDialog.java | 5 +- .../app/avroom/dialog/RoomGameplayDialog.kt | 11 +- .../avroom/dialog/RoomOperationDialog.java | 17 ++- .../avroom/fragment/HomePartyFragment.java | 2 +- .../app/avroom/presenter/AvRoomPresenter.java | 52 +------ .../chwl/app/avroom/widget/BottomView.java | 4 +- .../res/drawable-xxhdpi/room_ic_notice.png | Bin 0 -> 1438 bytes .../drawable-xxhdpi/room_menu_ic_more_new.png | Bin 0 -> 3305 bytes app/src/main/res/values-ar/strings.xml | 3 +- app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 3 +- .../chwl/core/manager/AvRoomDataManager.java | 25 +++- .../chwl/core/manager/IMNetEaseManager.java | 38 ++++- .../chwl/core/manager/RoomMicQueueModel.kt | 130 ++++++++++++++++++ .../chwl/core/room/model/RoomBaseModel.java | 12 +- .../core/room/queue/bean/MicMemberInfo.java | 8 ++ .../java/com/example/lib_utils/log/LogUtil.kt | 1 + 19 files changed, 260 insertions(+), 79 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/room_ic_notice.png create mode 100644 app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png create mode 100644 core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt diff --git a/app/src/main/java/com/chwl/app/avroom/activity/RoomTypeSwitchActivity.kt b/app/src/main/java/com/chwl/app/avroom/activity/RoomTypeSwitchActivity.kt index 5f5193374..28febc308 100644 --- a/app/src/main/java/com/chwl/app/avroom/activity/RoomTypeSwitchActivity.kt +++ b/app/src/main/java/com/chwl/app/avroom/activity/RoomTypeSwitchActivity.kt @@ -39,7 +39,7 @@ class RoomTypeSwitchActivity : BaseViewBindingActivity type) { + dialogManager.showOkCancelDialog( + ResUtil.getString(R.string.switch_room_type_tips), + ResUtil.getString(R.string.login_fragment_adduserinfofragment_04) + ) { + requestSwitchRoomType(type) + } + } else { + requestSwitchRoomType(type) + } + } + @SuppressLint("CheckResult") - private fun switchRoomType(type: Int) { + private fun requestSwitchRoomType(type: Int) { + dialogManager.showProgressDialog(context) OpenRoomHelper.updateRoomInfoRx( AvRoomDataManager.get().mCurrentRoomInfo, type, diff --git a/app/src/main/java/com/chwl/app/avroom/adapter/BaseMicroViewAdapter.java b/app/src/main/java/com/chwl/app/avroom/adapter/BaseMicroViewAdapter.java index a25390133..fe90393f9 100644 --- a/app/src/main/java/com/chwl/app/avroom/adapter/BaseMicroViewAdapter.java +++ b/app/src/main/java/com/chwl/app/avroom/adapter/BaseMicroViewAdapter.java @@ -277,7 +277,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter headWearObserver = headWearValue -> { if (ivCharmLevelTag == null) return; - ivCharmLevelTag.setVisibility(View.GONE); if (headWearValue == 1) { - ivCharmLevelTag.setVisibility(View.VISIBLE); - ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_min)); + ivCharmLevelTag.setVisibility(View.GONE); +// ivCharmLevelTag.setVisibility(View.VISIBLE); +// ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_min)); } else if (headWearValue == 2) { ivCharmLevelTag.setVisibility(View.VISIBLE); ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_max)); diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/PKSelectPeopleDialog.java b/app/src/main/java/com/chwl/app/avroom/dialog/PKSelectPeopleDialog.java index 903ed2f38..27285c7e6 100644 --- a/app/src/main/java/com/chwl/app/avroom/dialog/PKSelectPeopleDialog.java +++ b/app/src/main/java/com/chwl/app/avroom/dialog/PKSelectPeopleDialog.java @@ -95,7 +95,10 @@ public class PKSelectPeopleDialog extends BaseDialog implements View.OnClickList keys[i] = micQueue.keyAt(i); } Arrays.sort(keys); - for (int i = 0; i < keys.length; i++) { + for (int i = 0; i < micEntityList.size(); i++) { + if (i >= micQueue.size()) { + continue; + } RoomQueueInfo roomQueueInfo = micQueue.get(keys[i]); MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; if (chatRoomMember != null) { diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/RoomGameplayDialog.kt b/app/src/main/java/com/chwl/app/avroom/dialog/RoomGameplayDialog.kt index d3c959e9a..8ad666f25 100644 --- a/app/src/main/java/com/chwl/app/avroom/dialog/RoomGameplayDialog.kt +++ b/app/src/main/java/com/chwl/app/avroom/dialog/RoomGameplayDialog.kt @@ -25,6 +25,7 @@ import com.chwl.core.auth.AuthModel import com.chwl.core.manager.AvRoomDataManager import com.chwl.core.room.anotherroompk.SingleRoomPKModel import com.chwl.core.room.bean.RoomIcon +import com.chwl.core.room.bean.RoomInfo import com.chwl.core.room.core.RoomDataService import com.chwl.core.room.game.bean.BaiShunGameConfig import com.chwl.core.room.model.AvRoomModel @@ -261,10 +262,7 @@ class RoomGameplayDialog : if (SuperAdminUtil.isSuperAdmin()) { return null } - if (AvRoomDataManager.get().isOpenGame) { - return null - } - if (AvRoomDataManager.get().isSingleRoom) { + if (AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_HOME_PARTY) { return null } val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo @@ -299,10 +297,7 @@ class RoomGameplayDialog : if (SuperAdminUtil.isSuperAdmin()) { return null } - if (AvRoomDataManager.get().isOpenGame) { - return null - } - if (AvRoomDataManager.get().isSingleRoom) { + if (AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_HOME_PARTY) { return null } val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/RoomOperationDialog.java b/app/src/main/java/com/chwl/app/avroom/dialog/RoomOperationDialog.java index 54c05fc05..2c34e2c58 100644 --- a/app/src/main/java/com/chwl/app/avroom/dialog/RoomOperationDialog.java +++ b/app/src/main/java/com/chwl/app/avroom/dialog/RoomOperationDialog.java @@ -288,10 +288,7 @@ public class RoomOperationDialog extends BottomSheetDialog { if (SuperAdminUtil.isSuperAdmin()) { return; } - if (AvRoomDataManager.get().isOpenGame()) { - return; - } - if (AvRoomDataManager.get().isSingleRoom()) { + if (AvRoomDataManager.get().getRoomType() != RoomInfo.ROOMTYPE_HOME_PARTY) { return; } if (AvRoomDataManager.get().isManager() && !AvRoomDataManager.get().isCpRoom()) { @@ -567,6 +564,18 @@ public class RoomOperationDialog extends BottomSheetDialog { if (SuperAdminUtil.isSuperAdmin()) { return; } + if (AvRoomDataManager.get().getRoomType() != RoomInfo.ROOMTYPE_HOME_PARTY + && AvRoomDataManager.get().getRoomType() != RoomInfo.ROOMTYPE_PARTY + && AvRoomDataManager.get().getRoomType() != RoomInfo.ROOMTYPE_REVELRY) { + return; + } + if (AvRoomDataManager.get().isDatingMode()) { + return; + } + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null || roomInfo.getIsPermitRoom() == 1) { + return; + } if (AvRoomDataManager.get().isManager()) { optAdapter.addData(new OptAction(R.drawable.icon_room_type_switch, getContext().getResources().getString(R.string.room_type), () -> RoomTypeSwitchActivity.Companion.start(getContext()))); diff --git a/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java index 266a6b71a..d34c4cff5 100644 --- a/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java @@ -370,7 +370,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe } break; default: - if (!(tempFragment instanceof HomePartyRoomFragment)) { + if (tempFragment == null || !(tempFragment.getClass().getSimpleName().equals(HomePartyRoomFragment.class.getSimpleName()))) { tempFragment = HomePartyRoomFragment.newInstance(); } break; diff --git a/app/src/main/java/com/chwl/app/avroom/presenter/AvRoomPresenter.java b/app/src/main/java/com/chwl/app/avroom/presenter/AvRoomPresenter.java index 360fdb038..4356f3e9c 100644 --- a/app/src/main/java/com/chwl/app/avroom/presenter/AvRoomPresenter.java +++ b/app/src/main/java/com/chwl/app/avroom/presenter/AvRoomPresenter.java @@ -9,6 +9,7 @@ import android.util.SparseArray; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.chwl.core.manager.RoomMicQueueModel; import com.chwl.core.support.room.AudioRoomContext; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -121,11 +122,11 @@ public class AvRoomPresenter extends BaseMvpPresenter { AvRoomDataManager.get().updateServiceRoomInfo(roomInfo); mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid) .flatMap(this::dealServerMicInfo) - .map(this::dealMicMemberFromIMNet) - .flatMap(this::dealMicChatRoomMemberFromIMNet) + .flatMap((Function, ObservableSource>>) roomQueue -> RoomMicQueueModel.INSTANCE.queueMicQueue(roomInfo.getRoomId(),roomQueue)) .compose(bindUntilEvent(PresenterEvent.DESTROY)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(roomQueueInfoSparseArray -> { + AvRoomDataManager.get().replaceMicQueue(roomQueueInfoSparseArray); long uid = AuthModel.get().getCurrentUid(); AudioEngineManager.get().startRtcEngine(uid, roomInfo.getAudioSdkType()); // TODO 临时方案:后续逐步完善整个房间的RoomContext替换计划 @@ -220,52 +221,12 @@ public class AvRoomPresenter extends BaseMvpPresenter { IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.ROOM_EXIT)); } - /** - * 处理网易云信队列上人员的信息 - */ - private Observable> dealMicChatRoomMemberFromIMNet(List accounts) { - if (ListUtils.isListEmpty(accounts)) - return Observable.just(AvRoomDataManager.get().mMicQueueMemberMap); - return IMNetEaseManager.get().fetchRoomMembersByIds(accounts).observeOn(AndroidSchedulers.mainThread()) - .flatMap(chatRoomMembers -> { - for (ChatRoomMember chatRoomMember : chatRoomMembers) { - AvRoomDataManager.get().updateQueueChatRoomMemberExtension(chatRoomMember); - } - return Single.just(AvRoomDataManager.get().mMicQueueMemberMap); - }).toObservable(); - } - - - /** - * 处理网易云信坑位信息 - */ - private List dealMicMemberFromIMNet(List> entries) { - List accounts = new ArrayList<>(); - if (!ListUtils.isListEmpty(entries)) { - JsonParser jsonParser = new JsonParser(); - MicMemberInfo chatRoomMember; - for (Entry entry : entries) { - RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(Integer.parseInt(entry.key)); - if (roomQueueInfo != null) { - JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); - if (valueJsonObj != null) { - chatRoomMember = mGson.fromJson(valueJsonObj, MicMemberInfo.class); - accounts.add(chatRoomMember.getAccount()); - roomQueueInfo.mChatRoomMember = chatRoomMember; - } - AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.valueOf(entry.key), roomQueueInfo); - } - } - } - return accounts; - } - /** * 处理服务端坑位信息 */ @Nullable - private ObservableSource>> dealServerMicInfo(EnterChatRoomResultData enterChatRoomResultData) { + private ObservableSource> dealServerMicInfo(EnterChatRoomResultData enterChatRoomResultData) { AvRoomDataManager.get().mEnterChatRoomResultData = enterChatRoomResultData; if (enterChatRoomResultData == null) return Observable.error(new Throwable(GET_ROOM_FROM_IMNET_ERROR)); @@ -295,11 +256,12 @@ public class AvRoomPresenter extends BaseMvpPresenter { //初始化所有坑位 Map micMapStr = mGson.fromJson(roomMicStr, new TypeToken>() { }.getType()); + SparseArray queue = new SparseArray<>(); for (Map.Entry entry : micMapStr.entrySet()) { - AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.valueOf(entry.getKey()), + queue.put(Integer.valueOf(entry.getKey()), new RoomQueueInfo(mGson.fromJson(entry.getValue(), RoomMicInfo.class), null)); } - return mAvRoomModel.queryRoomMicInfo(roomInfo.getRoomId()); + return Observable.just(queue); } } return Observable.error(new Throwable(GET_ROOM_FROM_IMNET_ERROR)); diff --git a/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java b/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java index 59a80a9bb..fc8cad131 100644 --- a/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java +++ b/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java @@ -57,7 +57,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener { /** * 有新功能,加1 */ - private static final int NEW_OPTION = 1; + private static final int NEW_OPTION = 2; private static final String SH_NEW_OPTION = "sh_new_option"; private BottomViewListenerWrapper wrapper; @@ -157,7 +157,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener { if (newOption == NEW_OPTION) { sendMagic.setImageResource(R.drawable.room_menu_ic_more); } else { - sendMagic.setImageResource(R.drawable.room_menu_ic_more); + sendMagic.setImageResource(R.drawable.room_menu_ic_more_new); } sendMagic.setClickable(true); sendMagic.setOnClickListener(this); diff --git a/app/src/main/res/drawable-xxhdpi/room_ic_notice.png b/app/src/main/res/drawable-xxhdpi/room_ic_notice.png new file mode 100644 index 0000000000000000000000000000000000000000..eac3bb9d4a9028dfb41958afd4c22ca367d25370 GIT binary patch literal 1438 zcmV;P1!4M$P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91LZAZx1ONa40RR91LI3~&0O+lO7XSbS2uVaiRCodHn@emBQ5eTv^?pS| zi6E}jV<93Q5iF3Xka#7^#>%3#U?XB{C1D{RONod_f{?JW(0B%kh*z6bA}A5BjYYMp zlxqF{a<7bWX6DXx&V6ORN_bI#ZA{O7#p%x%AZi6sgo3M2|73M2~Tsz55&j5hN1 z_Vy0I??C8IrBXj_{Eb|F7DNaH7*Bw!VHQ-vXLtk+2-3!}{0$M7!XxN_9+2tS4!2-( z*{eV$XG1gi*+Xuop&+f*`a_^%GvFQsSvMIjg1S$68I_s{cOX~$LB=!CzigDCGL>)w zenD6}Oo3q~F9wwu1P9P&tEL;7G!3Y`VMxh}LGb-yA9R7ql)fLv!zojSOj;|) z+L9E4zz4#1_yQ(VH#r9*R6&ka&;VZD=PUP?Luri}1iT48fXTFGxBz3EPnqjEa38$v z6*nYCX-umGx(q&nmuXD+Z_z|r3Z}ywFqs5wf@-ILah*p}mta&*qxn#%a0D}x^V2ZJ zk>))8!NoOr;Y@U$&)|BEE6sWNfQv2A;Y{TG7kq`x?a;Ew+e2GO)>6*L9q!S zM>re_e(M2l7oBN!dIU!0B8Hl?ui;3|d>8D1!M>S`>!$WOwt-r4U{?*yfD?@emp}t! zDVhe*TE>hke!=?+fe5Pnby(uzL?d@6gdU|m{6$SxJv58`S)du5+#{_9F(iu7v{mM3 z^SNo7w^i{Qa1!2urmjMorf{uIw!#W z1aY*w9{gypq7E@WaUQ!_5rQc78ofT|XlwAd7EZ+M_m8_co|Y-D(Wb;crd3eh+K#p@ zA+)Y<>0`y+#ov)|)14UCwXLr4oB-7|)Pq0*~9N zt*#MwoYws%LS!UPgh+(=x3^gtELj0+S-lE2L)clPn=+av&ok(L;g}b*A_S2yhU1{6 zb`;x4A#J-IiBdR98Czq-Qi6#pg6g4-lnpw`m)R1cnF{F3Q&iI)Xk*mEQOeos8tUVF zVI_q98$FbH3Wp$X7Ba;5Dz=u8)Iu26f+z0&cHqvF_v=hdUUgDkJk6_6wt$+a>ElhB^x@e|MRZh5Qw{NGZQ|S2 zf`rf>fXRV&idOIhMifKKPz;JiF@a)po9dvtcv{dHp((5tM!7s_2kI1D2K^Sn)M{Ks ztX@{&Jq;4Uv^%CcM4yhSpvHouQ0k^SNGwka9Pn_UPi6YuQrgo?ao>1Dcng`ud}pwr zF+$Uz9MplG-z4GKqP@a*eUJz_|9v$pSO)s7W2uj<*fcGcvQuOe=Pig( s=$XuBeG}h_0*L~N0*L~N0>z-fZ`jdw^dN~%oB#j-07*qoM6N<$f<-xjOaK4? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png new file mode 100644 index 0000000000000000000000000000000000000000..075473278bdc5c310011501824299bffc111ad8a GIT binary patch literal 3305 zcmVNc=P)PGod3>8MGREUJM4Nxh9RHT)P z+J+WUNKjQ;6(S{8R3K`kJisvy#076^8;l<~iJ>XRX6pwF*xvQd&P;WdJJztQ_c1fq z5A07GvAfLNbN2JubI&>V+!>4}A6RuT2q6w36on9CRfqZG126LJPSEEVyQHBkclM&$u4qCm^DuXxtLfa5E^Ze zb!r7z^#~zZq)jwUa$#&9A!H`UWRmI+Al6L|4=s{ukqbZfIfPV(k_;mt5rXfK*M`Dq zav4G>5IdDg^@l_Vb{k2uk>r94up)#^lN^O;1-OP$gwPOi6}n**2{8zv*lA|1;{h!9 zE<$Kn??8Gd8HSMhun>!g!I{YS5%f%UddP)q<4AZl9o;}MU{zwHnP9Etg3!5S@_N{a zRiF^e6CWJ$M5l#Zg;-w0wbK!-R)QlXH;ND&^-$CKAQXayNC=LETyBOEs~}AD^F}pOl-M`&4pra-qp&dXne)c`VDulZ?K8>TKh;O`VM-%e@|>UzuSQCI6^G= zzVIv%xh9eeZ`vn9b%AhG7yg#*xdtb`7D8n-G#BPXERC`ukR`?Yz<% zvCR7cf^YeUXZ{l!o~WgnUAuNAz4+pbm8q$zKV=vuM)_QpWtSvLgC39Pn$zk0yt})* z)o!y!_tn(YxXa4Q%+Ejnd~$Jd@wd{`({tv|o%@XGAII|xbK}O1kfxZBkia-{^FHUi-p91)BgpdC{J%b5uH{-kz@p~>S;qIl-*PQ9i3K9+ z>gv{HW@i49d%)!AyiS>HZwCcoRtm%&u080D7 z-LbJ%=U|$X7!X@qTe~VdJ9{s~F!1Y;MNu5+?d^TDq@?7pJv}`lE!iPp$a)z;G+Bf5 zxdydwrDnC@3hL_WzL%Su`vxHv34(B?sj2Ce<;$1VmoQ1YF<2^_aEl4}ON-lK^P=XV*YhdL!zx(qoQ z#GW{D;z^s$_L35A_4f82Ubk-DS)+*sl(k;olr5rK_upN>l(ff~Q+9ZGeqY}p?z<#%PJ~f20baL z6Qw5CaDNN6g6QbzVnh-Ih-39wti$2ht{mf?0|Y~@;JyC7vO%x+h#<>dG6Vz&jR>;b z37>sg@%^94J9pedCKCevKu@hY1%c0Ul?G%(L$I{8G&UXxcdaNJ_UvA&NU2_IS1E7x}2v?Esx68}{eJP0Xk!yH)F(oBs zvGTgVzyAV_&`S?MA1G%kL)dJ#LJDFS!zVL<*=){KUSGd{y~XJ9jX-yIcbhT{EG1D8 z!BW|(#Pj@EIkCC9`I^z=8v!W5tMr{mK?J5kE?G?U0ag$~oiEGsjZjCp=Ld^})u^tn z9@C3qm^jT}c6`twmn?bs0829z#@CJZ_V%$lF2bI(0D zwlE;ea=^X=osc;~uA$ZoeFZGb`j)vXDk_p{YHETOq%p?np~h6ZhH%agh0@Z}1mzS- zlJ4joFObSqEZ5`ljFDMbSh&FG@r^)HQPDz`zC9E~_{cT9N;Nt<+M&FjH*elkMvrd< zGBPrHG4$z0^`Nt9Qw=FF#mnewwQX$uFxA(&$B)S(vCN5pNw8Ur` zdI0*U7fV533Sztrjk{>P{r20=J9q9}kY!oI7+Y*M+ls2HDlP3sh6D5feLyeJ5A+0m zDTopjpKIu(28HL&&dzht^9Ap%R_oGDn>J+`DMKqj56}nQa|wf>CxwO-QSrGl4cD+` z%a-Pmkr7`V7h^oPw6yfq$)4Cieo0BmtDq0O2mL@#3ZlH~IM;C3(9zK$oIZVezmokx zi)eFm^JZvp)-oO>4$7hBdXNk9Ef$N<|ASt&wYB>}Pc7qxfN#I>MD#7ZVzb#^q20F- z3}CSzee}_?qN1Yx48x?zvMf3rj{T{rsrxC28|zz8TM?DM+}POIua_)YlEw477 zlarIPl9Q7^`{08QXiOpjap1s#$I8pg_i-Et9gTQoWaR9@g9m?CS64@)rXZ1fHAt-L z12c^!ANT_0<>kHU>FH0yk_yYR$+@|?CG+RcudlDKzwL6lj21bD#Kc5=@ZiD6tE#I0 z%=0{CWLOl%8+N<>*Bdu(G-5|jAb3fq<9%)bTmy|&P+ym0V`F2*qD6~-!!V3*G7$u! zByUwyT^prGKNE|-heZLgfl z?jAL{nC#%8(ngw|p3Z#u;fJepa&mr8`WdM8=R)5^Lqo%lQ&Ur4Vp$fF1q{TtwzmFa z&6+izgwwIE5iqVJP=BsG-hL`00AFb3%9WqAwYBXMMG>lIm}S|djEsyuU0q%8ojG%+ zc#(3U|bkqaRr^7ov(p>io_z~YbS3{1kBtgPo6AZvSi6N^_~b>mTwIW z4Z)s>&(57Y*RXTv&i{rJQNVamD}a>NX0t7~TCK~JI2M9=m&Yb^We3{0{V8hZQE99v)Kae<{40S^Yrxev^F<4U;X&wj|VPZyy(u)&o`Hs zmnRk!6f8(fOUr@k78GHiRsbojYMkMlH*fyw(4j-sd-v|8Q9JO*Fu6C`xR#41V;|b8 zRjYQ!#KaU6U#v&21Sze{<+7hTb?Of#L8nU;yx7Tgmy0wW?<~1I|-a&~bYws_FPnDIG@r8wjiLm!K zDJiMQVzI#9-$#fa_3ixy|LpO2Zn|8qEB*cb|AxK4jg5^1)z#Hb8ev@sM6~x;!L-}8 zJ_!iAYdx4{y2H8E$PCA*x{V+bawU?+O{pfjDTI*xgo)3_Z3r?g7_(R@9~L-K%#@NicFCZC6U2r zD!~FNCx#tIM@o`Jw$RTsf(4S^MwFmvAxI%OYK9Q(iPT~hXeCD?0W?c%-|!TGOeU|e zeXKw9Se{J&s`w!c)0A-QuAU@H@6TGf{l857@WVi`a<}~لا توجد صور بعد لا توجد هدايا بعد ميدالية - 房間類型 + نوع الغرفة + بعد الإعداد، ستتم إزالة الأعضاء الذين يتجاوزون خارج الترتيب علي المايك ؛ هل تريد تأكيد الإعداد ؟ \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ef15868a4..fcff75cd5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -5247,4 +5247,5 @@ 塹無禮物 勳章 房間類型 + 設置後將移除超出麥序的成員,確認設置? \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c969bb2e..4579d9561 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5286,7 +5286,8 @@ You cannot join again within 24 hours after leaving No photos yet No gifts yet Medal - 房間類型 + Room type + After the setting is completed, members who are out of the microphone order will be removed. Do you confirm the setting? diff --git a/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java b/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java index 20b796e0b..e525f0c65 100644 --- a/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java @@ -430,13 +430,13 @@ public final class AvRoomDataManager { } } - public void updateQueueChatRoomMemberExtension(ChatRoomMember chatRoomMember) { - int size = mMicQueueMemberMap.size(); + public void updateQueueChatRoomMemberExtension(SparseArray queue, ChatRoomMember chatRoomMember) { + int size = queue.size(); if (chatRoomMember == null || chatRoomMember.getExtension() == null || TextUtils.isEmpty(chatRoomMember.getAccount())) return; for (int i = 0; i < size; i++) { - int key = mMicQueueMemberMap.keyAt(i); - RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(key); + int key = queue.keyAt(i); + RoomQueueInfo roomQueueInfo = queue.get(key); if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) continue; if (!chatRoomMember.getAccount().equals(roomQueueInfo.mChatRoomMember.getAccount())) continue; @@ -594,6 +594,13 @@ public final class AvRoomDataManager { return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOM_TYPE_SINGLE; } + public int getRoomType() { + if (mCurrentRoomInfo == null) { + return -1; + } + return mCurrentRoomInfo.getType(); + } + /** * 是否是房间管理员 * @@ -844,6 +851,16 @@ public final class AvRoomDataManager { } } + public void replaceMicQueue(SparseArray queue) { + if (queue == null) { + return; + } + mMicQueueMemberMap.clear(); + for (int i = 0; i < queue.size(); i++) { + mMicQueueMemberMap.put(queue.keyAt(i), queue.valueAt(i)); + } + } + /** * 是否是房主或管理员 * diff --git a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java index 69efdae5e..267b968a9 100644 --- a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java +++ b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java @@ -126,7 +126,6 @@ import com.chwl.core.miniworld.bean.MiniWorldDetailInfo; import com.chwl.core.miniworld.bean.MiniWorldDetailInfoWithCurrentMember; import com.chwl.core.miniworld.event.MiniWorldJoinVerifiedEvent; import com.chwl.core.monsterhunting.bean.MonsterInfo; -import com.chwl.core.monsterhunting.bean.MonsterProtocol; import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; import com.chwl.core.msg.sys.ErbanSysMsgParamKey; import com.chwl.core.msg.sysv2.bean.ErbanSysMsgV2Info; @@ -1840,15 +1839,39 @@ public final class IMNetEaseManager { private void roomInfoUpdate(Map extension) { String roomInfoStr = (String) extension.get("roomInfo"); if (!TextUtils.isEmpty(roomInfoStr)) { - LogUtils.d(roomInfoStr); + com.example.lib_utils.log.LogUtil.d(TAG, "roomInfoUpdate roomInfoStr:" + roomInfoStr, false); RoomInfo roomInfo = gson.fromJson(roomInfoStr, RoomInfo.class); if (roomInfo != null) { + boolean isTypeChanged = false; + if (AvRoomDataManager.get().mCurrentRoomInfo != null && AvRoomDataManager.get().mCurrentRoomInfo.getType() != roomInfo.getType()) { + isTypeChanged = true; + } AvRoomDataManager.get().mCurrentRoomInfo = roomInfo; - noticeRoomInfoUpdate(roomInfo); + com.example.lib_utils.log.LogUtil.d(TAG, "roomInfoUpdate isTypeChanged:" + isTypeChanged, false); + if (isTypeChanged) { + onRoomTypeChanged(roomInfo); + }else{ + AvRoomDataManager.get().mCurrentRoomInfo = roomInfo; + noticeRoomInfoUpdate(roomInfo); + } } } } + @SuppressLint("CheckResult") + private void onRoomTypeChanged(RoomInfo roomInfo) { + RoomMicQueueModel.INSTANCE.queueMicQueue(roomInfo.getRoomId()).subscribe(new Consumer>() { + @Override + public void accept(SparseArray roomQueue) throws Exception { + com.example.lib_utils.log.LogUtil.d(TAG, "onRoomTypeChanged accept", false); + AvRoomDataManager.get().replaceMicQueue(roomQueue); + GiftValueMrg.get().updateRoomGiftValue(false); + noticeRoomInfoUpdate(roomInfo); + tryAutoUpMic(); + } + }); + } + private void chatRoomQueueChangeNotice(ChatRoomMessage msg) { ChatRoomQueueChangeAttachment roomQueueChangeAttachment = (ChatRoomQueueChangeAttachment) msg.getAttachment(); //麥上成員信息(uid...) key:坑位 ,content:{"nick":"行走的老者","uid":90972,"gender":1,"avatar":"https://image.zhongjialx.com/Fmtbprx5cGc3KABKjDxs_udJZb3O?imageslim"} @@ -1903,7 +1926,13 @@ public final class IMNetEaseManager { if (curRoomInfo == null) return; noticeEnterMessages(); //個播模式房主進房自動上麥 - if (AvRoomDataManager.get().isSingleRoom() && AvRoomDataManager.get().isRoomOwner()) { + tryAutoUpMic(); + } + + private void tryAutoUpMic() { + RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (curRoomInfo == null) return; + if (AvRoomDataManager.get().isSingleRoom() && AvRoomDataManager.get().isRoomOwner() && !AvRoomDataManager.get().isOwnerOnMic()) { AvRoomModel.get().upMicroPhone( -1, String.valueOf(AuthModel.get().getCurrentUid()), @@ -1922,7 +1951,6 @@ public final class IMNetEaseManager { } ); } - } public ChatRoomMessage getFirstMessageContent() { diff --git a/core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt b/core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt new file mode 100644 index 000000000..d9621afb2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt @@ -0,0 +1,130 @@ +package com.chwl.core.manager + +import android.util.Log +import android.util.SparseArray +import com.chwl.core.Constants +import com.chwl.core.bean.RoomMicInfo +import com.chwl.core.bean.RoomQueueInfo +import com.chwl.core.room.model.AvRoomModel +import com.chwl.core.room.queue.bean.MicMemberInfo +import com.chwl.library.utils.ListUtils +import com.chwl.library.utils.json.JsonUtils +import com.example.lib_utils.log.ILog +import com.google.gson.JsonParser +import com.google.gson.reflect.TypeToken +import com.netease.nimlib.sdk.chatroom.model.ChatRoomInfo +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember +import com.netease.nimlib.sdk.util.Entry +import io.reactivex.Observable +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers + +object RoomMicQueueModel : ILog { + + fun queueMicQueue(roomId: Long): Observable> { + return AvRoomModel.get().queryRoomInfo(roomId).map { + parseMicQueue(it) + }.flatMap { + queueMicQueue(roomId, it) + } + } + + fun queueMicQueue( + roomId: Long, + queue: SparseArray + ): Observable> { + return AvRoomModel.get().queryRoomMicInfo(roomId.toString()).map { + dealMicMemberFromIMNet(queue, it) + }.flatMap { + dealMicChatRoomMemberFromIMNet(queue, it) + } + } + + private fun parseMicQueue( + chatRoomInfo: ChatRoomInfo + ): SparseArray { + val extension: Map = chatRoomInfo.extension + val micQueueStr = + extension[Constants.KEY_CHAT_ROOM_INFO_MIC] as? String + return parseMicQueue(micQueueStr) + } + + private fun parseMicQueue( + micQueueStr: String? + ): SparseArray { + val micQueue = SparseArray() + if (micQueueStr.isNullOrEmpty()) { + return micQueue + } + val micQueueMap = JsonUtils.getGson().fromJson>( + micQueueStr, object : TypeToken>() {}.type + ) + logD("parseMicQueue micQueueStr:$micQueueStr") + micQueueMap.forEach { + val micPosition = it.key.toIntOrNull() + val micInfo = + JsonUtils.getGson().fromJson(it.value, RoomMicInfo::class.java) + if (micPosition != null && micInfo != null) { + micQueue.put( + micPosition, + RoomQueueInfo( + micInfo, + null + ) + ) + } + } + return micQueue + } + + /** + * 处理网易云信坑位信息 + */ + private fun dealMicMemberFromIMNet( + micQueue: SparseArray, + entries: List> + ): List { + logD("dealMicMemberFromIMNet entries:${entries.size}") + val accounts: MutableList = ArrayList() + if (!ListUtils.isListEmpty(entries)) { + val jsonParser = JsonParser() + var chatRoomMember: MicMemberInfo + for (entry in entries) { + val roomQueueInfo = micQueue[entry.key.toInt()] + if (roomQueueInfo != null) { + val valueJsonObj = jsonParser.parse(entry.value).asJsonObject + if (valueJsonObj != null) { + chatRoomMember = + JsonUtils.getGson() + .fromJson(valueJsonObj, MicMemberInfo::class.java) + accounts.add(chatRoomMember.account) + roomQueueInfo.mChatRoomMember = chatRoomMember + } + micQueue.put( + Integer.valueOf(entry.key), + roomQueueInfo + ) + } + } + } + return accounts + } + + /** + * 处理网易云信队列上人员的信息 + */ + private fun dealMicChatRoomMemberFromIMNet( + micQueue: SparseArray, + accounts: List + ): Observable> { + return if (ListUtils.isListEmpty(accounts)) Observable.just(micQueue) else IMNetEaseManager.get() + .fetchRoomMembersByIds(accounts).observeOn(AndroidSchedulers.mainThread()) + .flatMap { chatRoomMembers: List -> + for (chatRoomMember in chatRoomMembers) { + AvRoomDataManager.get() + .updateQueueChatRoomMemberExtension(micQueue, chatRoomMember) + } + Single.just(micQueue) + }.toObservable() + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java index a8fe70926..99ff238f9 100644 --- a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java @@ -436,7 +436,7 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { .observeOn(AndroidSchedulers.mainThread()) .flatMap(chatRoomMembers -> { for (ChatRoomMember chatRoomMember : chatRoomMembers) { - AvRoomDataManager.get().updateQueueChatRoomMemberExtension(chatRoomMember); + AvRoomDataManager.get().updateQueueChatRoomMemberExtension(AvRoomDataManager.get().mMicQueueMemberMap, chatRoomMember); } //accounts不为空则表示出现了本地队列信息和云信队列信息不一致的情况,更新队列信息后更新下相应的坑位信息 @@ -710,6 +710,16 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { */ @Override public Observable startGetOnlineMemberNumberJob(final long roomId) { + return queryRoomInfo(roomId); + } + + /** + * 获取聊天室信息 + * + * @param roomId 聊天室id + * @return ChatRoomInfo 房间信息 + */ + public Observable queryRoomInfo(final long roomId) { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { diff --git a/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java index 87022ffee..95ae5ba58 100644 --- a/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java +++ b/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java @@ -69,6 +69,14 @@ public class MicMemberInfo { } + public String getAccount() { + return account; + } + + public String getNick() { + return nick; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/libs/lib_utils/src/main/java/com/example/lib_utils/log/LogUtil.kt b/libs/lib_utils/src/main/java/com/example/lib_utils/log/LogUtil.kt index a9cecc7db..93dc00464 100644 --- a/libs/lib_utils/src/main/java/com/example/lib_utils/log/LogUtil.kt +++ b/libs/lib_utils/src/main/java/com/example/lib_utils/log/LogUtil.kt @@ -45,6 +45,7 @@ object LogUtil { e(tag, message + "\t\t" + cause, filePrinter) } + @JvmStatic fun d(tag: String, message: String, filePrinter: Boolean = false) { log(Log.DEBUG, tag, message, filePrinter) }