package org.fossify.musicplayer.fragments import android.content.Context import android.content.Intent import android.util.AttributeSet import com.google.gson.Gson import org.fossify.commons.activities.BaseSimpleActivity import org.fossify.commons.extensions.areSystemAnimationsEnabled import org.fossify.commons.extensions.beGoneIf import org.fossify.commons.extensions.beVisibleIf import org.fossify.commons.extensions.hideKeyboard import org.fossify.commons.extensions.normalizeString import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.musicplayer.R import org.fossify.musicplayer.activities.AlbumsActivity import org.fossify.musicplayer.activities.SimpleActivity import org.fossify.musicplayer.adapters.ArtistsAdapter import org.fossify.musicplayer.databinding.FragmentArtistsBinding import org.fossify.musicplayer.dialogs.ChangeSortingDialog import org.fossify.musicplayer.extensions.audioHelper import org.fossify.musicplayer.extensions.config import org.fossify.musicplayer.extensions.mediaScanner import org.fossify.musicplayer.extensions.viewBinding import org.fossify.musicplayer.helpers.ARTIST import org.fossify.musicplayer.helpers.TAB_ARTISTS import org.fossify.musicplayer.models.Artist import org.fossify.musicplayer.models.sortSafely // Artists -> Albums -> Tracks class ArtistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { private var artists = ArrayList() private val binding by viewBinding(FragmentArtistsBinding::bind) override fun setupFragment(activity: BaseSimpleActivity) { ensureBackgroundThread { val cachedArtists = activity.audioHelper.getAllArtists() activity.runOnUiThread { gotArtists(activity, cachedArtists) } } } private fun gotArtists(activity: BaseSimpleActivity, cachedArtists: ArrayList) { artists = cachedArtists activity.runOnUiThread { val scanning = activity.mediaScanner.isScanning() binding.artistsPlaceholder.text = if (scanning) { context.getString(R.string.loading_files) } else { context.getString(org.fossify.commons.R.string.no_items_found) } binding.artistsPlaceholder.beVisibleIf(artists.isEmpty()) val adapter = binding.artistsList.adapter if (adapter == null) { ArtistsAdapter(activity, artists, binding.artistsList) { activity.hideKeyboard() Intent(activity, AlbumsActivity::class.java).apply { putExtra(ARTIST, Gson().toJson(it as Artist)) activity.startActivity(this) } }.apply { binding.artistsList.adapter = this } if (context.areSystemAnimationsEnabled) { binding.artistsList.scheduleLayoutAnimation() } } else { val oldItems = (adapter as ArtistsAdapter).items if (oldItems.sortedBy { it.id }.hashCode() != artists.sortedBy { it.id }.hashCode()) { adapter.updateItems(artists) } } } } override fun finishActMode() { getAdapter()?.finishActMode() } override fun onSearchQueryChanged(text: String) { val normalizedText = text.normalizeString() val filtered = artists.filter { it.title.normalizeString().contains(normalizedText, true) }.toMutableList() as ArrayList getAdapter()?.updateItems(filtered, text) binding.artistsPlaceholder.beVisibleIf(filtered.isEmpty()) } override fun onSearchClosed() { getAdapter()?.updateItems(artists) binding.artistsPlaceholder.beGoneIf(artists.isNotEmpty()) } override fun onSortOpen(activity: SimpleActivity) { ChangeSortingDialog(activity, TAB_ARTISTS) { val adapter = getAdapter() ?: return@ChangeSortingDialog artists.sortSafely(activity.config.artistSorting) adapter.updateItems(artists, forceUpdate = true) } } override fun setupColors(textColor: Int, adjustedPrimaryColor: Int) { binding.artistsPlaceholder.setTextColor(textColor) binding.artistsFastscroller.updateColors(adjustedPrimaryColor) getAdapter()?.updateColors(textColor) } private fun getAdapter() = binding.artistsList.adapter as? ArtistsAdapter }