diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 421513327c..f47b2c32fe 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -11005,6 +11005,17 @@ private String getUserNameForTyping(TLRPC.User user) { return ""; } + private void filterBlockedMessageReactions(long dialogId, TLRPC.TL_messageReactions reactions) { + if (!NekoConfig.ignoreBlocked.Bool() || reactions == null || dialogId >= 0) { + return; + } + TLRPC.Chat chat = getChat(-dialogId); + if (!ChatObject.isMegagroup(chat)) { + return; + } + MessageHelper.getInstance(currentAccount).filterBlockedMessageReactions(reactions); + } + private void updatePrintingStrings() { LongSparseArray> newStrings = new LongSparseArray<>(); LongSparseArray> newTypes = new LongSparseArray<>(); @@ -18989,6 +19000,7 @@ public boolean processUpdateArray(ArrayList updates, ArrayList updates, ArrayList { + if (tabIndex < 0) { + tabHolder.setCounter(filteredCount); + } else { + tabHolder.setCounter(currentAccount, counters.get(tabIndex), filteredCount); + } + }); container.addView(v); cachedViews.put(position, v); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedHeaderView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedHeaderView.java index dd2841dd0f..af356ca115 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedHeaderView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedHeaderView.java @@ -33,6 +33,8 @@ import org.telegram.tgnet.Vector; import org.telegram.ui.ActionBar.Theme; +import tw.nekomimi.nekogram.helpers.MessageHelper; + import java.util.ArrayList; import java.util.List; @@ -142,14 +144,14 @@ protected void onAttachedToWindow() { for (Object obj : v.objects) { if (obj instanceof Long) { long l = (long) obj; - if (fromId != l) { + if (fromId != l && !shouldFilterBlockedPeer(l)) { usersToRequest.add(l); dates.add(0); } } else if (obj instanceof TLRPC.TL_readParticipantDate) { long userId = ((TLRPC.TL_readParticipantDate) obj).user_id; int date = ((TLRPC.TL_readParticipantDate) obj).date; - if (fromId != userId) { + if (fromId != userId && !shouldFilterBlockedPeer(userId)) { usersToRequest.add(userId); dates.add(date); } @@ -235,7 +237,7 @@ private void loadReactions() { ConnectionsManager.getInstance(currentAccount).sendRequest(getList, (response, error) -> { if (response instanceof TLRPC.TL_messages_messageReactionsList) { TLRPC.TL_messages_messageReactionsList list = (TLRPC.TL_messages_messageReactionsList) response; - int c = list.count; + int c = Math.max(0, list.count - filterBlockedReactionPeers(list.reactions)); int ic = list.users.size(); LastSeenHelper.saveLastSeenFromPeerReactions(list.reactions, UserConfig.getInstance(currentAccount).getClientUserId()); post(() -> { @@ -277,6 +279,9 @@ private void loadReactions() { iconView.animate().alpha(1f).start(); } for (TLRPC.User u : list.users) { + if (shouldFilterBlockedPeer(u.id)) { + continue; + } if (message.messageOwner.from_id != null && u.id != message.messageOwner.from_id.user_id) { boolean hasSame = false; for (int i = 0; i < users.size(); i++) { @@ -291,6 +296,9 @@ private void loadReactions() { } } for (TLRPC.Chat u : list.chats) { + if (shouldFilterBlockedPeer(-u.id)) { + continue; + } if (message.messageOwner.from_id != null && u.id != message.messageOwner.from_id.user_id) { boolean hasSame = false; for (int i = 0; i < users.size(); i++) { @@ -311,6 +319,30 @@ private void loadReactions() { }, ConnectionsManager.RequestFlagInvokeAfter); } + private int filterBlockedReactionPeers(List reactions) { + if (reactions == null || reactions.isEmpty()) { + return 0; + } + int removed = 0; + for (int i = reactions.size() - 1; i >= 0; i--) { + TLRPC.MessagePeerReaction reaction = reactions.get(i); + if (reaction == null || reaction.peer_id == null) { + continue; + } + long peerId = MessageObject.getPeerId(reaction.peer_id); + if (shouldFilterBlockedPeer(peerId)) { + reactions.remove(i); + removed++; + } + } + return removed; + } + + private boolean shouldFilterBlockedPeer(long peerId) { + return peerId != 0 && message != null && message.isSupergroup() && + MessageHelper.getInstance(currentAccount).isBlockedOrFilteredPeer(peerId); + } + public List getSeenUsers() { return seenUsers; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java index 9ac860f74a..72e1d578dc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java @@ -31,6 +31,8 @@ import org.telegram.ui.Cells.ReactedUserHolderView; import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble; +import tw.nekomimi.nekogram.helpers.MessageHelper; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -64,6 +66,7 @@ public class ReactedUsersListView extends FrameLayout { private OnHeightChangedListener onHeightChangedListener; private OnProfileSelectedListener onProfileSelectedListener; private OnCustomEmojiSelectedListener onCustomEmojiSelectedListener; + private OnCountChangedListener onCountChangedListener; ArrayList customReactionsEmoji = new ArrayList<>(); ArrayList customEmojiStickerSets = new ArrayList<>(); MessageContainsEmojiButton messageContainsEmojiButton; @@ -198,6 +201,9 @@ public int getAdditionalHeight() { public ReactedUsersListView setSeenUsers(List users) { if (userReactions != null && !userReactions.isEmpty()) { for (ReactedHeaderView.UserSeen p : users) { + if (shouldFilterBlockedPeer(p.dialogId)) { + continue; + } TLObject user = p.user; if (user != null && p.date > 0) { for (int i = 0; i < userReactions.size(); ++i) { @@ -213,6 +219,9 @@ public ReactedUsersListView setSeenUsers(List users) } List nr = new ArrayList<>(users.size()); for (ReactedHeaderView.UserSeen p : users) { + if (shouldFilterBlockedPeer(p.dialogId)) { + continue; + } ArrayList userReactions = peerReactionMap.get(p.dialogId); if (userReactions != null) { continue; @@ -244,6 +253,11 @@ public ReactedUsersListView setSeenUsers(List users) return this; } + private boolean shouldFilterBlockedPeer(long peerId) { + return peerId != 0 && message != null && message.isSupergroup() && + MessageHelper.getInstance(currentAccount).isBlockedOrFilteredPeer(peerId); + } + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -273,6 +287,10 @@ private void load() { TLRPC.TL_messages_messageReactionsList res = (TLRPC.TL_messages_messageReactionsList) response; MessagesController.getInstance(currentAccount).putUsers(res.users, false); MessagesController.getInstance(currentAccount).putChats(res.chats, false); + int filteredCount = Math.max(0, res.count - filterBlockedReactionPeers(res.reactions)); + if (onCountChangedListener != null) { + onCountChangedListener.onCountChanged(this, filteredCount); + } LastSeenHelper.saveLastSeenFromPeerReactions(res.reactions, UserConfig.getInstance(currentAccount).getClientUserId()); HashSet visibleCustomEmojiReactions = new HashSet<>(); @@ -340,6 +358,26 @@ public void onAnimationEnd(Animator animation) { }, ConnectionsManager.RequestFlagInvokeAfter); } + private int filterBlockedReactionPeers(List reactions) { + if (reactions == null || reactions.isEmpty() || message == null || !message.isSupergroup()) { + return 0; + } + MessageHelper messageHelper = MessageHelper.getInstance(currentAccount); + int removed = 0; + for (int i = reactions.size() - 1; i >= 0; i--) { + TLRPC.MessagePeerReaction reaction = reactions.get(i); + if (reaction == null || reaction.peer_id == null) { + continue; + } + long peerId = MessageObject.getPeerId(reaction.peer_id); + if (peerId != 0 && messageHelper.isBlockedOrFilteredPeer(peerId)) { + reactions.remove(i); + removed++; + } + } + return removed; + } + private void updateCustomReactionsButton() { customEmojiStickerSets.clear(); ArrayList sets = new ArrayList<>(); @@ -393,10 +431,19 @@ public ReactedUsersListView setOnHeightChangedListener(OnHeightChangedListener o return this; } + public ReactedUsersListView setOnCountChangedListener(OnCountChangedListener onCountChangedListener) { + this.onCountChangedListener = onCountChangedListener; + return this; + } + public interface OnHeightChangedListener { void onHeightChanged(ReactedUsersListView view, int newHeight); } + public interface OnCountChangedListener { + void onCountChanged(ReactedUsersListView view, int count); + } + public interface OnProfileSelectedListener { void onProfileSelected(ReactedUsersListView view, long userId, TLRPC.MessagePeerReaction messagePeerReaction); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionTabHolderView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionTabHolderView.java index 445376fa74..3c6a26afde 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionTabHolderView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionTabHolderView.java @@ -105,8 +105,12 @@ public void setCounter(int count) { } public void setCounter(int currentAccount, TLRPC.ReactionCount counter) { - this.count = counter.count; - counterView.setText(String.format("%s", LocaleController.formatShortNumber(counter.count, null))); + setCounter(currentAccount, counter, counter.count); + } + + public void setCounter(int currentAccount, TLRPC.ReactionCount counter, int count) { + this.count = count; + counterView.setText(String.format("%s", LocaleController.formatShortNumber(count, null))); ReactionsLayoutInBubble.VisibleReaction counterReaction = ReactionsLayoutInBubble.VisibleReaction.fromTL(counter.reaction); reaction = counterReaction; if (reaction.emojicon != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessageSeenView.java b/TMessagesProj/src/main/java/org/telegram/ui/MessageSeenView.java index 80149c4172..57b8b450db 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessageSeenView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessageSeenView.java @@ -48,6 +48,8 @@ import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.StatusBadgeComponent; +import tw.nekomimi.nekogram.helpers.MessageHelper; + import java.util.ArrayList; import java.util.HashMap; @@ -117,7 +119,7 @@ public MessageSeenView(@NonNull Context context, int currentAccount, MessageObje if (object instanceof TLRPC.TL_readParticipantDate) { int date = ((TLRPC.TL_readParticipantDate) object).date; Long peerId = ((TLRPC.TL_readParticipantDate) object).user_id; - if (finalFromId == peerId) { + if (finalFromId == peerId || shouldFilterBlockedPeer(chat, peerId)) { continue; } TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(peerId); @@ -129,7 +131,7 @@ public MessageSeenView(@NonNull Context context, int currentAccount, MessageObje } } else if (object instanceof Long) { Long peerId = (Long) object; - if (finalFromId == peerId) { + if (finalFromId == peerId || shouldFilterBlockedPeer(chat, peerId)) { continue; } if (peerId > 0) { @@ -214,6 +216,11 @@ public MessageSeenView(@NonNull Context context, int currentAccount, MessageObje setEnabled(false); } + private boolean shouldFilterBlockedPeer(TLRPC.Chat chat, long peerId) { + return peerId != 0 && ChatObject.isMegagroup(chat) && + MessageHelper.getInstance(currentAccount).isBlockedOrFilteredPeer(peerId); + } + boolean ignoreLayout; @Override diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/MessageHelper.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/MessageHelper.java index 9b313cd8e0..da46f0dfd9 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/MessageHelper.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/helpers/MessageHelper.java @@ -1042,15 +1042,78 @@ public boolean isBlockedUser(long senderId) { return getMessagesController().blockePeers.indexOfKey(senderId) >= 0 || AyuFilter.isCustomFilteredPeer(senderId); } + public boolean isBlockedOrFilteredPeer(long peerId) { + return isBlockedUser(peerId) || AyuFilter.isBlockedChannel(peerId); + } + public boolean isBlockedOrFiltered(TLRPC.Message message) { if (message == null) { return false; } long fromId = MessageObject.getFromChatId(message); - boolean blocked = isBlockedUser(fromId) || AyuFilter.isBlockedChannel(fromId); + boolean blocked = isBlockedOrFilteredPeer(fromId); return blocked || AyuFilter.isFiltered(new MessageObject(currentAccount, message, false, false), null); } + public boolean filterBlockedMessageReactions(TLRPC.TL_messageReactions reactions) { + if (reactions == null || !NekoConfig.ignoreBlocked.Bool()) { + return false; + } + boolean changed = false; + if (reactions.recent_reactions != null) { + for (int i = reactions.recent_reactions.size() - 1; i >= 0; i--) { + TLRPC.MessagePeerReaction reaction = reactions.recent_reactions.get(i); + if (reaction == null || reaction.peer_id == null) { + continue; + } + long peerId = MessageObject.getPeerId(reaction.peer_id); + if (peerId != 0 && isBlockedOrFilteredPeer(peerId)) { + reactions.recent_reactions.remove(i); + decrementReactionCount(reactions, reaction.reaction); + changed = true; + } + } + } + if (reactions.top_reactors != null) { + for (int i = reactions.top_reactors.size() - 1; i >= 0; i--) { + TLRPC.MessageReactor reactor = reactions.top_reactors.get(i); + if (reactor == null || reactor.peer_id == null) { + continue; + } + long peerId = MessageObject.getPeerId(reactor.peer_id); + if (peerId != 0 && isBlockedOrFilteredPeer(peerId)) { + reactions.top_reactors.remove(i); + changed = true; + } + } + } + return changed; + } + + private static void decrementReactionCount(TLRPC.TL_messageReactions reactions, TLRPC.Reaction removedReaction) { + if (removedReaction == null || reactions.results == null) { + return; + } + for (int i = reactions.results.size() - 1; i >= 0; i--) { + TLRPC.ReactionCount count = reactions.results.get(i); + if (count == null || !sameReaction(count.reaction, removedReaction)) { + continue; + } + count.count--; + if (count.count <= 0) { + reactions.results.remove(i); + } + return; + } + } + + private static boolean sameReaction(TLRPC.Reaction first, TLRPC.Reaction second) { + if (first == null || second == null) { + return false; + } + return first.equals(second) || first instanceof TLRPC.TL_reactionPaid && second instanceof TLRPC.TL_reactionPaid; + } + public static void copyVideoFrameToClipboard(File videoFile, long positionMs, View bulletinContainer, Theme.ResourcesProvider resourcesProvider, Runnable fallbackAction) { Utilities.globalQueue.postRunnable(() -> { Bitmap bitmap = null;