Skip to content

Commit

Permalink
feat: added deleteFolderIfHasNoFilesInside func, changes logic in Rem…
Browse files Browse the repository at this point in the history
…oveFilesDialogFragment and changed names of us and variables
  • Loading branch information
Aitorbp committed May 14, 2024
1 parent d386c17 commit f3da3cf
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import com.owncloud.android.domain.camerauploads.usecases.SaveVideoUploadsConfig
import com.owncloud.android.domain.capabilities.usecases.GetCapabilitiesAsLiveDataUseCase
import com.owncloud.android.domain.capabilities.usecases.GetStoredCapabilitiesUseCase
import com.owncloud.android.domain.capabilities.usecases.RefreshCapabilitiesFromServerAsyncUseCase
import com.owncloud.android.domain.files.usecases.AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase
import com.owncloud.android.domain.files.usecases.IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase
import com.owncloud.android.domain.files.usecases.CleanConflictUseCase
import com.owncloud.android.domain.files.usecases.CleanWorkersUUIDUseCase
import com.owncloud.android.domain.files.usecases.CopyFileUseCase
Expand Down Expand Up @@ -168,7 +168,7 @@ val useCaseModule = module {
factoryOf(::GetFolderContentAsStreamUseCase)
factoryOf(::GetFolderContentUseCase)
factoryOf(::GetFolderImagesUseCase)
factoryOf(::AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase)
factoryOf(::IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase)
factoryOf(::GetPersonalRootFolderForAccountUseCase)
factoryOf(::GetSearchFolderContentUseCase)
factoryOf(::GetSharedByLinkForAccountAsStreamUseCase)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,7 @@ class MainFileListFragment : Fragment(),
}
}

