diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java index 89d282eb57..b86be74aea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java @@ -62,7 +62,7 @@ public class PushMediaConstraints extends MediaConstraints { @Override public long getUncompressedVideoMaxSize(Context context) { - return isVideoTranscodeAvailable() ? 500 * MB + return isVideoTranscodeAvailable() ? RemoteConfig.maxSourceTranscodeVideoSizeBytes() : getVideoMaxSize(context); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt index 3fb03338d3..7e2d86e92d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareActivity.kt @@ -18,6 +18,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.Result import org.signal.core.util.concurrent.LifecycleDisposable +import org.signal.core.util.concurrent.addTo import org.signal.core.util.getParcelableArrayListCompat import org.signal.core.util.getParcelableArrayListExtraCompat import org.signal.core.util.getParcelableExtraCompat @@ -25,6 +26,7 @@ import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.MainActivity import org.thoughtcrime.securesms.PassphraseRequiredActivity import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.SignalProgressDialog import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversation.ConversationIntents import org.thoughtcrime.securesms.conversation.MessageSendType @@ -42,6 +44,7 @@ import org.thoughtcrime.securesms.util.ConversationUtil import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme import org.thoughtcrime.securesms.util.visible import java.util.Optional +import java.util.concurrent.TimeUnit class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.Callback { @@ -123,6 +126,22 @@ class ShareActivity : PassphraseRequiredActivity(), MultiselectForwardFragment.C } } + var dialog: SignalProgressDialog? = null + viewModel + .state + .debounce(500, TimeUnit.MILLISECONDS) + .onErrorComplete() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy { state -> + if (state.loadState == ShareState.ShareDataLoadState.Init) { + dialog = SignalProgressDialog.show(this, indeterminate = true) + } else { + dialog?.dismiss() + dialog = null + } + } + .addTo(lifecycleDisposable) + lifecycleDisposable += viewModel.state.observeOn(AndroidSchedulers.mainThread()).subscribe { shareState -> when (shareState.loadState) { ShareState.ShareDataLoadState.Init -> Unit diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 90edbf4007..108f29efcb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -869,6 +869,15 @@ object RemoteConfig { hotSwappable = true ) + /** Maximum input size when opening a video to send in bytes */ + @JvmStatic + @get:JvmName("maxSourceTranscodeVideoSizeBytes") + val maxSourceTranscodeVideoSizeBytes: Long by remoteLong( + key = "android.media.sourceTranscodeVideo.maxBytes", + defaultValue = 500L.mebiBytes.inWholeBytes, + hotSwappable = true + ) + const val PROMPT_FOR_NOTIFICATION_LOGS: String = "android.logs.promptNotifications" @JvmStatic diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/DigestingOutputStream.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/DigestingOutputStream.java index 51322b0f84..69c8a36164 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/DigestingOutputStream.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/crypto/DigestingOutputStream.java @@ -12,6 +12,7 @@ public abstract class DigestingOutputStream extends FilterOutputStream { private final MessageDigest runningDigest; private byte[] digest; + private long totalBytesWritten = 0; public DigestingOutputStream(OutputStream outputStream) { super(outputStream); @@ -27,16 +28,19 @@ public abstract class DigestingOutputStream extends FilterOutputStream { public void write(byte[] buffer) throws IOException { runningDigest.update(buffer, 0, buffer.length); out.write(buffer, 0, buffer.length); + totalBytesWritten += buffer.length; } public void write(byte[] buffer, int offset, int length) throws IOException { runningDigest.update(buffer, offset, length); out.write(buffer, offset, length); + totalBytesWritten += length; } public void write(int b) throws IOException { runningDigest.update((byte)b); out.write(b); + totalBytesWritten++; } public void flush() throws IOException { @@ -52,4 +56,7 @@ public abstract class DigestingOutputStream extends FilterOutputStream { return digest; } + public long getTotalBytesWritten() { + return totalBytesWritten; + } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/http/DigestingRequestBody.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/http/DigestingRequestBody.kt index cb455c9672..b1475a6978 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/http/DigestingRequestBody.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/http/DigestingRequestBody.kt @@ -52,22 +52,20 @@ class DigestingRequestBody( val buffer = ByteArray(8192) var read: Int - var total: Long = 0 while (inputStream.read(buffer, 0, buffer.size).also { read = it } != -1) { if (cancelationSignal?.isCanceled == true) { throw IOException("Canceled!") } outputStream.write(buffer, 0, read) - total += read.toLong() - progressListener?.onAttachmentProgress(contentLength, total) + progressListener?.onAttachmentProgress(contentLength, outputStream.totalBytesWritten) } outputStream.flush() val incrementalDigest: ByteArray = if (isIncremental) { - if (contentLength != total) { - Log.w(TAG, "Content uploaded ${logMessage(total, contentLength)} bytes compared to expected!") + if (contentLength != outputStream.totalBytesWritten) { + Log.w(TAG, "Content uploaded ${logMessage(outputStream.totalBytesWritten, contentLength)} bytes compared to expected!") } else { Log.d(TAG, "Wrote the expected number of bytes.") }