From 867e95eef11d470d784054f454e81d0dba2177bb Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 9 Sep 2020 11:15:34 -0400 Subject: [PATCH] Re-download sticker if backing file data no longer exists. --- .../securesms/database/StickerDatabase.java | 7 +++++++ .../securesms/jobs/StickerDownloadJob.java | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java index 77588d49d..7edcc1e0e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.stickers.BlessedPacks; import org.thoughtcrime.securesms.stickers.StickerPackInstallEvent; import org.thoughtcrime.securesms.util.CursorUtil; +import org.thoughtcrime.securesms.util.SqlUtil; import org.thoughtcrime.securesms.util.Util; import java.io.Closeable; @@ -105,6 +106,12 @@ public class StickerDatabase extends Database { contentValues.put(FILE_RANDOM, fileInfo.getRandom()); long id = databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, contentValues); + if (id == -1) { + String selection = PACK_ID + " = ? AND " + STICKER_ID + " = ? AND " + COVER + " = ?"; + String[] args = SqlUtil.buildArgs(sticker.getPackId(), sticker.getStickerId(), (sticker.isCover() ? 1 : 0)); + + id = databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, selection, args); + } if (id > 0) { notifyStickerListeners(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java index 37a30a024..a8c8ba682 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java @@ -5,15 +5,18 @@ import androidx.annotation.NonNull; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.StickerDatabase; import org.thoughtcrime.securesms.database.model.IncomingSticker; +import org.thoughtcrime.securesms.database.model.StickerRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.util.Hex; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; +import java.io.FileNotFoundException; import java.io.InputStream; import java.util.concurrent.TimeUnit; @@ -76,9 +79,16 @@ public class StickerDownloadJob extends BaseJob { protected void onRun() throws Exception { StickerDatabase db = DatabaseFactory.getStickerDatabase(context); - if (db.getSticker(sticker.getPackId(), sticker.getStickerId(), sticker.isCover()) != null) { - Log.w(TAG, "Sticker already downloaded."); - return; + StickerRecord stickerRecord = db.getSticker(sticker.getPackId(), sticker.getStickerId(), sticker.isCover()); + if (stickerRecord != null) { + try (InputStream stream = PartAuthority.getAttachmentStream(context, stickerRecord.getUri())) { + if (stream != null) { + Log.w(TAG, "Sticker already downloaded."); + return; + } + } catch (FileNotFoundException e) { + Log.w(TAG, "Sticker file no longer exists, downloading again."); + } } if (!db.isPackInstalled(sticker.getPackId()) && !sticker.isCover()) {