Skip to content

Commit

Permalink
Merge pull request #3232 from owncloud/new_arch/move
Browse files Browse the repository at this point in the history
[New arch] Move
  • Loading branch information
abelgardep authored May 19, 2021
2 parents 88faed5 + 1ad2008 commit c52e22a
Show file tree
Hide file tree
Showing 26 changed files with 470 additions and 287 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import com.owncloud.android.domain.files.usecases.GetFileByIdUseCase
import com.owncloud.android.domain.files.usecases.GetFileByRemotePathUseCase
import com.owncloud.android.domain.files.usecases.GetFolderContentUseCase
import com.owncloud.android.domain.files.usecases.GetFolderImagesUseCase
import com.owncloud.android.domain.files.usecases.MoveFileUseCase
import com.owncloud.android.domain.files.usecases.RefreshFolderFromServerAsyncUseCase
import com.owncloud.android.domain.files.usecases.RemoveFileUseCase
import com.owncloud.android.domain.files.usecases.SaveFileOrFolderUseCase
Expand Down Expand Up @@ -81,6 +82,7 @@ val useCaseModule = module {
factory { GetFileByRemotePathUseCase(get()) }
factory { GetFolderContentUseCase(get()) }
factory { GetFolderImagesUseCase(get()) }
factory { MoveFileUseCase(get()) }
factory { RefreshFolderFromServerAsyncUseCase(get()) }
factory { RemoveFileUseCase(get()) }
factory { SaveFileOrFolderUseCase(get()) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,5 @@ val viewModelModule = module {

viewModel { PreviewImageViewModel(get(), get(), get()) }
viewModel { FileDetailsViewModel(get(), get(), get(), get(), get()) }
viewModel { FileOperationViewModel(get(), get(), get()) }
viewModel { FileOperationViewModel(get(), get(), get(), get()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package com.owncloud.android.extensions

import android.content.res.Resources
import androidx.annotation.StringRes
import com.owncloud.android.R
import com.owncloud.android.domain.exceptions.AccountNotNewException
import com.owncloud.android.domain.exceptions.AccountNotTheSameException
Expand All @@ -29,6 +28,7 @@ import com.owncloud.android.domain.exceptions.FileNotFoundException
import com.owncloud.android.domain.exceptions.ForbiddenException
import com.owncloud.android.domain.exceptions.IncorrectAddressException
import com.owncloud.android.domain.exceptions.InstanceNotConfiguredException
import com.owncloud.android.domain.exceptions.MoveIntoDescendantException
import com.owncloud.android.domain.exceptions.NoConnectionWithServerException
import com.owncloud.android.domain.exceptions.NoNetworkConnectionException
import com.owncloud.android.domain.exceptions.OAuth2ErrorAccessDeniedException
Expand Down Expand Up @@ -71,7 +71,8 @@ fun Throwable.parseError(
}
resources.getString(stringId)
}
is ForbiddenException -> { resources.getString(R.string.forbidden_permissions)}
is MoveIntoDescendantException -> resources.getString(R.string.move_file_invalid_into_descendent)
is ForbiddenException -> resources.getString(R.string.forbidden_permissions)
is FileNotFoundException -> resources.getString(R.string.common_not_found)
is InstanceNotConfiguredException -> resources.getString(R.string.auth_not_configured_title)
is OAuth2ErrorException -> resources.getString(R.string.auth_oauth_error)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.resources.files.FileUtils;
import com.owncloud.android.lib.resources.files.chunks.ChunkedUploadRemoteFileOperation;
import com.owncloud.android.lib.resources.files.services.implementation.OCChunkService;
import com.owncloud.android.operations.common.SyncOperation;

import java.io.File;
Expand Down Expand Up @@ -95,13 +96,12 @@ private RemoteOperationResult createChunksFolder(String remoteChunksFolder) {
return syncOperation.execute(getClient(), getStorageManager());
}

private RemoteOperationResult moveChunksFileToFinalDestination(String fileLastModifTimestamp, long fileLength) {
SyncOperation syncOperation = new MoveChunksFileOperation(
String.valueOf(mTransferId + File.separator + FileUtils.FINAL_CHUNKS_FILE),
private void moveChunksFileToFinalDestination(String fileLastModifTimestamp, long fileLength) {
OCChunkService ocChunkService = new OCChunkService(getClient());
ocChunkService.moveFile(
mTransferId + File.separator + FileUtils.FINAL_CHUNKS_FILE,
mFile.getRemotePath(),
fileLastModifTimestamp,
fileLength
);
return syncOperation.execute(getClient(), getStorageManager());
fileLength);
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ package com.owncloud.android.presentation.ui.files.operations
import com.owncloud.android.domain.files.model.OCFile

sealed class FileOperation {
data class MoveOperation(val listOfFilesToMove: List<OCFile>, val targetFolder: OCFile) : FileOperation()
data class RemoveOperation(val listOfFilesToRemove: List<OCFile>, val removeOnlyLocalCopy: Boolean) : FileOperation()
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.lifecycle.viewModelScope
import com.owncloud.android.domain.UseCaseResult
import com.owncloud.android.domain.exceptions.NoNetworkConnectionException
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.files.usecases.MoveFileUseCase
import com.owncloud.android.domain.files.usecases.RemoveFileUseCase
import com.owncloud.android.domain.utils.Event
import com.owncloud.android.presentation.UIResult
Expand All @@ -35,6 +36,7 @@ import kotlinx.coroutines.launch
import timber.log.Timber

class FileOperationViewModel(
private val moveFileUseCase: MoveFileUseCase,
private val removeFileUseCase: RemoveFileUseCase,
private val contextProvider: ContextProvider,
private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider
Expand All @@ -43,12 +45,42 @@ class FileOperationViewModel(
private val _removeFileLiveData = MediatorLiveData<Event<UIResult<List<OCFile>>>>()
val removeFileLiveData: LiveData<Event<UIResult<List<OCFile>>>> = _removeFileLiveData

private val _moveFileLiveData = MediatorLiveData<Event<UIResult<OCFile>>>()
val moveFileLiveData: LiveData<Event<UIResult<OCFile>>> = _moveFileLiveData

fun performOperation(fileOperation: FileOperation) {
when (fileOperation) {
is FileOperation.MoveOperation -> moveOperation(fileOperation)
is FileOperation.RemoveOperation -> removeOperation(fileOperation)
}
}

private fun moveOperation(fileOperation: FileOperation.MoveOperation) {
viewModelScope.launch(coroutinesDispatcherProvider.io) {
_moveFileLiveData.postValue(Event(UIResult.Loading()))

if (!contextProvider.isConnected()) {
_moveFileLiveData.postValue(Event(UIResult.Error(error = NoNetworkConnectionException())))
Timber.w("${moveFileUseCase.javaClass.simpleName} will not be executed due to lack of network connection")
return@launch
}
val useCaseResult =
moveFileUseCase.execute(MoveFileUseCase.Params(fileOperation.listOfFilesToMove, fileOperation.targetFolder))

Timber.d("Use case executed: ${moveFileUseCase.javaClass.simpleName} with result: $useCaseResult")

when (useCaseResult) {
is UseCaseResult.Success -> {
_moveFileLiveData.postValue(Event(UIResult.Success(fileOperation.targetFolder)))
}
is UseCaseResult.Error -> {
_moveFileLiveData.postValue(Event(UIResult.Error(error = useCaseResult.throwable)))
}
}

}
}

private fun removeOperation(fileOperation: FileOperation.RemoveOperation) {
viewModelScope.launch(coroutinesDispatcherProvider.io) {
_removeFileLiveData.postValue(Event(UIResult.Loading()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ import com.owncloud.android.domain.exceptions.NoConnectionWithServerException
import com.owncloud.android.domain.exceptions.validation.FileNameException
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.files.usecases.CreateFolderAsyncUseCase
import com.owncloud.android.domain.files.usecases.MoveFileUseCase
import com.owncloud.android.domain.files.usecases.RemoveFileUseCase
import com.owncloud.android.files.services.FileUploader
import com.owncloud.android.files.services.TransferRequester
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.operations.CopyFileOperation
import com.owncloud.android.operations.MoveFileOperation
import com.owncloud.android.operations.RefreshFolderOperation
import com.owncloud.android.operations.RenameFileOperation
import com.owncloud.android.operations.SynchronizeFileOperation
Expand Down Expand Up @@ -332,10 +332,10 @@ class DocumentsStorageProvider : DocumentsProvider() {
val removeFileUseCase: RemoveFileUseCase by inject()
removeFileUseCase.execute(RemoveFileUseCase.Params(listOf(file), false)).also {
checkUseCaseResult(
it,
file.parentId.toString()
)
}
it,
file.parentId.toString()
)
}
}

override fun copyDocument(sourceDocumentId: String, targetParentDocumentId: String): String {
Expand Down Expand Up @@ -380,19 +380,21 @@ class DocumentsStorageProvider : DocumentsProvider() {
val targetParentDocId = targetParentDocumentId.toLong()
val targetParentFile = getFileByIdOrException(targetParentDocId)

MoveFileOperation(
sourceFile.remotePath,
targetParentFile.remotePath
).apply {
execute(currentStorageManager, context).also { result ->
syncRequired = false
checkOperationResult(result, targetParentFile.id.toString())
//Returns the document id of the document moved to the target destination
var newPath = targetParentFile.remotePath + sourceFile.fileName
if (sourceFile.isFolder) newPath += File.separator
val newFile = getFileByPathOrException(newPath)
return newFile.id.toString()
}
val moveFileUseCase: MoveFileUseCase by inject()

moveFileUseCase.execute(
MoveFileUseCase.Params(
listOfFilesToMove = listOf(sourceFile),
targetFile = targetParentFile
)
).also { result ->
syncRequired = false
checkUseCaseResult(result, targetParentFile.id.toString())
//Returns the document id of the document moved to the target destination
var newPath = targetParentFile.remotePath + sourceFile.fileName
if (sourceFile.isFolder) newPath += File.separator
val newFile = getFileByPathOrException(newPath)
return newFile.id.toString()
}
}

Expand Down
Loading

0 comments on commit c52e22a

Please sign in to comment.