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) { suspend fun insertOfflineData(mediaItem: MediaItem) {
val currentDownload = DownloadUtil.getCurrentIdDownload(mediaItem.mediaId)
val favoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(mediaItem.mediaId) val favoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(mediaItem.mediaId)
val bean = OfflineBean( val bean = OfflineBean(
videoId = mediaItem.mediaId, videoId = mediaItem.mediaId,
@ -267,7 +268,9 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
name = mediaItem.mediaMetadata.artist.toString(), name = mediaItem.mediaMetadata.artist.toString(),
thumbnail = mediaItem.mediaMetadata.artworkUri.toString(), thumbnail = mediaItem.mediaMetadata.artworkUri.toString(),
isOffline = true, 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}") LogTag.LogD(TAG, "insertOfflineBean bean->${bean}")
App.appOfflineDBManager.insertOfflineBean(bean) App.appOfflineDBManager.insertOfflineBean(bean)

View File

@ -2,14 +2,19 @@ package melody.offline.music.activity
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.os.Message import android.os.Message
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.annotation.OptIn import androidx.annotation.OptIn
import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException import androidx.media3.common.PlaybackException
@ -46,6 +51,7 @@ import org.json.JSONObject
import melody.offline.music.App import melody.offline.music.App
import melody.offline.music.ads.AdPlacement import melody.offline.music.ads.AdPlacement
import melody.offline.music.ads.LolAdWrapper import melody.offline.music.ads.LolAdWrapper
import melody.offline.music.bean.PlaylistItem
import melody.offline.music.util.AnalysisUtil import melody.offline.music.util.AnalysisUtil
@OptIn(UnstableApi::class) @OptIn(UnstableApi::class)
@ -57,6 +63,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
data object OnFavorites : Request() data object OnFavorites : Request()
data class OnDownload(val mediaItem: MediaItem) : Request() data class OnDownload(val mediaItem: MediaItem) : Request()
data class UpdateFavorite(val id: String) : Request() data class UpdateFavorite(val id: String) : Request()
data class UpdateDownloadUi(val id: String) : Request()
data class OnDownloadRemove(val mediaItem: MediaItem) : Request()
} }
@ -265,6 +273,33 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
} }
is Request.OnDownload -> { is Request.OnDownload -> {
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))
LogD(TAG,"Request.OnDownload 33333")
}else{
val downloadRequest = DownloadRequest.Builder(contentId, contentId.toUri())
.setCustomCacheKey(contentId).build()
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( LolAdWrapper.shared.showAdTiming(
this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD
) )
@ -272,7 +307,7 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
insertOfflineData(it.mediaItem) insertOfflineData(it.mediaItem)
val jsonObject = JSONObject() val jsonObject = JSONObject()
jsonObject.put( jsonObject.put(
"download_id", "${it.mediaItem.mediaId}" "download_id", it.mediaItem.mediaId
) )
val songMap = mutableMapOf( val songMap = mutableMapOf(
Pair( Pair(
@ -285,6 +320,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD this@MoPlayDetailsActivity, AdPlacement.INST_DOWNLOAD
) )
} }
}
}
is Request.UpdateFavorite -> { is Request.UpdateFavorite -> {
val currentFavoriteBean = val currentFavoriteBean =
@ -296,6 +333,26 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
updateFavoriteUi(false) 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) { 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.downloadImg.setImageResource(R.drawable.download_done_icon)
binding.downloadBtn.isClickable = false binding.downloadImg.visibility = View.VISIBLE
binding.downloadBtn.isEnabled = false
} else { } else {
binding.downloadLoading.visibility = View.GONE binding.downloadLoading.visibility = View.GONE
binding.downloadImg.setImageResource(R.drawable.download_icon) binding.downloadImg.setImageResource(R.drawable.download_icon)
binding.downloadImg.visibility = View.VISIBLE binding.downloadImg.visibility = View.VISIBLE
binding.downloadBtn.isClickable = true
binding.downloadBtn.isEnabled = true
} }
} }
@ -571,29 +630,10 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
binding.downloadBtn.setOnClickListener { binding.downloadBtn.setOnClickListener {
if (meController != null && meController.currentMediaItem != null) { if (meController != null && meController.currentMediaItem != null) {
val currentMediaItem = meController.currentMediaItem 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!!))
} }
} }
} }
}
private fun updatePlayModeUi() { private fun updatePlayModeUi() {
binding.modePlayImg.setImageResource( binding.modePlayImg.setImageResource(
@ -897,4 +937,22 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
private fun showAD() { private fun showAD() {
LolAdWrapper.shared.showAdTiming(this, AdPlacement.INST_INTO_PLAY) 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.visibility = View.VISIBLE
name.text = bean.name name.text = bean.name
} }
if (bean.size?.isNotEmpty() == true) {
size.text = bean.size
}
if (bean.isOffline) { if (bean.isOffline) {
size.visibility = View.VISIBLE size.visibility = View.VISIBLE
downloadCoImg.visibility = View.VISIBLE downloadCoImg.visibility = View.VISIBLE
@ -82,6 +79,12 @@ class PlaylistSongsAdapter(
downloadImg.setImageResource(R.drawable.download_icon) downloadImg.setImageResource(R.drawable.download_icon)
size.visibility = View.GONE size.visibility = View.GONE
} }
if (bean.size?.isNotEmpty() == true) {
size.text = bean.size
size.visibility = View.VISIBLE
} else {
size.visibility = View.GONE
}
} }
} }
} }