Browse Source

Merge branch 'master' of http://116.62.119.248:10082/cheng_zq/EffectDemo into lwz_

# Conflicts:
#	.idea/misc.xml
LAPTOP-K69FCNBP\crius 2 years ago
parent
commit
f9ea5b7804
53 changed files with 1473 additions and 127 deletions
  1. 2 18
      .idea/misc.xml
  2. 18 8
      app/build.gradle
  3. 6 1
      app/proguard-rules.pro
  4. 27 7
      app/src/main/java/com/xunao/effectdemo/App.java
  5. 0 1
      app/src/main/java/com/xunao/effectdemo/activity/CongratulationsActivity.kt
  6. 0 1
      app/src/main/java/com/xunao/effectdemo/activity/DragSelectActivity.java
  7. 5 5
      app/src/main/java/com/xunao/effectdemo/activity/GSXYVideoPlayerActivity.java
  8. 0 1
      app/src/main/java/com/xunao/effectdemo/activity/LottieActivity.kt
  9. 0 3
      app/src/main/java/com/xunao/effectdemo/activity/ProgressDemoActivity.kt
  10. 0 1
      app/src/main/java/com/xunao/effectdemo/activity/QuxianActivity.java
  11. 1 1
      app/src/main/java/com/xunao/effectdemo/activity/SongLyricActivity.kt
  12. 0 1
      app/src/main/java/com/xunao/effectdemo/activity/SoundActivity.java
  13. 0 8
      app/src/main/java/com/xunao/effectdemo/activity/StarsActivity.java
  14. 0 1
      app/src/main/java/com/xunao/effectdemo/activity/Test2Activity.java
  15. 0 8
      app/src/main/java/com/xunao/effectdemo/activity/TestActivity.java
  16. 80 0
      app/src/main/java/com/xunao/effectdemo/adapter/DeviceAdapter.java
  17. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/Anim.java
  18. 0 3
      app/src/main/java/com/xunao/effectdemo/anim/AnimBaiYeChuang.java
  19. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/AnimCaChu.java
  20. 0 2
      app/src/main/java/com/xunao/effectdemo/anim/AnimHeZhuang.java
  21. 0 3
      app/src/main/java/com/xunao/effectdemo/anim/AnimJieTi.java
  22. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/AnimLingXing.java
  23. 0 2
      app/src/main/java/com/xunao/effectdemo/anim/AnimLunZi.java
  24. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/AnimPiLie.java
  25. 0 2
      app/src/main/java/com/xunao/effectdemo/anim/AnimQiPan.java
  26. 0 2
      app/src/main/java/com/xunao/effectdemo/anim/AnimQieRu.java
  27. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/AnimShanXingZhanKai.java
  28. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/AnimShiZiXingKuoZhan.java
  29. 0 3
      app/src/main/java/com/xunao/effectdemo/anim/AnimSuiJiXianTiao.java
  30. 0 2
      app/src/main/java/com/xunao/effectdemo/anim/AnimXiangNeiRongJie.java
  31. 0 1
      app/src/main/java/com/xunao/effectdemo/anim/AnimYuanXingKuoZhan.java
  32. 226 0
      app/src/main/java/com/xunao/effectdemo/dlan/CastManager.java
  33. 197 0
      app/src/main/java/com/xunao/effectdemo/dlan/DLNAControlCenter.java
  34. 172 0
      app/src/main/java/com/xunao/effectdemo/dlan/DeviceManager.java
  35. 19 0
      app/src/main/java/com/xunao/effectdemo/dlan/IUIUpdateListener.java
  36. 0 2
      app/src/main/java/com/xunao/effectdemo/dragview/DragViewUtil.java
  37. 0 9
      app/src/main/java/com/xunao/effectdemo/umeng/UmInitConfig.java
  38. 0 4
      app/src/main/java/com/xunao/effectdemo/utils/FocusUtils.java
  39. 0 2
      app/src/main/java/com/xunao/effectdemo/utils/MediaRecorderDemo.java
  40. 0 1
      app/src/main/java/com/xunao/effectdemo/view/Calculator.java
  41. 0 2
      app/src/main/java/com/xunao/effectdemo/view/FireworkView.java
  42. 0 1
      app/src/main/java/com/xunao/effectdemo/view/GuideImageView.java
  43. 0 1
      app/src/main/java/com/xunao/effectdemo/view/MaskFilterView.java
  44. 0 2
      app/src/main/java/com/xunao/effectdemo/view/MyGuideCaseQueue.java
  45. 0 3
      app/src/main/java/com/xunao/effectdemo/view/MyGuideCaseView.java
  46. 0 2
      app/src/main/java/com/xunao/effectdemo/view/MyLikeView.java
  47. 434 2
      app/src/main/java/com/xunao/effectdemo/view/VideoPreviewPlay.java
  48. 0 1
      app/src/main/java/com/xunao/effectdemo/view/circleprogress/DialProgress.java
  49. 1 0
      app/src/main/res/layout/activity_gsxy_video.xml
  50. 269 0
      app/src/main/res/layout/activity_my_video.xml
  51. 1 2
      app/src/main/res/layout/fragment_first.xml
  52. 1 2
      app/src/main/res/layout/fragment_second.xml
  53. 14 0
      app/src/main/res/layout/item_device.xml

+ 2 - 18
.idea/misc.xml

@@ -8,6 +8,8 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_count_down.xml" value="0.25" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_drag_select.xml" value="0.12708333333333333" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_enty_anim.xml" value="0.11979166666666667" />
+        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_gsxy_video.xml" value="0.1" />
+        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_ijkplay.xml" value="0.1390625" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_lottie.xml" value="0.1" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_main.xml" value="0.1375" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_progress.xml" value="0.22" />
@@ -23,24 +25,6 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_view.xml" value="0.25" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_web.xml" value="0.1816123188405797" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/demo_activity.xml" value="0.18020833333333333" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/check_box_bg.xml" value="0.1" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/left_round_bg.xml" value="0.1355" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/right_round_bg.xml" value="0.139" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_audio.xml" value="0.2604166666666667" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_gsxy_video.xml" value="0.24179260031266284" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_main.xml" value="0.20852641334569044" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_map_challenge.xml" value="0.21241050119331742" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_quxian.xml" value="0.8631178707224335" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_test2.xml" value="0.2600652883569097" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_video_demand.xml" value="0.1" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_word_cut.xml" value="0.42962962962962964" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/demo_activity.xml" value="0.35025641025641024" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/fragment_audio_demand.xml" value="0.2631578947368421" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/item_audio_demand.xml" value="0.1" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/item_video_demand.xml" value="0.3850877192982456" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/item_word_cut.xml" value="0.2577777777777778" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/view_linear.xml" value="0.17407407407407408" />
-        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/view_video_demand.xml" value="0.22864583333333333" />
       </map>
     </option>
   </component>

+ 18 - 8
app/build.gradle

