介绍和标题

This commit is contained in:
renhaoting 2025-11-19 13:50:29 +08:00
parent 38682f7815
commit c5153e3a95
8 changed files with 64 additions and 75 deletions

View File

@ -45,7 +45,7 @@ interface YoutubeApi {
@GET("/youtube/v3/videos")
suspend fun getVideoList(
@Query("part") part: String= URLEncoder.encode("id", "UTF-8"),
@Query("part") part: String= URLEncoder.encode("snippet", "UTF-8"),
@Query("key") key: String= VidiConst.YOUTUBE_API_KEY,
@Query("chart") chart: String="mostPopular",
@Query("regionCode") regionCode: String="BR",

View File

@ -9,10 +9,7 @@ import kotlinx.serialization.Serializable
data class ResYoutubeChannel(
val id: String,
val name: String,
) : BaseFragmentStateDiffItem {
override fun getPrimaryKey() = id
override fun getItemId() = id.hashCode().toLong()
}
)
@ -24,21 +21,13 @@ data class ResYoutubePlayList (
val prevPageToken: String,
val pageInfo: PageInfo,
val items: List<YoutubeVideo>,
) /*: BaseFragmentStateDiffItem {
override fun getPrimaryKey() = pageInfo
override fun getItemId() = pageInfo.hashCode().toLong()
}*/
)
@Serializable
data class PageInfo(
val totalResults: Int,
val resultsPerPage: Int,
) : BaseFragmentStateDiffItem {
override fun getPrimaryKey() = totalResults
override fun getItemId() = totalResults.hashCode().toLong()
}
)
@Serializable
data class YoutubeVideo(
val kind: String,
@ -60,27 +49,17 @@ data class YoutubeVideo(
@Serializable
data class ContentDetails(
val itemCount: Int,
): BaseFragmentStateDiffItem {
override fun getPrimaryKey() = itemCount
override fun getItemId() = itemCount.hashCode().toLong()
}
)
@Serializable
data class Player(
val embedHtml: String,
): BaseFragmentStateDiffItem {
override fun getPrimaryKey() = embedHtml
override fun getItemId() = embedHtml.hashCode().toLong()
}
)
@Serializable
data class Localizations(
val title: String,
val description: String,
): BaseFragmentStateDiffItem {
override fun getPrimaryKey() = title
override fun getItemId() = title.hashCode().toLong()
}
)
@ -90,33 +69,28 @@ data class Snippet(
val channelId: String,
val title: String,
val description: String,
val thumbnails: String, //
//val thumbnails: Thumbnail,
val channelTitle: String,
val defaultLanguage: String,
val localized: Localized,
) : BaseFragmentStateDiffItem {
override fun getPrimaryKey() = channelId
override fun getItemId() = channelId.hashCode().toLong()
}
)
@Serializable
data class Localized(
val title: String,
val description: String,
) : BaseFragmentStateDiffItem {
override fun getPrimaryKey() = title
override fun getItemId() = title.hashCode().toLong()
}
)
@Serializable
data class Thumbnail(
val standard: String,
)
@Serializable
data class Status(
val privacyStatus: String,
val podcastStatus: Int,
): BaseFragmentStateDiffItem {
override fun getPrimaryKey() = podcastStatus
override fun getItemId() = privacyStatus.hashCode().toLong()
}
)

View File

