package com.battlelancer.seriesguide.util; import android.content.ContentProviderOperation; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.text.format.DateUtils; import com.battlelancer.seriesguide.provider.SeriesGuideContract.Activity; import java.util.ArrayList; import java.util.HashSet; import timber.log.Timber; /** * Helper methods for dealing with the {@link com.battlelancer.seriesguide.provider.SeriesGuideDatabase.Tables#ACTIVITY} * table. */ public class ActivityTools { private static final long HISTORY_THRESHOLD = 30 * DateUtils.DAY_IN_MILLIS; /** * Adds an activity entry for the given episode with the current time as timestamp. If an entry * already exists it is replaced. * * <p>Also cleans up old entries. */ public static void addActivity(Context context, int episodeTvdbId, int showTvdbId) { long timeMonthAgo = System.currentTimeMillis() - HISTORY_THRESHOLD; // delete all entries older than 30 days int deleted = context.getContentResolver() .delete(Activity.CONTENT_URI, Activity.TIMESTAMP_MS + "<" + timeMonthAgo, null); Timber.d("addActivity: removed %d outdated activities", deleted); // add new entry ContentValues values = new ContentValues(); values.put(Activity.EPISODE_TVDB_ID, episodeTvdbId); values.put(Activity.SHOW_TVDB_ID, showTvdbId); long currentTime = System.currentTimeMillis(); values.put(Activity.TIMESTAMP_MS, currentTime); context.getContentResolver().insert(Activity.CONTENT_URI, values); Timber.d("addActivity: episode: %d timestamp: %d", episodeTvdbId, currentTime); } /** * Tries to remove any activity with the given episode TheTVDB id. */ public static void removeActivity(Context context, int episodeTvdbId) { int deleted = context.getContentResolver().delete(Activity.CONTENT_URI, Activity.EPISODE_TVDB_ID + "=" + episodeTvdbId, null); Timber.d("removeActivity: deleted %d activity entries", deleted); } /** * Get latest activity for each show and update last watched time if newer. */ public static void populateShowsLastWatchedTime(Context context) { Cursor query = context.getContentResolver() .query(Activity.CONTENT_URI, new String[] { Activity.TIMESTAMP_MS, Activity.SHOW_TVDB_ID }, null, null, Activity.SORT_LATEST); if (query == null) { Timber.e("populateShowsLastWatchedTime: query is null."); return; } ArrayList<ContentProviderOperation> batch = new ArrayList<>(); HashSet<Integer> handledShows = new HashSet<>(); while (query.moveToNext()) { int showTvdbId = query.getInt(1); if (!handledShows.contains(showTvdbId)) { handledShows.add(showTvdbId); long lastWatchedMs = query.getLong(0); ShowTools.addLastWatchedUpdateOpIfNewer(context, batch, showTvdbId, lastWatchedMs); } } query.close(); } }