diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt index 2cd071a9e8..12b12ba6e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DistributionListDatabase.kt @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.util.Base64 import org.whispersystems.signalservice.api.push.DistributionId import org.whispersystems.signalservice.api.storage.SignalStoryDistributionListRecord import org.whispersystems.signalservice.api.util.UuidUtil +import java.lang.AssertionError import java.util.UUID /** @@ -411,10 +412,15 @@ class DistributionListDatabase constructor(context: Context?, databaseHelper: Si } fun applyStorageSyncStoryDistributionListInsert(insert: SignalStoryDistributionListRecord) { + val distributionId = DistributionId.from(UuidUtil.parseOrThrow(insert.identifier)) + if (distributionId == DistributionId.MY_STORY) { + throw AssertionError("Should never try to insert My Story") + } + createList( name = insert.name, members = insert.recipients.map(RecipientId::from), - distributionId = DistributionId.from(UuidUtil.parseOrThrow(insert.identifier)), + distributionId = distributionId, allowsReplies = insert.allowsReplies(), deletionTimestamp = insert.deletedAtTimestamp ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt index 8e5ae8d988..195d9e9b89 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt @@ -1068,14 +1068,19 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : * @return All storage IDs for synced records, excluding the ones that need to be deleted. */ fun getContactStorageSyncIdsMap(): Map { + val (inPart, args) = if (Recipient.self().storiesCapability == Recipient.Capability.SUPPORTED) { + "(?, ?)" to SqlUtil.buildArgs(GroupType.NONE.id, Recipient.self().id, GroupType.SIGNAL_V1.id, GroupType.DISTRIBUTION_LIST.id) + } else { + "(?)" to SqlUtil.buildArgs(GroupType.NONE.id, Recipient.self().id, GroupType.SIGNAL_V1.id) + } + val query = """ $STORAGE_SERVICE_ID NOT NULL AND ( ($GROUP_TYPE = ? AND $SERVICE_ID NOT NULL AND $ID != ?) OR - $GROUP_TYPE IN (?, ?) + $GROUP_TYPE IN $inPart ) """.trimIndent() - val args = SqlUtil.buildArgs(GroupType.NONE.id, Recipient.self().id, GroupType.SIGNAL_V1.id, GroupType.DISTRIBUTION_LIST.id) val out: MutableMap = HashMap() readableDatabase.query(TABLE_NAME, arrayOf(ID, STORAGE_SERVICE_ID, GROUP_TYPE), query, args, null, null, null).use { cursor -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java index 21090634a9..65955dafb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java @@ -33,6 +33,7 @@ import org.thoughtcrime.securesms.storage.StorageSyncHelper.WriteOperationResult import org.thoughtcrime.securesms.storage.StorageSyncModels; import org.thoughtcrime.securesms.storage.StorageSyncValidations; import org.thoughtcrime.securesms.storage.StoryDistributionListRecordProcessor; +import org.thoughtcrime.securesms.stories.Stories; import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.util.Stopwatch; import org.thoughtcrime.securesms.util.TextSecurePreferences; @@ -397,7 +398,10 @@ public class StorageSyncJob extends BaseJob { new GroupV2RecordProcessor(context).process(records.gv2, StorageSyncHelper.KEY_GENERATOR); self = freshSelf(); new AccountRecordProcessor(context, self).process(records.account, StorageSyncHelper.KEY_GENERATOR); - new StoryDistributionListRecordProcessor().process(records.storyDistributionLists, StorageSyncHelper.KEY_GENERATOR); + + if (getKnownTypes().contains(ManifestRecord.Identifier.Type.STORY_DISTRIBUTION_LIST_VALUE)) { + new StoryDistributionListRecordProcessor().process(records.storyDistributionLists, StorageSyncHelper.KEY_GENERATOR); + } } private static @NonNull List getAllLocalStorageIds(@NonNull Recipient self) { @@ -470,6 +474,7 @@ public class StorageSyncJob extends BaseJob { private static List getKnownTypes() { return Arrays.stream(ManifestRecord.Identifier.Type.values()) .filter(it -> !it.equals(ManifestRecord.Identifier.Type.UNKNOWN) && !it.equals(ManifestRecord.Identifier.Type.UNRECOGNIZED)) + .filter(it -> Recipient.self().getStoriesCapability() == Recipient.Capability.SUPPORTED || !it.equals(ManifestRecord.Identifier.Type.STORY_DISTRIBUTION_LIST)) .map(it -> it.getNumber()) .collect(Collectors.toList()); }