浏览代码

增加直播回放

Pq 3 年之前
父节点
当前提交
8066d926f0

+ 11 - 0
teacher/src/main/java/com/cooleshow/teacher/api/APIService.java

@@ -4,6 +4,7 @@ import com.common.im.bean.ContactRoomListBean;
 import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.teacher.bean.HomeLiveAndVideoBean;
 import com.cooleshow.teacher.bean.LiveListBean;
+import com.cooleshow.teacher.bean.LivePlayBackDataBean;
 import com.cooleshow.teacher.bean.request.AssignHomeWorkEntry;
 import com.cooleshow.teacher.bean.request.CommentHomeWorkEntry;
 import com.cooleshow.teacher.bean.request.LiveCourseEntry;
@@ -51,6 +52,7 @@ import com.cooleshow.teacher.bean.request.UnBindCardEntry;
 import com.cooleshow.usercenter.bean.SetDetailBean;
 import com.cooleshow.usercenter.bean.UserInfo;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -634,6 +636,15 @@ public interface APIService {
     Observable<BaseResponse<LiveListBean>> getLiveListData(@Body RequestBody body);
 
     /**
+     * 获取直播间列表信息
+     *
+     * @return
+     */
+    @GET(TEACHER_GROUP + "liveRoomVideo/queryVideo")
+    Observable<BaseResponse<ArrayList<LivePlayBackDataBean>>> getLivePlaybackData(@Query("roomUid") String  roomUid);
+
+
+    /**
      * 查询直播房间信息
      *
      * @return

+ 33 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/LivePlayBackDataBean.java

@@ -0,0 +1,33 @@
+package com.cooleshow.teacher.bean;
+
+import java.io.Serializable;
+
+/**
+ * Author by pq, Date on 2022/7/7.
+ */
+public class LivePlayBackDataBean {
+
+    /**
+     * courseGroupId : 0
+     * courseId : 0
+     * createdTime :
+     * endTime :
+     * id : 0
+     * recordId :
+     * roomUid :
+     * startTime :
+     * type : 0
+     * url :
+     */
+
+    public int courseGroupId;
+    public int courseId;
+    public String createdTime;
+    public String endTime;
+    public int id;
+    public String recordId;
+    public String roomUid;
+    public String startTime;
+    public int type;
+    public String url;
+}

+ 5 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/LiveListContract.java

@@ -2,6 +2,9 @@ package com.cooleshow.teacher.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
 import com.cooleshow.teacher.bean.LiveListBean;
+import com.cooleshow.teacher.bean.LivePlayBackDataBean;
+
+import java.util.ArrayList;
 
 /**
  * 创建日期:2022/5/20 15:02
@@ -12,6 +15,8 @@ import com.cooleshow.teacher.bean.LiveListBean;
 public interface LiveListContract {
     interface LiveListView extends BaseView {
         void getListDataSuccess(int page, LiveListBean liveListBean);
+
+        void getPlaybackDataSuccess(ArrayList<LivePlayBackDataBean> datas);
     }
 
     interface Presenter {

+ 31 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/live/LiveListPresenter.java

@@ -8,11 +8,16 @@ import com.cooleshow.base.utils.ErrorParse;
 import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.teacher.api.APIService;
 import com.cooleshow.teacher.bean.LiveListBean;
+import com.cooleshow.teacher.bean.LivePlayBackDataBean;
 import com.cooleshow.teacher.contract.LiveListContract;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Author by pq, Date on 2022/7/7.
  */
@@ -52,4 +57,30 @@ public class LiveListPresenter extends BasePresenter<LiveListContract.LiveListVi
         });
     }
 
+
+    /**
+     * 获取直播回放数据
+     *
+     * @param roomUid
+     */
+    public void getLivePlaybackData(String roomUid) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        addSubscribe(create(APIService.class).getLivePlaybackData(roomUid), new BaseObserver<ArrayList<LivePlayBackDataBean>>(getView()) {
+            @Override
+            protected void onSuccess(ArrayList<LivePlayBackDataBean> data) {
+                if (getView() != null) {
+                    getView().getPlaybackDataSuccess(data);
+                }
+            }
+
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
+        });
+    }
+
 }

+ 38 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/live/LiveListFragment.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.ui.live;
 
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.view.View;
 
 import com.chad.library.adapter.base.BaseQuickAdapter;
@@ -9,17 +10,21 @@ import com.chad.library.adapter.base.listener.OnLoadMoreListener;
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.ui.fragment.BaseFragment;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.widgets.EmptyViewLayout;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.LiveListAdapter;
 import com.cooleshow.teacher.bean.LiveListBean;
+import com.cooleshow.teacher.bean.LivePlayBackDataBean;
 import com.cooleshow.teacher.contract.LiveListContract;
 import com.cooleshow.teacher.databinding.FragmentLiveListOnLayoutBinding;
 import com.cooleshow.teacher.presenter.live.LiveListPresenter;
 import com.cooleshow.teacher.ui.work.HomeWorkFragment;
+import com.cooleshow.teacher.widgets.dialog.LivePlaybackDialog;
 import com.scwang.smart.refresh.layout.api.RefreshLayout;
 import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import androidx.annotation.NonNull;
@@ -36,6 +41,7 @@ public class LiveListFragment extends BaseMVPFragment<FragmentLiveListOnLayoutBi
     private LiveListAdapter mLiveListAdapter;
     private boolean hasNext = true;
     private EmptyViewLayout mEmptyView;
+    private LivePlaybackDialog mLivePlaybackDialog;
 
     public static LiveListFragment newInstance(String liveStatusTag) {
         Bundle args = new Bundle();
@@ -83,6 +89,7 @@ public class LiveListFragment extends BaseMVPFragment<FragmentLiveListOnLayoutBi
                     }
                     if (view.getId() == R.id.tv_look_playback) {
                         //查看回放
+                        getLivePlaybackData(rowsBean.roomUid);
                         return;
                     }
                 }
@@ -116,12 +123,31 @@ public class LiveListFragment extends BaseMVPFragment<FragmentLiveListOnLayoutBi
         getData(true);
     }
 
+    private void showPlayBackDialog(ArrayList<LivePlayBackDataBean> datas) {
+        if (mLivePlaybackDialog == null) {
+            mLivePlaybackDialog = new LivePlaybackDialog(getContext());
+        }
+        if (!mLivePlaybackDialog.isShowing()) {
+            mLivePlaybackDialog.show();
+            mLivePlaybackDialog.setData(datas);
+        }
+    }
+
     private void getData(boolean isShowLoading) {
         if (presenter != null) {
             presenter.getLiveListData(isShowLoading, mLiveTag, currentPage);
         }
     }
 
+    private void getLivePlaybackData(String roomId) {
+        if (TextUtils.isEmpty(roomId)) {
+            return;
+        }
+        if (presenter != null) {
+            presenter.getLivePlaybackData(roomId);
+        }
+    }
+
     @Override
     public void getListDataSuccess(int page, LiveListBean liveListBean) {
         if (isDetached()) {
@@ -154,6 +180,18 @@ public class LiveListFragment extends BaseMVPFragment<FragmentLiveListOnLayoutBi
         }
     }
 
