From fb9887494809afd068a57936bfb8f4b1aabdbfa3 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 26 Feb 2021 10:10:22 -0500 Subject: [PATCH] Fix initialization of BlobProvider. --- .../securesms/providers/BlobProvider.java | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java index c8615ccfa79..37c3ab8968f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java @@ -172,7 +172,7 @@ public synchronized void delete(@NonNull Context context, @NonNull Uri uri) { return; } - Log.d(TAG, "Deleting " + uri); + Log.d(TAG, "Deleting " + getId(uri)); try { StorageType storageType = StorageType.decode(uri.getPathSegments().get(STORAGE_TYPE_PATH_SEGMENT)); @@ -185,13 +185,13 @@ public synchronized void delete(@NonNull Context context, @NonNull Uri uri) { File file = new File(getOrCreateDirectory(context, directory), buildFileName(id)); if (file.delete()) { - Log.d(TAG, "Successfully deleted " + uri); + Log.d(TAG, "Successfully deleted " + getId(uri)); } else { throw new IOException("File wasn't deleted."); } } } catch (IOException e) { - Log.w(TAG, "Failed to delete uri: " + uri, e); + Log.w(TAG, "Failed to delete uri: " + getId(uri), e); } } @@ -203,22 +203,26 @@ public synchronized void delete(@NonNull Context context, @NonNull Uri uri) { @AnyThread public synchronized void initialize(@NonNull Context context) { SignalExecutors.BOUNDED.execute(() -> { - File directory = getOrCreateDirectory(context, SINGLE_SESSION_DIRECTORY); - File[] files = directory.listFiles(); - - if (files != null) { - for (File file : files) { - if (file.delete()) { - Log.d(TAG, "Deleted single-session file: " + file.getName()); - } else { - Log.w(TAG, "Failed to delete single-session file! " + file.getName()); + synchronized (this) { + File directory = getOrCreateDirectory(context, SINGLE_SESSION_DIRECTORY); + File[] files = directory.listFiles(); + + if (files != null) { + for (File file : files) { + if (file.delete()) { + Log.d(TAG, "Deleted single-session file: " + file.getName()); + } else { + Log.w(TAG, "Failed to delete single-session file! " + file.getName()); + } } + } else { + Log.w(TAG, "Null directory listing!"); } - } else { - Log.w(TAG, "Null directory listing!"); - } - initialized = true; + Log.i(TAG, "Initialized."); + initialized = true; + notifyAll(); + } }); } @@ -247,6 +251,13 @@ public synchronized void initialize(@NonNull Context context) { return null; } + private static @Nullable String getId(@NonNull Uri uri) { + if (isAuthority(uri)) { + return uri.getPathSegments().get(ID_PATH_SEGMENT); + } + return null; + } + @WorkerThread public long calculateFileSize(@NonNull Context context, @NonNull Uri uri) { if (!isAuthority(uri)) { @@ -269,6 +280,8 @@ public static boolean isAuthority(@NonNull Uri uri) { private synchronized @NonNull Uri writeBlobSpecToDisk(@NonNull Context context, @NonNull BlobSpec blobSpec) throws IOException { + waitUntilInitialized(); + CountDownLatch latch = new CountDownLatch(1); AtomicReference exception = new AtomicReference<>(null); Uri uri = writeBlobSpecToDiskAsync(context, blobSpec, latch::countDown, e -> {