Skip to content

Commit

Permalink
Merge pull request #3471 from owncloud/new_arch/shared_files
Browse files Browse the repository at this point in the history
New arch/shared files
  • Loading branch information
fesave authored Dec 13, 2021
2 parents e3ca7ad + 2ab1513 commit 391ffe1
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 4 deletions.
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
)
}

0 comments on commit 391ffe1

Please sign in to comment.