Ship 15-task plan via kmp-manager group-by-group flow. Library moves
from "prototype" to "senior-engineer-built KMP library" per 3-reviewer
audit (android-reviewer + mobile-performance-reviewer + mobile-architect).
Critical fixes:
- LICENSE MIT (T1) — legal blocker resolved
- explicitApi() Strict + BCV 0.16.3 + klib enabled (T2) — ABI locked
baseline: chart-realtime.api 161 LOC + chart-realtime.klib.api 211 LOC
- Internal lockdown: CircularBuffer, TieredBuffer, LodDecimator,
dataVersion, rememberFrameTick (T3)
- kotlinx-datetime 0.6.2 replaces expect/actual currentTimeMs (T4)
Platform.kt + .android.kt + .ios.kt deleted
- CircularBuffer.writeIndex Int -> Long (T5) — fix 124d overflow @ 200Hz
- Remove !! and @Suppress("UNUSED_EXPRESSION") from commonMain (T6)
- Remove dead config: maxBufferSeconds, xLabelDecimals,
SignalConfig.label (T7)
Correctness:
- POSITIVE_INFINITY/Float.MAX_VALUE sentinels -> hasData flag (T8)
- Snapshot.withMutableSnapshot + SnapshotApplyConflictException retry
in push/addSignal/removeSignal (T9)
- dataVersion mutableLongStateOf — Compose-observable, idle = 0
recompositions (T10) — RenderLoop.kt deleted, targetFps @Deprecated
- Single buffer.snapshot() per signal per frame via SignalEntry
per-signal scratch arrays (T11) — render-time snapshot cost halved
- M4 binning Tier1/Tier2: firstTs/V + minTs/V + maxTs/V + lastTs/V
with chronological dedup (T12) — no C7 vertical spike artifacts.
TIER1/TIER2 CAPACITY x2 -> x4 (TOTAL 77.4k -> 94.8k)
- NaN/Inf/backward-timestamp guards on push (T13) — silent drop,
per-signal lastPushedTs tracking, KDoc contract
Test gap fill:
- NumberFormat extracted from AxisRenderer to internal object (T14)
+38 tests pinning rounding/scientific/time-format behavior
- TieredBufferTest +15 tests: tier roll, window-crossing, clear,
edge cases (T15)
- LodDecimatorTest +10 LTTB-specific branch coverage tests (T15)
Test count: 33 -> 107 (+74).
ABI: 211/272 -> 161/211 LOC (locked, baseline committed).
Deferred to v0.5.0:
- Bump kotlinx-datetime 0.6.2 -> 0.7.x (needs Kotlin 2.1.20+)
- Remove ChartConfig.targetFps (currently @Deprecated, ignored)
- NumberFormat Long overflow @ 1e19 (safe via current routing)
- LTTB upper-bound inclusive vs snapshot half-open semantic mismatch
- Macrobench setup for -30% frame-time verification
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
161 lines
8.6 KiB
Text
161 lines
8.6 KiB
Text
public final class dev/dtrentin/chart/RealtimeChartKt {
|
|
public static final fun RealtimeChart (Ldev/dtrentin/chart/RealtimeChartState;Landroidx/compose/ui/Modifier;FLdev/dtrentin/chart/model/ChartTheme;Landroidx/compose/runtime/Composer;II)V
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/RealtimeChartState {
|
|
public static final field $stable I
|
|
public fun <init> ()V
|
|
public fun <init> (Ldev/dtrentin/chart/model/ChartConfig;)V
|
|
public synthetic fun <init> (Ldev/dtrentin/chart/model/ChartConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public final fun addSignal (Ljava/lang/String;Ldev/dtrentin/chart/model/SignalConfig;)V
|
|
public final fun collectFromFloat (Ljava/lang/String;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job;
|
|
public final fun collectFromTimestamped (Ljava/lang/String;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job;
|
|
public final fun getConfig ()Ldev/dtrentin/chart/model/ChartConfig;
|
|
public final fun push (Ljava/lang/String;JF)V
|
|
public final fun removeSignal (Ljava/lang/String;)V
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/AxisLabelMode : java/lang/Enum {
|
|
public static final field BESIDE Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public static final field HIDDEN Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public static final field INSIDE Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public static fun getEntries ()Lkotlin/enums/EnumEntries;
|
|
public static fun valueOf (Ljava/lang/String;)Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public static fun values ()[Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/ChartConfig {
|
|
public static final field $stable I
|
|
public fun <init> ()V
|
|
public fun <init> (FLdev/dtrentin/chart/model/YRange;Ldev/dtrentin/chart/model/T0;Ljava/lang/Integer;Ldev/dtrentin/chart/model/ChartTheme;ZLdev/dtrentin/chart/model/AxisLabelMode;Ldev/dtrentin/chart/model/AxisLabelMode;ILdev/dtrentin/chart/model/LodMode;)V
|
|
public synthetic fun <init> (FLdev/dtrentin/chart/model/YRange;Ldev/dtrentin/chart/model/T0;Ljava/lang/Integer;Ldev/dtrentin/chart/model/ChartTheme;ZLdev/dtrentin/chart/model/AxisLabelMode;Ldev/dtrentin/chart/model/AxisLabelMode;ILdev/dtrentin/chart/model/LodMode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public final fun component1 ()F
|
|
public final fun component10 ()Ldev/dtrentin/chart/model/LodMode;
|
|
public final fun component2 ()Ldev/dtrentin/chart/model/YRange;
|
|
public final fun component3 ()Ldev/dtrentin/chart/model/T0;
|
|
public final fun component4 ()Ljava/lang/Integer;
|
|
public final fun component5 ()Ldev/dtrentin/chart/model/ChartTheme;
|
|
public final fun component6 ()Z
|
|
public final fun component7 ()Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public final fun component8 ()Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public final fun component9 ()I
|
|
public final fun copy (FLdev/dtrentin/chart/model/YRange;Ldev/dtrentin/chart/model/T0;Ljava/lang/Integer;Ldev/dtrentin/chart/model/ChartTheme;ZLdev/dtrentin/chart/model/AxisLabelMode;Ldev/dtrentin/chart/model/AxisLabelMode;ILdev/dtrentin/chart/model/LodMode;)Ldev/dtrentin/chart/model/ChartConfig;
|
|
public static synthetic fun copy$default (Ldev/dtrentin/chart/model/ChartConfig;FLdev/dtrentin/chart/model/YRange;Ldev/dtrentin/chart/model/T0;Ljava/lang/Integer;Ldev/dtrentin/chart/model/ChartTheme;ZLdev/dtrentin/chart/model/AxisLabelMode;Ldev/dtrentin/chart/model/AxisLabelMode;ILdev/dtrentin/chart/model/LodMode;ILjava/lang/Object;)Ldev/dtrentin/chart/model/ChartConfig;
|
|
public fun equals (Ljava/lang/Object;)Z
|
|
public final fun getLodMode ()Ldev/dtrentin/chart/model/LodMode;
|
|
public final fun getShowGrid ()Z
|
|
public final fun getT0 ()Ldev/dtrentin/chart/model/T0;
|
|
public final fun getTargetFps ()Ljava/lang/Integer;
|
|
public final fun getTheme ()Ldev/dtrentin/chart/model/ChartTheme;
|
|
public final fun getXLabelMode ()Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public final fun getXWindowSeconds ()F
|
|
public final fun getYLabelDecimals ()I
|
|
public final fun getYLabelMode ()Ldev/dtrentin/chart/model/AxisLabelMode;
|
|
public final fun getYRange ()Ldev/dtrentin/chart/model/YRange;
|
|
public fun hashCode ()I
|
|
public fun toString ()Ljava/lang/String;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/ChartTheme {
|
|
public static final field $stable I
|
|
public synthetic fun <init> (JJJJFILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public synthetic fun <init> (JJJJFLkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public final fun component1-0d7_KjU ()J
|
|
public final fun component2-0d7_KjU ()J
|
|
public final fun component3-0d7_KjU ()J
|
|
public final fun component4-0d7_KjU ()J
|
|
public final fun component5 ()F
|
|
public final fun copy-gPfMexM (JJJJF)Ldev/dtrentin/chart/model/ChartTheme;
|
|
public static synthetic fun copy-gPfMexM$default (Ldev/dtrentin/chart/model/ChartTheme;JJJJFILjava/lang/Object;)Ldev/dtrentin/chart/model/ChartTheme;
|
|
public fun equals (Ljava/lang/Object;)Z
|
|
public final fun getAxisColor-0d7_KjU ()J
|
|
public final fun getBackgroundColor-0d7_KjU ()J
|
|
public final fun getGridColor-0d7_KjU ()J
|
|
public final fun getLabelColor-0d7_KjU ()J
|
|
public final fun getStrokeWidth ()F
|
|
public fun hashCode ()I
|
|
public fun toString ()Ljava/lang/String;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/ChartThemeKt {
|
|
public static final fun rememberMaterialChartTheme (Landroidx/compose/runtime/Composer;I)Ldev/dtrentin/chart/model/ChartTheme;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/LodMode : java/lang/Enum {
|
|
public static final field LTTB Ldev/dtrentin/chart/model/LodMode;
|
|
public static final field MIN_MAX Ldev/dtrentin/chart/model/LodMode;
|
|
public static fun getEntries ()Lkotlin/enums/EnumEntries;
|
|
public static fun valueOf (Ljava/lang/String;)Ldev/dtrentin/chart/model/LodMode;
|
|
public static fun values ()[Ldev/dtrentin/chart/model/LodMode;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/SignalConfig {
|
|
public static final field $stable I
|
|
public synthetic fun <init> (JFZILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public synthetic fun <init> (JFZLkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public final fun component1-0d7_KjU ()J
|
|
public final fun component2 ()F
|
|
public final fun component3 ()Z
|
|
public final fun copy-ek8zF_U (JFZ)Ldev/dtrentin/chart/model/SignalConfig;
|
|
public static synthetic fun copy-ek8zF_U$default (Ldev/dtrentin/chart/model/SignalConfig;JFZILjava/lang/Object;)Ldev/dtrentin/chart/model/SignalConfig;
|
|
public fun equals (Ljava/lang/Object;)Z
|
|
public final fun getColor-0d7_KjU ()J
|
|
public final fun getStrokeWidth ()F
|
|
public final fun getVisible ()Z
|
|
public fun hashCode ()I
|
|
public fun toString ()Ljava/lang/String;
|
|
}
|
|
|
|
public abstract class dev/dtrentin/chart/model/T0 {
|
|
public static final field $stable I
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/T0$FirstSample : dev/dtrentin/chart/model/T0 {
|
|
public static final field $stable I
|
|
public static final field INSTANCE Ldev/dtrentin/chart/model/T0$FirstSample;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/T0$Fixed : dev/dtrentin/chart/model/T0 {
|
|
public static final field $stable I
|
|
public fun <init> (J)V
|
|
public final fun component1 ()J
|
|
public final fun copy (J)Ldev/dtrentin/chart/model/T0$Fixed;
|
|
public static synthetic fun copy$default (Ldev/dtrentin/chart/model/T0$Fixed;JILjava/lang/Object;)Ldev/dtrentin/chart/model/T0$Fixed;
|
|
public fun equals (Ljava/lang/Object;)Z
|
|
public final fun getEpochMs ()J
|
|
public fun hashCode ()I
|
|
public fun toString ()Ljava/lang/String;
|
|
}
|
|
|
|
public abstract class dev/dtrentin/chart/model/YRange {
|
|
public static final field $stable I
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/YRange$Auto : dev/dtrentin/chart/model/YRange {
|
|
public static final field $stable I
|
|
public fun <init> ()V
|
|
public fun <init> (F)V
|
|
public synthetic fun <init> (FILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
public final fun component1 ()F
|
|
public final fun copy (F)Ldev/dtrentin/chart/model/YRange$Auto;
|
|
public static synthetic fun copy$default (Ldev/dtrentin/chart/model/YRange$Auto;FILjava/lang/Object;)Ldev/dtrentin/chart/model/YRange$Auto;
|
|
public fun equals (Ljava/lang/Object;)Z
|
|
public final fun getPaddingFraction ()F
|
|
public fun hashCode ()I
|
|
public fun toString ()Ljava/lang/String;
|
|
}
|
|
|
|
public final class dev/dtrentin/chart/model/YRange$Fixed : dev/dtrentin/chart/model/YRange {
|
|
public static final field $stable I
|
|
public fun <init> (FF)V
|
|
public final fun component1 ()F
|
|
public final fun component2 ()F
|
|
public final fun copy (FF)Ldev/dtrentin/chart/model/YRange$Fixed;
|
|
public static synthetic fun copy$default (Ldev/dtrentin/chart/model/YRange$Fixed;FFILjava/lang/Object;)Ldev/dtrentin/chart/model/YRange$Fixed;
|
|
public fun equals (Ljava/lang/Object;)Z
|
|
public final fun getMax ()F
|
|
public final fun getMin ()F
|
|
public fun hashCode ()I
|
|
public fun toString ()Ljava/lang/String;
|
|
}
|
|
|