package be.digitalia.fosdem.fragments;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.Loader;
import android.support.v7.widget.DividerItemDecoration;
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 be.digitalia.fosdem.R;
import be.digitalia.fosdem.activities.TrackScheduleActivity;
import be.digitalia.fosdem.adapters.RecyclerViewCursorAdapter;
import be.digitalia.fosdem.db.DatabaseManager;
import be.digitalia.fosdem.loaders.SimpleCursorLoader;
import be.digitalia.fosdem.model.Day;
import be.digitalia.fosdem.model.Track;
public class TracksListFragment extends RecyclerViewFragment implements LoaderCallbacks<Cursor> {
private static final int TRACKS_LOADER_ID = 1;
private static final String ARG_DAY = "day";
Day day;
private TracksAdapter adapter;
public static TracksListFragment newInstance(Day day) {
TracksListFragment f = new TracksListFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_DAY, day);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new TracksAdapter();
day = getArguments().getParcelable(ARG_DAY);
}
@Override
protected void onRecyclerViewCreated(RecyclerView recyclerView, Bundle savedInstanceState) {
Fragment parentFragment = getParentFragment();
if (parentFragment instanceof RecycledViewPoolProvider) {
recyclerView.setRecycledViewPool(((RecycledViewPoolProvider) parentFragment).getRecycledViewPool());
}
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
recyclerView.setAdapter(adapter);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setEmptyText(getString(R.string.no_data));
setProgressBarVisible(true);
getLoaderManager().initLoader(TRACKS_LOADER_ID, null, this);
}
private static class TracksLoader extends SimpleCursorLoader {
private final Day day;
public TracksLoader(Context context, Day day) {
super(context);
this.day = day;
}
@Override
protected Cursor getCursor() {
return DatabaseManager.getInstance().getTracks(day);
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new TracksLoader(getActivity(), day);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data != null) {
adapter.swapCursor(data);
}
setProgressBarVisible(false);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
private class TracksAdapter extends RecyclerViewCursorAdapter<TrackViewHolder> {
private final LayoutInflater inflater;
public TracksAdapter() {
inflater = LayoutInflater.from(getContext());
}
@Override
public Track getItem(int position) {
return DatabaseManager.toTrack((Cursor) super.getItem(position));
}
@Override
public TrackViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.simple_list_item_2_material, parent, false);
return new TrackViewHolder(view);
}
@Override
public void onBindViewHolder(TrackViewHolder holder, Cursor cursor) {
holder.day = day;
holder.track = DatabaseManager.toTrack(cursor, holder.track);
holder.name.setText(holder.track.getName());
holder.type.setText(holder.track.getType().getNameResId());
holder.type.setTextColor(ContextCompat.getColor(holder.type.getContext(), holder.track.getType().getColorResId()));
}
}
static class TrackViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView name;
TextView type;
Day day;
Track track;
TrackViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(android.R.id.text1);
type = (TextView) itemView.findViewById(android.R.id.text2);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, TrackScheduleActivity.class)
.putExtra(TrackScheduleActivity.EXTRA_DAY, day)
.putExtra(TrackScheduleActivity.EXTRA_TRACK, track);
context.startActivity(intent);
}
}
}