diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 905144723..d0a55b23e 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -300,7 +300,7 @@ android { } } - defaultConfig.versionCode = 2547 + defaultConfig.versionCode = 2551 applicationVariants.all { variant -> variant.outputs.all { output -> @@ -319,7 +319,7 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 30 - versionName "8.5.0" + versionName "8.5.1" vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a index 1882a2910..5aaa4e8a4 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a index e7e4db0c5..be0557645 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a index ffdf2497d..5c5e17998 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a index 5219ffee0..e6d56e388 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a index de3fd743a..95da4db67 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a index 9b1938ee9..d6ddccf01 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a index e10a2133e..1d44d64a2 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a index 2561310a6..d49ebdfbb 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a index d78f1b57b..ad3ced749 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a index 813a5b2d1..8dcb75186 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a index 02fe7e8b3..0a2756823 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a index efb970bd9..ab18286f0 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a index e9d5693b1..a471d4934 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a index eaf9da36c..c480b6e0c 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a differ diff --git a/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh b/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh index 0f9777b41..caed4b325 100644 --- a/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh +++ b/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh @@ -4,7 +4,7 @@ # used # ffmpeg 4.3.3 # lib vpx 1.10.9 -# NDK build_ffmpeg for compile libvpx. Last sussecfull build with 21.1.6352462 +# NDK for compile libvpx. Last successful build with 21.1.6352462 # NDK r10e for compile ffmpeg # # 1) download ffmpeg @@ -18,7 +18,7 @@ NDK="/opt/android/ndk/android-ndk-r21e" NDK_r10e="/opt/android/ndk/android-ndk-r10e" - +#build vpx cd ./vpx-android export ANDROID_NDK=$NDK sh build-vpx.sh @@ -86,6 +86,7 @@ LIBS=" -L${PREFIX}/lib" --enable-decoder=mjpeg \ --enable-decoder=gif \ --enable-decoder=alac \ +--enable-decoder=opus \ --enable-demuxer=mov \ --enable-demuxer=gif \ --enable-demuxer=ogg \ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavcodec.a b/TMessagesProj/jni/ffmpeg/x86/libavcodec.a index b21435761..a4d172a8e 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavcodec.a and b/TMessagesProj/jni/ffmpeg/x86/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavformat.a b/TMessagesProj/jni/ffmpeg/x86/libavformat.a index 8daaeed75..7cf92e444 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavformat.a and b/TMessagesProj/jni/ffmpeg/x86/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavresample.a b/TMessagesProj/jni/ffmpeg/x86/libavresample.a index 8bb06d0bc..e0cd3e745 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavresample.a and b/TMessagesProj/jni/ffmpeg/x86/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavutil.a b/TMessagesProj/jni/ffmpeg/x86/libavutil.a index 5ae00d14b..2c29f80d3 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavutil.a and b/TMessagesProj/jni/ffmpeg/x86/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libswresample.a b/TMessagesProj/jni/ffmpeg/x86/libswresample.a index 0dabff54a..1cc0c8cd7 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libswresample.a and b/TMessagesProj/jni/ffmpeg/x86/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libswscale.a b/TMessagesProj/jni/ffmpeg/x86/libswscale.a index 1f313b788..893798c6f 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libswscale.a and b/TMessagesProj/jni/ffmpeg/x86/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libvpx.a b/TMessagesProj/jni/ffmpeg/x86/libvpx.a index 1c4a5fc3f..4e8f772f7 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libvpx.a and b/TMessagesProj/jni/ffmpeg/x86/libvpx.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a b/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a index 9941e8e29..7d01646fe 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a b/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a index 39a57652b..cf75031fc 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a b/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a index f2f733e80..0462c9ac5 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a b/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a index 740b9eba5..998955a25 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a b/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a index 0d9840002..ba08a4f70 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a and b/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a b/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a index 0fd123e05..90d18be13 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a and b/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a b/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a index af76ebe93..9b3dd7a78 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a and b/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a differ diff --git a/TMessagesProj/jni/gifvideo.cpp b/TMessagesProj/jni/gifvideo.cpp index d128312a6..44919d3c3 100644 --- a/TMessagesProj/jni/gifvideo.cpp +++ b/TMessagesProj/jni/gifvideo.cpp @@ -790,11 +790,12 @@ int readCallback(void *opaque, uint8_t *buf, int buf_size) { if (attached) { javaVm->DetachCurrentThread(); } - return (int) read(info->fd, buf, (size_t) buf_size); + int ret = (int) read(info->fd, buf, (size_t) buf_size); + return ret ? ret : AVERROR_EOF; } } } - return 0; + return AVERROR_EOF; } int64_t seekCallback(void *opaque, int64_t offset, int whence) { @@ -1150,6 +1151,11 @@ extern "C" JNIEXPORT void JNICALL Java_org_telegram_ui_Components_AnimatedFileDr } } +uint32_t premultiply_channel_value(const uint32_t pixel, const uint8_t offset, const float normalizedAlpha) { + auto multipliedValue = ((pixel >> offset) & 0xFF) * normalizedAlpha; + return ((uint32_t)std::min(multipliedValue, 255.0f)) << offset; +} + static inline void writeFrameToBitmap(JNIEnv *env, VideoInfo *info, jintArray data, jobject bitmap, jint stride) { jint *dataArr = env->GetIntArrayElements(data, 0); int32_t wantedWidth; @@ -1173,15 +1179,15 @@ static inline void writeFrameToBitmap(JNIEnv *env, VideoInfo *info, jintArray da void *pixels; if (AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0) { if (info->sws_ctx == nullptr) { - if (info->frame->format > AV_PIX_FMT_NONE && info->frame->format < AV_PIX_FMT_NB) { + if (info->frame->format > AV_PIX_FMT_NONE && info->frame->format < AV_PIX_FMT_NB && !info->frame->format == AV_PIX_FMT_YUVA420P) { info->sws_ctx = sws_getContext(info->frame->width, info->frame->height, (AVPixelFormat) info->frame->format, bitmapWidth, bitmapHeight, AV_PIX_FMT_RGBA, SWS_BILINEAR, NULL, NULL, NULL); - } else if (info->video_dec_ctx->pix_fmt > AV_PIX_FMT_NONE && info->video_dec_ctx->pix_fmt < AV_PIX_FMT_NB) { + } else if (info->video_dec_ctx->pix_fmt > AV_PIX_FMT_NONE && info->video_dec_ctx->pix_fmt < AV_PIX_FMT_NB && !info->frame->format == AV_PIX_FMT_YUVA420P) { info->sws_ctx = sws_getContext(info->video_dec_ctx->width, info->video_dec_ctx->height, info->video_dec_ctx->pix_fmt, bitmapWidth, bitmapHeight, AV_PIX_FMT_RGBA, SWS_BILINEAR, NULL, NULL, NULL); } } if (info->sws_ctx == nullptr || ((intptr_t) pixels) % 16 != 0) { if (info->frame->format == AV_PIX_FMT_YUVA420P) { - libyuv::I420AlphaToARGBMatrix(info->frame->data[0], info->frame->linesize[0], info->frame->data[2], info->frame->linesize[2], info->frame->data[1], info->frame->linesize[1], info->frame->data[3], info->frame->linesize[3], (uint8_t *) pixels, bitmapWidth * 4, &libyuv::kYvuI601Constants, bitmapWidth, bitmapHeight, 50); + libyuv::I420AlphaToARGBMatrix(info->frame->data[0], info->frame->linesize[0], info->frame->data[2], info->frame->linesize[2], info->frame->data[1], info->frame->linesize[1], info->frame->data[3], info->frame->linesize[3], (uint8_t *) pixels, bitmapWidth * 4, &libyuv::kYvuI601Constants, bitmapWidth, bitmapHeight, 1); } else if (info->frame->format == AV_PIX_FMT_YUV444P) { libyuv::H444ToARGB(info->frame->data[0], info->frame->linesize[0], info->frame->data[2], info->frame->linesize[2], info->frame->data[1], info->frame->linesize[1], (uint8_t *) pixels, bitmapWidth * 4, bitmapWidth, bitmapHeight); } else if (info->frame->format == AV_PIX_FMT_YUV420P || info->frame->format == AV_PIX_FMT_YUVJ420P) { @@ -1199,17 +1205,6 @@ static inline void writeFrameToBitmap(JNIEnv *env, VideoInfo *info, jintArray da info->dst_linesize[0] = stride; sws_scale(info->sws_ctx, info->frame->data, info->frame->linesize, 0, info->frame->height, dst_data, info->dst_linesize); - if (info->frame->format == AV_PIX_FMT_YUVA420P) { - auto pixelArr = ((uint32_t *) pixels); - for (int i = 0; i < bitmapWidth; i++) { - for (int j = 0; j < bitmapHeight; j++) { - int a = RGB8888_A(pixelArr[j * bitmapWidth + i]); - if (a < 125) { - pixelArr[j * bitmapWidth + i] = 0; - } - } - } - } } } AndroidBitmap_unlockPixels(env, bitmap); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 0f645f303..4c304c390 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -20,11 +20,10 @@ public class BuildVars { public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29; - public static int BUILD_VERSION = 2547; - public static String BUILD_VERSION_STRING = "8.5.0"; + public static int BUILD_VERSION = 2551; + public static String BUILD_VERSION_STRING = "8.5.1"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; - public static String APPCENTER_HASH = "a5b5c4f5-51da-dedc-9918-d9766a22ca7c"; public static String SMS_HASH = isStandaloneApp() ? "w0lkcmTZkKh" : (DEBUG_VERSION ? "O2P2z+/jBpJ" : "oLeq9AcOZkT"); public static String PLAYSTORE_APP_URL = "https://play.google.com/store/apps/details?id=org.telegram.messenger"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java index ed0d3ddf4..11feab2b0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java @@ -211,7 +211,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private Drawable currentMediaDrawable; private BitmapShader mediaShader; - private boolean useRoundForThumb; + private boolean useRoundForThumb = true; private Drawable staticThumbDrawable; @@ -277,6 +277,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private int animateFromIsPressed; private String uniqKeyPrefix; private ArrayList loadingOperations = new ArrayList<>(); + private boolean attachedToWindow; public ImageReceiver() { this(null); @@ -576,16 +577,12 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg legacyBitmap.recycle(); legacyBitmap = null; } - if (useRoundForThumb && staticThumbDrawable != null) { - updateDrawableRadius(staticThumbDrawable); - } currentAlpha = 1.0f; previousAlpha = 1f; if (staticThumbDrawable instanceof SvgHelper.SvgDrawable) { ((SvgHelper.SvgDrawable) staticThumbDrawable).setParent(this); } - updateDrawableRadius(staticThumbDrawable); if (delegate != null) { delegate.didSetImage(this, currentImageDrawable != null || currentThumbDrawable != null || staticThumbDrawable != null || currentMediaDrawable != null, currentImageDrawable == null && currentMediaDrawable == null, false); @@ -707,6 +704,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (bitmap instanceof AnimatedFileDrawable) { AnimatedFileDrawable fileDrawable = (AnimatedFileDrawable) bitmap; fileDrawable.setParentView(parentView); + if (attachedToWindow) { + fileDrawable.addParent(parentView); + } fileDrawable.setUseSharedQueue(useSharedAnimationQueue || fileDrawable.isWebmSticker); if (allowStartAnimation && currentOpenedLayerFlags == 0) { fileDrawable.start(); @@ -841,6 +841,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } public void onDetachedFromWindow() { + attachedToWindow = false; if (currentImageLocation != null || currentMediaLocation != null || currentThumbLocation != null || staticThumbDrawable != null) { if (setImageBackup == null) { setImageBackup = new SetImageBackup(); @@ -869,6 +870,11 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (isPressed == 0) { pressedProgress = 0f; } + + AnimatedFileDrawable animatedFileDrawable = getAnimation(); + if (animatedFileDrawable != null) { + animatedFileDrawable.removeParent(parentView); + } } private boolean setBackupImage() { @@ -888,6 +894,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } public boolean onAttachedToWindow() { + attachedToWindow = true; currentOpenedLayerFlags = NotificationCenter.getGlobalInstance().getCurrentHeavyOperationFlags(); currentOpenedLayerFlags &= ~currentLayerNum; NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didReplacedPhotoInMemCache); @@ -901,6 +908,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg lottieDrawable.start(); } AnimatedFileDrawable animatedFileDrawable = getAnimation(); + if (animatedFileDrawable != null && parentView != null) { + animatedFileDrawable.addParent(parentView); + } if (animatedFileDrawable != null && allowStartAnimation && currentOpenedLayerFlags == 0) { animatedFileDrawable.start(); if (parentView != null) { @@ -1418,6 +1428,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg orientation = imageOrientation; } else if (staticThumbDrawable instanceof BitmapDrawable) { drawable = staticThumbDrawable; + if (useRoundForThumb && thumbShader == null) { + updateDrawableRadius(staticThumbDrawable); + } shaderToUse = thumbShader; orientation = thumbOrientation; } else if (currentThumbDrawable != null) { @@ -1429,7 +1442,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (drawable != null) { if (crossfadeAlpha != 0) { if (previousAlpha != 1f && (drawable == currentImageDrawable || drawable == currentMediaDrawable) && staticThumbDrawable != null) { - drawDrawable(canvas, staticThumbDrawable, (int) (overrideAlpha * 255), shaderToUse, orientation); + if (useRoundForThumb && thumbShader == null) { + updateDrawableRadius(staticThumbDrawable); + } + drawDrawable(canvas, staticThumbDrawable, (int) (overrideAlpha * 255), thumbShader, orientation); } if (crossfadeWithThumb && animationNotReady) { drawDrawable(canvas, drawable, (int) (overrideAlpha * 255), shaderToUse, orientation); @@ -1446,11 +1462,17 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg thumbShaderToUse = thumbShader; } else if (staticThumbDrawable != null) { thumbDrawable = staticThumbDrawable; + if (useRoundForThumb && thumbShader == null) { + updateDrawableRadius(staticThumbDrawable); + } thumbShaderToUse = thumbShader; } } else if (drawable == currentThumbDrawable || drawable == crossfadeImage) { if (staticThumbDrawable != null) { thumbDrawable = staticThumbDrawable; + if (useRoundForThumb && thumbShader == null) { + updateDrawableRadius(staticThumbDrawable); + } thumbShaderToUse = thumbShader; } } else if (drawable == staticThumbDrawable) { @@ -1900,12 +1922,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (currentMediaDrawable != null && mediaShader == null) { updateDrawableRadius(currentMediaDrawable); } - if (thumbShader == null) { - if (currentThumbDrawable != null) { - updateDrawableRadius(currentThumbDrawable); - } else if (staticThumbDrawable != null) { - updateDrawableRadius(staticThumbDrawable); - } + if (currentThumbDrawable != null) { + updateDrawableRadius(currentThumbDrawable); + } else if (staticThumbDrawable != null) { + updateDrawableRadius(staticThumbDrawable); } } } @@ -2199,6 +2219,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (drawable instanceof AnimatedFileDrawable) { AnimatedFileDrawable fileDrawable = (AnimatedFileDrawable) drawable; fileDrawable.setUseSharedQueue(useSharedAnimationQueue); + if (attachedToWindow) { + fileDrawable.addParent(parentView); + } if (allowStartAnimation && currentOpenedLayerFlags == 0) { fileDrawable.start(); } @@ -2262,6 +2285,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg RLottieDrawable lottieDrawable = (RLottieDrawable) image; lottieDrawable.removeParentView(parentView); } + if (image instanceof AnimatedFileDrawable) { + AnimatedFileDrawable lottieDrawable = (AnimatedFileDrawable) image; + lottieDrawable.removeParent(parentView); + } if (key != null && (newKey == null || !newKey.equals(key)) && image != null) { if (image instanceof RLottieDrawable) { RLottieDrawable fileDrawable = (RLottieDrawable) image; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 42459e51c..87e389b26 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -4993,12 +4993,16 @@ public class MessageObject { return FileLoader.getDocumentFileName(getDocument()); } - public static boolean isVideoSticker(TLRPC.Document document) { + public static boolean isWebM(TLRPC.Document document) { return document != null && "video/webm".equals(document.mime_type); } + public static boolean isVideoSticker(TLRPC.Document document) { + return document != null && isVideoStickerDocument(document); + } + public boolean isVideoSticker() { - return getDocument() != null && "video/webm".equals(getDocument().mime_type); + return getDocument() != null && isVideoStickerDocument(getDocument()); } public static boolean isStickerDocument(TLRPC.Document document) { @@ -5013,6 +5017,18 @@ public class MessageObject { return false; } + public static boolean isVideoStickerDocument(TLRPC.Document document) { + if (document != null) { + for (int a = 0; a < document.attributes.size(); a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeSticker) { + return "video/webm".equals(document.mime_type); + } + } + } + return false; + } + public static boolean isStickerHasSet(TLRPC.Document document) { if (document != null) { for (int a = 0; a < document.attributes.size(); a++) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index eadabb36a..d328cc1cd 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -368,7 +368,7 @@ public class MessagesController extends BaseController implements NotificationCe getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; int messageId = 0; - if (error != null && !res.messages.isEmpty()) { + if (error != null && res != null && res.messages != null && !res.messages.isEmpty()) { messageId = res.messages.get(0).id; } int finalMessageId = messageId; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 17e503423..efeb61b59 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -995,6 +995,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate contactAvatarDrawable = new AvatarDrawable(); photoImage = new ImageReceiver(this); + photoImage.setUseRoundForThumbDrawable(true); photoImage.setDelegate(this); radialProgress = new RadialProgress2(this, resourcesProvider); videoRadialProgress = new RadialProgress2(this, resourcesProvider); @@ -4633,7 +4634,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photoImage.setImage(ImageLocation.getForDocument(documentAttach), ImageLoader.AUTOPLAY_FILTER, ImageLocation.getForObject(currentPhotoObject, photoParentObject), currentPhotoFilter, ImageLocation.getForDocument(currentPhotoObjectThumb, documentAttach), currentPhotoFilterThumb, currentPhotoObjectThumbStripped, documentAttach.size, null, messageObject, 0); autoPlayingMedia = true; } else { - if (currentPhotoObjectThumb != null) { + if (currentPhotoObjectThumb != null || currentPhotoObjectThumbStripped != null) { photoImage.setImage(ImageLocation.getForObject(currentPhotoObject, photoParentObject), currentPhotoFilter, ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), currentPhotoFilterThumb, currentPhotoObjectThumbStripped, 0, null, messageObject, 0); } else { photoImage.setImage(null, null, ImageLocation.getForObject(currentPhotoObject, photoParentObject), currentPhotoObject instanceof TLRPC.TL_photoStrippedSize || "s".equals(currentPhotoObject.type) ? currentPhotoFilterThumb : currentPhotoFilter, currentPhotoObjectThumbStripped, 0, null, messageObject, 0); @@ -4669,7 +4670,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photoImage.setImage(ImageLocation.getForObject(currentPhotoObject, photoParentObject), currentPhotoFilter, ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), currentPhotoFilterThumb, currentPhotoObjectThumbStripped, 0, null, messageObject, 0); } else { photoNotSet = true; - if (currentPhotoObjectThumb != null) { + if (currentPhotoObjectThumb != null || currentPhotoObjectThumbStripped != null) { photoImage.setImage(null, null, ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), String.format(Locale.US, "%d_%d_b", w, h), currentPhotoObjectThumbStripped, 0, null, messageObject, 0); } else { photoImage.setImageBitmap((Drawable) null); @@ -6178,7 +6179,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photoImage.setImage(ImageLocation.getForObject(currentPhotoObject, photoParentObject), currentPhotoFilter, ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), currentPhotoFilterThumb, currentPhotoObjectThumbStripped, currentPhotoObject.size, null, currentMessageObject, currentMessageObject.shouldEncryptPhotoOrVideo() ? 2 : 0); } else { photoNotSet = true; - if (currentPhotoObjectThumb != null) { + if (currentPhotoObjectThumb != null || currentPhotoObjectThumbStripped != null) { photoImage.setImage(null, null, ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), currentPhotoFilterThumb, currentPhotoObjectThumbStripped, 0, null, currentMessageObject, currentMessageObject.shouldEncryptPhotoOrVideo() ? 2 : 0); } else { photoImage.setImageBitmap((Drawable) null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java index c3d04381f..0041819ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelAdminLogActivity.java @@ -29,14 +29,6 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; - -import androidx.collection.LongSparseArray; -import androidx.core.content.FileProvider; -import androidx.recyclerview.widget.ChatListItemAnimator; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.LinearSmoothScrollerCustom; -import androidx.recyclerview.widget.RecyclerView; - import android.text.TextUtils; import android.text.style.CharacterStyle; import android.text.style.URLSpan; @@ -55,6 +47,13 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.collection.LongSparseArray; +import androidx.core.content.FileProvider; +import androidx.recyclerview.widget.ChatListItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScrollerCustom; +import androidx.recyclerview.widget.RecyclerView; + import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import org.telegram.messenger.AndroidUtilities; @@ -62,13 +61,13 @@ import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; -import org.telegram.messenger.ImageLocation; -import org.telegram.messenger.MediaDataController; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaController; +import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; @@ -689,6 +688,8 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio childTop -= AndroidUtilities.dp(24) - (actionBar.getVisibility() == VISIBLE ? actionBar.getMeasuredHeight() / 2 : 0); } else if (child == actionBar) { childTop -= getPaddingTop(); + } else if (child == backgroundView) { + childTop = 0; } child.layout(childLeft, childTop, childLeft + width, childTop + height); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index cfcf7b330..57a8a6af6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -1442,7 +1442,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } ChatMessageCell cell = (ChatMessageCell) view; - return !cell.getMessageObject().isSending() && !cell.getMessageObject().isEditing() && cell.getMessageObject().type != 16 && !actionBar.isActionModeShowed() && !isSecretChat() && !isInScheduleMode(); + return !cell.getMessageObject().isSending() && !cell.getMessageObject().isEditing() && cell.getMessageObject().type != 16 && !actionBar.isActionModeShowed() && !isSecretChat() && !isInScheduleMode() && !cell.getMessageObject().isSponsored(); } @Override @@ -1454,7 +1454,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not MessageObject primaryMessage = cell.getPrimaryMessageObject(); ReactionsEffectOverlay.removeCurrent(false); TLRPC.TL_availableReaction reaction = getMediaDataController().getReactionsMap().get(getMediaDataController().getDoubleTapReaction()); - if (reaction == null) { + if (reaction == null || cell.getMessageObject().isSponsored()) { return; } boolean available = dialog_id >= 0; @@ -7119,8 +7119,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not undoView.showWithAction(0, Math.abs(value - 1.0f) > 0.001f ? UndoView.ACTION_PLAYBACK_SPEED_ENABLED : UndoView.ACTION_PLAYBACK_SPEED_DISABLED, value, null, null); } } - - }; contentView.addView(fragmentLocationContextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); contentView.addView(fragmentContextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java index 500332839..2b315874e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java @@ -125,13 +125,15 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { private View parentView; private ArrayList secondParentViews = new ArrayList<>(); + private ArrayList parents = new ArrayList<>(); + private AnimatedFileDrawableStream stream; private boolean useSharedQueue; private boolean invalidatePath = true; private boolean invalidateTaskIsRunning; - private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(16, new ThreadPoolExecutor.DiscardPolicy()); + private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8, new ThreadPoolExecutor.DiscardPolicy()); protected final Runnable mInvalidateTask = () -> { invalidateTaskIsRunning = false; @@ -244,14 +246,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { destroyDecoder(nativePtr); nativePtr = 0; } - if (renderingHeight > 0 && renderingWidth > 0 && metaData[0] > 0 && metaData[1] > 0) { - scaleFactor = Math.max(renderingWidth / (float) metaData[0], renderingHeight / (float) metaData[1]); - if (isWebmSticker || scaleFactor <= 0 || scaleFactor > 0.7) { - scaleFactor = 1; - } - } else { - scaleFactor = 1f; - } + updateScaleFactor(); decoderCreated = true; } try { @@ -281,10 +276,12 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } if (backgroundBitmap != null) { lastFrameDecodeTime = System.currentTimeMillis(); + if (getVideoFrame(nativePtr, backgroundBitmap, metaData, backgroundBitmap.getRowBytes(), false, startTime, endTime) == 0) { AndroidUtilities.runOnUIThread(uiRunnableNoFrame); return; } + if (seekWas) { lastTimeStamp = metaData[3]; } @@ -302,6 +299,17 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } }; + private void updateScaleFactor() { + if (!isWebmSticker && renderingHeight > 0 && renderingWidth > 0 && metaData[0] > 0 && metaData[1] > 0) { + scaleFactor = Math.max(renderingWidth / (float) metaData[0], renderingHeight / (float) metaData[1]); + if (scaleFactor <= 0 || scaleFactor > 0.7) { + scaleFactor = 1; + } + } else { + scaleFactor = 1f; + } + } + private final Runnable mStartTask = () -> { if (!secondParentViews.isEmpty()) { for (int a = 0, N = secondParentViews.size(); a < N; a++) { @@ -337,14 +345,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { destroyDecoder(nativePtr); nativePtr = 0; } - if (renderingHeight > 0 && renderingWidth > 0 && metaData[0] > 0 && metaData[1] > 0) { - scaleFactor = Math.max(renderingWidth / (float) metaData[0], renderingHeight / (float) metaData[1]); - if (isWebmSticker || scaleFactor <= 0 || scaleFactor > 0.7) { - scaleFactor = 1f; - } - } else { - scaleFactor = 1f; - } + updateScaleFactor(); decoderCreated = true; } if (seekTo != 0) { @@ -386,6 +387,19 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { parentView = view; } + public void addParent(View view) { + if (!parents.contains(view)) { + parents.add(view); + if (isRunning) { + scheduleNextGetFrame(); + } + } + } + + public void removeParent(View view) { + parents.remove(view); + } + public void setInvalidateParentViewWithSecond(boolean value) { invalidateParentViewWithSecond = value; } @@ -550,7 +564,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { } private void scheduleNextGetFrame() { - if (loadFrameTask != null || nativePtr == 0 && decoderCreated || destroyWhenDone || !isRunning && (!decodeSingleFrame || decodeSingleFrame && singleFrameDecoded)) { + if (loadFrameTask != null || nativePtr == 0 && decoderCreated || destroyWhenDone || !isRunning && (!decodeSingleFrame || decodeSingleFrame && singleFrameDecoded) || parents.size() == 0) { return; } long ms = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatBlurredFrameLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatBlurredFrameLayout.java index b1ff175d6..71eac56fd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatBlurredFrameLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatBlurredFrameLayout.java @@ -2,6 +2,7 @@ package org.telegram.ui.Components; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; import android.view.View; import android.widget.FrameLayout; @@ -16,7 +17,7 @@ public class ChatBlurredFrameLayout extends FrameLayout { ChatActivity chatActivity; protected Paint backgroundPaint; - public int backgroundColor; + public int backgroundColor = Color.TRANSPARENT; public int backgroundPaddingBottom; public int backgroundPaddingTop; public boolean isTopView = true; @@ -29,7 +30,7 @@ public class ChatBlurredFrameLayout extends FrameLayout { @Override protected void dispatchDraw(Canvas canvas) { - if (SharedConfig.chatBlurEnabled() && chatActivity != null && drawBlur) { + if (SharedConfig.chatBlurEnabled() && chatActivity != null && drawBlur && backgroundColor != Color.TRANSPARENT) { if (backgroundPaint == null) { backgroundPaint = new Paint(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java index 9f0d1d842..fe153087a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -75,6 +75,7 @@ import org.telegram.messenger.Emoji; import org.telegram.messenger.EmojiData; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLoader; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; @@ -4053,7 +4054,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (svgThumb != null) { svgThumb.overrideWidthAndHeight(512, 512); } - if (object == null) { + if (object == null || MessageObject.isVideoSticker(document)) { object = document; } @@ -4071,7 +4072,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (imageLocation == null) { return; } - if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(document, true)) { + if (object instanceof TLRPC.Document && (MessageObject.isAnimatedStickerDocument(document, true) || MessageObject.isVideoSticker(document))) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(document), "30_30", svgThumb, 0, set); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java index 3173e4a31..cfcb560ab 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java @@ -17,6 +17,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; @@ -932,6 +933,7 @@ public class FragmentContextView extends FrameLayout implements NotificationCent muteDrawable.setCurrentFrame(muteDrawable.getCustomEndFrame() - 1, false, true); muteButton.invalidate(); frameLayout.setBackground(null); + frameLayout.setBackgroundColor(Color.TRANSPARENT); importingImageView.setVisibility(GONE); importingImageView.stopAnimation(); Theme.getFragmentContextViewWavesDrawable().addParent(this); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java index 6515fd049..3e438e800 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java @@ -277,7 +277,11 @@ public class ReactedUsersListView extends FrameLayout { if (r != null) { SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(r.static_icon.thumbs, Theme.key_windowBackgroundGray, 1.0f); reactView.setImage(ImageLocation.getForDocument(r.static_icon), "50_50", "webp", svgThumb, r); + } else { + reactView.setImageDrawable(null); } + } else { + reactView.setImageDrawable(null); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java index 0f43fec62..3c802fb9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java @@ -631,7 +631,7 @@ public class ContentPreviewViewer { public void setParentActivity(Activity activity) { currentAccount = UserConfig.selectedAccount; centerImage.setCurrentAccount(currentAccount); - centerImage.setLayerNum(7); + centerImage.setLayerNum(Integer.MAX_VALUE); if (parentActivity == activity) { return; } @@ -650,7 +650,19 @@ public class ContentPreviewViewer { }); } - containerView = new FrameLayoutDrawer(activity); + containerView = new FrameLayoutDrawer(activity) { + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + centerImage.onAttachedToWindow(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + centerImage.onDetachedFromWindow(); + } + }; containerView.setFocusable(false); windowView.addView(containerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); containerView.setOnTouchListener((v, event) -> { @@ -960,4 +972,5 @@ public class ContentPreviewViewer { Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null; return color != null ? color : Theme.getColor(key); } + }