Browse Source

修改老师端直播

Pq 3 years ago
parent
commit
cb1510a7e7
39 changed files with 1060 additions and 21 deletions
  1. 5 0
      BaseLibrary/src/main/res/drawable/bg_gray_20dp_shape.xml
  2. 5 0
      BaseLibrary/src/main/res/drawable/shape_2dc7aa_24dp.xml
  3. 418 0
      teacher/src/main/java/com/cooleshow/teacher/adapter/MessageAdapter.java
  4. 1 0
      teacher/src/main/java/com/cooleshow/teacher/bean/LiveRoomInfoBean.java
  5. 7 0
      teacher/src/main/java/com/cooleshow/teacher/contract/LiveRoomContract.java
  6. 57 1
      teacher/src/main/java/com/cooleshow/teacher/presenter/live/LiveRoomPresenter.java
  7. 138 19
      teacher/src/main/java/com/cooleshow/teacher/ui/live/LiveRoomActivity.java
  8. 0 1
      teacher/src/main/java/com/cooleshow/teacher/widgets/helper/VideoViewManager.java
  9. BIN
      teacher/src/main/res/drawable-xhdpi/icon_close_gray.png
  10. BIN
      teacher/src/main/res/drawable-xhdpi/icon_close_live.png
  11. BIN
      teacher/src/main/res/drawable-xhdpi/icon_finish_live_exit.png
  12. BIN
      teacher/src/main/res/drawable-xhdpi/icon_like_num.png
  13. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_beauty.png
  14. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_msg_room_author.png
  15. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_reverse_camera.png
  16. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_room_chat_speak.png
  17. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_room_number_people.png
  18. BIN
      teacher/src/main/res/drawable-xhdpi/icon_live_share.png
  19. BIN
      teacher/src/main/res/drawable-xhdpi/icon_mic_connecting.png
  20. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_close_gray.png
  21. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_close_live.png
  22. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_finish_live_exit.png
  23. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_like_num.png
  24. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_beauty.png
  25. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_msg_room_author.png
  26. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_reverse_camera.png
  27. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_room_chat_speak.png
  28. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_room_number_people.png
  29. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_live_share.png
  30. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_mic_connecting.png
  31. 5 0
      teacher/src/main/res/drawable/shape_live_msg_text_bg.xml
  32. 5 0
      teacher/src/main/res/drawable/shape_open_live_options.xml
  33. 17 0
      teacher/src/main/res/layout/activity_teacher_live_room_layout.xml
  34. 24 0
      teacher/src/main/res/layout/item_live_room_join_message_text.xml
  35. 34 0
      teacher/src/main/res/layout/item_live_room_message_mode_change.xml
  36. 28 0
      teacher/src/main/res/layout/item_live_room_message_text.xml
  37. 203 0
      teacher/src/main/res/layout/view_live_room_main_layout.xml
  38. 107 0
      teacher/src/main/res/layout/view_start_live_layout.xml
  39. 6 0
      teacher/src/main/res/values/strings.xml

+ 5 - 0
BaseLibrary/src/main/res/drawable/bg_gray_20dp_shape.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="19.5dp"/>
+    <solid android:color="@color/color_52000000"/>
+</shape>

+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_2dc7aa_24dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_ff2dc7aa"/>
+    <corners android:radius="24dp"/>
+</shape>

+ 418 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/MessageAdapter.java

@@ -0,0 +1,418 @@
+package com.cooleshow.teacher.adapter;
+
+import android.content.Context;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.teacher.R;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.rong.io.live.LiveRoomMsgConstants;
+import com.rong.io.live.message.RCChatJoinRoomMessage;
+import com.rong.io.live.message.RCChatModeMessage;
+import com.rong.io.live.message.RCChatroomLocationMessage;
+import com.rong.io.live.message.RCOnSnappingUpMessage;
+import com.rong.io.live.message.RCUserAddLikeMessage;
+import com.rong.io.live.message.RCUserSeatApplyMessage;
+import com.rong.io.live.message.RCUserSeatResponseMessage;
+import com.rong.io.live.message.RCUserSeatsCtrlMessage;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import io.rong.imlib.model.Message;
+import io.rong.imlib.model.MessageContent;
+import io.rong.imlib.model.UserInfo;
+import io.rong.message.TextMessage;
+
+/**
+ * Author by pq, Date on 2022/3/31.
+ */
+public class MessageAdapter extends RecyclerView.Adapter {
+    private Context context;
+    private String roomAuthorId = "";
+    private ArrayList<Message> mMessageList;
+    public static final int MESSAGE_TYPE_TEXT = -1;//文本消息
+    public static final int MESSAGE_TYPE_JOIN_ROOM = -2;//加入直播间
+    public static final int MESSAGE_TYPE_LOCAL_MSG = -3;//本地消息
+    public static final int MESSAGE_TYPE_ADD_LIKE_MSG = -4;//点赞消息
+    public static final int MESSAGE_TYPE_SEAT_CTRL_MSG = -5;//连麦控制消息
+    public static final int MESSAGE_TYPE_CHAT_CTRL_MSG = -6;//聊天控制消息
+    public static final int MESSAGE_TYPE_SEAT_APPLY_MSG = -7;//观众连麦申请
+    public static final int MESSAGE_TYPE_SEAT_RESPONSE_MSG = -8;//连麦响应消息
+    public static final int MESSAGE_TYPE_ON_SNAP_UP_MSG = -9;//xxx正在抢购
+    public static final String[] MSG_TAGS = new String[]{LiveRoomMsgConstants.TAG_TXT, LiveRoomMsgConstants.TAG_CHAT_ROOM_ENTER
+            , LiveRoomMsgConstants.TAG_CHAT_ROOM_LOCAL_MSG, LiveRoomMsgConstants.TAG_CHAT_ROOM_ADD_LIKE, LiveRoomMsgConstants.TAG_CHAT_ROOM_SEAT_CTRL
+            , LiveRoomMsgConstants.TAG_CHAT_ROOM_CHAT_MODE_CTRL, LiveRoomMsgConstants.TAG_CHAT_ROOM_SEAT_APPLY,
+            LiveRoomMsgConstants.TAG_CHAT_ROOM_SEAT_RESPONSE, LiveRoomMsgConstants.TAG_LIVE_ON_SNAP_UP};
+    public List<String> msgTags;
+
+    public MessageAdapter(Context context) {
+        this.context = context;
+        mMessageList = new ArrayList();
+        msgTags = Arrays.asList(MSG_TAGS);
+
+    }
+
+    public void addMessage(Message message) {
+        if (message == null) {
+            return;
+        }
+        if (TextUtils.isEmpty(message.getObjectName())) {
+            return;
+        }
+        if (!msgTags.contains(message.getObjectName())) {
+            return;
+        }
+        if (message.getContent() instanceof RCUserSeatResponseMessage) {
+            RCUserSeatResponseMessage responseMessage = (RCUserSeatResponseMessage) message.getContent();
+            if (!TextUtils.equals(responseMessage.getAudienceId(), UserHelper.getUserId())) {
+                return;
+            }
+        }
+        if (message.getContent() instanceof RCUserSeatApplyMessage) {
+            RCUserSeatApplyMessage applyMessage = (RCUserSeatApplyMessage) message.getContent();
+            if (!TextUtils.equals(applyMessage.getAudienceId(), UserHelper.getUserId())) {
+                return;
+            }
+        }
+        mMessageList.add(message);
+        notifyDataSetChanged();
+    }
+
+    public void setRoomAuthorId(String roomAuthorId) {
+        this.roomAuthorId = roomAuthorId;
+    }
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        switch (viewType) {
+            case MESSAGE_TYPE_TEXT:
+            case MESSAGE_TYPE_LOCAL_MSG:
+                View view = LayoutInflater.from(context).inflate(R.layout.item_live_room_message_text, parent, false);
+                return new TextMessageHolder(view);
+            case MESSAGE_TYPE_ON_SNAP_UP_MSG:
+            case MESSAGE_TYPE_ADD_LIKE_MSG:
+            case MESSAGE_TYPE_JOIN_ROOM:
+                View joinView = LayoutInflater.from(context).inflate(R.layout.item_live_room_join_message_text, parent, false);
+                return new JoinRoomMessageHolder(joinView);
+            case MESSAGE_TYPE_SEAT_APPLY_MSG:
+            case MESSAGE_TYPE_SEAT_RESPONSE_MSG:
+            case MESSAGE_TYPE_CHAT_CTRL_MSG:
+            case MESSAGE_TYPE_SEAT_CTRL_MSG:
+                View modechangeView = LayoutInflater.from(context).inflate(R.layout.item_live_room_message_mode_change, parent, false);
+                return new ModeChangeMessageHolder(modechangeView);
+        }
+        return null;
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+        Message message = mMessageList.get(position);
+        String nickNameShow = "用户" + message != null ? message.getSenderUserId() : "";
+        switch (getItemViewType(position)) {
+            case MESSAGE_TYPE_LOCAL_MSG:
+                TextMessageHolder localMsgHolder = (TextMessageHolder) holder;
+                RCChatroomLocationMessage localMsgContent = (RCChatroomLocationMessage) message.getContent();
+                localMsgHolder.mTvText.setText(localMsgContent.getContent());
+                localMsgHolder.mTvText.setTextColor(context.getResources().getColor(com.cooleshow.base.R.color.color_00d6c9));
+                break;
+            case MESSAGE_TYPE_TEXT:
+                TextMessageHolder textMessageHolder = (TextMessageHolder) holder;
+                TextMessage content = (TextMessage) message.getContent();
+                Log.i("pq", "textMessage:" + content.toString());
+                //昵称
+                String authorName = "用户" + message.getUId();
+                SpannableString spannableString;
+                if (content.getUserInfo() != null) {
+                    UserInfo userInfo = content.getUserInfo();
+                    if (!TextUtils.isEmpty(userInfo.getName())) {
+                        authorName = content.getUserInfo().getName();
+                    }
+                    if (TextUtils.equals(message.getSenderUserId(), roomAuthorId)) {
+                        //房间主讲人
+                        spannableString = getRoomAuthorTextStyleSpan(context.getString(R.string.live_msg_text_nickname, authorName), content.getContent());
+                    } else {
+                        //其他
+                        spannableString = getNormalTextStyleSpan(context.getString(R.string.live_msg_text_nickname, authorName), content.getContent());
+                    }
+                } else {
+                    spannableString = getNormalTextStyleSpan(context.getString(R.string.live_msg_text_nickname, authorName), content.getContent());
+                }
+                textMessageHolder.mTvText.setText(spannableString);
+                break;
+
+            case MESSAGE_TYPE_JOIN_ROOM:
+                JoinRoomMessageHolder joinRoomMessageHolder = (JoinRoomMessageHolder) holder;
+                Message joinMessage = mMessageList.get(position);
+                RCChatJoinRoomMessage content1 = (RCChatJoinRoomMessage) joinMessage.getContent();
+                String name = "用户" + joinMessage.getSenderUserId();
+                if (content1.getUserInfo() != null && !TextUtils.isEmpty(content1.getUserInfo().getName())) {
+                    name = content1.getUserInfo().getName();
+                }
+                joinRoomMessageHolder.mTvText.setText(getNormalTextStyleSpan(name, "进入直播间"));
+                break;
+            case MESSAGE_TYPE_ADD_LIKE_MSG:
+                JoinRoomMessageHolder addLikeMessageHolder = (JoinRoomMessageHolder) holder;
+                Message addLikeMessage = mMessageList.get(position);
+                RCUserAddLikeMessage addLikeContent = (RCUserAddLikeMessage) addLikeMessage.getContent();
+                String nick = "用户" + addLikeMessage.getSenderUserId();
+                if (addLikeContent.getUserInfo() != null && !TextUtils.isEmpty(addLikeContent.getUserInfo().getName())) {
+                    nick = addLikeContent.getUserInfo().getName();
+                }
+                int counts = addLikeContent.getCounts();
+                addLikeMessageHolder.mTvText.setText(getNormalTextStyleSpan(nick, context.getString(R.string.live_room_add_like_count_text_str, counts)));
+                break;
+            case MESSAGE_TYPE_SEAT_CTRL_MSG:
+                //连麦控制
+                ModeChangeMessageHolder seatModeChangeHolder = (ModeChangeMessageHolder) holder;
+                Message modeChangeMsg = mMessageList.get(position);
+                RCUserSeatsCtrlMessage ctrlContent = (RCUserSeatsCtrlMessage) modeChangeMsg.getContent();
+                String nickName = "用户" + modeChangeMsg != null ? modeChangeMsg.getSenderUserId() : "";
+                if (!TextUtils.isEmpty(ctrlContent.getUserName())) {
+                    nickName = ctrlContent.getUserName();
+                }
+                boolean isEnableSeat = ctrlContent.isSeatBan();
+                String afterContent = isEnableSeat ? "关闭连麦" : "开启连麦";
+                seatModeChangeHolder.mIvIcon.setVisibility(View.VISIBLE);
+                seatModeChangeHolder.mTvText.setText(getNormalTextStyleSpan(nickName, afterContent));
+                break;
+            case MESSAGE_TYPE_CHAT_CTRL_MSG:
+                //聊天控制
+                ModeChangeMessageHolder chatModeChangeHolder = (ModeChangeMessageHolder) holder;
+                Message chatModeChangeMsg = mMessageList.get(position);
+                RCChatModeMessage chatModeContent = (RCChatModeMessage) chatModeChangeMsg.getContent();
+                String nickName2 = "用户" + chatModeChangeMsg != null ? chatModeChangeMsg.getSenderUserId() : "";
+                if (!TextUtils.isEmpty(chatModeContent.getUserName())) {
+                    nickName2 = chatModeContent.getUserName();
+                }
+                boolean isEnableChat = chatModeContent.isChatBan();
+                String afterContent2 = isEnableChat ? "关闭聊天" : "开启聊天";
+                chatModeChangeHolder.mIvIcon.setVisibility(View.VISIBLE);
+                chatModeChangeHolder.mTvText.setText(getNormalTextStyleSpan(nickName2, afterContent2));
+                break;
+            case MESSAGE_TYPE_SEAT_APPLY_MSG:
+                ModeChangeMessageHolder seatApplyMsgHolder = (ModeChangeMessageHolder) holder;
+                RCUserSeatApplyMessage content2 = (RCUserSeatApplyMessage) message.getContent();
+                int type = content2.getType();
+                if (type == LiveRoomMsgConstants.MIC_ACTION_SEAT_BY_USER
+                        || type == LiveRoomMsgConstants.MIC_ACTION_CANCEL_SEAT_BY_USER) {
+                    seatApplyMsgHolder.mIvIcon.setVisibility(View.GONE);
+                    seatApplyMsgHolder.mTvText.setPadding(SizeUtils.dp2px(10), 0, SizeUtils.dp2px(10), 0);
+                    if (!TextUtils.isEmpty(content2.getAudienceName())) {
+                        nickNameShow = content2.getAudienceName();
+                    }
+                } else {
+                    seatApplyMsgHolder.mIvIcon.setVisibility(View.VISIBLE);
+                    seatApplyMsgHolder.mTvText.setPadding(SizeUtils.dp2px(5), 0, SizeUtils.dp2px(10), 0);
+                    if (!TextUtils.isEmpty(content2.getTeacherName())) {
+                        nickNameShow = content2.getTeacherName();
+                    }
+                }
+                String contentText = "";
+                if (type == LiveRoomMsgConstants.MIC_ACTION_SEAT_BY_USER) {
+                    //观众发起连麦申请
+                    contentText = "发起了连麦申请";
+                }
+                if (type == LiveRoomMsgConstants.MIC_ACTION_CANCEL_SEAT_BY_USER) {
+                    //观众取消连麦申请
+                    contentText = "取消了连麦申请";
+                }
+
+                if (type == LiveRoomMsgConstants.MIC_ACTION_CANCEL_SEAT_BY_CREATE) {
+                    //主讲人将观众抱下麦
+                    contentText = "将你抱下麦";
+                }
+
+                if (type == LiveRoomMsgConstants.MIC_ACTION_INVITE_SEAT_BY_CREATE) {
+                    //主讲人发起了连麦邀请
+                    contentText = "发起了连麦邀请";
+                }
+                if (type == LiveRoomMsgConstants.MIC_ACTION_CANCEL_INVITE_SEAT_BY_CREATE) {
+                    //主讲人取消了连麦邀请
+                    contentText = "取消了连麦邀请";
+                }
+                seatApplyMsgHolder.mTvText.setText(getNormalTextStyleSpan(nickNameShow, contentText));
+                break;
+            case MESSAGE_TYPE_SEAT_RESPONSE_MSG:
+                ModeChangeMessageHolder seatResponseMsgHolder = (ModeChangeMessageHolder) holder;
+                RCUserSeatResponseMessage responseContent = (RCUserSeatResponseMessage) message.getContent();
+                int responseType = responseContent.getType();
+                if (responseType == LiveRoomMsgConstants.MIC_RESPONSE_AGREE_BY_USER
+                        || responseType == LiveRoomMsgConstants.MIC_RESPONSE_DISAGREE_BY_USER) {
+                    seatResponseMsgHolder.mIvIcon.setVisibility(View.GONE);
+                    seatResponseMsgHolder.mTvText.setPadding(SizeUtils.dp2px(10), 0, SizeUtils.dp2px(10), 0);
+                    if (!TextUtils.isEmpty(responseContent.getAudienceName())) {
+                        nickNameShow = responseContent.getAudienceName();
+                    }
+                } else {
+                    seatResponseMsgHolder.mIvIcon.setVisibility(View.VISIBLE);
+                    seatResponseMsgHolder.mTvText.setPadding(SizeUtils.dp2px(5), 0, SizeUtils.dp2px(10), 0);
+                    if (!TextUtils.isEmpty(responseContent.getTeacherName())) {
+                        nickNameShow = responseContent.getTeacherName();
+                    }
+                }
+                String responseContentText = "";
+                if (responseType == LiveRoomMsgConstants.MIC_RESPONSE_AGREE) {
+                    //主讲人同意观众上麦申请
+                    responseContentText = "同意了连麦申请";
+                }
+                if (responseType == LiveRoomMsgConstants.MIC_RESPONSE_DISAGREE) {
+                    //主讲人不同意观众上麦申请
+                    responseContentText = "取消了连麦申请";
+                }
+                if (responseType == LiveRoomMsgConstants.MIC_RESPONSE_AGREE_BY_USER) {
+                    //观众同意了连麦邀请
+                    responseContentText = "同意了连麦邀请";
+                }
+                if (responseType == LiveRoomMsgConstants.MIC_RESPONSE_DISAGREE_BY_USER) {
+                    //观众取消了连麦邀请
+                    responseContentText = "取消了连麦邀请";
+                }
+                seatResponseMsgHolder.mTvText.setText(getNormalTextStyleSpan(nickNameShow, responseContentText));
+                break;
+            case MESSAGE_TYPE_ON_SNAP_UP_MSG:
+                JoinRoomMessageHolder onSnapUpHolder = (JoinRoomMessageHolder) holder;
+                Message onSnapUpMessage = mMessageList.get(position);
+                RCOnSnappingUpMessage onSnapUpContent = (RCOnSnappingUpMessage) onSnapUpMessage.getContent();
+                String lastName = getNickName(onSnapUpMessage, onSnapUpContent != null ? onSnapUpContent.getUserName() : "");
+                onSnapUpHolder.mTvText.setText(getNormalTextStyleSpan(lastName, " 正在抢购"));
+                break;
+
+        }
+    }
+
+    private void setDefaultInfo(Message message) {
+
+    }
+
+    private String getNickName(Message message, String defaultName) {
+        if (!TextUtils.isEmpty(defaultName)) {
+            return defaultName;
+        }
+        return getNickName(message);
+    }
+
+    private String getNickName(Message message) {
+        //昵称
+        String name = "用户" + message.getSenderUserId();
+        MessageContent content = message.getContent();
+        if (content.getUserInfo() != null && !TextUtils.isEmpty(content.getUserInfo().getName())) {
+            name = content.getUserInfo().getName();
+        }
+        return name;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mMessageList != null ? mMessageList.size() : 0;
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        Message message = mMessageList.get(position);
+        String objectName = message.getObjectName();
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_TXT)) {
+            //文本消息
+            return MESSAGE_TYPE_TEXT;
+        }
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_ENTER)) {
+            //进入房间消息
+            return MESSAGE_TYPE_JOIN_ROOM;
+        }
+
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_LOCAL_MSG)) {
+            //本地消息
+            return MESSAGE_TYPE_LOCAL_MSG;
+        }
+
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_ADD_LIKE)) {
+            //点赞消息
+            return MESSAGE_TYPE_ADD_LIKE_MSG;
+        }
+
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_SEAT_CTRL)) {
+            //连麦控制
+            return MESSAGE_TYPE_SEAT_CTRL_MSG;
+        }
+
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_CHAT_MODE_CTRL)) {
+            //聊天控制
+            return MESSAGE_TYPE_CHAT_CTRL_MSG;
+        }
+
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_SEAT_APPLY)) {
+            //连麦相关
+            return MESSAGE_TYPE_SEAT_APPLY_MSG;
+        }
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_CHAT_ROOM_SEAT_RESPONSE)) {
+            //连麦响应相关
+            return MESSAGE_TYPE_SEAT_RESPONSE_MSG;
+        }
+
+        if (TextUtils.equals(objectName, LiveRoomMsgConstants.TAG_LIVE_ON_SNAP_UP)) {
+            //正在抢购
+            return MESSAGE_TYPE_ON_SNAP_UP_MSG;
+        }
+        return super.getItemViewType(position);
+    }
+
+
+    private static class TextMessageHolder extends RecyclerView.ViewHolder {
+
+        private final TextView mTvText;
+
+        public TextMessageHolder(@NonNull View itemView) {
+            super(itemView);
+            mTvText = itemView.findViewById(R.id.tv_text);
+        }
+    }
+
+    private static class ModeChangeMessageHolder extends RecyclerView.ViewHolder {
+
+        private final TextView mTvText;
+        private final ImageView mIvIcon;
+
+        public ModeChangeMessageHolder(@NonNull View itemView) {
+            super(itemView);
+            mTvText = itemView.findViewById(R.id.tv_text);
+            mIvIcon = itemView.findViewById(R.id.iv_icon);
+        }
+    }
+
+    private static class JoinRoomMessageHolder extends RecyclerView.ViewHolder {
+
+        private final TextView mTvText;
+
+        public JoinRoomMessageHolder(@NonNull View itemView) {
+            super(itemView);
+            mTvText = itemView.findViewById(R.id.tv_text);
+        }
+    }
+
+    private SpannableString getNormalTextStyleSpan(String startStr, String contentText) {
+        return UiUtils.diffColorString(startStr
+                , contentText
+                , context.getResources().getColor(com.cooleshow.base.R.color.color_00d6c9)
+                , context.getResources().getColor(R.color.white));
+    }
+
+    private SpannableString getRoomAuthorTextStyleSpan(String nickName, String contentText) {
+        return UiUtils.diffColorString(nickName
+                , contentText
+                , context.getResources().getColor(com.cooleshow.base.R.color.color_00d6c9)
+                , context.getResources().getColor(R.color.white)
+                , context.getResources().getDrawable(R.drawable.icon_live_msg_room_author));
+    }
+}

+ 1 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/LiveRoomInfoBean.java

@@ -41,6 +41,7 @@ public class LiveRoomInfoBean implements Parcelable {
     public String roomUid;
     public String speakerId;
     public String speakerName;
+    public String speakerPic;
     public int subjectId;
     public String type;
 

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

@@ -7,6 +7,7 @@ import com.cooleshow.teacher.bean.LiveRoomInfoBean;
 
 import java.util.List;
 
+import cn.rongcloud.rtc.api.stream.RCRTCVideoView;
 import io.rong.imlib.model.Message;
 import io.rong.imlib.model.MessageContent;
 
@@ -59,6 +60,12 @@ public interface LiveRoomContract {
         void onPublishSuccess();
 
         View getContentView();
+
+        void addVideoPreview(RCRTCVideoView videoView);
+
+        void openCameraSuccess(Boolean data);
+
+        void openCameraError(String errorMsg);
     }
 
     interface Presenter {

+ 57 - 1
teacher/src/main/java/com/cooleshow/teacher/presenter/live/LiveRoomPresenter.java

@@ -5,6 +5,7 @@ import android.util.Log;
 
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.Utils;
 import com.cooleshow.teacher.api.APIService;
 import com.cooleshow.teacher.bean.LiveRoomInfoBean;
 import com.cooleshow.teacher.contract.LiveRoomContract;
@@ -32,10 +33,12 @@ import cn.rongcloud.rtc.api.stream.RCRTCOutputStream;
 import cn.rongcloud.rtc.api.stream.RCRTCVideoInputStream;
 import cn.rongcloud.rtc.api.stream.RCRTCVideoOutputStream;
 import cn.rongcloud.rtc.api.stream.RCRTCVideoStreamConfig;
+import cn.rongcloud.rtc.api.stream.RCRTCVideoView;
 import cn.rongcloud.rtc.base.RCRTCLiveRole;
 import cn.rongcloud.rtc.base.RCRTCMediaType;
 import cn.rongcloud.rtc.base.RCRTCParamsType;
 import cn.rongcloud.rtc.base.RTCErrorCode;
+import cn.rongcloud.rtc.core.CameraVideoCapturer;
 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 import io.reactivex.rxjava3.annotations.NonNull;
 import io.reactivex.rxjava3.core.Observable;
@@ -195,9 +198,33 @@ public class LiveRoomPresenter extends BasePresenter<LiveRoomContract.LiveRoomVi
         });
     }
 
+    /**
+     * 初始化配置以及预览模式
+     */
+    public void openVideoPreview(){
+        initPublishConfig();
+        startVideoPreview();
+    }
+
+    /**
+     * 切换摄像头
+     */
+    public void reverseCamera(){
+        RCRTCEngine.getInstance().getDefaultVideoStream().switchCamera(new CameraVideoCapturer.CameraSwitchHandler() {
+            @Override
+            public void onCameraSwitchDone(boolean isFrontCamera) {
+                // 切换成功
+            }
+
+            @Override
+            public void onCameraSwitchError(String errorDescription) {
+                // 切换失败
+            }
+        });
+    }
+
     public void prepareJoinRoom(String roomId, boolean isCreate) {
         //先离开当前房间
-        initPublishConfig();
         LiveEventHelper.getInstance().leaveRoom(new IRoomCallBack() {
             @Override
             public void onSuccess() {
@@ -219,6 +246,35 @@ public class LiveRoomPresenter extends BasePresenter<LiveRoomContract.LiveRoomVi
         });
     }
 
+    /**
+     * 开启预览
+     *
+     * @param
+     */
+    private void startVideoPreview() {
+        // 创建本地视频显示视图
+        RCRTCVideoView rcrtcVideoView = new RCRTCVideoView(Utils.getApp().getApplicationContext());
+        RCRTCEngine.getInstance().getDefaultVideoStream().setVideoView(rcrtcVideoView);
+        if (getView() != null) {
+            getView().addVideoPreview(rcrtcVideoView);
+        }
+        RCRTCEngine.getInstance().getDefaultVideoStream().startCamera(new IRCRTCResultDataCallback<Boolean>() {
+            @Override
+            public void onSuccess(Boolean data) {
+                if (getView() != null) {
+                    getView().openCameraSuccess(data);
+                }
+            }
+
+            @Override
+            public void onFailed(RTCErrorCode errorCode) {
+                if (getView() != null) {
+                    getView().openCameraError(errorCode.getReason());
+                }
+            }
+        });
+    }
+
     private void initPublishConfig() {
         try {
 

+ 138 - 19
teacher/src/main/java/com/cooleshow/teacher/ui/live/LiveRoomActivity.java

@@ -5,14 +5,20 @@ import android.content.Intent;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
+import com.bumptech.glide.Glide;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
 import com.cooleshow.base.utils.Utils;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.adapter.MessageAdapter;
 import com.cooleshow.teacher.bean.LiveRoomInfoBean;
 import com.cooleshow.teacher.contract.LiveRoomContract;
 import com.cooleshow.teacher.databinding.ActivityTeacherLiveRoomLayoutBinding;
@@ -26,6 +32,8 @@ import com.rong.io.live.helper.LiveRTCEngineInitHelper;
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
 import cn.rongcloud.rtc.api.RCRTCAudioRouteManager;
 import cn.rongcloud.rtc.api.RCRTCVideoStream;
 import cn.rongcloud.rtc.api.stream.RCRTCAudioInputStream;
@@ -46,8 +54,11 @@ import io.rong.imlib.model.MessageContent;
  * 老师端直播间页面
  */
 @Route(path = RouterPath.LiveCenter.ACTIVITY_LIVE_ROOM_TEACHER)
-public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLayoutBinding, LiveRoomPresenter> implements LiveRoomContract.LiveRoomView {
+public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLayoutBinding, LiveRoomPresenter> implements LiveRoomContract.LiveRoomView, View.OnClickListener {
     public static final String ROOMID_KEY = "roomid_key";
+    private TextView mTvNumPeople;
+    private TextView mTvRoomCreateName;
+    private ImageView mIvAvatar;
     public String mRoomId = "";
     private VideoViewManager mVideoViewManager;
     private boolean isNeedRefresh = false;//是否需要重新刷新房间信息
@@ -72,6 +83,8 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
             }
         }
     };
+    private MessageAdapter mMessageAdapter;
+    private LinearLayoutManager mLinearLayoutManager;
 
     public static void start(Context context, String roomId) {
         Intent intent = new Intent(context, LiveRoomActivity.class);
@@ -81,7 +94,14 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
 
     @Override
     protected void initView() {
-
+        viewBinding.viewCreateOptions.ivReverseCamera.setOnClickListener(this);
+        viewBinding.viewCreateOptions.ivLiveBeauty.setOnClickListener(this);
+        viewBinding.viewCreateOptions.ivLiveShare.setOnClickListener(this);
+        viewBinding.viewCreateOptions.tvStartLive.setOnClickListener(this);
+        viewBinding.viewCreateOptions.tvClose.setOnClickListener(this);
+        mTvNumPeople = viewBinding.viewMainLayout.tvNumPeople;
+        mTvRoomCreateName = viewBinding.viewMainLayout.tvRoomAuthorName;
+        mIvAvatar = viewBinding.viewMainLayout.ivAvatar;
     }
 
     @Override
@@ -112,6 +132,10 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
                 checkVideoViewManager();
             }
         });
+        mMessageAdapter = new MessageAdapter(this);
+        mLinearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
+        viewBinding.viewMainLayout.recyclerMsg.setLayoutManager(mLinearLayoutManager);
+        viewBinding.viewMainLayout.recyclerMsg.setAdapter(mMessageAdapter);
         IMCenter.getInstance().addConnectionStatusListener(connectStatusListener);
 //        SoftKeyboardUtil.registerSoftInputChangedListener(getWindow(), this);
         prepareInitRoom();
@@ -176,28 +200,58 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
             return;
         }
         mRoomInfoBean = roomInfoBean;
+        if (mMessageAdapter != null) {
+            mMessageAdapter.setRoomAuthorId(roomInfoBean.speakerId);
+        }
+        int peopleCount = roomInfoBean.lookNum + 1;//加上自己
+        mTvNumPeople.setText(peopleCount + "人");
+        //创建人头像
+        Glide.with(LiveRoomActivity.this).load(roomInfoBean.speakerPic).placeholder(R.drawable.icon_teacher_default_head).error(R.drawable.icon_teacher_default_head).into(mIvAvatar);
+        //创建人昵称
+        mTvRoomCreateName.setText(roomInfoBean.speakerName);
         if (presenter != null) {
             //加入聊天室
             //加入直播间
             showLoading();
             LiveEventHelper.getInstance().register(roomInfoBean.roomUid);
-            presenter.prepareJoinRoom(mRoomInfoBean.roomUid, true);
-            presenter.joinChartRoom(mRoomInfoBean.roomUid, new IRongCoreCallback.OperationCallback() {
-                @Override
-                public void onSuccess() {
-                    Log.i("pq", "加入聊天房间成功");
-                    if (presenter != null) {
-//                        presenter.handleAction(LiveRoomMsgConstants.ACTION_SEND_JOIN_ROOM);
-                        presenter.sendDefaultMessage();
-                    }
-                }
+            presenter.openVideoPreview();
+//            presenter.joinChartRoom(mRoomInfoBean.roomUid, new IRongCoreCallback.OperationCallback() {
+//                @Override
+//                public void onSuccess() {
+//                    Log.i("pq", "加入聊天房间成功");
+//                    if (presenter != null) {
+////                        presenter.handleAction(LiveRoomMsgConstants.ACTION_SEND_JOIN_ROOM);
+//                        presenter.sendDefaultMessage();
+//                    }
+//                }
+//
+//                @Override
+//                public void onError(IRongCoreEnum.CoreErrorCode coreErrorCode) {
+//                    Log.i("pq", "加入聊天房间fail:" + coreErrorCode);
+//                    Toast.makeText(LiveRoomActivity.this, "加入聊天房间fail:" + coreErrorCode, Toast.LENGTH_SHORT).show();
+//                }
+//            });
+        }
+    }
 
-                @Override
-                public void onError(IRongCoreEnum.CoreErrorCode coreErrorCode) {
-                    Log.i("pq", "加入聊天房间fail:" + coreErrorCode);
-                    Toast.makeText(LiveRoomActivity.this, "加入聊天房间fail:" + coreErrorCode, Toast.LENGTH_SHORT).show();
-                }
-            });
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.iv_reverse_camera) {
+            //翻转摄像头
+            presenter.reverseCamera();
+            return;
+        }
+        if (id == R.id.iv_live_beauty) {
+            //美颜
+            return;
+        }
+
+        if (id == R.id.tv_start_live) {
+            //开始直播
+            if (mRoomInfoBean != null) {
+                presenter.prepareJoinRoom(mRoomInfoBean.roomUid, true);
+            }
         }
     }
 
