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/shared files #3471

Merged
merged 9 commits into from
Dec 13, 2021
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -101,6 +102,7 @@ val useCaseModule = module {
factory { RenameFileUseCase(get()) }
factory { SaveFileOrFolderUseCase(get()) }
factory { GetFilesSharedByLinkUseCase(get()) }
factory { GetFilesAvailableOfflineUseCase(get()) }

// Sharing
factory { CreatePrivateShareAsyncUseCase(get()) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -45,6 +50,15 @@ class MainFileListViewModel(
val getFilesListStatusLiveData: LiveData<Event<UIResult<List<OCFile>>>>
get() = _getFilesListStatusLiveData

private val _getFilesSharedByLinkData = MutableLiveData<Event<UIResult<List<OCFile>>>>()
val getFilesSharedByLinkData: LiveData<Event<UIResult<List<OCFile>>>>
get() = _getFilesSharedByLinkData

private val _getFilesAvailableOfflineData = MutableLiveData<Event<UIResult<List<OCFile>>>>()
val getFilesAvailableOfflineData: LiveData<Event<UIResult<List<OCFile>>>>
get() = _getFilesAvailableOfflineData


private fun getFilesList(folderId: Long) {
val filesListLiveData: LiveData<List<OCFile>> =
getFolderContentAsLiveDataUseCase.execute(GetFolderContentAsLiveDataUseCase.Params(folderId = folderId))
Expand All @@ -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()))
Expand All @@ -71,4 +103,3 @@ class MainFileListViewModel(
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ interface LocalFileDataSource {
fun getFolderContentAsLiveData(folderId: Long): LiveData<List<OCFile>>
fun getFolderImages(folderId: Long): List<OCFile>
fun getFilesSharedByLink(owner: String): List<OCFile>
fun getFilesAvailableOffline(owner: String): List<OCFile>
fun moveFile(sourceFile: OCFile, targetFile: OCFile, finalRemotePath: String, finalStoragePath: String)
fun saveFilesInFolder(listOfFiles: List<OCFile>, folder: OCFile)
fun saveFile(file: OCFile)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ class OCLocalFileDataSource(
it.toModel()
}

override fun getFilesAvailableOffline(owner: String): List<OCFile> = fileDao.getFilesAvailableOffline(accountOwner = owner).map {
it.toModel()
}

override fun moveFile(sourceFile: OCFile, targetFile: OCFile, finalRemotePath: String, finalStoragePath: String) =
fileDao.moveFile(
sourceFile = sourceFile.toEntity(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ abstract class FileDao {
accountOwner: String
): List<OCFileEntity>

@Query(SELECT_FILES_AVAILABLE_OFFLINE)
abstract fun getFilesAvailableOffline(
accountOwner: String
): List<OCFileEntity>

@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insert(ocFileEntity: OCFileEntity): Long

Expand Down Expand Up @@ -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'"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ class OCFileRepository(
override fun getFilesSharedByLink(owner: String): List<OCFile> =
localFileDataSource.getFilesSharedByLink(owner)

override fun getFilesAvailableOffline(owner: String): List<OCFile> =
localFileDataSource.getFilesAvailableOffline(owner)

override fun moveFile(listOfFilesToMove: List<OCFile>, targetFile: OCFile) {
listOfFilesToMove.forEach { ocFile ->

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ interface FileRepository {
fun getFolderContentAsLiveData(folderId: Long): LiveData<List<OCFile>>
fun getFolderImages(folderId: Long): List<OCFile>
fun getFilesSharedByLink(owner: String): List<OCFile>
fun getFilesAvailableOffline(owner: String): List<OCFile>
fun moveFile(listOfFilesToMove: List<OCFile>, targetFile: OCFile)
fun refreshFolder(remotePath: String)
fun removeFile(listOfFilesToRemove: List<OCFile>, removeOnlyLocalCopy: Boolean)
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/
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<List<OCFile>, GetFilesAvailableOfflineUseCase.Params>() {

override fun run(params: Params): List<OCFile> = fileRepository.getFilesAvailableOffline(params.owner)

data class Params(
val owner: String
)
}