diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt index b5ebfc9a53..43a675a2ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt @@ -77,6 +77,7 @@ import org.signal.core.ui.compose.Rows import org.signal.core.ui.compose.SignalPreview import org.signal.core.ui.compose.Snackbars import org.signal.core.ui.compose.TextFields.TextField +import org.signal.core.util.Base64 import org.signal.core.util.Hex import org.signal.core.util.getLength import org.thoughtcrime.securesms.R @@ -462,6 +463,15 @@ fun Screen( } ) + Rows.TextRow( + text = "Copy Media Backup ID", + label = "Copies the Media Backup ID, Base64 encoded; it can be used to identify your media backup on the server.", + onClick = { + Util.copyToClipboard(context, Base64.encodeWithoutPadding(SignalStore.backup.mediaRootBackupKey.deriveBackupId(SignalStore.account.requireAci()).value)) + Toast.makeText(context, "Copied!", Toast.LENGTH_SHORT).show() + } + ) + Dividers.Default() Text( diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/backup/MediaRootBackupKey.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/backup/MediaRootBackupKey.kt index 84cd7cf22b..7cea37fcb6 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/backup/MediaRootBackupKey.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/backup/MediaRootBackupKey.kt @@ -51,6 +51,15 @@ class MediaRootBackupKey(override val value: ByteArray) : BackupKey { ) } + /** + * Identifies a the location of a user's backup. + */ + fun deriveBackupId(aci: ACI): BackupId { + return BackupId( + LibSignalBackupKey(value).deriveBackupId(aci.libSignalAci) + ) + } + class MediaKeyMaterial( val id: MediaId, val macKey: ByteArray,