diff --git a/app/src/main/java/cc/chenhe/qqnotifyevo/core/NevoNotificationProcessor.kt b/app/src/main/java/cc/chenhe/qqnotifyevo/core/NevoNotificationProcessor.kt index 138bb33..1b76b3f 100644 --- a/app/src/main/java/cc/chenhe/qqnotifyevo/core/NevoNotificationProcessor.kt +++ b/app/src/main/java/cc/chenhe/qqnotifyevo/core/NevoNotificationProcessor.kt @@ -33,8 +33,12 @@ class NevoNotificationProcessor(context: Context) : NotificationProcessor(contex return createConversationNotification(context, tag, channel, conversation, original) } - override fun onMultiMessageDetected() { - super.onMultiMessageDetected() + override fun onMultiMessageDetected(isBindingMsg: Boolean) { + super.onMultiMessageDetected(isBindingMsg) + if (isBindingMsg) { + // 目前关联账号的消息都会合并 + return + } if (nevoMultiMsgTip(ctx)) { val dontShow = PendingIntent.getBroadcast(ctx, REQ_MULTI_MSG_DONT_SHOW, Intent(ctx, StaticReceiver::class.java).also { diff --git a/app/src/main/java/cc/chenhe/qqnotifyevo/core/NotificationProcessor.kt b/app/src/main/java/cc/chenhe/qqnotifyevo/core/NotificationProcessor.kt index c52b702..4b69da5 100644 --- a/app/src/main/java/cc/chenhe/qqnotifyevo/core/NotificationProcessor.kt +++ b/app/src/main/java/cc/chenhe/qqnotifyevo/core/NotificationProcessor.kt @@ -91,6 +91,40 @@ abstract class NotificationProcessor(context: Context) { @VisibleForTesting val msgTitlePattern: Pattern = Pattern.compile("^(\\[特别关心])?.*?(?: \\((\\d+)条新消息\\))?$") + // 关联QQ消息 + // title: + // - 只有一条消息: 关联QQ号 + // - 一人发来多条消息: 关联QQ号 ({x}条新消息) + // - 多人发来消息: QQ + // ticker: 关联QQ号-{关联昵称} {发送者昵称}:{消息内容} + // content: + // - 一人发来消息: {消息内容} + // - 多人发来消息: 有 {x} 个联系人给你发过来{y}条新消息 + + /** + * 匹配关联 QQ 消息 ticker. + * + * Group: 1关联账号昵称, 2消息内容 + */ + @VisibleForTesting + val bindingQQMsgTickerPattern: Pattern = Pattern.compile("^关联QQ号-(.+?):([\\s\\S]+)$") + + /** + * 匹配关联 QQ 消息 content. 用于提取未读消息个数。 + * + * Group: 1未读消息个数 + */ + @VisibleForTesting + val bindingQQMsgContextPattern: Pattern = Pattern.compile("^有 (?:\\d+) 个联系人给你发过来(\\d+)条新消息$") + + /** + * 匹配关联 QQ 消息 title. 用于提取未读消息个数。 + * + * Group: 1未读消息个数 + */ + @VisibleForTesting + val bindingQQMsgTitlePattern: Pattern = Pattern.compile("^关联QQ号 \\((\\d+)条新消息\\)$") + // Q空间动态 // title(与我相关): QQ空间动态(共x条未读); (特别关心): QQ空间动态 // ticker(与我相关): 详情(例如xxx评论了你); (特别关心): 【特别关心】昵称:内容 @@ -161,8 +195,10 @@ abstract class NotificationProcessor(context: Context) { * 检测到合并消息的回调。 * * 合并消息:有 x 个联系人给你发过来y条新消息 + * + * @param isBindingMsg 是否来自关联 QQ 的消息。 */ - protected open fun onMultiMessageDetected() {} + protected open fun onMultiMessageDetected(isBindingMsg: Boolean) {} /** * 创建优化后的QQ空间通知。 @@ -234,7 +270,7 @@ abstract class NotificationProcessor(context: Context) { Timber.tag(TAG).v("Title: $title; Ticker: $ticker; QZone: $isQzone; Multi: $isMulti; Content: $content") if (isMulti) { - onMultiMessageDetected() + onMultiMessageDetected(ticker?.contains("关联QQ号-") ?: false) } // 隐藏消息详情 @@ -319,6 +355,21 @@ abstract class NotificationProcessor(context: Context) { } } } + + // 关联账号消息 + bindingQQMsgTickerPattern.matcher(ticker).also { matcher -> + if (matcher.matches()) { + val account = matcher.group(1) ?: "" + val text = matcher.group(2) ?: return null + val conversation = addMessage(tag, context.getString(R.string.notify_binding_msg_title, account), + text, null, getNotifyLargeIcon(context, original), original.contentIntent, + original.deleteIntent, false) + deleteOldMessage(conversation, matchBindingMsgNum(title, content)) + Timber.tag(TAG).d("[Binding] Account: $account; Text: $text") + return renewConversionNotification(context, tag, NotifyChannel.FRIEND, conversation, sbn, original) + } + } + Timber.tag(TAG).w("[None] Not match any pattern.") return null } @@ -367,6 +418,28 @@ abstract class NotificationProcessor(context: Context) { return 0 } + /** + * 提取关联账号的未读消息个数。 + */ + private fun matchBindingMsgNum(title: String?, content: String?): Int { + if (title == null || content == null) return 1 + if (title == "QQ") { + bindingQQMsgContextPattern.matcher(content).also { matcher -> + if (matcher.matches()) { + return matcher.group(1)?.toInt() ?: 1 + } + } + } else { + bindingQQMsgTitlePattern.matcher(title).also { matcher -> + if (matcher.matches()) { + return matcher.group(1)?.toInt() ?: 1 + } + } + } + + return 1 + } + /** * 获取通知的大图标。 * diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b0a7c4..be3240f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,6 +59,7 @@ 特别关心动态 %1$d条新消息 %1$d条新动态 + 关联账号-%1$s 升级中