Browse Source

timeout ui

zhaoyadi 2 years ago
parent
commit
035a914bd0
33 changed files with 208 additions and 38 deletions
  1. 3 1
      .idea/misc.xml
  2. 6 0
      kit/src/main/java/com/tencent/liteav/demo/superplayer/SuperPlayerDef.java
  3. 0 17
      kit/src/main/java/com/tencent/liteav/demo/superplayer/SuperPlayerVideoId.java
  4. 22 2
      kit/src/main/java/com/tencent/liteav/demo/superplayer/ui/player/FullScreenPlayer.java
  5. 23 5
      kit/src/main/java/com/tencent/liteav/demo/superplayer/ui/player/TimeOutPlayer.java
  6. 6 0
      kit/src/main/kotlin/com/tencent/liteav/demo/superplayer/database/dao/HistoryDao.kt
  7. 15 0
      kit/src/main/kotlin/com/tencent/liteav/demo/superplayer/database/repo/PlayerRepository.kt
  8. 11 0
      kit/src/main/res/drawable/timeout_back_chapter_deco.xml
  9. 10 0
      kit/src/main/res/drawable/timeout_resume_deco.xml
  10. 6 0
      kit/src/main/res/layout/superplayer_vod_player_fullscreen.xml
  11. 78 1
      kit/src/main/res/layout/superplayer_vod_player_timeout.xml
  12. BIN
      kit/src/main/res/mipmap-hdpi/timeout_bg.png
  13. BIN
      kit/src/main/res/mipmap-hdpi/timeout_logo.png
  14. BIN
      kit/src/main/res/mipmap-hdpi/timeout_resume.png
  15. BIN
      kit/src/main/res/mipmap-hdpi/window_back.png
  16. BIN
      kit/src/main/res/mipmap-mdpi/timeout_bg.png
  17. BIN
      kit/src/main/res/mipmap-mdpi/timeout_logo.png
  18. BIN
      kit/src/main/res/mipmap-mdpi/timeout_resume.png
  19. BIN
      kit/src/main/res/mipmap-mdpi/window_back.png
  20. BIN
      kit/src/main/res/mipmap-xhdpi/timeout_bg.png
  21. BIN
      kit/src/main/res/mipmap-xhdpi/timeout_logo.png
  22. BIN
      kit/src/main/res/mipmap-xhdpi/timeout_resume.png
  23. BIN
      kit/src/main/res/mipmap-xhdpi/window_back.png
  24. BIN
      kit/src/main/res/mipmap-xxhdpi/timeout_bg.png
  25. BIN
      kit/src/main/res/mipmap-xxhdpi/timeout_logo.png
  26. BIN
      kit/src/main/res/mipmap-xxhdpi/timeout_resume.png
  27. BIN
      kit/src/main/res/mipmap-xxhdpi/window_back.png
  28. BIN
      kit/src/main/res/mipmap-xxxhdpi/timeout_bg.png
  29. BIN
      kit/src/main/res/mipmap-xxxhdpi/timeout_logo.png
  30. BIN
      kit/src/main/res/mipmap-xxxhdpi/timeout_resume.png
  31. BIN
      kit/src/main/res/mipmap-xxxhdpi/window_back.png
  32. 13 12
      ui/src/main/kotlin/com/tencent/liteav/demo/player/PlayerActivity.kt
  33. 15 0
      ui/src/main/kotlin/com/tencent/liteav/demo/player/viewmodel/PlayerViewModel.kt

+ 3 - 1
.idea/misc.xml

@@ -17,6 +17,8 @@
         <entry key="..\:/demo/.android/Player_Android/Demo/app/src/main/res/layout/module_entry_child_item.xml" value="0.3079710144927536" />
         <entry key="..\:/demo/.android/Player_Android/Demo/app/src/main/res/layout/module_entry_item.xml" value="0.3079710144927536" />
         <entry key="..\:/demo/.android/Player_Android/Demo/app/src/main/res/layout/module_trtc_entry_item.xml" value="0.3079710144927536" />
