Quellcode durchsuchen

网络教室添加课件播放逻辑

Pq vor 2 Jahren
Ursprung
Commit
5a4667dd74
45 geänderte Dateien mit 1082 neuen und 24 gelöschten Zeilen
  1. 7 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/EmptyViewLayout.java
  2. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_music_mark.png
  3. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_music_mark.png
  4. 6 0
      BaseLibrary/src/main/res/values/colors.xml
  5. 67 0
      live_teaching/src/main/java/com/daya/live_teaching/adapter/CoursewareAdapter.java
  6. 41 0
      live_teaching/src/main/java/com/daya/live_teaching/api/LiveTeachingApi.java
  7. 2 0
      live_teaching/src/main/java/com/daya/live_teaching/api/retrofit/RetrofitClient.java
  8. 10 0
      live_teaching/src/main/java/com/daya/live_teaching/callback/CoursewareDataResultCallBack.java
  9. 51 0
      live_teaching/src/main/java/com/daya/live_teaching/model/CoursewareListBean.java
  10. 31 7
      live_teaching/src/main/java/com/daya/live_teaching/repository/ClassRepository.java
  11. 49 2
      live_teaching/src/main/java/com/daya/live_teaching/ui/LiveActivity.java
  12. 20 1
      live_teaching/src/main/java/com/daya/live_teaching/ui/fragmnet/TeachingToolsFragment.java
  13. 23 14
      live_teaching/src/main/java/com/daya/live_teaching/viewmodel/ClassViewModel.java
  14. 34 0
      live_teaching/src/main/java/com/daya/live_teaching/widget/CourseWarePlayView.java
  15. 49 0
      live_teaching/src/main/java/com/daya/live_teaching/widget/CoursewareLoadMoreView.java
  16. 181 0
      live_teaching/src/main/java/com/daya/live_teaching/widget/dialog/CourseWareSelectDialog.java
  17. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_course_ware_search.png
  18. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_courseware_normal.png
  19. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_courseware_select.png
  20. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_courseware_volume.png
  21. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_dialog_close_white.png
  22. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_play_course_ware.png
  23. BIN
      live_teaching/src/main/res/drawable-xhdpi/icon_stop_play_course_ware.png
  24. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_course_ware_search.png
  25. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_courseware_normal.png
  26. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_courseware_select.png
  27. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_courseware_volume.png
  28. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_dialog_close_white.png
  29. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_play_course_ware.png
  30. BIN
      live_teaching/src/main/res/drawable-xxhdpi/icon_stop_play_course_ware.png
  31. 37 0
      live_teaching/src/main/res/drawable/play_course_ware_seekbar_style.xml
  32. 5 0
      live_teaching/src/main/res/drawable/shape_35343e_18dp.xml
  33. 7 0
      live_teaching/src/main/res/drawable/shape_35343e_18dp_bottom.xml
  34. 5 0
      live_teaching/src/main/res/drawable/shape_514f5f_10dp.xml
  35. 5 0
      live_teaching/src/main/res/drawable/shape_514f5f_18dp.xml
  36. 6 0
      live_teaching/src/main/res/drawable/shape_514f5f_top_10dp.xml
  37. 5 0
      live_teaching/src/main/res/drawable/shape_656376_4dp.xml
  38. 7 0
      live_teaching/src/main/res/drawable/shape_border_white_1dp_radius_4dp.xml
  39. 9 0
      live_teaching/src/main/res/drawable/shape_course_ware_play_bg.xml
  40. 5 0
      live_teaching/src/main/res/drawable/shape_play_courseware_thumb.xml
  41. 11 0
      live_teaching/src/main/res/layout/activity_live.xml
  42. 162 0
      live_teaching/src/main/res/layout/dialog_course_ware_layout.xml
  43. 42 0
      live_teaching/src/main/res/layout/item_courseware_list_layout.xml
  44. 119 0
      live_teaching/src/main/res/layout/view_course_ware_play_layout.xml
  45. 86 0
      live_teaching/src/main/res/layout/view_courseware_load_more.xml

+ 7 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/EmptyViewLayout.java

@@ -4,6 +4,7 @@ import android.content.Context;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -50,4 +51,10 @@ public class EmptyViewLayout extends LinearLayout {
             mTvEmptyTip.setText(text);
         }
     }
+
+    public void hideIcon() {
+        if (mIvEmptyIcon != null) {
+            mIvEmptyIcon.setVisibility(View.GONE);
+        }
+    }
 }

BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_music_mark.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_music_mark.png


+ 6 - 0
BaseLibrary/src/main/res/values/colors.xml

@@ -159,6 +159,12 @@
     <color name="color_2d3648">#2D3648</color>
     <color name="color_006d58">#006D58</color>
     <color name="color_6c00c3">#6C00C3</color>
