diff --git a/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt b/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt index cb15a57..4ff731a 100644 --- a/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt @@ -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) diff --git a/app/src/main/java/melody/offline/music/activity/MoPlayDetailsActivity.kt b/app/src/main/java/melody/offline/music/activity/MoPlayDetailsActivity.kt index bcb56a3..7049e71 100644 --- a/app/src/main/java/melody/offline/music/activity/MoPlayDetailsActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/MoPlayDetailsActivity.kt @@ -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(R.id.dialog_ok_btn) + val cancelBtn = dialogView.findViewById(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() + } + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/adapter/PlaylistSongsAdapter.kt b/app/src/main/java/melody/offline/music/adapter/PlaylistSongsAdapter.kt index 6bdc264..9d1780c 100644 --- a/app/src/main/java/melody/offline/music/adapter/PlaylistSongsAdapter.kt +++ b/app/src/main/java/melody/offline/music/adapter/PlaylistSongsAdapter.kt @@ -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 + } } } }