Опциональное шифрование имён файлов

This commit is contained in:
Пытков Роман
2025-02-08 20:51:28 +03:00
parent da8808a4b9
commit 86b5c6cae2
15 changed files with 278 additions and 95 deletions

View File

@@ -19,6 +19,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.DropdownMenu
@@ -57,6 +58,7 @@ fun StorageTree(
onClick: (Tree<IStorageInfo>) -> Unit,
onRename: (Tree<IStorageInfo>, String) -> Unit,
onRemove: (Tree<IStorageInfo>) -> Unit,
onEncrypt: (Tree<IStorageInfo>) -> Unit,
) {
val cur = tree.value
val available by cur.isAvailable.collectAsStateWithLifecycle()
@@ -66,7 +68,9 @@ fun StorageTree(
val borderColor =
if (cur.isVirtualStorage) MaterialTheme.colorScheme.secondary else MaterialTheme.colorScheme.primary
Column(modifier) {
Box(modifier = Modifier.height(IntrinsicSize.Min).zIndex(100f)) {
Box(modifier = Modifier
.height(IntrinsicSize.Min)
.zIndex(100f)) {
val interactionSource = remember { MutableInteractionSource() }
Box(
modifier = Modifier
@@ -171,6 +175,9 @@ fun StorageTree(
}
}
Spacer(modifier = Modifier.weight(1f))
Button(onClick = { onEncrypt(tree) }, enabled = metaInfo.encInfo == null) {
Text("Encrypt")
}
Text(
modifier = Modifier
.fillMaxWidth()
@@ -190,7 +197,16 @@ fun StorageTree(
}
}
for (i in tree.children ?: listOf()) {
StorageTree(Modifier.padding(16.dp, 0.dp, 0.dp, 0.dp).offset(y = (-4).dp), i, onClick, onRename, onRemove)
StorageTree(
Modifier
.padding(16.dp, 0.dp, 0.dp, 0.dp)
.offset(y = (-4).dp),
i,
onClick,
onRename,
onRemove,
onEncrypt
)
}
}
}

View File

@@ -51,6 +51,9 @@ fun LocalVaultScreen(
},
onRemove = { tree ->
viewModel.remove(tree.value)
},
onEncrypt = { tree ->
viewModel.enableEncryptionAndOpenStorage(tree.value)
}
)
}

View File

@@ -9,10 +9,11 @@ import com.github.nullptroma.wallenc.domain.interfaces.ILogger
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageStoragesEncryptionUseCase
import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase
import com.github.nullptroma.wallenc.presentation.extensions.toPrintable
import com.github.nullptroma.wallenc.presentation.ViewModelBase
import com.github.nullptroma.wallenc.presentation.extensions.toPrintable
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
@@ -25,6 +26,7 @@ class LocalVaultViewModel @Inject constructor(
private val manageLocalVaultUseCase: ManageLocalVaultUseCase,
private val getOpenedStoragesUseCase: GetOpenedStoragesUseCase,
private val storageFileManagementUseCase: StorageFileManagementUseCase,
private val manageStoragesEncryptionUseCase: ManageStoragesEncryptionUseCase,
private val renameStorageUseCase: RenameStorageUseCase,
private val logger: ILogger
) : ViewModelBase<LocalVaultScreenState>(LocalVaultScreenState(listOf())) {
@@ -50,6 +52,11 @@ class LocalVaultViewModel @Inject constructor(
updateState(newState)
}
}
viewModelScope.launch {
getOpenedStoragesUseCase.openedStorages.collectLatest {
logger.debug("ViewModel", "Collected opened: ${it?.size}")
}
}
}
fun printStorageInfoToLog(storage: IStorageInfo) {
@@ -74,7 +81,24 @@ class LocalVaultViewModel @Inject constructor(
fun createStorage() {
viewModelScope.launch {
manageLocalVaultUseCase.createStorage(EncryptKey("Hello"))
manageLocalVaultUseCase.createStorage()
}
}
private val runningStorages = mutableSetOf<IStorageInfo>()
fun enableEncryptionAndOpenStorage(storage: IStorageInfo) {
if(runningStorages.contains(storage))
return
runningStorages.add(storage)
val key = EncryptKey("Hello")
viewModelScope.launch {
try {
manageStoragesEncryptionUseCase.enableEncryption(storage, key, false)
manageStoragesEncryptionUseCase.openStorage(storage, key)
}
finally {
runningStorages.remove(storage)
}
}
}