package code.name.monkey.retromusic.fragments.albums import android.os.Bundle import android.view.* import androidx.core.os.bundleOf import androidx.lifecycle.Observer import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.recyclerview.widget.GridLayoutManager import code.name.monkey.retromusic.EXTRA_ALBUM_ID import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.album.AlbumAdapter import code.name.monkey.retromusic.extensions.findActivityNavController import code.name.monkey.retromusic.fragments.ReloadType import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment import code.name.monkey.retromusic.helper.SortOrder import code.name.monkey.retromusic.helper.SortOrder.AlbumSortOrder import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(), AlbumClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) libraryViewModel.getAlbums().observe(viewLifecycleOwner, Observer { if (it.isNotEmpty()) adapter?.swapDataSet(it) else adapter?.swapDataSet(listOf()) }) } override val emptyMessage: Int get() = R.string.no_albums override fun createLayoutManager(): GridLayoutManager { return GridLayoutManager(requireActivity(), getGridSize()) } override fun createAdapter(): AlbumAdapter { val dataSet = if (adapter == null) ArrayList() else adapter!!.dataSet return AlbumAdapter( requireActivity(), dataSet, R.layout.item_grid, null, this ) } override fun setGridSize(gridSize: Int) { layoutManager?.spanCount = gridSize adapter?.notifyDataSetChanged() } override fun loadSortOrder(): String { return PreferenceUtil.albumSortOrder } override fun saveSortOrder(sortOrder: String) { PreferenceUtil.albumSortOrder = sortOrder } override fun loadGridSize(): Int { return PreferenceUtil.albumGridSize } override fun saveGridSize(gridColumns: Int) { PreferenceUtil.albumGridSize = gridColumns } override fun loadGridSizeLand(): Int { return PreferenceUtil.albumGridSizeLand } override fun saveGridSizeLand(gridColumns: Int) { PreferenceUtil.albumGridSizeLand = gridColumns } override fun setSortOrder(sortOrder: String) { libraryViewModel.forceReload(ReloadType.Albums) } override fun loadLayoutRes(): Int { return PreferenceUtil.albumGridStyle } override fun saveLayoutRes(layoutRes: Int) { PreferenceUtil.albumGridStyle = layoutRes } companion object { fun newInstance(): AlbumsFragment { return AlbumsFragment() } } override fun onAlbumClick(albumId: Int, view: View) { findActivityNavController(R.id.fragment_container).navigate( R.id.albumDetailsFragment, bundleOf(EXTRA_ALBUM_ID to albumId), null, FragmentNavigatorExtras( view to getString(R.string.transition_album_art) ) ) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { val gridSizeItem: MenuItem = menu.findItem(R.id.action_grid_size) if (RetroUtil.isLandscape()) { gridSizeItem.setTitle(R.string.action_grid_size_land) } setUpGridSizeMenu(gridSizeItem.subMenu) val layoutItem = menu.findItem(R.id.action_layout_type) setupLayoutMenu(layoutItem.subMenu) setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu) super.onCreateOptionsMenu(menu, inflater) } private fun setUpSortOrderMenu( sortOrderMenu: SubMenu ) { val currentSortOrder: String? = getSortOrder() sortOrderMenu.clear() sortOrderMenu.add( 0, R.id.action_album_sort_order_asc, 0, R.string.sort_order_a_z ).isChecked = currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_A_Z) sortOrderMenu.add( 0, R.id.action_album_sort_order_desc, 1, R.string.sort_order_z_a ).isChecked = currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_Z_A) sortOrderMenu.add( 0, R.id.action_album_sort_order_artist, 2, R.string.sort_order_artist ).isChecked = currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_ARTIST) sortOrderMenu.add( 0, R.id.action_album_sort_order_year, 3, R.string.sort_order_year ).isChecked = currentSortOrder.equals(SortOrder.AlbumSortOrder.ALBUM_YEAR) sortOrderMenu.setGroupCheckable(0, true, true) } private fun setupLayoutMenu( subMenu: SubMenu ) { when (itemLayoutRes()) { R.layout.item_card -> subMenu.findItem(R.id.action_layout_card).isChecked = true R.layout.item_grid -> subMenu.findItem(R.id.action_layout_normal).isChecked = true R.layout.item_card_color -> subMenu.findItem(R.id.action_layout_colored_card).isChecked = true R.layout.item_grid_circle -> subMenu.findItem(R.id.action_layout_circular).isChecked = true R.layout.image -> subMenu.findItem(R.id.action_layout_image).isChecked = true R.layout.item_image_gradient -> subMenu.findItem(R.id.action_layout_gradient_image).isChecked = true } } private fun setUpGridSizeMenu( gridSizeMenu: SubMenu ) { when (getGridSize()) { 1 -> gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = true 2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true 3 -> gridSizeMenu.findItem(R.id.action_grid_size_3).isChecked = true 4 -> gridSizeMenu.findItem(R.id.action_grid_size_4).isChecked = true 5 -> gridSizeMenu.findItem(R.id.action_grid_size_5).isChecked = true 6 -> gridSizeMenu.findItem(R.id.action_grid_size_6).isChecked = true 7 -> gridSizeMenu.findItem(R.id.action_grid_size_7).isChecked = true 8 -> gridSizeMenu.findItem(R.id.action_grid_size_8).isChecked = true } val gridSize: Int = maxGridSize if (gridSize < 8) { gridSizeMenu.findItem(R.id.action_grid_size_8).isVisible = false } if (gridSize < 7) { gridSizeMenu.findItem(R.id.action_grid_size_7).isVisible = false } if (gridSize < 6) { gridSizeMenu.findItem(R.id.action_grid_size_6).isVisible = false } if (gridSize < 5) { gridSizeMenu.findItem(R.id.action_grid_size_5).isVisible = false } if (gridSize < 4) { gridSizeMenu.findItem(R.id.action_grid_size_4).isVisible = false } if (gridSize < 3) { gridSizeMenu.findItem(R.id.action_grid_size_3).isVisible = false } } override fun onOptionsItemSelected(item: MenuItem): Boolean { if (handleGridSizeMenuItem(item)) { return true } if (handleLayoutResType(item)) { return true } if (handleSortOrderMenuItem(item)) { return true } return super.onOptionsItemSelected(item) } private fun handleSortOrderMenuItem( item: MenuItem ): Boolean { var sortOrder: String? = null when (item.itemId) { R.id.action_album_sort_order_asc -> sortOrder = AlbumSortOrder.ALBUM_A_Z R.id.action_album_sort_order_desc -> sortOrder = AlbumSortOrder.ALBUM_Z_A R.id.action_album_sort_order_artist -> sortOrder = AlbumSortOrder.ALBUM_ARTIST R.id.action_album_sort_order_year -> sortOrder = AlbumSortOrder.ALBUM_YEAR } if (sortOrder != null) { item.isChecked = true setAndSaveSortOrder(sortOrder) return true } return false } private fun handleLayoutResType( item: MenuItem ): Boolean { var layoutRes = -1 when (item.itemId) { R.id.action_layout_normal -> layoutRes = R.layout.item_grid R.id.action_layout_card -> layoutRes = R.layout.item_card R.id.action_layout_colored_card -> layoutRes = R.layout.item_card_color R.id.action_layout_circular -> layoutRes = R.layout.item_grid_circle R.id.action_layout_image -> layoutRes = R.layout.image R.id.action_layout_gradient_image -> layoutRes = R.layout.item_image_gradient } if (layoutRes != -1) { item.isChecked = true setAndSaveLayoutRes(layoutRes) return true } return false } private fun handleGridSizeMenuItem( item: MenuItem ): Boolean { var gridSize = 0 when (item.itemId) { R.id.action_grid_size_1 -> gridSize = 1 R.id.action_grid_size_2 -> gridSize = 2 R.id.action_grid_size_3 -> gridSize = 3 R.id.action_grid_size_4 -> gridSize = 4 R.id.action_grid_size_5 -> gridSize = 5 R.id.action_grid_size_6 -> gridSize = 6 R.id.action_grid_size_7 -> gridSize = 7 R.id.action_grid_size_8 -> gridSize = 8 } if (gridSize > 0) { item.isChecked = true setAndSaveGridSize(gridSize) return true } return false } } interface AlbumClickListener { fun onAlbumClick(albumId: Int, view: View) }