/* * 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() 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) { 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 } }