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.SimpleActivity import org.fossify.musicplayer.activities.TracksActivity import org.fossify.musicplayer.adapters.GenresAdapter import org.fossify.musicplayer.databinding.FragmentGenresBinding 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.GENRE import org.fossify.musicplayer.helpers.TAB_GENRES import org.fossify.musicplayer.models.Genre import org.fossify.musicplayer.models.sortSafely class GenresFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { private var genres = ArrayList() private val binding by viewBinding(FragmentGenresBinding::bind) override fun setupFragment(activity: BaseSimpleActivity) { ensureBackgroundThread { val cachedGenres = activity.audioHelper.getAllGenres() activity.runOnUiThread { gotGenres(activity, cachedGenres) } } } private fun gotGenres(activity: BaseSimpleActivity, cachedGenres: ArrayList) { genres = cachedGenres activity.runOnUiThread { val scanning = activity.mediaScanner.isScanning() binding.genresPlaceholder.text = if (scanning) { context.getString(R.string.loading_files) } else { context.getString(org.fossify.commons.R.string.no_items_found) } binding.genresPlaceholder.beVisibleIf(genres.isEmpty()) val adapter = binding.genresList.adapter if (adapter == null) { GenresAdapter(activity, genres, binding.genresList) { activity.hideKeyboard() Intent(activity, TracksActivity::class.java).apply { putExtra(GENRE, Gson().toJson(it as Genre)) activity.startActivity(this) } }.apply { binding.genresList.adapter = this } if (context.areSystemAnimationsEnabled) { binding.genresList.scheduleLayoutAnimation() } } else { val oldItems = (adapter as GenresAdapter).items if (oldItems.sortedBy { it.id }.hashCode() != genres.sortedBy { it.id }.hashCode()) { adapter.updateItems(genres) } } } } override fun finishActMode() { getAdapter()?.finishActMode() } override fun onSearchQueryChanged(text: String) { val normalizedText = text.normalizeString() val filtered = genres.filter { it.title.normalizeString().contains(normalizedText, true) }.toMutableList() as ArrayList getAdapter()?.updateItems(filtered, text) binding.genresPlaceholder.beVisibleIf(filtered.isEmpty()) } override fun onSearchClosed() { getAdapter()?.updateItems(genres) binding.genresPlaceholder.beGoneIf(genres.isNotEmpty()) } override fun onSortOpen(activity: SimpleActivity) { ChangeSortingDialog(activity, TAB_GENRES) { val adapter = getAdapter() ?: return@ChangeSortingDialog genres.sortSafely(activity.config.genreSorting) adapter.updateItems(genres, forceUpdate = true) } } override fun setupColors(textColor: Int, adjustedPrimaryColor: Int) { binding.genresPlaceholder.setTextColor(textColor) binding.genresFastscroller.updateColors(adjustedPrimaryColor) getAdapter()?.updateColors(textColor) } private fun getAdapter() = binding.genresList.adapter as? GenresAdapter }