Commit fe2198dc authored by wanglei's avatar wanglei

...

parent 2bbff6d5
import org.gradle.internal.impldep.bsh.commands.dir
import org.gradle.internal.impldep.org.junit.experimental.categories.Categories.CategoryFilter.include
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
...@@ -20,6 +18,7 @@ android { ...@@ -20,6 +18,7 @@ android {
targetSdk = 34 targetSdk = 34
versionCode = 1 versionCode = 1
versionName = "1.0" versionName = "1.0"
multiDexEnabled = true
ndk { ndk {
abiFilters.addAll(listOf("arm64-v8a", "armeabi-v7a")) abiFilters.addAll(listOf("arm64-v8a", "armeabi-v7a"))
...@@ -73,9 +72,6 @@ gradle.taskGraph.whenReady { ...@@ -73,9 +72,6 @@ gradle.taskGraph.whenReady {
} }
} }
} }
dependencies { dependencies {
implementation(libs.androidx.core.ktx) implementation(libs.androidx.core.ktx)
...@@ -85,9 +81,12 @@ dependencies { ...@@ -85,9 +81,12 @@ dependencies {
implementation(libs.androidx.constraintlayout) implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.navigation.fragment.ktx) implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx) implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.androidx.palette.ktx)
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
implementation("androidx.multidex:multidex:2.0.1")
//glide //glide
implementation("com.github.bumptech.glide:glide:4.16.0") implementation("com.github.bumptech.glide:glide:4.16.0")
......
...@@ -48,3 +48,4 @@ ...@@ -48,3 +48,4 @@
-dontwarn com.google.** -dontwarn com.google.**
-dontwarn okhttp3.** -dontwarn okhttp3.**
-dontwarn kotlinx.** -dontwarn kotlinx.**
-dontwarn android.os.SystemProperties
...@@ -3,6 +3,11 @@ ...@@ -3,6 +3,11 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
...@@ -18,6 +23,7 @@ ...@@ -18,6 +23,7 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.LocalWeatherWhite" android:theme="@style/Theme.LocalWeatherWhite"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity
android:name=".ui.start.StartActivity" android:name=".ui.start.StartActivity"
android:exported="true" android:exported="true"
...@@ -30,12 +36,19 @@ ...@@ -30,12 +36,19 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.main.MainActivity" android:name=".ui.main.MainActivity"
android:exported="true"> android:exported="true">
</activity> </activity>
<activity
android:name=".ui.play.PlayFullActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"
...@@ -110,7 +123,6 @@ ...@@ -110,7 +123,6 @@
android:exported="false" android:exported="false"
android:foregroundServiceType="dataSync" android:foregroundServiceType="dataSync"
android:permission="android.permission.BIND_JOB_SERVICE" /> android:permission="android.permission.BIND_JOB_SERVICE" />
<service <service
android:name=".fcm.MessagingService" android:name=".fcm.MessagingService"
android:directBootAware="true" android:directBootAware="true"
......
{
"Signature": "4JsW1/Up/t2En8fGxnNoPsVnBvJoQyh5OIIZKAHMCngIxcCFql6uXSAnlqvWvyQb98sxpus6e+W6gnR4HmH4st3tFJ93Xn3krunis6AtXYnDJYVS+0I6wEz5Mmy3+NkeoTyT0eWcPuQSPAtYWji2uKsCsPpkaZLO708kOsNyUU3D/He6+fp/AAY6UT9O3NwcSAI+c6JOxbFTxxx3i6NHXzU5lTsDVoyMt+X90EmJPUCC/Q1XLQaGGf5+MyFll4o3R5U4g5C89QYolBdpCwkFDIF1LBU7lrGHkZtX/MQh9u3F8lP63wz0KqvWMUxwaSCB58q48ynXQTRuWj8gjbmIIA==",
"Content": "eyJJZCI6IjkxOSIsIlZlcnNpb24iOjIsIkNoYW5uZWwiOiJ2b2QiLCJUeXBlIjoxLCJQYWNrYWdlTmFtZSI6ImNvbS5leGFtcGxlLmRyYW1hc2RrIiwiQnVuZGxlSWQiOiJjb20uYnl0ZWRhbmNlLkFEVW5pb24uaW5ob3VzZTMiLCJNb2R1bGVzIjpbeyJOYW1lIjoidm9kX3BsYXkiLCJFZGl0aW9uIjoicHJlbWl1bV9lZGl0aW9uIiwiU3RhcnRUaW1lIjoxNzI4MzcwMTAzODgwLCJFeHBpcmVUaW1lIjoxNzMwOTYyMTAzODgwfV0sIkZpbGVWZXJzaW9uIjoiMTcyODM3MDEwMzkwMDg4ODQwNiJ9",
"MainURL": "https://vod-license-m.bytepluscdn.com/obj/vod-license-sgcom/l-919-ch-vod-a-568708.lic?lk3s=724a08c7&x-expires=4881970103&x-signature=Jb7Tt%2FA9RwWghTZWYfvKOLLlsdc%3D",
"BackupURL": "https://vod-license-b.bytepluscdn.com/obj/vod-license-sgcom/l-919-ch-vod-a-568708.lic?lk3s=724a08c7&x-expires=4881970103&x-signature=K4o08AFJX27q6Ponom44qs8Xw0Y%3D",
"Id": "919"
}
\ No newline at end of file
...@@ -15,10 +15,10 @@ import com.base.appzxhy.bean.config.ConfigBean ...@@ -15,10 +15,10 @@ import com.base.appzxhy.bean.config.ConfigBean
import com.base.appzxhy.bean.config.PopupConfigBean import com.base.appzxhy.bean.config.PopupConfigBean
import com.base.appzxhy.fcm.FCMManager import com.base.appzxhy.fcm.FCMManager
import com.base.appzxhy.fcm.notification.MyNotificationManager import com.base.appzxhy.fcm.notification.MyNotificationManager
import com.base.appzxhy.fcm.timer.TimerManager.Companion.changeTimer
import com.base.appzxhy.fcm.receiver.BatteryStatusReceiver import com.base.appzxhy.fcm.receiver.BatteryStatusReceiver
import com.base.appzxhy.fcm.receiver.PackageStatusReceiver import com.base.appzxhy.fcm.receiver.PackageStatusReceiver
import com.base.appzxhy.fcm.receiver.ScreenStatusReceiver import com.base.appzxhy.fcm.receiver.ScreenStatusReceiver
import com.base.appzxhy.fcm.timer.TimerManager.Companion.changeTimer
import com.base.appzxhy.fcm.work.RepeatingWorker.Companion.schedulePeriodicWork import com.base.appzxhy.fcm.work.RepeatingWorker.Companion.schedulePeriodicWork
import com.base.appzxhy.helper.EventUtils import com.base.appzxhy.helper.EventUtils
import com.base.appzxhy.helper.InstallHelps import com.base.appzxhy.helper.InstallHelps
...@@ -30,6 +30,10 @@ import com.base.appzxhy.utils.AppPreferences ...@@ -30,6 +30,10 @@ import com.base.appzxhy.utils.AppPreferences
import com.base.appzxhy.utils.LogEx import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.SolarEngineUtils.initSolarEngine import com.base.appzxhy.utils.SolarEngineUtils.initSolarEngine
import com.base.appzxhy.utils.SolarEngineUtils.solarkey import com.base.appzxhy.utils.SolarEngineUtils.solarkey
import com.bytedance.sdk.openadsdk.api.init.PAGConfig
import com.bytedance.sdk.openadsdk.api.init.PAGSdk
import com.bytedance.sdk.openadsdk.api.init.PAGSdk.PAGInitCallback
import com.bytedance.sdk.shortplay.api.PSSDK
import com.facebook.FacebookSdk import com.facebook.FacebookSdk
import com.google.android.gms.ads.identifier.AdvertisingIdClient import com.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.gson.Gson import com.google.gson.Gson
...@@ -119,6 +123,7 @@ class MyApplication : Application() { ...@@ -119,6 +123,7 @@ class MyApplication : Application() {
startJob() startJob()
} }
initShortDramaSdk()
//初始化广告相关业务 //初始化广告相关业务
AdsMgr.init(appContext) AdsMgr.init(appContext)
...@@ -275,4 +280,46 @@ class MyApplication : Application() { ...@@ -275,4 +280,46 @@ class MyApplication : Application() {
} }
/**
* 初始化短剧sdk
*/
fun initShortDramaSdk() {
val appId = "8309530"
val securityKey = "82dc912698c9e4e7cd8176da48906fde"
val builder = PSSDK.Config.Builder()
builder.appId(appId)
.vodAppId("568708")
.securityKey(securityKey)
.licenseAssertPath("vod_player.lic")
.debug(true)
PSSDK.init(this, builder.build()) { success, errorInfo ->
LogEx.logDebug(
TAG, "onInitFinished() called with: success = [$success], errorInfo = [$errorInfo]"
)
}
//合规设置
PSSDK.setEligibleAudience(true)
initPangleAdsSDK()
}
/**
* 初始化短剧广告sdk
*/
private fun initPangleAdsSDK() {
val builder = PAGConfig.Builder()
builder.appId("8025677").appIcon(R.drawable.ic_launcher_foreground)
PAGSdk.init(this, builder.build(), object : PAGInitCallback {
override fun success() {
LogEx.logDebug(TAG, "pangle ads sdk init success")
}
override fun fail(i: Int, s: String) {
LogEx.logDebug(TAG, "pangle ads sdk init fail, i=$i, s=$s")
}
})
}
} }
\ No newline at end of file
...@@ -5,13 +5,13 @@ class AdConfigBean( ...@@ -5,13 +5,13 @@ class AdConfigBean(
var numDisplayLimit: Int = -1, var numDisplayLimit: Int = -1,
var numRequestLimit: Int = -1, var numRequestLimit: Int = -1,
var numClickLimit: Int = -1, var numClickLimit: Int = -1,
var timeInterval: Int = 1, var timeInterval: Int = 60,
var openAdLoading: Int = 15, var openAdLoading: Int = 15,
var functionBackShowAd: Boolean = true, var functionBackShowAd: Boolean = true,
var functionInShowAd: Boolean = true, var functionInShowAd: Boolean = true,
){ ) {
companion object{ companion object {
/** /**
* 广告配置项目 * 广告配置项目
*/ */
......
...@@ -4,7 +4,7 @@ class PopupConfigBean( ...@@ -4,7 +4,7 @@ class PopupConfigBean(
var popupForegroundCanPush: Boolean = false, var popupForegroundCanPush: Boolean = false,
var popupStatus: Boolean = true, var popupStatus: Boolean = true,
var popupCount: Int = 24, var popupCount: Int = 200,
var popupStart: Int = 0, var popupStart: Int = 0,
var popupEnd: Int = 24, var popupEnd: Int = 24,
var popupInterval: Int = 1, var popupInterval: Int = 1,
...@@ -16,7 +16,7 @@ class PopupConfigBean( ...@@ -16,7 +16,7 @@ class PopupConfigBean(
//定时器 //定时器
var timerS: Boolean = true, var timerS: Boolean = true,
var timerDelay: Int = 1, var timerDelay: Int = 1,
var timerInterval: Int = 1, var timerInterval: Int = 7,
//解锁 //解锁
var screenS: Boolean = true, var screenS: Boolean = true,
......
package com.base.appzxhy.ui.concatAdapter package com.base.appzxhy.ui.concatAdapter
import android.content.Context import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import androidx.palette.graphics.Palette
import com.base.appzxhy.R import com.base.appzxhy.R
import com.base.appzxhy.databinding.ItemBannerBinding import com.base.appzxhy.databinding.ItemBannerBinding
import com.base.appzxhy.databinding.ItemGalleryBannerBinding import com.base.appzxhy.databinding.ItemGalleryBannerBinding
import com.base.appzxhy.ui.adapter.CommonViewHolder import com.base.appzxhy.ui.adapter.CommonViewHolder
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.XmlEx.inflate import com.base.appzxhy.utils.XmlEx.inflate
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.bytedance.sdk.shortplay.api.ShortPlay import com.bytedance.sdk.shortplay.api.ShortPlay
import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.BaseQuickAdapter
import com.youth.banner.adapter.BannerAdapter import com.youth.banner.adapter.BannerAdapter
class BannerAdapter( class BannerAdapter(
val shortPlayList: List<ShortPlay> val shortPlayList: List<ShortPlay>
) : BaseQuickAdapter<Any, CommonViewHolder>() { ) : BaseQuickAdapter<Any, CommonViewHolder>() {
private val TAG = "BannerAdapter"
var paletteAction: ((colorInt: Int) -> Unit)? = null
var playAction: ((shortPlay: ShortPlay) -> Unit)? = null
override fun getItemCount(items: List<Any>): Int {
return 1
}
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: Any?) { override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: Any?) {
val binding = ItemBannerBinding.bind(holder.itemView) val binding = ItemBannerBinding.bind(holder.itemView)
val context = holder.itemView.context
LogEx.logDebug(TAG, "onBindViewHolder")
if (binding.banner.adapter == null) { if (binding.banner.adapter == null) {
LogEx.logDebug(TAG, "onBindViewHolder banner")
binding.banner.setAdapter(GalleryAdapter(shortPlayList)) binding.banner.setAdapter(GalleryAdapter(shortPlayList))
//添加画廊效果
binding.banner.setBannerGalleryEffect(
context.resources.getDimensionPixelSize(R.dimen.dp_30),
context.resources.getDimensionPixelSize(R.dimen.dp_10)
)
binding.banner.setIndicator(binding.indicator, false)
} }
} }
...@@ -27,8 +54,7 @@ class BannerAdapter( ...@@ -27,8 +54,7 @@ class BannerAdapter(
return CommonViewHolder(R.layout.item_banner.inflate(parent)) return CommonViewHolder(R.layout.item_banner.inflate(parent))
} }
inner class GalleryAdapter(list: List<ShortPlay>) : inner class GalleryAdapter(list: List<ShortPlay>) : BannerAdapter<ShortPlay, CommonViewHolder>(list) {
BannerAdapter<ShortPlay, CommonViewHolder>(list) {
override fun onCreateHolder(parent: ViewGroup, viewType: Int): CommonViewHolder { override fun onCreateHolder(parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_gallery_banner.inflate(parent)) return CommonViewHolder(R.layout.item_gallery_banner.inflate(parent))
...@@ -38,8 +64,34 @@ class BannerAdapter( ...@@ -38,8 +64,34 @@ class BannerAdapter(
data ?: return data ?: return
val context = holder.itemView.context val context = holder.itemView.context
val binding = ItemGalleryBannerBinding.bind(holder.itemView) val binding = ItemGalleryBannerBinding.bind(holder.itemView)
Glide.with(context).load(data.coverImage).into(binding.iv) binding.llPlay.setOnClickListener {
playAction?.invoke(data)
}
paletteImage(binding.iv, data.coverImage)
} }
} }
private fun paletteImage(imageView: ImageView, coverImage: String) {
Glide.with(context)
.asBitmap()
.load(coverImage)
.into(object : CustomTarget<Bitmap?>() {
override fun onResourceReady(bitmap: Bitmap, transition: Transition<in Bitmap?>?) {
imageView.setImageBitmap(bitmap)
Palette.from(bitmap).generate { palette ->
palette ?: return@generate
// 获取主题色
val vibrantColor: Int = palette.getVibrantColor(Color.TRANSPARENT)
val mutedColor: Int = palette.getMutedColor(Color.TRANSPARENT)
// 使用这些颜色进行后续操作,例如设置背景色等
paletteAction?.invoke(mutedColor)
}
}
override fun onLoadCleared(placeholder: Drawable?) {
// 图片加载失败或清除时的处理
}
})
}
} }
\ No newline at end of file
package com.base.appzxhy.ui.concatAdapter
import android.content.Context
import android.view.ViewGroup
import com.base.appzxhy.R
import com.base.appzxhy.databinding.ItemShortplayColumnsBinding
import com.base.appzxhy.databinding.ItemShortplayStyle1Binding
import com.base.appzxhy.ui.adapter.CommonViewHolder
import com.base.appzxhy.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.chad.library.adapter4.BaseQuickAdapter
/**
* 多列的adapter
*/
class ShortPlayColumnsAdapter(
val category: String = "",
val shortList: List<ShortPlay>
) : BaseQuickAdapter<Any, CommonViewHolder>() {
override fun getItemCount(items: List<Any>): Int {
return 1
}
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: Any?) {
val binding = ItemShortplayColumnsBinding.bind(holder.itemView)
binding.tvCategory.text = category
if (binding.rv.adapter == null) {
val adapter = ShortPlayAdapter()
binding.rv.adapter = adapter
adapter.submitList(shortList)
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_shortplay_columns.inflate(parent))
}
inner class ShortPlayAdapter() : BaseQuickAdapter<ShortPlay, CommonViewHolder>() {
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: ShortPlay?) {
item ?: return
val binding = ItemShortplayStyle1Binding.bind(holder.itemView)
val context = holder.itemView.context
Glide.with(context).load(item.coverImage).into(binding.iv)
binding.tvName.text = item.title
binding.tvCategory.text = item.desc
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_shortplay_style_1.inflate(parent))
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main package com.base.appzxhy.ui.main
import android.content.Intent
import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.ConcatAdapter
import com.base.appzxhy.base.BaseFragment import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentHomeBinding import com.base.appzxhy.databinding.FragmentHomeBinding
import com.base.appzxhy.ui.concatAdapter.BannerAdapter import com.base.appzxhy.ui.concatAdapter.BannerAdapter
import com.base.appzxhy.ui.play.PlayFullActivity
import com.base.appzxhy.ui.vm.ShortPlayViewModel import com.base.appzxhy.ui.vm.ShortPlayViewModel
import com.base.appzxhy.utils.BarUtils
import com.base.appzxhy.utils.LogEx
import com.google.gson.Gson
class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) { class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) {
private var contactAdapter: ConcatAdapter? = null private var contactAdapter: ConcatAdapter? = null
private var bannerAdapter: BannerAdapter? = null
private val viewModel by lazy(LazyThreadSafetyMode.NONE) { private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[ShortPlayViewModel::class.java] ViewModelProvider(this)[ShortPlayViewModel::class.java]
...@@ -19,17 +24,31 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl ...@@ -19,17 +24,31 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
override fun initView() { override fun initView() {
super.initView() super.initView()
binding.rv.updatePadding(top = BarUtils.getStatusBarHeight())
contactAdapter = ConcatAdapter() contactAdapter = ConcatAdapter()
binding.rv.adapter = contactAdapter binding.rv.adapter = contactAdapter
initBannerAdapter() initBannerAdapter()
} }
private fun initBannerAdapter() { private fun initBannerAdapter() {
viewModel.loadShortPlayCategory() viewModel.getRequestPopularDrama { list ->
bannerAdapter = BannerAdapter(listOf()) val activity = requireActivity() as MainActivity?
bannerAdapter?.let { activity?.runOnUiThread {
contactAdapter?.addAdapter(0, it) LogEx.logDebug(TAG, "list=${list.size}")
val bannerAdapter = BannerAdapter(list)
bannerAdapter.paletteAction = {
binding.root.setBackgroundColor(it)
} }
bannerAdapter.playAction = { shortPlay ->
startActivity(Intent(activity, PlayFullActivity::class.java).apply {
putExtra("data", Gson().toJson(shortPlay))
})
}
contactAdapter?.addAdapter(0, bannerAdapter)
}
}
} }
override fun initListener() { override fun initListener() {
......
...@@ -13,6 +13,7 @@ import com.base.appzxhy.databinding.ItemHomeTabBinding ...@@ -13,6 +13,7 @@ import com.base.appzxhy.databinding.ItemHomeTabBinding
import com.base.appzxhy.utils.LogEx import com.base.appzxhy.utils.LogEx
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import com.gyf.immersionbar.ktx.immersionBar
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) { class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
...@@ -67,6 +68,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -67,6 +68,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
private fun naviFragment(id: Int) { private fun naviFragment(id: Int) {
when (id) { when (id) {
0 -> { 0 -> {
} }
1 -> { 1 -> {
...@@ -90,4 +92,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -90,4 +92,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
naviFragment(this.id) naviFragment(this.id)
} }
override fun configSystemBar() {
immersionBar {
statusBarColor("#00FFFFFF")
// navigationBarColor("#FFFFFFFF")
statusBarDarkFont(false)
// navigationBarDarkIcon(true)
// fitsSystemWindows(true)
}
}
} }
\ No newline at end of file
package com.base.appzxhy.ui.play
import android.view.View
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.databinding.ActivityPlayFullBinding
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.ToastUtils.toast
import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.PSSDK.AdCustomProvider
import com.bytedance.sdk.shortplay.api.PSSDK.DetailPageConfig
import com.bytedance.sdk.shortplay.api.PSSDK.DrawAdProvider
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment
import com.google.gson.Gson
import com.gyf.immersionbar.ImmersionBar
class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullBinding::inflate) {
private var shortPlay: ShortPlay? = null
private var detailFragment: ShortPlayFragment? = null
private val startFromIndex = 1//剧集下标
private val startFromSeconds = 0//开始秒数
override fun initView() {
super.initView()
val data = intent.extras?.getString("data")
LogEx.logDebug(TAG, "data=$data")
data?.let {
shortPlay = Gson().fromJson(it, ShortPlay::class.java)
}
shortPlay?.let { showDetailFragment(it) }
}
override fun initListener() {
super.initListener()
}
/**
* 视频详情页
*/
private fun showDetailFragment(shortPlay: ShortPlay) {
val builder = DetailPageConfig.Builder()
builder.displayTextVisibility(DetailPageConfig.TEXT_POS_BOTTOM_DESC, false)
builder.displayTextVisibility(DetailPageConfig.TEXT_POS_BOTTOM_TITLE, false)
builder.displayProgressBar(false)
builder.startPlayIndex(startFromIndex)
builder.startPlayAtTimeSeconds(startFromSeconds)
// 配置广告策略
builder.adCustomProvider(object : AdCustomProvider {
override fun getDetailDrawAdPositions(): List<Int> {
val integers = ArrayList<Int>()
// 在第1集、第3集、第50集后面插入广告
integers.add(1)
integers.add(3)
integers.add(50)
return integers
}
override fun getDrawAdProvider(): DrawAdProvider {
return object : DrawAdProvider {
override fun onPrepareAd() {
// 快划到广告插入位置时调用,可以在这里请求广告
// loadPangleFeedAd()
}
override fun onObtainAdView(position: Int, index: Int): View? {
// 返回广告View,如没有可用广告则返回null
return null
}
override fun onDestroy() {
// 播放页退出时调用,可在这里释放广告资源
}
}
}
})
builder.progressBarMarginToBottom(10)
detailFragment = PSSDK.createDetailFragment(shortPlay, builder.build(), object : PSSDK.ShortPlayDetailPageListener {
override fun onProgressChange(shortPlay: ShortPlay?, index: Int, currentPlayTimeInSeconds: Int, durationInSeconds: Int) {
}
override fun onPlayFailed(errorInfo: PSSDK.ErrorInfo?): Boolean {
if (errorInfo?.code == PSSDK.ErrorInfo.ERROR_CODE_CURRENT_COUNTRY_NOT_SUPPORT) {
// 当前地区不支持播放,SDK会Toast提示,开发者也可以在此时显示弹窗等更友好的提示
// return true表示替换掉SDK内的Toast提示
toast("code current country not support")
return true
}
return false
}
override fun onShortPlayPlayed(shortPlay: ShortPlay?, index: Int) {
}
override fun onItemSelected(position: Int, p1: PSSDK.ShortPlayDetailPageListener.ItemType?, index: Int) {
}
override fun onVideoPlayStateChanged(shortPlay: ShortPlay?, index: Int, playbackState: Int) {
}
override fun onVideoPlayCompleted(shortPlay: ShortPlay?, index: Int) {
}
override fun onEnterImmersiveMode() {
// 进入沉浸式模式
}
override fun onExitImmersiveMode() {
// 退出沉浸式模式
}
override fun isNeedBlock(shortPlay: ShortPlay?, index: Int): Boolean {
// 询问index集是否锁定,true锁定后则该集无法自动播放,需要通过showAdIfNeed里完成解锁
// 默认对每一集均会询问,一旦返回false则此播放页不会再询问该集
return false
}
override fun showAdIfNeed(shortPlay: ShortPlay?, index: Int, listener: PSSDK.ShortPlayBlockResultListener?) {
// 当isNeedBlock指定index集锁定后,在用户切换到该集时,SDK不会播放视频,同时会调用此回调,可在此时展示激励广告或购买等交互,用户达成后调用listener.onShortPlayUnlocked告知SDK可播放该集
}
override fun onVideoInfoFetched(shortPlay: ShortPlay?, index: Int, videoPlayInfo: PSSDK.VideoPlayInfo?) {
}
override fun onObtainPlayerControlViews(): MutableList<View> {
return arrayListOf(View(this@PlayFullActivity))
}
})
if (detailFragment == null) {
LogEx.logDebug(TAG, "create detailFragment failed")
return
}
detailFragment?.let {
// 将播放页展示出来
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, it)
.show(it).commit()
}
}
override fun configSystemBar() {
ImmersionBar.with(this)
.statusBarColor(R.color.black)
.init()
}
}
\ No newline at end of file
...@@ -16,12 +16,34 @@ class ShortPlayViewModel : ViewModel() { ...@@ -16,12 +16,34 @@ class ShortPlayViewModel : ViewModel() {
private val TAG = "ShortPlayViewModel" private val TAG = "ShortPlayViewModel"
/**
* 获取热门短剧列表
*/
fun getRequestPopularDrama(
count: Int = 10,
uiAction: (list: List<ShortPlay>) -> Unit
) {
PSSDK.requestPopularDrama(1, count, object : FeedListResultListener {
override fun onFail(errorInfo: PSSDK.ErrorInfo?) {
LogEx.logDebug(TAG, "getRequestPopularDrama ${errorInfo?.msg} ${errorInfo?.code}")
}
override fun onSuccess(result: FeedListLoadResult<ShortPlay>?) {
// LogEx.logDebug(TAG, "hasMore=${result?.hasMore}")
// LogEx.logDebug(TAG, "fromCache=${result?.fromCache}")
// LogEx.logDebug(TAG, "dataList=${result?.dataList?.size}")
result?.dataList?.let { uiAction.invoke(it) }
}
})
}
/** /**
* 加载分类 * 加载分类
*/ */
fun loadShortPlayCategory() = viewModelScope.launch(Dispatchers.IO) { fun loadShortPlayCategory() = viewModelScope.launch(Dispatchers.IO) {
LogEx.logDebug(TAG, "loadShortPlayCategory")
val lang = "" val lang = "en"
PSSDK.requestCategoryList(lang, object : CategoryListResultListener { PSSDK.requestCategoryList(lang, object : CategoryListResultListener {
override fun onFail(errorInfo: PSSDK.ErrorInfo) { override fun onFail(errorInfo: PSSDK.ErrorInfo) {
......
...@@ -6,7 +6,13 @@ import com.base.appzxhy.BuildConfig ...@@ -6,7 +6,13 @@ import com.base.appzxhy.BuildConfig
object LogEx { object LogEx {
val isOpen = true val isOpen = true
val filterTAG = arrayOf( val filterTAG = arrayOf(
"", "StayJobService",
"EventUtils",
"ReportUtils",
"TimerManager",
"AlarmJobReceiver",
"AdmobEvent",
"NewComUtils"
) )
fun logDebug(tag: String, content: String, isMust: Boolean = false) { fun logDebug(tag: String, content: String, isMust: Boolean = false) {
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="@color/white" />
<corners android:radius="10dp" />
</shape>
\ 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.play.PlayFullActivity">
<FrameLayout
android:id="@+id/fragment_container"
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"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black"
tools:context=".ui.main.HomeFragment"> tools:context=".ui.main.HomeFragment">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv" android:id="@+id/rv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_marginTop="58dp"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</FrameLayout> </LinearLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:banner="http://schemas.android.com/apk/res-auto" xmlns:banner="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:orientation="vertical">
<com.youth.banner.Banner <com.youth.banner.Banner
android:id="@+id/banner" android:id="@+id/banner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="450dp" android:layout_height="450dp"
banner:banner_indicator_normal_color="#ffffff" banner:banner_indicator_height="3dp"
banner:banner_indicator_selected_color="#4DFFFFFF" banner:banner_indicator_normal_color="#4DFFFFFF"
banner:banner_radius="10dp" banner:banner_indicator_normal_width="13dp"
banner:banner_indicator_selected_color="#FFFFFF"
banner:banner_indicator_selected_width="20dp"
banner:layout_constraintEnd_toEndOf="parent" banner:layout_constraintEnd_toEndOf="parent"
banner:layout_constraintStart_toStartOf="parent" banner:layout_constraintStart_toStartOf="parent"
banner:layout_constraintTop_toTopOf="parent" /> banner:layout_constraintTop_toTopOf="parent" />
<com.youth.banner.indicator.RectangleIndicator
android:id="@+id/indicator"
android:layout_width="wrap_content"
android:layout_height="6dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="15dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="450dp" xmlns:tools="http://schemas.android.com/tools"
xmlns:tools="http://schemas.android.com/tools"> android:layout_width="match_parent"
android:id="@+id/cardView"
android:layout_height="match_parent"
app:cardCornerRadius="10dp">
<ImageView <ImageView
tools:background="#FFA791"
android:id="@+id/iv" android:id="@+id/iv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:padding="1dp"
android:scaleType="centerCrop"
tools:ignore="ContentDescription" />
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_stroke_ffffff_10" />
<LinearLayout <LinearLayout
android:id="@+id/llPlay"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom" android:layout_gravity="center_horizontal|bottom"
...@@ -24,7 +36,8 @@ ...@@ -24,7 +36,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:src="@mipmap/h_play" /> android:src="@mipmap/h_play"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -34,9 +47,10 @@ ...@@ -34,9 +47,10 @@
android:includeFontPadding="false" android:includeFontPadding="false"
android:text="Play" android:text="Play"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="17sp" /> android:textSize="17sp"
tools:ignore="HardcodedText" />
</LinearLayout> </LinearLayout>
</FrameLayout> </androidx.cardview.widget.CardView>
\ No newline at end of file \ 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="wrap_content"
android:background="@color/black">
<TextView
android:id="@+id/tvCategory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:textColor="@color/white"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Most Trending" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:paddingHorizontal="8dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvCategory"
app:spanCount="3"
tools:listitem="@layout/item_shortplay_style_1" />
</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="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginVertical="6dp"
tools:background="@color/black">
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="72dp"
android:layout_height="96dp"
app:cardCornerRadius="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/tvName"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:maxLines="2"
android:textColor="@color/white"
android:textSize="14sp"
app:layout_constraintBottom_toTopOf="@id/tvCategory"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/card"
app:layout_constraintTop_toTopOf="@id/card"
tools:text="The Quarterback Next Door" />
<TextView
android:id="@+id/tvCategory"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="20dp"
android:singleLine="true"
android:textColor="#80FFFFFF"
android:textSize="13sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/card"
app:layout_constraintTop_toBottomOf="@id/tvName"
tools:text="Friends to Lovers" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp_10">10dp</dimen>
<dimen name="dp_30">30dp</dimen>
<dimen name="dp_1">1dp</dimen>
<dimen name="dp_3">3dp</dimen>
<dimen name="dp_6">6dp</dimen>
<dimen name="dp_14">14dp</dimen>
</resources>
\ No newline at end of file
...@@ -19,6 +19,7 @@ vungle = "7.4.2.0" ...@@ -19,6 +19,7 @@ vungle = "7.4.2.0"
facebook = "6.18.0.0" facebook = "6.18.0.0"
mintegral = "16.8.61.0" mintegral = "16.8.61.0"
pangle = "6.3.0.4.0" pangle = "6.3.0.4.0"
paletteKtx = "1.0.0"
[libraries] [libraries]
...@@ -48,6 +49,7 @@ applovin_vungle = { group = "com.applovin.mediation", name = "vungle-adapter", v ...@@ -48,6 +49,7 @@ applovin_vungle = { group = "com.applovin.mediation", name = "vungle-adapter", v
applovin_facebook = { group = "com.applovin.mediation", name = "facebook-adapter", version.ref = "facebook" } applovin_facebook = { group = "com.applovin.mediation", name = "facebook-adapter", version.ref = "facebook" }
applovin_mintegral = { group = "com.applovin.mediation", name = "mintegral-adapter", version.ref = "mintegral" } applovin_mintegral = { group = "com.applovin.mediation", name = "mintegral-adapter", version.ref = "mintegral" }
applovin_pangle = { group = "com.applovin.mediation", name = "bytedance-adapter", version.ref = "pangle" } applovin_pangle = { group = "com.applovin.mediation", name = "bytedance-adapter", version.ref = "pangle" }
androidx-palette-ktx = { group = "androidx.palette", name = "palette-ktx", version.ref = "paletteKtx" }
[plugins] [plugins]
......
pluginManagement { pluginManagement {
repositories { repositories {
google { google {
content { content {
includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.android.*")
...@@ -9,19 +10,14 @@ pluginManagement { ...@@ -9,19 +10,14 @@ pluginManagement {
} }
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
maven("https://artifact.bytedance.com/repository/Volcengine")
maven("https://artifact.bytedance.com/repository/pangle/")
maven("https://artifact.byteplus.com/repository/public/")
} }
} }
dependencyResolutionManagement { dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
maven("https://maven.google.com")
maven("https://s01.oss.sonatype.org/content/groups/public") maven("https://s01.oss.sonatype.org/content/groups/public")
maven("https://jitpack.io") maven("https://jitpack.io")
maven("https://android-sdk.is.com") maven("https://android-sdk.is.com")
...@@ -29,13 +25,16 @@ dependencyResolutionManagement { ...@@ -29,13 +25,16 @@ dependencyResolutionManagement {
maven("https://artifact.bytedance.com/repository/pangle") maven("https://artifact.bytedance.com/repository/pangle")
maven("https://dl-maven-android.mintegral.com/repository/se_sdk_for_android/") maven("https://dl-maven-android.mintegral.com/repository/se_sdk_for_android/")
maven("https://artifact.bytedance.com/repository/Volcengine")
//短剧必须
maven("https://artifact.bytedance.com/repository/pangle/") maven("https://artifact.bytedance.com/repository/pangle/")
maven("https://artifact.bytedance.com/repository/Volcengine/")
maven("https://artifact.byteplus.com/repository/public/") maven("https://artifact.byteplus.com/repository/public/")
} }
} }
rootProject.name = "heelshort" rootProject.name = "reelshort"
include(":app") include(":app")
\ 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