소스 검색

YCVideoPlayer

yangchong 7 년 전
부모
커밋
482203aaa3
100개의 변경된 파일4915개의 추가작업 그리고 645개의 파일을 삭제
  1. 3 3
      YCVideoPlayerLib/build.gradle
  2. 48 13
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/AbsVideoPlayerController.java
  3. 2 14
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/ChangeClarityDialog.java
  4. 23 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/ConstantKeys.java
  5. 21 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/OnClarityChangedListener.java
  6. 15 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/OnMemberClickListener.java
  7. 12 3
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoClarity.java
  8. 14 4
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoLogUtil.java
  9. 49 8
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayer.java
  10. 352 69
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerController.java
  11. 35 10
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerManager.java
  12. 15 10
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerUtils.java
  13. BIN
      YCVideoPlayerLib/src/main/res/drawable-xhdpi/ic_common_back.png
  14. BIN
      YCVideoPlayerLib/src/main/res/drawable-xhdpi/ic_try_see_img_normal.png
  15. BIN
      YCVideoPlayerLib/src/main/res/drawable-xhdpi/ic_try_see_img_pressed.png
  16. BIN
      YCVideoPlayerLib/src/main/res/drawable-xhdpi/pb_loading_bg.png
  17. 7 0
      YCVideoPlayerLib/src/main/res/drawable/pb_loading_ring.xml
  18. 5 0
      YCVideoPlayerLib/src/main/res/drawable/selector_details_try_see.xml
  19. 9 0
      YCVideoPlayerLib/src/main/res/drawable/selector_try_see.xml
  20. 11 0
      YCVideoPlayerLib/src/main/res/drawable/shape_details_try_see.xml
  21. 23 279
      YCVideoPlayerLib/src/main/res/layout/custom_video_player.xml
  22. 65 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_bottom.xml
  23. 26 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_change_brightness.xml
  24. 29 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_change_position.xml
  25. 26 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_change_volume.xml
  26. 32 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_completed.xml
  27. 30 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_error.xml
  28. 30 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_loading.xml
  29. 48 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_top.xml
  30. 30 0
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_try_see.xml
  31. 14 13
      app/build.gradle
  32. 12 3
      app/src/main/AndroidManifest.xml
  33. 14 0
      app/src/main/java/org/yczbj/ycvideoplayer/api/ConstantImage.java
  34. 25 0
      app/src/main/java/org/yczbj/ycvideoplayer/api/ConstantVideo.java
  35. 12 7
      app/src/main/java/org/yczbj/ycvideoplayer/base/AppManager.java
  36. 24 1
      app/src/main/java/org/yczbj/ycvideoplayer/base/BaseApplication.java
  37. 21 0
      app/src/main/java/org/yczbj/ycvideoplayer/download/TaskViewHolderImp.java
  38. 226 0
      app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManager.java
  39. 75 0
      app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManagerDBController.java
  40. 52 0
      app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManagerDBOpenHelper.java
  41. 68 0
      app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManagerModel.java
  42. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/find/view/FindFragment.java
  43. 0 5
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/contract/HomeContract.java
  44. 2 2
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/contract/VideoPlayerJzContract.java
  45. 3 2
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/contract/VideoPlayerMeContract.java
  46. 61 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/model/DialogListBean.java
  47. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/model/VideoPlayerComment.java
  48. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/model/VideoPlayerFavorite.java
  49. 0 6
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/HomePresenter.java
  50. 3 4
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/VideoPlayerJzPresenter.java
  51. 14 3
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/VideoPlayerMePresenter.java
  52. 94 11
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerJzActivity.java
  53. 107 15
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerMeActivity.java
  54. 3 3
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/BannerPagerAdapter.java
  55. 117 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/DialogListAdapter.java
  56. 458 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/DownloadVideoAdapter.java
  57. 2 3
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/NarrowImageAdapter.java
  58. 2 3
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/VideoPlayerMeAdapter.java
  59. 32 13
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/fragment/HomeFragment.java
  60. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/MainContract.java
  61. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/MainPresenter.java
  62. 30 4
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/MainActivity.java
  63. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeFragment.java
  64. 58 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeLoginActivity.java
  65. 56 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeMemberActivity.java
  66. 14 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/other/HomeBean.java
  67. 310 5
      app/src/main/java/org/yczbj/ycvideoplayer/ui/special/SpecialFragment.java
  68. 28 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/special/contract/SpecialContract.java
  69. 62 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/special/model/SpecialBean.java
  70. 57 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/special/presenter/SpecialPresenter.java
  71. 41 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/special/view/SpecialAdapter.java
  72. 114 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/MyVideoPlayer.java
  73. 370 23
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/TestMyActivity.java
  74. 0 51
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/model/DataUtil.java
  75. 8 8
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFirstActivity.java
  76. 18 9
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFiveActivity.java
  77. 2 2
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFourActivity.java
  78. 15 6
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFourFragment.java
  79. 2 2
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMySecondActivity.java
  80. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMySixActivity.java
  81. 13 4
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMySixFragment.java
  82. 17 6
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyThirdActivity.java
  83. 14 10
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/VideoAdapter.java
  84. 10 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLHybridTestActivity.java
  85. 10 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLManyTestActivity.java
  86. 10 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLMyFileTestActivity.java
  87. 10 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLNotificationTestActivity.java
  88. 380 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLSingleTestActivity.java
  89. 267 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/GlideCropActivity.java
  90. 413 0
      app/src/main/java/org/yczbj/ycvideoplayer/util/AppUtil.java
  91. 76 0
      app/src/main/java/org/yczbj/ycvideoplayer/util/ImageCropUtils.java
  92. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/util/ImageUtil.java
  93. 101 0
      app/src/main/java/org/yczbj/ycvideoplayer/weight/HeightTransformation.java
  94. BIN
      app/src/main/res/drawable-xhdpi/btn_download.png
  95. BIN
      app/src/main/res/drawable-xhdpi/icon_cache_delete.png
  96. BIN
      app/src/main/res/drawable-xhdpi/icon_cache_download.png
  97. BIN
      app/src/main/res/drawable-xhdpi/icon_cache_play.png
  98. BIN
      app/src/main/res/drawable-xhdpi/icon_cancel.png
  99. BIN
      app/src/main/res/drawable-xhdpi/icon_download_normal.png
  100. BIN
      app/src/main/res/drawable-xxhdpi/test.png

+ 3 - 3
YCVideoPlayerLib/build.gradle

