Skip to content

Commit 3c9c99d

Browse files
committed
Properly display multiple sponsored messages + Sponsored messages bugfixes
1 parent b65e8ac commit 3c9c99d

File tree

9 files changed

+245
-71
lines changed

9 files changed

+245
-71
lines changed

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

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.drinkless.tdlib.TdApi;
2626
import org.thunderdog.challegram.Log;
2727
import org.thunderdog.challegram.U;
28+
import org.thunderdog.challegram.config.Config;
2829
import org.thunderdog.challegram.data.TGMessage;
2930
import org.thunderdog.challegram.data.TGMessageBotInfo;
3031
import org.thunderdog.challegram.data.TGMessageMedia;
@@ -39,6 +40,7 @@
3940
import java.util.List;
4041
import java.util.concurrent.atomic.AtomicBoolean;
4142

43+
import me.vkryl.core.lambda.Filter;
4244
import tgx.td.MessageId;
4345

4446
public class MessagesAdapter extends RecyclerView.Adapter<MessagesHolder> {
@@ -203,6 +205,16 @@ public TGMessage getBottomMessage () {
203205
return getMessage(0);
204206
}
205207

208+
public TGMessage getBottomActiveMessage () {
209+
int index = indexOfMessage(m -> !m.isSponsoredMessage());
210+
return getMessage(index);
211+
}
212+
213+
public TGMessage getTopActiveMessage () {
214+
int index = indexOfMessageReverse(m -> !m.isSponsoredMessage());
215+
return getMessage(index);
216+
}
217+
206218
public TGMessage getMessage (int index) {
207219
return items == null || index < 0 || index >= items.size() ? null : items.get(index);
208220
}
@@ -573,6 +585,43 @@ public void resetMessages (ArrayList<TGMessage> items) {
573585
U.notifyItemsReplaced(this, oldItemCount);
574586
}
575587

588+
public int countMessages (@NonNull Filter<TGMessage> filter) {
589+
if (items != null) {
590+
int count = 0;
591+
for (TGMessage message : items) {
592+
if (filter.accept(message)) {
593+
count++;
594+
}
595+
}
596+
return count;
597+
}
598+
return 0;
599+
}
600+
601+
public int indexOfMessageReverse (@NonNull Filter<TGMessage> filter) {
602+
if (items != null) {
603+
for (int i = items.size() - 1; i >= 0; i--) {
604+
TGMessage message = items.get(i);
605+
if (filter.accept(message)) {
606+
return i;
607+
}
608+
}
609+
}
610+
return -1;
611+
}
612+
613+
public int indexOfMessage (@NonNull Filter<TGMessage> filter) {
614+
if (items != null) {
615+
for (int i = 0; i < items.size(); i++) {
616+
TGMessage message = items.get(i);
617+
if (filter.accept(message)) {
618+
return i;
619+
}
620+
}
621+
}
622+
return -1;
623+
}
624+
576625
public void addMessages (List<TGMessage> items, boolean fromTop) {
577626
if (this.items == null) {
578627
this.items = new ArrayList<>(INITIAL_CAPACITY);
@@ -584,7 +633,7 @@ public void addMessages (List<TGMessage> items, boolean fromTop) {
584633
if (items.size() > count) {
585634
for (int i = items.size() - 1; i >= 0; i--) {
586635
TGMessage msg = items.get(i);
587-
if (indexOfMessageContainer(msg.getId()) != -1) {
636+
if ((!Config.TEST_MULTI_SPONSORED_MESSAGES || !msg.isSponsoredMessage()) && indexOfMessageContainer(msg.getId()) != -1) {
588637
items.remove(i);
589638
if (i > 0) {
590639
items.get(i - 1).mergeWith(items.size() > i ? items.get(i) : null, !fromTop && i - 1 == 0);
@@ -596,7 +645,7 @@ public void addMessages (List<TGMessage> items, boolean fromTop) {
596645
for (TGMessage item : this.items) {
597646
for (int i = items.size() - 1; i >= 0; i--) {
598647
TGMessage newItem = items.get(i);
599-
if (item.isDescendantOrSelf(newItem.getId())) {
648+
if ((!Config.TEST_MULTI_SPONSORED_MESSAGES || !newItem.isSponsoredMessage()) && item.isDescendantOrSelf(newItem.getId())) {
600649
items.remove(i);
601650
if (i > 0) {
602651
items.get(i - 1).mergeWith(items.size() > i ? items.get(i) : null, !fromTop && i - 1 == 0);

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

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.thunderdog.challegram.tool.Strings;
4545
import org.thunderdog.challegram.tool.UI;
4646
import org.thunderdog.challegram.unsorted.Settings;
47-
import org.thunderdog.challegram.util.CancellableResultHandler;
4847

4948
import java.util.ArrayList;
5049
import java.util.Calendar;
@@ -111,7 +110,7 @@ public class MessagesLoader implements Client.ResultHandler {
111110
private @Nullable ThreadInfo messageThread;
112111
private @Nullable TdApi.MessageTopic topicId;
113112

114-
private CancellableResultHandler sponsoredResultHandler;
113+
private Tdlib.CancellableResultHandler<TdApi.SponsoredMessages> sponsoredResultHandler;
115114
private final MessagesSearchManagerMiddleware searchManagerMiddleware;
116115

117116
private long contextId;
@@ -120,36 +119,25 @@ private boolean canShowSponsoredMessage (long chatId) {
120119
return tdlib.isChannel(chatId) && !manager.controller().isInForceTouchMode() && !manager.controller().inPreviewMode() && !manager.controller().areScheduledOnly() && !manager.controller().arePinnedMessages();
121120
}
122121

123-
// Callback is called only on successful load
124-
public void requestSponsoredMessage (long chatId, RunnableData<TdApi.SponsoredMessages> callback) {
122+
public void requestSponsoredMessages (long chatId, RunnableData<TdApi.SponsoredMessages> callback) {
125123
if (!canShowSponsoredMessage(chatId) || isLoadingSponsoredMessage) {
126124
return;
127125
}
128-
129126
isLoadingSponsoredMessage = true;
130-
sponsoredResultHandler = new CancellableResultHandler() {
127+
final long contextId = this.contextId;
128+
sponsoredResultHandler = new Tdlib.CancellableResultHandler<>() {
131129
@Override
132-
public void processResult (TdApi.Object object) {
130+
public void act (TdApi.SponsoredMessages sponsoredMessages, @Nullable TdApi.Error error) {
133131
UI.post(() -> {
134132
isLoadingSponsoredMessage = false;
135133
sponsoredResultHandler = null;
136-
137-
TdApi.SponsoredMessages message;
138-
139-
if (object.getConstructor() == TdApi.SponsoredMessages.CONSTRUCTOR) {
140-
message = ((TdApi.SponsoredMessages) object);
141-
} else {
142-
message = null;
143-
}
144-
145-
if (chatId == getChatId()) {
146-
callback.runWithData(message);
134+
if (chatId == getChatId() && MessagesLoader.this.contextId == contextId) {
135+
callback.runWithData(sponsoredMessages);
147136
}
148137
});
149138
}
150139
};
151-
152-
tdlib.client().send(new TdApi.GetChatSponsoredMessages(chatId), sponsoredResultHandler);
140+
tdlib.send(new TdApi.GetChatSponsoredMessages(chatId), sponsoredResultHandler);
153141
}
154142

155143
public MessagesLoader (MessagesManager manager, MessagesSearchManagerMiddleware searchMiddleware) {
@@ -569,6 +557,7 @@ public void reuse () {
569557

570558
if (sponsoredResultHandler != null) {
571559
sponsoredResultHandler.cancel();
560+
sponsoredResultHandler = null;
572561
}
573562

574563
synchronized (lock) {
@@ -1774,13 +1763,13 @@ public boolean canLoadTop () {
17741763

17751764
@Nullable
17761765
private MessageId getStartBottom () {
1777-
TGMessage msg = manager.getAdapter().getBottomMessage();
1766+
TGMessage msg = manager.getAdapter().getBottomActiveMessage();
17781767
return msg != null ? new MessageId(msg.getChatId(), msg.getBiggestId()) : null;
17791768
}
17801769

17811770
@Nullable
17821771
private MessageId getStartTop () {
1783-
TGMessage msg = manager.getAdapter().getTopMessage();
1772+
TGMessage msg = manager.getAdapter().getTopActiveMessage();
17841773
return msg != null ? new MessageId(msg.getChatId(), msg.getSmallestId()) : null;
17851774
}
17861775

0 commit comments

Comments
 (0)