diff --git a/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt b/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt index 7a445c3..2d1785b 100644 --- a/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt @@ -95,15 +95,17 @@ class LaunchActivity : MoBaseActivity() { // if (!withPermission()) { // if (type == 1) {//如果type等于1,则是从后台进入的应用,不进行跳转直接关闭启动页 // finish() -// return +// } else { +// startActivity(Intent(this, MainActivity::class.java)) +// finish() // } -// startActivity(Intent(this, MainActivity::class.java)) // } else { if (type == 1) { finish() - return + } else { + startActivity(Intent(this, PrimaryActivity::class.java)) + finish() } - startActivity(Intent(this, PrimaryActivity::class.java)) // } } 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 3a3dd67..caa6047 100644 --- a/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt @@ -263,6 +263,18 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope App.appFavoriteDBManager.insertFavoriteBean(bean) } + suspend fun insertFavoriteData(offlineBean: OfflineBean) { + val bean = FavoriteBean( + videoId = offlineBean.videoId, + title = offlineBean.title, + name = offlineBean.name, + thumbnail = offlineBean.thumbnail, + isFavorite = true + ) + LogTag.LogD(TAG, "insertFavoriteBean bean->${bean}") + App.appFavoriteDBManager.insertFavoriteBean(bean) + } + fun withPermission(): Boolean { //先判断当前配置的开关是否为true,为false的话就直接进入A val jsonString = appStore.shouldEnterMusicPageJson//得到配置的json diff --git a/app/src/main/java/melody/offline/music/activity/MoLikedSongsActivity.kt b/app/src/main/java/melody/offline/music/activity/MoLikedSongsActivity.kt index 1ea835b..eaa2b5e 100644 --- a/app/src/main/java/melody/offline/music/activity/MoLikedSongsActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/MoLikedSongsActivity.kt @@ -2,7 +2,12 @@ package melody.offline.music.activity import android.annotation.SuppressLint import android.view.View +import android.view.animation.AnimationUtils +import androidx.annotation.OptIn +import androidx.media3.common.util.UnstableApi +import androidx.media3.exoplayer.offline.Download import androidx.recyclerview.widget.LinearLayoutManager +import com.bumptech.glide.Glide import com.gyf.immersionbar.ktx.immersionBar import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.isActive @@ -13,20 +18,30 @@ import melody.offline.music.adapter.LikedSongsAdapter import melody.offline.music.ads.AdPlacement import melody.offline.music.ads.LolAdWrapper import melody.offline.music.bean.FavoriteBean +import melody.offline.music.bean.OfflineBean import melody.offline.music.databinding.ActivityLikedSongsBinding +import melody.offline.music.service.ViewModelMain +import melody.offline.music.util.AnalysisUtil +import melody.offline.music.util.DownloadUtil +import melody.offline.music.util.LogTag +import org.json.JSONObject -class MoLikedSongsActivity : MoBaseActivity(), LikedSongsAdapter.OnItemFavoritesClickListener { +@OptIn(UnstableApi::class) +class MoLikedSongsActivity : MoBaseActivity(), LikedSongsAdapter.OnItemFavoritesClickListener, + LikedSongsAdapter.OnMoreClickListener { private val requests: Channel = Channel(Channel.UNLIMITED) sealed class Request { data object TryAgain : Request() data class UpdateFavorite(val bean: FavoriteBean) : Request() + data class OnFavorites(val bean: FavoriteBean) : Request() } private lateinit var binding: ActivityLikedSongsBinding private var adapter: LikedSongsAdapter? = null private var favoriteBeans: MutableList = mutableListOf() + private var currentPosition = -1 override suspend fun main() { binding = ActivityLikedSongsBinding.inflate(layoutInflater) @@ -58,9 +73,21 @@ class MoLikedSongsActivity : MoBaseActivity(), LikedSongsAdapter.OnItemFavorites } is Request.UpdateFavorite -> { + val currentFavoriteBean = + App.appFavoriteDBManager.getFavoriteBeanByID(it.bean.videoId) + if (currentFavoriteBean != null) { + updateFavoriteUi(currentFavoriteBean.isFavorite) + } else { + updateFavoriteUi(false) + } + } + + is Request.OnFavorites -> { it.bean.isFavorite = !it.bean.isFavorite adapter?.notifyDataSetChanged() + updateFavoriteUi(it.bean.isFavorite) + val currentFavoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(it.bean.videoId) if (currentFavoriteBean != null) { @@ -106,24 +133,165 @@ class MoLikedSongsActivity : MoBaseActivity(), LikedSongsAdapter.OnItemFavorites } private fun initView() { + binding.layoutInfo.setOnClickListener { } binding.backBtn.setOnClickListener { finish() } binding.tryAgainBtn.setOnClickListener { requests.trySend(Request.TryAgain) } + binding.bottomCloseBtn.setOnClickListener { + hideBottomLayout() + } + binding.bottomBlankLayout.setOnClickListener { + hideBottomLayout() + } + binding.favoritesBtn.setOnClickListener { + if (currentPosition >= 0) { + requests.trySend(Request.OnFavorites(favoriteBeans[currentPosition])) + } + } + binding.moreDownloadBtn.setOnClickListener { + + } } private fun initAdapter() { adapter = LikedSongsAdapter(this, favoriteBeans) adapter?.setOnFavoritesItemClickListener(this) - binding.rv.layoutManager = - LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + adapter?.setOnMoreClickListener(this) + binding.rv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) binding.rv.adapter = adapter } override fun onFavoritesItemClick(position: Int) { - requests.trySend(Request.UpdateFavorite(favoriteBeans[position])) + requests.trySend(Request.OnFavorites(favoriteBeans[position])) + } + + override fun onMoreClick(position: Int) { + currentPosition = position + toggleBottomLayout(position) + } + + private fun initDownloadFlow() { + ViewModelMain.modelDownloadsFlow.observe(this) { downloads -> + if (meController != null && meController.currentMediaItem != null) { + val id = meController.currentMediaItem?.mediaId + val currentScreenDownloads = downloads[id] + if (currentScreenDownloads != null) { + updateDownloadUI(currentScreenDownloads) + } + } + } + } + + private fun updateDownloadUI(download: Download) { + when (download.state) { + Download.STATE_DOWNLOADING -> { + binding.downloadLoading.visibility = View.VISIBLE + binding.downloadImg.setImageResource(R.drawable.more_download_icon) + binding.downloadImg.visibility = View.GONE + + binding.downloadTv.text = getString(R.string.download_saving) + + binding.moreDownloadBtn.isClickable = false + binding.moreDownloadBtn.isEnabled = false + } + + Download.STATE_COMPLETED -> { + binding.downloadLoading.visibility = View.GONE + binding.downloadImg.setImageResource(R.drawable.more_downloaded_icon) + binding.downloadImg.visibility = View.VISIBLE + + binding.downloadTv.text = getString(R.string.download_remove_offline) + + val jsonObject = JSONObject() + jsonObject.put( + "download_id", download.request.id + ) + val songMap = mutableMapOf( + Pair( + AnalysisUtil.PARAM_VALUE, jsonObject.toString() + ) + ) + AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_DOWNLOAD_SUCCESS_ACTION, songMap) + } + + Download.STATE_FAILED -> { + binding.downloadLoading.visibility = View.GONE + binding.downloadImg.setImageResource(R.drawable.error) + binding.downloadImg.visibility = View.VISIBLE + + binding.downloadTv.text = getString(R.string.download_save_offline) + + binding.moreDownloadBtn.isClickable = true + binding.moreDownloadBtn.isEnabled = true + } + + else -> { + binding.downloadLoading.visibility = View.GONE + binding.downloadImg.setImageResource(R.drawable.download_icon) + binding.downloadImg.visibility = View.VISIBLE + + binding.downloadTv.text = getString(R.string.download_save_offline) + + binding.moreDownloadBtn.isClickable = true + binding.moreDownloadBtn.isEnabled = true + } + } + } + + private fun updateFavoriteUi(b: Boolean) { + if (b) { + binding.favoritesImg.setImageResource(R.drawable.favorited_icon) + } else { + binding.favoritesImg.setImageResource(R.drawable.not_favorited_icon) + } + } + + private fun toggleBottomLayout(position: Int) { + if (binding.bottomLayout.visibility == View.VISIBLE) { + hideBottomLayout() + } else { + showBottomLayout(position) + } + } + + private fun showBottomLayout(position: Int) { + val slideUpAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_up) + binding.bottomLayout.startAnimation(slideUpAnimation) + binding.bottomLayout.visibility = View.VISIBLE + + val bean = favoriteBeans[position] + Glide.with(this).load(bean.thumbnail).into(binding.songImg) + binding.title.text = bean.title + if (bean.name.isEmpty()) { + binding.name.visibility = View.GONE + } else { + binding.name.visibility = View.VISIBLE + binding.name.text = bean.name + } + requests.trySend(Request.UpdateFavorite(bean)) + + if (DownloadUtil.downloadResourceExist(bean.videoId)) {//已经下载,按钮不可点击 + binding.downloadImg.setImageResource(R.drawable.more_downloaded_icon) + binding.moreDownloadBtn.isClickable = false + binding.moreDownloadBtn.isEnabled = false + binding.downloadTv.text = getString(R.string.download_remove_offline) + } else { + binding.downloadLoading.visibility = View.GONE + binding.downloadImg.setImageResource(R.drawable.more_download_icon) + binding.downloadImg.visibility = View.VISIBLE + binding.moreDownloadBtn.isClickable = true + binding.moreDownloadBtn.isEnabled = true + binding.downloadTv.text = getString(R.string.download_save_offline) + } + } + + private fun hideBottomLayout() { + val slideDownAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_down) + binding.bottomLayout.startAnimation(slideDownAnimation) + binding.bottomLayout.visibility = View.GONE } @SuppressLint("NotifyDataSetChanged") @@ -157,5 +325,4 @@ class MoLikedSongsActivity : MoBaseActivity(), LikedSongsAdapter.OnItemFavorites binding.loadingLayout.visibility = View.GONE binding.noContentLayout.visibility = View.VISIBLE } - } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/activity/MoOfflineSongsActivity.kt b/app/src/main/java/melody/offline/music/activity/MoOfflineSongsActivity.kt index 189fa96..b8def9b 100644 --- a/app/src/main/java/melody/offline/music/activity/MoOfflineSongsActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/MoOfflineSongsActivity.kt @@ -1,9 +1,18 @@ package melody.offline.music.activity import android.annotation.SuppressLint +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.LayoutInflater import android.view.View -import androidx.media3.common.MediaItem +import android.view.animation.AnimationUtils +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.annotation.OptIn +import androidx.appcompat.app.AlertDialog +import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.LinearLayoutManager +import com.bumptech.glide.Glide import com.gyf.immersionbar.ktx.immersionBar import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.isActive @@ -16,16 +25,18 @@ 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.DownloadUtil import melody.offline.music.util.LogTag import org.json.JSONObject +@OptIn(UnstableApi::class) class MoOfflineSongsActivity : MoBaseActivity() { private val requests: Channel = Channel(Channel.UNLIMITED) sealed class Request { data object TryAgain : Request() - data object OnFavorites : Request() - data class OnDownload(val mediaItem: MediaItem) : Request() + data class OnFavorites(val bean: OfflineBean) : Request() + data class OnDownloadRemove(val id: String) : Request() data class UpdateFavorite(val id: String) : Request() } @@ -33,6 +44,8 @@ class MoOfflineSongsActivity : MoBaseActivity() { private var adapter: OfflineSongsAdapter? = null private var offlineList: MutableList = mutableListOf() + private var currentPosition = -1 + override suspend fun main() { binding = ActivityOfflineSongsBinding.inflate(layoutInflater) setContentView(binding.root) @@ -62,47 +75,62 @@ class MoOfflineSongsActivity : MoBaseActivity() { initData() } - is Request.OnDownload -> { - + is Request.OnFavorites -> { + val jsonObject = JSONObject() + jsonObject.put( + "song_title", it.bean.title + ) + val songMap = mutableMapOf( + Pair( + AnalysisUtil.PARAM_VALUE, jsonObject.toString() + ) + ) + val currentFavoriteBean = + App.appFavoriteDBManager.getFavoriteBeanByID(it.bean.videoId) + 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(it.bean) + AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_LOVE_CLICK, songMap) + } + requests.trySend(Request.UpdateFavorite(it.bean.videoId)) } - 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.OnDownloadRemove -> { + val currentOfflineBean = + App.appOfflineDBManager.getOfflineBeanByID(it.id) + if (currentOfflineBean != null) { + App.appOfflineDBManager.deleteOfflineBean(currentOfflineBean) } + if (currentPosition >= 0) { + offlineList.remove(offlineList[currentPosition]) + } + adapter?.notifyDataSetChanged() + + hideBottomLayout() } is Request.UpdateFavorite -> { - + val currentFavoriteBean = + App.appFavoriteDBManager.getFavoriteBeanByID(it.id) + if (currentFavoriteBean != null) { + updateFavoriteUi(currentFavoriteBean.isFavorite) + } else { + updateFavoriteUi(false) + } } + + } } events.onReceive { @@ -142,19 +170,41 @@ class MoOfflineSongsActivity : MoBaseActivity() { } private fun initView() { + binding.layoutInfo.setOnClickListener { } binding.backBtn.setOnClickListener { finish() } binding.tryAgainBtn.setOnClickListener { requests.trySend(Request.TryAgain) } + binding.bottomCloseBtn.setOnClickListener { + hideBottomLayout() + } + binding.bottomBlankLayout.setOnClickListener { + hideBottomLayout() + } + binding.moreDownloadBtn.setOnClickListener { + if (currentPosition >= 0) { + val videoId = offlineList[currentPosition].videoId + showRemoveDownloadDialogHint(videoId) + } + } + binding.moreAddPlaylistBtn.setOnClickListener { + + } + binding.favoritesBtn.setOnClickListener { + if (currentPosition >= 0) { + requests.trySend(Request.OnFavorites(offlineList[currentPosition])) + } + } } private fun initAdapter() { adapter = OfflineSongsAdapter(this, offlineList) - adapter?.setOnFavoriteClickListener(object : OfflineSongsAdapter.OnFavoriteClickListener { - override fun onFavoriteClick(position: Int) { - requests.trySend(Request.OnFavorites) + adapter?.setOnMoreClickListener(object : OfflineSongsAdapter.OnMoreClickListener { + override fun onMoreClick(position: Int) { + currentPosition = position + toggleBottomLayout(position) } }) binding.rv.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) @@ -170,12 +220,15 @@ class MoOfflineSongsActivity : MoBaseActivity() { // 更新 offlineBeans.forEach { offlineBean -> val favoriteBean = App.appFavoriteDBManager.getFavoriteBeanByID(offlineBean.videoId) - if (offlineBean.id == favoriteBean?.id) { - offlineBean.isFavorite = favoriteBean.isFavorite - App.appOfflineDBManager.updateOfflineBean(offlineBean) + if (favoriteBean != null) { + if (offlineBean.id == favoriteBean.id) { + offlineBean.isFavorite = favoriteBean.isFavorite + App.appOfflineDBManager.updateOfflineBean(offlineBean) + } } } - val filteredBeans = offlineBeans.filter { it.bytesDownloaded?.let { bytes -> bytes > 0 } == true } + val filteredBeans = + offlineBeans.filter { it.bytesDownloaded?.let { bytes -> bytes > 0 } == true } offlineList.addAll(filteredBeans) if (offlineList.size > 0) { showDataUi() @@ -188,6 +241,64 @@ class MoOfflineSongsActivity : MoBaseActivity() { } + private fun showRemoveDownloadDialogHint(id: String) { + LogTag.LogD(TAG, "showRemoveDownloadDialogHint") + 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(id)) + } + cancelBtn.setOnClickListener { + dialog.dismiss() + } + } + + private fun updateFavoriteUi(b: Boolean) { + if (b) { + binding.favoritesImg.setImageResource(R.drawable.favorited_icon) + } else { + binding.favoritesImg.setImageResource(R.drawable.not_favorited_icon) + } + } + + private fun toggleBottomLayout(position: Int) { + if (binding.bottomLayout.visibility == View.VISIBLE) { + hideBottomLayout() + } else { + showBottomLayout(position) + } + } + + private fun showBottomLayout(position: Int) { + val slideUpAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_up) + binding.bottomLayout.startAnimation(slideUpAnimation) + binding.bottomLayout.visibility = View.VISIBLE + + val bean = offlineList[position] + Glide.with(this).load(bean.thumbnail).into(binding.songImg) + binding.title.text = bean.title + if (bean.name.isEmpty()) { + binding.name.visibility = View.GONE + } else { + binding.name.visibility = View.VISIBLE + binding.name.text = bean.name + } + requests.trySend(Request.UpdateFavorite(bean.videoId)) + } + + private fun hideBottomLayout() { + val slideDownAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_down) + binding.bottomLayout.startAnimation(slideDownAnimation) + binding.bottomLayout.visibility = View.GONE + } + private fun showDataUi() { binding.loadingLayout.visibility = View.GONE binding.noContentLayout.visibility = View.GONE diff --git a/app/src/main/java/melody/offline/music/adapter/LikedSongsAdapter.kt b/app/src/main/java/melody/offline/music/adapter/LikedSongsAdapter.kt index 55d47d0..0d1d61b 100644 --- a/app/src/main/java/melody/offline/music/adapter/LikedSongsAdapter.kt +++ b/app/src/main/java/melody/offline/music/adapter/LikedSongsAdapter.kt @@ -46,6 +46,11 @@ class LikedSongsAdapter( itemFavoritesClickListener?.onFavoritesItemClick(position) } } + holder.binding.moreBtn.setOnClickListener { + if (moreClickListener != null) { + moreClickListener?.onMoreClick(position) + } + } } override fun getItemCount(): Int = list.size @@ -107,4 +112,14 @@ class LikedSongsAdapter( interface OnItemFavoritesClickListener { fun onFavoritesItemClick(position: Int) } + + private var moreClickListener: OnMoreClickListener? = null + + fun setOnMoreClickListener(listener: OnMoreClickListener) { + moreClickListener = listener + } + + interface OnMoreClickListener { + fun onMoreClick(position: Int) + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/adapter/OfflineSongsAdapter.kt b/app/src/main/java/melody/offline/music/adapter/OfflineSongsAdapter.kt index abcdf22..91918d9 100644 --- a/app/src/main/java/melody/offline/music/adapter/OfflineSongsAdapter.kt +++ b/app/src/main/java/melody/offline/music/adapter/OfflineSongsAdapter.kt @@ -18,8 +18,7 @@ import melody.offline.music.media.MediaControllerManager class OfflineSongsAdapter( private val context: Context, private val list: List, -) : - RecyclerView.Adapter() { +) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val binding = OfflineListItemBinding.inflate(LayoutInflater.from(context), parent, false) @@ -30,19 +29,19 @@ class OfflineSongsAdapter( val bean = list[position] holder.bind(bean) - holder.binding.favoritedBtn.setOnClickListener { - if (favoriteClickListener != null) { - favoriteClickListener?.onFavoriteClick(position) + holder.binding.moreBtn.setOnClickListener { + if (moreClickListener != null) { + moreClickListener?.onMoreClick(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 + MoPlayDetailsActivity.PLAY_DETAILS_COME_FROM, MoOfflineSongsActivity::class.java ) context.startActivity(intent) @@ -58,9 +57,7 @@ class OfflineSongsAdapter( fun bind(bean: OfflineBean) { binding.apply { - Glide.with(context) - .load(bean.thumbnail) - .into(image) + Glide.with(context).load(bean.thumbnail).into(image) title.text = bean.title if (bean.name.isEmpty()) { name.visibility = View.GONE @@ -84,12 +81,6 @@ 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) - } } } } @@ -104,13 +95,13 @@ class OfflineSongsAdapter( fun onItemClick(position: Int) } - private var favoriteClickListener: OnFavoriteClickListener? = null + private var moreClickListener: OnMoreClickListener? = null - fun setOnFavoriteClickListener(listener: OnFavoriteClickListener) { - favoriteClickListener = listener + fun setOnMoreClickListener(listener: OnMoreClickListener) { + moreClickListener = listener } - interface OnFavoriteClickListener { - fun onFavoriteClick(position: Int) + interface OnMoreClickListener { + fun onMoreClick(position: Int) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/more_add_playlist_icon.xml b/app/src/main/res/drawable/more_add_playlist_icon.xml new file mode 100644 index 0000000..f986226 --- /dev/null +++ b/app/src/main/res/drawable/more_add_playlist_icon.xml @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/more_download_icon.xml b/app/src/main/res/drawable/more_download_icon.xml new file mode 100644 index 0000000..3bd2729 --- /dev/null +++ b/app/src/main/res/drawable/more_download_icon.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/more_downloaded_icon.xml b/app/src/main/res/drawable/more_downloaded_icon.xml new file mode 100644 index 0000000..184ce03 --- /dev/null +++ b/app/src/main/res/drawable/more_downloaded_icon.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/layout/activity_liked_songs.xml b/app/src/main/res/layout/activity_liked_songs.xml index 7a5b372..c1bcb16 100644 --- a/app/src/main/res/layout/activity_liked_songs.xml +++ b/app/src/main/res/layout/activity_liked_songs.xml @@ -1,4 +1,5 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_offline_songs.xml b/app/src/main/res/layout/activity_offline_songs.xml index 94b8ef8..0563b5e 100644 --- a/app/src/main/res/layout/activity_offline_songs.xml +++ b/app/src/main/res/layout/activity_offline_songs.xml @@ -147,10 +147,201 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" /> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_hint.xml b/app/src/main/res/layout/dialog_hint.xml new file mode 100644 index 0000000..25ef4d7 --- /dev/null +++ b/app/src/main/res/layout/dialog_hint.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/liked_list_item.xml b/app/src/main/res/layout/liked_list_item.xml index 46f47b5..f00f95b 100644 --- a/app/src/main/res/layout/liked_list_item.xml +++ b/app/src/main/res/layout/liked_list_item.xml @@ -112,6 +112,20 @@ android:layout_height="24dp" android:src="@drawable/not_favorited_icon" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/offline_list_item.xml b/app/src/main/res/layout/offline_list_item.xml index b396f1d..8c170f7 100644 --- a/app/src/main/res/layout/offline_list_item.xml +++ b/app/src/main/res/layout/offline_list_item.xml @@ -117,24 +117,10 @@ android:gravity="center_vertical" android:orientation="horizontal"> - - - - - - #00000000 #3A3D3B #993A3D3B + #FF444444 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 36d134e..a744d3f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,4 +40,9 @@ Prompt PLAY There are additional download tasks in progress, please wait a moment. + Add to playlist + Saving + Save to Offline + Remove from offline + Are you sure you want to delete this downloaded music file? \ No newline at end of file