Render gifs in gif search as MP4s.

This commit is contained in:
Alex Hart
2021-04-14 16:44:03 -03:00
committed by Greyson Parrelli
parent fcc5db2fe6
commit c31146e902
94 changed files with 2062 additions and 273 deletions

View File

@@ -314,7 +314,7 @@ public class AttachmentManager {
}
Log.d(TAG, "remote slide with size " + fileSize + " took " + (System.currentTimeMillis() - start) + "ms");
return mediaType.createSlide(context, uri, fileName, mimeType, null, fileSize, width, height);
return mediaType.createSlide(context, uri, fileName, mimeType, null, fileSize, width, height, false);
}
} finally {
if (cursor != null) cursor.close();
@@ -328,11 +328,13 @@ public class AttachmentManager {
Long mediaSize = null;
String fileName = null;
String mimeType = null;
boolean gif = false;
if (PartAuthority.isLocalUri(uri)) {
mediaSize = PartAuthority.getAttachmentSize(context, uri);
fileName = PartAuthority.getAttachmentFileName(context, uri);
mimeType = PartAuthority.getAttachmentContentType(context, uri);
gif = PartAuthority.getAttachmentIsVideoGif(context, uri);
}
if (mediaSize == null) {
@@ -350,7 +352,7 @@ public class AttachmentManager {
}
Log.d(TAG, "local slide with size " + mediaSize + " took " + (System.currentTimeMillis() - start) + "ms");
return mediaType.createSlide(context, uri, fileName, mimeType, null, mediaSize, width, height);
return mediaType.createSlide(context, uri, fileName, mimeType, null, mediaSize, width, height, gif);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

View File

@@ -33,11 +33,11 @@ import org.thoughtcrime.securesms.util.MediaUtil;
public class AudioSlide extends Slide {
public AudioSlide(Context context, Uri uri, long dataSize, boolean voiceNote) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.AUDIO_UNSPECIFIED, dataSize, 0, 0, false, null, null, null, null, null, voiceNote, false, false));
super(context, constructAttachmentFromUri(context, uri, MediaUtil.AUDIO_UNSPECIFIED, dataSize, 0, 0, false, null, null, null, null, null, voiceNote, false, false, false));
}
public AudioSlide(Context context, Uri uri, long dataSize, String contentType, boolean voiceNote) {
super(context, new UriAttachment(uri, contentType, AttachmentDatabase.TRANSFER_PROGRESS_STARTED, dataSize, 0, 0, null, null, voiceNote, false, false, null, null, null, null, null));
super(context, new UriAttachment(uri, contentType, AttachmentDatabase.TRANSFER_PROGRESS_STARTED, dataSize, 0, 0, null, null, voiceNote, false, false, false, null, null, null, null, null));
}
public AudioSlide(Context context, Attachment attachment) {

View File

@@ -20,7 +20,7 @@ public class DocumentSlide extends Slide {
@NonNull String contentType, long size,
@Nullable String fileName)
{
super(context, constructAttachmentFromUri(context, uri, contentType, size, 0, 0, true, StorageUtil.getCleanFileName(fileName), null, null, null, null, false, false, false));
super(context, constructAttachmentFromUri(context, uri, contentType, size, 0, 0, true, StorageUtil.getCleanFileName(fileName), null, null, null, null, false, false, false, false));
}
@Override

View File

@@ -22,7 +22,7 @@ public class GifSlide extends ImageSlide {
}
public GifSlide(Context context, Uri uri, long size, int width, int height, boolean borderless, @Nullable String caption) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_GIF, size, width, height, true, null, caption, null, null, null, false, borderless, false));
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_GIF, size, width, height, true, null, caption, null, null, null, false, borderless, false, false));
this.borderless = borderless;
}

View File

@@ -47,7 +47,7 @@ public class ImageSlide extends Slide {
}
public ImageSlide(Context context, Uri uri, String contentType, long size, int width, int height, boolean borderless, @Nullable String caption, @Nullable BlurHash blurHash) {
super(context, constructAttachmentFromUri(context, uri, contentType, size, width, height, true, null, caption, null, blurHash, null, false, borderless, false));
super(context, constructAttachmentFromUri(context, uri, contentType, size, width, height, true, null, caption, null, blurHash, null, false, borderless, false, false));
this.borderless = borderless;
}

View File

