Files
AeroToss/app/src/commonMain/kotlin/com/aerotoss/ui/screens/ReceiveScreen.kt
T
grendervill afc526d6e8 AeroToss v0.4.0: полная реализация M1-M4
- KMP проект: Kotlin 2.3.21, Compose 1.11.1, Gradle 8.13, AGP 8.13.2
- Обнаружение устройств: mDNS (JMDNS/Android NSD) + Wi-Fi Direct P2P
- Передача файлов: Java Socket, стриминг чанками, SHA-256 checksum
- UI: HomeScreen, SendScreen, ReceiveScreen, навигация
- Защита: санитизация имён файлов (path traversal)
- 65+ тестов (WireProtocol, Transfer, FileUtils, Wi-Fi Direct)
2026-08-19 17:19:47 +03:00

90 lines
3.3 KiB
Kotlin

package com.aerotoss.ui.screens
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.aerotoss.core.AeroTossManager
import com.aerotoss.model.TransferState
import com.aerotoss.ui.components.TransferProgressBar
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ReceiveScreen(
manager: AeroTossManager,
onBack: () -> Unit
) {
val incomingTransfer by manager.incomingTransfers.collectAsState(initial = null)
Scaffold(
topBar = {
TopAppBar(
title = { Text("Получение файла") },
navigationIcon = {
IconButton(onClick = onBack) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Назад")
}
}
)
}
) { padding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(padding)
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
if (incomingTransfer == null) {
Text(
"Ожидание входящих файлов...",
style = MaterialTheme.typography.bodyLarge
)
Spacer(modifier = Modifier.height(16.dp))
CircularProgressIndicator()
Spacer(modifier = Modifier.height(8.dp))
Text(
"Убедитесь, что другое устройство\nотправляет файл на это устройство",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
} else {
val transfer = incomingTransfer!!
TransferProgressBar(transfer)
Spacer(modifier = Modifier.height(16.dp))
when (transfer.state) {
TransferState.COMPLETED -> {
Text(
"Файл получен!",
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.primary
)
}
TransferState.FAILED -> {
Text(
"Ошибка: ${transfer.error}",
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.error
)
}
TransferState.CANCELLED -> {
Text(
"Передача отменена",
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
else -> { }
}
}
}
}
}