kopia lustrzana https://github.com/ryukoposting/Signal-Android
Respect proper media upload requirements for stories.
rodzic
92201dcd90
commit
ba7319e215
|
@ -37,6 +37,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.signal.core.util.CursorUtil;
|
import org.signal.core.util.CursorUtil;
|
||||||
|
import org.signal.core.util.SetUtil;
|
||||||
import org.signal.core.util.SqlUtil;
|
import org.signal.core.util.SqlUtil;
|
||||||
import org.signal.core.util.StreamUtil;
|
import org.signal.core.util.StreamUtil;
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
|
@ -59,7 +60,6 @@ import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.FileUtils;
|
import org.thoughtcrime.securesms.util.FileUtils;
|
||||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||||
import org.signal.core.util.SetUtil;
|
|
||||||
import org.thoughtcrime.securesms.util.StorageUtil;
|
import org.thoughtcrime.securesms.util.StorageUtil;
|
||||||
import org.thoughtcrime.securesms.video.EncryptedMediaDataSource;
|
import org.thoughtcrime.securesms.video.EncryptedMediaDataSource;
|
||||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||||
|
|
|
@ -88,10 +88,13 @@ class MediaSelectionRepository(context: Context) {
|
||||||
throw IllegalStateException("No selected media!")
|
throw IllegalStateException("No selected media!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val isSendingToStories = singleContact?.isStory == true || contacts.any { it.isStory }
|
||||||
|
val sentMediaQuality = if (isSendingToStories) SentMediaQuality.STANDARD else quality
|
||||||
|
|
||||||
return Maybe.create<MediaSendActivityResult> { emitter ->
|
return Maybe.create<MediaSendActivityResult> { emitter ->
|
||||||
val trimmedBody: String = if (isViewOnce) "" else getTruncatedBody(message?.toString()?.trim()) ?: ""
|
val trimmedBody: String = if (isViewOnce) "" else getTruncatedBody(message?.toString()?.trim()) ?: ""
|
||||||
val trimmedMentions: List<Mention> = if (isViewOnce) emptyList() else mentions
|
val trimmedMentions: List<Mention> = if (isViewOnce) emptyList() else mentions
|
||||||
val modelsToTransform: Map<Media, MediaTransform> = buildModelsToTransform(selectedMedia, stateMap, quality)
|
val modelsToTransform: Map<Media, MediaTransform> = buildModelsToTransform(selectedMedia, stateMap, sentMediaQuality)
|
||||||
val oldToNewMediaMap: Map<Media, Media> = MediaRepository.transformMediaSync(context, selectedMedia, modelsToTransform)
|
val oldToNewMediaMap: Map<Media, Media> = MediaRepository.transformMediaSync(context, selectedMedia, modelsToTransform)
|
||||||
val updatedMedia = oldToNewMediaMap.values.toList()
|
val updatedMedia = oldToNewMediaMap.values.toList()
|
||||||
|
|
||||||
|
@ -128,7 +131,7 @@ class MediaSelectionRepository(context: Context) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val clippedVideosForStories: List<Media> = if (singleContact?.isStory == true || contacts.any { it.isStory }) {
|
val clippedVideosForStories: List<Media> = if (isSendingToStories) {
|
||||||
updatedMedia.filter {
|
updatedMedia.filter {
|
||||||
Stories.MediaTransform.getSendRequirements(it) == Stories.MediaTransform.SendRequirements.REQUIRES_CLIP
|
Stories.MediaTransform.getSendRequirements(it) == Stories.MediaTransform.SendRequirements.REQUIRES_CLIP
|
||||||
}.map { media ->
|
}.map { media ->
|
||||||
|
@ -136,20 +139,12 @@ class MediaSelectionRepository(context: Context) {
|
||||||
}.flatten()
|
}.flatten()
|
||||||
} else emptyList()
|
} else emptyList()
|
||||||
|
|
||||||
val lowResImagesForStories: List<Media> = if (singleContact?.isStory == true || contacts.any { it.isStory }) {
|
|
||||||
updatedMedia.filter {
|
|
||||||
Stories.MediaTransform.hasHighQualityTransform(it)
|
|
||||||
}.map {
|
|
||||||
Media.stripTransform(it)
|
|
||||||
}
|
|
||||||
} else emptyList()
|
|
||||||
|
|
||||||
uploadRepository.applyMediaUpdates(oldToNewMediaMap, singleRecipient)
|
uploadRepository.applyMediaUpdates(oldToNewMediaMap, singleRecipient)
|
||||||
uploadRepository.updateCaptions(updatedMedia)
|
uploadRepository.updateCaptions(updatedMedia)
|
||||||
uploadRepository.updateDisplayOrder(updatedMedia)
|
uploadRepository.updateDisplayOrder(updatedMedia)
|
||||||
uploadRepository.getPreUploadResults { uploadResults ->
|
uploadRepository.getPreUploadResults { uploadResults ->
|
||||||
if (contacts.isNotEmpty()) {
|
if (contacts.isNotEmpty()) {
|
||||||
sendMessages(contacts, splitBody, uploadResults, trimmedMentions, isViewOnce, clippedVideosForStories + lowResImagesForStories)
|
sendMessages(contacts, splitBody, uploadResults, trimmedMentions, isViewOnce, clippedVideosForStories)
|
||||||
uploadRepository.deleteAbandonedAttachments()
|
uploadRepository.deleteAbandonedAttachments()
|
||||||
emitter.onComplete()
|
emitter.onComplete()
|
||||||
} else if (uploadResults.isNotEmpty()) {
|
} else if (uploadResults.isNotEmpty()) {
|
||||||
|
@ -338,7 +333,7 @@ class MediaSelectionRepository(context: Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nonStoryMessages.isNotEmpty()) {
|
if (nonStoryMessages.isNotEmpty()) {
|
||||||
Log.d(TAG, "Sending ${nonStoryMessages.size} non-story preupload messages")
|
Log.d(TAG, "Sending ${nonStoryMessages.size} preupload messages to chats")
|
||||||
MessageSender.sendMediaBroadcast(
|
MessageSender.sendMediaBroadcast(
|
||||||
context,
|
context,
|
||||||
nonStoryMessages,
|
nonStoryMessages,
|
||||||
|
@ -355,7 +350,7 @@ class MediaSelectionRepository(context: Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (storyClipMessages.isNotEmpty()) {
|
if (storyClipMessages.isNotEmpty()) {
|
||||||
Log.d(TAG, "Sending ${storyClipMessages.size} clip messages to stories")
|
Log.d(TAG, "Sending ${storyClipMessages.size} video clip messages to stories")
|
||||||
MessageSender.sendStories(context, storyClipMessages, null, null)
|
MessageSender.sendStories(context, storyClipMessages, null, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,6 @@ import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -152,6 +151,7 @@ public class MessageSender {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
database.beginTransaction();
|
database.beginTransaction();
|
||||||
|
|
||||||
for (OutgoingSecureMediaMessage message : messages) {
|
for (OutgoingSecureMediaMessage message : messages) {
|
||||||
long allocatedThreadId = threadDatabase.getOrCreateValidThreadId(message.getRecipient(), -1L, message.getDistributionType());
|
long allocatedThreadId = threadDatabase.getOrCreateValidThreadId(message.getRecipient(), -1L, message.getDistributionType());
|
||||||
Recipient recipient = message.getRecipient();
|
Recipient recipient = message.getRecipient();
|
||||||
|
|
|
@ -186,20 +186,12 @@ object Stories {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
fun canPreUploadMedia(media: Media): Boolean {
|
fun canPreUploadMedia(media: Media): Boolean {
|
||||||
return if (MediaUtil.isVideo(media.mimeType)) {
|
return when {
|
||||||
getSendRequirements(media) != SendRequirements.REQUIRES_CLIP
|
MediaUtil.isVideo(media.mimeType) -> getSendRequirements(media) != SendRequirements.REQUIRES_CLIP
|
||||||
} else {
|
else -> true
|
||||||
!hasHighQualityTransform(media)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checkst to see if the given media has the "High Quality" toggled in its transform properties.
|
|
||||||
*/
|
|
||||||
fun hasHighQualityTransform(media: Media): Boolean {
|
|
||||||
return MediaUtil.isImageType(media.mimeType) && media.transformProperties.map { it.sentMediaQuality == SentMediaQuality.HIGH.code }.orElse(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
fun getSendRequirements(media: Media): SendRequirements {
|
fun getSendRequirements(media: Media): SendRequirements {
|
||||||
|
|
Ładowanie…
Reference in New Issue