+    <color name="color_514f5f">#514f5f</color>
+    <color name="color_35343e">#35343e</color>
+    <color name="color_656376">#656376</color>
+    <color name="color_ffebd3">#FFEBD3</color>
+    <color name="color_ffd5aa">#FFD5AA</color>
+    <color name="color_ff8000">#FF8000</color>
 
     <color name="color_25292e">#25292E</color>
     <color name="color_F8F8F8">#F8F8F8</color>

+ 67 - 0
live_teaching/src/main/java/com/daya/live_teaching/adapter/CoursewareAdapter.java

@@ -0,0 +1,67 @@
+package com.daya.live_teaching.adapter;
+
+import android.view.View;
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.loadmore.SimpleLoadMoreView;
+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.daya.live_teaching.R;
+import com.daya.live_teaching.model.CoursewareListBean;
+import com.daya.live_teaching.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_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;
+    }
+}

+ 41 - 0
live_teaching/src/main/java/com/daya/live_teaching/api/LiveTeachingApi.java

@@ -2,12 +2,15 @@ package com.daya.live_teaching.api;
 
 import com.cooleshow.base.data.net.BaseResponse;
 import com.daya.live_teaching.model.ClassMember;
+import com.daya.live_teaching.model.CoursewareListBean;
 import com.daya.live_teaching.model.FileUploadBean;
 import com.daya.live_teaching.model.LoginResult;
 import com.daya.live_teaching.model.Result;
+import com.daya.live_teaching.model.WhiteCreateBean;
 
 import java.util.List;
 
+import io.reactivex.rxjava3.core.Observable;
 import okhttp3.MultipartBody;
 import okhttp3.RequestBody;
 import okhttp3.ResponseBody;