@@ -13,7 +13,7 @@ android {
     buildToolsVersion "30.0.3"
 
     defaultConfig {
-        applicationId "com.xunao.effectdemo"
+        applicationId "com.bestv.app"
         minSdkVersion 21
         targetSdkVersion 30
         versionCode 1
@@ -49,15 +49,24 @@ android {
         }
 
         debug {
-            storeFile file("effect.jks")
-            storePassword "xunao123"
-            keyAlias "xuantu"
-            keyPassword "xunao123"
-            v1SigningEnabled true
-            v2SigningEnabled true
+//            storeFile file("effect.jks")
+//            storePassword "xunao123"
+//            keyAlias "xuantu"
+//            keyPassword "xunao123"
+            storeFile file("bestvedu.jks")
+            storePassword "bestv001!"
+            keyAlias "bestvedu"
+            keyPassword "bestv001!"
+//            v1SigningEnabled true
+//            v2SigningEnabled true
         }
     }
     buildTypes {
+        debug {
+            minifyEnabled false
+            signingConfig signingConfigs.debug
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
@@ -155,5 +164,6 @@ dependencies {
 
     //完整版引入
     implementation 'com.shuyu:GSYVideoPlayer:8.1.2'
-
+    implementation 'com.blankj:utilcodex:1.31.0'
+    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.3'
 }

+ 6 - 1
app/proguard-rules.pro

@@ -18,4 +18,9 @@
 
 # If you keep the line number information, uncomment this to
 # hide the original source file name.
-#-renamesourcefileattribute SourceFile
+#-renamesourcefileattribute SourceFile
+
+###Lebo
+-keep class com.hpplay.**{*;}
+-keep class com.hpplay.**$*{*;}
+-dontwarn com.hpplay.**

+ 27 - 7
app/src/main/java/com/xunao/effectdemo/App.java

@@ -7,7 +7,12 @@ import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.util.Log;
 
+import com.xunao.effectdemo.dlan.CastManager;
+import com.blankj.utilcode.util.DeviceUtils;
+import com.hpplay.sdk.source.api.IBindSdkListener;
+import com.hpplay.sdk.source.api.ILelinkPlayerListener;
 import com.hpplay.sdk.source.api.LelinkSourceSDK;
+import com.hpplay.sdk.source.browse.api.IAPI;
 import com.uc.crashsdk.export.CrashApi;
 import com.umeng.analytics.MobclickAgent;
 import com.umeng.commonsdk.UMConfigure;
@@ -15,6 +20,8 @@ import com.xunao.effectdemo.umeng.UmInitConfig;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 import cn.jpush.android.api.JPushInterface;
@@ -29,7 +36,7 @@ import cn.jpush.android.api.JPushInterface;
 public class App extends Application {
 
 	public static App app;
-
+	private IBindSdkListener mBindSdkListener;
 	public static App getInstance() {
 		return app;
 	}
@@ -41,16 +48,29 @@ public class App extends Application {
 		JPushInterface.setDebugMode(true);
 		JPushInterface.init(this);
 //		getSHA1Signature(this);
-
+		initLebo();
 	}
-
+	private final List<ILelinkPlayerListener> mListenerList = new ArrayList<>();
 	void initLebo(){
-//		LelinkSourceSDK.getInstance()
-//				//FIXME WARN: 这里替换为您申请的AppID & AppSecret,build.gradle替换为您的应用包名
-//				.setSdkInitInfo(this, getString(R.string.app_id), getString(R.string.app_secret))
-//				.easyPush(mBrowseContainer);
+
+		mBindSdkListener = new IBindSdkListener() {
+			@Override
+			public void onBindCallback(boolean success) {
+				Log.e("LeBo","初始化:"+success);
+				LelinkSourceSDK.getInstance().setPermissionMode( IAPI.PERMISSION_MODE_CLOUD_LICENSE, DeviceUtils.getUniqueDeviceId());
+			}
+		};
+//		DLNAControlCenter.getInstance();
+		LelinkSourceSDK.getInstance()
+				.setBindSdkListener(mBindSdkListener)
+				.setPlayListener(CastManager.getInstance().getLelinkPlayerListener())
+				.setSdkInitInfo(this, "17894", "69ce8955094258d339c1b6eadef2ec09")
+//				.setSdkInitInfo(this,"20268", "30ff4917114c5241eddbef00e5be7f6b")
+				.bindSdk();
 	}
 
+
+
 	/**
 	 * 初始化友盟SDK
 	 */

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/CongratulationsActivity.kt

@@ -4,7 +4,6 @@ import android.app.Activity
 import android.os.Bundle
 import com.xunao.effectdemo.R
 import kotlinx.android.synthetic.main.activity_congratulations.*
-import kotlinx.android.synthetic.main.activity_lottie.*
 
 /**
  * author : 程中强

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/DragSelectActivity.java

@@ -16,7 +16,6 @@ import android.view.animation.DecelerateInterpolator;
 import android.view.animation.RotateAnimation;
 import android.view.animation.ScaleAnimation;
 import android.view.animation.TranslateAnimation;
-import android.widget.ImageView;
 import android.widget.SeekBar;
 
 import androidx.annotation.NonNull;

+ 5 - 5
app/src/main/java/com/xunao/effectdemo/activity/GSXYVideoPlayerActivity.java

@@ -1,17 +1,14 @@
 package com.xunao.effectdemo.activity;
 
 import android.app.Activity;
-import android.content.pm.ActivityInfo;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
-import android.widget.ImageView;
 
 import androidx.annotation.Nullable;
 
 import com.shuyu.gsyvideoplayer.GSYVideoManager;
 import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
-import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
 import com.xunao.effectdemo.R;
 import com.xunao.effectdemo.view.VideoPreviewPlay;
 
@@ -28,6 +25,7 @@ public class GSXYVideoPlayerActivity extends Activity {
 	private OrientationUtils orientationUtils;
 	private Button btn;
 	private boolean isFirst = false;
+
 	private String url = "http://v3.cztv.com/cztv/vod/2018/06/28/7c45987529ea410dad7c088ba3b53dac/h264_1500k_mp4.mp4";
 	@Override
 	protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -36,6 +34,8 @@ public class GSXYVideoPlayerActivity extends Activity {
 		init();
 	}
 
+
+
 	void init(){
 		videoPlayer = findViewById(R.id.video_play);
 		videoPlayer.setUp(url, true, "null");
@@ -57,10 +57,10 @@ public class GSXYVideoPlayerActivity extends Activity {
 
 		btn = findViewById(R.id.btn_finish);
 		btn.setOnClickListener(v->{
+			videoPlayer.onVideoPause();
 			isFirst = !isFirst;
 			videoPlayer.setIsFinish(isFirst);
-//			videoPlayer.setIsTouchWiget(isFirst);
-//			videoPlayer.setIsTouchWigetFull(isFirst);
+			videoPlayer.stopDlan();
 		});
 	}
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/LottieActivity.kt

@@ -4,7 +4,6 @@ import android.app.Activity
 import android.os.Bundle
 import com.xunao.effectdemo.R
 import kotlinx.android.synthetic.main.activity_lottie.*
-import kotlinx.android.synthetic.main.activity_lottie.view.*
 
 /**
  * author : 程中强

+ 0 - 3
app/src/main/java/com/xunao/effectdemo/activity/ProgressDemoActivity.kt

@@ -3,9 +3,6 @@ package com.xunao.effectdemo.activity
 import android.app.Activity
 import android.os.Bundle
 import android.util.Log
-import android.widget.SeekBar
-import com.xuexiang.xui.widget.picker.XSeekBar
-import com.xuexiang.xui.widget.progress.HorizontalProgressView
 import com.xunao.effectdemo.R
 import kotlinx.android.synthetic.main.activity_progress.*
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/QuxianActivity.java

@@ -14,7 +14,6 @@ import android.view.animation.LinearInterpolator;
 import android.view.animation.RotateAnimation;
 import android.view.animation.TranslateAnimation;
 import android.widget.Button;
-import android.widget.ImageView;
 import android.widget.RelativeLayout;
 
 import androidx.annotation.Nullable;

+ 1 - 1
app/src/main/java/com/xunao/effectdemo/activity/SongLyricActivity.kt

@@ -45,7 +45,7 @@ class SongLyricActivity : AppCompatActivity() {
 //            )
             lyricList.forEach {
                 val startIndexTemp = startIndex
-                val duration = (1500 + Math.random() * 500).toLong()
+                val duration = (1500 + it.length*Math.random() * 500).toLong()
                 text.postDelayed(
                     {
                         text.startPlayLine(

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/SoundActivity.java

@@ -9,7 +9,6 @@ import android.os.Handler;
 import android.os.Message;
 import android.util.Log;
 import android.view.MotionEvent;
-import android.view.View;
 import android.view.animation.Animation;
 import android.view.animation.ScaleAnimation;
 import android.widget.RelativeLayout;

+ 0 - 8
app/src/main/java/com/xunao/effectdemo/activity/StarsActivity.java

@@ -2,10 +2,7 @@ package com.xunao.effectdemo.activity;
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
 import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
 import android.view.animation.ScaleAnimation;
 import android.view.animation.TranslateAnimation;
 import android.widget.ImageView;
@@ -15,12 +12,7 @@ import android.widget.TextView;
 import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieAnimationView;
-import com.umeng.analytics.MobclickAgent;
-import com.xunao.effectdemo.App;
 import com.xunao.effectdemo.R;
-import com.xunao.effectdemo.bean.World;
-
-import cn.jpush.android.api.JPushInterface;
 
 /**
  * author : 程中强

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/Test2Activity.java

@@ -9,7 +9,6 @@ import android.animation.ValueAnimator;
 import android.app.Activity;
 
 
-import android.content.ClipData;
 import android.graphics.PointF;
 import android.os.Bundle;
 import android.os.Handler;

+ 0 - 8
app/src/main/java/com/xunao/effectdemo/activity/TestActivity.java

@@ -4,16 +4,11 @@ import android.animation.Animator;
 import android.animation.TypeEvaluator;
 import android.animation.ValueAnimator;
 import android.app.Activity;
-import android.content.ClipData;
-import android.content.Intent;
 import android.graphics.PointF;
 import android.os.Handler;
 import android.os.Message;
-import android.os.SystemClock;
 import android.os.Bundle;
 import android.util.Log;
-import android.view.DragEvent;
-import android.view.HapticFeedbackConstants;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -21,8 +16,6 @@ import android.view.animation.Animation;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.TranslateAnimation;
 import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 
@@ -30,7 +23,6 @@ import androidx.annotation.NonNull;
 
 import com.xunao.effectdemo.R;
 import com.xunao.effectdemo.bean.ListBean;
-import com.xunao.effectdemo.dragview.DragViewUtil;
 import com.xunao.effectdemo.view.MaskFilterView;
 
 import java.util.ArrayList;

+ 80 - 0
app/src/main/java/com/xunao/effectdemo/adapter/DeviceAdapter.java

@@ -0,0 +1,80 @@
+package com.xunao.effectdemo.adapter;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.xunao.effectdemo.R;
+import com.hpplay.sdk.source.browse.api.LelinkServiceInfo;
+
+import java.util.List;
+
+/**
+ * author : 程中强
+ * e-mail : 740479946@qq.com
+ * date : 2022/9/2114:22
+ * desc :
+ * version: 1.0
+ */
+public class DeviceAdapter extends BaseAdapter {
+
+	private List<LelinkServiceInfo> data;
+	private Context context;
+
+	public DeviceAdapter(Context context, @Nullable List<LelinkServiceInfo> data) {
+
+		this.context = context;
+		this.data = data;
+	}
+
+//	@Override
+//	protected void convert(@NonNull BaseViewHolder helper, LelinkServiceInfo item) {
+//		Log.e("MyTag","设备:"+item.getName());
+//		helper
+//				.setText(R.id.tv_name_item, TextUtils.isEmpty(item.getName())?"":item.getName())
+//
+//		;
+//	}
+
+	@Override
+	public int getCount() {
+		return data.size();
+	}
+
+	@Override
+	public Object getItem(int i) {
+		return data.get(i);
+	}
+
+	@Override
+	public long getItemId(int i) {
+		return i;
+	}
+
+	@Override
+	public View getView(int i, View convertView, ViewGroup viewGroup) {
+		MyViewHolder holder;
+		if (convertView == null) {
+			holder = new MyViewHolder();
+			convertView = LayoutInflater.from(context).inflate(R.layout.item_device, null);
+			holder.tv_name = convertView.findViewById(R.id.tv_name_item);
+			convertView.setTag(holder);
+		} else {
+			holder = (MyViewHolder) convertView.getTag();
+		}
+		Log.e("MyTag","结果收到消息111");
+		holder.tv_name.setText(TextUtils.isEmpty(data.get(i).getName())?"":data.get(i).getName());
+		return convertView;
+	}
+
+	class MyViewHolder {
+		TextView tv_name;
+	}
+}

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/Anim.java

@@ -1,7 +1,6 @@
 package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 3
app/src/main/java/com/xunao/effectdemo/anim/AnimBaiYeChuang.java

@@ -2,9 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Path;
-import android.graphics.Region;
-import android.util.Log;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/AnimCaChu.java

@@ -1,7 +1,6 @@
 package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/anim/AnimHeZhuang.java

@@ -2,8 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Region;
-import android.util.Log;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 3
app/src/main/java/com/xunao/effectdemo/anim/AnimJieTi.java

@@ -2,9 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Path;
-import android.graphics.Region;
-import android.util.Log;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/AnimLingXing.java

@@ -3,7 +3,6 @@ package com.xunao.effectdemo.anim;
 import android.graphics.Canvas;
 import android.graphics.Path;
 import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/anim/AnimLunZi.java

@@ -3,8 +3,6 @@ package com.xunao.effectdemo.anim;
 import android.graphics.Canvas;
 import android.graphics.Path;
 import android.graphics.RectF;
-import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/AnimPiLie.java

@@ -2,7 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/anim/AnimQiPan.java

@@ -2,8 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Path;
-import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/anim/AnimQieRu.java

@@ -1,8 +1,6 @@
 package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
-import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/AnimShanXingZhanKai.java

@@ -3,7 +3,6 @@ package com.xunao.effectdemo.anim;
 import android.graphics.Canvas;
 import android.graphics.Path;
 import android.graphics.RectF;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/AnimShiZiXingKuoZhan.java

@@ -2,7 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 3
app/src/main/java/com/xunao/effectdemo/anim/AnimSuiJiXianTiao.java

@@ -2,9 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Path;
-import android.graphics.Region;
-import android.util.Log;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/anim/AnimXiangNeiRongJie.java

@@ -2,8 +2,6 @@ package com.xunao.effectdemo.anim;
 
 import android.graphics.Canvas;
 import android.graphics.Path;
-import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/anim/AnimYuanXingKuoZhan.java

@@ -4,7 +4,6 @@ import android.graphics.Canvas;
 import android.graphics.Path;
 import android.graphics.RectF;
 import android.graphics.Region;
-import android.view.View;
 
 import com.xunao.effectdemo.view.EnterAnimLayout;
 

+ 226 - 0
app/src/main/java/com/xunao/effectdemo/dlan/CastManager.java

@@ -0,0 +1,226 @@
+package com.xunao.effectdemo.dlan;
+
+import android.util.Log;
+
+import com.hpplay.sdk.source.api.ILelinkPlayerListener;
+import com.hpplay.sdk.source.api.INewPlayerListener;
+import com.hpplay.sdk.source.bean.CastBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 推送
+ */
+public class CastManager {
+    private final static String TAG = "DemoCastManager";
+    private static CastManager sInstance = null;
+    private final List<ILelinkPlayerListener> mListenerList = new ArrayList<>();
+    private final List<INewPlayerListener> mListenerList2 = new ArrayList<>();
+    private final ILelinkPlayerListener mLelinkPlayerListener = new ILelinkPlayerListener() {
+
+        @Override
+        public void onLoading() {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onLoading();
+            }
+        }
+
+        @Override
+        public void onStart() {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onStart();
+            }
+        }
+
+        @Override
+        public void onPause() {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onPause();
+            }
+        }
+
+        @Override
+        public void onCompletion() {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onCompletion();
+            }
+        }
+
+        @Override
+        public void onStop() {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onStop();
+            }
+        }
+
+        @Override
+        public void onSeekComplete(int i) {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onSeekComplete(i);
+            }
+        }
+
+        @Override
+        public void onInfo(final int what, final int extra) {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onInfo(what, extra);
+            }
+        }
+
+        @Override
+        public void onInfo(int what, final String data) {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onInfo(what, data);
+            }
+        }
+
+        @Override
+        public void onError(int what, int extra) {
+            Log.i(TAG, "onError what:" + what + " extra:" + extra);
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onError(what, extra);
+            }
+        }
+
+        @Override
+        public void onVolumeChanged(float v) {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onVolumeChanged(v);
+            }
+        }
+
+        @Override
+        public void onPositionUpdate(long duration, long position) {
+            for (ILelinkPlayerListener listener : mListenerList) {
+                listener.onPositionUpdate(duration, position);
+            }
+        }
+    };
+
+    public synchronized static CastManager getInstance() {
+        synchronized (CastManager.class) {
+            if (sInstance == null) {
+                sInstance = new CastManager();
+            }
+        }
+        return sInstance;
+    }
+
+    private CastManager() {
+
+    }
+
+    public ILelinkPlayerListener getLelinkPlayerListener() {
+        return mLelinkPlayerListener;
+    }
+
+    public void addPlayerListener(ILelinkPlayerListener listener) {
+        if (mListenerList.size()>0){
+            mListenerList.clear();
+        }
+        mListenerList.add(listener);
+    }
+
+    public void removeListener(ILelinkPlayerListener listener) {
+        if (listener != null){
+            mListenerList.remove(listener);
+        }
+
+    }
+
+    private final INewPlayerListener mPlayerListener = new INewPlayerListener() {
+
+        @Override
+        public void onLoading(CastBean bean) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onLoading(bean);
+            }
+        }
+
+        @Override
+        public void onStart(CastBean bean) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onStart(bean);
+            }
+        }
+
+        @Override
+        public void onPause(CastBean bean) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onPause(bean);
+            }
+        }
+
+        @Override
+        public void onCompletion(CastBean bean, int type) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onCompletion(bean, type);
+            }
+        }
+
+        @Override
+        public void onStop(CastBean bean) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onStop(bean);
+            }
+        }
+
+        @Override
+        public void onSeekComplete(CastBean bean, int position) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onSeekComplete(bean, position);
+            }
+        }
+
+        @Override
+        public void onInfo(CastBean bean, final int what, final int extra) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onInfo(bean, what, extra);
+            }
+        }
+
+        @Override
+        public void onInfo(CastBean bean, int what, final String data) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onInfo(bean, what, data);
+            }
+        }
+
+        @Override
+        public void onError(CastBean bean, int what, int extra) {
+//            Logger.i(TAG, "onError what:" + what + " extra:" + extra);
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onError(bean, what, extra);
+            }
+        }
+
+        @Override
+        public void onVolumeChanged(CastBean bean, float percent) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onVolumeChanged(bean, percent);
+            }
+        }
+
+        @Override
+        public void onPositionUpdate(CastBean bean, long duration, long position) {
+            for (INewPlayerListener listener : mListenerList2) {
+                listener.onPositionUpdate(bean, duration, position);
+            }
+        }
+    };
+
+
+    public INewPlayerListener getPlayerListener() {
+        return mPlayerListener;
+    }
+
+    public void addPlayerListener(INewPlayerListener listener) {
+        mListenerList2.add(listener);
+    }
+
+    public void removeListener(INewPlayerListener listener) {
+        mListenerList2.remove(listener);
+    }
+
+}