@@ -126,6 +126,20 @@ public class PartAuthority {
}
}
public static boolean getAttachmentIsVideoGif(@NonNull Context context, @NonNull Uri uri) {
int match = uriMatcher.match(uri);
switch (match) {
case PART_ROW:
Attachment attachment = DatabaseFactory.getAttachmentDatabase(context).getAttachment(new PartUriParser(uri).getPartId());
if (attachment != null) return attachment.isVideoGif();
else return false;
default:
return false;
}
}
public static Uri getAttachmentPublicUri(Uri uri) {
PartUriParser partUri = new PartUriParser(uri);
return PartProvider.getContentUri(partUri.getPartId());

View File

@@ -118,6 +118,10 @@ public abstract class Slide {
return false;
}
public boolean isVideoGif() {
return hasVideo() && attachment.isVideoGif();
}
public @NonNull String getContentDescription() { return ""; }
public @NonNull Attachment asAttachment() {
@@ -167,9 +171,10 @@ public abstract class Slide {
@Nullable AudioHash audioHash,
boolean voiceNote,
boolean borderless,
boolean gif,
boolean quote)
{
return constructAttachmentFromUri(context, uri, defaultMime, size, width, height, hasThumbnail, fileName, caption, stickerLocator, blurHash, audioHash, voiceNote, borderless, quote, null);
return constructAttachmentFromUri(context, uri, defaultMime, size, width, height, hasThumbnail, fileName, caption, stickerLocator, blurHash, audioHash, voiceNote, borderless, gif, quote, null);
}
protected static Attachment constructAttachmentFromUri(@NonNull Context context,
@@ -186,6 +191,7 @@ public abstract class Slide {
@Nullable AudioHash audioHash,
boolean voiceNote,
boolean borderless,
boolean gif,
boolean quote,
@Nullable AttachmentDatabase.TransformProperties transformProperties)
{
@@ -201,6 +207,7 @@ public abstract class Slide {
fastPreflightId,
voiceNote,
borderless,
gif,
quote,
caption,
stickerLocator,

View File

@@ -77,7 +77,7 @@ public final class SlideFactory {
}
Log.d(TAG, "remote slide with size " + fileSize + " took " + (System.currentTimeMillis() - start) + "ms");
return mediaType.createSlide(context, uri, fileName, mimeType, null, fileSize, width, height);
return mediaType.createSlide(context, uri, fileName, mimeType, null, fileSize, width, height, false);
}
} finally {
if (cursor != null) cursor.close();
@@ -91,11 +91,13 @@ public final class SlideFactory {
Long mediaSize = null;
String fileName = null;
String mimeType = null;
boolean gif = false;
if (PartAuthority.isLocalUri(uri)) {
mediaSize = PartAuthority.getAttachmentSize(context, uri);
fileName = PartAuthority.getAttachmentFileName(context, uri);
mimeType = PartAuthority.getAttachmentContentType(context, uri);
gif = PartAuthority.getAttachmentIsVideoGif(context, uri);
}
if (mediaSize == null) {
@@ -113,7 +115,7 @@ public final class SlideFactory {
}
Log.d(TAG, "local slide with size " + mediaSize + " took " + (System.currentTimeMillis() - start) + "ms");
return mediaType.createSlide(context, uri, fileName, mimeType, null, mediaSize, width, height);
return mediaType.createSlide(context, uri, fileName, mimeType, null, mediaSize, width, height, gif);
}
public enum MediaType {
@@ -139,7 +141,8 @@ public final class SlideFactory {
@Nullable BlurHash blurHash,
long dataSize,
int width,
int height)
int height,
boolean gif)
{
if (mimeType == null) {
mimeType = "application/octet-stream";
@@ -149,7 +152,7 @@ public final class SlideFactory {
case IMAGE: return new ImageSlide(context, uri, dataSize, width, height, blurHash);
case GIF: return new GifSlide(context, uri, dataSize, width, height);
case AUDIO: return new AudioSlide(context, uri, dataSize, false);
case VIDEO: return new VideoSlide(context, uri, dataSize);
case VIDEO: return new VideoSlide(context, uri, dataSize, gif);
case VCARD:
case DOCUMENT: return new DocumentSlide(context, uri, mimeType, dataSize, fileName);
default: throw new AssertionError("unrecognized enum");

View File

@@ -27,7 +27,7 @@ public class StickerSlide extends Slide {
}
public StickerSlide(Context context, Uri uri, long size, @NonNull StickerLocator stickerLocator, @NonNull String contentType) {
super(context, constructAttachmentFromUri(context, uri, contentType, size, WIDTH, HEIGHT, true, null, null, stickerLocator, null, null, false, false, false));
super(context, constructAttachmentFromUri(context, uri, contentType, size, WIDTH, HEIGHT, true, null, null, stickerLocator, null, null, false, false, false, false));
this.stickerLocator = Objects.requireNonNull(attachment.getSticker());
}

View File

@@ -17,6 +17,6 @@ public class TextSlide extends Slide {
}
public TextSlide(@NonNull Context context, @NonNull Uri uri, @Nullable String filename, long size) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.LONG_TEXT, size, 0, 0, true, filename, null, null, null, null, false, false, false));
super(context, constructAttachmentFromUri(context, uri, MediaUtil.LONG_TEXT, size, 0, 0, true, filename, null, null, null, null, false, false, false, false));
}
}

View File

@@ -31,16 +31,16 @@ import org.thoughtcrime.securesms.util.MediaUtil;
public class VideoSlide extends Slide {
public VideoSlide(Context context, Uri uri, long dataSize) {
this(context, uri, dataSize, null, null);
public VideoSlide(Context context, Uri uri, long dataSize, boolean gif) {
this(context, uri, dataSize, gif, null, null);
}
public VideoSlide(Context context, Uri uri, long dataSize, @Nullable String caption, @Nullable AttachmentDatabase.TransformProperties transformProperties) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, 0, 0, MediaUtil.hasVideoThumbnail(context, uri), null, caption, null, null, null, false, false, false, transformProperties));
public VideoSlide(Context context, Uri uri, long dataSize, boolean gif, @Nullable String caption, @Nullable AttachmentDatabase.TransformProperties transformProperties) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, 0, 0, MediaUtil.hasVideoThumbnail(context, uri), null, caption, null, null, null, false, false, gif, false, transformProperties));
}
public VideoSlide(Context context, Uri uri, long dataSize, int width, int height, @Nullable String caption, @Nullable AttachmentDatabase.TransformProperties transformProperties) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, width, height, MediaUtil.hasVideoThumbnail(context, uri), null, caption, null, null, null, false, false, false, transformProperties));
public VideoSlide(Context context, Uri uri, long dataSize, boolean gif, int width, int height, @Nullable String caption, @Nullable AttachmentDatabase.TransformProperties transformProperties) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, width, height, MediaUtil.hasVideoThumbnail(context, uri), null, caption, null, null, null, false, false, gif, false, transformProperties));
}
public VideoSlide(Context context, Attachment attachment) {