@@ -227,12 +281,39 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
 
     @Override
     public void addMessageContent(Message message, boolean isReset) {
-
+        //添加单条消息至页面
+        Log.i("pq", "收到需要显示msg:" + message);
+        //只处理直播间消息,以及本直播间消息
+        if (mMessageAdapter != null) {
+            mMessageAdapter.addMessage(message);
+            if (mLinearLayoutManager != null) {
+                viewBinding.viewMainLayout.recyclerMsg.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (viewBinding.viewMainLayout.recyclerMsg != null) {
+                            viewBinding.viewMainLayout.recyclerMsg.scrollToPosition(mMessageAdapter.getItemCount() - 1);
+                        }
+                    }
+                });
+            }
+        }
     }
 
     @Override
     public void setRoomData(LiveRoomInfoBean roomInfoBean) {
+        //加入聊天房间
+        presenter.joinChartRoom(roomInfoBean.roomUid, new IRongCoreCallback.OperationCallback() {
+            @Override
+            public void onSuccess() {
+                Log.i("pq", "加入聊天房间成功");
+                presenter.sendDefaultMessage();
+            }
 
+            @Override
+            public void onError(IRongCoreEnum.CoreErrorCode coreErrorCode) {
+                Log.i("pq", "加入聊天房间fail:" + coreErrorCode);
+            }
+        });
     }
 
     @Override
@@ -245,6 +326,38 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
         return viewBinding.flLiveView;
     }
 
