package com.gaiagps.iburn.fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.gaiagps.iburn.R;
import com.gaiagps.iburn.Subscriber;
import com.gaiagps.iburn.adapters.AdapterListener;
import com.gaiagps.iburn.adapters.AdapterUtils;
import com.gaiagps.iburn.adapters.ArtCursorAdapter;
import com.gaiagps.iburn.adapters.CampCursorAdapter;
import com.gaiagps.iburn.adapters.CursorRecyclerViewAdapter;
import com.gaiagps.iburn.adapters.DividerItemDecoration;
import com.gaiagps.iburn.adapters.EventCursorAdapter;
import com.gaiagps.iburn.database.ArtTable;
import com.gaiagps.iburn.database.DataProvider;
import com.gaiagps.iburn.database.PlayaDatabase;
import com.gaiagps.iburn.view.ArtListHeader;
import com.gaiagps.iburn.view.BrowseListHeader;
import com.gaiagps.iburn.view.EventListHeader;
import com.squareup.sqlbrite.SqlBrite;
import java.util.ArrayList;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import timber.log.Timber;
import xyz.danoz.recyclerviewfastscroller.sectionindicator.title.SectionTitleIndicator;
import xyz.danoz.recyclerviewfastscroller.vertical.VerticalRecyclerViewFastScroller;
/**
* Fragment displaying Playa data
* <p/>
* Created by davidbrodsky on 8/3/13.
*/
public final class BrowseListViewFragment extends PlayaListViewFragment implements EventListHeader.PlayaListViewHeaderReceiver, BrowseListHeader.BrowseSelectionListener, AdapterListener, Subscriber, ArtListHeader.Listener {
public static BrowseListViewFragment newInstance() {
return new BrowseListViewFragment();
}
private ViewGroup artListHeader;
private ViewGroup eventListHeader;
private BrowseListHeader.BrowseSelection categorySelection = BrowseListHeader.BrowseSelection.CAMPS;
// Event filtering
private String selectedDay = AdapterUtils.getCurrentOrFirstDayAbbreviation();
private ArrayList<String> selectedTypes = null;
// Art filtering
private boolean showAudioTourOnly;
@Override
protected Subscription createSubscription() {
switch (categorySelection) {
case CAMPS:
adapter = new CampCursorAdapter(getActivity(), null, this);
if (mRecyclerView != null) mRecyclerView.setAdapter(adapter);
return DataProvider.getInstance(getActivity().getApplicationContext())
.flatMap(dataProvider -> dataProvider.observeTable(PlayaDatabase.CAMPS, adapter.getRequiredProjection()))
.doOnNext(query -> Timber.d("Got query"))
.map(SqlBrite.Query::run)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(cursor -> {
Timber.d("Data onNext");
onDataChanged(cursor);
},
throwable -> Timber.e(throwable, "Data onError"),
() -> Timber.d("Data onComplete"));
case ART:
adapter = new ArtCursorAdapter(getActivity(), null, this);
if (mRecyclerView != null) mRecyclerView.setAdapter(adapter);
return DataProvider.getInstance(getActivity().getApplicationContext())
.flatMap(dataProvider -> {
if (showAudioTourOnly) {
return dataProvider.observeTable(PlayaDatabase.ART, adapter.getRequiredProjection(), ArtTable.audioTourUrl + " IS NOT NULL");
} else {
return dataProvider.observeTable(PlayaDatabase.ART, adapter.getRequiredProjection());
}
})
.map(SqlBrite.Query::run)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(cursor -> {
Timber.d("Data onNext");
onDataChanged(cursor);
},
throwable -> Timber.e(throwable, "Data onError"),
() -> Timber.d("Data onComplete"));
case EVENT:
adapter = new EventCursorAdapter(getActivity(), null, false, this);
if (mRecyclerView != null) mRecyclerView.setAdapter(adapter);
return DataProvider.getInstance(getActivity().getApplicationContext())
.flatMap(dataProvider -> dataProvider.observeEventsOnDayOfTypes(selectedDay, selectedTypes, adapter.getRequiredProjection()))
.map(SqlBrite.Query::run)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(cursor -> {
Timber.d("Data onNext %d items", cursor.getCount());
onDataChanged(cursor);
},
throwable -> Timber.e(throwable, "Data onError"),
() -> Timber.d("Data onComplete"));
}
return null;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_browse_list_view, container, false);
eventListHeader = (ViewGroup) v.findViewById(R.id.eventHeader);
artListHeader = (ViewGroup) v.findViewById(R.id.artHeader);
mEmptyText = (TextView) v.findViewById(android.R.id.empty);
mRecyclerView = ((RecyclerView) v.findViewById(android.R.id.list));
VerticalRecyclerViewFastScroller fastScroller = (VerticalRecyclerViewFastScroller) v.findViewById(R.id.fastScroller);
SectionTitleIndicator sectionTitleIndicator =
(SectionTitleIndicator) v.findViewById(R.id.fastScrollerSectionIndicator);
// Connect the recycler to the scroller (to let the scroller scroll the list)
fastScroller.setRecyclerView(mRecyclerView);
// Connect the scroller to the recycler (to let the recycler scroll the scroller's handle)
mRecyclerView.setOnScrollListener(fastScroller.getOnScrollListener());
fastScroller.setSectionIndicator(sectionTitleIndicator);
setRecyclerViewLayoutManager(mRecyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
((BrowseListHeader) v.findViewById(R.id.header)).setBrowseSelectionListener(this);
((EventListHeader) v.findViewById(R.id.eventHeader)).setReceiver(this);
((ArtListHeader) v.findViewById(R.id.artHeader)).setListener(this);
return v;
}
private void setRecyclerViewLayoutManager(RecyclerView recyclerView) {
int scrollPosition = 0;
// If a layout manager has already been set, get current scroll position.
if (recyclerView.getLayoutManager() != null) {
scrollPosition =
((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
}
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.scrollToPosition(scrollPosition);
}
@Override
public void onSelectionChanged(String day, ArrayList<String> types) {
selectedDay = day;
selectedTypes = types;
unsubscribeFromData();
subscribeToData();
}
@Override
public void onSelectionChanged(BrowseListHeader.BrowseSelection selection) {
Timber.d("Browse selection made " + selection);
switch (selection) {
case CAMPS:
eventListHeader.setVisibility(View.GONE);
artListHeader.setVisibility(View.GONE);
break;
case ART:
eventListHeader.setVisibility(View.GONE);
artListHeader.setVisibility(View.VISIBLE);
break;
case EVENT:
eventListHeader.setVisibility(View.VISIBLE);
artListHeader.setVisibility(View.GONE);
break;
}
if (categorySelection != selection) {
categorySelection = selection;
unsubscribeFromData();
subscribeToData();
}
}
@Override
protected CursorRecyclerViewAdapter getAdapter() {
return new CampCursorAdapter(getActivity(), null, this);
}
@Override
public void onSelectionChanged(boolean showAudioTourOnly) {
this.showAudioTourOnly = showAudioTourOnly;
unsubscribeFromData();
subscribeToData();
}
}