@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
 
 android {
     compileSdkVersion 25
-    buildToolsVersion "25.0.3"
+    buildToolsVersion '25.0.3'
 
 
     defaultConfig {
@@ -46,8 +46,8 @@ group = "cn.yc"
 //发布到JCenter上的项目名字,必须填写
 def libName = "YCVideoPlayerLib"
 // 版本号,下次更新是只需要更改版本号即可
-version = "1.1"
-/**  上面配置后上传至jcenter后的编译路径是这样的: compile 'cn.yc:YCVideoPlayerLib:1.1'  **/
+version = "2.2"
+/**  上面配置后上传至jcenter后的编译路径是这样的: compile 'cn.yc:YCVideoPlayerLib:2.2'  **/
 
 //生成源文件
 task sourcesJar(type: Jar) {

+ 48 - 13
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/AbsVideoPlayerController.java

@@ -8,6 +8,7 @@ import android.view.WindowManager;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
+import java.util.ArrayList;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -37,7 +38,7 @@ import java.util.TimerTask;
 public abstract class AbsVideoPlayerController extends FrameLayout implements View.OnTouchListener {
 
     private Context mContext;
-    protected InterVideoPlayer mNiceVideoPlayer;
+    protected InterVideoPlayer mVideoPlayer;
     private Timer mUpdateProgressTimer;
     private TimerTask mUpdateProgressTimerTask;
     private float mDownX;
@@ -58,10 +59,42 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
         this.setOnTouchListener(this);
     }
 
-    public void setNiceVideoPlayer(InterVideoPlayer niceVideoPlayer) {
-        mNiceVideoPlayer = niceVideoPlayer;
+    public void setVideoPlayer(InterVideoPlayer videoPlayer) {
+        mVideoPlayer = videoPlayer;
     }
 
+    /**
+     * 设置不操作后,多久自动隐藏头部和底部布局
+     * @param time                  时间
+     */
+    public abstract void setHideTime(long time);
+
+    /**
+     * 设置会员权限话术内容
+     * @param memberContent         集合
+     */
+    public abstract void setMemberContent(ArrayList<String> memberContent);
+
+
+    /**
+     * 设置会员权限类型
+     * @param isLogin   是否登录
+     * @param isSee     是否有权限看[及时登录,如果没有成为会员也需区分权限的]
+     * @param type      视频类型
+     * @param isSaveProgress        是否保存观看位置
+     */
+    public abstract void setMemberType(boolean isLogin , boolean isSee , int type , boolean isSaveProgress);
+
+
+    /**
+     * 设置加载loading类型
+     *
+     * @param type 加载loading的类型
+     *             目前1,是仿腾讯加载loading
+     *             2,是转圈加载loading
+     */
+    public abstract void setLoadingType(int type);
+
     /**
      * 设置播放的视频的标题
      *
@@ -84,7 +117,7 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
     public abstract ImageView imageView();
 
     /**
-     * 设置总时长.
+     * 设置总时长
      */
     public abstract void setLength(long length);
 
@@ -169,12 +202,12 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
     @Override
     public boolean onTouch(View v, MotionEvent event) {
         // 只有全屏的时候才能拖动位置、亮度、声音
-        if (!mNiceVideoPlayer.isFullScreen()) {
+        if (!mVideoPlayer.isFullScreen()) {
             return false;
         }
         // 只有在播放、暂停、缓冲的时候能够拖动改变位置、亮度和声音
-        if (mNiceVideoPlayer.isIdle() || mNiceVideoPlayer.isError() || mNiceVideoPlayer.isPreparing()
-                || mNiceVideoPlayer.isPrepared() || mNiceVideoPlayer.isCompleted()) {
+        if (mVideoPlayer.isIdle() || mVideoPlayer.isError() || mVideoPlayer.isPreparing()
+                || mVideoPlayer.isPrepared() || mVideoPlayer.isCompleted()) {
             hideChangePosition();
             hideChangeBrightness();
             hideChangeVolume();
@@ -200,7 +233,7 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
                     if (absDeltaX >= THRESHOLD) {
                         cancelUpdateProgressTimer();
                         mNeedChangePosition = true;
-                        mGestureDownPosition = mNiceVideoPlayer.getCurrentPosition();
+                        mGestureDownPosition = mVideoPlayer.getCurrentPosition();
                     } else if (absDeltaY >= THRESHOLD) {
                         if (mDownX < getWidth() * 0.5f) {
                             // 左侧改变亮度
@@ -210,12 +243,12 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
                         } else {
                             // 右侧改变声音
                             mNeedChangeVolume = true;
-                            mGestureDownVolume = mNiceVideoPlayer.getVolume();
+                            mGestureDownVolume = mVideoPlayer.getVolume();
                         }
                     }
                 }
                 if (mNeedChangePosition) {
-                    long duration = mNiceVideoPlayer.getDuration();
+                    long duration = mVideoPlayer.getDuration();
                     long toPosition = (long) (mGestureDownPosition + duration * deltaX / getWidth());
                     mNewPosition = Math.max(0, Math.min(duration, toPosition));
                     int newPositionProgress = (int) (100f * mNewPosition / duration);
@@ -236,11 +269,11 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
                 }
                 if (mNeedChangeVolume) {
                     deltaY = -deltaY;
-                    int maxVolume = mNiceVideoPlayer.getMaxVolume();
+                    int maxVolume = mVideoPlayer.getMaxVolume();
                     int deltaVolume = (int) (maxVolume * deltaY * 3 / getHeight());
                     int newVolume = mGestureDownVolume + deltaVolume;
                     newVolume = Math.max(0, Math.min(maxVolume, newVolume));
-                    mNiceVideoPlayer.setVolume(newVolume);
+                    mVideoPlayer.setVolume(newVolume);
                     int newVolumeProgress = (int) (100f * newVolume / maxVolume);
                     showChangeVolume(newVolumeProgress);
                 }
@@ -248,7 +281,7 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
             case MotionEvent.ACTION_CANCEL:
             case MotionEvent.ACTION_UP:
                 if (mNeedChangePosition) {
-                    mNiceVideoPlayer.seekTo(mNewPosition);
+                    mVideoPlayer.seekTo(mNewPosition);
                     hideChangePosition();
                     startUpdateProgressTimer();
                     return true;
@@ -262,6 +295,8 @@ public abstract class AbsVideoPlayerController extends FrameLayout implements Vi
                     return true;
                 }
                 break;
+            default:
+                break;
         }
         return false;
     }

+ 2 - 14
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/ChangeClarityDialog.java

@@ -15,6 +15,7 @@ import java.util.List;
 /**
  * 切换清晰度对话框(仿腾讯视频切换清晰度的对话框).
  */
+
 public class ChangeClarityDialog extends Dialog {
 
     private LinearLayout mLinearLayout;
@@ -50,6 +51,7 @@ public class ChangeClarityDialog extends Dialog {
         ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.MarginLayoutParams.MATCH_PARENT);
         setContentView(mLinearLayout, params);
+        //注意,这里一定要判空
         if(getWindow()!=null){
             WindowManager.LayoutParams windowParams = getWindow().getAttributes();
             windowParams.width = VideoPlayerUtils.getScreenHeight(context);
@@ -96,24 +98,10 @@ public class ChangeClarityDialog extends Dialog {
         }
     }
 
-    public interface OnClarityChangedListener {
-        /**
-         * 切换清晰度后回调
-         *
-         * @param clarityIndex 切换到的清晰度的索引值
-         */
-        void onClarityChanged(int clarityIndex);
-
-        /**
-         * 清晰度没有切换,比如点击了空白位置,或者点击的是之前的清晰度
-         */
-        void onClarityNotChanged();
-    }
 
     private OnClarityChangedListener mListener;
     void setOnClarityCheckedListener(OnClarityChangedListener listener) {
         mListener = listener;
     }
 
-
 }

+ 23 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/ConstantKeys.java

@@ -0,0 +1,23 @@
+package org.yczbj.ycvideoplayerlib;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * 常量
+ */
+public class ConstantKeys {
+
+    static final String NO_LOGIN_VIP_TEXT = "试看结束,观看全部内容请开通会员。\n已是会员/已购买可登陆观看";
+    static final String NO_LOGIN_TEXT = "试看结束,观看全部内容请开通会员/购买。\n已是会员/已购买可登陆观看";
+    static final String LOGIN_TEXT = "试看结束,观看全部内容请开通会员。";
+    static final String NO_LOGIN = "试看结束, 登录后即可观看全部免费课程。";
+
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface Gender {
+        int LOGIN = 1001;
+        int MEMBER = 1002;
+    }
+
+
+}

+ 21 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/OnClarityChangedListener.java

@@ -0,0 +1,21 @@
+package org.yczbj.ycvideoplayerlib;
+
+/**
+ * 清晰度监听接口
+ */
+
+public interface OnClarityChangedListener {
+
+    /**
+     * 切换清晰度后回调
+     *
+     * @param clarityIndex 切换到的清晰度的索引值
+     */
+    void onClarityChanged(int clarityIndex);
+
+    /**
+     * 清晰度没有切换,比如点击了空白位置,或者点击的是之前的清晰度
+     */
+    void onClarityNotChanged();
+    
+}

+ 15 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/OnMemberClickListener.java

@@ -0,0 +1,15 @@
+package org.yczbj.ycvideoplayerlib;
+
+
+/**
+ * 点击事件抽象接口
+ */
+public interface OnMemberClickListener {
+    /**
+     * 点击事件
+     * @param type      类型
+     *                  1.是跳转登录页面
+     *                  2.是跳转开通会员页面
+     */
+    void onClick(int type);
+}

+ 12 - 3
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoClarity.java

@@ -5,9 +5,18 @@ package org.yczbj.ycvideoplayerlib;
  */
 public class VideoClarity {
 
-    private String grade;           // 清晰度等级
-    private String p;               // 270P、480P、720P、1080P、4K ...
-    private String videoUrl;        // 视频链接地址
+    /**
+     * 清晰度等级
+     */
+    private String grade;
+    /**
+     * 270P、480P、720P、1080P、4K ...
+     */
+    private String p;
+    /**
+     * 视频链接地址
+     */
+    private String videoUrl;
 
     public VideoClarity(String grade, String p, String videoUrl) {
         this.grade = grade;

+ 14 - 4
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoLogUtil.java

@@ -7,17 +7,27 @@ import android.util.Log;
  */
 public class VideoLogUtil {
 
-    private static final String TAG = "NiceVideoPlayer";
+    private static final String TAG = "YCVideoPlayer";
+    public static boolean isLog = true;
 
     static void d(String message) {
-        Log.d(TAG, message);
+        if(isLog){
+            Log.d(TAG, message);
+        }
+
     }
 
     static void i(String message) {
-        Log.i(TAG, message);
+        if(isLog){
+            Log.i(TAG, message);
+        }
+
     }
 
     static void e(String message, Throwable throwable) {
-        Log.e(TAG, message, throwable);
+        if(isLog){
+            Log.e(TAG, message, throwable);
+        }
     }
+
 }

+ 49 - 8
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayer.java

@@ -163,6 +163,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
      * @param url               视频地址,可以是本地,也可以是网络视频
      * @param headers           请求header.
      */
+    @Override
     public void setUp(String url, Map<String, String> headers) {
         mUrl = url;
         mHeaders = headers;
@@ -173,10 +174,11 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
      * @param controller        AbsVideoPlayerController子类对象,可用VideoPlayerController,也可自定义
      */
     public void setController(AbsVideoPlayerController controller) {
+        //这里必须先移除
         mContainer.removeView(mController);
         mController = controller;
         mController.reset();
-        mController.setNiceVideoPlayer(this);
+        mController.setVideoPlayer(this);
         LayoutParams params = new LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.MATCH_PARENT);
@@ -220,13 +222,13 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
     @Override
     public void start() {
         if (mCurrentState == STATE_IDLE) {
-            VideoPlayerManager.instance().setCurrentNiceVideoPlayer(this);
+            VideoPlayerManager.instance().setCurrentVideoPlayer(this);
             initAudioManager();
             initMediaPlayer();
             initTextureView();
             addTextureView();
         } else {
-            VideoLogUtil.d("NiceVideoPlayer只有在mCurrentState == STATE_IDLE时才能调用start方法.");
+            VideoLogUtil.d("VideoPlayer只有在mCurrentState == STATE_IDLE时才能调用start方法.");
         }
     }
 
@@ -259,7 +261,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
             mMediaPlayer.reset();
             openMediaPlayer();
         } else {
-            VideoLogUtil.d("NiceVideoPlayer在mCurrentState == " + mCurrentState + "时不能调用restart()方法.");
+            VideoLogUtil.d("VideoPlayer在mCurrentState == " + mCurrentState + "时不能调用restart()方法.");
         }
     }
 
@@ -323,7 +325,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
     }
 
     /**
-     * 判断视频是否
+     * 判断视频是否准备就绪
      * @return                      true表示播放准备就绪
      */
     @Override
@@ -340,41 +342,73 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         return mCurrentState == STATE_BUFFERING_PLAYING;
     }
 
+    /**
+     * 判断是否是否缓冲暂停
+     * @return                      true表示缓冲暂停
+     */
     @Override
     public boolean isBufferingPaused() {
         return mCurrentState == STATE_BUFFERING_PAUSED;
     }
 
+    /**
+     * 判断视频是否正在播放
+     * @return                      true表示正在播放
+     */
     @Override
     public boolean isPlaying() {
         return mCurrentState == STATE_PLAYING;
     }
 
+    /**
+     * 判断视频是否暂停播放
+     * @return                      true表示暂停播放
+     */
     @Override
     public boolean isPaused() {
         return mCurrentState == STATE_PAUSED;
     }
 
+    /**
+     * 判断视频是否播放错误
+     * @return                      true表示播放错误
+     */
     @Override
     public boolean isError() {
         return mCurrentState == STATE_ERROR;
     }
 
+    /**
+     * 判断视频是否播放完成
+     * @return                      true表示播放完成
+     */
     @Override
     public boolean isCompleted() {
         return mCurrentState == STATE_COMPLETED;
     }
 
+    /**
+     * 判断视频是否播放全屏
+     * @return                      true表示播放全屏
+     */
     @Override
     public boolean isFullScreen() {
         return mCurrentMode == MODE_FULL_SCREEN;
     }
 
+    /**
+     * 判断视频是否播放小窗口
+     * @return                      true表示播放小窗口
+     */
     @Override
     public boolean isTinyWindow() {
         return mCurrentMode == MODE_TINY_WINDOW;
     }
 
+    /**
+     * 判断视频是否正常播放
+     * @return                      true表示正常播放
+     */
     @Override
     public boolean isNormal() {
         return mCurrentMode == MODE_NORMAL;
@@ -445,7 +479,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
     }
 
     /**
-     *
+     * 获取播放速度
      * @return
      */
     @Override
@@ -579,6 +613,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
     }
 
+
     /**
      * 设置准备视频播放监听事件
      */
@@ -711,6 +746,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
     };
 
+
     /**
      * 设置时间文本监听器
      */
@@ -721,6 +757,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
     };
 
+
     /**
      * 全屏,将mContainer(内部包含mTextureView和mController)从当前容器中移除,并添加到android.R.content中.
      * 切换横屏时需要在manifest的activity标签下添加android:configChanges="orientation|keyboardHidden|screenSize"配置,
@@ -733,6 +770,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
         // 隐藏ActionBar、状态栏,并横屏
         VideoPlayerUtils.hideActionBar(mContext);
+        //
         VideoPlayerUtils.scanForActivity(mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
         ViewGroup contentView = (ViewGroup) VideoPlayerUtils.scanForActivity(mContext).findViewById(android.R.id.content);
         if (mCurrentMode == MODE_TINY_WINDOW) {
@@ -740,8 +778,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         } else {
             this.removeView(mContainer);
         }
-        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
+        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
         contentView.addView(mContainer, params);
 
         mCurrentMode = MODE_FULL_SCREEN;
@@ -749,6 +786,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         VideoLogUtil.d("MODE_FULL_SCREEN");
     }
 
+
     /**
      * 退出全屏,移除mTextureView和mController,并添加到非全屏的容器中。
      * 切换竖屏时需要在manifest的activity标签下添加android:configChanges="orientation|keyboardHidden|screenSize"配置,
@@ -762,7 +800,9 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
             VideoPlayerUtils.showActionBar(mContext);
             VideoPlayerUtils.scanForActivity(mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
             ViewGroup contentView = (ViewGroup) VideoPlayerUtils.scanForActivity(mContext).findViewById(android.R.id.content);
+            //将视图移除
             contentView.removeView(mContainer);
+            //重新添加到当前视图
             LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
             this.addView(mContainer, params);
             mCurrentMode = MODE_NORMAL;
@@ -773,6 +813,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         return false;
     }
 
+
     /**
      * 进入小窗口播放,小窗口播放的实现原理与全屏播放类似。
      */

+ 352 - 69
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerController.java

@@ -4,14 +4,19 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.graphics.Color;
 import android.os.BatteryManager;
 import android.os.CountDownTimer;
 import android.support.annotation.DrawableRes;
+import android.util.Log;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
+import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
 import android.widget.SeekBar;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -45,6 +50,12 @@ import java.util.Locale;
  * 关于我的个人网站:www.ycbjie.cn或者www.yczbj.org
  *
  * 仿视频热点列表页播放器控制器
+ * 播放控制界面上,播放、暂停、播放进度、缓冲动画、全屏/小屏等触发都是直接调用播放器对应的操作的。
+ * 注意:建议先判断状态,再进行设置参数
+ *
+ * 会员制需求:
+ * 1.是会员,可以全部观看
+ * 2.非会员,可以试看,试看完后谈试看视图
  */
 
 public class VideoPlayerController extends AbsVideoPlayerController implements View.OnClickListener{
@@ -52,14 +63,12 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     private Context mContext;
     private ImageView mImage;
     private ImageView mCenterStart;
-
     private LinearLayout mTop;
     private ImageView mBack;
     private TextView mTitle;
     private LinearLayout mBatteryTime;
     private ImageView mBattery;
     private TextView mTime;
-
     private LinearLayout mBottom;
     private ImageView mRestartPause;
     private TextView mPosition;
@@ -67,40 +76,51 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     private SeekBar mSeek;
     private TextView mClarity;
     private ImageView mFullScreen;
-
     private TextView mLength;
-
     private LinearLayout mLoading;
+    private ProgressBar pbLoadingRing;
+    private ProgressBar pbLoadingQq;
     private TextView mLoadText;
-
-    private LinearLayout mChangePositon;
+    private LinearLayout mChangePosition;
     private TextView mChangePositionCurrent;
     private ProgressBar mChangePositionProgress;
-
     private LinearLayout mChangeBrightness;
     private ProgressBar mChangeBrightnessProgress;
-
     private LinearLayout mChangeVolume;
     private ProgressBar mChangeVolumeProgress;
-
     private LinearLayout mError;
     private TextView mRetry;
-
     private LinearLayout mCompleted;
     private TextView mReplay;
     private TextView mShare;
+    private LinearLayout mLlTrySee;
+    private TextView mTvSeeContent;
+    private Button mBtnVip;
+    private ImageView mIvTrySee;
+
 
     private boolean topBottomVisible;
+    //倒计时器
     private CountDownTimer mDismissTopBottomCountDownTimer;
-
     private List<VideoClarity> clarities;
     private int defaultClarityIndex;
-
     private ChangeClarityDialog mClarityDialog;
     /**
      * 是否已经注册了电池广播
      */
     private boolean hasRegisterBatteryReceiver;
+    //setMemberType 如果不设置该方法,那么默认视频都是可以看的
+    //试看类型
+    private int mType;
+    //是否有观看权限
+    private boolean mIsSee = true;
+    //是否登录
+    private boolean mIsLogin = true;
+    private boolean mSeeEnd = true;
+    //会员权限话术内容
+    private ArrayList<String> mMemberContent;
+    private long time;
+
 
     public VideoPlayerController(Context context) {
         super(context);
@@ -132,8 +152,11 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mClarity = (TextView) findViewById(R.id.clarity);
         mLength = (TextView) findViewById(R.id.length);
         mLoading = (LinearLayout) findViewById(R.id.loading);
+        pbLoadingRing = (ProgressBar)findViewById(R.id.pb_loading_ring);
+        pbLoadingQq = (ProgressBar)findViewById(R.id.pb_loading_qq);
+
         mLoadText = (TextView) findViewById(R.id.load_text);
-        mChangePositon = (LinearLayout) findViewById(R.id.change_position);
+        mChangePosition = (LinearLayout) findViewById(R.id.change_position);
         mChangePositionCurrent = (TextView) findViewById(R.id.change_position_current);
         mChangePositionProgress = (ProgressBar) findViewById(R.id.change_position_progress);
         mChangeBrightness = (LinearLayout) findViewById(R.id.change_brightness);
@@ -145,8 +168,13 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mCompleted = (LinearLayout) findViewById(R.id.completed);
         mReplay = (TextView) findViewById(R.id.replay);
         mShare = (TextView) findViewById(R.id.share);
+        mLlTrySee = (LinearLayout) findViewById(R.id.ll_try_see);
+        mTvSeeContent = (TextView)findViewById(R.id.tv_see_content);
+        mBtnVip = (Button)findViewById(R.id.btn_vip);
+        mIvTrySee = (ImageView) findViewById(R.id.iv_try_see);
     }
 
+
     private void initListener() {
         mCenterStart.setOnClickListener(this);
         mBack.setOnClickListener(this);
@@ -156,6 +184,8 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mRetry.setOnClickListener(this);
         mReplay.setOnClickListener(this);
         mShare.setOnClickListener(this);
+        mBtnVip.setOnClickListener(this);
+        mIvTrySee.setOnClickListener(this);
         mSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -169,17 +199,79 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
 
             @Override
             public void onStopTrackingTouch(SeekBar seekBar) {
-                if (mNiceVideoPlayer.isBufferingPaused() || mNiceVideoPlayer.isPaused()) {
-                    mNiceVideoPlayer.restart();
+                if (mVideoPlayer.isBufferingPaused() || mVideoPlayer.isPaused()) {
+                    mVideoPlayer.restart();
                 }
-                long position = (long) (mNiceVideoPlayer.getDuration() * seekBar.getProgress() / 100f);
-                mNiceVideoPlayer.seekTo(position);
+                long position = (long) (mVideoPlayer.getDuration() * seekBar.getProgress() / 100f);
+                mVideoPlayer.seekTo(position);
                 startDismissTopBottomTimer();
             }
         });
         this.setOnClickListener(this);
     }
 
+
+
+    /**
+     * 18年1月12号添加
+     * 设置加载loading类型
+     *
+     * @param type 加载loading的类型
+     *             目前1,是仿腾讯加载loading
+     *             2,是转圈加载loading
+     *             默认是2,后期想让用户自定义loading加载视图,不过暂时没实现
+     *             更多可以关注我的GitHub:https://github.com/yangchong211
+     */
+    @Override
+    public void setLoadingType(int type) {
+        if(type==1){
+            pbLoadingRing.setVisibility(GONE);
+            pbLoadingQq.setVisibility(VISIBLE);
+        }else if(type==2){
+            pbLoadingRing.setVisibility(VISIBLE);
+            pbLoadingQq.setVisibility(GONE);
+        }else {
+            pbLoadingRing.setVisibility(VISIBLE);
+            pbLoadingQq.setVisibility(GONE);
+        }
+    }
+
+
+    /**
+     * 18年1月12号添加
+     * 设置会员权限类型
+     * @param isLogin   是否登录
+     * @param isSee     是否有权限看[及时登录,如果没有成为会员也需区分权限的]
+     * @param type      视频类型
+     * @param isSaveProgress        是否保存观看位置
+     */
+    @Override
+    public void setMemberType(boolean isLogin, boolean isSee, int type ,boolean isSaveProgress) {
+        this.mIsSee = isSee;
+        this.mIsLogin = isLogin;
+        this.mType = type;
+    }
+
+
+    /**
+     * 设置会员权限话术内容
+     * @param memberContent         集合
+     */
+    @Override
+    public void setMemberContent(ArrayList<String> memberContent) {
+        this.mMemberContent = memberContent;
+    }
+
+    /**
+     * 设置不操作后,多久自动隐藏头部和底部布局
+     * @param time                  时间
+     */
+    @Override
+    public void setHideTime(long time) {
+        this.time = time;
+    }
+
+
     /**
      * 设置视频标题
      * @param title             视频标题
@@ -218,19 +310,19 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
 
     /**
      * 设置播放器
-     * @param niceVideoPlayer   播放器
+     * @param VideoPlayer   播放器
      */
     @Override
-    public void setNiceVideoPlayer(InterVideoPlayer niceVideoPlayer) {
-        super.setNiceVideoPlayer(niceVideoPlayer);
+    public void setVideoPlayer(InterVideoPlayer VideoPlayer) {
+        super.setVideoPlayer(VideoPlayer);
         // 给播放器配置视频链接地址
         if (clarities != null && clarities.size() > 1) {
-            mNiceVideoPlayer.setUp(clarities.get(defaultClarityIndex).getVideoUrl(), null);
+            mVideoPlayer.setUp(clarities.get(defaultClarityIndex).getVideoUrl(), null);
         }
     }
 
     /**
-     * 设置清晰度
+     * 设置视频清晰度
      * @param clarities                         清晰度
      * @param defaultClarityIndex               默认清晰度
      */
@@ -246,16 +338,16 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
             // 初始化切换清晰度对话框
             mClarityDialog = new ChangeClarityDialog(mContext);
             mClarityDialog.setClarityGrade(clarityGrades, defaultClarityIndex);
-            mClarityDialog.setOnClarityCheckedListener(new ChangeClarityDialog.OnClarityChangedListener() {
+            mClarityDialog.setOnClarityCheckedListener(new OnClarityChangedListener() {
                 @Override
                 public void onClarityChanged(int clarityIndex) {
                     // 根据切换后的清晰度索引值,设置对应的视频链接地址,并从当前播放位置接着播放
                     VideoClarity clarity = clarities.get(clarityIndex);
                     mClarity.setText(clarity.getGrade());
-                    long currentPosition = mNiceVideoPlayer.getCurrentPosition();
-                    mNiceVideoPlayer.releasePlayer();
-                    mNiceVideoPlayer.setUp(clarity.getVideoUrl(), null);
-                    mNiceVideoPlayer.start(currentPosition);
+                    long currentPosition = mVideoPlayer.getCurrentPosition();
+                    mVideoPlayer.releasePlayer();
+                    mVideoPlayer.setUp(clarity.getVideoUrl(), null);
+                    mVideoPlayer.start(currentPosition);
                 }
 
                 @Override
@@ -265,12 +357,13 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
                 }
             });
             // 给播放器配置视频链接地址
-            if (mNiceVideoPlayer != null) {
-                mNiceVideoPlayer.setUp(clarities.get(defaultClarityIndex).getVideoUrl(), null);
+            if (mVideoPlayer != null) {
+                mVideoPlayer.setUp(clarities.get(defaultClarityIndex).getVideoUrl(), null);
             }
         }
     }
 
+
     /**
      * 当播放状态发生改变时
      * @param playState 播放状态:
@@ -338,9 +431,12 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
                 mImage.setVisibility(View.VISIBLE);
                 mCompleted.setVisibility(View.VISIBLE);
                 break;
+            default:
+                break;
         }
     }
 
+
     /**
      * 当播放器的播放模式发生变化时
      * @param playMode 播放器的模式:
@@ -352,8 +448,9 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     @Override
     protected void onPlayModeChanged(int playMode) {
         switch (playMode) {
-            case VideoPlayer.MODE_NORMAL:                               //普通模式
-                mBack.setVisibility(View.GONE);
+            //普通模式
+            case VideoPlayer.MODE_NORMAL:
+                mBack.setVisibility(View.VISIBLE);
                 mFullScreen.setImageResource(R.drawable.ic_player_enlarge);
                 mFullScreen.setVisibility(View.VISIBLE);
                 mClarity.setVisibility(View.GONE);
@@ -363,7 +460,8 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
                     hasRegisterBatteryReceiver = false;
                 }
                 break;
-            case VideoPlayer.MODE_FULL_SCREEN:                          //全屏模式
+            //全屏模式
+            case VideoPlayer.MODE_FULL_SCREEN:
                 mBack.setVisibility(View.VISIBLE);
                 mFullScreen.setVisibility(View.GONE);
                 mFullScreen.setImageResource(R.drawable.ic_player_shrink);
@@ -376,10 +474,13 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
                     hasRegisterBatteryReceiver = true;
                 }
                 break;
-            case VideoPlayer.MODE_TINY_WINDOW:                          //小窗口模式
+            //小窗口模式
+            case VideoPlayer.MODE_TINY_WINDOW:
                 mBack.setVisibility(View.VISIBLE);
                 mClarity.setVisibility(View.GONE);
                 break;
+            default:
+                break;
         }
     }
 
@@ -415,6 +516,10 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         }
     };
 
+
+    /**
+     * 重新设置
+     */
     @Override
     protected void reset() {
         topBottomVisible = false;
@@ -423,22 +528,32 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mSeek.setProgress(0);
         mSeek.setSecondaryProgress(0);
 
-        mCenterStart.setVisibility(View.VISIBLE);
-        mImage.setVisibility(View.VISIBLE);
 
+        //添加,试看视频
+        if (!mIsSee || !mIsLogin) {
+            mIvTrySee.setVisibility(VISIBLE);
+            mCenterStart.setVisibility(GONE);
+            mLength.setVisibility(View.GONE);
+        }else{
+            mIvTrySee.setVisibility(GONE);
+            mCenterStart.setVisibility(VISIBLE);
+            mLength.setVisibility(View.VISIBLE);
+        }
+
+        //mCenterStart.setVisibility(View.VISIBLE);
+        mImage.setVisibility(View.VISIBLE);
         mBottom.setVisibility(View.GONE);
         mFullScreen.setImageResource(R.drawable.ic_player_enlarge);
-
-        mLength.setVisibility(View.VISIBLE);
-
         mTop.setVisibility(View.VISIBLE);
-        mBack.setVisibility(View.GONE);
+        mBack.setVisibility(View.VISIBLE);
 
+        mLlTrySee.setVisibility(GONE);
         mLoading.setVisibility(View.GONE);
         mError.setVisibility(View.GONE);
         mCompleted.setVisibility(View.GONE);
     }
 
+
     /**
      * 尽量不要在onClick中直接处理控件的隐藏、显示及各种UI逻辑。
      * UI相关的逻辑都尽量到{@link #onPlayStateChanged}和{@link #onPlayModeChanged}中处理.
@@ -446,42 +561,82 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     @Override
     public void onClick(View v) {
         if (v == mCenterStart) {
-            if (mNiceVideoPlayer.isIdle()) {
-                mNiceVideoPlayer.start();
+            //开始播放
+            if (mVideoPlayer.isIdle()) {
+                mVideoPlayer.start();
             }
         } else if (v == mBack) {
-            if (mNiceVideoPlayer.isFullScreen()) {
-                mNiceVideoPlayer.exitFullScreen();
-            } else if (mNiceVideoPlayer.isTinyWindow()) {
-                mNiceVideoPlayer.exitTinyWindow();
+            //退出,执行返回逻辑
+            if (mVideoPlayer.isFullScreen()) {
+                mVideoPlayer.exitFullScreen();
+            } else if (mVideoPlayer.isTinyWindow()) {
+                mVideoPlayer.exitTinyWindow();
             }
+            //思考,如何退出界面呢???
+            /*else {
+                mVideoPlayer.releasePlayer();
+            }*/
         } else if (v == mRestartPause) {
-            if (mNiceVideoPlayer.isPlaying() || mNiceVideoPlayer.isBufferingPlaying()) {
-                mNiceVideoPlayer.pause();
-            } else if (mNiceVideoPlayer.isPaused() || mNiceVideoPlayer.isBufferingPaused()) {
-                mNiceVideoPlayer.restart();
+            //重新播放或者暂停
+            if (mVideoPlayer.isPlaying() || mVideoPlayer.isBufferingPlaying()) {
+                mVideoPlayer.pause();
+            } else if (mVideoPlayer.isPaused() || mVideoPlayer.isBufferingPaused()) {
+                mVideoPlayer.restart();
             }
         } else if (v == mFullScreen) {
-            if (mNiceVideoPlayer.isNormal() || mNiceVideoPlayer.isTinyWindow()) {
-                mNiceVideoPlayer.enterFullScreen();
-            } else if (mNiceVideoPlayer.isFullScreen()) {
-                mNiceVideoPlayer.exitFullScreen();
+            //全屏模式
+            if (mVideoPlayer.isNormal() || mVideoPlayer.isTinyWindow()) {
+                mVideoPlayer.enterFullScreen();
+            } else if (mVideoPlayer.isFullScreen()) {
+                mVideoPlayer.exitFullScreen();
             }
         } else if (v == mClarity) {
-            setTopBottomVisible(false); // 隐藏top、bottom
-            mClarityDialog.show();     // 显示清晰度对话框
+            //设置清晰度
+            //隐藏top、bottom
+            setTopBottomVisible(false);
+            //显示清晰度对话框
+            mClarityDialog.show();
         } else if (v == mRetry) {
-            mNiceVideoPlayer.restart();
+            //点击重试
+            mVideoPlayer.restart();
         } else if (v == mReplay) {
+            //重新播放
             mRetry.performClick();
         } else if (v == mShare) {
+            //分享
             Toast.makeText(mContext, "分享", Toast.LENGTH_SHORT).show();
+        } else if (v == mIvTrySee){
+            //点击试看按钮,也是播放
+            mVideoPlayer.start();
+            mIvTrySee.setVisibility(GONE);
+        } else if (v == mBtnVip){
+            //点击vip按钮,第一种情况是跳转登录,第二种情况是跳转购买会员页面
+            if (mIsLogin) {
+                //试看结束,观看全部内容请开通会员
+                mClickListener.onClick(ConstantKeys.Gender.LOGIN);
+            }else if(mType ==1){
+                //试看结束,观看全部内容请开通会员/购买。已是会员/已购买可登陆观看
+                mClickListener.onClick(ConstantKeys.Gender.MEMBER);
+            }else if(mType == 2){
+                //试看结束,观看全部内容请开通会员。已是会员/已购买可登陆观看
+                mClickListener.onClick(ConstantKeys.Gender.MEMBER);
+            }else if(mType == 3){
+                //试看结束, 登录后即可观看全部免费课程。
+                mClickListener.onClick(ConstantKeys.Gender.MEMBER);
+            }
         } else if (v == this) {
-            if (mNiceVideoPlayer.isPlaying()
-                    || mNiceVideoPlayer.isPaused()
-                    || mNiceVideoPlayer.isBufferingPlaying()
-                    || mNiceVideoPlayer.isBufferingPaused()) {
-                setTopBottomVisible(!topBottomVisible);
+            if (mVideoPlayer.isPlaying() || mVideoPlayer.isPaused()
+                    || mVideoPlayer.isBufferingPlaying() || mVideoPlayer.isBufferingPaused()) {
+                if(mVideoPlayer.getCurrentPosition()>30000){
+                    //在试看3分钟外
+                    //如果没有登录或者没有观看权限,则隐藏底部和顶部视图
+                    if(mIsLogin || mIsSee){
+                        setTopBottomVisible(!topBottomVisible);
+                    }
+                }else {
+                    //在试看3分钟内,点击界面可以显示或者隐藏顶部底部视图
+                    setTopBottomVisible(!topBottomVisible);
+                }
             }
         }
     }
@@ -492,11 +647,17 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
      * @param visible true显示,false隐藏.
      */
     private void setTopBottomVisible(boolean visible) {
-        mTop.setVisibility(visible ? View.VISIBLE : View.GONE);
+        //如果显示为立即登录或者购买会员的布局,则不隐藏<箭头
+        if(mLlTrySee.getVisibility() == View.VISIBLE){
+            mTop.setVisibility(View.VISIBLE);
+            mTitle.setVisibility(View.VISIBLE);
+        }else {
+            mTop.setVisibility(visible ? View.VISIBLE : View.GONE);
+        }
         mBottom.setVisibility(visible ? View.VISIBLE : View.GONE);
         topBottomVisible = visible;
         if (visible) {
-            if (!mNiceVideoPlayer.isPaused() && !mNiceVideoPlayer.isBufferingPaused()) {
+            if (!mVideoPlayer.isPaused() && !mVideoPlayer.isBufferingPaused()) {
                 startDismissTopBottomTimer();
             }
         } else {
@@ -504,13 +665,18 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         }
     }
 
+
     /**
      * 开启top、bottom自动消失的timer
+     * 比如,视频常用功能,当用户5秒不操作后,自动隐藏头部和顶部
      */
     private void startDismissTopBottomTimer() {
+        if(time==0){
+            time = 8000;
+        }
         cancelDismissTopBottomTimer();
         if (mDismissTopBottomCountDownTimer == null) {
-            mDismissTopBottomCountDownTimer = new CountDownTimer(8000, 8000) {
+            mDismissTopBottomCountDownTimer = new CountDownTimer(time, time) {
                 @Override
                 public void onTick(long millisUntilFinished) {
 
@@ -525,6 +691,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mDismissTopBottomCountDownTimer.start();
     }
 
+
     /**
      * 取消top、bottom自动消失的timer
      */
@@ -534,11 +701,18 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         }
     }
 
+
+    /**
+     * 更新播放进度
+     */
     @Override
     protected void updateProgress() {
-        long position = mNiceVideoPlayer.getCurrentPosition();
-        long duration = mNiceVideoPlayer.getDuration();
-        int bufferPercentage = mNiceVideoPlayer.getBufferPercentage();
+        //获取当前播放的位置,毫秒
+        long position = mVideoPlayer.getCurrentPosition();
+        //获取办法给总时长,毫秒
+        long duration = mVideoPlayer.getDuration();
+        //获取视频缓冲百分比
+        int bufferPercentage = mVideoPlayer.getBufferPercentage();
         mSeek.setSecondaryProgress(bufferPercentage);
         int progress = (int) (100f * position / duration);
         mSeek.setProgress(progress);
@@ -546,11 +720,84 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mDuration.setText(VideoPlayerUtils.formatTime(duration));
         // 更新时间
         mTime.setText(new SimpleDateFormat("HH:mm", Locale.CHINA).format(new Date()));
+
+        //添加,如果没有播放权限或者没有登录,并且播放时间大于3分钟,则试看结束
+        if (!mIsSee || !mIsLogin) {
+            //避免更新中多次走这个方法
+            if(position >= 30000 && mSeeEnd){
+                // 试看结束
+                setVideoTrySeeEnd();
+                mSeeEnd = false;
+            }
+        }
+    }
+
+
+    /**
+     * 设置试看播放结束
+     */
+    private void setVideoTrySeeEnd() {
+        //先暂停播放
+        mVideoPlayer.pause();
+        mImage.setVisibility(View.VISIBLE);
+        mImage.setBackgroundColor(Color.BLACK);
+        //取消计时器
+        cancelUpdateProgressTimer();
+        cancelDismissTopBottomTimer();
+        //隐藏底部面板
+        mBottom.setVisibility(View.GONE);
+        //设置顶部返回键可见
+        mTop.setVisibility(View.VISIBLE);
+        mBack.setVisibility(View.VISIBLE);
+
+        mLlTrySee.setVisibility(VISIBLE);
+        String seeContent = "";
+        if (mIsLogin) {
+            //试看结束,观看全部内容请开通会员
+            if(mMemberContent!=null && mMemberContent.size()>0 && mMemberContent.get(0)!=null){
+                seeContent = mMemberContent.get(0);
+            }else {
+                seeContent = ConstantKeys.LOGIN_TEXT;
+            }
+            mTvSeeContent.setClickable(false);
+            mTvSeeContent.setEnabled(false);
+        }else if(mType ==1){
+            //试看结束,观看全部内容请开通会员/购买。已是会员/已购买可登陆观看
+            if(mMemberContent!=null && mMemberContent.size()>1 && mMemberContent.get(1)!=null){
+                seeContent = mMemberContent.get(1);
+            }else {
+                seeContent = ConstantKeys.NO_LOGIN_TEXT;
+            }
+            mBtnVip.setText("立即登录");
+        }else if(mType == 2){
+            //试看结束,观看全部内容请开通会员。已是会员/已购买可登陆观看
+            if(mMemberContent!=null && mMemberContent.size()>2 && mMemberContent.get(2)!=null){
+                seeContent = mMemberContent.get(2);
+            }else {
+                seeContent = ConstantKeys.NO_LOGIN_VIP_TEXT;
+            }
+            mBtnVip.setText("立即登录");
+        }else if(mType == 3){
+            //试看结束, 登录后即可观看全部免费课程。
+            if(mMemberContent!=null && mMemberContent.size()>3 && mMemberContent.get(3)!=null){
+                seeContent = mMemberContent.get(3);
+            }else {
+                seeContent = ConstantKeys.NO_LOGIN;
+            }
+            mBtnVip.setText("立即登录");
+        }
+        mTvSeeContent.setText(seeContent);
     }
 
+
+    /**
+     * 显示视频播放位置
+     * @param duration            视频总时长ms
+     * @param newPositionProgress 新的位置进度,取值0到100。
+     */
     @Override
     protected void showChangePosition(long duration, int newPositionProgress) {
-        mChangePositon.setVisibility(View.VISIBLE);
+        mChangePosition.setVisibility(View.VISIBLE);
         long newPosition = (long) (duration * newPositionProgress / 100f);
         mChangePositionCurrent.setText(VideoPlayerUtils.formatTime(newPosition));
         mChangePositionProgress.setProgress(newPositionProgress);
@@ -558,30 +805,66 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mPosition.setText(VideoPlayerUtils.formatTime(newPosition));
     }
 
+
+    /**
+     * 隐藏视频播放位置
+     */
     @Override
     protected void hideChangePosition() {
-        mChangePositon.setVisibility(View.GONE);
+        mChangePosition.setVisibility(View.GONE);
     }
 
+
+    /**
+     * 展示视频播放音量
+     * @param newVolumeProgress 新的音量进度,取值1到100。
+     */
     @Override
     protected void showChangeVolume(int newVolumeProgress) {
         mChangeVolume.setVisibility(View.VISIBLE);
         mChangeVolumeProgress.setProgress(newVolumeProgress);
     }
 
+
+    /**
+     * 隐藏视频播放音量
+     */
     @Override
     protected void hideChangeVolume() {
         mChangeVolume.setVisibility(View.GONE);
     }
 
+
+    /**
+     * 展示视频播放亮度
+     * @param newBrightnessProgress 新的亮度进度,取值1到100。
+     */
     @Override
     protected void showChangeBrightness(int newBrightnessProgress) {
         mChangeBrightness.setVisibility(View.VISIBLE);
         mChangeBrightnessProgress.setProgress(newBrightnessProgress);
     }
 
+
+    /**
+     * 隐藏视频播放亮度
+     */
     @Override
     protected void hideChangeBrightness() {
         mChangeBrightness.setVisibility(View.GONE);
     }
+
+
+    /**
+     * 让用户自己处理点击事件的逻辑
+     * 点击事件,跳转登录或者购买会员页面
+     * 欢迎同行交流:https://github.com/yangchong211
+     * 如果你觉得项目可以,欢迎star
+     */
+    private OnMemberClickListener mClickListener;
+    public void setOnMemberClickListener(OnMemberClickListener listener) {
+        this.mClickListener = listener;
+    }
+
+
 }

+ 35 - 10
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerManager.java

@@ -6,11 +6,14 @@ package org.yczbj.ycvideoplayerlib;
 public class VideoPlayerManager {
 
     private VideoPlayer mVideoPlayer;
-
-    private VideoPlayerManager() {}
-
     private static VideoPlayerManager sInstance;
+    private VideoPlayerManager() {}
 
+    /**
+     * 一定要使用单例模式,保证同一时刻只有一个视频在播放,其他的都是初始状态
+     * 单例模式
+     * @return          VideoPlayerManager对象
+     */
     public static synchronized VideoPlayerManager instance() {
         if (sInstance == null) {
             sInstance = new VideoPlayerManager();
@@ -18,37 +21,59 @@ public class VideoPlayerManager {
         return sInstance;
     }
 
-    public VideoPlayer getCurrentNiceVideoPlayer() {
+    /**
+     * 获取对象
+     * @return          VideoPlayerManager对象
+     */
+    public VideoPlayer getCurrentVideoPlayer() {
         return mVideoPlayer;
     }
 
-    public void setCurrentNiceVideoPlayer(VideoPlayer videoPlayer) {
+    /**
+     * 设置VideoPlayer
+     * @param videoPlayer       VideoPlayerManager对象
+     */
+    void setCurrentVideoPlayer(VideoPlayer videoPlayer) {
         if (mVideoPlayer != videoPlayer) {
-            releaseNiceVideoPlayer();
+            releaseVideoPlayer();
             mVideoPlayer = videoPlayer;
         }
     }
 
-    public void suspendNiceVideoPlayer() {
+    /**
+     * 当视频正在播放或者正在缓冲时,调用该方法暂停视频
+     */
+    public void suspendVideoPlayer() {
         if (mVideoPlayer != null && (mVideoPlayer.isPlaying() || mVideoPlayer.isBufferingPlaying())) {
             mVideoPlayer.pause();
         }
     }
 
-    public void resumeNiceVideoPlayer() {
+    /**
+     * 当视频暂停时或者缓冲暂停时,调用该方法重新开启视频播放
+     */
+    public void resumeVideoPlayer() {
         if (mVideoPlayer != null && (mVideoPlayer.isPaused() || mVideoPlayer.isBufferingPaused())) {
             mVideoPlayer.restart();
         }
     }
 
-    public void releaseNiceVideoPlayer() {
+    /**
+     * 释放,内部的播放器被释放掉,同时如果在全屏、小窗口模式下都会退出
+     */
+    public void releaseVideoPlayer() {
         if (mVideoPlayer != null) {
             mVideoPlayer.release();
             mVideoPlayer = null;
         }
     }
 
-    public boolean onBackPressd() {
+    /**
+     * 处理返回键逻辑
+     * 如果是全屏,则退出全屏
+     * 如果是小窗口,则退出小窗口
+     */
+    public boolean onBackPressed() {
         if (mVideoPlayer != null) {
             if (mVideoPlayer.isFullScreen()) {
                 return mVideoPlayer.exitFullScreen();

+ 15 - 10
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerUtils.java

@@ -36,8 +36,7 @@ public class VideoPlayerUtils {
 
     /**
      * Get AppCompatActivity from context
-     *
-     * @param context
+     * @param context           上下文
      * @return AppCompatActivity if it's not null
      */
     private static AppCompatActivity getAppCompActivity(Context context) {
@@ -67,8 +66,7 @@ public class VideoPlayerUtils {
             ab.setShowHideAnimationEnabled(false);
             ab.hide();
         }
-        scanForActivity(context).getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
-                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        scanForActivity(context).getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     }
 
     /**
@@ -121,18 +119,25 @@ public class VideoPlayerUtils {
      * @param url               视频链接url
      */
     static void savePlayPosition(Context context, String url, long position) {
-        context.getSharedPreferences("VIDEO_PLAYER_PLAY_POSITION",
-                Context.MODE_PRIVATE).edit().putLong(url, position).apply();
+        context.getSharedPreferences("VIDEO_PLAYER_PLAY_POSITION", Context.MODE_PRIVATE).edit().putLong(url, position).apply();
     }
 
     /**
      * 取出上次保存的播放位置
-     * @param context
-     * @param url     视频链接url
+     * @param context           上下文
+     * @param url               视频链接url
      * @return 上次保存的播放位置
      */
     static long getSavedPlayPosition(Context context, String url) {
-        return context.getSharedPreferences("VIDEO_PLAYER_PLAY_POSITION",
-                Context.MODE_PRIVATE).getLong(url, 0);
+        return context.getSharedPreferences("VIDEO_PLAYER_PLAY_POSITION", Context.MODE_PRIVATE).getLong(url, 0);
+    }
+
+    /**
+     * 清楚播放位置的痕迹
+     * @param context           上下文
+     */
+    public static void clearPlayPosition(Context context){
+        context.getSharedPreferences("VIDEO_PLAYER_PLAY_POSITION", Context.MODE_PRIVATE).getAll().clear();
     }
+
 }

BIN
YCVideoPlayerLib/src/main/res/drawable-xhdpi/ic_common_back.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xhdpi/ic_try_see_img_normal.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xhdpi/ic_try_see_img_pressed.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xhdpi/pb_loading_bg.png


+ 7 - 0
YCVideoPlayerLib/src/main/res/drawable/pb_loading_ring.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/pb_loading_bg"
+    android:fromDegrees="0.0"
+    android:pivotX="50.0%"
+    android:pivotY="50.0%"
+    android:toDegrees="360.0" />

+ 5 - 0
YCVideoPlayerLib/src/main/res/drawable/selector_details_try_see.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <item android:state_pressed="false" android:drawable="@drawable/shape_details_try_see"/>
+</selector>

+ 9 - 0
YCVideoPlayerLib/src/main/res/drawable/selector_try_see.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true"
+        android:drawable="@drawable/ic_try_see_img_pressed"/>
+    <item android:state_pressed="false"
+        android:drawable="@drawable/ic_try_see_img_normal"/>
+
+</selector>

+ 11 - 0
YCVideoPlayerLib/src/main/res/drawable/shape_details_try_see.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="#E2B170" />
+    <!-- 设置按钮的四个角为弧形 -->
+    <!-- android:radius 弧形的半径 -->
+    <corners android:radius="15dp" />
+
+</shape>

+ 23 - 279
YCVideoPlayerLib/src/main/res/layout/custom_video_player.xml

@@ -4,298 +4,31 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <!--底图-->
+    <!--https://github.com/yangchong211-->
+    <!--如果你觉得好,请给个star,让更多人使用,避免重复造轮子-->
+    <!--底图,主要是显示视频缩略图-->
     <ImageView
         android:id="@+id/image"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:scaleType="fitXY"
         android:visibility="visible"/>
-
     <!--加载动画view-->
-    <LinearLayout
-        android:id="@+id/loading"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:visibility="gone">
-        <ProgressBar
-            android:layout_width="27dp"
-            android:layout_height="10dp"
-            android:indeterminateDrawable="@drawable/loading"/>
-        <TextView
-            android:id="@+id/load_text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:text="正在缓冲..."
-            android:textColor="@android:color/white"
-            android:textSize="12sp"/>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_loading"/>
     <!--改变播放位置-->
-    <LinearLayout
-        android:id="@+id/change_position"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerInParent="true"
-        android:background="@drawable/bg_radius_4"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:padding="8dp"
-        android:visibility="gone">
-        <TextView
-            android:id="@+id/change_position_current"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="00:00"
-            android:textColor="@android:color/white"
-            android:textSize="28sp"/>
-        <ProgressBar
-            android:id="@+id/change_position_progress"
-            style="@android:style/Widget.ProgressBar.Horizontal"
-            android:layout_width="100dp"
-            android:layout_height="2dp"
-            android:layout_marginBottom="4dp"
-            android:layout_marginTop="8dp"
-            android:max="100"
-            android:progressDrawable="@drawable/pb_change"/>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_change_position"/>
     <!--改变亮度-->
-    <LinearLayout
-        android:id="@+id/change_brightness"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerInParent="true"
-        android:background="@drawable/bg_radius_4"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:padding="8dp"
-        android:visibility="gone">
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_palyer_brightness"/>
-        <ProgressBar
-            android:id="@+id/change_brightness_progress"
-            style="@android:style/Widget.ProgressBar.Horizontal"
-            android:layout_width="100dp"
-            android:layout_height="2dp"
-            android:layout_marginBottom="4dp"
-            android:layout_marginTop="8dp"
-            android:max="100"
-            android:progressDrawable="@drawable/pb_change"/>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_change_brightness"/>
     <!--改变声音-->
-    <LinearLayout
-        android:id="@+id/change_volume"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerInParent="true"
-        android:background="@drawable/bg_radius_4"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:padding="8dp"
-        android:visibility="gone">
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_palyer_volume"/>
-        <ProgressBar
-            android:id="@+id/change_volume_progress"
-            style="@android:style/Widget.ProgressBar.Horizontal"
-            android:layout_width="100dp"
-            android:layout_height="2dp"
-            android:layout_marginBottom="4dp"
-            android:layout_marginTop="8dp"
-            android:max="100"
-            android:progressDrawable="@drawable/pb_change"/>
-    </LinearLayout>
-
-    <!--播放完成-->
-    <LinearLayout
-        android:id="@+id/completed"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="#6c0b0b0b"
-        android:gravity="center"
-        android:orientation="horizontal"
-        android:visibility="gone">
-        <TextView
-            android:id="@+id/replay"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:drawableLeft="@drawable/ic_player_replay"
-            android:drawablePadding="4dp"
-            android:padding="8dp"
-            android:text="重新播放"
-            android:textColor="@android:color/white"
-            android:textSize="13sp"/>
-        <TextView
-            android:id="@+id/share"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="64dp"
-            android:drawableLeft="@drawable/ic_palyer_share"
-            android:drawablePadding="4dp"
-            android:padding="8dp"
-            android:text="分享"
-            android:textColor="@android:color/white"
-            android:textSize="13sp"/>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_change_volume"/>
+    <!--播放完成,你也可以自定义-->
+    <include layout="@layout/custom_video_player_completed"/>
     <!--播放错误-->
-    <LinearLayout
-        android:id="@+id/error"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="@android:color/black"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:visibility="gone">
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="播放错误,请重试。"
-            android:textColor="@android:color/white"
-            android:textSize="13sp"/>
-        <TextView
-            android:id="@+id/retry"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:background="@drawable/bg_retry"
-            android:paddingBottom="5dp"
-            android:paddingLeft="12dp"
-            android:paddingRight="12dp"
-            android:paddingTop="4dp"
-            android:text="点击重试"
-            android:textColor="@android:color/white"
-            android:textSize="13sp"/>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_error"/>
     <!--顶部控制区-->
-    <LinearLayout
-        android:id="@+id/top"
-        android:layout_width="match_parent"
-        android:layout_height="42dp"
-        android:background="@drawable/player_mask_top"
-        android:gravity="center_vertical"
-        android:paddingLeft="8dp"
-        android:paddingRight="8dp">
-        <ImageView
-            android:id="@+id/back"
-            android:layout_width="30dp"
-            android:layout_height="30dp"
-            android:src="@drawable/ic_player_back"
-            android:visibility="visible"/>
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:ellipsize="end"
-            android:maxLines="2"
-            android:text="真实死亡游戏“蓝鲸”疑似进入国内,家长们要注意了"
-            android:textColor="@android:color/white"
-            android:textSize="14sp"/>
-        <LinearLayout
-            android:id="@+id/battery_time"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="8dp"
-            android:orientation="vertical"
-            android:visibility="gone">
-            <ImageView
-                android:id="@+id/battery"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:src="@drawable/battery_100"/>
-            <TextView
-                android:id="@+id/time"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="00:00"
-                android:textColor="@android:color/white"
-                android:textSize="10sp"/>
-        </LinearLayout>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_top"/>
     <!--底部控制区-->
-    <LinearLayout
-        android:id="@+id/bottom"
-        android:layout_width="match_parent"
-        android:layout_height="42dp"
-        android:layout_alignParentBottom="true"
-        android:background="@drawable/player_mask_bottom"
-        android:gravity="center_vertical"
-        android:paddingLeft="8dp"
-        android:paddingRight="8dp">
-        <ImageView
-            android:id="@+id/restart_or_pause"
-            android:layout_width="24dp"
-            android:layout_height="24dp"
-            android:src="@drawable/ic_player_start"/>
-        <TextView
-            android:id="@+id/position"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="8dp"
-            android:text="00:00"
-            android:textColor="@android:color/white"
-            android:textSize="12sp"/>
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="/"
-            android:textColor="@android:color/white"
-            android:textSize="14sp"/>
-        <TextView
-            android:id="@+id/duration"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="00:00"
-            android:textColor="@android:color/white"
-            android:textSize="12sp"/>
-        <SeekBar
-            android:id="@+id/seek"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:layout_weight="1"
-            android:background="@null"
-            android:max="100"
-            android:maxHeight="1.5dp"
-            android:minHeight="1.5dp"
-            android:progressDrawable="@drawable/seek_progress"
-            android:thumb="@drawable/seek_thumb"/>
-        <TextView
-            android:id="@+id/clarity"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingRight="4dp"
-            android:paddingLeft="8dp"
-            android:text="超清"
-            android:textColor="@android:color/white"
-            android:textSize="14sp"
-            android:visibility="gone"/>
-        <ImageView
-            android:id="@+id/full_screen"
-            android:layout_width="24dp"
-            android:layout_height="24dp"
-            android:src="@drawable/ic_player_enlarge"/>
-    </LinearLayout>
-
-
+    <include layout="@layout/custom_video_player_bottom"/>
     <!--右下角初始显示的总时长-->
     <TextView
         android:id="@+id/length"
@@ -306,6 +39,7 @@
         android:layout_marginBottom="12dp"
         android:layout_marginEnd="8dp"
         android:padding="4dp"
+        android:visibility="visible"
         android:text="00:00"
         android:textColor="@android:color/white"
         android:textSize="12sp"/>
@@ -317,5 +51,15 @@
         android:layout_centerInParent="true"
         android:src="@drawable/ic_player_center_start"
         android:visibility="visible"/>
+    <!--试看按钮-->
+    <ImageView
+        android:id="@+id/iv_try_see"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:src="@drawable/selector_try_see"
+        android:visibility="gone"/>
+    <!--试看布局,非会员显示该布局-->
+    <include layout="@layout/custom_video_player_try_see"/>
 
 </RelativeLayout>

+ 65 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_bottom.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/bottom"
+    android:layout_width="match_parent"
+    android:layout_height="42dp"
+    android:layout_alignParentBottom="true"
+    android:background="@drawable/player_mask_bottom"
+    android:gravity="center_vertical"
+    android:paddingLeft="8dp"
+    android:paddingRight="8dp">
+    <ImageView
+        android:id="@+id/restart_or_pause"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:src="@drawable/ic_player_start"/>
+    <TextView
+        android:id="@+id/position"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="8dp"
+        android:text="00:00"
+        android:textColor="@android:color/white"
+        android:textSize="12sp"/>
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="/"
+        android:textColor="@android:color/white"
+        android:textSize="14sp"/>
+    <TextView
+        android:id="@+id/duration"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="00:00"
+        android:textColor="@android:color/white"
+        android:textSize="12sp"/>
+    <SeekBar
+        android:id="@+id/seek"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_weight="1"
+        android:background="@null"
+        android:max="100"
+        android:maxHeight="1.5dp"
+        android:minHeight="1.5dp"
+        android:progressDrawable="@drawable/seek_progress"
+        android:thumb="@drawable/seek_thumb"/>
+    <TextView
+        android:id="@+id/clarity"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingEnd="4dp"
+        android:paddingStart="8dp"
+        android:text="超清"
+        android:textColor="@android:color/white"
+        android:textSize="14sp"
+        android:visibility="gone"/>
+    <ImageView
+        android:id="@+id/full_screen"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:src="@drawable/ic_player_enlarge"/>
+</LinearLayout>

+ 26 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_change_brightness.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/change_brightness"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_centerInParent="true"
+    android:background="@drawable/bg_radius_4"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:padding="8dp"
+    android:visibility="gone">
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_palyer_brightness"/>
+    <ProgressBar
+        android:id="@+id/change_brightness_progress"
+        style="@android:style/Widget.ProgressBar.Horizontal"
+        android:layout_width="100dp"
+        android:layout_height="2dp"
+        android:layout_marginBottom="4dp"
+        android:layout_marginTop="8dp"
+        android:max="100"
+        android:progressDrawable="@drawable/pb_change"/>
+</LinearLayout>

+ 29 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_change_position.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/change_position"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_centerInParent="true"
+    android:background="@drawable/bg_radius_4"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:padding="8dp"
+    android:visibility="gone">
+    <TextView
+        android:id="@+id/change_position_current"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="00:00"
+        android:textColor="@android:color/white"
+        android:textSize="28sp"/>
+    <ProgressBar
+        android:id="@+id/change_position_progress"
+        style="@android:style/Widget.ProgressBar.Horizontal"
+        android:layout_width="100dp"
+        android:layout_height="2dp"
+        android:layout_marginBottom="4dp"
+        android:layout_marginTop="8dp"
+        android:max="100"
+        android:progressDrawable="@drawable/pb_change"/>
+</LinearLayout>

+ 26 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_change_volume.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/change_volume"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_centerInParent="true"
+    android:background="@drawable/bg_radius_4"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:padding="8dp"
+    android:visibility="gone">
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_palyer_volume"/>
+    <ProgressBar
+        android:id="@+id/change_volume_progress"
+        style="@android:style/Widget.ProgressBar.Horizontal"
+        android:layout_width="100dp"
+        android:layout_height="2dp"
+        android:layout_marginBottom="4dp"
+        android:layout_marginTop="8dp"
+        android:max="100"
+        android:progressDrawable="@drawable/pb_change"/>
+</LinearLayout>

+ 32 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_completed.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/completed"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#6c0b0b0b"
+    android:gravity="center"
+    android:orientation="horizontal"
+    android:visibility="gone">
+    <TextView
+        android:id="@+id/replay"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:drawableStart="@drawable/ic_player_replay"
+        android:drawablePadding="4dp"
+        android:padding="8dp"
+        android:text="重新播放"
+        android:textColor="@android:color/white"
+        android:textSize="14sp"/>
+    <TextView
+        android:id="@+id/share"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="50dp"
+        android:drawableStart="@drawable/ic_palyer_share"
+        android:drawablePadding="4dp"
+        android:padding="8dp"
+        android:text="分享"
+        android:textColor="@android:color/white"
+        android:textSize="14sp"/>
+</LinearLayout>

+ 30 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_error.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/error"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/black"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:visibility="gone">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="播放错误,请重试。"
+        android:textColor="@android:color/white"
+        android:textSize="13sp"/>
+    <TextView
+        android:id="@+id/retry"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:background="@drawable/bg_retry"
+        android:paddingBottom="5dp"
+        android:paddingLeft="15dp"
+        android:paddingRight="15dp"
+        android:paddingTop="4dp"
+        android:text="点击重试"
+        android:textColor="@android:color/white"
+        android:textSize="14sp"/>
+</LinearLayout>

+ 30 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_loading.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/loading"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:visibility="gone">
+    <ProgressBar
+        android:id="@+id/pb_loading_ring"
+        android:layout_width="45dp"
+        android:layout_height="45dp"
+        android:indeterminateDrawable="@drawable/pb_loading_ring"
+        android:visibility="visible" />
+    <ProgressBar
+        android:id="@+id/pb_loading_qq"
+        android:layout_width="27dp"
+        android:layout_height="10dp"
+        android:visibility="gone"
+        android:indeterminateDrawable="@drawable/loading"/>
+    <TextView
+        android:id="@+id/load_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:text="正在缓冲..."
+        android:textColor="@android:color/white"
+        android:textSize="12sp"/>
+</LinearLayout>

+ 48 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_top.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/top"
+    android:layout_width="match_parent"
+    android:layout_height="42dp"
+    android:background="@drawable/player_mask_top"
+    android:gravity="center_vertical"
+    android:paddingTop="10dp"
+    android:paddingLeft="8dp"
+    android:paddingRight="8dp">
+    <ImageView
+        android:id="@+id/back"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:src="@drawable/ic_player_back"
+        android:visibility="visible"/>
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:ellipsize="end"
+        android:maxLines="2"
+        android:text="真实死亡游戏“蓝鲸”疑似进入国内,家长们要注意了"
+        android:textColor="@android:color/white"
+        android:textSize="14sp"/>
+    <LinearLayout
+        android:id="@+id/battery_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="8dp"
+        android:orientation="vertical"
+        android:visibility="gone">
+        <ImageView
+            android:id="@+id/battery"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/battery_100"/>
+        <TextView
+            android:id="@+id/time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="00:00"
+            android:textColor="@android:color/white"
+            android:textSize="10sp"/>
+    </LinearLayout>
+</LinearLayout>

+ 30 - 0
YCVideoPlayerLib/src/main/res/layout/custom_video_player_try_see.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/ll_try_see"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:paddingTop="20dp"
+    android:orientation="vertical"
+    android:visibility="gone"
+    android:layout_centerInParent="true">
+    <TextView
+        android:id="@+id/tv_see_content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:lineSpacingExtra="8dp"
+        android:textColor="#ffffff"
+        android:textSize="14sp"/>
+    <Button
+        android:id="@+id/btn_vip"
+        android:layout_width="100dp"
+        android:layout_height="30dp"
+        android:layout_gravity="center_horizontal"
+        android:gravity="center"
+        android:layout_marginTop="10dp"
+        android:background="@drawable/shape_details_try_see"
+        android:textSize="14sp"
+        android:textColor="#ffffff"
+        android:text="成为会员"/>
+</LinearLayout>

+ 14 - 13
app/build.gradle

@@ -3,7 +3,7 @@ apply plugin: 'com.neenbedankt.android-apt'
 
 android {
     compileSdkVersion 25
-    buildToolsVersion "25.0.3"
+    buildToolsVersion '25.0.3'
     defaultConfig {
         applicationId "org.yczbj.ycvideoplayer"
         minSdkVersion 17
@@ -32,15 +32,15 @@ android {
 dependencies {
     compile fileTree(include: ['*.jar'], dir: 'libs')
     //官方库
-    compile 'com.android.support:appcompat-v7:25.4.0'
-    compile 'com.android.support:support-v4:25.4.0'
-    compile 'com.android.support:recyclerview-v7:25.4.0'
-    compile 'com.android.support:design:25.4.0'
-    compile 'com.android.support:cardview-v7:25.4.0'
-    compile 'com.android.support:palette-v7:25.4.0'
-    compile 'com.android.support:percent:25.4.0'
+    compile 'com.android.support:appcompat-v7:25.3.1'
+    compile 'com.android.support:support-v4:25.3.1'
+    compile 'com.android.support:recyclerview-v7:25.3.1'
+    compile 'com.android.support:design:25.3.1'
+    compile 'com.android.support:cardview-v7:25.3.1'
+    compile 'com.android.support:palette-v7:25.3.1'
+    compile 'com.android.support:percent:25.3.1'
     compile 'com.android.support:support-annotations:25.3.1'
-    compile 'com.android.support:multidex:1.0.2'
+    compile 'com.android.support:multidex:1.0.1'
 
     //网络请求retrofit2+Rx
     compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
@@ -71,14 +71,15 @@ dependencies {
     compile 'com.liulishuo.filedownloader:library:1.6.9'            //下载框架
 
 
-    //自己封装的库【欢迎star】:https://github.com/yangchong211
+    //自己封装的库,都有对应的案例项目【欢迎star】:https://github.com/yangchong211
     compile 'cn.yc:YCUtilsLib:1.5'                                  //公共类
     compile 'cn.yc:YCStateLib:1.1'                                  //状态管理
     compile 'cn.yc:YCBannerLib:1.2'                                 //轮播图
-    compile 'org.yczbj:YCRefreshViewLib:1.1'                        //RecyclerView封装
+    compile 'org.yczbj:YCRefreshViewLib:1.4'                        //RecyclerView封装
     compile 'cn.yc:YCBaseAdapterLib:1.2'                            //adapter封装
     compile 'cn.yc:YCDialogLib:3.2'                                 //弹窗
-    compile 'cn.yc:YCVideoPlayerLib:1.1'                            //播放器
-    //compile project(':YCVideoPlayerLib')
+    compile 'cn.yc:YCProgressLib:1.2'                               //进度条
+    compile 'cn.yc:YCVideoPlayerLib:2.2'                            //播放器
+//    compile project(':YCVideoPlayerLib')
 
 }

+ 12 - 3
app/src/main/AndroidManifest.xml

@@ -14,7 +14,7 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".ui.main.view.MainActivity">
+        <activity android:name=".ui.main.view.activity.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -22,12 +22,13 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".ui.main.view.activity.VideoPlayerMeActivity"
+        <activity android:name=".ui.home.view.activity.VideoPlayerMeActivity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:screenOrientation="portrait"/>
-        <activity android:name=".ui.main.view.activity.VideoPlayerJzActivity"
+        <activity android:name=".ui.home.view.activity.VideoPlayerJzActivity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:screenOrientation="portrait"/>
+        <activity android:name=".ui.test3.GlideCropActivity"/>
 
 
         <!--下面这些均是测试视频播放器-->
@@ -75,6 +76,14 @@
         <activity android:name=".ui.test2.view.TestMySixActivity"
             android:configChanges="orientation|keyboardHidden|screenSize"
             android:screenOrientation="portrait"/>
+
+        <activity android:name=".ui.test3.DLSingleTestActivity"/>
+        <activity android:name=".ui.test3.DLHybridTestActivity"/>
+        <activity android:name=".ui.test3.DLManyTestActivity"/>
+        <activity android:name=".ui.test3.DLMyFileTestActivity"/>
+        <activity android:name=".ui.test3.DLNotificationTestActivity"/>
+        <activity android:name=".ui.me.view.MeLoginActivity" />
+        <activity android:name=".ui.me.view.MeMemberActivity"/>
     </application>
 
 </manifest>

+ 14 - 0
app/src/main/java/org/yczbj/ycvideoplayer/api/ConstantImage.java

@@ -0,0 +1,14 @@
+package org.yczbj.ycvideoplayer.api;
+
+public class ConstantImage {
+
+
+    public static String[] homePageConcentration = {
+        "http://sandcolleges.zero2ipo.com.cn/vc-talk-img/1513594514204.png",
+        "http://sandcolleges.zero2ipo.com.cn/vc-talk-img/1514968425896.png",
+        "http://sandcolleges.zero2ipo.com.cn/vc-talk-img/1513595685864.png",
+        "http://sandcolleges.zero2ipo.com.cn/vc-talk-img/1513596366962.png",
+    };
+
+
+}

+ 25 - 0
app/src/main/java/org/yczbj/ycvideoplayer/api/ConstantVideo.java

@@ -0,0 +1,25 @@
+package org.yczbj.ycvideoplayer.api;
+
+
+
+public class ConstantVideo {
+
+
+
+    public static String[] VideoPlayerList = {
+            "http://p2modh813.bkt.clouddn.com/ycVideo1.mp4",
+            "http://p2modh813.bkt.clouddn.com/ycVideo2.mp4",
+            "http://p2modh813.bkt.clouddn.com/ycVideo3.mp4",
+            "http://p2modh813.bkt.clouddn.com/ycVideo4.mp4",
+            "http://p2modh813.bkt.clouddn.com/ycVideo5.mp4",
+    };
+
+    public static String[] VideoPlayerTitle = {
+            "大家好,我是潇湘剑雨",
+            "如果项目可以,可以给个star",
+            "有bug,可以直接提出来,欢迎一起探讨",
+            "把本地项目代码复制到拷贝的仓库",
+            "依次输入命令上传代码",
+    };
+
+}

+ 12 - 7
app/src/main/java/org/yczbj/ycvideoplayer/base/AppManager.java

@@ -17,7 +17,9 @@ import java.util.Stack;
  */
 public class AppManager {
 
-    //栈:也就是stack
+    /**
+     * 栈:也就是stack
+     */
     private static Stack<Activity> activityStack;
     private volatile static AppManager instance;
 
@@ -42,7 +44,7 @@ public class AppManager {
     /**
      * 添加Activity到堆栈
      */
-    public void addActivity(Activity activity) {
+    void addActivity(Activity activity) {
         if(activityStack == null){
             activityStack = new Stack<>();
         }
@@ -73,7 +75,7 @@ public class AppManager {
     /**
      * 结束指定的Activity
      */
-    public void finishActivity(Activity activity) {
+    void finishActivity(Activity activity) {
         if (activity != null && !activity.isFinishing()) {
             activityStack.remove(activity);
             activity.finish();
@@ -85,7 +87,7 @@ public class AppManager {
      * 移除指定的Activity
      * @param activity
      */
-    public void removeActivity(Activity activity) {
+    void removeActivity(Activity activity) {
         if (activity != null) {
             activityStack.remove(activity);
         }
@@ -105,7 +107,7 @@ public class AppManager {
     /**
      * 结束所有Activity
      */
-    private void finishAllActivity() {
+    public void finishAllActivity() {
         for (int i = 0, size = activityStack.size(); i < size; i++) {
             if (null != activityStack.get(i)) {
                 activityStack.get(i).finish();
@@ -117,7 +119,7 @@ public class AppManager {
     /**
      * 退出应用程序
      */
-    public void AppExit() {
+    public void AppExit(Boolean isBackground) {
         try {
             finishAllActivity();
             android.os.Process.killProcess(android.os.Process.myPid());
@@ -125,7 +127,10 @@ public class AppManager {
         } catch (Exception e) {
             //
         } finally {
-            //
+            // 注意,如果您有后台程序运行,请不要支持此句子
+            if (!isBackground) {
+                System.exit(0);
+            }
         }
     }
 

+ 24 - 1
app/src/main/java/org/yczbj/ycvideoplayer/base/BaseApplication.java

@@ -7,9 +7,13 @@ import android.support.multidex.MultiDex;
 import android.util.Log;
 
 import com.blankj.utilcode.util.Utils;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.connection.FileDownloadUrlConnection;
 
 import org.yczbj.ycvideoplayer.util.LogUtils;
 
+import java.net.Proxy;
+
 /**
  * ================================================
  * 作    者:杨充
@@ -64,9 +68,9 @@ public class BaseApplication extends Application {
         instance = this;
         initUtils();
         LogUtils.logDebug = true;
+        initDownLoadLib();
     }
 
-
     /**
      * 程序终止的时候执行
      */
@@ -115,6 +119,25 @@ public class BaseApplication extends Application {
         Utils.init(this);
     }
 
+
+    /**
+     * 初始化下载库
+     */
+    private void initDownLoadLib() {
+        FileDownloader.setupOnApplicationOnCreate(this)
+                .connectionCreator(new FileDownloadUrlConnection
+                        .Creator(new FileDownloadUrlConnection.Configuration()
+                        .connectTimeout(15_000)
+                        .readTimeout(15_000)
+                        .proxy(Proxy.NO_PROXY)
+                ))
+                .commit();
+
+        //最简单的初始化
+        //FileDownloader.setup(instance);
+    }
+
+
 }
 
 

+ 21 - 0
app/src/main/java/org/yczbj/ycvideoplayer/download/TaskViewHolderImp.java

@@ -0,0 +1,21 @@
+package org.yczbj.ycvideoplayer.download;
+
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks的ViewHolder接口
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ * ================================================
+ */
+public interface TaskViewHolderImp {
+
+    void update(final int id, final int position) ;
+    void updateDownloaded();
+    void updateNotDownloaded(final int status, final long sofar, final long total) ;
+    void updateDownloading(final int status, final long sofar, final long total);
+
+}

+ 226 - 0
app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManager.java

@@ -0,0 +1,226 @@
+package org.yczbj.ycvideoplayer.download;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.SparseArray;
+
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadConnectListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.model.FileDownloadStatus;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.DownloadVideoAdapter;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks帮助类
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ * ================================================
+ */
+public class TasksManager {
+
+    /**数据库控制器*/
+    private TasksManagerDBController dbController;
+    private List<TasksManagerModel> modelList;
+    private SparseArray<BaseDownloadTask> taskSparseArray = new SparseArray<>();
+    /**下载连接监听器*/
+    private FileDownloadConnectListener listener;
+
+
+    private final static class HolderClass {
+        private final static TasksManager INSTANCE = new TasksManager();
+    }
+
+    public static TasksManager getImpl() {
+        return HolderClass.INSTANCE;
+    }
+
+    private TasksManager() {
+        dbController = new TasksManagerDBController();
+        modelList = dbController.getAllTasks();
+        initListData();
+    }
+
+    /**
+     * 这一步很重要,将数据添加到下载队列中
+     */
+    private void initListData() {
+
+    }
+
+    /**
+     * 创建时执行
+     * @param activityWeakReference         软引用集合对象
+     */
+    public void onCreate(final WeakReference<DownloadVideoAdapter> activityWeakReference) {
+        if (!FileDownloader.getImpl().isServiceConnected()) {
+            FileDownloader.getImpl().bindService();
+            registerServiceConnectionListener(activityWeakReference);
+        }
+    }
+
+    /**
+     * 销毁时执行
+     */
+    public void onDestroy() {
+        unregisterServiceConnectionListener();
+        releaseTask();
+    }
+
+
+    public void addTaskForViewHolder(final BaseDownloadTask task) {
+        taskSparseArray.put(task.getId(), task);
+    }
+
+    public void removeTaskForViewHolder(final int id) {
+        taskSparseArray.remove(id);
+    }
+
+    public void updateViewHolder(final int id, final TaskViewHolderImp holder) {
+        final BaseDownloadTask task = taskSparseArray.get(id);
+        if (task == null) {
+            return;
+        }
+        task.setTag(holder);
+    }
+
+    public void releaseTask() {
+        taskSparseArray.clear();
+    }
+
+
+    /**
+     * 注册服务连接监听器
+     * @param activityWeakReference             软引用集合
+     */
+    private void registerServiceConnectionListener(final WeakReference<DownloadVideoAdapter> activityWeakReference) {
+        if (listener != null) {
+            FileDownloader.getImpl().removeServiceConnectListener(listener);
+        }
+
+        listener = new FileDownloadConnectListener() {
+            @Override
+            public void connected() {
+                if (activityWeakReference == null
+                        || activityWeakReference.get() == null) {
+                    return;
+                }
+                activityWeakReference.get().postNotifyDataChanged();
+            }
+
+            @Override
+            public void disconnected() {
+                if (activityWeakReference == null
+                        || activityWeakReference.get() == null) {
+                    return;
+                }
+                activityWeakReference.get().postNotifyDataChanged();
+            }
+        };
+        FileDownloader.getImpl().addServiceConnectListener(listener);
+    }
+
+    /**
+     * 移除服务连接监听器
+     */
+    private void unregisterServiceConnectionListener() {
+        FileDownloader.getImpl().removeServiceConnectListener(listener);
+        listener = null;
+    }
+
+
+    public boolean isReady() {
+        return FileDownloader.getImpl().isServiceConnected();
+    }
+
+
+    public TasksManagerModel get(final int position) {
+        if(modelList!=null){
+            return modelList.get(position);
+        }
+        return null;
+    }
+
+
+    private TasksManagerModel getById(final int id) {
+        for (TasksManagerModel model : modelList) {
+            if (model.getId() == id) {
+                return model;
+            }
+        }
+        return null;
+    }
+
+    public int getId(String url) {
+        if (TextUtils.isEmpty(url)){
+            return -1 ;
+        }
+        return FileDownloadUtils.generateId(url, createPath(url));
+    }
+
+
+    /**
+     * @param status Download Status
+     * @return has already downloaded
+     * @see FileDownloadStatus
+     */
+    public boolean isDownloaded(final int status) {
+        return status == FileDownloadStatus.completed;
+    }
+
+    public int getStatus(final int id, String path) {
+        return FileDownloader.getImpl().getStatus(id, path);
+    }
+
+    public long getTotal(final int id) {
+        return FileDownloader.getImpl().getTotal(id);
+    }
+
+    public long getSoFar(final int id) {
+        return FileDownloader.getImpl().getSoFar(id);
+    }
+
+    public int getTaskCounts() {
+        return modelList.size();
+    }
+
+    public TasksManagerModel addTask(final String url) {
+        return addTask(url, createPath(url));
+    }
+
+    private TasksManagerModel addTask(final String url, final String path) {
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            return null;
+        }
+
+        final int id = FileDownloadUtils.generateId(url, path);
+        TasksManagerModel model = getById(id);
+        if (model != null) {
+            return model;
+        }
+        final TasksManagerModel newModel = dbController.addTask(url, path);
+        if (newModel != null) {
+            modelList.add(newModel);
+        }
+
+        return newModel;
+    }
+
+    public String createPath(final String url) {
+        if (TextUtils.isEmpty(url)) {
+            return null;
+        }
+        return FileDownloadUtils.getDefaultSaveFilePath(url);
+    }
+
+}

+ 75 - 0
app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManagerDBController.java

@@ -0,0 +1,75 @@
+package org.yczbj.ycvideoplayer.download;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.text.TextUtils;
+
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseApplication;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks帮助类
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ * ================================================
+ */
+public class TasksManagerDBController {
+
+    final static String TABLE_NAME = "tasksManger";
+    private final SQLiteDatabase db;
+
+    TasksManagerDBController() {
+        TasksManagerDBOpenHelper openHelper = new TasksManagerDBOpenHelper(BaseApplication.getInstance());
+        db = openHelper.getWritableDatabase();
+    }
+
+    public List<TasksManagerModel> getAllTasks() {
+        final Cursor c = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
+        final List<TasksManagerModel> list = new ArrayList<>();
+        try {
+            if (!c.moveToLast()) {
+                return list;
+            }
+            do {
+                TasksManagerModel model = new TasksManagerModel();
+                model.setId(c.getInt(c.getColumnIndex(TasksManagerModel.ID)));
+                model.setName(c.getString(c.getColumnIndex(TasksManagerModel.NAME)));
+                model.setUrl(c.getString(c.getColumnIndex(TasksManagerModel.URL)));
+                model.setPath(c.getString(c.getColumnIndex(TasksManagerModel.PATH)));
+                list.add(model);
+            } while (c.moveToPrevious());
+        } finally {
+            if (c != null) {
+                c.close();
+            }
+        }
+        return list;
+    }
+
+
+    public TasksManagerModel addTask(final String url, final String path) {
+        if (TextUtils.isEmpty(url) || TextUtils.isEmpty(path)) {
+            return null;
+        }
+        // 必须使用文件下载器,将TasksManagerModel与文件下载器关联
+        final int id = FileDownloadUtils.generateId(url, path);
+        TasksManagerModel model = new TasksManagerModel();
+        model.setId(id);
+        model.setName(url.substring(url.lastIndexOf("/")));
+        model.setUrl(url);
+        model.setPath(path);
+        final boolean succeed = db.insert(TABLE_NAME, null, model.toContentValues()) != -1;
+        return succeed ? model : null;
+    }
+
+
+}

+ 52 - 0
app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManagerDBOpenHelper.java

@@ -0,0 +1,52 @@
+package org.yczbj.ycvideoplayer.download;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks帮助类
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ * ================================================
+ */
+public class TasksManagerDBOpenHelper extends SQLiteOpenHelper {
+
+    private final static String DATABASE_NAME = "tasksManager.db";
+    private final static int DATABASE_VERSION = 2;
+
+    TasksManagerDBOpenHelper(Context context) {
+        super(context, DATABASE_NAME, null, DATABASE_VERSION);
+    }
+
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        db.execSQL("CREATE TABLE IF NOT EXISTS "
+                + TasksManagerDBController.TABLE_NAME
+                + String.format(
+                "("
+                        + "%s INTEGER PRIMARY KEY, " // id, download id
+                        + "%s VARCHAR, " // name
+                        + "%s VARCHAR, " // url
+                        + "%s VARCHAR " // path
+                        + ")"
+                , TasksManagerModel.ID
+                , TasksManagerModel.NAME
+                , TasksManagerModel.URL
+                , TasksManagerModel.PATH
+        ));
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        if (oldVersion == 1 && newVersion == 2) {
+            db.delete(TasksManagerDBController.TABLE_NAME, null, null);
+        }
+    }
+
+}

+ 68 - 0
app/src/main/java/org/yczbj/ycvideoplayer/download/TasksManagerModel.java

@@ -0,0 +1,68 @@
+package org.yczbj.ycvideoplayer.download;
+
+import android.content.ContentValues;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/1/9
+ * 描    述:下载Tasks帮助类
+ * 修订历史:
+ *          下载框架:https://github.com/lingochamp/FileDownloader
+ * ================================================
+ */
+public class TasksManagerModel {
+
+    public final static String ID = "id";
+    public final static String NAME = "name";
+    public final static String URL = "url";
+    public final static String PATH = "path";
+
+    private int id;
+    private String name;
+    private String url;
+    private String path;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public ContentValues toContentValues() {
+        ContentValues cv = new ContentValues();
+        cv.put(ID, id);
+        cv.put(NAME, name);
+        cv.put(URL, url);
+        cv.put(PATH, path);
+        return cv;
+    }
+
+}

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/find/FindFragment.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/find/view/FindFragment.java

@@ -1,4 +1,4 @@
-package org.yczbj.ycvideoplayer.ui.find;
+package org.yczbj.ycvideoplayer.ui.find.view;
 
 import android.os.Bundle;
 import android.view.LayoutInflater;

+ 0 - 5
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/contract/HomeContract.java

@@ -1,15 +1,10 @@
 package org.yczbj.ycvideoplayer.ui.home.contract;
 
 
-import android.app.Activity;
-
 import com.flyco.tablayout.listener.CustomTabEntity;
 
 import org.yczbj.ycvideoplayer.base.BasePresenter;
 import org.yczbj.ycvideoplayer.base.BaseView;
-import org.yczbj.ycvideoplayer.ui.main.view.MainActivity;
-
-import java.util.ArrayList;
 
 /**
  * ================================================

+ 2 - 2
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/VideoPlayerJzContract.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/contract/VideoPlayerJzContract.java

@@ -1,11 +1,11 @@
-package org.yczbj.ycvideoplayer.ui.main.contract;
+package org.yczbj.ycvideoplayer.ui.home.contract;
 
 
 import android.support.v7.app.AppCompatActivity;
 
 import org.yczbj.ycvideoplayer.base.BasePresenter;
 import org.yczbj.ycvideoplayer.base.BaseView;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
 
 import java.util.List;
 

+ 3 - 2
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/VideoPlayerMeContract.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/contract/VideoPlayerMeContract.java

@@ -1,4 +1,4 @@
-package org.yczbj.ycvideoplayer.ui.main.contract;
+package org.yczbj.ycvideoplayer.ui.home.contract;
 
 
 import android.support.v7.app.AppCompatActivity;
@@ -7,7 +7,7 @@ import com.flyco.tablayout.listener.CustomTabEntity;
 
 import org.yczbj.ycvideoplayer.base.BasePresenter;
 import org.yczbj.ycvideoplayer.base.BaseView;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
 
 import java.util.List;
 
@@ -31,6 +31,7 @@ public interface VideoPlayerMeContract {
     interface Presenter extends BasePresenter {
         void bindView(AppCompatActivity activity);
         void getData();
+        void startDownload();
     }
 
 

+ 61 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/model/DialogListBean.java

@@ -0,0 +1,61 @@
+package org.yczbj.ycvideoplayer.ui.home.model;
+
+/**
+ * Created by yc on 2018/1/10.
+ */
+
+public class DialogListBean {
+
+    private String logo;
+    private String name;
+    private String title;
+    private String video;
+    private int id;
+
+    public DialogListBean(String logo, String name, String title , String video) {
+        this.logo = logo;
+        this.name = name;
+        this.title = title;
+        this.video = video;
+    }
+
+    public String getLogo() {
+        return logo;
+    }
+
+    public void setLogo(String logo) {
+        this.logo = logo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getVideo() {
+        return video;
+    }
+
+    public void setVideo(String video) {
+        this.video = video;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+}

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/model/VideoPlayerComment.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/model/VideoPlayerComment.java

@@ -1,4 +1,4 @@
-package org.yczbj.ycvideoplayer.ui.main.model;
+package org.yczbj.ycvideoplayer.ui.home.model;
 
 
 /**

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/model/VideoPlayerFavorite.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/model/VideoPlayerFavorite.java

@@ -1,4 +1,4 @@
-package org.yczbj.ycvideoplayer.ui.main.model;
+package org.yczbj.ycvideoplayer.ui.home.model;
 
 
 /**

+ 0 - 6
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/HomePresenter.java

@@ -1,17 +1,11 @@
 package org.yczbj.ycvideoplayer.ui.home.presenter;
 
 import android.app.Activity;
-import android.content.res.TypedArray;
 
 import com.flyco.tablayout.listener.CustomTabEntity;
 
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.bean.TabEntity;
 import org.yczbj.ycvideoplayer.ui.home.contract.HomeContract;
-import org.yczbj.ycvideoplayer.ui.main.contract.MainContract;
-import org.yczbj.ycvideoplayer.ui.main.view.MainActivity;
-
-import java.util.ArrayList;
 
 import rx.subscriptions.CompositeSubscription;
 

+ 3 - 4
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/VideoPlayerJzPresenter.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/VideoPlayerJzPresenter.java

@@ -1,12 +1,11 @@
-package org.yczbj.ycvideoplayer.ui.main.presenter;
+package org.yczbj.ycvideoplayer.ui.home.presenter;
 
 import android.app.Activity;
 import android.support.v7.app.AppCompatActivity;
 
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerJzContract;
-import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.contract.VideoPlayerJzContract;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
 
 import java.util.ArrayList;
 import java.util.List;

+ 14 - 3
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/VideoPlayerMePresenter.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/presenter/VideoPlayerMePresenter.java

@@ -1,13 +1,16 @@
-package org.yczbj.ycvideoplayer.ui.main.presenter;
+package org.yczbj.ycvideoplayer.ui.home.presenter;
 
 import android.app.Activity;
 import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 
 import com.flyco.tablayout.listener.CustomTabEntity;
+import com.pedaily.yc.ycdialoglib.bottomLayout.BottomDialog;
 
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.contract.VideoPlayerMeContract;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -65,4 +68,12 @@ public class VideoPlayerMePresenter implements VideoPlayerMeContract.Presenter {
         }
         mView.setAdapterView(comments);
     }
+
+    /**
+     * 开始下载
+     */
+    @Override
+    public void startDownload() {
+
+    }
 }

+ 94 - 11
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/VideoPlayerJzActivity.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerJzActivity.java

@@ -1,7 +1,8 @@
-package org.yczbj.ycvideoplayer.ui.main.view.activity;
+package org.yczbj.ycvideoplayer.ui.home.view.activity;
 
 import android.annotation.SuppressLint;
 import android.graphics.Color;
+import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.annotation.Nullable;
@@ -18,6 +19,8 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.blankj.utilcode.util.SizeUtils;
@@ -29,15 +32,18 @@ import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
 import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
 import org.yczbj.ycrefreshviewlib.item.SpaceViewItemLine;
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.BaseActivity;
-import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerJzContract;
-import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerFavorite;
-import org.yczbj.ycvideoplayer.ui.main.presenter.VideoPlayerJzPresenter;
-import org.yczbj.ycvideoplayer.ui.main.presenter.VideoPlayerMePresenter;
-import org.yczbj.ycvideoplayer.ui.main.view.adapter.NarrowImageAdapter;
-import org.yczbj.ycvideoplayer.ui.main.view.adapter.VideoPlayerMeAdapter;
+import org.yczbj.ycvideoplayer.ui.home.contract.VideoPlayerJzContract;
+import org.yczbj.ycvideoplayer.ui.home.model.DialogListBean;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerFavorite;
+import org.yczbj.ycvideoplayer.ui.home.presenter.VideoPlayerJzPresenter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.DialogListAdapter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.DownloadVideoAdapter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.NarrowImageAdapter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.VideoPlayerMeAdapter;
+import org.yczbj.ycvideoplayer.util.AppUtil;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -196,7 +202,7 @@ public class VideoPlayerJzActivity extends BaseActivity implements VideoPlayerJz
                                 ToastUtil.showToast(VideoPlayerJzActivity.this, "收藏视频");
                                 break;
                             case R.id.iv_player_download:
-
+                                showDownloadDialog();
                                 break;
                             case R.id.iv_player_share:
                                 ToastUtil.showToast(VideoPlayerJzActivity.this, "分享视频");
@@ -213,7 +219,6 @@ public class VideoPlayerJzActivity extends BaseActivity implements VideoPlayerJz
         });
     }
 
-
     private void initHeaderTitle() {
         adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
             @Override
@@ -322,6 +327,84 @@ public class VideoPlayerJzActivity extends BaseActivity implements VideoPlayerJz
     }
 
 
+    /**
+     * 弹出下载弹窗
+     */
+    private void showDownloadDialog() {
+        final List<DialogListBean> list = new ArrayList<>();
+        for(int a = 0; a< ConstantVideo.VideoPlayerList.length; a++){
+            DialogListBean dialogListBean = new DialogListBean("logo",
+                    "name",ConstantVideo.VideoPlayerTitle[a],ConstantVideo.VideoPlayerList[a]);
+            list.add(dialogListBean);
+        }
+        if(AppUtil.isActivityLiving(this)){
+            View view = getLayoutInflater().inflate(R.layout.dialog_download_video, null);
+            final PopupWindow popMenu = new PopupWindow(view, RelativeLayout.LayoutParams.MATCH_PARENT
+                    , RelativeLayout.LayoutParams.MATCH_PARENT, true){
+                //重写方法
+                @Override
+                public void showAsDropDown(View anchor) {
+                    Rect visibleFrame = new Rect();
+                    anchor.getGlobalVisibleRect(visibleFrame);
+                    int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
+                    setHeight(height);
+                    super.showAsDropDown(anchor);
+                }
+            };
+            popMenu.setClippingEnabled(false);
+            //点击其他地方关闭
+            popMenu.setFocusable(true);
+            //设置动画
+            popMenu.setAnimationStyle(R.style.animator_dialog_download);
+            popMenu.showAsDropDown(jzVideo);
+            AppUtil.setBackgroundAlpha(VideoPlayerJzActivity.this,0.5f);
+            popMenu.setOnDismissListener(new PopupWindow.OnDismissListener() {
+                @Override
+                public void onDismiss() {
+                    AppUtil.setBackgroundAlpha(VideoPlayerJzActivity.this,1.0f);
+                }
+            });
+
+
+            RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
+            ImageView ivCancel = (ImageView) view.findViewById(R.id.iv_cancel);
+            ImageView ivDownload = (ImageView) view.findViewById(R.id.iv_download);
+            recyclerView.setLayoutManager(new LinearLayoutManager(this));
+            final DownloadVideoAdapter mAdapter = new DownloadVideoAdapter(this, list);
+            recyclerView.setAdapter(mAdapter);
+            final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,
+                    SizeUtils.dp2px(1), this.getResources().getColor(R.color.grayLine));
+            recyclerView.addItemDecoration(line);
+            mAdapter.setOnItemClickListener(new DownloadVideoAdapter.OnItemClickListener() {
+                @Override
+                public void onItemClick(int position) {
+                    ToastUtil.showToast(VideoPlayerJzActivity.this,"点击了"+position+"条目");
+                }
+            });
+            View.OnClickListener listener = new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    switch (v.getId()){
+                        case R.id.iv_cancel:
+                            if(AppUtil.isActivityLiving(VideoPlayerJzActivity.this)){
+                                popMenu.dismiss();
+                            }
+                            break;
+                        case R.id.iv_download:
+
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            };
+            ivCancel.setOnClickListener(listener);
+            ivDownload.setOnClickListener(listener);
+        }
+    }
+
+
+
     /**
      * 这只是给埋点统计用户数据用的,不能写和播放相关的逻辑,监听事件请参考MyJZVideoPlayerStandard,复写函数取得相应事件
      */

+ 107 - 15
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/VideoPlayerMeActivity.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerMeActivity.java

@@ -1,4 +1,4 @@
-package org.yczbj.ycvideoplayer.ui.main.view.activity;
+package org.yczbj.ycvideoplayer.ui.home.view.activity;
 
 import android.annotation.SuppressLint;
 import android.graphics.Color;
@@ -19,7 +19,9 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.blankj.utilcode.util.ScreenUtils;
 import com.blankj.utilcode.util.SizeUtils;
+import com.pedaily.yc.ycdialoglib.bottomLayout.BottomDialog;
 import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
 
 import org.yczbj.ycrefreshviewlib.YCRefreshView;
@@ -27,15 +29,21 @@ import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
 import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
 import org.yczbj.ycrefreshviewlib.item.SpaceViewItemLine;
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.BaseActivity;
-import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerFavorite;
-import org.yczbj.ycvideoplayer.ui.main.presenter.VideoPlayerMePresenter;
-import org.yczbj.ycvideoplayer.ui.main.view.adapter.NarrowImageAdapter;
-import org.yczbj.ycvideoplayer.ui.main.view.adapter.VideoPlayerMeAdapter;
-import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
-import org.yczbj.ycvideoplayer.util.ImageUtils;
+import org.yczbj.ycvideoplayer.ui.home.contract.VideoPlayerMeContract;
+import org.yczbj.ycvideoplayer.ui.home.model.DialogListBean;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerFavorite;
+import org.yczbj.ycvideoplayer.ui.home.presenter.VideoPlayerMePresenter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.DialogListAdapter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.NarrowImageAdapter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.VideoPlayerMeAdapter;
+import org.yczbj.ycvideoplayer.ui.me.view.MeLoginActivity;
+import org.yczbj.ycvideoplayer.ui.test.view.second.TestSecondActivity;
+import org.yczbj.ycvideoplayer.util.AppUtil;
+import org.yczbj.ycvideoplayerlib.ConstantKeys;
+import org.yczbj.ycvideoplayerlib.OnMemberClickListener;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerController;
 
@@ -114,17 +122,37 @@ public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMe
 
     private void initVideoPlayer() {
         //设置播放类型
-        // IjkPlayer or MediaPlayer
-        videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        // MediaPlayer
+        //videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        // IjkPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
         //网络视频地址
-        String videoUrl = DataUtil.getVideoListData().get(0).getVideoUrl();
+        String videoUrl = ConstantVideo.VideoPlayerList[1];
         //设置视频地址和请求头部
         videoPlayer.setUp(videoUrl, null);
         //创建视频控制器
         VideoPlayerController controller = new VideoPlayerController(this);
         controller.setTitle("高仿优酷视频播放页面");
-        controller.setLength(98000);
-        ImageUtils.loadImgByPicasso(this, R.drawable.image_default, R.drawable.image_default, controller.imageView());
+        //controller.setLength(98000);
+        controller.setLoadingType(2);
+        controller.setMemberType(false,false,2,true);
+        controller.imageView().setBackgroundResource(R.color.blackText);
+        //ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
+        controller.setOnMemberClickListener(new OnMemberClickListener() {
+            @Override
+            public void onClick(int type) {
+                switch (type){
+                    case ConstantKeys.Gender.LOGIN:
+                        startActivity(MeLoginActivity.class);
+                        break;
+                    case ConstantKeys.Gender.MEMBER:
+                        startActivity(TestSecondActivity.class);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
         //设置视频控制器
         videoPlayer.setController(controller);
         //是否从上一次的位置继续播放
@@ -201,7 +229,9 @@ public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMe
                                 ToastUtil.showToast(VideoPlayerMeActivity.this,"收藏视频");
                                 break;
                             case R.id.iv_player_download:
-
+                                ToastUtil.showToast(VideoPlayerMeActivity.this,"下载视频");
+                                showDownloadDialog();
+                                presenter.startDownload();
                                 break;
                             case R.id.iv_player_share:
                                 ToastUtil.showToast(VideoPlayerMeActivity.this,"分享视频");
@@ -328,4 +358,66 @@ public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMe
     }
 
 
+    /**
+     * 弹出下载对话框
+     */
+    private void showDownloadDialog() {
+        final List<DialogListBean> list = new ArrayList<>();
+        for(int a = 0; a< ConstantVideo.VideoPlayerList.length; a++){
+            DialogListBean dialogListBean = new DialogListBean("logo",
+                    "name","title",ConstantVideo.VideoPlayerList[a]);
+            list.add(dialogListBean);
+        }
+        BottomDialog.create(getSupportFragmentManager())
+            .setViewListener(new BottomDialog.ViewListener() {
+                @Override
+                public void bindView(View v) {
+                    RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
+                    ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
+                    ImageView ivDownload = (ImageView) v.findViewById(R.id.iv_download);
+                    ivCancel.setVisibility(View.GONE);
+
+                    recyclerView.setLayoutManager(new LinearLayoutManager(VideoPlayerMeActivity.this));
+                    DialogListAdapter mAdapter = new DialogListAdapter(VideoPlayerMeActivity.this, list);
+                    recyclerView.setAdapter(mAdapter);
+                    final RecycleViewItemLine line = new RecycleViewItemLine(
+                            VideoPlayerMeActivity.this, LinearLayout.HORIZONTAL,
+                            SizeUtils.dp2px(1),
+                            VideoPlayerMeActivity.this.getResources().getColor(R.color.grayLine));
+                    recyclerView.addItemDecoration(line);
+                    mAdapter.setOnItemClickListener(new DialogListAdapter.OnItemClickListener() {
+                        @Override
+                        public void onItemClick(int position) {
+
+                        }
+                    });
+                    View.OnClickListener listener = new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            switch (v.getId()){
+                                case R.id.iv_cancel:
+
+                                    break;
+                                case R.id.iv_download:
+
+                                    break;
+                                default:
+                                    break;
+                            }
+                        }
+                    };
+                    ivCancel.setOnClickListener(listener);
+                    ivDownload.setOnClickListener(listener);
+                }
+            })
+            .setLayoutRes(R.layout.dialog_bottom_list_view)
+            .setDimAmount(0.5f)
+            .setTag("BottomDialog")
+            .setCancelOutside(true)
+            .setHeight(ScreenUtils.getScreenHeight()-videoPlayer.getHeight()
+                    -AppUtil.getStatusBarHeight(this))
+            .show();
+    }
+
+
 }

+ 3 - 3
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/BannerPagerAdapter.java

@@ -8,7 +8,7 @@ import android.widget.ImageView;
 import com.yc.cn.ycbannerlib.first.adapter.StaticPagerAdapter;
 
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.util.ImageUtils;
+import org.yczbj.ycvideoplayer.util.ImageUtil;
 
 import java.util.List;
 
@@ -38,9 +38,9 @@ public class BannerPagerAdapter extends StaticPagerAdapter {
         imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         //加载图片
         if(list!=null){
-            ImageUtils.loadImgByPicasso(ctx,list.get(position), R.drawable.image_default,imageView);
+            ImageUtil.loadImgByPicasso(ctx,list.get(position), R.drawable.image_default,imageView);
         }else {
-            ImageUtils.loadImgByPicasso(ctx, R.drawable.image_default,imageView);
+            ImageUtil.loadImgByPicasso(ctx, R.drawable.image_default,imageView);
         }
         return imageView;
     }

+ 117 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/DialogListAdapter.java

@@ -0,0 +1,117 @@
+package org.yczbj.ycvideoplayer.ui.home.view.adapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.ns.yc.ycprogresslib.CircleProgressbar;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.ui.home.model.DialogListBean;
+
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+public class DialogListAdapter extends RecyclerView.Adapter<DialogListAdapter.ViewHolder> {
+
+
+    private LayoutInflater inflater;
+    private List<DialogListBean> mList;
+    private Context mContext;
+    private OnItemClickListener onItemClickListener;
+    private ViewHolder holder;
+
+    public DialogListAdapter(Context mContext, List<DialogListBean> mList) {
+        this.mList = mList;
+        this.mContext = mContext;
+        inflater = LayoutInflater.from(mContext);
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        holder = new ViewHolder(inflater.inflate(R.layout.item_dialog_list_view, parent, false));
+        return holder;
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, final int position) {
+        holder.tvTitle.setText(mList.get(position).getTitle());
+        holder.tvTime.setText("时长98:00:12");
+        holder.tvVideoSize.setText("100MB");
+        holder.ivDownload.setImageResource(R.drawable.icon_cache_download);
+
+        //设置类型
+        holder.circlePb.setProgressType(CircleProgressbar.ProgressType.COUNT);
+        //设置圆形的填充颜色
+        holder.circlePb.setInCircleColor(mContext.getResources().getColor(R.color.colorTransparent));
+        //设置外部轮廓的颜色
+        holder.circlePb.setOutLineColor(mContext.getResources().getColor(R.color.gray3));
+        //设置进度监听
+        holder.circlePb.setCountdownProgressListener(1, progressListener);
+        //设置外部轮廓的颜色
+        holder.circlePb.setOutLineWidth(1);
+        //设置进度条线的宽度
+        holder.circlePb.setProgressLineWidth(2);
+        //设置进度
+        holder.circlePb.setProgress(50);
+
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (onItemClickListener != null) {
+                    onItemClickListener.onItemClick(position);
+                }
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        return mList.size();
+    }
+
+    class ViewHolder extends RecyclerView.ViewHolder {
+
+        @Bind(R.id.tv_title)
+        TextView tvTitle;
+        @Bind(R.id.tv_time)
+        TextView tvTime;
+        @Bind(R.id.iv_download)
+        ImageView ivDownload;
+        @Bind(R.id.circle_pb)
+        CircleProgressbar circlePb;
+        @Bind(R.id.tv_video_size)
+        TextView tvVideoSize;
+
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            ButterKnife.bind(this, itemView);
+        }
+    }
+
+    private CircleProgressbar.OnCountdownProgressListener progressListener = new CircleProgressbar.OnCountdownProgressListener() {
+        @Override
+        public void onProgress(int what, int progress) {
+            if (what == 1) {
+                holder.circlePb.setText("0");
+            }
+        }
+    };
+
+
+    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+
+    public interface OnItemClickListener {
+        void onItemClick(int id);
+    }
+}

+ 458 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/DownloadVideoAdapter.java

@@ -0,0 +1,458 @@
+package org.yczbj.ycvideoplayer.ui.home.view.adapter;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadListener;
+import com.liulishuo.filedownloader.FileDownloadSampleListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.model.FileDownloadStatus;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+import com.ns.yc.ycprogresslib.CircleProgressbar;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.download.TaskViewHolderImp;
+import org.yczbj.ycvideoplayer.download.TasksManager;
+import org.yczbj.ycvideoplayer.download.TasksManagerModel;
+import org.yczbj.ycvideoplayer.ui.home.model.DialogListBean;
+import org.yczbj.ycvideoplayer.util.LogUtils;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+public class DownloadVideoAdapter extends RecyclerView.Adapter<DownloadVideoAdapter.ViewHolder> {
+
+
+    private LayoutInflater inflater;
+    private List<DialogListBean> mList;
+    private Context mContext;
+    private OnItemClickListener onItemClickListener;
+    private ViewHolder viewHolder;
+    //下载状态
+    private final String STATE_START = "start";
+    private final String STATE_STOP = "stop";
+    private final String STATE_DETAIL = "detail";
+
+    public DownloadVideoAdapter(Context mContext, List<DialogListBean> mList) {
+        this.mList = mList;
+        this.mContext = mContext;
+        inflater = LayoutInflater.from(mContext);
+        TasksManager.getImpl().onCreate(new WeakReference<>(this));
+    }
+
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        viewHolder = new ViewHolder(inflater.inflate(R.layout.item_dialog_list_view, parent, false));
+        return viewHolder;
+    }
+
+    @SuppressLint("SetTextI18n")
+    @Override
+    public void onBindViewHolder(ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
+        //final TasksManagerModel model = TasksManager.getImpl().get(position);
+        DialogListBean model = mList.get(position);
+        final String path = TasksManager.getImpl().createPath(model.getVideo());
+        int id = TasksManager.getImpl().getId(model.getVideo());
+        holder.update(id, position);
+        TasksManager.getImpl().updateViewHolder(holder.id, holder);
+
+        holder.tvTitle.setText(mList.get(position).getTitle());
+        holder.tvTime.setText("时长98:00:12");
+        holder.tvVideoSize.setText("100MB");
+        holder.ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+
+        //设置类型
+        holder.circlePb.setProgressType(CircleProgressbar.ProgressType.COUNT);
+        //设置圆形的填充颜色
+        holder.circlePb.setInCircleColor(mContext.getResources().getColor(R.color.colorTransparent));
+        //设置外部轮廓的颜色
+        holder.circlePb.setOutLineColor(mContext.getResources().getColor(R.color.gray3));
+        //设置进度监听
+        holder.circlePb.setCountdownProgressListener(1, progressListener);
+        //设置外部轮廓的颜色
+        holder.circlePb.setOutLineWidth(1);
+        //设置进度条线的宽度
+        holder.circlePb.setProgressLineWidth(3);
+        //设置进度
+        holder.circlePb.setProgress(0);
+
+        //状态: 加载中...
+        LogUtils.e(DownloadVideoAdapter.class.getName()+" ----- "+holder.toString());
+        holder.llDownload.setTag(holder);
+        holder.tvDownloadState.setTag(STATE_START);
+        holder.llDownload.setOnClickListener(listener);
+
+        //条目点击事件
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                if (onItemClickListener != null) {
+                    onItemClickListener.onItemClick(position);
+                }
+            }
+        });
+
+
+        if (TasksManager.getImpl().isReady()) {
+            final int status = TasksManager.getImpl().getStatus(model.getId(), path);
+            if (status == FileDownloadStatus.pending || status == FileDownloadStatus.started ||
+                    status == FileDownloadStatus.connected) {
+                // start task, but file not created yet
+                holder.updateDownloading(status, TasksManager.getImpl().getSoFar(model.getId())
+                        , TasksManager.getImpl().getTotal(model.getId()));
+            } else if (!new File(path).exists() && !new File(FileDownloadUtils.getTempPath(path)).exists()) {
+                // not exist file
+                holder.updateNotDownloaded(status, 0, 0);
+            } else if (TasksManager.getImpl().isDownloaded(status)) {
+                // already downloaded and exist
+                holder.updateDownloaded();
+            } else if (status == FileDownloadStatus.progress) {
+                // downloading
+                holder.updateDownloading(status, TasksManager.getImpl().getSoFar(model.getId())
+                        , TasksManager.getImpl().getTotal(model.getId()));
+            } else {
+                // not start
+                holder.updateNotDownloaded(status, TasksManager.getImpl().getSoFar(model.getId())
+                        , TasksManager.getImpl().getTotal(model.getId()));
+            }
+        } else {
+            //状态: 加载中...
+            LogUtils.e(DownloadVideoAdapter.class.getName()+" ----- 状态: 加载中...");
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return mList==null ? 0 :mList.size();
+    }
+
+    class ViewHolder extends RecyclerView.ViewHolder implements TaskViewHolderImp {
+
+        private int position;
+        public int id;
+
+        @Bind(R.id.tv_title)
+        TextView tvTitle;
+        @Bind(R.id.tv_time)
+        TextView tvTime;
+        @Bind(R.id.ll_download)
+        LinearLayout llDownload;
+        @Bind(R.id.iv_download)
+        ImageView ivDownload;
+        @Bind(R.id.circle_pb)
+        CircleProgressbar circlePb;
+        @Bind(R.id.tv_video_size)
+        TextView tvVideoSize;
+        @Bind(R.id.tv_download_state)
+        TextView tvDownloadState;
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            ButterKnife.bind(this, itemView);
+        }
+
+        @Override
+        public void update(int id, int position) {
+            this.id = id;
+            this.position = position;
+        }
+
+        @Override
+        public void updateDownloaded() {
+            LogUtils.e(DownloadVideoAdapter.class.getName()+" ----- updateDownloaded: ");
+            //当下载完成后,隐藏圆环控件,显示删除图标
+            circlePb.setVisibility(View.GONE);
+            circlePb.setProgress(1);
+            ivDownload.setBackgroundResource(R.drawable.icon_cache_delete);
+            tvDownloadState.setTag(STATE_DETAIL);
+            tvDownloadState.setText("下载完成");
+
+            /*TasksManager.getImpl().deleteTasksManagerModel(videolistBean.getVideoUrl());
+            if (!TasksManager.getImpl().isExistDownloadFile(videolistBean.getVideoUrl())) {
+                TasksManager.getImpl().addDownloaded(videolistBean);
+            }*/
+        }
+
+        @SuppressLint("DefaultLocale")
+        @Override
+        public void updateNotDownloaded(int status, long sofar, long total) {
+            LogUtils.e(DownloadVideoAdapter.class.getName()+" ----- updateNotDownloaded: ");
+            if (sofar > 0 && total > 0) {
+                final float percent = sofar / (float) total;
+                circlePb.setProgress((int) (percent * 100));
+            } else {
+                circlePb.setProgress(0);
+            }
+            switch (status) {
+                case FileDownloadStatus.error:
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setTag(STATE_START);
+                    tvDownloadState.setText("错误");
+                    break;
+                case FileDownloadStatus.paused:
+                    tvVideoSize.setText(String.format("%dMB",total/1024/1024));
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setTag(STATE_START);
+                    tvDownloadState.setText("暂停");
+                    break;
+                default:
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setTag(STATE_START);
+                    break;
+            }
+        }
+
+        @Override
+        public void updateDownloading(int status, long sofar, long total) {
+            LogUtils.e(DownloadVideoAdapter.class.getName()+" ----- updateDownloading: ");
+            final float percent = sofar / (float) total;
+            circlePb.setProgress((int) (percent * 100));
+            switch (status) {
+                case FileDownloadStatus.pending:
+                    tvDownloadState.setText("排队中");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setTag(STATE_START);
+                    break;
+                case FileDownloadStatus.started:
+                    tvDownloadState.setText("开始下载");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setTag(STATE_START);
+                    break;
+                case FileDownloadStatus.connected:
+                    tvDownloadState.setText("链接中");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    tvDownloadState.setTag(STATE_START);
+                    break;
+                case FileDownloadStatus.progress:
+                    tvDownloadState.setText("下载中");
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_play);
+                    tvDownloadState.setTag(STATE_STOP);
+                    break;
+                default:
+                    ivDownload.setBackgroundResource(R.drawable.icon_cache_play);
+                    tvDownloadState.setTag(STATE_STOP);
+                    break;
+            }
+        }
+    }
+
+
+    public View.OnClickListener listener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (v.getTag() == null) {
+                return;
+            }
+            Object tag = v.getTag();
+            LogUtils.e(DownloadVideoAdapter.class.getName()+" ----- " +tag.toString());
+            ViewHolder holder = (ViewHolder) v.getTag();
+            String state = (String) holder.tvDownloadState.getTag();
+            DialogListBean model = mList.get(holder.position);
+            switch (state){
+                //下载
+                case STATE_START:
+                    //ToastUtil.showToast(mContext,"开始下载");
+                    /*final TasksManagerModel model = TasksManager.getImpl().get(holder.position);
+                    final BaseDownloadTask task = FileDownloader.getImpl().create(model.getUrl())
+                            .setPath(model.getPath())
+                            .setCallbackProgressTimes(100)
+                            .setListener(taskDownloadListener);
+                    TasksManager.getImpl().addTaskForViewHolder(task);
+                    TasksManager.getImpl().updateViewHolder(holder.id, holder);
+                    task.start();*/
+
+                    String path = TasksManager.getImpl().createPath(model.getVideo());
+                    final BaseDownloadTask task = FileDownloader.getImpl().create(model.getVideo())
+                            .setPath(path)
+                            .setCallbackProgressTimes(500)
+                            .setListener(taskDownloadListener);
+                    TasksManager.getImpl().addTaskForViewHolder(task);
+                    TasksManager.getImpl().updateViewHolder(holder.id, holder);
+                    task.start();
+                    viewHolder.tvDownloadState.setText("开始下载");
+                    LogUtils.e(DownloadVideoAdapter.class.getName()+" --开始下载--- "+ holder.position
+                            + "-----" +model.getVideo());
+                    break;
+                //暂停
+                case STATE_STOP:
+                    //ToastUtil.showToast(mContext,"暂停下载");
+                    FileDownloader.getImpl().pause(holder.id);
+                    holder.ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    holder.tvDownloadState.setTag(STATE_START);
+                    viewHolder.tvDownloadState.setText("暂停下载");
+                    LogUtils.e(DownloadVideoAdapter.class.getName()+" --暂停下载--- "+ holder.position
+                            + "-----" +model.getVideo());
+                    break;
+                //删除
+                case STATE_DETAIL:
+                    //ToastUtil.showToast(mContext,"删除文件");
+                    // to delete
+                    // File file = new File(TasksManager.getImpl().get(holder.position).getPath());
+                    // 删除文件file.delete();
+                    File file = new File(TasksManager.getImpl().createPath(model.getVideo()));
+                    //noinspection ResultOfMethodCallIgnored
+                    file.delete();
+                    holder.updateNotDownloaded(FileDownloadStatus.INVALID_STATUS, 0, 0);
+                    holder.ivDownload.setBackgroundResource(R.drawable.icon_cache_download);
+                    holder.tvDownloadState.setTag(STATE_START);
+                    holder.circlePb.setVisibility(View.VISIBLE);
+                    viewHolder.tvDownloadState.setText("已经删除");
+                    LogUtils.e(DownloadVideoAdapter.class.getName()+" --已经删除--- "+ holder.position
+                            + "-----" +model.getVideo());
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+
+
+    /**
+     * 这个是用来监听下载的情况[没问题]
+     * 1.下载队列中
+     * 2.开始下载
+     * 3.连接中
+     * 4.下载中
+     * 5.下载错误
+     * 6.暂停
+     * 7.完成
+     */
+    private FileDownloadListener taskDownloadListener = new FileDownloadSampleListener() {
+
+        private ViewHolder checkCurrentHolder(final BaseDownloadTask task) {
+            final ViewHolder tag = (ViewHolder) task.getTag();
+            if (tag.id != task.getId()) {
+                return null;
+            }
+            return tag;
+        }
+
+        @Override
+        protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.pending(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.pending, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("队列中");
+        }
+
+        @Override
+        protected void started(BaseDownloadTask task) {
+            super.started(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.tvDownloadState.setText("状态: 开始下载");
+        }
+
+        @Override
+        protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
+            super.connected(task, etag, isContinue, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.connected, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("状态: 连接中");
+        }
+
+        @Override
+        protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.progress(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloading(FileDownloadStatus.progress, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("状态: 下载中");
+        }
+
+        @Override
+        protected void error(BaseDownloadTask task, Throwable e) {
+            super.error(task, e);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateNotDownloaded(FileDownloadStatus.error, task.getLargeFileSoFarBytes()
+                    , task.getLargeFileTotalBytes());
+            tag.tvDownloadState.setText("状态: 错误");
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            super.paused(task, soFarBytes, totalBytes);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateNotDownloaded(FileDownloadStatus.paused, soFarBytes, totalBytes);
+            tag.tvDownloadState.setText("状态: 暂停");
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+
+        @Override
+        protected void completed(BaseDownloadTask task) {
+            super.completed(task);
+            final ViewHolder tag = checkCurrentHolder(task);
+            if (tag == null) {
+                return;
+            }
+            tag.updateDownloaded();
+            tag.tvDownloadState.setText("状态: 完成");
+            TasksManager.getImpl().removeTaskForViewHolder(task.getId());
+        }
+    };
+
+
+    private CircleProgressbar.OnCountdownProgressListener progressListener = new CircleProgressbar.OnCountdownProgressListener() {
+        @Override
+        public void onProgress(int what, int progress) {
+            if (what == 1) {
+                viewHolder.circlePb.setText("0");
+            }
+        }
+    };
+
+    public void postNotifyDataChanged() {
+        ((Activity) mContext).runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                notifyDataSetChanged();
+            }
+        });
+    }
+
+
+    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+
+
+    public interface OnItemClickListener {
+        void onItemClick(int id);
+    }
+
+
+}

+ 2 - 3
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/adapter/NarrowImageAdapter.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/NarrowImageAdapter.java

@@ -1,13 +1,12 @@
-package org.yczbj.ycvideoplayer.ui.main.view.adapter;
+package org.yczbj.ycvideoplayer.ui.home.view.adapter;
 
 import android.content.Context;
 import android.view.ViewGroup;
-import android.widget.ImageView;
 
 import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
 import org.yczbj.ycrefreshviewlib.viewHolder.BaseViewHolder;
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerFavorite;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerFavorite;
 
 
 public class NarrowImageAdapter extends RecyclerArrayAdapter<VideoPlayerFavorite> {

+ 2 - 3
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/adapter/VideoPlayerMeAdapter.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/adapter/VideoPlayerMeAdapter.java

@@ -1,6 +1,5 @@
-package org.yczbj.ycvideoplayer.ui.main.view.adapter;
+package org.yczbj.ycvideoplayer.ui.home.view.adapter;
 
-import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.view.View;
 import android.view.ViewGroup;
@@ -11,7 +10,7 @@ import android.widget.TextView;
 import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
 import org.yczbj.ycrefreshviewlib.viewHolder.BaseViewHolder;
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerComment;
 
 
 public class VideoPlayerMeAdapter extends RecyclerArrayAdapter<VideoPlayerComment> {

+ 32 - 13
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/HomeFragment.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/fragment/HomeFragment.java

@@ -1,15 +1,18 @@
-package org.yczbj.ycvideoplayer.ui.home.view;
+package org.yczbj.ycvideoplayer.ui.home.view.fragment;
 
 import android.content.Context;
 import android.graphics.Color;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
+import android.widget.ImageView;
 
 import com.alibaba.android.vlayout.DelegateAdapter;
 import com.alibaba.android.vlayout.VirtualLayoutManager;
 import com.alibaba.android.vlayout.layout.GridLayoutHelper;
 import com.alibaba.android.vlayout.layout.LinearLayoutHelper;
+import com.blankj.utilcode.util.ImageUtils;
+import com.blankj.utilcode.util.SizeUtils;
 import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
 import com.yc.cn.ycbannerlib.first.BannerView;
 import com.yc.cn.ycbannerlib.first.util.SizeUtil;
@@ -17,14 +20,17 @@ import com.yc.cn.ycbaseadapterlib.first.BaseViewHolder;
 
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.api.Constant;
+import org.yczbj.ycvideoplayer.api.ConstantImage;
 import org.yczbj.ycvideoplayer.base.BaseDelegateAdapter;
 import org.yczbj.ycvideoplayer.base.BaseFragment;
+import org.yczbj.ycvideoplayer.ui.home.view.activity.VideoPlayerJzActivity;
+import org.yczbj.ycvideoplayer.ui.home.view.activity.VideoPlayerMeActivity;
 import org.yczbj.ycvideoplayer.ui.home.view.adapter.BannerPagerAdapter;
-import org.yczbj.ycvideoplayer.ui.main.view.MainActivity;
-import org.yczbj.ycvideoplayer.ui.main.view.activity.VideoPlayerJzActivity;
-import org.yczbj.ycvideoplayer.ui.main.view.activity.VideoPlayerMeActivity;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.MainActivity;
 import org.yczbj.ycvideoplayer.ui.test.TestActivity;
 import org.yczbj.ycvideoplayer.ui.test2.TestMyActivity;
+import org.yczbj.ycvideoplayer.ui.test3.GlideCropActivity;
+import org.yczbj.ycvideoplayer.util.ImageUtil;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -53,6 +59,8 @@ public class HomeFragment extends BaseFragment {
     private BannerView mBanner;
     private VirtualLayoutManager layoutManager;
     private int lastVisibleItem;
+    //存放各个模块的适配器
+    private List<DelegateAdapter.Adapter> mAdapters;
 
     @Override
     public void onAttach(Context context) {
@@ -83,7 +91,6 @@ public class HomeFragment extends BaseFragment {
         }
     }
 
-    private List<DelegateAdapter.Adapter> mAdapters;        //存放各个模块的适配器
 
     @Override
     public int getContentView() {
@@ -115,6 +122,7 @@ public class HomeFragment extends BaseFragment {
         initRefreshView();
     }
 
+
     private void initRefreshView() {
         refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
@@ -157,6 +165,7 @@ public class HomeFragment extends BaseFragment {
 
     }
 
+
     /**
      * 添加不同类型数据布局
      */
@@ -173,6 +182,7 @@ public class HomeFragment extends BaseFragment {
         initListSixView();
     }
 
+
     private void initBannerView() {
         final ArrayList<String> arrayList = new ArrayList<>();
         arrayList.add("http://bpic.wotucdn.com/11/66/23/55bOOOPIC3c_1024.jpg!/fw/780/quality/90/unsharp/true/compress/true/watermark/url/L2xvZ28ud2F0ZXIudjIucG5n/repeat/true");
@@ -221,7 +231,7 @@ public class HomeFragment extends BaseFragment {
                                 startActivity(VideoPlayerJzActivity.class);
                                 break;
                             case R.id.tv_home_five:
-
+                                startActivity(GlideCropActivity.class);
                                 break;
                             default:
                                 break;
@@ -252,7 +262,10 @@ public class HomeFragment extends BaseFragment {
             @Override
             public void onBindViewHolder(BaseViewHolder holder, int position) {
                 super.onBindViewHolder(holder, position);
-
+                final ImageView ivImage = holder.getView(R.id.iv_image);
+                ivImage.setBackgroundResource(R.drawable.bg_small_tree_min);
+                //String image = ConstantImage.homePageConcentration[position];
+                //ImageUtil.loadImgByPicasso(activity,ConstantImage.homePageConcentration[position],R.drawable.image_default,ivImage);
             }
         };
         mAdapters.add(adapter);
@@ -308,14 +321,17 @@ public class HomeFragment extends BaseFragment {
         initTitleView(3);
         GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(2);
         gridLayoutHelper.setPadding(0, 16, 0, 16);
-        gridLayoutHelper.setVGap(16);   // 控制子元素之间的垂直间距
-        gridLayoutHelper.setHGap(0);    // 控制子元素之间的水平间距
+        // 控制子元素之间的垂直间距
+        gridLayoutHelper.setVGap(16);
+        // 控制子元素之间的水平间距
+        gridLayoutHelper.setHGap(0);
         gridLayoutHelper.setBgColor(Color.WHITE);
         BaseDelegateAdapter adapter = new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_grid, 2, Constant.viewType.typeGv3) {
             @Override
             public void onBindViewHolder(BaseViewHolder holder, int position) {
                 super.onBindViewHolder(holder, position);
-
+                ImageView ivImage = holder.getView(R.id.iv_image);
+                ivImage.setImageResource(R.drawable.bg_small_autumn_tree_min);
             }
         };
         mAdapters.add(adapter);
@@ -346,14 +362,17 @@ public class HomeFragment extends BaseFragment {
         initTitleView(5);
         GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(3);
         gridLayoutHelper.setPadding(0, 16, 0, 16);
-        gridLayoutHelper.setVGap(16);   // 控制子元素之间的垂直间距
-        gridLayoutHelper.setHGap(0);    // 控制子元素之间的水平间距
+        // 控制子元素之间的垂直间距
+        gridLayoutHelper.setVGap(16);
+        // 控制子元素之间的水平间距
+        gridLayoutHelper.setHGap(0);
         gridLayoutHelper.setBgColor(Color.WHITE);
         BaseDelegateAdapter adapter = new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_grid, 6, Constant.viewType.typeGvBottom) {
             @Override
             public void onBindViewHolder(BaseViewHolder holder, int position) {
                 super.onBindViewHolder(holder, position);
-
+                ImageView ivImage = holder.getView(R.id.iv_image);
+                ivImage.setImageResource(R.drawable.bg_small_leaves_min);
             }
         };
         mAdapters.add(adapter);

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/MainContract.java

@@ -7,7 +7,7 @@ import com.flyco.tablayout.listener.CustomTabEntity;
 
 import org.yczbj.ycvideoplayer.base.BasePresenter;
 import org.yczbj.ycvideoplayer.base.BaseView;
-import org.yczbj.ycvideoplayer.ui.main.view.MainActivity;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.MainActivity;
 
 import java.util.ArrayList;
 

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/MainPresenter.java

@@ -9,7 +9,7 @@ import com.flyco.tablayout.listener.CustomTabEntity;
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.bean.TabEntity;
 import org.yczbj.ycvideoplayer.ui.main.contract.MainContract;
-import org.yczbj.ycvideoplayer.ui.main.view.MainActivity;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.MainActivity;
 
 import java.util.ArrayList;
 

+ 30 - 4
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/MainActivity.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/MainActivity.java

@@ -1,23 +1,28 @@
-package org.yczbj.ycvideoplayer.ui.main.view;
+package org.yczbj.ycvideoplayer.ui.main.view.activity;
 
 import android.app.Activity;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
 import android.support.v4.view.ViewPager;
+import android.view.KeyEvent;
 
+import com.blankj.utilcode.util.ToastUtils;
 import com.flyco.tablayout.CommonTabLayout;
 import com.flyco.tablayout.listener.CustomTabEntity;
 import com.flyco.tablayout.listener.OnTabSelectListener;
+import com.liulishuo.filedownloader.FileDownloader;
 import com.ns.yc.ycutilslib.managerLeak.InputMethodManagerLeakUtils;
 import com.ns.yc.ycutilslib.viewPager.NoSlidingViewPager;
 
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.AppManager;
 import org.yczbj.ycvideoplayer.base.BaseActivity;
 import org.yczbj.ycvideoplayer.base.BasePagerAdapter;
-import org.yczbj.ycvideoplayer.ui.find.FindFragment;
-import org.yczbj.ycvideoplayer.ui.home.view.HomeFragment;
-import org.yczbj.ycvideoplayer.ui.me.MeFragment;
+import org.yczbj.ycvideoplayer.download.TasksManager;
+import org.yczbj.ycvideoplayer.ui.find.view.FindFragment;
+import org.yczbj.ycvideoplayer.ui.home.view.fragment.HomeFragment;
+import org.yczbj.ycvideoplayer.ui.me.view.MeFragment;
 import org.yczbj.ycvideoplayer.ui.main.contract.MainContract;
 import org.yczbj.ycvideoplayer.ui.main.presenter.MainPresenter;
 import org.yczbj.ycvideoplayer.ui.special.SpecialFragment;
@@ -45,6 +50,7 @@ public class MainActivity extends BaseActivity implements MainContract.View{
     CommonTabLayout ctlTable;
 
     private MainContract.Presenter presenter = new MainPresenter(this);
+    private long exitTime;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -162,6 +168,26 @@ public class MainActivity extends BaseActivity implements MainContract.View{
         return this;
     }
 
+    /**
+     * 监听back键处理DrawerLayout和SearchView
+     */
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+            if ((System.currentTimeMillis() - exitTime) > 2000) {
+                ToastUtils.showShort("再按一次退出");
+                exitTime = System.currentTimeMillis();
+            } else {
+                // 关闭文件下载
+                TasksManager.getImpl().onDestroy();
+                FileDownloader.getImpl().pauseAll();
+                finish();
+                AppManager.getAppManager().AppExit(false);
+            }
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
 
 
 }

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/me/MeFragment.java → app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeFragment.java

@@ -1,4 +1,4 @@
-package org.yczbj.ycvideoplayer.ui.me;
+package org.yczbj.ycvideoplayer.ui.me.view;
 
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.base.BaseFragment;

+ 58 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeLoginActivity.java

@@ -0,0 +1,58 @@
+package org.yczbj.ycvideoplayer.ui.me.view;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+/**
+ * Created by yc on 2018/1/15.
+ */
+
+public class MeLoginActivity extends BaseActivity implements View.OnClickListener {
+
+    @Bind(R.id.tv_fail)
+    TextView tvFail;
+    @Bind(R.id.tv_success)
+    TextView tvSuccess;
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_me_login;
+    }
+
+    @Override
+    public void initView() {
+
+    }
+
+    @Override
+    public void initListener() {
+        tvFail.setOnClickListener(this);
+        tvSuccess.setOnClickListener(this);
+    }
+
+    @Override
+    public void initData() {
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.tv_fail:
+
+                break;
+            case R.id.tv_success:
+
+                break;
+            default:
+                break;
+        }
+    }
+}

+ 56 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/me/view/MeMemberActivity.java

@@ -0,0 +1,56 @@
+package org.yczbj.ycvideoplayer.ui.me.view;
+
+import android.view.View;
+import android.widget.TextView;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+
+import butterknife.Bind;
+
+/**
+ * Created by yc on 2018/1/15.
+ */
+
+public class MeMemberActivity extends BaseActivity implements View.OnClickListener {
+
+    @Bind(R.id.tv_fail)
+    TextView tvFail;
+    @Bind(R.id.tv_success)
+    TextView tvSuccess;
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_me_login;
+    }
+
+    @Override
+    public void initView() {
+
+    }
+
+    @Override
+    public void initListener() {
+        tvFail.setOnClickListener(this);
+        tvSuccess.setOnClickListener(this);
+    }
+
+    @Override
+    public void initData() {
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.tv_fail:
+
+                break;
+            case R.id.tv_success:
+
+                break;
+            default:
+                break;
+        }
+    }
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 14 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/other/HomeBean.java


+ 310 - 5
app/src/main/java/org/yczbj/ycvideoplayer/ui/special/SpecialFragment.java

@@ -1,33 +1,338 @@
 package org.yczbj.ycvideoplayer.ui.special;
 
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.Nullable;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.blankj.utilcode.util.SizeUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+import com.yc.cn.ycbannerlib.first.BannerView;
+import com.yc.cn.ycbannerlib.first.util.SizeUtil;
+
+import org.yczbj.ycrefreshviewlib.YCRefreshView;
+import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
+import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
+import org.yczbj.ycrefreshviewlib.item.SpaceViewItemLine;
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.base.BaseFragment;
+import org.yczbj.ycvideoplayer.ui.home.model.VideoPlayerFavorite;
+import org.yczbj.ycvideoplayer.ui.home.view.activity.VideoPlayerJzActivity;
+import org.yczbj.ycvideoplayer.ui.home.view.activity.VideoPlayerMeActivity;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.BannerPagerAdapter;
+import org.yczbj.ycvideoplayer.ui.home.view.adapter.NarrowImageAdapter;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.MainActivity;
+import org.yczbj.ycvideoplayer.ui.special.contract.SpecialContract;
+import org.yczbj.ycvideoplayer.ui.special.model.SpecialBean;
+import org.yczbj.ycvideoplayer.ui.special.presenter.SpecialPresenter;
+import org.yczbj.ycvideoplayer.ui.special.view.SpecialAdapter;
+import org.yczbj.ycvideoplayer.ui.test2.TestMyActivity;
+import org.yczbj.ycvideoplayer.ui.test3.DLHybridTestActivity;
+import org.yczbj.ycvideoplayer.ui.test3.DLManyTestActivity;
+import org.yczbj.ycvideoplayer.ui.test3.DLMyFileTestActivity;
+import org.yczbj.ycvideoplayer.ui.test3.DLNotificationTestActivity;
+import org.yczbj.ycvideoplayer.ui.test3.GlideCropActivity;
+import org.yczbj.ycvideoplayer.ui.test3.DLSingleTestActivity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.Bind;
 
 /**
  * Description:
- * Update:
+ * Update:2018/1/2
  * CreatedTime:2017/12/29
- * Author:MysteryCode
+ * Author:yc
  */
 
-public class SpecialFragment extends BaseFragment {
+public class SpecialFragment extends BaseFragment implements SpecialContract.View {
+
+
+    @Bind(R.id.recyclerView)
+    YCRefreshView recyclerView;
+    private MainActivity activity;
+
+    private SpecialContract.Presenter presenter = new SpecialPresenter(this);
+    private SpecialAdapter adapter;
+    private BannerView mBanner;
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        activity = (MainActivity) context;
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        activity = null;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        presenter.subscribe();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        presenter.unSubscribe();
+    }
+
     @Override
     public int getContentView() {
-        return R.layout.fragment_me;
+        return R.layout.base_easy_recycle;
     }
 
     @Override
     public void initView() {
-
+        initYCRefreshView();
     }
 
+
     @Override
     public void initListener() {
+        adapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(int position) {
 
+            }
+        });
     }
 
     @Override
     public void initData() {
+        recyclerView.showProgress();
+        presenter.getData();
+    }
+
+
+    private void initYCRefreshView() {
+        recyclerView.setLayoutManager(new LinearLayoutManager(activity));
+        final RecycleViewItemLine line = new RecycleViewItemLine(activity, LinearLayout.HORIZONTAL,
+                SizeUtils.dp2px(1), Color.parseColor("#f5f5f7"));
+        recyclerView.addItemDecoration(line);
+        adapter = new SpecialAdapter(activity);
+        recyclerView.setAdapter(adapter);
+        addHeader();
+        recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                SwipeRefreshLayout swipeToRefresh = recyclerView.getSwipeToRefresh();
+                if (swipeToRefresh.isRefreshing()) {
+                    recyclerView.setRefreshing(false);
+                }
+            }
+        });
+    }
+
+    private void addHeader() {
+        adapter.removeAllHeader();
+        initTopHeaderView();
+        initVideoContentView();
+        initHeaderTitle();
+        initHorizontalView();
+        initBottomHeaderView();
+    }
 
+
+    private void initTopHeaderView() {
+        final ArrayList<String> arrayList = new ArrayList<>();
+        arrayList.add("http://bpic.wotucdn.com/11/66/23/55bOOOPIC3c_1024.jpg!/fw/780/quality/90/unsharp/true/compress/true/watermark/url/L2xvZ28ud2F0ZXIudjIucG5n/repeat/true");
+        arrayList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505470629546&di=194a9a92bfcb7754c5e4d19ff1515355&imgtype=0&src=http%3A%2F%2Fpics.jiancai.com%2Fimgextra%2Fimg01%2F656928666%2Fi1%2FT2_IffXdxaXXXXXXXX_%2521%2521656928666.jpg");
+        arrayList.add("http://bpic.wotucdn.com/11/66/23/55bOOOPIC3c_1024.jpg!/fw/780/quality/90/unsharp/true/compress/true/watermark/url/L2xvZ28ud2F0ZXIudjIucG5n/repeat/true");
+        arrayList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505470629546&di=194a9a92bfcb7754c5e4d19ff1515355&imgtype=0&src=http%3A%2F%2Fpics.jiancai.com%2Fimgextra%2Fimg01%2F656928666%2Fi1%2FT2_IffXdxaXXXXXXXX_%2521%2521656928666.jpg");
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(activity).inflate(R.layout.head_special_top_view,
+                        parent, false);
+            }
+
+
+            @Override
+            public void onBindView(View headerView) {
+                View.OnClickListener listener = new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        switch (v.getId()){
+                            case R.id.tv_special_first:
+                                startActivity(DLSingleTestActivity.class);
+                                break;
+                            case R.id.tv_special_second:
+                                startActivity(DLManyTestActivity.class);
+                                break;
+                            case R.id.tv_special_third:
+                                startActivity(DLHybridTestActivity.class);
+                                break;
+                            case R.id.tv_special_four:
+                                startActivity(DLNotificationTestActivity.class);
+                                break;
+                            case R.id.tv_special_five:
+                                startActivity(DLMyFileTestActivity.class);
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                };
+                headerView.findViewById(R.id.tv_special_first).setOnClickListener(listener);
+                headerView.findViewById(R.id.tv_special_second).setOnClickListener(listener);
+                headerView.findViewById(R.id.tv_special_third).setOnClickListener(listener);
+                headerView.findViewById(R.id.tv_special_four).setOnClickListener(listener);
+                headerView.findViewById(R.id.tv_special_five).setOnClickListener(listener);
+
+
+
+                // 绑定数据
+                mBanner = (BannerView) headerView.findViewById(R.id.banner);
+                mBanner.setHintGravity(2);
+                mBanner.setAnimationDuration(1000);
+                mBanner.setPlayDelay(3000);
+                mBanner.setHintPadding(0,0,0, SizeUtil.dip2px(activity,10));
+                mBanner.setAdapter(new BannerPagerAdapter(activity, arrayList));
+            }
+        });
+    }
+
+    private void initHeaderTitle() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(activity).inflate
+                        (R.layout.head_video_player_title, parent, false);
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerTitle = (TextView) headerView.findViewById(R.id.tv_player_title);
+                tvPlayerTitle.setText("热门推荐");
+            }
+        });
+    }
+
+
+    private void initHorizontalView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                RecyclerView recyclerView = new RecyclerView(parent.getContext()) {
+                    //为了不打扰横向RecyclerView的滑动操作,可以这样处理
+                    @SuppressLint("ClickableViewAccessibility")
+                    @Override
+                    public boolean onTouchEvent(MotionEvent event) {
+                        super.onTouchEvent(event);
+                        return true;
+                    }
+                };
+                RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+                layoutParams.setMargins(SizeUtils.dp2px(10), SizeUtils.dp2px(5),
+                        SizeUtils.dp2px(10), SizeUtils.dp2px(5));
+                recyclerView.setLayoutParams(layoutParams);
+                final NarrowImageAdapter narrowAdapter;
+                recyclerView.setAdapter(narrowAdapter = new NarrowImageAdapter(parent.getContext()));
+                recyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext(), LinearLayoutManager.HORIZONTAL, false));
+                recyclerView.addItemDecoration(new SpaceViewItemLine(SizeUtils.dp2px(8)));
+
+                narrowAdapter.setMore(R.layout.view_video_more_horizontal, new RecyclerArrayAdapter.OnLoadMoreListener() {
+                    @Override
+                    public void onLoadMore() {
+                        new Handler().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                ToastUtil.showToast(activity, "没有更多呢!");
+                            }
+                        }, 1000);
+                    }
+                });
+                List<VideoPlayerFavorite> favoriteList = new ArrayList<>();
+                for (int a = 0; a < 10; a++) {
+                    VideoPlayerFavorite videoPlayerFavorite = new VideoPlayerFavorite(
+                            "这个是猜你喜欢的标题", R.drawable.bg_small_tree_min, "");
+                    favoriteList.add(videoPlayerFavorite);
+
+                }
+                narrowAdapter.addAll(favoriteList);
+                return recyclerView;
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                //这里的处理别忘了
+                ((ViewGroup) headerView).requestDisallowInterceptTouchEvent(true);
+            }
+        });
+    }
+
+
+    private void initVideoContentView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(activity).inflate
+                        (R.layout.head_video_player_content, parent, false);
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerCurriculum = (TextView) headerView.findViewById(R.id.tv_player_curriculum);
+            }
+        });
+    }
+
+
+    private void initBottomHeaderView() {
+        adapter.addFooter(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                TextView tv = new TextView(activity);
+                tv.setLayoutParams(new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT, SizeUtils.dp2px(36)));
+                tv.setGravity(Gravity.CENTER);
+                tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
+                tv.setText("哥们,已经没有数据了……");
+                return tv;
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+
+            }
+        });
+    }
+
+
+    @Override
+    public void setAdapterView(List<SpecialBean> list) {
+        adapter.addAll(list);
+        adapter.notifyDataSetChanged();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(2000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }finally {
+                    recyclerView.showRecycler();
+                }
+            }
+        });
     }
 }

+ 28 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/special/contract/SpecialContract.java

@@ -0,0 +1,28 @@
+package org.yczbj.ycvideoplayer.ui.special.contract;
+
+
+import org.yczbj.ycvideoplayer.base.BasePresenter;
+import org.yczbj.ycvideoplayer.base.BaseView;
+import org.yczbj.ycvideoplayer.ui.special.model.SpecialBean;
+
+import java.util.List;
+
+/**
+ * Description:
+ * Update:2018/1/2
+ * CreatedTime:2017/12/29
+ * Author:yc
+ */
+
+public interface SpecialContract {
+
+    interface View extends BaseView {
+        void setAdapterView(List<SpecialBean> list);
+    }
+
+    interface Presenter extends BasePresenter {
+        void getData();
+    }
+
+
+}

+ 62 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/special/model/SpecialBean.java

@@ -0,0 +1,62 @@
+package org.yczbj.ycvideoplayer.ui.special.model;
+
+/**
+ * Created by yc on 2018/1/12.
+ */
+
+public class SpecialBean {
+
+    private String title;
+    private String content;
+    private String time;
+    private String author;
+    private int id;
+
+    public SpecialBean(String title, String content, String time, String author, int id) {
+        this.title = title;
+        this.content = content;
+        this.time = time;
+        this.author = author;
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+}

+ 57 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/special/presenter/SpecialPresenter.java

@@ -0,0 +1,57 @@
+package org.yczbj.ycvideoplayer.ui.special.presenter;
+
+import android.app.Activity;
+
+import org.yczbj.ycvideoplayer.ui.home.contract.HomeContract;
+import org.yczbj.ycvideoplayer.ui.special.contract.SpecialContract;
+import org.yczbj.ycvideoplayer.ui.special.model.SpecialBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import rx.subscriptions.CompositeSubscription;
+
+
+/**
+ * Description:
+ * Update:2018/1/2
+ * CreatedTime:2017/12/29
+ * Author:yc
+ */
+
+public class SpecialPresenter implements SpecialContract.Presenter {
+
+    private SpecialContract.View mView;
+    private CompositeSubscription mSubscriptions;
+    private Activity activity;
+
+    public SpecialPresenter(SpecialContract.View androidView) {
+        this.mView = androidView;
+        mSubscriptions = new CompositeSubscription();
+    }
+
+    @Override
+    public void subscribe() {
+
+    }
+
+
+    @Override
+    public void unSubscribe() {
+        mSubscriptions.clear();
+        if(activity!=null){
+            activity = null;
+        }
+    }
+
+
+    @Override
+    public void getData() {
+        List<SpecialBean> list = new ArrayList<>();
+        for(int a=0 ; a<10 ; a++){
+            SpecialBean bean = new SpecialBean("title","content","time","author",0);
+            list.add(bean);
+        }
+        mView.setAdapterView(list);
+    }
+}

+ 41 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/special/view/SpecialAdapter.java

@@ -0,0 +1,41 @@
+package org.yczbj.ycvideoplayer.ui.special.view;
+
+import android.app.Activity;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+
+import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
+import org.yczbj.ycrefreshviewlib.viewHolder.BaseViewHolder;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.ui.special.model.SpecialBean;
+
+public class SpecialAdapter extends RecyclerArrayAdapter<SpecialBean> {
+
+    public SpecialAdapter(Activity activity) {
+        super(activity);
+    }
+
+    @Override
+    public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) {
+        return new ExpressDeliveryViewHolder(parent);
+    }
+
+    private class ExpressDeliveryViewHolder extends BaseViewHolder<SpecialBean> {
+
+        ImageView iv_topic_face;
+        TextView tv_topic_name , tv_topic_tips ,tv_topic_comment , tv_topic_node ,tv_topic_title;
+
+        ExpressDeliveryViewHolder(ViewGroup parent) {
+            super(parent, R.layout.view_vlayout_news);
+
+        }
+
+        @Override
+        public void setData(SpecialBean data) {
+            super.setData(data);
+
+        }
+    }
+}

+ 114 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/MyVideoPlayer.java

@@ -0,0 +1,114 @@
+package org.yczbj.ycvideoplayer.ui.test2;
+
+import android.content.Context;
+
+import org.yczbj.ycvideoplayerlib.AbsVideoPlayerController;
+import org.yczbj.ycvideoplayerlib.VideoPlayer;
+
+import java.util.Map;
+
+/**
+ * Created by yc on 2018/1/16.
+ */
+
+public class MyVideoPlayer extends VideoPlayer {
+
+    public MyVideoPlayer(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void setUp(String url, Map<String, String> headers) {
+        super.setUp(url, headers);
+    }
+
+    @Override
+    public void setController(AbsVideoPlayerController controller) {
+        super.setController(controller);
+    }
+
+    @Override
+    public void setPlayerType(int playerType) {
+        super.setPlayerType(playerType);
+    }
+
+    @Override
+    public void continueFromLastPosition(boolean continueFromLastPosition) {
+        super.continueFromLastPosition(continueFromLastPosition);
+    }
+
+    @Override
+    public void setSpeed(float speed) {
+        super.setSpeed(speed);
+    }
+
+    @Override
+    public void start() {
+        super.start();
+    }
+
+    @Override
+    public void start(long position) {
+        super.start(position);
+    }
+
+    @Override
+    public void restart() {
+        super.restart();
+    }
+
+    @Override
+    public void pause() {
+        super.pause();
+    }
+
+    @Override
+    public void seekTo(long pos) {
+        super.seekTo(pos);
+    }
+
+    @Override
+    public void setVolume(int volume) {
+        super.setVolume(volume);
+    }
+
+    @Override
+    public boolean isIdle() {
+        return super.isIdle();
+    }
+
+    @Override
+    public boolean isPreparing() {
+        return super.isPreparing();
+    }
+
+    @Override
+    public boolean isPrepared() {
+        return super.isPrepared();
+    }
+
+    @Override
+    public boolean isBufferingPlaying() {
+        return super.isBufferingPlaying();
+    }
+
+    @Override
+    public boolean isBufferingPaused() {
+        return super.isBufferingPaused();
+    }
+
+    @Override
+    public boolean isPlaying() {
+        return super.isPlaying();
+    }
+
+    @Override
+    public boolean isPaused() {
+        return super.isPaused();
+    }
+
+    @Override
+    public boolean isError() {
+        return super.isError();
+    }
+}

+ 370 - 23
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/TestMyActivity.java

@@ -1,26 +1,32 @@
 package org.yczbj.ycvideoplayer.ui.test2;
 
-import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.BaseActivity;
-import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
+import org.yczbj.ycvideoplayer.ui.me.view.MeLoginActivity;
+import org.yczbj.ycvideoplayer.ui.me.view.MeMemberActivity;
 import org.yczbj.ycvideoplayer.ui.test2.view.TestMyFirstActivity;
 import org.yczbj.ycvideoplayer.ui.test2.view.TestMyFiveActivity;
 import org.yczbj.ycvideoplayer.ui.test2.view.TestMyFourActivity;
 import org.yczbj.ycvideoplayer.ui.test2.view.TestMySecondActivity;
 import org.yczbj.ycvideoplayer.ui.test2.view.TestMySixActivity;
 import org.yczbj.ycvideoplayer.ui.test2.view.TestMyThirdActivity;
-import org.yczbj.ycvideoplayer.util.ImageUtils;
+import org.yczbj.ycvideoplayer.util.ImageUtil;
 import org.yczbj.ycvideoplayer.util.LogUtils;
+import org.yczbj.ycvideoplayerlib.ConstantKeys;
+import org.yczbj.ycvideoplayerlib.OnMemberClickListener;
+import org.yczbj.ycvideoplayerlib.VideoLogUtil;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerController;
 import org.yczbj.ycvideoplayerlib.VideoPlayerManager;
+import org.yczbj.ycvideoplayerlib.VideoPlayerUtils;
+
+import java.util.ArrayList;
 
 import butterknife.Bind;
-import butterknife.ButterKnife;
 
 /**
  * @author yc
@@ -44,8 +50,11 @@ import butterknife.ButterKnife;
 public class TestMyActivity extends BaseActivity implements View.OnClickListener {
 
 
-    @Bind(R.id.nice_video_player)
-    VideoPlayer niceVideoPlayer;
+    @Bind(R.id.video_player_1)
+    VideoPlayer videoPlayer1;
+
+    @Bind(R.id.video_player)
+    VideoPlayer videoPlayer;
     @Bind(R.id.btn_my_1)
     Button btnMy1;
     @Bind(R.id.btn_my_2)
@@ -60,18 +69,28 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
     Button btnMy6;
     @Bind(R.id.btn_my_0)
     Button btnMy0;
+    @Bind(R.id.btn_my_6_1)
+    Button btnMy61;
     @Bind(R.id.btn_my_00)
     Button btnMy00;
+    @Bind(R.id.btn_my_7)
+    Button btnMy7;
+    @Bind(R.id.btn_my_8)
+    Button btnMy8;
+    @Bind(R.id.btn_my_9)
+    Button btnMy9;
 
     @Override
     protected void onStop() {
         super.onStop();
-        VideoPlayerManager.instance().releaseNiceVideoPlayer();
+        VideoPlayerManager.instance().releaseVideoPlayer();
     }
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) return;
+        if (VideoPlayerManager.instance().onBackPressed()) {
+            return;
+        }
         super.onBackPressed();
     }
 
@@ -84,25 +103,39 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
 
     @Override
     public void initView() {
+        //原始封装视频播放,没有设置登录状态和权限
+        initVideo();
+
+        //设置登录和权限
+        initVideo7();
+    }
+
+    private void initVideo() {
+        //如果不想打印库中的日志,可以设置
+        VideoLogUtil.isLog = false;
+
         //设置播放类型
         // IjkPlayer or MediaPlayer
-        niceVideoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        videoPlayer1.setPlayerType(VideoPlayer.TYPE_NATIVE);
         //网络视频地址
-        String videoUrl = DataUtil.getVideoListData().get(0).getVideoUrl();
+        String videoUrl = ConstantVideo.VideoPlayerList[0];
         //设置视频地址和请求头部
-        niceVideoPlayer.setUp(videoUrl, null);
+        videoPlayer1.setUp(videoUrl, null);
+        //是否从上一次的位置继续播放
+        videoPlayer1.continueFromLastPosition(true);
+        //设置播放速度
+        videoPlayer1.setSpeed(1.0f);
         //创建视频控制器
         VideoPlayerController controller = new VideoPlayerController(this);
         controller.setTitle("办快来围观拉,自定义视频播放器可以播放视频拉");
+        //设置视频时长
         controller.setLength(98000);
+        //设置5秒不操作后则隐藏头部和底部布局视图
+        controller.setHideTime(5000);
         //controller.setImage(R.drawable.image_default);
-        ImageUtils.loadImgByPicasso(this, R.drawable.image_default, R.drawable.image_default, controller.imageView());
+        ImageUtil.loadImgByPicasso(this, R.drawable.image_default, R.drawable.image_default, controller.imageView());
         //设置视频控制器
-        niceVideoPlayer.setController(controller);
-        //是否从上一次的位置继续播放
-        niceVideoPlayer.continueFromLastPosition(true);
-        //设置播放速度
-        niceVideoPlayer.setSpeed(1.0f);
+        videoPlayer1.setController(controller);
     }
 
 
@@ -116,6 +149,10 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
         btnMy4.setOnClickListener(this);
         btnMy5.setOnClickListener(this);
         btnMy6.setOnClickListener(this);
+        btnMy61.setOnClickListener(this);
+        btnMy7.setOnClickListener(this);
+        btnMy8.setOnClickListener(this);
+        btnMy9.setOnClickListener(this);
     }
 
 
@@ -151,29 +188,42 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
             case R.id.btn_my_6:
                 startActivity(TestMySixActivity.class);
                 break;
+            case R.id.btn_my_6_1:
+                VideoPlayerUtils.clearPlayPosition(this);
+                break;
+            case R.id.btn_my_7:
+                initVideo7();
+                break;
+            case R.id.btn_my_8:
+                initVideo8();
+                break;
+            case R.id.btn_my_9:
+                initVideo9();
+                break;
             default:
                 break;
         }
     }
 
+
     private void getData() {
         //获取最大音量值
-        int maxVolume = niceVideoPlayer.getMaxVolume();
+        int maxVolume = videoPlayer.getMaxVolume();
         LogUtils.e("最大音量值" + maxVolume);
         //获取音量值
-        int volume = niceVideoPlayer.getVolume();
+        int volume = videoPlayer.getVolume();
         LogUtils.e("获取音量值" + volume);
         //获取持续时长
-        long duration = niceVideoPlayer.getDuration();
+        long duration = videoPlayer.getDuration();
         LogUtils.e("获取持续时长" + duration);
         //获取播放位置
-        long currentPosition = niceVideoPlayer.getCurrentPosition();
+        long currentPosition = videoPlayer.getCurrentPosition();
         LogUtils.e("获取播放位置" + duration);
         //获取缓冲区百分比
-        int bufferPercentage = niceVideoPlayer.getBufferPercentage();
+        int bufferPercentage = videoPlayer.getBufferPercentage();
         LogUtils.e("获取缓冲区百分比" + duration);
         //获取播放速度
-        float speed = niceVideoPlayer.getSpeed(1);
+        float speed = videoPlayer.getSpeed(1);
         LogUtils.e("获取播放速度" + duration);
     }
 
@@ -185,4 +235,301 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
 
     }
 
+    /**
+     * 没有登录没有权限,一键设置
+     *
+     */
+    private void initVideo7() {
+        videoPlayer.release();
+        //设置播放类型
+        // MediaPlayer
+        //videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        // IjkPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
+        //网络视频地址
+        String videoUrl = ConstantVideo.VideoPlayerList[1];
+        //设置视频地址和请求头部
+        videoPlayer.setUp(videoUrl, null);
+        //是否从上一次的位置继续播放
+        videoPlayer.continueFromLastPosition(false);
+        //设置播放速度
+        videoPlayer.setSpeed(1.0f);
+        //设置播放位置
+        //videoPlayer.seekTo(3000);
+        //设置音量
+        videoPlayer.setVolume(50);
+
+
+        //创建视频控制器
+        VideoPlayerController controller = new VideoPlayerController(this);
+        //设置视频标题
+        controller.setTitle("高仿优酷视频播放页面");
+        //设置视频时长
+        //controller.setLength(98000);
+        //设置视频加载缓冲时加载窗的类型,多种类型
+        controller.setLoadingType(2);
+        ArrayList<String> content = new ArrayList<>();
+        content.add("试看结束,观看全部内容请开通会员1111。");
+        content.add("试看结束,观看全部内容请开通会员2222。");
+        content.add("试看结束,观看全部内容请开通会员3333。");
+        content.add("试看结束,观看全部内容请开通会员4444。");
+        //设置会员权限话术内容
+        controller.setMemberContent(content);
+        //设置不操作后,5秒自动隐藏头部和底部布局
+        controller.setHideTime(5000);
+        //设置设置会员权限类型,第一个参数是否登录,第二个参数是否有权限看,第三个参数试看完后展示的文字内容,第四个参数是否保存进度位置
+        controller.setMemberType(false,false,3,true);
+        //设置背景图片
+        controller.imageView().setBackgroundResource(R.color.blackText);
+        //ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
+        //设置试看结束后,登录或者充值会员按钮的点击事件
+        controller.setOnMemberClickListener(new OnMemberClickListener() {
+            @Override
+            public void onClick(int type) {
+                switch (type){
+                    case ConstantKeys.Gender.LOGIN:
+                        //调到用户登录也米娜
+                        startActivity(MeLoginActivity.class);
+                        break;
+                    case ConstantKeys.Gender.MEMBER:
+                        //调到用户充值会员页面
+                        startActivity(MeMemberActivity.class);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+        //设置视频清晰度
+        //videoPlayer.setClarity(list,720);
+        //设置视频控制器
+        videoPlayer.setController(controller);
+    }
+
+
+    /**
+     * 登录了,但不是会员没有权限,一键设置
+     */
+    private void initVideo8() {
+        videoPlayer.release();
+        //设置播放类型
+        // MediaPlayer
+        //videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        // IjkPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
+        //网络视频地址
+        String videoUrl = ConstantVideo.VideoPlayerList[2];
+        //设置视频地址和请求头部
+        videoPlayer.setUp(videoUrl, null);
+        //创建视频控制器
+        VideoPlayerController controller = new VideoPlayerController(this);
+        controller.setTitle("高仿优酷视频播放页面");
+        //controller.setLength(98000);
+        controller.setLoadingType(1);
+        controller.setMemberType(true,false,0,true);
+        controller.imageView().setBackgroundResource(R.color.blackText);
+        //ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
+        controller.setOnMemberClickListener(new OnMemberClickListener() {
+            @Override
+            public void onClick(int type) {
+                switch (type){
+                    case ConstantKeys.Gender.LOGIN:
+                        startActivity(MeLoginActivity.class);
+                        break;
+                    case ConstantKeys.Gender.MEMBER:
+                        startActivity(MeMemberActivity.class);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+        //设置视频控制器
+        videoPlayer.setController(controller);
+        //是否从上一次的位置继续播放
+        videoPlayer.continueFromLastPosition(false);
+        //设置播放速度
+        videoPlayer.setSpeed(1.0f);
+    }
+
+
+    /**
+     * 登录了,是会员,有所有权限,一键设置
+     */
+    private void initVideo9() {
+        videoPlayer.release();
+        //设置播放类型
+        // MediaPlayer
+        //videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        // IjkPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
+        //网络视频地址
+        String videoUrl = ConstantVideo.VideoPlayerList[3];
+        //设置视频地址和请求头部
+        videoPlayer.setUp(videoUrl, null);
+        //创建视频控制器
+        VideoPlayerController controller = new VideoPlayerController(this);
+        controller.setTitle("高仿优酷视频播放页面");
+        //controller.setLength(98000);
+        controller.setLoadingType(2);
+        controller.setMemberType(true,true,1,true);
+        controller.imageView().setBackgroundResource(R.color.blackText);
+        //ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
+        controller.setOnMemberClickListener(new OnMemberClickListener() {
+            @Override
+            public void onClick(int type) {
+                switch (type){
+                    case ConstantKeys.Gender.LOGIN:
+                        startActivity(MeLoginActivity.class);
+                        break;
+                    case ConstantKeys.Gender.MEMBER:
+                        startActivity(MeMemberActivity.class);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+        //设置视频控制器
+        videoPlayer.setController(controller);
+        //是否从上一次的位置继续播放
+        videoPlayer.continueFromLastPosition(false);
+        //设置播放速度
+        videoPlayer.setSpeed(1.0f);
+    }
+
+
+
+    /**
+     * 只是作用于写博客使用
+     */
+    private void initVideo0() {
+        videoPlayer.release();
+        //设置播放类型
+        // MediaPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        // IjkPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
+        //网络视频地址
+        String videoUrl = ConstantVideo.VideoPlayerList[4];
+        //设置视频地址和请求头部
+        videoPlayer.setUp(videoUrl, null);
+        //是否从上一次的位置继续播放
+        videoPlayer.continueFromLastPosition(false);
+        //设置播放速度
+        videoPlayer.setSpeed(1.0f);
+        //设置播放位置
+        //videoPlayer.seekTo(3000);
+        //设置音量
+        videoPlayer.setVolume(50);
+
+        //设置全屏播放
+        videoPlayer.enterFullScreen();
+        //设置小屏幕播放
+        videoPlayer.enterTinyWindow();
+        //退出全屏
+        videoPlayer.exitFullScreen();
+        //退出小窗口播放
+        videoPlayer.exitTinyWindow();
+        //释放,内部的播放器被释放掉,同时如果在全屏、小窗口模式下都会退出
+        videoPlayer.release();
+        //释放播放器,注意一定要判断对象是否为空,增强严谨性
+        videoPlayer.releasePlayer();
+
+
+        //是否从上一次的位置继续播放,不必须
+        videoPlayer.continueFromLastPosition(false);
+        //获取最大音量
+        int maxVolume = videoPlayer.getMaxVolume();
+        //获取音量值
+        int volume = videoPlayer.getVolume();
+        //获取持续时长
+        long duration = videoPlayer.getDuration();
+        //获取播放位置
+        long currentPosition = videoPlayer.getCurrentPosition();
+        //获取缓冲区百分比
+        int bufferPercentage = videoPlayer.getBufferPercentage();
+        //获取播放速度
+        float speed = videoPlayer.getSpeed(1);
+
+
+        //开始播放
+        videoPlayer.start();
+        //开始播放,从某位置播放
+        videoPlayer.start(3000);
+        //重新播放
+        videoPlayer.restart();
+        //暂停播放
+        videoPlayer.pause();
+
+
+        //判断是否开始播放
+        boolean idle = videoPlayer.isIdle();
+        //判断视频是否播放准备中
+        boolean preparing = videoPlayer.isPreparing();
+        //判断视频是否准备就绪
+        boolean prepared = videoPlayer.isPrepared();
+        //判断视频是否正在缓冲
+        boolean bufferingPlaying = videoPlayer.isBufferingPlaying();
+        //判断是否是否缓冲暂停
+        boolean bufferingPaused = videoPlayer.isBufferingPaused();
+        //判断视频是否暂停播放
+        boolean paused = videoPlayer.isPaused();
+        //判断视频是否正在播放
+        boolean playing = videoPlayer.isPlaying();
+        //判断视频是否播放错误
+        boolean error = videoPlayer.isError();
+        //判断视频是否播放完成
+        boolean completed = videoPlayer.isCompleted();
+        //判断视频是否播放全屏
+        boolean fullScreen = videoPlayer.isFullScreen();
+        //判断视频是否播放小窗口
+        boolean tinyWindow = videoPlayer.isTinyWindow();
+        //判断视频是否正常播放
+        boolean normal = videoPlayer.isNormal();
+
+
+        //创建视频控制器
+        VideoPlayerController controller = new VideoPlayerController(this);
+        controller.setTitle("高仿优酷视频播放页面");
+        //controller.setLength(98000);
+        //设置视频加载缓冲时加载窗的类型,多种类型
+        controller.setLoadingType(2);
+        ArrayList<String> content = new ArrayList<>();
+        content.add("试看结束,观看全部内容请开通会员1111。");
+        content.add("试看结束,观看全部内容请开通会员2222。");
+        content.add("试看结束,观看全部内容请开通会员3333。");
+        content.add("试看结束,观看全部内容请开通会员4444。");
+        controller.setMemberContent(content);
+        controller.setHideTime(5000);
+        //设置设置会员权限类型,第一个参数是否登录,第二个参数是否有权限看,第三个参数试看完后展示的文字内容,第四个参数是否保存进度位置
+        controller.setMemberType(false,false,3,true);
+        controller.imageView().setBackgroundResource(R.color.blackText);
+        //ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
+        //设置试看结束后,登录或者充值会员按钮的点击事件
+        controller.setOnMemberClickListener(new OnMemberClickListener() {
+            @Override
+            public void onClick(int type) {
+                switch (type){
+                    case ConstantKeys.Gender.LOGIN:
+                        //调到用户登录也米娜
+                        startActivity(MeLoginActivity.class);
+                        break;
+                    case ConstantKeys.Gender.MEMBER:
+                        //调到用户充值会员页面
+                        startActivity(MeMemberActivity.class);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+        //设置视频控制器
+        videoPlayer.setController(controller);
+    }
+
+
+
+
+
 }

+ 0 - 51
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/model/DataUtil.java

@@ -1,51 +0,0 @@
-package org.yczbj.ycvideoplayer.ui.test2.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DataUtil {
-    public static List<Video> getVideoListData() {
-        List<Video> videoList = new ArrayList<>();
-        videoList.add(new Video("办公室小野开番外了,居然在办公室开澡堂!老板还点赞?",
-                98000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/05/2017-05-17_17-30-43.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/05/2017-05-17_17-33-30.mp4"));
-        videoList.add(new Video("小野在办公室用丝袜做茶叶蛋 边上班边看《外科风云》",
-                413000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/05/2017-05-10_10-09-58.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/05/2017-05-10_10-20-26.mp4"));
-        videoList.add(new Video("花盆叫花鸡,怀念玩泥巴,过家家,捡根竹竿当打狗棒的小时候",
-                439000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/05/2017-05-03_12-52-08.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/05/2017-05-03_13-02-41.mp4"));
-        videoList.add(new Video("针织方便面,这可能是史上最不方便的方便面",
-                178000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-28_18-18-22.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-28_18-20-56.mp4"));
-        videoList.add(new Video("小野的下午茶,办公室不只有KPI,也有诗和远方",
-                450000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-26_10-00-28.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-26_10-06-25.mp4"));
-        videoList.add(new Video("可乐爆米花,嘭嘭嘭......收花的人说要把我娶回家",
-                176000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-37-16.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-41-07.mp4"));
-        videoList.add(new Video("可乐爆米花,嘭嘭嘭......收花的人说要把我娶回家",
-                176000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-37-16.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-41-07.mp4"));
-        videoList.add(new Video("可乐爆米花,嘭嘭嘭......收花的人说要把我娶回家",
-                176000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-37-16.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-41-07.mp4"));
-        videoList.add(new Video("可乐爆米花,嘭嘭嘭......收花的人说要把我娶回家",
-                176000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-37-16.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-41-07.mp4"));
-        videoList.add(new Video("可乐爆米花,嘭嘭嘭......收花的人说要把我娶回家",
-                176000,
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-37-16.jpg",
-                "http://tanzi27niu.cdsb.mobi/wps/wp-content/uploads/2017/04/2017-04-21_16-41-07.mp4"));
-        return videoList;
-    }
-}

+ 8 - 8
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFirstActivity.java

@@ -20,7 +20,7 @@ public class TestMyFirstActivity extends BaseActivity implements View.OnClickLis
 
 
     @Bind(R.id.nice_video_player)
-    VideoPlayer niceVideoPlayer;
+    VideoPlayer videoPlayer;
     @Bind(R.id.btn_tiny_1)
     Button btnTiny1;
     @Bind(R.id.btn_tiny_2)
@@ -29,12 +29,12 @@ public class TestMyFirstActivity extends BaseActivity implements View.OnClickLis
     @Override
     protected void onStop() {
         super.onStop();
-        VideoPlayerManager.instance().releaseNiceVideoPlayer();
+        VideoPlayerManager.instance().releaseVideoPlayer();
     }
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) return;
+        if (VideoPlayerManager.instance().onBackPressed()) return;
         super.onBackPressed();
     }
 
@@ -46,9 +46,9 @@ public class TestMyFirstActivity extends BaseActivity implements View.OnClickLis
 
     @Override
     public void initView() {
-        niceVideoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE); // IjkPlayer or MediaPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE); // IjkPlayer or MediaPlayer
         String videoUrl = Environment.getExternalStorageDirectory().getPath().concat("/办公室小野.mp4");
-        niceVideoPlayer.setUp(videoUrl, null);
+        videoPlayer.setUp(videoUrl, null);
         VideoPlayerController controller = new VideoPlayerController(this);
         controller.setTitle("办公室小野开番外了,居然在办公室开澡堂!老板还点赞?");
         controller.setLength(98000);
@@ -57,7 +57,7 @@ public class TestMyFirstActivity extends BaseActivity implements View.OnClickLis
                 .placeholder(R.drawable.image_default)
                 .crossFade()
                 .into(controller.imageView());
-        niceVideoPlayer.setController(controller);
+        videoPlayer.setController(controller);
     }
 
     @Override
@@ -75,10 +75,10 @@ public class TestMyFirstActivity extends BaseActivity implements View.OnClickLis
     public void onClick(View v) {
         switch (v.getId()){
             case R.id.btn_tiny_1:
-                if (niceVideoPlayer.isIdle()) {
+                if (videoPlayer.isIdle()) {
                     Toast.makeText(this, "要点击播放后才能进入小窗口", Toast.LENGTH_SHORT).show();
                 } else {
-                    niceVideoPlayer.enterTinyWindow();
+                    videoPlayer.enterTinyWindow();
                 }
                 break;
             case R.id.btn_tiny_2:

+ 18 - 9
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFiveActivity.java

@@ -5,12 +5,16 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.BaseActivity;
 import org.yczbj.ycvideoplayer.ui.test2.base.HomeKeyWatcher;
-import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
+import org.yczbj.ycvideoplayer.ui.test2.model.Video;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerManager;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import butterknife.Bind;
 
 
@@ -40,9 +44,9 @@ public class TestMyFiveActivity extends BaseActivity {
     protected void onStop() {
         // 在OnStop中是release还是suspend播放器,需要看是不是因为按了Home键
         if (pressedHome) {
-            VideoPlayerManager.instance().suspendNiceVideoPlayer();
+            VideoPlayerManager.instance().suspendVideoPlayer();
         } else {
-            VideoPlayerManager.instance().releaseNiceVideoPlayer();
+            VideoPlayerManager.instance().releaseVideoPlayer();
         }
         super.onStop();
         mHomeKeyWatcher.stopWatch();
@@ -53,12 +57,12 @@ public class TestMyFiveActivity extends BaseActivity {
         mHomeKeyWatcher.startWatch();
         pressedHome = false;
         super.onRestart();
-        VideoPlayerManager.instance().resumeNiceVideoPlayer();
+        VideoPlayerManager.instance().resumeVideoPlayer();
     }
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) {
+        if (VideoPlayerManager.instance().onBackPressed()) {
             return;
         }
         super.onBackPressed();
@@ -74,14 +78,19 @@ public class TestMyFiveActivity extends BaseActivity {
         recyclerView.setLayoutManager(new LinearLayoutManager(this));
         recyclerView.setHasFixedSize(true);
         VideoAdapter adapter;
-        adapter = new VideoAdapter(this, DataUtil.getVideoListData());
+        List<Video> list = new ArrayList<>();
+        for (int a=0 ; a< ConstantVideo.VideoPlayerList.length ; a++){
+            Video video = new Video(ConstantVideo.VideoPlayerTitle[a],10,"",ConstantVideo.VideoPlayerList[a]);
+            list.add(video);
+        }
+        adapter = new VideoAdapter(this, list);
         recyclerView.setAdapter(adapter);
         recyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
             @Override
             public void onViewRecycled(RecyclerView.ViewHolder holder) {
-                VideoPlayer niceVideoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
-                if (niceVideoPlayer == VideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {
-                    VideoPlayerManager.instance().releaseNiceVideoPlayer();
+                VideoPlayer VideoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
+                if (VideoPlayer == VideoPlayerManager.instance().getCurrentVideoPlayer()) {
+                    VideoPlayerManager.instance().releaseVideoPlayer();
                 }
             }
         });

+ 2 - 2
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFourActivity.java

@@ -10,12 +10,12 @@ public class TestMyFourActivity extends BaseActivity  {
     @Override
     protected void onStop() {
         super.onStop();
-        VideoPlayerManager.instance().releaseNiceVideoPlayer();
+        VideoPlayerManager.instance().releaseVideoPlayer();
     }
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) return;
+        if (VideoPlayerManager.instance().onBackPressed()) return;
         super.onBackPressed();
     }
 

+ 15 - 6
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyFourFragment.java

@@ -10,10 +10,14 @@ import android.view.View;
 import android.view.ViewGroup;
 
 import org.yczbj.ycvideoplayer.R;
-import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
+import org.yczbj.ycvideoplayer.ui.test2.model.Video;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerManager;
 
+import java.util.ArrayList;
+import java.util.List;
+
 
 /**
  * 如果你需要在播放的时候按下Home键能暂停,回调此Fragment又继续的话,需要继承自CompatHomeKeyFragment
@@ -37,14 +41,19 @@ public class TestMyFourFragment extends Fragment {
         mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
         mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
         mRecyclerView.setHasFixedSize(true);
-        VideoAdapter adapter = new VideoAdapter(getActivity(), DataUtil.getVideoListData());
+        List<Video> list = new ArrayList<>();
+        for (int a = 0; a< ConstantVideo.VideoPlayerList.length ; a++){
+            Video video = new Video(ConstantVideo.VideoPlayerTitle[a],10,"",ConstantVideo.VideoPlayerList[a]);
+            list.add(video);
+        }
+        VideoAdapter adapter = new VideoAdapter(getActivity(), list);
         mRecyclerView.setAdapter(adapter);
         mRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
             @Override
             public void onViewRecycled(RecyclerView.ViewHolder holder) {
-                VideoPlayer niceVideoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
-                if (niceVideoPlayer == VideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {
-                    VideoPlayerManager.instance().releaseNiceVideoPlayer();
+                VideoPlayer VideoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
+                if (VideoPlayer == VideoPlayerManager.instance().getCurrentVideoPlayer()) {
+                    VideoPlayerManager.instance().releaseVideoPlayer();
                 }
             }
         });
@@ -53,6 +62,6 @@ public class TestMyFourFragment extends Fragment {
     @Override
     public void onStop() {
         super.onStop();
-        VideoPlayerManager.instance().releaseNiceVideoPlayer();
+        VideoPlayerManager.instance().releaseVideoPlayer();
     }
 }

+ 2 - 2
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMySecondActivity.java

@@ -31,12 +31,12 @@ public class TestMySecondActivity extends BaseActivity implements View.OnClickLi
     @Override
     protected void onStop() {
         super.onStop();
-        VideoPlayerManager.instance().releaseNiceVideoPlayer();
+        VideoPlayerManager.instance().releaseVideoPlayer();
     }
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) return;
+        if (VideoPlayerManager.instance().onBackPressed()) return;
         super.onBackPressed();
     }
 

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMySixActivity.java

@@ -9,7 +9,7 @@ public class TestMySixActivity extends BaseActivity {
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) return;
+        if (VideoPlayerManager.instance().onBackPressed()) return;
         super.onBackPressed();
     }
 

+ 13 - 4
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMySixFragment.java

@@ -4,11 +4,15 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.BaseFragment;
-import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
+import org.yczbj.ycvideoplayer.ui.test2.model.Video;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerManager;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import butterknife.Bind;
 
 /**
@@ -29,14 +33,19 @@ public class TestMySixFragment extends BaseFragment {
     public void initView() {
         mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
         mRecyclerView.setHasFixedSize(true);
-        VideoAdapter adapter = new VideoAdapter(getActivity(), DataUtil.getVideoListData());
+        List<Video> list = new ArrayList<>();
+        for (int a = 0; a< ConstantVideo.VideoPlayerList.length ; a++){
+            Video video = new Video(ConstantVideo.VideoPlayerTitle[a],10,"",ConstantVideo.VideoPlayerList[a]);
+            list.add(video);
+        }
+        VideoAdapter adapter = new VideoAdapter(getActivity(), list);
         mRecyclerView.setAdapter(adapter);
         mRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
             @Override
             public void onViewRecycled(RecyclerView.ViewHolder holder) {
                 VideoPlayer niceVideoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
-                if (niceVideoPlayer == VideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {
-                    VideoPlayerManager.instance().releaseNiceVideoPlayer();
+                if (niceVideoPlayer == VideoPlayerManager.instance().getCurrentVideoPlayer()) {
+                    VideoPlayerManager.instance().releaseVideoPlayer();
                 }
             }
         });

+ 17 - 6
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/TestMyThirdActivity.java

@@ -4,11 +4,15 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 
 import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.BaseActivity;
-import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
+import org.yczbj.ycvideoplayer.ui.test2.model.Video;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerManager;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import butterknife.Bind;
 
 
@@ -21,12 +25,14 @@ public class TestMyThirdActivity extends BaseActivity {
     @Override
     protected void onStop() {
         super.onStop();
-        VideoPlayerManager.instance().releaseNiceVideoPlayer();
+        VideoPlayerManager.instance().releaseVideoPlayer();
     }
 
     @Override
     public void onBackPressed() {
-        if (VideoPlayerManager.instance().onBackPressd()) return;
+        if (VideoPlayerManager.instance().onBackPressed()){
+            return;
+        }
         super.onBackPressed();
     }
 
@@ -40,14 +46,19 @@ public class TestMyThirdActivity extends BaseActivity {
     public void initView() {
         recyclerView.setLayoutManager(new LinearLayoutManager(this));
         recyclerView.setHasFixedSize(true);
-        VideoAdapter adapter = new VideoAdapter(this, DataUtil.getVideoListData());
+        List<Video> list = new ArrayList<>();
+        for (int a = 0; a< ConstantVideo.VideoPlayerList.length ; a++){
+            Video video = new Video(ConstantVideo.VideoPlayerTitle[a],10,"",ConstantVideo.VideoPlayerList[a]);
+            list.add(video);
+        }
+        VideoAdapter adapter = new VideoAdapter(this, list);
         recyclerView.setAdapter(adapter);
         recyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
             @Override
             public void onViewRecycled(RecyclerView.ViewHolder holder) {
                 VideoPlayer niceVideoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
-                if (niceVideoPlayer == VideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {
-                    VideoPlayerManager.instance().releaseNiceVideoPlayer();
+                if (niceVideoPlayer == VideoPlayerManager.instance().getCurrentVideoPlayer()) {
+                    VideoPlayerManager.instance().releaseVideoPlayer();
                 }
             }
         });

+ 14 - 10
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/view/VideoAdapter.java

@@ -10,6 +10,7 @@ import com.bumptech.glide.Glide;
 
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.ui.test2.model.Video;
+import org.yczbj.ycvideoplayer.util.ImageUtil;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerController;
 
@@ -20,7 +21,7 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
     private Context mContext;
     private List<Video> mVideoList;
 
-    public VideoAdapter(Context context, List<Video> videoList) {
+    VideoAdapter(Context context, List<Video> videoList) {
         mContext = context;
         mVideoList = videoList;
     }
@@ -29,6 +30,7 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
     public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_test_my_video, parent, false);
         VideoViewHolder holder = new VideoViewHolder(itemView);
+        //创建视频播放控制器,主要只要创建一次就可以呢
         VideoPlayerController controller = new VideoPlayerController(mContext);
         holder.setController(controller);
         return holder;
@@ -42,7 +44,7 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
 
     @Override
     public int getItemCount() {
-        return mVideoList.size();
+        return mVideoList==null ? 0 : mVideoList.size();
     }
 
     class VideoViewHolder extends RecyclerView.ViewHolder {
@@ -55,11 +57,17 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
             mVideoPlayer = (VideoPlayer) itemView.findViewById(R.id.nice_video_player);
             // 将列表中的每个视频设置为默认16:9的比例
             ViewGroup.LayoutParams params = mVideoPlayer.getLayoutParams();
-            params.width = itemView.getResources().getDisplayMetrics().widthPixels; // 宽度为屏幕宽度
-            params.height = (int) (params.width * 9f / 16f);    // 高度为宽度的9/16
+            // 宽度为屏幕宽度
+            params.width = itemView.getResources().getDisplayMetrics().widthPixels;
+            // 高度为宽度的9/16
+            params.height = (int) (params.width * 9f / 16f);
             mVideoPlayer.setLayoutParams(params);
         }
 
+        /**
+         * 设置视频控制器参数
+         * @param controller            控制器对象
+         */
         void setController(VideoPlayerController controller) {
             mController = controller;
             mVideoPlayer.setController(mController);
@@ -67,12 +75,8 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
 
         void bindData(Video video) {
             mController.setTitle(video.getTitle());
-            mController.setLength(video.getLength());
-            Glide.with(itemView.getContext())
-                    .load(video.getImageUrl())
-                    .placeholder(R.drawable.image_default)
-                    .crossFade()
-                    .into(mController.imageView());
+            //mController.setLength(video.getLength());
+            ImageUtil.loadImgByPicasso(itemView.getContext(),video.getImageUrl(),R.drawable.image_default,mController.imageView());
             mVideoPlayer.setUp(video.getVideoUrl(), null);
         }
     }

+ 10 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLHybridTestActivity.java

@@ -0,0 +1,10 @@
+package org.yczbj.ycvideoplayer.ui.test3;
+
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * Created by yc on 2018/1/12.
+ */
+
+public class DLHybridTestActivity extends AppCompatActivity {
+}

+ 10 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLManyTestActivity.java

@@ -0,0 +1,10 @@
+package org.yczbj.ycvideoplayer.ui.test3;
+
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * Created by yc on 2018/1/12.
+ */
+
+public class DLManyTestActivity extends AppCompatActivity {
+}

+ 10 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLMyFileTestActivity.java

@@ -0,0 +1,10 @@
+package org.yczbj.ycvideoplayer.ui.test3;
+
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * Created by yc on 2018/1/12.
+ */
+
+public class DLMyFileTestActivity extends AppCompatActivity {
+}

+ 10 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLNotificationTestActivity.java

@@ -0,0 +1,10 @@
+package org.yczbj.ycvideoplayer.ui.test3;
+
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * Created by yc on 2018/1/12.
+ */
+
+public class DLNotificationTestActivity extends AppCompatActivity {
+}

+ 380 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/DLSingleTestActivity.java

@@ -0,0 +1,380 @@
+package org.yczbj.ycvideoplayer.ui.test3;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.FileDownloadListener;
+import com.liulishuo.filedownloader.FileDownloadSampleListener;
+import com.liulishuo.filedownloader.FileDownloader;
+import com.liulishuo.filedownloader.util.FileDownloadUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantVideo;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+import org.yczbj.ycvideoplayer.util.LogUtils;
+
+import java.io.File;
+import java.lang.ref.WeakReference;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+
+/**
+ * Description:
+ * Update:2018/1/2
+ * CreatedTime:2017/12/29
+ * Author:yc
+ */
+
+public class DLSingleTestActivity extends BaseActivity implements View.OnClickListener {
+
+
+    @Bind(R.id.start_btn_1)
+    Button startBtn1;
+    @Bind(R.id.pause_btn_1)
+    Button pauseBtn1;
+    @Bind(R.id.delete_btn_1)
+    Button deleteBtn1;
+    @Bind(R.id.filename_tv_1)
+    TextView filenameTv1;
+    @Bind(R.id.speed_tv_1)
+    TextView speedTv1;
+    @Bind(R.id.progressBar_1)
+    ProgressBar progressBar1;
+    @Bind(R.id.start_btn_2)
+    Button startBtn2;
+    @Bind(R.id.pause_btn_2)
+    Button pauseBtn2;
+    @Bind(R.id.delete_btn_2)
+    Button deleteBtn2;
+    @Bind(R.id.filename_tv_2)
+    TextView filenameTv2;
+    @Bind(R.id.speed_tv_2)
+    TextView speedTv2;
+    @Bind(R.id.progressBar_2)
+    ProgressBar progressBar2;
+    @Bind(R.id.start_btn_3)
+    Button startBtn3;
+    @Bind(R.id.pause_btn_3)
+    Button pauseBtn3;
+    @Bind(R.id.delete_btn_3)
+    Button deleteBtn3;
+    @Bind(R.id.speed_tv_3)
+    TextView speedTv3;
+    @Bind(R.id.progressBar_3)
+    ProgressBar progressBar3;
+    @Bind(R.id.start_btn_4)
+    Button startBtn4;
+    @Bind(R.id.pause_btn_4)
+    Button pauseBtn4;
+    @Bind(R.id.delete_btn_4)
+    Button deleteBtn4;
+    @Bind(R.id.detail_tv_4)
+    TextView detailTv4;
+    @Bind(R.id.speed_tv_4)
+    TextView speedTv4;
+    @Bind(R.id.progressBar_4)
+    ProgressBar progressBar4;
+    private String filePath1;
+    private String filePath2;
+    private String filePath3;
+    private String filePath4;
+
+    private int downloadId1;
+    private int downloadId2;
+    private int downloadId3;
+    private int downloadId4;
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        FileDownloader.getImpl().pause(downloadId1);
+        FileDownloader.getImpl().pause(downloadId2);
+    }
+
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_test_dl_single;
+    }
+
+    @Override
+    public void initView() {
+        setFilePath();
+    }
+
+    @Override
+    public void initListener() {
+        deleteBtn1.setOnClickListener(this);
+        deleteBtn2.setOnClickListener(this);
+        deleteBtn3.setOnClickListener(this);
+        deleteBtn4.setOnClickListener(this);
+        pauseBtn1.setOnClickListener(this);
+        pauseBtn2.setOnClickListener(this);
+        pauseBtn3.setOnClickListener(this);
+        pauseBtn4.setOnClickListener(this);
+        startBtn1.setOnClickListener(this);
+        startBtn2.setOnClickListener(this);
+        startBtn3.setOnClickListener(this);
+        startBtn4.setOnClickListener(this);
+    }
+
+    @Override
+    public void initData() {
+
+    }
+
+    /**
+     * 设置文件路径
+     */
+    private void setFilePath() {
+        filePath1 = FileDownloadUtils.getDefaultSaveRootPath() + File.separator + "_1_" + File.separator +"yc.apk";
+        filePath2 = FileDownloadUtils.getDefaultSaveRootPath() + File.separator + "_2_";
+        filePath3 = FileDownloadUtils.getDefaultSaveRootPath() + File.separator + "_3_";
+        filePath4 = FileDownloadUtils.getDefaultSaveRootPath() + File.separator + "_4_";
+        LogUtils.e(this.getClass().getName()+"--filePath1---"+filePath1);
+        LogUtils.e(this.getClass().getName()+"--filePath2---"+filePath2);
+        LogUtils.e(this.getClass().getName()+"--filePath3---"+filePath3);
+        LogUtils.e(this.getClass().getName()+"--filePath4---"+filePath4);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.start_btn_1:
+                downloadId1 = createDownloadTask(1).start();
+                break;
+            case R.id.start_btn_2:
+
+                break;
+            case R.id.start_btn_3:
+
+                break;
+            case R.id.start_btn_4:
+
+                break;
+            case R.id.pause_btn_1:
+
+                break;
+            case R.id.pause_btn_2:
+
+                break;
+            case R.id.pause_btn_3:
+
+                break;
+            case R.id.pause_btn_4:
+
+                break;
+            case R.id.delete_btn_1:
+
+                break;
+            case R.id.delete_btn_2:
+
+                break;
+            case R.id.delete_btn_3:
+
+                break;
+            case R.id.delete_btn_4:
+
+                break;
+            default:
+                break;
+        }
+    }
+
+    private BaseDownloadTask createDownloadTask(int i) {
+        final TaskTag taskTag ;
+        //创建下载的链接地址
+        String url = ConstantVideo.VideoPlayerList[0];
+        //是否
+        boolean isDir = false;
+        //文件路径
+        String path = null;
+
+        switch (i){
+            case 1:
+                url = ConstantVideo.VideoPlayerList[0];
+                path = filePath1;
+                taskTag = new TaskTag(new WeakReference<>(this),filenameTv1, progressBar1, null, speedTv1, 1);
+                break;
+            case 2:
+                url = ConstantVideo.VideoPlayerList[1];
+                taskTag = new TaskTag(new WeakReference<>(this), filenameTv1, progressBar2, null, speedTv2, 2);
+                path = filePath2;
+                isDir = true;
+                break;
+            case 3:
+                url = ConstantVideo.VideoPlayerList[2];
+                taskTag = new TaskTag(new WeakReference<>(this),null, progressBar3, null, speedTv3, 3);
+                path = filePath3;
+                break;
+            case 4:
+                url = ConstantVideo.VideoPlayerList[2];
+                taskTag = new TaskTag(new WeakReference<>(this),null, progressBar4, detailTv4, speedTv4, 4);
+                path = filePath4;
+                break;
+            default:
+                url = ConstantVideo.VideoPlayerList[2];
+                taskTag = new TaskTag(new WeakReference<>(this),null, progressBar4, detailTv4, speedTv4, 4);
+                path = filePath4;
+                break;
+        }
+        return FileDownloader.getImpl().create(url)
+                .setPath(path, isDir)
+                .setCallbackProgressTimes(300)
+                .setMinIntervalUpdateSpeed(400)
+                .setTag(taskTag)
+                .setListener(new FileDownloadSampleListener() {
+                    @Override
+                    protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+                        super.pending(task, soFarBytes, totalBytes);
+                        ((TaskTag) task.getTag()).updatePending(task);
+                    }
+
+                    @Override
+                    protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+                        super.progress(task, soFarBytes, totalBytes);
+                        ((TaskTag) task.getTag()).updateProgress(soFarBytes, totalBytes,
+                                task.getSpeed());
+                    }
+
+                    @Override
+                    protected void error(BaseDownloadTask task, Throwable e) {
+                        super.error(task, e);
+                        ((TaskTag) task.getTag()).updateError(e, task.getSpeed());
+                    }
+
+                    @Override
+                    protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {
+                        super.connected(task, etag, isContinue, soFarBytes, totalBytes);
+                        ((TaskTag) task.getTag()).updateConnected(etag, task.getFilename());
+                    }
+
+                    @Override
+                    protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+                        super.paused(task, soFarBytes, totalBytes);
+                        ((TaskTag) task.getTag()).updatePaused(task.getSpeed());
+                    }
+
+                    @Override
+                    protected void completed(BaseDownloadTask task) {
+                        super.completed(task);
+                        ((TaskTag) task.getTag()).updateCompleted(task);
+                    }
+
+                    @Override
+                    protected void warn(BaseDownloadTask task) {
+                        super.warn(task);
+                        ((TaskTag) task.getTag()).updateWarn();
+                    }
+                });
+    }
+
+    public static class TaskTag {
+
+        private TextView filenameTv;
+        private ProgressBar pb;
+        private TextView detailTv;
+        private TextView speedTv;
+        private int position;
+        private WeakReference<DLSingleTestActivity> activityWeakReference;
+
+        TaskTag(WeakReference<DLSingleTestActivity> activityWeakReference,TextView filenameTv
+                , ProgressBar pb, TextView detailTv, TextView speedTv, int position) {
+            this.activityWeakReference = activityWeakReference;
+            this.filenameTv = filenameTv;
+            this.pb = pb;
+            this.detailTv = detailTv;
+            this.speedTv = speedTv;
+            this.position = position;
+        }
+
+
+        public void updatePending(BaseDownloadTask task) {
+            if (filenameTv != null) {
+                filenameTv.setText(task.getFilename());
+            }
+        }
+
+        @SuppressLint("DefaultLocale")
+        public void updateProgress(final int sofar, final int total, final int speed) {
+            if (total == -1) {
+                // chunked transfer encoding data
+                pb.setIndeterminate(true);
+            } else {
+                pb.setMax(total);
+                pb.setProgress(sofar);
+            }
+            updateSpeed(speed);
+            if (detailTv != null) {
+                detailTv.setText(String.format("sofar: %d total: %d", sofar, total));
+            }
+        }
+
+        @SuppressLint("DefaultLocale")
+        public void updateError(Throwable e, int speed) {
+            toast(String.format("error %d %s", position, e));
+            updateSpeed(speed);
+            pb.setIndeterminate(false);
+            e.printStackTrace();
+        }
+
+        public void updateConnected(String etag, String filename) {
+            if (filenameTv != null) {
+                filenameTv.setText(filename);
+            }
+        }
+
+        @SuppressLint("DefaultLocale")
+        public void updatePaused(int speed) {
+            toast(String.format("paused %d", position));
+            updateSpeed(speed);
+            pb.setIndeterminate(false);
+        }
+
+        @SuppressLint("DefaultLocale")
+        public void updateCompleted(BaseDownloadTask task) {
+            toast(String.format("completed %d %s", position, task.getTargetFilePath()));
+
+            if (detailTv != null) {
+                detailTv.setText(String.format("sofar: %d total: %d",
+                        task.getSmallFileSoFarBytes(), task.getSmallFileTotalBytes()));
+            }
+            updateSpeed(task.getSpeed());
+            pb.setIndeterminate(false);
+            pb.setMax(task.getSmallFileTotalBytes());
+            pb.setProgress(task.getSmallFileSoFarBytes());
+        }
+
+        @SuppressLint("DefaultLocale")
+        public void updateWarn() {
+            toast(String.format("warn %d", position));
+            pb.setIndeterminate(false);
+        }
+
+
+        @SuppressLint("DefaultLocale")
+        private void updateSpeed(int speed) {
+            if(speedTv!=null){
+                speedTv.setText(String.format("%dKB/s", speed));
+            }
+        }
+
+        private void toast(final String msg) {
+            if (this.activityWeakReference != null && this.activityWeakReference.get() != null) {
+                ToastUtil.showToast(activityWeakReference.get(),msg);
+            }
+        }
+    }
+
+
+
+}

+ 267 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test3/GlideCropActivity.java

@@ -0,0 +1,267 @@
+package org.yczbj.ycvideoplayer.ui.test3;
+
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+
+import com.blankj.utilcode.util.SizeUtils;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.animation.GlideAnimation;
+import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.target.Target;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.api.ConstantImage;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+import org.yczbj.ycvideoplayer.util.ImageCropUtils;
+import org.yczbj.ycvideoplayer.weight.HeightTransformation;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+/**
+ * Created by yc on 2018/1/10.
+ * 1. SetScaleType(ImageView.ScaleType.CENTER);
+ * 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
+ * 2. SetScaleType(ImageView.ScaleType.CENTER_CROP);
+ * 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
+ * 3. setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ * 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
+ * 4. setScaleType(ImageView.ScaleType.FIT_CENTER);
+ * 把图片按比例扩大/缩小到View的宽度,居中显示
+ * 5. FIT_START, FIT_END
+ * 在图片缩放效果上与FIT_CENTER一样,只是显示的位置不同,FIT_START是置于顶部,FIT_CENTER居中,FIT_END置于底部。
+ * 6. FIT_XY
+ * 不按比例缩放图片,目标是把图片塞满整个View。
+ */
+
+public class GlideCropActivity extends BaseActivity implements View.OnClickListener {
+
+    /**
+     * http://blog.csdn.net/libra_louis/article/details/58604149
+     * http://blog.csdn.net/xuwenneng/article/details/77097872
+     * http://blog.csdn.net/u014038534/article/details/45197333
+     * http://blog.csdn.net/zhou452840622/article/details/51602042
+     */
+
+    @Bind(R.id.btn_1)
+    Button btn1;
+    @Bind(R.id.btn_2)
+    Button btn2;
+    @Bind(R.id.btn_3)
+    Button btn3;
+    @Bind(R.id.btn_4)
+    Button btn4;
+    @Bind(R.id.btn_5)
+    Button btn5;
+    @Bind(R.id.btn_6)
+    Button btn6;
+    @Bind(R.id.btn_7)
+    Button btn7;
+    @Bind(R.id.btn_8)
+    Button btn8;
+    @Bind(R.id.btn_9)
+    Button btn9;
+    @Bind(R.id.btn_10)
+    Button btn10;
+    @Bind(R.id.btn_11)
+    Button btn11;
+    @Bind(R.id.btn_12)
+    Button btn12;
+    @Bind(R.id.iv_image)
+    ImageView ivImage;
+    @Bind(R.id.btn_13)
+    Button btn13;
+    @Bind(R.id.btn_14)
+    Button btn14;
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_test_glide_crop;
+    }
+
+    @Override
+    public void initView() {
+
+    }
+
+    @Override
+    public void initListener() {
+        btn1.setOnClickListener(this);
+        btn2.setOnClickListener(this);
+        btn3.setOnClickListener(this);
+        btn4.setOnClickListener(this);
+        btn5.setOnClickListener(this);
+        btn6.setOnClickListener(this);
+        btn7.setOnClickListener(this);
+        btn8.setOnClickListener(this);
+        btn9.setOnClickListener(this);
+        btn10.setOnClickListener(this);
+        btn11.setOnClickListener(this);
+        btn12.setOnClickListener(this);
+        btn13.setOnClickListener(this);
+        btn14.setOnClickListener(this);
+    }
+
+    @Override
+    public void initData() {
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_1:
+                ivImage.setScaleType(ImageView.ScaleType.CENTER);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_2:
+                ivImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_3:
+                ivImage.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_4:
+                ivImage.setScaleType(ImageView.ScaleType.FIT_CENTER);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_5:
+                ivImage.setScaleType(ImageView.ScaleType.FIT_START);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_6:
+                ivImage.setScaleType(ImageView.ScaleType.FIT_END);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_7:
+                ivImage.setScaleType(ImageView.ScaleType.FIT_XY);
+                ivImage.setImageResource(R.drawable.test);
+                break;
+            case R.id.btn_8:
+                Glide.with(this)
+                        .load(R.drawable.test)
+                        .asBitmap()
+                        .placeholder(R.drawable.image_default)
+                        .transform(new HeightTransformation(this))
+                        .into(ivImage);
+                break;
+            case R.id.btn_9:
+                ivImage.setScaleType(ImageView.ScaleType.FIT_XY);
+                Glide.with(this)
+                        .load(R.drawable.test)
+                        .asBitmap()
+                        .placeholder(R.drawable.image_default)
+                        .transform(new HeightTransformation(this))
+                        .into(ivImage);
+                break;
+            case R.id.btn_10:
+                ivImage.setScaleType(ImageView.ScaleType.FIT_XY);
+                Glide.with(this)
+                        .load(R.drawable.test)
+                        .asBitmap()
+                        .placeholder(R.drawable.image_default)
+                        .transform(new HeightTransformation(this, SizeUtils.dp2px(174),
+                                SizeUtils.dp2px(105), HeightTransformation.CropType.CENTER))
+                        .into(ivImage);
+                break;
+            case R.id.btn_11:
+                Glide.with(this)
+                        .load(R.drawable.test)
+                        .asBitmap()
+                        .placeholder(R.drawable.image_default)
+                        //.fitCenter()
+                        //.centerCrop()
+                        //.override(SizeUtils.dp2px(200), SizeUtils.dp2px(100))
+                        .into(new SimpleTarget<Bitmap>() {
+                            @Override
+                            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
+                                if (resource != null) {
+                                    //调用裁剪图片工具类进行裁剪
+                                    Bitmap bitmap = ImageCropUtils.cutBitmap(resource);
+                                    if (bitmap != null) {
+                                        //设置Bitmap到图片上
+                                        ivImage.setImageBitmap(bitmap);
+                                    }
+                                }
+                            }
+                        });
+                break;
+            case R.id.btn_12:
+                Glide.with(this)
+                        .load(ConstantImage.homePageConcentration[1])
+                        //强制Glide返回一个Bitmap对象
+                        .asBitmap()
+                        .listener(new RequestListener<String, Bitmap>() {
+                            @Override
+                            public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
+                                Log.d("image", "onException " + e.toString());
+                                return false;
+                            }
+
+                            @Override
+                            public boolean onResourceReady(Bitmap bitmap, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
+                                int width = bitmap.getWidth();
+                                int height = bitmap.getHeight();
+                                Log.d("image", "width2  " + width);
+                                Log.d("image", "height3  " + height);
+                                return false;
+                            }
+                        })
+                        .into(ivImage);
+                break;
+            case R.id.btn_13:
+
+                break;
+            case R.id.btn_14:
+
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    /**
+     * 返回一个不可变的源位图的位图的子集,改变了可选的矩阵。新的位图可能与源相同的对象,或可能是一个副本。
+     * 它初始化与原始位图的密度。如果源位图是不可变的,请求的子集是一样的源位图本身,然后返回源位图,没有新的位图创建。
+     *
+     * @param source 产生子位图的源位图
+     * @param x      子位图第一个像素在源位图的X坐标
+     * @param y      子位图第一个像素在源位图的y坐标
+     * @param width  子位图每一行的像素个数
+     * @param height 子位图的行数
+     * @param m      对像素值进行变换的可选矩阵
+     * @param filter 如果为true,源图要被过滤。该参数仅在matrix包含了超过一个翻转才有效
+     * @return 一个描述了源图指定子集的位图。 Bitmap
+     */
+    public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) {
+        Bitmap bitmap;
+        try {
+            bitmap = Bitmap.createBitmap(source, x, y, width, height, m, filter);
+        } catch (OutOfMemoryError localOutOfMemoryError) {
+            gc();
+            bitmap = Bitmap.createBitmap(source, x, y, width, height, m, filter);
+        }
+        return bitmap;
+    }
+
+
+    /**
+     * 回收
+     */
+    private static void gc() {
+        System.gc();
+        // 表示java虚拟机会做一些努力运行已被丢弃对象(即没有被任何对象引用的对象)的 finalize
+        // 方法,前提是这些被丢弃对象的finalize方法还没有被调用过
+        System.runFinalization();
+    }
+
+
+}

+ 413 - 0
app/src/main/java/org/yczbj/ycvideoplayer/util/AppUtil.java

@@ -0,0 +1,413 @@
+package org.yczbj.ycvideoplayer.util;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.ClipboardManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.net.Uri;
+import android.os.PowerManager;
+import android.text.format.DateFormat;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Toast;
+
+
+import org.yczbj.ycvideoplayer.base.BaseApplication;
+
+import java.lang.ref.WeakReference;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by PC on 2017/2/22.
+ * 作者:PC
+ */
+
+public class AppUtil {
+
+
+    /**
+     * 实现文本复制功能
+     * @param content 复制的文本
+     */
+    public static void copy(String content) {
+        // 得到剪贴板管理器
+        ClipboardManager cmb = (ClipboardManager) BaseApplication.getInstance().getSystemService(Context.CLIPBOARD_SERVICE);
+        cmb.setText(content.trim());
+    }
+
+    /**
+     * 使用外部浏览器打开链接
+     * @param context
+     * @param content
+     */
+    public static void openLink(Context context, String content) {
+        Uri issuesUrl = Uri.parse(content);
+        Intent intent = new Intent(Intent.ACTION_VIEW, issuesUrl);
+        context.startActivity(intent);
+    }
+
+
+    /**
+     * 设置某个View的margin
+     *
+     * @param view   需要设置的view
+     * @param isDp   需要设置的数值是否为DP
+     * @param left   左边距
+     * @param right  右边距
+     * @param top    上边距
+     * @param bottom 下边距
+     * @return
+     */
+    public static ViewGroup.LayoutParams setViewMargin(View view, boolean isDp, int left, int right, int top, int bottom) {
+        if (view == null) {
+            return null;
+        }
+
+        int leftPx = left;
+        int rightPx = right;
+        int topPx = top;
+        int bottomPx = bottom;
+        ViewGroup.LayoutParams params = view.getLayoutParams();
+        ViewGroup.MarginLayoutParams marginParams = null;
+        //获取view的margin设置参数
+        if (params instanceof ViewGroup.MarginLayoutParams) {
+            marginParams = (ViewGroup.MarginLayoutParams) params;
+        } else {
+            //不存在时创建一个新的参数
+            marginParams = new ViewGroup.MarginLayoutParams(params);
+        }
+
+        //根据DP与PX转换计算值
+        if (isDp) {
+            leftPx = dip2px(left);
+            rightPx = dip2px(right);
+            topPx = dip2px(top);
+            bottomPx = dip2px(bottom);
+        }
+        //设置margin
+        marginParams.setMargins(leftPx, topPx, rightPx, bottomPx);
+        view.setLayoutParams(marginParams);
+        view.requestLayout();
+        return marginParams;
+    }
+
+    /**
+     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
+     */
+    public static int dip2px(float dpValue) {
+        final float scale = BaseApplication.getInstance().getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+    /**
+     * 创建缓存key
+     * @param param
+     * @return
+     */
+    public static String createCacheKey(Object... param) {
+        String key = "";
+        for (Object o : param) {
+            key += "-" + o;
+        }
+        return key.replaceFirst("-","");
+    }
+
+    /**
+     * 格式化
+     * @param wordCount
+     * @return
+     */
+    public static String formatWordCount(int wordCount) {
+        if (wordCount / 10000 > 0) {
+            return (int) ((wordCount / 10000f) + 0.5) + "万字";
+        } else if (wordCount / 1000 > 0) {
+            return (int) ((wordCount / 1000f) + 0.5) + "千字";
+        } else {
+            return wordCount + "字";
+        }
+    }
+
+
+    /**
+     * 判断本地是否存在某个APP
+     * @param context       上下文
+     * @param pkgName       应用的包名
+     * @return              true:该app存在;false:该app不存在
+     */
+    public static boolean isPkgInstalled(Context context, String pkgName) {
+        PackageInfo packageInfo ;
+        try {
+            synchronized (context){
+                packageInfo = context.getPackageManager().getPackageInfo(pkgName, 0);
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            packageInfo = null;
+            e.printStackTrace();
+        }
+        if (packageInfo == null) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * 判断相对应的APP是否存在
+     * @param context       上下文
+     * @param packageName   (包名)(若想判断QQ,则改为com.tencent.mobileqq,若想判断微信,则改为com.tencent.mm)
+     * @return              true:该app存在;false:该app不存在
+     */
+    public boolean isAvilible(Context context, String packageName) {
+        PackageManager packageManager = context.getPackageManager();
+        //获取手机系统的所有APP包名,然后进行一一比较
+        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
+        for (int i = 0; i < pinfo.size(); i++) {
+            if (((PackageInfo) pinfo.get(i)).packageName.equalsIgnoreCase(packageName)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 设置页面的透明度
+     * 主要作用于:弹窗时设置宿主Activity的背景色
+     * @param bgAlpha 1表示不透明
+     */
+    public static void setBackgroundAlpha(Activity activity, float bgAlpha) {
+        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
+        lp.alpha = bgAlpha;
+        Window window = activity.getWindow();
+        if(window!=null){
+            if (bgAlpha == 1) {
+                //不移除该Flag的话,在有视频的页面上的视频会出现黑屏的bug
+                window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+            } else {
+                //此行代码主要是解决在华为手机上半透明效果无效的bug
+                window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+            }
+            window.setAttributes(lp);
+        }
+    }
+
+    /**
+     * 设置页面的昏暗度
+     * 主要作用于:弹窗时设置宿主Activity的背景色
+     * @param bgDimAmount
+     */
+    public static void setBackgroundDimAmount(Activity activity, float bgDimAmount){
+        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
+        lp.dimAmount = bgDimAmount;
+        Window window = activity.getWindow();
+        if(window!=null){
+            if(bgDimAmount == 1){
+                window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+            }else {
+                window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+            }
+            window.setAttributes(lp);
+        }
+    }
+
+    /**
+     * 背景模糊
+     * 主要作用于:activity页面,建议不要用这种方式,可以使用模糊视图自定义控件【毛玻璃效果】
+     * @param
+     */
+    public static void setBackgroundDimAmount(Activity activity, View view, int bgAlpha){
+        Window window = activity.getWindow();
+        if(window!=null){
+            window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
+            //0~255透明度值 ,0为完全透明,255为不透明
+            view.getBackground().setAlpha(bgAlpha);
+        }
+    }
+
+
+    /**
+     * 判断某Activity是否挂掉,主要是用于弹窗
+     * @param activity
+     * @return
+     */
+    public static boolean isActivityLiving(Activity activity) {
+        if (activity == null) {
+            Log.d("wisely", "activity == null");
+            return false;
+        }
+        if (activity.isFinishing()) {
+            Log.d("wisely", "activity is finishing");
+            return false;
+        }
+        String name = activity.getClass().getName();
+        Log.d("wisely",name+"---");
+        Log.d("wisely", "activity is living");
+        return true;
+    }
+
+    /**
+     * 判断某Activity是否挂掉,主要是用于弹窗
+     */
+    private static boolean isActivityLiving(WeakReference<Activity> weakReference) {
+        if(weakReference != null){
+            Activity activity = weakReference.get();
+            if (activity == null) {
+                return false;
+            }
+            if (activity.isFinishing()) {
+                return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 格式化毫秒值,如果这个毫秒值包含小时,则格式为时分秒,如:01:30:58,如果不包含小时,则格式化为分秒,如:30:58
+     * @param duration
+     * @return
+     */
+    public static CharSequence formatMillis(long duration) {
+        Calendar calendar = Calendar.getInstance(); // 以当前系统时间创建一个日历
+        calendar.clear();   // 清空时间,变成1970 年 1 月 1 日 00:00:00
+        calendar.add(Calendar.MILLISECOND, (int) duration);// 1970 年 1 月 1 日 01:58:32
+        boolean hasHour = duration / (1 * 60 * 60 * 1000) > 0;    // 判断毫秒值有没有包含小时
+        CharSequence inFormat = hasHour ? "kk:mm:ss" : "mm:ss";   // 如果包含小时,则格式化为时:分:秒,否则格式化为分:秒
+        return DateFormat.format(inFormat, calendar);
+    }
+
+    /**
+     * 判断应用是否处于后台
+     * @param context
+     * @return
+     */
+    public static boolean isAppOnBackground(Context context) {
+        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
+        if (!tasks.isEmpty()) {
+            ComponentName topActivity = tasks.get(0).topActivity;
+            if (!topActivity.getPackageName().equals(context.getPackageName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 判断是否锁屏
+     * @param context
+     * @return
+     */
+    public static boolean isLockScreen(Context context){
+        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        boolean isScreenOn = pm.isScreenOn();       //如果为true,则表示屏幕“亮”了,否则屏幕“暗”了。
+        if (isScreenOn){
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    public static String hashKey(String key) {
+        String hashKey;
+        try {
+            final MessageDigest mDigest = MessageDigest.getInstance("MD5");
+            mDigest.update(key.getBytes());
+            hashKey = bytesToHexString(mDigest.digest());
+        } catch (NoSuchAlgorithmException e) {
+            hashKey = String.valueOf(key.hashCode());
+        }
+        return hashKey;
+    }
+
+    private static String bytesToHexString(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < bytes.length; i++) {
+            String hex = Integer.toHexString(0xFF & bytes[i]);
+            if (hex.length() == 1) {
+                sb.append('0');
+            }
+            sb.append(hex);
+        }
+        return sb.toString();
+    }
+
+
+
+
+    /**
+     * 根据Pid获取当前进程的名字,一般就是当前app的包名
+     *
+     * @param pid 进程的id
+     * @return 返回进程的名字
+     */
+    public static String getAppName(Context context , int pid) {
+        String processName ;
+        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        List list = activityManager.getRunningAppProcesses();
+        Iterator i = list.iterator();
+        while (i.hasNext()) {
+            ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next());
+            try {
+                if (info.pid == pid) {
+                    // 根据进程的信息获取当前进程的名字
+                    processName = info.processName;
+                    // 返回当前进程名
+                    return processName;
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        // 没有匹配的项,返回为null
+        return null;
+    }
+
+
+
+    /** 获取状态栏高度 */
+    public static int getStatusBarHeight(Context context) {
+        int result = 24;
+        int resId = context.getResources().getIdentifier("status_bar_height",
+                "dimen", "android");
+        if (resId > 0) {
+            result = context.getResources().getDimensionPixelSize(resId);
+        } else {
+            result = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                    result, Resources.getSystem().getDisplayMetrics());
+        }
+        return result;
+    }
+
+    /**
+     * 获取导航栏高度
+     * @param context
+     * @return
+     */
+    public static int getDaoHangHeight(Context context) {
+        int result = 0;
+        int resourceId=0;
+        int rid = context.getResources().getIdentifier("config_showNavigationBar", "bool", "android");
+        if (rid!=0){
+            resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
+            return context.getResources().getDimensionPixelSize(resourceId);
+        }else{
+            return 0;
+        }
+    }
+
+}

+ 76 - 0
app/src/main/java/org/yczbj/ycvideoplayer/util/ImageCropUtils.java

@@ -0,0 +1,76 @@
+package org.yczbj.ycvideoplayer.util;
+
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.util.Log;
+
+public class ImageCropUtils {
+
+
+    /**
+     * 按宽/高缩放图片到指定大小并进行裁剪得到中间部分图片
+     * @param bitmap 源bitmap
+     * @param w 缩放后指定的宽度
+     * @param h 缩放后指定的高度
+     * @return 缩放后的中间部分图片 Bitmap
+     */
+    public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
+        int width = bitmap.getWidth();
+        int height = bitmap.getHeight();
+        Log.i("TAG", "zoomBitmap---" + "width:" + width + "---" + "height:" + height);
+        float scaleWidht, scaleHeight, x, y;
+        Bitmap newbmp;
+        Matrix matrix = new Matrix();
+        if (width > height) {
+            scaleWidht = ((float) h / height);
+            scaleHeight = ((float) h / height);
+            // 获取bitmap源文件中x做表需要偏移的像数大小
+            x = (width - w * height / h) / 2;
+            y = 0;
+        } else if (width < height) {
+            scaleWidht = ((float) w / width);
+            scaleHeight = ((float) w / width);
+            x = 0;
+            // 获取bitmap源文件中y做表需要偏移的像数大小
+            y = (height - h * width / w) / 2;
+        } else {
+            scaleWidht = ((float) w / width);
+            scaleHeight = ((float) w / width);
+            x = 0;
+            y = 0;
+        }
+        matrix.postScale(scaleWidht, scaleHeight);
+        try {
+            // createBitmap()方法中定义的参数x+width要小于或等于bitmap.getWidth(),y+height要小于或等于bitmap.getHeight()
+            newbmp = Bitmap.createBitmap(bitmap, (int) x, (int) y, (int) (width - x), (int) (height - y), matrix, true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        return newbmp;
+    }
+
+
+    /**
+     * 裁剪图片
+     */
+    public static Bitmap cutBitmap(Bitmap bm){
+        Bitmap bitmap = null;
+        if(bm!=null){
+            //对图片的进行裁剪
+            if((bm.getWidth()*2)/5+(bm.getWidth()*3)/5 <= bm.getWidth()){
+                Matrix matrix = new Matrix();
+                //缩放比例
+                matrix.postScale(1, 1);
+                bitmap = Bitmap.createBitmap(bm,(bm.getWidth()*2)/5,0,(bm.getWidth()*3)/5,bm.getHeight(),matrix,true);
+                LogUtils.e("图片image1    "+bitmap.getWidth());
+            }else {
+                bitmap = Bitmap.createBitmap(bm,0,0,bm.getWidth(),bm.getHeight());
+                LogUtils.e("图片image2    "+bitmap.getWidth());
+            }
+        }
+        return bitmap;
+    }
+
+
+}

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/util/ImageUtils.java → app/src/main/java/org/yczbj/ycvideoplayer/util/ImageUtil.java

@@ -24,7 +24,7 @@ import org.yczbj.ycvideoplayer.weight.CircleTransform;
  * 修订历史:
  * ================================================
  */
-public class ImageUtils {
+public class ImageUtil {
 
     /**
      * 加载图片

+ 101 - 0
app/src/main/java/org/yczbj/ycvideoplayer/weight/HeightTransformation.java

@@ -0,0 +1,101 @@
+package org.yczbj.ycvideoplayer.weight;
+
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.RectF;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.Transformation;
+import com.bumptech.glide.load.engine.Resource;
+import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
+import com.bumptech.glide.load.resource.bitmap.BitmapResource;
+
+public class HeightTransformation implements Transformation<Bitmap> {
+
+    public enum CropType {
+        TOP,
+        CENTER,
+        BOTTOM
+    }
+
+    private BitmapPool mBitmapPool;
+    private int mWidth;
+    private int mHeight;
+
+    private CropType mCropType = CropType.CENTER;
+
+    public HeightTransformation(Context context) {
+        this(Glide.get(context).getBitmapPool());
+    }
+
+    private HeightTransformation(BitmapPool pool) {
+        this(pool, 0, 0);
+    }
+
+    public HeightTransformation(Context context, int width, int height) {
+        this(Glide.get(context).getBitmapPool(), width, height);
+    }
+
+    private HeightTransformation(BitmapPool pool, int width, int height) {
+        this(pool, width, height, CropType.CENTER);
+    }
+
+    public HeightTransformation(Context context, int width, int height, CropType cropType) {
+        this(Glide.get(context).getBitmapPool(), width, height, cropType);
+    }
+
+    private HeightTransformation(BitmapPool pool, int width, int height, CropType cropType) {
+        mBitmapPool = pool;
+        mWidth = width;
+        mHeight = height;
+        mCropType = cropType;
+    }
+
+    @Override
+    public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
+        Bitmap source = resource.get();
+        mWidth = mWidth == 0 ? source.getWidth() : mWidth;
+        mHeight = mHeight == 0 ? source.getHeight() : mHeight;
+
+        Bitmap.Config config = source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
+        Bitmap bitmap = mBitmapPool.get(mWidth, mHeight, config);
+        if (bitmap == null) {
+            bitmap = Bitmap.createBitmap(mWidth, mHeight, config);
+        }
+
+        float scaleX = (float) mWidth / source.getWidth();
+        float scaleY = (float) mHeight / source.getHeight();
+        float scale = Math.max(scaleX, scaleY);
+
+        float scaledWidth = scale * source.getWidth();
+        float scaledHeight = scale * source.getHeight();
+        float left = (mWidth - scaledWidth);
+        float top = getTop(scaledHeight);
+        RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
+
+        Canvas canvas = new Canvas(bitmap);
+        canvas.drawBitmap(source, null, targetRect, null);
+
+        return BitmapResource.obtain(bitmap, mBitmapPool);
+    }
+
+    @Override
+    public String getId() {
+        return "CropTransformation(width=" + mWidth + ", height=" + mHeight + ", cropType=" + mCropType + ")";
+    }
+
+    private float getTop(float scaledHeight) {
+        switch (mCropType) {
+            case TOP:
+                return 0;
+            case CENTER:
+                return (mHeight - scaledHeight) / 2;
+            case BOTTOM:
+                return mHeight - scaledHeight;
+            default:
+                return 0;
+        }
+    }
+}
+

BIN
app/src/main/res/drawable-xhdpi/btn_download.png


BIN
app/src/main/res/drawable-xhdpi/icon_cache_delete.png


BIN
app/src/main/res/drawable-xhdpi/icon_cache_download.png


BIN
app/src/main/res/drawable-xhdpi/icon_cache_play.png


BIN
app/src/main/res/drawable-xhdpi/icon_cancel.png


BIN
app/src/main/res/drawable-xhdpi/icon_download_normal.png


BIN
app/src/main/res/drawable-xxhdpi/test.png


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.