BuWanVideo/AndroidManifest.xml
@@ -117,6 +117,15 @@ android:screenOrientation="portrait" android:theme="@style/AppTabTheme2" android:windowSoftInputMode="stateHidden"></activity> <activity android:name="com.weikou.beibeivideo.ui.media.VideoDetailActivity2" android:configChanges="orientation|screenSize|keyboardHidden" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@style/AppTabTheme2" android:windowSoftInputMode="stateHidden"></activity> <activity android:name="com.weikou.beibeivideo.ui.discover.StarsActivity" android:label="@string/app_name" @@ -206,6 +215,12 @@ android:label="@string/app_name" android:windowSoftInputMode="adjustResize" /> <!--百度内容联盟 --> <activity android:name="com.baidu.mobads.AppActivity" android:configChanges="keyboard|keyboardHidden|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <service android:name="com.ysh.wpc.appupdate.service.DownLoadFileService"></service> <service android:name="com.weikou.wpc.superad.service.DownLoadFileService"></service> <service android:name="com.weikou.beibeivideo.service.DownLoadFileService" /> @@ -218,7 +233,7 @@ <meta-data android:name="android.max_aspect" android:value="2.3" /> android:value="2.1" /> <!-- umeng相关Start --> <!--<activity--> @@ -237,7 +252,7 @@ android:value="570f28a578d6e12cba6f7f200b8d1c83"></meta-data> <meta-data android:name="UMENG_CHANNEL" android:value="vivo"></meta-data> android:value="qq"></meta-data> <provider @@ -256,6 +271,17 @@ android:name="com.mozillaonline.providers.downloads.DownloadProvider" android:authorities="com.ddysvideo.downloads" android:exported="false" /> <!--百度内容联盟 --> <provider android:name="com.baidu.mobads.openad.BdFileProvider" android:authorities="${packageName}.bd.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/bd_file_paths" /> </provider> <service android:name="com.mozillaonline.providers.downloads.DownloadService" /> @@ -389,7 +415,7 @@ <!-- 网盟广告 --> <provider android:name="com.bytedance.sdk.openadsdk.TTFileProvider" android:authorities="${applicationId}.TTFileProvider" android:authorities="com.yeshi.ddysvideo.TTFileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data @@ -440,6 +466,17 @@ android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize"/> <!--风行广告 --> <provider android:name="com.funshion.video.util.FSFileProvider" android:authorities="com.yeshi.ddysvideo.funadsdk.provider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/funshion_file_path" /> </provider> </application> </manifest> BuWanVideo/build.gradle
@@ -8,11 +8,20 @@ api files('libs/jg_filter_sdk_1.1.jar') api files('libs/wup-1.0.0.E-SNAPSHOT.jar') api files('libs/Xg_sdk_v2.46_20160602_1638.jar') api files('libs/FunshionAD-1.3.7.aar') api files('libs/FunshionBase-1.0.5.aar') api files('libs/FunshionPlaySDK-1.6.1.aar') //聚能赚 api files('libs/YmSdk20200820.aar') api project(':social_sdk_library_project') api project(':GuangDianTongSDK') api project(':MDownloadProvider') implementation 'com.android.support:recyclerview-v7:27.1.1' implementation project(path: ':library-Funshion') implementation project(path: ':library-BaiduCPU') //穿山甲广告 compile(name: 'open_ad_sdk', ext: 'aar') //阿里百川 @@ -30,7 +39,7 @@ //applink implementation 'com.alibaba.sdk.android:alibc_link_partner:4.1.15@aar' //ut implementation 'com.taobao.android:utdid4all:1.5.2' implementation 'com.alibaba.mtl:app-monitor-sdk:2.6.4.5_for_bc' // 电商基础组件 implementation 'com.alibaba.sdk.android:AlibcTradeCommon:4.0.0.15@aar' @@ -44,6 +53,7 @@ annotationProcessor 'com.github.jokermonn:permissions4m:2.1.2-processor' //微信SDK api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' } android { signingConfigs { @@ -71,8 +81,8 @@ } defaultConfig { applicationId "com.doudou.ysvideo" versionCode 95 versionName "3.7.7" versionCode 96 versionName "3.7.8" multiDexEnabled = true minSdkVersion 17 targetSdkVersion 27 BuWanVideo/libs/FunshionAD-1.3.7.aarBinary files differ
BuWanVideo/libs/FunshionBase-1.0.5.aarBinary files differ
BuWanVideo/libs/FunshionPlaySDK-1.6.1.aarBinary files differ
BuWanVideo/libs/YmSdk20200820.aarBinary files differ
BuWanVideo/libs/android-query-full.0.26.7.jarBinary files differ
BuWanVideo/res/layout/act_login.xml
@@ -23,320 +23,327 @@ android:src="@drawable/ic_login_bg"></ImageView> <FrameLayout <LinearLayout android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/top_bar_color"> android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/login_tv_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:drawableLeft="@drawable/ic_back_two" android:drawablePadding="3dp" android:gravity="center_vertical" android:padding="8dp" android:text="返回" android:textColor="@color/white" android:textSize="16sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingTop="6dp" android:paddingBottom="6dp" android:text="帐号登录" android:textColor="@color/white" android:textSize="20sp" /> </FrameLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:layout_height="48dp" android:background="@color/top_bar_color"> <TextView android:id="@+id/login_tv_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:drawableLeft="@drawable/ic_back_two" android:drawablePadding="3dp" android:gravity="center_vertical" android:padding="8dp" android:text="返回" android:textColor="@color/white" android:textSize="16sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingTop="6dp" android:paddingBottom="6dp" android:text="帐号登录" android:textColor="@color/white" android:textSize="20sp" /> </FrameLayout> <ScrollView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <LinearLayout android:id="@+id/ll_login_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginLeft="50dp" android:layout_marginTop="120dp" android:layout_marginRight="50dp" android:focusable="true" android:focusableInTouchMode="true" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/ll_login_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:background="@drawable/shape_login_input_bg" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingTop="12dp" android:paddingRight="20dp" android:paddingBottom="12dp"> <ImageView android:layout_width="wrap_content" android:layout_height="18dp" android:src="@drawable/icon_login_account"></ImageView> <EditText android:id="@+id/et_name" style="@style/loginInputStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="18dp" android:background="@null" android:digits="@string/rule_email" android:hint="请输入账户邮箱" android:inputType="textEmailAddress" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:background="@drawable/shape_login_input_bg" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingTop="12dp" android:paddingRight="20dp" android:paddingBottom="12dp"> <ImageView android:layout_width="wrap_content" android:layout_height="18dp" android:src="@drawable/icon_login_password"></ImageView> <EditText android:id="@+id/et_pwd" style="@style/loginInputStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="18dp" android:background="@null" android:digits="@string/rule_password" android:hint="请输入您的密码" android:inputType="textPassword" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_login" android:layout_width="match_parent" android:layout_height="44dp" android:background="@drawable/shape_login_btn" android:gravity="center" android:paddingLeft="14dp" android:paddingRight="14dp" android:text="登录" android:textColor="#F4DE4A" android:textSize="17sp" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="28dp"> <TextView android:id="@+id/tv_register" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="注册帐号" android:textColor="#FFE84D" android:textSize="11sp" /> <TextView android:id="@+id/tv_forget_pwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="忘记密码" android:textColor="#FFE84D" android:textSize="11sp" /> </FrameLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="50dp" android:layout_marginRight="50dp" android:orientation="vertical" android:paddingBottom="20dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingLeft="18dp" android:paddingRight="18dp"> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:background="#B3B8D3"></View> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="第三方账号登录" android:textColor="#ffb3b8d3" android:textSize="11sp" /> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:background="#B3B8D3"></View> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp"> android:layout_marginLeft="50dp" android:layout_marginTop="120dp" android:layout_marginRight="50dp" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical"> <LinearLayout android:id="@+id/ll_login_qq" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical"> android:layout_marginTop="15dp" android:background="@drawable/shape_login_input_bg" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingTop="12dp" android:paddingRight="20dp" android:paddingBottom="12dp"> <ImageView android:layout_width="45dp" android:layout_height="45dp" android:src="@drawable/img_qq"></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="18dp" android:src="@drawable/icon_login_account"></ImageView> <EditText android:id="@+id/et_name" style="@style/loginInputStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="7.5dp" android:drawablePadding="6dp" android:gravity="center_horizontal" android:padding="4dp" android:text="QQ登录" android:textColor="#C5C5C5" android:textSize="9sp" /> android:layout_marginLeft="18dp" android:background="@null" android:digits="@string/rule_email" android:hint="请输入账户邮箱" android:inputType="textEmailAddress" /> </LinearLayout> <LinearLayout android:id="@+id/ll_login_wx" android:layout_width="wrap_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="48dp" android:gravity="center_horizontal" android:orientation="vertical"> android:layout_marginTop="15dp" android:background="@drawable/shape_login_input_bg" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingTop="12dp" android:paddingRight="20dp" android:paddingBottom="12dp"> <ImageView android:layout_width="45dp" android:layout_height="45dp" android:src="@drawable/img_wx"></ImageView> android:layout_width="wrap_content" android:layout_height="18dp" android:src="@drawable/icon_login_password"></ImageView> <EditText android:id="@+id/et_pwd" style="@style/loginInputStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="18dp" android:background="@null" android:digits="@string/rule_password" android:hint="请输入您的密码" android:inputType="textPassword" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_login" android:layout_width="match_parent" android:layout_height="44dp" android:background="@drawable/shape_login_btn" android:gravity="center" android:paddingLeft="14dp" android:paddingRight="14dp" android:text="登录" android:textColor="#F4DE4A" android:textSize="17sp" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="28dp"> <TextView android:id="@+id/tv_register" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="7.5dp" android:drawablePadding="6dp" android:gravity="center_horizontal" android:padding="4dp" android:text="微信登录" android:textColor="#C5C5C5" android:textSize="9sp" /> </LinearLayout> android:text="注册帐号" android:textColor="#FFE84D" android:textSize="11sp" /> <TextView android:id="@+id/tv_forget_pwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="忘记密码" android:textColor="#FFE84D" android:textSize="11sp" /> </FrameLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="50dp" android:layout_marginRight="50dp" android:orientation="vertical" android:paddingBottom="20dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingLeft="18dp" android:paddingRight="18dp"> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:background="#B3B8D3"></View> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="第三方账号登录" android:textColor="#ffb3b8d3" android:textSize="11sp" /> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:background="#B3B8D3"></View> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="32dp"> <LinearLayout android:id="@+id/ll_login_qq" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical"> <ImageView android:layout_width="45dp" android:layout_height="45dp" android:src="@drawable/img_qq"></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="7.5dp" android:drawablePadding="6dp" android:gravity="center_horizontal" android:padding="4dp" android:text="QQ登录" android:textColor="#C5C5C5" android:textSize="9sp" /> </LinearLayout> <LinearLayout android:id="@+id/ll_login_wx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="48dp" android:gravity="center_horizontal" android:orientation="vertical"> <ImageView android:layout_width="45dp" android:layout_height="45dp" android:src="@drawable/img_wx"></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="7.5dp" android:drawablePadding="6dp" android:gravity="center_horizontal" android:padding="4dp" android:text="微信登录" android:textColor="#C5C5C5" android:textSize="9sp" /> </LinearLayout> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:orientation="horizontal"> <CheckBox android:id="@+id/cb_user_agreement" android:layout_width="15dp" android:layout_height="15dp" android:layout_gravity="center_vertical" android:background="@drawable/selector_user_agreement_checkbox" android:button="@null" android:checked="true" android:gravity="center" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6.5dp" android:text="勾选表示同意" android:textColor="#B3B8D3" android:textSize="11sp" /> <TextView android:id="@+id/tv_user_agreement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/user_agreement" android:textColor="#51B3FF" android:textSize="11sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="、" android:textColor="#B3B8D3" android:textSize="11sp" /> <TextView android:id="@+id/tv_privacy_policy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/privacy_policy" android:textColor="#51B3FF" android:textSize="11sp" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:orientation="horizontal"> <CheckBox android:id="@+id/cb_user_agreement" android:layout_width="15dp" android:layout_height="15dp" android:layout_gravity="center_vertical" android:background="@drawable/selector_user_agreement_checkbox" android:button="@null" android:checked="true" android:gravity="center" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6.5dp" android:text="勾选表示同意" android:textColor="#B3B8D3" android:textSize="11sp" /> <TextView android:id="@+id/tv_user_agreement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/user_agreement" android:textColor="#51B3FF" android:textSize="11sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="、" android:textColor="#B3B8D3" android:textSize="11sp" /> <TextView android:id="@+id/tv_privacy_policy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/privacy_policy" android:textColor="#51B3FF" android:textSize="11sp" /> </LinearLayout> </LinearLayout> </ScrollView> </ScrollView> </LinearLayout> </FrameLayout> </LinearLayout> BuWanVideo/res/layout/fragment_player_funshion.xml
@@ -5,27 +5,49 @@ android:layout_height="match_parent" android:orientation="vertical"> <com.lcjian.library.widget.RatioLayout android:layout_width="wrap_content" android:layout_height="wrap_content" app:ratio="0.5625"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_height="match_parent"> android:layout_height="match_parent" android:background="@color/aliuser_edittext_bg_color_normal"> <SurfaceView android:id="@+id/video_view" <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_container" android:layout_width="match_parent" android:layout_height="match_parent" /> android:layout_height="wrap_content" android:layout_gravity="center" app:ratio="1"> <com.lcjian.library.video.VideoPlayerController android:id="@+id/vpc_funshion" android:layout_width="match_parent" android:layout_height="match_parent"></com.lcjian.library.video.VideoPlayerController> <SurfaceView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </com.lcjian.library.widget.RatioLayout> </FrameLayout> </com.lcjian.library.widget.RatioLayout> <com.lcjian.library.video.VideoPlayerController android:id="@+id/vpc_funshion" android:layout_width="match_parent" android:layout_height="match_parent"></com.lcjian.library.video.VideoPlayerController> <FrameLayout android:id="@+id/fl_ad" android:background="#000000" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"> </FrameLayout> </FrameLayout> </LinearLayout> BuWanVideo/res/layout/video_detail_activity.xml
@@ -11,16 +11,16 @@ android:layout_height="15dp" android:background="@color/top_bar_color" /> <RelativeLayout <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> android:layout_weight="1" android:orientation="vertical"> <FrameLayout android:id="@+id/fragment_video_play_container1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/v_status_bar" android:background="@color/bg_download_so"> <FrameLayout @@ -57,17 +57,7 @@ </FrameLayout> <TextView android:id="@+id/iv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="15dp" android:drawableLeft="@drawable/ic_back_two" android:drawablePadding="5dp" android:gravity="center" android:src="@drawable/ic_back_two" android:textColor="@color/white" /> <FrameLayout android:id="@+id/fl_banner" @@ -124,7 +114,21 @@ android:src="@drawable/ic_play"></ImageView> </FrameLayout> <TextView android:id="@+id/iv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="15dp" android:drawableLeft="@drawable/ic_back_two" android:drawablePadding="5dp" android:gravity="center" android:src="@drawable/ic_back_two" android:textColor="@color/white" /> </FrameLayout> @@ -132,8 +136,8 @@ <FrameLayout android:id="@+id/fl_video_detail" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/fragment_video_play_container1"> android:layout_height="0dp" android:layout_weight="1"> <FrameLayout android:id="@+id/fragment_video_detail_container" @@ -158,6 +162,5 @@ </FrameLayout> </RelativeLayout> </LinearLayout> </LinearLayout> BuWanVideo/res/values/strings.xml
@@ -1,5 +1,5 @@ <resources> <string name="app_name">影视大全布丸</string> <string name="app_name">影视大全</string> <string name="recommend">推荐</string> <string name="category">分类</string> <string name="discover">发现</string> BuWanVideo/res/xml/bd_file_paths.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="bd_lv_path" path="/" /> <external-files-path name="bdpath" path="bddownload/" /> <external-path name="bdpathsd" path="bddownload/" /> <files-path name="bd_files_path" path="bddownload/" /> <cache-path name="bd_cache_path" path="bddownload/" /> </paths> BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java
@@ -8,10 +8,10 @@ import android.support.multidex.MultiDex; import android.util.Log; import com.bytedance.sdk.openadsdk.TTAdConfig; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdSdk; import com.baidu.mobads.AppActivity; import com.fun.xm.FSPlayer; import com.iBookStar.views.YmConfig; import com.lcjian.library.util.ManifestDataUtil; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.ImageLoader; @@ -29,6 +29,7 @@ import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.CrashHandler; import com.weikou.beibeivideo.util.FunshionConstant; import com.weikou.beibeivideo.util.ad.TTAdManagerHolder; public class BeibeiVideoApplication extends Application { @@ -53,6 +54,7 @@ CrashHandler crashHandler = CrashHandler.getInstance(); crashHandler.init(getApplicationContext()); } application = this; MultiDex.install(this); //友盟初始化 @@ -74,7 +76,11 @@ GDTADManager.getInstance().initWith(this, BeibeiConstant.GDT_ID); initWX(); //初始化播放插件 FSPlayer.init(this, FunshionPlayerFragment.APICODE); FSPlayer.init(this, FunshionConstant.APICODE); //百度内容联盟 AppActivity.setActionBarColorTheme(AppActivity.ActionBarColorTheme.ACTION_BAR_BLACK_THEME); //聚能赚 YmConfig.initNovel(this,"8845"); } BuWanVideo/src/com/weikou/beibeivideo/entity/VideoDetailInfo.java
@@ -18,11 +18,9 @@ private static final long serialVersionUID = 1L; @Expose private String id; private VideoInfo video; @Expose private String name; private AdminInfo admin; private String beizhu; @Expose private String createtime; @Expose @@ -35,7 +33,8 @@ private String eId; @Expose private String picture; private String comment; private VideoInfo video; public String getPicture() { return picture; @@ -73,14 +72,6 @@ this.introduction = introduction; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public List<PlayUrl> getUrls() { return urls; } @@ -111,22 +102,6 @@ public void setName(String name) { this.name = name; } public AdminInfo getAdmin() { return admin; } public void setAdmin(AdminInfo admin) { this.admin = admin; } public String getBeizhu() { return beizhu; } public void setBeizhu(String beizhu) { this.beizhu = beizhu; } public String getCreatetime() { BuWanVideo/src/com/weikou/beibeivideo/entity/video/FunshionPlayInfo.java
New file @@ -0,0 +1,44 @@ package com.weikou.beibeivideo.entity.video; import com.weikou.beibeivideo.entity.PlayUrl; import com.weikou.beibeivideo.entity.VideoInfo; //风行播放器需要的信息 public class FunshionPlayInfo { private VideoInfo videoInfo; private int position; private PlayUrl playUrl; private boolean collected; public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public VideoInfo getVideoInfo() { return videoInfo; } public void setVideoInfo(VideoInfo videoInfo) { this.videoInfo = videoInfo; } public PlayUrl getPlayUrl() { return playUrl; } public void setPlayUrl(PlayUrl playUrl) { this.playUrl = playUrl; } public boolean isCollected() { return collected; } public void setCollected(boolean collected) { this.collected = collected; } } BuWanVideo/src/com/weikou/beibeivideo/ui/SplashActivity.java
@@ -1,7 +1,6 @@ package com.weikou.beibeivideo.ui; import android.Manifest; import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; @@ -15,62 +14,41 @@ import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.telephony.TelephonyManager; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bytedance.sdk.openadsdk.AdSlot; import com.bytedance.sdk.openadsdk.TTAdManager; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTSplashAd; import com.google.gson.Gson; import com.joker.annotation.PermissionsCustomRationale; import com.joker.annotation.PermissionsDenied; import com.joker.annotation.PermissionsGranted; import com.joker.annotation.PermissionsRationale; import com.joker.api.Permissions4M; import com.lcjian.library.util.common.StringUtils; import com.qq.e.ads.splash.SplashAD; import com.qq.e.ads.splash.SplashADListener; import com.qq.e.comm.util.AdError; import com.tencent.smtt.sdk.WebView; import com.umeng.analytics.MobclickAgent; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; import com.weikou.beibeivideo.BeibeiVideoAPI; import com.weikou.beibeivideo.BeibeiVideoApplication; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.ad.AdTypeVO; import com.weikou.beibeivideo.ui.main.MainActivity; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.DimenUtils; import com.weikou.beibeivideo.util.GlideRoundTransform; import com.weikou.beibeivideo.util.PermissionHintDialog; import com.weikou.beibeivideo.util.PermissionsActivity; import com.weikou.beibeivideo.util.PermissionsChecker; import com.weikou.beibeivideo.util.SDCardUtil; import com.weikou.beibeivideo.util.ad.AdUtil; import com.weikou.beibeivideo.util.ad.CSJConstant; import com.weikou.beibeivideo.util.ad.GDTConstant; import com.weikou.beibeivideo.util.ad.SplashAdUtil; import com.weikou.beibeivideo.util.ad.TTAdManagerHolder; import com.weikou.beibeivideo.R; import org.apache.http.Header; import org.json.JSONObject; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import static android.content.pm.PackageManager.PERMISSION_GRANTED; @@ -417,7 +395,7 @@ @Override public void noAd() {//初次加载未加载出广告 if (AdUtil.AD_TYPE.csj==adType) { if (AdUtil.AD_TYPE.csj == adType) { //再次加载广点通广告 SplashAdUtil.loadAD(AdUtil.AD_TYPE.gdt, SplashActivity.this, vg_input, vg_ad, ad_close_time, new SplashAdUtil.SplashAdListener() { @Override @@ -441,7 +419,7 @@ } }); } else if (AdUtil.AD_TYPE.gdt==adType) { } else if (AdUtil.AD_TYPE.gdt == adType) { //再次加载穿山甲广告 //再次加载广点通广告 SplashAdUtil.loadAD(AdUtil.AD_TYPE.csj, SplashActivity.this, vg_input, vg_ad, ad_close_time, new SplashAdUtil.SplashAdListener() { @@ -482,6 +460,8 @@ if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE); } else { //百度内容联盟 // MobadsPermissionSettings.setPermissionReadDeviceID(true); getUid(); new WebView(this); vg_ad.postDelayed(new Runnable() { BuWanVideo/src/com/weikou/beibeivideo/ui/common/VideosFragment.java
@@ -150,6 +150,9 @@ type = (VideoType) getArguments().getSerializable("videotype"); if(getArguments()!=null) getArguments().clear(); mHomeType = getActivity().getIntent().getStringExtra("home_type"); try { mVideoType = getActivity().getIntent().getStringExtra("video_type"); BuWanVideo/src/com/weikou/beibeivideo/ui/login/LoginActivity.java
@@ -50,15 +50,11 @@ import java.util.Map; public class LoginActivity extends BaseActivity implements OnClickListener { // private Tencent mTencent; public static final int RESULT_LOGIN = 10; // private UserInfo mInfo; private ProgressDialog dialog; private LinearLayout ll_login_qq, ll_login_wx; private TextView tv_cancel;// 取消 private boolean isTouchLogin;// 用户是否点击登录 private String uid; // private IUiListener listener;// 用于接收返回数据的监听 private String loginType = "";// 登录类型 默认为空字符 QQ为1 private String openId = "";// 用户第三方登录唯一识别码 @@ -93,18 +89,17 @@ } uid = getSharedPreferences("user", Context.MODE_PRIVATE).getString( "uid", ""); tv_cancel = (TextView) findViewById(R.id.login_tv_cancel); ll_login_qq = findViewById(R.id.ll_login_qq); tv_cancel.setOnClickListener(this); findViewById(R.id.ll_login_qq).setOnClickListener(this); findViewById(R.id.ll_login_wx).setOnClickListener(this); // aq.id(R.id.ll_login_qq).click(this); // aq.id(R.id.ll_login_wx).click(this); // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。 // 其中APP_ID是分配给第三方应用的appid,类型为String。测试号222222 木瓜影视大全专用号1104492673 // mTencent = Tencent.createInstance(BeibeiConstant.QQ_ID, // this.getApplicationContext()); findViewById(R.id.login_tv_cancel).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); dialog = new ProgressDialog(this); ll_login_content = (LinearLayout) findViewById(R.id.ll_login_content); @@ -348,7 +343,6 @@ * 锁定返回 */ private void lockBack(boolean isSure) { tv_cancel.setEnabled(!isSure); isTouchLogin = isSure; } BuWanVideo/src/com/weikou/beibeivideo/ui/main/HomeFragment.java
@@ -81,7 +81,8 @@ } catch (IOException e) { e.printStackTrace(); } showProtocol(); if (!BeibeiConstant.IS_TEST) showProtocol(); } BuWanVideo/src/com/weikou/beibeivideo/ui/main/MainActivity.java
@@ -74,6 +74,7 @@ import com.weikou.beibeivideo.util.ad.FullVideoAdManager; import com.weikou.beibeivideo.util.ad.manager.SearchResultAdManager; import com.weikou.beibeivideo.R; import com.yeshi.ec.library_baiducpu.fragment.BaiDuNewsFragment; import com.ysh.wpc.appupdate.AppUpdate; import org.apache.http.Header; @@ -129,13 +130,6 @@ exitDialog = exitDialogBuilder.create(); exitDialog.setCanceledOnTouchOutside(true); exitDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { if (exitDialogBuilder != null) exitDialogBuilder.refreshAd(); } }); /* * 计算状态栏高度并设置 */ @@ -218,7 +212,7 @@ mFragmentSwitchHelper = FragmentSwitchHelper.create( R.id.fl_main_fragment_container, getSupportFragmentManager(), new HomeFragment(), new CategoryFragment(), new DiscoverNowFragment(), new MineFragment(), new GuessLikeFragment()); new BaiDuNewsFragment(), new MineFragment(), new GuessLikeFragment()); rg_nav = findViewById(R.id.rg_nav); rg_nav.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @@ -242,7 +236,7 @@ break; case R.id.rb_nav_discover: { mFragmentSwitchHelper .changeFragment(DiscoverNowFragment.class); .changeFragment(BaiDuNewsFragment.class); } break; case R.id.rb_nav_mine: { @@ -261,12 +255,6 @@ } }); setRightTopAD(); try { //加载视频播放广告 FullVideoAdManager.getInstance().loadAd(getApplicationContext(), null); } catch (Exception e) { e.printStackTrace(); } preLoadCommonAD(); } @@ -373,14 +361,6 @@ addDownloadBuxin(preferences.getString("shopurl", "")); } EventBus.getDefault().register(this); if (BeibeiConstant.IS_TEST) { iv_msg_dot.postDelayed(new Runnable() { @Override public void run() { startActivity(new Intent(MainActivity.this, SearchActivity.class)); } }, 2000); } } BuWanVideo/src/com/weikou/beibeivideo/ui/media/EpisodeFragment.java
@@ -57,6 +57,7 @@ import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.VideoResource; import com.weikou.beibeivideo.entity.ad.ExpressAdContainer; import com.weikou.beibeivideo.entity.video.FunshionPlayInfo; import com.weikou.beibeivideo.ui.login.LoginActivity; import com.weikou.beibeivideo.ui.video.EpisodeNewAdapter; import com.weikou.beibeivideo.util.BeibeiConstant; @@ -176,24 +177,30 @@ episodeAdapter = new EpisodeNewAdapter(getContext(), mVideoInfo, type, mPlayingPosition, new EpisodeNewAdapter.ISelectVideoEpisodeListener() { @Override public void onClick(int position, VideoDetailInfo detailInfo) { VideoDetailInfo videoDetailInfo = detailInfo; mPlayingPosition = position; episodeAdapter.setPlayingPosition(mPlayingPosition); refresh(); Playlocation playlocation = new Playlocation(); playlocation.setPosition(position); EventBus.getDefault().post(playlocation); getUrl(videoDetailInfo); setEpisodeSelected(position); getUrl(detailInfo); } }); LinearLayoutManager ms = new LinearLayoutManager(getContext()); ms.setOrientation(LinearLayoutManager.HORIZONTAL); rv_episode.setHasFixedSize(true); rv_episode.setNestedScrollingEnabled(false); if (rv_episode.getLayoutManager() == null) rv_episode.setLayoutManager(ms); rv_episode.setLayoutManager(ms); rv_episode.addItemDecoration(new SpacesItemDecoration(DimenUtils.dip2px(getContext(), 10))); } //设置选中状态 private void setEpisodeSelected(int position) { mPlayingPosition = position; episodeAdapter.setPlayingPosition(mPlayingPosition); refresh(); Playlocation playlocation = new Playlocation(); playlocation.setPosition(position); EventBus.getDefault().post(playlocation); } private void setFollowData(boolean attention) { @@ -217,6 +224,9 @@ mPlayingPosition = getArguments().getInt("playing_position"); mStart = getArguments().getInt("start"); mEnd = getArguments().getInt("end"); if (getArguments() != null) getArguments().clear(); tv_video_resource = contentView.findViewById(R.id.tv_video_resource); ll_add_attention = contentView.findViewById(R.id.ll_add_attention); @@ -294,6 +304,15 @@ refresh(); } public void onEventMainThread(FunshionPlayInfo info) { Log.i(TAG, "风行选集:" + info.getPosition()); mPlayingPosition = info.getPosition(); episodeAdapter.setPlayingPosition(mPlayingPosition); refresh(); rv_episode.scrollToPosition(mPlayingPosition); } private void addAttention(String uid, String loginId) { BeibeiVideoAPI.addAttention(ll_add_attention.getContext(), uid, loginId, mVideoInfo.getId(), new BasicTextHttpResponseHandler() { @Override @@ -323,17 +342,26 @@ @Override public void onResume() { Log.i(TAG, "onResume:"); super.onResume(); } @Override public void onDestroyView() { Log.i(TAG, "onDestroyView:"); super.onDestroyView(); } @Override public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Override public void onPause() { Log.i(TAG, "onPause"); super.onPause(); } @@ -872,4 +900,11 @@ } }); } @Override public void onStop() { super.onStop(); Log.i(TAG, "onStop"); } } BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity.java
@@ -34,6 +34,7 @@ import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; import com.bytedance.sdk.openadsdk.TTFullScreenVideoAd; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -42,12 +43,11 @@ import com.lcjian.library.util.SystemCommon; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.video.VideoDataNotifyDialog; import com.lcjian.library.video.VideoLoadingDialog; import com.loopj.android.http.JsonHttpResponseHandler; import com.umeng.analytics.MobclickAgent; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; import com.weikou.beibeivideo.BeibeiVideoAPI; import com.weikou.beibeivideo.BeibeiVideoApplication; import com.weikou.beibeivideo.db.WatchHistoryTable; import com.weikou.beibeivideo.entity.AccumulateRule; import com.weikou.beibeivideo.entity.Follow; @@ -63,12 +63,10 @@ import com.weikou.beibeivideo.ui.common.ShareActivity; import com.weikou.beibeivideo.ui.mine.BrowserActivity; import com.weikou.beibeivideo.ui.mine.FXBrowserActivity; import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment; import com.weikou.beibeivideo.ui.video.VideoPlayerActivity; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.ad.FullVideoAdManager; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.util.ui.IPageEventListener; import org.apache.http.Header; import org.json.JSONArray; @@ -88,6 +86,8 @@ // public class VideoDetailActivity extends BaseActivity implements OnClickListener { private final static String TAG = "VideoDetailActivity"; // private boolean mLandscape; private VideoInfo videoInfo; @@ -109,12 +109,10 @@ private VideoDetailVideoAdFragment mVideoDetailVideoAdFragment; //风行播放器 private FunshionPlayerFragment mFunshionPlayerFragment; private ImageView iv_select_play; private FrameLayout fl_ad; @Override protected void onSaveInstanceState(Bundle outState) { @@ -137,8 +135,6 @@ super.onCreate(savedInstanceState); setContentView(R.layout.video_detail_activity); new VideoDataNotifyDialog.Builder().build(this).show(); /* * 计算状态栏高度并设置 */ @@ -156,12 +152,12 @@ findViewById(R.id.v_status_bar).setVisibility(View.GONE); } //广告 /** * 广告 */ mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment(); //播放器 mFunshionPlayerFragment = new FunshionPlayerFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); initView(); @@ -238,6 +234,7 @@ if (videoInfo == null) { return; } fl_ad.setVisibility(View.VISIBLE); isClick = true; startPlay(); } @@ -268,8 +265,8 @@ } iNet(); if (fl_ad != null) fl_ad.setVisibility(View.VISIBLE); // if (fl_ad != null) // fl_ad.setVisibility(View.VISIBLE); } @@ -278,6 +275,13 @@ if (BeibeiConstant.AD_TYPE.isVideoDetailSplashAd()) { if (FullVideoAdManager.getInstance().isCacahed()) { FullVideoAdManager.getInstance().showAd(this); } else { FullVideoAdManager.getInstance().loadAd(BeibeiVideoApplication.application, new FullVideoAdManager.IFullVideoAdListener() { @Override public void onSuccess(TTFullScreenVideoAd ad) { FullVideoAdManager.getInstance().showAd(VideoDetailActivity.this); } }); } } } @@ -291,6 +295,7 @@ private int mPosition = 0; public void onEventMainThread(Playlocation location) { Log.i(TAG, "onEventMainThread:Playlocation"); fl_ad.setVisibility(View.VISIBLE); mPosition = location.getPosition(); } @@ -301,46 +306,26 @@ private boolean isFirst = true; private synchronized void startPlay() { //移除所有的fragment if (mVideoDetailVideoAdFragment.isAdded()) { getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment).commit(); } if (mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().remove(mFunshionPlayerFragment).commit(); } private void startPlay() { iv_select_play.setVisibility(View.GONE); //需要加载广告 if (BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) { mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment(); mVideoDetailVideoAdFragment.setPageEventListener(new IPageEventListener() { if (fl_ad.getVisibility() == View.VISIBLE && BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) { mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() { @Override public void onCreateView() { mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() { @Override public void finishPlay() { getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment); clickPlay();//进入播放事件 } public void finishPlay() { clickPlay(); fl_ad.setVisibility(View.GONE); } @Override public void startPlay() { @Override public void startPlay() { } }); } }); if (!mVideoDetailVideoAdFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); } } else {//进入播放视频事件 } else { clickPlay(); } } @@ -396,23 +381,12 @@ Toast.LENGTH_LONG).show(); return; } else if (playUrl.getPlayType() == 1) { // Intent intent = new Intent(VideoDetailActivity.this, // FXBrowserActivity.class); // intent.putExtra("url", playUrl.getUrl()); // startActivity(intent); Intent intent = new Intent(VideoDetailActivity.this, FXBrowserActivity.class); intent.putExtra("url", playUrl.getUrl()); startActivity(intent); saveWatchHistory("风行"); } fl_video_play_background.setVisibility(View.GONE); //播放风行视频 //添加风行播放页 mFunshionPlayerFragment = new FunshionPlayerFragment(); Bundle bundle = new Bundle(); bundle.putString("vid", "83693903"); mFunshionPlayerFragment.setArguments(bundle); if (!mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_video_play_container, mFunshionPlayerFragment).commit(); } //开始播放视频 } else { if (playUrl.getPlayType() == 0) { Toast.makeText(VideoDetailActivity.this, "此节目不可播!", @@ -456,7 +430,7 @@ @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { ((ImageView) findViewById(R.id.iv_video_play_background)) iv_background .setImageDrawable(resource); } @@ -547,7 +521,7 @@ private void checkConfiguration(Configuration newConfig) { if (newConfig == null) return; if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏 if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // Hide the status bar隐藏状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; @@ -572,8 +546,6 @@ R.id.fragment_video_play_container).getLayoutParams(); layoutParams.height = android.view.ViewGroup.LayoutParams.MATCH_PARENT; findViewById(R.id.fragment_video_play_container).requestLayout(); } else { // Show the status bar显示状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); @@ -717,6 +689,7 @@ .toString(), new TypeToken<VideoInfo>() { }.getType()); // 附加字段 if (jsonObject.optJSONObject("Extra1") != null) { if (jsonObject.optJSONObject("Extra1").optJSONObject("Attention") != null) { @@ -825,9 +798,11 @@ progressDialog.dismiss(); } //加载视频广告 loadFullVideoAd(); fl_ad.setVisibility(View.GONE); if (!BeibeiConstant.IS_TEST) //加载视频广告 loadFullVideoAd(); } }); } @@ -868,8 +843,9 @@ if (videoInfo == null) { return; } fl_ad.setVisibility(View.VISIBLE); Log.i(TAG, "getUrl"); if (!isSetup || isClick) { fl_ad.setVisibility(View.VISIBLE); startPlay(); isClick = false; } @@ -1049,7 +1025,5 @@ @Override protected void onDestroy() { super.onDestroy(); if (BeibeiConstant.AD_TYPE.isVideoDetailSplashAd()) FullVideoAdManager.getInstance().loadAd(getApplicationContext(), null); } } BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity2.java
New file @@ -0,0 +1,1083 @@ package com.weikou.beibeivideo.ui.media; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.database.Cursor; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.lcjian.library.entity.eventbus.PlayerControllerShow; import com.lcjian.library.entity.eventbus.PlayerLock; import com.lcjian.library.util.SingleToast; import com.lcjian.library.util.SystemCommon; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.StringUtils; import com.loopj.android.http.JsonHttpResponseHandler; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; import com.weikou.beibeivideo.BeibeiVideoAPI; import com.weikou.beibeivideo.BeibeiVideoApplication; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.db.WatchHistoryTable; import com.weikou.beibeivideo.entity.AccumulateRule; import com.weikou.beibeivideo.entity.Follow; import com.weikou.beibeivideo.entity.Play; import com.weikou.beibeivideo.entity.PlayUrl; import com.weikou.beibeivideo.entity.Playlocation; import com.weikou.beibeivideo.entity.PushEpisode; import com.weikou.beibeivideo.entity.VideoDetailInfo; import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.VideoResource; import com.weikou.beibeivideo.ui.BaseActivity; import com.weikou.beibeivideo.ui.ad.VideoDetailVideoAdFragment; import com.weikou.beibeivideo.ui.common.ShareActivity; import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment; import com.weikou.beibeivideo.ui.video.VideoPlayerActivity; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.ad.FullVideoAdManager; import com.weikou.beibeivideo.util.ui.IPageEventListener; import org.apache.http.Header; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import de.greenrobot.event.EventBus; /** * 视频详情 * * @author Administrator */ // public class VideoDetailActivity2 extends BaseActivity implements OnClickListener { private final String TAG = "VideoDetailActivity2"; // private boolean mLandscape; private VideoInfo videoInfo; private ImageView iv_download_failure; private ImageView iv_background; private TextView tv_back; private String resourceId = ""; private String detailid = ""; private Fragment mIQYVideoPlayerFragment; private ProgressDialog progressDialog; private boolean isClick = false; private FragmentManager fm = getSupportFragmentManager(); private VideoDetailVideoAdFragment mVideoDetailVideoAdFragment; //风行播放器 private FunshionPlayerFragment mFunshionPlayerFragment; private ImageView iv_select_play; private FrameLayout fl_ad; private boolean playerLock;//播放器是否锁屏 @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("flash exit", "VideoDetailActivity"); super.onSaveInstanceState(outState); } private void initView() { iv_select_play = findViewById(R.id.iv_select_play); tv_back = findViewById(R.id.iv_back); iv_download_failure = findViewById(R.id.iv_download_failure); fl_video_play_background = findViewById(R.id.fl_video_play_background); iv_background = findViewById(R.id.iv_video_play_background); fl_ad = findViewById(R.id.fl_ad); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.video_detail_activity); /* * 计算状态栏高度并设置 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, result); findViewById(R.id.v_status_bar).setLayoutParams(params); } else { findViewById(R.id.v_status_bar).setVisibility(View.GONE); } //广告 mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment(); //播放器 mFunshionPlayerFragment = new FunshionPlayerFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); initView(); progressDialog = new ProgressDialog(this, ProgressDialog.STYLE_SPINNER); progressDialog.setCanceledOnTouchOutside(false); progressDialog.setMessage("正在请求网络..."); progressDialog.show(); tv_back.setOnClickListener(this); iv_download_failure.setOnClickListener(this); if (getIntent().getSerializableExtra("video_info") != null) { videoInfo = (VideoInfo) getIntent().getSerializableExtra( "video_info"); if (videoInfo != null) videoInfo.setVideoDetailList(null); if (getIntent().getBooleanExtra("isFromWatchHistory", false)) { Cursor cursor = getContentResolver().query( WatchHistoryTable.CONTENT_URI, null, WatchHistoryTable.VIDEO_ID + " = ? ", new String[]{videoInfo.getId()}, null); cursor.moveToFirst(); if (cursor.getCount() > 0) { try { resourceId = cursor.getString(cursor.getColumnIndex(WatchHistoryTable.VIDEO_RESOURCE_ID)); } catch (Exception e) { e.printStackTrace(); } } cursor.close(); } } else { videoInfo = new VideoInfo(); Bundle bundle = this.getIntent().getExtras(); videoInfo.setId(bundle.getString("Id")); videoInfo.setShare(bundle.getString("Share")); videoInfo.setThirdType(bundle.getString("ThirdType")); //后面使用setResouceId resourceId = bundle.getString("ResourceId"); detailid = bundle.getString("DetailId"); } if (videoInfo == null) BeibeiVideoAPI.setVideoError(this, getSharedPreferences("user", Context.MODE_PRIVATE) .getString("uid", ""), "VideoDetailActivity:传入的VideoInfo为空", new JsonHttpResponseHandler() { }); if ("1".equals(videoInfo.getShare())) { SharedPreferences preferences = getSharedPreferences("user", Context.MODE_PRIVATE); if (!preferences.getBoolean("shared", false)) { Toast.makeText(VideoDetailActivity2.this, "该影片需要分享之后才能观看", Toast.LENGTH_LONG).show(); startActivity(getIntent().setClass(VideoDetailActivity2.this, ShareActivity.class)); finish(); return; } } LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( (int) SystemCommon.getScreenWidth(this), (int) ((SystemCommon.getScreenWidth(this) * 9) / 16)); findViewById(R.id.fragment_video_play_container1).setLayoutParams( params); iv_select_play.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (videoInfo == null) { return; } isClick = true; startPlay(); } }); iv_background.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (videoInfo == null) { return; } isClick = true; startPlay(); } }); iv_background.setClickable(false); Fragment videoDetailFragment = fm .findFragmentByTag("VideoDetailFragment"); if (videoDetailFragment == null) { videoDetailFragment = new VideoDetailFragment(); Bundle bundle = new Bundle(); bundle.putInt("playing_position", getIntent().getIntExtra("playing_position", 0)); videoDetailFragment.setArguments(bundle); fm.beginTransaction() .add(R.id.fragment_video_detail_container, videoDetailFragment, "VideoDetailFragment") .commitAllowingStateLoss(); } iNet(); if (fl_ad != null) fl_ad.setVisibility(View.VISIBLE); } private void loadFullVideoAd() { //加载广告 if (BeibeiConstant.AD_TYPE.isVideoDetailSplashAd()) { if (FullVideoAdManager.getInstance().isCacahed()) { FullVideoAdManager.getInstance().showAd(this); } } } private static FrameLayout fl_video_play_background; public static void hideImage() { fl_video_play_background.setVisibility(View.GONE); } private int mPosition = 0; Fragment mSohuVideoFragment; Fragment mLeTVVideoFragment; Fragment mYoukuPlayerFragment; private boolean isFirst = true; private synchronized void startPlay() { //移除所有的fragment if (mVideoDetailVideoAdFragment.isAdded()) { getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment).commit(); } if (mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().remove(mFunshionPlayerFragment).commit(); } iv_select_play.setVisibility(View.GONE); if (BeibeiConstant.IS_TEST) BeibeiConstant.AD_TYPE = null; //需要加载广告 if (BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) { mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment(); mVideoDetailVideoAdFragment.setPageEventListener(new IPageEventListener() { @Override public void onCreateView() { mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() { @Override public void finishPlay() { getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment); clickPlay();//进入播放事件 } @Override public void startPlay() { } }); } }); if (!mVideoDetailVideoAdFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); } } else {//进入播放视频事件 clickPlay(); } } private void clickPlay() { if (playUrl == null) { SingleToast.showToast(VideoDetailActivity2.this, "初始化播放路径中,请稍候点击播放!"); return; } for (int i = 0; i < videoInfo.getResourceList().size(); i++) { if (playUrl.getResource().getId().equalsIgnoreCase(videoInfo.getResourceList().get(i).getId())) { videoInfo.getResourceList().get(i).setChecked(true); } else { videoInfo.getResourceList().get(i).setChecked(false); } } if (playUrl.getResource().getName().contains("爱奇艺")) { if (playUrl != null) { if (playUrl.getPlayType() == 0) { Toast.makeText(VideoDetailActivity2.this, "此节目不可播!", Toast.LENGTH_LONG).show(); return; } else if (playUrl.getPlayType() == 1) { Intent intent = new Intent(VideoDetailActivity2.this, VideoPlayerActivity.class); intent.putExtra("url", playUrl.getUrl()); startActivity(intent); } else if (playUrl.getPlayType() == 2) { iv_select_play.setVisibility(View.GONE); iv_background.setClickable(false); mIQYVideoPlayerFragment = fm .findFragmentByTag("IQYVideoFragment"); mIQYVideoPlayerFragment = new IQYVideoFragment(); Bundle b = new Bundle(); b.putSerializable("playUrl", playUrl); mIQYVideoPlayerFragment.setArguments(b); fm.beginTransaction() .replace(R.id.fragment_video_play_container, mIQYVideoPlayerFragment, "IQYVideoFragment") .commitAllowingStateLoss(); // EventBus.getDefault().post(playUrl); Toast.makeText(VideoDetailActivity2.this, "影片加载中...", Toast.LENGTH_LONG).show(); } saveWatchHistory("爱奇艺"); } } else if (playUrl.getResource().getName().contains("风行")) { if (playUrl.getPlayType() == 0) { Toast.makeText(VideoDetailActivity2.this, "此节目不可播!", Toast.LENGTH_LONG).show(); return; } else if (playUrl.getPlayType() == 1) { // Intent intent = new Intent(VideoDetailActivity2.this, // FXBrowserActivity.class); // intent.putExtra("url", playUrl.getUrl()); // startActivity(intent); saveWatchHistory("风行"); } fl_video_play_background.setVisibility(View.GONE); //播放风行视频 //添加风行播放页 mFunshionPlayerFragment = new FunshionPlayerFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("videoInfo", videoInfo); bundle.putSerializable("playUrl", playUrl); bundle.putInt("position", mPosition); bundle.putBoolean("collect", false); bundle.putSerializable("resource", resource); mFunshionPlayerFragment.setArguments(bundle); if (!mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_video_play_container, mFunshionPlayerFragment).commit(); } } else { if (playUrl.getPlayType() == 0) { Toast.makeText(VideoDetailActivity2.this, "此节目不可播!", Toast.LENGTH_LONG).show(); return; } else if (playUrl.getPlayType() == 1) { Intent intent = new Intent(VideoDetailActivity2.this, VideoPlayerActivity.class); intent.putExtra("url", playUrl.getUrl()); startActivity(intent); saveWatchHistory(playUrl.getResource().getName()); } } } private PlayUrl info; public void onEventMainThread(Playlocation location) { fl_ad.setVisibility(View.VISIBLE); mPosition = location.getPosition(); } public void onEventMainThread(PlayUrl info) { this.info = info; Toast.makeText(this, "播放", Toast.LENGTH_SHORT).show(); } private SimpleTarget<Drawable> target = new SimpleTarget<Drawable>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { ((ImageView) findViewById(R.id.iv_video_play_background)) .setImageDrawable(resource); } @Override public void onLoadCleared(@Nullable Drawable placeholder) { } }; @Override public void onBackPressed() { Log.i(TAG, "onBackPressed"); if (playerLock) return;//锁屏不做处理 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { super.onBackPressed(); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { onBackPressed(); return false; } else { return super.onKeyDown(keyCode, event); } } public void onEventMainThread(AccumulateRule info) {// 播放界面返回替代使用 clickBack(); } public void onEventMainThread(PlayerLock info) {//播放器锁屏 playerLock = info.isLock(); } public void onEventMainThread(PlayerControllerShow show) {//播放控制器显示 if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { tv_back.setVisibility(View.GONE); } else { if (show.isShow()) { tv_back.setVisibility(View.GONE); } else { tv_back.setVisibility(View.VISIBLE); } } } private void clickBack() { Log.i(TAG, "clickBack"); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); findViewById(R.id.fl_video_detail).setVisibility(View.VISIBLE); fl_video_play_background.setVisibility(View.VISIBLE); iv_select_play.setVisibility(View.VISIBLE); try { Glide.with(getApplicationContext()).load(R.drawable.ic_select_play) .into(iv_select_play); } catch (IllegalArgumentException e) { e.printStackTrace(); } findViewById(R.id.v_status_bar).setVisibility(View.VISIBLE); android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams( (int) SystemCommon.getScreenWidth(this), (int) ((SystemCommon.getScreenWidth(this) * 9) / 16)); findViewById(R.id.fragment_video_play_container1).setLayoutParams( params); if (playUrl != null && playUrl.getResource().getName().contains("爱奇艺")) { iv_background.setClickable(true); if (mIQYVideoPlayerFragment != null) fm.beginTransaction().remove(mIQYVideoPlayerFragment) .commitAllowingStateLoss(); } else if (playUrl != null && playUrl.getResource().getName().contains("搜狐")) { iv_background.setClickable(true); if (mSohuVideoFragment != null) fm.beginTransaction().remove(mSohuVideoFragment) .commitAllowingStateLoss(); } else if (playUrl != null && playUrl.getResource().getName().contains("优酷")) { iv_background.setClickable(true); if (mYoukuPlayerFragment != null) fm.beginTransaction().remove(mYoukuPlayerFragment) .commitAllowingStateLoss(); } else if (playUrl != null && playUrl.getResource().getName().contains("LeTV")) { iv_background.setClickable(true); if (mLeTVVideoFragment != null) fm.beginTransaction().remove(mLeTVVideoFragment) .commitAllowingStateLoss(); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i(TAG, "onConfigurationChanged"); checkConfiguration(newConfig); } /** * 方向改变后相关的参数设置 * * @param newConfig */ private void checkConfiguration(Configuration newConfig) { Log.i(TAG, "checkConfiguration"); if (newConfig == null) return; if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏 findViewById(R.id.fl_video_detail).setVisibility(View.GONE); findViewById(R.id.v_status_bar).setVisibility(View.GONE); ViewGroup.LayoutParams params1 = findViewById(R.id.v_status_bar).getLayoutParams(); params1.height = 0; // Hide the status bar隐藏状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(attrs); Fragment videoDetailFragment = getSupportFragmentManager() .findFragmentByTag("VideoDetailFragment"); if (videoDetailFragment != null && !videoDetailFragment.isHidden()) { getSupportFragmentManager().beginTransaction() .hide(videoDetailFragment).commitAllowingStateLoss(); } if (playUrl != null && playUrl.getResource().getName().contains("自主")) { Fragment videoPlayerFragment = getSupportFragmentManager() .findFragmentByTag("VideoPlayerFragment"); if (videoPlayerFragment != null) { } } android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); findViewById(R.id.fragment_video_play_container1).setLayoutParams( params); if (mFunshionPlayerFragment != null) mFunshionPlayerFragment.requestLayout(); } else { findViewById(R.id.v_status_bar).setVisibility(View.VISIBLE); findViewById(R.id.fl_video_detail).setVisibility(View.VISIBLE); ViewGroup.LayoutParams params1 = findViewById(R.id.v_status_bar).getLayoutParams(); params1.height = DimenUtils.getStatusBarHeight(getApplicationContext()); // Show the status bar显示状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(attrs); Fragment videoDetailFragment = getSupportFragmentManager() .findFragmentByTag("VideoDetailFragment"); if (videoDetailFragment != null) { getSupportFragmentManager().beginTransaction() .show(videoDetailFragment).commitAllowingStateLoss(); } if (playUrl != null && playUrl.getResource().getName().contains("自主")) { Fragment videoPlayerFragment = getSupportFragmentManager() .findFragmentByTag("VideoPlayerFragment"); } FrameLayout layout = findViewById(R.id.fragment_video_play_container1); if (layout == null) return; android.view.ViewGroup.LayoutParams layoutParams = layout .getLayoutParams(); layoutParams.height = (int) (DimenUtils.getScreenWidth(this) * 0.5625f); layout.requestLayout(); if (mFunshionPlayerFragment != null) mFunshionPlayerFragment.requestLayout(); } } @Override public void onResume() { super.onResume(); EventBus.getDefault().register(this); if (fl_ad.getVisibility() == View.GONE) { iv_select_play.setVisibility(View.VISIBLE); } } @Override public void onPause() { super.onPause(); EventBus.getDefault().unregister(this); } public void onEventMainThread(ChangeVideoEvent changeVideoEvent) { VideoInfo videoInfo = changeVideoEvent.getVideoInfo(); resourceId = ""; if (!progressDialog.isShowing()) { progressDialog.show(); } getVideoDetail(this, videoInfo.getId(), videoInfo.getThirdType(), false); } public void onEventMainThread(Play info) { Log.i("mResult", "VideoDetailActivity-----onEventMainThread----开始播放"); playUrl = info.getPlayUrl(); if (videoInfo == null) { return; } try { startPlay(); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } } public void onEventMainThread(VideoInfo info) { videoInfo = info; } private void getVideoDetail(final Context context, String videoId, String videoThirdType, final boolean isSetup) { SharedPreferences preferences = context.getSharedPreferences("user", Context.MODE_PRIVATE); String uid = preferences.getString("uid", ""); String loginid = preferences.getString("LoginUid", ""); BeibeiVideoAPI.getVideoDetail(context, uid, resourceId, videoId, loginid, videoThirdType, new BasicTextHttpResponseHandler() { @Override public void onStart() { super.onStart(); // if (BeibeiConstant.DEBUG) // Toast.makeText(VideoDetailActivity2.this, "onStart", // Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); // if (BeibeiConstant.DEBUG) // Toast.makeText(VideoDetailActivity2.this, "onFailure", // Toast.LENGTH_SHORT).show(); if (progressDialog.isShowing()) { progressDialog.dismiss(); } findViewById(R.id.fragment_video_detail_container) .setVisibility(View.GONE); findViewById(R.id.fragment_video_episode_container) .setVisibility(View.GONE); findViewById(R.id.iv_download_failure).setVisibility( View.VISIBLE); } @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { // if (BeibeiConstant.DEBUG) // Toast.makeText(VideoDetailActivity2.this, // "onSuccessPerfect", // Toast.LENGTH_SHORT).show(); iv_background.setClickable(true); try { if (((Activity) context).isDestroyed()) { return; } } catch (NoSuchMethodError e) { e.printStackTrace(); } if (jsonObject.getBoolean("IsPost")) { findViewById(R.id.fragment_video_detail_container) .setVisibility(View.VISIBLE); findViewById(R.id.fragment_video_episode_container) .setVisibility(View.VISIBLE); findViewById(R.id.iv_download_failure) .setVisibility(View.GONE); if (!isSetup) { update(); } Gson gson = new GsonBuilder().setFieldNamingPolicy( FieldNamingPolicy.UPPER_CAMEL_CASE) .create(); final VideoInfo videoInfo = gson .fromJson(jsonObject.getJSONObject("Data") .toString(), new TypeToken<VideoInfo>() { }.getType()); // 附加字段 if (jsonObject.optJSONObject("Extra1") != null) { if (jsonObject.optJSONObject("Extra1").optJSONObject("Attention") != null) { JSONObject obj = jsonObject.optJSONObject("Extra1").optJSONObject("Attention"); Follow attention = new Follow(); attention.setMovieName(obj.optString("Name")); attention.setMoviePicture(obj.optString("Picture")); attention.setUpdateInfo(obj.optString("UpdateInfo")); attention.setAttention(Boolean.parseBoolean(obj.optString("IsAttention"))); videoInfo.setAttention(attention); } } VideoDetailActivity2.this.videoInfo = videoInfo; JSONArray extraData = jsonObject .optJSONArray("Extra"); if (extraData != null) videoInfo.setExtraData(extraData.toString()); for (int i = 0; i < videoInfo.getResourceList().size(); i++) { if (videoInfo.getResourceList().get(i).isChecked()) { resource = videoInfo.getResourceList().get(i); } } if (videoInfo.getVideoDetailList() == null || videoInfo.getVideoDetailList().isEmpty()) { Toast.makeText(VideoDetailActivity2.this, "影片已删除", Toast.LENGTH_LONG).show(); finish(); return; } Glide.with(getApplicationContext()) .load(videoInfo.getPlayPicture()).apply(new RequestOptions().centerCrop()).into(target); if (isSetup) { int position = getIntent().getIntExtra( "playing_position", 0); boolean isFromWatchHistory = getIntent() .getBooleanExtra("isFromWatchHistory", false);// 是否从观看记录点击过来 Log.i("mResult", "是否是从观看记录点击进来的:" + isFromWatchHistory); if (isFromWatchHistory || position > 0) { mPosition = getIntent().getIntExtra("playing_position", 0); EventBus.getDefault().post(videoInfo); getUrl(videoInfo.getVideoDetailList().get(mPosition), isSetup); EventBus.getDefault().post(videoInfo.getVideoDetailList().get(mPosition)); } else {// 不是从观看记录点击过来 --跳到当前播放的集数 // position = VideoPlayUrlUtil // .getVideoDetailPosition(context, // videoInfo); EventBus.getDefault().post(videoInfo); if (StringUtils.isEmpty(detailid)) { getUrl(videoInfo.getVideoDetailList().get( position), isSetup); EventBus.getDefault().post( videoInfo.getVideoDetailList().get( position)); } else { if (videoInfo.getVideoDetailList() != null) for (int i = 0; i < videoInfo.getVideoDetailList().size(); i++) { if (detailid.equalsIgnoreCase(videoInfo.getVideoDetailList().get(i).getId())) { getUrl(videoInfo.getVideoDetailList().get( i), false); PushEpisode info = new PushEpisode(); info.setEpisodeNum(i); EventBus.getDefault().post( videoInfo.getVideoDetailList().get( i)); } } } } } else { for (int i = 0; i < videoInfo.getResourceList().size(); i++) { if (videoInfo.getResourceList().get(i).isChecked()) { resource = videoInfo.getResourceList().get(i); } } getUrl(videoInfo.getVideoDetailList().get(0), isSetup); findViewById(android.R.id.content).postDelayed( new Runnable() { @Override public void run() { EventBus.getDefault().post( videoInfo); EventBus.getDefault() .post(videoInfo .getVideoDetailList() .get(0)); } }, 200); } } else { findViewById(R.id.fragment_video_detail_container) .setVisibility(View.GONE); findViewById(R.id.fragment_video_episode_container) .setVisibility(View.GONE); findViewById(R.id.iv_download_failure) .setVisibility(View.VISIBLE); } if (progressDialog.isShowing()) { progressDialog.dismiss(); } //加载视频广告 if (!BeibeiConstant.IS_TEST) loadFullVideoAd(); } }); } private PlayUrl playUrl; private void getUrl(VideoDetailInfo info, final boolean isSetup) { SharedPreferences preferences = getSharedPreferences("user", Context.MODE_PRIVATE); String uid = preferences.getString("uid", ""); BeibeiVideoAPI.getPlayUrl(this, uid, info.getType(), videoInfo.getId(), info.getId(), resource.getId(), info.geteId(), new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { if (jsonObject.getBoolean("IsPost")) { Gson gson = new GsonBuilder().setFieldNamingPolicy( FieldNamingPolicy.UPPER_CAMEL_CASE) .create(); VideoResource resource = gson.fromJson( jsonObject.getJSONObject("Data") .getJSONObject("Resource") .toString(), new TypeToken<VideoResource>() { }.getType()); PlayUrl info = new PlayUrl(); info.setResource(resource); info.setPlayType(Integer.parseInt(jsonObject .getJSONObject("Data") .optString("PlayType"))); info.setUrl(jsonObject.getJSONObject("Data") .optString("Url")); info.setParams(jsonObject.getJSONObject("Data") .optString("Params")); playUrl = info; if (videoInfo == null) { return; } fl_ad.setVisibility(View.VISIBLE); if (!isSetup || isClick) { startPlay(); isClick = false; } } } }); } private VideoResource resource; public void onEventMainThread(VideoResource resource) { this.resource = resource; } private void update() { FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction(); Fragment videoDetailFragment = new VideoDetailFragment(); transaction.replace(R.id.fragment_video_detail_container, videoDetailFragment, "VideoDetailFragment"); transaction.commitAllowingStateLoss(); checkConfiguration(getResources().getConfiguration()); Log.i(TAG, "update"); } public static class ChangeVideoEvent { private VideoInfo videoInfo; private String tag; public VideoInfo getVideoInfo() { return videoInfo; } public void setVideoInfo(VideoInfo videoInfo) { this.videoInfo = videoInfo; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_download_failure: iNet(); break; case R.id.iv_back: if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { clickBack(); } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { finish(); } break; default: break; } } /** * video网络数据请求 */ private void iNet() { if (videoInfo.getVideoDetailList() == null || videoInfo.getVideoDetailList().isEmpty()) { getVideoDetail(this, videoInfo.getId(), videoInfo.getThirdType(), true); } else { findViewById(android.R.id.content).postDelayed(new Runnable() { @Override public void run() { EventBus.getDefault().post(videoInfo); EventBus.getDefault().post( videoInfo.getVideoDetailList().get( getIntent().getIntExtra("playing_position", 0))); } }, 200); } } private void saveWatchHistory(String from) { if (videoInfo != null) { String videoDetailId = ""; if (videoInfo.getVideoDetailList() == null || videoInfo.getVideoDetailList().size() == 0) return; if (mPosition >= videoInfo.getVideoDetailList().size()) { videoDetailId = videoInfo.getVideoDetailList().get(0) .getId(); } else { videoDetailId = videoInfo.getVideoDetailList().get(mPosition) .getId(); } String resoureID = ""; for (int i = 0; i < videoInfo.getResourceList().size(); i++) { if (videoInfo.getResourceList().get(i).isChecked()) { resoureID = videoInfo.getResourceList().get(i).getId(); } } Cursor cursor = getContentResolver().query( WatchHistoryTable.CONTENT_URI, null, WatchHistoryTable.VIDEO_DETAIL_ID + " = ? ", new String[]{videoDetailId}, null); Cursor cursor1 = getContentResolver().query( WatchHistoryTable.CONTENT_URI, null, WatchHistoryTable.VIDEO_ID + " = ? ", new String[]{videoInfo.getId()}, null); if (cursor == null || cursor1 == null) { return; } long now = System.currentTimeMillis(); if (cursor1.getCount() > 0) { getContentResolver().delete(WatchHistoryTable.CONTENT_URI, WatchHistoryTable.VIDEO_ID + " = ? ", new String[]{videoInfo.getId()}); } cursor1.close(); //添加值至数据库 ContentValues values = new ContentValues(); values.put(WatchHistoryTable.VIDEO_ID, videoInfo.getId()); values.put(WatchHistoryTable.VIDEO_DETAIL_ID, videoDetailId); values.put(WatchHistoryTable.VIDEO_THIRD_TYPE, videoInfo.getThirdType()); Gson gson = new GsonBuilder().setFieldNamingPolicy( FieldNamingPolicy.UPPER_CAMEL_CASE).create(); values.put(WatchHistoryTable.VIDEO_DETAIL, gson.toJson(videoInfo)); values.put(WatchHistoryTable.WATCH_TIME, 0); values.put(WatchHistoryTable.VIDEO_RESOURCE, from); values.put(WatchHistoryTable.VIDEO_RESOURCE_ID, resoureID); values.put(WatchHistoryTable.UPDATE_TIME, now); values.put(WatchHistoryTable.CREATE_TIME, now); //插入数据库值 try { getContentResolver().insert(WatchHistoryTable.CONTENT_URI, values); } catch (Exception e) { e.printStackTrace(); } cursor.close(); //更新数据库 getContentResolver().update(WatchHistoryTable.CONTENT_URI, values, WatchHistoryTable.VIDEO_DETAIL_ID + " = ? ", new String[]{videoDetailId}); cursor = getContentResolver().query(WatchHistoryTable.CONTENT_URI, new String[]{WatchHistoryTable._ID}, null, null, WatchHistoryTable._ID + " desc"); List<Long> longList = new ArrayList<Long>(); while (cursor.moveToNext()) { longList.add(cursor.getLong(0)); } cursor.close(); if (longList.size() > 30) { int count = getContentResolver().delete( WatchHistoryTable.CONTENT_URI, WatchHistoryTable._ID + "<?", new String[]{longList.get(30) + ""}); } } } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); if (BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isVideoDetailSplashAd()) FullVideoAdManager.getInstance().loadAd(BeibeiVideoApplication.application, null); } } BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailFragment.java
@@ -63,6 +63,9 @@ this.view = view; if (getArguments() != null) mPlayingPosition = getArguments().getInt("playing_position", 0); if(getArguments()!=null) getArguments().clear(); return view; } @@ -148,4 +151,6 @@ public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } } BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoEpisodeFragment.java
@@ -43,6 +43,7 @@ import com.weikou.beibeivideo.entity.PushEpisode; import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.ad.ExpressAdContainer; import com.weikou.beibeivideo.entity.video.FunshionPlayInfo; import com.weikou.beibeivideo.ui.common.GridVideoAdapter1; import com.weikou.beibeivideo.ui.media.VideoDetailActivity.ChangeVideoEvent; import com.weikou.beibeivideo.ui.video.IVideoClickListener; @@ -157,6 +158,8 @@ sv_detail = contentView.findViewById(R.id.sv_detail); mVideoInfo = (VideoInfo) getArguments().getSerializable("video_info"); mPlayingPosition = getArguments().getInt("playing_position"); if (getArguments() != null) getArguments().clear(); // ******简介******* video_score = contentView.findViewById(R.id.video_score); video_year = contentView.findViewById(R.id.video_year); BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoEpisodeFragment2.java
@@ -84,6 +84,8 @@ mVideoInfo = (VideoInfo) getArguments().getSerializable("video_info"); resource = (VideoResource) getArguments().getSerializable("resource"); mPlayingPosition = getArguments().getInt("playing_position"); if(getArguments()!=null) getArguments().clear(); View view = inflater.inflate(R.layout.video_episode_fragment2, container, false); gv_episode2 = (GridView) view.findViewById(R.id.gv_episode2); BuWanVideo/src/com/weikou/beibeivideo/ui/recommend/RecommendFragment.java
@@ -34,12 +34,6 @@ import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.widget.RatioLayout; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.qq.e.ads.cfg.DownAPPConfirmPolicy; import com.qq.e.ads.cfg.VideoOption; import com.qq.e.ads.nativ.ADSize; import com.qq.e.ads.nativ.NativeExpressAD; import com.qq.e.ads.nativ.NativeExpressADView; import com.qq.e.comm.util.AdError; import com.umeng.analytics.MobclickAgent; import com.viewpagerindicator.LinePageIndicator; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; @@ -52,7 +46,6 @@ import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.VideoType; import com.weikou.beibeivideo.entity.ad.ExpressAdContainer; import com.weikou.beibeivideo.entity.recommend.RecommendContent; import com.weikou.beibeivideo.ui.category.bean.HotStar; import com.weikou.beibeivideo.ui.mine.BrowserActivity; import com.weikou.beibeivideo.util.BeibeiConstant; @@ -60,6 +53,8 @@ import com.weikou.beibeivideo.util.ad.AdUtil; import com.weikou.beibeivideo.util.ad.ExpressAdManager; import com.weikou.beibeivideo.util.ui.DividerItemDecoration; import com.yeshi.ec.library_baiducpu.fragment.BaiDuNewsFragment; import com.yeshi.ec.library_baiducpu.fragment.BaiDuVideosFragment; import com.ysh.wpc.appupdate.GoReview; import com.ysh.wpc.appupdate.service.DownLoadFileService; BuWanVideo/src/com/weikou/beibeivideo/ui/video/FunshionPlayerFragment.java
@@ -1,14 +1,23 @@ package com.weikou.beibeivideo.ui.video; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.text.TextUtils; import android.support.annotation.Nullable; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.Toast; import com.fun.xm.Definition; @@ -16,23 +25,52 @@ import com.fun.xm.FSIVideoPlayer; import com.fun.xm.FSPlayer; import com.fun.xm.FSVideoReqData; import com.fun.xm.ad.FSAD; import com.fun.xm.ad.FSThirdAd; import com.fun.xm.ad.adloader.FSPreMediaAdLoader; import com.fun.xm.ad.adview.FSPreMediaView; import com.fun.xm.ad.callback.FSPreMediaAdCallBack; import com.funshion.video.logger.FSLogcat; import com.funshion.video.util.FSError; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.lcjian.library.RetainViewFragment; import com.lcjian.library.video.VideoDefinition; import com.lcjian.library.video.VideoEpisode; import com.lcjian.library.video.VideoPlayerController; import com.lcjian.library.widget.RatioLayout; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; import com.weikou.beibeivideo.BeibeiVideoAPI; import com.weikou.beibeivideo.BeibeiVideoApplication; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.Play; import com.weikou.beibeivideo.entity.PlayUrl; import com.weikou.beibeivideo.entity.VideoDetailInfo; import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.VideoResource; import com.weikou.beibeivideo.entity.video.FunshionPlayInfo; import com.weikou.beibeivideo.util.DimenUtils; import com.weikou.beibeivideo.util.FunshionConstant; import com.weikou.beibeivideo.util.UserUtil; import com.weikou.beibeivideo.util.downutil.StringUtils; import com.weikou.beibeivideo.util.ui.IPageEventListener; import org.apache.http.Header; import org.json.JSONObject; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class FunshionPlayerFragment extends RetainViewFragment implements OnClickListener { private final static String TAG = FunshionPlayerFragment.class.getName(); import de.greenrobot.event.EventBus; private final static String ACCESS_TOKEN = "Zms4NHZseSwxNjAwNDE4MDQ0LDU0MmQyNDI5ZjY5MGQwODM1OTcyYTM3MDMwOTg3MzNj"; public final static String APICODE = "fk84vly"; public class FunshionPlayerFragment extends RetainViewFragment implements OnClickListener, VideoPlayerController.IVideoPlayerListener { private final static String TAG = FunshionPlayerFragment.class.getName(); //媒体视频播放器 private MediaPlayer mVideoPlayer = new MediaPlayer(); @@ -49,7 +87,26 @@ private IPageEventListener pageEventListener; private VideoInfo mVideoInfo; private int mCurrentPosition; private PlayUrl playUrl; private boolean collected; private VideoResource videoResource; private VideoPlayerController vpc_funshion; private RatioLayout rl_container; private FrameLayout fl_container, fl_ad; //风行广告加载器 private FSPreMediaAdLoader fsPreMediaAdLoader; private FSPreMediaView mFSVideoAD; private FunshionPlayInfo playInfo; private MediaPlayer mediaPlayer; public void setPageEventListener(IPageEventListener pageEventListener) { this.pageEventListener = pageEventListener; @@ -67,33 +124,133 @@ mVideoPlayer.setOnErrorListener(mOnErrorListener); initAccessToken(); if (getArguments() != null) { String mediaId = getArguments().getString("mediaId"); String ep = getArguments().getString("ep"); String vid = getArguments().getString("vid"); mVideoSurfView.postDelayed(new Runnable() { @Override public void run() { if (StringUtils.isNullOrEmpty(vid)) playMedia(mediaId, ep); else playVideo(vid); } }, 1000); mVideoInfo = (VideoInfo) getArguments().getSerializable("videoInfo"); mCurrentPosition = getArguments().getInt("position", 0); playUrl = (PlayUrl) getArguments().getSerializable("playUrl"); collected = getArguments().getBoolean("collect", false); videoResource = (VideoResource) getArguments().getSerializable("resource"); playInfo = new FunshionPlayInfo(); playInfo.setCollected(collected); playInfo.setPlayUrl(playUrl); playInfo.setPosition(mCurrentPosition); playInfo.setVideoInfo(mVideoInfo); } vpc_funshion.setContentView(mVideoSurfView); vpc_funshion.build(getActivity()); } private void initAd() { FSAD.init(getContext().getApplicationContext(), Collections.singletonList(FunshionConstant.AD_ADP), FunshionConstant.AD_PARTENER, FunshionConstant.AD_TOKEN, FunshionConstant.AD_CHANNEL, FunshionConstant.AD_PRE_DOWNLOAD_CHANNEL); fsPreMediaAdLoader = new FSPreMediaAdLoader(getContext(), FunshionConstant.AD_CHANNEL); } private void loadAD() { String adid = "bfys_a_qt"; int width = fl_ad.getWidth(); int height = fl_ad.getHeight(); Log.i(TAG, String.format("fl_ad: width:%s height:%s", width, height)); fsPreMediaAdLoader.loadAD(adid, "", width, height, true, false, new FSPreMediaAdCallBack() { @Override public void onCreate(FSPreMediaView fsadView) { mFSVideoAD = fsadView; fl_ad.removeAllViews(); fl_ad.addView(fsadView); } @Override public void onCreateThirdAD(List<FSThirdAd> fsThirdAd) { } @Override public void onClose() { adShowFinish(); } @Override public void onADLoad() { if (null != mFSVideoAD) { mFSVideoAD.showAD(); } } @Override public void onVideoComplete() { adShowFinish(); } @Override public void onADShow() { } @Override public void onClick() { } @Override public void onAdLoadedFail(int param1Int, String param1String) { Log.v(TAG, "onAdLoadedFail param1Int:" + param1Int + " MSG:" + param1String); adShowFinish(); } }); } //广告展示完成 private void adShowFinish() { fl_ad.setVisibility(View.GONE); fl_ad.removeAllViews(); mFSVideoAD = null; //播放视频 mVideoSurfView.postDelayed(new Runnable() { @Override public void run() { EventBus.getDefault().post(playInfo); } }, 1000); } private void initView(View view) { mVideoSurfView = view.findViewById(R.id.video_view); vpc_funshion = view.findViewById(R.id.vpc_funshion); rl_container = view.findViewById(R.id.rl_container); fl_container = view.findViewById(R.id.fl_container); fl_ad = view.findViewById(R.id.fl_ad); } //创建广播接受者对象 BatteryReceiver batteryReceiver = new BatteryReceiver(); NetworkReceiver networkReceiver = new NetworkReceiver(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //注册receiver } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { initView(contentView); initPlayer(); getContext().registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); getContext().registerReceiver(networkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); initAd(); fl_ad.setVisibility(View.VISIBLE); fl_ad.post(new Runnable() { @Override public void run() { loadAD(); } }); } @Override public void onDestroyView() { super.onDestroyView(); getContext().unregisterReceiver(batteryReceiver); getContext().unregisterReceiver(networkReceiver); } @Override @@ -118,11 +275,10 @@ } //!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放 //FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID” 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken mFSVideoReqData = new FSVideoReqData(videoID, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN); mFSVideoReqData = new FSVideoReqData(videoID, new Definition(Definition.CLARITY_LOW), FunshionConstant.ACCESS_TOKEN); try { Log.d(TAG, "request"); mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE); mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, FunshionConstant.APICODE); } catch (Exception e) { e.printStackTrace(); } @@ -141,10 +297,10 @@ } //!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放 //FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID”epso 媒体分集ID 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken mFSVideoReqData = new FSVideoReqData(mediaID, epso, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN); mFSVideoReqData = new FSVideoReqData(mediaID, epso, new Definition(Definition.CLARITY_LOW), FunshionConstant.ACCESS_TOKEN); try { Log.d(TAG, "request"); mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE); mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, FunshionConstant.APICODE); } catch (Exception e) { e.printStackTrace(); } @@ -173,6 +329,24 @@ } } private String getDefinitionName(String clarity) { switch (clarity) { case "tv": case "dvd": return "标清"; case "hd": return "高清"; case "sdvd": return "超清"; default: return "标清"; } } private String videoPlayUrl = ""; FSCallback mFSCall = new FSCallback() { @@ -183,6 +357,22 @@ } FunshionPlayerFragment.this.mDefinitions = definitions; FunshionPlayerFragment.this.mCurrDefinition = currDefinition; //设置清晰度 List<VideoDefinition> vdfList = new ArrayList<>(); if (definitions != null) for (Definition df : definitions) { VideoDefinition vdf = new VideoDefinition(); vdf.setClarity(df.getStringDefinition()); vdf.setName(getDefinitionName(df.getStringDefinition())); vdfList.add(vdf); } VideoDefinition vdf = new VideoDefinition(); vdf.setClarity(mCurrDefinition.getStringDefinition()); vdf.setName(getDefinitionName(mCurrDefinition.getStringDefinition())); vpc_funshion.setDefinition(vdfList, vdf); Toast.makeText(BeibeiVideoApplication.application, "当前清晰度:" + currDefinition.getStringDefinition(), Toast.LENGTH_LONG).show(); } @@ -194,6 +384,7 @@ public void onReceiveUrl(String url) { Log.d(TAG, "onReceiveUrl" + url); try { videoPlayUrl = url; mVideoPlayer.reset(); mVideoPlayer.setDataSource(url); mVideoPlayer.prepareAsync(); @@ -213,20 +404,48 @@ } }; boolean isReady = false; int position = 0; SurfaceHolder.Callback mVideoSurfaceViewCallBack = new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { isReady = false; Log.d(TAG, "surfaceDestroyed"); if (mVideoPlayer.isPlaying()) { position = mVideoPlayer.getCurrentPosition(); Log.d(TAG, "当前播放时间:" + position); mVideoPlayer.stop(); } } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated"); isReady = true; mVideoPlayer.setDisplay(holder); if (!"".equals(videoPlayUrl) && !mVideoPlayer.isPlaying()) { try { mVideoPlayer.reset(); mVideoPlayer.setDataSource(videoPlayUrl); mVideoPlayer.prepare(); if (position > 0) mVideoPlayer.seekTo(position); position = -1; Log.d(TAG, "续播时间:" + position); } catch (IOException e) { e.printStackTrace(); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG, "surfaceChanged"); } }; @@ -235,10 +454,57 @@ @Override public void onPrepared(MediaPlayer mp) { Log.i(TAG, "onPrepared"); mediaPlayer = mp; mFunshionIVideoPlayer.onMediaPlayerPrepared(); mp.start(); autoReSize(mp); vpc_funshion.onPrepared(mp); if (position > 0) mVideoPlayer.seekTo(position); } }; private void autoReSize(MediaPlayer mp) { Log.i(TAG, "autoReSize"); final int vWidth = mp.getVideoWidth(); final int vHeight = mp.getVideoHeight(); if (vHeight == 0 || vWidth == 0) return; //获取容器的宽 fl_container.post(new Runnable() { @Override public void run() { float ratio = new BigDecimal(vHeight).divide(new BigDecimal(vWidth), 4, RoundingMode.FLOOR).floatValue(); int cwidth = fl_container.getWidth(); int cheight = fl_container.getHeight(); Log.i(TAG, String.format("MediaPlayer: width-%s height-%s", vWidth, vHeight)); ViewGroup.LayoutParams params = rl_container.getLayoutParams(); if (vHeight * cwidth > vWidth * cheight) { Log.i(TAG, "宽自适应"); params.height = fl_container.getHeight(); params.width = (int) (params.height / ratio); } else { Log.i(TAG, "高自适应"); params.width = fl_container.getWidth(); params.height = (int) (params.width * ratio); } rl_container.setLayoutParams(params); rl_container.setRatio(ratio); Log.i(TAG, String.format("Ratio: %s", ratio)); mVideoSurfView.post(new Runnable() { @Override public void run() { Log.i(TAG, String.format("mVideoSurfView: width-%s height-%s", mVideoSurfView.getWidth(), mVideoSurfView.getHeight())); } }); } }); } MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() { @@ -262,6 +528,8 @@ mFunshionIVideoPlayer.onActivityDestroy(); mFunshionIVideoPlayer.release(); } } @Override @@ -274,5 +542,171 @@ super.onStop(); if (mVideoPlayer != null && mVideoPlayer.isPlaying()) mVideoPlayer.pause(); } @Override public void onResume() { super.onResume(); if (mFunshionIVideoPlayer != null) mFunshionIVideoPlayer.onActivityResume(); EventBus.getDefault().register(this); } @Override public void onPause() { super.onPause(); if (mVideoPlayer.isPlaying()) mVideoPlayer.pause(); if (mFunshionIVideoPlayer != null) mFunshionIVideoPlayer.onActivityPause(); EventBus.getDefault().unregister(this); } public void requestLayout() { Log.i(TAG, "requestLayout"); if (mediaPlayer != null) autoReSize(mediaPlayer); else autoReSize(mVideoPlayer); vpc_funshion.changeOrien(getActivity().getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } //电池电量监控 class BatteryReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //判断它是否是为电量变化的Broadcast Action if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {//电量变化 //获取当前电量 int level = intent.getIntExtra("level", 0); //电量的总刻度 int scale = intent.getIntExtra("scale", 100); //把它转成百分比 if (vpc_funshion != null) vpc_funshion.setBattery((level * 100) / scale); } } } public class NetworkReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); vpc_funshion.setNetworkInfo(networkInfo, false); } } } public void onEventMainThread(FunshionPlayInfo info) { List<VideoEpisode> episodes = new ArrayList<>(); for (int i = 0; i < info.getVideoInfo().getVideoDetailList().size(); i++) { VideoDetailInfo detail = info.getVideoInfo().getVideoDetailList().get(i); VideoEpisode es = new VideoEpisode(); es.setId(detail.getId()); es.setTag(detail.getTag()); es.setVideoId(info.getVideoInfo().getId()); episodes.add(es); } mCurrentPosition = info.getPosition(); vpc_funshion.setContentView(fl_container).setVideoInfo(episodes, info.getVideoInfo().getName(), info.getPlayUrl().getUrl(), info.getPosition()).setVideoPlayerListener(this).build(getActivity(), FunshionPlayerFragment.this); //播放视频 // playVideo(info.getVideoInfo().getVideoDetailList().get(info.getPosition()).getId()); playMedia("99989", (info.getPosition() + 1) + ""); } //监听 @Override public void onNext() { if (mCurrentPosition >= mVideoInfo.getVideoDetailList().size() - 1) { Toast.makeText(getContext(), "没有下一集了", Toast.LENGTH_SHORT).show(); return; } selectEpisode(mCurrentPosition + 1, null); } @Override public void onBack() {//返回 if (getActivity().getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else {//结束 getActivity().finish(); } } @Override public void onVideoPause() { } @Override public void onVideoPlay() { } @Override public void changeDefinition(int p, VideoDefinition definition) { Toast.makeText(BeibeiVideoApplication.application, "正在切换清晰度", Toast.LENGTH_SHORT).show(); if (mVideoPlayer != null && mVideoPlayer.isPlaying()) position = mVideoPlayer.getCurrentPosition(); mFunshionIVideoPlayer.changeDefinition(mFSVideoReqData.getUniqueID(), mDefinitions.get(p)); } @Override public void selectEpisode(int p, VideoEpisode episode) { //选集 final FunshionPlayInfo playInfo = new FunshionPlayInfo(); playInfo.setVideoInfo(mVideoInfo); playInfo.setPosition(p); playInfo.setCollected(collected); VideoDetailInfo detailInfo = mVideoInfo.getVideoDetailList().get(p); String uid = UserUtil.getUid(BeibeiVideoApplication.application); BeibeiVideoAPI.getPlayUrl(BeibeiVideoApplication.application, uid, detailInfo.getType(), mVideoInfo.getId(), detailInfo.getId(), videoResource.getId(), detailInfo.geteId(), new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { if (jsonObject.getBoolean("IsPost")) { Gson gson = new GsonBuilder().setFieldNamingPolicy( FieldNamingPolicy.UPPER_CAMEL_CASE) .create(); VideoResource resource = gson.fromJson( jsonObject.getJSONObject("Data") .getJSONObject("Resource") .toString(), new TypeToken<VideoResource>() { }.getType()); PlayUrl info = new PlayUrl(); info.setResource(resource); info.setPlayType(Integer.parseInt(jsonObject .getJSONObject("Data") .optString("PlayType"))); info.setUrl(jsonObject.getJSONObject("Data") .optString("Url")); info.setParams(jsonObject.getJSONObject("Data") .optString("Params")); playInfo.setPlayUrl(info); EventBus.getDefault().post(playInfo); } } }); } @Override public void collect(boolean collect) { } } BuWanVideo/src/com/weikou/beibeivideo/ui/video/SearchResultAdapter.java
@@ -20,6 +20,7 @@ import com.weikou.beibeivideo.entity.ad.ExpressAdContainer; import com.weikou.beibeivideo.entity.video.VideoContent; import com.weikou.beibeivideo.ui.media.VideoDetailActivity; import com.weikou.beibeivideo.ui.media.VideoDetailActivity2; import com.weikou.beibeivideo.util.ad.ExpressAdManager; import com.weikou.beibeivideo.R; @@ -286,7 +287,7 @@ private void myClick(VideoInfo info, final View v, int p) { Intent intent = new Intent(v.getContext(), VideoDetailActivity.class); Intent intent = new Intent(v.getContext(), VideoDetailActivity2.class); intent.putExtra("video_info", info); if (p > 0) intent.putExtra("playing_position", p); BuWanVideo/src/com/weikou/beibeivideo/util/BeibeiConstant.java
@@ -4,17 +4,17 @@ public class BeibeiConstant { public final static boolean IS_TEST = false; public final static boolean IS_TEST = true; //首页推荐第一个广告 public final static boolean AD_SETTING_RECOMMEND_FIRST = true; //是否有开屏广告 public final static boolean AD_SETTING_KAIPIN = true; public static final String USER_AGREEMENT = "http://bwapp.flqapp.com:8089/BuWan/api_control_ios.jsp"; public static final String PRIVACY_POLICY = "http://bwapp.flqapp.com:8089/BuWan/user_protocol.jsp"; public static final String USER_AGREEMENT = "http://ysdq.yeshitv.com:8089/BuWan/api_control_ios.jsp"; public static final String PRIVACY_POLICY = "http://ysdq.yeshitv.com:8089/BuWan/user_protocol.jsp"; public static final String HOST = "http://bwapp.flqapp.com:8089";//正式上线版本 public static final String HOST = "http://api.ysdq.yeshitv.com:8089";//正式上线版本 public static final String BAICHUAN_APPKEY = "24980167"; BuWanVideo/src/com/weikou/beibeivideo/util/ExitDialog.java
@@ -104,7 +104,6 @@ final ExitDialog dialog = new ExitDialog(context, R.style.Dialog); View layout = inflater.inflate(R.layout.item_exit, null); fl_advertisement = layout.findViewById(R.id.fl_advertisement); loadAd(); dialog.addContentView(layout, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); // set the confirm button @@ -137,7 +136,7 @@ private NativeExpressAD nativeExpressAD; // 1.加载广告,先设置加载上下文环境和条件 private void loadAd() { private void loadAd(boolean show) { expressAdManager.loadAppExitAd(new ExpressAdManager.IAdLoadListener() { @Override @@ -148,6 +147,15 @@ @Override public void onRenderSuccess(List<ExpressAdContainer> adList) { expressAdContainer = adList.get(0); if (show) { ExpressAdManager.bindCloseListener(context, expressAdContainer, new IAdEventListener() { @Override public void closeAd(ExpressAdContainer ad) { fl_advertisement.removeAllViews(); } }); ExpressAdManager.fillAd(expressAdContainer, fl_advertisement); } } @Override @@ -164,20 +172,11 @@ } public void showAd() { if (expressAdContainer != null) { ExpressAdManager.bindCloseListener(context,expressAdContainer,new IAdEventListener(){ @Override public void closeAd(ExpressAdContainer ad) { fl_advertisement.removeAllViews(); } }); ExpressAdManager.fillAd(expressAdContainer, fl_advertisement); } loadAd(true); } public void refreshAd() { loadAd(); loadAd(false); } } BuWanVideo/src/com/weikou/beibeivideo/util/FunshionConstant.java
New file @@ -0,0 +1,12 @@ package com.weikou.beibeivideo.util; public class FunshionConstant { public static String ACCESS_TOKEN = "Zms4NHZseSwxNjAwODQ5NjI3LDU2ZjNhZDJjNTE5YTBiMDE5YzU3OTAxZmE0YjgyMjVi"; public final static String APICODE = "fk84vly"; public final static String AD_PARTENER = "bfys"; public final static String AD_ADP = "bfys_a_qt"; public final static String AD_TOKEN = "0104c93918044fe79f8a6ff2af6827b0"; public final static String AD_CHANNEL = "bfys_ad"; public final static String AD_PRE_DOWNLOAD_CHANNEL = "2001026"; } BuWanVideo/src/com/weikou/beibeivideo/util/ad/FullVideoAdManager.java
@@ -31,7 +31,7 @@ AdSlot adSlot = new AdSlot.Builder() .setCodeId("945393854") .setSupportDeepLink(true) .setExpressViewAcceptedSize(w,h) .setExpressViewAcceptedSize(w, h) .setOrientation(TTAdConstant.VERTICAL) .build(); TTAdManager ttAdManager = TTAdManagerHolder.get(); @@ -71,7 +71,7 @@ }); if (ad != null && adListener != null) adListener.onSuccess(); adListener.onSuccess(ad); } @Override @@ -102,8 +102,8 @@ return mttFullVideoAd != null; } interface IFullVideoAdListener { public void onSuccess(); public interface IFullVideoAdListener { public void onSuccess(TTFullScreenVideoAd ad); } } library-BaiduCPU/.gitignore
New file @@ -0,0 +1 @@ /build library-BaiduCPU/build.gradle
New file @@ -0,0 +1,33 @@ apply plugin: 'com.android.library' android { compileSdkVersion 30 defaultConfig { minSdkVersion 17 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) api files("libs/Baidu_MobAds_SDK-release.aar") implementation project(path: ':library-mine') implementation project(path: ':library-ViewPagerIndicator') testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } library-BaiduCPU/consumer-rules.pro
library-BaiduCPU/libs/Baidu_MobAds_SDK-release.aarBinary files differ
library-BaiduCPU/proguard-rules.pro
New file @@ -0,0 +1,21 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile library-BaiduCPU/src/androidTest/java/com/yeshi/ec/library_baiducpu/ExampleInstrumentedTest.javacopy from library-Funshion/src/androidTest/java/com/yeshi/ec/library_funshion/ExampleInstrumentedTest.java copy to library-BaiduCPU/src/androidTest/java/com/yeshi/ec/library_baiducpu/ExampleInstrumentedTest.java
File was copied from library-Funshion/src/androidTest/java/com/yeshi/ec/library_funshion/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ package com.yeshi.ec.library_funshion; package com.yeshi.ec.library_baiducpu; import android.content.Context; import android.support.test.InstrumentationRegistry; @@ -20,6 +20,6 @@ public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); assertEquals("com.yeshi.ec.library_funshion.test", appContext.getPackageName()); assertEquals("com.yeshi.ec.library_baiducpu.test", appContext.getPackageName()); } } library-BaiduCPU/src/main/AndroidManifest.xml
New file @@ -0,0 +1,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yeshi.ec.library_baiducpu"> / </manifest> library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/entity/NativeCPUView.java
New file @@ -0,0 +1,292 @@ package com.yeshi.ec.library_baiducpu.entity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.androidquery.AQuery; import com.androidquery.callback.AjaxStatus; import com.androidquery.callback.BitmapAjaxCallback; import com.baidu.mobads.nativecpu.IBasicCPUData; import com.bumptech.glide.Glide; import com.yeshi.ec.library_baiducpu.R; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; public class NativeCPUView extends RelativeLayout { private final static long TIME_SECOND_YEAR = 365 * 24 * 60 * 60; private final static long TIME_SECOND_MONTH = 30 * 24 * 60 * 60; private final static long TIME_SECOND_DAY = 24 * 60 * 60; private final static long TIME_SECOND_HOUR = 60 * 60; private final static long TIME_SECOND_MINUTE = 60; private View mContainer; private TextView mTopTextView; private ImageView mImageLeft; private ImageView mImageMid; private ImageView mImageRight; private ImageView mImageSingleBig; private ImageView mBtnPlayVideo; private View mBottomContainer; private TextView mBottomFirstView; private TextView mBottomSecondView; private ImageView mDislikeButton; private View mAppDownloadContainer; private TextView mAppName; private TextView mAppVersion; private TextView mAppPrivacyLink; private TextView mAppPermissionLink; private TextView mAppPublisher; private String mType; // news,image,video,ad private String mTitle; private String mLeftImageUrl; private String mMidImageUrl; private String mRightImageUrl; private String mBottomFirstText; private String mBottomSecondText; public NativeCPUView(Context context) { this(context, null); } public NativeCPUView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public NativeCPUView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context, attrs); } private void initView(Context context, AttributeSet attrs) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mContainer = inflater.inflate(R.layout.native_cpu_view, this, true); mTopTextView = mContainer.findViewById(R.id.top_text_view); mImageLeft = mContainer.findViewById(R.id.image_left); mImageMid = mContainer.findViewById(R.id.image_mid); mImageRight = mContainer.findViewById(R.id.image_right); mImageSingleBig = mContainer.findViewById(R.id.image_big_pic); mBtnPlayVideo = mContainer.findViewById(R.id.video_play); mBottomContainer = mContainer.findViewById(R.id.bottom_container); mBottomFirstView = mContainer.findViewById(R.id.bottom_first_text); mBottomSecondView = mContainer.findViewById(R.id.bottom_second_text); mDislikeButton = mContainer.findViewById(R.id.dislike_icon); mAppDownloadContainer = mContainer.findViewById(R.id.app_download_container); mAppName = mContainer.findViewById(R.id.app_name); mAppVersion = mContainer.findViewById(R.id.app_version); mAppPrivacyLink = mContainer.findViewById(R.id.privacy_link); mAppPermissionLink = mContainer.findViewById(R.id.permission_link); mAppPublisher = mContainer.findViewById(R.id.app_publisher); } public void setItemData(final IBasicCPUData data, AQuery aq) { if (data != null) { mType = data.getType(); // news,image,video,ad mTitle = data.getTitle(); readImageUrls(data); if ("ad".equalsIgnoreCase(mType)) { // 广告类型 mBottomFirstText = data.getBrandName(); if (TextUtils.isEmpty(mBottomFirstText)) { mBottomFirstText = "精选推荐"; } mBottomSecondText = "广告"; // 下载广告 mBottomContainer.setVisibility(data.isDownloadApp() ? GONE : VISIBLE); mAppDownloadContainer.setVisibility(data.isDownloadApp() ? VISIBLE : GONE); mAppName.setText(data.getBrandName()); mAppVersion.setText("版本:" + data.getAppVersion()); mAppPublisher.setText(data.getAppPublisher()); mAppPrivacyLink.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // show app privacy startActivityForUrl(data.getAppPrivacyUrl()); } }); mAppPermissionLink.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // show app permission list startActivityForUrl(data.getAppPermissionUrl()); } }); } else { mAppDownloadContainer.setVisibility(GONE); mBottomContainer.setVisibility(VISIBLE); // 内容类型 if ("news".equalsIgnoreCase(mType)) { // 资讯 mBottomFirstText = data.getAuthor(); mBottomSecondText = getTransformedDateString(data.getUpdateTime()); } else if ("image".equalsIgnoreCase(mType)) { // 图集 mBottomFirstText = data.getAuthor(); mBottomSecondText = getTransformedDateString(data.getUpdateTime()); } else if ("video".equalsIgnoreCase(mType)) { // 视频 mBottomFirstText = data.getAuthor(); mBottomSecondText = getFormatPlayCounts(data.getPlayCounts()); } } bindView(aq); } } private void readImageUrls(IBasicCPUData data) { List<String> imageList = data.getImageUrls(); List<String> smallImageList = data.getSmallImageUrls(); if (smallImageList != null && smallImageList.size() > 2) { // 三图 mLeftImageUrl = smallImageList.get(0); mMidImageUrl = smallImageList.get(1); mRightImageUrl = smallImageList.get(2); } else if (imageList != null && imageList.size() > 0) { // 大图 mLeftImageUrl = imageList.get(0); mMidImageUrl = ""; mRightImageUrl = ""; } else { // 视频缩略图 mLeftImageUrl = data.getThumbUrl(); mMidImageUrl = ""; mRightImageUrl = ""; } } private void bindView(AQuery aq) { if (aq != null) { boolean isAd = "ad".equalsIgnoreCase(mType); boolean isVideo = "video".equalsIgnoreCase(mType); bindData2View(mTopTextView, aq, mTitle, 1); if (!TextUtils.isEmpty(mMidImageUrl) && !TextUtils.isEmpty(mRightImageUrl)) { // 三图 bindData2View(mImageLeft, aq, mLeftImageUrl, 2); bindData2View(mImageMid, aq, mMidImageUrl, 2); bindData2View(mImageRight, aq, mRightImageUrl, 2); mImageSingleBig.setVisibility(GONE); } else { // 大图 bindData2View(mImageSingleBig, aq, mLeftImageUrl, 2); mImageLeft.setVisibility(GONE); mImageMid.setVisibility(GONE); mImageRight.setVisibility(GONE); } mBtnPlayVideo.setVisibility(isVideo ? VISIBLE : GONE); bindData2View(mBottomFirstView, aq, mBottomFirstText, 1); bindData2View(mBottomSecondView, aq, mBottomSecondText, 1); // mDislikeButton.setVisibility(isAd ? INVISIBLE : VISIBLE); } } /** * @param view * @param aq * @param data * @param dataType 数据类型:1-字符串;2-图片URL; */ private void bindData2View(View view, AQuery aq, String data, int dataType) { if (TextUtils.isEmpty(data)) { view.setVisibility(View.GONE); } else { view.setVisibility(View.VISIBLE); if (dataType == 1) { aq.id(view).text(data); } else if (dataType == 2) { // 通过callback的方式渲染ImageView,避免AQuery直接渲染后将View.GONE的控件显示出来 // aq.id(view).image(data, false, true, 0, 0, // new BitmapAjaxCallback() { // @Override // protected void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status) { // if (iv.getVisibility() == View.VISIBLE) { // iv.setImageBitmap(bm); // } // } // }); Glide.with(view.getContext()).load(data).transition(withCrossFade()).into( aq.id(view).getImageView()); } } } private String getTransformedDateString(String updateTime) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); Date date = simpleDateFormat.parse(updateTime); if (date == null) { return updateTime; } long updateTimeMilli = date.getTime(); long timeNowMilli = System.currentTimeMillis(); if (timeNowMilli < updateTimeMilli) { return updateTime; } else { long gapSecond = (timeNowMilli - updateTimeMilli) / 1000; if (gapSecond < TIME_SECOND_MINUTE) { return "刚刚"; } else if (gapSecond < TIME_SECOND_HOUR) { int minute = (int) (gapSecond / TIME_SECOND_MINUTE); return minute + "分钟前"; } else if (gapSecond < TIME_SECOND_DAY) { int hour = (int) (gapSecond / TIME_SECOND_HOUR); return hour + "小时前"; } else if (gapSecond < TIME_SECOND_MONTH) { int day = (int) (gapSecond / TIME_SECOND_DAY); return day + "天前"; } else if (gapSecond < TIME_SECOND_YEAR) { int month = (int) (gapSecond / TIME_SECOND_MONTH); return month + "月前"; } else { int year = (int) (gapSecond / TIME_SECOND_YEAR); return year + "年前"; } } } catch (Throwable tr) { return updateTime; } } private String getFormatPlayCounts(int playCounts) { StringBuilder sb = new StringBuilder("播放: "); if (playCounts < 0) { sb.append(0); } else if (playCounts < 10000) { sb.append(playCounts); } else { sb.append(playCounts / 10000); int remain = playCounts % 10000; if (remain > 0) { sb.append(".").append(remain / 1000); } sb.append("万"); } return sb.toString(); } private void startActivityForUrl(String url) { try { Intent intent = new Intent(); intent.setData(Uri.parse(url)); intent.setAction(Intent.ACTION_VIEW); getContext().startActivity(intent); } catch (Throwable tr) { Log.e("NativeCPUView", "Show url error: " + tr.getMessage()); } } } library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/entity/SpinnerItem.java
New file @@ -0,0 +1,36 @@ package com.yeshi.ec.library_baiducpu.entity; import java.io.Serializable; public class SpinnerItem implements Serializable { /** * 名称 */ String mName; /** * id */ int mId; public SpinnerItem(String name, int id) { mName = name; mId = id; } public String getmName() { return mName; } public void setmName(String mName) { this.mName = mName; } public int getmId() { return mId; } public void setmId(int mId) { this.mId = mId; } } library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuNewsContentFragment.java
New file @@ -0,0 +1,298 @@ package com.yeshi.ec.library_baiducpu.fragment; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; import com.androidquery.AQuery; import com.baidu.mobad.feeds.RequestParameters; import com.baidu.mobads.nativecpu.CPUAdRequest; import com.baidu.mobads.nativecpu.CpuLpFontSize; import com.baidu.mobads.nativecpu.IBasicCPUData; import com.baidu.mobads.nativecpu.NativeCPUManager; import com.lcjian.library.RetainViewFragment; import com.lcjian.library.util.common.DimenUtils; import com.ut.device.UTDevice; import com.yeshi.ec.library_baiducpu.R; import com.yeshi.ec.library_baiducpu.entity.NativeCPUView; import com.yeshi.ec.library_baiducpu.entity.SpinnerItem; import java.util.ArrayList; import java.util.List; /** * 百度资讯 */ public class BaiDuNewsContentFragment extends RetainViewFragment implements NativeCPUManager.CPUAdListener { private final String YOUR_APP_ID = "be796ac7"; // 双引号中填写自己的APPSID private List<IBasicCPUData> nrAdList = new ArrayList<IBasicCPUData>(); private NativeCPUManager mCpuManager; private int mChannelId = 1001; // 默认娱乐频道 private SwipeRefreshLayout srl_news; private RecyclerView rv_news; private int currentPage = 1;//目前的界面 private boolean isLoad; private MyAdapter adapter; private final static String TAG = "BaiDuNewsContent"; private TextView footerView; public static BaiDuNewsContentFragment newInstance(SpinnerItem spinnerItem) { BaiDuNewsContentFragment fragment = new BaiDuNewsContentFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("item", spinnerItem); fragment.setArguments(bundle); return fragment; } @Override public int getContentResource() { return R.layout.fragment_baidu_news_content; } private void initView(View contentView) { srl_news = contentView.findViewById(R.id.srl_news); rv_news = contentView.findViewById(R.id.rv_news); rv_news.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager(); int first = manager.findFirstVisibleItemPosition(); int last = manager.findLastVisibleItemPosition(); int total = manager.getItemCount(); if (newState == RecyclerView.SCROLL_STATE_IDLE) { if ((!isLoad) && last == total - 1 && nrAdList.size() < 1000) { if (nrAdList != null && nrAdList.size() > 0 && !srl_news.isRefreshing()) {//列表中有数据才能加载更多 currentPage++; isLoad = true; if (nrAdList != null && nrAdList.size() > 0) footerView.setVisibility(View.VISIBLE); loadAd(currentPage); } } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, final int dy) { super.onScrolled(recyclerView, dx, dy); } }); footerView = new TextView(getContext()); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); footerView.setLayoutParams(params); footerView.setText("努力加载中..."); footerView.setTextColor(Color.WHITE); int padding = DimenUtils.dip2px(getContext(), 10); footerView.setPadding(padding, padding, padding, padding); footerView.setGravity(Gravity.CENTER); footerView.setTextSize(12); } private void initData() { Bundle bundle = getArguments(); SpinnerItem item = (SpinnerItem) bundle.getSerializable("item"); bundle.clear(); mChannelId = item.getmId(); mCpuManager = new NativeCPUManager(getContext(), YOUR_APP_ID, this); /** * 可选设置: 设置暗黑模式或调整内容详情页的字体大小 */ mCpuManager.setLpFontSize(CpuLpFontSize.SMALL); mCpuManager.setLpDarkMode(true); adapter = new MyAdapter(getContext()); rv_news.setAdapter(adapter); rv_news.setLayoutManager(new LinearLayoutManager(getContext())); srl_news.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { currentPage = 1; loadAd(currentPage); } }); adapter.setFooterView(footerView); srl_news.setRefreshing(true); loadAd(currentPage); } private void loadAd(int page) { /** * Step2:构建请求参数 */ CPUAdRequest.Builder builder = new CPUAdRequest.Builder(); builder.setDownloadAppConfirmPolicy(RequestParameters.DOWNLOAD_APP_CONFIRM_ONLY_MOBILE); builder.setCustomUserId(UTDevice.getUtdid(getContext())); // 当无法获得设备IMEI,OAID,ANDROIDID信息时,通过此字段获取内容 + 广告 mCpuManager.setRequestParameter(builder.build()); mCpuManager.setRequestTimeoutMillis(10 * 1000); // 如果不设置,则默认5s请求超时 /** * Step3:调用请求接口,请求广告 */ mCpuManager.loadAd(page, mChannelId, true); Log.i(TAG, "page:" + page); } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { initView(contentView); initData(); } private void onLoadFinish() { isLoad = false; srl_news.setRefreshing(false); footerView.setVisibility(View.GONE); } @Override public void onAdLoaded(List<IBasicCPUData> list) { onLoadFinish(); int start = nrAdList.size(); if (currentPage == 1) { nrAdList.clear(); nrAdList.addAll(list); adapter.notifyDataSetChanged(); } else { nrAdList.addAll(list); int count = list.size(); if (count > 0) { adapter.notifyItemRangeInserted(start, count); } } } @Override public void onAdError(String s, int i) { onLoadFinish(); } @Override public void onNoAd(String s, int i) { onLoadFinish(); } @Override public void onAdClick() { } @Override public void onVideoDownloadSuccess() { } @Override public void onVideoDownloadFailed() { } @Override public void onAdStatusChanged(String s) { } class MyAdapter extends RecyclerView.Adapter { private LayoutInflater inflater; private AQuery aq; private View footerView; private final int TYPE_FOOTER = 1; private final int TYPE_CONTENT = 2; public MyAdapter(Context context) { inflater = LayoutInflater.from(getContext()); aq = new AQuery(context); } public void setFooterView(View footerView) { this.footerView = footerView; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == TYPE_CONTENT) return new ViewHolder(inflater.inflate(R.layout.item_baidu_news, null, false)); else return new FooterViewHolder(footerView); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolder) { ViewHolder viewHolder = (ViewHolder) holder; final IBasicCPUData nrAd = nrAdList.get(position); final NativeCPUView cpuView = new NativeCPUView(getContext()); if (cpuView.getParent() != null) { ((ViewGroup) cpuView.getParent()).removeView(cpuView); } cpuView.setItemData(nrAd, aq); viewHolder.rl_container.removeAllViews(); viewHolder.rl_container.addView(cpuView); nrAd.onImpression(viewHolder.view); viewHolder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { nrAd.handleClick(view); } }); } } @Override public int getItemCount() { int count = nrAdList.size(); if (footerView != null) count++; return count; } @Override public int getItemViewType(int position) { if (position >= nrAdList.size()) return TYPE_FOOTER; else return TYPE_CONTENT; } class ViewHolder extends RecyclerView.ViewHolder { RelativeLayout rl_container; View view; public ViewHolder(View itemView) { super(itemView); view = itemView; rl_container = itemView.findViewById(R.id.native_outer_view); } } class FooterViewHolder extends RecyclerView.ViewHolder { public FooterViewHolder(View itemView) { super(itemView); } } } } library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuNewsFragment.java
New file @@ -0,0 +1,130 @@ package com.yeshi.ec.library_baiducpu.fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.FrameLayout; import com.baidu.mobad.feeds.RequestParameters; import com.baidu.mobads.nativecpu.CPUAdRequest; import com.baidu.mobads.nativecpu.CpuLpFontSize; import com.baidu.mobads.nativecpu.IBasicCPUData; import com.baidu.mobads.nativecpu.NativeCPUManager; import com.lcjian.library.RetainViewFragment; import com.viewpagerindicator.FoundPageIndicator; import com.viewpagerindicator.LinePageIndicator; import com.viewpagerindicator.MainTabPageIndicator; import com.viewpagerindicator.TabPageIndicator; import com.viewpagerindicator.TitlePageIndicator; import com.yeshi.ec.library_baiducpu.R; import com.yeshi.ec.library_baiducpu.entity.SpinnerItem; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * 百度资讯 */ public class BaiDuNewsFragment extends RetainViewFragment { private FrameLayout fl_indicator; private ViewPager viewPager; private ContentAdapter contentAdapter; private List<SpinnerItem> itemList = new ArrayList<>(); private TabPageIndicator indicator; @Override public int getContentResource() { return R.layout.fragment_baidu_news_root; } private void initView(View contentView) { fl_indicator = contentView.findViewById(R.id.fl_indicator); viewPager = contentView.findViewById(R.id.vp_news); } private void initData() { itemList.add(new SpinnerItem("推荐频道", 1022)); itemList.add(new SpinnerItem("小品", 1062)); itemList.add(new SpinnerItem("娱乐频道", 1001)); itemList.add(new SpinnerItem("热点频道", 1021)); itemList.add(new SpinnerItem("热讯频道", 1081)); itemList.add(new SpinnerItem("健康频道", 1043)); itemList.add(new SpinnerItem("搞笑频道", 1025)); itemList.add(new SpinnerItem("母婴频道", 1042)); itemList.add(new SpinnerItem("时尚频道", 1009)); itemList.add(new SpinnerItem("汽车频道", 1007)); itemList.add(new SpinnerItem("军事频道", 1012)); itemList.add(new SpinnerItem("生活频道", 1035)); itemList.add(new SpinnerItem("游戏频道", 1040)); itemList.add(new SpinnerItem("体育频道", 1002)); itemList.add(new SpinnerItem("女人频道", 1034)); itemList.add(new SpinnerItem("财经频道", 1006)); itemList.add(new SpinnerItem("科技频道", 1013)); itemList.add(new SpinnerItem("动漫频道", 1055)); itemList.add(new SpinnerItem("文化频道", 1036)); itemList.add(new SpinnerItem("手机频道", 1005)); itemList.add(new SpinnerItem("房产频道", 1008)); itemList.add(new SpinnerItem("本地频道", 1080)); itemList.add(new SpinnerItem("广场舞", 1088)); itemList.add(new SpinnerItem("猎奇", 1089)); itemList.add(new SpinnerItem("美女", 1024)); itemList.add(new SpinnerItem("热榜搜索", 1090)); itemList.add(new SpinnerItem("看点频道", 1047)); contentAdapter = new ContentAdapter( getChildFragmentManager(), itemList); viewPager.setAdapter(contentAdapter); indicator = new TabPageIndicator( viewPager.getContext()); indicator.setViewPager(viewPager, 0); fl_indicator.addView(indicator); } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { initView(contentView); initData(); } class ContentAdapter extends FragmentStatePagerAdapter { private FragmentManager fm; private List<SpinnerItem> mlist; public ContentAdapter(FragmentManager fm, List<SpinnerItem> list) { super(fm); this.fm = fm; this.mlist = list; } @Override public Fragment getItem(int position) { Fragment fragment = BaiDuNewsContentFragment.newInstance(mlist.get(position)); return fragment; } @Override public int getCount() { return mlist.size(); } @Nullable @Override public CharSequence getPageTitle(int position) { return mlist.get(position).getmName(); } } } library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuShortVideosFragment.java
New file @@ -0,0 +1,60 @@ package com.yeshi.ec.library_baiducpu.fragment; import android.os.Bundle; import android.view.View; import android.widget.RelativeLayout; import android.widget.Toast; import com.baidu.mobads.CpuAdView; import com.lcjian.library.RetainViewFragment; import com.yeshi.ec.library_baiducpu.R; import com.yeshi.ec.library_baiducpu.entity.SpinnerItem; /** * 百度小视频 */ public class BaiDuShortVideosFragment extends RetainViewFragment { private static final String APP_ID = "be796ac7"; private static int CHANNEL_ID = 1085; // 小视频频道 private RelativeLayout mVideoContainer; private CpuAdView mCpuView; public static BaiDuShortVideosFragment newInstance(SpinnerItem spinnerItem) { BaiDuShortVideosFragment fragment = new BaiDuShortVideosFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("item", spinnerItem); fragment.setArguments(bundle); return fragment; } private void initView(View view) { mVideoContainer = view.findViewById(R.id.cpu_video_container); } @Override public int getContentResource() { return R.layout.fragment_baidu_short_video; } private void fetchCPUVideo() { Bundle bundle = getArguments(); SpinnerItem item = (SpinnerItem) bundle.getSerializable("item"); bundle.clear(); CHANNEL_ID = item.getmId(); // 小视频频道的内容 mCpuView = new CpuAdView(getContext(), APP_ID, CHANNEL_ID); RelativeLayout.LayoutParams reLayoutParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); reLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); mVideoContainer.addView(mCpuView, reLayoutParams); Toast.makeText(getContext(), "加载AppSid:" + APP_ID, Toast.LENGTH_SHORT).show(); } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { initView(contentView); fetchCPUVideo(); } } library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuVideosFragment.java
New file @@ -0,0 +1,101 @@ package com.yeshi.ec.library_baiducpu.fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.FrameLayout; import com.lcjian.library.RetainViewFragment; import com.viewpagerindicator.MainTabPageIndicator; import com.yeshi.ec.library_baiducpu.R; import com.yeshi.ec.library_baiducpu.entity.SpinnerItem; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * 百度资讯 */ public class BaiDuVideosFragment extends RetainViewFragment { private FrameLayout fl_indicator; private ViewPager viewPager; private ContentAdapter contentAdapter; private List<SpinnerItem> itemList = new ArrayList<>(); private MainTabPageIndicator indicator; @Override public int getContentResource() { return R.layout.fragment_baidu_news_root; } private void initView(View contentView) { fl_indicator = contentView.findViewById(R.id.fl_indicator); viewPager = contentView.findViewById(R.id.vp_news); } private void initData() { itemList.add(new SpinnerItem("小视频", 1085)); itemList.add(new SpinnerItem("萌萌哒", 1065)); itemList.add(new SpinnerItem("小品", 1062)); itemList.add(new SpinnerItem("音乐", 1058)); itemList.add(new SpinnerItem("搞笑", 1059)); itemList.add(new SpinnerItem("影视", 1060)); itemList.add(new SpinnerItem("游戏", 1067)); itemList.add(new SpinnerItem("生活", 1066)); itemList.add(new SpinnerItem("观天下", 1064)); itemList.add(new SpinnerItem("娱乐", 1061)); itemList.add(new SpinnerItem("社会", 1063)); contentAdapter = new ContentAdapter( getChildFragmentManager(), itemList); viewPager.setAdapter(contentAdapter); indicator = new MainTabPageIndicator( viewPager.getContext()); indicator.setViewPager(viewPager, 0); fl_indicator.addView(indicator); } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { initView(contentView); initData(); } class ContentAdapter extends FragmentStatePagerAdapter { private FragmentManager fm; private List<SpinnerItem> mlist; public ContentAdapter(FragmentManager fm, List<SpinnerItem> list) { super(fm); this.fm = fm; this.mlist = list; } @Override public Fragment getItem(int position) { Fragment fragment = BaiDuShortVideosFragment.newInstance(mlist.get(position)); return fragment; } @Override public int getCount() { return mlist.size(); } @Nullable @Override public CharSequence getPageTitle(int position) { return mlist.get(position).getmName(); } } } library-BaiduCPU/src/main/res/drawable-xhdpi/mob_adicon_2x.png
library-BaiduCPU/src/main/res/drawable-xhdpi/new_bg_logo.png
library-BaiduCPU/src/main/res/drawable-xxhdpi/biz_video_list_play_icon_big.png
library-BaiduCPU/src/main/res/drawable/btn_square_round_corner_blue.xml
New file @@ -0,0 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item > <shape > <solid android:color="#ffffff" /> <corners android:radius="12dp"/> <stroke android:color="#2a90d7" android:width="1dp" /> </shape> </item> </selector> library-BaiduCPU/src/main/res/drawable/close_icon.png
library-BaiduCPU/src/main/res/drawable/rldownload_square_bg_gray.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="4dp" /> <solid android:color="#f3f1f2" /> </shape> library-BaiduCPU/src/main/res/layout/fragment_baidu_news_content.xml
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/srl_news" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_news" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout> library-BaiduCPU/src/main/res/layout/fragment_baidu_news_root.xml
New file @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/fl_indicator" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="-10dp"> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:background="#616161" /> <android.support.v4.view.ViewPager android:id="@+id/vp_news" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> library-BaiduCPU/src/main/res/layout/fragment_baidu_short_video.xml
New file @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:id="@+id/cpu_video_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> library-BaiduCPU/src/main/res/layout/item_baidu_news.xml
New file @@ -0,0 +1,8 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/native_outer_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#1F1F1F"> </RelativeLayout> library-BaiduCPU/src/main/res/layout/native_cpu_view.xml
New file @@ -0,0 +1,227 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_marginTop="4dp" android:layout_marginBottom="4dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/top_text_view" android:maxLines="2" android:textColor="#FFFFFF" android:layout_marginTop="4dp" android:layout_marginBottom="4dp" android:textSize="16sp" android:ellipsize="end" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/image_left" android:scaleType="centerCrop" android:layout_width="0dp" android:layout_height="95dp" android:background="#FFFFFF" android:visibility="gone" android:layout_weight="1" /> <ImageView android:id="@+id/image_mid" android:scaleType="centerCrop" android:layout_width="0dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_height="95dp" android:background="#FFFFFF" android:visibility="gone" android:layout_weight="1" /> <ImageView android:id="@+id/image_right" android:scaleType="centerCrop" android:layout_width="0dp" android:layout_height="95dp" android:background="#FFFFFF" android:visibility="gone" android:layout_weight="1" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/image_big_pic" android:scaleType="centerCrop" android:layout_width="match_parent" android:layout_height="180dp" android:visibility="gone" android:background="#FFFFFF" /> <ImageView android:id="@+id/video_play" android:scaleType="centerInside" android:layout_centerInParent="true" android:background="@drawable/biz_video_list_play_icon_big" android:visibility="gone" android:layout_width="64dp" android:layout_height="64dp" /> </RelativeLayout> <RelativeLayout android:id="@+id/app_download_container" android:padding="4dp" android:layout_marginTop="8dp" android:layout_marginBottom="4dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <RelativeLayout android:id="@+id/layout" android:padding="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/rldownload_square_bg_gray"> <TextView android:id="@+id/app_name" android:hint="广告的品牌名称" android:textColor="#999999" android:textSize="12sp" android:visibility="visible" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="8dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/app_version" android:hint="版本号" android:textColor="#999999" android:textSize="12sp" android:visibility="visible" android:layout_toRightOf="@id/app_name" android:layout_alignParentTop="true" android:layout_marginRight="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/privacy_link" android:text="隐私" android:textColor="#999999" android:textSize="12sp" android:layout_toRightOf="@id/app_version" android:layout_alignBaseline="@id/app_version" android:layout_marginRight="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/permission_link" android:text="权限" android:textColor="#999999" android:textSize="12sp" android:layout_toRightOf="@id/privacy_link" android:layout_alignBaseline="@id/app_version" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/app_publisher" android:hint="开发者" android:textColor="#999999" android:textSize="12sp" android:layout_below="@id/app_version" android:layout_marginTop="4dp" android:layout_alignParentLeft="true" android:layout_marginRight="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/btn_download" android:text="点击下载" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="8dp" android:gravity="center" android:textSize="10sp" android:textColor="#2a90d7" android:layout_width="64dp" android:layout_height="24dp" android:background="@drawable/btn_square_round_corner_blue"/> </RelativeLayout> <ImageView android:paddingTop="5dp" android:layout_below="@id/layout" android:layout_toLeftOf="@id/iv_mob_adIcon_2x" android:baselineAlignBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/new_bg_logo"/> <ImageView android:id="@+id/iv_mob_adIcon_2x" android:paddingTop="5dp" android:layout_below="@id/layout" android:layout_alignParentRight="true" android:baselineAlignBottom="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/mob_adicon_2x"/> </RelativeLayout> <RelativeLayout android:id="@+id/bottom_container" android:layout_marginTop="4dp" android:layout_marginBottom="4dp" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/bottom_first_text" android:layout_alignParentLeft="true" android:singleLine="true" android:textColor="@color/gray" android:textSize="12sp" android:layout_marginRight="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/bottom_second_text" android:layout_toRightOf="@id/bottom_first_text" android:singleLine="true" android:textColor="@color/gray" android:textSize="12sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/dislike_icon" android:layout_alignParentRight="true" android:visibility="gone" android:scaleType="fitXY" android:src="@drawable/close_icon" android:layout_width="13dp" android:layout_height="13dp" /> </RelativeLayout> </LinearLayout> library-BaiduCPU/src/main/res/values/styles.xml
New file @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="FoundPageIndicator" parent="Widget.TabPageIndicator1"> <item name="android:textSize">16sp</item> <item name="android:background">@color/top_bar_color</item> <item name="android:paddingLeft">8dp</item> <item name="android:paddingRight">8dp</item> </style> </resources> library-BaiduCPU/src/test/java/com/yeshi/ec/library_baiducpu/ExampleUnitTest.java
File was renamed from library-Funshion/src/test/java/com/yeshi/ec/library_funshion/ExampleUnitTest.java @@ -1,4 +1,4 @@ package com.yeshi.ec.library_funshion; package com.yeshi.ec.library_baiducpu; import org.junit.Test; library-Funshion/build.gradle
@@ -26,9 +26,11 @@ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation project(path: ':library-mine') testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' api files('libs/FunshionBase-1.0.5.aar') api files('libs/FunshionPlaySDK-1.6.1.aar') api files('libs/FunshionAD-1.3.7.aar') } library-Funshion/libs/FunshionAD-1.0.0.aarBinary files differ
library-Funshion/libs/FunshionAD-1.3.7.aarBinary files differ
library-Funshion/src/androidTest/java/com/yeshi/ec/funshion/ExampleInstrumentedTest.java
File was renamed from library-Funshion/src/androidTest/java/com/yeshi/ec/library_funshion/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ package com.yeshi.ec.library_funshion; package com.yeshi.ec.funshion; import android.content.Context; import android.support.test.InstrumentationRegistry; library-Funshion/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yeshi.ec.library_funshion"> package="com.yeshi.ec.funshion"> / </manifest> library-Funshion/src/test/java/com/yeshi/ec/funshion/ExampleUnitTest.javacopy from library-Funshion/src/test/java/com/yeshi/ec/library_funshion/ExampleUnitTest.java copy to library-Funshion/src/test/java/com/yeshi/ec/funshion/ExampleUnitTest.java
File was copied from library-Funshion/src/test/java/com/yeshi/ec/library_funshion/ExampleUnitTest.java @@ -1,4 +1,4 @@ package com.yeshi.ec.library_funshion; package com.yeshi.ec.funshion; import org.junit.Test; library-ViewPagerIndicator/src/com/viewpagerindicator/FoundPageIndicator.java
New file @@ -0,0 +1,349 @@ package com.viewpagerindicator; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Color; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; import com.lcjian.library.widget.IsPad; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; /** * 发现页面的导航 */ public class FoundPageIndicator extends HorizontalScrollView implements PageIndicator { /** * Title text used when no title is provided by the adapter. */ private static final CharSequence EMPTY_TITLE = ""; /** * Interface for a callback when the selected tab has been reselected. */ public interface OnTabReselectedListener { /** * Callback when the selected tab has been reselected. * * @param position Position of the current center item. */ void onTabReselected(int position); } private Runnable mTabSelector; /** * ViewPager中tab的点击事件 */ private final OnClickListener mTabClickListener = new OnClickListener() { public void onClick(View view) { TabView tabView = (TabView) view; final int oldSelected = mViewPager.getCurrentItem(); final int newSelected = tabView.getIndex(); mViewPager.setCurrentItem(newSelected); if (oldSelected == newSelected && mTabReselectedListener != null) { mTabReselectedListener.onTabReselected(newSelected); } } }; private final IcsLinearLayout mTabLayout; private ViewPager mViewPager; private OnPageChangeListener mListener; private int mMaxTabWidth; private int mSelectedTabIndex; private OnTabReselectedListener mTabReselectedListener; public FoundPageIndicator(Context context) { this(context, null); } public FoundPageIndicator(Context context, AttributeSet attrs) { super(context, attrs); setHorizontalScrollBarEnabled(false); mTabLayout = new IcsLinearLayout(context, R.attr.vpiTitlePageIndicatorStyle); addView(mTabLayout, new ViewGroup.LayoutParams(WRAP_CONTENT, MATCH_PARENT)); } public void setOnTabReselectedListener(OnTabReselectedListener listener) { mTabReselectedListener = listener; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY; setFillViewport(lockedExpanded); final int childCount = mTabLayout.getChildCount(); if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) { if (childCount > 2) { mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f); } else { mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2; } } else { mMaxTabWidth = -1; } final int oldWidth = getMeasuredWidth(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int newWidth = getMeasuredWidth(); if (lockedExpanded && oldWidth != newWidth) { // Recenter the tab display if we're at a new (scrollable) size. setCurrentItem(mSelectedTabIndex); } } /** * 单个Tab * * @param position */ @SuppressLint("ResourceAsColor") private void animateToTab(final int position) { final View tabView = mTabLayout.getChildAt(position); if (mTabSelector != null) { removeCallbacks(mTabSelector); } // Drawable mReview = getResources().getDrawable(R.drawable.video_review); // mReview.setBounds(0, 0, mReview.getMinimumWidth(), // mReview.getMinimumHeight()); for (int i = 0; i < mTabLayout.getChildCount(); i++) { ((TextView) mTabLayout.getChildAt(i)).setTextColor(Color.argb(255, 0, 0, 0)); if (i == 1) { SpannableStringBuilder builder = new SpannableStringBuilder(((TextView) tabView).getText().toString()); ForegroundColorSpan span = new ForegroundColorSpan(Color.argb(255, 255, 115, 0)); builder.setSpan(span, 2, ((TextView) tabView).getText().toString().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ((TextView) tabView).setText(builder); } } ((TextView) tabView).setTextColor(Color.argb(255, 0, 0, 0));//豆豆系列 // ((TextView) tabView).setTextColor(Color.argb(255, 255, 115, 0));// 木瓜系列 mTabSelector = new Runnable() { public void run() { final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2; smoothScrollTo(scrollPos, 0); mTabSelector = null; } }; post(mTabSelector); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); if (mTabSelector != null) { // Re-post the selector we saved post(mTabSelector); } } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mTabSelector != null) { removeCallbacks(mTabSelector); } } /** * 添加tabView * * @param index * @param text * @param iconResId */ private void addTab(int index, CharSequence text, int iconResId) { final TabView tabView = new TabView(getContext()); tabView.mIndex = index; tabView.setFocusable(true); tabView.setOnClickListener(mTabClickListener); if (IsPad.isPad(tabView.getContext())) tabView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); tabView.setText(text); int width = ((WindowManager) getContext().getSystemService( Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); if (iconResId != 0) { tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0); } LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( width / 3, LayoutParams.WRAP_CONTENT); // params.setMargins(20, 0, 20, 0); mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1)); switch (index) { case 1: SpannableStringBuilder builder = new SpannableStringBuilder(((TextView) tabView).getText().toString()); ForegroundColorSpan span = new ForegroundColorSpan(Color.argb(255, 255, 115, 0)); builder.setSpan(span, 2, ((TextView) tabView).getText().toString().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ((TextView) tabView).setText(builder); break; default: break; } } @Override public void onPageScrollStateChanged(int arg0) { if (mListener != null) { mListener.onPageScrollStateChanged(arg0); } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (mListener != null) { mListener.onPageScrolled(arg0, arg1, arg2); } } @Override public void onPageSelected(int arg0) { setCurrentItem(arg0); if (mListener != null) { mListener.onPageSelected(arg0); } } @Override public void setViewPager(ViewPager view) { if (mViewPager != null) { mViewPager.setOnPageChangeListener(null); } final PagerAdapter adapter = view.getAdapter(); if (adapter == null) { throw new IllegalStateException( "ViewPager does not have adapter instance."); } mViewPager = view; view.setOnPageChangeListener(this); notifyDataSetChanged(); } public void notifyDataSetChanged() { mTabLayout.removeAllViews(); PagerAdapter adapter = mViewPager.getAdapter(); IconPagerAdapter iconAdapter = null; if (adapter instanceof IconPagerAdapter) { iconAdapter = (IconPagerAdapter) adapter; } final int count = adapter.getCount(); for (int i = 0; i < count; i++) { CharSequence title = adapter.getPageTitle(i); if (title == null) { title = EMPTY_TITLE; } int iconResId = 0; if (iconAdapter != null) { iconResId = iconAdapter.getIconResId(i); } addTab(i, title, iconResId); } if (mSelectedTabIndex > count) { mSelectedTabIndex = count - 1; } setCurrentItem(mSelectedTabIndex); requestLayout(); } @Override public void setViewPager(ViewPager view, int initialPosition) { setViewPager(view); setCurrentItem(initialPosition); } /** * 设置当前Item */ @Override public void setCurrentItem(int item) { if (mViewPager == null) { throw new IllegalStateException("ViewPager has not been bound."); } mSelectedTabIndex = item; mViewPager.setCurrentItem(item); final int tabCount = mTabLayout.getChildCount(); for (int i = 0; i < tabCount; i++) { final View child = mTabLayout.getChildAt(i); final boolean isSelected = (i == item); child.setSelected(isSelected); if (isSelected) { animateToTab(item); } } } @Override public void setOnPageChangeListener(OnPageChangeListener listener) { mListener = listener; } /** * 重写textview * * @author weikou2015 */ private class TabView extends TextView { private int mIndex; public TabView(Context context) { super(context, null, R.attr.lxyTabPageIndicatorStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Re-measure if we went beyond our maximum size. if (mMaxTabWidth > 0 && getMeasuredWidth() > mMaxTabWidth) { super.onMeasure(MeasureSpec.makeMeasureSpec(mMaxTabWidth, MeasureSpec.EXACTLY), heightMeasureSpec); } } public int getIndex() { return mIndex; } } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } } library-mine/AndroidManifest.xml
@@ -3,6 +3,7 @@ android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:label="@string/app_name" library-mine/build.gradle
@@ -4,10 +4,14 @@ // api fileTree(include: '*.jar', dir: 'libs') api 'com.squareup.okhttp3:okhttp:3.8.1' api 'com.android.support:support-v4:27.1.1' api 'com.android.support:recyclerview-v7:27.1.1' api project(':library-NineOldAndroids') api project(':APPUpdate') api 'com.github.bumptech.glide:glide:4.9.0' api 'com.google.code.gson:gson:1.7.1' api files('libs/android-query-full.0.26.7.jar') api 'com.taobao.android:utdid4all:1.5.2' } android { library-mine/libs/android-query-full.0.26.7.jarBinary files differ
library-mine/res/drawable-xhdpi/ic_player_dialog_close.png
library-mine/res/drawable-xhdpi/ic_player_loading.pnglibrary-mine/res/drawable-xhdpi/ic_player_next.png
library-mine/res/drawable-xhdpi/ic_player_pause_small.png
library-mine/res/drawable-xhdpi/ic_player_play_small.png
library-mine/res/drawable/shape_player_episode.xml
New file @@ -0,0 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#4CFFFFFF" /> <corners android:radius="5dp"></corners> </shape> library-mine/res/drawable/shape_player_episode_highlight.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#0052F6" /> <stroke android:width="2dp" android:color="#59ff078d" /> <corners android:radius="5dp"></corners> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp"></padding> </shape> library-mine/res/layout-land/video_player_controller.xml
File was deleted library-mine/res/layout/item_player_definition.xml
New file @@ -0,0 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_container" android:layout_width="60dp" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="高清"></TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="标清"></TextView> </LinearLayout> library-mine/res/layout/item_player_episode.xml
New file @@ -0,0 +1,47 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="match_parent" android:background="#b3000000" android:gravity="center_horizontal" android:orientation="vertical" android:padding="20dp"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="14dp" android:paddingRight="14dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" android:text="选集" android:textColor="#ffffffff" android:textSize="18sp" /> <ImageView android:id="@+id/iv_close" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="right|center_vertical" android:src="@drawable/ic_player_dialog_close"></ImageView> </FrameLayout> <GridView android:id="@+id/gv_episode" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="20dp" android:layout_weight="1" android:gravity="center_horizontal" android:scrollbars="none" android:verticalSpacing="10dp"></GridView> </LinearLayout> library-mine/res/layout/item_player_loading.xml
@@ -1,7 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_width="95dp" android:layout_height="95dp" android:id="@+id/fl_loading" android:layout_gravity="center" android:background="@drawable/shape_player_dialog_bg_gray"> <ImageView library-mine/res/layout/item_player_share.xml
New file @@ -0,0 +1,44 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="220dp" android:layout_height="match_parent" android:background="#b3000000" android:gravity="center_horizontal" android:orientation="vertical" android:padding="20dp"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="14dp" android:paddingRight="14dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" android:text="分享到" android:textColor="#ffffffff" android:textSize="18sp" /> <ImageView android:id="@+id/iv_close" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="right|center_vertical" android:src="@drawable/ic_player_dialog_close"></ImageView> </FrameLayout> <GridView android:id="@+id/gv_share" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="20dp" android:layout_weight="1"></GridView> </LinearLayout> library-mine/res/layout/video_player_controller.xml
@@ -12,13 +12,14 @@ android:orientation="vertical"> <FrameLayout android:visibility="gone" android:id="@+id/fl_state" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingTop="6dp" android:paddingRight="10dp" android:paddingBottom="6dp"> android:paddingTop="2dp" android:paddingRight="20dp" android:paddingBottom="2dp" android:visibility="gone"> <ImageView android:id="@+id/iv_network" @@ -48,9 +49,7 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingTop="7.5dp" android:paddingRight="20dp" android:paddingBottom="7.5dp"> android:paddingRight="20dp"> <ImageView android:id="@+id/iv_back" @@ -69,10 +68,8 @@ android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:text="致青春·原来你还在这里" android:textColor="#FFFFFF" android:textSize="18sp"></TextView> @@ -80,7 +77,7 @@ android:id="@+id/tv_link" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:paddingBottom="2dp" android:textColor="#ffffffff" android:textSize="7sp" /> @@ -88,7 +85,6 @@ <LinearLayout android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content"> @@ -96,28 +92,32 @@ android:id="@+id/iv_collection" android:layout_width="21dp" android:layout_height="wrap_content" android:src="@drawable/ic_player_collecte"></ImageView> android:src="@drawable/ic_player_collecte" android:visibility="gone"></ImageView> <ImageView android:id="@+id/iv_download" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_download"></ImageView> android:src="@drawable/ic_player_download" android:visibility="gone"></ImageView> <ImageView android:id="@+id/iv_share" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_share"></ImageView> android:src="@drawable/ic_player_share" android:visibility="gone"></ImageView> <ImageView android:id="@+id/iv_episode" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_episode"></ImageView> android:src="@drawable/ic_player_episode" android:visibility="gone"></ImageView> </LinearLayout> @@ -136,23 +136,32 @@ android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" android:layout_marginRight="20dp" android:visibility="gone" android:src="@drawable/ic_player_unlock"> </ImageView> <ImageView android:id="@+id/iv_play_center" android:layout_width="50dp" android:visibility="gone" android:layout_height="50dp" android:layout_gravity="center" android:src="@drawable/ic_player_play_big"></ImageView> android:src="@drawable/ic_player_play_big" android:visibility="gone"></ImageView> <FrameLayout android:visibility="gone" android:id="@+id/fl_loading" android:layout_width="95dp" android:layout_height="95dp" android:layout_gravity="center"> <include layout="@layout/item_player_loading"></include> </FrameLayout> <!--底部 --> <FrameLayout android:id="@+id/ll_bottom" android:id="@+id/fl_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" @@ -165,52 +174,71 @@ android:background="#b3000000" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="10dp" android:paddingLeft="20dp" android:paddingTop="5dp" android:paddingRight="15dp" android:paddingBottom="5dp"> <ImageView android:id="@+id/iv_play" android:layout_width="38dp" android:layout_height="38dp" android:layout_width="wrap_content" android:layout_height="14dp" android:layout_gravity="left|center_vertical" android:src="@drawable/ic_player_play"></ImageView> android:src="@drawable/ic_player_play_small"></ImageView> <!--下一集 --> <ImageView android:id="@+id/iv_next" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> android:layout_width="38dp" android:layout_height="38dp" android:layout_marginLeft="18dp" android:layout_marginRight="22dp" android:src="@drawable/ic_player_next" android:visibility="gone"></ImageView> <!--播放进度 --> <TextView android:id="@+id/tv_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:text="09:54" android:layout_marginLeft="13dp" android:text="00:00" android:textColor="#ffffff" android:textSize="14sp"></TextView> <TextView android:id="@+id/tv_time_cutline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="11.5dp" android:layout_marginRight="11.5dp" android:text="|" android:textColor="#ffffff" android:textSize="14sp" android:visibility="gone"></TextView> <SeekBar android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:id="@+id/seekBar" android:id="@+id/seekBar_portrait" android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:max="100" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_weight="1" android:max="1000" android:maxHeight="3dp" android:minHeight="3dp" android:paddingStart="0dp" android:paddingLeft="0dp" android:paddingEnd="0dp" android:paddingRight="0dp" android:progress="10" android:progress="0" android:progressDrawable="@drawable/layer_player_progressbar" android:splitTrack="false" android:thumb="@drawable/shape_player_thumb" android:thumbOffset="5dp" /> android:thumbOffset="0dp" /> <!--视频总时长 --> @@ -219,13 +247,21 @@ android:id="@+id/tv_duration" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="18:04" android:text="00:00" android:textColor="#ffffff" android:textSize="14sp"></TextView> <View android:id="@+id/view_bottom_fill" android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:visibility="gone"></View> <!--清晰度 --> <TextView android:visibility="gone" android:id="@+id/tv_definition" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -235,11 +271,11 @@ android:padding="8dp" android:text="清晰度:高清" android:textColor="#ffeeeeee" android:textSize="9sp" /> android:textSize="9sp" android:visibility="gone" /> <!-- 来源 --> <TextView android:visibility="gone" android:id="@+id/tv_resource" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -250,13 +286,15 @@ android:padding="8dp" android:text="来源:爱奇艺" android:textColor="#ffeeeeee" android:textSize="9sp" /> android:textSize="9sp" android:visibility="gone" /> <ImageView android:id="@+id/iv_full_screen" android:layout_width="wrap_content" android:layout_height="35dp" android:layout_marginRight="-10dp" android:padding="10dp" android:src="@drawable/ic_player_full_screen" android:visibility="visible"></ImageView> @@ -264,7 +302,23 @@ </LinearLayout> <!-- 进度 --> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="20dp" android:max="1000" android:maxHeight="3dp" android:minHeight="3dp" android:paddingStart="0dp" android:paddingLeft="0dp" android:paddingEnd="0dp" android:paddingRight="0dp" android:progress="0" android:progressDrawable="@drawable/layer_player_progressbar" android:splitTrack="false" android:thumb="@drawable/shape_player_thumb" android:thumbOffset="0dp" android:visibility="gone" /> </FrameLayout> library-mine/src/com/lcjian/library/entity/eventbus/PlayerControllerShow.java
New file @@ -0,0 +1,19 @@ package com.lcjian.library.entity.eventbus; public class PlayerControllerShow { //是否显示 private boolean show; public PlayerControllerShow(boolean show) { this.show = show; } public boolean isShow() { return show; } public void setShow(boolean show) { this.show = show; } } library-mine/src/com/lcjian/library/entity/eventbus/PlayerLock.java
New file @@ -0,0 +1,19 @@ package com.lcjian.library.entity.eventbus; public class PlayerLock { private boolean lock;//是否被锁住 public boolean isLock() { return lock; } public void setLock(boolean lock) { this.lock = lock; } public PlayerLock(boolean lock) { this.lock = lock; } } library-mine/src/com/lcjian/library/util/DialogUtils.java
New file @@ -0,0 +1,88 @@ package com.lcjian.library.util; import android.app.Dialog; import android.content.Context; import android.support.v4.app.Fragment; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; public class DialogUtils { private static final String TAG = DialogUtils.class.getName(); /** * @param dialog * @param fragment * @param hasStatusBar 该页面是否具有statusBar。有,在不包括状态栏的区域居中;没有,在该整个区域居中。 */ public static void setDialogInFragmentsCenter(Dialog dialog, Fragment fragment, final boolean hasStatusBar) { // 1、获取Dialog所述的Window,以及LayoutParams(布局参数) final Window dialogWindow = dialog.getWindow(); dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); final WindowManager.LayoutParams lp = dialogWindow.getAttributes(); // 2、获取到Fragment所处的View final View fragmentView = fragment.getView(); // 3、获取到Dialog的DecorView final View dialogView = dialogWindow.getDecorView(); dialogView.setVisibility(View.INVISIBLE); dialogView.post(new Runnable() { @Override public void run() { // 4、获取到Fragment左上角点的距离整个屏幕的距离 int[] location = new int[2]; fragmentView.getLocationOnScreen(location); int fragmentWidth = fragmentView.getMeasuredWidth(); int fragmentHeight = fragmentView.getMeasuredHeight(); // 5、获取到Dialog的宽高 int dialogWith = dialogView.getMeasuredWidth(); int dialogHeight = dialogView.getMeasuredHeight(); // 6、获取到标题栏的宽高 int mStatusBarHeight = 0; if (hasStatusBar) { // 有状态栏,需要去除状态栏的影响。 mStatusBarHeight = getStatusBarHeight(fragmentView.getContext()); } // 7、Dialog从左上角开始排 dialogWindow.setGravity(Gravity.START | Gravity.TOP); // x = fragment的x + fragment宽度/2 - Dialog宽度/2 lp.x = location[0] + fragmentWidth / 2 - dialogWith / 2; // y = fragment的y + fragment高度/2 - Dialog高度/2 - 状态栏高度(Gravity.TOP会自动偏移状态栏的高度) lp.y = location[1] + fragmentHeight / 2 - dialogHeight / 2 - mStatusBarHeight; // 8、设置Window的属性 dialogWindow.setAttributes(lp); // 9、展示出Dialog dialogView.setVisibility(View.VISIBLE); } }); } public static int getStatusBarHeight(Context context) { /** * 获取状态栏高度——方法2 * */ int statusBarHeight = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height") .get(object).toString()); statusBarHeight = context.getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusBarHeight; } } library-mine/src/com/lcjian/library/util/common/DimenUtils.java
@@ -61,4 +61,17 @@ final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 获取状态栏高度 * * @param context * @return */ public static int getStatusBarHeight(Context context) { Resources resources = context.getResources(); int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); int height = resources.getDimensionPixelSize(resourceId); return height; } } library-mine/src/com/lcjian/library/util/common/TimeUtil.java
New file @@ -0,0 +1,48 @@ package com.lcjian.library.util.common; import java.text.SimpleDateFormat; import java.util.Date; public class TimeUtil { /** * 将秒转换为形如01:12这种形式 * * @param seconds * @return */ public static String getTimeDesc(int seconds) { if (seconds <= 0) return "00:00"; int h = seconds / 3600; int m = (seconds - h * 3600) / 60; int s = seconds % 60; String str = ""; if (s < 10) str += "0" + s; else str += s; if (m == 0) str = "00:" + str; else if (m < 10) str = "0" + m + ":" + str; else str = m + ":" + str; if (h > 0) { if (h < 10) str = "0" + h + ":" + str; else str = h + ":" + str; } return str; } public static String getGeneralTime(long timeStamp, String template) { SimpleDateFormat sdf = new SimpleDateFormat(template); String date = sdf.format(new Date(timeStamp)); return date; } } library-mine/src/com/lcjian/library/video/VideoDefinition.java
New file @@ -0,0 +1,23 @@ package com.lcjian.library.video; //视频清晰度 public class VideoDefinition { private String clarity;//清晰度名称 hd,ld private String name;//清晰度名称 public String getClarity() { return clarity; } public void setClarity(String clarity) { this.clarity = clarity; } public String getName() { return name; } public void setName(String name) { this.name = name; } } library-mine/src/com/lcjian/library/video/VideoEpisode.java
New file @@ -0,0 +1,40 @@ package com.lcjian.library.video; public class VideoEpisode { private String id; private String name;//名称 private String tag; private String videoId; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public String getVideoId() { return videoId; } public void setVideoId(String videoId) { this.videoId = videoId; } } library-mine/src/com/lcjian/library/video/VideoEpisodeDialog.java
New file @@ -0,0 +1,176 @@ package com.lcjian.library.video; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.graphics.Color; import android.support.annotation.NonNull; import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import com.lcjian.lcjianlibrary.R; import com.lcjian.library.util.common.DimenUtils; import java.util.List; public class VideoEpisodeDialog extends Dialog { private IDialogClick dialogClick; public VideoEpisodeDialog(@NonNull Context context) { super(context); } public VideoEpisodeDialog(@NonNull Context context, int themeResId) { super(context, themeResId); } public static class Builder { private IDialogClick dialogClick; private List<VideoEpisode> episodeList; private int position; private Activity activity; private int showType;// 1-小方格 2-长条 private MyAdapter adapter; public Builder setDialogClick(IDialogClick dialogClick) { this.dialogClick = dialogClick; return this; } /** * @param videoEpisodes * @param position * @param showType 1-小方格 2-长条 * @return */ public Builder setEpisodes(List<VideoEpisode> videoEpisodes, int position, int showType) { this.episodeList = videoEpisodes; this.position = position; this.showType = showType; return this; } public VideoEpisodeDialog build(Activity context) { this.activity = context; final VideoEpisodeDialog videoLoadingDialog = new VideoEpisodeDialog(context, R.style.Dialog); View view = LayoutInflater.from(context).inflate(R.layout.item_player_episode, null); ImageView iv_close = view.findViewById(R.id.iv_close); GridView gv_episode = view.findViewById(R.id.gv_episode); iv_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (dialogClick != null) dialogClick.close(); } }); if (showType == 1) { gv_episode.setNumColumns(4); } else { gv_episode.setNumColumns(1); } adapter = new MyAdapter(); gv_episode.setAdapter(adapter); gv_episode.setSelection(position); videoLoadingDialog.setContentView(view); WindowManager.LayoutParams params = videoLoadingDialog.getWindow() .getAttributes(); params.width = DimenUtils.dip2px(activity, 220); params.height = DimenUtils.getScreenHeight(activity); videoLoadingDialog.getWindow().setAttributes(params); videoLoadingDialog.getWindow().setGravity(Gravity.RIGHT);//设置显示在右侧 videoLoadingDialog.setCanceledOnTouchOutside(true); return videoLoadingDialog; } class MyAdapter extends BaseAdapter { @Override public int getCount() { return episodeList.size(); } @Override public Object getItem(int position) { return episodeList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final VideoEpisode videoEpisode = episodeList.get(position); TextView textView = new TextView(activity); textView.setGravity(Gravity.CENTER); textView.setMaxLines(1); textView.setTextColor(Color.WHITE); textView.setEllipsize(TextUtils.TruncateAt.END); if (showType == 1) { ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(DimenUtils.dip2px(activity, 35), DimenUtils.dip2px(activity, 35)); textView.setLayoutParams(params); } else { ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DimenUtils.dip2px(activity, 35)); textView.setLayoutParams(params); } if (position == Builder.this.position) { textView.setBackgroundResource(R.drawable.shape_player_episode_highlight); } else { textView.setBackgroundResource(R.drawable.shape_player_episode); } textView.setText(videoEpisode.getTag()); final boolean canClick = position != Builder.this.position; textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (canClick) { Builder.this.position=position; notifyDataSetChanged(); if (dialogClick != null) dialogClick.selectEpisode(position, videoEpisode); } } }); return textView; } } } interface IDialogClick { //选集 public void selectEpisode(int p, VideoEpisode ve); //关闭弹框 public void close(); } } library-mine/src/com/lcjian/library/video/VideoLoadingDialog.java
File was deleted library-mine/src/com/lcjian/library/video/VideoPlayerController.java
@@ -3,22 +3,48 @@ import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.Color; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.androidquery.AQuery; import com.lcjian.lcjianlibrary.R; import com.lcjian.library.entity.eventbus.PlayerControllerShow; import com.lcjian.library.entity.eventbus.PlayerLock; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.TimeUtil; import java.util.List; import java.util.Timer; import java.util.TimerTask; import de.greenrobot.event.EventBus; import static android.content.Context.AUDIO_SERVICE; public class VideoPlayerController extends FrameLayout { @@ -28,6 +54,12 @@ private MediaPlayer mediaPlayer; private IVideoPlayerListener videoPlayerListener; private List<VideoEpisode> episodeList; private String videoName; private String videoUrl; private boolean collected;//是否收藏 private Timer timer; //容器 @@ -38,6 +70,7 @@ private ImageView iv_back;//返回 private TextView tv_title;//标题 private TextView tv_link;//链接 private ImageView iv_electric;//电量 private TextView tv_time;//当前时间 private ImageView iv_lock;//锁屏 @@ -47,38 +80,45 @@ private TextView tv_progress;//现在的播放进度 private TextView tv_duration;//视频总时长 private TextView tv_definition;//清晰度 private ImageView iv_episode;//选集 private ImageView iv_full_screen; private TextView tv_resource; public VideoPlayerController setMediaPlayer(MediaPlayer mediaPlayer) { this.mediaPlayer = mediaPlayer; return this; } private boolean needNotifyMobileData = true; public VideoPlayerController setVideoPlayerListener(IVideoPlayerListener videoPlayerListener) { this.videoPlayerListener = videoPlayerListener; return this; } //视频清晰度 private List<VideoDefinition> videoDefinitionList; public VideoPlayerController setContentView(View contentView) { this.contentView = contentView; return this; } //当前清晰度 private VideoDefinition currentDefinition; private ImageView iv_collection, iv_download, iv_share, iv_episode;//收藏,下载,分享,选集 //是否可以隐藏 private boolean canHiddenController = true; //正在播放的位置 private int mPlayingPosition; private AQuery aq; public VideoPlayerController(@NonNull Context context) { super(context); timer = new Timer(); } public VideoPlayerController(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); timer = new Timer(); LayoutInflater.from(context).inflate(R.layout.video_player_controller, this); aq = new AQuery(this); fl_bottom = findViewById(R.id.fl_bottom); ll_top = findViewById(R.id.ll_top); iv_back = findViewById(R.id.iv_back); tv_title = findViewById(R.id.tv_title); tv_link = findViewById(R.id.tv_link); iv_electric = findViewById(R.id.iv_electric); tv_time = findViewById(R.id.tv_time); iv_lock = findViewById(R.id.iv_lock); @@ -90,35 +130,284 @@ tv_definition = findViewById(R.id.tv_definition); iv_episode = findViewById(R.id.iv_episode); iv_full_screen = findViewById(R.id.iv_full_screen); iv_collection = findViewById(R.id.iv_collection); iv_download = findViewById(R.id.iv_download); iv_share = findViewById(R.id.iv_share); iv_episode = findViewById(R.id.iv_episode); tv_resource = findViewById(R.id.tv_resource); iv_full_screen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); if (mActivity != null) mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } }); //定时器 timer.schedule(new TimerTask() { @Override public void run() { if (tv_time != null) { tv_time.post(new Runnable() { @Override public void run() { if (tv_time != null) tv_time.setText(TimeUtil.getGeneralTime(System.currentTimeMillis(), "HH:mm")); } }); } } }, 0, 1000); initLoading(); showController(); } //加载框初始化 private void initLoading() { ImageView imageView = findViewById(R.id.iv_loading); Animation operatingAnim = AnimationUtils.loadAnimation(getContext(), R.anim.rotate_dialog_player_loading); LinearInterpolator lin = new LinearInterpolator(); operatingAnim.setInterpolator(lin); imageView.setAnimation(operatingAnim); operatingAnim.start(); } public VideoPlayerController setVideoPlayerListener(IVideoPlayerListener videoPlayerListener) { this.videoPlayerListener = videoPlayerListener; return this; } /** * 设置视频信息 * * @param episodeList * @param videoName * @param videoUrl * @param playingPosition * @return */ public VideoPlayerController setVideoInfo(List<VideoEpisode> episodeList, String videoName, String videoUrl, int playingPosition) { this.videoName = videoName; this.videoUrl = videoUrl; this.episodeList = episodeList; this.mPlayingPosition = playingPosition; return this; } public VideoPlayerController setContentView(View contentView) { this.contentView = contentView; return this; } /** * 是否收藏 * * @param select */ public void setCollect(boolean select) { if (select) iv_collection.setImageResource(R.drawable.ic_player_collected); else iv_collection.setImageResource(R.drawable.ic_player_collecte); } /** * 设置清晰度 * * @param definitionList * @param currentDefinition */ public void setDefinition(List<VideoDefinition> definitionList, VideoDefinition currentDefinition) { this.videoDefinitionList = definitionList; this.currentDefinition = currentDefinition; if (currentDefinition != null) { tv_definition.setText("清晰度:" + currentDefinition.getName()); if (isLand) { tv_definition.setVisibility(View.VISIBLE); } } } //网络提示弹框 private VideoDataNotifyDialog networkNotiftDialog; /** * TODO * 设置网络状态 * * @param networkInfo */ //设置当前网络状态 public synchronized void setNetworkInfo(NetworkInfo networkInfo, boolean firstSet) { //说明当前有网络 if (networkInfo != null && networkInfo.isAvailable()) { if (mActivity == null) return; int type = networkInfo.getType(); switch (type) { case ConnectivityManager.TYPE_MOBILE: //提示是否继续播放 if (needNotifyMobileData) { pausePlay(); if (networkNotiftDialog == null) networkNotiftDialog = new VideoDataNotifyDialog.Builder().setDialogClick(new VideoDataNotifyDialog.IDialogClick() { @Override public void continuePlay() { VideoPlayerController.this.continuePlay(); //不需要提醒 needNotifyMobileData = false; } @Override public void close() { } }).build(mActivity); if (!networkNotiftDialog.isShowing()) networkNotiftDialog.show(); } break; case ConnectivityManager.TYPE_WIFI: if (networkNotiftDialog != null && networkNotiftDialog.isShowing()) networkNotiftDialog.dismiss(); if (firstSet) VideoPlayerController.this.continuePlay(); break; case ConnectivityManager.TYPE_ETHERNET: break; } } else { pausePlay(); } } /** * 设置电量变化 */ public void setBattery(int percent) { int resourceId; if (percent < 10) resourceId = R.drawable.ic_battery_1; else if (percent < 20) resourceId = R.drawable.ic_battery_2; else if (percent < 30) resourceId = R.drawable.ic_battery_3; else if (percent < 40) resourceId = R.drawable.ic_battery_4; else if (percent < 50) resourceId = R.drawable.ic_battery_5; else if (percent < 60) resourceId = R.drawable.ic_battery_6; else if (percent < 70) resourceId = R.drawable.ic_battery_7; else if (percent < 80) resourceId = R.drawable.ic_battery_8; else resourceId = R.drawable.ic_battery_10; iv_electric.setImageResource(resourceId); } private void showController() { if (!isLock()) { fl_bottom.setVisibility(View.VISIBLE); ll_top.setVisibility(View.VISIBLE); iv_lock.setVisibility(View.VISIBLE); EventBus.getDefault().post(new PlayerControllerShow(true)); } else { fl_bottom.setVisibility(View.GONE); ll_top.setVisibility(View.GONE); iv_lock.setVisibility(View.VISIBLE); } iv_lock.setVisibility(View.VISIBLE); delayHiddenController(); } private void hiddenController() { fl_bottom.setVisibility(View.GONE); ll_top.setVisibility(View.GONE); iv_lock.setVisibility(View.GONE); if (canHiddenController) { if (definitionPopupWindow == null || !definitionPopupWindow.isShowing()) { fl_bottom.setVisibility(View.GONE); ll_top.setVisibility(View.GONE); iv_lock.setVisibility(View.GONE); EventBus.getDefault().post(new PlayerControllerShow(false)); } } } private void delayHiddenController() { fl_bottom.removeCallbacks(controllerHiddenRunnable); fl_bottom.postDelayed(controllerHiddenRunnable, 4000); } private GestureDetector mGesde = new GestureDetector(new MSimpleGestureDectListener()); private VideoEpisodeDialog episodeDialog; private PopupWindow definitionPopupWindow; private Fragment fragment; SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { boolean isTouch = false; @Override public void onProgressChanged(SeekBar seekBar, int precent, boolean b) { if (isTouch) { //计算 拖拉后的 时间长度: int positionLong = mediaPlayer.getDuration() * seekBar.getProgress() / 1000; mediaPlayer.seekTo(positionLong); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { isTouch = true; mediaPlayer.pause(); canHiddenController = false; } @Override public void onStopTrackingTouch(SeekBar seekBar) { isTouch = false; mediaPlayer.start(); int currentPosition = getSeconds(mediaPlayer.getCurrentPosition()); tv_progress.setText(TimeUtil.getTimeDesc(currentPosition)); canHiddenController = true; delayHiddenController(); } }; /** * 初始化 */ public void build(Activity mActivity) { public void build(final Activity mActivity, Fragment fragment) { this.mActivity = mActivity; this.fragment = fragment; setLayout(); tv_title.setText(videoName); tv_link.setText(videoUrl); setCollect(this.collected); showLoading(); iv_back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (videoPlayerListener != null) videoPlayerListener.onBack(); } }); contentView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -126,76 +415,438 @@ return true; } }); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { seekBar.setOnSeekBarChangeListener(seekBarChangeListener); aq.id(R.id.seekBar_portrait).getSeekBar().setOnSeekBarChangeListener(seekBarChangeListener); boolean isTouch = false; iv_collection.setOnClickListener(new OnClickListener() { @Override public void onProgressChanged(SeekBar seekBar, int precent, boolean b) { if (isTouch) { //计算 拖拉后的 时间长度: int positionLong = mediaPlayer.getDuration() * seekBar.getProgress() / 100; mediaPlayer.seekTo(positionLong); public void onClick(View v) { if (videoPlayerListener != null) {//收藏 videoPlayerListener.collect(!collected); } } }); iv_download.setOnClickListener(new OnClickListener() { @Override public void onStartTrackingTouch(SeekBar seekBar) { // mHandler.removeMessages(0); // isTouch = true; // mediaPlayer.pause(); // stop$play.setImageResource(R.mipmap.play_small); } @Override public void onStopTrackingTouch(SeekBar seekBar) { // if (controllerView.getVisibility() == View.VISIBLE) { // if (mHandler != null) { // mHandler.sendEmptyMessageDelayed(0, 4000); // } // } isTouch = false; mediaPlayer.start(); // stop$play.setImageResource(R.mipmap.stop_small); public void onClick(View v) { Toast.makeText(getContext(), "暂不支持下载", Toast.LENGTH_SHORT).show(); } }); iv_episode.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //当前集 episodeDialog = new VideoEpisodeDialog.Builder().setEpisodes(episodeList, mPlayingPosition, 1).setDialogClick(new VideoEpisodeDialog.IDialogClick() { @Override public void selectEpisode(int p, VideoEpisode ve) { if (videoPlayerListener != null) videoPlayerListener.selectEpisode(p, ve); if (episodeDialog.isShowing()) episodeDialog.dismiss(); } @Override public void close() { if (episodeDialog.isShowing()) episodeDialog.dismiss(); } }).build(mActivity); episodeDialog.show(); hiddenController(); } }); iv_play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); VideoResourceUtil.setPlayImage(iv_play, true, isLand); } else { mediaPlayer.start(); VideoResourceUtil.setPlayImage(iv_play, false, isLand); } } } }); definitionPopupWindow = null; //清晰度选择 tv_definition.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (definitionPopupWindow == null) { definitionPopupWindow = new PopupWindow(getContext()); } if (definitionPopupWindow.isShowing()) definitionPopupWindow.dismiss(); else { final View view = LayoutInflater.from(getContext()).inflate(R.layout.item_player_definition, null); LinearLayout ll_container = view.findViewById(R.id.ll_container); fillDefinition(ll_container); definitionPopupWindow.setContentView(view); definitionPopupWindow.setOutsideTouchable(true); definitionPopupWindow.setBackgroundDrawable(null); definitionPopupWindow.setFocusable(true); //防止再次弹出 definitionPopupWindow.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { definitionPopupWindow.dismiss(); return true; } return false; } }); //清晰度选择消失后需要隐藏控制层 definitionPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { delayHiddenController(); } }); tv_definition.post(new Runnable() { @Override public void run() { Log.i(TAG, String.format("width:%s height:%s", view.getWidth(), view.getHeight())); //保存anchor在屏幕中的位置 int[] location = new int[2]; //保存anchor上部中点 int[] anchorCenter = new int[2]; //读取位置anchor座标 tv_definition.getLocationOnScreen(location); //计算anchor中点 anchorCenter[0] = location[0] + tv_definition.getWidth() / 2 - DimenUtils.dip2px(getContext(), 60); anchorCenter[1] = location[1] - videoDefinitionList.size() * DimenUtils.dip2px(getContext(), 28); int xoff = 0; int yoff = 0; definitionPopupWindow.showAtLocation(tv_definition, Gravity.TOP | Gravity.LEFT, anchorCenter[0] + xoff, anchorCenter[1] - (yoff)); } }); } } }); iv_lock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (iv_lock.getTag() == null) { iv_lock.setImageResource(R.drawable.ic_player_lock); iv_lock.setTag("lock"); showController(); EventBus.getDefault().post(new PlayerLock(true)); } else { iv_lock.setTag(null); iv_lock.setImageResource(R.drawable.ic_player_unlock); showController(); EventBus.getDefault().post(new PlayerLock(false)); } } }); iv_next.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (videoPlayerListener != null) videoPlayerListener.onNext(); } }); //继续播放 aq.id(R.id.iv_play_center).clicked(new OnClickListener() { @Override public void onClick(View v) { continuePlay(); } }); } public void changeOrien(Activity activity) { // boolean tag = requestOrien.getTag() == null ? false : (boolean) requestOrien.getTag(); // activity.setRequestedOrientation(!tag ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // requestOrien.setTag(!tag); private void fillDefinition(final LinearLayout ll_container) { ll_container.removeAllViews(); for (int i = 0; i < videoDefinitionList.size(); i++) { final int p = i; VideoDefinition vd = videoDefinitionList.get(i); final VideoDefinition fvd = vd; TextView tv = new TextView(getContext()); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(DimenUtils.dip2px(getContext(), 60), DimenUtils.dip2px(getContext(), 28)); tv.setLayoutParams(params); tv.setGravity(Gravity.CENTER); tv.setTextSize(12); tv.setTextColor(Color.WHITE); tv.setText(vd.getName()); tv.setBackgroundColor(Color.parseColor("#80000000")); if (currentDefinition != null && currentDefinition.getName().equalsIgnoreCase(vd.getName())) { tv.setTextColor(Color.parseColor("#FF078D")); tv.setBackgroundColor(Color.parseColor("#800052F6")); } tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { currentDefinition = fvd; tv_definition.setText("清晰度:" + currentDefinition.getName()); fillDefinition(ll_container); videoPlayerListener.changeDefinition(p, currentDefinition); if (definitionPopupWindow != null && definitionPopupWindow.isShowing()) definitionPopupWindow.dismiss(); } }); ll_container.addView(tv); } } //锁屏 private void lock() { hiddenController(); private boolean isLand = false; /** * 屏幕方向改变 * * @param land */ public void changeOrien(boolean land) { if (isLand != land) { //更改屏幕方向 isLand = land; setLayout(); } } //解锁屏 private void unLock() { if (isLock()) showController(); private void setLayout() { if (isLand) { findViewById(R.id.fl_state).setVisibility(View.VISIBLE); // if (iv_collection.getVisibility() == View.GONE) // iv_collection.setVisibility(View.VISIBLE); if (iv_download.getVisibility() == View.GONE) iv_download.setVisibility(View.VISIBLE); // if (iv_share.getVisibility() == View.GONE) // iv_share.setVisibility(View.VISIBLE); if (iv_episode.getVisibility() == View.GONE) iv_episode.setVisibility(View.VISIBLE); iv_full_screen.setVisibility(View.GONE); if (this.currentDefinition != null) tv_definition.setVisibility(View.VISIBLE); tv_resource.setVisibility(View.VISIBLE); iv_next.setVisibility(View.VISIBLE); aq.id(R.id.seekBar_portrait).visibility(View.GONE); aq.id(R.id.seekBar).visibility(View.VISIBLE); aq.id(R.id.view_bottom_fill).visibility(View.VISIBLE); aq.id(R.id.tv_time_cutline).visibility(View.VISIBLE); seekBar.setProgress(aq.id(R.id.seekBar).getSeekBar().getProgress()); } else { findViewById(R.id.fl_state).setVisibility(View.GONE); if (iv_collection.getVisibility() == View.VISIBLE) iv_collection.setVisibility(View.GONE); if (iv_download.getVisibility() == View.VISIBLE) iv_download.setVisibility(View.GONE); if (iv_share.getVisibility() == View.VISIBLE) iv_share.setVisibility(View.GONE); if (iv_episode.getVisibility() == View.VISIBLE) iv_episode.setVisibility(View.GONE); iv_full_screen.setVisibility(View.VISIBLE); tv_definition.setVisibility(View.GONE); tv_resource.setVisibility(View.GONE); iv_next.setVisibility(View.GONE); aq.id(R.id.seekBar_portrait).visibility(View.VISIBLE); aq.id(R.id.seekBar).visibility(View.GONE); aq.id(R.id.view_bottom_fill).visibility(View.GONE); aq.id(R.id.tv_time_cutline).visibility(View.GONE); aq.id(R.id.seekBar).getSeekBar().setProgress(seekBar.getProgress()); } VideoResourceUtil.setPlayImage(iv_play, mediaPlayer != null ? mediaPlayer.isPlaying() : false, isLand); } private int getSeconds(int ms) { return Math.round(ms / 1000.0f); } private Runnable playerProcessRunnable = new Runnable() { @Override public void run() { //设置时间 if (mediaPlayer != null && mediaPlayer.isPlaying()) { int currentPosition = getSeconds(mediaPlayer.getCurrentPosition()); tv_progress.setText(TimeUtil.getTimeDesc(currentPosition)); seekBar.setProgress(Math.round(mediaPlayer.getCurrentPosition() * 1000 / mediaPlayer.getDuration())); setPlayerState(); } tv_progress.postDelayed(playerProcessRunnable, 1000); } }; private Runnable controllerHiddenRunnable = new Runnable() { @Override public void run() { hiddenController(); } }; /** * 视频准备好的回调 * * @param mp */ public void onPrepared(MediaPlayer mp) { closeLoading(); this.mediaPlayer = mp; final int duration = getSeconds(mp.getDuration()); Log.i(TAG, "视频总时长:" + duration); if (mp != null) { tv_duration.post(new Runnable() { @Override public void run() { tv_duration.setText(TimeUtil.getTimeDesc(duration)); } }); tv_progress.removeCallbacks(playerProcessRunnable); tv_progress.post(playerProcessRunnable); ConnectivityManager connectivityManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); setNetworkInfo(networkInfo, true); } } /** * 设置播放状态 */ private void setPlayerState() { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { VideoResourceUtil.setPlayImage(iv_play, false, isLand); aq.id(R.id.iv_play_center).visibility(View.GONE); } else { VideoResourceUtil.setPlayImage(iv_play, true, isLand); if (!isLand) { aq.id(R.id.iv_play_center).visibility(View.VISIBLE); } } } } //暂停播放 private synchronized void pausePlay() { if (mediaPlayer != null && mediaPlayer.isPlaying()) mediaPlayer.pause(); setPlayerState(); } private synchronized void continuePlay() { if (mediaPlayer != null && !mediaPlayer.isPlaying()) mediaPlayer.start(); setPlayerState(); } interface IVideoPlayerListener { //点击了暂停按钮 public void onPause(); private boolean isLock() { Object lock = iv_lock.getTag(); if (lock != null) { return true; } else { return false; } } private boolean isControllerShow() { return iv_lock.getVisibility() == View.VISIBLE; } final float FLIP_DISTANCE = 20; /** * 亮度调节 * * @param brightness */ public void setBrightness(float brightness) { if (mActivity == null) return; WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes(); lp.screenBrightness = lp.screenBrightness + brightness / 255.0f; if (lp.screenBrightness > 1) { lp.screenBrightness = 1; } else if (lp.screenBrightness < 0.05) { lp.screenBrightness = (float) 0.05; } mActivity.getWindow().setAttributes(lp); } /** * 音量调节 * * @param volume */ public void setAudio(int volume) { AudioManager audioManager = (AudioManager) getContext().getSystemService(AUDIO_SERVICE); //当前音量 int k = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); //最大音量 int max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); Log.d("==d==", "" + max); Log.d("==d==", "" + k); k = k + volume; if (k >= 0 && k <= max) { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, k, AudioManager.FLAG_PLAY_SOUND); } } public synchronized void showLoading() { aq.id(R.id.fl_loading).visibility(View.VISIBLE); } public synchronized void closeLoading() { aq.id(R.id.fl_loading).visibility(View.GONE); } /** * 释放资源 */ public void onDestory() { if (timer != null) timer.cancel(); } public interface IVideoPlayerListener { //暂停 public void onVideoPause(); //播放 public void onVideoPlay(); //下一集 public void onNext(); //返回 public void onBack(); } private boolean isLock() { return false; } //选集 public void selectEpisode(int p, VideoEpisode episode); private boolean isControllerShow() { return ll_top.getVisibility() == View.VISIBLE; //搜藏 public void collect(boolean collect); //切换清晰度 public void changeDefinition(int p, VideoDefinition definition); } //手势处理 @@ -213,9 +864,73 @@ } @Override public boolean onDoubleTapEvent(MotionEvent e) { return true; } @Override public boolean onDoubleTap(MotionEvent e) { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { pausePlay(); } else { continuePlay(); } } return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i(TAG, String.format("onScroll:起始点坐标:%s,%s", e1.getX(), e1.getY())); Log.i(TAG, String.format("onScroll:distanceX=%s distanceY=%s", distanceX, distanceY)); if (distanceX != 0) { if (Math.abs(distanceX) > FLIP_DISTANCE) {//横向滑动 if (distanceX < 0)//右滑 { Log.i(TAG, "右滑"); } else {//左滑 Log.i(TAG, "左滑"); } } else if (Math.abs(distanceY) > FLIP_DISTANCE) {//竖向滑动 boolean left; if (mActivity.getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {//横屏 if (e1.getX() < DimenUtils.getScreenHeight(mActivity) / 2) { left = true; } else { left = false; } } else {//竖屏 if (e1.getX() < DimenUtils.getScreenWidth(mActivity) / 2) { left = true; } else { left = false; } } if (left) { Log.i(TAG, "左边"); if (distanceY < 0)//下滑 { Log.i(TAG, "下滑"); } else {//上滑 Log.i(TAG, "上滑"); } //调节亮度 setBrightness(distanceY); } else { Log.i(TAG, "右边"); if (distanceY < 0)//下滑 { Log.i(TAG, "下滑"); } else {//上滑 Log.i(TAG, "上滑"); } //调节音量 setAudio((int) distanceY / 50); } } library-mine/src/com/lcjian/library/video/VideoResourceUtil.java
New file @@ -0,0 +1,42 @@ package com.lcjian.library.video; import android.view.ViewGroup; import android.widget.ImageView; import com.lcjian.library.util.common.DimenUtils; public class VideoResourceUtil { /** * 设置播放图片 * * @param iv_play * @param isPlaying * @param land */ public static void setPlayImage(ImageView iv_play, boolean isPlaying, boolean land) { String resourceName = ""; if (isPlaying) if (land) resourceName = "ic_player_play"; else resourceName = "ic_player_play_small"; else { if (land) resourceName = "ic_player_pause"; else resourceName = "ic_player_pause_small"; } iv_play.setImageResource(iv_play.getResources().getIdentifier(resourceName, "drawable", iv_play.getContext().getPackageName())); ViewGroup.LayoutParams params = iv_play.getLayoutParams(); if (land) { params.width = DimenUtils.dip2px(iv_play.getContext(), 38); params.height = DimenUtils.dip2px(iv_play.getContext(), 38); } else { params.width = ViewGroup.LayoutParams.WRAP_CONTENT; params.height = DimenUtils.dip2px(iv_play.getContext(), 14); } } } settings.gradle
@@ -1,3 +1,4 @@ include ':library-BaiduCPU' include ':library-Funshion' include ':social_sdk_library_project', ':YoukuPlayerOpenSDK' include ':MyselfSuperAd'