+    /**
+     * 预览模式
+     *
+     * @param videoView
+     */
+    @Override
+    public void addVideoPreview(RCRTCVideoView videoView) {
+        checkVideoViewManager();
+        if (mVideoViewManager != null) {
+            ArrayList<RCRTCVideoView> videoViews = new ArrayList<>();
+            videoViews.add(videoView);
+            mVideoViewManager.update(videoViews, false);
+        } else {
+            LogUtils.i("pq", "mVideoViewManager == null");
+        }
+    }
+
+    @Override
+    public void openCameraSuccess(Boolean data) {
+        Log.i("pq", "openCameraSuccess:" + data);
+    }
+
+    @Override
+    public void openCameraError(String errorMsg) {
+        viewBinding.flLiveView.post(new Runnable() {
+            @Override
+            public void run() {
+                ToastUtil.getInstance().show(LiveRoomActivity.this, errorMsg);
+            }
+        });
+    }
+
 
     private void refresh() {
         List<RCRTCVideoOutputStream> outputStreams = new ArrayList<>();
@@ -258,6 +371,11 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
         viewBinding.flLiveView.post(new Runnable() {
             @Override
             public void run() {
+                //隐藏配置页
+                if (viewBinding.viewCreateOptions.getRoot().getVisibility() == View.VISIBLE) {
+                    viewBinding.viewCreateOptions.getRoot().setVisibility(View.GONE);
+                    viewBinding.viewMainLayout.getRoot().setVisibility(View.VISIBLE);
+                }
                 ArrayList<RCRTCVideoStream> videoStreams = new ArrayList<RCRTCVideoStream>();
                 videoStreams.addAll(outputStreams);
                 videoStreams.addAll(inputStreams);
@@ -330,4 +448,5 @@ public class LiveRoomActivity extends BaseMVPActivity<ActivityTeacherLiveRoomLay
             mVideoViewManager.onRelease();
         }
     }
+
 }

+ 0 - 1
teacher/src/main/java/com/cooleshow/teacher/widgets/helper/VideoViewManager.java

@@ -25,7 +25,6 @@ public class VideoViewManager {
     ArrayList<RCRTCVideoView> arrayListVideoView;
     int mWidth, mHeight;
     private RelativeLayout flSurfaceContainer;
-    private Map<String, RCRTCVideoView> linkedHashMap = new LinkedHashMap<>();
     private View mStatusView;
     private ProgressBar mPbLoading;
     private TextView mTvLoading;

BIN
teacher/src/main/res/drawable-xhdpi/icon_close_gray.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_close_live.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_finish_live_exit.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_like_num.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_live_beauty.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_live_msg_room_author.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_live_reverse_camera.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_live_room_chat_speak.png


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


BIN
teacher/src/main/res/drawable-xhdpi/icon_live_share.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_mic_connecting.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_close_gray.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_close_live.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_finish_live_exit.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_like_num.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_live_beauty.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_live_msg_room_author.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_live_reverse_camera.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_live_room_chat_speak.png


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


BIN
teacher/src/main/res/drawable-xxhdpi/icon_live_share.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_mic_connecting.png


+ 5 - 0
teacher/src/main/res/drawable/shape_live_msg_text_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_52000000" />
+    <corners android:radius="10dp" />
+</shape>

+ 5 - 0
teacher/src/main/res/drawable/shape_open_live_options.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/black_80" />
+    <corners android:radius="16dp" />
+</shape>

+ 17 - 0
teacher/src/main/res/layout/activity_teacher_live_room_layout.xml

@@ -24,4 +24,21 @@
         app:layout_constraintLeft_toLeftOf="@+id/fl_live_view"
         app:layout_constraintRight_toRightOf="@+id/fl_live_view"
         app:layout_constraintTop_toTopOf="@+id/fl_live_view" />
+
+    <include
+        android:id="@+id/view_create_options"
+        layout="@layout/view_start_live_layout"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <include
+        android:id="@+id/view_main_layout"
+        layout="@layout/view_live_room_main_layout"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 24 - 0
teacher/src/main/res/layout/item_live_room_join_message_text.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="8dp"
+    android:background="@drawable/shape_live_msg_text_bg"
+    android:paddingTop="3dp"
+    android:paddingBottom="3dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    tools:ignore="MissingDefaultResource">
+    <TextView
+        android:maxWidth="240dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="10dp"
+        android:includeFontPadding="false"
+        android:id="@+id/tv_text"
+        tools:text="作者:作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_13"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</FrameLayout>

+ 34 - 0
teacher/src/main/res/layout/item_live_room_message_mode_change.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="8dp"
+    android:background="@drawable/shape_live_msg_text_bg"
+    android:orientation="horizontal"
+    android:paddingTop="3dp"
+    android:paddingBottom="3dp"
+    tools:ignore="MissingDefaultResource">
+
+    <ImageView
+        android:id="@+id/iv_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="10dp"
+        android:src="@drawable/icon_live_msg_room_author"
+        android:visibility="gone" />
+
+    <TextView
+        android:paddingEnd="10dp"
+        android:id="@+id/tv_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:paddingStart="10dp"
+        android:includeFontPadding="false"
+        android:maxWidth="240dp"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_13"
+        tools:text="作者:作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者" />
+</LinearLayout>

+ 28 - 0
teacher/src/main/res/layout/item_live_room_message_text.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="8dp"
+    android:background="@drawable/shape_live_msg_text_bg"
+    android:paddingTop="3dp"
+    android:paddingBottom="3dp"
+    tools:ignore="MissingDefaultResource">
+
+    <TextView
+        android:maxWidth="240dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="10dp"
+        android:id="@+id/tv_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="作者:作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者作者" />
+</FrameLayout>

+ 203 - 0
teacher/src/main/res/layout/view_live_room_main_layout.xml

@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:background="@color/color_25292e">
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cs_header_info"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <View
+            android:id="@+id/bg_avatar"
+            android:layout_width="0dp"
+            android:layout_height="38dp"
+            android:layout_marginLeft="11dp"
+            android:layout_marginTop="2dp"
+            android:background="@drawable/bg_gray_20dp_shape"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="@+id/tv_room_author_name"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/iv_avatar"
+            android:layout_width="34dp"
+            android:layout_height="34dp"
+            android:layout_marginStart="2dp"
+            app:civ_circle_background_color="@color/white"
+            app:layout_constraintBottom_toBottomOf="@+id/bg_avatar"
+            app:layout_constraintLeft_toLeftOf="@+id/bg_avatar"
+            app:layout_constraintTop_toTopOf="@+id/bg_avatar" />
+
+        <TextView
+            android:id="@+id/tv_room_author_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="9dp"
+            android:ellipsize="end"
+            android:includeFontPadding="false"
+            android:maxLines="1"
+            android:paddingEnd="17dp"
+            android:text=""
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_18"
+            app:layout_constraintBottom_toBottomOf="@+id/bg_avatar"
+            app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+            app:layout_constraintTop_toTopOf="@+id/bg_avatar"
+            tools:text="唐老唐老师唐老师师" />
+
+        <ImageView
+            android:id="@+id/iv_close"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="14dp"
+            android:padding="5dp"
+            android:src="@drawable/icon_close_gray"
+            app:layout_constraintBottom_toBottomOf="@+id/bg_avatar"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/bg_avatar" />
+
+        <LinearLayout
+            android:id="@+id/ll_member_num_bg"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="15dp"
+            android:background="@drawable/bg_gray_20dp_shape"
+            android:gravity="center_vertical"
+            android:paddingStart="10dp"
+            android:paddingTop="5dp"
+            android:paddingEnd="10dp"
+            android:paddingBottom="5dp"
+            app:layout_constraintBottom_toBottomOf="@+id/bg_avatar"
+            app:layout_constraintRight_toLeftOf="@+id/iv_close"
+            app:layout_constraintTop_toTopOf="@+id/bg_avatar">
+
+            <ImageView
+                android:id="@+id/iv_number_people"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/icon_live_room_number_people" />
+
+            <TextView
+                android:id="@+id/tv_num_people"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:ellipsize="end"
+                android:includeFontPadding="false"
+                android:maxLines="1"
+                android:text="0人"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_14"
+                tools:text="176人" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/ll_like"
+            android:layout_width="wrap_content"
+            android:layout_height="22dp"
+            android:layout_marginTop="8dp"
+            android:background="@drawable/bg_gray_20dp_shape"
+            android:orientation="horizontal"
+            android:paddingStart="7dp"
+            android:paddingEnd="7dp"
+            app:layout_constraintLeft_toLeftOf="@+id/bg_avatar"
+            app:layout_constraintTop_toBottomOf="@+id/bg_avatar">
+
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:src="@drawable/icon_like_num" />
+
+            <TextView
+                android:id="@+id/tv_add_like_count"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:includeFontPadding="false"
+                android:paddingStart="2dp"
+                android:text="本场点赞0"
+                android:textColor="@color/white"
+                android:textSize="@dimen/sp_12"
+                tools:text="本场点赞1240000000" />
+        </LinearLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_input"
+        android:layout_width="0dp"
+        android:layout_height="38dp"
+        android:layout_marginStart="11dp"
+        android:layout_marginEnd="11dp"
+        android:layout_marginBottom="30dp"
+        android:background="@drawable/bg_gray_20dp_shape"
+        android:gravity="center_vertical"
+        android:includeFontPadding="false"
+        android:maxLines="10"
+        android:paddingStart="16dp"
+        android:text="和同学聊两句~"
+        android:textColor="@color/color_90ffffff"
+        android:textColorHint="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toLeftOf="@+id/iv_mic" />
+
+    <ImageView
+        android:id="@+id/iv_chat_speak"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="11dp"
+        android:src="@drawable/icon_live_room_chat_speak"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_input"
+        app:layout_constraintRight_toRightOf="@+id/tv_input"
+        app:layout_constraintTop_toTopOf="@+id/tv_input" />
+
+
+    <ImageView
+        android:id="@+id/icon_finish_live"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="11dp"
+        android:layout_marginBottom="30dp"
+        android:src="@drawable/icon_finish_live_exit"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_mic"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="11dp"
+        android:src="@drawable/icon_mic_connecting"
+        app:layout_constraintBottom_toBottomOf="@+id/icon_finish_live"
+        app:layout_constraintRight_toLeftOf="@+id/icon_finish_live"
+        app:layout_constraintTop_toTopOf="@+id/icon_finish_live" />
+
+    <FrameLayout
+        android:id="@+id/fl_recycler_container"
+        android:layout_width="match_parent"
+        android:layout_height="190dp"
+        android:layout_marginBottom="10dp"
+        android:paddingStart="11dp"
+        android:paddingEnd="11dp"
+        app:layout_constraintBottom_toTopOf="@+id/tv_input"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recycler_msg"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none" />
+    </FrameLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 107 - 0
teacher/src/main/res/layout/view_start_live_layout.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="19dp"
+        android:layout_marginTop="50dp"
+        android:drawableLeft="@drawable/icon_close_live"
+        android:text="@string/close_str"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14" />
+
+
+    <TextView
+        android:id="@+id/tv_start_live"
+        android:layout_width="match_parent"
+        android:layout_height="47dp"
+        android:layout_gravity="bottom|center_horizontal"
+        android:layout_marginStart="76dp"
+        android:layout_marginEnd="76dp"
+        android:layout_marginBottom="112dp"
+        android:background="@drawable/shape_2dc7aa_24dp"
+        android:gravity="center"
+        android:text="开始视频直播"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_18" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="76dp"
+        android:layout_gravity="bottom|center_horizontal"
+        android:layout_marginStart="62dp"
+        android:layout_marginEnd="62dp"
+        android:layout_marginBottom="207dp"
+        android:background="@drawable/shape_open_live_options"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/iv_reverse_camera"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:src="@drawable/icon_live_reverse_camera"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toLeftOf="@+id/iv_live_beauty"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:includeFontPadding="false"
+            android:paddingTop="3dp"
+            android:text="@string/reverse_camera_str"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_11"
+            app:layout_constraintLeft_toLeftOf="@+id/iv_reverse_camera"
+            app:layout_constraintRight_toRightOf="@+id/iv_reverse_camera"
+            app:layout_constraintTop_toBottomOf="@+id/iv_reverse_camera" />
+
+        <ImageView
+            android:id="@+id/iv_live_beauty"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/icon_live_beauty"
+            app:layout_constraintLeft_toRightOf="@+id/iv_reverse_camera"
+            app:layout_constraintRight_toLeftOf="@+id/iv_live_share"
+            app:layout_constraintTop_toTopOf="@+id/iv_reverse_camera" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:includeFontPadding="false"
+            android:paddingTop="3dp"
+            android:text="@string/beauty_str"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_11"
+            app:layout_constraintLeft_toLeftOf="@+id/iv_live_beauty"
+            app:layout_constraintRight_toRightOf="@+id/iv_live_beauty"
+            app:layout_constraintTop_toBottomOf="@+id/iv_live_beauty" />
+
+        <ImageView
+            android:id="@+id/iv_live_share"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/icon_live_share"
+            app:layout_constraintLeft_toRightOf="@+id/iv_live_beauty"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/iv_reverse_camera" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:includeFontPadding="false"
+            android:paddingTop="3dp"
+            android:text="@string/share_str"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_11"
+            app:layout_constraintLeft_toLeftOf="@+id/iv_live_share"
+            app:layout_constraintRight_toRightOf="@+id/iv_live_share"
+            app:layout_constraintTop_toBottomOf="@+id/iv_live_share" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</FrameLayout>

+ 6 - 0
teacher/src/main/res/values/strings.xml

@@ -22,4 +22,10 @@
     <string name="self_introduction_str">个人介绍</string>
     <string name="go_cert_music_person_tip">您还没有完成音乐人认证,认证后\n才可上传乐谱哦~</string>
     <string name="go_cert">去认证</string>
+    <string name="close_str">关闭</string>
+    <string name="reverse_camera_str">翻转</string>
+    <string name="beauty_str">美化</string>
+    <string name="share_str">分享</string>
+    <string name="live_msg_text_nickname">%1$s:</string>
+    <string name="live_room_add_like_count_text_str">给主讲人点了%1$d个赞</string>
 </resources>