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.util.Locale
......@@ -20,6 +18,7 @@ android {
targetSdk = 34
versionCode = 1
versionName = "1.0"
multiDexEnabled = true
ndk {
abiFilters.addAll(listOf("arm64-v8a", "armeabi-v7a"))
......@@ -73,9 +72,6 @@ gradle.taskGraph.whenReady {
}
}
}
dependencies {
implementation(libs.androidx.core.ktx)
......@@ -85,9 +81,12 @@ dependencies {
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.androidx.palette.ktx)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
implementation("androidx.multidex:multidex:2.0.1")
//glide
implementation("com.github.bumptech.glide:glide:4.16.0")
......
......@@ -48,3 +48,4 @@
-dontwarn com.google.**
-dontwarn okhttp3.**
-dontwarn kotlinx.**
-dontwarn android.os.SystemProperties
......@@ -3,6 +3,11 @@
xmlns:tools="http://schemas.android.com/tools">
<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_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
......@@ -18,6 +23,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.LocalWeatherWhite"
tools:targetApi="31">
<activity
android:name=".ui.start.StartActivity"
android:exported="true"
......@@ -30,12 +36,19 @@
</intent-filter>
</activity>
<activity
android:name=".ui.main.MainActivity"
android:exported="true">
</activity>
<activity
android:name=".ui.play.PlayFullActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
......@@ -110,7 +123,6 @@
android:exported="false"
android:foregroundServiceType="dataSync"
android:permission="android.permission.BIND_JOB_SERVICE" />
<service
android:name=".fcm.MessagingService"
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
import com.base.appzxhy.bean.config.PopupConfigBean
import com.base.appzxhy.fcm.FCMManager
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.PackageStatusReceiver
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.helper.EventUtils
import com.base.appzxhy.helper.InstallHelps
......@@ -30,6 +30,10 @@ import com.base.appzxhy.utils.AppPreferences
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.SolarEngineUtils.initSolarEngine
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.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.gson.Gson
......@@ -119,6 +123,7 @@ class MyApplication : Application() {
startJob()
}
initShortDramaSdk()
//初始化广告相关业务
AdsMgr.init(appContext)
......@@ -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(
var numDisplayLimit: Int = -1,
var numRequestLimit: Int = -1,
var numClickLimit: Int = -1,
var timeInterval: Int = 1,
var timeInterval: Int = 60,
var openAdLoading: Int = 15,
var functionBackShowAd: Boolean = true,
var functionInShowAd: Boolean = true,
){
) {
companion object{
companion object {
/**
* 广告配置项目
*/
......
......@@ -4,7 +4,7 @@ class PopupConfigBean(
var popupForegroundCanPush: Boolean = false,
var popupStatus: Boolean = true,
var popupCount: Int = 24,
var popupCount: Int = 200,
var popupStart: Int = 0,
var popupEnd: Int = 24,
var popupInterval: Int = 1,
......@@ -16,7 +16,7 @@ class PopupConfigBean(
//定时器
var timerS: Boolean = true,
var timerDelay: Int = 1,
var timerInterval: Int = 1,
var timerInterval: Int = 7,
//解锁
var screenS: Boolean = true,
......
package com.base.appzxhy.ui.concatAdapter
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.ViewGroup
import android.widget.ImageView
import androidx.palette.graphics.Palette
import com.base.appzxhy.R
import com.base.appzxhy.databinding.ItemBannerBinding
import com.base.appzxhy.databinding.ItemGalleryBannerBinding
import com.base.appzxhy.ui.adapter.CommonViewHolder
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.XmlEx.inflate
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.chad.library.adapter4.BaseQuickAdapter
import com.youth.banner.adapter.BannerAdapter
class BannerAdapter(
val shortPlayList: List<ShortPlay>
) : 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?) {
val binding = ItemBannerBinding.bind(holder.itemView)
val context = holder.itemView.context
LogEx.logDebug(TAG, "onBindViewHolder")
if (binding.banner.adapter == null) {
LogEx.logDebug(TAG, "onBindViewHolder banner")
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(
return CommonViewHolder(R.layout.item_banner.inflate(parent))
}
inner class GalleryAdapter(list: List<ShortPlay>) :
BannerAdapter<ShortPlay, CommonViewHolder>(list) {
inner class GalleryAdapter(list: List<ShortPlay>) : BannerAdapter<ShortPlay, CommonViewHolder>(list) {
override fun onCreateHolder(parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_gallery_banner.inflate(parent))
......@@ -38,8 +64,34 @@ class BannerAdapter(
data ?: return
val context = holder.itemView.context
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
import android.content.Intent
import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.ConcatAdapter
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentHomeBinding
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.utils.BarUtils
import com.base.appzxhy.utils.LogEx
import com.google.gson.Gson
class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) {
private var contactAdapter: ConcatAdapter? = null
private var bannerAdapter: BannerAdapter? = null
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[ShortPlayViewModel::class.java]
......@@ -19,17 +24,31 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
override fun initView() {
super.initView()
binding.rv.updatePadding(top = BarUtils.getStatusBarHeight())
contactAdapter = ConcatAdapter()
binding.rv.adapter = contactAdapter
initBannerAdapter()
}
private fun initBannerAdapter() {
viewModel.loadShortPlayCategory()
bannerAdapter = BannerAdapter(listOf())
bannerAdapter?.let {
contactAdapter?.addAdapter(0, it)
viewModel.getRequestPopularDrama { list ->
val activity = requireActivity() as MainActivity?
activity?.runOnUiThread {
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() {
......
......@@ -13,6 +13,7 @@ import com.base.appzxhy.databinding.ItemHomeTabBinding
import com.base.appzxhy.utils.LogEx
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import com.gyf.immersionbar.ktx.immersionBar
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
......@@ -67,6 +68,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
private fun naviFragment(id: Int) {
when (id) {
0 -> {
}
1 -> {
......@@ -90,4 +92,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
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() {
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) {
val lang = ""
LogEx.logDebug(TAG, "loadShortPlayCategory")
val lang = "en"
PSSDK.requestCategoryList(lang, object : CategoryListResultListener {
override fun onFail(errorInfo: PSSDK.ErrorInfo) {
......
......@@ -6,7 +6,13 @@ import com.base.appzxhy.BuildConfig
object LogEx {
val isOpen = true
val filterTAG = arrayOf(
"",
"StayJobService",
"EventUtils",
"ReportUtils",
"TimerManager",
"AlarmJobReceiver",
"AdmobEvent",
"NewComUtils"
)
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"?>
<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:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".ui.main.HomeFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
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" />
</FrameLayout>
\ No newline at end of file
</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"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:banner="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:orientation="vertical">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="450dp"
banner:banner_indicator_normal_color="#ffffff"
banner:banner_indicator_selected_color="#4DFFFFFF"
banner:banner_radius="10dp"
banner:banner_indicator_height="3dp"
banner:banner_indicator_normal_color="#4DFFFFFF"
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_constraintStart_toStartOf="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>
\ No newline at end of file
</LinearLayout>
\ 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="300dp"
android:layout_height="450dp"
xmlns:tools="http://schemas.android.com/tools">
<androidx.cardview.widget.CardView 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:id="@+id/cardView"
android:layout_height="match_parent"
app:cardCornerRadius="10dp">
<ImageView
tools:background="#FFA791"
android:id="@+id/iv"
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
android:id="@+id/llPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
......@@ -24,7 +36,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/h_play" />
android:src="@mipmap/h_play"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
......@@ -34,9 +47,10 @@
android:includeFontPadding="false"
android:text="Play"
android:textColor="@color/black"
android:textSize="17sp" />
android:textSize="17sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
\ No newline at end of file
</androidx.cardview.widget.CardView>
\ 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
......@@ -20,4 +20,4 @@ kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
\ No newline at end of file
android.nonTransitiveRClass=true
......@@ -19,6 +19,7 @@ vungle = "7.4.2.0"
facebook = "6.18.0.0"
mintegral = "16.8.61.0"
pangle = "6.3.0.4.0"
paletteKtx = "1.0.0"
[libraries]
......@@ -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_mintegral = { group = "com.applovin.mediation", name = "mintegral-adapter", version.ref = "mintegral" }
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]
......
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
......@@ -9,19 +10,14 @@ pluginManagement {
}
mavenCentral()
gradlePluginPortal()
maven("https://artifact.bytedance.com/repository/Volcengine")
maven("https://artifact.bytedance.com/repository/pangle/")
maven("https://artifact.byteplus.com/repository/public/")
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven("https://maven.google.com")
maven("https://s01.oss.sonatype.org/content/groups/public")
maven("https://jitpack.io")
maven("https://android-sdk.is.com")
......@@ -29,13 +25,16 @@ dependencyResolutionManagement {
maven("https://artifact.bytedance.com/repository/pangle")
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/Volcengine/")
maven("https://artifact.byteplus.com/repository/public/")
}
}
rootProject.name = "heelshort"
rootProject.name = "reelshort"
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