Fix wallpaper migration getting stuck on malformed files.

Closes #13769
This commit is contained in:
Greyson Parrelli 2024-11-04 09:14:27 -05:00
parent bdd19f6b47
commit 3a5dc4e731
2 changed files with 28 additions and 5 deletions

View file

@ -2061,7 +2061,18 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
* Migrates all recipients using [legacyUri] for their wallpaper to [newUri]. * Migrates all recipients using [legacyUri] for their wallpaper to [newUri].
* Needed for an app migration. * Needed for an app migration.
*/ */
fun migrateWallpaperUri(legacyUri: Uri, newUri: Uri): Int { fun migrateWallpaperUri(legacyUri: Uri, newUri: Uri?): Int {
if (newUri == null) {
return writableDatabase
.update(TABLE_NAME)
.values(
WALLPAPER to null,
WALLPAPER_URI to null
)
.where("$WALLPAPER_URI = ?", legacyUri)
.run()
}
val newWallpaper = ChatWallpaperFactory.create(newUri) val newWallpaper = ChatWallpaperFactory.create(newUri)
return writableDatabase return writableDatabase

View file

@ -50,13 +50,25 @@ internal class WallpaperStorageMigrationJob(parameters: Parameters = Parameters.
val currentDefaultWallpaperUri = SignalStore.wallpaper.currentRawWallpaper?.file_?.uri val currentDefaultWallpaperUri = SignalStore.wallpaper.currentRawWallpaper?.file_?.uri
for (filename in wallpaperFileNames) { for (filename in wallpaperFileNames) {
val inputStream = FileStorage.read(context, DIRECTORY, filename) val legacyUri = Uri.withAppendedPath(CONTENT_URI, filename)
val wallpaperAttachmentId = SignalDatabase.attachments.insertWallpaper(inputStream)
val directory = context.getDir(DIRECTORY, Context.MODE_PRIVATE) val directory = context.getDir(DIRECTORY, Context.MODE_PRIVATE)
val file = File(directory, filename) val file = File(directory, filename)
val legacyUri = Uri.withAppendedPath(CONTENT_URI, filename) val inputStream = try {
FileStorage.read(context, DIRECTORY, filename)
} catch (e: IOException) {
Log.w(TAG, "Failed to read $filename! Clearing references.")
val updatedUserCount = SignalDatabase.recipients.migrateWallpaperUri(
legacyUri = legacyUri,
newUri = null
)
Log.d(TAG, "Wallpaper with name '$filename' was in use by $updatedUserCount recipients.")
file.delete()
continue
}
val wallpaperAttachmentId = SignalDatabase.attachments.insertWallpaper(inputStream)
val newUri = PartAuthority.getAttachmentDataUri(wallpaperAttachmentId) val newUri = PartAuthority.getAttachmentDataUri(wallpaperAttachmentId)
val updatedUserCount = SignalDatabase.recipients.migrateWallpaperUri( val updatedUserCount = SignalDatabase.recipients.migrateWallpaperUri(