Skip to content

Commit 3962256

Browse files
committed
Fix chat scroll glitch when ad is being added + Proper scroll position on Android 15
1 parent f355f00 commit 3962256

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

app/src/main/java/org/thunderdog/challegram/component/chat/MessagesManager.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,7 @@ public void displayMessages (ArrayList<TGMessage> items, int mode, int scrollPos
12461246
case MessagesLoader.MODE_MORE_BOTTOM: {
12471247
int firstIndex = manager.findFirstVisibleItemPosition();
12481248
View view = manager.findViewByPosition(firstIndex);
1249-
int currentOffset = view == null ? 0 : manager.getHeight() - view.getBottom();
1249+
int currentOffset = view == null ? 0 : calculateOffsetInPixels(view);
12501250
adapter.addMessages(items, false);
12511251
manager.scrollToPositionWithOffset(firstIndex + items.size(), currentOffset);
12521252
break;
@@ -1376,12 +1376,12 @@ private void requestSponsoredMessage () {
13761376
RunnableData<TGMessage> action = (lastMessage) -> {
13771377
if (lastMessage == null) return;
13781378
controller.sponsoredMessageLoaded = true;
1379-
boolean isFirstItemVisible = manager.findFirstCompletelyVisibleItemPosition() == 0;
13801379
// TODO multi-ad support
1380+
int firstIndex = manager.findFirstVisibleItemPosition();
1381+
View view = manager.findViewByPosition(firstIndex);
1382+
int currentOffset = view == null ? 0 : calculateOffsetInPixels(view) + (firstIndex == 0 ? Screen.dp(48f) : 0);
13811383
adapter.addMessage(TGMessage.valueOf(this, loader.getChatId(), sponsoredMessages.messages[0]), false, false);
1382-
if (isFirstItemVisible && !isScrolling && !controller.canWriteMessages()) {
1383-
manager.scrollToPositionWithOffset(1, Screen.dp(48f));
1384-
}
1384+
manager.scrollToPositionWithOffset(firstIndex + 1, currentOffset);
13851385
};
13861386

13871387
TGMessage bottomMessage = findBottomMessage();
@@ -1637,7 +1637,7 @@ private void updateNewMessage (TGMessage message) {
16371637
int scrollOffsetInPixels = 0;
16381638
View view = manager.findViewByPosition(0);
16391639
if (view != null && view.getParent() != null) {
1640-
scrollOffsetInPixels = ((View) view.getParent()).getBottom() - view.getBottom();
1640+
scrollOffsetInPixels = calculateOffsetInPixels(view);
16411641
}
16421642

16431643
boolean bottomFullyVisible = manager.findFirstCompletelyVisibleItemPosition() == 0;
@@ -1660,6 +1660,11 @@ private void updateNewMessage (TGMessage message) {
16601660
}
16611661
}
16621662

1663+
private int calculateOffsetInPixels (View view) {
1664+
View parentView = (View) view.getParent();
1665+
return parentView.getMeasuredHeight() - parentView.getPaddingBottom() - view.getBottom();
1666+
}
1667+
16631668
@Override
16641669
public void onMessageSendAcknowledged (final long chatId, final long messageId) {
16651670
tdlib.ui().post(() -> {
@@ -2260,7 +2265,7 @@ private void saveScrollPosition () {
22602265
}
22612266
View view = manager.findViewByPosition(i);
22622267
if (view != null && view.getParent() != null) {
2263-
scrollOffsetInPixels = ((View) view.getParent()).getBottom() - view.getBottom();
2268+
scrollOffsetInPixels = calculateOffsetInPixels(view);
22642269
}
22652270
if (readFully && scrollOffsetInPixels == 0) {
22662271
scrollMessageId = scrollMessageChatId = 0;
@@ -2293,14 +2298,16 @@ private void saveScrollPosition () {
22932298
final int accountId = tdlib.id();
22942299
final long chatId = loader.getChatId();
22952300
final long messageThreadId = loader.getMessageThreadId();
2301+
Settings.SavedMessageId savedMessageId = new Settings.SavedMessageId(
2302+
new MessageId(scrollMessageChatId, scrollMessageId, scrollMessageOtherIds),
2303+
scrollOffsetInPixels,
2304+
returnToMessageIds,
2305+
readFully, topEndMessageId
2306+
);
22962307
Settings.instance().setScrollMessageId(accountId,
22972308
chatId, messageThreadId,
2298-
new Settings.SavedMessageId(
2299-
new MessageId(scrollMessageChatId, scrollMessageId, scrollMessageOtherIds),
2300-
scrollOffsetInPixels,
2301-
returnToMessageIds,
2302-
readFully, topEndMessageId
2303-
));
2309+
savedMessageId
2310+
);
23042311

23052312
if (pinnedMessages != null && chatId == scrollMessageChatId) {
23062313
pinnedMessages.ensureMessageAvailability(scrollMessageId);
@@ -2756,7 +2763,7 @@ private void scrollToMessage (int index, TGMessage scrollMessage, int highlightM
27562763

27572764
public boolean isAtVeryBottom () {
27582765
View view = findBottomView();
2759-
return view != null && view.getBottom() == ((View) view.getParent()).getMeasuredHeight();
2766+
return view != null && view.getBottom() == ((View) view.getParent()).getMeasuredHeight() - ((View) view.getParent()).getPaddingBottom();
27602767
}
27612768

27622769
/*public boolean canApplyRecyclerOffsets () {

0 commit comments

Comments
 (0)