feat(mmp): 领取进度/过期状态,并展示红包与领取人ID
状态优先显示已全部领取或已领取N/M,未领完才附加已过期;列表与最高最低补全 activityId、receiverId。
This commit is contained in:
@@ -10,8 +10,8 @@ android {
|
||||
applicationId "com.miraclegarden.smsmessage.xposed"
|
||||
minSdk 24
|
||||
targetSdk 34
|
||||
versionCode 3
|
||||
versionName "1.2.0"
|
||||
versionCode 5
|
||||
versionName "1.2.2"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
|
||||
@@ -14,8 +14,8 @@ public final class HookBridge {
|
||||
public static final String EXTRA_MODULE_VERSION_NAME = "moduleVersionName";
|
||||
public static final String EXTRA_HOST_PACKAGE = "hostPackage";
|
||||
/** 与 xposed-module/build.gradle 保持同步 */
|
||||
public static final int MODULE_VERSION_CODE = 3;
|
||||
public static final String MODULE_VERSION_NAME = "1.2.0";
|
||||
public static final int MODULE_VERSION_CODE = 5;
|
||||
public static final String MODULE_VERSION_NAME = "1.2.2";
|
||||
public static final String SOURCE_XPOSED_SQLITE = "xposed_sqlite";
|
||||
public static final String SOURCE_XPOSED_WECHAT = "xposed_wechat";
|
||||
public static final String SOURCE_XPOSED_TELEGRAM = "xposed_telegram";
|
||||
|
||||
@@ -938,7 +938,7 @@ public final class TngMoneyPacketHook {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
|
||||
/** remaining / claimed/total / status 任一表明已领完 */
|
||||
/** remaining / claimed/total / status 任一表明已领完或已结束 */
|
||||
private static boolean isFinishedFlags(String remain, String claimedSlashTotal, String status) {
|
||||
if (!TextUtils.isEmpty(remain)) {
|
||||
try {
|
||||
@@ -961,7 +961,9 @@ public final class TngMoneyPacketHook {
|
||||
}
|
||||
if (!TextUtils.isEmpty(status)) {
|
||||
String s = status.toUpperCase(Locale.US);
|
||||
// TNG ActivityStatus: ACTIVE/INIT/FINISHED/ENDED/CLOSED/CANCELLED
|
||||
if (s.contains("FINISH") || s.contains("COMPLETE") || s.contains("EXPIRE")
|
||||
|| s.contains("ENDED") || s.contains("CLOSED") || s.contains("CANCEL")
|
||||
|| s.contains("DONE") || "TRUE".equals(s)) {
|
||||
return true;
|
||||
}
|
||||
@@ -978,6 +980,9 @@ public final class TngMoneyPacketHook {
|
||||
snapshot.activityStatus)) {
|
||||
return true;
|
||||
}
|
||||
if (isExpireTimePassed(snapshot.expireTime)) {
|
||||
return true;
|
||||
}
|
||||
// 已领金额 ≈ 总额
|
||||
Double claimedAmt = parseMoneyDouble(snapshot.claimedAmountText);
|
||||
Double totalAmt = parseMoneyDouble(snapshot.totalAmount);
|
||||
@@ -998,6 +1003,58 @@ public final class TngMoneyPacketHook {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** expireTime 形如 05/08/2026 14:06:56 或 ISO;已过则视为结束 */
|
||||
private static boolean isExpireTimePassed(String expireTime) {
|
||||
long ms = parseIssueTimeMs(expireTime);
|
||||
return ms > 0 && System.currentTimeMillis() >= ms;
|
||||
}
|
||||
|
||||
private static long parseIssueTimeMs(String text) {
|
||||
if (TextUtils.isEmpty(text)) {
|
||||
return 0L;
|
||||
}
|
||||
String s = text.trim();
|
||||
try {
|
||||
java.util.regex.Matcher m = java.util.regex.Pattern
|
||||
.compile("^(\\d{2})/(\\d{2})/(\\d{4})(?:\\s+(\\d{2}):(\\d{2})(?::(\\d{2}))?)?")
|
||||
.matcher(s);
|
||||
if (m.find()) {
|
||||
java.util.Calendar c = java.util.Calendar.getInstance();
|
||||
c.set(Integer.parseInt(m.group(3)),
|
||||
Integer.parseInt(m.group(2)) - 1,
|
||||
Integer.parseInt(m.group(1)),
|
||||
m.group(4) != null ? Integer.parseInt(m.group(4)) : 23,
|
||||
m.group(5) != null ? Integer.parseInt(m.group(5)) : 59,
|
||||
m.group(6) != null ? Integer.parseInt(m.group(6)) : 59);
|
||||
c.set(java.util.Calendar.MILLISECOND, 999);
|
||||
return c.getTimeInMillis();
|
||||
}
|
||||
if (s.matches("^\\d{13}$")) {
|
||||
return Long.parseLong(s);
|
||||
}
|
||||
if (s.matches("^\\d{10}$")) {
|
||||
return Long.parseLong(s) * 1000L;
|
||||
}
|
||||
// 2026-08-05T14:06:56 / 2026-08-05 14:06:56
|
||||
java.util.regex.Matcher iso = java.util.regex.Pattern
|
||||
.compile("^(\\d{4})-(\\d{2})-(\\d{2})[ T](\\d{2}):(\\d{2})(?::(\\d{2}))?")
|
||||
.matcher(s);
|
||||
if (iso.find()) {
|
||||
java.util.Calendar c = java.util.Calendar.getInstance();
|
||||
c.set(Integer.parseInt(iso.group(1)),
|
||||
Integer.parseInt(iso.group(2)) - 1,
|
||||
Integer.parseInt(iso.group(3)),
|
||||
Integer.parseInt(iso.group(4)),
|
||||
Integer.parseInt(iso.group(5)),
|
||||
iso.group(6) != null ? Integer.parseInt(iso.group(6)) : 0);
|
||||
c.set(java.util.Calendar.MILLISECOND, 0);
|
||||
return c.getTimeInMillis();
|
||||
}
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
private static String buildCountHint(String claimed, String total) {
|
||||
if (TextUtils.isEmpty(claimed) && TextUtils.isEmpty(total)) {
|
||||
return null;
|
||||
@@ -2034,6 +2091,11 @@ public final class TngMoneyPacketHook {
|
||||
stringField(result, "activityStatus", "getActivityStatus"),
|
||||
boolFieldText(summary, "isFinished", "isFinished"),
|
||||
boolFieldText(result, "isFinished", "isFinished"));
|
||||
snapshot.expireTime = firstNonEmpty(
|
||||
stringField(summary, "expireTime", "getExpireTime"),
|
||||
stringField(result, "expireTime", "getExpireTime"),
|
||||
stringField(summary, "expiryTime", "getExpiryTime"),
|
||||
stringField(result, "expiryTime", "getExpiryTime"));
|
||||
if (TextUtils.isEmpty(snapshot.claimedAmountText)) {
|
||||
try {
|
||||
Object money = XposedHelpers.callMethod(summary, "getClaimedAmount");
|
||||
@@ -2649,6 +2711,7 @@ public final class TngMoneyPacketHook {
|
||||
String claimedCount;
|
||||
String totalCount;
|
||||
String activityStatus;
|
||||
String expireTime;
|
||||
String claimedAmountText;
|
||||
boolean finished;
|
||||
final List<ClaimLine> claims = new ArrayList<>();
|
||||
@@ -2713,6 +2776,21 @@ public final class TngMoneyPacketHook {
|
||||
if (!TextUtils.isEmpty(issueTime)) {
|
||||
sb.append(" | issued=").append(sanitizeMeta(issueTime));
|
||||
}
|
||||
if (!TextUtils.isEmpty(expireTime)) {
|
||||
sb.append(" | expire=").append(sanitizeMeta(expireTime));
|
||||
}
|
||||
if (!TextUtils.isEmpty(activityStatus)) {
|
||||
sb.append(" | status=").append(sanitizeMeta(activityStatus));
|
||||
}
|
||||
String claimed = claimedCount;
|
||||
String totalCnt = totalCount;
|
||||
if (TextUtils.isEmpty(claimed) && claims != null) {
|
||||
claimed = String.valueOf(claims.size());
|
||||
}
|
||||
if (!TextUtils.isEmpty(claimed) || !TextUtils.isEmpty(totalCnt)) {
|
||||
sb.append(" | counts=").append(sanitizeMeta(nullToEmpty(claimed)))
|
||||
.append('/').append(sanitizeMeta(nullToEmpty(totalCnt)));
|
||||
}
|
||||
if (finished) {
|
||||
sb.append(" | done=1");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user