admin
2020-09-30 21a3b19894807c46f96e2106a5acb92d8afbd720
百度内容输出集成
3个文件已删除
2 文件已重命名
34个文件已修改
2 文件已复制
53个文件已添加
6298 ■■■■ 已修改文件
BuWanVideo/AndroidManifest.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/build.gradle 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/libs/FunshionAD-1.3.7.aar 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/libs/FunshionBase-1.0.5.aar 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/libs/FunshionPlaySDK-1.6.1.aar 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/libs/YmSdk20200820.aar 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/libs/android-query-full.0.26.7.jar 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/layout/act_login.xml 569 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/layout/fragment_player_funshion.xml 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/layout/video_detail_activity.xml 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/values/strings.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/res/xml/bd_file_paths.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/entity/VideoDetailInfo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/entity/video/FunshionPlayInfo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/SplashActivity.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/common/VideosFragment.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/login/LoginActivity.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/main/HomeFragment.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/main/MainActivity.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/EpisodeFragment.java 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity2.java 1083 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailFragment.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoEpisodeFragment.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoEpisodeFragment2.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/recommend/RecommendFragment.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/video/FunshionPlayerFragment.java 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/ui/video/SearchResultAdapter.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/util/BeibeiConstant.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/util/ExitDialog.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/util/FunshionConstant.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BuWanVideo/src/com/weikou/beibeivideo/util/ad/FullVideoAdManager.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/build.gradle 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/consumer-rules.pro 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/libs/Baidu_MobAds_SDK-release.aar 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/proguard-rules.pro 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/androidTest/java/com/yeshi/ec/library_baiducpu/ExampleInstrumentedTest.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/AndroidManifest.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/entity/NativeCPUView.java 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/entity/SpinnerItem.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuNewsContentFragment.java 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuNewsFragment.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuShortVideosFragment.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/java/com/yeshi/ec/library_baiducpu/fragment/BaiDuVideosFragment.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/drawable-xhdpi/mob_adicon_2x.png 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/drawable-xhdpi/new_bg_logo.png 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/drawable-xxhdpi/biz_video_list_play_icon_big.png 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/drawable/btn_square_round_corner_blue.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/drawable/close_icon.png 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/drawable/rldownload_square_bg_gray.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/layout/fragment_baidu_news_content.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/layout/fragment_baidu_news_root.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/layout/fragment_baidu_short_video.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/layout/item_baidu_news.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/layout/native_cpu_view.xml 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/main/res/values/styles.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-BaiduCPU/src/test/java/com/yeshi/ec/library_baiducpu/ExampleUnitTest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/build.gradle 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/libs/FunshionAD-1.0.0.aar 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/libs/FunshionAD-1.3.7.aar 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/src/androidTest/java/com/yeshi/ec/funshion/ExampleInstrumentedTest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/src/main/AndroidManifest.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-Funshion/src/test/java/com/yeshi/ec/funshion/ExampleUnitTest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-ViewPagerIndicator/src/com/viewpagerindicator/FoundPageIndicator.java 349 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/AndroidManifest.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/build.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/libs/android-query-full.0.26.7.jar 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_dialog_close.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_loading.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_next.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_pause_small.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable-xhdpi/ic_player_play_small.png 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/shape_player_episode.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/drawable/shape_player_episode_highlight.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout-land/video_player_controller.xml 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/item_player_definition.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/item_player_episode.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/item_player_loading.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/item_player_share.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/res/layout/video_player_controller.xml 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/entity/eventbus/PlayerControllerShow.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/entity/eventbus/PlayerLock.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/util/DialogUtils.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/util/common/DimenUtils.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/util/common/TimeUtil.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoDefinition.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoEpisode.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoEpisodeDialog.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoLoadingDialog.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoPlayerController.java 847 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-mine/src/com/lcjian/library/video/VideoResourceUtil.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
settings.gradle 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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.aar
Binary files differ
BuWanVideo/libs/FunshionBase-1.0.5.aar
Binary files differ
BuWanVideo/libs/FunshionPlaySDK-1.6.1.aar
Binary files differ
BuWanVideo/libs/YmSdk20200820.aar
Binary files differ
BuWanVideo/libs/android-query-full.0.26.7.jar
Binary 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.aar
Binary 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.java
copy 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.aar
Binary files differ
library-Funshion/libs/FunshionAD-1.3.7.aar
Binary 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.java
copy 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.jar
Binary files differ
library-mine/res/drawable-xhdpi/ic_player_dialog_close.png
library-mine/res/drawable-xhdpi/ic_player_loading.png

library-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'