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 813166f894..6549198157 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt @@ -925,6 +925,21 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(recipientId) } + fun markAllSystemContactsNeedsSync() { + writableDatabase.withinTransaction { db -> + db + .select(ID) + .from(TABLE_NAME) + .where("$SYSTEM_CONTACT_URI NOT NULL") + .run() + .use { cursor -> + while (cursor.moveToNext()) { + rotateStorageId(RecipientId.from(cursor.requireLong(ID))) + } + } + } + } + fun applyStorageIdUpdates(storageIds: Map) { val db = writableDatabase db.beginTransaction() @@ -3667,8 +3682,9 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : private fun getValuesForStorageContact(contact: SignalContactRecord, isInsert: Boolean): ContentValues { return ContentValues().apply { - val profileName = ProfileName.fromParts(contact.givenName.orElse(null), contact.familyName.orElse(null)) - val username: String? = contact.username.orElse(null) + val profileName = ProfileName.fromParts(contact.profileGivenName.orElse(null), contact.profileFamilyName.orElse(null)) + val systemName = ProfileName.fromParts(contact.systemGivenName.orElse(null), contact.systemFamilyName.orElse(null)) + val username = contact.username.orElse(null) if (contact.serviceId.isValid) { put(SERVICE_ID, contact.serviceId.toString()) @@ -3682,6 +3698,9 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : put(PROFILE_GIVEN_NAME, profileName.givenName) put(PROFILE_FAMILY_NAME, profileName.familyName) put(PROFILE_JOINED_NAME, profileName.toString()) + put(SYSTEM_GIVEN_NAME, systemName.givenName) + put(SYSTEM_FAMILY_NAME, systemName.familyName) + put(SYSTEM_JOINED_NAME, systemName.toString()) put(PROFILE_KEY, contact.profileKey.map { source -> Base64.encodeBytes(source) }.orElse(null)) put(USERNAME, if (TextUtils.isEmpty(username)) null else username) put(PROFILE_SHARING, if (contact.isProfileSharingEnabled) "1" else "0") diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index b962c303d5..03394d37f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -61,6 +61,7 @@ import org.thoughtcrime.securesms.migrations.StickerLaunchMigrationJob; import org.thoughtcrime.securesms.migrations.StickerMyDailyLifeMigrationJob; import org.thoughtcrime.securesms.migrations.StorageCapabilityMigrationJob; import org.thoughtcrime.securesms.migrations.StorageServiceMigrationJob; +import org.thoughtcrime.securesms.migrations.StorageServiceSystemNameMigrationJob; import org.thoughtcrime.securesms.migrations.SyncDistributionListsMigrationJob; import org.thoughtcrime.securesms.migrations.TrimByLengthSettingsMigrationJob; import org.thoughtcrime.securesms.migrations.UserNotificationMigrationJob; @@ -221,6 +222,7 @@ public final class JobManagerFactories { put(StickerMyDailyLifeMigrationJob.KEY, new StickerMyDailyLifeMigrationJob.Factory()); put(StorageCapabilityMigrationJob.KEY, new StorageCapabilityMigrationJob.Factory()); put(StorageServiceMigrationJob.KEY, new StorageServiceMigrationJob.Factory()); + put(StorageServiceSystemNameMigrationJob.KEY, new StorageServiceSystemNameMigrationJob.Factory()); put(TrimByLengthSettingsMigrationJob.KEY, new TrimByLengthSettingsMigrationJob.Factory()); put(UserNotificationMigrationJob.KEY, new UserNotificationMigrationJob.Factory()); put(UuidMigrationJob.KEY, new UuidMigrationJob.Factory()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java index 481dcfc8e6..386c8bbf0a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java @@ -108,9 +108,10 @@ public class ApplicationMigrations { static final int REFRESH_PNI_REGISTRATION_ID = 64; static final int KBS_MIGRATION_2 = 65; static final int PNI_2 = 66; + static final int SYSTEM_NAME_SYNC = 67; } - public static final int CURRENT_VERSION = 66; + public static final int CURRENT_VERSION = 67; /** * This *must* be called after the {@link JobManager} has been instantiated, but *before* the call @@ -476,6 +477,10 @@ public class ApplicationMigrations { jobs.put(Version.PNI_2, new PniMigrationJob()); } + if (lastSeenVersion < Version.SYSTEM_NAME_SYNC) { + jobs.put(Version.SYSTEM_NAME_SYNC, new StorageServiceSystemNameMigrationJob()); + } + return jobs; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob.java new file mode 100644 index 0000000000..4ccf03c0aa --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/StorageServiceSystemNameMigrationJob.java @@ -0,0 +1,56 @@ +package org.thoughtcrime.securesms.migrations; + +import androidx.annotation.NonNull; + +import org.thoughtcrime.securesms.database.SignalDatabase; +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.jobmanager.Data; +import org.thoughtcrime.securesms.jobmanager.Job; +import org.thoughtcrime.securesms.jobs.DownloadLatestEmojiDataJob; +import org.thoughtcrime.securesms.jobs.EmojiSearchIndexDownloadJob; +import org.thoughtcrime.securesms.storage.StorageSyncHelper; + +/** + * Added for when we started syncing contact names in storage service. + * Rotates the storageId of every system contact and then schedules a storage sync. + */ +public final class StorageServiceSystemNameMigrationJob extends MigrationJob { + + public static final String KEY = "StorageServiceSystemNameMigrationJob"; + + StorageServiceSystemNameMigrationJob() { + this(new Parameters.Builder().build()); + } + + private StorageServiceSystemNameMigrationJob(@NonNull Parameters parameters) { + super(parameters); + } + + @Override + public boolean isUiBlocking() { + return false; + } + + @Override + public @NonNull String getFactoryKey() { + return KEY; + } + + @Override + public void performMigration() { + SignalDatabase.recipients().markAllSystemContactsNeedsSync(); + StorageSyncHelper.scheduleSyncForDataChange(); + } + + @Override + boolean shouldRetry(@NonNull Exception e) { + return false; + } + + public static class Factory implements Job.Factory { + @Override + public @NonNull StorageServiceSystemNameMigrationJob create(@NonNull Parameters parameters, @NonNull Data data) { + return new StorageServiceSystemNameMigrationJob(parameters); + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java index 95f04f6361..4e12945da7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java @@ -1,7 +1,5 @@ package org.thoughtcrime.securesms.storage; -import android.content.Context; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -17,7 +15,6 @@ import org.thoughtcrime.securesms.util.FeatureFlags; import org.whispersystems.signalservice.api.push.ACI; import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.storage.SignalContactRecord; import org.whispersystems.signalservice.api.util.OptionalUtil; import org.whispersystems.signalservice.internal.storage.protos.ContactRecord.IdentityState; @@ -122,15 +119,15 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor