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)
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
package com.aerotoss.model
|
||||
|
||||
enum class TransferState {
|
||||
PENDING,
|
||||
TRANSFERRING,
|
||||
COMPLETED,
|
||||
FAILED,
|
||||
CANCELLED
|
||||
}
|
||||
|
||||
data class TransferProgress(
|
||||
val id: String,
|
||||
val request: TransferRequest,
|
||||
val bytesTransferred: Long,
|
||||
val totalBytes: Long,
|
||||
val state: TransferState,
|
||||
val startTimeMs: Long = System.currentTimeMillis(),
|
||||
val error: String? = null
|
||||
) {
|
||||
val progress: Float
|
||||
get() = if (totalBytes > 0) bytesTransferred.toFloat() / totalBytes else 0f
|
||||
|
||||
val isComplete: Boolean
|
||||
get() = state == TransferState.COMPLETED
|
||||
|
||||
val speed: Long
|
||||
get() {
|
||||
if (state != TransferState.TRANSFERRING || bytesTransferred == 0L) return 0L
|
||||
val elapsed = (System.currentTimeMillis() - startTimeMs).coerceAtLeast(1)
|
||||
return bytesTransferred * 1000 / elapsed
|
||||
}
|
||||
|
||||
val elapsedMs: Long
|
||||
get() = System.currentTimeMillis() - startTimeMs
|
||||
}
|
||||
Reference in New Issue
Block a user