Improve ignore blocked: use cache

This commit is contained in:
luvletter2333 2021-03-25 22:08:43 +08:00
parent 9560a1f58d
commit d5143cd276
No known key found for this signature in database
GPG Key ID: BFD68B892BECC1D8
2 changed files with 16 additions and 2 deletions

View File

@ -56,6 +56,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -99,6 +100,8 @@ public class MessagesController extends BaseController implements NotificationCe
public ConcurrentHashMap<Long, Integer> dialogs_read_outbox_max = new ConcurrentHashMap<>(100, 1.0f, 2);
public LongSparseArray<TLRPC.Dialog> dialogs_dict = new LongSparseArray<>();
public LongSparseArray<MessageObject> dialogMessage = new LongSparseArray<>();
// NekoX: ignoreBlocked, Messages cache for Dialog Cell
public LongSparseArray<MessageObject> dialogMessageFromUnblocked = new LongSparseArray<>();
public LongSparseArray<MessageObject> dialogMessagesByRandomIds = new LongSparseArray<>();
public LongSparseArray<Integer> deletedHistory = new LongSparseArray<>();
public SparseArray<MessageObject> dialogMessagesByIds = new SparseArray<>();
@ -6326,7 +6329,7 @@ public class MessagesController extends BaseController implements NotificationCe
}));
}
}
public void processLoadedMessages(TLRPC.messages_Messages messagesRes, int resCount, long dialogId, long mergeDialogId, int count, int max_id, int offset_date, boolean isCache, int classGuid,
int first_unread, int last_message_id, int unread_count, int last_date, int load_type, boolean isChannel, boolean isEnd, int mode, int threadMessageId, int loadIndex, boolean queryFromServer, int mentionsCount, boolean needProcess) {
if (BuildVars.LOGS_ENABLED) {
@ -13997,6 +14000,11 @@ public class MessagesController extends BaseController implements NotificationCe
dialog.top_message = lastMessage.getId();
dialog.last_message_date = lastMessage.messageOwner.date;
changed = true;
if(NekoConfig.ignoreBlocked && blockePeers.indexOfKey(lastMessage.getSenderId())>=0){
MessageObject preMsg = dialogMessage.get(uid);
if(blockePeers.indexOfKey(preMsg.getSenderId())<0)
dialogMessageFromUnblocked.put(uid, preMsg);
}
dialogMessage.put(uid, lastMessage);
if (lastMessage.messageOwner.peer_id.channel_id == 0) {
dialogMessagesByIds.put(lastMessage.getId(), lastMessage);
@ -14004,6 +14012,7 @@ public class MessagesController extends BaseController implements NotificationCe
dialogMessagesByRandomIds.put(lastMessage.messageOwner.random_id, lastMessage);
}
}
}
}

View File

@ -1943,7 +1943,12 @@ public class DialogCell extends BaseCell {
clearingDialog = MessagesController.getInstance(currentAccount).isClearingDialog(dialog.id);
message = MessagesController.getInstance(currentAccount).dialogMessage.get(dialog.id);
if (message != null && NekoConfig.ignoreBlocked && MessagesController.getInstance(currentAccount).blockePeers.indexOfKey(message.getSenderId()) >= 0) {
message = MessageHelper.getInstance(currentAccount).getLastMessageFromUnblock(dialog.id);
if (MessagesController.getInstance(currentAccount).dialogMessageFromUnblocked.get(dialog.id) != null)
message = MessagesController.getInstance(currentAccount).dialogMessageFromUnblocked.get(dialog.id);
else {
message = MessageHelper.getInstance(currentAccount).getLastMessageFromUnblock(dialog.id);
MessagesController.getInstance(currentAccount).dialogMessageFromUnblocked.put(dialog.id, message);
}
// Username show may be abnormal if User who send `message` is not loaded in (never enter chat since boot, esp after cold starting)
}
lastUnreadState = message != null && message.isUnread();