From 6098927e731754b6fd46916d35fd9804043e2223 Mon Sep 17 00:00:00 2001 From: lzl <1239365383@qq.com> Date: Thu, 30 Oct 2025 11:56:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6PK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xscm/moduleutil/BaseEvent.java | 3 + .../moduleutil/bean/RoomMessageEvent.java | 3 +- .../xscm/moduleutil/bean/room/PkRoomInfo.java | 1 + .../moduleutil/bean/room/RoomInfoResp.java | 2 +- .../bean/room/RoomUserJoinModel.java | 2 + .../moduleutil/event/RoomBanWheatEvent.java | 2 + .../moduleutil/event/RoomBeckoningEvent.java | 2 + .../moduleutil/event/RoomJoinMountModel.java | 2 + .../com/xscm/moduleutil/rtc/AgoraManager.java | 256 ++++++++- .../xscm/moduleutil/rtc/AgoraManagerEx.java | 362 ++++++++++++ .../utils/config/EnvironmentEnum.java | 4 +- .../widget/RoomDefaultWheatView.java | 26 +- .../moduleutil/widget/WheatLayoutManager.java | 62 +- .../res/layout/room_view_default_wheat.xml | 34 +- .../main/res/layout/room_view_ktv_wheat.xml | 4 +- .../activity/room/activity/RoomActivity.kt | 213 ++++--- .../room/contacts/SingSongContacts.java | 3 + .../room/fragment/ChatRoomFragment.java | 102 +++- .../room/fragment/FriendshipRoomFragment.java | 2 +- .../room/fragment/RoomCabinFragment.java | 353 +++++++++++- .../activity/room/fragment/RoomFragment.java | 15 +- .../room/fragment/SingSongFragment.java | 529 ++++++++++++++---- .../activity/room/fragment/VoiceFragment.java | 2 +- .../room/presenter/SingSongPresenter.java | 26 +- .../user/activity/CreatedRoomActivity.java | 4 +- .../user/activity/MyRoomActivity.java | 44 ++ .../dialog/RoomPkDialogFragment.java | 8 +- .../xscm/modulemain/manager/RoomManager.java | 72 +-- .../src/main/res/layout/fragment_room_ktv.xml | 55 +- .../main/res/layout/fragment_sing_song.xml | 2 +- .../main/res/layout/item_room_charm_rank.xml | 2 +- modulemain/src/main/res/layout/popup_menu.xml | 2 +- modulemain/src/main/res/layout/room_top.xml | 83 +-- 33 files changed, 1859 insertions(+), 423 deletions(-) create mode 100644 moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManagerEx.java diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/BaseEvent.java b/moduleUtil/src/main/java/com/xscm/moduleutil/BaseEvent.java index d2d5193a..0be483f2 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/BaseEvent.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/BaseEvent.java @@ -1,4 +1,7 @@ package com.xscm.moduleutil; +import lombok.Data; + +@Data public class BaseEvent { } diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java index 19238090..2d378246 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java @@ -70,7 +70,7 @@ public class RoomMessageEvent { private int count;//排麦模式下的人数 private int step ; //1:等待邂逅 2:心动连线 3:牵手良缘 private int friend_id; //场次id -// private List list;//交友心动值发生变化 + // private List list;//交友心动值发生变化 private List list;//交友房麦位发生变化 //推送的事麦上用户信息,这里使用了userinfo接收的 private FriendUserBean friend_user;//这是推送过来需要卡关系的数据 @@ -96,6 +96,7 @@ public class RoomMessageEvent { private String redpacket_id; private EmotionDeatils emoji; + private String is_pk;//是否是pk } @Data diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java index 85f56500..8c493019 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/PkRoomInfo.java @@ -18,4 +18,5 @@ public class PkRoomInfo implements Serializable { private String pk_room_value;//对方房间的pk值 private String pk_part;;//2:等待开始、3:进行中、4:惩罚阶段 private String pk_end_times; + private String receive_pk_user_id;//接受pk的用户id } diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomInfoResp.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomInfoResp.java index 0729ea36..aec96fb4 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomInfoResp.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomInfoResp.java @@ -121,7 +121,7 @@ public class RoomInfoResp implements Serializable { public class GiftXlh implements Serializable{ private XlhInfo xlh_info ; } -@Data + @Data public class XlhInfo implements Serializable{ private String activities_name; private String icon; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomUserJoinModel.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomUserJoinModel.java index 0ae91ed2..364b0e01 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomUserJoinModel.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/room/RoomUserJoinModel.java @@ -4,11 +4,13 @@ import com.xscm.moduleutil.BaseEvent; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode(callSuper = false) // 明确不调用父类(Any)的实现 public class RoomUserJoinModel extends BaseEvent { private String room_id; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBanWheatEvent.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBanWheatEvent.java index 21db3301..df4d36c0 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBanWheatEvent.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBanWheatEvent.java @@ -4,11 +4,13 @@ import com.xscm.moduleutil.BaseEvent; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode(callSuper = false) // 明确不调用父类(Any)的实现 public class RoomBanWheatEvent extends BaseEvent { private String roomId; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBeckoningEvent.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBeckoningEvent.java index b62906c4..5d9dd12c 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBeckoningEvent.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomBeckoningEvent.java @@ -4,11 +4,13 @@ import com.xscm.moduleutil.BaseEvent; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode(callSuper = false) // 明确不调用父类(Any)的实现 public class RoomBeckoningEvent extends BaseEvent { private String roomId; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomJoinMountModel.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomJoinMountModel.java index 763cdf35..c015db5e 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomJoinMountModel.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RoomJoinMountModel.java @@ -4,6 +4,7 @@ import com.xscm.moduleutil.BaseEvent; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; /** *@author qx @@ -13,6 +14,7 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode(callSuper = false) // 明确不调用父类(Any)的实现 public class RoomJoinMountModel extends BaseEvent { private String room_id; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java b/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java index f897176d..d946711d 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManager.java @@ -1,28 +1,34 @@ package com.xscm.moduleutil.rtc; +import static com.blankj.utilcode.util.SnackbarUtils.getView; +import static io.agora.rtc2.video.VideoEncoderConfiguration.*; import static io.agora.rtc2.video.VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15; -import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_LANDSCAPE; -import static io.agora.rtc2.video.VideoEncoderConfiguration.STANDARD_BITRATE; -import static io.agora.rtc2.video.VideoEncoderConfiguration.VD_1280x720; +import static io.agora.rtc2.video.VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_30; +import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.*; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.hardware.SensorManager; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; import android.os.Handler; import android.os.Looper; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; +import android.view.OrientationEventListener; import android.view.SurfaceView; -import android.view.WindowManager; +import android.view.WindowManager; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.blankj.utilcode.util.GsonUtils; -import com.blankj.utilcode.util.LogUtils; -import com.blankj.utilcode.util.PathUtils; -import com.blankj.utilcode.util.ThreadUtils; +import com.blankj.utilcode.util.*; import com.liulishuo.okdownload.DownloadTask; import com.liulishuo.okdownload.StatusUtil; import com.liulishuo.okdownload.core.cause.EndCause; @@ -39,12 +45,15 @@ import com.xscm.moduleutil.listener.MessageListenerSingleton; import com.xscm.moduleutil.utils.Md5Utils; import com.xscm.moduleutil.utils.SpUtil; import com.xscm.moduleutil.utils.logger.Logger; +//import com.tencent.bugly.idasc.crashreport.CrashReport; import org.greenrobot.eventbus.EventBus; import java.io.File; import java.io.FileInputStream; +import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -74,7 +83,7 @@ import io.agora.rtc2.video.VideoEncoderConfiguration; public class AgoraManager { private static volatile AgoraManager instance; - private static RtcEngineEx rtcEngine; + public static RtcEngineEx rtcEngine; // private RtcEngineEx rtcEngineEx; private static Context context; private boolean isLocalAudioEnabled = true; // 默认开启麦克风 @@ -93,6 +102,16 @@ public class AgoraManager { private String pkRoomId = ""; private static String lastRoomId; + public int pkUserId; + + public int getPkUserId() { + return pkUserId; + } + + public void setPkUserId(int pkUserId) { + this.pkUserId = pkUserId; + } + public void setLastRoomId(String value) { lastRoomId = value; } @@ -103,6 +122,8 @@ public class AgoraManager { } private AgoraManager() { +// this.context = context.getApplicationContext(); +// init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); } @@ -112,6 +133,8 @@ public class AgoraManager { if (instance == null) { instance = new AgoraManager(); context = con.getApplicationContext(); // 使用ApplicationContext避免内存泄漏 +// init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); +// init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); } } } @@ -149,6 +172,7 @@ public class AgoraManager { if (rtcEngine != null) { return; } + ; synchronized (AgoraManager.class) { if (rtcEngine != null) { @@ -198,19 +222,25 @@ public class AgoraManager { Log.w("AgoraManager", "Failed to set parameters", e); } - /*Enable video module*/ rtcEngine.enableVideo(); - - /*Set up to play remote sound with receiver*/ rtcEngine.setDefaultAudioRoutetoSpeakerphone(true); - } catch (Exception e) { Log.e("AgoraManager", "Failed to configure RtcEngine", e); } } } } - + public static int calculateScreenAngle(int orientation) { + if (orientation >= 315 || orientation < 45) { + return 0; // 竖屏(0度) + } else if (orientation >= 45 && orientation < 135) { + return 90; // 横屏右(90度) + } else if (orientation >= 135 && orientation < 225) { + return 180; // 倒竖屏(180度) + } else { + return 270; // 横屏左(270度) + } + } /** * 加入语音聊天房间 */ @@ -301,6 +331,19 @@ public class AgoraManager { */ private static IRtcEngineEventHandler getDefaultEventHandler() { return new IRtcEngineEventHandler() { + + @Override + public void onRemoteAudioStateChanged(int uid, int state, int reason, int elapsed) { + super.onRemoteAudioStateChanged(uid, state, reason, elapsed); + LogUtils.e("onRemoteAudioStateChanged", "uid------>" + uid, "state------>" + state, "reason------>" + reason, "elapsed------>" + elapsed); + } + + @Override + public void onUserMuteAudio(int uid, boolean muted) { + super.onUserMuteAudio(uid, muted); + LogUtils.e("onUserMuteAudio", "uid------>" + uid, "muted------>" + muted); + } + @Override public void onJoinChannelSuccess(String channel, int uid, int elapsed) { @@ -312,13 +355,53 @@ public class AgoraManager { } musicContentCenter = IAgoraMusicContentCenter.create(rtcEngine); contentCenterConfiguration = new MusicContentCenterConfiguration(); - // 已开启音乐内容中心项目的 App ID +// 已开启音乐内容中心项目的 App ID contentCenterConfiguration.appId = CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId(); - // 使用音乐内容中心的用户 ID。该 ID 可以和你加入 RTC 频道时使用的 uid 一致,但不能为 0 +// 使用音乐内容中心的用户 ID。该 ID 可以和你加入 RTC 频道时使用的 uid 一致,但不能为 0 contentCenterConfiguration.mccUid = uid; - // 填入用于鉴权的 Token +// 填入用于鉴权的 Token contentCenterConfiguration.token = SpUtil.getRtmToken(); +// 创建 IAgoraMusicContentCenterEventHandler,用于 SDK 向客户端发送音乐内容中心事件通知 +// contentCenterConfiguration.eventHandler = new IMusicContentCenterEventHandler() { +// @Override +// public void onPreLoadEvent(String requestId, long songCode, int percent, String lyricUrl, int status, int errorCode) { +// LogUtils.e("@@@1", "requestId: " + requestId + ", songCode: " + songCode + ", percent: " + percent + ", lyricUrl: " + lyricUrl + ", status: " + status + ", errorCode: " + errorCode); +// if (!lyricUrl.isEmpty() && percent == 100 && !isBjMusic) { +// getLyricsInstance(lyricUrl); +// } +//// musicPlayer.open(songCode, 0); +// } +// +// @Override +// public void onMusicCollectionResult(String requestId, int page, int pageSize, int total, Music[] list, int errorCode) { +// LogUtils.e("@@@2", "requestId: " + requestId + ", page: " + page + ", pageSize: " + pageSize + ", total: " + total); +// MusicBean musicBean = new MusicBean(); +// musicBean.setMusicList(Arrays.asList(list)); +// musicBean.setPage(page); +// EventBus.getDefault().post(musicBean); +// } +// +// @Override +// public void onMusicChartsResult(String requestId, MusicChartInfo[] list, int errorCode) { +// LogUtils.e("@@@", "requestId: " + requestId); +// } +// +// @Override +// public void onLyricResult(String requestId, long songCode, String lyricUrl, int errorCode) { +// LogUtils.e("@@@22", "requestId: " + requestId + ", songCode: " + songCode + ", lyricUrl: " + lyricUrl + ", errorCode: " + errorCode); +// if (lyricUrl != null && !isBjMusic) { +// getLyricsInstance(lyricUrl); +// } +// } +// +// @Override +// public void onSongSimpleInfoResult(String requestId, long songCode, String simpleInfo, int errorCode) { +// LogUtils.e("@@@", "requestId: " + requestId + ", songCode: " + songCode + ", simpleInfo: " + simpleInfo + ", errorCode: " + errorCode); +// } +// }; +// 初始化 IAgoraMusicContentCenter + musicContentCenter.initialize(contentCenterConfiguration); if (musicPlayer != null) { musicPlayer = null; @@ -333,6 +416,12 @@ public class AgoraManager { // getLyricsInstance(lyricUrl); } LogUtils.e("AgoraManager", "isPreload2: " + songCode, "percent: " + percent); + +// if (!lyricUrl.isEmpty() && percent == 100 && !isBjMusic) { +// musicPlayer.stop(); +// musicPlayer.open(songCode, 0); +//// getLyricsInstance(lyricUrl); +// } } @Override @@ -384,6 +473,13 @@ public class AgoraManager { @Override public void onUserJoined(int uid, int elapsed) {//远端用户加入频道 +// for (IRtcEngineEventHandler handler : eventHandlers) { +// if (handler != null) { +// handler.onUserJoined(uid, elapsed); +// +// } +// } + for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { if (listener != null) { ThreadUtils.runOnUiThread(() -> { @@ -404,13 +500,19 @@ public class AgoraManager { @Override public void onUserOffline(int uid, int reason) {//远端用户离开频道 +// for (IRtcEngineEventHandler handler : eventHandlers) { +// if (handler != null) { +// handler.onUserOffline(uid, reason); +// } for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { if (listener != null) { ThreadUtils.runOnUiThread(() -> { // 远程用户音量变化 listener.userOffline(uid, reason); +// } }); } +// } } SurfaceView renderView = null; rtcEngine.setupRemoteVideo(new VideoCanvas(null, Constants.RENDER_MODE_FIT, uid)); @@ -603,7 +705,7 @@ public class AgoraManager { } } - public void joinChannelEx(String token, String channelId, int uid) { + public void joinChannelEx(String token, String channelId, int uid,String pkUserIds) { if (rtcEngine == null) { init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); } @@ -615,10 +717,12 @@ public class AgoraManager { options.autoSubscribeAudio = true; connection = new RtcConnection(); connection.channelId = channelId; - connection.localUid = uid; + connection.localUid = SpUtil.getUserId(); pkRoomId = channelId; - rtcEngine.joinChannelEx(token, connection, options, getDefaultEventHandler()); - + pkUserId = Integer.parseInt(pkUserIds); +// rtcEngine.joinChannelEx(token, connection, options, getDefaultEventHandler()); +// muteAllRemoteAudioStreamsEx(true); +// muteAllRemoteAudioStreamsExUserId(false); } } @@ -628,7 +732,7 @@ public class AgoraManager { RtcConnection connection = new RtcConnection(); connection.channelId = mRoomId; connection.localUid = uid; - rtcEngine.leaveChannelEx(connection); +// rtcEngine.leaveChannelEx(connection); } } @@ -636,6 +740,16 @@ public class AgoraManager { if (rtcEngine != null) { options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; +// options.autoSubscribeVideo = true; +// options.autoSubscribeAudio = true; +//// 不发布摄像头采集的视频 +// options.publishCameraTrack = false; +//// 不发布麦克风采集的视频 +// options.publishMicrophoneTrack = false; +//// 在频道中发布屏幕采集的视频 +// options.publishScreenCaptureVideo = true; +//// 在频道中发布屏幕采集的音频 +// options.publishScreenCaptureAudio = true; rtcEngine.setScreenCaptureScenario(Constants.ScreenScenarioType.SCREEN_SCENARIO_VIDEO); rtcEngine.updateChannelMediaOptions(options); } @@ -643,7 +757,30 @@ public class AgoraManager { public void post() { if (rtcEngine != null) { +// rtcEngine.setParameters("{\"che.video.mobile_1080p\":true}"); +// rtcEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER); +// +// /*Enable video module*/ +// rtcEngine.enableVideo(); +// // Setup video encoding configs +// rtcEngine.setVideoEncoderConfiguration(new VideoEncoderConfiguration( +// VD_640x360, +// FRAME_RATE_FPS_15, +// STANDARD_BITRATE, +// ORIENTATION_MODE_ADAPTIVE +// )); +// /*Set up to play remote sound with receiver*/ +// rtcEngine.setDefaultAudioRoutetoSpeakerphone(true); + ScreenCaptureParameters screenCaptureParameters = new ScreenCaptureParameters(); +// screenCaptureParameters.captureVideo = true; +// screenCaptureParameters.videoCaptureParameters.width = 1440; +// screenCaptureParameters.videoCaptureParameters.height = 1940; +// screenCaptureParameters.videoCaptureParameters.framerate = 15; +// screenCaptureParameters.captureAudio = true; +// screenCaptureParameters.audioCaptureParameters.captureSignalVolume = 50; +//// screenCaptureParameters.videoCaptureParameters.bitrate = 500; +// rtcEngine.startScreenCapture(screenCaptureParameters); WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); @@ -670,6 +807,26 @@ public class AgoraManager { } + public void setExternalMediaProjection(MediaProjection[] mediaProjection){ + rtcEngine.setExternalMediaProjection(mediaProjection[0]); + } + + public void isPost(){ + if (rtcEngine != null){ + ScreenCaptureParameters screenCaptureParameters = new ScreenCaptureParameters(); + +// 设置新的屏幕共享参数 + screenCaptureParameters.captureVideo = true; + screenCaptureParameters.videoCaptureParameters.width = 1280; + screenCaptureParameters.videoCaptureParameters.height = 720; + screenCaptureParameters.videoCaptureParameters.framerate = 30; + +// 更新屏幕共享参数 + rtcEngine.updateScreenCaptureParameters(screenCaptureParameters); + + } + } + public void isMute(int index) { if (rtcEngine != null) { } @@ -681,6 +838,13 @@ public class AgoraManager { } } + public void stopMusicPlayer() { + if (musicPlayer != null) { + musicPlayer.stop(); + } + } + + /** * 完全销毁实例(只在应用退出时调用) */ @@ -727,17 +891,25 @@ public class AgoraManager { } } } - + //关闭对方的所有推流 public void muteAllRemoteAudioStreamsEx(boolean enabled) { if (rtcEngine == null) { init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); } if (rtcEngine != null) { +// RtcConnection connection = new RtcConnection(); +// connection.channelId = mRoomId; if (connection == null) { connection = new RtcConnection(); connection.channelId = pkRoomId; } - rtcEngine.muteAllRemoteAudioStreamsEx(enabled, connection); +// rtcEngine.muteAllRemoteAudioStreamsEx(enabled, connection); + } + } + //打开对方支持的推流 + public void muteAllRemoteAudioStreamsExUserId(boolean enabled){ + if (rtcEngine != null){ +// rtcEngine.muteRemoteAudioStreamEx(pkUserId,enabled,connection); } } @@ -755,14 +927,13 @@ public class AgoraManager { * 启用或者关闭远端音频流 * * @param enabled - * @param uid */ - public void muteLocalAudioStreamEx(boolean enabled, int uid) { + public void muteLocalAudioStreamEx(boolean enabled) { if (rtcEngine == null) { init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); } // 正确做法 - rtcEngine.muteLocalAudioStreamEx(enabled, connection); +// rtcEngine.muteLocalAudioStreamEx(enabled, connection); } /** @@ -796,6 +967,23 @@ public class AgoraManager { return isLocalAudioEnabled; } + /** + * 添加事件监听器(用于全局回调) + */ +// public void addEventHandler(IRtcEngineEventHandler handler) { +// if (handler != null && !eventHandlers.contains(handler)) { +// eventHandlers.add(handler); +// } +// } + + /** + * 移除事件监听器 + */ +// public void removeEventHandler(IRtcEngineEventHandler handler) { +// if (handler != null) { +// eventHandlers.remove(handler); +// } +// } public void addSoundLevelListener(SoundLevelUpdateListener listener) { if (soundLevelUpdateListeners != null) { soundLevelUpdateListeners.add(listener); @@ -1114,19 +1302,25 @@ public class AgoraManager { public static void stopMuisc() { if (musicPlayer != null) { +// if (musicPlayer.getState() == io.agora.mediaplayer.Constants.MediaPlayerState.PLAYER_STATE_PLAYING) { musicPlayer.stop(); +// } } } public void pauseMusic() { if (musicPlayer != null) { +// if (musicPlayer.getState() == io.agora.mediaplayer.Constants.MediaPlayerState.PLAYER_STATE_PLAYING) { musicPlayer.pause(); +// } } } public void resumeMusic() { if (musicPlayer != null) { +// if (musicPlayer.getState() == io.agora.mediaplayer.Constants.MediaPlayerState.PLAYER_STATE_PLAYING) { musicPlayer.resume(); +// } } } @@ -1268,6 +1462,7 @@ public class AgoraManager { @Override public void retry(@NonNull DownloadTask task, @NonNull ResumeFailedCause cause) { com.xscm.moduleutil.utils.logger.Logger.e("retry", cause); +// CrashReport.postCatchedException(new RuntimeException("下载文件重试:" + cause == null ? "" : cause.name())); } @Override @@ -1287,11 +1482,18 @@ public class AgoraManager { MusicFileBean musicFileBean = new MusicFileBean(); musicFileBean.setFileData(convertFileToByteArray(task.getFile())); EventBus.getDefault().post(musicFileBean); + if (cause != null && cause != EndCause.COMPLETED) { +// CrashReport.postCatchedException(new RuntimeException("下载任务结束:" + cause == null ? "" : cause.name() + "_realCause:" + realCause == null ? "" : realCause.getMessage())); + } } }); } } + public void setmSongCode(long songCode) { + mSongCode = songCode; + } + public void loadLrc(long songCode) { mSongCode = songCode; if (musicContentCenter != null) { diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManagerEx.java b/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManagerEx.java new file mode 100644 index 00000000..5b8254e7 --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/AgoraManagerEx.java @@ -0,0 +1,362 @@ +package com.xscm.moduleutil.rtc; + +import android.content.Context; +import android.util.Log; +import android.view.SurfaceView; + +import com.blankj.utilcode.util.LogUtils; +import com.blankj.utilcode.util.ThreadUtils; +import com.xscm.moduleutil.base.CommonAppContext; +import com.xscm.moduleutil.event.ColoseCardEvent; +import com.xscm.moduleutil.event.SurfaceEvent; +import com.xscm.moduleutil.interfaces.SoundLevelUpdateListener; +import com.xscm.moduleutil.utils.SpUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import io.agora.musiccontentcenter.IAgoraMusicContentCenter; +import io.agora.musiccontentcenter.IAgoraMusicPlayer; +import io.agora.musiccontentcenter.Music; +import io.agora.musiccontentcenter.MusicContentCenterConfiguration; +import io.agora.rtc2.ChannelMediaOptions; +import io.agora.rtc2.Constants; +import io.agora.rtc2.IRtcEngineEventHandler; +import io.agora.rtc2.RtcConnection; +import io.agora.rtc2.RtcEngineEx; +import io.agora.rtc2.video.VideoCanvas; + +/** + * com.xscm.moduleutil.rtc + * qx + * 2025/10/29 + */ +public class AgoraManagerEx { + + private static volatile AgoraManagerEx instance; + private static RtcEngineEx rtcEngineEx; + // private RtcEngineEx rtcEngineEx; + private static Context context; + private boolean isLocalAudioEnabled = true; // 默认开启麦克风 + // private final List eventHandlers = new ArrayList<>(); + private static IAgoraMusicContentCenter musicContentCenter; + private static IAgoraMusicPlayer musicPlayer; + private static MusicContentCenterConfiguration contentCenterConfiguration; + private static String mRoomId = ""; + private static long mSongCode; + + private static List musicList; + private static boolean isBjMusic = false; + private static List soundLevelUpdateListeners = new CopyOnWriteArrayList<>(); + private static ChannelMediaOptions options; + private static RtcConnection connection; + private String pkRoomId = ""; + private static String lastRoomId; + + public int pkUserId; + + public int getPkUserId() { + return pkUserId; + } + + public void setPkUserId(int pkUserId) { + this.pkUserId = pkUserId; + } + private static boolean isOnJoin = false; + public void setLastRoomId(String value) { + lastRoomId = value; + } + + public String getLastRoomId() { + LogUtils.e("上次的房间id:" + lastRoomId); + return lastRoomId; + } + + private AgoraManagerEx() { + + } + + public static AgoraManagerEx getInstance(Context con) { + if (instance == null) { + synchronized (AgoraManagerEx.class) { + if (instance == null) { + instance = new AgoraManagerEx(); + context = con.getApplicationContext(); // 使用ApplicationContext避免内存泄漏 + } + } + } + // 确保引擎已初始化 + if (rtcEngineEx == null) { + synchronized (AgoraManagerEx.class) { + if (rtcEngineEx == null) { + init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); + } + + } + } + return instance; + } + + public static void init(String appId) { + if (rtcEngineEx != null) { + return; + }; + + synchronized (AgoraManager.class) { + if (rtcEngineEx != null) { + return; + } + rtcEngineEx =AgoraManager.getInstance( context).rtcEngine; + +// try { +// RtcEngineConfig config = new RtcEngineConfig(); +// config.mContext = context; +// config.mAppId = appId; +// config.mEventHandler = getDefaultEventHandler(); +// config.mChannelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING; +// config.mAudioScenario = Constants.AUDIO_SCENARIO_CHORUS; +// config.mAreaCode = 1; +// +// rtcEngineEx = (RtcEngineEx) RtcEngineEx.create(config); +// } catch (Exception e) { +// Log.e("AgoraManager", "Failed to create RtcEngine", e); +// return; +// } +// +// if (rtcEngineEx != null) { +// try { +// rtcEngineEx.setAudioProfile(Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, +// Constants.AUDIO_SCENARIO_GAME_STREAMING); +// rtcEngineEx.enableAudioVolumeIndication(200, 3, true); +// rtcEngineEx.setClientRole(Constants.CLIENT_ROLE_BROADCASTER); +// rtcEngineEx.muteLocalAudioStream(true); // 默认静音 +// rtcEngineEx.muteAllRemoteAudioStreams(false); // 监听远端的音频 +// +// // 设置参数时添加异常处理 +// try { +// rtcEngineEx.setParameters("{\"che.audio.custom_payload_type\":73}"); +// rtcEngineEx.setParameters("{\"che.audio.custom_bitrate\":128000}"); +// rtcEngineEx.setParameters("{\"rtc.enable_nasa2\": true}"); +// rtcEngineEx.setParameters("{\"rtc.use_audio4\": true}"); +// rtcEngineEx.setParameters("{" + +// "\"rtc.report_app_scenario\":" + +// "{" + +// "\"appScenario\":" + 100 + "," + +// "\"serviceType\":" + 11 + "," + +// "\"appVersion\":\"" + rtcEngineEx.getSdkVersion() + "\"" + +// "}" + +// "}"); +// rtcEngineEx.setParameters("{\"che.video.mobile_1080p\":true}"); +// } catch (Exception e) { +// Log.w("AgoraManager", "Failed to set parameters", e); +// } +// /*Enable video module*/ +// rtcEngineEx.enableVideo(); +// /*Set up to play remote sound with receiver*/ +// rtcEngineEx.setDefaultAudioRoutetoSpeakerphone(true); +// +// } catch (Exception e) { +// Log.e("AgoraManager", "Failed to configure rtcEngineEx", e); +// } +// } + } + } + + private static IRtcEngineEventHandler getDefaultEventHandler() { + return new IRtcEngineEventHandler() { + + @Override + public void onRemoteAudioStateChanged(int uid, int state, int reason, int elapsed) { + super.onRemoteAudioStateChanged(uid, state, reason, elapsed); + LogUtils.e("onRemoteAudioStateChanged", "uid------>" + uid, "state------>" + state, "reason------>" + reason, "elapsed------>" + elapsed); + } + + @Override + public void onUserMuteAudio(int uid, boolean muted) { + super.onUserMuteAudio(uid, muted); + LogUtils.e("onUserMuteAudio", "uid------>" + uid, "muted------>" + muted); + } + + @Override + public void onJoinChannelSuccess(String channel, int uid, int elapsed) { + LogUtils.e("onJoinChannelSuccess", "channel------>" + channel, "uid------>" + uid, "elapsed------>" + elapsed); + if (!isOnJoin) { + AgoraIsOPen isOPen = new AgoraIsOPen(); + isOPen.setOpen(true); + EventBus.getDefault().post(isOPen); + isOnJoin = true; + } + + } + + @Override + public void onUserJoined(int uid, int elapsed) {//远端用户加入频道 + + for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { + if (listener != null) { + ThreadUtils.runOnUiThread(() -> { + // 远程用户音量变化 + listener.userJoined(uid, elapsed); +// } + }); + } + } + + } + + @Override + public void onUserOffline(int uid, int reason) {//远端用户离开频道 + for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { + if (listener != null) { + ThreadUtils.runOnUiThread(() -> { + // 远程用户音量变化 + listener.userOffline(uid, reason); +// } + }); + } +// } + } + } + + @Override + public void onAudioVolumeIndication(AudioVolumeInfo[] speakers, int totalVolume) { + super.onAudioVolumeIndication(speakers, totalVolume); + + if (speakers == null || speakers.length == 0) return; + + for (final AudioVolumeInfo info : speakers) { + final int uid = info.uid; + final int volume = info.volume; + + // 回调所有监听器 + for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { + if (listener != null) { + ThreadUtils.runOnUiThread(() -> { + // 远程用户音量变化 + listener.onRemoteSoundLevelUpdate(uid > 0 ? String.valueOf(uid) : SpUtil.getUserId() + "", volume); +// } + }); + } + } + } + } + + @Override + public void onLocalVideoStateChanged(Constants.VideoSourceType source, int state, int reason) { + super.onLocalVideoStateChanged(source, state, reason); + if (state == Constants.LOCAL_VIDEO_STREAM_STATE_CAPTURING && source.getValue() == Constants.VIDEO_SOURCE_SCREEN_PRIMARY) { + options.publishScreenCaptureAudio = true; + options.publishScreenCaptureVideo = true; + options.publishCameraTrack = false; + rtcEngineEx.updateChannelMediaOptions(options); + } + } + + @Override + public void onFirstRemoteAudioFrame(int uid, int elapsed) { + super.onFirstRemoteAudioFrame(uid, elapsed); + Log.i("RoomCabinFragment", "onFirstRemoteAudioFrame: uid->" + uid); + + + } + // 可继续扩展其他回调... + + + @Override + public void onFirstRemoteVideoFrame(int uid, int width, int height, int elapsed) { + super.onFirstRemoteVideoFrame(uid, width, height, elapsed); + SurfaceView renderView = new SurfaceView(context); + SurfaceEvent surfaceEvent = new SurfaceEvent(); + surfaceEvent.setSurfaceView(renderView); + surfaceEvent.setType(2); + rtcEngineEx.setupRemoteVideo(new VideoCanvas(renderView, Constants.RENDER_MODE_FIT, uid)); + EventBus.getDefault().post(surfaceEvent); + } + + @Override + public void onRemoteVideoStateChanged(int uid, int state, int reason, int elapsed) { + super.onRemoteVideoStateChanged(uid, state, reason, elapsed); + Log.i("RoomCabinFragment", "onRemoteVideoStateChanged:uid->" + uid + ", state->" + state); + if (state == Constants.REMOTE_AUDIO_STATE_STOPPED) { + ColoseCardEvent renderView = new ColoseCardEvent(); + EventBus.getDefault().post(renderView); + } else if (state == Constants.REMOTE_AUDIO_STATE_STARTING) { + + SurfaceView renderView = new SurfaceView(context); + rtcEngineEx.setupRemoteVideo(new VideoCanvas(renderView, Constants.RENDER_MODE_FIT, uid)); + SurfaceEvent surfaceEvent = new SurfaceEvent(); + surfaceEvent.setSurfaceView(renderView); + surfaceEvent.setType(2); + EventBus.getDefault().post(surfaceEvent); + } + } + + @Override + public void onError(int err) { + super.onError(err); + } + }; + } + public void joinChannelEx(String token, String channelId, String pkUserIds) { +// if (rtcEngineEx == null) { +// init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); +// }00602f7339ec98947deaeab173599891932IAAe1VwQOurJj57ZCxEJ3SO8VCK6MPKfAjdo5v/oOHPd5BTK+bCVBxwwIgDobHEAn5cDaQQAAQCflwNpAwCflwNpAgCflwNpBACflwNp + if (rtcEngineEx != null) { + options = new ChannelMediaOptions(); + options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; + options.channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING; + options.publishMicrophoneTrack = true; // 是否发布麦克风音频 + options.enableAudioRecordingOrPlayout = true; + options.autoSubscribeAudio = true; + connection = new RtcConnection(); + connection.channelId = channelId; + connection.localUid = SpUtil.getUserId(); + pkRoomId = channelId; + pkUserId = Integer.parseInt(pkUserIds); + rtcEngineEx.joinChannelEx(token, connection, options, getDefaultEventHandler()); + muteAllRemoteAudioStreamsEx(true); + muteAllRemoteAudioStreamsExUserId(false); + + } + } + + public void muteAllRemoteAudioStreamsEx(boolean enabled) { + if (rtcEngineEx == null) { + init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); + } + if (rtcEngineEx != null) { +// RtcConnection connection = new RtcConnection(); +// connection.channelId = mRoomId; +// if (connection == null) { +// connection = new RtcConnection(); +// connection.channelId = pkRoomId; +// } + rtcEngineEx.muteAllRemoteAudioStreamsEx(enabled, connection); + } + } + + public void muteLocalAudioStreamEx(boolean enabled) { + if (rtcEngineEx == null) { + init(CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId()); + } + // 正确做法 + rtcEngineEx.muteLocalAudioStreamEx(enabled, connection); + } + + public void muteAllRemoteAudioStreamsExUserId(boolean enabled){ + if (rtcEngineEx != null){ + rtcEngineEx.muteRemoteAudioStreamEx(pkUserId,enabled,connection); + } + } + + public void leaveChannelEx(String mRoomId, int uid) { + if (rtcEngineEx != null) { + RtcConnection connection = new RtcConnection(); + connection.channelId = mRoomId; + connection.localUid = uid; + rtcEngineEx.leaveChannelEx(connection); + } + } +} diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentEnum.java b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentEnum.java index 333db05c..4c9b8a1b 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentEnum.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentEnum.java @@ -16,7 +16,7 @@ public enum EnvironmentEnum { "tcp://81.70.45.221", "https://vespa.qxyushen.top/h5"), TEST(//测试环境 - "http://tmd.xscmmidi.site/", + "https://test.vespa.qxyushen.top/", "6rdWuz058oq5OahdbFiGEybUcdahd12J83L34Uc7MrPIrxtFG+rXiwDvRcqNvjwbClbbmvMrmxKVkIysFByBsl0Qe9kqd2w8T/nhK5G6eXXlk2V9AjYCieIU+jRnjZBB+Cfechr6rCGJ2aeBARIsXcRPW7wm9WFK9euh5T+v6Pyte68yNaNdcYCll3+U4/uCEog7HygCnMIbAU+kqoPdmn2H+51YOHW+VsnsHd4w1+I3f8Tt0xLIXGM4GWnQueZ5GR46GTWiSYMy8dCIh9SPIMRyC91GosVcfGPMJSdcXqc=", "https://oss-cn-beijing.aliyuncs.com/", "LTAI5tKgrfcFQxH46ZwWYgFW", @@ -24,7 +24,7 @@ public enum EnvironmentEnum { "midi01", "https://midi01.oss-cn-beijing.aliyuncs.com/", "wxc7681513be9f926b", - 1600106397, + 1600096890, "02f7339ec98947deaeab173599891932", "tcp://1.13.181.248", "https://tmd.xscmmidi.site/h5"); diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/RoomDefaultWheatView.java b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/RoomDefaultWheatView.java index 3c0b178a..30886b4c 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/RoomDefaultWheatView.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/RoomDefaultWheatView.java @@ -133,8 +133,28 @@ public class RoomDefaultWheatView extends BaseWheatView { } // setCardiac(pitBean.getPit_number(), 0.0f); - } + updatePkState(bean); + } + private void updatePkState(RoomPitBean bean) { + if (bean.is_pk()) { + String userId = bean.getUser_id(); + if (userId != null && !userId.equals("0") && !userId.isEmpty()) { + tv_time_pk.setVisibility(VISIBLE); + setSex(bean.getCharm(), false); + mCharmView.setVisibility(GONE); + } else { + tv_time_pk.setVisibility(GONE); + } + } else { + tv_time_pk.setVisibility(GONE); + if (isOn()) { + mCharmView.setVisibility(VISIBLE); + }else { + mCharmView.setVisibility(GONE); + } + } + } public void setSex(String value, boolean format) { if (format) { tv_time_pk.setText(value); @@ -153,6 +173,10 @@ public class RoomDefaultWheatView extends BaseWheatView { } } + public void setTv_time_pk(boolean show){ + tv_time_pk.setVisibility(show?VISIBLE:GONE); + } + private boolean showSexIcon = false; private String sex; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/WheatLayoutManager.java b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/WheatLayoutManager.java index 28a36109..86c8a582 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/WheatLayoutManager.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/WheatLayoutManager.java @@ -9,6 +9,7 @@ import android.widget.LinearLayout; import androidx.annotation.Nullable; import com.xscm.moduleutil.R; +import com.xscm.moduleutil.bean.RoomMessageEvent; import com.xscm.moduleutil.bean.UserOnlineStatusBean; import com.xscm.moduleutil.bean.room.RoomPitBean; @@ -170,6 +171,9 @@ public class WheatLayoutManager { private void addWheatViewItem(LinearLayout row, int pitNumber, int itemWidth, int layoutType) { RoomDefaultWheatView wheatView = createWheatView(pitNumber); + if (layoutType==2){ + wheatView.setTv_time_pk(false); + } LinearLayout.LayoutParams params; if (pitNumber == 9 || pitNumber == 10) { @@ -226,25 +230,65 @@ public class WheatLayoutManager { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return metrics.widthPixels; } + public void setUpData(RoomMessageEvent event,int layoutType){ + String fromPit=event.getText().getFrom_pit_number()!=null?event.getText().getFrom_pit_number():""; + String toPitNumber=event.getText().getTo_pit_number()!=null?event.getText().getTo_pit_number():""; + if (fromPit.equals("") || toPitNumber.equals("")){ + return; + } + RoomDefaultWheatView fromWheatView = findWheatViewByPitNumber(Integer.parseInt(fromPit)); + RoomDefaultWheatView toWheatView = findWheatViewByPitNumber(Integer.parseInt(toPitNumber)); + RoomPitBean fromPitBean=fromWheatView.pitBean; + RoomPitBean toPitBean=toWheatView.pitBean; + String tmpNumber=fromPitBean.getPit_number(); + fromPitBean.setPit_number(toPitBean.getPit_number()); + toPitBean.setPit_number(tmpNumber); - public void updateSingleWheat(RoomPitBean pitBean, int pitNumber) { - if (pitList == null || pitList.isEmpty() || pitNumber < 1 || pitNumber > 10) return; - if (isSingleMode && this.currentSinglePit != pitNumber) return; + toWheatView.setData(fromPitBean); + fromWheatView.setData(toPitBean); - RoomDefaultWheatView wheatView = findWheatViewByPitNumber(pitNumber); - if (wheatView != null) { - wheatView.setData(pitBean); + if (layoutType==2){ + fromWheatView.setTv_time_pk(false); + toWheatView.setTv_time_pk(false); + }else if (layoutType==1){ + fromWheatView.setTv_time_pk(true); + toWheatView.setTv_time_pk(true); } } - public void updateSingleCharm(RoomPitBean pitBean, int pitNumber) { + public void updateSingleWheat(RoomPitBean pitBean, int pitNumber,int layoutType) { if (pitList == null || pitList.isEmpty() || pitNumber < 1 || pitNumber > 10) return; if (isSingleMode && this.currentSinglePit != pitNumber) return; RoomDefaultWheatView wheatView = findWheatViewByPitNumber(pitNumber); if (wheatView != null) { - wheatView.setCharm(pitBean.getCharm()); + pitBean.set_pk(true); + wheatView.setData(pitBean); + if (layoutType==2){ + wheatView.setTv_time_pk(false); + }else if (layoutType==1){ + wheatView.setTv_time_pk(true); + } + + } + } + + public void updateSingleCharm(RoomPitBean pitBean, int pitNumber,int layoutType) { + if (pitList == null || pitList.isEmpty() || pitNumber < 1 || pitNumber > 10) return; + if (isSingleMode && this.currentSinglePit != pitNumber) return; + + RoomDefaultWheatView wheatView = findWheatViewByPitNumber(pitNumber); + if (wheatView != null) { + RoomPitBean bean=wheatView.pitBean; + bean=pitBean ; + + if (layoutType==2){ + wheatView.setTv_time_pk(false); + }else if (layoutType==1){ + wheatView.setTv_time_pk(true); + } + wheatView.setSex(bean.getCharm(),true); } } @@ -276,7 +320,7 @@ public class WheatLayoutManager { public void refreshWheatData(List newPitList, List changedPits) { this.pitList = newPitList; for (int pitNumber : changedPits) { - updateSingleWheat(pitList.get(pitNumber - 1), pitNumber); + updateSingleWheat(pitList.get(pitNumber - 1), pitNumber,1); } } diff --git a/moduleUtil/src/main/res/layout/room_view_default_wheat.xml b/moduleUtil/src/main/res/layout/room_view_default_wheat.xml index cc9a6211..07be6e29 100644 --- a/moduleUtil/src/main/res/layout/room_view_default_wheat.xml +++ b/moduleUtil/src/main/res/layout/room_view_default_wheat.xml @@ -43,18 +43,18 @@ app:loopCount="0" app:source="ripple3695.svga" /> - - - - - - - - - - - - + + + + + + + + + + + + + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintHeight_percent="0.5" /> diff --git a/modulemain/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt b/modulemain/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt index 2ee35b81..879b758c 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt +++ b/modulemain/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt @@ -85,6 +85,7 @@ import com.xscm.modulemain.dialog.RoomMessageDialogFragment import com.xscm.modulemain.dialog.RoomOnlineDialogFragment import com.xscm.modulemain.dialog.RoomPkDialogFragment import com.xscm.modulemain.dialog.RoomSettingFragment +import com.xscm.modulemain.dialog.RoomUserInfoFragment import com.xscm.modulemain.dialog.SoundEffectsDialogFragment import com.xscm.modulemain.dialog.TourClubDialogFragment import com.xscm.modulemain.manager.RoomManager @@ -142,6 +143,7 @@ import com.xscm.moduleutil.interfaces.OnMusicItemClickListener import com.xscm.moduleutil.listener.MessageListenerSingleton import com.xscm.moduleutil.listener.MessageListenerSingleton.OnMessageReceivedListener import com.xscm.moduleutil.rtc.AgoraManager +import com.xscm.moduleutil.rtc.AgoraManagerEx import com.xscm.moduleutil.rtc.MusicPlayBean import com.xscm.moduleutil.service.MyRoomSingleton import com.xscm.moduleutil.utils.ARouteConstants @@ -154,6 +156,7 @@ import com.xscm.moduleutil.utils.roomview.GiftDisplayManager import com.xscm.moduleutil.widget.CircularProgressView import com.xscm.moduleutil.widget.CustomMusicFloatingView import com.xscm.moduleutil.widget.QXGiftPlayerManager +import com.xscm.moduleutil.widget.RoomKtvWheatView import com.xscm.moduleutil.widget.SilentCountDownTimer import com.xscm.moduleutil.widget.ViewUtils import com.xscm.moduleutil.widget.ViewUtils.OnViewCreatedListener @@ -599,7 +602,7 @@ class RoomActivity : BaseMvpActivity(), this.mRoomBean = roomBean this.mRoomUserBean = resp.user_info this.mRoomOwnerBean = resp.room_owner - this.mPitList = mRoomBean!!.pit_list + this.mPitList = mRoomBean?.pit_list ?: ArrayList() this.roomId = roomBean.room_id MessageListenerSingleton.getInstance().joinGroup(roomId) //加入房间im ImageUtils.loadHeadCC(resp.room_info.room_cover, mBinding!!.roomTop.avatar) @@ -618,16 +621,7 @@ class RoomActivity : BaseMvpActivity(), number = roomBean.online_number mBinding!!.roomTop.tvNum.text = number.toString() + "" - val userIds = StringBuilder() - for (i in mRoomInfoResp!!.room_info.pit_list.indices) { - val userId = mRoomInfoResp!!.room_info.pit_list[i].user_id - if (userId != null && userId != "0" && !userId.isEmpty()) { - if (userIds.length > 0) { - userIds.append(",") - } - userIds.append(userId) - } - } + setviewyc(true) // 确保Fragment已完全初始化后再调用getUpRoomInfo if (publicScreenFragment != null && publicScreenFragment!!.isAdded && publicScreenFragment!!.view != null) { publicScreenFragment!!.getUpRoomInfo(resp) @@ -639,7 +633,18 @@ class RoomActivity : BaseMvpActivity(), Log.e("Fragment", "Fragment transaction skipped due to state loss.") } LogUtils.e("加入", roomId) - + val userIds = StringBuilder() + if (mRoomInfoResp?.room_info?.pit_list != null) { + for (i in mRoomInfoResp?.room_info?.pit_list!!.indices) { + val userId = mRoomInfoResp!!.room_info.pit_list[i].user_id + if (userId != null && userId != "0" && !userId.isEmpty()) { + if (userIds.length > 0) { + userIds.append(",") + } + userIds.append(userId) + } + } + } CommonAppContext.getInstance().isPlaying = true CommonAppContext.getInstance().playId = roomId CommonAppContext.getInstance().playName = mRoomBean!!.room_name @@ -1194,7 +1199,11 @@ class RoomActivity : BaseMvpActivity(), view ) } - + mBinding!!.roomTop.muZc.setOnClickListener { view: View -> + this.onClick( + view + ) + } mBinding!!.inputMenu1.performClick() V2TIMManager.getConversationManager() @@ -1300,7 +1309,7 @@ class RoomActivity : BaseMvpActivity(), } else if (msgType == 1001) { handleMsgType1001() } else if (msgType == 1002) { - handleMsgType1002() + handleMsgType1002(messageEvent, text) } else if (msgType == 1029) { handleMsgType1029(messageEvent, text) } else if (msgType == 1021) { @@ -1329,7 +1338,7 @@ class RoomActivity : BaseMvpActivity(), setRoleType(3, -11) } } else if (msgType == 125) { - handleMsgType125(messageEvent, text) + handleMsgType125(messageEvent, text.text) } else if (msgType == 1006) { handleMsgType1006() } else if (msgType == 1007) { @@ -1744,13 +1753,13 @@ class RoomActivity : BaseMvpActivity(), for (roomPitBean in mRoomInfoResp!!.song_pit_list) { AgoraManager.getInstance(this@RoomActivity).ClientRole(false) ivWheatFeeding(com.xscm.moduleutil.R.mipmap.room_wheat_feeding) - mBinding!!.rlMic.visibility = View.GONE + mBinding?.rlMic?.visibility = View.GONE } if (mRoomInfoResp!!.song_user_info != null && mRoomInfoResp!!.song_user_info.user_id != null) { if (mRoomInfoResp!!.song_user_info.user_id == SpUtil.getUserId().toString() + "") { AgoraManager.getInstance(this@RoomActivity).ClientRole(false) ivWheatFeeding(com.xscm.moduleutil.R.mipmap.room_wheat_feeding) - mBinding!!.rlMic.visibility = View.GONE + mBinding?.rlMic?.visibility = View.GONE } } } @@ -1993,6 +2002,9 @@ class RoomActivity : BaseMvpActivity(), if (text.fromUserInfo.user_id == SpUtil.getUserId()) { LogUtils.e("退出房间") MvpPre!!.quitRoom(roomId, SpUtil.getUserId().toString() + "") + MessageListenerSingleton.quitGroup(roomId); + quit(); + performExitRoom(1); } } @@ -2001,12 +2013,18 @@ class RoomActivity : BaseMvpActivity(), mBinding!!.roomTop.tvNum.text = number.toString() + "" } - private fun handleMsgType1002() { + private fun handleMsgType1002(messageEvent: RoomMessageEvent, text: T?) { number-- if (number < 0) { number = 0 } mBinding!!.roomTop.tvNum.text = number.toString() + "" + if (text == null || text.fromUserInfo == null) return + if (text.fromUserInfo.user_id == SpUtil.getUserId()) { + MessageListenerSingleton.quitGroup(roomId); + quit(); + performExitRoom(1); + } } private fun handleMsgType1029(messageEvent: RoomMessageEvent, text: T?) { @@ -2204,23 +2222,19 @@ class RoomActivity : BaseMvpActivity(), return mRoomInfoResp } - private fun handleMsgType125(messageEvent: RoomMessageEvent, text: T?) { + private fun handleMsgType125(messageEvent: RoomMessageEvent, text: String) { if (text == null) return try { - val parsedText = GsonUtils.fromJson( - text.text, - text::class.java - ) + val parsedText: RoomMessageEvent.text = GsonUtils.fromJson(text, RoomMessageEvent.text::class.java) if (parsedText.is_mute == 1) { - AgoraManager.getInstance(this).ClientRole(false) - AgoraManager.getInstance(this).muteLocalAudioStreamEx(false, SpUtil.getUserId()) + AgoraManagerEx.getInstance(this).muteLocalAudioStreamEx(true) } else { - AgoraManager.getInstance(this).ClientRole(true) - AgoraManager.getInstance(this).muteLocalAudioStreamEx(true, SpUtil.getUserId()) + AgoraManagerEx.getInstance(this).muteLocalAudioStreamEx(false) } } catch (e: Exception) { // Handle exception + LogUtils.e("handleMsgType125: " + e.message) } } @@ -2536,9 +2550,58 @@ class RoomActivity : BaseMvpActivity(), aBoolean = true } } + } else if (id == R.id.mu_zc) { + val muZc: RoomKtvWheatView = mBinding!!.roomTop.muZc + if (muZc.getUserId() != "") { + RoomUserInfoFragment.show( + roomId, + muZc.getUserId(), + muZc.pitNumber, + getHostUser(), + false, + 2, + isNumberWhether(), + supportFragmentManager + ) + } else { + MvpPre!!.applyPit(roomId, "9") + } } } + private fun isNumberWhether(): Int { + if (mRoomInfoResp!!.getUser_info().getPit_number() == 9) { + return 1 + } + return 0 + } + + private fun getHostUser(): Int { + if (mRoomInfoResp?.getUser_info()?.getPit_number() == 9) { + return if (mRoomInfoResp?.getUser_info()?.getIs_room_owner() == 1) { + 1 + } else if (mRoomInfoResp?.getUser_info()?.getIs_management() == 1) { + 2 + } else if (mRoomInfoResp?.getUser_info()?.getIs_host() == 1) { + 3 + } else { + 4 + } + } else { + if (mRoomInfoResp?.getUser_info()?.getIs_room_owner() == 1) { + return 1 + } + if (mRoomInfoResp?.getUser_info()?.getIs_management() == 1) { + return 2 + } + if (mRoomInfoResp?.getUser_info()?.getIs_host() == 1) { + return 3 + } + return 4 + } + } + + // TODO: 2025/9/18 type==1:退出房间,进入到首页 2:退出当前页,不导航到首页,是从首页点击关闭悬浮退出的 fun performExitRoom(type: Int) { // 清理最小化状态 @@ -2597,13 +2660,6 @@ class RoomActivity : BaseMvpActivity(), appStateListener!!.isAppInBackground = true } QXGiftPlayerManager.getInstance(applicationContext).destroyEffectSvga() - - val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - val tasks = am.appTasks // 获取当前应用的任务栈 - tasks.forEach { task -> - Log.d("TaskStack", "任务栈ID:${task.taskInfo.id} currId:${this.getTaskId()},包含的Activity:${task.taskInfo.baseActivity?.className}") - } - if (ActivityUtils.getActivityList().size <= 1){ singleTaskToActivity(MainActivity::class.java) }else{ @@ -2723,12 +2779,12 @@ class RoomActivity : BaseMvpActivity(), } fun setrlMic(voive: Boolean) { - mBinding!!.rlMic.visibility = + mBinding?.rlMic?.visibility = if (voive) View.VISIBLE else View.GONE } fun rlMore(voive: Boolean) { - mBinding!!.rlMore.visibility = if (voive) View.GONE else View.GONE + mBinding!!.rlMore.visibility = if (voive) View.VISIBLE else View.GONE } fun ivMic(inIvMic: Int) { @@ -2736,16 +2792,15 @@ class RoomActivity : BaseMvpActivity(), } fun setRoleType(roleType: Int, pit_number: Int) { - val rl_voice = mBinding!!.rlVoive // 注意:原拼写错误已修正 - val rl_mic = mBinding!!.rlMic - val rl_more = mBinding!!.rlMore - val rl_misc = mBinding!!.rlMisc + val rl_voice = mBinding?.rlVoive // 注意:原拼写错误已修正 喇叭 + val rl_mic = mBinding?.rlMic//麦克风 + val rl_more = mBinding?.rlMore //PK + val rl_misc = mBinding?.rlMisc //音乐 - // 默认隐藏所有按钮 - rl_voice.visibility = View.GONE - rl_more.visibility = View.GONE - rl_misc.visibility = View.GONE - rl_mic.visibility = View.GONE + rl_voice?.visibility = View.GONE + rl_more?.visibility = View.GONE + rl_misc?.visibility = View.GONE + rl_mic?.visibility = View.GONE // 空指针保护 if (mRoomInfoResp == null || mRoomInfoResp!!.room_info == null || mRoomInfoResp!!.user_info == null) { @@ -2758,70 +2813,80 @@ class RoomActivity : BaseMvpActivity(), // 特殊房间类型处理(优先级最高) if ("6" == typeId) { - mBinding!!.rlMessage.visibility = View.GONE + mBinding?.rlMessage?.visibility = View.GONE return // 全部隐藏,无需继续处理 + } else { + mBinding?.rlMessage?.visibility = View.VISIBLE } // 根据角色类型显示按钮 when (roleType) { 1, 2, 3 -> { - rl_voice.visibility = View.VISIBLE - rl_mic.visibility = + rl_voice?.visibility = View.VISIBLE + rl_mic?.visibility = if (pit_number != 0) View.VISIBLE else View.GONE - rl_more.visibility = - if (pit_number == 9) View.GONE else View.GONE - rl_misc.visibility = View.VISIBLE + rl_more?.visibility = + if (pit_number == 9) View.VISIBLE else View.GONE + rl_misc?.visibility = View.VISIBLE } 0 -> { - rl_voice.visibility = View.VISIBLE - rl_mic.visibility = + rl_voice?.visibility = View.VISIBLE + rl_mic?.visibility = if (pit_number != 0) View.VISIBLE else View.GONE - rl_misc.visibility = View.VISIBLE + rl_misc?.visibility = View.VISIBLE } 5 -> { - rl_voice.visibility = View.VISIBLE - rl_more.visibility = View.GONE - rl_misc.visibility = View.VISIBLE + rl_voice?.visibility = View.VISIBLE + rl_more?.visibility = View.GONE + rl_misc?.visibility = View.VISIBLE } else -> {} } if (roleType != 5) { - rl_misc.visibility = View.VISIBLE + rl_misc?.visibility = View.VISIBLE if (userPitNumber == 9) { - rl_more.visibility = View.GONE + rl_more?.visibility = View.VISIBLE } } // label_id 和 type_id 联合判断 - if (mutableListOf("1", "3", "4", "8").contains(typeId) && "2" == labelId) { - rl_more.visibility = View.GONE + if (mutableListOf("1").contains(typeId) && "1" == labelId) { + rl_more?.visibility = View.VISIBLE + rl_misc?.visibility = View.VISIBLE + }else{ + rl_more?.visibility = View.GONE + rl_misc?.visibility = View.GONE } // mic 显示逻辑 if (userPitNumber > 0) { - rl_mic.visibility = View.VISIBLE - switchMic(2) - } else { - if (pit_number == 888) { - rl_mic.visibility = View.VISIBLE - switchMic(2) - } else if (pit_number == -1) { - rl_mic.visibility = View.VISIBLE // 原代码此处缺少 View. 前缀,已补全 + rl_mic?.visibility = View.VISIBLE + if (CommonAppContext.getInstance().isMai) { switchMic(1) } else { - rl_mic.visibility = View.GONE + switchMic(2) + } + } else { + if (pit_number == 888) { + rl_mic?.visibility = View.VISIBLE + switchMic(2) + } else if (pit_number == -1) { + rl_mic?.visibility = View.VISIBLE // 原代码此处缺少 View. 前缀,已补全 + switchMic(1) + } else { + rl_mic?.visibility = View.GONE switchMic(2) } } if ("7" == typeId || "2" == typeId) { - rl_more.visibility = View.GONE - rl_misc.visibility = View.GONE + rl_more?.visibility = View.GONE + rl_misc?.visibility = View.GONE } } @@ -2995,7 +3060,6 @@ class RoomActivity : BaseMvpActivity(), // TODO: 2025/8/26 加入房间 override fun roomInfo(resp: RoomInfoResp) { AppStateManager.getInstance().roomInfo = resp - this.mRoomInfoResp = resp val roomBean = resp.room_info this.mRoomBean = roomBean this.mRoomUserBean = resp.user_info @@ -3478,7 +3542,8 @@ class RoomActivity : BaseMvpActivity(), } xlhDjs(xlhBean.end_time) } else if (xlhBean.from_type == 104) { - + mBinding?.xlhRk?.visibility = View.GONE + releaseCountDownTimer1() } } } diff --git a/modulemain/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java b/modulemain/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java index 57b0b51e..d7f2f2fe 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java +++ b/modulemain/src/main/java/com/xscm/modulemain/activity/room/contacts/SingSongContacts.java @@ -4,6 +4,7 @@ import android.app.Activity; import com.xscm.moduleutil.activity.IPresenter; import com.xscm.moduleutil.activity.IView; +import com.xscm.moduleutil.bean.PkSwTokenBean; import com.xscm.moduleutil.bean.UserOnlineStatusBean; import com.xscm.moduleutil.bean.room.RoomInfoResp; @@ -22,6 +23,8 @@ public class SingSongContacts { void endPk(); void userOnlineStatus(List list); + + void postAgora(PkSwTokenBean pkSwTokenBean); } public interface IEmotionRoomPre extends IPresenter { diff --git a/modulemain/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java b/modulemain/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java index 36cbbae6..a2ecaf46 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java +++ b/modulemain/src/main/java/com/xscm/modulemain/activity/room/fragment/ChatRoomFragment.java @@ -60,15 +60,18 @@ public class ChatRoomFragment extends BaseMvpFragment { - // 确保在主线程更新 UI - if (getActivity() != null) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - handleRoomMessage(message); - } - }); + messageListener = new MessageListenerSingleton.PublicScreenMessageListener() { + @Override + public void onPublicScreenMessageReceived(RoomMessageEvent message) { + // 确保在主线程更新 UI + if (getActivity() != null) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + handleRoomMessage(message); + } + }); + } } }; MessageListenerSingleton.getInstance().addPublicScreenMessageListener(messageListener); @@ -174,6 +183,7 @@ public class ChatRoomFragment extends BaseMvpFragment 0) { mBinding.recycleViewPublic.removeAllViews(); } @@ -318,6 +332,8 @@ public class ChatRoomFragment extends BaseMvpFragment() { @Override public void onProgress(int progress) { @@ -399,9 +418,11 @@ public class ChatRoomFragment extends BaseMvpFragment 0) { int position = new Random().nextInt(emotionDeatils.getChildren().size()); Children children = emotionDeatils.getChildren().get(position); event.setImage(children.getImage()); @@ -419,11 +440,11 @@ public class ChatRoomFragment extends BaseMvpFragment() { @Override public void onProgress(int progress) { @@ -455,7 +476,7 @@ public class ChatRoomFragment extends BaseMvpFragment 0) { mBinding.recycleViewPublic.scrollToPosition(itemCount - 1); } } else { count++; - mBinding.tvCount.setText(count + "条新消息"); - mBinding.tvCount.setVisibility(View.VISIBLE); + if (mBinding.tvCount != null) { + mBinding.tvCount.setText(count + "条新消息"); + mBinding.tvCount.setVisibility(View.VISIBLE); + } // 当未读消息过多时,限制数量显示 if (count > 99) { - mBinding.tvCount.setText("99+条新消息"); + if (mBinding.tvCount != null) { + mBinding.tvCount.setText("99+条新消息"); + } } } } @@ -715,6 +747,8 @@ public class ChatRoomFragment extends BaseMvpFragment { + Intent intent = new Intent(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, getActivity().getPackageName()); + intent.putExtra(Settings.EXTRA_CHANNEL_ID, getActivity().getApplicationInfo().uid); + } else { + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + } + startActivity(intent); + dialog.dismiss(); + }) + .show(); + } @Override protected RoomCabinPresenter bindPresenter() { @@ -101,6 +145,76 @@ public class RoomCabinFragment extends BaseRoomFragment { - if (!isShow) { - switchMic(2); - isMute(1); - } else { - switchMic(1); + mBinding.im1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!isShow) { + switchMic(2); + isMute(1); + } else { + switchMic(1); + } + } - }); - mBinding.im2.setOnClickListener(v -> { - RoomPitBean roomPitBean = mBinding.roomMakeWheat2.pitBean; - UserInfo userInfo = new UserInfo(); - userInfo.setUser_id(Integer.parseInt(roomPitBean.getUser_id()!=null ? roomPitBean.getUser_id() : "0")); - userInfo.setNickname(roomPitBean.getNickname()); - userInfo.setAvatar(roomPitBean.getAvatar()); - userInfo.setPit_number(""); - RoomGiftDialogFragment.show(null, userInfo, roomInfoResp.getRoom_info().getRoom_id(),0,"", getParentFragmentManager()); + mBinding.im2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + RoomPitBean roomPitBean = mBinding.roomMakeWheat2.pitBean; + UserInfo userInfo = new UserInfo(); + userInfo.setUser_id(Integer.parseInt(roomPitBean.getUser_id()!=null ? roomPitBean.getUser_id() : "0")); + userInfo.setNickname(roomPitBean.getNickname()); + userInfo.setAvatar(roomPitBean.getAvatar()); + userInfo.setPit_number(""); + RoomGiftDialogFragment.show(null, userInfo, roomInfoResp.getRoom_info().getRoom_id(),0,"", getParentFragmentManager()); + } }); if (!CommonAppContext.getInstance().isShowAg){ switchMic(2); @@ -134,30 +254,62 @@ public class RoomCabinFragment extends BaseRoomFragment { - if (!isMicPlace) { - joinChannel(); - isMicPlace = true; - mBinding.im3.setImageResource(com.xscm.moduleutil.R.mipmap.clogs_car); - CommonAppContext.getInstance().isMicPlace = true; - } else { - isMicPlace = false; - ToastUtils.show("将停止屏幕共享"); - AgoraManager.getInstance(getActivity()).stopScreenCapture(); - mBinding.im3.setImageResource(com.xscm.moduleutil.R.mipmap.gongxiang); - CommonAppContext.getInstance().isMicPlace = false; + mBinding.im3.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { +// requestScreenCapture(); + if (!isMicPlace) { + joinChannel(); + isMicPlace = true; + mBinding.im3.setImageResource(com.xscm.moduleutil.R.mipmap.clogs_car); + CommonAppContext.getInstance().isMicPlace = true; + } else { + isMicPlace = false; + ToastUtils.show("将停止屏幕共享"); + AgoraManager.getInstance(getActivity()).stopScreenCapture(); + mBinding.im3.setImageResource(com.xscm.moduleutil.R.mipmap.gongxiang); + CommonAppContext.getInstance().isMicPlace = false; + } } }); if (roomInfoResp != null && roomInfoResp.getRoom_owner().getUser_id().equals(SpUtil.getUserId()+"")){ mBinding.im3.setVisibility(VISIBLE); +// setvkk(false); }else { mBinding.im3.setVisibility(GONE); } +// if (label_id!=null&& label_id.equals(LABEL_ID_MOVIE)){ +// mBinding.im3.setVisibility(GONE); +// } } + // 获取 MediaProjectionManager +// MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSelfActivity().getSystemService(Context.MEDIA_PROJECTION_SERVICE); +// private MediaProjection[] mediaProjection = new MediaProjection[1]; +// private final ActivityResultLauncher mediaProjectionLauncher = registerForActivityResult( +// new ActivityResultContracts.StartActivityForResult(), result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// try { +// // 获取申请到的 MediaProjection +// mediaProjection[0] = mediaProjectionManager +// .getMediaProjection(result.getResultCode(), result.getData()); +// // r MediaProjection,需要在 startScreenCapture 之前调用 +// +// AgoraManager.getInstance(getActivity()).setExternalMediaProjection(mediaProjection); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// ); - + // 请求屏幕捕获 + private void requestScreenCapture() { +// Intent intent = mediaProjectionManager.createScreenCaptureIntent(); +// mediaProjectionLauncher.launch(intent); + } public void handleMsgType1028(RoomMessageEvent messageEvent){ if (messageEvent.getMsgType()==1028){ mBinding.tvHeartValue2.setText(messageEvent.getText().getHot_value()); @@ -165,13 +317,85 @@ public class RoomCabinFragment extends BaseRoomFragment= Build.VERSION_CODES.O) { +// // Android 12+ 需要指定 foregroundServiceType +// Intent serviceIntent = new Intent(context, FloatingWindowService.class); +// serviceIntent.setAction("ACTION_START_FLOAT"); +// context.startForegroundService(serviceIntent); +// } +// +// } } @Override @@ -227,6 +480,7 @@ public class RoomCabinFragment extends BaseRoomFragment mediaProjectionLauncher = registerForActivityResult( +// new ActivityResultContracts.StartActivityForResult(), +// result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// try { +// mediaProjection[0] = mediaProjectionManager +// .getMediaProjection(result.getResultCode(), result.getData()); +// joinChannel(); +// } catch (Exception e) { +// Log.e("RoomCabinFragment", "error msg: " + e.getMessage()); +// } +// } +// } +// ); + + private void isConfig() { + + enableNotifications(); + } + + private void joinChannel() { AgoraManager.getInstance(getActivity()).updateChannelMediaOptions(); @@ -578,5 +867,11 @@ public class RoomCabinFragment extends BaseRoomFragment pitList; + private SharedViewModel sharedViewModel; public static SingSongFragment newInstance(RoomInfoResp roomInfoResp) { Bundle args = new Bundle(); @@ -124,6 +132,20 @@ public class SingSongFragment extends BaseRoomFragment { +// upDtaView(true); +// }); Observable.timer(10, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> { - upDtaView(true); - }); - Observable.timer(60, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(aLong -> { upDtaView(false); }); + + } public void upRoomInfo(RoomInfoResp roomInfoResp) { @@ -154,7 +179,16 @@ public class SingSongFragment extends BaseRoomFragment { +// if (data != null) { +// // 处理数据 +// roomInfoUpdate(data); +// } +// }); + roomId = roomInfoResp.getRoom_info().getRoom_id(); + initPopupWindow(); + return super.onCreateView(inflater, container, savedInstanceState); } @@ -208,49 +253,54 @@ public class SingSongFragment extends BaseRoomFragment 8) { +// if (roomInfoResp.getRoom_info().getPit_list().get(8).getUser_id().equals(SpUtil.getUserId() + "") && !pitNumber.equals("10")) { if (roomInfoResp.getUser_info().getPit_number() == 9 && !pitNumber.equals("10")) { return true; } @@ -317,6 +371,7 @@ public class SingSongFragment extends BaseRoomFragment pitList = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + RoomPitBean pitBean = new RoomPitBean(); + pitBean.setPit_number("" + i); + pitBean.setUser_id("0"); + pitBean.setCharm(""); + pitList.add(pitBean); + } + wheatLayoutSingManager.setWheatData(pitList, false); + } else { +// if (roomInfoResp.getPk_info() == null) { +// +// +// if (!ObjectUtils.isEmpty(roomInfoResp.getRoom_info().getPit_list()) && roomInfoResp.getRoom_info().getPit_list().size() == 10) { +// wheatLayoutSingManager.setWheatData(roomInfoResp.getRoom_info().getPit_list()); +// } +//// initWheatLayout(); +// } else { +// mBinding.flexboxLayout.setVisibility(View.GONE); +// mBinding.cl.setVisibility(View.VISIBLE); +// MvpPre.postRoomInfo(roomInfoResp.getPk_info().getPk_room_id(), roomInfoResp.getUser_info().getPit_number() + "", 1); +// +// } +// +// if (roomInfoResp.getUser_info().getPit_number() != 9) { +// mBinding.imMkf.setVisibility(GONE); +// } else { +// mBinding.imMkf.setVisibility(VISIBLE); +// } +// +// tzblChanged(); + } + + mBinding.btSta.setOnClickListener(this::onClick); + mBinding.btStop.setOnClickListener(this::onClick); + mBinding.imMkf.setOnClickListener(this::onClick); + + } + /** * 检查当前用户是否是房间的主持人 * @@ -536,55 +673,44 @@ public class SingSongFragment extends BaseRoomFragment list = new ArrayList<>(); + list.add(roomInfoResp.getRoom_info().getPit_list().get(i).getEmchat_username()); + break; } - }else if (event instanceof RoomUpPitBean){ - if (((RoomUpPitBean) event).getPit_number() != null && !((RoomUpPitBean) event).getPit_number().equals("")) { - RoomPitBean roomPitBean1 = GsonUtils.GsonToBean(GsonUtils.GsonString(event), RoomPitBean.class); - RoomPitBean roomPitBean = roomInfoResp.getRoom_info().getPit_list().get(Integer.parseInt(((RoomUpPitBean) event).getTo_pit_number()) - 1); - roomPitBean1.setPit_number(((RoomUpPitBean) event).getTo_pit_number()); - roomPitBean.setPit_number(((RoomUpPitBean) event).getPit_number()); - roomInfoResp.getRoom_info().getPit_list().set(Integer.parseInt(((RoomUpPitBean) event).getPit_number()) - 1, roomPitBean); - roomInfoResp.getRoom_info().getPit_list().set(Integer.parseInt(((RoomUpPitBean) event).getTo_pit_number()) - 1, roomPitBean1); - } - updateWheatData(); - }else if (event instanceof RoomUserJoinModel){ - Logger.e("@@@", "加入房间" + event); + + } + updateWheatData(); + } + + // TODO: 2025/3/26 离开房间 + @Subscribe(threadMode = ThreadMode.MAIN) + public void subscribeMessages(RoomOwnerLeaveEvent event) { + Logger.e("@@@", "离开房间" + event); + if (roomInfoResp.getRoom_info().getFriend().getFriend_status() == 2) { for (int i = 0; i < roomInfoResp.getRoom_info().getPit_list().size(); i++) { - if (((RoomUserJoinModel) event).getUser_id().equals(roomInfoResp.getRoom_info().getPit_list().get(i).getUser_id())) { + if (event.getUser_id().equals(roomInfoResp.getRoom_info().getPit_list().get(i).getUser_id())) { List list = new ArrayList<>(); list.add(roomInfoResp.getRoom_info().getPit_list().get(i).getEmchat_username()); break; } - } - updateWheatData(); - }else if (event instanceof RoomOwnerLeaveEvent){ - Logger.e("@@@", "离开房间" + event); - if (roomInfoResp.getRoom_info().getFriend().getFriend_status() == 2) { - for (int i = 0; i < roomInfoResp.getRoom_info().getPit_list().size(); i++) { - if (((RoomOwnerLeaveEvent) event).getUser_id().equals(roomInfoResp.getRoom_info().getPit_list().get(i).getUser_id())) { - List list = new ArrayList<>(); - list.add(roomInfoResp.getRoom_info().getPit_list().get(i).getEmchat_username()); - break; - } - } - } - - updateWheatData(); } + + updateWheatData(); } + @Override public void roomInfoUpdate(RoomInfoResp resp) { roomInfoResp = resp; roomId = roomInfoResp == null ? "" : roomInfoResp.getRoom_info().getRoom_id(); +// isWhether(); upWheter(); updateWheatData(); } @@ -602,9 +728,32 @@ public class SingSongFragment extends BaseRoomFragment { + // 点击“确认”按钮时执行删除操作 + MvpPre.endPk(roomInfoRespPk.getPk_info().getPk_id(), "3", SpUtil.getUserId() + ""); + }, + v -> { + // 点击“取消”按钮时什么都不做 + }, false, 0).show(); + } + private int pkStatus; private void ivitTop(RoomMessageEvent message) { @@ -1337,6 +1612,7 @@ public class SingSongFragment extends BaseRoomFragment { +// countDownTimer.cancel(); // 取消倒计时 +// dialog.dismiss(); // 手动关闭对话框 +// }); + Window window = dialog.getWindow(); if (window != null) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); @@ -1418,6 +1699,13 @@ public class SingSongFragment extends BaseRoomFragment { //我的房间 - ARouter.getInstance().build(ARouteConstants.MY_ROOM).navigation(); + ARouter.getInstance().build(ARouteConstants.MY_ROOM).withFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT).navigation(); }); // mBinding.ivRoom2.setOnClickListener(v -> { diff --git a/modulemain/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java b/modulemain/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java index 2325bdde..d37d14f5 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java +++ b/modulemain/src/main/java/com/xscm/modulemain/activity/room/presenter/SingSongPresenter.java @@ -2,6 +2,7 @@ package com.xscm.modulemain.activity.room.presenter; import android.content.Context; +import com.blankj.utilcode.util.LogUtils; import com.xscm.modulemain.activity.room.contacts.SingSongContacts; import com.xscm.moduleutil.base.BaseRoomPresenter; import com.xscm.moduleutil.base.CommonAppContext; @@ -93,8 +94,9 @@ public class SingSongPresenter extends BaseRoomPresenter if (MvpRef==null){ MvpRef=new WeakReference<>(mView); } - String appId = CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId(); - String token = roomInfoResp.getUser_info().getAgora_token(); // 如果启用了鉴权才需要 + if (roomInfoResp==null){ + return; + } String roomId = roomInfoResp.getRoom_info().getRoom_id(); // 房间 ID String rtm_token = roomInfoResp.getUser_info().getAgora_rtm_token(); SpUtil.setRtmToken(rtm_token); @@ -103,16 +105,18 @@ public class SingSongPresenter extends BaseRoomPresenter if (type==1) { if (roomInfoResp.getPk_info() != null) { if (number.equals("9")) { - postRoomSwToken(roomId,uid); + LogUtils.e("pk_info", ""+number); + postRoomSwToken(roomId,uid,roomInfoResp.getPk_info().getInvite_pk_user_id()); ///添加多频道 } } MvpRef.get().postRoomInfoPk(roomInfoResp); +// postRoomInfo(SpUtil.getMyRoomId(),"9",3); }else if (type==3){ - AgoraManager.getInstance(getView().getSelfActivity()).leaveChannelEx(roomInfoResp.getRoom_info().getLast_pk_room_id()+"", uid); +// AgoraManagerEx.getInstance(getView().getSelfActivity()).leaveChannelEx(roomInfoResp.getRoom_info().getLast_pk_room_id()+"", uid); MvpRef.get().postRoomInfoUp(roomInfoResp); }else { - AgoraManager.getInstance(getView().getSelfActivity()).leaveChannelEx(roomInfoResp.getRoom_info().getLast_pk_room_id()+"", uid); +// AgoraManagerEx.getInstance(getView().getSelfActivity()).leaveChannelEx(roomInfoResp.getRoom_info().getLast_pk_room_id()+"", uid); MvpRef.get().postRoomInfo(roomInfoResp); } @@ -156,7 +160,7 @@ public class SingSongPresenter extends BaseRoomPresenter }); } - public void postRoomSwToken(String roomId,int uid) { + public void postRoomSwToken(String roomId,int uid,String invite_pk_user_id) { RetrofitClient.getInstance().postRoomSwToken(roomId, new BaseObserver() { @Override public void onSubscribe(Disposable d) { @@ -167,8 +171,14 @@ public class SingSongPresenter extends BaseRoomPresenter public void onNext(PkSwTokenBean pkSwTokenBean) { if (pkSwTokenBean!=null){ if (pkSwTokenBean.getAgora_token() != null){ - AgoraManager.getInstance(getView().getSelfActivity()) - .joinChannelEx(pkSwTokenBean.getAgora_token(), roomId, uid); + if (MvpRef==null){ + MvpRef=new WeakReference<>(mView); + } + MvpRef.get().postAgora(pkSwTokenBean); + +// AgoraManager.getInstance(getView().getSelfActivity()) +// .joinChannelEx(pkSwTokenBean.getAgora_token(), roomId, uid); +// AgoraManager.getInstance(getView().getSelfActivity()).muteAllRemoteAudioStreamsExUserId(false, invite_pk_user_id); } } } diff --git a/modulemain/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java b/modulemain/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java index 537da875..7f655f13 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java +++ b/modulemain/src/main/java/com/xscm/modulemain/activity/user/activity/CreatedRoomActivity.java @@ -254,7 +254,7 @@ public class CreatedRoomActivity extends BaseMvpActivity { mBinding.ll.setVisibility(View.INVISIBLE); CommonAppContext.getInstance().isShow = false; diff --git a/modulemain/src/main/java/com/xscm/modulemain/dialog/RoomPkDialogFragment.java b/modulemain/src/main/java/com/xscm/modulemain/dialog/RoomPkDialogFragment.java index 4125e11f..cd3ac37a 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/dialog/RoomPkDialogFragment.java +++ b/modulemain/src/main/java/com/xscm/modulemain/dialog/RoomPkDialogFragment.java @@ -212,7 +212,13 @@ public class RoomPkDialogFragment extends BaseMvpDialogFragment roomBeans) { - mAdapter.setNewData(roomBeans); + if (page==1) { + mAdapter.setNewData(roomBeans); + }else { + if (roomBeans!=null) { + mAdapter.addData(roomBeans); + } + } } @Override diff --git a/modulemain/src/main/java/com/xscm/modulemain/manager/RoomManager.java b/modulemain/src/main/java/com/xscm/modulemain/manager/RoomManager.java index 48de0c7f..630b30f6 100644 --- a/modulemain/src/main/java/com/xscm/modulemain/manager/RoomManager.java +++ b/modulemain/src/main/java/com/xscm/modulemain/manager/RoomManager.java @@ -98,10 +98,10 @@ public class RoomManager { if (roomInfo != null) { // 使用缓存数据直接进入房间 - navigateToRoom(context, roomId, password, roomInfo, false,null); + navigateToRoom(context, roomId, password, roomInfo, false, null); } else { // 获取房间数据后进入房间 - fetchRoomDataAndEnter(context, roomId, password,null); + fetchRoomDataAndEnter(context, roomId, password, null); } } @@ -112,36 +112,36 @@ public class RoomManager { * @param roomId 房间ID * @param password 房间密码 */ - public void fetchRoomDataAndEnter(Context context, String roomId, String password,String taskId) { + public void fetchRoomDataAndEnter(Context context, String roomId, String password, String taskId) { // 显示加载提示 // 这里可以根据需要添加加载对话框 - if (CommonAppContext.getInstance().isRoomJoininj){ + if (CommonAppContext.getInstance().isRoomJoininj) { return; } - CommonAppContext.getInstance().isRoomJoininj=true; + CommonAppContext.getInstance().isRoomJoininj = true; // 检查是否有有效的缓存数据 - RoomInfoResp roomInfo = getCachedRoomData(roomId); + RoomInfoResp roomInfo = getCachedRoomData(roomId); // 检查是否是当前房间且用户在线 // boolean isCurrentRoom = isCurrentRoom(roomId); if (CommonAppContext.getInstance().playId == null) { - fetchAndJoinRoom(context, roomId, password,taskId); + fetchAndJoinRoom(context, roomId, password, taskId); } else { if (!CommonAppContext.getInstance().playId.equals(roomId)) { MessageListenerSingleton.getInstance().joinGroup(roomId); exitRoom(CommonAppContext.getInstance().playId); CommonAppContext.getInstance().isShow = false; CommonAppContext.getInstance().isPlaying = false; - CommonAppContext.getInstance().isRoomJoininj=false; + CommonAppContext.getInstance().isRoomJoininj = false; EventBus.getDefault().post(new RoomOutEvent()); } else if (CommonAppContext.getInstance().lable_id.equals("6")) { - upInfo(context, roomId, password, true, roomInfo, true,taskId); + upInfo(context, roomId, password, true, roomInfo, true, taskId); return; } - isUserOnline(context, roomId, password, roomInfo,taskId); + isUserOnline(context, roomId, password, roomInfo, taskId); } } - private void upInfo(Context context, String roomId, String password, boolean isOnline, RoomInfoResp roomInfo, boolean isCurrentRoom,String taskId) { + private void upInfo(Context context, String roomId, String password, boolean isOnline, RoomInfoResp roomInfo, boolean isCurrentRoom, String taskId) { if (isOnline) { RetrofitClient.getInstance().postRoomInfo(roomId, new BaseObserver() { @@ -152,11 +152,11 @@ public class RoomManager { @Override public void onNext(@NotNull RoomInfoResp roomInfoResp) { - navigateToRoom(context, roomId, password, roomInfoResp, false,taskId); + navigateToRoom(context, roomId, password, roomInfoResp, false, taskId); } }); } else { - fetchAndJoinRoom(context, roomId, password,taskId); + fetchAndJoinRoom(context, roomId, password, taskId); } } @@ -167,7 +167,7 @@ public class RoomManager { * @param roomId 房间ID * @param password 房间密码 */ - private void fetchAndJoinRoom(Context context, String roomId, String password,String taskId) { + private void fetchAndJoinRoom(Context context, String roomId, String password, String taskId) { // 获取房间数据 RetrofitClient.getInstance().roomGetIn(roomId, password, new BaseObserver() { @@ -177,24 +177,26 @@ public class RoomManager { @Override public void onNext(RoomInfoResp resp) { - String appId = CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId(); - String token = resp.getUser_info().getAgora_token(); // 如果启用了鉴权才需要 - String roomId = resp.getRoom_info().getRoom_id(); // 房间 ID - String rtm_token = resp.getUser_info().getAgora_rtm_token(); - SpUtil.setRtmToken(rtm_token); - int uid = SpUtil.getUserId(); // 0 表示由 Agora 自动生成 UID - boolean enableMic = false; // 是否开启麦克风 - boolean enableJs = false; // 是否开启角色 - if (resp.getUser_info().getPit_number() != 0) { - enableJs = true; + if (resp != null) { + String appId = CommonAppContext.getInstance().getCurrentEnvironment().getSwSdkAppId(); + String token = resp.getUser_info().getAgora_token(); // 如果启用了鉴权才需要 + String roomId = resp.getRoom_info().getRoom_id(); // 房间 ID + String rtm_token = resp.getUser_info().getAgora_rtm_token(); + SpUtil.setRtmToken(rtm_token); + int uid = SpUtil.getUserId(); // 0 表示由 Agora 自动生成 UID + boolean enableMic = false; // 是否开启麦克风 + boolean enableJs = false; // 是否开启角色 + if (resp.getUser_info().getPit_number() != 0) { + enableJs = true; + } + LogUtils.e("token", token); + LogUtils.e("roomId:", roomId); + // 初始化 Agora 并加入房间 + AgoraManager.getInstance(context) + .joinRoom(token, roomId, uid, enableMic, enableJs); + cacheRoomData(roomId, resp); + navigateToRoom(context, roomId, password, resp, false, taskId); } - LogUtils.e("token", token); - LogUtils.e("roomId:", roomId); - // 初始化 Agora 并加入房间 - AgoraManager.getInstance(context) - .joinRoom(token, roomId, uid, enableMic, enableJs); - cacheRoomData(roomId, resp); - navigateToRoom(context, roomId, password, resp, false,taskId); } @Override @@ -235,7 +237,7 @@ public class RoomManager { * @param password 房间密码 * @param roomInfo 房间信息 */ - private void navigateToRoom(Context context, String roomId, String password, RoomInfoResp roomInfo, boolean isOnline,String taskId) { + private void navigateToRoom(Context context, String roomId, String password, RoomInfoResp roomInfo, boolean isOnline, String taskId) { try { // 构建跳转参数 @@ -246,11 +248,11 @@ public class RoomManager { if (!TextUtils.isEmpty(password)) { intent.putExtra("password", password); } - if (taskId != null){ + if (taskId != null) { intent.putExtra("taskId", taskId); } - if (roomInfo == null){ + if (roomInfo == null) { LogUtils.dTag("RoomActivity", "navigateToRoom:房间信息获取存在问题"); return; } @@ -312,7 +314,7 @@ public class RoomManager { * @param roomId 房间ID * @return true表示用户在线,false表示不在线 */ - private boolean isUserOnline(Context context, String roomId, String password, RoomInfoResp roomInfo,String taskId) { + private boolean isUserOnline(Context context, String roomId, String password, RoomInfoResp roomInfo, String taskId) { // 这里应该实现检查用户是否在线的逻辑 // 可以通过检查Agora是否还在房间中,或者通过服务端接口查询用户状态等方式实现 // 目前返回false,需要根据实际需求实现具体逻辑 diff --git a/modulemain/src/main/res/layout/fragment_room_ktv.xml b/modulemain/src/main/res/layout/fragment_room_ktv.xml index 60866ddd..dd790225 100644 --- a/modulemain/src/main/res/layout/fragment_room_ktv.xml +++ b/modulemain/src/main/res/layout/fragment_room_ktv.xml @@ -35,7 +35,7 @@ android:background="#4d000000" android:scaleType="fitXY" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent"/> @@ -77,7 +77,7 @@ app:lineSpacing="8dp" app:startOfVerseIndicatorPaddingTop="6dp" app:startOfVerseIndicatorRadius="4dp" - app:textSize="@dimen/sp_12" /> + app:textSize="@dimen/sp_12"/> + app:layout_constraintTop_toTopOf="parent"/> + tools:text="歌曲名称"/> + app:riv_oval="true"/> @@ -141,7 +141,7 @@ android:textColor="@color/color_FFFFF0F0" android:textSize="@dimen/sp_12" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + tools:text="歌曲名称"/> + app:room_wheat_number="-1"/> + android:src="@mipmap/accompany_on"/> + android:textSize="@dimen/sp_10"/> + android:src="@mipmap/muisc_reward"/> + android:textSize="@dimen/sp_10"/> + android:src="@mipmap/muisc_switch"/> + android:textSize="@dimen/sp_10"/> + android:src="@mipmap/muisc_end"/> + android:textSize="@dimen/sp_10"/> + android:src="@mipmap/muisc_set_up"/> + android:textSize="@dimen/sp_10"/> @@ -314,7 +314,7 @@ android:id="@+id/mu_zc" android:layout_width="@dimen/dp_62" android:layout_height="@dimen/dp_88" - android:layout_marginTop="-55dp" + android:layout_marginTop="-25dp" android:layout_marginEnd="@dimen/dp_5" android:clickable="true" android:elevation="9999dp" @@ -325,7 +325,8 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/cl_bj" app:layout_constraintTop_toTopOf="parent" - app:room_wheat_number="9" /> + app:room_wheat_number="9" + /> @@ -345,22 +346,26 @@ android:id="@+id/mu_jb" android:layout_width="@dimen/dp_62" android:layout_height="@dimen/dp_88" - android:layout_marginTop="@dimen/dp_2" + android:layout_marginTop="@dimen/dp_5" android:layout_marginEnd="@dimen/dp_5" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/cl_bj" app:layout_constraintTop_toBottomOf="@+id/mu_zc" - app:room_wheat_number="10" /> + app:room_wheat_number="10"/> + app:layout_constraintTop_toBottomOf="@+id/mu_jb" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintVertical_bias="0.0" + /> diff --git a/modulemain/src/main/res/layout/fragment_sing_song.xml b/modulemain/src/main/res/layout/fragment_sing_song.xml index c25121be..04803fab 100644 --- a/modulemain/src/main/res/layout/fragment_sing_song.xml +++ b/modulemain/src/main/res/layout/fragment_sing_song.xml @@ -185,7 +185,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/bt_stop" - android:text="未开始:04:25" + tools:text="未开始:04:25" android:textSize="@dimen/sp_12" android:textColor="@color/white" android:background="@mipmap/pk_djs" diff --git a/modulemain/src/main/res/layout/item_room_charm_rank.xml b/modulemain/src/main/res/layout/item_room_charm_rank.xml index 15a0eca8..f0942ea5 100644 --- a/modulemain/src/main/res/layout/item_room_charm_rank.xml +++ b/modulemain/src/main/res/layout/item_room_charm_rank.xml @@ -8,7 +8,7 @@ android:id="@+id/mu_rank" android:layout_width="@dimen/dp_62" android:layout_height="@dimen/dp_88" - app:layout_constraintDimensionRatio="1:1.2" + app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" diff --git a/modulemain/src/main/res/layout/popup_menu.xml b/modulemain/src/main/res/layout/popup_menu.xml index 0098db5e..f9d03cdc 100644 --- a/modulemain/src/main/res/layout/popup_menu.xml +++ b/modulemain/src/main/res/layout/popup_menu.xml @@ -1,6 +1,6 @@ + > - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + +