Преглед изворни кода

修改老师端学生端直播间部分逻辑

Pq пре 2 година
родитељ
комит
f11dc3989c
19 измењених фајлова са 235 додато и 32 уклоњено
  1. 1 0
      rong_im/live/src/main/java/com/rong/io/live/LiveRoomMsgConstants.java
  2. 1 2
      rong_im/live/src/main/java/com/rong/io/live/helper/LiveEventHelper.java
  3. 9 0
      rong_im/live/src/main/java/com/rong/io/live/helper/LiveRoomMicMemberHelper.java
  4. 1 1
      rong_im/live/src/main/java/com/rong/io/live/message/RCChatJoinRoomMessage.java
  5. 4 0
      student/src/main/java/com/cooleshow/student/adapter/MessageAdapter.java
  6. 27 3
      student/src/main/java/com/cooleshow/student/ui/live/LiveRoomActivity.java
  7. 79 0
      student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragment.java
  8. BIN
      student/src/main/res/drawable-xhdpi/icon_add_like.png
  9. BIN
      student/src/main/res/drawable-xhdpi/icon_live_room_number_people.png
  10. BIN
      student/src/main/res/drawable-xxhdpi/icon_add_like.png
  11. BIN
      student/src/main/res/drawable-xxhdpi/icon_live_room_number_people.png
  12. 1 1
      student/src/main/res/layout/activity_liveroom_layout.xml
  13. 6 0
      student/src/main/res/layout/fragment_new_home_layout.xml
  14. 2 0
      teacher/src/main/java/com/cooleshow/teacher/App.java
  15. 4 0
      teacher/src/main/java/com/cooleshow/teacher/adapter/LiveRoomMessageAdapter.java
  16. 6 0
      teacher/src/main/java/com/cooleshow/teacher/contract/LiveRoomContract.java
  17. 23 0
      teacher/src/main/java/com/cooleshow/teacher/presenter/live/LiveRoomPresenter.java
  18. 70 24
      teacher/src/main/java/com/cooleshow/teacher/ui/live/TeacherLiveRoomActivity.java
  19. 1 1
      teacher/src/main/res/layout/view_live_room_main_layout.xml

+ 1 - 0
rong_im/live/src/main/java/com/rong/io/live/LiveRoomMsgConstants.java

@@ -57,5 +57,6 @@ public class LiveRoomMsgConstants {
     public static final String TAG_LIVE_FINISH_MSG = "RC:ForcedOffline"; //直播间结束消息
     public static final String TAG_LIVE_UNDER_ALL_MIC = "RC:Chatroom:DownSeatAll"; //全部下麦
     public static final String TAG_LIVE_REFUSE_ALL_MIC_APPLY = "RC:Chatroom:RejectSeatAll"; //拒绝全部连麦申请
+    public static final String TAG_LIVE_LEAVE_MSG = "RC:Chatroom:Leave"; //离开房间消息
 
 }

+ 1 - 2
rong_im/live/src/main/java/com/rong/io/live/helper/LiveEventHelper.java

@@ -466,8 +466,7 @@ public class LiveEventHelper extends RongIMClient.OnReceiveMessageWrapperListene
      * @return
      */
     public boolean isShowingMessage(MessageContent content) {
-        if (content instanceof TextMessage || content instanceof RCChatJoinRoomMessage
-                || content instanceof RCChatroomLocationMessage || content instanceof RCUserSeatsCtrlMessage || content instanceof RCChatModeMessage
+        if (content instanceof TextMessage || content instanceof RCChatroomLocationMessage || content instanceof RCUserSeatsCtrlMessage || content instanceof RCChatModeMessage
                 || content instanceof RCUserSeatApplyMessage || content instanceof RCUserSeatResponseMessage) {
             return true;
         }

+ 9 - 0
rong_im/live/src/main/java/com/rong/io/live/helper/LiveRoomMicMemberHelper.java

@@ -66,6 +66,12 @@ public class LiveRoomMicMemberHelper {
         }
     }
 
+    public void delApplyUser(String userId) {
+        User user = new User();
+        user.setUserId(userId);
+        delApplyUser(user, false);
+    }
+
 
     /**
      * 删除全部申请连麦用户
@@ -108,7 +114,10 @@ public class LiveRoomMicMemberHelper {
                 userCacheList.add(user1);
                 Log.i("pq", "添加userCache" + userCacheList.size());
             }
+            Log.i("pq", "del apply user:" + i);
             onApplyMicUsers.remove(i);
+        }else{
+            Log.i("pq", "no find target user");
         }
     }
 

+ 1 - 1
rong_im/live/src/main/java/com/rong/io/live/message/RCChatJoinRoomMessage.java

@@ -55,7 +55,7 @@ public class RCChatJoinRoomMessage extends MessageContent {
             if (jsonObject.has("userId")) {
                 userId = jsonObject.optString("userId");
             }
-            if (jsonObject.has("userId")) {
+            if (jsonObject.has("userName")) {
                 userName = jsonObject.optString("userName");
             }
 

+ 4 - 0
student/src/main/java/com/cooleshow/student/adapter/MessageAdapter.java

@@ -64,6 +64,10 @@ public class MessageAdapter extends RecyclerView.Adapter {
 
     }
 
+    public int getMessageSize() {
+        return mMessageList == null ? 0 : mMessageList.size();
+    }
+
     public void addMessage(Message message) {
         if (message == null) {
             return;

+ 27 - 3
student/src/main/java/com/cooleshow/student/ui/live/LiveRoomActivity.java

@@ -185,6 +185,7 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityLiveroomLayoutBind
     private ObjectAnimator hideHeaderInfoAnim;
     private ObjectAnimator showHeaderInfoAnim;
     private boolean isOnResume = true;
+    private boolean isAutoScrollToLast = true;
     private Handler mHandler = new Handler(Looper.myLooper()) {
         @Override
         public void handleMessage(@NonNull android.os.Message msg) {
@@ -297,6 +298,22 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityLiveroomLayoutBind
         viewBinding.tvLiveCourse.setOnClickListener(this);
         viewBinding.tvVideoCourse.setOnClickListener(this);
         viewBinding.tvMusicSheet.setOnClickListener(this);
+
+        mRecyclerMsg.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+                super.onScrollStateChanged(recyclerView, newState);
+                if (mLinearLayoutManager == null || mMessageAdapter == null) {
+                    return;
+                }
+                int lastCompletelyVisibleItemPosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
+                if (lastCompletelyVisibleItemPosition == mMessageAdapter.getMessageSize() - 1) {
+                    isAutoScrollToLast = true;
+                } else {
+                    isAutoScrollToLast = false;
+                }
+            }
+        });
     }
 
     @Override
@@ -1083,9 +1100,13 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityLiveroomLayoutBind
                 mRecyclerMsg.post(new Runnable() {
                     @Override
                     public void run() {
-                        mRecyclerMsg.scrollToPosition(mMessageAdapter.getItemCount() - 1);
-//                        mRecyclerMsg.scrollToPosition(mMessageAdapter.getItemCount() - 1);
-//                        mLinearLayoutManager.scrollToPositionWithOffset(mMessageAdapter.getItemCount() - 1, 0);
+                        if (isAutoScrollToLast) {
+                            if (mRecyclerMsg != null) {
+                                mRecyclerMsg.scrollToPosition(mMessageAdapter.getItemCount() - 1);
+                            }
+                        } else {
+                            Log.i("pq", "收到消息,不自动滚动");
+                        }
                     }
                 });
             }
@@ -1387,6 +1408,9 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityLiveroomLayoutBind
     @Override
     public void onExitSeatMicSuccess() {
         updateMicIcon(LiveRoomMsgConstants.MIC_STATUS_NORMAL);
+        if (!TextUtils.isEmpty(mUserId)) {
+            notifyMicContainerDel(mUserId);
+        }
         if (presenter != null) {
             presenter.handleAction(LiveRoomMsgConstants.ACTION_SEND_DOWN_SEAT_MIC);
         }

+ 79 - 0
student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragment.java

@@ -0,0 +1,79 @@
+package com.cooleshow.student.ui.main;
+
+import android.view.View;
+
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.student.bean.AppHomeBean;
+import com.cooleshow.student.bean.CountOfUnreadBean;
+import com.cooleshow.student.bean.HelpCenterContentBean;
+import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStyleBean;
+import com.cooleshow.student.bean.HotAlbumBean;
+import com.cooleshow.student.bean.StudentUserInfo;
+import com.cooleshow.student.contract.HomeContract;
+import com.cooleshow.student.databinding.FragmentNewHomeLayoutBinding;
+import com.cooleshow.student.presenter.main.HomePresenter;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/8/29.
+ */
+public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBinding, HomePresenter> implements HomeContract.HomeView{
+
+
+    @Override
+    protected FragmentNewHomeLayoutBinding getLayoutView() {
+        return FragmentNewHomeLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected HomePresenter createPresenter() {
+        return new HomePresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @Override
+    public void appHomeSuccess(AppHomeBean appHomeBean) {
+
+    }
+
+    @Override
+    public void hotAlbumListSuccess(HotAlbumBean data) {
+
+    }
+
+    @Override
+    public void queryLiveAndVideoSuccess(HomeLiveAndVideoBean data) {
+
+    }
+
+    @Override
+    public void getStylePageSuccess(HomeStyleBean data) {
+
+    }
+
+    @Override
+    public void queryUserInfoSuccess(StudentUserInfo data) {
+
+    }
+
+    @Override
+    public void helpCenterContentListSuccess(HelpCenterContentBean bean) {
+
+    }
+
+    @Override
+    public void queryCountOfUnreadSuccess(List<CountOfUnreadBean> data) {
+
+    }
+}

BIN
student/src/main/res/drawable-xhdpi/icon_add_like.png


BIN
student/src/main/res/drawable-xhdpi/icon_live_room_number_people.png


BIN
student/src/main/res/drawable-xxhdpi/icon_add_like.png


BIN
student/src/main/res/drawable-xxhdpi/icon_live_room_number_people.png


+ 1 - 1
student/src/main/res/layout/activity_liveroom_layout.xml

@@ -264,7 +264,7 @@
         app:layout_constraintRight_toRightOf="parent" />
 
     <ImageView
-        android:visibility="gone"
+        android:visibility="visible"
         android:id="@+id/iv_mic"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"

+ 6 - 0
student/src/main/res/layout/fragment_new_home_layout.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 0
teacher/src/main/java/com/cooleshow/teacher/App.java

@@ -25,6 +25,7 @@ import com.rong.io.live.message.RCLiveUnderAllMicMessage;
 import com.rong.io.live.message.RCOnSnappingUpMessage;
 import com.rong.io.live.message.RCPauseLiveMessage;
 import com.rong.io.live.message.RCUserAddLikeMessage;
+import com.rong.io.live.message.RCUserLeaveRoomMessage;
 import com.rong.io.live.message.RCUserMicLeaveMessage;
 import com.rong.io.live.message.RCUserSeatApplyMessage;
 import com.rong.io.live.message.RCUserSeatResponseMessage;
@@ -155,6 +156,7 @@ public class App extends BaseApplication {
         RongIMClient.registerMessageType(RCPauseLiveMessage.class);//暂停直播消息
         RongIMClient.registerMessageType(RCLiveUnderAllMicMessage.class);//全部下麦消息
         RongIMClient.registerMessageType(RCLiveRefuseAllMicApplyMessage.class);//拒绝全部连麦申请消息
+        RongIMClient.registerMessageType(RCUserLeaveRoomMessage.class);//用户离开房间消息
         LiveRTCEngineInitHelper.initRTC();
         EmojiManager.install(new IosEmojiProvider());
 

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/LiveRoomMessageAdapter.java

@@ -64,6 +64,10 @@ public class LiveRoomMessageAdapter extends RecyclerView.Adapter {
 
     }
 
+    public int getMessageSize() {
+        return mMessageList == null ? 0 : mMessageList.size();
+    }
+
     public void addMessage(Message message) {
         if (message == null) {
             return;

+ 6 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/LiveRoomContract.java

@@ -122,6 +122,12 @@ public interface LiveRoomContract {
          * @param data
          */
         void getFriendInfoSuccess(RongIMUserInfo data);
+
+        /**
+         * 用户离开房间消息
+         * @param targetUserId
+         */
+        void onUserLeaveRoom(String targetUserId);
     }
 
     interface Presenter {

+ 23 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/live/LiveRoomPresenter.java

@@ -34,6 +34,7 @@ import com.rong.io.live.message.RCLiveUnderAllMicMessage;
 import com.rong.io.live.message.RCOnSnappingUpMessage;
 import com.rong.io.live.message.RCPauseLiveMessage;
 import com.rong.io.live.message.RCUserAddLikeMessage;
+import com.rong.io.live.message.RCUserLeaveRoomMessage;
 import com.rong.io.live.message.RCUserSeatApplyMessage;
 import com.rong.io.live.message.RCUserSeatResponseMessage;
 import com.rong.io.live.message.RCUserSeatsCtrlMessage;
@@ -709,11 +710,33 @@ public class LiveRoomPresenter extends BasePresenter<LiveRoomContract.LiveRoomVi
                             }
                             return;
                         }
+
+                        if (TextUtils.equals(message.getObjectName(), LiveRoomMsgConstants.TAG_LIVE_LEAVE_MSG)) {
+                            //用户离开直播间消息
+                            if (message.getContent() != null && null != getView()) {
+                                RCUserLeaveRoomMessage leaveRoomMessage = (RCUserLeaveRoomMessage) message.getContent();
+                                String userId = leaveRoomMessage.getUserId();
+                                getView().onUserLeaveRoom(!TextUtils.isEmpty(userId) ? userId : getUserIdFromMessage(message));
+                                return;
+                            }
+                            return;
+                        }
                     }
                 });
         disposablesManager.add(subscribe);
     }
 
+    private String getUserIdFromMessage(Message message) {
+        String userId = "";
+        if (message.getContent() != null && message.getContent().getUserInfo() != null) {
+            userId = message.getContent().getUserInfo().getUserId();
+        }
+        if (TextUtils.isEmpty(userId)) {
+            userId = message.getSenderUserId();
+        }
+        return userId;
+    }
+
     public void joinChartRoom(String chatroomId, final IRongCoreCallback.OperationCallback callback) {
         LiveEventHelper.getInstance().joinChatRoom(chatroomId, callback);
     }

+ 70 - 24
teacher/src/main/java/com/cooleshow/teacher/ui/live/TeacherLiveRoomActivity.java

@@ -151,6 +151,7 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
     private InputBarDialog mInputBarDialog;
     private int currentLiveMode = LiveConfig.LIVE_MODE_PREVIEW;//默认是预览模式
     private int currentLiveStatus = LiveConfig.LIVE_STATUS_NORMAL;
+    private boolean isAutoScrollToLast = true;
     private RongIMClient.ConnectionStatusListener connectStatusListener = new RongIMClient.ConnectionStatusListener() {
         @Override
         public void onChanged(ConnectionStatus status) {
@@ -382,6 +383,21 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
     private void initListener() {
         IMCenter.getInstance().addConnectionStatusListener(connectStatusListener);
         SoftKeyboardUtil.registerSoftInputChangedListener(getWindow(), this);
+        recyclerMsg.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+                super.onScrollStateChanged(recyclerView, newState);
+                if (mLinearLayoutManager == null || mMessageAdapter == null) {
+                    return;
+                }
+                int lastCompletelyVisibleItemPosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
+                if (lastCompletelyVisibleItemPosition == mMessageAdapter.getMessageSize() - 1) {
+                    isAutoScrollToLast = true;
+                } else {
+                    isAutoScrollToLast = false;
+                }
+            }
+        });
     }
 
     private void bindLiveStatusReport() {
@@ -690,7 +706,7 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
 
         if (id == R.id.iv_mic) {
             //连麦管理
-//            showMicManagerDialog();
+            showMicManagerDialog();
             return;
         }
 
@@ -745,6 +761,14 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
         if (joinRoomMessage == null) {
             return;
         }
+        //加入房间之前把申请列表删除
+        String userId = joinRoomMessage.getUserId();
+        if (TextUtils.isEmpty(userId) && joinRoomMessage.getUserInfo() != null) {
+            userId = joinRoomMessage.getUserInfo().getUserId();
+        }
+        if (!TextUtils.isEmpty(userId)) {
+            delApplyUser(userId);
+        }
         if (isCanShowBarrage()) {
             mTvJoinBarrage.setText(getString(R.string.enter_live_tip_str, LiveMemberHelper.getMessageName(joinRoomMessage)));
             showBarrageViewAnim(mFlJoinBarrage);
@@ -864,8 +888,12 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
                 recyclerMsg.post(new Runnable() {
                     @Override
                     public void run() {
-                        if (recyclerMsg != null) {
-                            recyclerMsg.scrollToPosition(mMessageAdapter.getItemCount() - 1);
+                        if (isAutoScrollToLast) {
+                            if (recyclerMsg != null) {
+                                recyclerMsg.scrollToPosition(mMessageAdapter.getItemCount() - 1);
+                            }
+                        } else {
+                            Log.i("pq", "收到消息,不触发滚动");
                         }
                     }
                 });
@@ -1000,6 +1028,16 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
         });
     }
 
+    private void delApplyUser(String targetUserId) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mRoomMicMemberHelper.delApplyUser(targetUserId);
+                updateMicManagerData();
+            }
+        });
+    }
+
     @Override
     public void onSwitchRole(String userId, RCRTCLiveRole role) {
         Log.i("pq", "receive onSwitchRole:" + role.getType());
@@ -1021,24 +1059,24 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
         if (!isOwn(seatApplyMessage.getTeacherId())) {
             return;
         }
-//        if (seatApplyMessage.getType() == LiveRoomMsgConstants.MIC_ACTION_SEAT_BY_USER) {
-//            //观众申请
-//            User user = new User();
-//            user.setUserName(seatApplyMessage.getAudienceName());
-//            user.setUserId(seatApplyMessage.getAudienceId());
-//            user.setPortrait(seatApplyMessage.getAudienceAvatar());
-//            mRoomMicMemberHelper.addApplyUser(user);
-//            updateMicManagerData();
-//        }
-//        if (seatApplyMessage.getType() == LiveRoomMsgConstants.MIC_ACTION_CANCEL_SEAT_BY_USER) {
-//            //观众取消
-//            User user = new User();
-//            user.setUserName(seatApplyMessage.getAudienceName());
-//            user.setUserId(seatApplyMessage.getAudienceId());
-//            user.setPortrait(seatApplyMessage.getAudienceAvatar());
-//            mRoomMicMemberHelper.delApplyUser(user, false);
-//            updateMicManagerData();
-//        }
+        if (seatApplyMessage.getType() == LiveRoomMsgConstants.MIC_ACTION_SEAT_BY_USER) {
+            //观众申请
+            User user = new User();
+            user.setUserName(seatApplyMessage.getAudienceName());
+            user.setUserId(seatApplyMessage.getAudienceId());
+            user.setPortrait(seatApplyMessage.getAudienceAvatar());
+            mRoomMicMemberHelper.addApplyUser(user);
+            updateMicManagerData();
+        }
+        if (seatApplyMessage.getType() == LiveRoomMsgConstants.MIC_ACTION_CANCEL_SEAT_BY_USER) {
+            //观众取消
+            User user = new User();
+            user.setUserName(seatApplyMessage.getAudienceName());
+            user.setUserId(seatApplyMessage.getAudienceId());
+            user.setPortrait(seatApplyMessage.getAudienceAvatar());
+            mRoomMicMemberHelper.delApplyUser(user, false);
+            updateMicManagerData();
+        }
     }
 
     @Override
