@@ -17,14 +17,14 @@ import org.cryptomator.domain.exception.CloudNodeAlreadyExistsException
1717import org.cryptomator.domain.exception.EmptyDirFileException
1818import org.cryptomator.domain.exception.FatalBackendException
1919import org.cryptomator.domain.exception.NoDirFileException
20- import org.cryptomator.domain.exception.NoSuchCloudFileException
2120import org.cryptomator.domain.exception.SymLinkException
2221import org.cryptomator.domain.usecases.CalculateFileHashUseCase
2322import org.cryptomator.domain.usecases.CloudFolderRecursiveListing
2423import org.cryptomator.domain.usecases.CloudNodeRecursiveListing
2524import org.cryptomator.domain.usecases.CopyDataUseCase
2625import org.cryptomator.domain.usecases.DownloadFile
2726import org.cryptomator.domain.usecases.GetDecryptedCloudForVaultUseCase
27+ import org.cryptomator.domain.usecases.PrepareDownloadFilesUseCase
2828import org.cryptomator.domain.usecases.ResultRenamed
2929import org.cryptomator.domain.usecases.cloud.CreateFolderUseCase
3030import org.cryptomator.domain.usecases.cloud.DeleteNodesUseCase
@@ -47,7 +47,6 @@ import org.cryptomator.generator.InstanceState
4747import org.cryptomator.presentation.CryptomatorApp
4848import org.cryptomator.presentation.R
4949import org.cryptomator.presentation.exception.ExceptionHandlers
50- import org.cryptomator.presentation.exception.IllegalFileNameException
5150import org.cryptomator.presentation.intent.BrowseFilesIntent
5251import org.cryptomator.presentation.intent.ChooseCloudNodeSettings
5352import org.cryptomator.presentation.intent.IntentBuilder
@@ -111,6 +110,7 @@ class BrowseFilesPresenter @Inject constructor( //
111110 private val getCloudListRecursiveUseCase : GetCloudListRecursiveUseCase , //
112111 private val getDecryptedCloudForVaultUseCase : GetDecryptedCloudForVaultUseCase , //
113112 private val calculateFileHashUseCase : CalculateFileHashUseCase , //
113+ private val prepareDownloadFilesUseCase : PrepareDownloadFilesUseCase , //
114114 private val contentResolverUtil : ContentResolverUtil , //
115115 private val addExistingVaultWorkflow : AddExistingVaultWorkflow , //
116116 private val createNewVaultWorkflow : CreateNewVaultWorkflow , //
@@ -982,84 +982,35 @@ class BrowseFilesPresenter @Inject constructor( //
982982 }
983983
984984 private fun prepareExportingOf (parentUri : Uri , exportOperation : ExportOperation , filesToExport : List <CloudFileModel >, cloudNodeRecursiveListing : CloudNodeRecursiveListing ) {
985+ view?.showProgress(ProgressModel .GENERIC )
985986 downloadFiles = ArrayList ()
986- downloadFiles.addAll(prepareFilesForExport(cloudFileModelMapper.fromModels(filesToExport), parentUri))
987- cloudNodeRecursiveListing.foldersContent.forEach { folderRecursiveListing ->
988- prepareFolderContentForExport(folderRecursiveListing, parentUri)
989- }
990- if (downloadFiles.isEmpty()) {
991- view?.showMessage(R .string.screen_file_browser_nothing_to_export)
992- view?.closeDialog()
993- } else {
994- exportOperation.export(this , downloadFiles)
995- }
996- }
997-
998- private fun prepareFilesForExport (filesToExport : List <CloudFile >, parentUri : Uri ): List <DownloadFile > {
999- return filesToExport.mapTo(ArrayList ()) { createDownloadFile(it, parentUri) }
1000- }
1001-
1002- private fun prepareFolderContentForExport (cloudFolderRecursiveListing : CloudFolderRecursiveListing , parentUri : Uri ) {
1003- createFolder(parentUri, cloudFolderRecursiveListing.parent.name)?.let {
1004- downloadFiles.addAll(prepareFilesForExport(cloudFolderRecursiveListing.files, it))
1005- cloudFolderRecursiveListing.folders.forEach { childFolder ->
1006- prepareFolderContentForExport(childFolder, it)
1007- }
1008- } ? : throw FatalBackendException (" Failed to create parent folder for export" )
1009- }
1010-
1011- private fun createFolder (parentUri : Uri , folderName : String ): Uri ? {
1012- return try {
1013- DocumentsContract .createDocument( //
1014- context().contentResolver, //
1015- parentUri, //
1016- DocumentsContract .Document .MIME_TYPE_DIR , //
1017- folderName
1018- )
1019- } catch (e: FileNotFoundException ) {
1020- Timber .tag(" BrowseFilesPresenter" ).e(e)
1021- throw IllegalStateException (" Creating folder failed" )
1022- }
1023- }
987+ prepareDownloadFilesUseCase
988+ .withFilesToExport(cloudFileModelMapper.fromModels(filesToExport))
989+ .andParentUri(parentUri)
990+ .andCloudNodeRecursiveListing(cloudNodeRecursiveListing)
991+ .run (object : DefaultResultHandler <List <DownloadFile >>() {
992+ override fun onSuccess (prepareDownloadFiles : List <DownloadFile >) {
993+ view?.showProgress(ProgressModel .COMPLETED )
994+ downloadFiles = prepareDownloadFiles.toMutableList()
995+ if (downloadFiles.isEmpty()) {
996+ view?.showMessage(R .string.screen_file_browser_nothing_to_export)
997+ view?.closeDialog()
998+ } else {
999+ export(exportOperation, downloadFiles)
1000+ }
1001+ }
10241002
1025- private fun createDownloadFile (file : CloudFile , documentUri : Uri ): DownloadFile {
1026- return try {
1027- DownloadFile .Builder () //
1028- .setDownloadFile(file) //
1029- .setDataSink(
1030- contentResolverUtil.openOutputStream( //
1031- createNewDocumentUri(documentUri, file.name)
1032- )
1033- ) //
1034- .build()
1035- } catch (e: FileNotFoundException ) {
1036- showError(e)
1037- disableSelectionMode()
1038- throw FatalBackendException (e)
1039- } catch (e: NoSuchCloudFileException ) {
1040- showError(e)
1041- disableSelectionMode()
1042- throw FatalBackendException (e)
1043- } catch (e: IllegalFileNameException ) {
1044- showError(e)
1045- disableSelectionMode()
1046- throw FatalBackendException (e)
1047- }
1003+ override fun onError (e : Throwable ) {
1004+ view?.showProgress(ProgressModel .COMPLETED )
1005+ showError(e)
1006+ disableSelectionMode()
1007+ throw FatalBackendException (e)
1008+ }
1009+ })
10481010 }
10491011
1050- @Throws(IllegalFileNameException ::class , NoSuchCloudFileException ::class )
1051- private fun createNewDocumentUri (parentUri : Uri , fileName : String ): Uri {
1052- val mimeType = mimeTypes.fromFilename(fileName) ? : MimeType .APPLICATION_OCTET_STREAM
1053- return try {
1054- DocumentsContract .createDocument( //
1055- context().contentResolver, //
1056- parentUri, //
1057- mimeType.toString(), //
1058- fileName
1059- )
1060- } catch (e: FileNotFoundException ) {
1061- throw NoSuchCloudFileException (fileName)
1062- } ? : throw IllegalFileNameException ()
1012+ private fun export (exportOperation : ExportOperation , downloadFiles : MutableList <DownloadFile >) {
1013+ exportOperation.export(this , downloadFiles)
10631014 }
10641015
10651016 @Callback
@@ -1335,7 +1286,8 @@ class BrowseFilesPresenter @Inject constructor( //
13351286 moveFilesUseCase, //
13361287 moveFoldersUseCase, //
13371288 getDecryptedCloudForVaultUseCase, //
1338- calculateFileHashUseCase
1289+ calculateFileHashUseCase, //
1290+ prepareDownloadFilesUseCase
13391291 )
13401292 this .authenticationExceptionHandler = authenticationExceptionHandler
13411293 }
0 commit comments