package com.battlelancer.seriesguide.loaders;
import android.content.Context;
import android.database.Cursor;
import android.text.format.DateUtils;
import com.battlelancer.seriesguide.R;
import com.battlelancer.seriesguide.adapters.NowAdapter;
import com.battlelancer.seriesguide.provider.SeriesGuideDatabase;
import com.battlelancer.seriesguide.settings.DisplaySettings;
import com.battlelancer.seriesguide.thetvdbapi.TvdbImageTools;
import com.battlelancer.seriesguide.util.EpisodeTools;
import com.battlelancer.seriesguide.util.TextTools;
import com.battlelancer.seriesguide.util.TimeTools;
import com.uwetrottmann.androidutils.GenericSimpleLoader;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.DateTime;
import static com.battlelancer.seriesguide.provider.SeriesGuideContract.Episodes;
import static com.battlelancer.seriesguide.provider.SeriesGuideContract.Shows;
/**
* Loads a list of episodes released today and wraps them in a list of {@link
* com.battlelancer.seriesguide.adapters.NowAdapter.NowItem} for use with {@link
* com.battlelancer.seriesguide.adapters.NowAdapter}.
*/
public class ReleasedTodayLoader extends GenericSimpleLoader<List<NowAdapter.NowItem>> {
public ReleasedTodayLoader(Context context) {
super(context);
}
@Override
public List<NowAdapter.NowItem> loadInBackground() {
// go to start of current day
long timeAtStartOfDay = new DateTime().withTimeAtStartOfDay().getMillis();
// modify time to meet any user offset on episode release instants
timeAtStartOfDay = TimeTools.applyUserOffsetInverted(getContext(), timeAtStartOfDay);
Cursor query = getContext().getContentResolver().query(Episodes.CONTENT_URI_WITHSHOW,
Query.PROJECTION, Query.SELECTION,
new String[] {
String.valueOf(timeAtStartOfDay),
String.valueOf(timeAtStartOfDay + DateUtils.DAY_IN_MILLIS)
},
Query.SORT_ORDER);
if (query != null) {
List<NowAdapter.NowItem> items = new ArrayList<>();
// add header
if (query.getCount() > 0) {
items.add(new NowAdapter.NowItem().header(
getContext().getString(R.string.released_today)));
}
// add items
boolean preventSpoilers = DisplaySettings.preventSpoilers(getContext());
while (query.moveToNext()) {
String episodeString;
int season = query.getInt(Query.SEASON);
int episode = query.getInt(Query.NUMBER);
int episodeFlag = query.getInt(Query.WATCHED);
if (EpisodeTools.isUnwatched(episodeFlag) && preventSpoilers) {
// just display the number
episodeString = TextTools.getEpisodeNumber(getContext(), season, episode);
} else {
// display number and title
episodeString = TextTools.getNextEpisodeString(getContext(), season, episode,
query.getString(Query.EPISODE_TITLE));
}
NowAdapter.NowItem item = new NowAdapter.NowItem()
.displayData(
query.getLong(Query.FIRSTAIREDMS),
query.getString(Query.SHOW_TITLE),
episodeString,
TvdbImageTools.smallSizeUrl(query.getString(Query.POSTER_PATH))
)
.tvdbIds(query.getInt(Query.EPISODE_TVDBID),
query.getInt(Query.SHOW_TVDBID))
.releasedToday(query.getString(Query.NETWORK));
items.add(item);
}
query.close();
return items;
}
return null;
}
private interface Query {
String SELECTION = Episodes.FIRSTAIREDMS + ">=? AND "
+ Episodes.FIRSTAIREDMS + "<? AND "
+ Shows.SELECTION_NO_HIDDEN;
String SORT_ORDER = Episodes.FIRSTAIREDMS + " DESC,"
+ Shows.SORT_TITLE + ","
+ Episodes.NUMBER + " DESC";
String[] PROJECTION = new String[] {
SeriesGuideDatabase.Tables.EPISODES + "." + Episodes._ID, // 0
Episodes.TITLE,
Episodes.NUMBER,
Episodes.SEASON, // 3
Episodes.FIRSTAIREDMS,
Episodes.WATCHED,
Shows.REF_SHOW_ID, // 6
Shows.TITLE,
Shows.NETWORK,
Shows.POSTER // 9
};
int EPISODE_TVDBID = 0;
int EPISODE_TITLE = 1;
int NUMBER = 2;
int SEASON = 3;
int FIRSTAIREDMS = 4;
int WATCHED = 5;
int SHOW_TVDBID = 6;
int SHOW_TITLE = 7;
int NETWORK = 8;
int POSTER_PATH = 9;
}
}