Новый юзкейс удаления хранилищ

This commit is contained in:
2026-04-17 22:28:22 +03:00
parent 51436401da
commit 3455b91bca
7 changed files with 72 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageStoragesEncryptionUseCase import com.github.nullptroma.wallenc.domain.usecases.ManageStoragesEncryptionUseCase
import com.github.nullptroma.wallenc.domain.usecases.RemoveStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase
import dagger.Module import dagger.Module
@@ -45,4 +46,13 @@ class UseCasesModule {
fun provideManageStoragesEncryptionUseCase(unlockManager: IUnlockManager): ManageStoragesEncryptionUseCase { fun provideManageStoragesEncryptionUseCase(unlockManager: IUnlockManager): ManageStoragesEncryptionUseCase {
return ManageStoragesEncryptionUseCase(unlockManager) return ManageStoragesEncryptionUseCase(unlockManager)
} }
@Provides
@Singleton
fun provideRemoveStorageUseCase(
vaultsManager: IVaultsManager,
unlockManager: IUnlockManager,
): RemoveStorageUseCase {
return RemoveStorageUseCase(vaultsManager, unlockManager)
}
} }

View File

@@ -89,7 +89,7 @@ class LocalVault(private val ioDispatcher: CoroutineDispatcher, context: Context
throw Exception("Not available") throw Exception("Not available")
val curStorages = _storages.value.toMutableList() val curStorages = _storages.value.toMutableList()
val index = curStorages.indexOf(storage) val index = curStorages.indexOfFirst { it.uuid == storage.uuid }
if(index != -1) { if(index != -1) {
val localStorage = curStorages[index] val localStorage = curStorages[index]
curStorages.removeAt(index) curStorages.removeAt(index)

View File

@@ -0,0 +1,15 @@
package com.github.nullptroma.wallenc.domain.enums
/**
* Политика удаления/закрытия хранилища.
*
* [CLOSE_ENCRYPTED_OVERLAYS_ONLY] — только закрыть расшифрованные представления (overlay),
* физические данные не трогаем.
*
* [REMOVE_PHYSICAL] — удалить физическое хранилище у провайдера (сейчас local vault),
* предварительно закрыв все overlay.
*/
enum class StorageDeletionPolicy {
CLOSE_ENCRYPTED_OVERLAYS_ONLY,
REMOVE_PHYSICAL,
}

View File

@@ -3,7 +3,6 @@ package com.github.nullptroma.wallenc.domain.usecases
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import java.util.UUID import java.util.UUID
class GetOpenedStoragesUseCase(private val unlockManager: IUnlockManager) { class GetOpenedStoragesUseCase(private val unlockManager: IUnlockManager) {

View File

@@ -1,6 +1,5 @@
package com.github.nullptroma.wallenc.domain.usecases package com.github.nullptroma.wallenc.domain.usecases
import com.github.nullptroma.wallenc.domain.interfaces.IStorage
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
@@ -12,10 +11,4 @@ class ManageLocalVaultUseCase(private val manager: IVaultsManager) {
suspend fun createStorage() { suspend fun createStorage() {
manager.localVault.createStorage() manager.localVault.createStorage()
} }
suspend fun remove(storage: IStorageInfo) {
when(storage) {
is IStorage -> manager.localVault.remove(storage)
}
}
} }

View File

@@ -1,12 +1,45 @@
package com.github.nullptroma.wallenc.domain.usecases package com.github.nullptroma.wallenc.domain.usecases
import com.github.nullptroma.wallenc.domain.enums.StorageDeletionPolicy
import com.github.nullptroma.wallenc.domain.interfaces.IStorage import com.github.nullptroma.wallenc.domain.interfaces.IStorage
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
import java.util.UUID
class RemoveStorageUseCase { class RemoveStorageUseCase(
suspend fun rename(storage: IStorageInfo, newName: String) { private val vaultsManager: IVaultsManager,
when (storage) { private val unlockManager: IUnlockManager,
is IStorage -> storage.rename(newName) ) {
suspend fun remove(storage: IStorageInfo, policy: StorageDeletionPolicy) {
if (storage !is IStorage) return
when (policy) {
StorageDeletionPolicy.CLOSE_ENCRYPTED_OVERLAYS_ONLY -> {
unlockManager.close(storage)
}
StorageDeletionPolicy.REMOVE_PHYSICAL -> {
val physical = findPhysicalRootStorage(storage) ?: return
unlockManager.close(physical.uuid)
vaultsManager.localVault.remove(physical)
}
} }
} }
}
/**
* Поднимается по цепочке overlay (sourceUuid -> decrypted view), пока не дойдёт
* до корневого физического storage из [IVaultsManager.localVault].
*/
private fun findPhysicalRootStorage(storage: IStorage): IStorage? {
val locals = vaultsManager.localVault.storages.value ?: return null
val opened = unlockManager.openedStorages.value
var id: UUID = storage.uuid
while (true) {
val parent = opened.entries.firstOrNull { it.value.uuid == id }?.key ?: break
id = parent
}
return locals.firstOrNull { it.uuid == id }
}
}

View File

@@ -7,9 +7,11 @@ import com.github.nullptroma.wallenc.domain.interfaces.IDirectory
import com.github.nullptroma.wallenc.domain.interfaces.IFile import com.github.nullptroma.wallenc.domain.interfaces.IFile
import com.github.nullptroma.wallenc.domain.interfaces.ILogger import com.github.nullptroma.wallenc.domain.interfaces.ILogger
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
import com.github.nullptroma.wallenc.domain.enums.StorageDeletionPolicy
import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase
import com.github.nullptroma.wallenc.domain.usecases.ManageStoragesEncryptionUseCase import com.github.nullptroma.wallenc.domain.usecases.ManageStoragesEncryptionUseCase
import com.github.nullptroma.wallenc.domain.usecases.RemoveStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase
import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase
import com.github.nullptroma.wallenc.presentation.ViewModelBase import com.github.nullptroma.wallenc.presentation.ViewModelBase
@@ -24,6 +26,7 @@ import kotlin.system.measureTimeMillis
@HiltViewModel @HiltViewModel
class LocalVaultViewModel @Inject constructor( class LocalVaultViewModel @Inject constructor(
private val manageLocalVaultUseCase: ManageLocalVaultUseCase, private val manageLocalVaultUseCase: ManageLocalVaultUseCase,
private val removeStorageUseCase: RemoveStorageUseCase,
private val getOpenedStoragesUseCase: GetOpenedStoragesUseCase, private val getOpenedStoragesUseCase: GetOpenedStoragesUseCase,
private val storageFileManagementUseCase: StorageFileManagementUseCase, private val storageFileManagementUseCase: StorageFileManagementUseCase,
private val manageStoragesEncryptionUseCase: ManageStoragesEncryptionUseCase, private val manageStoragesEncryptionUseCase: ManageStoragesEncryptionUseCase,
@@ -136,9 +139,12 @@ class LocalVaultViewModel @Inject constructor(
} }
} }
fun remove(storage: IStorageInfo) { fun remove(
storage: IStorageInfo,
policy: StorageDeletionPolicy = StorageDeletionPolicy.REMOVE_PHYSICAL,
) {
viewModelScope.launch { viewModelScope.launch {
manageLocalVaultUseCase.remove(storage) removeStorageUseCase.remove(storage, policy)
} }
} }
} }