The same pass the server had, on the Kotlin side: comments restating what the code says are gone, and the ones recording a measurement, a constraint or an incident are kept but cut to a few lines each. 6540 comment lines to 5674, and 920 lines off the app. Two doc comments had drifted onto the item above the one they describe -- `contextAfter`'s onto `sessionWorking` in Events.kt, and `UsageMonitor`'s equivalent on the server was fixed in the previous commit. Each is back on its own item, which is the only non-comment line this diff moves. The comments are reflowed to the column limit at their own indentation: several were written wide, and ktfmt re-wrapped them into lines holding a single orphan word. `/tmp` script, not kept -- ktfmt is idempotent over the result, which is the check. Left alone deliberately: this codebase's remaining comment density is high because the comments carry things the code cannot say -- what a null means, what a number was measured against, which bug a guard exists for. Of the 238 one-line doc comments in the app, five were pure restatement of the name and were removed; the rest each say something the signature does not. ktfmtFormat, compileDebugKotlin, lintDebug and testDebugUnitTest pass; cargo test (127), clippy --all-targets and fmt still clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
52 lines
1.9 KiB
Kotlin
52 lines
1.9 KiB
Kotlin
package com.example.aiapp
|
|
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
import androidx.compose.material3.ButtonDefaults
|
|
import androidx.compose.material3.OutlinedButton
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.graphics.Shape
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
// The composer's row of settings and pickers, and the menus they open. One file because the outline
|
|
// and the corner are one appearance: a control shaped like this opens a surface shaped like this.
|
|
|
|
/**
|
|
* A bordered pill: a control that can be seen without being pressed.
|
|
*
|
|
* The composer's row -- attach, model, permission mode -- was text buttons, which draw nothing at
|
|
* all until they are touched. Three bare words under the message field read as a caption about the
|
|
* field rather than as three things to press. The outline says "control" without the weight of a
|
|
* filled button, which is reserved for the two that act on the session.
|
|
*/
|
|
@Composable
|
|
fun BubbleButton(
|
|
onClick: () -> Unit,
|
|
modifier: Modifier = Modifier,
|
|
enabled: Boolean = true,
|
|
content: @Composable () -> Unit,
|
|
) {
|
|
OutlinedButton(
|
|
onClick = onClick,
|
|
enabled = enabled,
|
|
shape = BubbleShape,
|
|
// A text button's padding rather than a filled button's 24dp: these sit three across under
|
|
// the message field, and the wider padding is what decides whether the row fits.
|
|
contentPadding = ButtonDefaults.TextButtonContentPadding,
|
|
modifier = modifier,
|
|
) {
|
|
content()
|
|
}
|
|
}
|
|
|
|
/** Fully round ends, so the control reads as a bubble rather than as a box. */
|
|
val BubbleShape: Shape = RoundedCornerShape(percent = 50)
|
|
|
|
/**
|
|
* The corner on a menu one of these opens.
|
|
*
|
|
* A radius rather than [BubbleShape]'s half-height: a menu is as tall as its options, and rounding
|
|
* ends that tall would bow its sides.
|
|
*/
|
|
val BubbleMenuShape: Shape = RoundedCornerShape(20.dp)
|