@@ -27,6 +30,7 @@ import retrofit2.http.Url;
 public interface LiveTeachingApi {
     /**
      * 签到
+     *
      * @return
      */
     @FormUrlEncoded
@@ -35,6 +39,7 @@ public interface LiveTeachingApi {
 
     /**
      * 签到
+     *
      * @return
      */
     @POST(LiveTeachingUrls.QUERY_NO_JOIN_STU)
@@ -42,6 +47,7 @@ public interface LiveTeachingApi {
 
     /**
      * 开关节拍器
+     *
      * @return
      */
     @POST(LiveTeachingUrls.SEND_IMPLAY_MIDI_MESSAGE)
@@ -49,6 +55,7 @@ public interface LiveTeachingApi {
 
     /**
      * 登录
+     *
      * @param body
      * @return
      */
@@ -58,6 +65,7 @@ public interface LiveTeachingApi {
 
     /**
      * 退出房间
+     *
      * @param body
      * @return
      */
@@ -67,6 +75,7 @@ public interface LiveTeachingApi {
 
     /**
      * 踢人
+     *
      * @param body
      * @return
      */
@@ -75,6 +84,7 @@ public interface LiveTeachingApi {
 
     /**
      * 控制设备
+     *
      * @param body
      * @return
      */
@@ -83,6 +93,7 @@ public interface LiveTeachingApi {
 
     /**
      * 控制全员设备
+     *
      * @param body
      * @return
      */
@@ -91,6 +102,7 @@ public interface LiveTeachingApi {
 
     /**
      * 同意开启设备
+     *
      * @param body
      * @return
      */
@@ -99,6 +111,7 @@ public interface LiveTeachingApi {
 
     /**
      * 拒绝开启设备
+     *
      * @param body
      * @return
      */
@@ -108,6 +121,7 @@ public interface LiveTeachingApi {
 
     /**
      * 同步设备状态
+     *
      * @param body
      * @return
      */
@@ -117,6 +131,7 @@ public interface LiveTeachingApi {
 
     /**
      * 降级
+     *
      * @param body
      * @return
      */
@@ -125,6 +140,7 @@ public interface LiveTeachingApi {
 
     /**
      * 申请发言
+     *
      * @param body
      * @return
      */
@@ -134,6 +150,7 @@ public interface LiveTeachingApi {
 
     /**
      * 同意发言
+     *
      * @param body
      * @return
      */
@@ -143,6 +160,7 @@ public interface LiveTeachingApi {
 
     /**
      * 拒绝发言
+     *
      * @param body
      * @return
      */
@@ -152,6 +170,7 @@ public interface LiveTeachingApi {
 
     /**
      * 转移角色
+     *
      * @param body
      * @return
      */
@@ -161,6 +180,7 @@ public interface LiveTeachingApi {
 
     /**
      * 要求升级
+     *
      * @param body
      * @return
      */
@@ -170,6 +190,7 @@ public interface LiveTeachingApi {
 
     /**
      * 接受升级
+     *
      * @param body
      * @return
      */
@@ -179,6 +200,7 @@ public interface LiveTeachingApi {
 
     /**
      * 拒绝升级
+     *
      * @param body
      * @return
      */
@@ -188,6 +210,7 @@ public interface LiveTeachingApi {
 
     /**
      * 设置角色, 设置为老师
+     *
      * @param body
      * @return
      */
@@ -197,6 +220,7 @@ public interface LiveTeachingApi {
 
     /**
      * 创建白板
+     *
      * @param body
      * @return
      */
@@ -206,6 +230,7 @@ public interface LiveTeachingApi {
 
     /**
      * 删除白板
+     *
      * @param body
      * @return
      */
@@ -215,6 +240,7 @@ public interface LiveTeachingApi {
 
     /**
      * 切换共享画布区内容显示Id
+     *
      * @param body
      * @return
      */
@@ -223,6 +249,7 @@ public interface LiveTeachingApi {
 
     /**
      * 通知学生下载伴奏
+     *
      * @param body
      * @return
      */
@@ -231,6 +258,7 @@ public interface LiveTeachingApi {
 
     /**
      * 学员伴奏下载回执
+     *
      * @param body
      * @return
      */
@@ -239,6 +267,7 @@ public interface LiveTeachingApi {
 
     /**
      * 同步房间状态
+     *
      * @param body
      * @return
      */
@@ -248,6 +277,7 @@ public interface LiveTeachingApi {
 
     /**
      * 文件上传
+     *
      * @param file
      * @return
      */
@@ -257,10 +287,21 @@ public interface LiveTeachingApi {
 
     /**
      * 文件下载
+     *
      * @return
      */
     @Streaming
     @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);
+
+
+    /**
+     * 请求课件列表
+     *
+     * @param
+     * @return
+     */
+    @POST("api-teacher/courseCourseware/page")
+    Observable<BaseResponse<CoursewareListBean>> getCoursewareList(@Body RequestBody requestBody);
 }

+ 2 - 0
live_teaching/src/main/java/com/daya/live_teaching/api/retrofit/RetrofitClient.java

@@ -16,6 +16,7 @@ import okhttp3.Request;
 import okhttp3.Response;
 import okhttp3.logging.HttpLoggingInterceptor;
 import retrofit2.Retrofit;
+import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
 import retrofit2.converter.gson.GsonConverterFactory;
 
 import static android.content.Context.MODE_PRIVATE;
@@ -42,6 +43,7 @@ public class RetrofitClient {
                 .client(okHttpBuilder.build())
                 .baseUrl(baseUrl) //设置网络请求的Url地址
                 .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
+                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                 .build();
     }
 

+ 10 - 0
live_teaching/src/main/java/com/daya/live_teaching/callback/CoursewareDataResultCallBack.java

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

+ 51 - 0
live_teaching/src/main/java/com/daya/live_teaching/model/CoursewareListBean.java

@@ -0,0 +1,51 @@
+package com.daya.live_teaching.model;
+
+import java.lang.reflect.Array;
+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;
+    }
+}

+ 31 - 7
live_teaching/src/main/java/com/daya/live_teaching/repository/ClassRepository.java

@@ -2,8 +2,10 @@ package com.daya.live_teaching.repository;
 
 import android.content.Context;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.cooleshow.base.common.BaseApplication;
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.base.data.net.RetrofitClientNoToken;
 import com.cooleshow.base.data.net.RetrofitFactory;
@@ -16,12 +18,11 @@ import com.cooleshow.base.utils.SystemUtils;
 import com.daya.live_teaching.api.LiveTeachingApi;
 import com.daya.live_teaching.api.WhiteBoardApi;
 import com.daya.live_teaching.api.retrofit.CallBackWrapper;
-import com.daya.live_teaching.api.retrofit.RetrofitClient;
 import com.daya.live_teaching.api.retrofit.RetrofitUtil;
+import com.daya.live_teaching.callback.CoursewareDataResultCallBack;
 import com.daya.live_teaching.common.ResultCallback;
 import com.daya.live_teaching.im.IMManager;
 import com.daya.live_teaching.im.message.ApplyForSpeechMessage;
-import com.daya.live_teaching.im.message.AssistantTransferMessage;
 import com.daya.live_teaching.im.message.ControlDeviceNotifyMessage;
 import com.daya.live_teaching.im.message.DeviceStateChangedMessage;
 import com.daya.live_teaching.im.message.DisplayMessage;
@@ -33,22 +34,19 @@ import com.daya.live_teaching.im.message.RoleChangedMessage;
 import com.daya.live_teaching.im.message.SpeechResultMessage;
 import com.daya.live_teaching.im.message.TicketExpiredMessage;
 import com.daya.live_teaching.im.message.TurnPageMessage;
-import com.daya.live_teaching.im.message.UpgradeRoleMessage;
 import com.daya.live_teaching.im.message.WhiteBoardMessage;
 import com.daya.live_teaching.model.ApplyForSpeechRequest;
 import com.daya.live_teaching.model.ChangedUser;
 import com.daya.live_teaching.model.ClassMember;
+import com.daya.live_teaching.model.CoursewareListBean;
 import com.daya.live_teaching.model.DeviceControlInvite;
 import com.daya.live_teaching.model.DownLoadSong;
 import com.daya.live_teaching.model.FileUploadBean;
 import com.daya.live_teaching.model.PlayMidi;
-import com.daya.live_teaching.model.Role;
-import com.daya.live_teaching.model.RoleChangedUser;
 import com.daya.live_teaching.model.ScreenDisplay;
 import com.daya.live_teaching.model.SpeechResult;
 import com.daya.live_teaching.model.StreamResource;
 import com.daya.live_teaching.model.TicketExpired;
-import com.daya.live_teaching.model.UpgradeRoleInvite;
 import com.daya.live_teaching.model.WhiteBoard;
 import com.daya.live_teaching.model.WhiteCreateBean;
 import com.daya.live_teaching.rtc.RtcManager;
@@ -57,7 +55,6 @@ import com.daya.live_teaching.utils.log.SLog;
 import org.json.JSONObject;
 
 import java.io.File;
-import java.lang.annotation.Retention;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -958,5 +955,32 @@ public class ClassRepository extends BaseRepository {
         return streamResource;
     }
 
+    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);
+                        }
+                    }
+                });
+    }
 }

+ 49 - 2
live_teaching/src/main/java/com/daya/live_teaching/ui/LiveActivity.java

@@ -37,9 +37,11 @@ import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.daya.live_teaching.R;
+import com.daya.live_teaching.callback.CoursewareDataResultCallBack;
 import com.daya.live_teaching.common.ShowToastObserver;
 import com.daya.live_teaching.databinding.ActivityLiveBinding;
 import com.daya.live_teaching.model.ClassMember;
+import com.daya.live_teaching.model.CoursewareListBean;
 import com.daya.live_teaching.model.DeviceChangeToast;
 import com.daya.live_teaching.model.DeviceControlInvite;
 import com.daya.live_teaching.model.DeviceSoudValum;
@@ -74,6 +76,7 @@ import com.daya.live_teaching.utils.AudioMngHelper;
 import com.daya.live_teaching.utils.RTCAudioManager;
 import com.daya.live_teaching.utils.ToastUtils;
 import com.daya.live_teaching.viewmodel.ClassViewModel;
+import com.daya.live_teaching.widget.dialog.CourseWareSelectDialog;
 import com.daya.live_teaching.widget.dialog.LiveCommonDialog;
 
 import java.util.ArrayList;
@@ -142,6 +145,7 @@ public class LiveActivity extends BaseActivity<ActivityLiveBinding> {
     private AccompanimentListFragment accompanimentListFragment;
     private AudioMngHelper audioMngHelper;
     private LiveCommonDialog mLiveInviteCommonDialog;
+    private CourseWareSelectDialog mCourseWareSelectDialog;
 
     @Override
     protected void initView() {
@@ -189,7 +193,7 @@ public class LiveActivity extends BaseActivity<ActivityLiveBinding> {
         });
 
         ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) teachingToolsFragmentLayout.getLayoutParams();
-        params.width = SizeUtils.dp2px(226);
+        params.width = SizeUtils.dp2px(280);
         teachingToolsFragmentLayout.setLayoutParams(params);
         // 自定义 toast 的显示和消失动画
         toastShowAnim = AnimationUtils.loadAnimation(this, R.anim.alpha_show);
@@ -685,7 +689,10 @@ public class LiveActivity extends BaseActivity<ActivityLiveBinding> {
                     accompanimentListFragmentIsHidden = !accompanimentListFragmentIsHidden;
                 }
 
-
+                @Override
+                public void showCourseWareDialog() {
+                    LiveActivity.this.showCourseWareDialog();
+                }
             });
             transaction.add(R.id.teaching_tools_fragment, teachingToolsFragment, "teachingToolsFragment");
         }
@@ -699,6 +706,28 @@ public class LiveActivity extends BaseActivity<ActivityLiveBinding> {
         transaction.commitNowAllowingStateLoss();
     }
 
+
+    private void showCourseWareDialog() {
+        if (mCourseWareSelectDialog == null) {
+            mCourseWareSelectDialog = new CourseWareSelectDialog(this);
+            mCourseWareSelectDialog.setOnEventListener(new CourseWareSelectDialog.OnEventListener() {
+                @Override
+                public void onGetCoursewareData(String searchStr, int page) {
+                    getCoursewareList(searchStr, page);
+                }
+
+                @Override
+                public void onPlayCourseware(String coursewareUrl) {
+
+                }
+            });
+        }
+        if (!mCourseWareSelectDialog.isShowing()) {
+            mCourseWareSelectDialog.show();
+            mCourseWareSelectDialog.refresh();
+        }
+    }
+
     public void initClassViewModel(Intent intent) {
         isRefreshClassViewModel = true;
 
@@ -1399,6 +1428,24 @@ public class LiveActivity extends BaseActivity<ActivityLiveBinding> {
 
     }
 
+    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);
+                }
+            }
+        });
+    }
+
     @Override
     public void onBackPressed() {
     }

+ 20 - 1
live_teaching/src/main/java/com/daya/live_teaching/ui/fragmnet/TeachingToolsFragment.java

@@ -1,6 +1,7 @@
 package com.daya.live_teaching.ui.fragmnet;
 
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.View;
 import android.widget.CheckBox;
@@ -13,6 +14,9 @@ import com.cooleshow.base.ui.fragment.BaseFragment;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.utils.ToastUtil;
+import com.daya.live_teaching.callback.CoursewareDataResultCallBack;
+import com.daya.live_teaching.model.CoursewareListBean;
+import com.daya.live_teaching.widget.dialog.CourseWareSelectDialog;
 import com.daya.live_teaching.widget.dialog.LiveCommonDialog;
 import com.daya.live_teaching.R;
 import com.daya.live_teaching.common.ResultCallback;
@@ -78,8 +82,12 @@ public class TeachingToolsFragment extends BaseFragment<FragmentTeachingToolsBin
         /**
          * 节拍器播放
          */
-        METRONOME(5);
+        METRONOME(5),
 
+        /**
+         * 课件
+         */
+        COURSEWARE(6);
 
         private int value;
 
@@ -109,6 +117,7 @@ public class TeachingToolsFragment extends BaseFragment<FragmentTeachingToolsBin
             R.drawable.fragment_top_accompaniment_selector,
             R.drawable.ic_metronome_setting,
             R.drawable.fragment_top_operate_metronome_selector,
+            R.drawable.ic_metronome_setting,
     };
 
     @Override
@@ -307,6 +316,11 @@ public class TeachingToolsFragment extends BaseFragment<FragmentTeachingToolsBin
                             fragment.setGravity(Gravity.CENTER);
                             fragment.show(getChildFragmentManager(), "");
                             break;
+                        case COURSEWARE:
+                            if (listener != null) {
+                                listener.showCourseWareDialog();
+                            }
+                            break;
                     }
                 }
             }
@@ -563,6 +577,11 @@ public class TeachingToolsFragment extends BaseFragment<FragmentTeachingToolsBin
          */
         void showAccompaniment();
 
+        /**
+         * 显示课件列表弹窗
+         */
+        void showCourseWareDialog();
+
     }
 
 }

+ 23 - 14
live_teaching/src/main/java/com/daya/live_teaching/viewmodel/ClassViewModel.java

@@ -7,6 +7,7 @@ import android.text.TextUtils;
 import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.base.utils.LogUtils;
 import com.daya.live_teaching.api.WhiteBoardApi;
+import com.daya.live_teaching.callback.CoursewareDataResultCallBack;
 import com.daya.live_teaching.common.ResultCallback;
 import com.daya.live_teaching.common.StateLiveData;
 import com.daya.live_teaching.im.IMManager;
@@ -14,6 +15,7 @@ import com.daya.live_teaching.model.ApplyForSpeechRequest;
 import com.daya.live_teaching.model.ChangedUser;
 import com.daya.live_teaching.model.ClassMember;
 import com.daya.live_teaching.model.ClassMemberChangedAction;
+import com.daya.live_teaching.model.CoursewareListBean;
 import com.daya.live_teaching.model.DeviceChange;
 import com.daya.live_teaching.model.DeviceChangeToast;
 import com.daya.live_teaching.model.DeviceControlInvite;
@@ -398,6 +400,7 @@ public class ClassViewModel extends ViewModel {
     public MutableLiveData<Boolean> getAccompanyVolume() {
         return accompanyVolume;
     }
+
     public void setAccompanyVolume(boolean volume) {
         accompanyVolume.postValue(false);
 
@@ -461,11 +464,15 @@ public class ClassViewModel extends ViewModel {
 
     /**
      * 设备音量控制
+     *
      * @return
      */
     public LiveData<DeviceSoudValum> getSoundValum() {
         return deviceSoundValume;
-    };
+    }
+
+    ;
+
     /**
      * 获取当自己设备被停用状态
      *
@@ -482,6 +489,7 @@ public class ClassViewModel extends ViewModel {
     public LiveData<Integer> getSoundVolume() {
         return soundVolume;
     }
+
     /**
      * 获取成员列表
      *
@@ -608,7 +616,6 @@ public class ClassViewModel extends ViewModel {
     }
 
 
-
     /**
      * 获取视频退出的用户
      *
@@ -767,7 +774,6 @@ public class ClassViewModel extends ViewModel {
     }
 
 
-
     public LiveData<Boolean> getRespondApplySpeechTimeout() {
         return respondApplySpeechTimeout;
     }
@@ -1179,10 +1185,10 @@ public class ClassViewModel extends ViewModel {
      * @param roomId
      * @return
      */
-    public LiveData<RequestState> batchControlExamSong(String roomId, String userId, String musicScoreOn, String accompanimentOn, String musicScoreAccompanimentId,String soudnValue) {
+    public LiveData<RequestState> batchControlExamSong(String roomId, String userId, String musicScoreOn, String accompanimentOn, String musicScoreAccompanimentId, String soudnValue) {
         final StateLiveData stateLiveData = new StateLiveData();
         stateLiveData.loading();
-        classRepository.batchControlExamSong(roomId, userId, musicScoreOn, accompanimentOn, musicScoreAccompanimentId,soudnValue, new ResultCallback<Boolean>() {
+        classRepository.batchControlExamSong(roomId, userId, musicScoreOn, accompanimentOn, musicScoreAccompanimentId, soudnValue, new ResultCallback<Boolean>() {
             @Override
             public void onSuccess(Boolean result) {
                 stateLiveData.success();
@@ -1200,7 +1206,7 @@ public class ClassViewModel extends ViewModel {
     public LiveData<RequestState> batchControlExamSong(String roomId, String userId, String musicScoreOn, String accompanimentOn, String musicScoreAccompanimentId) {
         final StateLiveData stateLiveData = new StateLiveData();
         stateLiveData.loading();
-        classRepository.batchControlExamSong(roomId, userId, musicScoreOn, accompanimentOn, musicScoreAccompanimentId,"", new ResultCallback<Boolean>() {
+        classRepository.batchControlExamSong(roomId, userId, musicScoreOn, accompanimentOn, musicScoreAccompanimentId, "", new ResultCallback<Boolean>() {
             @Override
             public void onSuccess(Boolean result) {
                 stateLiveData.success();
@@ -1688,13 +1694,13 @@ public class ClassViewModel extends ViewModel {
         classRepository.createWhiteBoard(roomId, new ResultCallback<WhiteCreateBean>() {
             @Override
             public void onSuccess(WhiteCreateBean result) {
-                LogUtils.i("pq","WhiteCreateBean:"+result);
+                LogUtils.i("pq", "WhiteCreateBean:" + result);
                 createWhiteBoard.postValue(result);
             }
 
             @Override
             public void onFail(int errorCode, String errorStr) {
-                LogUtils.i("pq","WhiteCreateBean onFail:"+errorCode+"-errorStr:"+errorStr);
+                LogUtils.i("pq", "WhiteCreateBean onFail:" + errorCode + "-errorStr:" + errorStr);
             }
         });
         return createWhiteBoard;
@@ -1993,8 +1999,8 @@ public class ClassViewModel extends ViewModel {
         }
 
         @Override
-        public void onDeviceStateChanged(Integer soundVolume, DeviceType deviceType,String musicScoreAccompanimentId) {
-            deviceSoundValume.postValue(new DeviceSoudValum(soundVolume,deviceType,musicScoreAccompanimentId));
+        public void onDeviceStateChanged(Integer soundVolume, DeviceType deviceType, String musicScoreAccompanimentId) {
+            deviceSoundValume.postValue(new DeviceSoudValum(soundVolume, deviceType, musicScoreAccompanimentId));
         }
 
         @Override
@@ -2232,7 +2238,6 @@ public class ClassViewModel extends ViewModel {
     }
 
 
-
     public void downLoadFile(String url, String filePath, String
             fileName, ResultCallback<Boolean> callback) {
         classRepository.downloadFile(url, filePath, fileName, callback);
@@ -2478,7 +2483,7 @@ public class ClassViewModel extends ViewModel {
             if (user.getUserId().equals(member.getUserId())) {
                 member.setUserName("我");
                 sortList.add(0, member);
-            }  else if (member.getRole() == Role.LECTURER) {
+            } else if (member.getRole() == Role.LECTURER) {
                 sortList.add(member);
             } else if (member.getRole() == Role.STUDENT) {
                 students.add(member);
@@ -2637,7 +2642,7 @@ public class ClassViewModel extends ViewModel {
                             ScreenDisplay value = display.getValue();
                             String displayUserId = value.getUserId();
                             if (value != null && userId.equals(displayUserId)) {
-                                if (!isEnable && (value.getType() == ScreenDisplay.Display.LECTURER  ||
+                                if (!isEnable && (value.getType() == ScreenDisplay.Display.LECTURER ||
                                         (info.getRole() != Role.LECTURER && value.getType() == ScreenDisplay.Display.STUDENT))) {
                                     value.setType(ScreenDisplay.Display.NONE);
                                     display.postValue(value);
@@ -2814,7 +2819,7 @@ public class ClassViewModel extends ViewModel {
         if (!TextUtils.isEmpty(screenDisplay.getUserId()) && screenDisplay.getClassMember() == null) {
             ClassMember classMember = new ClassMember();
             classMember.setUserId(screenDisplay.getUserId());
-             if (screenDisplay.getType() == ScreenDisplay.Display.LECTURER) {
+            if (screenDisplay.getType() == ScreenDisplay.Display.LECTURER) {
                 classMember.setRole(Role.LECTURER.getValue());
             }
             screenDisplay.setClassMember(classMember);
@@ -3329,6 +3334,10 @@ public class ClassViewModel extends ViewModel {
         RtcManager.getInstance().exchangeStreamToTinyStream(userid);
     }
 
+    public void getCoursewareList(String searchStr, int page, CoursewareDataResultCallBack<CoursewareListBean> callBack) {
+        classRepository.getCoursewareList(searchStr, page,callBack);
+    }
+
     @Override
     public void onCleared() {
         super.onCleared();

+ 34 - 0
live_teaching/src/main/java/com/daya/live_teaching/widget/CourseWarePlayView.java

@@ -0,0 +1,34 @@
+package com.daya.live_teaching.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.FrameLayout;
+
+import com.daya.live_teaching.R;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Author by pq, Date on 2022/11/15.
+ */
+public class CourseWarePlayView extends FrameLayout {
+    public CourseWarePlayView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public CourseWarePlayView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, -1);
+    }
+
+    public CourseWarePlayView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    private void init() {
+        LayoutInflater.from(getContext()).inflate(R.layout.view_course_ware_play_layout, this);
+
+    }
+}

+ 49 - 0
live_teaching/src/main/java/com/daya/live_teaching/widget/CoursewareLoadMoreView.java

@@ -0,0 +1,49 @@
+package com.daya.live_teaching.widget;
+
+import android.util.Log;
+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.daya.live_teaching.R;
+
+import androidx.annotation.LayoutRes;
+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;
+    }
+}

+ 181 - 0
live_teaching/src/main/java/com/daya/live_teaching/widget/dialog/CourseWareSelectDialog.java

@@ -0,0 +1,181 @@
+package com.daya.live_teaching.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.daya.live_teaching.R;
+import com.daya.live_teaching.adapter.CoursewareAdapter;
+import com.daya.live_teaching.model.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;
+
+    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) {
+                    onEventListener.onPlayCourseware(selectCourseware.mp3url);
+                }
+            }
+            return;
+        }
+    }
+
+    public interface OnEventListener {
+        void onGetCoursewareData(String searchStr, int page);
+
+        void onPlayCourseware(String coursewareUrl);
+    }
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+}

BIN
live_teaching/src/main/res/drawable-xhdpi/icon_course_ware_search.png


BIN
live_teaching/src/main/res/drawable-xhdpi/icon_courseware_normal.png


BIN
live_teaching/src/main/res/drawable-xhdpi/icon_courseware_select.png


BIN
live_teaching/src/main/res/drawable-xhdpi/icon_courseware_volume.png


BIN
live_teaching/src/main/res/drawable-xhdpi/icon_dialog_close_white.png


BIN
live_teaching/src/main/res/drawable-xhdpi/icon_play_course_ware.png


BIN
live_teaching/src/main/res/drawable-xhdpi/icon_stop_play_course_ware.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_course_ware_search.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_courseware_normal.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_courseware_select.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_courseware_volume.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_dialog_close_white.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_play_course_ware.png


BIN
live_teaching/src/main/res/drawable-xxhdpi/icon_stop_play_course_ware.png


+ 37 - 0
live_teaching/src/main/res/drawable/play_course_ware_seekbar_style.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@android:id/background"
+        android:gravity="center_vertical|fill_horizontal">
+        <shape android:shape="rectangle">
+            <corners android:radius="2dp"/>
+            <size android:height="3dp"/>
+            <solid android:color="@color/white"/>
+        </shape>
+    </item>
+
+    <item
+        android:id="@android:id/secondaryProgress"
+        android:gravity="center_vertical|fill_horizontal">
+        <clip>
+            <shape android:shape="rectangle">
+
+                <corners android:radius="2dp"/>
+                <size android:height="3dp"/>
+                <solid android:color="@color/white"/>
+            </shape>
+        </clip>
+    </item>
+
+    <item
+        android:id="@android:id/progress"
+        android:gravity="center_vertical|fill_horizontal">
+        <clip>
+            <shape android:shape="rectangle">
+                <corners android:radius="2dp"/>
+                <size android:height="3dp"/>
+                <solid android:color="@color/color_ff8000"/>
+            </shape>
+        </clip>
+    </item>
+</layer-list>

+ 5 - 0
live_teaching/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
live_teaching/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
live_teaching/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
live_teaching/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
live_teaching/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
live_teaching/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
live_teaching/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>

+ 9 - 0
live_teaching/src/main/res/drawable/shape_course_ware_play_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:angle="270"
+        android:endColor="@color/color_ffd5aa"
+        android:startColor="@color/color_ffebd3" />
+
+    <corners android:radius="14dp" />
+</shape>

+ 5 - 0
live_teaching/src/main/res/drawable/shape_play_courseware_thumb.xml

@@ -0,0 +1,5 @@
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_ff8000"/>
+    <size android:width="9dp" android:height="9dp"/>
+    <corners android:radius="12dp"/>
+</shape>

+ 11 - 0
live_teaching/src/main/res/layout/activity_live.xml

@@ -163,6 +163,17 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <com.daya.live_teaching.widget.CourseWarePlayView
+        android:id="@+id/view_courseware"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="22dp"
+        android:layout_marginTop="106dp"
+        android:layout_marginEnd="22dp"
+        android:visibility="gone"
+        app:layout_constraintLeft_toLeftOf="@+id/share_screen_fragment"
+        app:layout_constraintRight_toRightOf="@+id/share_screen_fragment"
+        app:layout_constraintTop_toTopOf="parent" />
 
     <FrameLayout
         android:id="@+id/member_list_fragment"

+ 162 - 0
live_teaching/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_dialog_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>

+ 42 - 0
live_teaching/src/main/res/layout/item_courseware_list_layout.xml

@@ -0,0 +1,42 @@
+<?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: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>

+ 119 - 0
live_teaching/src/main/res/layout/view_course_ware_play_layout.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/shape_course_ware_play_bg">
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="12dp"
+        android:paddingTop="9dp"
+        android:paddingBottom="9dp"
+        android:textColor="@color/color_ff8000"
+        android:textSize="@dimen/sp_12"
+        android:textStyle="bold"
+        android:text="课件:诀爱(《苍兰诀》主题曲)"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="课件:诀爱(《苍兰诀》主题曲)" />
+
+    <ImageView
+        android:id="@+id/iv_status_icon"
+        android:layout_width="21dp"
+        android:layout_height="21dp"
+        android:layout_marginEnd="8dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_title"
+        tools:src="@drawable/icon_stop_play_course_ware" />
+
+
+    <TextView
+        android:id="@+id/tv_status_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="11dp"
+        android:textColor="@color/color_ff8000"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_status_icon"
+        app:layout_constraintRight_toLeftOf="@+id/iv_status_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_status_icon"
+        app:layout_goneMarginEnd="8dp"
+        tools:text="正在加载..." />
+
+
+    <ImageView
+        android:id="@+id/iv_play"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:layout_marginBottom="14dp"
+        android:src="@drawable/icon_play_course_ware"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+    <androidx.appcompat.widget.AppCompatSeekBar
+        android:id="@+id/seekbar"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:max="200"
+        android:progress="50"
+        android:paddingStart="6dp"
+        android:paddingEnd="6dp"
+        android:progressDrawable="@drawable/play_course_ware_seekbar_style"
+        android:thumb="@drawable/shape_play_courseware_thumb"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_play"
+        app:layout_constraintLeft_toRightOf="@+id/iv_play"
+        app:layout_constraintRight_toLeftOf="@+id/tv_progress"
+        app:layout_constraintTop_toTopOf="@+id/iv_play" />
+
+    <ImageView
+        android:id="@+id/iv_volume"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_marginEnd="8dp"
+        android:src="@drawable/icon_courseware_volume"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_play"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/iv_play" />
+
+    <TextView
+        android:id="@+id/tv_volume_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingEnd="3dp"
+        android:text="音量"
+        android:textColor="@color/color_ff8000"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_volume"
+        app:layout_constraintRight_toLeftOf="@+id/iv_volume"
+        app:layout_constraintTop_toTopOf="@+id/iv_volume" />
+
+
+    <TextView
+        android:id="@+id/tv_progress"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="27dp"
+        android:includeFontPadding="false"
+        android:text="00:00/00:00"
+        android:textColor="@color/color_ff8000"
+        android:textSize="@dimen/sp_11"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_play"
+        app:layout_constraintRight_toLeftOf="@+id/tv_volume_text"
+        app:layout_constraintTop_toTopOf="@+id/iv_play"
+        tools:text="02:38/04:20" />
+
+    <androidx.constraintlayout.widget.Group
+        android:id="@+id/group_play_info"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone"
+        app:constraint_referenced_ids="tv_progress,tv_volume_text,iv_volume,seekbar,iv_play" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 86 - 0
live_teaching/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>