diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt index 332f5a2b..f15df12b 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt @@ -5,6 +5,7 @@ import android.content.pm.PackageManager import android.graphics.Bitmap import android.media.MediaExtractor import android.media.MediaFormat +import android.text.format.Formatter import android.util.Size import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult @@ -467,9 +468,12 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - } Column(Modifier.fillMaxWidth().background(MaterialTheme.colorScheme.surface).padding(horizontal = 16.dp, vertical = 12.dp), horizontalAlignment = Alignment.CenterHorizontally) { - val info = if (mode == CaptureMode.VIDEO) - "${elapsed / 60_000}:${(elapsed / 1000 % 60).toString().padStart(2, '0')}\n${quality.label}" - else if (photoSize.first > 0) "${photoSize.first}×${photoSize.second}" else "" + val photoBytes = remember(mode, phase, output) { + if (mode == CaptureMode.PHOTO && phase == CapturePhase.CAPTURED) output?.length() ?: 0L else 0L + } + val info = if (mode == CaptureMode.VIDEO) quality.label + else if (phase == CapturePhase.CAPTURED && photoSize.first > 0) + "${photoSize.first}×${photoSize.second}\n${Formatter.formatShortFileSize(context, photoBytes)}" else "" BoxWithConstraints(Modifier.fillMaxWidth().heightIn(min = 76.dp)) { val captureEnabled = camera != null && (idle || phase == CapturePhase.RECORDING || phase == CapturePhase.PAUSED) val showDiscard = output != null && phase != CapturePhase.SENDING @@ -479,9 +483,9 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - val shutterWidth = if (captureEnabled) shutterSize else shutterSize / 2 val controlsWidth = 48.dp * 2 + 24.dp * 2 + shutterWidth val infoWidth = ((maxWidth - controlsWidth) / 2 - 8.dp).coerceIn(0.dp, 80.dp) - LaunchedEffect(phase, captureEnabled, showDiscard, showSend, infoWidth) { + LaunchedEffect(phase, captureEnabled, showDiscard, showSend, photoBytes, infoWidth) { LogManager.addLog("DEBUG", "Capture", "Controls phase=$phase panel=$maxWidth shutterVisible=$captureEnabled " + - "discardVisible=$showDiscard sendVisible=$showSend centerSlot=$shutterWidth infoMaxWidth=$infoWidth") + "discardVisible=$showDiscard sendVisible=$showSend centerSlot=$shutterWidth jpegBytes=$photoBytes infoMaxWidth=$infoWidth") } Row(Modifier.align(Alignment.Center).heightIn(min = shutterSize), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(24.dp)) { @@ -508,9 +512,15 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - Icon(Icons.AutoMirrored.Filled.Send, stringResource(R.string.send), tint = MaterialTheme.colorScheme.onSurface) } else Spacer(Modifier.width(48.dp)) } - if (info.isNotEmpty()) Text(info, color = MaterialTheme.colorScheme.onSurfaceVariant, - fontSize = 11.sp, lineHeight = 13.sp, maxLines = 2, textAlign = TextAlign.End, - modifier = Modifier.align(Alignment.CenterEnd).widthIn(max = infoWidth)) + if (info.isNotEmpty()) Column(Modifier.align(Alignment.CenterEnd).widthIn(max = infoWidth), + horizontalAlignment = Alignment.End) { + if (mode == CaptureMode.VIDEO) Text( + "${elapsed / 60_000}:${(elapsed / 1000 % 60).toString().padStart(2, '0')}", + color = MaterialTheme.colorScheme.onSurfaceVariant, fontSize = 11.sp, lineHeight = 13.sp, + maxLines = 1, textAlign = TextAlign.End) + Text(info, color = MaterialTheme.colorScheme.onSurfaceVariant, + fontSize = 13.sp, lineHeight = 15.sp, maxLines = 2, textAlign = TextAlign.End) + } } if (phase == CapturePhase.CAPTURING || phase == CapturePhase.FINALIZING) CircularProgressIndicator(Modifier.size(24.dp)) }