diff --git a/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/UseCaseModule.kt b/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/UseCaseModule.kt index fb049488fdc..32f288ce79e 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/UseCaseModule.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/UseCaseModule.kt @@ -40,6 +40,7 @@ import com.owncloud.android.domain.files.usecases.CopyFileUseCase import com.owncloud.android.domain.files.usecases.CreateFolderAsyncUseCase import com.owncloud.android.domain.files.usecases.GetFileByIdUseCase import com.owncloud.android.domain.files.usecases.GetFileByRemotePathUseCase +import com.owncloud.android.domain.files.usecases.GetFilesAvailableOfflineUseCase import com.owncloud.android.domain.files.usecases.GetFilesSharedByLinkUseCase import com.owncloud.android.domain.files.usecases.GetFolderContentAsLiveDataUseCase import com.owncloud.android.domain.files.usecases.GetFolderContentUseCase @@ -101,6 +102,7 @@ val useCaseModule = module { factory { RenameFileUseCase(get()) } factory { SaveFileOrFolderUseCase(get()) } factory { GetFilesSharedByLinkUseCase(get()) } + factory { GetFilesAvailableOfflineUseCase(get()) } // Sharing factory { CreatePrivateShareAsyncUseCase(get()) } diff --git a/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt b/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt index b1a19596fbe..9d3afc7d760 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt @@ -75,5 +75,5 @@ val viewModelModule = module { viewModel { PreviewImageViewModel(get(), get(), get()) } viewModel { FileDetailsViewModel(get(), get(), get(), get(), get()) } viewModel { FileOperationViewModel(get(), get(), get(), get(), get(), get()) } - viewModel { MainFileListViewModel(get(), get(), get()) } + viewModel { MainFileListViewModel(get(), get(), get(), get(), get()) } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt index 5454ba5bb39..20aea6842b0 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt @@ -22,21 +22,26 @@ package com.owncloud.android.presentation.ui.files.filelist import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.owncloud.android.domain.UseCaseResult import androidx.lifecycle.viewModelScope import com.owncloud.android.domain.files.model.OCFile +import com.owncloud.android.domain.files.usecases.GetFilesAvailableOfflineUseCase +import com.owncloud.android.domain.files.usecases.GetFilesSharedByLinkUseCase import com.owncloud.android.domain.files.usecases.GetFolderContentAsLiveDataUseCase import com.owncloud.android.domain.files.usecases.RefreshFolderFromServerAsyncUseCase import com.owncloud.android.domain.utils.Event import com.owncloud.android.presentation.UIResult -import com.owncloud.android.providers.ContextProvider import com.owncloud.android.providers.CoroutinesDispatcherProvider import kotlinx.coroutines.launch class MainFileListViewModel( private val getFolderContentAsLiveDataUseCase: GetFolderContentAsLiveDataUseCase, + private val getFilesSharedByLinkUseCase: GetFilesSharedByLinkUseCase, + private val getFilesAvailableOfflineUseCase: GetFilesAvailableOfflineUseCase, private val refreshFolderFromServerAsyncUseCase: RefreshFolderFromServerAsyncUseCase, - private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, + private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider ) : ViewModel() { private lateinit var file: OCFile @@ -45,6 +50,15 @@ class MainFileListViewModel( val getFilesListStatusLiveData: LiveData>>> get() = _getFilesListStatusLiveData + private val _getFilesSharedByLinkData = MutableLiveData>>>() + val getFilesSharedByLinkData: LiveData>>> + get() = _getFilesSharedByLinkData + + private val _getFilesAvailableOfflineData = MutableLiveData>>>() + val getFilesAvailableOfflineData: LiveData>>> + get() = _getFilesAvailableOfflineData + + private fun getFilesList(folderId: Long) { val filesListLiveData: LiveData> = getFolderContentAsLiveDataUseCase.execute(GetFolderContentAsLiveDataUseCase.Params(folderId = folderId)) @@ -54,6 +68,24 @@ class MainFileListViewModel( } } + fun getSharedByLinkFilesList(owner: String) { + getFilesSharedByLinkUseCase.execute(GetFilesSharedByLinkUseCase.Params(owner = owner)).let { + when (it) { + is UseCaseResult.Error -> _getFilesSharedByLinkData.postValue(Event(UIResult.Error(it.getThrowableOrNull()))) + is UseCaseResult.Success -> _getFilesSharedByLinkData.postValue(Event(UIResult.Success(it.getDataOrNull()))) + } + } + } + + fun getAvailableOfflineFilesList(owner: String) { + getFilesAvailableOfflineUseCase.execute(GetFilesAvailableOfflineUseCase.Params(owner = owner)).let { + when (it) { + is UseCaseResult.Error -> _getFilesAvailableOfflineData.postValue(Event(UIResult.Error(it.getThrowableOrNull()))) + is UseCaseResult.Success -> _getFilesAvailableOfflineData.postValue(Event(UIResult.Success(it.getDataOrNull()))) + } + } + } + private fun refreshFilesList(remotePath: String) { viewModelScope.launch(coroutinesDispatcherProvider.io) { _getFilesListStatusLiveData.postValue(Event(UIResult.Loading())) @@ -71,4 +103,3 @@ class MainFileListViewModel( } } - diff --git a/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/LocalFileDataSource.kt b/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/LocalFileDataSource.kt index 3f328412a93..7acfb6239a3 100644 --- a/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/LocalFileDataSource.kt +++ b/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/LocalFileDataSource.kt @@ -31,6 +31,7 @@ interface LocalFileDataSource { fun getFolderContentAsLiveData(folderId: Long): LiveData> fun getFolderImages(folderId: Long): List fun getFilesSharedByLink(owner: String): List + fun getFilesAvailableOffline(owner: String): List fun moveFile(sourceFile: OCFile, targetFile: OCFile, finalRemotePath: String, finalStoragePath: String) fun saveFilesInFolder(listOfFiles: List, folder: OCFile) fun saveFile(file: OCFile) diff --git a/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/implementation/OCLocalFileDataSource.kt b/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/implementation/OCLocalFileDataSource.kt index eebf2ecdf00..d489be6f018 100644 --- a/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/implementation/OCLocalFileDataSource.kt +++ b/owncloudData/src/main/java/com/owncloud/android/data/files/datasources/implementation/OCLocalFileDataSource.kt @@ -85,6 +85,10 @@ class OCLocalFileDataSource( it.toModel() } + override fun getFilesAvailableOffline(owner: String): List = fileDao.getFilesAvailableOffline(accountOwner = owner).map { + it.toModel() + } + override fun moveFile(sourceFile: OCFile, targetFile: OCFile, finalRemotePath: String, finalStoragePath: String) = fileDao.moveFile( sourceFile = sourceFile.toEntity(), diff --git a/owncloudData/src/main/java/com/owncloud/android/data/files/db/FileDao.kt b/owncloudData/src/main/java/com/owncloud/android/data/files/db/FileDao.kt index 273ffa511d7..e2212846d21 100644 --- a/owncloudData/src/main/java/com/owncloud/android/data/files/db/FileDao.kt +++ b/owncloudData/src/main/java/com/owncloud/android/data/files/db/FileDao.kt @@ -62,6 +62,11 @@ abstract class FileDao { accountOwner: String ): List + @Query(SELECT_FILES_AVAILABLE_OFFLINE) + abstract fun getFilesAvailableOffline( + accountOwner: String + ): List + @Insert(onConflict = OnConflictStrategy.REPLACE) abstract fun insert(ocFileEntity: OCFileEntity): Long @@ -247,5 +252,11 @@ abstract class FileDao { "WHERE owner = :accountOwner " + "AND sharedByLink NOT LIKE '%0%' " + "OR sharedWithSharee NOT LIKE '%0%'" + + private const val SELECT_FILES_AVAILABLE_OFFLINE = + "SELECT * " + + "FROM ${ProviderMeta.ProviderTableMeta.FILES_TABLE_NAME} " + + "WHERE owner = :accountOwner " + + "AND keepInSync = '1'" } } diff --git a/owncloudData/src/main/java/com/owncloud/android/data/files/repository/OCFileRepository.kt b/owncloudData/src/main/java/com/owncloud/android/data/files/repository/OCFileRepository.kt index 23939010a95..2ccfe5b3125 100644 --- a/owncloudData/src/main/java/com/owncloud/android/data/files/repository/OCFileRepository.kt +++ b/owncloudData/src/main/java/com/owncloud/android/data/files/repository/OCFileRepository.kt @@ -123,6 +123,9 @@ class OCFileRepository( override fun getFilesSharedByLink(owner: String): List = localFileDataSource.getFilesSharedByLink(owner) + override fun getFilesAvailableOffline(owner: String): List = + localFileDataSource.getFilesAvailableOffline(owner) + override fun moveFile(listOfFilesToMove: List, targetFile: OCFile) { listOfFilesToMove.forEach { ocFile -> diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/FileRepository.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/FileRepository.kt index 63d3fc1e467..e8b8fe31794 100644 --- a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/FileRepository.kt +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/FileRepository.kt @@ -32,6 +32,7 @@ interface FileRepository { fun getFolderContentAsLiveData(folderId: Long): LiveData> fun getFolderImages(folderId: Long): List fun getFilesSharedByLink(owner: String): List + fun getFilesAvailableOffline(owner: String): List fun moveFile(listOfFilesToMove: List, targetFile: OCFile) fun refreshFolder(remotePath: String) fun removeFile(listOfFilesToRemove: List, removeOnlyLocalCopy: Boolean) diff --git a/owncloudDomain/src/main/java/com/owncloud/android/domain/files/usecases/GetFilesAvailableOfflineUseCase.kt b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/usecases/GetFilesAvailableOfflineUseCase.kt new file mode 100644 index 00000000000..6a8b02ac109 --- /dev/null +++ b/owncloudDomain/src/main/java/com/owncloud/android/domain/files/usecases/GetFilesAvailableOfflineUseCase.kt @@ -0,0 +1,33 @@ +/* + * ownCloud Android client application + * + * Copyright (C) 2021 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, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.domain.files.usecases + +import com.owncloud.android.domain.BaseUseCaseWithResult +import com.owncloud.android.domain.files.FileRepository +import com.owncloud.android.domain.files.model.OCFile + +class GetFilesAvailableOfflineUseCase( + private val fileRepository: FileRepository +) : BaseUseCaseWithResult, GetFilesAvailableOfflineUseCase.Params>() { + + override fun run(params: Params): List = fileRepository.getFilesAvailableOffline(params.owner) + + data class Params( + val owner: String + ) +}