From 282639469d94a0df9f02f4cfe3c5443d8936c147 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 21 Dec 2021 15:33:35 -0400 Subject: [PATCH] Ensure unique names are used when saving batches of files. --- .../securesms/util/SaveAttachmentTask.java | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java index 5d9e091f3..908711677 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java @@ -18,6 +18,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import org.signal.core.util.MapUtil; import org.signal.core.util.StreamUtil; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; @@ -32,8 +33,12 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.WeakReference; import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; public class SaveAttachmentTask extends ProgressDialogAsyncTask> { @@ -47,6 +52,8 @@ public class SaveAttachmentTask extends ProgressDialogAsyncTask> batchOperationNameCache = new HashMap<>(); + public SaveAttachmentTask(Context context) { this(context, 1); } @@ -94,8 +101,15 @@ public class SaveAttachmentTask extends ProgressDialogAsyncTask pathSet = MapUtil.getOrDefault(batchOperationNameCache, outputUri, new HashSet<>()); + if (!pathSet.add(dataPath)) { + throw new IllegalStateException("Path already used in data set."); + } + + batchOperationNameCache.put(outputUri, pathSet); + } + + private boolean pathInCache(@NonNull Uri outputUri, @NonNull String dataPath) { + Set pathSet = batchOperationNameCache.get(outputUri); + if (pathSet == null) { + return false; + } + + return pathSet.contains(dataPath); + } + private boolean pathTaken(@NonNull Uri outputUri, @NonNull String dataPath) throws IOException { try (Cursor cursor = getContext().getContentResolver().query(outputUri, new String[] { MediaStore.MediaColumns.DATA },