fix(mmp): 停止反复强跳红包历史页,避免打断前台使用
领取台恢复改为仅拉起 TNG 前台;Hook 侧限次/冷却,已在历史页不再重复打开。
This commit is contained in:
@@ -367,7 +367,8 @@ public class MmpClaimActivity extends MiracleGardenActivity<ActivityMmpClaimBind
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TNG 还在跑但 Hook 长时间无心跳:先唤醒/进历史页,仍无效再强停重开。
|
* TNG 还在跑但 Hook 长时间无心跳:仅把 TNG 拉到前台(不强进历史页),
|
||||||
|
* 仍无效再强停重开。历史页跳转只由 Xposed 短 bounce(会自动 finish),避免一直把人拽进历史页。
|
||||||
*/
|
*/
|
||||||
private void maybeRecoverStaleHook() {
|
private void maybeRecoverStaleHook() {
|
||||||
long hookAt = MmpHookStatus.lastAliveAt(this);
|
long hookAt = MmpHookStatus.lastAliveAt(this);
|
||||||
@@ -377,26 +378,23 @@ public class MmpClaimActivity extends MiracleGardenActivity<ActivityMmpClaimBind
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
boolean bounce = MmpLocalSettings.load(this)
|
|
||||||
.optBoolean("autoBounceHistoryOnDisconnect", true);
|
|
||||||
|
|
||||||
if (hookRecoverStep == 0) {
|
if (hookRecoverStep == 0) {
|
||||||
if (now - lastHookRecoverAt < 45_000L) {
|
if (now - lastHookRecoverAt < 90_000L) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lastHookRecoverAt = now;
|
lastHookRecoverAt = now;
|
||||||
hookRecoverStep = 1;
|
hookRecoverStep = 1;
|
||||||
boolean ok = bounce
|
// 不强进 MoneyPacketHistoryActivity:用户已在 App 内时会被反复打断
|
||||||
? TngProcessHelper.openMoneyPacketHistory(this)
|
boolean ok = TngProcessHelper.launch(this);
|
||||||
: TngProcessHelper.launch(this);
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
Toast.makeText(this, "Hook 无心跳,正在唤醒 TNG…", Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, "Hook 无心跳,已尝试唤醒 TNG 前台…", Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hookRecoverStep == 1) {
|
if (hookRecoverStep == 1) {
|
||||||
if (now - lastHookRecoverAt < 90_000L) {
|
if (now - lastHookRecoverAt < 2 * 60_000L) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 唤醒后仍无心跳 → 强停重建
|
// 唤醒后仍无心跳 → 强停重建
|
||||||
|
|||||||
@@ -528,7 +528,7 @@
|
|||||||
android:layout_marginTop="4dp"
|
android:layout_marginTop="4dp"
|
||||||
android:buttonTint="#C45C26"
|
android:buttonTint="#C45C26"
|
||||||
android:checked="true"
|
android:checked="true"
|
||||||
android:text="检测不到 Hook 连接时:自动进一下红包历史页再返回(约 45 秒最多一次)"
|
android:text="Hook 断线时短进历史页再建连(约 2 秒后自动返回;已在历史页不会重复打开)"
|
||||||
android:textColor="#222222"
|
android:textColor="#222222"
|
||||||
android:textSize="13sp" />
|
android:textSize="13sp" />
|
||||||
|
|
||||||
|
|||||||
@@ -85,8 +85,11 @@ public final class TngMoneyPacketHook {
|
|||||||
private static volatile long sLastHistoryBounceAt;
|
private static volatile long sLastHistoryBounceAt;
|
||||||
private static volatile boolean sBounceHistoryPending;
|
private static volatile boolean sBounceHistoryPending;
|
||||||
private static volatile long sLastHookStatusAt;
|
private static volatile long sLastHookStatusAt;
|
||||||
private static final long HISTORY_BOUNCE_COOLDOWN_MS = 45_000L;
|
private static final long HISTORY_BOUNCE_COOLDOWN_MS = 120_000L;
|
||||||
private static final long HISTORY_BOUNCE_FINISH_DELAY_MS = 2_200L;
|
private static final long HISTORY_BOUNCE_FINISH_DELAY_MS = 2_200L;
|
||||||
|
/** 无模板时最多主动打开历史页次数(进程内),避免一直把用户拽进历史页 */
|
||||||
|
private static volatile int sNoTemplateOpenCount;
|
||||||
|
private static final int MAX_NO_TEMPLATE_OPEN = 2;
|
||||||
private static final long HOOK_STATUS_COOLDOWN_MS = 20_000L;
|
private static final long HOOK_STATUS_COOLDOWN_MS = 20_000L;
|
||||||
/** 曾拿到过 session,之后变空 / RPC 鉴权失败 → 视为断线,恢复后强制重拉 */
|
/** 曾拿到过 session,之后变空 / RPC 鉴权失败 → 视为断线,恢复后强制重拉 */
|
||||||
private static volatile boolean sHadSession;
|
private static volatile boolean sHadSession;
|
||||||
@@ -412,6 +415,7 @@ public final class TngMoneyPacketHook {
|
|||||||
sTemplateHistoryRequest = cloneRequestShallow(historyReq);
|
sTemplateHistoryRequest = cloneRequestShallow(historyReq);
|
||||||
sLoginDonorRequest = historyReq;
|
sLoginDonorRequest = historyReq;
|
||||||
cacheLoginFromRequestObject(historyReq);
|
cacheLoginFromRequestObject(historyReq);
|
||||||
|
sNoTemplateOpenCount = 0;
|
||||||
XposedBridge.log(TAG + " cached history request template"
|
XposedBridge.log(TAG + " cached history request template"
|
||||||
+ " session=" + abbreviate(stringField(historyReq,
|
+ " session=" + abbreviate(stringField(historyReq,
|
||||||
"sessionId", "getSessionId")));
|
"sessionId", "getSessionId")));
|
||||||
@@ -1630,13 +1634,20 @@ public final class TngMoneyPacketHook {
|
|||||||
maybeBounceHistoryPage("template-rpc-fail");
|
maybeBounceHistoryPage("template-rpc-fail");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// 2) 无模板时:自造请求易「非法参数」,直接拉起官方历史页让 App 发正确 RPC
|
// 2) 无模板时:自造请求易「非法参数」,短进官方历史页让 App 发正确 RPC(限次 + 冷却)
|
||||||
if (!sOpenHistoryIfNoTemplate && !sAutoBounceHistoryOnDisconnect) {
|
if (!sOpenHistoryIfNoTemplate && !sAutoBounceHistoryOnDisconnect) {
|
||||||
XposedBridge.log(TAG + " auto-history no template, openHistory disabled ("
|
XposedBridge.log(TAG + " auto-history no template, openHistory disabled ("
|
||||||
+ reason + ")");
|
+ reason + ")");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
XposedBridge.log(TAG + " auto-history no template → open HistoryActivity (" + reason + ")");
|
if (sNoTemplateOpenCount >= MAX_NO_TEMPLATE_OPEN) {
|
||||||
|
XposedBridge.log(TAG + " auto-history no template, open capped ("
|
||||||
|
+ reason + " count=" + sNoTemplateOpenCount + ")");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sNoTemplateOpenCount++;
|
||||||
|
XposedBridge.log(TAG + " auto-history no template → open HistoryActivity ("
|
||||||
|
+ reason + " #" + sNoTemplateOpenCount + ")");
|
||||||
openMoneyPacketHistoryActivity(true);
|
openMoneyPacketHistoryActivity(true);
|
||||||
return false;
|
return false;
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
@@ -1671,6 +1682,25 @@ public final class TngMoneyPacketHook {
|
|||||||
+ (now - sLastHistoryBounceAt));
|
+ (now - sLastHistoryBounceAt));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// 已在历史页则不再 startActivity,避免反复跳转
|
||||||
|
try {
|
||||||
|
Context ctx0 = getContext();
|
||||||
|
if (ctx0 instanceof android.app.Activity) {
|
||||||
|
String cur = ((android.app.Activity) ctx0).getClass().getName();
|
||||||
|
if (cur.contains("MoneyPacketHistoryActivity")) {
|
||||||
|
XposedBridge.log(TAG + " already on HistoryActivity, skip open");
|
||||||
|
if (bounceBack) {
|
||||||
|
sLastHistoryBounceAt = now;
|
||||||
|
sBounceHistoryPending = true;
|
||||||
|
scheduleHistoryBounceFinish(ctx0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable ignored) {
|
||||||
|
}
|
||||||
|
if (bounceBack) {
|
||||||
sLastHistoryBounceAt = now;
|
sLastHistoryBounceAt = now;
|
||||||
sBounceHistoryPending = true;
|
sBounceHistoryPending = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user