package com.battlelancer.seriesguide.loaders; import android.content.Context; import android.database.Cursor; import android.support.annotation.NonNull; import com.battlelancer.seriesguide.Constants; import com.battlelancer.seriesguide.items.Episode; import com.battlelancer.seriesguide.provider.SeriesGuideContract.Episodes; import com.battlelancer.seriesguide.settings.DisplaySettings; import com.uwetrottmann.androidutils.GenericSimpleLoader; import java.util.ArrayList; /** * Loads episode of a season from the database and returns them as a list of {@link Episode} * objects. Also looks for the given episode in the list and returns its index. */ public class SeasonEpisodesLoader extends GenericSimpleLoader<SeasonEpisodesLoader.Result> { private final int seasonTvdbId; private final int episodeTvdbId; public static class Result { @NonNull public ArrayList<Episode> episodes; public int requestedEpisodeIndex; public Result(@NonNull ArrayList<Episode> episodes, int requestedEpisodeIndex) { this.episodes = episodes; this.requestedEpisodeIndex = requestedEpisodeIndex; } } public SeasonEpisodesLoader(Context context, int seasonTvdbId, int episodeTvdbId) { super(context); this.seasonTvdbId = seasonTvdbId; this.episodeTvdbId = episodeTvdbId; } @Override public Result loadInBackground() { // get episodes of season Constants.EpisodeSorting sortOrder = DisplaySettings.getEpisodeSortOrder(getContext()); Cursor episodesOfSeason = getContext().getContentResolver().query( Episodes.buildEpisodesOfSeasonUri(String.valueOf(seasonTvdbId)), new String[] { Episodes._ID, Episodes.NUMBER, Episodes.SEASON }, null, null, sortOrder.query() ); ArrayList<Episode> episodes = new ArrayList<>(); int requestedEpisodeIndex = 0; if (episodesOfSeason != null) { int i = 0; Integer seasonNumber = null; while (episodesOfSeason.moveToNext()) { int curEpisodeId = episodesOfSeason.getInt(0); if (curEpisodeId == episodeTvdbId) { requestedEpisodeIndex = i; } Episode episode = new Episode(); episode.episodeId = curEpisodeId; episode.episodeNumber = episodesOfSeason.getInt(1); if (seasonNumber == null) { seasonNumber = episodesOfSeason.getInt(2); // same for all } episode.seasonNumber = seasonNumber; episodes.add(episode); i++; } episodesOfSeason.close(); } return new Result(episodes, requestedEpisodeIndex); } }