瀏覽代碼

修改网络教室流程逻辑

Pq 1 年之前
父節點
當前提交
275157786e
共有 43 個文件被更改,包括 1405 次插入135 次删除
  1. 65 0
      classRoom/src/main/java/com/dayayuemeng/classroom/adapter/CoursewareAdapter.java
  2. 10 0
      classRoom/src/main/java/com/dayayuemeng/classroom/api/CoursewareDataResultCallBack.java
  3. 8 2
      classRoom/src/main/java/com/dayayuemeng/classroom/api/LiveTeachingApi.java
  4. 19 0
      classRoom/src/main/java/com/dayayuemeng/classroom/bean/ClassMember.java
  5. 52 0
      classRoom/src/main/java/com/dayayuemeng/classroom/bean/CoursewareListBean.java
  6. 6 6
      classRoom/src/main/java/com/dayayuemeng/classroom/bean/WhiteCreateBean.java
  7. 1 0
      classRoom/src/main/java/com/dayayuemeng/classroom/listener/OnWhiteBoardListener.java
  8. 31 25
      classRoom/src/main/java/com/dayayuemeng/classroom/presenter/StudentNetClassRoomPresenter.java
  9. 32 26
      classRoom/src/main/java/com/dayayuemeng/classroom/presenter/TeacherNetClassRoomPresenter.java
  10. 117 21
      classRoom/src/main/java/com/dayayuemeng/classroom/repository/ClassRepository.java
  11. 3 0
      classRoom/src/main/java/com/dayayuemeng/classroom/repository/UserRepository.java
  12. 2 1
      classRoom/src/main/java/com/dayayuemeng/classroom/ui/StudentNetClassRoomActivity.java
  13. 29 6
      classRoom/src/main/java/com/dayayuemeng/classroom/ui/TeacherNetClassRoomActivity.java
  14. 124 29
      classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/NewAccompanimentListFragment.java
  15. 95 10
      classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/NewCustomWhiteBoardFragment.java
  16. 4 3
      classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/NewTeachingToolsFragment.java
  17. 2 0
      classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/VideoFragment.java
  18. 9 1
      classRoom/src/main/java/com/dayayuemeng/classroom/viewmodel/ClassViewModel.java
  19. 47 0
      classRoom/src/main/java/com/dayayuemeng/classroom/widget/CoursewareLoadMoreView.java
  20. 204 0
      classRoom/src/main/java/com/dayayuemeng/classroom/widget/dialog/CourseWareSelectDialog.java
  21. 121 0
      classRoom/src/main/java/com/dayayuemeng/classroom/widget/dialog/CoursewarePreviewDialog.java
  22. 二進制
      classRoom/src/main/res/drawable-xhdpi/icon_course_ware_search.png
  23. 二進制
      classRoom/src/main/res/drawable-xhdpi/icon_courseware_normal.png
  24. 二進制
      classRoom/src/main/res/drawable-xhdpi/icon_courseware_select.png
  25. 二進制
      classRoom/src/main/res/drawable-xxhdpi/icon_course_ware_search.png
  26. 二進制
      classRoom/src/main/res/drawable-xxhdpi/icon_courseware_normal.png
  27. 二進制
      classRoom/src/main/res/drawable-xxhdpi/icon_courseware_select.png
  28. 5 0
      classRoom/src/main/res/drawable/shape_35343e_18dp.xml
  29. 7 0
      classRoom/src/main/res/drawable/shape_35343e_18dp_bottom.xml
  30. 5 0
      classRoom/src/main/res/drawable/shape_514f5f_10dp.xml
  31. 5 0
      classRoom/src/main/res/drawable/shape_514f5f_18dp.xml
  32. 6 0
      classRoom/src/main/res/drawable/shape_514f5f_top_10dp.xml
  33. 5 0
      classRoom/src/main/res/drawable/shape_656376_4dp.xml
  34. 7 0
      classRoom/src/main/res/drawable/shape_border_white_1dp_radius_4dp.xml
  35. 7 0
      classRoom/src/main/res/drawable/shape_white_18dp_bottom.xml
  36. 2 3
      classRoom/src/main/res/layout/ac_net_class_room_teacher_layout.xml
  37. 162 0
      classRoom/src/main/res/layout/dialog_course_ware_layout.xml
  38. 73 0
      classRoom/src/main/res/layout/dialog_courseware_preview_layout.xml
  39. 1 1
      classRoom/src/main/res/layout/fg_teaching_tools.xml
  40. 10 0
      classRoom/src/main/res/layout/item_courseware_preview_layout.xml
  41. 43 0
      classRoom/src/main/res/layout/item_teaching_courseware_list_layout.xml
  42. 86 0
      classRoom/src/main/res/layout/view_courseware_load_more.xml
  43. 0 1
      tclive/src/main/java/com/daya/tclive/presenter/TCLivePresenter.java

+ 65 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/adapter/CoursewareAdapter.java

@@ -0,0 +1,65 @@
+package com.dayayuemeng.classroom.adapter;
+
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.dayayuemeng.classroom.R;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
+import com.dayayuemeng.classroom.widget.CoursewareLoadMoreView;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2022/11/16.
+ */
+public class CoursewareAdapter extends BaseQuickAdapter<CoursewareListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    private int currentSelectPos = -1;
+
+    public CoursewareAdapter() {
+        super(R.layout.item_teaching_courseware_list_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, CoursewareListBean.RowsBean rowsBean) {
+        //封面
+        ImageView iv_cover = holder.getView(R.id.iv_cover);
+        ImageView iv_select_status = holder.getView(R.id.iv_select_status);
+        GlideUtils.INSTANCE.loadImage(getContext(), rowsBean.titleImg, iv_cover, com.cooleshow.base.R.drawable.icon_music_mark);
+        //title
+        holder.setText(R.id.tv_title, rowsBean.musicSheetName);
+        //选中状态
+        if (holder.getLayoutPosition() == currentSelectPos) {
+            iv_select_status.setImageResource(R.drawable.icon_courseware_select);
+        } else {
+            iv_select_status.setImageResource(R.drawable.icon_courseware_normal);
+        }
+    }
+
+    public CoursewareListBean.RowsBean getSelectCourseware() {
+        if (currentSelectPos != -1) {
+            if (currentSelectPos < getData().size()) {
+                CoursewareListBean.RowsBean rowsBean = getData().get(currentSelectPos);
+                return rowsBean;
+            }
+        }
+        return null;
+    }
+
+    public void setCurrentSelectPos(int pos) {
+        this.currentSelectPos = pos;
+        notifyDataSetChanged();
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        BaseLoadMoreModule baseLoadMoreModule = new BaseLoadMoreModule(baseQuickAdapter);
+        baseLoadMoreModule.setLoadMoreView(new CoursewareLoadMoreView());
+        return baseLoadMoreModule;
+    }
+}

+ 10 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/api/CoursewareDataResultCallBack.java

@@ -0,0 +1,10 @@
+package com.dayayuemeng.classroom.api;
+
+/**
+ * Author by pq, Date on 2022/11/16.
+ */
+public interface CoursewareDataResultCallBack<T> {
+    void onSuccess(T data, int page);
+
+    void onError(int page);
+}

+ 8 - 2
classRoom/src/main/java/com/dayayuemeng/classroom/api/LiveTeachingApi.java

@@ -1,11 +1,14 @@
 package com.dayayuemeng.classroom.api;
 
 
+import com.cooleshow.base.data.net.BaseResponse;
 import com.dayayuemeng.classroom.bean.ClassMember;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
 import com.dayayuemeng.classroom.bean.LoginResult;
 
 import java.util.List;
 
+import io.reactivex.rxjava3.core.Observable;
 import okhttp3.MultipartBody;
 import okhttp3.RequestBody;
 import okhttp3.ResponseBody;
