Files
yusheng-android/moduleroom/src/main/java/com/example/moduleroom/activity/RoomActivity.java

1184 lines
44 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.example.moduleroom.activity;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.blankj.utilcode.util.GsonUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.example.moduleroom.R;
import com.example.moduleroom.contacts.RoomContacts;
import com.example.moduleroom.databinding.ActivityRoomBinding;
import com.example.moduleroom.dialog.ExitRoomBottomSheet;
import com.example.moduleroom.dialog.PublishCommentDialogFragment;
import com.example.moduleroom.dialog.RequestDialogFragment;
import com.example.moduleroom.dialog.RoomOnlineDialogFragment;
import com.example.moduleroom.fragment.RoomCabinFragment;
import com.example.moduleroom.fragment.RoomChartsFragment;
import com.example.moduleroom.fragment.RoomNoticeDialogFragment;
import com.lzf.easyfloat.EasyFloat;
import com.petterp.floatingx.assist.helper.FxScopeHelper;
import com.petterp.floatingx.listener.control.IFxControl;
import com.qxcm.moduleutil.base.CommonAppContext;
import com.qxcm.moduleutil.bean.HeadlineBean;
import com.qxcm.moduleutil.bean.HeadlineEvent;
import com.qxcm.moduleutil.bean.UserInfo;
import com.qxcm.moduleutil.bean.room.RankInfo;
import com.qxcm.moduleutil.bean.room.RoomOnline;
import com.qxcm.moduleutil.databinding.RoomDialogMusicWindowOpenBinding;
import com.qxcm.moduleutil.dialog.RechargeDialogFragment;
import com.qxcm.moduleutil.event.ColoseCardEvent;
import com.qxcm.moduleutil.event.EffectEvent;
import com.qxcm.moduleutil.event.MusicEvent;
import com.qxcm.moduleutil.event.RoomGiftGiveEvent;
import com.qxcm.moduleutil.event.RoomOutEvent;
import com.qxcm.moduleutil.event.RoomWheatEvent;
import com.qxcm.moduleutil.http.BaseObserver;
import com.qxcm.moduleutil.http.RetrofitClient;
import com.qxcm.moduleutil.interfaces.OnMusicItemClickListener;
import com.qxcm.moduleutil.listener.MessageListenerSingleton;
import com.qxcm.moduleutil.adapter.LikeUserAdapter;
import com.qxcm.moduleutil.bean.RoomCharmRankBean;
import com.qxcm.moduleutil.bean.RoomMessageEvent;
import com.qxcm.moduleutil.bean.RoomSettingEvent;
import com.qxcm.moduleutil.bean.room.RoomOnlineBean;
import com.example.moduleroom.fragment.RoomFragment;
import com.example.moduleroom.fragment.RoomPasswordSetDialogFragment;
import com.example.moduleroom.presenter.RoomPresenter;
import com.qxcm.moduleutil.activity.BaseMvpActivity;
import com.qxcm.moduleutil.adapter.CommonPageAdapter;
import com.qxcm.moduleutil.bean.room.RoomBean;
import com.qxcm.moduleutil.bean.room.RoomInfoResp;
import com.qxcm.moduleutil.bean.room.RoomOwnerBean;
import com.qxcm.moduleutil.bean.room.RoomPitBean;
import com.qxcm.moduleutil.bean.room.RoomUserBean;
import com.qxcm.moduleutil.dialog.ConfirmDialog;
import com.qxcm.moduleutil.event.RoomJoinMountModel;
import com.qxcm.moduleutil.rtc.AgoraManager;
import com.qxcm.moduleutil.rtc.MusicPlayBean;
import com.qxcm.moduleutil.rtc.RtcCore;
import com.qxcm.moduleutil.utils.ARouteConstants;
import com.qxcm.moduleutil.utils.DialogUtils;
import com.qxcm.moduleutil.utils.ImageUtils;
import com.qxcm.moduleutil.utils.SpUtil;
import com.qxcm.moduleutil.utils.logger.DataLogger;
import com.qxcm.moduleutil.widget.CircularProgressView;
import com.qxcm.moduleutil.widget.CustomMusicFloatingView;
import com.qxcm.moduleutil.widget.MusicView;
import com.qxcm.moduleutil.widget.SilentCountDownTimer;
import com.qxcm.moduleutil.widget.ViewUtils;
import com.qxcm.moduleutil.widget.floatingView.FloatingMagnetView;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMManager;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
import io.agora.musiccontentcenter.Music;
import io.reactivex.disposables.Disposable;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
@Route(path = ARouteConstants.ROOM_DETAILS)
public class RoomActivity extends BaseMvpActivity<RoomPresenter, ActivityRoomBinding> implements RoomContacts.View,
EasyPermissions.PermissionCallbacks {
private RoomFragment roomFragment;
CommonPageAdapter commonPageAdapter;
private RoomBean mRoomBean;
//房主信息
private RoomOwnerBean mRoomOwnerBean;
//房间用户信息
private RoomUserBean mRoomUserBean;
private List<RoomPitBean> mPitList = new ArrayList<>();
@Autowired
public String password;
@Autowired
public String roomId;
public static boolean sDestroied = false;
LikeUserAdapter<RoomOnlineBean> likeUserAdapter;
String[] permissions = {Manifest.permission.RECORD_AUDIO};
private RoomInfoResp mRoomInfoResp;
private boolean isSave = false;//活动是否将被系统回收
private IFxControl musicWindowControl;
private CustomMusicFloatingView customMusicFloatingView;
private int number = 0;
private FloatingMagnetView floatingMagnetView;
private FrameLayout fullScreenContainer;
private boolean isFullScreen = false;
private ImageView ivExitFullscreen;
ImageView ivQuan;
private boolean imYc;
private SilentCountDownTimer silentCountDownTimer;
private CircularProgressView circularProgress;
@Override
protected void onNewIntent(Intent intent) {
password = intent.getStringExtra("password");
String mRoomId = intent.getStringExtra("roomId");
if (roomId.equals(mRoomId) || TextUtils.isEmpty(mRoomId)) {
super.onNewIntent(intent);
sDestroied = false;
// MvpPre.getRoomIn(roomId, password);
// MvpPre.getRoomOnline(roomId, "1", "10");
} else {
releaseRoom();
startActivity(intent);
finish();
}
}
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_BACK) {
// return true;
// }
// return false;
// }
// 禁用系统手势导航
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.vp_room_pager); // 替换为你实际的容器 ID
if (currentFragment instanceof RoomCabinFragment) {
((RoomCabinFragment) currentFragment).onConfigurationChanged(newConfig);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomInfoEvent(SurfaceView surfaceView) {
if (mRoomInfoResp.getRoom_info().getType_id().equals("6")) {
floatingMagnetView = findViewById(R.id.flaoat);
FrameLayout container = floatingMagnetView.findViewById(R.id.fl_screenshare);
if (surfaceView == null) {
runOnUiThread(() -> {
mBinding.flaoat.setVisibility(GONE);
container.removeAllViews();
});
} else {
runOnUiThread(() -> {
mBinding.flaoat.setVisibility(VISIBLE);
container.removeAllViews();
container.addView(surfaceView);
// mBinding.flaoat.setVisibility(VISIBLE);
// mBinding.flScreenshare.removeAllViews();
// mBinding.flScreenshare.addView(surfaceView);
});
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomInfoEvent(ColoseCardEvent messageEvent) {
mBinding.flaoat.setVisibility(GONE);
}
/**
* 释放当前房间
*/
private void releaseRoom() {
AgoraManager.getInstance(this).destroy();
// RtcManager.getInstance().leaveChannel(roomId);
// RtcManager.getInstance().setAudioUrl(null);
// EMqttService.cleanSubscribeRoom(roomId);
CommonAppContext.getInstance().isPlaying = false;
CommonAppContext.getInstance().isShow = false;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isSave = false;
sDestroied = false;
// // 进入房间10s后检查是否显示提示上麦对话框
// new Handler(getMainLooper()).postDelayed(
// () -> EventBus.getDefault().post(new ShowOnWheatDialogEvent()),
// 10000);
overridePendingTransition(0, 0); // 关闭转场动画
floatingMagnetView = findViewById(R.id.flaoat);
ivQuan = findViewById(R.id.iv_quan);
fullScreenContainer = findViewById(R.id.fullscreen_container); // 自定义全屏容器
ivExitFullscreen = findViewById(R.id.iv_exit_fullscreen);
ivQuan.setOnClickListener(v -> toggleFullScreen());
ivExitFullscreen.setOnClickListener(v -> exitFullScreen());
}
@Override
protected void initView() {
super.initView();
circularProgress = mBinding.giftShowProgress;
circularProgress.setProgress(0);
mBinding.giftShowLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onGiftGiveProgressClcik();
LogUtils.e("xj", "onSubscribe2222");
}
});
}
private void onGiftGiveProgressClcik() {
if (giftGiveEvent == null || giftGiveEvent.roonGiftModel == null) {
return;
}
// if (giftCountTimer != null) {
// giftCountTimer.cancel();
// giftCountTimer = null;
// }
RetrofitClient.getInstance().roomGift(giftGiveEvent.getRoom_id(), giftGiveEvent.getRoonGiftModel().getGift_id(), giftGiveEvent.getNum(), giftGiveEvent.getUserId(),"1",giftGiveEvent.getPit(), new BaseObserver<String>(){
@Override
public void onSubscribe(Disposable d) {
// showGiftGiveProgress();
// LogUtils.e("xj", "onSubscribe");
}
@Override
public void onNext(String s) {
showGiftGiveProgress();
}
@Override
public void onError(Throwable e) {
super.onError(e);
String msg = e.getMessage();
if (!TextUtils.isEmpty(msg) && msg.contains("当前余额不足")) {
com.hjq.toast.ToastUtils.show("当前余额不足,请充值");
ThreadUtils.runOnUiThreadDelayed(() -> {
RechargeDialogFragment.show(roomId, getSupportFragmentManager());
// DialogUtils.showDialogFragment(ARouter.getInstance().build(ARouteConstants.RECHARGE_DIALOG).navigation());
}, 1400);
}
hideGiftGiveProgress();
}
});
}
private RoomGiftGiveEvent giftGiveEvent;
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomGiveGiftEvent(RoomGiftGiveEvent event) {
if (isFinishing() || event == null || event.roonGiftModel == null) {
return;
}
giftGiveEvent = event;
showGiftGiveProgress();
}
private int giftProgress=0;
private CountDownTimer giftCountTimer;
private void startGiftProgressTime() {
giftProgress = 0;
if (giftCountTimer != null) {
giftCountTimer.cancel();
}
LogUtils.e("xj2", "onSubscribe");
giftCountTimer = new CountDownTimer(1000 * 10, 50) {
@Override
public void onTick(long millisUntilFinished) {
if (!isFinishing()) {
circularProgress.setProgress(1000 - (int) (millisUntilFinished / 10));
}
}
@Override
public void onFinish() {
circularProgress.setProgress(1000);
hideGiftGiveProgress();
}
};
giftCountTimer.start();
}
private void showGiftGiveProgress() {
ImageUtils.loadImageView(giftGiveEvent.roonGiftModel.getBase_image(), mBinding.giftShowProgressImg);
circularProgress.setProgress(1000);// 显示进度条2025年7月19日11:23:37将这个从下面的方法提起到这里
startGiftProgressTime();
mBinding.giftShowLayout.setVisibility(View.VISIBLE);
}
private void hideGiftGiveProgress() {
mBinding.giftShowLayout.setVisibility(View.GONE);
if (giftCountTimer != null) {
giftCountTimer.cancel();
giftCountTimer = null;
}
}
private void toggleFullScreen() {
if (isFullScreen) {
exitFullScreen();
} else {
enterFullScreen();
}
}
private void enterFullScreen() {
isFullScreen = true;
// 隐藏系统UI
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
// 设置横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// 将原来的 fl_screenshare 移动到全屏容器中
FrameLayout container = floatingMagnetView.findViewById(R.id.fl_screenshare);
if (container.getParent() != null) {
((ViewGroup) container.getParent()).removeView(container);
}
fullScreenContainer.addView(container);
// 显示全屏容器
fullScreenContainer.setVisibility(View.VISIBLE);
// floatingMagnetView.setVisibility(View.GONE);
ivExitFullscreen.setVisibility(View.VISIBLE); // 显示退出按钮
}
private void exitFullScreen() {
isFullScreen = false;
// 恢复系统UI
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
// 设置回竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// 找到 fl_screenshare 并移回原父容器
FrameLayout fl_screenshare = findViewById(R.id.fl_screenshare);
if (fl_screenshare != null) {
ViewParent parent = fl_screenshare.getParent();
if (parent != null && parent instanceof ViewGroup) {
((ViewGroup) parent).removeView(fl_screenshare);
}
// 找到原始父容器并重新添加
FrameLayout originalParent = findViewById(R.id.fullscreen_container); // 或者你实际的容器
if (originalParent != null) {
originalParent.removeView(fl_screenshare); // 防止重复添加
}
floatingMagnetView.addView(fl_screenshare);
}
// 恢复界面
fullScreenContainer.setVisibility(View.GONE);
floatingMagnetView.setVisibility(View.VISIBLE);
ivQuan.setVisibility(View.VISIBLE);
ivExitFullscreen.setVisibility(View.GONE); // 隐藏退出按钮
}
@Override
protected void initData() {
if (!EasyPermissions.hasPermissions(this, permissions)) {
EasyPermissions.requestPermissions(this, "请开启录音使用权限",
1, permissions);
}
mBinding.roomTop.btnFollow.setOnClickListener(this::onClick);
mBinding.roomTop.btnNotice.setOnClickListener(this::onClick);
mBinding.roomTop.btnRanking.setOnClickListener(this::onClick);
mBinding.roomTop.btnCloseLive.setOnClickListener(this::onClick);
mBinding.roomTop.tvNum.setOnClickListener(this::onClick);
mBinding.roomTop.rl.setOnClickListener(this::onClick);
mBinding.roomTop.userRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
likeUserAdapter = new LikeUserAdapter<>();
mBinding.roomTop.userRecyclerView.setAdapter(likeUserAdapter);
likeUserAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
RoomOnlineDialogFragment.show(roomId, "", getSupportFragmentManager());
}
});
// onChatRoomViewCreation();
MessageListenerSingleton.getInstance().joinGroup(roomId);
SpUtil.saveMyRoomId(roomId);
MvpPre.getRoomIn(roomId, password);
MvpPre.getRoomOnline(roomId, "1", "10");
// customMusicFloatingView.initView();
// 使用 OnViewAttachListener 确保 View 已创建
// 设置监听器,等待 View 创建完成
// setMusicListener();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomInfoEvent(RoomMessageEvent messageEvent) {
if (messageEvent.getMsgType() == 1005) {
mBinding.svgaGift.setSource(messageEvent.getText().getGiftInfo().getPlay_image(), 2);
} else if (messageEvent.getMsgType() == 123) {
EventBus.getDefault().post(new RoomSettingEvent());
} else if (messageEvent.getMsgType() == 1014) {
RoomSettingEvent roomSettingEvent = new RoomSettingEvent();
roomSettingEvent.setRoomId(messageEvent.getRoomId());
roomSettingEvent.setRoom_up_pit_type(messageEvent.getText().getRoom_up_pit_type());
roomSettingEvent.setType(messageEvent.getMsgType());
mRoomBean.setRoom_up_pit_type(messageEvent.getText().getRoom_up_pit_type() + "");
EventBus.getDefault().post(mRoomBean);
EventBus.getDefault().post(roomSettingEvent);
} else if (messageEvent.getMsgType() == 1013) {
int userid = messageEvent.getText().getFromUserInfo().getUser_id();
int userId2 = SpUtil.getUserId();
if (messageEvent.getText().getAction() == 1 && mRoomUserBean.getUser_id().equals(userId2 + "") && mRoomUserBean.getPit_number() == 9) {
queren(messageEvent.getText().getFromUserInfo().getNickname());
} else if (messageEvent.getText().getAction() == 4 && userid == userId2) {
queren1(messageEvent.getText().getFromUserInfo().getNickname());
} else if (messageEvent.getText().getAction() == 2) {
} else if (messageEvent.getText().getAction() == 3 && SpUtil.getUserId() == messageEvent.getText().getFromUserInfo().getUser_id()) {
}
} else if (messageEvent.getMsgType() == 1012) {
if (customMusicFloatingView != null) {
customMusicFloatingView.destroy();
}
AgoraManager.getInstance(RoomActivity.this).desMusic();
MvpPre.postRoomInfo(roomId);
} else if (messageEvent.getMsgType() == 124) {
RoomMessageEvent.text text = GsonUtils.fromJson(messageEvent.getText().getText(), RoomMessageEvent.text.class);
MusicPlayBean musicPlayBean = new MusicPlayBean();
musicPlayBean.setPosition(text.getPosition());
EventBus.getDefault().post(musicPlayBean);
} else if (messageEvent.getMsgType() == 1003) {//上麦操作
//
// RoomWheatEvent roomWheatEvent = new RoomWheatEvent();
// roomWheatEvent.setRoomId(roomId);
// roomWheatEvent.setOccupied(true);
// EventBus.getDefault().post(roomWheatEvent);
} else if (messageEvent.getMsgType() == 1004) {//下麦操作
// RoomWheatEvent roomWheatEvent = new RoomWheatEvent();
// roomWheatEvent.setRoomId(roomId);
// roomWheatEvent.setOccupied(false);
// EventBus.getDefault().post(roomWheatEvent);
} else if (messageEvent.getMsgType() == 1020) {
mRoomBean = messageEvent.getText().getRoomInfo();
EventBus.getDefault().post(mRoomBean);
changeBackgroundColor(mRoomBean.getRoom_background());
} else if (messageEvent.getMsgType() == 1011) {
if (messageEvent.getText().getFromUserInfo() != null) {
if (messageEvent.getText().getFromUserInfo().getUser_id() == SpUtil.getUserId()) {
MvpPre.quitRoom(roomId, SpUtil.getUserId() + "");
}
}
} else if (messageEvent.getMsgType() == 1001) {
number++;
mBinding.roomTop.tvNum.setText(number + "");
} else if (messageEvent.getMsgType() == 1002) {
number--;
mBinding.roomTop.tvNum.setText(number + "");
} else if (messageEvent.getMsgType() == 1029) {
if (mRoomInfoResp.getUser_info().getPit_number() == 9 && mRoomInfoResp.getUser_info().getUser_id().equals(SpUtil.getUserId() + "")) {
querenPk(messageEvent.getText().getText(), messageEvent.getText().getPkId());
}
}
}
private void querenPk(String text, String pk_id) {
// 创建并显示确认对话框
new ConfirmDialog(this,
"温馨提示",
text,
"确认",
"拒绝",
v -> {
// 点击“确认”按钮时执行删除操作
MvpPre.acceptPk(pk_id, "1");
},
v -> {
MvpPre.acceptPk(pk_id, "2");
// 点击“取消”按钮时什么都不做
}, true, 10).show();
}
/**
* 修改背景图
*
* @param bjId
*/
public void changeBackgroundColor(String bjId) {
// 假设你的Activity有一个根布局例如 ConstraintLayout
ImageUtils.loadImageWithCache(this, bjId, mBinding.ivBg);
// EasyFloat.with(this)
// .setLayout(com.qxcm.moduleutil.R.layout.floating_layout)
// .show();
}
public void changeBackground(int bjId) {
mBinding.ivBg.setImageDrawable(getResources().getDrawable(bjId));
}
public void setvisibTop(boolean is) {
mBinding.roomTop.getRoot().setVisibility(is ? VISIBLE : GONE);
}
/**
* 特效设置
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void setEffectSwitch(EffectEvent event) {
if (event.isEffectOn()) {//特效开启
mBinding.svgaGift.setVisibility(View.VISIBLE);
} else {
mBinding.svgaGift.closeEffect();
mBinding.svgaGift.setVisibility(View.GONE);
}
}
/**
* 坐骑进场特效
*
* @param roomJoinMountModel
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomJoinMount(RoomJoinMountModel roomJoinMountModel) {
if (!roomId.equals(roomJoinMountModel.getRoom_id())) {
return;
}
if (roomJoinMountModel.getShow_type() != 1) {
mBinding.svgaZuoji.setSource(roomJoinMountModel.getRide_url(), 2);
}
}
private void onClick(View view) {
int id = view.getId();
if (id == R.id.btn_follow) {
MvpPre.userGuanz(mRoomOwnerBean.getUser_id(), "2");
} else if (id == R.id.btn_notice) {
// RoomTipsView.show(this,view,"公告","公告内容");
RoomNoticeDialogFragment roomNoticeDialogFragment = new RoomNoticeDialogFragment(this);
roomNoticeDialogFragment.setTitle("公告");
roomNoticeDialogFragment.setContent(mRoomBean.getRoom_intro());
roomNoticeDialogFragment.show();
} else if (id == R.id.btn_ranking) {//排行榜
RoomChartsFragment.newInstance(roomId).show(getSupportFragmentManager(), "RoomChartsFragment");
} else if (id == R.id.btn_close_live) {
//最小化
ExitRoomBottomSheet bottomSheet = ExitRoomBottomSheet.newInstance();
bottomSheet.setOnOptionSelectedListener(new ExitRoomBottomSheet.OnOptionSelectedListener() {
@Override
public void onMinimize() {
// 处理最小化逻辑,比如不销毁 Activity仅移至后台
CommonAppContext.getInstance().isShow = false;
ARouter.getInstance().build(ARouteConstants.ME).navigation();//栈顶复用
// moveTaskToBack(true);
}
@Override
public void onExitRoom() {
// 调用退出房间方法
MvpPre.quitRoom(roomId, SpUtil.getUserId() + "");
}
@Override
public void onCancel() {
// 用户点击取消,不做任何事
}
});
bottomSheet.show(getSupportFragmentManager(), "ExitRoomBottomSheet");
} else if (id == R.id.tv_num) {
RoomOnlineDialogFragment.show(roomId, "", getSupportFragmentManager());
} else if (id == R.id.rl) {
com.hjq.toast.ToastUtils.show("清楚魅力值");
}
}
@Override
protected int getLayoutId() {
return R.layout.activity_room;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomOut(RoomOutEvent roomOutEvent) {
MvpPre.quitRoom(roomId, SpUtil.getUserId() + "");
}
@Override
protected RoomPresenter bindPresenter() {
return new RoomPresenter(this, this);
}
public void upRoomInfo(RoomInfoResp resp) {
this.mRoomInfoResp = resp;
if (mRoomInfoResp.getUser_info().getPit_number()==9 && mRoomInfoResp.getUser_info().getUser_id().equals(SpUtil.getUserId() + "")) {
mBinding.roomTop.rl.setVisibility(View.VISIBLE);
} else {
mBinding.roomTop.rl.setVisibility(View.GONE);
}
}
@Override
public void roomInfo(RoomInfoResp resp) {
this.mRoomInfoResp = resp;
RoomBean roomBean = resp.getRoom_info();
this.mRoomBean = roomBean;
this.mRoomUserBean = resp.getUser_info();
this.mRoomOwnerBean = resp.getRoom_owner();
this.mPitList = mRoomBean.getPit_list();
ImageUtils.loadHeadCC(resp.getRoom_info().getRoom_cover(), mBinding.roomTop.avatar);
mBinding.roomTop.name.setText(roomBean.getRoom_name());
mBinding.roomTop.idVal.setText("ID:" + roomBean.getRoom_number());
if (mRoomUserBean.getIs_room_owner() == 1) {
mBinding.roomTop.btnFollow.setVisibility(GONE);
} else {
mBinding.roomTop.btnFollow.setVisibility(VISIBLE);
if (resp.isCollect()) {
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.collected));
}
}
number = roomBean.getOnline_number();
mBinding.roomTop.tvNum.setText(number + "");
if (!isFinishing() && !isDestroyed()) {
if (roomFragment == null || !roomFragment.isAdded()) {
roomFragment = RoomFragment.newInstance(resp, "");
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.vp_room_pager, roomFragment)
.commitAllowingStateLoss();
} else {
roomFragment.refreshData(resp);
}
} else {
Log.e("Fragment", "Fragment transaction skipped due to state loss.");
}
// 更新引用
// roomFragment = newFragment;
// if (!roomBean.getType_id().equals("6")) {
// changeBackgroundColor(roomBean.getRoom_background());
// } else {
// changeBackground(com.qxcm.moduleutil.R.mipmap.cabin_bj);
// }
CommonAppContext.getInstance().isPlaying = true;
CommonAppContext.getInstance().playId = roomId;
CommonAppContext.getInstance().playName = mRoomBean.getRoom_name();
CommonAppContext.getInstance().playCover = resp.getRoom_info().getRoom_cover();
CommonAppContext.getInstance().showSelf = resp.getIs_show_self() == 1;
if (mRoomUserBean.getIs_collect() == 1) {
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.yishouc));
} else {
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.collect));
}
if (roomBean.getType_id().equals("1") && roomBean.getLabel_id().equals("2")) {
AgoraManager.getInstance(this).setBjMusic(false);
} else {
AgoraManager.getInstance(this).setBjMusic(true);
}
AgoraManager.getInstance(this).stopMuisc();
initializeAudio();
toutiao();
upRoomInfo(resp);
}
public void toutiao(){
if (mRoomInfoResp.getRoom_info().getHead_line() != null) {
mBinding.flaoatZuoji.setVisibility(VISIBLE);
// 设置 OnTouchListener强制悬浮框自己处理拖动
ImageUtils.loadHeadCC(mRoomInfoResp.getRoom_info().getHead_line().getAvatar(), mBinding.headAvate);
mBinding.headName.setText(mRoomInfoResp.getRoom_info().getHead_line().getNickname());
mBinding.headCone.setText(mRoomInfoResp.getRoom_info().getHead_line().getContent());
// mBinding.cc.setOnClickListener(v -> {
// mBinding.flaoatZuoji.setVisibility(GONE);
// });
mBinding.ivQuanQiang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PublishCommentDialogFragment.show(roomId,getSupportFragmentManager());
}
});
mBinding.ivQuanC.setOnClickListener(new View.OnClickListener() {//这是跟随的意思
@Override
public void onClick(View v) {
ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("from", "我的界面").withString("roomId", mRoomInfoResp.getRoom_info().getHead_line().getRoom_id() ).navigation();
}
});
mBinding.imYc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (imYc){
mBinding.cl.setVisibility(VISIBLE);
imYc = false;
}else {
mBinding.cl.setVisibility(GONE);
imYc = true;
}
}
});
mBinding.imHq.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if (!imYc){
mBinding.cl.setVisibility(VISIBLE);
imYc = true;
}else {
mBinding.cl.setVisibility(GONE);
imYc = false;
}
}
});
silentCountDownTimer = new SilentCountDownTimer();
silentCountDownTimer.setOnCountDownFinishListener(() -> {
// 倒计时结束后的操作
Log.d("CountDown", "倒计时结束,执行清理或通知操作");
hideSomeViewOrDoSomething();
});
// 启动倒计时(例如:目标时间戳 1752661716
silentCountDownTimer.start(Long.parseLong(mRoomInfoResp.getRoom_info().getHead_line().getEnd_time()));
}else {
mBinding.flaoatZuoji.setVisibility(GONE);
}
}
private void hideSomeViewOrDoSomething() {
runOnUiThread(() -> {
// 执行你需要的操作,比如隐藏某个控件
// mBinding.someView.setVisibility(View.GONE);
mBinding.flaoatZuoji.setVisibility(GONE);
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onHeadlineEvent(HeadlineBean event) {
mRoomInfoResp.getRoom_info().setHead_line(event);
toutiao();
}
/**
* @author qx
* @data 2025/6/27
* @description: 初始化音频,初始的时候,当是在麦上,将用户设置为主持,在麦下,设置为观众, 默认关闭麦克风
*/
public void initializeAudio() {
if (mRoomUserBean.getPit_number() != 0) {
AgoraManager.getInstance(this).ClientRole(true);
AgoraManager.getInstance(this).muteLocalAudioStream(false);
} else {
AgoraManager.getInstance(this).ClientRole(false);
AgoraManager.getInstance(this).muteLocalAudioStream(true);
}
AgoraManager.getInstance(this).setLocalAudioEnabled(false, SpUtil.getUserId() + "");
}
@Override
public void showPasswordDialog() {
RoomPasswordSetDialogFragment roomPasswordSetDialogFragment = RoomPasswordSetDialogFragment.newInstance(true, roomId);
roomPasswordSetDialogFragment.show(getSupportFragmentManager());
}
@Override
public void enterFail() {
releaseRoom();
finish();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void logOutEvent(MusicEvent musicEvent) {
// mBinding.musicView.setVisibility(VISIBLE);
// musicWindowControl.show(); // <<< 添加这行代码
xunf();
RequestDialogFragment.show(roomId, mRoomInfoResp, getSupportFragmentManager());
}
/**
* 背景音乐
*/
private void xunf() {
musicWindowControl = FxScopeHelper.builder()
.setLayout(com.qxcm.moduleutil.R.layout.room_dialog_music_window_open)
.build()
.toControl(this);
// 创建自定义悬浮窗包装类
customMusicFloatingView = new CustomMusicFloatingView(this, musicWindowControl);
customMusicFloatingView.setOnItemClickListener(new OnMusicItemClickListener() {
@Override
public void onMinimize() {
customMusicFloatingView.destroy();
AgoraManager.getInstance(RoomActivity.this).desMusic();
}
@Override
public void onOpenList() {
// 打开音乐列表
// ToastUtils.showShort("打开音乐列表");
RequestDialogFragment.show(roomId, mRoomInfoResp, getSupportFragmentManager());
}
@Override
public void onPause() {
// ToastUtils.showShort("暂停播放");
// 调用播放器或通知 MusicView
AgoraManager.getInstance(RoomActivity.this).pauseMusic();
}
@Override
public void onResume() {
// ToastUtils.showShort("恢复播放");
// 调用播放器或通知 MusicView
AgoraManager.getInstance(RoomActivity.this).resumeMusic();
}
@Override
public void onNext() {
// ToastUtils.showShort("下一首");
// 切换歌曲
// List<Music> musicSongBeans = AgoraManager.getInstance(RoomActivity.this).getMusicList();
AgoraManager.getInstance(RoomActivity.this).nextSong();
}
});
// customMusicFloatingView.initView();
customMusicFloatingView.show();
// 等待 View 创建完成后才绑定点击事件
ViewUtils.waitUntilViewReady(musicWindowControl, view -> {
customMusicFloatingView.initView(); // 这里 fxControl.getView() 不再为 null
customMusicFloatingView.updatePlayState(false);
});
}
@Override
protected void onResume() {
super.onResume();
CommonAppContext.getInstance().isShow = true;
CommonAppContext.getInstance().isPlaying = true;
}
@Override
public void getRoomOnline(RoomOnline onlineBean) {
if (onlineBean != null) {
List<RoomOnlineBean> onlineBeans = new ArrayList<>();
if (onlineBean.getOn_pit().size() > 0) {
onlineBeans.addAll(onlineBean.getOn_pit());
}
if (onlineBean.getOff_pit().size() > 0) {
onlineBeans.addAll(onlineBean.getOff_pit());
}
likeUserAdapter.setNewData(onlineBeans.subList(0, onlineBeans.size() > 5 ? 5 : onlineBeans.size()));
}
}
@Override
public void applyPit() {
}
@Override
public void downPit() {
}
@Override
public void applySong() {
}
@Override
public void agreeSong() {
}
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
if (isFullScreen) {
exitFullScreen();
}
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
@Override
public void postRoomInfo(RoomInfoResp resp) {
RoomBean roomBean = resp.getRoom_info();
this.mRoomBean = roomBean;
this.mRoomUserBean = resp.getUser_info();
this.mRoomOwnerBean = resp.getRoom_owner();
this.mPitList = mRoomBean.getPit_list();
ImageUtils.loadHeadCC(resp.getRoom_info().getRoom_cover(), mBinding.roomTop.avatar);
mBinding.roomTop.name.setText(roomBean.getRoom_name());
mBinding.roomTop.idVal.setText(roomBean.getRoom_number());
if (mRoomUserBean.getIs_room_owner() == 1) {
mBinding.roomTop.btnFollow.setVisibility(GONE);
} else {
mBinding.roomTop.btnFollow.setVisibility(VISIBLE);
if (resp.isCollect()) {
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.collected));
}
}
if (!isFinishing() && !isDestroyed()) {
if (roomFragment == null || !roomFragment.isAdded()) {
roomFragment = RoomFragment.newInstance(resp, "");
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.vp_room_pager, roomFragment)
.commitAllowingStateLoss();
} else {
roomFragment.refreshData(resp);
}
} else {
Log.e("Fragment", "Fragment transaction skipped due to state loss.");
}
if (mRoomUserBean.getIs_collect() == 1) {
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.yishouc));
} else {
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.collect));
}
if (roomBean.getType_id().equals("1") && roomBean.getLabel_id().equals("2")) {
AgoraManager.getInstance(this).setBjMusic(false);
} else {
AgoraManager.getInstance(this).setBjMusic(true);
}
AgoraManager.getInstance(this).stopMuisc();
initializeAudio();
}
@Override
public void getCharmRank(List<RoomCharmRankBean> list) {
}
@Override
public void changeSong() {
}
@Override
public void hostUserPit() {
}
@Override
public void quitRoom() {
CommonAppContext.getInstance().isPlaying = false;
CommonAppContext.getInstance().isShow = false;
// AgoraManager.getInstance(this).destroy();
AgoraManager.getInstance(this).leaveRoom();
AgoraManager.getInstance(this).destroy();
V2TIMManager.getInstance().quitGroup("room" + roomId, new V2TIMCallback() {
@Override
public void onSuccess() {
// 退出群组成功
}
@Override
public void onError(int code, String desc) {
// 退出群组失败
}
});
finish();
}
@Override
public void userGuanzSuccess(String s) {
if (mRoomUserBean.getIs_collect() == 1) {
mRoomUserBean.setIs_collect(0);
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.collect));
} else {
mRoomUserBean.setIs_collect(1);
mBinding.roomTop.btnFollow.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.yishouc));
}
}
@Override
public void acceptPk() {
}
private void queren1(String nickname) {
// 创建并显示确认对话框
new ConfirmDialog(this,
"温馨提示",
"您申请点歌模式被主持人拒绝",
"确认",
"取消",
v -> {
// 点击“确认”按钮时执行删除操作
},
v -> {
// 点击“取消”按钮时什么都不做
}, false, 0).show();
}
private void queren(String nickname) {
// 创建并显示确认对话框
new ConfirmDialog(this,
"温馨提示",
"亲爱的主持,您好!\n\n " + "\t" + nickname + "正在发起点唱申请,进入点唱模式后背景音乐将自动停止播放",
"确认",
"拒绝",
v -> {
// 点击“确认”按钮时执行
MvpPre.agreeSong(roomId, "1");
},
v -> {
// 点击“取消”按钮时什么都不做
MvpPre.agreeSong(roomId, "2");
}, true, 10).show();
}
@Override
protected void onDestroy() {
// 移除 EventBus 注册
if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
MessageListenerSingleton.reset(roomId); // 主动清理
AgoraManager.getInstance(this).destroy(); // 确保释放 Agora 资源
if (customMusicFloatingView != null) {
customMusicFloatingView.destroy();
}
CommonAppContext.getInstance().isPlaying = false;
CommonAppContext.getInstance().isShow = false;
sDestroied = true;
SpUtil.setMusicName("");
if (isSave) {
finish();
}
if (silentCountDownTimer != null) {
silentCountDownTimer.release();
}
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
isSave = true;
}
private static final String[] AUDIO_PERMISSIONS = {Manifest.permission.RECORD_AUDIO};
private void requestAudioPermission() {
if (!EasyPermissions.hasPermissions(getApplicationContext(), AUDIO_PERMISSIONS)) {
EasyPermissions.requestPermissions(
this,
"需要录音权限以使用语音功能",
1001,
AUDIO_PERMISSIONS
);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
if (perms.contains(Manifest.permission.RECORD_AUDIO)) {
Log.d("Permission", "录音权限已授权");
}
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
} else {
ToastUtils.showShort("需要录音权限才能继续");
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMusicEvent(Music event) {
if (customMusicFloatingView != null) {
customMusicFloatingView.onMusicEvent(event);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMusicPlay(MusicPlayBean musicPlayBean) {
if (customMusicFloatingView != null) {
customMusicFloatingView.updateProgress(Math.toIntExact(musicPlayBean.getPosition()));
}
}
}