新增本地音乐数据库字段。

This commit is contained in:
ocean 2024-06-21 11:12:04 +08:00
parent b159bb178a
commit 9d76dafa47
9 changed files with 172 additions and 31 deletions

View File

@ -238,12 +238,14 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
suspend fun insertOfflineData(mediaItem: MediaItem) {
val favoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(mediaItem.mediaId)
val bean = OfflineBean(
videoId = mediaItem.mediaId,
title = mediaItem.mediaMetadata.title.toString(),
name = mediaItem.mediaMetadata.artist.toString(),
thumbnail = mediaItem.mediaMetadata.artworkUri.toString(),
isOffline = true
isOffline = true,
isFavorite = favoriteBean?.isFavorite ?: false
)
LogTag.LogD(TAG, "insertOfflineBean bean->${bean}")
App.appOfflineDBManager.insertOfflineBean(bean)

View File

@ -95,6 +95,10 @@ class MoListDetailsActivity : MoBaseActivity() {
}
private fun initView() {
adapter = DetailsListAdapter(this, myList)
binding.rv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
binding.rv.adapter = adapter
binding.backBtn.setOnClickListener {
finish()
}
@ -120,28 +124,28 @@ class MoListDetailsActivity : MoBaseActivity() {
}
}
@SuppressLint("NotifyDataSetChanged")
private suspend fun initData(browseId: String) {
showLoadingUi()
Innertube.moPlaylistPage(browseId)?.onSuccess {
if (this.isDestroyed || this.isFinishing) {
return
}
LogD(TAG, "moPlaylistPage onSuccess->${it.moPlaylistOrAlbumListBean}")
if (it.moPlaylistOrAlbumListBean.isNotEmpty()) {
showDataUi()
Glide.with(this).load(it.thumbnail).into(binding.imageView)
showDataUi()
Glide.with(this).load(it.thumbnail).into(binding.imageView)
binding.title.text = it.title
binding.subtitle.text = it.subtitle
binding.secondSubtitle.text = it.secondSubtitle
binding.title.text = it.title
binding.subtitle.text = it.subtitle
binding.secondSubtitle.text = it.secondSubtitle
adapter = DetailsListAdapter(this, it.moPlaylistOrAlbumListBean)
binding.rv.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
binding.rv.adapter = adapter
myList.clear()
myList.addAll(it.moPlaylistOrAlbumListBean)
myList.clear()
myList.addAll(it.moPlaylistOrAlbumListBean)
adapter?.notifyDataSetChanged()
} else {
showNoContentUi()
}
}?.onFailure {
showNoContentUi()
LogD(TAG, "moPlaylistPage onFailure->${it}")

View File

@ -2,6 +2,7 @@ package melody.offline.music.activity
import android.annotation.SuppressLint
import android.view.View
import androidx.media3.common.MediaItem
import androidx.recyclerview.widget.LinearLayoutManager
import com.gyf.immersionbar.ktx.immersionBar
import kotlinx.coroutines.channels.Channel
@ -14,12 +15,18 @@ import melody.offline.music.ads.AdPlacement
import melody.offline.music.ads.LolAdWrapper
import melody.offline.music.bean.OfflineBean
import melody.offline.music.databinding.ActivityOfflineSongsBinding
import melody.offline.music.util.AnalysisUtil
import melody.offline.music.util.LogTag
import org.json.JSONObject
class MoOfflineSongsActivity : MoBaseActivity() {
private val requests: Channel<Request> = Channel(Channel.UNLIMITED)
enum class Request {
TryAgain,
sealed class Request {
data object TryAgain : Request()
data object OnFavorites : Request()
data class OnDownload(val mediaItem: MediaItem) : Request()
data class UpdateFavorite(val id: String) : Request()
}
private lateinit var binding: ActivityOfflineSongsBinding
@ -54,6 +61,48 @@ class MoOfflineSongsActivity : MoBaseActivity() {
Request.TryAgain -> {
initData()
}
is Request.OnDownload -> {
}
Request.OnFavorites -> {
if (meController != null && meController.currentMediaItem != null) {
val currentMediaItem = meController.currentMediaItem
val jsonObject = JSONObject()
jsonObject.put(
"song_title", "${currentMediaItem?.mediaMetadata?.title}"
)
val songMap = mutableMapOf(
Pair(
AnalysisUtil.PARAM_VALUE, jsonObject.toString()
)
)
val currentFavoriteBean =
App.appFavoriteDBManager.getFavoriteBeanByID(currentMediaItem?.mediaId!!)
if (currentFavoriteBean != null) {
currentFavoriteBean.isFavorite = !currentFavoriteBean.isFavorite
App.appFavoriteDBManager.updateFavoriteBean(currentFavoriteBean)
if (currentFavoriteBean.isFavorite) {
AnalysisUtil.logEvent(
AnalysisUtil.PLAYER_B_LOVE_CLICK, songMap
)
} else {
AnalysisUtil.logEvent(
AnalysisUtil.PLAYER_B_UN_LOVE_CLICK, songMap
)
}
} else {
insertFavoriteData(currentMediaItem)
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_LOVE_CLICK, songMap)
}
requests.trySend(Request.UpdateFavorite(currentMediaItem.mediaId))
}
}
is Request.UpdateFavorite -> {
}
}
}
events.onReceive {
@ -103,8 +152,12 @@ class MoOfflineSongsActivity : MoBaseActivity() {
private fun initAdapter() {
adapter = OfflineSongsAdapter(this, offlineList)
binding.rv.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
adapter?.setOnFavoriteClickListener(object : OfflineSongsAdapter.OnFavoriteClickListener {
override fun onFavoriteClick(position: Int) {
requests.trySend(Request.OnFavorites)
}
})
binding.rv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
binding.rv.adapter = adapter
}
@ -114,8 +167,15 @@ class MoOfflineSongsActivity : MoBaseActivity() {
offlineList.clear()
val offlineBeans = App.appOfflineDBManager.getAllOfflineBeans()
val filteredBeans =
offlineBeans.filter { it.bytesDownloaded?.let { bytes -> bytes > 0 } == true }
// 更新
offlineBeans.forEach { offlineBean ->
val favoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(offlineBean.videoId)
if (offlineBean.id == favoriteBean?.id) {
offlineBean.isFavorite = favoriteBean.isFavorite
App.appOfflineDBManager.updateOfflineBean(offlineBean)
}
}
val filteredBeans = offlineBeans.filter { it.bytesDownloaded?.let { bytes -> bytes > 0 } == true }
offlineList.addAll(filteredBeans)
if (offlineList.size > 0) {
showDataUi()

View File

@ -30,12 +30,20 @@ class OfflineSongsAdapter(
val bean = list[position]
holder.bind(bean)
holder.binding.favoritedBtn.setOnClickListener {
if (favoriteClickListener != null) {
favoriteClickListener?.onFavoriteClick(position)
}
}
holder.itemView.setOnClickListener {
val intent = Intent(context, MoPlayDetailsActivity::class.java)
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_VIDEO_ID, bean.videoId)
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_NAME, bean.title)
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_DESC, bean.name)
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_COME_FROM, MoOfflineSongsActivity::class.java)
intent.putExtra(
MoPlayDetailsActivity.PLAY_DETAILS_COME_FROM,
MoOfflineSongsActivity::class.java
)
context.startActivity(intent)
}
@ -43,7 +51,7 @@ class OfflineSongsAdapter(
override fun getItemCount(): Int = list.size
inner class ViewHolder(private val binding: OfflineListItemBinding) :
inner class ViewHolder(val binding: OfflineListItemBinding) :
RecyclerView.ViewHolder(binding.root) {
@SuppressLint("SetTextI18n")
@ -76,6 +84,12 @@ class OfflineSongsAdapter(
binding.listPlayView.visibility = View.GONE
}
}
if (bean.isFavorite) {
binding.favoritedImg.setImageResource(R.drawable.favorited_icon)
} else {
binding.favoritedImg.setImageResource(R.drawable.not_favorited_icon)
}
}
}
}
@ -89,4 +103,14 @@ class OfflineSongsAdapter(
interface OnItemClickListener {
fun onItemClick(position: Int)
}
private var favoriteClickListener: OnFavoriteClickListener? = null
fun setOnFavoriteClickListener(listener: OnFavoriteClickListener) {
favoriteClickListener = listener
}
interface OnFavoriteClickListener {
fun onFavoriteClick(position: Int)
}
}

View File

@ -15,7 +15,8 @@ data class OfflineBean(
@ColumnInfo(name = "thumbnail") var thumbnail: String? = null,
@ColumnInfo(name = "bytesDownloaded") var bytesDownloaded: Long? = null,
@ColumnInfo(name = "size") var size: String? = null,
@ColumnInfo(name = "isOffline") var isOffline: Boolean
@ColumnInfo(name = "isOffline") var isOffline: Boolean,
@ColumnInfo(name = "isFavorite") var isFavorite: Boolean
) : Serializable {
@PrimaryKey(autoGenerate = true)
var id: Long = 0

View File

@ -2,6 +2,8 @@ package melody.offline.music.database
import android.content.Context
import androidx.room.Room
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import melody.offline.music.bean.OfflineBean
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@ -19,10 +21,16 @@ class AppOfflineDBManager private constructor(context: Context) {
}
}
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
// 在数据库中添加新的列
database.execSQL("ALTER TABLE OfflineBean ADD COLUMN isFavorite INTEGER NOT NULL DEFAULT 0")
}
}
private val database = Room.databaseBuilder(
context.applicationContext,
AppOfflineDatabase::class.java, "offline_data_base"
).build()
context.applicationContext, AppOfflineDatabase::class.java, "offline_data_base"
).addMigrations(MIGRATION_1_2).build()
private val dao = database.localOfflineDao()

