From ce2418ce9fadafbe913d51b8084c4ed00e777ebf Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 16 May 2022 12:08:58 -0300 Subject: [PATCH] Consolidate local badge writes. --- .../securesms/badges/BadgeRepository.kt | 62 ++++++++++++++++--- .../securesms/jobs/RefreshOwnProfileJob.java | 5 +- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeRepository.kt index 258ed4778..6b614a24b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeRepository.kt @@ -1,41 +1,83 @@ package org.thoughtcrime.securesms.badges import android.content.Context +import androidx.annotation.WorkerThread import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.database.RecipientDatabase import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies +import org.thoughtcrime.securesms.jobs.MultiDeviceProfileContentUpdateJob +import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.util.ProfileUtil +import java.io.IOException class BadgeRepository(context: Context) { + companion object { + private val TAG = Log.tag(BadgeRepository::class.java) + } + private val context = context.applicationContext + /** + * Sets the visibility for each badge on a user's profile, and uploads them to the server. + * Does not write to the local database. The caller must either do that themselves or schedule + * a refresh own profile job. + * + * @return A list of the badges, properly modified to either visible or not visible, according to user preferences. + */ + @Throws(IOException::class) + @WorkerThread + fun setVisibilityForAllBadgesSync( + displayBadgesOnProfile: Boolean, + selfBadges: List + ): List { + Log.d(TAG, "[setVisibilityForAllBadgesSync] Setting badge visibility...", true) + + val recipientDatabase: RecipientDatabase = SignalDatabase.recipients + val badges = selfBadges.map { it.copy(visible = displayBadgesOnProfile) } + + Log.d(TAG, "[setVisibilityForAllBadgesSync] Uploading profile...", true) + ProfileUtil.uploadProfileWithBadges(context, badges) + SignalStore.donationsValues().setDisplayBadgesOnProfile(displayBadgesOnProfile) + recipientDatabase.markNeedsSync(Recipient.self().id) + + Log.d(TAG, "[setVisibilityForAllBadgesSync] Requesting data change sync...", true) + StorageSyncHelper.scheduleSyncForDataChange() + + return badges + } + fun setVisibilityForAllBadges( displayBadgesOnProfile: Boolean, selfBadges: List = Recipient.self().badges ): Completable = Completable.fromAction { - val recipientDatabase: RecipientDatabase = SignalDatabase.recipients - val badges = selfBadges.map { it.copy(visible = displayBadgesOnProfile) } + setVisibilityForAllBadgesSync(displayBadgesOnProfile, selfBadges) - ProfileUtil.uploadProfileWithBadges(context, badges) - SignalStore.donationsValues().setDisplayBadgesOnProfile(displayBadgesOnProfile) - recipientDatabase.markNeedsSync(Recipient.self().id) - StorageSyncHelper.scheduleSyncForDataChange() - - recipientDatabase.setBadges(Recipient.self().id, badges) + Log.d(TAG, "[setVisibilityForAllBadges] Enqueueing profile refresh...", true) + ApplicationDependencies.getJobManager() + .startChain(RefreshOwnProfileJob()) + .then(MultiDeviceProfileContentUpdateJob()) + .enqueue() }.subscribeOn(Schedulers.io()) fun setFeaturedBadge(featuredBadge: Badge): Completable = Completable.fromAction { val badges = Recipient.self().badges val reOrderedBadges = listOf(featuredBadge.copy(visible = true)) + (badges.filterNot { it.id == featuredBadge.id }) + + Log.d(TAG, "[setFeaturedBadge] Uploading profile with reordered badges...", true) ProfileUtil.uploadProfileWithBadges(context, reOrderedBadges) - val recipientDatabase: RecipientDatabase = SignalDatabase.recipients - recipientDatabase.setBadges(Recipient.self().id, reOrderedBadges) + Log.d(TAG, "[setFeaturedBadge] Enqueueing profile refresh...", true) + ApplicationDependencies.getJobManager() + .startChain(RefreshOwnProfileJob()) + .then(MultiDeviceProfileContentUpdateJob()) + .enqueue() }.subscribeOn(Schedulers.io()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java index 51292aa04..9e070dc46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java @@ -234,7 +234,7 @@ public class RefreshOwnProfileJob extends BaseJob { } } - private void setProfileBadges(@Nullable List badges) { + private void setProfileBadges(@Nullable List badges) throws IOException { if (badges == null) { return; } @@ -334,7 +334,8 @@ public class RefreshOwnProfileJob extends BaseJob { " visible.", true); BadgeRepository badgeRepository = new BadgeRepository(context); - badgeRepository.setVisibilityForAllBadges(displayBadgesOnProfile, appBadges).blockingSubscribe(); + List updatedBadges = badgeRepository.setVisibilityForAllBadgesSync(displayBadgesOnProfile, appBadges); + SignalDatabase.recipients().setBadges(Recipient.self().getId(), updatedBadges); } else { SignalDatabase.recipients().setBadges(Recipient.self().getId(), appBadges); }