package melody.offline.music.fragment import android.annotation.SuppressLint import android.app.Dialog import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.Window import android.view.WindowManager import android.view.animation.Animation import android.view.animation.AnimationUtils import android.widget.EditText import android.widget.RelativeLayout import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.google.android.material.bottomsheet.BottomSheetDialog import com.gyf.immersionbar.ktx.immersionBar import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.isActive import kotlinx.coroutines.selects.select import melody.offline.music.App import melody.offline.music.R import melody.offline.music.activity.MoLikedSongsActivity import melody.offline.music.activity.MoOfflineSongsActivity import melody.offline.music.activity.MoPlaylistSongsActivity import melody.offline.music.activity.SettingsActivity import melody.offline.music.adapter.LikedSongsAdapter import melody.offline.music.adapter.NewPlayListAdapter import melody.offline.music.ads.AdPlacement import melody.offline.music.ads.LolAdWrapper import melody.offline.music.bean.FavoriteBean import melody.offline.music.bean.Playlist import melody.offline.music.databinding.FragmentMoMeBinding import melody.offline.music.util.AnalysisUtil class MoMeFragment : MoBaseFragment(), NewPlayListAdapter.OnItemClickListener { private val requests: Channel = Channel(Channel.UNLIMITED) private var adapter: NewPlayListAdapter? = null private var playlist: MutableList = mutableListOf() sealed class Request { data class AddPlaylist(val text: String) : Request() } override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentMoMeBinding get() = FragmentMoMeBinding::inflate override suspend fun onViewCreated() { LolAdWrapper.shared.loadAdIfNotCached(requireActivity(), AdPlacement.INST_ME_PAGE_LIST) initView() initAdapter() onReceive() } private fun initImmersionBar() { immersionBar { statusBarDarkFont(false) statusBarView(binding.view) } } private suspend fun onReceive() { while (isActive) { select { requests.onReceive { when (it) { is Request.AddPlaylist -> { val playlist = App.appPlaylistDBManager.getPlaylistByTitle(it.text) if (playlist != null) { Toast.makeText( requireActivity(), getString(R.string.new_playlist_duplicate_name_hint), Toast.LENGTH_LONG ).show() } else { val newPlaylist = Playlist(title = it.text) App.appPlaylistDBManager.insertOrUpdatePlaylist(newPlaylist) if (bottomSheetDialog != null) { bottomSheetDialog?.dismiss() } getPlaylistData() } } } } events.onReceive { when (it) { Event.FragmentOnResume -> { fragmentOnResume() } } } } } } private fun initView() { binding.settingBtn.setOnClickListener { val intent = Intent(requireActivity(), SettingsActivity::class.java) intent.putExtra(SettingsActivity.FROM_TO_SETTING, MoMeFragment::class.java) startActivity(intent) } binding.likedSongsBtn.setOnClickListener { val count = binding.likedSongsTv.text.toString().trim().toInt() if (count > 0) { val intent = Intent(context, MoLikedSongsActivity::class.java) startActivity(intent) } else { Toast.makeText( activity, getString(R.string.liked_songs_no_data_prompt), Toast.LENGTH_LONG ).show() } } binding.offlineSongsBtn.setOnClickListener { val count = binding.offlineSongsTv.text.toString().trim().toInt() if (count > 0) { val intent = Intent(context, MoOfflineSongsActivity::class.java) startActivity(intent) } else { Toast.makeText( activity, getString(R.string.offline_songs_no_data_prompt), Toast.LENGTH_LONG ).show() } } binding.newPlayListBtn.setOnClickListener { showBottomDialog() } } private suspend fun fragmentOnResume() { //过滤只有size大于0的才计数 val offlineBeans = App.appOfflineDBManager.getAllOfflineBeans() val count = offlineBeans.count { it.bytesDownloaded?.let { bytes -> bytes > 0 } == true } binding.offlineSongsTv.text = "$count" //过滤只有为true的才计数 val favoriteBeans = App.appFavoriteDBManager.getAllFavoriteBeans() val favorites = favoriteBeans.count { it.isFavorite } binding.likedSongsTv.text = "$favorites" getPlaylistData() } override fun onResume() { super.onResume() initImmersionBar() AnalysisUtil.logEvent(AnalysisUtil.ME_B_PV) LolAdWrapper.shared.loadAdShowNativeAd( requireActivity(), AdPlacement.NATIVE_ME_PAGE_LIST, binding.frameAd, R.layout.ad_layout_admob_banner, R.layout.ad_layout_max_banner ) } override fun onHiddenChanged(hidden: Boolean) { super.onHiddenChanged(hidden) if (!hidden) { initImmersionBar() } } private fun initAdapter() { adapter = NewPlayListAdapter(requireActivity(), playlist) adapter?.setOnItemClickListener(this) binding.newPlayListRv.layoutManager = LinearLayoutManager(requireActivity(), LinearLayoutManager.VERTICAL, false) binding.newPlayListRv.adapter = adapter } @SuppressLint("NotifyDataSetChanged") private suspend fun getPlaylistData() { playlist.clear() playlist.addAll(App.appPlaylistDBManager.getAllPlaylists()) adapter?.notifyDataSetChanged() } override fun onItemClick(position: Int) { val intent = Intent(requireActivity(), MoPlaylistSongsActivity::class.java) intent.putExtra(MoPlaylistSongsActivity.PLAYLIST_ID, playlist[position].id) intent.putExtra(MoPlaylistSongsActivity.PLAYLIST_TITLE, playlist[position].title) startActivity(intent) } private var bottomSheetDialog: BottomSheetDialog? = null private fun showBottomDialog() { bottomSheetDialog = BottomSheetDialog(requireActivity()) val view = layoutInflater.inflate(R.layout.new_playlist_layout, null) bottomSheetDialog?.setContentView(view) val edit = view.findViewById(R.id.playlistEt) val confirmBtn = view.findViewById(R.id.confirmBtn) confirmBtn.setOnClickListener { val text = edit.text.toString().trim() if (text.isNotEmpty()) { requests.trySend(Request.AddPlaylist(text)) } } // 设置对话框背景为透明以显示圆角 bottomSheetDialog?.window?.setBackgroundDrawableResource(android.R.color.transparent) bottomSheetDialog?.window?.navigationBarColor = ContextCompat.getColor(requireActivity(), R.color.main_bg_color) bottomSheetDialog?.show() } }