/* * Copyright (C) 2015 Naman Dwivedi * * 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 com.naman14.timber.fragments; import android.app.Activity; import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.afollestad.appthemeengine.ATE; import com.naman14.timber.R; import com.naman14.timber.adapters.PlaylistAdapter; import com.naman14.timber.dataloaders.PlaylistLoader; import com.naman14.timber.dialogs.CreatePlaylistDialog; import com.naman14.timber.models.Playlist; import com.naman14.timber.subfragments.PlaylistPagerFragment; import com.naman14.timber.utils.Constants; import com.naman14.timber.utils.PreferencesUtility; import com.naman14.timber.widgets.DividerItemDecoration; import com.naman14.timber.widgets.MultiViewPager; import java.util.ArrayList; import java.util.List; public class PlaylistFragment extends Fragment { int playlistcount; FragmentStatePagerAdapter adapter; MultiViewPager pager; RecyclerView recyclerView; private GridLayoutManager layoutManager; private RecyclerView.ItemDecoration itemDecoration; private PreferencesUtility mPreferences; private boolean isGrid; private boolean isDefault; private boolean showAuto; private PlaylistAdapter mAdapter; private List<Playlist> playlists = new ArrayList<>(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPreferences = PreferencesUtility.getInstance(getActivity()); isGrid = mPreferences.getPlaylistView() == Constants.PLAYLIST_VIEW_GRID; isDefault = mPreferences.getPlaylistView() == Constants.PLAYLIST_VIEW_DEFAULT; showAuto = mPreferences.showAutoPlaylist(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate( R.layout.fragment_playlist, container, false); Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar); pager = (MultiViewPager) rootView.findViewById(R.id.playlistpager); recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); final ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar(); ab.setHomeAsUpIndicator(R.drawable.ic_menu); ab.setDisplayHomeAsUpEnabled(true); ab.setTitle(R.string.playlists); playlists = PlaylistLoader.getPlaylists(getActivity(), showAuto); playlistcount = playlists.size(); if (isDefault) { initPager(); } else { initRecyclerView(); } return rootView; } private void initPager() { pager.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); recyclerView.setAdapter(null); adapter = new FragmentStatePagerAdapter(getChildFragmentManager()) { @Override public int getCount() { return playlistcount; } @Override public Fragment getItem(int position) { return PlaylistPagerFragment.newInstance(position); } }; pager.setAdapter(adapter); pager.setOffscreenPageLimit(3); } private void initRecyclerView() { recyclerView.setVisibility(View.VISIBLE); pager.setVisibility(View.GONE); setLayoutManager(); mAdapter = new PlaylistAdapter(getActivity(), playlists); recyclerView.setAdapter(mAdapter); //to add spacing between cards if (getActivity() != null) { setItemDecoration(); } } private void setLayoutManager() { if (isGrid) { layoutManager = new GridLayoutManager(getActivity(), 2); } else { layoutManager = new GridLayoutManager(getActivity(), 1); } recyclerView.setLayoutManager(layoutManager); } private void setItemDecoration() { if (isGrid) { int spacingInPixels = getActivity().getResources().getDimensionPixelSize(R.dimen.spacing_card_album_grid); itemDecoration = new SpacesItemDecoration(spacingInPixels); } else { itemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST); } recyclerView.addItemDecoration(itemDecoration); } private void updateLayoutManager(int column) { recyclerView.removeItemDecoration(itemDecoration); recyclerView.setAdapter(new PlaylistAdapter(getActivity(), PlaylistLoader.getPlaylists(getActivity(), showAuto))); layoutManager.setSpanCount(column); layoutManager.requestLayout(); setItemDecoration(); } public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpacesItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.top = space; outRect.right = space; outRect.bottom = space; } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("dark_theme", false)) { ATE.apply(this, "dark_theme"); } else { ATE.apply(this, "light_theme"); } } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_playlist, menu); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if (showAuto) { menu.findItem(R.id.action_view_auto_playlists).setTitle("Hide auto playlists"); } else menu.findItem(R.id.action_view_auto_playlists).setTitle("Show auto playlists"); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_new_playlist: CreatePlaylistDialog.newInstance().show(getChildFragmentManager(), "CREATE_PLAYLIST"); return true; case R.id.menu_show_as_list: mPreferences.setPlaylistView(Constants.PLAYLIST_VIEW_LIST); isGrid = false; isDefault = false; initRecyclerView(); updateLayoutManager(1); return true; case R.id.menu_show_as_grid: mPreferences.setPlaylistView(Constants.PLAYLIST_VIEW_GRID); isGrid = true; isDefault = false; initRecyclerView(); updateLayoutManager(2); return true; case R.id.menu_show_as_default: mPreferences.setPlaylistView(Constants.PLAYLIST_VIEW_DEFAULT); isDefault = true; initPager(); return true; case R.id.action_view_auto_playlists: if (showAuto) { showAuto = false; mPreferences.setToggleShowAutoPlaylist(false); } else { showAuto = true; mPreferences.setToggleShowAutoPlaylist(true); } reloadPlaylists(); getActivity().invalidateOptionsMenu(); break; } return super.onOptionsItemSelected(item); } public void updatePlaylists(final long id) { playlists = PlaylistLoader.getPlaylists(getActivity(), showAuto); playlistcount = playlists.size(); if (isDefault) { adapter.notifyDataSetChanged(); if (id != -1) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { for (int i = 0; i < playlists.size(); i++) { long playlistid = playlists.get(i).id; if (playlistid == id) { pager.setCurrentItem(i); break; } } } }, 200); } } else { mAdapter.updateDataSet(playlists); } } public void reloadPlaylists() { playlists = PlaylistLoader.getPlaylists(getActivity(), showAuto); playlistcount = playlists.size(); if (isDefault) { initPager(); } else { initRecyclerView(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constants.ACTION_DELETE_PLAYLIST) { if (resultCode == Activity.RESULT_OK) { reloadPlaylists(); } } } }