package com.simplecity.amp_library.ui.fragments;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import com.simplecity.amp_library.R;
import com.simplecity.amp_library.model.AdaptableItem;
import com.simplecity.amp_library.model.Playlist;
import com.simplecity.amp_library.ui.adapters.PlaylistAdapter;
import com.simplecity.amp_library.ui.modelviews.EmptyView;
import com.simplecity.amp_library.ui.modelviews.PlaylistView;
import com.simplecity.amp_library.utils.ColorUtils;
import com.simplecity.amp_library.utils.ComparisonUtils;
import com.simplecity.amp_library.utils.DataManager;
import com.simplecity.amp_library.utils.MenuUtils;
import com.simplecity.amp_library.utils.MusicUtils;
import com.simplecity.amp_library.utils.PermissionUtils;
import com.simplecity.amp_library.utils.ThemeUtils;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class PlaylistFragment extends BaseFragment implements
MusicUtils.Defs,
PlaylistAdapter.PlaylistListener,
RecyclerView.RecyclerListener {
public interface PlaylistClickListener {
void onItemClicked(Playlist playlist);
}
private static final String TAG = "PlaylistFragment";
private static final String ARG_PAGE_TITLE = "page_title";
private FastScrollRecyclerView mRecyclerView;
private PlaylistAdapter mPlaylistAdapter;
private PlaylistClickListener playlistClickListener;
private Subscription subscription;
public PlaylistFragment() {
}
public static PlaylistFragment newInstance(String pageTitle) {
PlaylistFragment fragment = new PlaylistFragment();
Bundle args = new Bundle();
args.putString(ARG_PAGE_TITLE, pageTitle);
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
playlistClickListener = (PlaylistClickListener) getActivity();
}
@Override
public void onDetach() {
super.onDetach();
playlistClickListener = null;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPlaylistAdapter = new PlaylistAdapter();
mPlaylistAdapter.setListener(this);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (mRecyclerView == null) {
mRecyclerView = (FastScrollRecyclerView) inflater.inflate(R.layout.fragment_recycler, container, false);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.setRecyclerListener(this);
mRecyclerView.setAdapter(mPlaylistAdapter);
themeUIComponents();
}
return mRecyclerView;
}
@Override
public void onPause() {
super.onPause();
if (subscription != null) {
subscription.unsubscribe();
}
}
@Override
public void onResume() {
super.onResume();
refreshAdapterItems();
}
private void refreshAdapterItems() {
PermissionUtils.RequestStoragePermissions(() -> {
if (getActivity() != null && isAdded()) {
Observable<List<Playlist>> defaultPlaylistsObservable =
Observable.defer(() ->
{
List<Playlist> playlists = new ArrayList<>();
Playlist podcastPlaylist = Playlist.podcastPlaylist();
if (podcastPlaylist != null) {
playlists.add(podcastPlaylist);
}
playlists.add(Playlist.recentlyAddedPlaylist());
playlists.add(Playlist.mostPlayedPlaylist());
return Observable.just(playlists);
}
);
Observable<List<Playlist>> playlistsObservable = DataManager.getInstance().getPlaylistsRelay();
subscription = Observable.combineLatest(
defaultPlaylistsObservable, playlistsObservable, (defaultPlaylists, playlists) -> {
List<Playlist> list = new ArrayList<>();
list.addAll(defaultPlaylists);
list.addAll(playlists);
return list;
})
.subscribeOn(Schedulers.io())
.map(playlists -> Stream.of(playlists)
.sorted((a, b) -> ComparisonUtils.compare(a.name, b.name))
.sorted((a, b) -> ComparisonUtils.compareInt(a.type, b.type))
.map(playlist -> (AdaptableItem) new PlaylistView(playlist))
.collect(Collectors.toList()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(items -> {
if (items.isEmpty()) {
mPlaylistAdapter.setEmpty(new EmptyView(R.string.empty_playlist));
} else {
mPlaylistAdapter.setItems(items);
}
});
}
});
}
private void themeUIComponents() {
ThemeUtils.themeRecyclerView(mRecyclerView);
mRecyclerView.setThumbColor(ColorUtils.getAccentColor());
mRecyclerView.setPopupBgColor(ColorUtils.getAccentColor());
mRecyclerView.setPopupTextColor(ColorUtils.getAccentColorSensitiveTextColor(getContext()));
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
ThemeUtils.themeRecyclerView(recyclerView);
super.onScrollStateChanged(recyclerView, newState);
}
});
}
@Override
public void onItemClick(View v, int position, Playlist playlist) {
playlistClickListener.onItemClicked(playlist);
}
@Override
public void onOverflowClick(View v, int position, Playlist playlist) {
PopupMenu menu = new PopupMenu(PlaylistFragment.this.getActivity(), v);
MenuUtils.addPlaylistMenuOptions(menu, playlist);
MenuUtils.addClickHandler(getContext(), menu, playlist, null, null);
menu.show();
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
if (holder.getAdapterPosition() != -1) {
mPlaylistAdapter.items.get(holder.getAdapterPosition()).recycle(holder);
}
}
@Override
protected String screenName() {
return TAG;
}
}