@@ -59,8 +62,8 @@ public interface LiveTeachingApi {
      * @param roomId
      * @return
      */
-    @GET(LiveTeachingUrls.INFO)
-    Call<Result<LoginResult>> info(@Query("roomId") String roomId);
+    @POST(LiveTeachingUrls.INFO)
+    Call<Result<LoginResult>> info(@Body RequestBody body);
 
     /**
      * 退出房间
@@ -260,4 +263,7 @@ public interface LiveTeachingApi {
     @GET
     @Headers({"User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)"})
     Call<ResponseBody> downloadFileWithFixedUrl(@Url String url);
+
+    @POST("api-teacher/courseCourseware/page")
+    Observable<BaseResponse<CoursewareListBean>> getCoursewareList(@Body RequestBody requestBody);
 }

+ 19 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/bean/ClassMember.java

@@ -319,4 +319,23 @@ public class ClassMember implements Serializable {
             this.mp3Url = mp3Url;
         }
     }
+
+    @Override
+    public String toString() {
+        return "ClassMember{" +
+                "camera=" + camera +
+                ", joinTime=" + joinTime +
+                ", microphone=" + microphone +
+                ", role=" + role +
+                ", userId='" + userId + '\'' +
+                ", headUrl='" + headUrl + '\'' +
+                ", userName='" + userName + '\'' +
+                ", musicMode=" + musicMode +
+                ", handUpOn=" + handUpOn +
+                ", isVisibiliyMic=" + isVisibiliyMic +
+                ", isOnStage=" + isOnStage +
+                ", playMidiJson=" + playMidiJson +
+                ", scheduleStudentMusicScores=" + scheduleStudentMusicScores +
+                '}';
+    }
 }

+ 52 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/bean/CoursewareListBean.java

@@ -0,0 +1,52 @@
+package com.dayayuemeng.classroom.bean;
+
+import java.util.ArrayList;
+
+/**
+ * Author by pq, Date on 2022/11/15.
+ */
+public class CoursewareListBean {
+    private ArrayList<RowsBean> rows;
+
+    public ArrayList<RowsBean> getRows() {
+        return rows;
+    }
+
+    public void setRows(ArrayList<RowsBean> rows) {
+        this.rows = rows;
+    }
+
+    public static final class RowsBean {
+        /**
+         * clientType :
+         * createTime :
+         * delFlag : true
+         * id : 0
+         * mp3url :
+         * musicImg :
+         * musicSheetId : 0
+         * musicSheetName :
+         * status :
+         * titleImg :
+         * updateTime :
+         * userId : 0
+         * username :
+         */
+
+        public String clientType;
+        public String createTime;
+        public boolean delFlag;
+        public int id;
+        public String mp3url;
+        public String musicImg;
+        public int musicSheetId;
+        public String musicSheetName;
+        public String status;
+        public String titleImg;
+        public String updateTime;
+        public int userId;
+        public String username;
+        public String url;
+        public String musicSheetAccompanimentId;
+    }
+}

+ 6 - 6
classRoom/src/main/java/com/dayayuemeng/classroom/bean/WhiteCreateBean.java

@@ -26,7 +26,7 @@ public class WhiteCreateBean {
 
     private int adminId;
     private int    courseScheduleId;
-    private long   createdAt;
+    private String   createdAt;
     private int    limit;
     private String mode;
     private String name;
@@ -34,7 +34,7 @@ public class WhiteCreateBean {
     private String roomToken;
     private int    teamId;
     private String template;
-    private long   updatedAt;
+    private String   updatedAt;
     private String uuid;
     private String randomNumeric20;
     private String randomNumeric22;
@@ -59,11 +59,11 @@ public class WhiteCreateBean {
         this.courseScheduleId = courseScheduleId;
     }
 
-    public long getCreatedAt() {
+    public String getCreatedAt() {
         return createdAt;
     }
 
-    public void setCreatedAt(long createdAt) {
+    public void setCreatedAt(String createdAt) {
         this.createdAt = createdAt;
     }
 
@@ -123,11 +123,11 @@ public class WhiteCreateBean {
         this.template = template;
     }
 
-    public long getUpdatedAt() {
+    public String getUpdatedAt() {
         return updatedAt;
     }
 
-    public void setUpdatedAt(long updatedAt) {
+    public void setUpdatedAt(String updatedAt) {
         this.updatedAt = updatedAt;
     }
 

+ 1 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/listener/OnWhiteBoardListener.java

@@ -18,4 +18,5 @@ public interface OnWhiteBoardListener {
      * 白板列表
      */
     void onWhiteBoardList(List<WhiteBoard> reverseList);
+
 }

+ 31 - 25
classRoom/src/main/java/com/dayayuemeng/classroom/presenter/StudentNetClassRoomPresenter.java

@@ -122,13 +122,14 @@ public class StudentNetClassRoomPresenter extends BasePresenter<StudentNetClassR
         }
     };
 
-    public void initPublishConfig(Context context, int imSdkAppId) {
+    public void initPublishConfig(Context context, int imSdkAppId,String roomId) {
         //初始化直播SDK
         TRTCSdkManager.getInstance().init(context, mCloudListener);
         //开启音量大小提示,SDK 会在 TRTCCloudListener 中的 onUserVoiceVolume 回调中反馈本地或远端用户的音频音量评估信息,包括音量大小、人声检测、音频频谱等。
         TRTCSdkManager.getInstance().enableAudioVolumeEvaluation();
         //初始化IM
         TCIMSdkManager.getInstance().init(context.getApplicationContext(), imSdkAppId);
+        registerListener(roomId);
     }
 
     public void initDefaultBitmap(Bitmap bitmap) {
@@ -142,32 +143,37 @@ public class StudentNetClassRoomPresenter extends BasePresenter<StudentNetClassR
 
     public void connectIM(String roomId, String userId, String userSig) {
         int loginStatus = V2TIMManager.getInstance().getLoginStatus();
-        if (loginStatus != V2TIM_STATUS_LOGINED && loginStatus != V2TIM_STATUS_LOGINING) {
-            //既不是已登录和登录中状态,则登录
-            this.cRoomId = roomId;
-            getView().showLoading();
-            V2TIMManager.getInstance().login(userId, userSig, new V2TIMCallback() {
-                @Override
-                public void onSuccess() {
-                    Log.i("TTLiveRoomActivity", "login IM success");
-                    if (getView() != null) {
-                        getView().loginIMSuccess();
-                    }
-                    registerListener(roomId);
-                }
+        if (loginStatus == V2TIM_STATUS_LOGINED) {
+            handleLoginSuccessEvent();
+            return;
+        }
+        //既不是已登录和登录中状态,则登录
+        LOG.i("connectIM roomId:" + roomId);
+        getView().showLoading();
+        V2TIMManager.getInstance().login(userId, userSig, new V2TIMCallback() {
+            @Override
+            public void onSuccess() {
+                Log.i("TTLiveRoomActivity", "login IM success");
+                handleLoginSuccessEvent();
+            }
 
-                @Override
-                public void onError(int code, String desc) {
-                    // 如果返回以下错误码,表示使用 UserSig 已过期,请您使用新签发的 UserSig 进行再次登录。
-                    // 1. ERR_USER_SIG_EXPIRED(6206)
-                    // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)
-                    // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。
-                    Log.i("TTLiveRoomActivity", "connectIM failure, code:" + code + ", desc:" + desc);
-                    if (getView() != null) {
-                        getView().connectIMError(code, desc);
-                    }
+            @Override
+            public void onError(int code, String desc) {
+                // 如果返回以下错误码,表示使用 UserSig 已过期,请您使用新签发的 UserSig 进行再次登录。
+                // 1. ERR_USER_SIG_EXPIRED(6206)
+                // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)
+                // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。
+                Log.i("TTLiveRoomActivity", "connectIM failure, code:" + code + ", desc:" + desc);
+                if (getView() != null) {
+                    getView().connectIMError(code, desc);
                 }
-            });
+            }
+        });
+    }
+
+    private void handleLoginSuccessEvent() {
+        if (getView() != null) {
+            getView().loginIMSuccess();
         }
     }
 

+ 32 - 26
classRoom/src/main/java/com/dayayuemeng/classroom/presenter/TeacherNetClassRoomPresenter.java

@@ -6,6 +6,7 @@ import android.text.TextUtils;
 import android.util.Log;
 
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.utils.LOG;
 import com.daya.tclive.bean.TTMessage;
 import com.daya.tclive.callback.ResultCallback;
 import com.daya.tclive.constants.MessageConstants;
@@ -113,13 +114,14 @@ public class TeacherNetClassRoomPresenter extends BasePresenter<TeacherNetClassR
         }
     };
 
-    public void initPublishConfig(Context context, int imSdkAppId) {
+    public void initPublishConfig(Context context, int imSdkAppId,String roomId) {
         //初始化直播SDK
         TRTCSdkManager.getInstance().init(context, mCloudListener);
         //开启音量大小提示,SDK 会在 TRTCCloudListener 中的 onUserVoiceVolume 回调中反馈本地或远端用户的音频音量评估信息,包括音量大小、人声检测、音频频谱等。
         TRTCSdkManager.getInstance().enableAudioVolumeEvaluation();
         //初始化IM
         TCIMSdkManager.getInstance().init(context.getApplicationContext(), imSdkAppId);
+        registerListener(roomId);
     }
 
     public void initDefaultBitmap(Bitmap bitmap) {
@@ -156,35 +158,39 @@ public class TeacherNetClassRoomPresenter extends BasePresenter<TeacherNetClassR
         }
     }
 
+    private void handleLoginSuccessEvent() {
+        if (getView() != null) {
+            getView().loginIMSuccess();
+        }
+    }
     public void connectIM(String roomId, String userId, String userSig) {
         int loginStatus = V2TIMManager.getInstance().getLoginStatus();
-        if (loginStatus != V2TIM_STATUS_LOGINED && loginStatus != V2TIM_STATUS_LOGINING) {
-            //既不是已登录和登录中状态,则登录
-            this.cRoomId = roomId;
-            getView().showLoading();
-            V2TIMManager.getInstance().login(userId, userSig, new V2TIMCallback() {
-                @Override
-                public void onSuccess() {
-                    Log.i("TTLiveRoomActivity", "login IM success");
-                    if (getView() != null) {
-                        getView().loginIMSuccess();
-                    }
-                    registerListener(roomId);
-                }
+        if (loginStatus == V2TIM_STATUS_LOGINED) {
+            handleLoginSuccessEvent();
+            return;
+        }
+        //既不是已登录和登录中状态,则登录
+        LOG.i("connectIM roomId:" + roomId);
+        getView().showLoading();
+        V2TIMManager.getInstance().login(userId, userSig, new V2TIMCallback() {
+            @Override
+            public void onSuccess() {
+                Log.i("TTLiveRoomActivity", "login IM success");
+                handleLoginSuccessEvent();
+            }
 
-                @Override
-                public void onError(int code, String desc) {
-                    // 如果返回以下错误码,表示使用 UserSig 已过期,请您使用新签发的 UserSig 进行再次登录。
-                    // 1. ERR_USER_SIG_EXPIRED(6206)
-                    // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)
-                    // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。
-                    Log.i("TTLiveRoomActivity", "connectIM failure, code:" + code + ", desc:" + desc);
-                    if (getView() != null) {
-                        getView().connectIMError(code, desc);
-                    }
+            @Override
+            public void onError(int code, String desc) {
+                // 如果返回以下错误码,表示使用 UserSig 已过期,请您使用新签发的 UserSig 进行再次登录。
+                // 1. ERR_USER_SIG_EXPIRED(6206)
+                // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)
+                // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。
+                Log.i("TTLiveRoomActivity", "connectIM failure, code:" + code + ", desc:" + desc);
+                if (getView() != null) {
+                    getView().connectIMError(code, desc);
                 }
-            });
-        }
+            }
+        });
     }
 
     private void registerListener(String roomId) {

+ 117 - 21
classRoom/src/main/java/com/dayayuemeng/classroom/repository/ClassRepository.java

@@ -2,15 +2,18 @@ package com.dayayuemeng.classroom.repository;
 
 import android.content.Context;
 import android.text.TextUtils;
+import android.util.Log;
 
 
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.data.net.RetrofitClientNoToken;
 import com.cooleshow.base.data.net.RetrofitFactory;
 import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.ClientHelper;
 import com.cooleshow.base.utils.DeviceUtil;
 import com.cooleshow.base.utils.DeviceUtils;
 import com.cooleshow.base.utils.FileUtils;
+import com.dayayuemeng.classroom.api.CoursewareDataResultCallBack;
 import com.dayayuemeng.classroom.api.LiveTeachingApi;
 import com.dayayuemeng.classroom.api.ResultCallback;
 import com.dayayuemeng.classroom.api.WhiteBoardApi;
@@ -18,8 +21,10 @@ import com.dayayuemeng.classroom.api.retrofit.CallBackWrapper;
 import com.dayayuemeng.classroom.api.retrofit.RetrofitClient;
 import com.dayayuemeng.classroom.api.retrofit.RetrofitUtil;
 import com.dayayuemeng.classroom.bean.ClassMember;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
 import com.dayayuemeng.classroom.bean.LoginResult;
 import com.dayayuemeng.classroom.bean.WhiteCreateBean;
+import com.dayayuemeng.classroom.utils.ClientUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -62,10 +67,17 @@ public class ClassRepository extends BaseRepository {
     private LiveTeachingApi sealClassService;
     private LiveTeachingApi liveClassNoToken;
     private WhiteBoardApi whiteBoardService;
+    public static final String PARAM_CAMERA_TYPE = "CAMERA";
+    public static final String PARAM_MICROPHONE_TYPE = "MICROPHONE";
+    public static final String PARAM_MUSIC_MODE_TYPE = "MUSIC_MODE";
+    public static final String PARAM_HAND_UP_TYPE = "HAND_UP";
+    public static final String PARAM_EXAM_SONG_TYPE = "EXAM_SONG";
+    public static final String PARAM_MUSIC_SHEET_TYPE = "MUSIC_SHEET";
+    public static final String PARAM_ACCOMPANIMENT_TYPE = "ACCOMPANIMENT";
 
     public ClassRepository(Context context) {
         super(context);
-        sealClassService = getService(LiveTeachingApi.class);
+        sealClassService = RetrofitFactory.Companion.getInstance().create(LiveTeachingApi.class);
         liveClassNoToken = RetrofitClientNoToken.getInstance().getRetrofit().create(LiveTeachingApi.class);
         whiteBoardService = RetrofitFactory.Companion.getInstance().create(WhiteBoardApi.class);
     }
@@ -96,7 +108,8 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(PARAM_CAMERA_ON, cameraOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_CAMERA_TYPE);
+        bodyMap.put("enable", cameraOn);
         sealClassService.deviceControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -104,9 +117,9 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(PARAM_CAMERA_ON, cameraOn);
-        bodyMap.put(PARAM_DEVICE_TYPE, deviceType);
         bodyMap.put(PARAM_SOUND_VOLUME, soundVolume);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MICROPHONE_TYPE);
+        bodyMap.put("enable", cameraOn);
         sealClassService.deviceControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -130,7 +143,8 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(PARAM_MIC_ON, microphone);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MICROPHONE_TYPE);
+        bodyMap.put("enable", microphone);
         sealClassService.deviceControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -138,7 +152,8 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(HAND_UP_ON, handUpOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_HAND_UP_TYPE);
+        bodyMap.put("enable", handUpOn);
         sealClassService.deviceControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -146,7 +161,8 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(MUSIC_MODE_ON, musicModeOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_MODE_TYPE);
+        bodyMap.put("enable", musicModeOn);
         sealClassService.deviceControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
 
     }
@@ -154,15 +170,17 @@ public class ClassRepository extends BaseRepository {
     public void batchControlCamera(String roomId, boolean cameraOn, ResultCallback<Boolean> callBack) {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
-        bodyMap.put(PARAM_CAMERA_ON, cameraOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_CAMERA_TYPE);
+        bodyMap.put("enable", cameraOn);
         sealClassService.deviceBatchControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
 
-    public void batchControlMusicMode(String roomId, boolean microphone, ResultCallback<Boolean> callBack) {
+    public void batchControlMusicMode(String roomId, boolean musicMode, ResultCallback<Boolean> callBack) {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
-        bodyMap.put(MUSIC_MODE_ON, microphone);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_MODE_TYPE);
+        bodyMap.put("enable", musicMode);
         sealClassService.deviceBatchControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -170,7 +188,8 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(PARAM_MIC_ON, musicModeOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MICROPHONE_TYPE);
+        bodyMap.put("enable", musicModeOn);
         sealClassService.deviceBatchControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -178,7 +197,8 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(PARAM_MIC_ON, musicModeOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MICROPHONE_TYPE);
+        bodyMap.put("enable", musicModeOn);
         bodyMap.put(CANCEL_MUTE_FLAG, cancelFlag);
         sealClassService.deviceBatchControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
@@ -193,12 +213,24 @@ public class ClassRepository extends BaseRepository {
     //伴奏
     public void batchControlExamSong(String roomId, String userId, String musicScoreOn, String accompanimentOn, String musicScoreAccompanimentId, String soudnValue, ResultCallback<Boolean> callBack) {
         HashMap<String, Object> bodyMap = new HashMap<>();
+
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(MUSIC_SCORE_ON, musicScoreOn);
-        bodyMap.put(ACCOMPANIMENT_ON, accompanimentOn);
         bodyMap.put(EXAM_SONG_ID, musicScoreAccompanimentId);
         bodyMap.put(PARAM_SOUND_VOLUME, soudnValue);
+        if (TextUtils.equals("true", musicScoreOn)) {
+            bodyMap.put("enable", true);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_SHEET_TYPE);
+        } else if (TextUtils.equals("false", musicScoreOn)) {
+            bodyMap.put("enable", false);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_SHEET_TYPE);
+        } else if (TextUtils.equals("true", accompanimentOn)) {
+            bodyMap.put("enable", true);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_ACCOMPANIMENT_TYPE);
+        } else if (TextUtils.equals("false", accompanimentOn)) {
+            bodyMap.put("enable", false);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_ACCOMPANIMENT_TYPE);
+        }
         sealClassService.deviceBatchControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
 
     }
@@ -207,9 +239,21 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_USER_ID, userId);
-        bodyMap.put(MUSIC_SCORE_ON, musicScoreOn);
-        bodyMap.put(ACCOMPANIMENT_ON, accompanimentOn);
         bodyMap.put(EXAM_SONG_ID, musicScoreAccompanimentId);
+
+        if (TextUtils.equals("true", musicScoreOn)) {
+            bodyMap.put("enable", true);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_SHEET_TYPE);
+        } else if (TextUtils.equals("false", musicScoreOn)) {
+            bodyMap.put("enable", false);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_SHEET_TYPE);
+        } else if (TextUtils.equals("true", accompanimentOn)) {
+            bodyMap.put("enable", true);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_ACCOMPANIMENT_TYPE);
+        } else if (TextUtils.equals("false", accompanimentOn)) {
+            bodyMap.put("enable", false);
+            bodyMap.put(PARAM_DEVICE_TYPE, PARAM_ACCOMPANIMENT_TYPE);
+        }
         sealClassService.deviceControl(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -230,8 +274,10 @@ public class ClassRepository extends BaseRepository {
     public void deviceSyncHandUpOn(String roomId, String userId, boolean handUpOn, ResultCallback<Boolean> callBack) {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
-        bodyMap.put(HAND_UP_ON, handUpOn);
         bodyMap.put(PARAM_USER_ID, userId);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_HAND_UP_TYPE);
+        bodyMap.put("enable", handUpOn);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.deviceSync(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -239,6 +285,9 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(MUSIC_MODE_ON, musicModeOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_MODE_TYPE);
+        bodyMap.put("enable", musicModeOn);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.deviceSync(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -246,20 +295,27 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(PARAM_CAMERA_ON, cameraOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_CAMERA_TYPE);
+        bodyMap.put("enable", cameraOn);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.deviceSync(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
     public void deviceSyncMic(String roomId, boolean microphoneOn, ResultCallback<Boolean> callBack) {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
-        bodyMap.put(PARAM_MIC_ON, microphoneOn);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MICROPHONE_TYPE);
+        bodyMap.put("enable", microphoneOn);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.deviceSync(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
     public void deviceSyncExamSong(String roomId, boolean examSong, ResultCallback<Boolean> callBack) {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
-        bodyMap.put(MUSIC_SCORE_ON, examSong);
+        bodyMap.put(PARAM_DEVICE_TYPE, PARAM_MUSIC_SHEET_TYPE);
+        bodyMap.put("enable", examSong);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.deviceSync(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<Boolean>(callBack));
     }
 
@@ -338,6 +394,12 @@ public class ClassRepository extends BaseRepository {
                     protected void onSuccess(WhiteCreateBean data) {
                         callBack.onSuccess(data);
                     }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        super.onError(e);
+                        e.printStackTrace();
+                    }
                 });
     }
 
@@ -351,6 +413,7 @@ public class ClassRepository extends BaseRepository {
         HashMap<String, Object> bodyMap = new HashMap<>();
         bodyMap.put(PARAM_ROOM_ID, roomId);
         bodyMap.put(EXAM_SONG_ID, musicScoreAccompanimentId);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.pushDownloadexamSongMsg(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<>(callBack));
     }
 
@@ -415,7 +478,7 @@ public class ClassRepository extends BaseRepository {
      * 切换共享画布区显示内容
      *
      * @param roomId   房间Id
-     * @param type     显示类型,参考{@link ScreenDisplay.Display}
+     * @param type     显示类型,参考{@link com.dayayuemeng.classroom.model.ScreenDisplay.Display}
      * @param userId   当显示类型为用户时,传入该用户的id
      * @param uri      当显示类型为白板时,传入白板id
      * @param callback
@@ -430,10 +493,43 @@ public class ClassRepository extends BaseRepository {
         if (uri != null) {
             bodyMap.put(PARAM_URI, uri);
         }
+        bodyMap.put("clientType",  ClientUtils.getClientType());
         sealClassService.switchDisplay(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<>(callback));
     }
 
     public void getRoomInfo(String roomId, ResultCallback<LoginResult> callBack) {
-        sealClassService.info(roomId).enqueue(new CallBackWrapper<LoginResult>(callBack));
+        HashMap<String, Object> bodyMap = new HashMap<>();
+        bodyMap.put(PARAM_ROOM_ID, roomId);
+        bodyMap.put("clientType",  ClientUtils.getClientType());
+        sealClassService.info(RetrofitUtil.createJsonRequest(bodyMap)).enqueue(new CallBackWrapper<LoginResult>(callBack));
+    }
+    public void getCoursewareList(String searchStr, int page, CoursewareDataResultCallBack<CoursewareListBean> callBack) {
+        HashMap<String, Object> bodyMap = new HashMap<>();
+        bodyMap.put("idAndName", searchStr);
+        bodyMap.put("page", page);
+        bodyMap.put("rows", Constants.DEFAULT_DATA_SIZE);
+        bodyMap.put("status", 1);//是否有效, 0:失效 1:有效
+        sealClassService.getCoursewareList(RetrofitUtil.createJsonRequest(bodyMap))
+                .subscribeOn(Schedulers.newThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(new BaseObserver<CoursewareListBean>() {
+                    @Override
+                    protected void onSuccess(CoursewareListBean data) {
+                        Log.i("pq", "data:" + data.toString());
+                        if (callBack != null) {
+                            callBack.onSuccess(data, page);
+                        }
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        super.onError(e);
+                        e.printStackTrace();
+                        if (callBack != null) {
+                            callBack.onError(page);
+                        }
+                    }
+                });
     }
+
 }

+ 3 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/repository/UserRepository.java

@@ -90,6 +90,9 @@ public class UserRepository extends BaseRepository {
                             for (ClassMember member : members) {
                                 if (member.getRole() != Role.LECTURER) {
                                     List<ClassMember.ScheduleStudentMusicScoresBean> memberMusicScoresBeans = member.getScheduleStudentMusicScores();
+                                    if(memberMusicScoresBeans == null){
+                                        continue;
+                                    }
                                     for (ClassMember.ScheduleStudentMusicScoresBean memberScoresBean : memberMusicScoresBeans) {
                                         if (memberScoresBean != null &&
                                                 scoresBean.getMusicScoreAccompanimentId().equals(memberScoresBean.getMusicScoreAccompanimentId()) && memberScoresBean.getDownStatus() != 1) {

+ 2 - 1
classRoom/src/main/java/com/dayayuemeng/classroom/ui/StudentNetClassRoomActivity.java

@@ -269,7 +269,7 @@ public class StudentNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomS
         Log.i("pq", "initPublishConfig");
         if (loginResult != null) {
             LoginResult.RoomConfig rtcRoomConfig = loginResult.getRtcRoomConfig();
-            presenter.initPublishConfig(this, Integer.parseInt(rtcRoomConfig.getAppKey()));
+            presenter.initPublishConfig(this, Integer.parseInt(rtcRoomConfig.getAppKey()),getRoomId());
             setCameraPlaceholder();
             //加入房间
             if (!TextUtils.isEmpty(rtcRoomConfig.getUserSig())) {
@@ -696,6 +696,7 @@ public class StudentNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomS
         Log.i(TAG, "handleVideoData:" + loginResult);
         if (loginResult != null) {
             ScreenDisplay screenDisplay = ScreenDisplay.createScreenDisplay(loginResult.getDisplay());
+            Log.i(TAG, "screenDisplay:" + screenDisplay.toString());
             if (screenDisplay != null && !TextUtils.isEmpty(screenDisplay.getUserId())) {
                 if (screenDisplay.getType() == ScreenDisplay.Display.WHITEBOARD) {
                     switchWhiteBorardOrVideo(NewTeachingToolsFragment.Operate.SHARE_WHITE_BOARD);

+ 29 - 6
classRoom/src/main/java/com/dayayuemeng/classroom/ui/TeacherNetClassRoomActivity.java

@@ -43,7 +43,9 @@ import com.daya.tclive.manager.TCIMSdkManager;
 import com.daya.tclive.manager.TRTCSdkManager;
 import com.dayayuemeng.classroom.R;
 import com.dayayuemeng.classroom.adapter.WhiteBoardListAdapter;
+import com.dayayuemeng.classroom.api.CoursewareDataResultCallBack;
 import com.dayayuemeng.classroom.bean.ClassMember;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
 import com.dayayuemeng.classroom.bean.LoginResult;
 import com.dayayuemeng.classroom.bean.UserInfo;
 import com.dayayuemeng.classroom.bean.WhiteBoard;
@@ -78,6 +80,8 @@ import com.dayayuemeng.classroom.viewmodel.ClassViewModel;
 import com.dayayuemeng.classroom.widget.BarrageChatView;
 import com.dayayuemeng.classroom.widget.CameraPlaceholderView;
 import com.dayayuemeng.classroom.widget.ComplaintDialogFragmentV2;
+import com.dayayuemeng.classroom.widget.dialog.CourseWareSelectDialog;
+import com.dayayuemeng.classroom.widget.dialog.CoursewarePreviewDialog;
 import com.gyf.immersionbar.ImmersionBar;
 import com.tbruyelle.rxpermissions3.RxPermissions;
 import com.tencent.imsdk.v2.V2TIMSDKListener;
@@ -101,7 +105,7 @@ import io.reactivex.rxjava3.disposables.Disposable;
  * Author by pq, Date on 2023/4/20.
  */
 @Route(path = ARouterSealClass.ACTIVITY_CLASS_ROOM)
-public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomTeacherLayoutBinding,TeacherNetClassRoomPresenter> implements TeacherNetClassRoomContract.View, NewTeachingToolsFragment.OperateControlListener, NewTopOperateControlFragment.TopOperateControlListener, View.OnClickListener {
+public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomTeacherLayoutBinding, TeacherNetClassRoomPresenter> implements TeacherNetClassRoomContract.View, NewTeachingToolsFragment.OperateControlListener, NewTopOperateControlFragment.TopOperateControlListener, View.OnClickListener {
     public static final String TAG = "classRoom";
     public static final String TEACHING_TOOLS_FRAGMENT_TAG = "teachingToolsFragment";
     public static final String TEACHING_ACCOMPANIMENT_FRAGMENT_TAG = "accompanimentListFragment";
@@ -201,6 +205,7 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
     private NewGoneGeFragment mNewGoneGeFragment;
     private VideoListFragment mVideoListFragment;
     private boolean isOnResume = false;
+    private CourseWareSelectDialog mCourseWareSelectDialog;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -230,7 +235,7 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
         initViews();
     }
 
-    private void initViews(){
+    private void initViews() {
         mainScreenFragment = viewBinding.shareScreenFragment;
         videoListContainer = viewBinding.videoListContainer;
         topOperateControlFragmentViewLayout = viewBinding.topOperateControlFragment;
@@ -282,7 +287,7 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
         Log.i("pq", "initPublishConfig");
         if (loginResult != null) {
             LoginResult.RoomConfig rtcRoomConfig = loginResult.getRtcRoomConfig();
-            presenter.initPublishConfig(this, Integer.parseInt(rtcRoomConfig.getAppKey()));
+            presenter.initPublishConfig(this, Integer.parseInt(rtcRoomConfig.getAppKey()), getRoomId());
             setCameraPlaceholder();
             //加入房间
             if (!TextUtils.isEmpty(rtcRoomConfig.getUserSig())) {
@@ -372,7 +377,7 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
 
     private void showTeachingToosFragment() {
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
-        transaction.setCustomAnimations(R.anim.slid_bottom_in, R.anim.slid_top_out, R.anim.slid_right_in,R.anim.slid_right_out);
+        transaction.setCustomAnimations(R.anim.slid_bottom_in, R.anim.slid_top_out, R.anim.slid_right_in, R.anim.slid_right_out);
         teachingToolsFragment = (NewTeachingToolsFragment) getSupportFragmentManager().findFragmentByTag(TEACHING_TOOLS_FRAGMENT_TAG);
         if (teachingToolsFragment == null) {
             teachingToolsFragment = new NewTeachingToolsFragment();
@@ -407,7 +412,7 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
     private void initToastAnim() {
         // 自定义 toast 的显示和消失动画
         toastShowAnim = AnimationUtils.loadAnimation(this, R.anim.alpha_show);
-        toastDismissAnim = AnimationUtils.loadAnimation(this,R.anim.alpha_dismiss);
+        toastDismissAnim = AnimationUtils.loadAnimation(this, R.anim.alpha_dismiss);
         toastDismissAnim.setAnimationListener(new Animation.AnimationListener() {
             @Override
             public void onAnimationStart(Animation animation) {
@@ -788,7 +793,7 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
         if (loginResult != null) {
             ScreenDisplay screenDisplay = ScreenDisplay.createScreenDisplay(loginResult.getDisplay());
             String videoId = screenDisplay != null ? screenDisplay.getUserId() : "";
-            Log.i(TAG, "主屏id:" +videoId );
+            Log.i(TAG, "主屏id:" + videoId);
             if (screenDisplay != null) {
                 classViewModel.switchDisplay(getRoomId(), screenDisplay.getType(), screenDisplay.getUserId(), false);
             } else {
@@ -1051,6 +1056,24 @@ public class TeacherNetClassRoomActivity extends BaseMVPActivity<AcNetClassRoomT
         }
     }
 
+    private void showCoursePreviewDialog(CoursewareListBean.RowsBean coursewareData) {
+        CoursewarePreviewDialog coursewarePreviewDialog = new CoursewarePreviewDialog(this);
+        coursewarePreviewDialog.setOnEventListener(new CoursewarePreviewDialog.OnEventListener() {
+            @Override
+            public void onSelectCourse(String courseUrl, String courseImageUrl, int imgWidth, int imgHeight) {
+                classViewModel.WhiteBoardInsertImage(courseImageUrl, imgWidth, imgHeight);
+                if (coursewarePreviewDialog != null) {
+                    coursewarePreviewDialog.dismiss();
+                }
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.dismiss();
+                }
+            }
+        });
+        coursewarePreviewDialog.show();
+        coursewarePreviewDialog.setCoursewareData(coursewareData);
+    }
+
     private void switchAnimation() {
         if (null != lvList && lvList.getVisibility() == View.VISIBLE) {
             lvList.setVisibility(View.GONE);

+ 124 - 29
classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/NewAccompanimentListFragment.java

@@ -26,14 +26,18 @@ import com.cooleshow.base.widgets.DialogUtil;
 import com.cooleshow.base.widgets.ViewHolder;
 import com.dayayuemeng.classroom.R;
 import com.dayayuemeng.classroom.adapter.AccompanimentListAdapterV2;
+import com.dayayuemeng.classroom.api.CoursewareDataResultCallBack;
 import com.dayayuemeng.classroom.api.ResultCallback;
 import com.dayayuemeng.classroom.bean.ClassMember;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
 import com.dayayuemeng.classroom.bean.UserInfo;
 import com.dayayuemeng.classroom.constants.ARouterSealClass;
 import com.dayayuemeng.classroom.databinding.AccompanimentListFragmentBinding;
 import com.dayayuemeng.classroom.model.VideoClassMemberData;
 import com.dayayuemeng.classroom.presenter.NewAccompanimentListPresenter;
 import com.dayayuemeng.classroom.viewmodel.ClassViewModel;
+import com.dayayuemeng.classroom.widget.dialog.CourseWareSelectDialog;
+import com.dayayuemeng.classroom.widget.dialog.CoursewarePreviewDialog;
 import com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar;
 import com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper;
 
@@ -52,7 +56,7 @@ import static android.app.Activity.RESULT_OK;
 /**
  * 伴奏播放控制界面
  */
-public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentListFragmentBinding,NewAccompanimentListPresenter> {
+public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentListFragmentBinding, NewAccompanimentListPresenter> {
 
     private final int QU_LIBRAY_REQUEST_CODE = 1000;
 
@@ -87,6 +91,7 @@ public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentL
     boolean isShowDownloadPopu = false;
     private String currentisACCOMType = "5";
     private String volumeSeekerBarProcess;
+    private CourseWareSelectDialog mCourseWareSelectDialog;
 
 
     public static NewAccompanimentListFragment newInstance() {
@@ -177,14 +182,7 @@ public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentL
                 ToastUtil.getInstance().show(getActivity(), "房间无学生,伴奏功能无法使用");
                 return;
             }
-            ivAdd.setEnabled(false);
-            Postcard postcard = ARouter.getInstance()
-                    .build(ARouterSealClass.ACTIVITY_ACCOMPANIMENT_LIST)
-                    .withBoolean("isSelect", true);
-            LogisticsCenter.completion(postcard);
-            Intent selectAccompanimentIntent = new Intent(getActivity(), postcard.getDestination());
-            selectAccompanimentIntent.putExtras(postcard.getExtras());
-            startActivityForResult(selectAccompanimentIntent, QU_LIBRAY_REQUEST_CODE);
+            showCourseWareDialog(false);
         });
 
         ivPlay.setOnClickListener(v -> {
@@ -219,7 +217,74 @@ public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentL
         });
     }
 
-    private void initViews(){
+    private void showCourseWareDialog(boolean isPreview) {
+        if (mCourseWareSelectDialog == null) {
+            mCourseWareSelectDialog = new CourseWareSelectDialog(getContext());
+            mCourseWareSelectDialog.setOnEventListener(new CourseWareSelectDialog.OnEventListener() {
+                @Override
+                public void onGetCoursewareData(String searchStr, int page) {
+                    getCoursewareList(searchStr, page);
+                }
+
+                @Override
+                public void onPlayCourseware(CoursewareListBean.RowsBean result) {
+                    if (result != null) {
+                        handleSelectMusic(result);
+                        mCourseWareSelectDialog.dismiss();
+                    }
+                }
+
+                @Override
+                public void showCoursewarePreviewDialog(CoursewareListBean.RowsBean rowsBean) {
+                    showCoursePreviewDialog(rowsBean);
+                }
+            });
+        }
+        if (!mCourseWareSelectDialog.isShowing()) {
+            mCourseWareSelectDialog.show();
+            mCourseWareSelectDialog.refresh();
+            mCourseWareSelectDialog.setShowImagePreview(isPreview);
+        }
+    }
+
+    private void showCoursePreviewDialog(CoursewareListBean.RowsBean coursewareData) {
+        CoursewarePreviewDialog coursewarePreviewDialog = new CoursewarePreviewDialog(getContext());
+        coursewarePreviewDialog.setOnEventListener(new CoursewarePreviewDialog.OnEventListener() {
+            @Override
+            public void onSelectCourse(String courseUrl, String courseImageUrl, int imgWidth, int imgHeight) {
+                classViewModel.WhiteBoardInsertImage(courseImageUrl, imgWidth, imgHeight);
+                if (coursewarePreviewDialog != null) {
+                    coursewarePreviewDialog.dismiss();
+                }
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.dismiss();
+                }
+            }
+        });
+        coursewarePreviewDialog.show();
+        coursewarePreviewDialog.setCoursewareData(coursewareData);
+    }
+
+    private void getCoursewareList(String searchStr, int page) {
+        classViewModel.getCoursewareList(searchStr, page, new CoursewareDataResultCallBack<CoursewareListBean>() {
+            @Override
+            public void onSuccess(CoursewareListBean data, int page) {
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.setData(data, page);
+                }
+            }
+
+            @Override
+            public void onError(int page) {
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.getDataError(page);
+                }
+            }
+        });
+    }
+
+
+    private void initViews() {
         tvTitle = mViewBinding.tvTitle;
         ivClose = mViewBinding.ivClose;
         ivAdd = mViewBinding.ivAdd;
@@ -246,7 +311,6 @@ public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentL
         ivAdd.setEnabled(true);
     }
 
-
     private void initSeekBar() {
         String userId = classViewModel.getUserInfo().getValue().getUserId();
         //音量按钮
@@ -313,27 +377,27 @@ public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentL
 
         });
 
-//        classViewModel.getExamSongDownloadClassMember().observe(this, new Observer<VideoClassMemberData>() {
-//
-//            @Override
-//            public void onChanged(VideoClassMemberData data) {
-//                if (data != null && data.getMember() != null) {
-//                    if (accompanimentDosnloadMembers == null) {
-//                        accompanimentDosnloadMembers = new ArrayList<>();
-//                    }
-//                    accompanimentDosnloadMembers.clear();
-//                    accompanimentDosnloadMembers.addAll(data.getMember());
+        classViewModel.getExamSongDownloadClassMember().observe(this, new Observer<VideoClassMemberData>() {
+
+            @Override
+            public void onChanged(VideoClassMemberData data) {
+                if (data != null && data.getMember() != null) {
+                    if (accompanimentDosnloadMembers == null) {
+                        accompanimentDosnloadMembers = new ArrayList<>();
+                    }
+                    accompanimentDosnloadMembers.clear();
+                    accompanimentDosnloadMembers.addAll(data.getMember());
 //                    if (accompanimentDownloadAdapter != null && !TextUtils.isEmpty(musicScoreAccompanimentDownloadId)) {
 //                        accompanimentDownloadAdapter.setData(data.getMember(), musicScoreAccompanimentDownloadId);
 //                    }
-////                    if (isShowDownloadPopu) {
-////                        isShowDownloadPopu = false;
-////                        showAccompanimentDialog(accompanimentDosnloadMembers, musicScoreAccompanimentDownloadId, false);
-////                    }
-//
-//                }
-//            }
-//        });
+//                    if (isShowDownloadPopu) {
+//                        isShowDownloadPopu = false;
+//                        showAccompanimentDialog(accompanimentDosnloadMembers, musicScoreAccompanimentDownloadId, false);
+//                    }
+
+                }
+            }
+        });
 
         classViewModel.getAccompanyStatus().observe(this, new Observer<Boolean>() {
             @Override
@@ -397,6 +461,37 @@ public class NewAccompanimentListFragment extends BaseMVPFragment<AccompanimentL
 
     }
 
+    private void handleSelectMusic(CoursewareListBean.RowsBean rowsBean) {
+        musicScoreAccompanimentDownloadId = String.valueOf(rowsBean.musicSheetAccompanimentId);
+
+        String url = rowsBean.url;
+        String mp3Url = rowsBean.mp3url;
+        fileName = rowsBean.musicSheetName;
+        String speed = "100";
+
+        if (TextUtils.isEmpty(musicScoreAccompanimentDownloadId) || (TextUtils.isEmpty(url) && TextUtils.isEmpty(mp3Url)) || TextUtils.isEmpty(fileName) || userInfo == null) {
+            ToastUtil.getInstance().show(getContext(), "伴奏信息异常,请重新选择");
+            return;
+        }
+
+        isShowDownloadPopu = false;
+        classViewModel.pushDownloadexamSongMsg(roomId, musicScoreAccompanimentDownloadId, url, mp3Url, fileName, speed, new ResultCallback<Boolean>() {
+            @Override
+            public void onSuccess(Boolean aBoolean) {
+
+            }
+
+            @Override
+            public void onFail(int errorCode, String errorStr) {
+                if (!TextUtils.isEmpty(errorStr)) {
+                    ToastUtil.getInstance().show(getContext(), errorStr);
+                } else {
+                    ToastUtil.getInstance().show(getContext(), "ERROR;错误码:" + errorCode);
+                }
+            }
+        });
+    }
+
     @Override
     public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         super.onActivityResult(requestCode, resultCode, data);

+ 95 - 10
classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/NewCustomWhiteBoardFragment.java

@@ -38,6 +38,8 @@ import com.cooleshow.base.utils.helper.GlideEngine;
 import com.cooleshow.base.widgets.DialogUtil;
 import com.cooleshow.usercenter.helper.UserHelper;
 import com.dayayuemeng.classroom.R;
+import com.dayayuemeng.classroom.api.CoursewareDataResultCallBack;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
 import com.dayayuemeng.classroom.bean.UserInfo;
 import com.dayayuemeng.classroom.bean.WhiteBoard;
 import com.dayayuemeng.classroom.bean.WhiteCreateBean;
@@ -50,6 +52,8 @@ import com.dayayuemeng.classroom.utils.FileUtils;
 import com.dayayuemeng.classroom.utils.WhiteBoardUtils;
 import com.dayayuemeng.classroom.viewmodel.ClassViewModel;
 import com.dayayuemeng.classroom.widget.CustomWhiteBoardView;
+import com.dayayuemeng.classroom.widget.dialog.CourseWareSelectDialog;
+import com.dayayuemeng.classroom.widget.dialog.CoursewarePreviewDialog;
 import com.luck.picture.lib.PictureSelector;
 import com.luck.picture.lib.config.PictureConfig;
 import com.luck.picture.lib.config.PictureMimeType;
@@ -97,6 +101,7 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
     WhiteSdkRoomInfo whiteSdkRoomInfo = null;
     private String mWhiteBoardUrl;
     private LinearLayout mLlRefresh;
+    private CourseWareSelectDialog mCourseWareSelectDialog;
 
 
     public NewCustomWhiteBoardFragment() {
@@ -111,15 +116,15 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
         mLlRefresh.setOnClickListener(this);
 
 
-        for (Map.Entry<String, Button> e : this.appliancesEnable.entrySet()) {
-            Button button = e.getValue();
-            button.setEnabled(false);
-            this.setColorWithButton(button, 0xFF000000);
-        }
-        for (Map.Entry<String, Button> e : this.appliances.entrySet()) {
-            Button button = e.getValue();
-            this.setColorWithButton(button, colorGray);
-        }
+//        for (Map.Entry<String, Button> e : this.appliancesEnable.entrySet()) {
+//            Button button = e.getValue();
+//            button.setEnabled(false);
+//            this.setColorWithButton(button, 0xFF000000);
+//        }
+//        for (Map.Entry<String, Button> e : this.appliances.entrySet()) {
+//            Button button = e.getValue();
+//            this.setColorWithButton(button, colorGray);
+//        }
         mWebView.setWhiteBoardClickListener(new CustomWhiteBoardView.onWhiteBoardClickListener() {
             @Override
             public void onClick() {
@@ -215,6 +220,7 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
     }
 
     private void initWhiteSdkRoomInfoMode() {
+        LOG.i("pq", "initWhiteSdkRoomInfoMode");
         if (TextUtils.isEmpty(roomId)) {
             roomId = classViewModel.getRoomId().getValue();
         }
@@ -224,11 +230,13 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
             id = roomId.substring(1);
         }
         whiteSdkRoomInfo = null;
+        LOG.i("pq", "createWhiteBoard:" + id);
         classViewModel.createWhiteBoard(id).observe(this, new Observer<WhiteCreateBean>() {
 
 
             @Override
             public void onChanged(WhiteCreateBean whiteCreateBean) {
+                LOG.i("pq", "new whiteBoard onChanged");
                 if (whiteSdkRoomInfo != null) {
                     return;
                 }
@@ -237,7 +245,7 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
                 whiteSdkRoomInfo.setRoomToken(whiteCreateBean.getRoomToken());
                 if (mWebView != null) {
                     mWhiteBoardUrl = buildUrl(whiteCreateBean.getRandomNumeric());
-                    LOG.i("new whiteBoard create");
+                    LOG.i("pq", "new whiteBoard create");
                     Log.i("pq", "whiteBoardUrl:" + mWhiteBoardUrl);
                     mWebView.loadUrl(mWhiteBoardUrl);
                 }
@@ -618,6 +626,7 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
     }
 
     private void startMusicSheet() {
+        showCourseWareDialog(true);
 //        Postcard postcard = ARouter.getInstance()
 //                .build(ARouterConstace.ACTIVITY_QU_LIBRAY)
 //                .withString("subjectId", SharedPreferenceUtil.read(Constants.SUBJECTID, ""));
@@ -627,6 +636,82 @@ public class NewCustomWhiteBoardFragment extends BaseWhiteFragment<NewFragmentCu
 //        startActivityForResult(intent, QU_LIBRAY_REQUEST_CODE);
     }
 
+    private void showCourseWareDialog(boolean isPreview) {
+        if (mCourseWareSelectDialog == null) {
+            mCourseWareSelectDialog = new CourseWareSelectDialog(getContext());
+            mCourseWareSelectDialog.setOnEventListener(new CourseWareSelectDialog.OnEventListener() {
+                @Override
+                public void onGetCoursewareData(String searchStr, int page) {
+                    getCoursewareList(searchStr, page);
+                }
+
+                @Override
+                public void onPlayCourseware(CoursewareListBean.RowsBean result) {
+                    if (result != null) {
+                        String url = result.musicImg;
+                        if (TextUtils.isEmpty(url)) {
+                            return;
+                        }
+                        sendCallBackMessage(API_WHITEBOARDSELECTMUSICLIBRARY, "url", url);
+                    }
+                }
+
+                @Override
+                public void showCoursewarePreviewDialog(CoursewareListBean.RowsBean rowsBean) {
+                    showCoursePreviewDialog(rowsBean);
+                }
+            });
+        }
+        if (!mCourseWareSelectDialog.isShowing()) {
+            mCourseWareSelectDialog.show();
+            mCourseWareSelectDialog.refresh();
+            mCourseWareSelectDialog.setShowImagePreview(isPreview);
+        }
+    }
+
+    private void showCoursePreviewDialog(CoursewareListBean.RowsBean coursewareData) {
+        CoursewarePreviewDialog coursewarePreviewDialog = new CoursewarePreviewDialog(getContext());
+        coursewarePreviewDialog.setOnEventListener(new CoursewarePreviewDialog.OnEventListener() {
+            @Override
+            public void onSelectCourse(String courseUrl, String courseImageUrl, int imgWidth, int imgHeight) {
+                insertMusicImg(courseImageUrl);
+                if (coursewarePreviewDialog != null) {
+                    coursewarePreviewDialog.dismiss();
+                }
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.dismiss();
+                }
+            }
+        });
+        coursewarePreviewDialog.show();
+        coursewarePreviewDialog.setCoursewareData(coursewareData);
+    }
+
+    private void insertMusicImg(String url) {
+        if (TextUtils.isEmpty(url)) {
+            return;
+        }
+        sendCallBackMessage(API_WHITEBOARDSELECTMUSICLIBRARY, "url", url);
+    }
+
+    private void getCoursewareList(String searchStr, int page) {
+        classViewModel.getCoursewareList(searchStr, page, new CoursewareDataResultCallBack<CoursewareListBean>() {
+            @Override
+            public void onSuccess(CoursewareListBean data, int page) {
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.setData(data, page);
+                }
+            }
+
+            @Override
+            public void onError(int page) {
+                if (mCourseWareSelectDialog != null) {
+                    mCourseWareSelectDialog.getDataError(page);
+                }
+            }
+        });
+    }
+
     public void sendCallBackMessage(String api, String contentKey, String value) {
         JSONObject jsonObject = new JSONObject();
         JSONObject contentJson = new JSONObject();

+ 4 - 3
classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/NewTeachingToolsFragment.java

@@ -223,8 +223,9 @@ public class NewTeachingToolsFragment extends BaseFragment<FgTeachingToolsBindin
             @Override
             public void onChanged(List<ClassMember> classMembers) {
                 noJoinStuClassMembers.clear();
-                noJoinStuClassMembers.addAll(classMembers);
-
+                if(classMembers!=null){
+                    noJoinStuClassMembers.addAll(classMembers);
+                }
             }
         });
         classViewModel.getExamSongDownloadClassMember().observe(this, new Observer<VideoClassMemberData>() {
@@ -268,7 +269,7 @@ public class NewTeachingToolsFragment extends BaseFragment<FgTeachingToolsBindin
             }
             items.add(item);
         }
-
+        LOG.i("pq","items:"+items.size());
         // 初始化操作布局
         operateView.initView(items, new OnOperateItemListener() {
             @Override

+ 2 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/ui/fragment/VideoFragment.java

@@ -508,6 +508,7 @@ public class VideoFragment extends BaseMVPFragment<FgVideoLayoutBinding,MainVide
                     //显示老师自己的时候 判断是否需要显示摄像头提示
                     TeachingToolsView cbCamera = getToolsView(BtnOperate.CAMERA.getValue());
                     boolean checked = cbCamera.isChecked();
+                    LOG.i("cameraView isChecked:"+checked);
                     ivCameraStatusTip.setVisibility(checked ? View.VISIBLE : View.GONE);
 
                     displayNull.setVisibility(View.GONE);
@@ -903,6 +904,7 @@ public class VideoFragment extends BaseMVPFragment<FgVideoLayoutBinding,MainVide
         if (banedCameraBox == null) {
             return;
         }
+        LOG.i(TAG,"setViewStatus:"+userInfo.toString());
         if (hasVideoPermssion) {
             // 因为按钮 false 是否代表不禁止, true 待变禁止, 所以和 用户信息携带的状态值相反
             if (banedCameraBox.isChecked() == userInfo.isCamera()) {

+ 9 - 1
classRoom/src/main/java/com/dayayuemeng/classroom/viewmodel/ClassViewModel.java

@@ -10,10 +10,12 @@ import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.helper.upload.UploadHelper;
+import com.dayayuemeng.classroom.api.CoursewareDataResultCallBack;
 import com.dayayuemeng.classroom.api.RequestState;
 import com.dayayuemeng.classroom.api.ResultCallback;
 import com.dayayuemeng.classroom.api.StateLiveData;
 import com.dayayuemeng.classroom.bean.ClassMember;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
 import com.dayayuemeng.classroom.bean.LoginResult;
 import com.dayayuemeng.classroom.constants.DeviceType;
 import com.dayayuemeng.classroom.constants.Role;
@@ -1762,6 +1764,7 @@ public class ClassViewModel extends ViewModel {
         classRepository.createWhiteBoard(roomId, new ResultCallback<WhiteCreateBean>() {
             @Override
             public void onSuccess(WhiteCreateBean result) {
+                LOG.i("pq","createWhiteBoard onSuccess:"+result);
                 createWhiteBoard.postValue(result);
             }
 
@@ -2880,7 +2883,8 @@ public class ClassViewModel extends ViewModel {
             if (value != null && value.size() > 0) {
                 for (ClassMember member : value) {
                     if (TextUtils.equals(screenDisplay.getUserId(), member.getUserId())) {
-                        Log.i("pq", "准备获取的member:" + member.getUserName() + "-isCamera:" + member.isCamera() + "-isMicrophone" + member.isMicrophone());
+//                        Log.i("pq", "准备获取的member:" + member.getUserName() + "-isCamera:" + member.isCamera() + "-isMicrophone" + member.isMicrophone());
+                        LOG.i("pq", "准备获取的member:" + member.toString());
                         screenDisplay.setClassMember(member);
                         break;
                     }
@@ -3018,4 +3022,8 @@ public class ClassViewModel extends ViewModel {
         });
         return stateLiveData;
     }
+
+    public void getCoursewareList(String searchStr, int page, CoursewareDataResultCallBack<CoursewareListBean> callBack) {
+        classRepository.getCoursewareList(searchStr, page,callBack);
+    }
 }

+ 47 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/widget/CoursewareLoadMoreView.java

@@ -0,0 +1,47 @@
+package com.dayayuemeng.classroom.widget;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.chad.library.adapter.base.loadmore.BaseLoadMoreView;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.dayayuemeng.classroom.R;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2022/11/16.
+ */
+public class CoursewareLoadMoreView extends BaseLoadMoreView {
+    @NonNull
+    @Override
+    public View getLoadComplete(@NonNull BaseViewHolder baseViewHolder) {
+        return baseViewHolder.getView(R.id.load_more_load_complete_view);
+    }
+
+    @NonNull
+    @Override
+    public View getLoadEndView(@NonNull BaseViewHolder baseViewHolder) {
+        return baseViewHolder.getView(R.id.load_more_load_end_view);
+    }
+
+    @NonNull
+    @Override
+    public View getLoadFailView(@NonNull BaseViewHolder baseViewHolder) {
+        return baseViewHolder.getView(R.id.load_more_load_fail_view);
+    }
+
+    @NonNull
+    @Override
+    public View getLoadingView(@NonNull BaseViewHolder baseViewHolder) {
+        return baseViewHolder.getView(R.id.load_more_loading_view);
+    }
+
+    @NonNull
+    @Override
+    public View getRootView(@NonNull ViewGroup viewGroup) {
+        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_courseware_load_more, viewGroup, false);
+        return view;
+    }
+}

+ 204 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/widget/dialog/CourseWareSelectDialog.java

@@ -0,0 +1,204 @@
+package com.dayayuemeng.classroom.widget.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.dayayuemeng.classroom.R;
+import com.dayayuemeng.classroom.adapter.CoursewareAdapter;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2022/11/15.
+ */
+public class CourseWareSelectDialog extends Dialog implements View.OnClickListener {
+    private OnEventListener onEventListener;
+    private int currentPage = 1;
+    private String currentSearchStr = "";
+    private RecyclerView mRecyclerView;
+    private boolean hasNext = true;
+    private CoursewareAdapter mCoursewareAdapter;
+    private TextView mTvSearch;
+    private EditText mEdSearchContent;
+
+    private boolean isShowImagePreview = false;//是否需要预览图片
+
+    public CourseWareSelectDialog(@NonNull Context context) {
+        super(context, com.cooleshow.base.R.style.DialogStyle);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_course_ware_layout);
+        mRecyclerView = findViewById(R.id.recyclerView);
+        mTvSearch = findViewById(R.id.tv_search);
+        mEdSearchContent = findViewById(R.id.ed_search_content);
+        findViewById(R.id.iv_close).setOnClickListener(this);
+        findViewById(R.id.tv_cancel).setOnClickListener(this);
+        findViewById(R.id.tv_confirm).setOnClickListener(this);
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        mCoursewareAdapter = new CoursewareAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.hideIcon();
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_content, "暂无内容~");
+        mCoursewareAdapter.setEmptyView(emptyViewLayout);
+        mRecyclerView.setAdapter(mCoursewareAdapter);
+        mTvSearch.setOnClickListener(this);
+        mCoursewareAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    loadMore();
+                } else {
+                    mCoursewareAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+
+        mCoursewareAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mCoursewareAdapter.getData().size()) {
+                    mCoursewareAdapter.setCurrentSelectPos(position);
+                }
+            }
+        });
+    }
+
+
+    public void setData(CoursewareListBean data, int page) {
+        if (mCoursewareAdapter == null) {
+            return;
+        }
+        if (data != null) {
+            if (page == 1) {
+                mCoursewareAdapter.getData().clear();
+                mCoursewareAdapter.notifyDataSetChanged();
+                if (data.getRows() != null && data.getRows().size() > 0) {
+                    checkHasNext(data.getRows().size());
+                    mCoursewareAdapter.setNewInstance(data.getRows());
+                }
+            } else {
+                if (data.getRows() != null && data.getRows().size() > 0) {
+                    mCoursewareAdapter.getLoadMoreModule().loadMoreComplete();
+                    mCoursewareAdapter.addData(data.getRows());
+                    checkHasNext(data.getRows().size());
+                } else {
+                    mCoursewareAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        }
+    }
+
+    public void getDataError(int page) {
+        if (mCoursewareAdapter == null) {
+            return;
+        }
+        if (page == 1) {
+//            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            currentPage--;
+            mCoursewareAdapter.getLoadMoreModule().loadMoreFail();
+        }
+    }
+
+    /**
+     * 刷新
+     */
+    public void refresh() {
+        if (onEventListener != null) {
+            currentPage = 1;
+            onEventListener.onGetCoursewareData(currentSearchStr, currentPage);
+        }
+    }
+
+    /**
+     * 加载更多
+     */
+    private void loadMore() {
+        if (onEventListener != null) {
+            currentPage++;
+            onEventListener.onGetCoursewareData(currentSearchStr, currentPage);
+        }
+    }
+
+    public void setOnEventListener(OnEventListener onEventListener) {
+        this.onEventListener = onEventListener;
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.tv_search) {
+            currentSearchStr = mEdSearchContent.getText().toString().trim();
+            refresh();
+            return;
+        }
+
+        if (id == R.id.iv_close || id == R.id.tv_cancel) {
+            dismiss();
+            return;
+        }
+        if (id == R.id.tv_confirm) {
+            if (onEventListener != null) {
+                CoursewareListBean.RowsBean selectCourseware = mCoursewareAdapter.getSelectCourseware();
+                if (selectCourseware != null) {
+                    if (isShowImagePreview) {
+                        if (TextUtils.isEmpty(selectCourseware.musicImg)) {
+                            ToastUtil.getInstance().showShort("暂无曲谱图片");
+                            return;
+                        }
+                        //显示图片预览
+                        onEventListener.showCoursewarePreviewDialog(selectCourseware);
+                    } else {
+                        onEventListener.onPlayCourseware(selectCourseware);
+                        dismiss();
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private String getMp3Url(String mp3Url) {
+        String[] result = mp3Url.split(",");
+        return result[0];
+    }
+
+    public void setShowImagePreview(boolean showImagePreview) {
+        isShowImagePreview = showImagePreview;
+    }
+
+    public interface OnEventListener {
+        void onGetCoursewareData(String searchStr, int page);
+
+        void onPlayCourseware(CoursewareListBean.RowsBean selectBean);
+
+        void showCoursewarePreviewDialog(CoursewareListBean.RowsBean rowsBean);
+    }
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+}

+ 121 - 0
classRoom/src/main/java/com/dayayuemeng/classroom/widget/dialog/CoursewarePreviewDialog.java

@@ -0,0 +1,121 @@
+package com.dayayuemeng.classroom.widget.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.ToastUtil;
+import com.dayayuemeng.classroom.R;
+import com.dayayuemeng.classroom.bean.CoursewareListBean;
+
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.viewpager2.widget.ViewPager2;
+
+/**
+ * Author by pq, Date on 2022/11/17.
+ */
+public class CoursewarePreviewDialog extends Dialog implements View.OnClickListener {
+
+    private BaseQuickAdapter<String, BaseViewHolder> mAdapter;
+    private TextView mTvConfirm;
+    private ViewPager2 mViewpager;
+    private CoursewareListBean.RowsBean selectData;
+
+    public CoursewarePreviewDialog(@NonNull Context context) {
+        super(context, com.cooleshow.base.R.style.DialogStyle);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_courseware_preview_layout);
+        mViewpager = findViewById(R.id.viewpager);
+        mTvConfirm = findViewById(R.id.tv_confirm);
+        findViewById(R.id.iv_close).setOnClickListener(this);
+        mTvConfirm.setOnClickListener(this);
+        mAdapter = new BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_courseware_preview_layout) {
+            @Override
+            protected void convert(@NonNull BaseViewHolder holder, String imgPath) {
+                FrameLayout fl_container = holder.getView(R.id.fl_container);
+                fl_container.removeAllViews();
+                ImageView image = createImage(imgPath);
+                fl_container.addView(image, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+                GlideUtils.INSTANCE.loadImage(getContext(), imgPath, image);
+            }
+        };
+        mViewpager.setAdapter(mAdapter);
+    }
+
+    public void setCoursewareData(CoursewareListBean.RowsBean coursewareData) {
+        if (coursewareData != null) {
+            this.selectData = coursewareData;
+            if (!TextUtils.isEmpty(coursewareData.musicImg)) {
+                Log.i("CoursewarePreviewDialog", "musicImg:" + coursewareData.musicImg);
+                String[] split = coursewareData.musicImg.split(",");
+                List<String> strings = Arrays.asList(split);
+                mAdapter.setNewInstance(strings);
+            }
+        }
+    }
+
+    private ImageView createImage(String imgPath) {
+        ImageView imageView = new ImageView(getContext());
+        imageView.setAdjustViewBounds(true);
+        return imageView;
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.iv_close) {
+            dismiss();
+            return;
+        }
+        if (id == R.id.tv_confirm) {
+            if (mViewpager != null && selectData != null) {
+                int currentItem = mViewpager.getCurrentItem();
+                if (currentItem < mAdapter.getData().size()) {
+                    String imgUrl = mAdapter.getData().get(currentItem);
+                    if (TextUtils.isEmpty(imgUrl)) {
+                        ToastUtil.getInstance().showShort("暂无曲谱图片");
+                        return;
+                    }
+                    View imgContainerView = mAdapter.getViewByPosition(currentItem, R.id.fl_container);
+                    int imgWidth = 0;
+                    int imgHeight = 0;
+                    if (imgContainerView != null) {
+                        imgWidth = imgContainerView.getWidth();
+                        imgHeight = imgContainerView.getHeight();
+                    }
+                    if (mEventListener != null) {
+                        mEventListener.onSelectCourse(selectData.mp3url, imgUrl, imgWidth, imgHeight);
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private OnEventListener mEventListener;
+
+    public void setOnEventListener(OnEventListener mEventListener) {
+        this.mEventListener = mEventListener;
+    }
+
+    public interface OnEventListener {
+        void onSelectCourse(String courseUrl, String courseImageUrl, int imgWidth, int imgHeight);
+    }
+}

二進制
classRoom/src/main/res/drawable-xhdpi/icon_course_ware_search.png


二進制
classRoom/src/main/res/drawable-xhdpi/icon_courseware_normal.png


二進制
classRoom/src/main/res/drawable-xhdpi/icon_courseware_select.png


二進制
classRoom/src/main/res/drawable-xxhdpi/icon_course_ware_search.png


二進制
classRoom/src/main/res/drawable-xxhdpi/icon_courseware_normal.png


二進制
classRoom/src/main/res/drawable-xxhdpi/icon_courseware_select.png


+ 5 - 0
classRoom/src/main/res/drawable/shape_35343e_18dp.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_35343e"/>
+    <corners android:radius="18dp"/>
+</shape>

+ 7 - 0
classRoom/src/main/res/drawable/shape_35343e_18dp_bottom.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:bottomRightRadius="18dp"
+        android:bottomLeftRadius="18dp"
+       />
+    <solid android:color="@color/color_35343e"/>
+</shape>

+ 5 - 0
classRoom/src/main/res/drawable/shape_514f5f_10dp.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="10dp"/>
+    <solid android:color="@color/color_514f5f"/>
+</shape>

+ 5 - 0
classRoom/src/main/res/drawable/shape_514f5f_18dp.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_514f5f"/>
+    <corners android:radius="18dp"/>
+</shape>

+ 6 - 0
classRoom/src/main/res/drawable/shape_514f5f_top_10dp.xml

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

+ 5 - 0
classRoom/src/main/res/drawable/shape_656376_4dp.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_656376"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 7 - 0
classRoom/src/main/res/drawable/shape_border_white_1dp_radius_4dp.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+        android:width="1dp"
+        android:color="@color/white" />
+    <corners android:radius="4dp" />
+</shape>

+ 7 - 0
classRoom/src/main/res/drawable/shape_white_18dp_bottom.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:bottomRightRadius="18dp"
+        android:bottomLeftRadius="18dp"
+       />
+    <solid android:color="@color/white"/>
+</shape>

+ 2 - 3
classRoom/src/main/res/layout/ac_net_class_room_teacher_layout.xml

@@ -70,9 +70,8 @@
 
     <FrameLayout
         android:id="@+id/teaching_tools_fragment"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="@dimen/dp_5"
+        android:layout_width="64dp"
+        android:layout_height="200dp"
         app:layout_constraintRight_toRightOf="@+id/tv_teaching_tools"
         app:layout_constraintLeft_toLeftOf="@+id/tv_teaching_tools"
         app:layout_constraintBottom_toTopOf="@id/view_help_teaching_tools" />

+ 162 - 0
classRoom/src/main/res/layout/dialog_course_ware_layout.xml

@@ -0,0 +1,162 @@
+<?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"
+    android:layout_width="375dp"
+    android:layout_height="wrap_content"
+    android:minHeight="278dp">
+
+    <View
+        android:id="@+id/view_top_bg"
+        android:layout_width="match_parent"
+        android:layout_height="47dp"
+        android:background="@drawable/shape_514f5f_top_10dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:paddingStart="12dp"
+        android:text="我的课件"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintBottom_toBottomOf="@+id/view_top_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_top_bg" />
+
+    <ImageView
+        android:id="@+id/iv_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingEnd="18dp"
+        android:src="@drawable/icon_close_white"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_title" />
+
+    <View
+        android:id="@+id/view_content_bg"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:background="#34333D"
+        app:layout_constraintBottom_toBottomOf="@+id/recyclerView"
+        app:layout_constraintTop_toBottomOf="@+id/view_top_bg" />
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginStart="14dp"
+        android:layout_marginTop="12dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/shape_514f5f_18dp"
+        app:layout_constraintLeft_toLeftOf="@+id/view_content_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_content_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_content_bg" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_course_ware_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="0.5dp"
+        android:layout_height="14dp"
+        android:layout_marginStart="8dp"
+        android:background="@color/white"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_search_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_search_icon" />
+
+    <EditText
+        android:id="@+id/ed_search_content"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:hint="请输入课件名称"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:paddingStart="10dp"
+        android:textColor="@color/white"
+        android:textColorHint="@color/color_cccccc"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/view_line"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="wrap_content"
+        android:layout_height="24dp"
+        android:layout_marginEnd="5dp"
+        android:background="@drawable/shape_35343e_18dp"
+        android:gravity="center"
+        android:paddingStart="11dp"
+        android:paddingEnd="11dp"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:id="@+id/recyclerView"
+        android:layout_width="0dp"
+        android:layout_height="119dp"
+        android:layout_marginTop="10dp"
+        android:overScrollMode="never"
+        android:scrollbars="vertical"
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_bottom_bg"
+        android:layout_width="match_parent"
+        android:layout_height="58dp"
+        android:background="@drawable/shape_35343e_18dp_bottom"
+        app:layout_constraintTop_toBottomOf="@+id/view_content_bg" />
+
+    <TextView
+        android:id="@+id/tv_cancel"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginEnd="6dp"
+        android:background="@drawable/shape_border_white_1dp_radius_4dp"
+        android:gravity="center"
+        android:layout_marginStart="12dp"
+        android:text="@string/cancel"
+        android:textColor="@color/white"
+        app:layout_constraintBottom_toBottomOf="@+id/view_bottom_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_bottom_bg"
+        app:layout_constraintRight_toLeftOf="@+id/tv_confirm"
+        app:layout_constraintTop_toTopOf="@+id/view_bottom_bg" />
+
+    <TextView
+        android:id="@+id/tv_confirm"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginStart="6dp"
+        android:layout_marginEnd="12dp"
+        android:background="@drawable/shape_656376_4dp"
+        android:gravity="center"
+        android:text="@string/common_confirm"
+        android:textColor="@color/white"
+        app:layout_constraintBottom_toBottomOf="@+id/view_bottom_bg"
+        app:layout_constraintLeft_toRightOf="@+id/tv_cancel"
+        app:layout_constraintRight_toRightOf="@+id/view_bottom_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_bottom_bg" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 73 - 0
classRoom/src/main/res/layout/dialog_courseware_preview_layout.xml

@@ -0,0 +1,73 @@
+<?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"
+    android:layout_width="375dp"
+    android:layout_height="wrap_content"
+    android:minHeight="278dp">
+
+    <View
+        android:id="@+id/view_top_bg"
+        android:layout_width="match_parent"
+        android:layout_height="47dp"
+        android:background="@drawable/shape_514f5f_top_10dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:paddingStart="12dp"
+        android:text="课件预览"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintBottom_toBottomOf="@+id/view_top_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_top_bg" />
+
+    <ImageView
+        android:id="@+id/iv_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingEnd="18dp"
+        android:src="@drawable/icon_close_white"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_title" />
+
+
+    <View
+        android:id="@+id/view_bottom_bg"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:background="@drawable/shape_white_18dp_bottom"
+        android:minHeight="200dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_top_bg" />
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/viewpager"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="@+id/view_bottom_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_bottom_bg" />
+
+
+    <TextView
+        android:layout_marginBottom="10dp"
+        android:id="@+id/tv_confirm"
+        android:layout_width="200dp"
+        android:layout_height="34dp"
+        android:layout_marginStart="6dp"
+        android:layout_marginEnd="12dp"
+        android:background="@drawable/shape_656376_4dp"
+        android:gravity="center"
+        android:text="@string/common_confirm"
+        android:textColor="@color/white"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
classRoom/src/main/res/layout/fg_teaching_tools.xml

@@ -3,7 +3,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/operate_view"
     android:layout_width="64dp"
-    android:layout_height="wrap_content"
+    android:layout_height="200dp"
     android:background="@drawable/shape_8dp_white"
     android:paddingTop="@dimen/dp_7"
     android:paddingBottom="@dimen/dp_7"

+ 10 - 0
classRoom/src/main/res/layout/item_courseware_preview_layout.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <FrameLayout
+        android:id="@+id/fl_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+</ScrollView>

+ 43 - 0
classRoom/src/main/res/layout/item_teaching_courseware_list_layout.xml

@@ -0,0 +1,43 @@
+<?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_marginStart="15dp"
+    android:layout_marginEnd="15dp"
+    android:layout_height="52dp"
+    android:layout_marginBottom="10dp"
+    android:background="@drawable/shape_514f5f_10dp">
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:id="@+id/iv_cover"
+        android:layout_width="36dp"
+        android:layout_height="36dp"
+        android:src="@drawable/icon_music_mark"
+        android:layout_marginStart="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="14dp"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_cover"
+        app:layout_constraintLeft_toRightOf="@+id/iv_cover"
+        app:layout_constraintTop_toTopOf="@+id/iv_cover"
+        tools:text="第一期课件8-01.MP3" />
+
+    <ImageView
+        android:id="@+id/iv_select_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="16dp"
+        android:src="@drawable/icon_courseware_normal"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 86 - 0
classRoom/src/main/res/layout/view_courseware_load_more.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    android:layout_gravity="center"
+    android:gravity="center"
+    android:orientation="vertical"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/dp_40">
+
+    <LinearLayout
+        android:layout_gravity="center"
+        android:visibility="visible"
+        android:id="@+id/load_more_loading_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <ProgressBar
+            android:id="@+id/loading_progress"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="?android:attr/progressBarStyleSmall"
+            android:layout_marginRight="@dimen/dp_4"/>
+
+        <TextView
+            android:id="@+id/loading_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/dp_4"
+            android:text="@string/brvah_loading"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_14"/>
+    </LinearLayout>
+
+    <FrameLayout
+        android:layout_gravity="center"
+        android:id="@+id/load_more_load_fail_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone">
+
+
+        <TextView
+            android:id="@+id/tv_prompt"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:textColor="@color/white"
+            android:text="@string/brvah_load_failed"/>
+
+    </FrameLayout>
+
+    <FrameLayout
+        android:layout_gravity="center"
+        android:id="@+id/load_more_load_complete_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:text="@string/brvah_load_complete"
+            android:textColor="@color/white"/>
+    </FrameLayout>
+
+    <FrameLayout
+        android:layout_gravity="center"
+        android:orientation="vertical"
+        android:gravity="center"
+        android:id="@+id/load_more_load_end_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone">
+
+        <TextView
+            android:gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:text="@string/brvah_load_end"
+            android:textColor="@color/white"/>
+    </FrameLayout>
+</RelativeLayout>

+ 0 - 1
tclive/src/main/java/com/daya/tclive/presenter/TCLivePresenter.java

@@ -300,7 +300,6 @@ public class TCLivePresenter extends BasePresenter<TCLiveRoomContract.TCLiveRoom
         if (getView() != null) {
             getView().loginIMSuccess();
         }
-        registerListener(roomId);
     }
 
     public void joinIMGroup(String targetId) {