+    @Override
+    public void getPlaybackDataSuccess(ArrayList<LivePlayBackDataBean> datas) {
+        if (isDetached()) {
+            return;
+        }
+        if (datas != null && datas.size() > 0) {
+            showPlayBackDialog(datas);
+        } else {
+            ToastUtil.getInstance().showShort("暂无回放");
+        }
+    }
+
 
     /**
      * 显示空视图

+ 79 - 0
teacher/src/main/java/com/cooleshow/teacher/widgets/dialog/LivePlaybackDialog.java

@@ -0,0 +1,79 @@
+package com.cooleshow.teacher.widgets.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.ui.video.VideoPlayActivity;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.bean.LivePlayBackDataBean;
+import com.cooleshow.teacher.widgets.VideoCourseListItemDecoration;
+
+import java.util.ArrayList;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Size;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2022/7/7.
+ */
+public class LivePlaybackDialog extends Dialog {
+
+    private Adapter mAdapter;
+
+    public LivePlaybackDialog(@NonNull Context context) {
+        super(context, com.cooleshow.base.R.style.DialogStyle);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_live_play_back_layout);
+        RecyclerView recyclerView = findViewById(R.id.recyclerView);
+        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
+        VideoCourseListItemDecoration itemDecoration = new VideoCourseListItemDecoration(SizeUtils.dp2px(9), 0, 0, 0, SizeUtils.dp2px(7));
+        recyclerView.addItemDecoration(itemDecoration);
+        recyclerView.setLayoutManager(gridLayoutManager);
+        mAdapter = new Adapter(R.layout.item_live_playback_layout);
+        recyclerView.setAdapter(mAdapter);
+        mAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mAdapter.getData().size()) {
+                    LivePlayBackDataBean livePlayBackDataBean = mAdapter.getData().get(position);
+                    VideoPlayActivity.start(getContext(), livePlayBackDataBean.url);
+                }
+            }
+        });
+    }
+
+    public void setData(ArrayList<LivePlayBackDataBean> datas) {
+        if (mAdapter != null) {
+            mAdapter.setNewInstance(datas);
+        }
+    }
+
+    private class Adapter extends BaseQuickAdapter<LivePlayBackDataBean, BaseViewHolder> {
+
+        public Adapter(int layoutResId) {
+            super(layoutResId);
+        }
+
+        @Override
+        protected void convert(@NonNull BaseViewHolder holder, LivePlayBackDataBean livePlayBackDataBean) {
+            ImageView iv_bg = holder.getView(R.id.iv_bg);
+            GlideUtils.INSTANCE.loadVideoThumbnail(getContext(), livePlayBackDataBean.url, iv_bg);
+            holder.setText(R.id.tv_time, UiUtils.getCourseTimeString(livePlayBackDataBean.startTime, livePlayBackDataBean.endTime));
+        }
+    }
+}

二进制
teacher/src/main/res/drawable-xhdpi/bg_live_play_back.png


二进制
teacher/src/main/res/drawable-xxhdpi/bg_live_play_back.png


+ 51 - 0
teacher/src/main/res/layout/dialog_live_play_back_layout.xml

@@ -0,0 +1,51 @@
+<?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="300dp"
+    android:background="@drawable/bg_white_5dp"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/iv_icon"
+        android:layout_width="4dp"
+        android:layout_height="@dimen/dp_18"
+        android:layout_marginStart="@dimen/dp_20"
+        android:layout_marginTop="@dimen/dp_24"
+        android:background="@drawable/btn_green_stu_line_shape"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/dp_7"
+        android:layout_marginEnd="@dimen/dp_16"
+        android:text="确定退课吗?"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/dp_18"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toBottomOf="@id/iv_icon"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/iv_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/dp_15"
+        android:background="@color/white"
+        android:overScrollMode="never"
+        android:scrollbars="none"
+        android:visibility="visible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title"
+        app:layout_goneMarginTop="@dimen/dp_15" />
+
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 32 - 0
teacher/src/main/res/layout/item_live_playback_layout.xml

@@ -0,0 +1,32 @@
+<?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">
+
+    <ImageView
+        android:id="@+id/iv_bg"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:adjustViewBounds="true"
+        android:src="@drawable/bg_live_play_back"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:paddingTop="10dp"
+        android:paddingBottom="10dp"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_11"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_bg"
+        app:layout_constraintRight_toRightOf="@+id/iv_bg"
+        app:layout_constraintTop_toBottomOf="@+id/iv_bg"
+        tools:text="2022/06/30 16:00-16:20" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>