collectLatestLifecycleFlow(fileOperationsViewModel.checkIfFileLocalSharedFlow) {
collectLatestLifecycleFlow(fileOperationsViewModel.checkIfFileIsLocalAndNotAvailableOfflineSharedFlow) {
val fileActivity = (requireActivity() as FileActivity)
when (it) {
is UIResult.Loading -> fileActivity.showLoadingDialog(R.string.common_loading)
Expand Down Expand Up @@ -996,8 +996,8 @@ class MainFileListFragment : Fragment(),
}
}

private fun onShowRemoveDialog(filesToRemove: List<OCFile>, isLocal: Boolean) {
val dialog = RemoveFilesDialogFragment.newInstance(ArrayList(filesToRemove), isLocal)
private fun onShowRemoveDialog(filesToRemove: List<OCFile>, isAvailableLocallyAndNotAvailableOffline: Boolean) {
val dialog = RemoveFilesDialogFragment.newInstance(ArrayList(filesToRemove), isAvailableLocallyAndNotAvailableOffline)
dialog.show(requireActivity().supportFragmentManager, ConfirmationDialogFragment.FTAG_CONFIRMATION)
fileListAdapter.clearSelection()
updateActionModeAfterTogglingSelected()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import com.owncloud.android.domain.availableoffline.usecases.SetFilesAsAvailable
import com.owncloud.android.domain.availableoffline.usecases.UnsetFilesAsAvailableOfflineUseCase
import com.owncloud.android.domain.exceptions.NoNetworkConnectionException
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.files.usecases.AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase
import com.owncloud.android.domain.files.usecases.IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase
import com.owncloud.android.domain.files.usecases.CopyFileUseCase
import com.owncloud.android.domain.files.usecases.CreateFolderAsyncUseCase
import com.owncloud.android.domain.files.usecases.ManageDeepLinkUseCase
Expand Down Expand Up @@ -72,7 +72,7 @@ class FileOperationsViewModel(
private val unsetFilesAsAvailableOfflineUseCase: UnsetFilesAsAvailableOfflineUseCase,
private val manageDeepLinkUseCase: ManageDeepLinkUseCase,
private val setLastUsageFileUseCase: SetLastUsageFileUseCase,
private val areAnyFileAvailableLocallyAndNotAvailableOfflineUseCase: AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase,
private val isAnyFileAvailableLocallyAndNotAvailableOfflineUseCase: IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase,
private val contextProvider: ContextProvider,
private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider,
) : ViewModel() {
Expand Down Expand Up @@ -107,8 +107,8 @@ class FileOperationsViewModel(
private val _deepLinkFlow = MutableStateFlow<Event<UIResult<OCFile?>>?>(null)
val deepLinkFlow: StateFlow<Event<UIResult<OCFile?>>?> = _deepLinkFlow

private val _checkIfFileLocalSharedFlow = MutableSharedFlow<UIResult<Boolean>>()
val checkIfFileLocalSharedFlow: SharedFlow<UIResult<Boolean>> = _checkIfFileLocalSharedFlow
private val _checkIfFileIsLocalAndNotAvailableOfflineSharedFlow = MutableSharedFlow<UIResult<Boolean>>()
val checkIfFileIsLocalAndNotAvailableOfflineSharedFlow: SharedFlow<UIResult<Boolean>> = _checkIfFileIsLocalAndNotAvailableOfflineSharedFlow

val openDialogs = mutableListOf<FileAlreadyExistsDialog>()

Expand All @@ -135,9 +135,9 @@ class FileOperationsViewModel(
runUseCaseWithResult(
coroutineDispatcher = coroutinesDispatcherProvider.io,
showLoading = true,
sharedFlow = _checkIfFileLocalSharedFlow,
useCase = areAnyFileAvailableLocallyAndNotAvailableOfflineUseCase,
useCaseParams = AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase.Params(filesToRemove),
sharedFlow = _checkIfFileIsLocalAndNotAvailableOfflineSharedFlow,
useCase = isAnyFileAvailableLocallyAndNotAvailableOfflineUseCase,
useCaseParams = IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase.Params(filesToRemove),
requiresConnection = false
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
*
* @author David A. Velasco
* @author Abel García de Prada
* Copyright (C) 2021 ownCloud GmbH.
* @author Aitor Ballesteros Pavón
*
* Copyright (C) 2024 ownCloud GmbH.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
Expand Down Expand Up @@ -77,17 +79,13 @@ class RemoveFilesDialogFragment : ConfirmationDialogFragment(), ConfirmationDial
* @return Dialog ready to show.
*/
@JvmStatic
fun newInstance(files: ArrayList<OCFile>, isAvailableLocally: Boolean): RemoveFilesDialogFragment {
fun newInstance(files: ArrayList<OCFile>, isAvailableLocallyAndNotAvailableOffline: Boolean): RemoveFilesDialogFragment {
val messageStringId: Int
var containsFolder = false
var containsAvailableOffline = false
for (file in files) {
if (file.isFolder) {
containsFolder = true
}
if (file.isAvailableOffline) {
containsAvailableOffline = true
}
}

messageStringId = if (files.size == 1) {
Expand All @@ -106,7 +104,7 @@ class RemoveFilesDialogFragment : ConfirmationDialogFragment(), ConfirmationDial
R.string.confirmation_remove_files_alert
}
}
val localRemoveButton = if (!containsAvailableOffline && isAvailableLocally) {
val localRemoveButton = if (isAvailableLocallyAndNotAvailableOffline) {
R.string.confirmation_remove_local
} else {
-1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -597,12 +597,21 @@ class OCFileRepository(
}
}

// 2. Remove the folder itself
deleteLocalFile(ocFile = ocFile, onlyFromLocalStorage = onlyFromLocalStorage)
// 2. Remove the folder itself if it has files
deleteFolderIfHasNoFilesInside(ocFile = ocFile, onlyFromLocalStorage = onlyFromLocalStorage)
}

private fun deleteFolderIfHasNoFilesInside(ocFile: OCFile, onlyFromLocalStorage: Boolean) {
localStorageProvider.deleteFolderIfHasNoFilesInside(ocFile = ocFile )
deleteFromLocalDatabase(ocFile, onlyFromLocalStorage)
}

private fun deleteLocalFile(ocFile: OCFile, onlyFromLocalStorage: Boolean) {
localStorageProvider.deleteLocalFile(ocFile)
deleteFromLocalDatabase(ocFile, onlyFromLocalStorage)
}

private fun deleteFromLocalDatabase(ocFile: OCFile, onlyFromLocalStorage: Boolean) {
if (onlyFromLocalStorage) {
localFileDataSource.saveFile(ocFile.copy(storagePath = null, etagInConflict = null, lastUsage = null, etag = null))
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
* @author Christian Schabesberger
* @author Shashvat Kedia
* @author Juan Carlos Garrote Gascón
* @author Aitor Ballesteros Pavón
*
* Copyright (C) 2023 ownCloud GmbH.
* Copyright (C) 2024 ownCloud GmbH.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
Expand Down Expand Up @@ -211,6 +212,17 @@ sealed class LocalStorageProvider(private val rootFolderName: String) {
return fileToDelete.deleteRecursively()
}

fun deleteFolderIfHasNoFilesInside(ocFile: OCFile) {
val safeStoragePath = ocFile.getStoragePathOrExpectedPathForFile()
val folder = File(safeStoragePath)

val filesInFolder = folder.listFiles()
if (filesInFolder.isNullOrEmpty()) { // Verify if the folder is empty
// If it is empty, delete it
folder.deleteRecursively()
}
}

fun moveLocalFile(ocFile: OCFile, finalStoragePath: String) {
val safeStoragePath = ocFile.getStoragePathOrExpectedPathForFile()
val fileToMove = File(safeStoragePath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,17 @@ import com.owncloud.android.domain.BaseUseCaseWithResult
import com.owncloud.android.domain.files.FileRepository
import com.owncloud.android.domain.files.model.OCFile

class AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase(private val fileRepository: FileRepository) :
BaseUseCaseWithResult<Boolean, AreAnyFileAvailableLocallyAndNotAvailableOfflineUseCase.Params>() {
class IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase(private val fileRepository: FileRepository) :
BaseUseCaseWithResult<Boolean, IsAnyFileAvailableLocallyAndNotAvailableOfflineUseCase.Params>() {

override fun run(params: Params): Boolean = areAnyFileAvailableLocallyAndNotAvailableOffline(params.listOfFiles)
private fun areAnyFileAvailableLocallyAndNotAvailableOffline(filesToRemove: List<OCFile>): Boolean {
override fun run(params: Params): Boolean = isAnyFileAvailableLocallyAndNotAvailableOffline(params.listOfFiles)
private fun isAnyFileAvailableLocallyAndNotAvailableOffline(filesToRemove: List<OCFile>): Boolean {

if (filesToRemove.any { it.isAvailableLocally && !it.isAvailableOffline }) {
return true
} else {
filesToRemove.filter { it.isFolder }.forEach { folder ->
if (areAnyFileAvailableLocallyAndNotAvailableOffline(fileRepository.getFolderContent(folder.id!!))) {
if (isAnyFileAvailableLocallyAndNotAvailableOffline(fileRepository.getFolderContent(folder.id!!))) {
return true
}
}
Expand Down

0 comments on commit f3da3cf

Please sign in to comment.