@ -28,5 +28,7 @@ class YoutubeViewModel @Inject constructor(
data class YoutubeUiState(
val playLists: List<YoutubeVideo>? = null,
val taskRestTime: Long = 0,
val starState: Boolean = false,
)

View File

@ -2,6 +2,8 @@ package com.gamedog.vididin.main.fragments.home.fragment
import android.os.Bundle
import android.text.method.MovementMethod
import android.text.method.ScrollingMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -10,6 +12,7 @@ import android.view.animation.Animation
import android.view.animation.AnimationSet
import android.view.animation.ScaleAnimation
import androidx.annotation.NonNull
import androidx.core.view.isVisible
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelFragment
import com.ama.core.common.widget.PopMenuIconView
import com.gamedog.vididin.R
@ -46,8 +49,8 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
if (mIsPlaying) mPlayer?.pause() else mPlayer?.play()
}
tvVideoFrom.text = "@From-" + arguments?.getLong(KEY_ID).toString()
tvVideoIntro.text = "Introduce-" + arguments?.getLong(KEY_ID).toString()
tvVideoFrom.text = mVideoData?.snippet?.localized?.title
tvVideoIntro.text = mVideoData?.snippet?.localized?.description
popMenu.setMenuList(
mutableListOf(
@ -189,6 +192,10 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
mVideoData!!.id,
0f
)
if (!playerView.isVisible) {
youTubePlayer.pause()
}
}
}
@ -213,7 +220,6 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
}
PlayerConstants.PlayerState.ENDED -> {
mIsPlaying = false
showPlayIconAnim()
}
PlayerConstants.PlayerState.BUFFERING -> {
mIsPlaying = false
@ -226,8 +232,22 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
})
}
override fun onResume() {
super.onResume()
mPlayer?.play()
}
override fun onStop() {
super.onStop()
mPlayer?.pause()
}
private fun hidePlayIconAnim() {
if (!binding?.playIcon!!.isVisible) {
return
}
with (binding?.playIcon!!) {
val animationSet = AnimationSet(true)
animationSet.duration = 250

View File

@ -31,6 +31,7 @@
android:layout_height="100dp"
android:padding="20dp"
android:src="@mipmap/icon_play"
android:visibility="gone"
android:layout_gravity="center"/>
@ -72,7 +73,8 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginVertical="25dp"
android:layout_marginHorizontal="15dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="80dp"
android:layout_gravity="bottom">
<TextView
@ -83,14 +85,21 @@
android:textSize="15sp"
android:textColor="@color/white" />
<TextView
android:id="@+id/tv_video_intro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="10dp"
android:text="introduce"
android:textSize="15sp"
android:textColor="@color/white_al80" />
>
<TextView
android:id="@+id/tv_video_intro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="introduce"
android:textSize="15sp"
android:textColor="@color/white_al80" />
</androidx.core.widget.NestedScrollView>
</LinearLayout>

View File

@ -7,11 +7,11 @@ import androidx.fragment.app.Fragment
import com.ama.core.architecture.BaseApp
private fun toast(strRes: Int): Unit {
fun showToast(strRes: Int): Unit {
Toast.makeText(BaseApp.appContext(), strRes, Toast.LENGTH_SHORT).show()
}
fun View.toast(strRes: Int): Unit = toast(strRes = strRes)
fun Fragment.toast(strRes: Int): Unit = toast(strRes = strRes)
fun Activity.toast(strRes: Int): Unit = toast(strRes = strRes)
fun View.toast(strRes: Int): Unit = showToast(strRes = strRes)
fun Fragment.toast(strRes: Int): Unit = showToast(strRes = strRes)
fun Activity.toast(strRes: Int): Unit = showToast(strRes = strRes)

View File

@ -1,23 +1,8 @@
package com.ama.core.model
interface BaseDiffItem {
/**
* 用于一级的areItemsTheSame比较获取主key
*/
fun getPrimaryKey(): Any
/**
* 用于二级的areContentsTheSame比较默认比较整个对象自己可修改为比较部分属性
*/
fun <T> areContentsTheSame(newItem: T): Boolean = this == newItem
/**
* 用于可选实现getChangePayload局部更新时用获取Item布局局部更新的数据对象
* 说明
* 1返回nullItem布局更新有动画否则无动画
* 2需要配合RecyclerView的onBindViewHolder(holder,position,payloads)使用在payloads内获取传入的值
*
*/
fun <T> getChangePayload(newItem: T): Any? = newItem
}

View File

@ -1,6 +1,5 @@
package com.ama.core.model
import com.ama.core.model.BaseDiffItem
interface BaseFragmentStateDiffItem : BaseDiffItem {
fun getItemId(): Long