From 9560a1f58da37a8e07d0b6c9b7429af6bf158dd0 Mon Sep 17 00:00:00 2001 From: luvletter2333 Date: Thu, 25 Mar 2021 20:35:29 +0800 Subject: [PATCH] Fix: improve ignore blocked: fix DialogCell display --- .../org/telegram/ui/Cells/DialogCell.java | 4 ++- .../tw/nekomimi/nekogram/MessageHelper.java | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) 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 304b13ce5..047d3859e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -71,6 +71,7 @@ import org.telegram.ui.SwipeGestureSettingsView; import java.util.ArrayList; +import tw.nekomimi.nekogram.MessageHelper; import tw.nekomimi.nekogram.NekoConfig; public class DialogCell extends BaseCell { @@ -1942,7 +1943,8 @@ 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 = null; + message = MessageHelper.getInstance(currentAccount).getLastMessageFromUnblock(dialog.id); + // 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(); if (dialog instanceof TLRPC.TL_dialogFolder) { diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageHelper.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageHelper.java index 3b2476f6c..9b1cf0955 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageHelper.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/MessageHelper.java @@ -3,19 +3,24 @@ package tw.nekomimi.nekogram; import android.content.Context; import android.util.SparseArray; +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.SQLite.SQLiteException; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BaseController; +import org.telegram.messenger.FileLog; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.NativeByteBuffer; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.AlertDialog; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Locale; import tw.nekomimi.nekogram.utils.AlertUtil; @@ -300,4 +305,33 @@ public class MessageHelper extends BaseController { }); } + public MessageObject getLastMessageFromUnblock(long dialogId) { + SQLiteCursor cursor; + MessageObject ret = null; + try { + cursor = getMessagesStorage().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data,send_state,mid,date FROM messages WHERE uid = %d ORDER BY date DESC LIMIT %d,%d", dialogId, 0, 10)); + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(0); + if (data == null) + continue; + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + data.reuse(); + if (getMessagesController().blockePeers.indexOfKey(message.from_id.user_id) < 0) { + // valid message + ret = new MessageObject(currentAccount, message, true, true); + message.send_state = cursor.intValue(1); + message.id = cursor.intValue(2); + message.date = cursor.intValue(3); + message.dialog_id = dialogId; + break; + } + } + cursor.dispose(); + } catch (SQLiteException sqLiteException) { + FileLog.e("NekoX, ignoreBlocked, SQLiteException when read last message from unblocked user", sqLiteException); + return null; + } + return ret; + } + }