@@ -1064,10 +1102,18 @@ public class TeacherLiveRoomActivity extends BaseMVPActivity<ActivityTeacherLive
         }
     }
 
-    private void updateMicManagerData() {
-        if (llMicContainer != null) {
-            return;
+    @Override
+    public void onUserLeaveRoom(String targetUserId) {
+        //用户离开直播间消息
+        if (presenter != null && mRoomMicMemberHelper != null) {
+            //删除连麦申请
+            if(!TextUtils.isEmpty(targetUserId)){
+                delApplyUser(targetUserId);
+            }
         }
+    }
+
+    private void updateMicManagerData() {
         if (mLiveMicManagerDialog != null) {
             mLiveMicManagerDialog.setApplyListData(mRoomMicMemberHelper.getOnApplyMicUsers());
             mLiveMicManagerDialog.setOnMicListData(mRoomMicMemberHelper.getOnMicUsers());

+ 1 - 1
teacher/src/main/res/layout/view_live_room_main_layout.xml

@@ -256,7 +256,7 @@
         android:layout_height="wrap_content"
         android:layout_marginEnd="11dp"
         android:src="@drawable/icon_mic_contro"
-        android:visibility="gone"
+        android:visibility="visible"
         app:layout_constraintBottom_toBottomOf="@+id/icon_finish_live"
         app:layout_constraintRight_toLeftOf="@+id/icon_finish_live"
         app:layout_constraintTop_toTopOf="@+id/icon_finish_live" />