package com.boardgamegeek.service; import android.accounts.Account; import android.content.ContentResolver; import android.content.Context; import android.content.SyncResult; import android.support.annotation.NonNull; import com.boardgamegeek.R; import com.boardgamegeek.auth.AccountUtils; import com.boardgamegeek.auth.Authenticator; import com.boardgamegeek.io.BggService; import com.boardgamegeek.model.Buddy; import com.boardgamegeek.model.User; import com.boardgamegeek.model.persister.BuddyPersister; import com.boardgamegeek.provider.BggContract.Buddies; import com.boardgamegeek.util.DateTimeUtils; import com.boardgamegeek.util.PreferencesUtils; import com.boardgamegeek.util.PresentationUtils; import java.io.IOException; import retrofit2.Call; import retrofit2.Response; import timber.log.Timber; /** * Syncs the list of buddies. Only runs every few days. */ public class SyncBuddiesList extends SyncTask { public SyncBuddiesList(Context context, BggService service) { super(context, service); } @Override public int getSyncType() { return SyncService.FLAG_SYNC_BUDDIES; } @Override public void execute(@NonNull Account account, @NonNull SyncResult syncResult) { Timber.i("Syncing list of buddies..."); try { if (!PreferencesUtils.getSyncBuddies(context)) { Timber.i("...buddies not set to sync"); return; } long lastCompleteSync = Authenticator.getLong(context, SyncService.TIMESTAMP_BUDDIES); if (lastCompleteSync >= 0 && DateTimeUtils.howManyDaysOld(lastCompleteSync) < 3) { Timber.i("...skipping; we synced already within the last 3 days"); return; } updateProgressNotification(R.string.sync_notification_buddies_list_downloading); User user = null; Call<User> call = service.user(account.name, 1, 1); try { Response<User> response = call.execute(); if (!response.isSuccessful()) { showError(String.format("Unsuccessful user fetch with code: %s", response.code())); syncResult.stats.numIoExceptions++; } user = response.body(); } catch (IOException e) { showError(String.format("Unsuccessful user fetch with exception: %s", e.getLocalizedMessage())); syncResult.stats.numIoExceptions++; } if (user == null) { return; } updateProgressNotification(R.string.sync_notification_buddies_list_storing); Authenticator.putInt(context, Authenticator.KEY_USER_ID, user.getId()); AccountUtils.setUsername(context, user.name); AccountUtils.setFullName(context, PresentationUtils.buildFullName(user.firstName, user.lastName)); AccountUtils.setAvatarUrl(context, user.avatarUrl); BuddyPersister persister = new BuddyPersister(context); int count = 0; count += persister.saveList(Buddy.fromUser(user)); count += persister.saveList(user.getBuddies()); syncResult.stats.numEntries += count; Timber.i("Synced %,d buddies", count); updateProgressNotification(R.string.sync_notification_buddies_list_pruning); ContentResolver resolver = context.getContentResolver(); count = resolver.delete(Buddies.CONTENT_URI, Buddies.UPDATED_LIST + "<?", new String[] { String.valueOf(persister.getTimestamp()) }); syncResult.stats.numDeletes += count; Timber.i("Pruned %,d users who are no longer buddies", count); Authenticator.putLong(context, SyncService.TIMESTAMP_BUDDIES, persister.getTimestamp()); } finally { Timber.i("...complete!"); } } @Override public int getNotificationSummaryMessageId() { return R.string.sync_notification_buddies_list; } }