package com.florianmski.tracktoid.utils; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import com.florianmski.tracktoid.data.database.ProviderSchematic; import com.florianmski.tracktoid.data.database.columns.EpisodeColumns; import com.florianmski.tracktoid.data.database.columns.MovieColumns; import com.florianmski.tracktoid.data.database.columns.ShowColumns; import com.florianmski.tracktoid.data.database.utils.CVUtils; import com.florianmski.tracktoid.trakt.TraktManager; import com.uwetrottmann.trakt.v2.entities.Episode; import com.uwetrottmann.trakt.v2.entities.Movie; import com.uwetrottmann.trakt.v2.entities.Season; import com.uwetrottmann.trakt.v2.entities.Show; import com.uwetrottmann.trakt.v2.entities.SyncEpisode; import com.uwetrottmann.trakt.v2.entities.SyncMovie; import com.uwetrottmann.trakt.v2.entities.SyncShow; import com.uwetrottmann.trakt.v2.enums.Extended; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DbHelper { public static boolean isShowInDb(Context context, String showId) { return isSomethingInDb(context, ProviderSchematic.Shows.CONTENT_URI, ShowColumns.ID_TRAKT, showId); } public static boolean isMovieInDb(Context context, Movie movie) { return isSomethingInDb(context, ProviderSchematic.Movies.CONTENT_URI, MovieColumns.ID_TRAKT, String.valueOf(movie.ids.trakt)); } private static boolean isSomethingInDb(Context context, Uri uri, String idColumn, String traktId) { boolean exists; Cursor c = context.getContentResolver().query( uri, new String[]{}, idColumn + "=?", new String[]{traktId}, null); exists = c.moveToFirst(); c.close(); return exists; } public static Map<String, Long> getLastUpdatedMap(Context context, Uri uri, String idColumn, String lastUpdatedColumn) { Cursor c = context.getContentResolver().query( uri, new String[]{idColumn, lastUpdatedColumn}, null, null, null ); Map<String, Long> map = new HashMap<>(); while(c.moveToNext()) map.put(c.getString(0), c.getLong(1)); c.close(); return map; } public static Map<String, Long> getLastUpdatedShowMap(Context context) { return getLastUpdatedMap(context, ProviderSchematic.Shows.CONTENT_URI, ShowColumns.ID_TRAKT, ShowColumns.UPDATED_AT); } public static Map<String, Long> getLastUpdatedMovieMap(Context context) { return getLastUpdatedMap(context, ProviderSchematic.Movies.CONTENT_URI, MovieColumns.ID_TRAKT, MovieColumns.UPDATED_AT); } public static void downloadAndInsertShow(Context context, String showId) { Show show = TraktManager.getInstance().shows().summary(showId, Extended.FULLIMAGES); downloadAndInsertShowContent(context, show); } public static void downloadAndInsertShowContent(Context context, Show show) { List<Season> seasons = TraktManager.getInstance().seasons().summary(String.valueOf(show.ids.trakt), Extended.FULLIMAGES); List<ContentValues> episodeToInsert = new ArrayList<>(); List<ContentValues> seasonToInsert = new ArrayList<>(); for(Season season : seasons) { seasonToInsert.add(CVUtils.packSeason(season, String.valueOf(show.ids.trakt))); List<Episode> episodes = TraktManager.getInstance().seasons().season(String.valueOf(show.ids.trakt), season.number, Extended.FULLIMAGES); for(Episode episode : episodes) episodeToInsert.add(CVUtils.packEpisode(episode, String.valueOf(season.ids.trakt), String.valueOf(show.ids.trakt))); } DbHelper.bulkInsert(context, episodeToInsert, ProviderSchematic.Episodes.CONTENT_URI); DbHelper.bulkInsert(context, seasonToInsert, ProviderSchematic.Seasons.CONTENT_URI); DbHelper.insertShow(context, show); } public static void insert(Context context, Uri uri, ContentValues contentValues) { context.getContentResolver().insert(uri, contentValues); } public static void insertMovie(Context context, Movie movie) { insert(context, ProviderSchematic.Movies.CONTENT_URI, CVUtils.packMovie(movie)); } public static void insertShow(Context context, Show show) { insert(context, ProviderSchematic.Shows.CONTENT_URI, CVUtils.packShow(show)); } public static void insertEpisode(Context context, Episode episode, String seasonId, String showId) { insert(context, ProviderSchematic.Movies.CONTENT_URI, CVUtils.packEpisode(episode, seasonId, showId)); } public static boolean update(Context context, Uri uri, ContentValues cv, String where, String... selectionArgs) { return context.getContentResolver().update(uri, cv, where, selectionArgs) > 0; } public static boolean update(Context context, Uri uri, ContentValues cv) { return update(context, uri, cv, null); } public static boolean updateMovie(Context context, ContentValues cv, String trakt) { return update(context, ProviderSchematic.Movies.withId(trakt), cv); } public static boolean updateMovies(Context context, ContentValues cv, List<SyncMovie> syncMovies) { if(syncMovies.isEmpty()) return false; if(syncMovies.size() == 1) return updateMovie(context, cv, String.valueOf(syncMovies.get(0).ids.trakt)); List<String> ids = new ArrayList<>(); for(SyncMovie syncMovie : syncMovies) ids.add(String.valueOf(syncMovie.ids.trakt)); return updateItems(context, ProviderSchematic.Movies.CONTENT_URI, cv, MovieColumns.ID_TRAKT, ids); } public static boolean updateShow(Context context, ContentValues cv, String trakt) { return update(context, ProviderSchematic.Shows.withId(trakt), cv); } public static boolean updateShows(Context context, ContentValues cv, List<SyncShow> syncShows) { if(syncShows.isEmpty()) return false; if(syncShows.size() == 1) return updateShow(context, cv, String.valueOf(syncShows.get(0).ids.trakt)); List<String> ids = new ArrayList<>(); for(SyncShow syncShow : syncShows) ids.add(String.valueOf(syncShow.ids.trakt)); return updateItems(context, ProviderSchematic.Shows.CONTENT_URI, cv, ShowColumns.ID_TRAKT, ids); } public static boolean updateSeason(Context context, ContentValues cv, String trakt) { return update(context, ProviderSchematic.Seasons.withId(trakt), cv); } public static boolean updateEpisode(Context context, ContentValues cv, String trakt) { return update(context, ProviderSchematic.Episodes.withId(trakt), cv); } public static boolean updateEpisode(Context context, ContentValues cv, String traktShow, int season, int number) { return update(context, ProviderSchematic.Episodes.fromShow(traktShow), cv, EpisodeColumns.SEASON + "=?" + " AND " + EpisodeColumns.NUMBER + "=?", String.valueOf(season), String.valueOf(number)); } public static boolean updateEpisodes(Context context, ContentValues cv, List<SyncEpisode> syncEpisodes) { if(syncEpisodes.isEmpty()) return false; if(syncEpisodes.size() == 1) return updateEpisode(context, cv, String.valueOf(syncEpisodes.get(0).ids.trakt)); List<String> ids = new ArrayList<>(); for(SyncEpisode syncEpisode : syncEpisodes) ids.add(String.valueOf(syncEpisode.ids.trakt)); return updateItems(context, ProviderSchematic.Episodes.CONTENT_URI, cv, EpisodeColumns.ID_TRAKT, ids); } public static boolean updateItems(Context context, Uri uri, ContentValues cv, String idColumn, List<String> ids) { String where = ""; List<String> whereArgs = new ArrayList<>(); for(String id : ids) { where += ",?"; whereArgs.add(id); } return update( context, uri, cv, idColumn + " IN (" + where.substring(1) + ")", whereArgs.toArray(new String[whereArgs.size()])); } public static void bulkInsert(Context context, List<ContentValues> contentValuesList, Uri uri) { ContentValues[] cvs = new ContentValues[contentValuesList.size()]; int i = 0; for(ContentValues contentValues : contentValuesList) cvs[i++] = contentValues; context.getContentResolver().bulkInsert(uri, cvs); } }