mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 09:20:19 +01:00
Fix large message size calculation to use bytes.
This commit is contained in:
@@ -1,63 +0,0 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.thoughtcrime.securesms.mms.TextSlide;
|
||||
import org.thoughtcrime.securesms.providers.BlobProvider;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
|
||||
public final class MessageUtil {
|
||||
|
||||
private MessageUtil() {}
|
||||
|
||||
/**
|
||||
* @return If the message is longer than the allowed text size, this will return trimmed text with
|
||||
* an accompanying TextSlide. Otherwise it'll just return the original text.
|
||||
*/
|
||||
public static SplitResult getSplitMessage(@NonNull Context context, @NonNull String rawText, int maxPrimaryMessageSize) {
|
||||
String bodyText = rawText;
|
||||
Optional<TextSlide> textSlide = Optional.empty();
|
||||
|
||||
if (bodyText.length() > maxPrimaryMessageSize) {
|
||||
bodyText = rawText.substring(0, maxPrimaryMessageSize);
|
||||
|
||||
byte[] textData = rawText.getBytes();
|
||||
String timestamp = new SimpleDateFormat("yyyy-MM-dd-HHmmss", Locale.US).format(new Date());
|
||||
String filename = String.format("signal-%s.txt", timestamp);
|
||||
Uri textUri = BlobProvider.getInstance()
|
||||
.forData(textData)
|
||||
.withMimeType(MediaUtil.LONG_TEXT)
|
||||
.withFileName(filename)
|
||||
.createForSingleSessionInMemory();
|
||||
|
||||
textSlide = Optional.of(new TextSlide(context, textUri, filename, textData.length));
|
||||
}
|
||||
|
||||
return new SplitResult(bodyText, textSlide);
|
||||
}
|
||||
|
||||
public static class SplitResult {
|
||||
private final String body;
|
||||
private final Optional<TextSlide> textSlide;
|
||||
|
||||
private SplitResult(@NonNull String body, @NonNull Optional<TextSlide> textSlide) {
|
||||
this.body = body;
|
||||
this.textSlide = textSlide;
|
||||
}
|
||||
|
||||
public @NonNull String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public @NonNull Optional<TextSlide> getTextSlide() {
|
||||
return textSlide;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package org.thoughtcrime.securesms.util
|
||||
|
||||
import android.content.Context
|
||||
import org.signal.core.util.splitByByteLength
|
||||
import org.thoughtcrime.securesms.mms.TextSlide
|
||||
import org.thoughtcrime.securesms.providers.BlobProvider
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
import java.util.Optional
|
||||
|
||||
object MessageUtil {
|
||||
const val MAX_MESSAGE_SIZE_BYTES: Int = 2000 // Technically 2048, but we'll play it a little safe
|
||||
|
||||
/**
|
||||
* @return If the message is longer than the allowed text size, this will return trimmed text with
|
||||
* an accompanying TextSlide. Otherwise it'll just return the original text.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun getSplitMessage(context: Context, rawText: String): SplitResult {
|
||||
val (trimmed, remainder) = rawText.splitByByteLength(MAX_MESSAGE_SIZE_BYTES)
|
||||
|
||||
return if (remainder != null) {
|
||||
val textData = rawText.toByteArray()
|
||||
val timestamp = SimpleDateFormat("yyyy-MM-dd-HHmmss", Locale.US).format(Date())
|
||||
val filename = String.format("signal-%s.txt", timestamp)
|
||||
val textUri = BlobProvider.getInstance()
|
||||
.forData(textData)
|
||||
.withMimeType(MediaUtil.LONG_TEXT)
|
||||
.withFileName(filename)
|
||||
.createForSingleSessionInMemory()
|
||||
|
||||
val textSlide = Optional.of(TextSlide(context, textUri, filename, textData.size.toLong()))
|
||||
|
||||
SplitResult(trimmed, textSlide)
|
||||
} else {
|
||||
SplitResult(trimmed, Optional.empty())
|
||||
}
|
||||
}
|
||||
|
||||
data class SplitResult(
|
||||
val body: String,
|
||||
val textSlide: Optional<TextSlide>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user