Новый юзкейс удаления хранилищ
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.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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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.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) {
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user