+        <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/drawable/player_timeout_back_chapter_deco.xml" value="0.274" />
+        <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/drawable/player_timeout_resume_deco.xml" value="0.274" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/drawable/superplayer_item_vod.xml" value="0.2115" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/drawable/superplayer_laylist_vod_video_progress.xml" value="0.1675" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/drawable/superplayer_shadow_bottom.xml" value="0.2115" />
@@ -26,7 +28,7 @@
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_video_progress_layout.xml" value="0.115625" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_video_volume_brightness_progress_layout.xml" value="0.22370218579234974" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_vod_player_fullscreen.xml" value="0.12578125" />
-        <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_vod_player_timeout.xml" value="0.1443850267379679" />
+        <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_vod_player_timeout.xml" value="0.1" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_vod_player_window.xml" value="0.12578125" />
         <entry key="..\:/demo/.android/Player_Android/Demo/kit/src/main/res/layout/superplayer_vod_view.xml" value="0.1" />
         <entry key="..\:/demo/.android/Player_Android/Demo/superplayerdemo/src/main/res/drawable/player_short_video_time.xml" value="0.2535" />

+ 6 - 0
kit/src/main/java/com/tencent/liteav/demo/superplayer/SuperPlayerDef.java

@@ -25,4 +25,10 @@ public class SuperPlayerDef {
         LANDSCAPE,  // 横屏
         PORTRAIT    // 竖屏
     }
+
+    public enum TimeoutState {
+        RUNNING,
+        TIMEOUT,
+        NO_CONFIG,
+    }
 }

+ 0 - 17
kit/src/main/java/com/tencent/liteav/demo/superplayer/SuperPlayerVideoId.java

@@ -1,17 +0,0 @@
-package com.tencent.liteav.demo.superplayer;
-
-/**
- * Created by hans on 2019/3/25.
- * 使用腾讯云fileId播放
- */
-public class SuperPlayerVideoId {
-    public String           fileId;                             // 腾讯云视频fileId
-    public String           pSign;                              // v4 开启防盗链必填
-
-    @Override
-    public String toString() {
-        return "SuperPlayerVideoId{" +
-                ", fileId='" + fileId + '\'' +
-                ", pSign='" + pSign + '}';
-    }
-}

+ 22 - 2
kit/src/main/java/com/tencent/liteav/demo/superplayer/ui/player/FullScreenPlayer.java

@@ -27,6 +27,7 @@ public class FullScreenPlayer extends AbsPlayer implements UnlockProgressView.On
     private UnlockProgressView mIvLock;                                // 锁屏按钮
     private TextView mIvLockText;
     private ImageView mImageCover;                            // 封面图
+    private TimeOutPlayer mTimeoutView;
 
     private boolean isShowing;  // 自身是否可见
     private SuperPlayerDef.PlayerState mCurrentPlayState = SuperPlayerDef.PlayerState.END; // 当前播放状态
@@ -65,14 +66,23 @@ public class FullScreenPlayer extends AbsPlayer implements UnlockProgressView.On
         mIvLock.setUnlockListener(this);
 
         mIvLockText = (TextView) findViewById(R.id.superplayer_iv_lock_text);
-
         mImageCover = (ImageView) findViewById(R.id.superplayer_cover_view);
+        mTimeoutView = (TimeOutPlayer) findViewById(R.id.superplayer_timeout_view);
     }
 
     public void setPlayNextButtonVisibility(boolean isShowing) {
 
     }
 
+    public void setTimeoutState(SuperPlayerDef.TimeoutState state) {
+        if (state == SuperPlayerDef.TimeoutState.TIMEOUT) {
+            hide();
+            mTimeoutView.setVisibility(VISIBLE);
+        } else {
+            mTimeoutView.setVisibility(GONE);
+        }
+    }
+
     public void preparePlayVideo(SuperPlayerModel superPlayerModel) {
         updateTitle(superPlayerModel.title);
         if (!isDestroy) {
@@ -126,6 +136,16 @@ public class FullScreenPlayer extends AbsPlayer implements UnlockProgressView.On
         mCurrentPlayState = playState;
     }
 
+    @Override
+    public void setBackground(Bitmap bitmap) {
+        mImageCover.setImageBitmap(bitmap);
+    }
+
+    @Override
+    public void showBackground() {
+        mImageCover.setVisibility(VISIBLE);
+    }
+
     /**
      * 更新视频名称
      *
@@ -133,7 +153,7 @@ public class FullScreenPlayer extends AbsPlayer implements UnlockProgressView.On
      */
     @Override
     public void updateTitle(String title) {
-
+        // DO NOTHING UNLESS NEED
     }
 
     /**

+ 23 - 5
kit/src/main/java/com/tencent/liteav/demo/superplayer/ui/player/TimeOutPlayer.java

@@ -4,31 +4,49 @@ import android.content.Context;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.appcompat.widget.LinearLayoutCompat;
 
 import com.tencent.liteav.demo.superplayer.R;
 
-public class TimeOutPlayer extends AbsPlayer implements View.OnClickListener{
+public class TimeOutPlayer extends AbsPlayer implements View.OnClickListener {
+    private ImageView backHome;
+    private LinearLayoutCompat resumePlay;
+    private TextView returnHome;
+
 
     public TimeOutPlayer(Context context) {
-        this(context,null);
+        this(context, null);
     }
 
     public TimeOutPlayer(Context context, AttributeSet attrs) {
-        this(context, attrs,0);
+        this(context, attrs, 0);
     }
 
     public TimeOutPlayer(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
+        initView(context, attrs);
     }
 
-    private void initView(Context context,AttributeSet attrs){
-        LayoutInflater.from(context).inflate(R.layout.superplayer_vod_player_window, this);
+    private void initView(Context context, AttributeSet attrs) {
+        LayoutInflater.from(context).inflate(R.layout.superplayer_vod_player_timeout, this);
 
+        backHome = findViewById(R.id.timeout_back);
+        resumePlay = findViewById(R.id.timeout_resume);
+        returnHome = findViewById(R.id.timeout_return);
     }
 
     @Override
     public void onClick(View v) {
+        final int id = v.getId();
+
+        if (id == R.id.timeout_back || id == R.id.timeout_return) {
+
+        } else if (id == R.id.timeout_resume) {
 
+        }
     }
 
     @Override

+ 6 - 0
kit/src/main/kotlin/com/tencent/liteav/demo/superplayer/database/dao/HistoryDao.kt

@@ -17,4 +17,10 @@ public interface HistoryDao {
 
     @Insert
     fun insertHistories(vararg histories: History)
+
+    @Query("SELECT COUNT(DISTINCT(section_id)) FROM History WHERE date = :date")
+    fun queryTodayEpisodeHistory(date: String): Flow<Int>
+
+    @Query("SELECT * FROM History WHERE date = :date")
+    fun queryTodayDurationHistory(date: String): Flow<List<History>>
 }

+ 15 - 0
kit/src/main/kotlin/com/tencent/liteav/demo/superplayer/database/repo/PlayerRepository.kt

@@ -5,11 +5,16 @@ import com.tencent.liteav.demo.superplayer.database.dao.HistoryDao
 import com.tencent.liteav.demo.superplayer.database.entity.CountDown
 import com.tencent.liteav.demo.superplayer.database.entity.History
 import kotlinx.coroutines.flow.Flow
+import java.text.SimpleDateFormat
+import java.util.*
 
 public class PlayerRepository(
     private val historyDao: HistoryDao,
     private val countDownDao: CountDownDao,
 ) {
+    companion object {
+        val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.SIMPLIFIED_CHINESE)
+    }
 
     suspend fun insertHistory(history: History) {
         historyDao.insertHistory(history)
@@ -22,4 +27,14 @@ public class PlayerRepository(
     suspend fun findHasCountDown(courseId: String): Flow<CountDown?> {
         return countDownDao.getCountDownByCourseId(courseId)
     }
+
+    suspend fun queryTodayEpisodeHistory(): Flow<Int> {
+        val date = dateFormat.format(Date())
+        return historyDao.queryTodayEpisodeHistory(date)
+    }
+
+    suspend fun queryTodayDurationHistory(): Flow<List<History>> {
+        val date = dateFormat.format(Date())
+        return historyDao.queryTodayDurationHistory(date)
+    }
 }

+ 11 - 0
kit/src/main/res/drawable/timeout_back_chapter_deco.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#ff0b57c7" />
+    <corners android:radius="20dp" />
+    <padding
+        android:bottom="10dp"
+        android:left="18dp"
+        android:right="18dp"
+        android:top="10dp" />
+</shape>

+ 10 - 0
kit/src/main/res/drawable/timeout_resume_deco.xml

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

+ 6 - 0
kit/src/main/res/layout/superplayer_vod_player_fullscreen.xml

@@ -37,4 +37,10 @@
         android:src="@mipmap/default_cover_dark"
         android:visibility="gone" />
 
+    <com.tencent.liteav.demo.superplayer.ui.player.TimeOutPlayer
+        android:id="@+id/superplayer_timeout_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone" />
+
 </RelativeLayout>

+ 78 - 1
kit/src/main/res/layout/superplayer_vod_player_timeout.xml

@@ -1,10 +1,87 @@
 <?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="match_parent"
     android:layout_height="match_parent">
 
     <ImageView
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        android:scaleType="centerCrop"
+        android:src="@mipmap/timeout_bg" />
+
+    <ImageView
+        android:id="@+id/timeout_back"
+        android:layout_width="38dp"
+        android:layout_height="39dp"
+        android:layout_marginLeft="38dp"
+        android:layout_marginTop="20dp"
+        android:src="@mipmap/window_back"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.appcompat.widget.LinearLayoutCompat
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <ImageView
+            android:layout_width="182dp"
+            android:layout_height="182dp"
+            android:layout_gravity="center_horizontal"
+            android:src="@mipmap/timeout_logo" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="25dp"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="23dp"
+            android:text="小朋友定时观看时间到了,让眼睛休息一下吧"
+            android:textColor="#ff0b57c7"
+            android:textSize="18sp" />
+
+        <TextView
+            android:id="@+id/timeout_return"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="17dp"
+            android:background="@drawable/timeout_back_chapter_deco"
+            android:text="回到章节目录"
+            android:textColor="#ffffffff"
+            android:textSize="14sp" />
+
+    </androidx.appcompat.widget.LinearLayoutCompat>
+
+    <androidx.appcompat.widget.LinearLayoutCompat
+        android:id="@+id/timeout_resume"
+        android:layout_width="wrap_content"
+        android:layout_height="46dp"
+        android:layout_marginTop="15dp"
+        android:background="@drawable/timeout_resume_deco"
+        android:paddingLeft="20dp"
+        android:paddingRight="24dp"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <ImageView
+            android:layout_width="16dp"
+            android:layout_height="16dp"
+            android:layout_gravity="center_vertical"
+            android:layout_marginRight="8dp"
+            android:src="@mipmap/timeout_resume" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="21dp"
+            android:layout_gravity="center_vertical"
+            android:text="继续播放"
+            android:textColor="#ffffffff"
+            android:textSize="15sp" />
+    </androidx.appcompat.widget.LinearLayoutCompat>
 
 </androidx.constraintlayout.widget.ConstraintLayout>

BIN
kit/src/main/res/mipmap-hdpi/timeout_bg.png


BIN
kit/src/main/res/mipmap-hdpi/timeout_logo.png


BIN
kit/src/main/res/mipmap-hdpi/timeout_resume.png


BIN
kit/src/main/res/mipmap-hdpi/window_back.png


BIN
kit/src/main/res/mipmap-mdpi/timeout_bg.png


BIN
kit/src/main/res/mipmap-mdpi/timeout_logo.png


BIN
kit/src/main/res/mipmap-mdpi/timeout_resume.png


BIN
kit/src/main/res/mipmap-mdpi/window_back.png


BIN
kit/src/main/res/mipmap-xhdpi/timeout_bg.png


BIN
kit/src/main/res/mipmap-xhdpi/timeout_logo.png


BIN
kit/src/main/res/mipmap-xhdpi/timeout_resume.png


BIN
kit/src/main/res/mipmap-xhdpi/window_back.png


BIN
kit/src/main/res/mipmap-xxhdpi/timeout_bg.png


BIN
kit/src/main/res/mipmap-xxhdpi/timeout_logo.png


BIN
kit/src/main/res/mipmap-xxhdpi/timeout_resume.png


BIN
kit/src/main/res/mipmap-xxhdpi/window_back.png


BIN
kit/src/main/res/mipmap-xxxhdpi/timeout_bg.png


BIN
kit/src/main/res/mipmap-xxxhdpi/timeout_logo.png


BIN
kit/src/main/res/mipmap-xxxhdpi/timeout_resume.png


BIN
kit/src/main/res/mipmap-xxxhdpi/window_back.png


+ 13 - 12
ui/src/main/kotlin/com/tencent/liteav/demo/player/PlayerActivity.kt

@@ -22,6 +22,9 @@ import com.tencent.liteav.demo.superplayer.SuperPlayerView.OnSuperPlayerViewCall
 import com.tencent.liteav.demo.superplayer.database.PlayerDatabaseProvider
 import com.tencent.liteav.demo.superplayer.database.entity.History
 import com.tencent.rtmp.TXLiveConstants
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.launch
 import java.text.SimpleDateFormat
 import java.util.*
 
@@ -32,7 +35,8 @@ import java.util.*
 class PlayerActivity : AppCompatActivity(),
     View.OnClickListener,
     OnSuperPlayerViewCallback,
-    PlayerListAdapter.OnItemClickListener {
+    PlayerListAdapter.OnItemClickListener,
+    CoroutineScope by MainScope() {
 
     private var _viewBinding: ActivityPlayerBinding? = null
     private val viewBinding get() = _viewBinding!!
@@ -218,21 +222,18 @@ class PlayerActivity : AppCompatActivity(),
         }
     }
 
-    override fun onPlaying() {}
+
     override fun onPlayIndex(index: Int, model: SuperPlayerModel) {
-        viewModel.saveHistory(
-            History(
-                start = 0,
-                end = 10,
-                courseId = "0",
-                sectionId = model.title!!,
-                date = SimpleDateFormat("yyyy-MM-dd").format(Date())
-            )
-        )
-        mVodPlayerListAdapter.setIndex(index)
+        launch {
+            viewModel.changeModel(model)
+            mVodPlayerListAdapter.setIndex(index)
+        }
     }
 
     override fun onPlayEnd() {}
+
+    override fun onPlaying() {}
+
     override fun onError(code: Int) {}
 
     companion object {

+ 15 - 0
ui/src/main/kotlin/com/tencent/liteav/demo/player/viewmodel/PlayerViewModel.kt

@@ -7,12 +7,15 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
 import com.tencent.liteav.demo.player.util.PlayerTimerUtil
+import com.tencent.liteav.demo.superplayer.SuperPlayerModel
 import com.tencent.liteav.demo.superplayer.database.entity.CountDown
 import com.tencent.liteav.demo.superplayer.database.entity.History
 import com.tencent.liteav.demo.superplayer.database.repo.PlayerRepository
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.launch
+import java.text.SimpleDateFormat
+import java.util.*
 
 class PlayerViewModel(
     private val repository: PlayerRepository
@@ -53,6 +56,18 @@ class PlayerViewModel(
         }
     }
 
+    fun changeModel(model: SuperPlayerModel) {
+        val history = History(
+            start = 0,
+            end = 10,
+            courseId = "0",
+            sectionId = model.title!!,
+            date = SimpleDateFormat("yyyy-MM-dd").format(Date())
+        )
+
+        saveHistory(history)
+    }
+
     override fun onListen(type: Int, value: Int) {
         Log.d("PVM", "onListen: $type , $value")