From 3c5486cc5cb31f4f47745f92b1f01b58402a5b7f Mon Sep 17 00:00:00 2001 From: QIU Date: Tue, 4 Aug 2026 05:36:48 +0000 Subject: [PATCH] fix(cw): restore FFT dispatch (cond_22), CW UI settings entry, default order Decode page showed stats but empty waterfall and no decoded text: the ported i3/d.k() FFT dispatch was broken by a jadx structure misplacement - the runtime path (k=1 -> a5=0 -> cond_22 single-thread FFT) was replaced by a hallucinated `throw null` else-branch while the real cond_22 code sat in a dead else. Verified against smali (7030-7263): j3.c.q forward FFT + post-processing loop + tail + small- array branch now live in the a5==0 branch. Also: - UiSettingsCard now lists CwDecode (toggle + drag-reorder) between Roaming and Map - unknown screenIds in persisted screenOrder fall back to defaultScreenOrder position (CwDecode lands between Roaming and Map for existing users instead of trailing after Settings) Verified: :feature:cw + :feature:settings + :app compileDebugKotlin BUILD SUCCESSFUL. --- .../java/com/rtbishop/look4sat/MainScreen.kt | 6 +- feature/cw/src/main/java/i3/d.java | 101 ++++++++---------- .../feature/settings/SettingsScreen.kt | 8 +- 3 files changed, 57 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt index 4556d146..935938e1 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainScreen.kt @@ -139,8 +139,12 @@ fun MainScreen(navigateToRadar: () -> Unit = {}) { // UI 设置: 按 screenOrder 排序(空 = 默认顺序), 再按 hiddenScreens 过滤(设置页固定保留) val navItems = listOf(Screen.Satellites, Screen.Passes, Screen.Radar, Screen.Mutual, Screen.Roaming, Screen.CwDecode, Screen.Map, Screen.Settings) .sortedBy { screen -> + // 未知(新页面如 CwDecode 不在旧持久化顺序里): 用默认顺序位置(漫游↔地图), 再兜底最后 val idx = otherSettings.screenOrder.indexOf(screen.screenId) - if (idx == -1) Int.MAX_VALUE else idx + if (idx != -1) idx + else com.rtbishop.look4sat.core.presentation.defaultScreenOrder.indexOf(screen.screenId).let { + if (it != -1) it else Int.MAX_VALUE + } } .filter { it.screenId !in otherSettings.hiddenScreens || it is Screen.Settings } // Activity-scoped so the mutual query results survive navigation to Radar and back diff --git a/feature/cw/src/main/java/i3/d.java b/feature/cw/src/main/java/i3/d.java index 811b0600..8c769c01 100644 --- a/feature/cw/src/main/java/i3/d.java +++ b/feature/cw/src/main/java/i3/d.java @@ -1212,65 +1212,54 @@ public final class d { } } } else { - if (i8 == 1) { - for (int i23 = i8 - 1; i23 >= 2; i23--) { - int i24 = i4 + i23; - float f6 = fArr[i24]; - int i25 = i24 - 1; - fArr[i24] = fArr[i25]; - fArr[i25] = f6; + // smali cond_22(a5==0, k=1 时运行时路径!): 单线程 FFT + 后处理 + // jadx 原把这段错塞进 if(i8!=1) 的 else(死代码), a5==0 的 else 是幻觉(throw null) + int i26 = this.f11700a; + if (i26 > 4) { + j3.c.q(i26, fArr, i4, this.c, this.f11704g, this.f11703e); + int i27 = this.f11706i; + float[] fArr6 = this.f11703e; + int i28 = this.f11704g; + int i29 = i8 >> 1; + int i30 = (i27 * 2) / i29; + for (int i31 = 2; i31 < i29; i31 += 2) { + i14 += i30; + float f7 = 0.5f - fArr6[(i28 + i27) - i14]; + float f8 = fArr6[i28 + i14]; + int i32 = i4 + i31; + int i33 = i4 + (i8 - i31); + float f9 = fArr[i32]; + float f10 = f9 - fArr[i33]; + int i34 = i32 + 1; + int i35 = i33 + 1; + float f11 = fArr[i34] + fArr[i35]; + float f12 = (f7 * f10) - (f8 * f11); + float f13 = (f8 * f10) + (f7 * f11); + fArr[i32] = f9 - f12; + fArr[i34] = f13 - fArr[i34]; + fArr[i33] = fArr[i33] + f12; + fArr[i35] = f13 - fArr[i35]; } - return; + int i36 = i4 + i29 + 1; + fArr[i36] = -fArr[i36]; + } else if (i26 == 4) { + float f14 = fArr[i4]; + int i37 = i4 + 2; + float f15 = fArr[i37]; + int i38 = i4 + 1; + int i39 = i4 + 3; + float f16 = (-fArr[i38]) + fArr[i39]; + fArr[i4] = f14 + f15; + fArr[i38] = fArr[i38] + fArr[i39]; + fArr[i37] = f14 - f15; + fArr[i39] = f16; } - float[] fArr5 = new float[i8]; - throw null; + float f17 = fArr[i4]; + int i40 = i4 + 1; + float f18 = fArr[i40]; + fArr[i4] = f17 + f18; + fArr[i40] = f17 - f18; } - } else { - int i26 = this.f11700a; - if (i26 > 4) { - j3.c.q(i26, fArr, i4, this.c, this.f11704g, this.f11703e); - int i27 = this.f11706i; - float[] fArr6 = this.f11703e; - int i28 = this.f11704g; - int i29 = i8 >> 1; - int i30 = (i27 * 2) / i29; - for (int i31 = 2; i31 < i29; i31 += 2) { - i14 += i30; - float f7 = 0.5f - fArr6[(i28 + i27) - i14]; - float f8 = fArr6[i28 + i14]; - int i32 = i4 + i31; - int i33 = i4 + (i8 - i31); - float f9 = fArr[i32]; - float f10 = f9 - fArr[i33]; - int i34 = i32 + 1; - int i35 = i33 + 1; - float f11 = fArr[i34] + fArr[i35]; - float f12 = (f7 * f10) - (f8 * f11); - float f13 = (f8 * f10) + (f7 * f11); - fArr[i32] = f9 - f12; - fArr[i34] = f13 - fArr[i34]; - fArr[i33] = fArr[i33] + f12; - fArr[i35] = f13 - fArr[i35]; - } - int i36 = i4 + i29 + 1; - fArr[i36] = -fArr[i36]; - } else if (i26 == 4) { - float f14 = fArr[i4]; - int i37 = i4 + 2; - float f15 = fArr[i37]; - int i38 = i4 + 1; - int i39 = i4 + 3; - float f16 = (-fArr[i38]) + fArr[i39]; - fArr[i4] = f14 + f15; - fArr[i38] = fArr[i38] + fArr[i39]; - fArr[i37] = f14 - f15; - fArr[i39] = f16; - } - float f17 = fArr[i4]; - int i40 = i4 + 1; - float f18 = fArr[i40]; - fArr[i4] = f17 + f18; - fArr[i40] = f17 - f18; } } } diff --git a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt index 30c0b052..48ed96a6 100644 --- a/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/java/com/rtbishop/look4sat/feature/settings/SettingsScreen.kt @@ -567,6 +567,7 @@ private fun UiSettingsCard( R.string.nav_radar to "Radar", R.string.nav_mutual to "Mutual", R.string.nav_roaming to "Roaming", + R.string.nav_cw to "CwDecode", R.string.nav_map to "Map", R.string.nav_prefs to "Settings" ) // name 必须与 Screen.screenId 一致 (R8 安全) @@ -613,7 +614,12 @@ private fun DragOrderList( // 按 screenOrder 排序(空 = 默认顺序); remember 以 screens 参数为 key, 持久化后重组 val ordered = remember(screens, screenOrder) { screens.sortedBy { (_, name) -> - screenOrder.indexOf(name).let { if (it == -1) Int.MAX_VALUE else it } + // 未知(新页面如 CwDecode 不在旧持久化顺序里): 用默认顺序位置, 再兜底最后 + screenOrder.indexOf(name).let { + if (it != -1) it else com.rtbishop.look4sat.core.presentation.defaultScreenOrder.indexOf(name).let { + if (it != -1) it else Int.MAX_VALUE + } + } } } val listState = rememberLazyListState()