Skip to content

Commit 24e979e

Browse files
committed
修正
会话中消息被回复或者清除后,再来消息时,被消除的历史消息会重新出现。 此问题源于提交 bdec36a 中为了修正群友昵称问题,更改了数据来源。
1 parent ec81aad commit 24e979e

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

src/main/java/com/oasisfeng/nevo/decorators/wechat/MessagingBuilder.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import androidx.core.app.NotificationCompat.MessagingStyle;
3838
import androidx.core.app.NotificationCompat.MessagingStyle.Message;
3939
import androidx.core.app.Person;
40-
import androidx.core.graphics.drawable.IconCompat;
4140

4241
import static android.app.Notification.EXTRA_REMOTE_INPUT_HISTORY;
4342
import static android.app.Notification.EXTRA_TEXT;
@@ -159,8 +158,9 @@ class MessagingBuilder {
159158
Log.e(TAG, "Error parsing reply intent.", e);
160159
}
161160

162-
final MessagingStyle messaging = buildFromArchive(conversation, n, title, archive);
163-
final List<Message> messages = messaging.getMessages();
161+
final MessagingStyle messaging = new MessagingStyle(mUserSelf);
162+
final Message[] messages = WeChatMessage.buildFromCarConversation(conversation, convs, archive);
163+
for (final Message message : messages) messaging.addMessage(message);
164164

165165
final PendingIntent on_read = convs.getReadPendingIntent();
166166
if (on_read != null) mMarkReadPendingIntents.put(sbn.getKey(), on_read); // Mapped by evolved key,
@@ -180,7 +180,7 @@ class MessagingBuilder {
180180
n.addAction(reply_action.build());
181181

182182
if (conversation.isGroupChat() && mPreferences.getBoolean(mPrefKeyMentionAction, false)) {
183-
final Person last_sender = messages.get(messages.size() - 1).getPerson();
183+
final Person last_sender = messages[messages.length - 1].getPerson();
184184
if (last_sender != null && last_sender != mUserSelf) {
185185
final String label = "@" + last_sender.getName(), prefix = "@" + Conversation.getOriginalName(last_sender) + MENTION_SEPARATOR;
186186
n.addAction(new Action.Builder(null, label, proxyDirectReply(sbn, on_reply, remote_input, input_history, prefix))

src/main/java/com/oasisfeng/nevo/decorators/wechat/WeChatMessage.java

+24-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.oasisfeng.nevo.decorators.wechat;
22

33
import android.app.Notification;
4+
import android.service.notification.StatusBarNotification;
45
import android.text.TextUtils;
56
import android.util.Log;
67

78
import com.oasisfeng.nevo.decorators.wechat.ConversationManager.Conversation;
89

10+
import java.util.List;
11+
912
import androidx.annotation.Nullable;
1013
import androidx.core.app.NotificationCompat.MessagingStyle.Message;
1114
import androidx.core.app.Person;
@@ -31,17 +34,22 @@ class WeChatMessage {
3134
static final String SENDER_MESSAGE_SEPARATOR = ": ";
3235
private static final String SELF = "";
3336

34-
static Message[] buildFromCarConversation(final Conversation conversation, final Notification.CarExtender.UnreadConversation convs) {
37+
static Message[] buildFromCarConversation(final Conversation conversation, final Notification.CarExtender.UnreadConversation convs, final List<StatusBarNotification> archive) {
3538
final String[] car_messages = convs.getMessages();
3639
if (car_messages.length == 0) return new Message[] { buildFromBasicFields(conversation).toMessage() }; // No messages in car conversation
3740

3841
final WeChatMessage basic_msg = buildFromBasicFields(conversation);
3942
final Message[] messages = new Message[car_messages.length];
43+
final CharSequence[] tickerArray = new CharSequence[car_messages.length];
44+
for (int i = archive.size() - 1, diff = archive.size() - car_messages.length; i >= 0 && i >= diff; i--) {
45+
tickerArray[i - diff] = archive.get(i).getNotification().tickerText;
46+
}
4047
int end_of_peers = -1;
4148
if (! conversation.isGroupChat()) for (end_of_peers = car_messages.length - 1; end_of_peers >= -1; end_of_peers --)
4249
if (end_of_peers >= 0 && TextUtils.equals(basic_msg.text, car_messages[end_of_peers])) break; // Find the actual end line which matches basic fields, in case extra lines are sent by self
43-
for (int i = 0, count = car_messages.length; i < count; i ++)
44-
messages[i] = buildFromCarMessage(conversation, car_messages[i], end_of_peers >= 0 && i > end_of_peers).toMessage();
50+
for (int i = 0, count = car_messages.length; i < count; i ++) {
51+
messages[i] = buildFromCarMessage(conversation, car_messages[i], tickerArray[i], end_of_peers >= 0 && i > end_of_peers).toMessage();
52+
}
4553
return messages;
4654
}
4755

@@ -130,9 +138,11 @@ private static boolean startsWith(final CharSequence text, final CharSequence ne
130138
&& TextUtils.regionMatches(text, needle1_length, needle2, 0, needle2_length);
131139
}
132140

133-
private static WeChatMessage buildFromCarMessage(final Conversation conversation, final String message, final boolean from_self) {
141+
private static WeChatMessage buildFromCarMessage(final Conversation conversation, final String message, final @Nullable CharSequence ticker, final boolean from_self) {
134142
String text = message, sender = null;
135-
final int pos = from_self ? 0 : TextUtils.indexOf(message, SENDER_MESSAGE_SEPARATOR);
143+
int pos;
144+
// parse text
145+
pos = from_self ? 0 : TextUtils.indexOf(message, SENDER_MESSAGE_SEPARATOR);
136146
if (pos > 0) {
137147
sender = message.substring(0, pos);
138148
final boolean title_as_sender = TextUtils.equals(sender, conversation.getTitle());
@@ -141,6 +151,15 @@ private static WeChatMessage buildFromCarMessage(final Conversation conversation
141151
if (conversation.isGroupChat() && title_as_sender) sender = SELF; // WeChat incorrectly use group chat title as sender for self-sent messages.
142152
} else sender = null; // Not really the sender name, revert the parsing result.
143153
}
154+
// parse sender (from ticker)
155+
pos = from_self ? 0 : TextUtils.indexOf(ticker, SENDER_MESSAGE_SEPARATOR);
156+
if (pos > 0) {
157+
sender = ticker.toString().substring(0, pos);
158+
final boolean title_as_sender = TextUtils.equals(sender, conversation.getTitle());
159+
if (conversation.isGroupChat() || title_as_sender) { // Verify the sender with title for non-group conversation
160+
if (conversation.isGroupChat() && title_as_sender) sender = SELF; // WeChat incorrectly use group chat title as sender for self-sent messages.
161+
} else sender = null; // Not really the sender name, revert the parsing result.
162+
}
144163
return new WeChatMessage(conversation, from_self ? SELF : sender, EmojiTranslator.translate(text), 0);
145164
}
146165

0 commit comments

Comments
 (0)