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