From 8f2c5d43dfa61c59dd377c2c3e6f20b00e82ffc7 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 12 May 2022 16:16:24 -0400 Subject: [PATCH] Fix system UI freeze with image notifications. --- .../securesms/providers/PartProvider.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java index 1c9167bcd1..716b0af51b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java @@ -21,13 +21,13 @@ import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; -import android.os.MemoryFile; import android.os.ParcelFileDescriptor; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.signal.core.util.StreamUtil; +import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.attachments.AttachmentId; @@ -35,10 +35,9 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.mms.PartUriParser; import org.thoughtcrime.securesms.service.KeyCachingService; -import org.thoughtcrime.securesms.util.MemoryFileUtil; -import org.thoughtcrime.securesms.util.Util; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -155,16 +154,25 @@ public final class PartProvider extends BaseContentProvider { } private ParcelFileDescriptor getParcelStreamForAttachment(AttachmentId attachmentId) throws IOException { - long plaintextLength = StreamUtil.getStreamLength(SignalDatabase.attachments().getAttachmentStream(attachmentId, 0)); - MemoryFile memoryFile = new MemoryFile(attachmentId.toString(), Util.toIntExact(plaintextLength)); + ParcelFileDescriptor[] reliablePipe = ParcelFileDescriptor.createReliablePipe(); - InputStream in = SignalDatabase.attachments().getAttachmentStream(attachmentId, 0); - OutputStream out = memoryFile.getOutputStream(); + SignalExecutors.BOUNDED_IO.execute(() -> { + try (OutputStream out = new FileOutputStream(reliablePipe[1].getFileDescriptor())) { + try(InputStream in = SignalDatabase.attachments().getAttachmentStream(attachmentId, 0)) { + StreamUtil.copy(in, out); + } catch (IOException e) { + Log.w(TAG, "Error providing file", e); + try { + reliablePipe[1].closeWithError(e.getMessage()); + } catch (IOException e2) { + Log.w(TAG, "Error closing pipe with error", e2); + } + } + } catch (IOException e) { + Log.w(TAG, "Error opening pipe for writing", e); + } + }); - StreamUtil.copy(in, out); - StreamUtil.close(out); - StreamUtil.close(in); - - return MemoryFileUtil.getParcelFileDescriptor(memoryFile); + return reliablePipe[0]; } }