125 lines
4.8 KiB
Kotlin
125 lines
4.8 KiB
Kotlin
/*
|
|
* Copyright (c) 2020 Hemanth Savarla.
|
|
*
|
|
* Licensed under the GNU General Public License v3
|
|
*
|
|
* This is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
*/
|
|
package code.name.monkey.retromusic.fragments.genres
|
|
|
|
import android.os.Bundle
|
|
import android.view.Menu
|
|
import android.view.MenuInflater
|
|
import android.view.MenuItem
|
|
import android.view.View
|
|
import androidx.core.view.ViewCompat
|
|
import androidx.core.view.doOnPreDraw
|
|
import androidx.navigation.fragment.navArgs
|
|
import androidx.recyclerview.widget.DefaultItemAnimator
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
import code.name.monkey.retromusic.R
|
|
import code.name.monkey.retromusic.adapter.song.SongAdapter
|
|
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
|
|
import code.name.monkey.retromusic.extensions.dipToPix
|
|
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
|
|
import code.name.monkey.retromusic.helper.menu.GenreMenuHelper
|
|
import code.name.monkey.retromusic.model.Genre
|
|
import code.name.monkey.retromusic.model.Song
|
|
import com.google.android.material.shape.MaterialShapeDrawable
|
|
import com.google.android.material.transition.MaterialSharedAxis
|
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
|
import org.koin.core.parameter.parametersOf
|
|
import java.util.*
|
|
|
|
class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail) {
|
|
private val arguments by navArgs<GenreDetailsFragmentArgs>()
|
|
private val detailsViewModel: GenreDetailsViewModel by viewModel {
|
|
parametersOf(arguments.extraGenre)
|
|
}
|
|
private lateinit var genre: Genre
|
|
private lateinit var songAdapter: SongAdapter
|
|
private var _binding: FragmentPlaylistDetailBinding? = null
|
|
private val binding get() = _binding!!
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true).addTarget(view)
|
|
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
|
|
_binding = FragmentPlaylistDetailBinding.bind(view)
|
|
setHasOptionsMenu(true)
|
|
mainActivity.addMusicServiceEventListener(detailsViewModel)
|
|
mainActivity.setSupportActionBar(binding.toolbar)
|
|
ViewCompat.setTransitionName(binding.container, "genre")
|
|
genre = arguments.extraGenre
|
|
binding.toolbar.title = arguments.extraGenre.name
|
|
setupRecyclerView()
|
|
detailsViewModel.getSongs().observe(viewLifecycleOwner, {
|
|
songs(it)
|
|
})
|
|
postponeEnterTransition()
|
|
view.doOnPreDraw {
|
|
startPostponedEnterTransition()
|
|
}
|
|
binding.appBarLayout.statusBarForeground =
|
|
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
|
|
}
|
|
|
|
private fun setupRecyclerView() {
|
|
songAdapter = SongAdapter(requireActivity(), ArrayList(), R.layout.item_list, null)
|
|
binding.recyclerView.apply {
|
|
itemAnimator = DefaultItemAnimator()
|
|
layoutManager = LinearLayoutManager(requireContext())
|
|
adapter = songAdapter
|
|
}
|
|
songAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
|
|
override fun onChanged() {
|
|
super.onChanged()
|
|
checkIsEmpty()
|
|
}
|
|
})
|
|
}
|
|
|
|
fun songs(songs: List<Song>) {
|
|
binding.progressIndicator.hide()
|
|
if (songs.isNotEmpty()) songAdapter.swapDataSet(songs)
|
|
else songAdapter.swapDataSet(emptyList())
|
|
}
|
|
|
|
private fun getEmojiByUnicode(unicode: Int): String {
|
|
return String(Character.toChars(unicode))
|
|
}
|
|
|
|
private fun checkIsEmpty() {
|
|
checkForPadding()
|
|
binding.emptyEmoji.text = getEmojiByUnicode(0x1F631)
|
|
binding.empty.visibility = if (songAdapter.itemCount == 0) View.VISIBLE else View.GONE
|
|
}
|
|
|
|
private fun checkForPadding() {
|
|
val height = dipToPix(52f).toInt()
|
|
binding.recyclerView.setPadding(0, 0, 0, height)
|
|
}
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
|
super.onCreateOptionsMenu(menu, inflater)
|
|
inflater.inflate(R.menu.menu_genre_detail, menu)
|
|
}
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
return GenreMenuHelper.handleMenuClick(requireActivity(), genre, item)
|
|
}
|
|
|
|
override fun onDestroyView() {
|
|
super.onDestroyView()
|
|
_binding = null
|
|
}
|
|
}
|