From 163340a691eea27faecea1e50f5b9749630ad029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=B0=8F=E6=B1=9F?= <461355754@qq.com> Date: Tue, 20 Jan 2026 19:20:06 +0800 Subject: [PATCH] =?UTF-8?q?1:=E4=BF=AE=E6=94=B9=E6=97=B6=E9=97=B4=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=A1=86=EF=BC=8C=E6=A0=B9=E6=8D=AE=E9=9C=80=E8=A6=81?= =?UTF-8?q?=EF=BC=8C=E5=B1=95=E7=A4=BA=E6=97=B6=E5=88=86=E7=A7=92=E5=92=8C?= =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=E6=97=B6=E5=88=86=E7=A7=92=202:?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B1=95=E7=A4=BA=E8=AE=BE=E5=A4=87id?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E5=A4=B4=E9=83=A8=E4=BF=A1=E6=81=AF=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=E7=AC=AC=E4=B8=89=E6=96=B9=E7=9A=84?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=AE=BE=E5=A4=87=E5=94=AF=E4=B8=80id=203?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E7=BE=A4=E8=81=8A=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=B1=95=E7=A4=BA=204=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=88=BF=E9=97=B4=E5=B0=81=E9=9D=A2=EF=BC=8C=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=9B=BE=E7=89=87=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E8=A3=81=E5=89=AA=205=EF=BC=9A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=90=A5=E4=B8=9A=E6=97=B6=E9=97=B4=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=206:pk=E4=BF=AE=E6=94=B9=E5=BC=80=E5=A7=8B=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=EF=BC=8C=E9=80=89=E6=8B=A9=E6=97=B6=E9=97=B4=E5=8E=BB?= =?UTF-8?q?=E6=8E=891=E5=88=86=E9=92=9F=207=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=A3=B0=E7=BD=91=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=A3=B0=E5=8D=A1?= =?UTF-8?q?=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moduleutil/base/CommonAppContext.java | 2 +- .../com/xscm/moduleutil/bean/GroupBean.kt | 3 +- .../xscm/moduleutil/bean/room/PkRoomInfo.java | 2 + .../moduleutil/bean/room/RoomSettingBean.java | 4 + .../com/xscm/moduleutil/http/ApiServer.java | 12 +- .../xscm/moduleutil/http/RetrofitClient.java | 57 ++++++- .../com/xscm/moduleutil/rtc/AgoraManager.java | 100 +++++++---- .../com/xscm/moduleutil/utils/SpUtil.java | 9 + .../xscm/moduleutil/utils/SystemUtils.java | 4 +- .../com/xscm/moduleutil/widget/Constants.java | 2 + .../widget/DoubleTimePickerBottomSheet.java | 159 ++++++++++++++++-- .../moduleutil/widget/WheelTimePicker.java | 15 ++ .../dialog/RewardGiftDialogFragment.java | 8 +- .../activity/GroupChatSettingsActivity.kt | 59 ++++++- .../activity/GroupUserListActivity.kt | 43 ++++- .../activity/room/activity/RoomActivity.kt | 17 +- .../room/contacts/RoomSettingContacts.java | 2 + .../room/contacts/SingSongContacts.java | 4 + .../room/fragment/FriendshipRoomFragment.java | 12 +- .../room/fragment/RoomAuctionFragment.java | 6 +- .../room/fragment/RoomKtvFragment.java | 6 +- .../room/fragment/RoomMentorShipFragment.kt | 3 + .../room/fragment/SingSongFragment.java | 120 +++++++------ .../room/presenter/RoomSettingPresenter.java | 15 ++ .../room/presenter/SingSongPresenter.java | 18 ++ .../user/activity/CreatedRoomActivity.java | 75 ++++++++- .../user/activity/RoomDetailsActivity.java | 1 + .../user/activity/SettingActivity.java | 11 ++ .../user/activity/TotalRevenueActivity.kt | 2 +- .../user/fragment/PlaceholderFragment.java | 56 +++--- .../fragment/PlaceholderGiftFragment.java | 14 +- .../modulemain/adapter/GiftWallAdapter.java | 26 ++- .../adapter/GroupUserListAdapter.kt | 95 +++++++---- .../adapter/HorizontalListAdapter.java | 9 +- .../dialog/PkTimeDialogFragment.java | 1 - .../dialog/RoomConcernDialogFragment.java | 2 +- .../dialog/RoomGiftDialogFragment.java | 8 +- .../dialog/RoomSettingFragment.java | 43 ++++- .../layout/activity_group_chat_settings.xml | 31 +++- .../res/layout/activity_group_user_list.xml | 115 +++++++------ .../src/main/res/layout/activity_setting.xml | 25 +++ 41 files changed, 919 insertions(+), 277 deletions(-) diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java b/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java index 718b3c96..4937ed6a 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java @@ -137,7 +137,7 @@ public class CommonAppContext extends MultiDexApplication implements Application @Getter public UnreadCountEvent unreadCountEvent; - public static int selectRelease = 1; + public static int selectRelease = -1; public int is_open = 0;//主题的开关 diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt index 0c5f71f1..4cae4e3c 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt @@ -8,7 +8,7 @@ package com.xscm.moduleutil.bean class GroupBean { var guild_id: String = "" var guild_cover: String = "" - var is_deacon: Int = 0 //是否是群主 1:是 ,其他的不是 + var is_deacon: Int = 0 //是否是群主 1:是 ,其他的不是 2:管理员 3:普通成员 var user_list: List = ArrayList() var name: String = "" @@ -27,6 +27,7 @@ class GroupBean { var role_str: String = "" var in_room_id: Int = 0 //是否在房间内 1:在 0:不在 var is_mute: Int = 0 //是否被禁言 1:是 0:不是 + var group_role : Int = 0 //群角色 1:群主 2:管理员 3:普通成员 } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java index ff7b0ed6..c0cd6e31 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java @@ -19,4 +19,6 @@ public class PkRoomInfo implements Serializable { private String pk_part;;//2:等待开始、3:进行中、4:惩罚阶段 private String pk_end_times; private int receive_pk_user_id = -2;//接受pk的用户id + + private String close_users="";//关闭pk麦克风的用户id } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomSettingBean.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomSettingBean.java index 76656966..27ee1165 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomSettingBean.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomSettingBean.java @@ -65,6 +65,10 @@ public class RoomSettingBean implements MultiItemEntity { public static final int QXRoomSettingTypeRoomTimeSpace = 34;//时空之巅 public static final int QXRoomSettingTypeRoomTimeRedSound = 35;//红包声音 + public static final int QXRoomSettingTypeRoomBusinessTime = 37;//营业时间 + + + public static final int ITEM_TYPE_DEFAULT = 0; public static final int ITEM_TYPE_WITH_ICON = 1; diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java index 00326489..2d4089e2 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -360,7 +360,7 @@ public interface ApiServer { @GET(Constants.GET_CUSTOM_GIFT_LIST) Call>> getCustomGiftList(@Query("user_id") String user_id); - @GET(Constants.GET_NEW_GIFT_LIST) + @GET(Constants.GET_NEW_GIFT_LIST) //拍卖位选择拍卖礼物,type=3 label =99 Call>> getNewGiftList(@Query("label") int label, @Query("type") String type ); @GET(Constants.SET_CUSTOM_GIFT) @@ -528,6 +528,10 @@ public interface ApiServer { @POST(Constants.postRoomSwToken) Call> postRoomSwToken(@Field("room_id") String roomId); + @FormUrlEncoded + @POST(Constants.POST_CLOSE_PK_MIC) + Call> closePkMic(@Field("pk_id") String pk_id,@Field("type") String type,@Field("user_id") String user_id); + @FormUrlEncoded @POST(Constants.SET_USER_DECORATE) Call> setUserDecorate(@Field("udid") String udid); @@ -749,6 +753,10 @@ public interface ApiServer { @GET(Constants.GET_BLIND_BOX_STATUS) Call>> blindBoxStatus(); + @FormUrlEncoded + @POST(Constants.SET_ROOM_BUSINESS_TIME) + Call> setRoomBusinessTime(@Field("room_id") String roomId,@Field("start_time") String startTime,@Field("end_time") String endTime); + @FormUrlEncoded @POST(Constants.POST_END_SONG) Call> endSong(@Field("room_id") String roomId); @@ -770,7 +778,7 @@ public interface ApiServer { Call>> getCharmRank(@Field("room_id") String roomId); @FormUrlEncoded - @POST(Constants.POST_ROOM_RELATION_LIST) + @POST(Constants.POST_ROOM_RELATION_LIST) //1:真爱拍 2:亲密拍 3:星球(互娱) Call>> roomRelationList(@Field("type") String type); @FormUrlEncoded diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java index 136c583b..f6fefeec 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -749,7 +749,7 @@ public class RetrofitClient { @Override public void onResponse(Call> call, Response> response) { - if (response.code() == 200) { + if (response.code() == 200) { BaseModel baseModel = response.body(); if (baseModel.getCode() == 1) observer.onNext(baseModel.getData()); @@ -3363,7 +3363,6 @@ public class RetrofitClient { setCode301(indexRecommendRoomBaseModel.getMsg()); } } else { - ToastUtils.showLong("首页房间推荐异常", response.code()); LogUtils.e("首页房间推荐", response.message()); } } @@ -4654,6 +4653,33 @@ public class RetrofitClient { }); } + public void setRoomBusinessTime(String roomId,String start_time,String end_time, BaseObserver observer) { + sApiServer.setRoomBusinessTime(roomId,start_time,end_time).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + if (response.code() == 200) { + BaseModel baseModel = response.body(); + if (baseModel.getCode() == 1) + ToastUtils.showLong(baseModel.getMsg()); + else if (baseModel.getCode() == 301) { + setCode301(baseModel.getMsg()); + }else if (baseModel.getCode() == 0) { + ToastUtils.showLong(baseModel.getMsg()); + } + }else { + ToastUtils.showLong("设置营业时间失败,", response.code()); + LogUtils.e("setRoomBusinessTime", response.message()); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("setRoomBusinessTime", t.fillInStackTrace()); + } + }); + } + public void endSong(String room_id, BaseObserver observer) { sApiServer.endSong(room_id).enqueue(new Callback>() { @Override @@ -5343,6 +5369,33 @@ public class RetrofitClient { }); } + public void closePkMic(String pk_id ,String type ,String user_id,BaseObserver observer) { + sApiServer.closePkMic(pk_id,type,user_id).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + if (response.code() == 200) { + BaseModel baseModel = response.body(); + if (baseModel.getCode() == 1) { + observer.onNext(baseModel.getMsg()); + } else if (baseModel.getCode() == 301) { + setCode301(baseModel.getMsg()); + } else if (baseModel.getCode() == 0) { + ToastUtils.showShort(baseModel.getMsg()); + } + } else { + ToastUtils.showLong("数据错误", response.code()); + LogUtils.e("closePkMic", response.message()); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("closePkMic", t.fillInStackTrace()); + } + }); + } + public void removeBlackList(String user_id, BaseObserver observer) { sApiServer.removeBlackList(user_id).enqueue(new Callback>() { @Override diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java b/BaseModule/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java index 4904a28f..5b62a879 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java @@ -94,7 +94,7 @@ import io.reactivex.disposables.Disposable; public class AgoraManager { private static volatile AgoraManager instance; - public RtcEngineEx rtcEngine; + public RtcEngineEx rtcEngine; // private RtcEngineEx rtcEngineEx; private Context context; private boolean isLocalAudioEnabled = true; // 默认开启麦克风 @@ -230,6 +230,9 @@ public class AgoraManager { "}" + "}"); rtcEngine.setParameters("{\"che.video.mobile_1080p\":true}"); + + setEnable(); + } catch (Exception e) { LogUtils.w("AgoraManager", "Failed to set parameters", e); } @@ -242,6 +245,7 @@ public class AgoraManager { } } } + public static int calculateScreenAngle(int orientation) { if (orientation >= 315 || orientation < 45) { return 0; // 竖屏(0度) @@ -253,6 +257,7 @@ public class AgoraManager { return 270; // 横屏左(270度) } } + /** * 加入语音聊天房间 */ @@ -281,6 +286,7 @@ public class AgoraManager { // 在频道中发布屏幕采集的音频 options.publishScreenCaptureAudio = true; ClientRole(isCamerJs); + // options.publishMediaPlayerId = 0; rtcEngine.joinChannel(token, mRoomId, uid, options); @@ -289,6 +295,18 @@ public class AgoraManager { } + public void setEnable(){ + if (SpUtil.getSkService()==1){ + rtcEngine.setParameters("{\"che.audio.aec.enable\":false}"); // 关闭回音消除 + rtcEngine.setParameters("{\"che.audio.ans.enable\":false}"); // 关闭降噪 + rtcEngine.setParameters("{\"che.audio.agc.enable\":false}"); // 关闭增益控制 + }else { + rtcEngine.setParameters("{\"che.audio.aec.enable\":true}"); // 开启回音消除 + rtcEngine.setParameters("{\"che.audio.ans.enable\":true}"); // 开启降噪 + rtcEngine.setParameters("{\"che.audio.agc.enable\":true}"); // 开启增益控制 + } + } + /** * 清理资源但保留实例 */ @@ -342,14 +360,14 @@ public class AgoraManager { } handlers.clear(); } - if (disposableA != null && !disposableA.isDisposed()){ + if (disposableA != null && !disposableA.isDisposed()) { disposableA.dispose(); } - if (disposableB != null && !disposableB.isDisposed()){ - disposableB.dispose(); + if (disposableB != null && !disposableB.isDisposed()) { + disposableB.dispose(); } - if (disposableC != null && !disposableC.isDisposed()){ - disposableC.dispose(); + if (disposableC != null && !disposableC.isDisposed()) { + disposableC.dispose(); } // 关闭线程池 if (executorService != null && !executorService.isShutdown()) { @@ -412,7 +430,7 @@ public class AgoraManager { @Override public void onRemoteAudioStateChanged(int uid, int state, int reason, int elapsed) { super.onRemoteAudioStateChanged(uid, state, reason, elapsed); - if (state == 0){ + if (state == 0) { // LogUtils.e("onRemoteAudioStateChanged", "uid------>" + uid, "state------>" + state, "reason------>" + reason, "elapsed------>" + elapsed); for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { if (listener != null) { @@ -485,7 +503,7 @@ public class AgoraManager { @Override public void onLyricResult(String requestId, long songCode, String lyricUrl, int reason) { if (lyricUrl != null) { - LogUtils.e("roomInfoEvent",lyricUrl); + LogUtils.e("roomInfoEvent", lyricUrl); getLyricsInstance(lyricUrl); } } @@ -563,7 +581,7 @@ public class AgoraManager { Map localMap = new HashMap<>(); for (AudioVolumeInfo info : speakers) { String userId = (info.uid == 0) - ? SpUtil.getUserId()+"" + ? SpUtil.getUserId() + "" : String.valueOf(info.uid); localMap.put(userId, info.volume); } @@ -575,6 +593,7 @@ public class AgoraManager { // 2️⃣ 只把“不可变快照”丢给 UI uiHandler.post(() -> dispatchVolume(localMap)); } + private void dispatchVolume(Map volumeSnapshot) { if (soundLevelUpdateListeners.isEmpty()) return; @@ -587,6 +606,7 @@ public class AgoraManager { } } } + @Override public void onLocalVideoStateChanged(Constants.VideoSourceType source, int state, int reason) { super.onLocalVideoStateChanged(source, state, reason); @@ -658,6 +678,7 @@ public class AgoraManager { } }; } + /** * 创建并返回 IMediaPlayerObserver 实例 */ @@ -755,6 +776,7 @@ public class AgoraManager { } }; } + public void potexao(String page) { ClientRole(true); rtcEngine.playEffect(1, page, 0, 1, 0, 100, true); @@ -770,7 +792,7 @@ public class AgoraManager { } } - public void joinChannelEx(String token, String channelId, int uid,String pkUserIds) { + public void joinChannelEx(String token, String channelId, int uid, String pkUserIds) { if (rtcEngine == null) { init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); } @@ -810,17 +832,17 @@ public class AgoraManager { WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); - DisplayMetrics outMetrics=new DisplayMetrics(); + DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics); // // 设置屏幕采集的参数 screenCaptureParameters.captureVideo = true; - screenCaptureParameters.videoCaptureParameters.width = outMetrics.widthPixels; - screenCaptureParameters.videoCaptureParameters.height = outMetrics.heightPixels; + screenCaptureParameters.videoCaptureParameters.width = outMetrics.widthPixels; + screenCaptureParameters.videoCaptureParameters.height = outMetrics.heightPixels; screenCaptureParameters.videoCaptureParameters.framerate = 15; screenCaptureParameters.captureAudio = true; - screenCaptureParameters.audioCaptureParameters.captureSignalVolume =50; - screenCaptureParameters.videoCaptureParameters.contentHint=1 ; + screenCaptureParameters.audioCaptureParameters.captureSignalVolume = 50; + screenCaptureParameters.videoCaptureParameters.contentHint = 1; rtcEngine.setVideoEncoderConfiguration(new VideoEncoderConfiguration( VD_1280x720, FRAME_RATE_FPS_15, @@ -833,12 +855,12 @@ public class AgoraManager { } - public void setExternalMediaProjection(MediaProjection[] mediaProjection){ + public void setExternalMediaProjection(MediaProjection[] mediaProjection) { rtcEngine.setExternalMediaProjection(mediaProjection[0]); } - public void isPost(){ - if (rtcEngine != null){ + public void isPost() { + if (rtcEngine != null) { ScreenCaptureParameters screenCaptureParameters = new ScreenCaptureParameters(); // 设置新的屏幕共享参数 @@ -917,6 +939,7 @@ public class AgoraManager { } } } + //关闭对方的所有推流 public void muteAllRemoteAudioStreamsEx(boolean enabled) { if (rtcEngine == null) { @@ -932,10 +955,11 @@ public class AgoraManager { // rtcEngine.muteAllRemoteAudioStreamsEx(enabled, connection); } } + //打开对方支持的推流 - public void muteAllRemoteAudioStreamsExUserId(boolean enabled){ - if (rtcEngine != null){ - rtcEngine.muteRemoteAudioStreamEx(pkUserId,enabled,connection); + public void muteAllRemoteAudioStreamsExUserId(boolean enabled) { + if (rtcEngine != null) { + rtcEngine.muteRemoteAudioStreamEx(pkUserId, enabled, connection); } } @@ -1011,7 +1035,7 @@ public class AgoraManager { // } // } public void addSoundLevelListener(SoundLevelUpdateListener listener) { - LogUtils.e("AgoraManager", "addSoundLevelListener: " + listener +"============"+soundLevelUpdateListeners.size()); + LogUtils.e("AgoraManager", "addSoundLevelListener: " + listener + "============" + soundLevelUpdateListeners.size()); if (soundLevelUpdateListeners != null) { soundLevelUpdateListeners.add(listener); } @@ -1028,19 +1052,19 @@ public class AgoraManager { soundLevelUpdateListeners.clear(); } -/** - * This method searches for music based on a given keyword and page number. - * It initializes the music content center if it's not already created. - * - * @param keyword The keyword to search for music - * @param page The page number of the search results - */ + /** + * This method searches for music based on a given keyword and page number. + * It initializes the music content center if it's not already created. + * + * @param keyword The keyword to search for music + * @param page The page number of the search results + */ public void searchMusic(String keyword, int page) { - // Check if musicContentCenter is initialized, if not create it + // Check if musicContentCenter is initialized, if not create it if (musicContentCenter == null) { musicContentCenter = IAgoraMusicContentCenter.create(rtcEngine); } - // Perform the music search with the keyword, page number and page size (20) + // Perform the music search with the keyword, page number and page size (20) musicContentCenter.searchMusic(keyword, page, 20); } @@ -1112,8 +1136,8 @@ public class AgoraManager { String result = musicContentCenter.preload(mSongCode); // 使用后台线程池处理预加载检查,避免阻塞UI线程 disposableC = Observable.timer(3000, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(aLong -> { - isPreload(mSongCode, type); - }); + isPreload(mSongCode, type); + }); } else { try { musicPlayer.open(mSongCode, 0); @@ -1262,15 +1286,17 @@ public class AgoraManager { public void setPlayoutVolume(int volume) { if (musicPlayer != null) { musicPlayer.adjustPlayoutVolume(volume);//调节本地播放音量。 参数是0-100 - musicPlayer.adjustPublishSignalVolume(volume*2);//调节远端用户听到的音量。 参数是0-400 + musicPlayer.adjustPublishSignalVolume(volume * 2);//调节远端用户听到的音量。 参数是0-400 } } + /** * 伴奏音量 + * * @param volume */ - public void setAdjustPublishSignalVolume(int volume){ + public void setAdjustPublishSignalVolume(int volume) { musicPlayer.adjustPublishSignalVolume(volume);//调节远端用户听到的音量。 参数是0-400 } @@ -1362,7 +1388,7 @@ public class AgoraManager { .build(); if (StatusUtil.isCompleted(task)) { MusicFileBean musicFileBean = new MusicFileBean(); - LogUtils.e("roomInfoEvent",convertFileToByteArray(task.getFile())); + LogUtils.e("roomInfoEvent", convertFileToByteArray(task.getFile())); musicFileBean.setFileData(convertFileToByteArray(task.getFile())); EventBus.getDefault().post(musicFileBean); } else { @@ -1391,7 +1417,7 @@ public class AgoraManager { @Override public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause, @NonNull Listener1Assist.Listener1Model model) { Logger.e("taskEnd", model); - LogUtils.e("roomInfoEvent",convertFileToByteArray(task.getFile())); + LogUtils.e("roomInfoEvent", convertFileToByteArray(task.getFile())); MusicFileBean musicFileBean = new MusicFileBean(); musicFileBean.setFileData(convertFileToByteArray(task.getFile())); EventBus.getDefault().post(musicFileBean); diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/SpUtil.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/SpUtil.java index bfa32c3c..80e82845 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/SpUtil.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/SpUtil.java @@ -354,6 +354,15 @@ public class SpUtil { return SPUtils.getInstance(SPConstants.PREFERENCE_NAME).getInt(SPConstants.TASK_SERVICE); } + public static int setSkService(int taskService){ + SPUtils.getInstance(SPConstants.PREFERENCE_NAME).put("skService", taskService); + return taskService; + } + public static int getSkService(){ + return SPUtils.getInstance(SPConstants.PREFERENCE_NAME).getInt("skService"); + } + + //获取SharedPreferences音乐轮播方式 public static int getPlayPattern() { return SPUtils.getInstance(SPConstants.PREFERENCE_NAME).getInt(SPConstants.PLAY_MODE, 1); diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/SystemUtils.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/SystemUtils.java index 5b9cd409..5d5017d8 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/SystemUtils.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/SystemUtils.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Build; import com.blankj.utilcode.util.AppUtils; +import com.blankj.utilcode.util.DeviceUtils; import com.blankj.utilcode.util.MetaDataUtils; import com.xscm.moduleutil.base.CommonAppContext; import com.xscm.moduleutil.utils.config.ConfigUtils; @@ -77,7 +78,8 @@ public class SystemUtils { } public static String getShortClientID(Context context) { - String cid = getClientID("xqipaoandroid"); +// String cid = getClientID("xqipaoandroid"); + String cid = DeviceUtils.getUniqueDeviceId(); return Md5Utils.get(cid + getUUID(context)); } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java index 8ebaf6e1..c80e56e3 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -317,6 +317,7 @@ public class Constants { public static final String POST_APPLY_SONG = "/api/RoomSong/apply_song";//申请点歌 public static final String POST_AGREE_SONG = "/api/RoomSong/agree_song";//同意、拒绝点歌 public static final String GET_BLIND_BOX_STATUS = "/api/BlindBoxTurntable/blind_box_status";//盲盒转盘状态 + public static final String SET_ROOM_BUSINESS_TIME = "/api/Room/set_room_business_time";//设置房间的营业时间 public static final String POST_SONG_LIST = "/api/RoomSong/song_list";//获取已点歌曲 public static final String POST_SONG = "/api/RoomSong/song";//点歌 public static final String POST_UP_SONG = "/api/RoomSong/up_song";//移动歌曲 @@ -411,6 +412,7 @@ public class Constants { public static final String GET_INDEX_RECOMMEND_ROOM = "/api/Index/index_recommend_room";//首页弹窗推荐房间 public static final String GET_DAY_DROP_GIFT = "/api/Activities/day_drop_gift";//天降好礼列表接口(弹框) public static final String postRoomSwToken = "/api/Room/update_user_sw_token";//获取用户声网token + public static final String POST_CLOSE_PK_MIC = "/api/RoomPk/close_pk_mic";//PK闭麦 public static final String POST_CANCEL_USER_DECORATE = "/api/Decorate/cancel_user_decorate";//取消装扮 public static final String GET_THEME_DATA = "/api/Theme/get_theme_data";//主题接口 public static final String START_FRIEND = "/api/Friend/start_friend";//点击开始按钮 交友房 diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/DoubleTimePickerBottomSheet.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/DoubleTimePickerBottomSheet.java index 5aab163a..c112269d 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/DoubleTimePickerBottomSheet.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/DoubleTimePickerBottomSheet.java @@ -20,6 +20,9 @@ import java.util.Date; public class DoubleTimePickerBottomSheet extends BottomSheetDialogFragment { private OnTimeRangeSelectedListener listener; + private boolean showTime = true; // 默认显示时分秒 + private boolean showDate = true; // 默认显示日期 + private boolean showSeconds = true; // 默认显示秒 public interface OnTimeRangeSelectedListener { void onTimeRangeSelected(Date startDate, Date endDate); @@ -28,6 +31,54 @@ public class DoubleTimePickerBottomSheet extends BottomSheetDialogFragment { public void setOnTimeRangeSelectedListener(OnTimeRangeSelectedListener listener) { this.listener = listener; } + + /** + * 设置是否显示时分秒 + * @param showTime true显示年月日时分秒,false只显示年月日 + */ + public void setShowTime(boolean showTime) { + this.showTime = showTime; + } + + /** + * 设置是否显示日期 + * @param showDate true显示日期,false只显示时间 + */ + public void setShowDate(boolean showDate) { + this.showDate = showDate; + } + + /** + * 设置是否显示秒 + * @param showSeconds true显示秒,false不显示秒 + */ + public void setShowSeconds(boolean showSeconds) { + this.showSeconds = showSeconds; + } + + /** + * 创建实例 + * @param showTime true显示年月日时分秒,false只显示年月日 + * @return DoubleTimePickerBottomSheet实例 + */ + public static DoubleTimePickerBottomSheet newInstance(boolean showTime) { + DoubleTimePickerBottomSheet fragment = new DoubleTimePickerBottomSheet(); + fragment.setShowTime(showTime); + return fragment; + } + + /** + * 创建实例 + * @param showTime true显示年月日时分秒,false只显示年月日 + * @param showDate true显示日期,false只显示时间 + * @return DoubleTimePickerBottomSheet实例 + */ + public static DoubleTimePickerBottomSheet newInstance(boolean showTime, boolean showDate) { + DoubleTimePickerBottomSheet fragment = new DoubleTimePickerBottomSheet(); + fragment.setShowTime(showTime); + fragment.setShowDate(showDate); + return fragment; + } @NonNull @Override @@ -52,17 +103,77 @@ public class DoubleTimePickerBottomSheet extends BottomSheetDialogFragment { WheelTimePicker wheelStartTime = view.findViewById(R.id.wheel_start_time); WheelDatePicker wheelEndDate = view.findViewById(R.id.wheel_end_date); WheelTimePicker wheelEndTime = view.findViewById(R.id.wheel_end_time); + + // 根据showDate和showTime参数控制日期和时间选择器的显示和布局 + if (showDate && showTime) { + // 显示日期和时间时,使用默认布局 + wheelStartDate.setVisibility(View.VISIBLE); + wheelStartTime.setVisibility(View.VISIBLE); + wheelEndDate.setVisibility(View.VISIBLE); + wheelEndTime.setVisibility(View.VISIBLE); + + // 重置日期选择器的布局参数为默认值 + ViewGroup.LayoutParams startDateParams = wheelStartDate.getLayoutParams(); + startDateParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; + wheelStartDate.setLayoutParams(startDateParams); + + ViewGroup.LayoutParams endDateParams = wheelEndDate.getLayoutParams(); + endDateParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; + wheelEndDate.setLayoutParams(endDateParams); + } else if (showDate && !showTime) { + // 只显示日期时,隐藏时间选择器并让日期选择器铺满宽度 + wheelStartTime.setVisibility(View.GONE); + wheelEndTime.setVisibility(View.GONE); + + // 设置日期选择器铺满宽度 + ViewGroup.LayoutParams startDateParams = wheelStartDate.getLayoutParams(); + startDateParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + wheelStartDate.setLayoutParams(startDateParams); + + ViewGroup.LayoutParams endDateParams = wheelEndDate.getLayoutParams(); + endDateParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + wheelEndDate.setLayoutParams(endDateParams); + } else if (!showDate && showTime) { + // 只显示时间时,隐藏日期选择器并让时间选择器铺满宽度 + wheelStartDate.setVisibility(View.GONE); + wheelStartTime.setVisibility(View.VISIBLE); + wheelEndDate.setVisibility(View.GONE); + wheelEndTime.setVisibility(View.VISIBLE); + + // 设置时间选择器铺满宽度 + ViewGroup.LayoutParams startTimeParams = wheelStartTime.getLayoutParams(); + startTimeParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + wheelStartTime.setLayoutParams(startTimeParams); + + ViewGroup.LayoutParams endTimeParams = wheelEndTime.getLayoutParams(); + endTimeParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + wheelEndTime.setLayoutParams(endTimeParams); + } // 默认设置当前时间 Calendar startCal = Calendar.getInstance(); - wheelStartDate.init(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DAY_OF_MONTH)); - wheelStartTime.init(startCal.get(Calendar.HOUR_OF_DAY), startCal.get(Calendar.MINUTE),startCal.get(Calendar.SECOND)); + if (showDate) { + wheelStartDate.init(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DAY_OF_MONTH)); + } + if (showTime) { + wheelStartTime.init(startCal.get(Calendar.HOUR_OF_DAY), startCal.get(Calendar.MINUTE), showSeconds ? startCal.get(Calendar.SECOND) : 0); + wheelStartTime.setShowSeconds(showSeconds); + } // 设置默认结束时间略晚于开始时间 Calendar endCal = (Calendar) startCal.clone(); - endCal.add(Calendar.HOUR, 1); - wheelEndDate.init(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DAY_OF_MONTH)); - wheelEndTime.init(endCal.get(Calendar.HOUR_OF_DAY), endCal.get(Calendar.MINUTE),endCal.get(Calendar.SECOND)); + if (showTime) { + endCal.add(Calendar.HOUR, 1); + } else { + endCal.add(Calendar.DAY_OF_MONTH, 1); + } + if (showDate) { + wheelEndDate.init(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DAY_OF_MONTH)); + } + if (showTime) { + wheelEndTime.init(endCal.get(Calendar.HOUR_OF_DAY), endCal.get(Calendar.MINUTE), showSeconds ? endCal.get(Calendar.SECOND) : 0); + wheelEndTime.setShowSeconds(showSeconds); + } // 取消按钮 view.findViewById(R.id.btn_cancel).setOnClickListener(v -> dismiss()); @@ -70,16 +181,36 @@ public class DoubleTimePickerBottomSheet extends BottomSheetDialogFragment { // 确定按钮 view.findViewById(R.id.btn_sure).setOnClickListener(v -> { Calendar start = Calendar.getInstance(); - start.set(wheelStartDate.getYear(), wheelStartDate.getMonth(), wheelStartDate.getDay(), - wheelStartTime.getHour(), wheelStartTime.getMinute(), wheelStartTime.getSecond()); - Calendar end = Calendar.getInstance(); - end.set(wheelEndDate.getYear(), wheelEndDate.getMonth(), wheelEndDate.getDay(), - wheelEndTime.getHour(), wheelEndTime.getMinute(), wheelEndTime.getSecond()); - - if (end.getTime().before(start.getTime())) { - Toast.makeText(requireContext(), "结束时间不能早于开始时间", Toast.LENGTH_SHORT).show(); - return; + + if (showDate && showTime) { + // 显示日期和时间 + start.set(wheelStartDate.getYear(), wheelStartDate.getMonth(), wheelStartDate.getDay(), + wheelStartTime.getHour(), wheelStartTime.getMinute(), wheelStartTime.getSecond()); + end.set(wheelEndDate.getYear(), wheelEndDate.getMonth(), wheelEndDate.getDay(), + wheelEndTime.getHour(), wheelEndTime.getMinute(), wheelEndTime.getSecond()); + } else if (showDate && !showTime) { + // 只显示日期 + start.set(wheelStartDate.getYear(), wheelStartDate.getMonth(), wheelStartDate.getDay(), + 0, 0, 0); + end.set(wheelEndDate.getYear(), wheelEndDate.getMonth(), wheelEndDate.getDay(), + 23, 59, 59); + } else if (!showDate && showTime) { + // 只显示时间,使用当前日期 + int currentYear = start.get(Calendar.YEAR); + int currentMonth = start.get(Calendar.MONTH); + int currentDay = start.get(Calendar.DAY_OF_MONTH); + + start.set(currentYear, currentMonth, currentDay, + wheelStartTime.getHour(), wheelStartTime.getMinute(), wheelStartTime.getSecond()); + end.set(currentYear, currentMonth, currentDay, + wheelEndTime.getHour(), wheelEndTime.getMinute(), wheelEndTime.getSecond()); + } + if ((showDate && showTime) || (showDate && !showTime) ) { + if (end.getTime().before(start.getTime())) { + Toast.makeText(requireContext(), "结束时间不能早于开始时间", Toast.LENGTH_SHORT).show(); + return; + } } if (listener != null) { diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/WheelTimePicker.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/WheelTimePicker.java index f3e70da3..6259d36f 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/WheelTimePicker.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/WheelTimePicker.java @@ -8,6 +8,7 @@ import android.widget.NumberPicker; public class WheelTimePicker extends LinearLayout { private NumberPicker hourPicker, minutePicker, secondPicker; + private boolean showSeconds = true; // 默认显示秒 public WheelTimePicker(Context context) { this(context, null); @@ -33,6 +34,9 @@ public class WheelTimePicker extends LinearLayout { addView(hourPicker); addView(minutePicker); addView(secondPicker); + + // 根据showSeconds参数决定是否显示秒选择器 + secondPicker.setVisibility(showSeconds ? VISIBLE : GONE); // 设置小时范围 hourPicker.setMinValue(0); @@ -64,4 +68,15 @@ public class WheelTimePicker extends LinearLayout { public int getSecond() { return secondPicker.getValue(); } + + /** + * 设置是否显示秒 + * @param showSeconds true显示秒,false不显示秒 + */ + public void setShowSeconds(boolean showSeconds) { + this.showSeconds = showSeconds; + if (secondPicker != null) { + secondPicker.setVisibility(showSeconds ? VISIBLE : GONE); + } + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java index c22a5d2e..83736b4a 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java @@ -216,7 +216,7 @@ public class RewardGiftDialogFragment extends BaseMvpDialogFragment + V2TIMManager.getMessageManager().setGroupReceiveMessageOpt( + groupId, + if (b) V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE else V2TIMMessage.V2TIM_RECEIVE_MESSAGE, + object : V2TIMCallback { + override fun onSuccess() { + // 修改群消息接收选项成功 + ToastUtils.showLong(if (b) "已开启消息免打扰" else "已关闭消息免打扰") + } + + override fun onError(code: Int, desc: String?) { + // 修改群消息接收选项失败 + ToastUtils.showLong("免打扰功能开启失败",code,desc) + } + }) + } + + val groupIDs: MutableList = ArrayList() + groupIDs.add(groupId) + V2TIMManager.getGroupManager().getGroupsInfo( + groupIDs, + object : V2TIMValueCallback?> { + + override fun onSuccess(t: MutableList?) { + + if (t != null && !t.isEmpty()) { + val result = t[0] + if (result?.resultCode == 0) { + val groupInfo = result.groupInfo + mBinding?.switDoNotDisturb?.isChecked = groupInfo.recvOpt == V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE + } + } + } + + override fun onError(code: Int, desc: String?) { + + } + }) + } override fun getLayoutId(): Int { @@ -111,18 +155,18 @@ class GroupChatSettingsActivity : this.groupBean=groupBean mBinding?.groupName?.text = groupBean.name ImageUtils.loadHead(groupBean.guild_cover, mBinding?.imGroup) - if (groupBean.is_deacon == 1) { - isOwner=true + if (groupBean.is_deacon == 1 || groupBean.is_deacon == 2) { mBinding?.llGroup?.visibility = View.VISIBLE mBinding?.switJy?.isChecked = groupBean.mute_all_member == 1 mBinding?.etG?.isEnabled = true mBinding?.evGroupName?.isEnabled = true - } else { - isOwner=false + } + else { mBinding?.llGroup?.visibility = View.GONE mBinding?.etG?.isEnabled = false mBinding?.evGroupName?.isEnabled = false } + isOwner=groupBean.is_deacon mBinding?.etG?.text?.append(groupBean.notification) mBinding?.evGroupName?.text?.append(groupBean.name) @@ -143,4 +187,5 @@ class GroupChatSettingsActivity : super.doDone() groupId = intent.getStringExtra("groupId").toString() } -} \ No newline at end of file +} + diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt index d29ad461..4a2a74cf 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt @@ -5,12 +5,14 @@ import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat +import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.ToastUtils import com.google.android.material.bottomsheet.BottomSheetDialog import com.scwang.smartrefresh.layout.api.RefreshLayout import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener import com.tencent.imsdk.v2.V2TIMCallback import com.tencent.imsdk.v2.V2TIMGroupManager +import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo import com.tencent.imsdk.v2.V2TIMManager import com.xscm.modulemain.BaseMvpActivity import com.xscm.modulemain.R @@ -37,7 +39,7 @@ class GroupUserListActivity : BaseMvpActivity = ArrayList() @@ -50,7 +52,7 @@ class GroupUserListActivity : BaseMvpActivity @@ -107,7 +139,7 @@ class GroupUserListActivity : BaseMvpActivity(), mBinding!!.roomTop.root.isClickable = false setView(mRoomInfoResp) - MvpPre?.getRoomOnline(roomId, "1", "10") +// MvpPre?.getRoomOnline(roomId, "1", "10") } private var bgEffectView: View? = null @@ -3076,6 +3076,21 @@ class RoomActivity : BaseMvpActivity(), AgoraManager.getInstance().muteLocalAudioStream(false) AgoraManager.getInstance().ClientRole(true) CommonAppContext.getInstance().isMai = true + var userId : String ="" + mRoomInfoResp?.room_info?.pit_list?.size?.let { + if (it < 9) { + return + } + userId = mRoomInfoResp?.room_info?.pit_list!![8].user_id + } + // 方案1:使用安全调用和let操作符 + mRoomInfoResp?.pk_info?.close_users?.let { users -> + if (users.contains(userId)) { + AgoraManagerEx.getInstance().muteLocalAudioStreamEx(true) + } + } + + } else { mBinding!!.ivMic.setImageResource(com.xscm.moduleutil.R.mipmap.room_microphone_off) AgoraManager.getInstance() diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/RoomSettingContacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/RoomSettingContacts.java index d5b76be4..3fa5a6d8 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/RoomSettingContacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/RoomSettingContacts.java @@ -29,5 +29,7 @@ public class RoomSettingContacts { void agreeSong(String roomId, String type); void blindBoxStatus(); + + void setRoomBusinessTime(String roomId,String startTime,String endTime); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java index d7f2f2fe..52d92a8d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java @@ -25,6 +25,8 @@ public class SingSongContacts { void userOnlineStatus(List list); void postAgora(PkSwTokenBean pkSwTokenBean); + + void closePkMic(); } public interface IEmotionRoomPre extends IPresenter { @@ -39,5 +41,7 @@ public class SingSongContacts { void endPk(String pk_id,String type,String user_id); void userOnlineStatus(String userId, String roomid); + void closePkMic(String pk_id,String type,String user_id); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java index 2d3dba19..4db46452 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java @@ -281,12 +281,12 @@ public class FriendshipRoomFragment extends BaseRoomFragment 0 && roomId != null) { - if (MvpPre == null) { - MvpPre = new FriendshipRoomPresenter(this, getActivity()); - } - MvpPre.userOnlineStatus(userIds.toString(), roomId); - } +// if (userIds.length() > 0 && roomId != null) { +// if (MvpPre == null) { +// MvpPre = new FriendshipRoomPresenter(this, getActivity()); +// } +// MvpPre.userOnlineStatus(userIds.toString(), roomId); +// } } /** diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java index f82665fc..d5a9edb6 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java @@ -286,9 +286,9 @@ public class RoomAuctionFragment extends BaseMvpFragment 0 && roomInfoResp.getRoom_info().getRoom_id() != null) { - MvpPre.userOnlineStatus(userIds.toString(), roomInfoResp.getRoom_info().getRoom_id()); - } +// if (userIds.length() > 0 && roomInfoResp.getRoom_info().getRoom_id() != null) { +// MvpPre.userOnlineStatus(userIds.toString(), roomInfoResp.getRoom_info().getRoom_id()); +// } } @Override diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomKtvFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomKtvFragment.java index 2f38372d..8d595662 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomKtvFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomKtvFragment.java @@ -267,9 +267,9 @@ public class RoomKtvFragment extends BaseMvpFragment 0 && roomInfoResp.getRoom_info().getRoom_id() != null) { - MvpPre.userOnlineStatus(userIds.toString(), roomInfoResp.getRoom_info().getRoom_id()); - } +// if (userIds.length() > 0 && roomInfoResp.getRoom_info().getRoom_id() != null) { +// MvpPre.userOnlineStatus(userIds.toString(), roomInfoResp.getRoom_info().getRoom_id()); +// } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomMentorShipFragment.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomMentorShipFragment.kt index a586d7a2..8cc36db8 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomMentorShipFragment.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomMentorShipFragment.kt @@ -191,6 +191,7 @@ class RoomMentorShipFragment(var mRoomInfoResp: RoomInfoResp?) : if (mRoomInfoResp?.sign_info?.sign_id != "-1") { mSignId = mRoomInfoResp?.sign_info?.sign_id + LogUtils.e("初始的时候,mSignId = $mSignId") if (mRoomInfoResp?.sign_info?.sign_status == 1) { startTimer(mRoomInfoResp?.sign_info?.end_time!!) if (mUserInfo?.user_id?.toString().equals(mSignPitBean?.user_id)) { @@ -396,6 +397,7 @@ class RoomMentorShipFragment(var mRoomInfoResp: RoomInfoResp?) : mBinding.ivApplyForMai.isClickable = true mSignId = messageEvent?.text?.sign_id + LogUtils.e("场次开始的时候,mSignId = $mSignId") val endTime = messageEvent?.text?.end_time val signDay = messageEvent?.text?.sign_day val currBodyValue = messageEvent?.text?.current_body_value @@ -423,6 +425,7 @@ class RoomMentorShipFragment(var mRoomInfoResp: RoomInfoResp?) : fun event1091(messageEvent: RoomMessageEvent?) { val fromUserInfo = messageEvent?.text?.fromUserInfo val signId = messageEvent?.text?.sign_id + LogUtils.e("出价后的场次,mSignId = $mSignId") if (fromUserInfo != null && mSignId == signId) { val pitBean = RoomPitBean() pitBean.pit_number = indexList[2] diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java index c02c5d63..0f4dab77 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java @@ -129,7 +129,7 @@ public class SingSongFragment extends BaseRoomFragment { // 处理抱麦逻辑 - if(getActivity() != null && getActivity() instanceof RoomActivity) { + if (getActivity() != null && getActivity() instanceof RoomActivity) { ((RoomActivity) getActivity()).showUserListDialog(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); } popupWindow.dismiss(); @@ -416,7 +416,7 @@ public class SingSongFragment extends BaseRoomFragment() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(String s) { + } + }); + } + } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java index fd9998c0..2ff98f57 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java @@ -160,6 +160,24 @@ public class SingSongPresenter extends BaseRoomPresenter }); } + @Override + public void closePkMic(String pk_id, String type, String user_id) { + RetrofitClient.getInstance().closePkMic(pk_id, type, user_id, new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(String s) { + if (MvpRef==null) + MvpRef=new WeakReference<>(mView); + MvpRef.get().closePkMic(); + } + }); + } + public void postRoomSwToken(String roomId,int uid,int invite_pk_user_id) { RetrofitClient.getInstance().postRoomSwToken(roomId, new BaseObserver() { @Override diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java index f33baf3c..de75c963 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java @@ -1,6 +1,10 @@ package com.xscm.modulemain.activity.user.activity; +import android.content.Context; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -10,12 +14,19 @@ import android.text.TextWatcher; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; +import android.widget.ImageView; import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import com.alibaba.android.arouter.facade.annotation.Autowired; import com.alibaba.android.arouter.facade.annotation.Route; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.luck.picture.lib.engine.CropFileEngine; import com.xscm.modulemain.R; import com.xscm.modulemain.databinding.ActivityCreatedRoomBinding; import com.example.zhouwei.library.CustomPopWindow; @@ -34,8 +45,12 @@ import com.xscm.moduleutil.utils.GlideEngine; import com.xscm.moduleutil.utils.ImageUtils; import com.xscm.moduleutil.utils.PermissionDescriptionHelper; import com.xscm.moduleutil.widget.Constants; +import com.xscm.moduleutil.widget.picker.PictureSelectorUtil; +import com.yalantis.ucrop.UCrop; +import com.yalantis.ucrop.UCropImageEngine; import java.io.File; +import java.util.ArrayList; import java.util.List; /** @@ -256,17 +271,65 @@ public class CreatedRoomActivity extends BaseMvpActivity dataSource, int requestCode) { + UCrop.Options options = pictureSelectorUtil.buildOptions(); + UCrop uCrop = UCrop.of(srcUri, destinationUri, dataSource); + uCrop.withOptions(options); + uCrop.setImageEngine(new UCropImageEngine() { + @Override + public void loadImage(Context context, String url, ImageView imageView) { + Glide.with(context).load(url).override(180, 180).into(imageView); + } + + @Override + public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) { + Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @org.jetbrains.annotations.Nullable Transition transition) { + if (call != null) { + call.onCall(resource); + } + } + + @Override + public void onLoadCleared(@org.jetbrains.annotations.Nullable Drawable placeholder) { + if (call != null) { + call.onCall(null); + } + } + }); + } + }); + uCrop.start(fragment.requireActivity(), fragment, requestCode); + } + }) + .forResult(requestCode); } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RoomDetailsActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RoomDetailsActivity.java index 60986eda..4c386e21 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RoomDetailsActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RoomDetailsActivity.java @@ -70,6 +70,7 @@ public class RoomDetailsActivity extends BaseMvpActivity implements GiftWallConacts.View{ private PageViewModel pageViewModel; - private FragmentGiftWallBinding binding; - private GiftWallAdapter mGiftWallAdapter; public static PlaceholderFragment newInstance(int index) { PlaceholderFragment fragment = new PlaceholderFragment(); @@ -47,7 +50,6 @@ public class PlaceholderFragment extends Fragment { pageViewModel = new ViewModelProvider(this).get(PageViewModel.class); int index = 1; if (getArguments() != null) { - index = getArguments().getInt(ARG_SECTION_NUMBER); // 获取传递的礼物列表数据 List giftList = @@ -64,37 +66,37 @@ public class PlaceholderFragment extends Fragment { } pageViewModel.setIndex(index); - mGiftWallAdapter= new GiftWallAdapter(new ArrayList<>()); } + @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected GiftWallPresenter bindPresenter() { + return new GiftWallPresenter(this,getActivity()); + } + + + @Override + protected void initData() { } @Override - public View onCreateView( - @NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + protected void initView() { - binding = FragmentGiftWallBinding.inflate(inflater, container, false); - View root = binding.getRoot(); - // 设置 GridView - GridView gridView = binding.gridView; - gridView.setAdapter(mGiftWallAdapter); - // 观察数据变化并更新 GridView - pageViewModel.getDataList().observe(getViewLifecycleOwner(), dataList -> { - if (dataList != null) { - mGiftWallAdapter.updateData(dataList); - } - }); - return root; + } + + @Override + protected int getLayoutId() { + return R.layout.dialog_placeholder; } @Override public void onDestroyView() { super.onDestroyView(); - binding = null; + } + + @Override + public void setGiftWall(GiftUserWallBean data) { + } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/PlaceholderGiftFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/PlaceholderGiftFragment.java index 5fb9242e..ae572532 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/PlaceholderGiftFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/PlaceholderGiftFragment.java @@ -22,8 +22,10 @@ import java.util.ArrayList; import java.util.List; /** - * A placeholder fragment containing a simple view. - */ +* @Author qx +* @Time 2026/1/20 9:53 +* @Description 礼物墙展示的fragment +*/ public class PlaceholderGiftFragment extends Fragment { private static final String ARG_SECTION_NUMBER = "section_number"; @@ -65,6 +67,14 @@ public class PlaceholderGiftFragment extends Fragment { pageViewModel.setIndex(index); mGiftWallAdapter= new GiftWallAdapter(new ArrayList<>()); + + mGiftWallAdapter.setOnUserClickListener(new GiftWallAdapter.OnUserClickListener() { + + @Override + public void onUserClick(GiftUserWallBean.GiftWallBean emotion) { + + } + }); } @Override diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/GiftWallAdapter.java b/MainModule/src/main/java/com/xscm/modulemain/adapter/GiftWallAdapter.java index ac69091b..06bb82be 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/GiftWallAdapter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/GiftWallAdapter.java @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.xscm.modulemain.R; import com.xscm.moduleutil.bean.CombinedGiftBean; import com.xscm.moduleutil.bean.GiftUserWallBean; +import com.xscm.moduleutil.bean.room.EmotionDeatils; import com.xscm.moduleutil.utils.ImageLoader; import com.xscm.moduleutil.utils.ImageUtils; @@ -28,6 +29,17 @@ import java.util.List; public class GiftWallAdapter extends BaseAdapter { private List mDataList; + private OnUserClickListener mOnUserClickListener; + // 定义接口 + public interface OnUserClickListener { + void onUserClick(GiftUserWallBean.GiftWallBean emotion); + } + + // 转换后的 Java 代码 + public void setOnUserClickListener(OnUserClickListener listener) { + this.mOnUserClickListener= listener; + } + public GiftWallAdapter(List dataList) { this.mDataList = dataList; } @@ -77,6 +89,18 @@ public class GiftWallAdapter extends BaseAdapter { holder.textView.setText(item.getGift_name()); // ImageUtils.loadHeadCC(item.getBase_image(), holder.iv_gift_image); holder.tv_price33.setText(item.getGift_price()); + + // 为整个礼物项添加点击事件 + holder.cl_gift_item.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (item.is_liang()) { + if (mOnUserClickListener != null) { + mOnUserClickListener.onUserClick(item); + } + } + } + }); TextView tv_number = holder.gift_num; @@ -113,8 +137,8 @@ public class GiftWallAdapter extends BaseAdapter { TopUsersAdapter topUsersAdapter = new TopUsersAdapter(displayUsers); recyclerView.setAdapter(topUsersAdapter); holder.tv_gift_values.setText("等" + item.getTop_users().size() + "人"); - } + } } else { diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt index fe0e1402..922c442f 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt @@ -1,25 +1,25 @@ package com.xscm.modulemain.adapter -import android.graphics.Color -import android.widget.TextView +import android.app.AlertDialog +import android.content.DialogInterface import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.BaseViewHolder import com.xscm.modulemain.R -import com.xscm.moduleutil.bean.BlackUserBean import com.xscm.moduleutil.bean.GroupBean -import com.xscm.moduleutil.color.ThemeableDrawableUtils import com.xscm.moduleutil.utils.MeHeadView /** * 项目名称:羽声语音 * 时间:2026/1/3 14:17 - * 用途: + * 用途:群成员列表 长按根据角色不同展示不同的权限 */ -class GroupUserListAdapter : BaseQuickAdapter(R.layout.item_group_user) { +class GroupUserListAdapter : + BaseQuickAdapter(R.layout.item_group_user) { interface OnItemClickListener { fun onItemClick(ismute: Int, item: GroupBean.GroupUserBean?) - } + fun onItemGroupMemberClick(item: GroupBean.GroupUserBean?, b: Boolean) + } private var onItemClickListener: OnItemClickListener? = null @@ -27,11 +27,12 @@ class GroupUserListAdapter : BaseQuickAdapter(R.id.im_user).setData(item?.avatar, "","") + helper.getView(R.id.im_user).setData(item?.avatar, "", "") helper.setText(R.id.tv_nick_name, item?.nickname) + if (isOwner == 1 || isOwner == 2) { + helper.setVisible(R.id.im_g, false) +// ThemeableDrawableUtils.setThemeableRoundedBackground( +// helper.getView(R.id.im_g), +// Color.parseColor("#333333"), +// 34 +// ) +// helper.getView(R.id.im_g).setTextColor(Color.WHITE) +// if (item?.is_mute == 1) { +// helper.getView(R.id.im_g).text = "解禁" +// ismute = 1 +// } else { +// helper.getView(R.id.im_g).text = "禁言" +// ismute = 0 +// } +// helper.getView(R.id.im_g).setOnClickListener { +// if (onItemClickListener != null) { +// onItemClickListener?.onItemClick(ismute, item) +// } +// } - if (isOwner){ - helper.setVisible(R.id.im_g, true) - ThemeableDrawableUtils.setThemeableRoundedBackground( - helper.getView(R.id.im_g), - Color.parseColor("#333333"), - 34 - ) - helper.getView(R.id.im_g).setTextColor(Color.WHITE) - if (item?.is_mute==1){ - helper.getView(R.id.im_g).text = "解禁" - ismute=1 - }else{ - helper.getView(R.id.im_g).text = "禁言" - ismute=0 + + helper.itemView.setOnLongClickListener { + showOptionsDialog( + item?.is_mute!!, + item, + if (item.group_role == 2) true else false + ) + return@setOnLongClickListener true } - helper.getView(R.id.im_g).setOnClickListener { - if (onItemClickListener != null) { - onItemClickListener?.onItemClick(ismute,item) - } - } - }else{ + } else { helper.setVisible(R.id.im_g, false) } } + + /** + * 显示选项对话框 + */ + private fun showOptionsDialog(ismute: Int, item: GroupBean.GroupUserBean?, b: Boolean) { + val options = arrayOf( + if (ismute == 1) "解禁" else "禁言", + if (b) "设置成普通成员" else "设置成管理员" + ) + if (isOwner != 1){ + options[1] = "" + } + val builder = AlertDialog.Builder(mContext) + builder.setTitle("选择操作") + .setItems( + options, + DialogInterface.OnClickListener { dialog: DialogInterface?, which: Int -> + when (which) { + 0 -> onItemClickListener?.onItemClick(ismute, item) + + 1 -> onItemClickListener?.onItemGroupMemberClick(item, b) + } + }) + .show() + } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/HorizontalListAdapter.java b/MainModule/src/main/java/com/xscm/modulemain/adapter/HorizontalListAdapter.java index a80b35e8..4ab35443 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/HorizontalListAdapter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/HorizontalListAdapter.java @@ -19,7 +19,7 @@ public class HorizontalListAdapter extends RecyclerView.Adapter data) { @@ -43,7 +43,7 @@ public class HorizontalListAdapter extends RecyclerView.Adapter { if (mListener != null) { - mListener.onItemClick(position,item,HorizontalListAdapter.this); + mListener.onItemClick(position, item, HorizontalListAdapter.this); } }); } @@ -135,6 +135,9 @@ public class HorizontalListAdapter extends RecyclerView.Adapter getDefaultTimeOptions() { List list = new ArrayList<>(); - list.add(new RoomAutionTimeBean(1)); list.add(new RoomAutionTimeBean(5)); list.add(new RoomAutionTimeBean(10)); list.add(new RoomAutionTimeBean(15)); diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomConcernDialogFragment.java b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomConcernDialogFragment.java index efdf3d14..8a944ad8 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomConcernDialogFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomConcernDialogFragment.java @@ -130,7 +130,7 @@ public class RoomConcernDialogFragment extends BaseMvpDialogFragment { + // 处理选择的时间范围 + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); + // 获取开始时间的Calendar实例 + Calendar startCalendar = Calendar.getInstance(); + startCalendar.setTime(startDate); +// 将秒设置为00 + startCalendar.set(Calendar.SECOND, 0); + +// 获取结束时间的Calendar实例 + Calendar endCalendar = Calendar.getInstance(); + endCalendar.setTime(endDate); +// 将秒设置为59 + endCalendar.set(Calendar.SECOND, 59); + +// 格式化时间 + String startTime = sdf.format(startCalendar.getTime()); + String endTime = sdf.format(endCalendar.getTime()); + + Log.d("SelectedTime", "开始时间:" + startTime); + Log.d("SelectedTime", "结束时间:" + endTime); + MvpPre.setRoomBusinessTime(roomId, startTime, endTime); +// MvpPre.getCharmList(roomId, stime, etime, currentPage + "", type); + }); + dialog.setShowDate(false); + dialog.setShowTime(true); + dialog.setShowSeconds(false); + dialog.show(getChildFragmentManager(), "DoubleTimePicker"); } } @@ -725,7 +760,7 @@ public class RoomSettingFragment extends BaseMvpDialogFragment + + + + + + + app:layout_constraintTop_toBottomOf="@+id/rl_do_not_disturb"> - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/top_bar"> + + + + + + + + + + + + + + + android:clipToPadding="false" + android:paddingBottom="@dimen/dp_40" /> diff --git a/MainModule/src/main/res/layout/activity_setting.xml b/MainModule/src/main/res/layout/activity_setting.xml index c445c49d..b3b58738 100644 --- a/MainModule/src/main/res/layout/activity_setting.xml +++ b/MainModule/src/main/res/layout/activity_setting.xml @@ -307,6 +307,31 @@ + + + + + + + + +