From 9b7c7ef95b18c057b8b67b650bc5325e5416185a Mon Sep 17 00:00:00 2001 From: "nick." <64551534+null-nick@users.noreply.github.com> Date: Mon, 11 May 2026 10:53:25 +0200 Subject: [PATCH] attempt to fix freeze on startup --- .../thunderdog/challegram/data/TGChat.java | 7 ++++ .../challegram/ui/ChatsController.java | 34 ++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thunderdog/challegram/data/TGChat.java b/app/src/main/java/org/thunderdog/challegram/data/TGChat.java index 17bbcbb01d..f176c1f796 100644 --- a/app/src/main/java/org/thunderdog/challegram/data/TGChat.java +++ b/app/src/main/java/org/thunderdog/challegram/data/TGChat.java @@ -78,6 +78,8 @@ import tgx.td.TdExt; public class TGChat implements TdlibStatusManager.HelperTarget, ContentPreview.RefreshCallback, Counter.Callback, ReactionLoadListener, Destroyable, TdlibUi.MessageProvider { + private static final int ARCHIVE_PREVIEW_CHAT_LIMIT = 3; + private static final int FLAG_HAS_PREFIX = 1; private static final int FLAG_TEXT_DRAFT = 1 << 4; private static final int FLAG_SHOW_VERIFY = 1 << 5; @@ -1308,7 +1310,11 @@ public void setText () { if (isArchive()) { List entities = new ArrayList<>(); StringBuilder b = new StringBuilder(); + final int[] addedChatCount = new int[1]; archive.iterate(chat -> { + if (addedChatCount[0] >= ARCHIVE_PREVIEW_CHAT_LIMIT) { + return; + } if (b.length() > 0) { b.append(Lang.getConcatSeparator()); } @@ -1319,6 +1325,7 @@ public void setText () { .setCustomColorSet(TextColorSets.Regular.NORMAL) ); } + addedChatCount[0]++; }); if (b.length() == 0) { b.append(Lang.pluralBold(R.string.xChats, archive.totalCount())); diff --git a/app/src/main/java/org/thunderdog/challegram/ui/ChatsController.java b/app/src/main/java/org/thunderdog/challegram/ui/ChatsController.java index 7d944dad67..b61cfa4899 100644 --- a/app/src/main/java/org/thunderdog/challegram/ui/ChatsController.java +++ b/app/src/main/java/org/thunderdog/challegram/ui/ChatsController.java @@ -687,7 +687,7 @@ public void onChatListChanged (TdlibChatList chatList, @ChangeFlags int changeFl if (BitwiseUtils.setFlag(changeFlags, ChangeFlags.ITEM_METADATA_CHANGED, false) != 0) { runOnUiThreadOptional(() -> { adapter.setNeedArchive(chatList.totalCount() > 0); - adapter.updateArchive(ChatsAdapter.ARCHIVE_UPDATE_ALL); + scheduleArchiveUpdate(ChatsAdapter.ARCHIVE_UPDATE_ALL); }); } } @@ -710,9 +710,7 @@ public void onChatListItemChanged (TdlibChatList chatList, TdApi.Chat chat, @Ite default: return; } - runOnUiThreadOptional(() -> - adapter.updateArchive(reason) - ); + scheduleArchiveUpdate(reason); } }; adapter.setNeedArchive(archiveList.totalCount() > 0); @@ -778,9 +776,37 @@ private void displayChats (List entries) { private boolean hideArchive, archiveCollapsed; private TdlibChatList archiveList; private ChatListListener archiveListListener; + private int pendingArchiveUpdateReason = -1; + private boolean archiveUpdateScheduled; private int chatScrollState = RecyclerView.SCROLL_STATE_IDLE; + private int mergeArchiveUpdateReason (int currentReason, int newReason) { + if (currentReason == -1) { + return newReason; + } + if (currentReason == newReason) { + return currentReason; + } + return ChatsAdapter.ARCHIVE_UPDATE_ALL; + } + + private void scheduleArchiveUpdate (int reason) { + pendingArchiveUpdateReason = mergeArchiveUpdateReason(pendingArchiveUpdateReason, reason); + if (archiveUpdateScheduled) { + return; + } + archiveUpdateScheduled = true; + runOnUiThreadOptional(() -> { + archiveUpdateScheduled = false; + int pendingReason = pendingArchiveUpdateReason; + pendingArchiveUpdateReason = -1; + if (pendingReason != -1 && adapter != null) { + adapter.updateArchive(pendingReason); + } + }); + } + public boolean isPullingArchive () { if (!hideArchive || adapter == null || !adapter.hasArchive()) return false;