View File

@ -5,7 +5,7 @@ import androidx.room.Database
import androidx.room.RoomDatabase
import melody.offline.music.bean.OfflineBean
@Database(entities = [OfflineBean::class], version = 1, exportSchema = false)
@Database(entities = [OfflineBean::class], version = 2, exportSchema = false)
abstract class AppOfflineDatabase : RoomDatabase() {
abstract fun localOfflineDao(): OfflineDao
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M11.944,20C11.532,20 11.136,19.836 10.845,19.544C10.553,19.253 10.389,18.857 10.389,18.444C10.389,18.032 10.553,17.636 10.845,17.345C11.136,17.053 11.532,16.889 11.944,16.889C12.357,16.889 12.753,17.053 13.044,17.345C13.336,17.636 13.5,18.032 13.5,18.444C13.5,18.857 13.336,19.253 13.044,19.544C12.753,19.836 12.357,20 11.944,20ZM11.944,13.556C11.532,13.556 11.136,13.392 10.845,13.1C10.553,12.808 10.389,12.413 10.389,12C10.389,11.587 10.553,11.192 10.845,10.9C11.136,10.608 11.532,10.444 11.944,10.444C12.357,10.444 12.753,10.608 13.044,10.9C13.336,11.192 13.5,11.587 13.5,12C13.5,12.413 13.336,12.808 13.044,13.1C12.753,13.392 12.357,13.556 11.944,13.556ZM11.944,7.111C11.532,7.111 11.136,6.947 10.845,6.655C10.553,6.364 10.389,5.968 10.389,5.556C10.389,5.143 10.553,4.747 10.845,4.456C11.136,4.164 11.532,4 11.944,4C12.357,4 12.753,4.164 13.044,4.456C13.336,4.747 13.5,5.143 13.5,5.556C13.5,5.968 13.336,6.364 13.044,6.655C12.753,6.947 12.357,7.111 11.944,7.111Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -59,8 +59,8 @@
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical">
@ -78,8 +78,8 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_marginTop="4dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
@ -95,7 +95,7 @@
android:fontFamily="@font/regular_font"
android:text="@string/app_name"
android:textColor="@color/white_60"
android:textSize="12dp"/>
android:textSize="12dp" />
<melody.offline.music.view.MarqueeTextView
android:id="@+id/name"
@ -111,6 +111,39 @@
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/favoritedBtn"
android:layout_width="36dp"
android:layout_height="36dp"
android:gravity="center">
<ImageView
android:id="@+id/favoritedImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/not_favorited_icon" />
</LinearLayout>
<LinearLayout
android:id="@+id/moreBtn"
android:layout_width="36dp"
android:layout_height="36dp"
android:gravity="center">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/three_dots_icon" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>