package com.zegoggles.smssync.service; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.database.MatrixCursor; import android.database.sqlite.SQLiteException; import android.util.Log; import com.zegoggles.smssync.contacts.ContactGroupIds; import com.zegoggles.smssync.mail.DataType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static com.zegoggles.smssync.App.LOCAL_LOGV; import static com.zegoggles.smssync.App.TAG; public class BackupItemsFetcher { private final Context context; private final ContentResolver resolver; private final BackupQueryBuilder queryBuilder; public BackupItemsFetcher(@NotNull Context context, @NotNull ContentResolver resolver, @NotNull BackupQueryBuilder queryBuilder) { if (resolver == null) throw new IllegalArgumentException("resolver cannot be null"); if (queryBuilder == null) throw new IllegalArgumentException("queryBuilder cannot be null"); this.queryBuilder = queryBuilder; this.context = context; this.resolver = resolver; } public @NotNull Cursor getItemsForDataType(DataType dataType, ContactGroupIds group, int max) { if (LOCAL_LOGV) Log.v(TAG, "getItemsForDataType(type=" + dataType + ", max=" + max + ")"); return performQuery(queryBuilder.buildQueryForDataType(dataType, group, max)); } public long getMostRecentTimestamp(DataType dataType) { return getMostRecentTimestampForQuery(queryBuilder.buildMostRecentQueryForDataType(dataType)); } private long getMostRecentTimestampForQuery(BackupQueryBuilder.Query query) { Cursor cursor = performQuery(query); try { if (cursor.moveToFirst()) { return cursor.getLong(0); } else { return DataType.Defaults.MAX_SYNCED_DATE; } } finally { cursor.close(); } } private @NotNull Cursor performQuery(@Nullable BackupQueryBuilder.Query query) { if (query == null) return emptyCursor(); try { final Cursor cursor = resolver.query( query.uri, query.projection, query.selection, query.selectionArgs, query.sortOrder ); return cursor == null ? emptyCursor() : cursor; } catch (SQLiteException e) { Log.w(TAG, "error querying DB", e); return emptyCursor(); } catch (NullPointerException e) { Log.w(TAG, "error querying DB", e); return emptyCursor(); } } static Cursor emptyCursor() { return new MatrixCursor(new String[]{}); } }