Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[New arch] Refresh folder #3709

Merged
merged 9 commits into from
Jul 7, 2022
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ val remoteDataSourceModule = module {

factory<RemoteAuthenticationDataSource> { OCRemoteAuthenticationDataSource(get()) }
factory<RemoteCapabilitiesDataSource> { OCRemoteCapabilitiesDataSource(get(), get()) }
factory<RemoteFileDataSource> { OCRemoteFileDataSource(get(), get()) }
factory<RemoteFileDataSource> { OCRemoteFileDataSource(get()) }
factory<RemoteOAuthDataSource> { RemoteOAuthDataSourceImpl(get(), get()) }
factory<RemoteServerInfoDataSource> { OCRemoteServerInfoDataSource(get(), get()) }
factory<RemoteShareDataSource> { OCRemoteShareDataSource(get(), get()) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ package com.owncloud.android.dependecyinjection

import com.owncloud.android.MainApp
import com.owncloud.android.presentation.ui.files.filelist.MainFileListViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.presentation.ui.security.passcode.PasscodeAction
import com.owncloud.android.presentation.viewmodels.authentication.OCAuthenticationViewModel
import com.owncloud.android.presentation.viewmodels.capabilities.OCCapabilityViewModel
Expand Down Expand Up @@ -85,6 +85,6 @@ val viewModelModule = module {

viewModel { PreviewImageViewModel(get(), get(), get()) }
viewModel { FileDetailsViewModel(get(), get(), get(), get(), get()) }
viewModel { FileOperationViewModel(get(), get(), get(), get(), get(), get(), get(), get()) }
viewModel { FileOperationsViewModel(get(), get(), get(), get(), get(), get(), get(), get()) }
viewModel { MainFileListViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
import com.owncloud.android.operations.common.SyncOperation;
import com.owncloud.android.presentation.ui.files.filelist.MainFileListViewModel;
import com.owncloud.android.presentation.ui.files.operations.FileOperation;
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel;
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel;
import com.owncloud.android.services.OperationsService;
import com.owncloud.android.usecases.synchronization.SynchronizeFileUseCase;
import com.owncloud.android.utils.FileStorageUtils;
Expand Down Expand Up @@ -282,11 +282,11 @@ private boolean folderChanged(RemoteFile remoteFolder) {
}

private void removeLocalFolder() {
FileOperationViewModel fileOperationViewModel = get(FileOperationViewModel.class);
FileOperationsViewModel fileOperationsViewModel = get(FileOperationsViewModel.class);
ArrayList<OCFile> list = new ArrayList<>();
list.add(mLocalFolder);
FileOperation.RemoveOperation removeOperation = new FileOperation.RemoveOperation(list, false);
fileOperationViewModel.performOperation(removeOperation);
fileOperationsViewModel.performOperation(removeOperation);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ import com.owncloud.android.presentation.ui.files.SortType
import com.owncloud.android.presentation.ui.files.ViewType
import com.owncloud.android.presentation.ui.files.createfolder.CreateFolderDialogFragment
import com.owncloud.android.presentation.ui.files.operations.FileOperation
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.presentation.ui.files.removefile.RemoveFilesDialogFragment
import com.owncloud.android.ui.activity.FileActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
Expand All @@ -87,7 +87,7 @@ class MainFileListFragment : Fragment(),
SortOptionsView.SortOptionsListener {

private val mainFileListViewModel by viewModel<MainFileListViewModel>()
private val fileOperationsViewModel by viewModel<FileOperationViewModel>()
private val fileOperationsViewModel by viewModel<FileOperationsViewModel>()

private var _binding: MainFileListFragmentBinding? = null
private val binding get() = _binding!!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import com.owncloud.android.usecases.synchronization.SynchronizeFileUseCase
import kotlinx.coroutines.launch
import timber.log.Timber

class FileOperationViewModel(
class FileOperationsViewModel(
private val createFolderAsyncUseCase: CreateFolderAsyncUseCase,
private val copyFileUseCase: CopyFileUseCase,
private val moveFileUseCase: MoveFileUseCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import android.os.Bundle
import com.owncloud.android.R
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.presentation.ui.files.operations.FileOperation
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
Expand All @@ -39,7 +39,7 @@ import java.util.ArrayList
class RemoveFilesDialogFragment : ConfirmationDialogFragment(), ConfirmationDialogFragmentListener {

private lateinit var targetFiles: ArrayList<OCFile>
private val fileOperationViewModel: FileOperationViewModel by sharedViewModel()
private val fileOperationViewModel: FileOperationsViewModel by sharedViewModel()

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ import com.owncloud.android.operations.RefreshFolderOperation
import com.owncloud.android.presentation.UIResult
import com.owncloud.android.presentation.ui.files.filelist.MainFileListFragment
import com.owncloud.android.presentation.ui.files.operations.FileOperation
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.presentation.ui.security.bayPassUnlockOnce
import com.owncloud.android.syncadapter.FileSyncAdapter
import com.owncloud.android.ui.fragment.FileDetailFragment
Expand Down Expand Up @@ -152,7 +152,7 @@ class FileDisplayActivity : FileActivity(),

private var localBroadcastManager: LocalBroadcastManager? = null

private val fileOperationViewModel: FileOperationViewModel by viewModel()
private val fileOperationsViewModel: FileOperationsViewModel by viewModel()

var filesUploadHelper: FilesUploadHelper? = null
internal set
Expand Down Expand Up @@ -583,7 +583,7 @@ class FileDisplayActivity : FileActivity(),
val folderToMoveAt = data.getParcelableExtra<OCFile>(FolderPickerActivity.EXTRA_FOLDER) ?: return
val files = data.getParcelableArrayListExtra<OCFile>(FolderPickerActivity.EXTRA_FILES) ?: return
val moveOperation = FileOperation.MoveOperation(listOfFilesToMove = files.toList(), targetFolder = folderToMoveAt)
fileOperationViewModel.performOperation(moveOperation)
fileOperationsViewModel.performOperation(moveOperation)
}

/**
Expand All @@ -595,7 +595,7 @@ class FileDisplayActivity : FileActivity(),
val folderToCopyAt = data.getParcelableExtra<OCFile>(FolderPickerActivity.EXTRA_FOLDER) ?: return
val files = data.getParcelableArrayListExtra<OCFile>(FolderPickerActivity.EXTRA_FILES) ?: return
val copyOperation = FileOperation.CopyOperation(listOfFilesToCopy = files.toList(), targetFolder = folderToCopyAt)
fileOperationViewModel.performOperation(copyOperation)
fileOperationsViewModel.performOperation(copyOperation)
}

override fun onBackPressed() {
Expand Down Expand Up @@ -1036,7 +1036,7 @@ class FileDisplayActivity : FileActivity(),
}

override fun syncFile(file: OCFile) {
fileOperationViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
fileOperationsViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
}

override fun openFile(file: OCFile) {
Expand Down Expand Up @@ -1439,7 +1439,7 @@ class FileDisplayActivity : FileActivity(),
val detailFragment = FileDetailFragment.newInstance(file, account)
setSecondFragment(detailFragment)
fileWaitingToPreview = file
fileOperationViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
fileOperationsViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
updateToolbar(file)
setFile(file)
}
Expand Down Expand Up @@ -1531,19 +1531,19 @@ class FileDisplayActivity : FileActivity(),
}

private fun startListeningToOperations() {
fileOperationViewModel.copyFileLiveData.observe(this, Event.EventObserver {
fileOperationsViewModel.copyFileLiveData.observe(this, Event.EventObserver {
onCopyFileOperationFinish(it)
})
fileOperationViewModel.moveFileLiveData.observe(this, Event.EventObserver {
fileOperationsViewModel.moveFileLiveData.observe(this, Event.EventObserver {
onMoveFileOperationFinish(it)
})
fileOperationViewModel.removeFileLiveData.observe(this, Event.EventObserver {
fileOperationsViewModel.removeFileLiveData.observe(this, Event.EventObserver {
onRemoveFileOperationResult(it)
})
fileOperationViewModel.renameFileLiveData.observe(this, Event.EventObserver {
fileOperationsViewModel.renameFileLiveData.observe(this, Event.EventObserver {
onRenameFileOperationFinish(it)
})
fileOperationViewModel.syncFileLiveData.observe(this, Event.EventObserver {
fileOperationsViewModel.syncFileLiveData.observe(this, Event.EventObserver {
onSynchronizeFileOperationFinish(it)
})
}
Expand All @@ -1561,12 +1561,12 @@ class FileDisplayActivity : FileActivity(),
}
PreviewTextFragment.canBePreviewed(file) -> {
startTextPreview(file)
fileOperationViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
fileOperationsViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
}
PreviewAudioFragment.canBePreviewed(file) -> {
// media preview
startAudioPreview(file, 0)
fileOperationViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
fileOperationsViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
}
PreviewVideoFragment.canBePreviewed(file) && !WorkManager.getInstance(this).isDownloadPending(account, file) -> {
// FIXME: 13/10/2020 : New_arch: Av.Offline
Expand All @@ -1583,7 +1583,7 @@ class FileDisplayActivity : FileActivity(),
// If the file is already downloaded sync it, just to update it if there is a
// new available file version
if (file.isAvailableLocally) {
fileOperationViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
fileOperationsViewModel.performOperation(FileOperation.SynchronizeFileOperation(file, account))
}
}
else -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,14 @@
import com.owncloud.android.presentation.UIResult;
import com.owncloud.android.presentation.ui.files.createfolder.CreateFolderDialogFragment;
import com.owncloud.android.presentation.ui.files.operations.FileOperation;
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel;
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel;
import com.owncloud.android.syncadapter.FileSyncAdapter;
import com.owncloud.android.ui.adapter.ReceiveExternalFilesAdapter;
import com.owncloud.android.ui.asynctasks.CopyAndUploadContentUrisTask;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.fragment.TaskRetainerFragment;
import com.owncloud.android.ui.helpers.UriUploader;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.Extras;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.SortFilesUtils;
import kotlin.Unit;
Expand Down Expand Up @@ -759,10 +758,10 @@ public void optionLockSelected(@NonNull LockType type) {

@Override
public void onFolderNameSet(@NotNull String newFolderName, @NotNull OCFile parentFolder) {
FileOperationViewModel fileOperationViewModel = get(FileOperationViewModel.class);
FileOperationsViewModel fileOperationsViewModel = get(FileOperationsViewModel.class);

fileOperationViewModel.performOperation(new FileOperation.CreateFolder(newFolderName, parentFolder));
fileOperationViewModel.getCreateFolder().observe(this, uiResultEvent -> {
fileOperationsViewModel.performOperation(new FileOperation.CreateFolder(newFolderName, parentFolder));
fileOperationsViewModel.getCreateFolder().observe(this, uiResultEvent -> {
UIResult<Unit> uiResult = uiResultEvent.peekContent();
if (uiResult.isSuccess()) {
updateDirectoryList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.extensions.avoidScreenshotsIfNeeded
import com.owncloud.android.extensions.showMessageInSnackbar
import com.owncloud.android.presentation.ui.files.operations.FileOperation
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.utils.PreferenceUtils
import org.koin.androidx.viewmodel.ext.android.sharedViewModel

Expand All @@ -46,7 +46,7 @@ import org.koin.androidx.viewmodel.ext.android.sharedViewModel
class RenameFileDialogFragment : DialogFragment(), DialogInterface.OnClickListener {

private var targetFile: OCFile? = null
private val filesViewModel: FileOperationViewModel by sharedViewModel()
private val filesViewModel: FileOperationsViewModel by sharedViewModel()

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
targetFile = requireArguments().getParcelable(ARG_TARGET_FILE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ import com.owncloud.android.lib.common.operations.OnRemoteOperationListener
import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.operations.SynchronizeFileOperation
import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.ui.activity.FileActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
import com.owncloud.android.ui.fragment.FileFragment
Expand All @@ -67,7 +67,7 @@ class PreviewImageActivity : FileActivity(),
OnRemoteOperationListener {

private val previewImageViewModel: PreviewImageViewModel by viewModel()
private val fileOperationViewModel: FileOperationViewModel by viewModel()
private val fileOperationViewModel: FileOperationsViewModel by viewModel()

private lateinit var viewPager: ViewPager
private lateinit var previewImagePagerAdapter: PreviewImagePagerAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ interface LocalFileDataSource {
fun copyFile(sourceFile: OCFile, targetFile: OCFile, finalRemotePath: String, remoteId: String)
fun getFileById(fileId: Long): OCFile?
fun getFileByRemotePath(remotePath: String, owner: String): OCFile?
fun getFileByRemoteId(remoteId: String): OCFile?
fun getFolderContent(folderId: Long): List<OCFile>
fun getSearchFolderContent(folderId: Long, search: String): List<OCFile>
fun getSearchAvailableOfflineFolderContent(folderId: Long, search: String): List<OCFile>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ class OCLocalFileDataSource(
return null
}

override fun getFileByRemoteId(remoteId: String): OCFile? =
fileDao.getFileByRemoteId(remoteId)?.toModel()

override fun getFolderContent(folderId: Long): List<OCFile> =
fileDao.getFolderContent(folderId = folderId).map {
it.toModel()
Expand Down Expand Up @@ -113,15 +116,11 @@ class OCLocalFileDataSource(
)

override fun saveFilesInFolder(listOfFiles: List<OCFile>, folder: OCFile) {
// Insert first folder container
// TODO: If it is root, add 0 as parent Id
val folderId = fileDao.mergeRemoteAndLocalFile(folder.toEntity())

// Then, insert files inside
listOfFiles.forEach {
// Add parent id to each file
fileDao.mergeRemoteAndLocalFile(it.toEntity().apply { parentId = folderId })
}
fileDao.insertFilesInFolder(
folder = folder.toEntity(),
folderContent = listOfFiles.map { it.toEntity() }
)
}

override fun saveFile(file: OCFile) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ package com.owncloud.android.data.files.datasources.implementation
import com.owncloud.android.data.ClientManager
import com.owncloud.android.data.executeRemoteOperation
import com.owncloud.android.data.files.datasources.RemoteFileDataSource
import com.owncloud.android.data.files.datasources.mapper.RemoteFileMapper
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.lib.resources.files.RemoteFile

class OCRemoteFileDataSource(
private val clientManager: ClientManager,
private val remoteFileMapper: RemoteFileMapper
) : RemoteFileDataSource {

override fun checkPathExistence(
Expand Down Expand Up @@ -115,7 +114,7 @@ class OCRemoteFileDataSource(
clientManager.getFileService().readFile(
remotePath = remotePath
)
}.let { remoteFileMapper.toModel(it)!! }
}.toModel()

override fun refreshFolder(
remotePath: String
Expand All @@ -126,7 +125,7 @@ class OCRemoteFileDataSource(
remotePath = remotePath
)
}.let { listOfRemote ->
listOfRemote.map { remoteFile -> remoteFileMapper.toModel(remoteFile)!! }
listOfRemote.map { remoteFile -> remoteFile.toModel() }
}

override fun removeFile(
Expand All @@ -150,4 +149,22 @@ class OCRemoteFileDataSource(
isFolder = isFolder
)
}

private fun RemoteFile.toModel(): OCFile =
OCFile(
owner = owner,
remoteId = remoteId,
remotePath = remotePath,
length = if (isFolder) {
size
} else {
length
},
creationTimestamp = creationTimestamp,
modificationTimestamp = modifiedTimestamp,
mimeType = mimeType,
etag = etag,
permissions = permissions,
privateLink = privateLink
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.mappers.RemoteMapper
import com.owncloud.android.lib.resources.files.RemoteFile

@Deprecated("Used by legacy code. Remove as soon as the synchronize operations are done")
class RemoteFileMapper : RemoteMapper<OCFile, RemoteFile> {
override fun toModel(remote: RemoteFile?): OCFile? =
remote?.let {
Expand Down
Loading