diff --git a/lib/media/media-utils.js b/lib/media/media-utils.js --- a/lib/media/media-utils.js +++ b/lib/media/media-utils.js @@ -7,6 +7,7 @@ MultimediaMessageInfo, RawMultimediaMessageInfo, } from '../types/message-types.js'; +import { isBlobServiceURI } from '../utils/blob-service.js'; const maxDimensions = Object.freeze({ width: 1920, height: 1920 }); @@ -36,6 +37,15 @@ return `some ${firstType}s`; } +function isMediaBlobServiceHosted(media: Media): boolean { + return ( + (!!media.uri && isBlobServiceURI(media.uri)) || + (!!media.holder && isBlobServiceURI(media.holder)) || + (!!media.thumbnailURI && isBlobServiceURI(media.thumbnailURI)) || + (!!media.thumbnailHolder && isBlobServiceURI(media.thumbnailHolder)) + ); +} + function multimediaMessagePreview( messageInfo: MultimediaMessageInfo | RawMultimediaMessageInfo, ): string { @@ -59,5 +69,6 @@ contentStringForMediaArray, multimediaMessagePreview, isLocalUploadID, + isMediaBlobServiceHosted, getNextLocalUploadID, }; diff --git a/lib/shared/messages/multimedia-message-spec.js b/lib/shared/messages/multimedia-message-spec.js --- a/lib/shared/messages/multimedia-message-spec.js +++ b/lib/shared/messages/multimedia-message-spec.js @@ -10,6 +10,7 @@ } from './message-spec.js'; import { joinResult } from './utils.js'; import { + isMediaBlobServiceHosted, contentStringForMediaArray, multimediaMessagePreview, } from '../../media/media-utils.js'; @@ -49,7 +50,7 @@ } from '../../utils/message-ops-utils.js'; import { createMediaMessageInfo } from '../message-utils.js'; import { threadIsGroupChat } from '../thread-utils.js'; -import { hasMinCodeVersion } from '../version-utils.js'; +import { FUTURE_CODE_VERSION, hasMinCodeVersion } from '../version-utils.js'; export const multimediaMessageSpec: MessageSpec< MediaMessageData | ImagesMessageData, @@ -213,14 +214,24 @@ return rawMessageInfo; } + const containsBlobServiceMedia = rawMessageInfo.media.some( + isMediaBlobServiceHosted, + ); const containsEncryptedMedia = rawMessageInfo.media.some( media => media.type === 'encrypted_photo' || media.type === 'encrypted_video', ); - if (!containsEncryptedMedia && hasMinCodeVersion(platformDetails, 158)) { + if ( + !containsBlobServiceMedia && + !containsEncryptedMedia && + hasMinCodeVersion(platformDetails, 158) + ) { + return rawMessageInfo; + } + if (!containsBlobServiceMedia && hasMinCodeVersion(platformDetails, 205)) { return rawMessageInfo; } - if (hasMinCodeVersion(platformDetails, 205)) { + if (hasMinCodeVersion(platformDetails, FUTURE_CODE_VERSION)) { return rawMessageInfo; } @@ -258,7 +269,11 @@ }), }; } else if (unwrapped.type === messageTypes.MULTIMEDIA) { - for (const { type } of unwrapped.media) { + for (const media of unwrapped.media) { + if (isMediaBlobServiceHosted(media)) { + return messageInfo; + } + const { type } = media; if ( type !== 'photo' && type !== 'video' && diff --git a/lib/shared/version-utils.js b/lib/shared/version-utils.js --- a/lib/shared/version-utils.js +++ b/lib/shared/version-utils.js @@ -2,6 +2,12 @@ import { type PlatformDetails, isWebPlatform } from '../types/device-types.js'; +/** + * A code version used for features that are waiting to be released + * and we're not sure in which version they will be available. + */ +const FUTURE_CODE_VERSION = 1000000; + function hasMinCodeVersion( platformDetails: ?PlatformDetails, minCodeVersion: number, @@ -16,4 +22,4 @@ return true; } -export { hasMinCodeVersion }; +export { FUTURE_CODE_VERSION, hasMinCodeVersion };