From 0a3abc5158815c2817c4b564a91f2c803ba0c639 Mon Sep 17 00:00:00 2001 From: xaxtix Date: Tue, 28 Jun 2022 14:00:33 +0400 Subject: [PATCH] update to 8.8.4 --- TMessagesProj/build.gradle | 4 +- TMessagesProj/jni/intro/IntroRenderer.c | 7 + .../src/main/assets/shaders/fragment2.glsl | 11 +- .../telegram/messenger/AndroidUtilities.java | 2 +- .../org/telegram/messenger/BuildVars.java | 8 +- .../telegram/messenger/FileLoadOperation.java | 41 +++-- .../org/telegram/messenger/FileLoader.java | 55 +++++-- .../telegram/messenger/FilePathDatabase.java | 21 ++- .../org/telegram/messenger/ImageLoader.java | 2 +- .../org/telegram/messenger/ImageReceiver.java | 19 +-- .../messenger/MediaDataController.java | 8 +- .../messenger/MessagesController.java | 12 +- .../telegram/messenger/MessagesStorage.java | 10 +- .../messenger/NotificationsController.java | 8 +- .../org/telegram/messenger/SharedConfig.java | 4 +- .../main/java/org/telegram/tgnet/TLRPC.java | 27 ++++ .../org/telegram/ui/CacheControlActivity.java | 7 + .../telegram/ui/Cells/ChatMessageCell.java | 97 +++++++----- .../org/telegram/ui/Cells/DialogCell.java | 49 +++--- .../java/org/telegram/ui/ChatActivity.java | 6 +- .../ui/Components/AnimatedFileDrawable.java | 1 + .../ui/Components/InstantCameraView.java | 149 +++++++++++++----- .../ui/Components/MentionsContainerView.java | 27 ++-- .../Components/Premium/GLIcon/Star3DIcon.java | 27 +++- .../Premium/PremiumAppIconsPreviewView.java | 73 ++++++--- .../Components/Premium/StarParticlesView.java | 30 +++- .../ui/Components/ProfileGalleryView.java | 10 +- .../ui/Components/RLottieDrawable.java | 17 +- .../telegram/ui/Components/ScamDrawable.java | 10 +- .../ui/Components/SharedMediaLayout.java | 14 ++ .../telegram/ui/EmojiAnimationsOverlay.java | 18 ++- .../org/telegram/ui/GroupCallActivity.java | 6 +- .../java/org/telegram/ui/PhotoViewer.java | 10 ++ .../java/org/telegram/ui/ProfileActivity.java | 27 ++-- 34 files changed, 582 insertions(+), 235 deletions(-) diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index a89f35766..4140479c5 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -235,7 +235,7 @@ android { } } - defaultConfig.versionCode = 2705 + defaultConfig.versionCode = 2711 applicationVariants.all { variant -> variant.outputs.all { output -> @@ -254,7 +254,7 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 30 - versionName "8.8.3" + versionName "8.8.4" vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] diff --git a/TMessagesProj/jni/intro/IntroRenderer.c b/TMessagesProj/jni/intro/IntroRenderer.c index b195a1efd..89aee5b71 100644 --- a/TMessagesProj/jni/intro/IntroRenderer.c +++ b/TMessagesProj/jni/intro/IntroRenderer.c @@ -36,6 +36,7 @@ static Shape cloud_extra_mask1; static Shape cloud_extra_mask2; static Shape cloud_extra_mask3; static Shape cloud_extra_mask4; +static int surfaceCreated = 0; static Shape cloud_cover; @@ -1706,6 +1707,11 @@ JNIEXPORT void Java_org_telegram_messenger_Intro_setBackgroundColor(JNIEnv *env, } JNIEXPORT void Java_org_telegram_messenger_Intro_onDrawFrame(JNIEnv *env, jclass class, jint deltaMs) { + if (surfaceCreated == 0) { + glClearColor(background_color[0], background_color[1], background_color[2], background_color[3]); + glClear(GL_COLOR_BUFFER_BIT); + return; + } time_local += (float) deltaMs / 1000; if (current_page != prev_page) { @@ -2826,6 +2832,7 @@ JNIEXPORT void Java_org_telegram_messenger_Intro_onSurfaceCreated(JNIEnv *env, j vec4 cloud_color = {42 / 255.0f, 180 / 255.0f, 247 / 255.0f, 1}; cloud_bg = create_rectangle(CSizeMake(160 * 2, 160 * 2), cloud_color); + surfaceCreated = 1; } JNIEXPORT void Java_org_telegram_messenger_Intro_onSurfaceChanged(JNIEnv *env, jclass class, int32_t a_width_px, int32_t a_height_px, float a_scale_factor, int32_t a1) { diff --git a/TMessagesProj/src/main/assets/shaders/fragment2.glsl b/TMessagesProj/src/main/assets/shaders/fragment2.glsl index ee3dda066..d96ace6a4 100644 --- a/TMessagesProj/src/main/assets/shaders/fragment2.glsl +++ b/TMessagesProj/src/main/assets/shaders/fragment2.glsl @@ -28,14 +28,15 @@ uniform vec4 gradientPosition; void main() { vec3 vLightPosition2 = vec3(-400,400,400); vec3 vLightPosition3 = vec3(0,200,400); - vec3 vLightPosition4 = vec3(100,-200,400); + vec3 vLightPosition4 = vec3(0,0,100); + vec3 vLightPositionNormal = vec3(100,-200,400); vec3 vNormalW = normalize(vec3(world * vec4(vNormal, 0.0))); vec3 vTextureNormal = normalize(texture2D(u_NormalMap, vUV + vec2(-f_xOffset, f_xOffset)).xyz * 2.0 - 1.0); vec3 finalNormal = normalize(vNormalW + vTextureNormal); - vec3 color = texture2D(u_Texture, vUV * vec2(0.8, 0.8) + vec2(0.2 * f_xOffset, 0)).xyz; + vec3 color = texture2D(u_Texture, vUV ).xyz; vec3 viewDirectionW = normalize(cameraPosition - modelViewVertex); vec3 angleW = normalize(viewDirectionW + vLightPosition2); @@ -44,14 +45,14 @@ void main() { angleW = normalize(viewDirectionW + vLightPosition4); float specComp3 = max(0., dot(vNormalW, angleW)); - specComp3 = pow(specComp3, max(1., 128.)) * spec2; + specComp3 = pow(specComp3, max(1., 30.)) * spec2; float diffuse = max(dot(vNormalW, viewDirectionW), (1.0 - u_diffuse)); float mixValue = distance(vUV,vec2(1,0)); vec4 gradientColorFinal = vec4(mix(gradientColor1,gradientColor2,mixValue), 1.0); - angleW = normalize(viewDirectionW + vLightPosition4); + angleW = normalize(viewDirectionW + vLightPositionNormal); float normalSpecComp = max(0., dot(finalNormal, angleW)); normalSpecComp = pow(normalSpecComp, max(1., 128.)) * normalSpec; @@ -60,7 +61,7 @@ void main() { normalSpecComp2 = pow(normalSpecComp2, max(1., 128.)) * normalSpec; vec4 normalSpecFinal = vec4(normalSpecColor, 0.0) * (normalSpecComp + normalSpecComp2); - vec4 specFinal = vec4(specColor, 0.0) * (specComp2 + specComp3); + vec4 specFinal = vec4(color, 0.0) * (specComp2 + specComp3); vec4 fragColor = gradientColorFinal + specFinal + normalSpecFinal; vec4 backgroundColor = texture2D(u_BackgroundTexture, vec2(gradientPosition.x + (gl_FragCoord.x / resolution.x) * gradientPosition.y, gradientPosition.z + (1.0 - (gl_FragCoord.y / resolution.y)) * gradientPosition.w)); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index 993b9245e..335dfcad6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -2490,7 +2490,7 @@ public class AndroidUtilities { } public static void appCenterLog(Throwable e) { - + } public static boolean shouldShowClipboardToast() { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index bbef146a7..0e7015d3c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -20,11 +20,11 @@ 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 = 2705; - public static String BUILD_VERSION_STRING = "8.8.3"; + public static int BUILD_VERSION = 2711; + public static String BUILD_VERSION_STRING = "8.8.4"; public static int APP_ID = 4; - public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; - + public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";; + 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/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index 6315ffc79..e09f4a4e7 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -46,6 +46,8 @@ public class FileLoadOperation { } } + private static final Object lockObject = new Object(); + private static class PreloadRange { private long fileOffset; private long length; @@ -182,7 +184,7 @@ public class FileLoadOperation { private void updateParams() { if (MessagesController.getInstance(currentAccount).getfileExperimentalParams) { - downloadChunkSizeBig = 1024 * 512; + downloadChunkSizeBig = 1024 * 128; maxDownloadRequests = 8; maxDownloadRequestsBig = 8; } else { @@ -770,7 +772,11 @@ public class FileLoadOperation { TLRPC.TL_theme theme = (TLRPC.TL_theme) parentObject; cacheFileFinal = new File(ApplicationLoader.getFilesDirFixed(), "remote" + theme.id + ".attheme"); } else { - cacheFileFinal = new File(storePath, storeFileName); + if (!encryptFile) { + cacheFileFinal = new File(storePath, storeFileName); + } else { + cacheFileFinal = new File(storePath, fileNameFinal); + } } boolean finalFileExist = cacheFileFinal.exists(); if (finalFileExist && (parentObject instanceof TLRPC.TL_theme || totalBytesCount != 0 && totalBytesCount != cacheFileFinal.length())) { @@ -1253,18 +1259,20 @@ public class FileLoadOperation { } else { try { if (pathSaveData != null) { - cacheFileFinal = new File(storePath, storeFileName); - int count = 1; - while (cacheFileFinal.exists()) { - int lastDotIndex = storeFileName.lastIndexOf('.'); - String newFileName; - if (lastDotIndex > 0) { - newFileName = storeFileName.substring(0, lastDotIndex) + " (" + count + ")" + storeFileName.substring(lastDotIndex); - } else { - newFileName = storeFileName + " (" + count + ")"; + synchronized (lockObject) { + cacheFileFinal = new File(storePath, storeFileName); + int count = 1; + while (cacheFileFinal.exists()) { + int lastDotIndex = storeFileName.lastIndexOf('.'); + String newFileName; + if (lastDotIndex > 0) { + newFileName = storeFileName.substring(0, lastDotIndex) + " (" + count + ")" + storeFileName.substring(lastDotIndex); + } else { + newFileName = storeFileName + " (" + count + ")"; + } + cacheFileFinal = new File(storePath, newFileName); + count++; } - cacheFileFinal = new File(storePath, newFileName); - count++; } } renameResult = cacheFileTemp.renameTo(cacheFileFinal); @@ -1290,14 +1298,15 @@ public class FileLoadOperation { return; } cacheFileFinal = cacheFileTemp; + } else { + if (pathSaveData != null && cacheFileFinal.exists()) { + delegate.saveFilePath(pathSaveData, cacheFileFinal); + } } } else { onFail(false, 0); return; } - if (pathSaveData != null && cacheFileFinal.exists()) { - delegate.saveFilePath(pathSaveData, cacheFileFinal); - } } if (BuildVars.LOGS_ENABLED) { FileLog.d("finished downloading file to " + cacheFileFinal); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index d4615b184..d82098670 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -629,6 +629,9 @@ public class FileLoader extends BaseController { } FileLoadOperation operation = loadOperationPaths.get(fileName); + if (BuildVars.LOGS_ENABLED) { + FileLog.d("checkFile operation fileName=" + fileName + " documentName=" + getDocumentFileName(document) + " operation=" + operation); + } if (operation != null) { if (cacheType != 10 && operation.isPreloadVideoOperation()) { operation.setIsPreloadVideoOperation(false); @@ -675,7 +678,6 @@ public class FileLoader extends BaseController { int type = MEDIA_DIR_CACHE; long documentId = 0; int dcId = 0; - String lastKnownPath = null; if (secureDocument != null) { operation = new FileLoadOperation(secureDocument); @@ -687,14 +689,20 @@ public class FileLoader extends BaseController { type = MEDIA_DIR_IMAGE; } else if (document != null) { operation = new FileLoadOperation(document, parentObject); - documentId = document.id; - dcId = document.dc_id; if (MessageObject.isVoiceDocument(document)) { type = MEDIA_DIR_AUDIO; } else if (MessageObject.isVideoDocument(document)) { type = MEDIA_DIR_VIDEO; + documentId = document.id; + dcId = document.dc_id; } else { type = MEDIA_DIR_DOCUMENT; + documentId = document.id; + dcId = document.dc_id; + } + if (MessageObject.isRoundVideoDocument(document)) { + documentId = 0; + dcId = 0; } } else if (webDocument != null) { operation = new FileLoadOperation(currentAccount, webDocument); @@ -831,33 +839,34 @@ public class FileLoader extends BaseController { operation.setPriority(priority); boolean started; + int maxCount, count; if (queueType == QUEUE_TYPE_PRELOAD) { - int maxCount = priority > 0 ? 6 : 2; - int count = preloadingLoadOperationsCount.get(datacenterId); + maxCount = priority > 0 ? 6 : 2; + count = preloadingLoadOperationsCount.get(datacenterId); if (started = (stream != null || count < maxCount)) { if (operation.start(stream, streamOffset, streamPriority)) { preloadingLoadOperationsCount.put(datacenterId, count + 1); } } } else if (queueType == QUEUE_TYPE_AUDIO) { - int maxCount = priority > 0 ? 3 : 1; - int count = audioLoadOperationsCount.get(datacenterId); + maxCount = priority > 0 ? 3 : 1; + count = audioLoadOperationsCount.get(datacenterId); if (started = (stream != null || count < maxCount)) { if (operation.start(stream, streamOffset, streamPriority)) { audioLoadOperationsCount.put(datacenterId, count + 1); } } } else if (queueType == QUEUE_TYPE_IMAGE) { - int maxCount = priority > 0 ? 6 : 2; - int count = imageLoadOperationsCount.get(datacenterId); + maxCount = priority > 0 ? 6 : 2; + count = imageLoadOperationsCount.get(datacenterId); if (started = (stream != null || count < maxCount)) { if (operation.start(stream, streamOffset, streamPriority)) { imageLoadOperationsCount.put(datacenterId, count + 1); } } } else { - int maxCount = priority > 0 ? 4 : 1; - int count = fileLoadOperationsCount.get(datacenterId); + maxCount = priority > 0 ? 4 : 1; + count = fileLoadOperationsCount.get(datacenterId); if (started = (stream != null || count < maxCount)) { if (operation.start(stream, streamOffset, streamPriority)) { fileLoadOperationsCount.put(datacenterId, count + 1); @@ -868,6 +877,11 @@ public class FileLoader extends BaseController { } } } + + if (BuildVars.LOGS_ENABLED) { + FileLog.d("loadFileInternal fileName=" + fileName + " documentName=" + getDocumentFileName(document) + " queueType=" + queueType + " maxCount=" + maxCount + " count=" + count); + } + if (!started) { addOperationToQueue(operation, getLoadOperationQueue(datacenterId, queueType)); } @@ -893,7 +907,7 @@ public class FileLoader extends BaseController { MessageObject messageObject = (MessageObject) parentObject; int flag; long dialogId = messageObject.getDialogId(); - if (messageObject.isAnyKindOfSticker() || getMessagesController().isChatNoForwards(getMessagesController().getChat(-dialogId)) || messageObject.messageOwner.noforwards) { + if (messageObject.isRoundVideo() || messageObject.isVoice() || messageObject.isAnyKindOfSticker() || getMessagesController().isChatNoForwards(getMessagesController().getChat(-dialogId)) || messageObject.messageOwner.noforwards) { return false; } if (dialogId >= 0) { @@ -1162,17 +1176,22 @@ public class FileLoader extends BaseController { if (photoSize instanceof TLRPC.TL_photoStrippedSize || photoSize instanceof TLRPC.TL_photoPathSize) { dir = null; } else if (photoSize.location == null || photoSize.location.key != null || photoSize.location.volume_id == Integer.MIN_VALUE && photoSize.location.local_id < 0 || photoSize.size < 0) { - dir = getDirectory(MEDIA_DIR_CACHE); + dir = getDirectory(type = MEDIA_DIR_CACHE); } else { - dir = getDirectory(MEDIA_DIR_IMAGE); + dir = getDirectory(type = MEDIA_DIR_IMAGE); } + documentId = photoSize.location.volume_id; + dcId = photoSize.location.dc_id; + } else if (attach instanceof TLRPC.TL_videoSize) { TLRPC.TL_videoSize videoSize = (TLRPC.TL_videoSize) attach; if (videoSize.location == null || videoSize.location.key != null || videoSize.location.volume_id == Integer.MIN_VALUE && videoSize.location.local_id < 0 || videoSize.size < 0) { - dir = getDirectory(MEDIA_DIR_CACHE); + dir = getDirectory(type = MEDIA_DIR_CACHE); } else { - dir = getDirectory(MEDIA_DIR_IMAGE); + dir = getDirectory(type = MEDIA_DIR_IMAGE); } + documentId = videoSize.location.volume_id; + dcId = videoSize.location.dc_id; } else if (attach instanceof TLRPC.FileLocation) { TLRPC.FileLocation fileLocation = (TLRPC.FileLocation) attach; if (fileLocation.key != null || fileLocation.volume_id == Integer.MIN_VALUE && fileLocation.local_id < 0) { @@ -1614,6 +1633,10 @@ public class FileLoader extends BaseController { getDownloadController().clearRecentDownloadedFiles(); } + public void clearFilePaths() { + filePathDatabase.clear(); + } + public static boolean checkUploadFileSize(int currentAccount, long length) { boolean premium = AccountInstance.getInstance(currentAccount).getUserConfig().isPremium(); if (length < DEFAULT_MAX_FILE_SIZE || (length < DEFAULT_MAX_FILE_SIZE_PREMIUM && premium)) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java b/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java index de5ae346a..cf1b49ee1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java @@ -61,7 +61,7 @@ public class FilePathDatabase { } else { int version = database.executeInt("PRAGMA user_version"); if (BuildVars.LOGS_ENABLED) { - FileLog.d("current db version = " + version); + FileLog.d("current files db version = " + version); } if (version == 0) { throw new Exception("malformed"); @@ -140,6 +140,9 @@ public class FilePathDatabase { cursor = database.queryFinalized("SELECT path FROM paths WHERE document_id = " + documentId + " AND dc_id = " + dc + " AND type = " + type); if (cursor.next()) { res[0] = cursor.stringValue(0); + if (BuildVars.DEBUG_VERSION) { + FileLog.d("get file path id=" + documentId + " dc=" + dc + " type=" + type + " path=" + res[0]); + } } cursor.dispose(); } catch (SQLiteException e) { @@ -159,6 +162,9 @@ public class FilePathDatabase { cursor = database.queryFinalized("SELECT path FROM paths WHERE document_id = " + documentId + " AND dc_id = " + dc + " AND type = " + type); if (cursor.next()) { res = cursor.stringValue(0); + if (BuildVars.DEBUG_VERSION) { + FileLog.d("get file path id=" + documentId + " dc=" + dc + " type=" + type + " path=" + res); + } } cursor.dispose(); } catch (SQLiteException e) { @@ -170,6 +176,9 @@ public class FilePathDatabase { public void putPath(long id, int dc, int type, String path) { dispatchQueue.postRunnable(() -> { + if (BuildVars.DEBUG_VERSION) { + FileLog.d("put file path id=" + id + " dc=" + dc + " type=" + type + " path=" + path); + } SQLitePreparedStatement state = null; try { if (path != null) { @@ -224,6 +233,16 @@ public class FilePathDatabase { } } + public void clear() { + dispatchQueue.postRunnable(() -> { + try { + database.executeFast("DELETE FROM paths WHERE 1").stepThis().dispose(); + } catch (SQLiteException e) { + FileLog.e(e); + } + }); + } + public static class PathData { public final long id; public final int dc; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java index 3e8f2dca1..90b8df939 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java @@ -997,7 +997,7 @@ public class ImageLoader { boolean needInvert = false; int orientation = 0; File cacheFileFinal = cacheImage.finalFilePath; - boolean inEncryptedFile = cacheImage.secureDocument != null || cacheImage.encryptionKeyPath != null && cacheFileFinal != null && (cacheFileFinal.getAbsolutePath().endsWith(".enc") || cacheFileFinal.getAbsolutePath().endsWith(".64enc")); + boolean inEncryptedFile = cacheImage.secureDocument != null || cacheImage.encryptionKeyPath != null && cacheFileFinal != null && cacheFileFinal.getAbsolutePath().endsWith(".enc"); SecureDocumentKey secureDocumentKey; byte[] secureDocumentHash; if (cacheImage.secureDocument != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java index 11ab496f3..f64bf426b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java @@ -359,20 +359,21 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (user.photo != null) { strippedBitmap = user.photo.strippedBitmap; hasStripped = user.photo.stripped_thumb != null; - if (MessagesController.getInstance(currentAccount).isPremiumUser(user) && user.photo.has_video && animationEnabled) { + if (animationEnabled && MessagesController.getInstance(currentAccount).isPremiumUser(user) && user.photo.has_video) { final TLRPC.UserFull userFull = MessagesController.getInstance(currentAccount).getUserFull(user.id); if (userFull == null) { MessagesController.getInstance(currentAccount).loadFullUser(user, currentGuid, false); - } - if (userFull != null && userFull.profile_photo != null && userFull.profile_photo.video_sizes != null && !userFull.profile_photo.video_sizes.isEmpty()) { - TLRPC.VideoSize videoSize = userFull.profile_photo.video_sizes.get(0); - for (int i = 0; i < userFull.profile_photo.video_sizes.size(); i++) { - if ("p".equals(userFull.profile_photo.video_sizes.get(i).type)) { - videoSize = userFull.profile_photo.video_sizes.get(i); - break; + } else { + if (userFull.profile_photo != null && userFull.profile_photo.video_sizes != null && !userFull.profile_photo.video_sizes.isEmpty()) { + TLRPC.VideoSize videoSize = userFull.profile_photo.video_sizes.get(0); + for (int i = 0; i < userFull.profile_photo.video_sizes.size(); i++) { + if ("p".equals(userFull.profile_photo.video_sizes.get(i).type)) { + videoSize = userFull.profile_photo.video_sizes.get(i); + break; + } } + videoLocation = ImageLocation.getForPhoto(videoSize, userFull.profile_photo); } - videoLocation = ImageLocation.getForPhoto(videoSize, userFull.profile_photo); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java index 854085961..0d605ead8 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java @@ -101,11 +101,17 @@ public class MediaDataController extends BaseController { public static String SHORTCUT_CATEGORY = "org.telegram.messenger.SHORTCUT_SHARE"; private static volatile MediaDataController[] Instance = new MediaDataController[UserConfig.MAX_ACCOUNT_COUNT]; + private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; + static { + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + lockObjects[i] = new Object(); + } + } public static MediaDataController getInstance(int num) { MediaDataController localInstance = Instance[num]; if (localInstance == null) { - synchronized (MediaDataController.class) { + synchronized (lockObjects) { localInstance = Instance[num]; if (localInstance == null) { Instance[num] = localInstance = new MediaDataController(num); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 0356cf05f..36c68a66d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -145,7 +145,7 @@ public class MessagesController extends BaseController implements NotificationCe private int pollsToCheckSize; private long lastViewsCheckTime; public SparseIntArray premiumFeaturesTypesToPosition = new SparseIntArray(); - + public ArrayList dialogFilters = new ArrayList<>(); public SparseArray dialogFiltersById = new SparseArray<>(); private boolean loadingSuggestedFilters; @@ -873,7 +873,7 @@ public class MessagesController extends BaseController implements NotificationCe }; private static volatile MessagesController[] Instance = new MessagesController[UserConfig.MAX_ACCOUNT_COUNT]; - private static volatile Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; + private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; static { for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { lockObjects[i] = new Object(); @@ -1624,6 +1624,7 @@ public class MessagesController extends BaseController implements NotificationCe SharedPreferences.Editor editor = mainPreferences.edit(); boolean changed = false; boolean keelAliveChanged = false; + resetAppConfig(); TLRPC.TL_jsonObject object = (TLRPC.TL_jsonObject) response; for (int a = 0, N = object.value.size(); a < N; a++) { TLRPC.TL_jsonObjectValue value = object.value.get(a); @@ -2410,6 +2411,11 @@ public class MessagesController extends BaseController implements NotificationCe })); } + private void resetAppConfig() { + getfileExperimentalParams = false; + mainPreferences.edit().remove("getfileExperimentalParams"); + } + private boolean savePremiumFeaturesPreviewOrder(SharedPreferences.Editor editor, ArrayList value) { StringBuilder stringBuilder = new StringBuilder(); premiumFeaturesTypesToPosition.clear(); @@ -9133,7 +9139,7 @@ public class MessagesController extends BaseController implements NotificationCe } MessageObject oldMsg = dialogMessage.get(key); if (BuildVars.LOGS_ENABLED) { - FileLog.d("processDialogsUpdate oldMsg " + oldMsg + " old top_message = " + currentDialog.top_message + " new top_message = " + value.top_message); + FileLog.d("processDialogsUpdate oldMsg " + oldMsg + " old top_message = " + currentDialog.top_message + " new top_message = " + value.top_message + " unread_count =" + currentDialog.unread_count + " fromCache=" + fromCache); FileLog.d("processDialogsUpdate oldMsgDeleted " + (oldMsg != null && oldMsg.deleted)); } if (oldMsg == null || currentDialog.top_message > 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index eb73eb94c..32cffcac2 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -83,6 +83,13 @@ public class MessagesStorage extends BaseController { private CountDownLatch openSync = new CountDownLatch(1); private static volatile MessagesStorage[] Instance = new MessagesStorage[UserConfig.MAX_ACCOUNT_COUNT]; + private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; + static { + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + lockObjects[i] = new Object(); + } + } + private final static int LAST_DB_VERSION = 98; private boolean databaseMigrationInProgress; public boolean showClearDatabaseAlert; @@ -91,7 +98,7 @@ public class MessagesStorage extends BaseController { public static MessagesStorage getInstance(int num) { MessagesStorage localInstance = Instance[num]; if (localInstance == null) { - synchronized (MessagesStorage.class) { + synchronized (lockObjects[num]) { localInstance = Instance[num]; if (localInstance == null) { Instance[num] = localInstance = new MessagesStorage(num); @@ -10411,6 +10418,7 @@ public class MessagesStorage extends BaseController { state.step(); state.dispose(); getMessagesStorage().getDatabase().commitTransaction(); + data.reuse(); } deleteFromDownloadQueue(idsToDelete, true); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index d8da05540..155b1042b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -142,11 +142,17 @@ public class NotificationsController extends BaseController { } private static volatile NotificationsController[] Instance = new NotificationsController[UserConfig.MAX_ACCOUNT_COUNT]; + private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; + static { + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + lockObjects[i] = new Object(); + } + } public static NotificationsController getInstance(int num) { NotificationsController localInstance = Instance[num]; if (localInstance == null) { - synchronized (NotificationsController.class) { + synchronized (lockObjects[num]) { localInstance = Instance[num]; if (localInstance == null) { Instance[num] = localInstance = new NotificationsController(num); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java index ee8b7f964..d5509d0c9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java @@ -348,7 +348,7 @@ public class SharedConfig { preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); boolean saveToGalleryLegacy = preferences.getBoolean("save_gallery", false); - if (saveToGalleryLegacy) { + if (saveToGalleryLegacy && BuildVars.NO_SCOPED_STORAGE) { saveToGalleryFlags = SAVE_TO_GALLERY_FLAG_PEER + SAVE_TO_GALLERY_FLAG_CHANNELS + SAVE_TO_GALLERY_FLAG_GROUP; preferences.edit().remove("save_gallery").putInt("save_gallery_flags", saveToGalleryFlags).apply(); } else { @@ -1229,7 +1229,7 @@ public class SharedConfig { devicePerformanceClass = PERFORMANCE_CLASS_HIGH; } if (BuildVars.LOGS_ENABLED) { - FileLog.d("device performance info (cpu_count = " + cpuCount + ", freq = " + maxCpuFreq + ", memoryClass = " + memoryClass + ", android version " + androidVersion + ")"); + FileLog.d("device performance info selected_class = " + devicePerformanceClass + " (cpu_count = " + cpuCount + ", freq = " + maxCpuFreq + ", memoryClass = " + memoryClass + ", android version " + androidVersion + ")"); } } diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java index 7a5d21881..6c49bd186 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java @@ -31865,6 +31865,9 @@ public class TLRPC { case 0xdc7b1140: result = new TL_messageEntityMentionName(); break; + case 0xd4a00ed5: + result = new TL_messageEntityCustomEmoji(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in MessageEntity", constructor)); @@ -60296,6 +60299,30 @@ public class TLRPC { invoice_media.serializeToStream(stream); } } + + public static class TL_messageEntityCustomEmoji extends MessageEntity { + public static int constructor = 0xd4a00ed5; + + public int offset; + public int length; + public InputStickerSet stickerset; + public long document_id; + + public void readParams(AbstractSerializedData stream, boolean exception) { + offset = stream.readInt32(exception); + length = stream.readInt32(exception); + stickerset = InputStickerSet.TLdeserialize(stream, stream.readInt32(exception), exception); + document_id = stream.readInt64(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(offset); + stream.writeInt32(length); + stickerset.serializeToStream(stream); + stream.writeInt64(document_id); + } + } //functions public static class Vector extends TLObject { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java index 98467afc3..0dcf0a640 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java @@ -283,8 +283,12 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe Utilities.globalQueue.postRunnable(() -> { boolean imagesCleared = false; long clearedSize = 0; + boolean allItemsClear = true; for (int a = 0; a < 7; a++) { if (clearViewData[a] == null || !clearViewData[a].clear) { + if (clearViewData[a] != null) { + allItemsClear = false; + } continue; } int type = -1; @@ -398,6 +402,9 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe totalDeviceFreeSize = availableBlocks * blockSize; long finalClearedSize = clearedSize; + if (allItemsClear) { + FileLoader.getInstance(currentAccount).clearFilePaths(); + } FileLoader.getInstance(currentAccount).checkCurrentDownloadsFiles(); AndroidUtilities.runOnUIThread(() -> { 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 670b16de0..67f776cdb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -199,6 +199,57 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate setSpoilersSuppressed(false); } else if (id == NotificationCenter.stopSpoilers) { setSpoilersSuppressed(true); + } else if (id == NotificationCenter.userInfoDidLoad) { + if (currentUser != null) { + Long uid = (Long) args[0]; + if (currentUser.id == uid) { + setAvatar(currentMessageObject); + } + } + } + } + + private void setAvatar(MessageObject messageObject) { + if (messageObject == null) { + return; + } + if (isAvatarVisible) { + if (messageObject.customAvatarDrawable != null) { + avatarImage.setImageBitmap(messageObject.customAvatarDrawable); + } else if (currentUser != null) { + if (currentUser.photo != null) { + currentPhoto = currentUser.photo.photo_small; + } else { + currentPhoto = null; + } + avatarDrawable.setInfo(currentUser); + avatarImage.setForUserOrChat(currentUser, avatarDrawable, null, true); + } else if (currentChat != null) { + if (currentChat.photo != null) { + currentPhoto = currentChat.photo.photo_small; + } else { + currentPhoto = null; + } + avatarDrawable.setInfo(currentChat); + avatarImage.setForUserOrChat(currentChat, avatarDrawable); + } else if (messageObject != null && messageObject.isSponsored()) { + if (messageObject.sponsoredChatInvite != null && messageObject.sponsoredChatInvite.chat != null) { + avatarDrawable.setInfo(messageObject.sponsoredChatInvite.chat); + avatarImage.setForUserOrChat(messageObject.sponsoredChatInvite.chat, avatarDrawable); + } else { + avatarDrawable.setInfo(messageObject.sponsoredChatInvite); + TLRPC.Photo photo = messageObject.sponsoredChatInvite.photo; + if (photo != null) { + avatarImage.setImage(ImageLocation.getForPhoto(photo.sizes.get(0), photo), "50_50", avatarDrawable, null, null, 0); + } + } + } else { + currentPhoto = null; + avatarDrawable.setInfo(messageObject.getFromChatId(), null, null); + avatarImage.setImage(null, null, avatarDrawable, null, null, 0); + } + } else { + currentPhoto = null; } } @@ -3356,6 +3407,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.startSpoilers); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.stopSpoilers); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.userInfoDidLoad); cancelShakeAnimation(); if (animationRunning) { @@ -3423,6 +3475,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.startSpoilers); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.stopSpoilers); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.userInfoDidLoad); if (currentMessageObject != null) { currentMessageObject.animateComments = false; @@ -3456,6 +3509,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate videoRadialProgress.onAttachedToWindow(); avatarImage.setParentView((View) getParent()); avatarImage.onAttachedToWindow(); + if (currentMessageObject != null) { + setAvatar(currentMessageObject); + } if (pollAvatarImages != null) { for (int a = 0; a < pollAvatarImages.length; a++) { pollAvatarImages[a].onAttachedToWindow(); @@ -10646,46 +10702,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } updateCurrentUserAndChat(); - - if (isAvatarVisible) { - if (messageObject.customAvatarDrawable != null) { - avatarImage.setImageBitmap(messageObject.customAvatarDrawable); - } else if (currentUser != null) { - if (currentUser.photo != null) { - currentPhoto = currentUser.photo.photo_small; - } else { - currentPhoto = null; - } - avatarDrawable.setInfo(currentUser); - avatarImage.setForUserOrChat(currentUser, avatarDrawable, null, true); - } else if (currentChat != null) { - if (currentChat.photo != null) { - currentPhoto = currentChat.photo.photo_small; - } else { - currentPhoto = null; - } - avatarDrawable.setInfo(currentChat); - avatarImage.setForUserOrChat(currentChat, avatarDrawable); - } else if (messageObject != null && messageObject.isSponsored()) { - if (messageObject.sponsoredChatInvite != null && messageObject.sponsoredChatInvite.chat != null) { - avatarDrawable.setInfo(messageObject.sponsoredChatInvite.chat); - avatarImage.setForUserOrChat(messageObject.sponsoredChatInvite.chat, avatarDrawable); - } else { - avatarDrawable.setInfo(messageObject.sponsoredChatInvite); - TLRPC.Photo photo = messageObject.sponsoredChatInvite.photo; - if (photo != null) { - avatarImage.setImage(ImageLocation.getForPhoto(photo.sizes.get(0), photo), "50_50", avatarDrawable, null, null, 0); - } - } - } else { - currentPhoto = null; - avatarDrawable.setInfo(messageObject.getFromChatId(), null, null); - avatarImage.setImage(null, null, avatarDrawable, null, null, 0); - } - } else { - currentPhoto = null; - } - + setAvatar(messageObject); measureTime(messageObject); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java index 12c543f6e..5d69504ed 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -32,7 +32,6 @@ import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; import android.text.style.ReplacementSpan; import android.text.style.StyleSpan; -import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -2064,31 +2063,29 @@ public class DialogCell extends BaseCell { if (isDialogCell) { TLRPC.Dialog dialog = MessagesController.getInstance(currentAccount).dialogs_dict.get(currentDialogId); if (dialog != null) { - if (mask == 0) { - clearingDialog = MessagesController.getInstance(currentAccount).isClearingDialog(dialog.id); - message = MessagesController.getInstance(currentAccount).dialogMessage.get(dialog.id); - lastUnreadState = message != null && message.isUnread(); - if (dialog instanceof TLRPC.TL_dialogFolder) { - unreadCount = MessagesStorage.getInstance(currentAccount).getArchiveUnreadCount(); - mentionCount = 0; - reactionMentionCount = 0; - } else { - unreadCount = dialog.unread_count; - mentionCount = dialog.unread_mentions_count; - reactionMentionCount = dialog.unread_reactions_count; - } - markUnread = dialog.unread_mark; - currentEditDate = message != null ? message.messageOwner.edit_date : 0; - lastMessageDate = dialog.last_message_date; - if (dialogsType == 7 || dialogsType == 8) { - MessagesController.DialogFilter filter = MessagesController.getInstance(currentAccount).selectedDialogFilter[dialogsType == 8 ? 1 : 0]; - drawPin = filter != null && filter.pinnedDialogs.indexOfKey(dialog.id) >= 0; - } else { - drawPin = currentDialogFolderId == 0 && dialog.pinned; - } - if (message != null) { - lastSendState = message.messageOwner.send_state; - } + clearingDialog = MessagesController.getInstance(currentAccount).isClearingDialog(dialog.id); + message = MessagesController.getInstance(currentAccount).dialogMessage.get(dialog.id); + lastUnreadState = message != null && message.isUnread(); + if (dialog instanceof TLRPC.TL_dialogFolder) { + unreadCount = MessagesStorage.getInstance(currentAccount).getArchiveUnreadCount(); + mentionCount = 0; + reactionMentionCount = 0; + } else { + unreadCount = dialog.unread_count; + mentionCount = dialog.unread_mentions_count; + reactionMentionCount = dialog.unread_reactions_count; + } + markUnread = dialog.unread_mark; + currentEditDate = message != null ? message.messageOwner.edit_date : 0; + lastMessageDate = dialog.last_message_date; + if (dialogsType == 7 || dialogsType == 8) { + MessagesController.DialogFilter filter = MessagesController.getInstance(currentAccount).selectedDialogFilter[dialogsType == 8 ? 1 : 0]; + drawPin = filter != null && filter.pinnedDialogs.indexOfKey(dialog.id) >= 0; + } else { + drawPin = currentDialogFolderId == 0 && dialog.pinned; + } + if (message != null) { + lastSendState = message.messageOwner.send_state; } } else { unreadCount = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 45249d126..bc0b2f4dc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -61,7 +61,6 @@ import android.text.TextUtils; import android.text.style.CharacterStyle; import android.text.style.ForegroundColorSpan; import android.text.style.URLSpan; -import android.util.Log; import android.util.Property; import android.util.SparseArray; import android.util.SparseIntArray; @@ -543,6 +542,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent private boolean allowContextBotPanel; private boolean allowContextBotPanelSecond = true; private AnimatorSet runningAnimation; + private int runningAnimationIndex = -1; private MessageObject selectedObjectToEditCaption; private MessageObject selectedObject; @@ -6543,7 +6543,7 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent reactionsMentiondownButton = new FrameLayout(context); contentView.addView(reactionsMentiondownButton, LayoutHelper.createFrame(46, 61, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 7, 5)); - mentionContainer = new MentionsContainerView(context, dialog_id, threadMessageId, contentView, themeDelegate) { + mentionContainer = new MentionsContainerView(context, dialog_id, threadMessageId, ChatActivity.this, themeDelegate) { @Override protected boolean canOpen() { @@ -10023,9 +10023,11 @@ ChatActivity extends BaseFragment implements NotificationCenter.NotificationCent ObjectAnimator.ofFloat(stickersPanel, View.ALPHA, show ? 0.0f : 1.0f, show ? 1.0f : 0.0f) ); runningAnimation.setDuration(150); + runningAnimationIndex = getNotificationCenter().setAnimationInProgress(runningAnimationIndex, null); runningAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { + getNotificationCenter().onAnimationFinish(runningAnimationIndex); if (runningAnimation != null && runningAnimation.equals(animation)) { if (!show) { stickersAdapter.clearSearch(); 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 80bbbfd88..180327404 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedFileDrawable.java @@ -146,6 +146,7 @@ public class AnimatedFileDrawable extends BitmapDrawable implements Animatable { public int repeatCount; private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8, new ThreadPoolExecutor.DiscardPolicy()); + private static ScheduledThreadPoolExecutor generateCache = new ScheduledThreadPoolExecutor(4, new ThreadPoolExecutor.DiscardPolicy()); private Runnable uiRunnableNoFrame = new Runnable() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java index 2c8d84c68..49c5a301e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java @@ -191,8 +191,12 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter private FloatBuffer vertexBuffer; private FloatBuffer textureBuffer; + private FloatBuffer oldTextureTextureBuffer; private float scaleX; private float scaleY; + + private Size oldTexturePreviewSize; + private boolean flipAnimationInProgress; private View parentView; @@ -543,7 +547,6 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { switchCameraDrawable = (AnimatedVectorDrawable) ContextCompat.getDrawable(getContext(), R.drawable.avd_flip); switchCameraButton.setImageDrawable(switchCameraDrawable); @@ -610,7 +613,11 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, final int width, final int height) { - + if (cameraThread != null) { + cameraThread.surfaceWidth = width; + cameraThread.surfaceHeight = height; + cameraThread.updateScale(); + } } @Override @@ -969,21 +976,21 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter private Size chooseOptimalSize(ArrayList previewSizes) { ArrayList sortedSizes = new ArrayList<>(); for (int i = 0; i < previewSizes.size(); i++) { - if (Math.max(previewSizes.get(i).mHeight, previewSizes.get(i).mHeight) <= 1200 && Math.min(previewSizes.get(i).mHeight, previewSizes.get(i).mHeight) >= 320) { + if (Math.max(previewSizes.get(i).mHeight, previewSizes.get(i).mWidth) <= 1200 && Math.min(previewSizes.get(i).mHeight, previewSizes.get(i).mWidth) >= 320) { sortedSizes.add(previewSizes.get(i)); } } - if (sortedSizes.isEmpty() || SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW) { + if (sortedSizes.isEmpty() || SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW || SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_AVERAGE) { return CameraController.chooseOptimalSize(previewSizes, 480, 270, aspectRatio); } Collections.sort(sortedSizes, (o1, o2) -> { - float a1 = Math.min(o1.mHeight, o1.mWidth) / (float) Math.max(o1.mHeight, o1.mWidth); - float a2 = Math.min(o2.mHeight, o2.mWidth) / (float) Math.max(o2.mHeight, o2.mWidth); + float a1 = Math.abs(1f - Math.min(o1.mHeight, o1.mWidth) / (float) Math.max(o1.mHeight, o1.mWidth)); + float a2 = Math.abs(1f - Math.min(o2.mHeight, o2.mWidth) / (float) Math.max(o2.mHeight, o2.mWidth)); if (a1 < a2) { - return 1; - } else if (a1 > a2) { return -1; + } else if (a1 > a2) { + return 1; } return 0; }); @@ -1129,10 +1136,20 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter private VideoRecorder videoEncoder; + private int surfaceWidth; + private int surfaceHeight; + public CameraGLThread(SurfaceTexture surface, int surfaceWidth, int surfaceHeight) { super("CameraGLThread"); surfaceTexture = surface; + this.surfaceWidth = surfaceWidth; + this.surfaceHeight = surfaceHeight; + + updateScale(); + } + + private void updateScale() { int width = previewSize.getWidth(); int height = previewSize.getHeight(); @@ -1140,13 +1157,19 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter width *= scale; height *= scale; - if (width > height) { + + if (width == height) { + scaleX = 1f; + scaleY = 1f; + } else if (width > height) { scaleX = 1.0f; scaleY = width / (float) surfaceHeight; } else { scaleX = height / (float) surfaceWidth; scaleY = 1.0f; } + FileLog.d("camera scaleX = " + scaleX + " scaleY = " + scaleY); + } private boolean initGL() { @@ -1313,6 +1336,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter if (handler != null) { sendMessage(handler.obtainMessage(DO_REINIT_MESSAGE), 0); } + updateScale(); } public void finish() { @@ -1430,6 +1454,8 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter oldCameraTexture[0] = cameraTexture[0]; cameraTextureAlpha = 0.0f; cameraTexture[0] = 0; + oldTextureTextureBuffer = textureBuffer.duplicate(); + oldTexturePreviewSize = previewSize; } cameraId++; cameraReady = false; @@ -1444,6 +1470,21 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter cameraSurface = new SurfaceTexture(cameraTexture[0]); cameraSurface.setOnFrameAvailableListener(surfaceTexture -> requestRender()); createCamera(cameraSurface); + + cameraThread.updateScale(); + + float tX = 1.0f / scaleX / 2.0f; + float tY = 1.0f / scaleY / 2.0f; + + float[] texData = { + 0.5f - tX, 0.5f - tY, + 0.5f + tX, 0.5f - tY, + 0.5f - tX, 0.5f + tY, + 0.5f + tX, 0.5f + tY + }; + + textureBuffer = ByteBuffer.allocateDirect(texData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); + textureBuffer.put(texData).position(0); break; } case DO_SETSESSION_MESSAGE: { @@ -1618,8 +1659,8 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter private int textureMatrixHandle; private int positionHandle; private int textureHandle; - private int scaleXHandle; - private int scaleYHandle; + private int resolutionHandle; + private int previewSizeHandle; private int alphaHandle; private int zeroTimeStamps; private Integer lastCameraId = 0; @@ -1956,25 +1997,38 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter videoLast = timestampNanos; GLES20.glUseProgram(drawProgram); - GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer); - GLES20.glEnableVertexAttribArray(positionHandle); - GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); - GLES20.glEnableVertexAttribArray(textureHandle); - GLES20.glUniform1f(scaleXHandle, scaleX); - GLES20.glUniform1f(scaleYHandle, scaleY); GLES20.glUniformMatrix4fv(vertexMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glEnableVertexAttribArray(positionHandle); + GLES20.glEnableVertexAttribArray(textureHandle); + + GLES20.glUniform2f(resolutionHandle, videoWidth, videoHeight); + if (oldCameraTexture[0] != 0) { if (!blendEnabled) { GLES20.glEnable(GLES20.GL_BLEND); blendEnabled = true; } + if (oldTexturePreviewSize != null) { + GLES20.glUniform2f(previewSizeHandle, oldTexturePreviewSize.getWidth(), oldTexturePreviewSize.getHeight()); + } + GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 8, oldTextureTextureBuffer); + GLES20.glUniformMatrix4fv(textureMatrixHandle, 1, false, moldSTMatrix, 0); GLES20.glUniform1f(alphaHandle, 1.0f); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, oldCameraTexture[0]); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); } + + + if (previewSize != null) { + GLES20.glUniform2f(previewSizeHandle, previewSize.getWidth(), previewSize.getHeight()); + } + + GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer); + GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); + GLES20.glUniformMatrix4fv(textureMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glUniform1f(alphaHandle, cameraTextureAlpha); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, cameraTexture[0]); @@ -2022,14 +2076,19 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter public void run() { final TextureView textureView = InstantCameraView.this.textureView; if (textureView != null) { - final Bitmap bitmap = textureView.getBitmap(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); - AndroidUtilities.runOnUIThread(() -> { - if ((bitmap == null || bitmap.getPixel(0, 0) == 0) && keyframeThumbs.size() > 1) { - keyframeThumbs.add(keyframeThumbs.get(keyframeThumbs.size() - 1)); - } else { - keyframeThumbs.add(bitmap); - } - }); + try { + final Bitmap bitmap = textureView.getBitmap(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + AndroidUtilities.runOnUIThread(() -> { + if ((bitmap == null || bitmap.getPixel(0, 0) == 0) && keyframeThumbs.size() > 1) { + keyframeThumbs.add(keyframeThumbs.get(keyframeThumbs.size() - 1)); + } else { + keyframeThumbs.add(bitmap); + } + }); + } catch (Exception e) { + FileLog.e(e); + } + } } } @@ -2340,8 +2399,8 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } else { positionHandle = GLES20.glGetAttribLocation(drawProgram, "aPosition"); textureHandle = GLES20.glGetAttribLocation(drawProgram, "aTextureCoord"); - scaleXHandle = GLES20.glGetUniformLocation(drawProgram, "scaleX"); - scaleYHandle = GLES20.glGetUniformLocation(drawProgram, "scaleY"); + previewSizeHandle = GLES20.glGetUniformLocation(drawProgram, "preview"); + resolutionHandle = GLES20.glGetUniformLocation(drawProgram, "resolution"); alphaHandle = GLES20.glGetUniformLocation(drawProgram, "alpha"); vertexMatrixHandle = GLES20.glGetUniformLocation(drawProgram, "uMVPMatrix"); textureMatrixHandle = GLES20.glGetUniformLocation(drawProgram, "uSTMatrix"); @@ -2534,18 +2593,21 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } private String createFragmentShader(Size previewSize) { - if (SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW || Math.max(previewSize.getHeight(), previewSize.getWidth()) * 0.7f < MessagesController.getInstance(currentAccount).roundVideoSize) { + if (SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW || SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_AVERAGE || Math.max(previewSize.getHeight(), previewSize.getWidth()) * 0.7f < MessagesController.getInstance(currentAccount).roundVideoSize) { return "#extension GL_OES_EGL_image_external : require\n" + "precision highp float;\n" + "varying vec2 vTextureCoord;\n" + - "uniform float scaleX;\n" + - "uniform float scaleY;\n" + "uniform float alpha;\n" + + "uniform vec2 preview;\n" + + "uniform vec2 resolution;\n" + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + - " vec2 coord = vec2((vTextureCoord.x - 0.5) * scaleX, (vTextureCoord.y - 0.5) * scaleY);\n" + - " float coef = ceil(clamp(0.2601 - dot(coord, coord), 0.0, 1.0));\n" + - " vec3 color = texture2D(sTexture, vTextureCoord).rgb * coef + (1.0 - step(0.001, coef));\n" + + " vec4 textColor = texture2D(sTexture, vTextureCoord);\n" + + " vec2 coord = resolution * 0.5;\n" + + " float radius = 0.51 * resolution.x;\n" + + " float d = length(coord - gl_FragCoord.xy) - radius;\n" + + " float t = clamp(d, 0.0, 1.0);\n" + + " vec3 color = mix(textColor.rgb, vec3(1, 1, 1), t);\n" + " gl_FragColor = vec4(color * alpha, alpha);\n" + "}\n"; } @@ -2553,27 +2615,29 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter return "#extension GL_OES_EGL_image_external : require\n" + "precision highp float;\n" + "varying vec2 vTextureCoord;\n" + - "uniform float scaleX;\n" + - "uniform float scaleY;\n" + + "uniform vec2 resolution;\n" + + "uniform vec2 preview;\n" + "uniform float alpha;\n" + "const float kernel = 1.0;\n" + - "const float pixelSizeX = 1.0 / " + previewSize.getWidth() + ".0;\n" + - "const float pixelSizeY = 1.0 / " + previewSize.getHeight() + ".0;\n" + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + + " float pixelSizeX = 1.0 / preview.x;\n" + + " float pixelSizeY = 1.0 / preview.y;\n" + " vec3 accumulation = vec3(0);\n" + " vec3 weightsum = vec3(0);\n" + - " for (float x = -kernel; x <= kernel; x++){\n" + - " for (float y = -kernel; y <= kernel; y++){\n" + + " for (float x = -kernel; x < kernel; x++){\n" + + " for (float y = -kernel; y < kernel; y++){\n" + " accumulation += texture2D(sTexture, vTextureCoord + vec2(x * pixelSizeX, y * pixelSizeY)).xyz;\n" + " weightsum += 1.0;\n" + " }\n" + " }\n" + " vec4 textColor = vec4(accumulation / weightsum, 1.0);\n" + - " vec2 coord = vec2((vTextureCoord.x - 0.5) * scaleX, (vTextureCoord.y - 0.5) * scaleY);\n" + - " float coef = ceil(clamp(0.2601 - dot(coord, coord), 0.0, 1.0));\n" + - " vec3 color = textColor.rgb * coef + (1.0 - step(0.001, coef));\n" + + " vec2 coord = resolution * 0.5;\n" + + " float radius = 0.51 * resolution.x;\n" + + " float d = length(coord - gl_FragCoord.xy) - radius;\n" + + " float t = clamp(d, 0.0, 1.0);\n" + + " vec3 color = mix(textColor.rgb, vec3(1, 1, 1), t);\n" + " gl_FragColor = vec4(color * alpha, alpha);\n" + "}\n"; } @@ -2697,6 +2761,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } ValueAnimator finishZoomTransition; + public void finishZoom() { if (finishZoomTransition != null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java index 6b03ccfed..2fc121425 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MentionsContainerView.java @@ -2,20 +2,15 @@ package org.telegram.ui.Components; import static org.telegram.messenger.AndroidUtilities.dp; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import androidx.annotation.NonNull; -import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.FloatValueHolder; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; @@ -26,12 +21,14 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.FileLoader; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Adapters.MentionsAdapter; import org.telegram.ui.Adapters.PaddedListAdapter; -import org.telegram.ui.Cells.AboutLinkCell; +import org.telegram.ui.ChatActivity; import org.telegram.ui.ContentPreviewViewer; public class MentionsContainerView extends BlurredFrameLayout { @@ -45,12 +42,14 @@ public class MentionsContainerView extends BlurredFrameLayout { private PaddedListAdapter paddedAdapter; private MentionsAdapter adapter; + ChatActivity chatActivity; private float containerTop, containerBottom, containerPadding, listViewPadding; - public MentionsContainerView(@NonNull Context context, long dialogId, int threadMessageId, SizeNotifierFrameLayout sizeNotifierFrameLayout, Theme.ResourcesProvider resourcesProvider) { - super(context, sizeNotifierFrameLayout); - this.sizeNotifierFrameLayout = sizeNotifierFrameLayout; + public MentionsContainerView(@NonNull Context context, long dialogId, int threadMessageId, ChatActivity chatActivity, Theme.ResourcesProvider resourcesProvider) { + super(context, chatActivity.contentView); + this.chatActivity = chatActivity; + this.sizeNotifierFrameLayout = chatActivity.contentView; this.resourcesProvider = resourcesProvider; this.drawBlur = false; this.isTopView = false; @@ -180,7 +179,7 @@ public class MentionsContainerView extends BlurredFrameLayout { public void onItemCountUpdate(int oldCount, int newCount) { if (listView.getLayoutManager() != gridLayoutManager && shown) { AndroidUtilities.cancelRunOnUIThread(updateVisibilityRunnable); - AndroidUtilities.runOnUIThread(updateVisibilityRunnable); + AndroidUtilities.runOnUIThread(updateVisibilityRunnable, chatActivity.fragmentOpened ? 0 : 100); } } @@ -397,7 +396,7 @@ public class MentionsContainerView extends BlurredFrameLayout { if (listViewTranslationAnimator != null) { listViewTranslationAnimator.cancel(); } - AndroidUtilities.runOnUIThread(updateVisibilityRunnable); + AndroidUtilities.runOnUIThread(updateVisibilityRunnable, chatActivity.fragmentOpened ? 0 : 100); if (show) { onOpen(); } else { @@ -410,6 +409,7 @@ public class MentionsContainerView extends BlurredFrameLayout { } private SpringAnimation listViewTranslationAnimator; + private int animationIndex = -1; private boolean listViewHiding = false; private float hideT = 0; private boolean switchLayoutManagerOnEnd = false; @@ -451,6 +451,8 @@ public class MentionsContainerView extends BlurredFrameLayout { updateVisibility(shown = true); } } else { + int account = UserConfig.selectedAccount; + animationIndex = NotificationCenter.getInstance(account).setAnimationInProgress(animationIndex, null); listViewTranslationAnimator = new SpringAnimation(new FloatValueHolder(fromTranslation)) .setSpring( @@ -478,6 +480,9 @@ public class MentionsContainerView extends BlurredFrameLayout { } }); } + listViewTranslationAnimator.addEndListener((animation, canceled, value, velocity) -> { + NotificationCenter.getInstance(account).onAnimationFinish(animationIndex); + }); listViewTranslationAnimator.start(); } } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GLIcon/Star3DIcon.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GLIcon/Star3DIcon.java index a67f527a3..6d5457b0d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GLIcon/Star3DIcon.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GLIcon/Star3DIcon.java @@ -12,6 +12,9 @@ import android.graphics.Shader; import android.opengl.GLES20; import android.opengl.GLUtils; +import org.telegram.messenger.R; +import org.telegram.messenger.SvgHelper; +import org.telegram.messenger.Utilities; import org.telegram.ui.ActionBar.Theme; import java.io.BufferedReader; @@ -143,7 +146,26 @@ public class Star3DIcon { GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, mVertices); GLES20.glEnableVertexAttribArray(0); - GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + + Bitmap bitmap = SvgHelper.getBitmap(R.raw.start_texture, 80, 80, Color.WHITE); + Utilities.stackBlurBitmap(bitmap, 3); + + final int[] texture = new int[1]; + GLES20.glGenTextures(1, texture, 0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[0]); + + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); + + GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); + bitmap.recycle(); + + final int[] textureDatHandle = new int[1]; + GLES20.glGenTextures(1, textureDatHandle, 0); + mTextureDataHandle = textureDatHandle[0]; + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureDatHandle[0]); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); Bitmap bitmap1 = getBitmapFromAsset(context, "flecks.png"); @@ -166,6 +188,9 @@ public class Star3DIcon { GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBackgroundTextureHandle); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[0]); + GLES20.glUniform1i(mTextureUniformHandle, 0); GLES20.glActiveTexture(GLES20.GL_TEXTURE1); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, normalMap[0]); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumAppIconsPreviewView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumAppIconsPreviewView.java index 198875d97..6a2b0eb07 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumAppIconsPreviewView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumAppIconsPreviewView.java @@ -11,6 +11,7 @@ import android.widget.FrameLayout; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.FileLog; import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.AppIconsSelectorCell; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; @@ -21,7 +22,7 @@ import java.util.List; public class PremiumAppIconsPreviewView extends FrameLayout implements PagerHeaderView { private List icons = new ArrayList<>(); - private AppIconsSelectorCell.AdaptiveIconImageView topIcon, bottomLeftIcon, bottomRightIcon; + private AdaptiveIconImageView topIcon, bottomLeftIcon, bottomRightIcon; boolean isEmpty; public PremiumAppIconsPreviewView(Context context) { @@ -42,27 +43,16 @@ public class PremiumAppIconsPreviewView extends FrameLayout implements PagerHead return; } - topIcon = newIconView(context, icons.get(0)); - bottomLeftIcon = newIconView(context, icons.get(1)); - bottomRightIcon = newIconView(context, icons.get(2)); + topIcon = newIconView(context, 0); + bottomLeftIcon = newIconView(context, 1); + bottomRightIcon = newIconView(context, 2); + setClipChildren(false); } - private AppIconsSelectorCell.AdaptiveIconImageView newIconView(Context ctx, LauncherIconController.LauncherIcon icon) { - AppIconsSelectorCell.AdaptiveIconImageView iconImageView = new AppIconsSelectorCell.AdaptiveIconImageView(ctx) { - private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private AdaptiveIconImageView newIconView(Context ctx, int i) { + LauncherIconController.LauncherIcon icon = icons.get(i); - { - paint.setColor(Color.WHITE); - } - - @Override - public void draw(Canvas canvas) { - AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); - canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(AppIconsSelectorCell.ICONS_ROUND_RADIUS), AndroidUtilities.dp(AppIconsSelectorCell.ICONS_ROUND_RADIUS), paint); - - super.draw(canvas); - } - }; + AdaptiveIconImageView iconImageView = new AdaptiveIconImageView(ctx, i); iconImageView.setLayoutParams(LayoutHelper.createFrame(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER, 0, 52, 0, 0)); iconImageView.setForeground(icon.foreground); iconImageView.setBackgroundResource(icon.background); @@ -108,6 +98,7 @@ public class PremiumAppIconsPreviewView extends FrameLayout implements PagerHead bottomRightIcon.setScaleX(scale); bottomRightIcon.setScaleY(scale); + topIcon.setTranslationY(progress * (getTop() - topIcon.getTop() - topIcon.getHeight() * 1.8f - AndroidUtilities.dp(32))); topIcon.setTranslationX(progress * AndroidUtilities.dp(16)); scale = AndroidUtilities.lerp(1f, 1.8f, progress); @@ -115,6 +106,7 @@ public class PremiumAppIconsPreviewView extends FrameLayout implements PagerHead topIcon.setScaleX(scale); topIcon.setScaleY(scale); + float leftProgress = CubicBezierInterpolator.EASE_OUT.getInterpolation(progress); bottomLeftIcon.setTranslationX(leftProgress * (getLeft() - bottomLeftIcon.getLeft() - bottomLeftIcon.getWidth() * 2.5f + AndroidUtilities.dp(32))); bottomLeftIcon.setTranslationY(leftProgress * (getBottom() - bottomLeftIcon.getBottom() + bottomLeftIcon.getHeight() * 2.5f + AndroidUtilities.dp(32))); @@ -122,5 +114,48 @@ public class PremiumAppIconsPreviewView extends FrameLayout implements PagerHead scale = Utilities.clamp(scale, 1f, 0); bottomLeftIcon.setScaleX(scale); bottomLeftIcon.setScaleY(scale); + + float p = progress < 0.4f ? progress / 0.4f : 1f; + bottomRightIcon.particlesScale = p; + topIcon.particlesScale = p; + bottomLeftIcon.particlesScale = p; + } + + private class AdaptiveIconImageView extends AppIconsSelectorCell.AdaptiveIconImageView { + + StarParticlesView.Drawable drawable = new StarParticlesView.Drawable(20); + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + float particlesScale; + + public AdaptiveIconImageView(Context ctx, int i) { + super(ctx); + drawable.size1 = 12; + drawable.size2 = 8; + drawable.size3 = 6; + if (i == 1) { + drawable.type = StarParticlesView.TYPE_APP_ICON_REACT; + } if (i == 0) { + drawable.type = StarParticlesView.TYPE_APP_ICON_STAR_PREMIUM; + } + drawable.colorKey = Theme.key_premiumStartSmallStarsColor2; + drawable.init(); + paint.setColor(Color.WHITE); + } + + @Override + public void draw(Canvas canvas) { + int outBoundOffset = AndroidUtilities.dp(10); + drawable.excludeRect.set(AndroidUtilities.dp(5), AndroidUtilities.dp(5), getMeasuredWidth() - AndroidUtilities.dp(5), getMeasuredHeight() - AndroidUtilities.dp(5)); + drawable.rect.set(-outBoundOffset, -outBoundOffset, getWidth() + outBoundOffset, getHeight() + outBoundOffset); + canvas.save(); + canvas.scale(1f - particlesScale, 1f - particlesScale, getMeasuredWidth() / 2f, getMeasuredHeight() / 2f); + drawable.onDraw(canvas); + canvas.restore(); + invalidate(); + AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(AppIconsSelectorCell.ICONS_ROUND_RADIUS), AndroidUtilities.dp(AppIconsSelectorCell.ICONS_ROUND_RADIUS), paint); + + super.draw(canvas); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java index 86ca1d858..f6cace088 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/StarParticlesView.java @@ -31,9 +31,11 @@ import java.util.ArrayList; public class StarParticlesView extends View { + public Drawable drawable; int size; - boolean distributionAlgorithm; + public final static int TYPE_APP_ICON_REACT = 1001; + public static final int TYPE_APP_ICON_STAR_PREMIUM = 1002; public StarParticlesView(Context context) { super(context); @@ -136,6 +138,7 @@ public class StarParticlesView extends View { public boolean roundEffect = true; public int type = -1; public String colorKey = Theme.key_premiumStartSmallStarsColor; + public boolean svg; public final static int TYPE_SETTINGS = 101; @@ -191,9 +194,9 @@ public class StarParticlesView extends View { res = R.raw.premium_object_settings; } stars[i] = SvgHelper.getBitmap(res, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); + svg = true; continue; - } - if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS) { + }else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS) { int res; if (i == 0) { res = R.raw.premium_object_adsbubble; @@ -203,9 +206,9 @@ public class StarParticlesView extends View { res = R.raw.premium_object_noads; } stars[i] = SvgHelper.getBitmap(res, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); + svg = true; continue; - } - if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS) { + } else if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS) { int res; if (i == 0) { res = R.raw.premium_object_video2; @@ -215,6 +218,15 @@ public class StarParticlesView extends View { res = R.raw.premium_object_user; } stars[i] = SvgHelper.getBitmap(res, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); + svg = true; + continue; + } else if (type == TYPE_APP_ICON_REACT) { + stars[i] = SvgHelper.getBitmap(R.raw.premium_object_fire, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); + svg = true; + continue; + } else if (type == TYPE_APP_ICON_STAR_PREMIUM) { + stars[i] = SvgHelper.getBitmap(R.raw.premium_object_star2, size, size, ColorUtils.setAlphaComponent(Theme.getColor(colorKey), 30)); + svg = true; continue; } @@ -255,7 +267,11 @@ public class StarParticlesView extends View { if (roundEffect) { paint1.setPathEffect(new CornerPathEffect(AndroidUtilities.dpf2(size1 / 5f))); } - paint1.setAlpha(120); + if (useBlur) { + paint1.setAlpha(60); + } else { + paint1.setAlpha(120); + } canvas.drawPath(path, paint1); paint1.setPathEffect(null); paint1.setAlpha(255); @@ -475,7 +491,7 @@ public class StarParticlesView extends View { double a = Math.atan2(x - rect.centerX(), y - rect.centerY()); vecX = (float) Math.sin(a); vecY = (float) Math.cos(a); - if (type == PremiumPreviewFragment.PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT || type == PremiumPreviewFragment.PREMIUM_FEATURE_ADS || type == PremiumPreviewFragment.PREMIUM_FEATURE_ANIMATED_AVATARS) { + if (svg) { alpha = (int) (120 * ((50 + Utilities.fastRandom.nextInt(50)) / 100f)); } else { alpha = (int) (255 * ((50 + Utilities.fastRandom.nextInt(50)) / 100f)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ProfileGalleryView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ProfileGalleryView.java index 56b2ed0c4..3d64ab5f4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ProfileGalleryView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ProfileGalleryView.java @@ -452,17 +452,21 @@ public class ProfileGalleryView extends CircularViewPager implements Notificatio } } - public boolean initIfEmpty(ImageLocation imageLocation, ImageLocation thumbLocation) { + public boolean initIfEmpty(ImageLocation imageLocation, ImageLocation thumbLocation, boolean reload) { if (imageLocation == null || thumbLocation == null || settingMainPhoto != 0) { return false; } if (prevImageLocation == null || prevImageLocation.location.local_id != imageLocation.location.local_id) { if (!imagesLocations.isEmpty()) { prevImageLocation = imageLocation; - MessagesController.getInstance(currentAccount).loadDialogPhotos(dialogId, 80, 0, true, parentClassGuid); + if (reload) { + MessagesController.getInstance(currentAccount).loadDialogPhotos(dialogId, 80, 0, true, parentClassGuid); + } return true; } else { - MessagesController.getInstance(currentAccount).loadDialogPhotos(dialogId, 80, 0, true, parentClassGuid); + if (reload) { + MessagesController.getInstance(currentAccount).loadDialogPhotos(dialogId, 80, 0, true, parentClassGuid); + } } } if (!imagesLocations.isEmpty()) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java index 592996015..4b279db69 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java @@ -120,7 +120,8 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { private static ThreadLocal bufferLocal = new ThreadLocal<>(); private ArrayList> parentViews = new ArrayList<>(); - private static DispatchQueuePool loadFrameRunnableQueue = new DispatchQueuePool(4); + private static final DispatchQueuePool loadFrameRunnableQueue = new DispatchQueuePool(2); + private static final DispatchQueuePool largeSizeLoadFrameRunnableQueue = new DispatchQueuePool(4); private static ThreadPoolExecutor lottieCacheGenerateQueue; private static HashSet generatingCacheFiles = new HashSet<>(); @@ -131,6 +132,8 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { private Runnable onAnimationEndListener; private Runnable onFrameReadyRunnable; + private DispatchQueuePool loadFrameQueue = loadFrameRunnableQueue; + protected Runnable uiRunnableNoFrame = new Runnable() { @Override public void run() { @@ -392,6 +395,11 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { if (precache && lottieCacheGenerateQueue == null) { lottieCacheGenerateQueue = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); } + if (w > AndroidUtilities.dp(120) || h > AndroidUtilities.dp(120)) { + loadFrameQueue = largeSizeLoadFrameRunnableQueue; + } else { + loadFrameQueue = loadFrameRunnableQueue; + } if (nativePtr == 0) { file.delete(); } @@ -422,6 +430,11 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { shouldLimitFps = false; } timeBetweenFrames = Math.max(shouldLimitFps ? 33 : 16, (int) (1000.0f / metaData[1])); + if (w > AndroidUtilities.dp(100) || w > AndroidUtilities.dp(100)) { + loadFrameQueue = largeSizeLoadFrameRunnableQueue; + } else { + loadFrameQueue = loadFrameRunnableQueue; + } } public RLottieDrawable(int rawRes, String name, int w, int h) { @@ -826,7 +839,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable { pendingReplaceColors = newReplaceColors; newReplaceColors = null; } - loadFrameRunnableQueue.execute(loadFrameTask = loadFrameRunnable); + loadFrameQueue.execute(loadFrameTask = loadFrameRunnable); return true; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java index 811cff985..26bba3e49 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java @@ -1,6 +1,7 @@ package org.telegram.ui.Components; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; @@ -20,6 +21,8 @@ public class ScamDrawable extends Drawable { private int textWidth; private String text; private int currentType; + int colorAlpha = 255; + int alpha = 255; public ScamDrawable(int textSize, int type) { super(); @@ -54,11 +57,16 @@ public class ScamDrawable extends Drawable { public void setColor(int color) { textPaint.setColor(color); paint.setColor(color); + colorAlpha = Color.alpha(color); } @Override public void setAlpha(int alpha) { - + if (this.alpha != alpha) { + int localAlpha = (int) (colorAlpha * (alpha / 255f)); + paint.setAlpha(localAlpha); + textPaint.setAlpha(localAlpha); + } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java index 268baaee8..3ccb97328 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -558,6 +558,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter notificationCenter.addObserver(this, NotificationCenter.messagesDeleted); notificationCenter.addObserver(this, NotificationCenter.replaceMessagesObjects); notificationCenter.addObserver(this, NotificationCenter.chatInfoDidLoad); + notificationCenter.addObserver(this, NotificationCenter.fileLoaded); } public void addDelegate(SharedMediaPreloaderDelegate delegate) { @@ -582,6 +583,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter notificationCenter.removeObserver(this, NotificationCenter.messagesDeleted); notificationCenter.removeObserver(this, NotificationCenter.replaceMessagesObjects); notificationCenter.removeObserver(this, NotificationCenter.chatInfoDidLoad); + notificationCenter.removeObserver(this, NotificationCenter.fileLoaded); } public int[] getLastMediaCount() { @@ -815,6 +817,17 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter if (dialogId < 0 && chatFull.id == -dialogId) { setChatInfo(chatFull); } + } else if (id == NotificationCenter.fileLoaded) { + ArrayList allMessages = new ArrayList<>(); + for (int i = 0 ; i < sharedMediaData.length; i++) { + allMessages.addAll(sharedMediaData[i].messages); + } + Utilities.globalQueue.postRunnable(new Runnable() { + @Override + public void run() { + FileLoader.getInstance(account).checkMediaExistance(allMessages); + } + }); } } @@ -2741,6 +2754,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter sharedMediaData[type].totalCount = mediaData[type].totalCount; } sharedMediaData[type].messages.addAll(mediaData[type].messages); + sharedMediaData[type].sections.addAll(mediaData[type].sections); for (HashMap.Entry> entry : mediaData[type].sectionArrays.entrySet()) { sharedMediaData[type].sectionArrays.put(entry.getKey(), new ArrayList<>(entry.getValue())); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java index fd972db92..38249336a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java @@ -22,6 +22,7 @@ import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.Cells.ChatMessageCell; @@ -219,6 +220,7 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe for (int i = 0; i < drawingObjects.size(); i++) { DrawingObject drawingObject = drawingObjects.get(i); drawingObject.viewFound = false; + float childY = 0; for (int k = 0; k < listView.getChildCount(); k++) { View child = listView.getChildAt(k); if (child instanceof ChatMessageCell) { @@ -227,10 +229,10 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe drawingObject.viewFound = true; float viewX = listView.getX() + child.getX(); float viewY = listView.getY() + child.getY(); + childY = child.getY(); if (drawingObject.isPremiumSticker) { drawingObject.lastX = viewX + cell.getPhotoImage().getImageX(); drawingObject.lastY = viewY + cell.getPhotoImage().getImageY(); - ; } else { viewX += cell.getPhotoImage().getImageX(); viewY += cell.getPhotoImage().getImageY(); @@ -250,6 +252,16 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe } } + if (!drawingObject.viewFound || childY + drawingObject.lastH < chatActivity.getChatListViewPadding() || childY > listView.getMeasuredHeight() - chatActivity.blurredViewBottomOffset) { + drawingObject.removing = true; + } + + if (drawingObject.removing && drawingObject.removeProgress != 1f) { + drawingObject.removeProgress = Utilities.clamp(drawingObject.removeProgress + 16 / 150f, 1f, 0); + drawingObject.imageReceiver.setAlpha(1f - drawingObject.removeProgress); + chatActivity.contentView.invalidate(); + } + if (drawingObject.isPremiumSticker) { float size = drawingObject.lastH * 1.49926f; float paddingHorizontal = size * 0.0546875f; @@ -279,7 +291,7 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe drawingObject.imageReceiver.draw(canvas); } } - if (drawingObject.wasPlayed && drawingObject.imageReceiver.getLottieAnimation() != null && drawingObject.imageReceiver.getLottieAnimation().getCurrentFrame() == drawingObject.imageReceiver.getLottieAnimation().getFramesCount() - 2) { + if (drawingObject.removeProgress == 1f || (drawingObject.wasPlayed && drawingObject.imageReceiver.getLottieAnimation() != null && drawingObject.imageReceiver.getLottieAnimation().getCurrentFrame() == drawingObject.imageReceiver.getLottieAnimation().getFramesCount() - 2)) { drawingObjects.remove(i); i--; } else if (drawingObject.imageReceiver.getLottieAnimation() != null && drawingObject.imageReceiver.getLottieAnimation().isRunning()) { @@ -627,6 +639,8 @@ public class EmojiAnimationsOverlay implements NotificationCenter.NotificationCe public boolean isPremiumSticker; boolean wasPlayed; boolean isOut; + boolean removing; + float removeProgress; int messageId; TLRPC.Document document; ImageReceiver imageReceiver = new ImageReceiver(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java index 306aca57e..c4fa953bd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java @@ -7443,7 +7443,7 @@ public class GroupCallActivity extends BottomSheet implements NotificationCenter avatarsViewPager.setHasActiveVideo(hasAttachedRenderer); avatarsViewPager.setData(peerId, true); avatarsViewPager.setCreateThumbFromParent(true); - avatarsViewPager.initIfEmpty(imageLocation, thumbLocation); + avatarsViewPager.initIfEmpty(imageLocation, thumbLocation, true); if (scrimRenderer != null) { scrimRenderer.setShowingAsScrimView(true, true); } @@ -8428,7 +8428,7 @@ public class GroupCallActivity extends BottomSheet implements NotificationCenter thumb = thumbLocation; } avatarsViewPager.setCreateThumbFromParent(false); - avatarsViewPager.initIfEmpty(imageLocation, thumb); + avatarsViewPager.initIfEmpty(imageLocation, thumb, true); avatar = null; avatarBig = null; AndroidUtilities.updateVisibleRows(listView); @@ -8456,7 +8456,7 @@ public class GroupCallActivity extends BottomSheet implements NotificationCenter thumb = thumbLocation; } avatarsViewPager.setCreateThumbFromParent(false); - avatarsViewPager.initIfEmpty(imageLocation, thumb); + avatarsViewPager.initIfEmpty(imageLocation, thumb, true); avatar = null; avatarBig = null; AndroidUtilities.updateVisibleRows(listView); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 33b15ab4f..1a2ae5e0d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -68,6 +68,7 @@ import android.transition.TransitionManager; import android.transition.TransitionSet; import android.transition.TransitionValues; import android.util.FloatProperty; +import android.util.Log; import android.util.Property; import android.util.Range; import android.util.SparseArray; @@ -11984,13 +11985,22 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (!exists && f1Final != null) { exists = f1Final.exists(); } + File f2Local = f2Final; + File f3Local = null; if (f2Local == null && finalF2Resolver != null) { f2Local = finalF2Resolver.getFile(); + } else if (finalF2Resolver != null) { + f3Local = finalF2Resolver.getFile(); } + if (!exists && f2Local != null) { exists = f2Local.exists(); } + + if (!exists && f3Local != null) { + exists = f3Local.exists(); + } if (!exists && a != 0 && messageObjectFinal != null && canStreamFinal) { if (DownloadController.getInstance(currentAccount).canDownloadMedia(messageObjectFinal.messageOwner) != 0) { if ((parentChatActivity == null || parentChatActivity.getCurrentEncryptedChat() == null) && !messageObjectFinal.shouldEncryptPhotoOrVideo()) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index a5ccbb109..ff85e0b63 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -47,7 +47,6 @@ import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; -import android.text.util.Linkify; import android.util.Property; import android.util.SparseIntArray; import android.util.TypedValue; @@ -1020,7 +1019,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. @Override public void onPhotosLoaded() { - updateProfileData(); + updateProfileData(false); } @Override @@ -1920,7 +1919,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. userConfig.setCurrentUser(user); userConfig.saveConfig(true); NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.mainUserInfoChanged); - updateProfileData(); + updateProfileData(true); } avatarsViewPager.commitMoveToBegin(); } else if (id == edit_avatar) { @@ -3393,7 +3392,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. }; mediaCounterTextView.setAlpha(0.0f); avatarContainer2.addView(mediaCounterTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 118, 0, 8, 0)); - updateProfileData(); + updateProfileData(true); writeButton = new RLottieImageView(context); @@ -5062,7 +5061,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. boolean infoChanged = (mask & MessagesController.UPDATE_MASK_AVATAR) != 0 || (mask & MessagesController.UPDATE_MASK_NAME) != 0 || (mask & MessagesController.UPDATE_MASK_STATUS) != 0; if (userId != 0) { if (infoChanged) { - updateProfileData(); + updateProfileData(true); } if ((mask & MessagesController.UPDATE_MASK_PHONE) != 0) { if (listView != null) { @@ -5079,7 +5078,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else { updateOnlineCount(true); } - updateProfileData(); + updateProfileData(true); } if (infoChanged) { if (listView != null) { @@ -5100,7 +5099,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } chatInfo.online_count = (Integer) args[1]; updateOnlineCount(true); - updateProfileData(); + updateProfileData(false); } else if (id == NotificationCenter.contactsDidLoad) { createActionBarMenu(true); } else if (id == NotificationCenter.encryptedChatCreated) { @@ -5328,7 +5327,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. setParentActivityTitle(LocaleController.getString("Settings", R.string.Settings)); } - updateProfileData(); + updateProfileData(true); fixLayout(); if (nameTextView[1] != null) { setParentActivityTitle(nameTextView[1].getText()); @@ -5524,7 +5523,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. topView.invalidate(); needLayout(true); - fragmentView.invalidate(); + if (fragmentView != null) { + fragmentView.invalidate(); + } if (aboutLinkCell != null) { aboutLinkCell.invalidate(); @@ -6234,7 +6235,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return premuimCrossfadeDrawable; } - private void updateProfileData() { + private void updateProfileData(boolean reload) { if (avatarContainer == null || nameTextView == null) { return; } @@ -6267,7 +6268,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. final ImageLocation thumbLocation = ImageLocation.getForUserOrChat(user, ImageLocation.TYPE_SMALL); final ImageLocation videoThumbLocation = ImageLocation.getForUserOrChat(user, ImageLocation.TYPE_VIDEO_THUMB); final ImageLocation videoLocation = avatarsViewPager.getCurrentVideoLocation(thumbLocation, imageLocation); - avatarsViewPager.initIfEmpty(imageLocation, thumbLocation); + avatarsViewPager.initIfEmpty(imageLocation, thumbLocation, reload); if (avatarBig == null) { if (videoThumbLocation != null) { avatarImage.getImageReceiver().setVideoThumbIsSame(true); @@ -6526,7 +6527,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. final ImageLocation imageLocation = ImageLocation.getForUserOrChat(chat, ImageLocation.TYPE_BIG); final ImageLocation thumbLocation = ImageLocation.getForUserOrChat(chat, ImageLocation.TYPE_SMALL); final ImageLocation videoLocation = avatarsViewPager.getCurrentVideoLocation(thumbLocation, imageLocation); - boolean initied = avatarsViewPager.initIfEmpty(imageLocation, thumbLocation); + boolean initied = avatarsViewPager.initIfEmpty(imageLocation, thumbLocation, reload); if ((imageLocation == null || initied) && isPulledDown) { final View view = layoutManager.findViewByPosition(0); if (view != null) { @@ -7160,7 +7161,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. avatar = null; avatarBig = null; avatarsViewPager.setCreateThumbFromParent(false); - updateProfileData(); + updateProfileData(true); showAvatarProgress(false, true); getNotificationCenter().postNotificationName(NotificationCenter.updateInterfaces, MessagesController.UPDATE_MASK_ALL); getNotificationCenter().postNotificationName(NotificationCenter.mainUserInfoChanged);