Новый юзкейс удаления хранилищ
This commit is contained in:
@@ -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.ManageLocalVaultUseCase
|
||||
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.StorageFileManagementUseCase
|
||||
import dagger.Module
|
||||
@@ -45,4 +46,13 @@ class UseCasesModule {
|
||||
fun provideManageStoragesEncryptionUseCase(unlockManager: IUnlockManager): ManageStoragesEncryptionUseCase {
|
||||
return ManageStoragesEncryptionUseCase(unlockManager)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideRemoveStorageUseCase(
|
||||
vaultsManager: IVaultsManager,
|
||||
unlockManager: IUnlockManager,
|
||||
): RemoveStorageUseCase {
|
||||
return RemoveStorageUseCase(vaultsManager, unlockManager)
|
||||
}
|
||||
}
|
||||
@@ -89,7 +89,7 @@ class LocalVault(private val ioDispatcher: CoroutineDispatcher, context: Context
|
||||
throw Exception("Not available")
|
||||
|
||||
val curStorages = _storages.value.toMutableList()
|
||||
val index = curStorages.indexOf(storage)
|
||||
val index = curStorages.indexOfFirst { it.uuid == storage.uuid }
|
||||
if(index != -1) {
|
||||
val localStorage = curStorages[index]
|
||||
curStorages.removeAt(index)
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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.IUnlockManager
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import java.util.UUID
|
||||
|
||||
class GetOpenedStoragesUseCase(private val unlockManager: IUnlockManager) {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
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.IVaultsManager
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
@@ -12,10 +11,4 @@ class ManageLocalVaultUseCase(private val manager: IVaultsManager) {
|
||||
suspend fun createStorage() {
|
||||
manager.localVault.createStorage()
|
||||
}
|
||||
|
||||
suspend fun remove(storage: IStorageInfo) {
|
||||
when(storage) {
|
||||
is IStorage -> manager.localVault.remove(storage)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,45 @@
|
||||
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.IStorageInfo
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
|
||||
import java.util.UUID
|
||||
|
||||
class RemoveStorageUseCase {
|
||||
suspend fun rename(storage: IStorageInfo, newName: String) {
|
||||
when (storage) {
|
||||
is IStorage -> storage.rename(newName)
|
||||
class RemoveStorageUseCase(
|
||||
private val vaultsManager: IVaultsManager,
|
||||
private val unlockManager: IUnlockManager,
|
||||
) {
|
||||
|
||||
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 }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.ILogger
|
||||
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.ManageLocalVaultUseCase
|
||||
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.StorageFileManagementUseCase
|
||||
import com.github.nullptroma.wallenc.presentation.ViewModelBase
|
||||
@@ -24,6 +26,7 @@ import kotlin.system.measureTimeMillis
|
||||
@HiltViewModel
|
||||
class LocalVaultViewModel @Inject constructor(
|
||||
private val manageLocalVaultUseCase: ManageLocalVaultUseCase,
|
||||
private val removeStorageUseCase: RemoveStorageUseCase,
|
||||
private val getOpenedStoragesUseCase: GetOpenedStoragesUseCase,
|
||||
private val storageFileManagementUseCase: StorageFileManagementUseCase,
|
||||
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 {
|
||||
manageLocalVaultUseCase.remove(storage)
|
||||
removeStorageUseCase.remove(storage, policy)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user