优化麦圈,泄漏处理

This commit is contained in:
2025-12-24 18:33:06 +08:00
parent 342cfd347c
commit 84fb05044a
11 changed files with 168 additions and 197 deletions

View File

@@ -256,13 +256,14 @@ public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends
@Override @Override
public void finish() { public void finish() {
EventBus.getDefault().unregister(this);
super.finish(); super.finish();
LogUtils.e(this.getComponentName()+"========finish"); LogUtils.e(this.getComponentName()+"========finish");
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
EventBus.getDefault().unregister(this);
// 移除背景更新监听器 // 移除背景更新监听器
BackgroundManager.getInstance().removeListener(this); BackgroundManager.getInstance().removeListener(this);
// 移除颜色变化监听器 // 移除颜色变化监听器

View File

@@ -18,6 +18,7 @@ import android.content.Context;
import android.media.projection.MediaProjection; import android.media.projection.MediaProjection;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.SystemClock;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.Display; import android.view.Display;
@@ -54,7 +55,9 @@ import java.io.FileInputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -120,6 +123,14 @@ public class AgoraManager {
private Disposable disposableB; private Disposable disposableB;
private Disposable disposableC; private Disposable disposableC;
// UI 刷新最小间隔ms
private static final long SOUND_UI_INTERVAL = 200;
private final Handler uiHandler = new Handler(Looper.getMainLooper());
private long lastDispatchTime = 0;
// 缓存本次声网回调的音量结果
private final Map<String, Integer> volumeCache = new HashMap<>();
public void setLastRoomId(String value) { public void setLastRoomId(String value) {
lastRoomId = value; lastRoomId = value;
} }
@@ -549,22 +560,33 @@ public class AgoraManager {
if (speakers == null || speakers.length == 0) return; if (speakers == null || speakers.length == 0) return;
for (final AudioVolumeInfo info : speakers) { // 1⃣ 构建局部 Map声网线程私有
final int uid = info.uid; Map<String, Integer> localMap = new HashMap<>();
final int volume = info.volume; for (AudioVolumeInfo info : speakers) {
String userId = info.uid > 0
? String.valueOf(info.uid)
: String.valueOf(SpUtil.getUserId());
localMap.put(userId, info.volume);
}
// 回调所有监听器 long now = SystemClock.uptimeMillis();
if (now - lastDispatchTime < SOUND_UI_INTERVAL) return;
lastDispatchTime = now;
// 2⃣ 只把“不可变快照”丢给 UI
uiHandler.post(() -> dispatchVolume(localMap));
}
private void dispatchVolume(Map<String, Integer> volumeSnapshot) {
if (soundLevelUpdateListeners.isEmpty()) return;
for (Map.Entry<String, Integer> entry : volumeSnapshot.entrySet()) {
for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) { for (SoundLevelUpdateListener listener : soundLevelUpdateListeners) {
if (listener != null) { if (listener != null) {
ThreadUtils.runOnUiThread(() -> { listener.onRemoteSoundLevelUpdate(entry.getKey(), entry.getValue());
// 远程用户音量变化
listener.onRemoteSoundLevelUpdate(uid > 0 ? String.valueOf(uid) : SpUtil.getUserId() + "", volume);
});
} }
} }
} }
} }
@Override @Override
public void onLocalVideoStateChanged(Constants.VideoSourceType source, int state, int reason) { public void onLocalVideoStateChanged(Constants.VideoSourceType source, int state, int reason) {
super.onLocalVideoStateChanged(source, state, reason); super.onLocalVideoStateChanged(source, state, reason);

View File

@@ -262,99 +262,16 @@ public abstract class BaseWheatView extends ConstraintLayout implements IBaseWhe
AgoraManager.getInstance().addSoundLevelListener(new SoundLevelUpdateListener() { AgoraManager.getInstance().addSoundLevelListener(new SoundLevelUpdateListener() {
@Override @Override
public void onRemoteSoundLevelUpdate(String userId, int soundLevel) { public void onRemoteSoundLevelUpdate(String userId, int soundLevel) {
if (mIvRipple == null) if (mIvRipple == null) return;
return; if (!userId.equals(pitBean.getUser_id())) return;
if (userId.equals(pitBean.getUser_id())) { boolean nowSpeaking = soundLevel > 0;
if (soundLevel == 0) { updateSpeakingState(nowSpeaking);
mIvRipple.pauseAnimation();
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
mIvRipple.setVisibility(INVISIBLE);
} else {
mIvRipple.setVisibility(VISIBLE);
mIvRipple.post(() -> {
if (!mIvRipple.isAnimating()) {
if (pitBean.getMic_cycle() != null && !pitBean.getMic_cycle().isEmpty()) {
if (mParser != null) {
mIvRipple.startAnimation();
} else {
mParser = new SVGAParser(getContext());
try {
mParser.decodeFromURL(new URL(pitBean.getMic_cycle()), new SVGAParser.ParseCompletion() {
@Override
public void onError() {
}
@Override
public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) {
if (mIvRipple == null)
return;
SVGADrawable drawable = new SVGADrawable(svgaVideoEntity);
mIvRipple.setImageDrawable(drawable);
mIvRipple.startAnimation();
}
});
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
} else {
mIvRipple.startAnimation();
}
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
iv_on_line.setVisibility(GONE);
}
});
}
}
} }
@Override @Override
public void onLocalSoundLevelUpdate(int volume) { public void onLocalSoundLevelUpdate(int volume) {
if (mIvRipple == null)
return;
if (volume == 0) {
mIvRipple.setVisibility(GONE);
} else {
mIvRipple.setVisibility(VISIBLE);
if (!mIvRipple.isAnimating()) {
if (pitBean.getMic_cycle()!=null && !pitBean.getMic_cycle().isEmpty()) {
if (mParser != null) {
mIvRipple.startAnimation();
} else {
mParser = new SVGAParser(getContext());
try {
mParser.decodeFromURL(new URL(pitBean.getMic_cycle()), new SVGAParser.ParseCompletion() {
@Override
public void onError() {
}
@Override
public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) {
if (mIvRipple == null)
return;
SVGADrawable drawable = new SVGADrawable(svgaVideoEntity);
mIvRipple.setImageDrawable(drawable);
mIvRipple.startAnimation();
}
});
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
}else {
mIvRipple.startAnimation();
}
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
iv_on_line.setVisibility(GONE);
}
}
} }
@Override @Override
@@ -379,6 +296,59 @@ public abstract class BaseWheatView extends ConstraintLayout implements IBaseWhe
} }
private boolean isSpeaking = false;
private void updateSpeakingState(boolean nowSpeaking) {
// 1⃣ 状态未变化,直接丢弃(核心)
if (nowSpeaking == isSpeaking) return;
isSpeaking = nowSpeaking;
if (!nowSpeaking) {
// 静音状态
mIvRipple.pauseAnimation();
mIvRipple.setVisibility(INVISIBLE);
return;
}
// 2⃣ 开始说话(只触发一次)
mIvRipple.setVisibility(VISIBLE);
iv_on_line.setVisibility(GONE);
CommonAppContext.getInstance().onlineMap.put(pitBean.getUser_id(), 1);
if (!mIvRipple.isAnimating()) {
startRippleAnimation();
}
}
private void startRippleAnimation() {
if (mParser != null) {
mIvRipple.startAnimation();
return;
}
if (pitBean.getMic_cycle() == null || pitBean.getMic_cycle().isEmpty()) {
mIvRipple.startAnimation();
return;
}
try {
mParser = new SVGAParser(getContext());
mParser.decodeFromURL(new URL(pitBean.getMic_cycle()),
new SVGAParser.ParseCompletion() {
@Override
public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) {
if (mIvRipple == null) return;
mIvRipple.setImageDrawable(new SVGADrawable(svgaVideoEntity));
mIvRipple.startAnimation();
}
@Override
public void onError() {}
});
} catch (MalformedURLException ignored) {}
}
public void setCharm(String charm) { public void setCharm(String charm) {
mCharmView.setSex(pitBean.getSex(), pitBean.getUser_id(), charm, false); mCharmView.setSex(pitBean.getSex(), pitBean.getUser_id(), charm, false);
} }

View File

@@ -70,7 +70,5 @@ dependencies {
api project(':tuichat') api project(':tuichat')
api project(':BaseModule') api project(':BaseModule')
api project(':appupdate') api project(':appupdate')
} }
apply plugin: 'com.alibaba.arouter' // apply plugin: 'com.alibaba.arouter' //

View File

@@ -58,7 +58,8 @@
android:exported="false" android:exported="false"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:windowSoftInputMode="adjustPan" /> android:windowSoftInputMode="adjustPan"
android:persistableMode="persistAcrossReboots"/><!-- 防止系统回收 View 层级Android 11+ -->
<activity <activity
android:name=".activity.room.activity.RedResultActivity" android:name=".activity.room.activity.RedResultActivity"
android:exported="true" /> android:exported="true" />

View File

@@ -29,6 +29,7 @@ import com.xscm.moduleutil.utils.CustomMsgCode
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import org.json.JSONObject import org.json.JSONObject
import java.io.File import java.io.File
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@@ -41,9 +42,20 @@ open class Application : CommonAppContext() {
var isAgoraStop = false var isAgoraStop = false
var inviteDialog: InviteDialog? = null var inviteDialog: InviteDialog? = null
var currDialogActivity: Activity? = null
// 改为弱引用持有Activity
private var mCurDialogActivityRef: WeakReference<Activity>? = null
fun setCurDialogActivity(activity: Activity?) {
mCurDialogActivityRef = WeakReference(activity)
}
fun getCurDialogActivity(): Activity? {
if (mCurDialogActivityRef != null) {
return mCurDialogActivityRef!!.get()
}
return null
}
@@ -77,6 +89,10 @@ open class Application : CommonAppContext() {
// 初始化单例实例 // 初始化单例实例
instance = this instance = this
configureLeakCanary()
// 初始化并预绘制视图 二卡八列 // 初始化并预绘制视图 二卡八列
WheatLayoutSingManager.init(this) WheatLayoutSingManager.init(this)
WheatLayoutSingManager.getInstance().setWheatData(null) WheatLayoutSingManager.getInstance().setWheatData(null)
@@ -91,6 +107,15 @@ open class Application : CommonAppContext() {
initImMsg() initImMsg()
} }
/**
* 自定义 LeakCanary 配置(解决误报、优化检测规则)
*/
private fun configureLeakCanary() {
// LeakCanary.config = LeakCanary.config.copy(
// retainedVisibleThreshold = 3, // 对象被观察几次GC未被回收才认为泄漏 (默认5)
// )
}
private fun initImMsg() { private fun initImMsg() {
MessageListenerSingleton.getInstance().setOnMsgTaskListener { event -> MessageListenerSingleton.getInstance().setOnMsgTaskListener { event ->
when (event.msgType) { when (event.msgType) {
@@ -240,7 +265,7 @@ open class Application : CommonAppContext() {
fun showInviteDialog(activity: Activity?, t: IndexRecommendRoom) { fun showInviteDialog(activity: Activity?, t: IndexRecommendRoom) {
if (isKeepScreenOn) if (isKeepScreenOn)
return return
if (activity != null && activity == currDialogActivity && inviteDialog != null) { if (activity != null && activity == getCurDialogActivity() && inviteDialog != null) {
inviteDialog?.setData(t) inviteDialog?.setData(t)
return return
} }
@@ -249,7 +274,7 @@ open class Application : CommonAppContext() {
inviteDialog = activity?.let { InviteDialog(it, t) } inviteDialog = activity?.let { InviteDialog(it, t) }
inviteDialog?.setData(t) inviteDialog?.setData(t)
currDialogActivity = activity setCurDialogActivity(activity)
} }
private fun initLogUtils() { private fun initLogUtils() {

View File

@@ -168,6 +168,7 @@ public abstract class BaseMvpActivity<P extends IPresenter, VDB extends ViewData
@Override @Override
protected void onDestroy() { protected void onDestroy() {
ClickUtils.clearAllClickRecords(); ClickUtils.clearAllClickRecords();
// 清理MQTT相关资源 // 清理MQTT相关资源
synchronized (mqttQueueLock) { synchronized (mqttQueueLock) {
mqttMessageQueue.clear(); mqttMessageQueue.clear();

View File

@@ -35,6 +35,7 @@ import com.alibaba.android.arouter.facade.annotation.Route;
import com.azhon.appupdate.listener.OnButtonClickListener; import com.azhon.appupdate.listener.OnButtonClickListener;
import com.azhon.appupdate.listener.OnDownloadListener; import com.azhon.appupdate.listener.OnDownloadListener;
import com.azhon.appupdate.manager.DownloadManager; import com.azhon.appupdate.manager.DownloadManager;
import com.azhon.appupdate.util.ApkUtil;
import com.blankj.utilcode.util.FragmentUtils; import com.blankj.utilcode.util.FragmentUtils;
import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ToastUtils; import com.blankj.utilcode.util.ToastUtils;
@@ -47,6 +48,7 @@ import com.tencent.imsdk.v2.V2TIMValueCallback;
import com.xscm.modulemain.Application; import com.xscm.modulemain.Application;
import com.xscm.modulemain.BaseMvpActivity; import com.xscm.modulemain.BaseMvpActivity;
import com.xscm.modulemain.R; import com.xscm.modulemain.R;
import com.xscm.modulemain.TransparentActivity;
import com.xscm.modulemain.activity.main.contacts.HomeContacts; import com.xscm.modulemain.activity.main.contacts.HomeContacts;
import com.xscm.modulemain.activity.main.presenter.HomePresenter; import com.xscm.modulemain.activity.main.presenter.HomePresenter;
import com.xscm.modulemain.activity.msg.fragment.NewsFragment; import com.xscm.modulemain.activity.msg.fragment.NewsFragment;
@@ -142,7 +144,7 @@ public class MainActivity extends BaseMvpActivity<HomePresenter, ActivityMainBin
} }
} }
// toActivity(TransparentActivity.class);
// 处理新的intent // 处理新的intent
// setIntent(intent); // setIntent(intent);
// 处理tab切换 // 处理tab切换
@@ -150,6 +152,12 @@ public class MainActivity extends BaseMvpActivity<HomePresenter, ActivityMainBin
} }
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
LogUtils.e("MainActivity", "onWindowFocusChanged:"+hasFocus);
}
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -184,6 +192,8 @@ public class MainActivity extends BaseMvpActivity<HomePresenter, ActivityMainBin
MessageListenerSingleton.getInstance().ensureListenersAdded(); MessageListenerSingleton.getInstance().ensureListenersAdded();
CommonAppContext.getInstance().upMqtt(); CommonAppContext.getInstance().upMqtt();
Application.Companion.getInstance().bgToForeground(); Application.Companion.getInstance().bgToForeground();
//delete downloaded old Apk
ApkUtil.Companion.deleteOldApk(this,getExternalCacheDir().getAbsolutePath() + "/yusheng.apk");
} }
@Override @Override

View File

@@ -178,10 +178,7 @@ import com.xscm.moduleutil.widget.ViewUtils
import com.xscm.moduleutil.widget.ViewUtils.OnViewCreatedListener import com.xscm.moduleutil.widget.ViewUtils.OnViewCreatedListener
import com.xscm.moduleutil.widget.floatingView.Floa import com.xscm.moduleutil.widget.floatingView.Floa
import io.agora.musiccontentcenter.Music import io.agora.musiccontentcenter.Music
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
@@ -192,7 +189,6 @@ import java.lang.ref.WeakReference
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.Arrays import java.util.Arrays
import java.util.Date import java.util.Date
import java.util.concurrent.TimeUnit
import java.util.stream.Collectors import java.util.stream.Collectors
@Route(path = ARouteConstants.ROOM_DETAILS) @Route(path = ARouteConstants.ROOM_DETAILS)
@@ -235,10 +231,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
private var circularProgress: CircularProgressView? = null private var circularProgress: CircularProgressView? = null
private var publicScreenFragment: ChatRoomFragment? = null // 添加成员变量 private var publicScreenFragment: ChatRoomFragment? = null // 添加成员变量
// 存储当前显示的弹框引用
private val activeDialogs: MutableList<DialogInterface> = ArrayList()
private val activeDialogFragments: MutableList<Fragment> = ArrayList()
private var isMinimized = false private var isMinimized = false
private var appStateListener: AppStateListener? = null private var appStateListener: AppStateListener? = null
@@ -289,16 +281,20 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
taskId = intent.getStringExtra("taskId") taskId = intent.getStringExtra("taskId")
mRoomInfoResp = roomInfoResp mRoomInfoResp = roomInfoResp
} }
setView(mRoomInfoResp)
toActivity(TransparentActivity::class.java)
LogUtils.e("RoomActivity", "onNewIntent") LogUtils.e("RoomActivity", "onNewIntent")
} }
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
LogUtils.e("RoomActivity", "onWindowFocusChanged:${hasFocus}")
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
// 在super.onCreate之前设置主题以避免闪白屏
// setTheme(com.xscm.moduleutil.R.style.BaseAppTheme) // 设置你的主主题
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// // 进入房间10s后检查是否显示提示上麦对话框 // // 进入房间10s后检查是否显示提示上麦对话框
LogUtils.e("RoomActivity", "onCreate") LogUtils.e("RoomActivity", "onCreate")
isSave = false isSave = false
sDestroied = false sDestroied = false
@@ -606,16 +602,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
MvpPre?.getRoomOnline(roomId, "1", "10") MvpPre?.getRoomOnline(roomId, "1", "10")
} }
// 添加弹框到管理列表
fun addActiveDialog(dialog: DialogInterface) {
activeDialogs.add(dialog)
}
fun addActiveDialogFragment(dialogFragment: Fragment) {
activeDialogFragments.add(dialogFragment)
}
private var bgEffectView: View? = null private var bgEffectView: View? = null
private fun setupEffectView() { private fun setupEffectView() {
@@ -831,7 +817,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
} }
}) })
bottomSheet.show(supportFragmentManager, "ExitRoomBottomSheet") bottomSheet.show(supportFragmentManager, "ExitRoomBottomSheet")
addActiveDialogFragment(bottomSheet)
} }
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
@@ -906,21 +891,33 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
override fun onSelfInfoUpdated(info: V2TIMUserFullInfo?) {} override fun onSelfInfoUpdated(info: V2TIMUserFullInfo?) {}
} }
/**
* Sets up the room view with the provided room information response.
*
* @param resp The room information response object containing room details
* @param isSwitchRoomType Flag indicating if room type is being switched (default: false)
*/
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
private fun setView(resp: RoomInfoResp?, isSwitchRoomType: Boolean = false) { private fun setView(resp: RoomInfoResp?, isSwitchRoomType: Boolean = false) {
// Return early if response is null
if (resp == null) if (resp == null)
return return
// Update room info in app state manager and local instance
AppStateManager.getInstance().roomInfo = resp AppStateManager.getInstance().roomInfo = resp
this.mRoomInfoResp = resp this.mRoomInfoResp = resp
val roomBean = resp.room_info val roomBean = resp.room_info
// Log room info for debugging
LogUtils.e("setView_mRoomBean", resp.toString()) LogUtils.e("setView_mRoomBean", resp.toString())
// Set user and owner information
this.mRoomUserBean = resp.user_info this.mRoomUserBean = resp.user_info
this.mRoomOwnerBean = resp.room_owner this.mRoomOwnerBean = resp.room_owner
this.roomId = roomBean.room_id this.roomId = roomBean.room_id
// Load room cover image and set room details
ImageUtils.loadHeadCC(resp.room_info.room_cover, mBinding!!.roomTop.avatar) ImageUtils.loadHeadCC(resp.room_info.room_cover, mBinding!!.roomTop.avatar)
mBinding!!.roomTop.name.text = roomBean.room_name mBinding!!.roomTop.name.text = roomBean.room_name
mBinding!!.roomTop.idVal.text = "ID:" + roomBean.room_number mBinding!!.roomTop.idVal.text = "ID:" + roomBean.room_number
// Handle follow button visibility based on user role
if (mRoomUserBean?.getIs_room_owner() == 1) { if (mRoomUserBean?.getIs_room_owner() == 1) {
mBinding!!.roomTop.btnFollow.visibility = View.GONE mBinding!!.roomTop.btnFollow.visibility = View.GONE
} else { } else {
@@ -931,15 +928,19 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
mBinding!!.roomTop.btnFollow.text = "" mBinding!!.roomTop.btnFollow.text = ""
} }
} }
// Set online number display
number = roomBean.online_number number = roomBean.online_number
mBinding!!.roomTop.tvNum.text = number.toString() + "" mBinding!!.roomTop.tvNum.text = number.toString() + ""
// Set initial view if not switching room type
if (!isSwitchRoomType) { if (!isSwitchRoomType) {
setviewyc(true) setviewyc(true)
} }
// Log room join action
LogUtils.e("加入", roomId) LogUtils.e("加入", roomId)
// Build comma-separated user IDs from pit list
val userIds = StringBuilder() val userIds = StringBuilder()
if (mRoomInfoResp?.room_info?.pit_list != null) { if (mRoomInfoResp?.room_info?.pit_list != null) {
for (i in mRoomInfoResp?.room_info?.pit_list!!.indices) { for (i in mRoomInfoResp?.room_info?.pit_list!!.indices) {
@@ -952,6 +953,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
} }
} }
} }
// Update app context with room information
CommonAppContext.getInstance().isPlaying = true CommonAppContext.getInstance().isPlaying = true
CommonAppContext.getInstance().playId = roomId CommonAppContext.getInstance().playId = roomId
CommonAppContext.getInstance().playName = mRoomInfoResp?.room_info?.room_name CommonAppContext.getInstance().playName = mRoomInfoResp?.room_info?.room_name
@@ -959,6 +961,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
CommonAppContext.getInstance().playCover = resp.room_info.room_cover CommonAppContext.getInstance().playCover = resp.room_info.room_cover
CommonAppContext.getInstance().showSelf = resp.is_show_self == 1 CommonAppContext.getInstance().showSelf = resp.is_show_self == 1
// Update follow button appearance based on collection status
if (mRoomUserBean?.getIs_collect() == 1) { if (mRoomUserBean?.getIs_collect() == 1) {
mBinding!!.roomTop.btnFollow.background = mBinding!!.roomTop.btnFollow.background =
resources.getDrawable(com.xscm.moduleutil.R.mipmap.yishouc) resources.getDrawable(com.xscm.moduleutil.R.mipmap.yishouc)
@@ -972,19 +975,23 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
mBinding!!.roomTop.btnFollow.setTextColor(ColorManager.getInstance().buttonColorInt) mBinding!!.roomTop.btnFollow.setTextColor(ColorManager.getInstance().buttonColorInt)
mBinding!!.roomTop.btnFollow.text = "收藏" mBinding!!.roomTop.btnFollow.text = "收藏"
} }
// Set music type based on room type
if ((roomBean.type_id == "3" || roomBean.type_id == "1" || roomBean.type_id == "4") && roomBean.label_id == "2") { if ((roomBean.type_id == "3" || roomBean.type_id == "1" || roomBean.type_id == "4") && roomBean.label_id == "2") {
AgoraManager.getInstance().isBjMusic = false AgoraManager.getInstance().isBjMusic = false
} else { } else {
AgoraManager.getInstance().isBjMusic = true AgoraManager.getInstance().isBjMusic = true
} }
// Update user permissions
userPermissionChange() userPermissionChange()
// Hide PK and misc views for specific room types
if (resp.room_info.type_id == "7" || resp.room_info.type_id == "2") { if (resp.room_info.type_id == "7" || resp.room_info.type_id == "2") {
mBinding!!.rlPk.visibility = View.GONE mBinding!!.rlPk.visibility = View.GONE
mBinding!!.rlMisc.visibility = View.GONE mBinding!!.rlMisc.visibility = View.GONE
} }
// Handle lucky draw countdown visibility
if (mRoomInfoResp?.gift_cycle?.xlh_info?.xlh_status == "1") { if (mRoomInfoResp?.gift_cycle?.xlh_info?.xlh_status == "1") {
mBinding?.xlhRk?.visibility = View.VISIBLE mBinding?.xlhRk?.visibility = View.VISIBLE
xlhDjs(mRoomInfoResp?.gift_cycle?.xlh_info?.end_time) xlhDjs(mRoomInfoResp?.gift_cycle?.xlh_info?.end_time)
@@ -993,6 +1000,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
releaseCountDownTimer1() releaseCountDownTimer1()
} }
// Show/hide hourly ranking based on settings
if (mRoomInfoResp?.hour_ranking_open == 1) { if (mRoomInfoResp?.hour_ranking_open == 1) {
mBinding!!.clXsb.visibility = View.VISIBLE mBinding!!.clXsb.visibility = View.VISIBLE
} else { } else {
@@ -1098,9 +1106,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
roomId, null, roomId, null,
supportFragmentManager, "", "" supportFragmentManager, "", ""
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
}, 1400) }, 1400)
} }
hideGiftGiveProgress() hideGiftGiveProgress()
@@ -1133,9 +1138,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
roomId, null, roomId, null,
supportFragmentManager, "", "" supportFragmentManager, "", ""
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
}, 1400) }, 1400)
} }
hideGiftGiveProgress() hideGiftGiveProgress()
@@ -2258,6 +2260,10 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
val pitArr: MutableList<RoomPitBean> = ArrayList() val pitArr: MutableList<RoomPitBean> = ArrayList()
for (j in text.list.indices) { for (j in text.list.indices) {
val roomPitBean = getRoomPitBean(messageEvent, j) val roomPitBean = getRoomPitBean(messageEvent, j)
if(roomPitBean.user_id.equals(mRoomInfoResp?.user_info?.user_id.toString())){
mRoomInfoResp?.user_info?.pit_number = roomPitBean.pit_number.toInt()
roomBtnShowIsHide(mRoomInfoResp?.user_info?.user_id!!)
}
pitArr.add(roomPitBean) pitArr.add(roomPitBean)
} }
@@ -2458,7 +2464,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
}, true, 10 }, true, 10
) )
dialog.show() dialog.show()
addActiveDialog(dialog)
} }
/** /**
@@ -2521,11 +2526,9 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
roomNoticeDialogFragment.setTitle("公告") roomNoticeDialogFragment.setTitle("公告")
roomNoticeDialogFragment.setContent(mRoomInfoResp?.room_info?.room_intro) roomNoticeDialogFragment.setContent(mRoomInfoResp?.room_info?.room_intro)
roomNoticeDialogFragment.show() roomNoticeDialogFragment.show()
addActiveDialog(roomNoticeDialogFragment)
} else if (id == R.id.btn_ranking) { //排行榜 } else if (id == R.id.btn_ranking) { //排行榜
val fragment = RoomChartsFragment.newInstance(roomId, mRoomInfoResp) val fragment = RoomChartsFragment.newInstance(roomId, mRoomInfoResp)
fragment.show(supportFragmentManager, "RoomChartsFragment") fragment.show(supportFragmentManager, "RoomChartsFragment")
addActiveDialogFragment(fragment)
} else if (id == R.id.btn_close_live) { //退出房间 } else if (id == R.id.btn_close_live) { //退出房间
showExitRoomDialog() showExitRoomDialog()
} else if (id == R.id.tv_num) { } else if (id == R.id.tv_num) {
@@ -2572,9 +2575,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
mRoomInfoResp, mRoomInfoResp,
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} else if (id == R.id.rl_voive) { } else if (id == R.id.rl_voive) {
voive = !voive voive = !voive
if (voive) { if (voive) {
@@ -2597,39 +2597,26 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
LogUtils.e("pk_info", "id == R.id.rl_pk ${mRoomInfoResp?.room_info?.is_pk!!}") LogUtils.e("pk_info", "id == R.id.rl_pk ${mRoomInfoResp?.room_info?.is_pk!!}")
fragment.show(supportFragmentManager, "RoomPkDialogFragment") fragment.show(supportFragmentManager, "RoomPkDialogFragment")
addActiveDialogFragment(fragment) // 添加到管理列表
} else if (id == R.id.rl_message) { } else if (id == R.id.rl_message) {
val fragment = RoomMessageDialogFragment.show( val fragment = RoomMessageDialogFragment.show(
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} else if (id == R.id.rl_misc) { //设置点歌 } else if (id == R.id.rl_misc) { //设置点歌
val fragment = RequestDialogFragment.show( val fragment = RequestDialogFragment.show(
roomId, mRoomInfoResp, 1, roomId, mRoomInfoResp, 1,
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} else if (id == R.id.rl_gift) { //礼物 } else if (id == R.id.rl_gift) { //礼物
LogUtils.e("RoomGiftDialogFragment_RoomActivity"); LogUtils.e("RoomGiftDialogFragment_RoomActivity");
val fragment = RoomGiftDialogFragment.show( val fragment = RoomGiftDialogFragment.show(
mRoomInfoResp, null, roomId, 0, "", mRoomInfoResp, null, roomId, 0, "",
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} else if (id == R.id.iv_sound_effects) { } else if (id == R.id.iv_sound_effects) {
val fragment = SoundEffectsDialogFragment.show( val fragment = SoundEffectsDialogFragment.show(
roomId, roomId,
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} else if (id == R.id.cl_first_charge) { } else if (id == R.id.cl_first_charge) {
roomFragment!!.showWheatFeedingDialog( roomFragment!!.showWheatFeedingDialog(
roomId, roomId,
@@ -2776,7 +2763,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
{ v: View? -> }, false, 0 { v: View? -> }, false, 0
) )
dialog.show() dialog.show()
addActiveDialog(dialog)
} }
/** /**
@@ -3033,9 +3019,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
roomId, roomId,
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} }
mBinding!!.ivQuanC.setOnClickListener { v: View? -> mBinding!!.ivQuanC.setOnClickListener { v: View? ->
if (mRoomInfoResp?.room_info?.head_line?.room_id != null && mRoomInfoResp?.room_info?.head_line?.room_id!!.isNotEmpty()) { if (mRoomInfoResp?.room_info?.head_line?.room_id != null && mRoomInfoResp?.room_info?.head_line?.room_id!!.isNotEmpty()) {
@@ -3157,7 +3140,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
override fun showPasswordDialog() { override fun showPasswordDialog() {
val roomPasswordSetDialogFragment = RoomPasswordSetDialogFragment.newInstance(true, roomId) val roomPasswordSetDialogFragment = RoomPasswordSetDialogFragment.newInstance(true, roomId)
roomPasswordSetDialogFragment.show(supportFragmentManager) roomPasswordSetDialogFragment.show(supportFragmentManager)
addActiveDialogFragment(roomPasswordSetDialogFragment)
} }
override fun enterFail() { override fun enterFail() {
@@ -3195,9 +3177,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
roomId, mRoomInfoResp, 2, roomId, mRoomInfoResp, 2,
supportFragmentManager supportFragmentManager
) )
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} }
is RoomInputHideEvent -> { is RoomInputHideEvent -> {
@@ -3518,11 +3497,7 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
roomId, pitNumber, mOnlineBean, mRoomUserBean, mRoomInfoResp, roomId, pitNumber, mOnlineBean, mRoomUserBean, mRoomInfoResp,
supportFragmentManager supportFragmentManager
) )
LogUtils.e("fragment_onItemClickListener: ${(fragment != null)}") LogUtils.e("fragment_onItemClickListener: ${(fragment != null)}")
if (fragment != null) {
addActiveDialogFragment(fragment) // 添加到管理列表
}
} }
override fun applyPit() { override fun applyPit() {
@@ -3850,8 +3825,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
// if (AgoraManager.getInstance() != null) { // if (AgoraManager.getInstance() != null) {
// AgoraManager.getInstance().cleanup(); // AgoraManager.getInstance().cleanup();
// } // }
// 清理所有弹框
dismissAllDialogs()
// 7. 清理 Fragment // 7. 清理 Fragment
cleanupFragments() cleanupFragments()
@@ -3897,34 +3870,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
newParent.addView(view) newParent.addView(view)
} }
// 清理所有弹框
private fun dismissAllDialogs() {
// 关闭 AlertDialog 实例
for (dialog in activeDialogs) {
if (dialog != null) {
try {
dialog.dismiss()
} catch (e: Exception) {
LogUtils.e("dismiss dialog error: " + e.message)
}
}
}
activeDialogs.clear()
// 移除 DialogFragment
for (fragment in activeDialogFragments) {
if (fragment != null && fragment.isAdded) {
try {
if (fragment is DialogFragment) {
fragment.dismissAllowingStateLoss()
}
} catch (e: Exception) {
LogUtils.e("dismiss dialog fragment error: " + e.message)
}
}
}
activeDialogFragments.clear()
}
private fun clearSVGAResources() { private fun clearSVGAResources() {
try { try {
@@ -4319,8 +4264,6 @@ class RoomActivity : BaseMvpActivity<RoomPresenter?, ActivityRoomBinding?>(),
LogUtils.e("AlertDialog已关闭") LogUtils.e("AlertDialog已关闭")
} }
dialog.show() dialog.show()
addActiveDialog(dialog) // 添加到管理列表
} }
fun dialogMessage(event: RoomInputEvent) { fun dialogMessage(event: RoomInputEvent) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -28,8 +28,8 @@ isBuildModule=false
#org.gradle.deamon=false #org.gradle.deamon=false
android.injected.testOnly=false android.injected.testOnly=false
APP_VERSION_NAME=1.0.9.0 APP_VERSION_NAME=1.0.9.1
APP_VERSION_CODE=80 APP_VERSION_CODE=81
org.gradle.jvm.toolchain.useLegacyAdapters=false org.gradle.jvm.toolchain.useLegacyAdapters=false
#org.gradle.java.home=C\:\\Users\\qx\\.jdks\\ms-17.0.15 #org.gradle.java.home=C\:\\Users\\qx\\.jdks\\ms-17.0.15