This commit is contained in:
ocean 2024-07-02 18:01:41 +08:00
parent 43399079c8
commit 37e6a26daa
3 changed files with 110 additions and 46 deletions

View File

@ -260,6 +260,7 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
suspend fun insertOfflineData(mediaItem: MediaItem) {
val currentDownload = DownloadUtil.getCurrentIdDownload(mediaItem.mediaId)
val favoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(mediaItem.mediaId)
val bean = OfflineBean(
videoId = mediaItem.mediaId,
@ -267,7 +268,9 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
name = mediaItem.mediaMetadata.artist.toString(),
thumbnail = mediaItem.mediaMetadata.artworkUri.toString(),
isOffline = true,
isFavorite = favoriteBean?.isFavorite ?: false
isFavorite = favoriteBean?.isFavorite ?: false,
bytesDownloaded = currentDownload?.bytesDownloaded,
size = FileSizeConverter.formatSize(currentDownload?.bytesDownloaded ?: 0)
)
LogTag.LogD(TAG, "insertOfflineBean bean->${bean}")
App.appOfflineDBManager.insertOfflineBean(bean)

View File

@ -2,14 +2,19 @@ package melody.offline.music.activity
import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.LayoutInflater
import android.view.View
import android.view.animation.AnimationUtils
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.OptIn
import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri
import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
@ -46,6 +51,7 @@ import org.json.JSONObject
import melody.offline.music.App
import melody.offline.music.ads.AdPlacement
import melody.offline.music.ads.LolAdWrapper
import melody.offline.music.bean.PlaylistItem
import melody.offline.music.util.AnalysisUtil
@OptIn(UnstableApi::class)
@ -57,6 +63,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
data object OnFavorites : Request()
data class OnDownload(val mediaItem: MediaItem) : Request()
data class UpdateFavorite(val id: String) : Request()
data class UpdateDownloadUi(val id: String) : Request()
data class OnDownloadRemove(val mediaItem: MediaItem) : Request()
}
@ -265,25 +273,54 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
}
is Request.OnDownload -> {
LolAdWrapper.shared.showAdTiming(
this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD
)
val contentId = it.mediaItem.mediaId
val offBean = App.appOfflineDBManager.getOfflineBeanByID(contentId)//得到当前ID的本地数据
if (offBean != null && offBean.bytesDownloaded?.let { bytes -> bytes > 0 } == true) {//判断当前数据库是否有这条数据。
showRemoveDownloadDialogHint(it.mediaItem)
LogD(TAG,"Request.OnDownload 11111")
} else {
LogD(TAG,"Request.OnDownload 22222")
//已经存在这条数据,直接写入数据
if (DownloadUtil.downloadResourceExist(contentId)) {
insertOfflineData(it.mediaItem)
requests.trySend(Request.UpdateDownloadUi(contentId))
insertOfflineData(it.mediaItem)
val jsonObject = JSONObject()
jsonObject.put(
"download_id", "${it.mediaItem.mediaId}"
)
val songMap = mutableMapOf(
Pair(
AnalysisUtil.PARAM_VALUE, jsonObject.toString()
)
)
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_DOWNLOAD_CLICK, songMap)
LogD(TAG,"Request.OnDownload 33333")
}else{
val downloadRequest = DownloadRequest.Builder(contentId, contentId.toUri())
.setCustomCacheKey(contentId).build()
LolAdWrapper.shared.loadAdIfNotCached(
this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD
)
val downloadCount = DownloadUtil.getCurrentDownloads()
if (downloadCount >= 3) {
Toast.makeText(this@MoPlayDetailsActivity, getString(R.string.download_tips), Toast.LENGTH_LONG)
.show()
} else {
DownloadService.sendAddDownload(
this@MoPlayDetailsActivity, MyDownloadService::class.java, downloadRequest, false
)
}
LolAdWrapper.shared.showAdTiming(
this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD
)
insertOfflineData(it.mediaItem)
val jsonObject = JSONObject()
jsonObject.put(
"download_id", it.mediaItem.mediaId
)
val songMap = mutableMapOf(
Pair(
AnalysisUtil.PARAM_VALUE, jsonObject.toString()
)
)
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_DOWNLOAD_CLICK, songMap)
LolAdWrapper.shared.loadAdIfNotCached(
this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD
)
}
}
}
is Request.UpdateFavorite -> {
@ -296,6 +333,26 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
updateFavoriteUi(false)
}
}
is Request.UpdateDownloadUi -> {
val offlineBean = App.appOfflineDBManager.getOfflineBeanByID(it.id)
val isOffline = offlineBean?.isOffline ?: false
if (DownloadUtil.downloadResourceExist(it.id) && isOffline) {
downloadUi(true)
} else {
downloadUi(false)
}
}
is Request.OnDownloadRemove -> {
val currentOfflineBean =
App.appOfflineDBManager.getOfflineBeanByID(it.mediaItem.mediaId)
if (currentOfflineBean != null) {
App.appOfflineDBManager.deleteOfflineBean(currentOfflineBean)
}
requests.trySend(Request.UpdateDownloadUi(it.mediaItem.mediaId))
}
}
}
}
@ -377,16 +434,18 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
}
private fun updateDownloadUi(id: String) {
if (DownloadUtil.downloadResourceExist(id)) {//已经下载,按钮不可点击
requests.trySend(Request.UpdateDownloadUi(id))
}
private fun downloadUi(b: Boolean) {
if (b) {
binding.downloadLoading.visibility = View.GONE
binding.downloadImg.setImageResource(R.drawable.download_done_icon)
binding.downloadBtn.isClickable = false
binding.downloadBtn.isEnabled = false
binding.downloadImg.visibility = View.VISIBLE
} else {
binding.downloadLoading.visibility = View.GONE
binding.downloadImg.setImageResource(R.drawable.download_icon)
binding.downloadImg.visibility = View.VISIBLE
binding.downloadBtn.isClickable = true
binding.downloadBtn.isEnabled = true
}
}
@ -571,26 +630,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
binding.downloadBtn.setOnClickListener {
if (meController != null && meController.currentMediaItem != null) {
val currentMediaItem = meController.currentMediaItem
val contentId = currentMediaItem?.mediaId ?: ""
//如果已经存在就不进行下载
if (DownloadUtil.downloadResourceExist(contentId)) {
return@setOnClickListener
}
val downloadRequest = DownloadRequest.Builder(contentId, contentId.toUri())
.setCustomCacheKey(contentId).build()
val downloadCount = DownloadUtil.getCurrentDownloads()
if (downloadCount >= 3) {
Toast.makeText(this, getString(R.string.download_tips), Toast.LENGTH_LONG)
.show()
} else {
DownloadService.sendAddDownload(
this, MyDownloadService::class.java, downloadRequest, false
)
requests.trySend(Request.OnDownload(currentMediaItem!!))
}
requests.trySend(Request.OnDownload(currentMediaItem!!))
}
}
}
@ -897,4 +937,22 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
private fun showAD() {
LolAdWrapper.shared.showAdTiming(this, AdPlacement.INST_INTO_PLAY)
}
private fun showRemoveDownloadDialogHint(mediaItem: MediaItem) {
val inflater = LayoutInflater.from(this)
val dialogView = inflater.inflate(R.layout.dialog_hint, null)
val okBtn = dialogView.findViewById<TextView>(R.id.dialog_ok_btn)
val cancelBtn = dialogView.findViewById<TextView>(R.id.dialog_cancel_btn)
val dialogBuilder = AlertDialog.Builder(this).setView(dialogView)
val dialog = dialogBuilder.create()
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.show()
okBtn.setOnClickListener {
dialog.dismiss()
requests.trySend(Request.OnDownloadRemove(mediaItem))
}
cancelBtn.setOnClickListener {
dialog.dismiss()
}
}
}

View File

@ -70,9 +70,6 @@ class PlaylistSongsAdapter(
name.visibility = View.VISIBLE
name.text = bean.name
}
if (bean.size?.isNotEmpty() == true) {
size.text = bean.size
}
if (bean.isOffline) {
size.visibility = View.VISIBLE
downloadCoImg.visibility = View.VISIBLE
@ -82,6 +79,12 @@ class PlaylistSongsAdapter(
downloadImg.setImageResource(R.drawable.download_icon)
size.visibility = View.GONE
}
if (bean.size?.isNotEmpty() == true) {
size.text = bean.size
size.visibility = View.VISIBLE
} else {
size.visibility = View.GONE
}
}
}
}