+ 197 - 0
app/src/main/java/com/xunao/effectdemo/dlan/DLNAControlCenter.java

@@ -0,0 +1,197 @@
+package com.xunao.effectdemo.dlan;
+
+import android.os.Handler;
+import android.text.TextUtils;
+
+import com.xunao.effectdemo.App;
+import com.hpplay.sdk.source.api.LelinkPlayerInfo;
+import com.hpplay.sdk.source.api.LelinkSourceSDK;
+import com.hpplay.sdk.source.bean.BrowserConfigBean;
+import com.hpplay.sdk.source.bean.MediaAssetBean;
+import com.hpplay.sdk.source.browse.api.LelinkServiceInfo;
+
+import java.util.concurrent.ExecutorService;
+
+/**
+ * author : 程中强
+ * e-mail : 740479946@qq.com
+ * date : 2022/9/1916:56
+ * desc :
+ * version: 1.0
+ */
+public class DLNAControlCenter {
+
+	private volatile static DLNAControlCenter dlnaCenter;
+	private ExecutorService executorService;
+	private long startMiracastTime;
+	private Handler handler;
+	private boolean isDlnaMode = false;
+	//dlna投屏相关
+	private final static int PUSH_SEEK = 3; // 投屏seek
+	private final static int PUSH_STATE_LISTENING = 4;//投屏状态监听
+	private final static int PUSH_STATE_BACK = 5;//投屏状态返回
+	private final static int PUSH_PLAY = 6; // 投屏开始
+
+	public static DLNAControlCenter getInstance() {
+		if (null == dlnaCenter) {
+			synchronized (DLNAControlCenter.class) {
+				if (dlnaCenter == null) {
+					dlnaCenter = new DLNAControlCenter();
+				}
+			}
+		}
+		return dlnaCenter;
+	}
+
+
+	private DLNAControlCenter() {
+//        executorService = Executors.newCachedThreadPool();
+		DeviceManager connectManager = DeviceManager.getInstance();
+		//sdk初始化
+		LelinkSourceSDK.getInstance()
+				.setBindSdkListener(connectManager.getBindListener())
+				.setBrowseResultListener(connectManager.getBrowseListener())
+				.setConnectListener(connectManager.getConnectListener())
+				.setPlayListener(CastManager.getInstance().getLelinkPlayerListener())
+				//FIXME WARN: 这里替换为您申请的AppID & AppSecret,build.gradle替换为您的应用包名
+//                .setSdkInitInfo(AppVarManager.getInstance().getBaseContext(), "17894", "69ce8955094258d339c1b6eadef2ec09")
+				.setSdkInitInfo(App.getInstance(), "17894", "69ce8955094258d339c1b6eadef2ec09")
+				.bindSdk();
+	}
+
+	public synchronized void startLelinkSearch() {
+		try {
+			BrowserConfigBean configBean = new BrowserConfigBean();
+			configBean.useLelink = true;
+			configBean.useDlna = true;
+			configBean.useBLE = true;
+			configBean.useSonic = true;
+			LelinkSourceSDK.getInstance().startBrowse(configBean);
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * dlna播放
+	 *
+	 * @param device
+	 * @param castUrl
+	 */
+	public synchronized void dlnaPlay(LelinkServiceInfo device, String castUrl, String titleName, double duration) {
+		if (device == null || TextUtils.isEmpty(castUrl)) {
+			return;
+		}
+		try {
+			LelinkSourceSDK.getInstance().stopPlay();
+			startMiracastTime = System.currentTimeMillis();
+			LelinkPlayerInfo lelinkPlayerInfo = new LelinkPlayerInfo();
+			lelinkPlayerInfo.setUrl(castUrl);
+			lelinkPlayerInfo.setType(LelinkSourceSDK.MEDIA_TYPE_VIDEO);
+			MediaAssetBean mediaAssetBean = new MediaAssetBean();
+			mediaAssetBean.setName(titleName);
+			// 非必要参数,部分dlna不返回视频总长度,实现下一集时若需要兼容这种dlna接收端,需设置媒资总长度,单位秒
+			mediaAssetBean.setDuration((long) duration);
+			lelinkPlayerInfo.setMediaAsset(mediaAssetBean);
+			lelinkPlayerInfo.setLelinkServiceInfo(device);
+			LelinkSourceSDK.getInstance().startPlayMedia(lelinkPlayerInfo);
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * 投屏跳转相应位置
+	 *
+	 * @param device
+	 */
+	public synchronized void dlnaSeekToPlayPosition(LelinkServiceInfo device, int progress) {
+		try {
+			LelinkSourceSDK.getInstance().seekTo(progress);
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * dlna暂停
+	 *
+	 * @param curTPDevice
+	 */
+	public synchronized void dlnaPause(LelinkServiceInfo curTPDevice) {
+		if (curTPDevice == null) return;
+		try {
+			LelinkSourceSDK.getInstance().pause();
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * dlna开始
+	 */
+	public synchronized void dlnaResume() {
+		try {
+			LelinkSourceSDK.getInstance().resume();
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * dlna投屏停止
+	 *
+	 * @param curTPDevice
+	 */
+	public synchronized void dlnaStop(LelinkServiceInfo curTPDevice, String titleId) {
+		try {
+
+			LelinkSourceSDK.getInstance().stopPlay();
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+//        dlnaCenter = null;
+	}
+
+	/**
+	 * dlna设置音量
+	 */
+	public synchronized void dlnaVolume(boolean isAddVolume) {
+		try {
+			if (isAddVolume) {
+				LelinkSourceSDK.getInstance().addVolume();
+			} else {
+				LelinkSourceSDK.getInstance().subVolume();
+			}
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+	}
+
+	/**
+	 * dlan上一次暂停位置上播放
+	 *
+	 * @param curTPDevice
+	 */
+	public synchronized void dlnaGoonPlayPosition(LelinkServiceInfo curTPDevice, int progress) {
+		if (curTPDevice == null) return;
+		try {
+			LelinkSourceSDK.getInstance().seekTo(progress);
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+
+
+	}
+
+	public void setUIListener(IUIUpdateListener mUIListener) {
+		DeviceManager.getInstance().setUIListener(mUIListener);
+	}
+
+}

+ 172 - 0
app/src/main/java/com/xunao/effectdemo/dlan/DeviceManager.java

@@ -0,0 +1,172 @@
+package com.xunao.effectdemo.dlan;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.hpplay.sdk.source.api.IBindSdkListener;
+import com.hpplay.sdk.source.api.IConnectListener;
+import com.hpplay.sdk.source.api.IRelevantInfoListener;
+import com.hpplay.sdk.source.api.LelinkSourceSDK;
+import com.hpplay.sdk.source.browse.api.IBrowseListener;
+import com.hpplay.sdk.source.browse.api.LelinkServiceInfo;
+
+import java.util.List;
+
+/**
+ * 连接
+ */
+public class DeviceManager {
+    private final static String TAG = "DemoDeviceManager";
+
+    private static DeviceManager sInstance = null;
+    private LelinkServiceInfo mSelectInfo;
+    private IUIUpdateListener mUIListener;
+
+    private IBindSdkListener mBindSdkListener = new IBindSdkListener() {
+        @Override
+        public void onBindCallback(boolean success) {
+            Log.i(TAG, "onBindCallback " + success);
+            setPassThroughListener();
+            if (success) {
+                Log.e("LeBo","初始化:"+success);
+                if (mUIListener != null) {
+                    mUIListener.onBindSuccess();
+                }
+
+            }
+        }
+    };
+
+    private IBrowseListener mBrowseListener = new IBrowseListener() {
+
+        @Override
+        public void onBrowse(int i, List<LelinkServiceInfo> list) {
+            if (i == IBrowseListener.BROWSE_ERROR_AUTH) {
+                Log.e(TAG, "授权失败");
+                return;
+            }
+            if (i == IBrowseListener.BROWSE_STOP) {
+                Log.i(TAG, "搜索停止");
+            } else if (i == IBrowseListener.BROWSE_TIMEOUT) {
+                Log.i(TAG, "搜索超时");
+            }
+            if (mUIListener != null) {
+                mUIListener.onUpdateDevices(list);
+            }
+        }
+    };
+
+    private IConnectListener mConnectListener = new IConnectListener() {
+        @Override
+        public void onConnect(LelinkServiceInfo lelinkServiceInfo, int protocol) {
+            Log.i(TAG, "onConnect:" + lelinkServiceInfo.getName());
+            String type = protocol == IConnectListener.TYPE_LELINK ? "Lelink"
+                    : protocol == IConnectListener.TYPE_DLNA ? "DLNA"
+                    : protocol == IConnectListener.TYPE_IM ? "IM" : ("协议:" + protocol);
+            setSelectInfo(lelinkServiceInfo);
+            if (mUIListener != null) {
+                mUIListener.onConnect(lelinkServiceInfo);
+            }
+        }
+
+        @Override
+        public void onDisconnect(LelinkServiceInfo lelinkServiceInfo, int what, int extra) {
+            if (lelinkServiceInfo == null) {
+                return;
+            }
+            Log.i(TAG, "onDisconnect:" + lelinkServiceInfo.getName() + " disConnectType:" + what + " extra:" + extra);
+            String text = null;
+            if (what == IConnectListener.WHAT_HARASS_WAITING) {// 防骚扰,等待用户确认
+                // 乐播投屏防骚扰等待消息,请开发者务必处理该消息
+                text = lelinkServiceInfo.getName() + "等待用户确认";
+            } else if (what == IConnectListener.WHAT_DISCONNECT) {
+                switch (extra) {
+                    case IConnectListener.EXTRA_HARASS_REJECT:// 防骚扰,用户拒绝投屏
+                        text = lelinkServiceInfo.getName() + "连接被拒绝";
+                        break;
+                    case IConnectListener.EXTRA_HARASS_TIMEOUT:// 防骚扰,用户响应超时
+                        text = lelinkServiceInfo.getName() + "防骚扰响应超时";
+                        break;
+                    case IConnectListener.EXTRA_HARASS_BLACKLIST:// 防骚扰,该用户被加入黑名单
+                        text = lelinkServiceInfo.getName() + "已被加入投屏黑名单";
+                        break;
+                    case IConnectListener.EXTRA_CONNECT_DEVICE_OFFLINE:
+                        text = lelinkServiceInfo.getName() + "不在线";
+                        break;
+                    default:
+                        text = lelinkServiceInfo.getName() + "连接断开";
+                        break;
+                }
+            } else if (what == IConnectListener.WHAT_CONNECT_FAILED) {
+                switch (extra) {
+                    case IConnectListener.EXTRA_CONNECT_DEVICE_OFFLINE:
+                        text = lelinkServiceInfo.getName() + "不在线";
+                        break;
+                    default:
+                        text = lelinkServiceInfo.getName() + "连接失败";
+                        break;
+                }
+            }
+            if (TextUtils.isEmpty(text)) {
+                text = "onDisconnect " + what + "/" + extra;
+            }
+        }
+    };
+
+    public static synchronized DeviceManager getInstance() {
+        synchronized (DeviceManager.class) {
+            if (sInstance == null) {
+                sInstance = new DeviceManager();
+            }
+        }
+        return sInstance;
+    }
+
+    private DeviceManager() {
+
+    }
+
+    public void setUIListener(IUIUpdateListener listener) {
+        this.mUIListener = listener;
+    }
+
+    public void setSelectInfo(LelinkServiceInfo serviceInfo) {
+        mSelectInfo = serviceInfo;
+    }
+
+
+
+    public LelinkServiceInfo getSelectInfo() {
+        return mSelectInfo;
+    }
+
+    public IBindSdkListener getBindListener() {
+        return mBindSdkListener;
+    }
+
+    public IBrowseListener getBrowseListener() {
+        return mBrowseListener;
+    }
+
+    public IConnectListener getConnectListener() {
+        return mConnectListener;
+    }
+
+    /**
+     * 设置透传监听
+     */
+    private void setPassThroughListener() {
+        LelinkSourceSDK.getInstance().setPassThroughListener(new IRelevantInfoListener() {
+            @Override
+            public void onSendRelevantInfoResult(int option, String result) {
+
+            }
+
+            @Override
+            public void onReverseInfoResult(int option, final String result) {
+                Log.i(TAG, "onReverseInfoResult option = " + option + ", result = " + result);
+            }
+        });
+    }
+
+}

+ 19 - 0
app/src/main/java/com/xunao/effectdemo/dlan/IUIUpdateListener.java

@@ -0,0 +1,19 @@
+package com.xunao.effectdemo.dlan;
+
+import com.hpplay.sdk.source.browse.api.LelinkServiceInfo;
+
+import java.util.List;
+
+public interface IUIUpdateListener {
+
+    void onUpdateDevices(List<LelinkServiceInfo> list);
+
+    void onConnect(LelinkServiceInfo info);
+
+    void onDisconnect(LelinkServiceInfo info);
+
+    void onNetChanged();
+
+    void onBindSuccess();
+
+}

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/dragview/DragViewUtil.java

@@ -1,11 +1,9 @@
 package com.xunao.effectdemo.dragview;
 
-import android.content.ClipData;
 import android.util.Log;
 import android.view.DragEvent;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewGroup;
 
 /**
  * author : 程中强

+ 0 - 9
app/src/main/java/com/xunao/effectdemo/umeng/UmInitConfig.java

@@ -1,21 +1,12 @@
 package com.xunao.effectdemo.umeng;
 
-import android.app.Notification;
-import android.app.NotificationChannel;
 import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
 import android.os.Handler;
-import android.util.Log;
-import android.widget.RemoteViews;
-import android.widget.Toast;
 
 import com.umeng.analytics.MobclickAgent;
 import com.umeng.commonsdk.UMConfigure;
 import com.xunao.effectdemo.App;
 
-import static android.os.Looper.getMainLooper;
-
 
 public class UmInitConfig {
 

+ 0 - 4
app/src/main/java/com/xunao/effectdemo/utils/FocusUtils.java

@@ -1,14 +1,10 @@
 package com.xunao.effectdemo.utils;
 
-import android.animation.Animator;
 import android.animation.AnimatorSet;
 import android.animation.ValueAnimator;
 import android.util.Log;
 import android.view.View;
-import android.view.ViewAnimationUtils;
-import android.view.ViewGroup;
 import android.view.ViewParent;
-import android.widget.ViewAnimator;
 
 /**
  * author : 程中强

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/utils/MediaRecorderDemo.java

@@ -1,8 +1,6 @@
 package com.xunao.effectdemo.utils;
 
 import android.media.MediaRecorder;
-import android.os.Handler;
-import android.util.Log;
 
 import java.io.File;
 import java.io.IOException;

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/view/Calculator.java

@@ -3,7 +3,6 @@ package com.xunao.effectdemo.view;
 import android.app.Activity;
 import android.os.Build;
 import android.util.DisplayMetrics;
-import android.util.Log;
 import android.view.View;
 import com.xuexiang.xui.widget.guidview.FocusShape;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/view/FireworkView.java

@@ -2,7 +2,6 @@ package com.xunao.effectdemo.view;
 
 import android.animation.ValueAnimator;
 import android.content.Context;
-import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.util.AttributeSet;
@@ -10,7 +9,6 @@ import android.util.Log;
 import android.util.TypedValue;
 import android.view.View;
 import android.view.animation.DecelerateInterpolator;
-import android.view.animation.LinearInterpolator;
 
 import androidx.annotation.Nullable;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/view/GuideImageView.java

@@ -19,7 +19,6 @@ import android.graphics.RectF;
 import android.os.Build;
 import androidx.appcompat.widget.AppCompatImageView;
 import android.util.AttributeSet;
-import android.util.Log;
 
 import com.xuexiang.xui.widget.guidview.FocusShape;
 

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/view/MaskFilterView.java

@@ -6,7 +6,6 @@ import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.View;
 

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/view/MyGuideCaseQueue.java

@@ -1,8 +1,6 @@
 package com.xunao.effectdemo.view;
 
 import com.xuexiang.xui.widget.guidview.DismissListener;
-import com.xuexiang.xui.widget.guidview.GuideCaseQueue;
-import com.xuexiang.xui.widget.guidview.GuideCaseView;
 import com.xuexiang.xui.widget.guidview.OnCompleteListener;
 
 import java.util.LinkedList;

+ 0 - 3
app/src/main/java/com/xunao/effectdemo/view/MyGuideCaseView.java

@@ -1,7 +1,6 @@
 package com.xunao.effectdemo.view;
 
 import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
 import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.Context;
@@ -10,7 +9,6 @@ import android.os.Build;
 import android.text.Spanned;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
-import android.util.Log;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
@@ -39,7 +37,6 @@ import com.xuexiang.xui.widget.guidview.FocusShape;
 import com.xuexiang.xui.widget.guidview.OnViewInflateListener;
 //import com.xuexiang.xui.widget.guidview.Utils;
 import com.xunao.effectdemo.R;
-import com.xunao.effectdemo.activity.AnimActivity;
 
 /**
  * author : 程中强

+ 0 - 2
app/src/main/java/com/xunao/effectdemo/view/MyLikeView.java

@@ -2,7 +2,6 @@ package com.xunao.effectdemo.view;
 
 import android.animation.ValueAnimator;
 import android.content.Context;
-import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
@@ -14,7 +13,6 @@ import android.view.View;
 import android.view.animation.LinearInterpolator;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.core.content.ContextCompat;
 
 /**
  * author : 程中强

+ 434 - 2
app/src/main/java/com/xunao/effectdemo/view/VideoPreviewPlay.java

@@ -1,17 +1,43 @@
 package com.xunao.effectdemo.view;
 
 import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.RelativeLayout;
 import android.widget.SeekBar;
+import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.annotation.NonNull;
+
+import com.xunao.effectdemo.adapter.DeviceAdapter;
+import com.xunao.effectdemo.dlan.DLNAControlCenter;
+import com.xunao.effectdemo.dlan.IUIUpdateListener;
+import com.hpplay.sdk.source.api.INewPlayerListener;
+import com.hpplay.sdk.source.api.LelinkSourceSDK;
+import com.hpplay.sdk.source.bean.CastBean;
+import com.hpplay.sdk.source.browse.api.LelinkServiceInfo;
+import com.hpplay.sdk.source.easycast.IEasyCastListener;
+import com.hpplay.sdk.source.easycast.bean.EasyCastBean;
+import com.shuyu.gsyvideoplayer.utils.CommonUtil;
 import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
 import com.xunao.effectdemo.R;
 import com.xunao.effectdemo.utils.SoundPoolUtil;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * author : 程中强
  * e-mail : 740479946@qq.com
@@ -24,6 +50,22 @@ public class VideoPreviewPlay extends StandardGSYVideoPlayer {
 	private boolean isFinish = false;
 	private SoundPoolUtil soundPoolUtil;
 
+	private ViewGroup mBrowseContainer;//投屏搜索列表
+	private Button btn_cast;//投屏按钮
+	private RelativeLayout rl_dlan_control;//投屏控制层
+	private ImageView dlan_start;//投屏的播放暂停
+	private TextView dlan_current,dlan_total;//投屏的时长
+	private SeekBar dlan_progress;//投屏进度条
+	private boolean isDlanPlay = false;
+	public List<LelinkServiceInfo> mDevices = new ArrayList<>();
+	public LelinkServiceInfo curTPDevice;
+
+	private DeviceAdapter mDeviceAdapter;
+	private ListView rvList;
+	private IUIUpdateListener mUIListener;
+	private INewPlayerListener mPushListener;
+	private IEasyCastListener mCastListener;
+
 	public void setIsFinish(boolean isFinish){
 		this.isFinish = isFinish;
 	}
@@ -41,14 +83,101 @@ public class VideoPreviewPlay extends StandardGSYVideoPlayer {
 
 	@Override
 	public int getLayoutId() {
-		return super.getLayoutId();
+		return R.layout.activity_my_video;
 	}
 
+	public void stopDlan(){
+		LelinkSourceSDK.getInstance().stopPlay();
+	}
+
+	private Handler handler = new Handler(){
+		@Override
+		public void handleMessage(@NonNull Message msg) {
+			super.handleMessage(msg);
+			switch (msg.what){
+				case 1001:
+					Log.e("MyTag","结果收到消息");
+//					if (mDeviceAdapter != null) {
+						mDeviceAdapter.notifyDataSetChanged();
+					rvList.setAdapter(mDeviceAdapter);
+//					}
+					break;
+			}
+		}
+	};
+
 	@Override
 	protected void init(Context context) {
 		super.init(context);
+
 		soundPoolUtil= SoundPoolUtil.getInstance(context);
-		mProgressBar = (SeekBar) findViewById(R.id.progress);
+		mProgressBar = findViewById(R.id.progress);
+		dlan_progress = findViewById(R.id.dlan_progress);
+		mBrowseContainer = findViewById(R.id.mBrowseContainer);
+		btn_cast = findViewById(R.id.btn_cast);
+		rl_dlan_control = findViewById(R.id.rl_dlan_control);
+		dlan_start = findViewById(R.id.dlan_start);
+		dlan_current = findViewById(R.id.dlan_current);
+		dlan_total = findViewById(R.id.dlan_total);
+
+		rvList = findViewById(R.id.rv_device);
+//		rvList.setLayoutManager(new LinearLayoutManager(context));
+		mDevices = new ArrayList<>();
+//		mDevices.clear();
+		mDeviceAdapter = new DeviceAdapter(context, mDevices);
+		rvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+			@Override
+			public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+				curTPDevice = mDevices.get(i);
+
+				DLNAControlCenter.getInstance().dlnaPlay(curTPDevice, mOriginUrl, "",0);
+
+//			new Handler().postDelayed(new Runnable() {
+//				@Override
+//				public void run() {
+//					DLNAControlCenter.getInstance().dlnaSeekToPlayPosition(curTPDevice, (int) (ijkVrVideoView.getCurrentPosition() / 1000.0f));
+//				}
+//			}, 3000);
+			}
+		});
+
+		dlan_start.setOnClickListener(v->{
+
+			if (isDlanPlay) {
+				dlan_start.setImageResource(R.drawable.video_play_normal);
+				LelinkSourceSDK.getInstance().pause();
+			} else {
+				dlan_start.setImageResource(R.drawable.video_pause_normal);
+				LelinkSourceSDK.getInstance().resume();
+			}
+		});
+
+		btn_cast.setOnClickListener(v->{
+			LelinkSourceSDK.getInstance().setEasyCastListener(mCastListener);
+			LelinkSourceSDK.getInstance().easyPush(mBrowseContainer);
+//			LelinkSourceSDK.getInstance().setNewPlayListener(mPushListener);
+//			mDevices.clear();
+			onVideoPause();
+			mBrowseContainer.setVisibility(VISIBLE);
+//			DLNAControlCenter.getInstance().startLelinkSearch();
+		});
+		dlan_progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+			@Override
+			public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
+
+			}
+
+			@Override
+			public void onStartTrackingTouch(SeekBar seekBar) {
+
+			}
+
+			@Override
+			public void onStopTrackingTouch(SeekBar seekBar) {
+				Log.e("MyTag","拖动:"+seekBar.getProgress()*getDuration()/100/1000);
+				LelinkSourceSDK.getInstance().seekTo(seekBar.getProgress()*getDuration()/100/1000);
+			}
+		});
 
 
 		mProgressBar.setOnTouchListener(new OnTouchListener() {
@@ -64,5 +193,308 @@ public class VideoPreviewPlay extends StandardGSYVideoPlayer {
 				return false;
 			}
 		});
+
+
+
+
+		initCast();
+	}
+
+	void initCast(){
+		mUIListener = new IUIUpdateListener() {
+			@Override
+			public void onUpdateDevices(List<LelinkServiceInfo> list) {
+				for (LelinkServiceInfo lelinkServiceInfo : list) {
+					if (mDevices.contains(lelinkServiceInfo)) {
+						continue;
+					} else {
+						mDevices.add(lelinkServiceInfo);
+
+						handler.sendEmptyMessage(1001);
+					}
+				}
+			}
+
+			@Override
+			public void onConnect(LelinkServiceInfo info) {
+//			lelinkCastSuccess(true);
+			}
+
+
+			@Override
+			public void onDisconnect(LelinkServiceInfo info) {
+//			DLNAControlCenter.getInstance().uploadCastDataToPlatform(false, curTPDevice, titleId);
+			}
+
+			@Override
+			public void onNetChanged() {
+			}
+
+			@Override
+			public void onBindSuccess() {
+			}
+		};
+
+		mPushListener = new INewPlayerListener() {
+
+			/**
+			 * @param bean 投屏信息
+			 *  内容开始加载
+			 */
+			@Override
+			public void onLoading(CastBean bean) {
+				btn_cast.setVisibility(GONE);
+				rl_dlan_control.setVisibility(VISIBLE);
+				isDlanPlay = true;
+				dlan_total.setText(mTotalTimeTextView.getText());
+			}
+
+			/**
+			 * @param bean 投屏信息
+			 *  开始播放
+			 */
+			@Override
+			public void onStart(CastBean bean) {
+				dlan_start.setImageResource(R.drawable.video_pause_normal);
+				isDlanPlay = true;
+			}
+			/**
+			 * @param bean 投屏信息
+			 *  播放暂停
+			 */
+			@Override
+			public void onPause(CastBean bean) {
+				dlan_start.setImageResource(R.drawable.video_play_normal);
+				isDlanPlay = false;
+			}
+			/**
+			 * 播放完成
+			 * @param bean 投屏信息
+			 * @param type 播放类型
+			 */
+			@Override
+			public void onCompletion(CastBean bean, int type) {
+				btn_cast.setVisibility(VISIBLE);
+				rl_dlan_control.setVisibility(GONE);
+				isDlanPlay = false;
+				onVideoResume();
+//			LelinkSourceSDK.getInstance().disconnect(lelinkServiceInfo);
+			}
+
+			/**
+			 * @param bean 投屏信息
+			 *  播放停止 (主动停止或者电视端停止均会回调)
+			 */
+			@Override
+			public void onStop(CastBean bean) {
+				isDlanPlay = false;
+				btn_cast.setVisibility(VISIBLE);
+				rl_dlan_control.setVisibility(GONE);
+				onVideoResume();
+			}
+			/**
+			 * 该接口暂未有数据回调
+			 */
+			@Override
+			public void onSeekComplete(CastBean bean, int position) {
+
+			}
+
+			/**
+			 * info信息回调,播放信息和收端能力查询等回调接口
+			 */
+			@Override
+			public void onInfo(CastBean bean, int what, int extra) {
+			}
+
+			/**
+			 * (重载接口)
+			 */
+			@Override
+			public void onInfo(CastBean bean, int what, String data) {
+
+			}
+
+			/**
+			 * @param bean 投屏信息
+			 * @param what 错误类型
+			 * @param extra 额外错误码
+			 */
+			@Override
+			public void onError(CastBean bean, int what, int extra) {
+				String text = "未知异常";
+				switch (extra) {
+					case EXTRA_ERROR_AUTH:
+					case EXTRA_ERROR_AUTH_TIME_DONE:
+						text = "SDK认证失败";
+						break;
+					case EXTRA_NEED_SCREEN_CODE:
+						text = "请输入密码";
+//					getActivity().runOnUiThread(new Runnable() {
+//						@Override
+//						public void run() {
+//							showPWDDialog();
+//						}
+//					});
+						break;
+					case EXTRA_DEVICE_OFFLINE:
+						text = "接收端不在线";
+						break;
+					case EXTRA_ERROR_PUSH_IO:
+						text = "网络通讯异常";
+						break;
+				}
+				if (TextUtils.isEmpty(text)) {
+					text = "推送 onError " + what + "/" + extra;
+				}
+			}
+
+			/**
+			 *
+			 * 该接口暂未有数据回调
+			 */
+			@Override
+			public void onVolumeChanged(CastBean bean, float percent) {
+
+			}
+
+			/**
+			 * 进度更新回调
+			 * @param bean 投屏信息
+			 * @param duration 最大进度 (单位秒)
+			 * @param position 当前进度 (单位秒)
+			 */
+			@Override
+			public void onPositionUpdate(CastBean bean, long duration, long position) {
+				if(duration!=0)
+					dlan_progress.setProgress((int) (position*100/duration));
+				dlan_current.setText(CommonUtil.stringForTime((int) position*1000));
+			}
+		};
+
+//		DLNAControlCenter.getInstance().setUIListener(mUIListener);
+//		CastManager.getInstance().addPlayerListener(mPushListener);
+
+		mCastListener = new IEasyCastListener() {
+
+			/**
+			 * 如果没有触发此回调,则表示此次未搜索到设备或用户未投屏
+			 * @param lelinkServiceInfo
+			 * @return
+			 */
+			@Override
+			public EasyCastBean onCast(LelinkServiceInfo lelinkServiceInfo) {
+				EasyCastBean bean = new EasyCastBean();
+				bean.url = mOriginUrl; //实际需要投屏的url
+				return bean;
+			}
+
+			/**
+			 * 如果投屏失败,在搜索页面关闭的时候,会触发回调
+			 * @param lelinkServiceInfo
+			 * @param easyCastBean
+			 * @param what
+			 * @param extra
+			 */
+			@Override
+			public void onCastError(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean, int what, int extra) {
+				Log.e("MyTag","推送失败"+what+"   "+extra);
+				btn_cast.setVisibility(VISIBLE);
+				mBrowseContainer.setVisibility(GONE);
+				rl_dlan_control.setVisibility(GONE);
+				isDlanPlay = false;
+				onVideoResume();
+			}
+
+			/**
+			 * 推送成功
+			 * @param lelinkServiceInfo
+			 * @param easyCastBean
+			 */
+			@Override
+			public void onCastLoading(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean) {
+				Log.e("MyTag","推送成功");
+				btn_cast.setVisibility(GONE);
+				mBrowseContainer.setVisibility(GONE);
+				rl_dlan_control.setVisibility(VISIBLE);
+				isDlanPlay = true;
+				dlan_total.setText(mTotalTimeTextView.getText());
+			}
+
+			/**
+			 * 暂停
+			 * @param lelinkServiceInfo
+			 * @param easyCastBean
+			 */
+			@Override
+			public void onCastPause(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean) {
+				dlan_start.setImageResource(R.drawable.video_play_normal);
+				isDlanPlay = false;
+			}
+
+			/**
+			 * 起播 或 收端暂停之后恢复播放
+			 * @param lelinkServiceInfo
+			 * @param easyCastBean
+			 */
+			@Override
+			public void onCastStart(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean) {
+				dlan_start.setImageResource(R.drawable.video_pause_normal);
+				isDlanPlay = true;
+			}
+
+			@Override
+			public void onCastPositionUpdate(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean, long duration, long position) {
+				Log.e("MyTag","当前:"+position);
+				if(duration!=0)dlan_progress.setProgress((int) (position*100/duration));
+				dlan_current.setText(CommonUtil.stringForTime((int) position*1000));
+			}
+
+			/**
+			 * 收端播放结束,如果需要实现下一集,可在之后的onCast回调中提供播放信息
+			 * @param lelinkServiceInfo
+			 * @param easyCastBean
+			 */
+			@Override
+			public void onCastCompletion(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean) {
+				btn_cast.setVisibility(VISIBLE);
+				rl_dlan_control.setVisibility(GONE);
+				mBrowseContainer.setVisibility(GONE);
+				isDlanPlay = false;
+				onVideoResume();
+//				LelinkSourceSDK.getInstance().disconnect(lelinkServiceInfo);
+			}
+
+			/**
+			 * 搜索退出播放,不同于 onCastCompletion,此时需要恢复APP视频播放
+			 * @param lelinkServiceInfo
+			 * @param easyCastBean
+			 */
+			@Override
+			public void onCastStop(LelinkServiceInfo lelinkServiceInfo, EasyCastBean easyCastBean) {
+				isDlanPlay = false;
+				btn_cast.setVisibility(VISIBLE);
+				rl_dlan_control.setVisibility(GONE);
+				mBrowseContainer.setVisibility(GONE);
+				onVideoResume();
+//				LelinkSourceSDK.getInstance().disconnect(lelinkServiceInfo);
+			}
+
+			@Override
+			public void onDismiss() {
+				btn_cast.setVisibility(VISIBLE);
+				rl_dlan_control.setVisibility(GONE);
+				mBrowseContainer.setVisibility(GONE);
+				isDlanPlay = false;
+				onVideoResume();
+//			LelinkSourceSDK.getInstance().stopPlay();
+			}
+		};
 	}
+
+
+
+
+
+
 }

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/view/circleprogress/DialProgress.java

@@ -2,7 +2,6 @@ package com.xunao.effectdemo.view.circleprogress;
 
 import android.animation.ValueAnimator;
 import android.content.Context;
-import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Color;

+ 1 - 0
app/src/main/res/layout/activity_gsxy_video.xml

@@ -16,4 +16,5 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
+
 </RelativeLayout>

+ 269 - 0
app/src/main/res/layout/activity_my_video.xml

@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/black">
+    <RelativeLayout
+        android:id="@+id/surface_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center">
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/thumb"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_alignParentStart="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
+        android:background="#000000"
+        android:scaleType="fitCenter" />
+
+    <LinearLayout
+        android:id="@+id/layout_bottom"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:layout_alignParentBottom="true"
+        android:background="#99000000"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:visibility="invisible">
+
+        <TextView
+            android:id="@+id/current"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="16dp"
+            android:text="00:00"
+            android:textColor="#ffffff" />
+
+        <SeekBar
+            android:id="@+id/progress"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_weight="1.0"
+            android:background="@null"
+            android:max="100"
+            android:maxHeight="4dp"
+            android:minHeight="4dp"
+            android:paddingTop="8dp"
+            android:paddingBottom="8dp"
+            android:progressDrawable="@drawable/video_seek_progress"
+            android:thumb="@drawable/video_seek_thumb" />
+
+        <TextView
+            android:id="@+id/total"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="16dp"
+            android:text="00:00"
+            android:textColor="#ffffff" />
+
+        <ImageView
+            android:id="@+id/fullscreen"
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:paddingRight="16dp"
+            android:scaleType="center"
+            android:src="@drawable/video_enlarge" />
+    </LinearLayout>
+
+    <ProgressBar
+        android:id="@+id/bottom_progressbar"
+        style="?android:attr/progressBarStyleHorizontal"
+        android:layout_width="match_parent"
+        android:layout_height="1.5dp"
+        android:layout_alignParentBottom="true"
+        android:max="100"
+        android:progressDrawable="@drawable/video_progress" />
+
+    <ImageView
+        android:id="@+id/back_tiny"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_marginLeft="6dp"
+        android:layout_marginTop="6dp"
+        android:visibility="gone" />
+
+
+    <ProgressBar
+        android:id="@+id/loading"
+        style="?android:attr/progressBarStyleLarge"
+        android:layout_width="28dp"
+        android:layout_height="28dp"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        android:visibility="invisible" />
+
+
+    <ImageView
+        android:id="@+id/start"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_centerInParent="true"
+        android:layout_gravity="center_vertical"
+        android:src="@drawable/video_click_play_selector" />
+
+
+    <ImageView
+        android:id="@+id/small_close"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:paddingLeft="10dp"
+        android:paddingTop="10dp"
+        android:scaleType="centerInside"
+        android:src="@drawable/video_small_close"
+        android:visibility="gone" />
+
+    <ImageView
+        android:id="@+id/lock_screen"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="50dp"
+        android:scaleType="centerInside"
+        android:src="@drawable/unlock"
+        android:visibility="gone" />
+
+    <LinearLayout
+        android:id="@+id/layout_top"
+        android:layout_width="match_parent"
+        android:layout_height="48dp"
+        android:layout_alignParentTop="true"
+        android:layout_toEndOf="@+id/back_tiny"
+        android:layout_toRightOf="@+id/back_tiny"
+        android:background="@drawable/video_title_bg"
+        android:gravity="center_vertical">
+
+        <ImageView
+            android:id="@+id/back"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:paddingLeft="10dp"
+            android:scaleType="centerInside"
+            android:src="@drawable/video_back" />
+
+        <TextView
+            android:id="@+id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingLeft="10dp"
+            android:textColor="@android:color/white"
+            android:textSize="18sp" />
+    </LinearLayout>
+
+
+
+    <RelativeLayout
+        android:id="@+id/preview_layout"
+        android:layout_width="@dimen/seek_bar_image"
+        android:layout_height="100dp"
+        android:layout_above="@+id/layout_bottom"
+        android:layout_alignParentBottom="true"
+        android:layout_marginBottom="30dp"
+        android:visibility="gone">
+
+        <ImageView
+            android:id="@+id/preview_image"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="#000000" />
+    </RelativeLayout>
+
+
+    <Button
+        android:id="@+id/btn_cast"
+        android:text="投屏"
+        android:visibility="visible"
+        android:layout_marginRight="100dp"
+        android:layout_alignParentRight="true"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <RelativeLayout
+        android:id="@+id/mBrowseContainer"
+        android:visibility="gone"
+        android:background="#000000"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <ListView
+            android:id="@+id/rv_device"
+            android:visibility="gone"
+            android:background="#FFF"
+            android:layout_marginTop="100dp"
+            android:layout_centerHorizontal="true"
+            android:layout_width="300dp"
+            android:layout_height="match_parent"/>
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/rl_dlan_control"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@android:color/black"
+        android:visibility="gone">
+
+        <ImageView
+            android:id="@+id/dlan_start"
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_centerInParent="true"
+            android:layout_gravity="center_vertical"
+            android:src="@drawable/video_pause_normal" />
+
+        <LinearLayout
+            android:id="@+id/dlan_layout_bottom"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_alignParentBottom="true"
+            android:background="#99000000"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:visibility="visible">
+
+            <TextView
+                android:id="@+id/dlan_current"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="16dp"
+                android:text="00:00"
+                android:textColor="#ffffff" />
+
+            <SeekBar
+                android:id="@+id/dlan_progress"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_weight="1.0"
+                android:background="@null"
+                android:max="100"
+                android:maxHeight="4dp"
+                android:minHeight="4dp"
+                android:paddingTop="8dp"
+                android:paddingBottom="8dp"
+                android:progressDrawable="@drawable/video_seek_progress"
+                android:thumb="@drawable/video_seek_thumb" />
+
+            <TextView
+                android:id="@+id/dlan_total"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="16dp"
+                android:text="00:00"
+                android:textColor="#ffffff" />
+
+        </LinearLayout>
+
+    </RelativeLayout>
+
+</RelativeLayout>

+ 1 - 2
app/src/main/res/layout/fragment_first.xml

@@ -3,8 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".FirstFragment">
+    android:layout_height="match_parent">
 
     <TextView
         android:id="@+id/textview_first"

+ 1 - 2
app/src/main/res/layout/fragment_second.xml

@@ -3,8 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".SecondFragment">
+    android:layout_height="match_parent">
 
     <TextView
         android:id="@+id/textview_second"

+ 14 - 0
app/src/main/res/layout/item_device.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <TextView
+        android:id="@+id/tv_name_item"
+        android:text="sheb"
+        android:layout_centerInParent="true"
+        android:textSize="20sp"
+        android:gravity="center"
+        android:layout_width="200dp"
+        android:padding="30dp"
+        android:layout_height="wrap_content"/>
+</RelativeLayout>