package com.florianmski.tracktoid.ui.fragments.calendar; import android.database.Cursor; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import com.florianmski.tracktoid.utils.DateHelper; import com.florianmski.tracktoid.R; import com.florianmski.tracktoid.TraktoidTheme; import com.florianmski.tracktoid.adapters.RecyclerAdapter; import com.florianmski.tracktoid.adapters.lists.RecyclerCalendarAdapter; import com.florianmski.tracktoid.data.WEpisode; import com.florianmski.tracktoid.data.database.DatabaseSchematic; import com.florianmski.tracktoid.data.database.ProviderSchematic; import com.florianmski.tracktoid.data.database.columns.EpisodeColumns; import com.florianmski.tracktoid.data.database.columns.ShowColumns; import com.florianmski.tracktoid.rx.observables.CursorObservable; import com.florianmski.tracktoid.ui.activities.EpisodeActivity; import com.florianmski.tracktoid.ui.fragments.base.list.ItemRecyclerViewFragment; import com.uwetrottmann.trakt.v2.entities.CalendarEntry; import com.uwetrottmann.trakt.v2.entities.Episode; import com.uwetrottmann.trakt.v2.entities.Show; import com.uwetrottmann.trakt.v2.entities.ShowIds; import org.joda.time.DateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import rx.Observable; public class CalendarFragment extends ItemRecyclerViewFragment<CalendarFragment.CalendarDay> implements RecyclerAdapter.OnItemClickListener { private final static String[] EPISODE_PROJECTION; private final static String CURSOR_SHOW_TITLE = "show_title"; private final static int NUMBER_OF_DAYS_TO_DISPLAY = 7; static { // add the show title as a subquery to the projection String[] projection = ProviderSchematic.Episodes.PROJECTION; String[] temp = new String[projection.length + 1]; System.arraycopy(projection, 0, temp, 0, projection.length); projection = temp; projection[projection.length-1] = "(" + "SELECT " + ShowColumns.TITLE + " " + "FROM " + DatabaseSchematic.SHOWS + " " + "WHERE " + ShowColumns.ID_TRAKT + "=" + DatabaseSchematic.EPISODES + "." + EpisodeColumns.SHOW_ID + ") " + "AS " + CURSOR_SHOW_TITLE; EPISODE_PROJECTION = projection; } public CalendarFragment() {} public static CalendarFragment newInstance() { return new CalendarFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); setInstantLoad(true); } @Override protected RecyclerAdapter<CalendarDay, ?> createAdapter(List<CalendarDay> items) { return new RecyclerCalendarAdapter(getActivity(), items, this); } @Override protected Observable<List<CalendarDay>> createObservable() { // return Observable.create(new TraktObservable<List<CalendarDay>>() // { // @Override // public List<CalendarDay> fire() throws OAuthUnauthorizedException // { // Map<DateTime, List<CalendarEntry>> map = TraktManager.getInstance().calendars().shows(Extended.IMAGES); // return CalendarDay.toList(map); // } // }); DateTime today = DateHelper.now().withTime(0,0,0,0); return Observable.create(new CursorObservable<List<CalendarDay>>( getActivity(), ProviderSchematic.Episodes.CONTENT_URI, EPISODE_PROJECTION, EpisodeColumns.FIRST_AIRED + ">=?" + " AND " + EpisodeColumns.FIRST_AIRED + "<=?", new String[]{String.valueOf(today.getMillis()), String.valueOf(today.plusDays(NUMBER_OF_DAYS_TO_DISPLAY).getMillis())}, EpisodeColumns.FIRST_AIRED) { @Override protected List<CalendarDay> toObject(Cursor cursor) { Map<DateTime, List<CalendarEntry>> map = new TreeMap<>(); if(cursor.moveToFirst()) { do { CalendarEntry calendarEntry = new CalendarEntry(); WEpisode wEpisode = WEpisode.unpack(cursor); Episode episode = wEpisode.getTraktItem(); Show show = new Show(); show.ids = new ShowIds(); show.ids.trakt = Integer.valueOf(wEpisode.showId); show.title = cursor.getString(cursor.getColumnIndex(CURSOR_SHOW_TITLE)); calendarEntry.airs_at = episode.first_aired; calendarEntry.episode = episode; calendarEntry.show = show; DateTime date = calendarEntry.airs_at.withTime(0,0,0,0); List<CalendarEntry> calendarEntries = map.get(date); if(calendarEntries == null) calendarEntries = new ArrayList<>(); calendarEntries.add(calendarEntry); map.put(date, calendarEntries); } while(cursor.moveToNext()); } return CalendarDay.toList(map); } }); } @Override protected RecyclerView.LayoutManager getLayoutManager() { final GridLayoutManager manager = new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.grid_fanart_columns)); // set span to 1 if it's a header so it takes all the width manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return ((RecyclerCalendarAdapter)getAdapter()).isHeader(position) ? manager.getSpanCount() : 1; } }); return manager; } @Override public void onItemClick(View v, int position) { CalendarEntry calendarEntry = ((RecyclerCalendarAdapter)getAdapter()).getCalendarEntry(position); Episode episode = calendarEntry.episode; WEpisode wEpisode = new WEpisode(episode, String.valueOf(calendarEntry.show.ids.trakt)); // TODO add showTitle to WEpisode ? EpisodeActivity.launch(getActivity(), wEpisode); } @Override public TraktoidTheme getTheme() { return TraktoidTheme.SHOW; } public static class CalendarDay { public DateTime dateTime; public List<CalendarEntry> calendarEntries; private CalendarDay(DateTime dateTime, List<CalendarEntry> calendarEntries) { this.dateTime = dateTime; this.calendarEntries = calendarEntries; } public static List<CalendarDay> toList(Map<DateTime, List<CalendarEntry>> map) { List<CalendarDay> calendarDays = new ArrayList<>(); for (Map.Entry<DateTime, List<CalendarEntry>> entry : map.entrySet()) calendarDays.add(new CalendarDay(entry.getKey(), entry.getValue())); return calendarDays; } } }