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.
This commit is contained in:
mckero committed 2026-08-04 05:36:48 +00:00
1 parent 544515feba
commit 3c5486cc5c
3 files changed
+57 -58

No files matched your search

@@ -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
+45 -56
View File
@@ -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;
}
}
}
@@ -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()