Commit 4e2e7482 authored by jyx's avatar jyx

添加激励视频,添加推荐页面布局

parent c14e01ff
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_15" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
......
...@@ -63,6 +63,7 @@ android { ...@@ -63,6 +63,7 @@ android {
buildConfigField "String", "MainIp", DEBUG_URL buildConfigField "String", "MainIp", DEBUG_URL
buildConfigField "String", "GROMORE_APP_ID", GROMORE_APP_ID buildConfigField "String", "GROMORE_APP_ID", GROMORE_APP_ID
buildConfigField "String", "GROMORE_SPLASH_CODE", GROMORE_SPLASH_CODE buildConfigField "String", "GROMORE_SPLASH_CODE", GROMORE_SPLASH_CODE
buildConfigField "String", "GROMORE_VIDEO_CODE", GROMORE_VIDEO_CODE
buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID
//混淆 //混淆
...@@ -81,6 +82,7 @@ android { ...@@ -81,6 +82,7 @@ android {
buildConfigField "String", "MainIp", RELEASE_URL buildConfigField "String", "MainIp", RELEASE_URL
buildConfigField "String", "GROMORE_APP_ID", GROMORE_APP_ID buildConfigField "String", "GROMORE_APP_ID", GROMORE_APP_ID
buildConfigField "String", "GROMORE_SPLASH_CODE", GROMORE_SPLASH_CODE buildConfigField "String", "GROMORE_SPLASH_CODE", GROMORE_SPLASH_CODE
buildConfigField "String", "GROMORE_VIDEO_CODE", GROMORE_VIDEO_CODE
buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID
//混淆 //混淆
......
...@@ -58,11 +58,7 @@ ...@@ -58,11 +58,7 @@
android:configChanges="orientation|screenSize|keyboardHidden" android:configChanges="orientation|screenSize|keyboardHidden"
android:exported="true" android:exported="true"
android:theme="@style/AppTheme.TranslucentSplish"> android:theme="@style/AppTheme.TranslucentSplish">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.activitys.SplashAdActivity" android:name=".ui.activitys.SplashAdActivity"
...@@ -78,10 +74,16 @@ ...@@ -78,10 +74,16 @@
<activity <activity
android:name=".ui.activitys.MainActivity" android:name=".ui.activitys.MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false" android:exported="true"
android:launchMode="singleTask" android:launchMode="singleTask"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoneTranslucent" /> android:theme="@style/AppTheme.NoneTranslucent">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity <activity
android:name=".ui.activitys.WebActivity" android:name=".ui.activitys.WebActivity"
android:exported="false" android:exported="false"
......
package com.mints.wisdomclean.ad
import android.app.Activity
import com.mints.wisdomclean.ad.video.InMoneyVideo
/**
* 预加载-全屏及激励视频管理类
*/
class AdManager {
private val TAG = AdManager::class.java.simpleName
companion object {
const val AD_NO_SHOWTIME_OUT = 50 // 广告请示成功但在规定时间内未展示
const val AD_REQUEST_TIME_OUT = 1 // 广告预加载时长超时
val instance: AdManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
AdManager()
}
}
/**
* 根据服务器概率预加载广告
*
* isPreLoad:是否是预加载调用,需要躲避监听
*/
fun preLoadAd(activity: Activity, isPreLoad: Boolean = false) {
// 加载激励视频广告
this.loadRewardVideo(activity, isPreLoad)
}
/**
* 根据预加载类型 展示广告
*/
fun showAd(
activity: Activity,
carrierType: String,
AdStatusListener: AdStatusListener?,
) {
// 加载激励视频广告
showRewardVideo(activity, AdStatusListener, carrierType)
}
// 预加载激励视频广告
private fun loadRewardVideo(activity: Activity, isPreLoad: Boolean = false) {
InMoneyVideo.getInstance().preLoadAd(activity, isPreLoad)
}
// 展示激励视频广告
private fun showRewardVideo(
activity: Activity,
AdStatusListener: AdStatusListener?,
carrierType: String,
) {
InMoneyVideo.getInstance()
.showRewardAd(
activity,
AdStatusListener,
carrierType,
)
}
/**
* 开屏页使用-预加载广告
*/
fun splashPreLoadAll(activity: Activity) {
this.loadRewardVideo(activity)
}
}
\ No newline at end of file
package com.mints.wisdomclean.ad
/**
* 广告状态触发事件
*/
abstract class AdNoProListener : IAdNoProListener {
}
interface IAdNoProListener {
fun adFail()
fun adSuccess()
fun adClose()
}
\ No newline at end of file
package com.mints.wisdomclean.ad
import android.app.Activity
import com.mints.wisdomclean.ad.video.InMoneyVideoNoPre
/**
* 实时加载激励视频、全屏
*/
object NoPreAdManager {
private val TAG = NoPreAdManager::class.java.simpleName
fun loadVideoAd(
activity: Activity,
carrierType: String,
listener: AdNoProListener?
) {
val adNoProListener = object : AdNoProListener() {
override fun adFail() {
listener?.adFail()
}
override fun adSuccess() {
listener?.adSuccess()
}
override fun adClose() {
listener?.adClose()
}
}
InMoneyVideoNoPre.getInstance().loadAd(activity, adNoProListener, carrierType)
}
}
\ No newline at end of file
package com.mints.wisdomclean.ad.video;
import android.app.Activity;
import com.bytedance.msdk.api.AdError;
import com.bytedance.msdk.api.reward.RewardItem;
import com.bytedance.msdk.api.v2.GMAdConstant;
import com.bytedance.msdk.api.v2.GMMediationAdSdk;
import com.bytedance.msdk.api.v2.GMSettingConfigCallback;
import com.bytedance.msdk.api.v2.ad.reward.GMRewardAd;
import com.bytedance.msdk.api.v2.ad.reward.GMRewardedAdListener;
import com.bytedance.msdk.api.v2.ad.reward.GMRewardedAdLoadCallback;
import com.bytedance.msdk.api.v2.slot.GMAdOptionUtil;
import com.bytedance.msdk.api.v2.slot.GMAdSlotRewardVideo;
import com.mints.wisdomclean.BuildConfig;
import com.mints.wisdomclean.ad.AdManager;
import com.mints.wisdomclean.ad.AdStatusListener;
import com.mints.wisdomclean.common.Constant;
import com.mints.wisdomclean.manager.TrackManager;
import com.mints.wisdomclean.manager.UserManager;
import com.mints.wisdomclean.utils.LogUtil;
import com.mints.wisdomclean.utils.TimeRender;
import java.lang.ref.WeakReference;
import java.util.HashMap;
/**
* 应用内-GroMore激励视频广告
* <p>
* 注意*****这个类有预加载逻辑,只能在网赚使用,不能复用
*/
public class InMoneyVideo {
private static final String TAG = InMoneyVideo.class.getSimpleName();
private static InMoneyVideo _inst;
public static InMoneyVideo getInstance() {
if (_inst == null) {
_inst = new InMoneyVideo();
}
return _inst;
}
private InMoneyVideo() {
}
private String carrierType = "";
// 当前播放的广告
private String nowAdcode = "";
private String nowEcpm = "";
private String nowAdSource = "";
// 之前的广告
private String preAdcode = "";
private String preEcpm = "";
private String preAdSource = "";
private int isLoadSuccess = 0; // 0-加载失败/未加载 1-加载中 2-加载成功
private long adLoadTime = 0; // 广告展示时间,45分钟后当前广告失效,重新预加载广告
private long adPreingTime = 0; // 防止预加载超时 2分钟
private GMRewardAd mttRewardAd;
private WeakReference<Activity> weakActivity;
private boolean isClickScreen = true; // 是否点击屏幕跳转广告
private boolean isPreLoad = false;//是否是预加载调用,需要躲避监听
private AdStatusListener adStatusListener;
/**
* 激励视频
*/
public void preLoadAd(Activity activity, boolean isPreLoad) {
this.isPreLoad = isPreLoad;
boolean isOversped = TimeRender.INSTANCE.isOverspedMin(adLoadTime, AdManager.AD_NO_SHOWTIME_OUT);
boolean isPreingOversped = TimeRender.INSTANCE.isOverspedMin(adPreingTime, AdManager.AD_REQUEST_TIME_OUT);
isClickScreen = true;
this.weakActivity = new WeakReference(activity);
LogUtil.d(TAG, "gromore应用内激励视频广告-> 1、进入预加载 isPreLoad[为true是预加载调用]=" + isPreLoad);
if ((isLoadSuccess == 0 // 加载失败
|| (adLoadTime > 0 && isOversped) // 超过45分钟
|| (adPreingTime > 0 && isPreingOversped
&& isLoadSuccess == 1)) // 预加载超时
&& this.weakActivity.get() != null) {
adPreingTime = System.currentTimeMillis();
isLoadSuccess = 1;
LogUtil.d(TAG, "gromore应用内激励视频广告-> 2、执行预加载去了=" + isLoadSuccess);
/*
* 判断当前是否存在config 配置 ,如果存在直接加载广告 ,如果不存在则注册config加载回调
*/
if (GMMediationAdSdk.configLoadSuccess()) {
preLoadAd(BuildConfig.GROMORE_VIDEO_CODE, GMAdConstant.VERTICAL);
} else {
GMMediationAdSdk.registerConfigCallback(mSettingConfigCallback); //不用使用内部类,否则在ondestory中无法移除该回调
}
}
}
public void showRewardAd(Activity _activity, AdStatusListener adStatusListener
, String carrier) {
this.carrierType = carrier;
this.adStatusListener = adStatusListener;
this.weakActivity = new WeakReference(_activity);
if (isLoadSuccess == 0) {
LogUtil.e(TAG, "gromore应用内激励视频广告--> showRewardAd isLoadSuccess=" + isLoadSuccess);
if (this.adStatusListener != null)
this.adStatusListener.adFail();
return;
}
// 请求未超过1分钟且上一个广告还在异步加载中,这次触发展示广告回调还没回来则返回
boolean isPreingOversped = TimeRender.INSTANCE.isOverspedMin(adPreingTime, AdManager.AD_REQUEST_TIME_OUT);
if (isLoadSuccess == 1 && isPreingOversped) {
LogUtil.e(TAG, "gromore应用内激励视频广告-->请求未超过1分钟且上一个广告还在异步加载中 isLoadSuccess=" + isLoadSuccess + " isPreingOversped=" + isPreingOversped);
if (this.adStatusListener != null)
this.adStatusListener.adFail();
return;
}
// 预加载广告成功 且 预加载广告时长未超过45分钟
boolean isOversped = TimeRender.INSTANCE.isOverspedMin(adLoadTime, AdManager.AD_NO_SHOWTIME_OUT);
if (isLoadSuccess == 2
&& !isOversped
&& mttRewardAd != null && mttRewardAd.isReady() && this.weakActivity.get() != null) {
isClickScreen = true;
//在获取到广告后展示,强烈建议在onRewardVideoCached回调后,展示广告,提升播放体验
//该方法直接展示广告
//展示广告,并传入广告展示的场景
mttRewardAd.setRewardAdListener(mTTRewardedAdListener);
mttRewardAd.showRewardAd(this.weakActivity.get());
} else {
if (this.adStatusListener != null)
this.adStatusListener.adFail();
LogUtil.e(TAG, "gromore应用内激励视频广告--> 5、展示广告时失败了,广告可能超时45分钟 onError ");
}
// 广告加载完成状态重置
isLoadSuccess = 0;
}
private void preLoadAd(final String adUnitId, int orientation) {
/*
* 注:每次加载激励视频广告的时候需要新建一个TTRewardAd,否则可能会出现广告填充问题
* ( 例如:mttRewardAd = new TTRewardAd(this, adUnitId);)
*/
mttRewardAd = new GMRewardAd(this.weakActivity.get(), adUnitId);
GMAdSlotRewardVideo adSlotRewardVideo = new GMAdSlotRewardVideo.Builder()
.setMuted(true)//对所有SDK的激励广告生效,除需要在平台配置的SDK,如穿山甲SDK
.setVolume(0f)//配合Admob的声音大小设置[0-1]
.setGMAdSlotGDTOption(GMAdOptionUtil.getGMAdSlotGDTOption().build())
.setGMAdSlotBaiduOption(GMAdOptionUtil.getGMAdSlotBaiduOption().build())
.setRewardName("金币") //奖励的名称
.setRewardAmount(0) //奖励的数量
.setUserID(UserManager.getInstance().getUserID())//用户id,必传参数
.setUseSurfaceView(false)
.setOrientation(orientation)//必填参数,期望视频的播放方向:GMAdConstant.HORIZONTAL 或 GMAdConstant.VERTICAL
.build();
//请求广告
mttRewardAd.loadAd(adSlotRewardVideo, new GMRewardedAdLoadCallback() {
@Override
public void onRewardVideoLoadFail(AdError adError) {
isLoadSuccess = 0;
LogUtil.e(TAG, "onError " + adError.code + adError.message + "isPreLoad[为true是预加载调用]=" + isPreLoad);
// isPreLoad=true 表示是预加载调用 不需要调用监听回调
if (!isPreLoad) {
if (adStatusListener != null) {
adStatusListener.adFail();
}
}
isPreLoad = false;
}
@Override
public void onRewardVideoAdLoad() {
}
@Override
public void onRewardVideoCached() {
// LogUtil.e(TAG, "InMoneyVideoNoPre应用内激励视频广告-->List " + JsonUtil.toJson(mttRewardAd.getAdLoadInfoList()));
LogUtil.d(TAG, "gromore应用内激励视频广告--> 4、onRewardVideoCached adUnitId=" + adUnitId);
isLoadSuccess = 2;
adLoadTime = System.currentTimeMillis();
if (adStatusListener != null) {
adStatusListener.adSuccess();
}
}
});
}
/**
* config回调
*/
private final GMSettingConfigCallback mSettingConfigCallback = () -> preLoadAd(BuildConfig.GROMORE_VIDEO_CODE, GMAdConstant.VERTICAL);
/**
* 激励视频交互回调
*/
private final GMRewardedAdListener mTTRewardedAdListener = new GMRewardedAdListener() {
/**
* 广告的展示回调 每个广告仅回调一次
*/
public void onRewardedAdShow() {
if (mttRewardAd != null) {
if (mttRewardAd.getShowEcpm() != null) {
nowAdcode = mttRewardAd.getShowEcpm().getAdNetworkRitId();
nowEcpm = mttRewardAd.getShowEcpm().getPreEcpm();
nowAdSource = mttRewardAd.getShowEcpm().getAdNetworkPlatformName();
}
HashMap<String, Object> vo = new HashMap<>();
vo.put("adcode", nowAdcode);
vo.put("ecpm", nowEcpm);
vo.put("adSource", nowAdSource);
vo.put("carrierType", carrierType);
vo.put("adType", Constant.GRO_MORE_ADTYPE2);
vo.put("adid", BuildConfig.GROMORE_VIDEO_CODE);
vo.put("isAddCoin", true);
TrackManager.getInstance().cmtGroMoreInfo(vo);
TrackManager.getInstance().reporGromeEcpm(vo);
}
LogUtil.d(TAG, "gromore应用内激励视频广告-->onRewardedAdShow");
if (weakActivity.get() != null) {
preAdcode = nowAdcode;
preEcpm = nowEcpm;
preAdSource = nowAdSource;
LogUtil.d(TAG, "gromore应用内激励视频广告->onFullVideoAdShow 触发预加载下次广告");
AdManager.Companion.getInstance().preLoadAd(weakActivity.get(), true);
}
}
@Override
public void onRewardedAdShowFail(AdError adError) {
isLoadSuccess = 0;
LogUtil.e(TAG, "gromore应用内激励视频广告-->onRewardedAdShowFail");
}
/**
* 注意Admob的激励视频不会回调该方法
*/
@Override
public void onRewardClick() {
LogUtil.d(TAG, "gromore应用内激励视频广告-->onRewardClick");
if (isClickScreen) {
// 防止重复
isClickScreen = false;
}
}
/**
* 广告关闭的回调
*/
public void onRewardedAdClosed() {
LogUtil.d(TAG, "gromore应用内激励视频广告-->onRewardedAdClosed preAdcode=" + preAdcode);
if (adStatusListener != null) {
adStatusListener.adClose();
}
adStatusListener = null;
}
/**
* 视频播放完毕的回调 Admob广告不存在该回调
*/
public void onVideoComplete() {
LogUtil.d(TAG, "onVideoComplete");
}
/**
* 视频播放失败的回调 - Mintegral GDT Admob广告不存在该回调
*/
public void onVideoError() {
isLoadSuccess = 0;
LogUtil.e(TAG, "gromore应用内激励视频广告-->onVideoError");
if (adStatusListener != null) {
adStatusListener.adFail();
}
}
/**
* 激励视频播放完毕,验证是否有效发放奖励的回调
*/
public void onRewardVerify(RewardItem rewardItem) {
// Map<String, Object> customData = rewardItem.getCustomData();
// if (customData != null) {
// String adnName = (String) customData.get(RewardItem.KEY_ADN_NAME);
// if (RewardItem.KEY_GDT.equals(adnName)) {
// LogUtil.d(TAG, "rewardItem gdt: " + customData.get(RewardItem.KEY_GDT_TRANS_ID));
// }
// }
}
/**
* - Mintegral GDT Admob广告不存在该回调
*/
@Override
public void onSkippedVideo() {
}
};
}
package com.mints.wisdomclean.ad.video;
import android.app.Activity;
import com.bytedance.msdk.api.AdError;
import com.bytedance.msdk.api.reward.RewardItem;
import com.bytedance.msdk.api.v2.GMAdConstant;
import com.bytedance.msdk.api.v2.GMMediationAdSdk;
import com.bytedance.msdk.api.v2.GMSettingConfigCallback;
import com.bytedance.msdk.api.v2.ad.reward.GMRewardAd;
import com.bytedance.msdk.api.v2.ad.reward.GMRewardedAdListener;
import com.bytedance.msdk.api.v2.ad.reward.GMRewardedAdLoadCallback;
import com.bytedance.msdk.api.v2.slot.GMAdOptionUtil;
import com.bytedance.msdk.api.v2.slot.GMAdSlotRewardVideo;
import com.mints.library.utils.json.JsonUtil;
import com.mints.wisdomclean.BuildConfig;
import com.mints.wisdomclean.ad.AdNoProListener;
import com.mints.wisdomclean.common.Constant;
import com.mints.wisdomclean.manager.TrackManager;
import com.mints.wisdomclean.manager.UserManager;
import com.mints.wisdomclean.utils.LogUtil;
import java.lang.ref.WeakReference;
import java.util.HashMap;
/**
* **实时加载
* <p>
* 应用内-GroMore激励视频广告
*/
public class InMoneyVideoNoPre {
private static final String TAG = InMoneyVideoNoPre.class.getSimpleName();
private static InMoneyVideoNoPre _inst;
public static InMoneyVideoNoPre getInstance() {
if (_inst == null) {
_inst = new InMoneyVideoNoPre();
}
return _inst;
}
private InMoneyVideoNoPre() {
}
private String carrierType = "";
// 当前播放的广告
private String nowAdcode = "";
private String nowEcpm = "";
private String nowAdSource = "";
private GMRewardAd mttRewardAd;
private WeakReference<Activity> weakActivity;
private boolean isClickScreen = true; // 是否点击屏幕跳转广告
private AdNoProListener adNoProListener;
/**
* 激励视频
*/
public void loadAd(Activity _activity, AdNoProListener adNoProListener, String carrier) {
this.carrierType = carrier;
this.adNoProListener = adNoProListener;
this.weakActivity = new WeakReference(_activity);
this.isClickScreen = true;
/*
* 判断当前是否存在config 配置 ,如果存在直接加载广告 ,如果不存在则注册config加载回调
*/
if (GMMediationAdSdk.configLoadSuccess()) {
preLoadAd(BuildConfig.GROMORE_VIDEO_CODE, GMAdConstant.VERTICAL);
} else {
GMMediationAdSdk.registerConfigCallback(mSettingConfigCallback); //不用使用内部类,否则在ondestory中无法移除该回调
}
}
private void preLoadAd(final String adUnitId, int orientation) {
/*
* 注:每次加载激励视频广告的时候需要新建一个TTRewardAd,否则可能会出现广告填充问题
* ( 例如:mttRewardAd = new TTRewardAd(this, adUnitId);)
*/
mttRewardAd = new GMRewardAd(this.weakActivity.get(), adUnitId);
GMAdSlotRewardVideo adSlotRewardVideo = new GMAdSlotRewardVideo.Builder()
.setMuted(true)//对所有SDK的激励广告生效,除需要在平台配置的SDK,如穿山甲SDK
.setVolume(0f)//配合Admob的声音大小设置[0-1]
.setGMAdSlotGDTOption(GMAdOptionUtil.getGMAdSlotGDTOption().build())
.setGMAdSlotBaiduOption(GMAdOptionUtil.getGMAdSlotBaiduOption().build())
.setRewardName("金币") //奖励的名称
.setRewardAmount(0) //奖励的数量
.setUserID(UserManager.getInstance().getUserID())//用户id,必传参数
.setUseSurfaceView(false)
.setOrientation(orientation)//必填参数,期望视频的播放方向:GMAdConstant.HORIZONTAL 或 GMAdConstant.VERTICAL
.build();
//请求广告
mttRewardAd.loadAd(adSlotRewardVideo, new GMRewardedAdLoadCallback() {
@Override
public void onRewardVideoLoadFail(AdError adError) {
LogUtil.e(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onError " + adError.code + adError.message + " id=" + adUnitId);
LogUtil.e(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onRewardVideoLoadFail result=" + JsonUtil.toJson(mttRewardAd.getAdLoadInfoList()));
if (adNoProListener != null) {
adNoProListener.adFail();
}
}
@Override
public void onRewardVideoAdLoad() {
}
@Override
public void onRewardVideoCached() {
LogUtil.d(TAG, "InMoneyVideoNoPre应用内激励视频广告--> 4、onRewardVideoCached id=" + adUnitId);
if (mttRewardAd != null && weakActivity != null) {
mttRewardAd.setRewardAdListener(mTTRewardedAdListener);
mttRewardAd.showRewardAd(weakActivity.get());
} else {
LogUtil.e(TAG, " onRewardVideoCached onError ");
if (adNoProListener != null) {
adNoProListener.adFail();
}
}
}
});
}
/**
* config回调
*/
private final GMSettingConfigCallback mSettingConfigCallback = () -> preLoadAd(BuildConfig.GROMORE_VIDEO_CODE, GMAdConstant.VERTICAL);
/**
* 激励视频交互回调
*/
private final GMRewardedAdListener mTTRewardedAdListener = new GMRewardedAdListener() {
/**
* 广告的展示回调 每个广告仅回调一次
*/
public void onRewardedAdShow() {
if (adNoProListener != null) {
adNoProListener.adSuccess();
}
if (mttRewardAd != null) {
if (mttRewardAd.getShowEcpm() != null) {
nowAdcode = mttRewardAd.getShowEcpm().getAdNetworkRitId();
nowEcpm = mttRewardAd.getShowEcpm().getPreEcpm();
nowAdSource = mttRewardAd.getShowEcpm().getAdNetworkPlatformName();
}
HashMap<String, Object> vo = new HashMap<>();
vo.put("adcode", nowAdcode);
vo.put("ecpm", nowEcpm);
vo.put("adSource", nowAdSource);
vo.put("carrierType", carrierType);
vo.put("adType", Constant.GRO_MORE_ADTYPE2);
vo.put("adid", BuildConfig.GROMORE_VIDEO_CODE);
vo.put("isAddCoin", true);
TrackManager.getInstance().cmtGroMoreInfo(vo);
TrackManager.getInstance().reporGromeEcpm(vo);
}
LogUtil.d(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onRewardedAdShow");
// 预加载
// if (weakActivity.get() != null) {
// LogUtil.d(TAG, "InMoneyVideoNoPre应用内激励视频广告->onFullVideoAdShow 触发预加载下次广告");
// AdManager.Companion.getInstance().preLoadAd(weakActivity.get(),true);
// }
}
@Override
public void onRewardedAdShowFail(AdError adError) {
LogUtil.e(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onRewardedAdShowFail msg=" + adError.message);
}
/**
* 注意Admob的激励视频不会回调该方法
*/
@Override
public void onRewardClick() {
LogUtil.d(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onRewardClick");
if (isClickScreen) {
// 防止重复
isClickScreen = false;
}
}
/**
* 广告关闭的回调
*/
public void onRewardedAdClosed() {
LogUtil.d(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onRewardedAdClosed nowAdcode=" + nowAdcode);
if (adNoProListener != null) {
adNoProListener.adClose();
}
adNoProListener = null;
}
/**
* 视频播放完毕的回调 Admob广告不存在该回调
*/
public void onVideoComplete() {
LogUtil.d(TAG, "onVideoComplete");
}
/**
* 视频播放失败的回调 - Mintegral GDT Admob广告不存在该回调
*/
public void onVideoError() {
LogUtil.e(TAG, "InMoneyVideoNoPre应用内激励视频广告-->onVideoError");
if (adNoProListener != null) {
adNoProListener.adFail();
}
}
/**
* 激励视频播放完毕,验证是否有效发放奖励的回调
*/
public void onRewardVerify(RewardItem rewardItem) {
// Map<String, Object> customData = rewardItem.getCustomData();
// if (customData != null) {
// String adnName = (String) customData.get(RewardItem.KEY_ADN_NAME);
// if (RewardItem.KEY_GDT.equals(adnName)) {
// LogUtil.d(TAG, "rewardItem gdt: " + customData.get(RewardItem.KEY_GDT_TRANS_ID));
// }
// }
}
/**
* - Mintegral GDT Admob广告不存在该回调
*/
@Override
public void onSkippedVideo() {
}
};
}
...@@ -2,6 +2,10 @@ package com.mints.wisdomclean.common ...@@ -2,6 +2,10 @@ package com.mints.wisdomclean.common
object Constant { object Constant {
const val GRO_MORE_ADTYPE2 = "2"
const val AD_SOURCE_GROMORE = "GROMORE"
/** /**
* 首次弹出权限声明 * 首次弹出权限声明
*/ */
......
package com.mints.wisdomclean.manager; package com.mints.wisdomclean.manager;
import android.text.TextUtils;
import com.mints.wisdomclean.MintsApplication; import com.mints.wisdomclean.MintsApplication;
import com.mints.wisdomclean.mvp.presenters.TrackPresenter; import com.mints.wisdomclean.mvp.presenters.TrackPresenter;
import java.util.HashMap;
/** /**
* 描述:离线管理器 * 描述:离线管理器
*/ */
...@@ -39,4 +43,17 @@ public class TrackManager { ...@@ -39,4 +43,17 @@ public class TrackManager {
} }
} }
public void cmtGroMoreInfo(HashMap<String, Object> vo) {
if (trackPresenter != null && !TextUtils.isEmpty(UserManager.getInstance().getUserID())) {
trackPresenter.cmtGroMoreInfo(vo);
}
}
public void reporGromeEcpm(HashMap<String, Object> vo) {
if (trackPresenter != null && !TextUtils.isEmpty(UserManager.getInstance().getUserID())) {
trackPresenter.reporGromeEcpm(vo);
}
}
} }
package com.mints.wisdomclean.mvp.presenters; package com.mints.wisdomclean.mvp.presenters;
import com.google.gson.JsonObject;
import com.mints.library.net.neterror.BaseSubscriber; import com.mints.library.net.neterror.BaseSubscriber;
import com.mints.library.net.neterror.Throwable; import com.mints.library.net.neterror.Throwable;
import com.mints.wisdomclean.MintsApplication; import com.mints.wisdomclean.MintsApplication;
import com.mints.wisdomclean.common.AppConfig;
import com.mints.wisdomclean.common.DeviceInfo; import com.mints.wisdomclean.common.DeviceInfo;
import com.mints.wisdomclean.manager.AppHttpManager; import com.mints.wisdomclean.manager.AppHttpManager;
import com.mints.wisdomclean.manager.UserManager; import com.mints.wisdomclean.manager.UserManager;
...@@ -72,4 +74,43 @@ public class TrackPresenter extends BaseTrackPresenter { ...@@ -72,4 +74,43 @@ public class TrackPresenter extends BaseTrackPresenter {
}); });
} }
public void cmtGroMoreInfo(HashMap<String, Object> vo) {
AppHttpManager.getInstance(loanApplication)
.call(loanService.reportAdIncome(vo),
new BaseSubscriber<BaseResponse<Object>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(BaseResponse<Object> baseResponse) {
}
});
}
public void reporGromeEcpm(HashMap<String, Object> vo) {
AppHttpManager.getInstance(loanApplication)
.call(loanService.reporGromeEcpm(vo),
new BaseSubscriber<BaseResponse<JsonObject>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(BaseResponse<JsonObject> baseResponse) {
}
});
}
} }
...@@ -141,6 +141,23 @@ public interface LoanService { ...@@ -141,6 +141,23 @@ public interface LoanService {
@POST("api/vip/unSign") @POST("api/vip/unSign")
Observable<BaseResponse<JsonObject>> unSign(); Observable<BaseResponse<JsonObject>> unSign();
/**
* groMore数据提交
*
* @return
*/
@POST("api/reportAdIncome")
Observable<BaseResponse<Object>> reportAdIncome(@Body Map<String, Object> vo);
/**
* groMore激励视频展示广告提交数据
*
* @return
*/
@POST("api/reporGromeEcpm")
Observable<BaseResponse<JsonObject>> reporGromeEcpm(@Body Map<String, Object> vo);
/** /**
* 默认http工厂 * 默认http工厂
*/ */
......
...@@ -23,6 +23,7 @@ import com.mints.wisdomclean.common.Constant ...@@ -23,6 +23,7 @@ import com.mints.wisdomclean.common.Constant
import com.mints.wisdomclean.ui.activitys.base.BaseActivity import com.mints.wisdomclean.ui.activitys.base.BaseActivity
import com.mints.wisdomclean.ui.fragment.MainFragment import com.mints.wisdomclean.ui.fragment.MainFragment
import com.mints.wisdomclean.ui.fragment.MyFragment import com.mints.wisdomclean.ui.fragment.MyFragment
import com.mints.wisdomclean.ui.fragment.RecommendFragment
import com.mints.wisdomclean.ui.widgets.DialogListener import com.mints.wisdomclean.ui.widgets.DialogListener
import com.mints.wisdomclean.ui.widgets.PhoneDialog import com.mints.wisdomclean.ui.widgets.PhoneDialog
...@@ -37,11 +38,12 @@ class MainActivity : BaseActivity(), View.OnClickListener { ...@@ -37,11 +38,12 @@ class MainActivity : BaseActivity(), View.OnClickListener {
var contentLayout: LinearLayout? = null var contentLayout: LinearLayout? = null
var tabIvLoan: ImageView? = null var tabIvLoan: ImageView? = null
var tabIvRecommend: ImageView? = null
var tabIvMy: ImageView? = null var tabIvMy: ImageView? = null
// 底部标签切换的Fragment // 底部标签切换的Fragment
private var mainFragment: Fragment? = null private var mainFragment: Fragment? = null
private var recommendFragment: Fragment? = null
private var myFragment: Fragment? = null private var myFragment: Fragment? = null
private var currentFragment: Fragment? = null private var currentFragment: Fragment? = null
private var phoneDialog: PhoneDialog? = null private var phoneDialog: PhoneDialog? = null
...@@ -54,9 +56,12 @@ class MainActivity : BaseActivity(), View.OnClickListener { ...@@ -54,9 +56,12 @@ class MainActivity : BaseActivity(), View.OnClickListener {
audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
contentLayout = findViewById(R.id.content_layout) contentLayout = findViewById(R.id.content_layout)
tabIvLoan = findViewById(R.id.tab_iv_loan) tabIvLoan = findViewById(R.id.tab_iv_loan)
tabIvRecommend = findViewById(R.id.tab_iv_recommend)
tabIvMy = findViewById(R.id.tab_iv_my) tabIvMy = findViewById(R.id.tab_iv_my)
findViewById<View>(R.id.tab_rl_loan).setOnClickListener(this) findViewById<View>(R.id.tab_rl_loan).setOnClickListener(this)
findViewById<View>(R.id.tab_iv_recommend).setOnClickListener(this)
findViewById<View>(R.id.tab_rl_my).setOnClickListener(this) findViewById<View>(R.id.tab_rl_my).setOnClickListener(this)
AppConfig.fragmentClickFlag = Constant.FRAGMENT_CLICK_ONE AppConfig.fragmentClickFlag = Constant.FRAGMENT_CLICK_ONE
if (mainFragment == null) { if (mainFragment == null) {
...@@ -177,7 +182,8 @@ class MainActivity : BaseActivity(), View.OnClickListener { ...@@ -177,7 +182,8 @@ class MainActivity : BaseActivity(), View.OnClickListener {
override fun onClick(view: View) { override fun onClick(view: View) {
when (view.id) { when (view.id) {
R.id.tab_rl_loan -> clickTab1Layout() R.id.tab_rl_loan -> clickTab1Layout()
R.id.tab_rl_my -> clickTab2Layout() R.id.tab_iv_recommend -> clickTab2Layout()
R.id.tab_rl_my -> clickTab3Layout()
} }
} }
...@@ -191,22 +197,39 @@ class MainActivity : BaseActivity(), View.OnClickListener { ...@@ -191,22 +197,39 @@ class MainActivity : BaseActivity(), View.OnClickListener {
} }
addOrShowFragment(supportFragmentManager.beginTransaction(), mainFragment!!) addOrShowFragment(supportFragmentManager.beginTransaction(), mainFragment!!)
tabIvLoan!!.isSelected = true tabIvLoan!!.isSelected = true
tabIvRecommend!!.isSelected = false
tabIvMy!!.isSelected = false tabIvMy!!.isSelected = false
} }
/** /**
* 点击第个tab * 点击第个tab
*/ */
fun clickTab2Layout() { fun clickTab2Layout() {
AppConfig.fragmentClickFlag = Constant.FRAGMENT_CLICK_TWO
if (recommendFragment == null) {
recommendFragment = RecommendFragment()
}
addOrShowFragment(supportFragmentManager.beginTransaction(), recommendFragment!!)
tabIvLoan!!.isSelected = false
tabIvRecommend!!.isSelected = true
tabIvMy!!.isSelected = false
}
/**
* 点击第三个tab
*/
fun clickTab3Layout() {
AppConfig.fragmentClickFlag = Constant.FRAGMENT_CLICK_THREE AppConfig.fragmentClickFlag = Constant.FRAGMENT_CLICK_THREE
if (myFragment == null) { if (myFragment == null) {
myFragment = MyFragment() myFragment = MyFragment()
} }
addOrShowFragment(supportFragmentManager.beginTransaction(), myFragment!!) addOrShowFragment(supportFragmentManager.beginTransaction(), myFragment!!)
tabIvLoan!!.isSelected = false tabIvLoan!!.isSelected = false
tabIvRecommend!!.isSelected = false
tabIvMy!!.isSelected = true tabIvMy!!.isSelected = true
} }
/** /**
* 添加或者显示碎片 * 添加或者显示碎片
* *
......
...@@ -46,6 +46,11 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Base ...@@ -46,6 +46,11 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Base
TextUtils.equals(getClass().getSimpleName(), "GuideActivity")) { TextUtils.equals(getClass().getSimpleName(), "GuideActivity")) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN); WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else if (TextUtils.equals(getClass().getSimpleName(), "VideoActivity")) {
StatusBarUtil.transparencyBar(this); //设置状态栏全透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
getWindow().setNavigationBarColor(Color.BLACK);
}
} else { } else {
StatusBarUtil.transparencyBar(this); //设置状态栏全透明 StatusBarUtil.transparencyBar(this); //设置状态栏全透明
StatusBarUtil.StatusBarLightMode(this); //设置白底黑字 StatusBarUtil.StatusBarLightMode(this); //设置白底黑字
......
package com.mints.wisdomclean.ui.adapter
import android.app.Activity
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.mints.wisdomclean.R
/**
* @author Assen
* @date 2023/7/5
* @desc
*/
class FollowAdapter(var activity: Activity) :
BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_follow) {
override fun convert(holder: BaseViewHolder, item: String) {
}
}
\ No newline at end of file
package com.mints.wisdomclean.ui.adapter
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.mints.wisdomclean.R
/**
* @author Assen
* @date 2023/7/5
* @desc
*/
class ItemVideoEpisodeAdapter :
BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_item_video_epsiode) {
override fun convert(holder: BaseViewHolder, item: String) {
holder.setText(R.id.item_tv, item)
}
}
\ No newline at end of file
package com.mints.wisdomclean.ui.adapter
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.mints.wisdomclean.ui.fragment.FollowVideoFragment
/**
* @author Assen
* @date 2023/4/11
* @desc
*/
class RecommendPageAdapter(private val fragments: List<Fragment>, fragment: Fragment) :
FragmentStateAdapter(fragment) {
private val fid1 = 111L
private val fid2 = 222L
private val ids = arrayListOf(fid1, fid2)
private val createID = hashSetOf<Long>()
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemCount() = fragments.size
override fun createFragment(position: Int): Fragment {
val id = ids[position]
createID.add(id)
return fragments[position]
}
override fun containsItem(itemId: Long): Boolean {
return createID.contains(itemId)
}
}
\ No newline at end of file
package com.mints.wisdomclean.ui.adapter
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.mints.wisdomclean.R
import com.mints.wisdomclean.utils.ToastUtil
/**
* @author Assen
* @date 2023/7/5
* @desc
*/
class VideoEpisodeAdapter :
BaseQuickAdapter<List<String>, BaseViewHolder>(R.layout.item_video_epsiode) {
override fun convert(holder: BaseViewHolder, item: List<String>) {
val rv = holder.getView<RecyclerView>(R.id.item_rv)
rv.layoutManager = GridLayoutManager(context, 6)
val itemVideoEpisodeAdapter = ItemVideoEpisodeAdapter()
rv.adapter = itemVideoEpisodeAdapter
val list = mutableListOf<String>()
itemVideoEpisodeAdapter.addChildClickViewIds(R.id.item_tv)
itemVideoEpisodeAdapter.setOnItemChildClickListener { adapter, view, position ->
ToastUtil.show(context, item[position])
}
list.addAll(item)
itemVideoEpisodeAdapter.setNewInstance(list)
}
override fun getItemCount(): Int {
return data.size % 30
}
}
\ No newline at end of file
package com.mints.wisdomclean.ui.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import com.mints.wisdomclean.R
import com.mints.wisdomclean.ui.adapter.FollowAdapter
import com.mints.wisdomclean.ui.fragment.base.BaseFragment
import kotlinx.android.synthetic.main.fragment_follow_video.*
/**
* @author Assen
* @date 2023/7/5
* @desc 主页 -> 推荐 —> 追剧
*/
class FollowVideoFragment : BaseFragment() {
private val datas = arrayListOf<String>()
lateinit var followAdapter: FollowAdapter
companion object {
fun newInstance(): Fragment {
val args = Bundle()
val fragment = FollowVideoFragment()
fragment.arguments = args
return fragment
}
}
override fun initViewsAndEvents() {
initRecy()
}
override fun getContentViewLayoutID() = R.layout.fragment_follow_video
private fun initRecy() {
datas.add("")
datas.add("")
datas.add("")
val emptyView =
LayoutInflater.from(requireContext()).inflate(R.layout.item_follow_empty, null)
emptyView.findViewById<View>(R.id.btn).setOnClickListener { showToast("去剧场") }
rv_follow.layoutManager = GridLayoutManager(requireContext(), 3)
followAdapter = FollowAdapter(requireActivity())
followAdapter.setEmptyView(emptyView)
followAdapter.setNewInstance(datas)
rv_follow.adapter = followAdapter
}
}
\ No newline at end of file
...@@ -197,7 +197,7 @@ class MainFragment : BaseFragment(), HomeView, View.OnClickListener, OnRefreshLi ...@@ -197,7 +197,7 @@ class MainFragment : BaseFragment(), HomeView, View.OnClickListener, OnRefreshLi
} }
private fun getTabView(text: String): View { private fun getTabView(text: String): View {
val view = LayoutInflater.from(requireContext()).inflate(R.layout.item_video_tab, null) val view = LayoutInflater.from(requireContext()).inflate(R.layout.item_recommend_tab, null)
view.findViewById<TextView>(R.id.item_tv).text = text view.findViewById<TextView>(R.id.item_tv).text = text
return view return view
} }
......
package com.mints.wisdomclean.ui.fragment
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.mints.wisdomclean.R
import com.mints.wisdomclean.common.AppConfig
import com.mints.wisdomclean.common.Constant
import com.mints.wisdomclean.ui.adapter.RecommendPageAdapter
import com.mints.wisdomclean.ui.fragment.base.BaseFragment
import kotlinx.android.synthetic.main.fragment_recommend.*
/**
* @author Assen
* @date 2023/7/5
* @desc 主页 -> 推荐
*/
class RecommendFragment : BaseFragment() {
private var mSelectTabIndex = -1
private val tabsData = mutableListOf<String>()
private val fragments = mutableListOf<Fragment>()
private var vpAdapter: RecommendPageAdapter? = null
override fun initViewsAndEvents() {
tabsData.add("追剧")
tabsData.add("推荐")
fragments.add(FollowVideoFragment.newInstance())
fragments.add(WatchVideoFragment.newInstance())
vpAdapter = RecommendPageAdapter(fragments, this)
vp2_recommend.adapter = vpAdapter
TabLayoutMediator(tab_recommend, vp2_recommend) { tab, position ->
// 初始化Tab
tab.id = position
tab.customView = getTabView(position)
}.attach()
tab_recommend.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
mSelectTabIndex = tab!!.id
updateTab(tab, true, mSelectTabIndex)
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
updateTab(tab, false, mSelectTabIndex)
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
vp2_recommend.offscreenPageLimit = 2
}
override fun getContentViewLayoutID() = R.layout.fragment_recommend
private fun getTabView(position: Int): View {
val view = LayoutInflater.from(requireContext()).inflate(R.layout.item_recommend_tab, null)
view.findViewById<TextView>(R.id.item_tv).text = tabsData[position]
if (position == 0) {
view.findViewById<View>(R.id.item_line).background =
ContextCompat.getDrawable(requireContext(), R.drawable.shape_line_corner_red)
}
return view
}
private fun updateTab(tab: TabLayout.Tab?, isSelected: Boolean, position: Int) {
tab?.customView?.let {
val text = it.findViewById<TextView>(R.id.item_tv)
val line = it.findViewById<View>(R.id.item_line)
line.visibility = if (isSelected) View.VISIBLE else View.INVISIBLE
if (position == 0) {
if (isSelected) {
text.setTextColor(ContextCompat.getColor(requireContext(), R.color.black))
} else {
text.setTextColor(ContextCompat.getColor(requireContext(), R.color.my_color_gray))
}
line.background =
ContextCompat.getDrawable(requireContext(), R.drawable.shape_line_corner_red)
} else {
if (isSelected) {
text.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
} else {
text.setTextColor(ContextCompat.getColor(requireContext(), R.color.color_8D8F90))
}
line.background =
ContextCompat.getDrawable(requireContext(), R.drawable.shape_line_corner_white)
}
}
}
override fun onResume() {
super.onResume()
if (AppConfig.fragmentClickFlag == Constant.FRAGMENT_CLICK_TWO) {
}
}
}
\ No newline at end of file
package com.mints.wisdomclean.ui.fragment
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.OrientationHelper
import androidx.recyclerview.widget.RecyclerView
import cn.jzvd.Jzvd
import com.mints.wisdomclean.R
import com.mints.wisdomclean.ui.fragment.base.BaseFragment
import com.mints.wisdomclean.video.*
import kotlinx.android.synthetic.main.fragment_watch_video.*
/**
* @author Assen
* @date 2023/7/5
* @desc 主页 -> 推荐 —> 推荐
*/
class WatchVideoFragment : BaseFragment() {
companion object {
fun newInstance(): Fragment {
val args = Bundle()
val fragment = WatchVideoFragment()
fragment.arguments = args
return fragment
}
}
private var mCurrentPosition = -1
lateinit var adapter: RecommendVideoAdapter
var videos = arrayListOf<VideoBean>()
override fun initViewsAndEvents() {
initData()
val layoutManager = RecyViewLayoutManager(requireContext(), OrientationHelper.VERTICAL)
recy.layoutManager = layoutManager
adapter = RecommendVideoAdapter(requireActivity())
recy.adapter = adapter
//预加载下一个
adapter.setNewInstance(videos)
adapter.addChildClickViewIds(R.id.ll_bottom, R.id.ll_collect)
adapter.setOnItemChildClickListener { adapter, view, position ->
when (view.id) {
R.id.ll_bottom -> {
val bundle = Bundle()
readyGo(VideoActivity::class.java, bundle)
}
R.id.ll_collect -> {
}
else -> {}
}
}
adapter.setOnVideoCompletion(object : JzvdStdTikTok.OnVideoCompletion {
override fun onVideoCompletion() {
recy.smoothScrollToPosition(mCurrentPosition + 1)
}
})
layoutManager.setOnViewPagerListener(object : OnRecyViewListener {
override fun onInitComplete() {
mCurrentPosition = 0
//初始化 自动播放
autoPlayVideo()
}
override fun onPageRelease(isNext: Boolean, position: Int) {
//滑动时,释放上一个
if (mCurrentPosition == position) {
Jzvd.releaseAllVideos()
}
}
override fun onPageSelected(position: Int, isBottom: Boolean) {
//滑动后的当前Item ,具体自行打印
if (mCurrentPosition == position) {
return
}
if (isBottom) {
//是最底部,执行加载更多数据
loadData()
}
autoPlayVideo()
mCurrentPosition = position
}
})
///监听item离开了屏幕
recy.addOnChildAttachStateChangeListener(object :
RecyclerView.OnChildAttachStateChangeListener {
override fun onChildViewDetachedFromWindow(view: View) {
val jzvd: Jzvd = view.findViewById(R.id.jz_video)
if (jzvd != null && Jzvd.CURRENT_JZVD != null &&
jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.currentUrl)
) {
if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) {
Jzvd.releaseAllVideos()
}
}
}
override fun onChildViewAttachedToWindow(view: View) {
}
})
}
override fun getContentViewLayoutID() = R.layout.fragment_watch_video
override fun onResume() {
super.onResume()
Jzvd.goOnPlayOnResume()
}
override fun onPause() {
super.onPause()
Jzvd.goOnPlayOnPause()
}
override fun onDestroy() {
super.onDestroy()
Jzvd.releaseAllVideos()
}
/**
* 滑动后自动播放。
*/
private fun autoPlayVideo() {
if (recy == null || recy.getChildAt(0) == null) {
return
}
val player: JzvdStdTikTok = recy.getChildAt(0).findViewById(R.id.jz_video)
if (player != null) {
player.startVideoAfterPreloading()
//播放开始,进行倒计时
}
}
//加载
fun loadData() {
videos.add(
VideoBean(
6,
"遵义观察 ",
"https://p9-dy.byteimg.com/aweme/100x100/2e1ce00021ee51a2aacdc.jpeg?from=4010531038",
"老伴咱走!",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe10000bloib0nrri6bf7b1k4fg&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/tos-cn-p-0015/601c6d730167431184c5412e81cd32d1?from=2563711402_large"
)
)
videos.add(
VideoBean(
7,
"BTV养生堂 ",
"https://p6-dy-ipv6.byteimg.com/aweme/100x100/3151700027839b153b924.jpeg?from=4010531038",
"湿气过重,快收藏这个中医调理方!!",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f730000bpebr0dqg5balrfhqlog&ratio=720p&line=0",
"https://p3-dy-ipv6.byteimg.com/obj/tos-cn-p-0015/0e99f0aca9764e7da53be1096a3bd641_1583136211?from=2563711402_large"
)
)
videos.add(
VideoBean(
8,
"河南都市频道 ",
"https://p9-dy.byteimg.com/aweme/100x100/312a8000720705660b806.jpeg?from=4010531038",
"痛心!手扶梯绞断女童两根手指!带娃搭扶梯的一定要注意了!(上)!",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f250000bgsu5vamac2seo2gp53g&ratio=720p&line=0",
"https://p1-dy-ipv6.byteimg.com/obj/160b4000aa3f373bd14cd?from=2563711402_large"
)
)
videos.add(
VideoBean(
9,
"科学小妙招 ",
"https://p26-dy.byteimg.com/aweme/100x100/312090000434b4dd10244.jpeg?from=4010531038",
"不喜欢的衣服扔了可惜,这样改造一下非常酷#生活小妙招 #生活小技巧 #废物利用 @抖音小助手",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe10000bq2bf7s9hq5lufbuoflg&ratio=720p&line=0",
"https://p9-dy.byteimg.com/obj/tos-cn-p-0015/9a6784fcbf9b43849081d7a3388db08d_1585756125?from=2563711402_large"
)
)
videos.add(
VideoBean(
10,
"一起装修网 ",
"https://p29-dy.byteimg.com/aweme/100x100/f77d000eae902034a2bf.jpeg?from=4010531038",
"#装修 #黑幕重重 怎样选购浴室柜?揭露浴室柜增项(增项:镜子,水龙头,软管等)@胡 一刀",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f9a0000belnavkqn5hfpb70b5kg&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/c8f200068c30b23f1024?from=2563711402_large"
)
)
}
fun initData() {
videos.add(
VideoBean(
1,
"中韩夫妇与两宝",
"https://p29-dy.byteimg.com/aweme/100x100/2f9480001ea8cc615d6a9.jpeg?from=401053103",
"家有一老如有一宝,不分国界",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe90000bs854d21rirdcdon9fk0&ratio=720p&line=0",
"https://p6-dy-ipv6.byteimg.com/img/tos-cn-p-0015/2263f31dfb304120a5fb5d6655b230c5_1594905185~tplv-dmt-logom:tos-cn-i-0813/65302cd29d2d4043a98de10a7723d33d.image?from=2563711402_large"
)
)
videos.add(
VideoBean(
2,
"央视新闻",
"https://p6-dy-ipv6.byteimg.com/aweme/100x100/30e520009a01cad2d810e.jpeg?from=4010531038",
"高三考生注意了!今年高考时间推迟一个月,为7月7日至7月8日",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe90000bs854d21rirdcdon9fk0&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/tos-cn-p-0015/f79a5fe204e24bbbbfc55a76a81f5c2c_1585626014?from=2563711402_large"
)
)
videos.add(
VideoBean(
3,
"查查和张张",
"https://p6-dy-ipv6.byteimg.com/aweme/100x100/30e520009a01cad2d810e.jpeg?from=4010531038",
"#情侣 #春节 就没有我解决不了的婆媳关系 嘿嘿@Singing哥 @抖音小助手",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f670000bomln43d82dvbadk5a00&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/tos-cn-p-0015/f61dcb8127204a8cb7a322bf816c0b3e_1580030882?from=2563711402_large"
)
)
videos.add(
VideoBean(
4,
"大鹏(宇宙简史)",
"https://p3-dy-ipv6.byteimg.com/aweme/100x100/1e1170002093b2ff1d0f7.jpeg?from=4010531038",
"2018下半年所以天文奇观!还有流星雨哦!千万不要错过了",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f4e0000bddrstnff778g23hs6mg&ratio=720p&line=0",
"https://p6-dy-ipv6.byteimg.com/obj/9dfb0003c8c228b763eb?from=2563711402_large"
)
)
videos.add(
VideoBean(
5,
"胖爹带娃",
"https://p3-dy-ipv6.byteimg.com/aweme/100x100/26ec600005035c9b87288.jpeg?from=4010531038",
"带孩子出门玩耍一定要记得这一点!接力下去,别以为危险离我们很远@抖音小助手 #暑假安全",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f4e0000bddrstnff778g23hs6mg&ratio=720p&line=0",
"https://p9-dy.byteimg.com/obj/2c5c600050a7b42352869?from=2563711402_large"
)
)
}
}
\ No newline at end of file
package com.mints.wisdomclean.ui.widgets
import android.app.Dialog
import android.content.Context
import android.view.*
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.mints.wisdomclean.R
import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter
import com.mints.wisdomclean.utils.CommonUtils
/**
* @author Assen
* @date 2023/7/5
* @desc
*/
class VideoEpisodeDialog(context: Context, private val listener: DialogListener) :
Dialog(context, R.style.dialog) {
private val lp: WindowManager.LayoutParams
private val vp2: ViewPager2
private val tab: TabLayout
private val ivClose: ImageView
init {
setContentView(R.layout.dialog_video_episode)
// 设置window属性
lp = window!!.attributes
lp.gravity = Gravity.CENTER
lp.width = WindowManager.LayoutParams.MATCH_PARENT
lp.windowAnimations = R.style.DialogAnimBottom
// lp.dimAmount = 0; // 去背景遮盖
// lp.alpha = 1.0f;//透明效果
window!!.attributes = lp
// 设置外部不可关闭
setCancelable(true)
setCanceledOnTouchOutside(true)
setOnKeyListener { _, i, _ ->
i == KeyEvent.KEYCODE_BACK
}
listener.setDialog(this)
vp2 = findViewById(R.id.vp2_episode)
tab = findViewById(R.id.tab_episode)
ivClose = findViewById(R.id.close_iv)
ivClose.setOnClickListener(listener)
initVp()
}
private fun initVp() {
val data = arrayListOf<String>()
for (i in 1..100) {
data.add("" + i)
}
val subList = CommonUtils.getSubList(30, data)
val adapter = VideoEpisodeAdapter()
adapter.setNewInstance(subList)
vp2.adapter = adapter
TabLayoutMediator(tab, vp2) { tab, position ->
// 初始化Tab
tab.id = position
tab.customView =
getTabView(
"" + subList[position][0] + "-" + subList[position][subList[position].size - 1],
position
)
}.attach()
tab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
updateTab(tab, true)
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
updateTab(tab, false)
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
}
private fun getTabView(text: String, position: Int): View {
val view = LayoutInflater.from(context).inflate(R.layout.item_epsiode_tab, null)
val viewText = view.findViewById<TextView>(R.id.item_tv)
viewText.text = text
if (position == 0) {
viewText.setTextColor(ContextCompat.getColor(context, R.color.red))
}
return view
}
private fun updateTab(tab: TabLayout.Tab?, isSelected: Boolean) {
tab?.customView?.let {
val text = it.findViewById<TextView>(R.id.item_tv)
if (isSelected) {
text.setTextColor(ContextCompat.getColor(context, R.color.red))
} else {
text.setTextColor(ContextCompat.getColor(context, R.color.black))
}
}
}
}
\ No newline at end of file
...@@ -26,6 +26,8 @@ import android.text.TextUtils; ...@@ -26,6 +26,8 @@ import android.text.TextUtils;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
...@@ -355,4 +357,29 @@ public class CommonUtils { ...@@ -355,4 +357,29 @@ public class CommonUtils {
return source; return source;
} }
} }
/**
* 将list拆分成指定数量的小list
* 注: 使用的subList方式,返回的是list的内部类,不可做元素的删除,修改,添加操作
*
* @param length 数量
* @param list 大list
*/
public static <T> List<List<T>> getSubList(int length, List<T> list) {
int size = list.size();
int temp = size / length + 1;
boolean result = size % length == 0;
List<List<T>> subList = new ArrayList<>();
for (int i = 0; i < temp; i++) {
if (i == temp - 1) {
if (result) {
break;
}
subList.add(list.subList(length * i, size));
} else {
subList.add(list.subList(length * i, length * (i + 1)));
}
}
return subList;
}
} }
...@@ -193,19 +193,20 @@ object TimeRender { ...@@ -193,19 +193,20 @@ object TimeRender {
val yearZ = split[0].toInt() val yearZ = split[0].toInt()
val monthZ = split[1].toInt() - 1 val monthZ = split[1].toInt() - 1
val dayZ = split[2].toInt() val dayZ = split[2].toInt()
val datePickerDialog = DatePickerDialog(context!!, OnDateSetListener { view, year, monthOfYear, dayOfMonth -> val datePickerDialog =
nqMonth = if (monthOfYear + 1 < 10) { DatePickerDialog(context!!, OnDateSetListener { view, year, monthOfYear, dayOfMonth ->
"0" + (monthOfYear + 1) nqMonth = if (monthOfYear + 1 < 10) {
} else { "0" + (monthOfYear + 1)
(monthOfYear + 1).toString() } else {
} (monthOfYear + 1).toString()
nqDay = if (dayOfMonth < 10) { }
"0$dayOfMonth" nqDay = if (dayOfMonth < 10) {
} else { "0$dayOfMonth"
dayOfMonth.toString() } else {
} dayOfMonth.toString()
editText.setText("$year-$nqMonth-$nqDay") }
}, yearZ, monthZ, dayZ) editText.setText("$year-$nqMonth-$nqDay")
}, yearZ, monthZ, dayZ)
datePickerDialog.show() datePickerDialog.show()
} }
...@@ -295,4 +296,16 @@ object TimeRender { ...@@ -295,4 +296,16 @@ object TimeRender {
return formatDateDot(now.time) return formatDateDot(now.time)
} }
/**
* 是否超过outMin分钟
*
* @param adPreLoadTime 广告预加载时间
* @return true-超过outMin分钟
*/
fun isOverspedMin(adPreLoadTime: Long, outMin: Int): Boolean {
val time = (System.currentTimeMillis() - adPreLoadTime) / (1000 * 60)
// LogUtil.d("PreCsjGroMoreVideoAdManager","adPreLoadTime="+adPreLoadTime+"time="+time);
return time > outMin && adPreLoadTime > 0
}
} }
\ No newline at end of file
package com.mints.wisdomclean.video
import android.app.Activity
import android.util.Log
import cn.jzvd.Jzvd
import cn.jzvd.JzvdStd
import com.bumptech.glide.Glide
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.mints.wisdomclean.MintsApplication
import com.mints.wisdomclean.R
/**
* author : ChenWenJie
* email : 1181620038@qq.com
* date : 2020/9/22
* desc : 适配器
*/
class RecommendVideoAdapter(var activity: Activity) :
BaseQuickAdapter<VideoBean, BaseViewHolder>(R.layout.item_video_recommend) {
override fun convert(holder: BaseViewHolder, item: VideoBean) {
//用户名
holder.setText(R.id.username_tv, item.user_name)
//标题
holder.setText(R.id.usertitle_tv, item.video_title)
//缩略图
Glide.with(activity).load(item.video_image)
.into(holder.getView<JzvdStdTikTok>(R.id.jz_video).posterImageView)
//声明 代理服务缓存
val proxy = MintsApplication.StaticParams.getProxy()
//这个缓存下一个
if (holder.layoutPosition + 1 < itemCount) {
val item1 = getItem(holder.layoutPosition + 1)
//缓存下一个 10秒
proxy!!.preLoad(item1.video_path, 10)
}
//缓存当前,播放当前
val proxyUrl = proxy?.getProxyUrl(item.video_path).toString() //设置视
setPlay(holder.getView(R.id.jz_video), proxyUrl)
}
fun setPlay(jzvdStdTikTok: JzvdStdTikTok, path: String) {
Log.e("RecommendVideoAdapter", "$path")
//不保存播放进度
Jzvd.SAVE_PROGRESS = false
//取消播放时在非WIFIDialog提示
Jzvd.WIFI_TIP_DIALOG_SHOWED = true
// 清除某个URL进度
//JZUtils.clearSavedProgress(activity, path)
jzvdStdTikTok.setUp(path, "", JzvdStd.SCREEN_NORMAL)
jzvdStdTikTok.setOnVideoCompletion(onVideoCompletion)
}
private var onVideoCompletion: JzvdStdTikTok.OnVideoCompletion? = null
fun setOnVideoCompletion(onVideoCompletion: JzvdStdTikTok.OnVideoCompletion?) {
this.onVideoCompletion = onVideoCompletion
}
}
\ No newline at end of file
package com.cwj.updownshortvideo package com.mints.wisdomclean.video
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.mints.wisdomclean.video.OnRecyViewListener
/** /**
* author : ChenWenJie * author : ChenWenJie
...@@ -18,9 +17,7 @@ class RecyViewLayoutManager : LinearLayoutManager { ...@@ -18,9 +17,7 @@ class RecyViewLayoutManager : LinearLayoutManager {
private var mPagerSnapHelper: PagerSnapHelper? = null private var mPagerSnapHelper: PagerSnapHelper? = null
private var mOnRecycleViewListener: OnRecyViewListener? = null private var mOnRecycleViewListener: OnRecyViewListener? = null
private var mRecyclerView: RecyclerView? = null private var mRecyclerView: RecyclerView? = null
private var mDrift //位移,用来判断移动方向 private var mDrift = 0//位移,用来判断移动方向
= 0
private val mChildAttachStateChangeListener: RecyclerView.OnChildAttachStateChangeListener = private val mChildAttachStateChangeListener: RecyclerView.OnChildAttachStateChangeListener =
object : RecyclerView.OnChildAttachStateChangeListener { object : RecyclerView.OnChildAttachStateChangeListener {
......
package com.mints.wisdomclean.video package com.mints.wisdomclean.video
import android.app.Dialog
import android.view.View import android.view.View
import androidx.recyclerview.widget.OrientationHelper import androidx.recyclerview.widget.OrientationHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import cn.jzvd.Jzvd import cn.jzvd.Jzvd
import com.cwj.updownshortvideo.*
import com.mints.wisdomclean.R import com.mints.wisdomclean.R
import com.mints.wisdomclean.ui.activitys.base.BaseActivity import com.mints.wisdomclean.ui.activitys.base.BaseActivity
import com.mints.wisdomclean.ui.widgets.DialogListener
import com.mints.wisdomclean.ui.widgets.VideoEpisodeDialog
import kotlinx.android.synthetic.main.activity_video.* import kotlinx.android.synthetic.main.activity_video.*
class VideoActivity : BaseActivity() { class VideoActivity : BaseActivity(), View.OnClickListener {
companion object {
const val VIDEO_ID = "VIDEO_ID"
}
lateinit var adapter: VideoAdapter lateinit var adapter: VideoAdapter
private var mCurrentPosition = -1 private var mCurrentPosition = -1
var videos = ArrayList<VideoBean>() var videos = ArrayList<VideoBean>()
private var dialog: VideoEpisodeDialog? = null
override fun getContentViewLayoutID() = R.layout.activity_video override fun getContentViewLayoutID() = R.layout.activity_video
override fun initViewsAndEvents() { override fun initViewsAndEvents() {
...@@ -40,9 +48,9 @@ class VideoActivity : BaseActivity() { ...@@ -40,9 +48,9 @@ class VideoActivity : BaseActivity() {
} }
fun initView() { fun initView() {
val recyViewLayoutManager = RecyViewLayoutManager( fm_bottom.setOnClickListener(this)
this, OrientationHelper.VERTICAL
) val recyViewLayoutManager = RecyViewLayoutManager(this, OrientationHelper.VERTICAL)
recy.layoutManager = recyViewLayoutManager recy.layoutManager = recyViewLayoutManager
adapter = VideoAdapter(this) adapter = VideoAdapter(this)
recy.adapter = adapter recy.adapter = adapter
...@@ -123,13 +131,13 @@ class VideoActivity : BaseActivity() { ...@@ -123,13 +131,13 @@ class VideoActivity : BaseActivity() {
} }
// override fun onBackPressed() { override fun onBackPressed() {
// if (Jzvd.backPress()) { if (Jzvd.backPress()) {
// Jzvd.releaseAllVideos() Jzvd.releaseAllVideos()
// return return
// } }
// super.onBackPressed() super.onBackPressed()
// } }
fun initData() { fun initData() {
videos.add( videos.add(
...@@ -240,4 +248,26 @@ class VideoActivity : BaseActivity() { ...@@ -240,4 +248,26 @@ class VideoActivity : BaseActivity() {
) )
} }
override fun onClick(v: View?) {
when (v?.id) {
R.id.close_iv -> {
finish()
}
R.id.fm_bottom -> {
if (dialog != null) {
dialog!!.show()
} else {
dialog = VideoEpisodeDialog(this, object : DialogListener() {
override fun onClick(dialog: Dialog?, v: View?) {
super.onClick(dialog, v)
dialog?.dismiss()
}
})
dialog?.show()
}
}
else -> {}
}
}
} }
\ No newline at end of file
...@@ -20,10 +20,6 @@ import com.mints.wisdomclean.R ...@@ -20,10 +20,6 @@ import com.mints.wisdomclean.R
class VideoAdapter(var activity: Activity) : class VideoAdapter(var activity: Activity) :
BaseQuickAdapter<VideoBean, BaseViewHolder>(R.layout.item_video) { BaseQuickAdapter<VideoBean, BaseViewHolder>(R.layout.item_video) {
override fun convert(holder: BaseViewHolder, item: VideoBean) { override fun convert(holder: BaseViewHolder, item: VideoBean) {
//圆形用户头像
val requestOptions = RequestOptions.circleCropTransform()
Glide.with(activity).load(item.user_image).apply(requestOptions)
.into(holder.getView(R.id.user_iv))
//用户名 //用户名
holder.setText(R.id.username_tv, item.user_name) holder.setText(R.id.username_tv, item.user_name)
//标题 //标题
...@@ -44,7 +40,6 @@ class VideoAdapter(var activity: Activity) : ...@@ -44,7 +40,6 @@ class VideoAdapter(var activity: Activity) :
//缓存当前,播放当前 //缓存当前,播放当前
var proxyUrl = proxy?.getProxyUrl(item.video_path).toString() //设置视 var proxyUrl = proxy?.getProxyUrl(item.video_path).toString() //设置视
setPlay(holder.getView(R.id.jz_video), proxyUrl) setPlay(holder.getView(R.id.jz_video), proxyUrl)
} }
...@@ -57,7 +52,7 @@ class VideoAdapter(var activity: Activity) : ...@@ -57,7 +52,7 @@ class VideoAdapter(var activity: Activity) :
Jzvd.WIFI_TIP_DIALOG_SHOWED = true Jzvd.WIFI_TIP_DIALOG_SHOWED = true
// 清除某个URL进度 // 清除某个URL进度
//JZUtils.clearSavedProgress(activity, path) //JZUtils.clearSavedProgress(activity, path)
jzvdStdTikTok.setUp(path, "", JzvdStd.SCREEN_FULLSCREEN) jzvdStdTikTok.setUp(path, "", JzvdStd.SCREEN_NORMAL)
jzvdStdTikTok.setOnVideoCompletion(onVideoCompletion) jzvdStdTikTok.setOnVideoCompletion(onVideoCompletion)
} }
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp" />
<solid android:color="@color/half_transparent" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="2dp" />
<solid android:color="@color/red"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="2dp" />
<solid android:color="@color/white" />
</shape>
\ No newline at end of file
...@@ -44,6 +44,22 @@ ...@@ -44,6 +44,22 @@
android:src="@drawable/home_tab_home_selector" /> android:src="@drawable/home_tab_home_selector" />
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/tab_rl_recommend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/tab_iv_recommend"
android:layout_width="30dp"
android:layout_height="30dp"
android:contentDescription="@null"
android:src="@drawable/home_tab_home_selector" />
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/tab_rl_my" android:id="@+id/tab_rl_my"
android:layout_width="0dp" android:layout_width="0dp"
......
...@@ -3,11 +3,64 @@ ...@@ -3,11 +3,64 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black"
android:orientation="vertical"
tools:context=".video.VideoActivity"> tools:context=".video.VideoActivity">
<ImageView
android:id="@+id/close_iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:src="@mipmap/ic_arrow_back" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy" android:id="@+id/recy"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:layout_marginBottom="50dp" />
<FrameLayout
android:id="@+id/fm_bottom"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="bottom">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_gravity="center"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:background="@drawable/shape_half_trans"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/dp_10"
android:paddingEnd="@dimen/dp_10">
<ImageView
android:layout_width="26dp"
android:layout_height="26dp"
android:src="@mipmap/ic_call_wx" />
<TextView
android:id="@+id/episode_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:text="共100集 已完结 >"
android:textColor="@color/white" />
<ImageView
android:layout_width="26dp"
android:layout_height="26dp"
android:rotation="180"
android:src="@mipmap/ic_arrow_bottom" />
</LinearLayout>
</FrameLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/shape_tab_friends"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="10dp"
android:paddingEnd="@dimen/dp_10">
<TextView
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="霸道总裁爱上我"
android:textColor="@color/black" />
<TextView
android:id="@+id/label_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:background="@drawable/shape_green"
android:padding="2dp"
android:text="已完结"
android:textColor="@color/gray"
android:textSize="12sp" />
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<ImageView
android:id="@+id/close_iv"
android:layout_width="20dp"
android:layout_height="wrap_content"
android:src="@mipmap/ic_close" />
</LinearLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_episode"
android:layout_width="match_parent"
android:layout_height="36dp"
app:tabBackground="@null"
app:tabIndicatorHeight="0dp"
app:tabMode="scrollable"
app:tabRippleColor="@null" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp2_episode"
android:layout_width="match_parent"
android:layout_height="320dp" />
</LinearLayout>
</RelativeLayout>
<?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:paddingTop="68dp"
android:background="@color/white">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_follow"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
\ No newline at end of file
...@@ -107,14 +107,14 @@ ...@@ -107,14 +107,14 @@
android:id="@+id/tablayout" android:id="@+id/tablayout"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="48dp" android:layout_height="48dp"
app:tabBackground="@color/full_transparent" app:tabBackground="@null"
app:tabIndicatorHeight="0dp" app:tabIndicatorHeight="0dp"
app:tabPaddingStart="6dp" app:tabPaddingStart="6dp"
app:tabPaddingEnd="6dp" app:tabPaddingEnd="6dp"
app:tabMaxWidth="200dp" app:tabMaxWidth="200dp"
app:tabMinWidth="20dp" app:tabMinWidth="20dp"
app:tabMode="scrollable" app:tabMode="scrollable"
app:tabRippleColor="@color/full_transparent" /> app:tabRippleColor="@null" />
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp2" android:id="@+id/vp2"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp2_recommend"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_recommend"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
app:tabBackground="@null"
app:tabIndicatorHeight="0dp"
app:tabMode="fixed"
app:tabRippleColor="@null" />
</FrameLayout>
\ No newline at end of file
<?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:background="@color/black">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_iv"
android:layout_width="100dp"
android:layout_height="120dp"
android:src="@mipmap/ic_launcher_main"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="6dp"
android:layout_marginBottom="10dp"
android:text="已完结"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="@id/image_iv"
app:layout_constraintEnd_toEndOf="@id/image_iv" />
<TextView
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="重回80年代"
android:textColor="@color/black"
app:layout_constraintStart_toStartOf="@id/image_iv"
app:layout_constraintTop_toBottomOf="@id/image_iv" />
<TextView
android:id="@+id/info_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="重回80年代"
android:textColor="@color/gray"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="@id/image_iv"
app:layout_constraintTop_toBottomOf="@id/title_tv" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/info_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂无在追剧"
android:textColor="@color/gray"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:background="@drawable/shape_red"
android:elevation="2dp"
android:text="去剧场"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/info_tv" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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="60dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="2dp"
android:layout_marginBottom="@dimen/dp_4"
android:background="@drawable/shape_btn_enabled">
<TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="1"
android:textColor="@color/black"
android:textSize="16sp" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:orientation="vertical">
<TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/color_8D8F90"
android:textSize="14sp" />
<View
android:id="@+id/item_line"
android:layout_width="20dp"
android:layout_height="2dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="6dp" />
</LinearLayout>
\ No newline at end of file
...@@ -19,18 +19,11 @@ ...@@ -19,18 +19,11 @@
android:id="@+id/ll" android:id="@+id/ll"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginStart="15dp"
android:orientation="horizontal" android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@id/usertitle_tv" app:layout_constraintBottom_toTopOf="@id/usertitle_tv"
app:layout_constraintLeft_toLeftOf="parent"> app:layout_constraintLeft_toLeftOf="parent">
<ImageView
android:id="@+id/user_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="2dp"
android:scaleType="fitXY" />
<TextView <TextView
android:id="@+id/username_tv" android:id="@+id/username_tv"
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -48,7 +41,7 @@ ...@@ -48,7 +41,7 @@
android:id="@+id/usertitle_tv" android:id="@+id/usertitle_tv"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginLeft="10dp" android:layout_marginStart="15dp"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center|left" android:gravity="center|left"
android:maxEms="14" android:maxEms="14"
...@@ -57,70 +50,35 @@ ...@@ -57,70 +50,35 @@
android:textColor="#fff" android:textColor="#fff"
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" /> app:layout_constraintLeft_toLeftOf="parent"
tools:ignore="RtlHardcoded" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:gravity="center" android:gravity="center"
app:layout_constraintBottom_toTopOf="@id/usertitle_tv"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@id/ll"
app:layout_constraintRight_toRightOf="parent"> app:layout_constraintRight_toRightOf="parent">
<ImageView <ImageView
android:id="@+id/zan_iv"
android:layout_width="35dp" android:layout_width="35dp"
android:layout_height="35dp" android:layout_height="35dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:scaleType="fitXY" android:scaleType="fitXY"
android:id="@+id/zan_iv"
android:src="@drawable/ic_aixin" /> android:src="@drawable/ic_aixin" />
<TextView <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="199.9w"
android:id="@+id/zan_num_tv" android:id="@+id/zan_num_tv"
android:textColor="#fff"
android:textSize="14sp" />
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginTop="10dp"
android:scaleType="fitXY"
android:src="@drawable/ic_pl" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="12312"
android:id="@+id/zan_price_tv"
android:textColor="#fff"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:text="199.9w"
android:textColor="#fff" android:textColor="#fff"
android:textSize="14sp" /> android:textSize="14sp" />
<ImageView
android:id="@+id/share_iv"
android:layout_width="35dp"
android:layout_height="35dp"
android:scaleType="fitXY"
android:src="@drawable/ic_zhunfa" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#fff"
android:text="345"
android:textSize="14sp" />
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/item_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#77090909">
<com.mints.wisdomclean.video.JzvdStdTikTok
android:id="@+id/jz_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
<TextView
android:id="@+id/username_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="15dp"
android:ellipsize="end"
android:gravity="center"
android:maxEms="9"
android:maxLines="1"
android:text="飞翔的企鹅"
android:textColor="#fff"
android:textSize="16sp" />
<TextView
android:id="@+id/usertitle_tv"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginStart="15dp"
android:ellipsize="end"
android:gravity="center|left"
android:maxEms="14"
android:maxLines="3"
android:text="飞翔的企鹅飞翔的企鹅飞翔的企鹅飞翔的企鹅飞翔/n的企鹅飞翔的企鹅"
android:textColor="#fff"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
tools:ignore="RtlHardcoded" />
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginBottom="2dp"
android:background="@color/half_transparent"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="15dp"
android:paddingEnd="15dp">
<ImageView
android:layout_width="26dp"
android:layout_height="26dp"
android:src="@mipmap/ic_call_wx" />
<TextView
android:id="@+id/episode_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:text="共100集 已完结 >"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:background="@drawable/shape_half_trans"
android:gravity="center"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:text="下一集"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_collect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:gravity="center"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@id/ll"
app:layout_constraintRight_toRightOf="parent">
<ImageView
android:id="@+id/zan_iv"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginTop="10dp"
android:scaleType="fitXY"
android:src="@drawable/ic_aixin" />
<TextView
android:id="@+id/zan_num_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="199.9w"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<color name="color_939AA3">#373737</color> <color name="color_939AA3">#373737</color>
<color name="color_FF7563">#FF7563</color> <color name="color_FF7563">#FF7563</color>
<color name="full_transparent">#00000000</color> <color name="full_transparent">#00000000</color>
<color name="half_transparent">#80000000</color>
<color name="title_bg">#2B3238</color> <color name="title_bg">#2B3238</color>
<color name="status_bg">#002444</color> <color name="status_bg">#002444</color>
<color name="loading_bg">#600c224b</color> <color name="loading_bg">#600c224b</color>
......
...@@ -46,4 +46,5 @@ RELEASE_UMENG_KEY=63c0fd97d64e68613917170f ...@@ -46,4 +46,5 @@ RELEASE_UMENG_KEY=63c0fd97d64e68613917170f
RELEASE_TALKING_DATA_KEY="8B400B45ABBB47D882B2C2E69E6A3662" RELEASE_TALKING_DATA_KEY="8B400B45ABBB47D882B2C2E69E6A3662"
GROMORE_APP_ID="5404192" GROMORE_APP_ID="5404192"
GROMORE_SPLASH_CODE="102371299" GROMORE_SPLASH_CODE="102371299"
\ No newline at end of file GROMORE_VIDEO_CODE="1"
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment