Skip to content

Commit 0b94d26

Browse files
Merge pull request nextcloud#15988 from nextcloud/feat/cache-content-of-different-tabs
feat: cache content of different tabs 🚀
2 parents d02b341 + c387abc commit 0b94d26

File tree

18 files changed

+1035
-481
lines changed

18 files changed

+1035
-481
lines changed

app/src/androidTest/java/com/owncloud/android/ui/fragment/SharedListFragmentIT.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import com.owncloud.android.AbstractIT
2121
import com.owncloud.android.datamodel.OCFile
2222
import com.owncloud.android.lib.resources.shares.OCShare
2323
import com.owncloud.android.lib.resources.shares.ShareType
24+
import com.owncloud.android.ui.adapter.OCShareToOCFileConverter
2425
import com.owncloud.android.utils.EspressoIdlingResource
2526
import com.owncloud.android.utils.ScreenshotTest
27+
import kotlinx.coroutines.runBlocking
2628
import org.junit.After
2729
import org.junit.Before
2830
import org.junit.Rule
@@ -165,14 +167,14 @@ internal class SharedListFragmentIT : AbstractIT() {
165167

166168
fragment.isLoading = false
167169
fragment.mEmptyListContainer?.visibility = View.GONE
168-
fragment.adapter.setData(
169-
shares,
170-
SearchType.SHARED_FILTER,
171-
storageManager,
172-
null,
173-
true
174-
)
175170

171+
val newList = runBlocking {
172+
OCShareToOCFileConverter.parseAndSaveShares(shares, storageManager, user.accountName)
173+
}
174+
fragment.adapter.run {
175+
prepareForSearchData(storageManager, SearchType.SHARED_FILTER)
176+
updateAdapter(newList, null)
177+
}
176178
EspressoIdlingResource.decrement()
177179

178180
val screenShotName = createName(testClassName + "_" + "showSharedFiles", "")

app/src/main/java/com/nextcloud/client/database/NextcloudDatabase.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.nextcloud.client.database.dao.FileDao
2121
import com.nextcloud.client.database.dao.FileSystemDao
2222
import com.nextcloud.client.database.dao.OfflineOperationDao
2323
import com.nextcloud.client.database.dao.RecommendedFileDao
24+
import com.nextcloud.client.database.dao.ShareDao
2425
import com.nextcloud.client.database.dao.SyncedFolderDao
2526
import com.nextcloud.client.database.dao.UploadDao
2627
import com.nextcloud.client.database.entity.ArbitraryDataEntity
@@ -106,6 +107,7 @@ abstract class NextcloudDatabase : RoomDatabase() {
106107
abstract fun fileSystemDao(): FileSystemDao
107108
abstract fun syncedFolderDao(): SyncedFolderDao
108109
abstract fun assistantDao(): AssistantDao
110+
abstract fun shareDao(): ShareDao
109111

110112
companion object {
111113
const val FIRST_ROOM_DB_VERSION = 65

app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,15 @@ interface FileDao {
3838
@Query("SELECT * FROM filelist WHERE remote_id = :remoteId AND file_owner = :fileOwner LIMIT 1")
3939
fun getFileByRemoteId(remoteId: String, fileOwner: String): FileEntity?
4040

41+
@Query("SELECT * FROM filelist WHERE remote_id = :remoteId LIMIT 1")
42+
suspend fun getFileByRemoteId(remoteId: String): FileEntity?
43+
4144
@Query("SELECT * FROM filelist WHERE parent = :parentId ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}")
4245
fun getFolderContent(parentId: Long): List<FileEntity>
4346

47+
@Query("SELECT * FROM filelist WHERE parent = :parentId ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}")
48+
suspend fun getFolderContentSuspended(parentId: Long): List<FileEntity>
49+
4450
@Query(
4551
"SELECT * FROM filelist WHERE modified >= :startDate" +
4652
" AND modified < :endDate" +
@@ -111,4 +117,33 @@ interface FileDao {
111117
"""
112118
)
113119
fun searchFilesInFolder(parentId: Long, fileOwner: String, query: String): List<FileEntity>
120+
121+
@Query(
122+
"""
123+
SELECT *
124+
FROM filelist
125+
WHERE file_owner = :accountName
126+
AND (
127+
share_by_link = 1
128+
OR shared_via_users = 1
129+
OR permissions LIKE '%S%'
130+
)
131+
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
132+
"""
133+
)
134+
suspend fun getSharedFiles(accountName: String): List<FileEntity>
135+
136+
@Query(
137+
"""
138+
SELECT *
139+
FROM filelist
140+
WHERE file_owner = :fileOwner
141+
AND favorite = 1
142+
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
143+
"""
144+
)
145+
suspend fun getFavoriteFiles(fileOwner: String): List<FileEntity>
146+
147+
@Query("SELECT remote_id FROM filelist WHERE file_owner = :accountName AND remote_id IS NOT NULL")
148+
fun getAllRemoteIds(accountName: String): List<String>
114149
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.client.database.dao
9+
10+
import androidx.room.Dao
11+
import androidx.room.Insert
12+
import androidx.room.OnConflictStrategy
13+
import androidx.room.Query
14+
import com.nextcloud.client.database.entity.ShareEntity
15+
16+
@Dao
17+
interface ShareDao {
18+
19+
@Insert(onConflict = OnConflictStrategy.REPLACE)
20+
suspend fun insertAll(shares: List<ShareEntity>)
21+
22+
@Query("DELETE FROM ocshares WHERE owner_share = :accountName")
23+
suspend fun clearSharesForAccount(accountName: String)
24+
}

app/src/main/java/com/nextcloud/utils/extensions/FileDataStorageManagerExtensions.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@ package com.nextcloud.utils.extensions
99

1010
import com.owncloud.android.datamodel.FileDataStorageManager
1111
import com.owncloud.android.datamodel.OCFile
12+
import com.owncloud.android.lib.resources.shares.OCShare
13+
import kotlinx.coroutines.Dispatchers
14+
import kotlinx.coroutines.withContext
15+
16+
suspend fun FileDataStorageManager.saveShares(shares: List<OCShare>, accountName: String) {
17+
withContext(Dispatchers.IO) {
18+
val entities = shares.map { share ->
19+
share.toEntity(accountName)
20+
}
21+
22+
shareDao.insertAll(entities)
23+
}
24+
}
1225

1326
fun FileDataStorageManager.searchFilesByName(file: OCFile, accountName: String, query: String): List<OCFile> =
1427
fileDao.searchFilesInFolder(file.fileId, accountName, query).map {

app/src/main/java/com/nextcloud/utils/extensions/OCFileExtensions.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,38 @@ import com.owncloud.android.MainApp
1111
import com.owncloud.android.datamodel.OCFile
1212
import com.owncloud.android.utils.FileStorageUtils
1313

14-
fun List<OCFile>.filterFilenames(): List<OCFile> = distinctBy { it.fileName }
14+
@Suppress("ReturnCount")
15+
fun List<OCFile>.hasSameContentAs(other: List<OCFile>): Boolean {
16+
if (this.size != other.size) return false
17+
18+
if (this === other) return true
19+
20+
for (i in this.indices) {
21+
val a = this[i]
22+
val b = other[i]
23+
24+
if (a != b) return false
25+
if (a.fileId != b.fileId) return false
26+
if (a.etag != b.etag) return false
27+
if (a.modificationTimestamp != b.modificationTimestamp) return false
1528

16-
fun List<OCFile>.filterTempFilter(): List<OCFile> = filterNot { it.isTempFile() }
29+
if (a.fileLength != b.fileLength) return false
30+
if (a.isFavorite != b.isFavorite) return false
31+
32+
if (a.fileName != b.fileName) return false
33+
}
34+
35+
return true
36+
}
37+
38+
fun List<OCFile>.filterFilenames(): List<OCFile> = distinctBy { it.fileName }
1739

1840
fun OCFile.isTempFile(): Boolean {
1941
val context = MainApp.getAppContext()
2042
val appTempPath = FileStorageUtils.getAppTempDirectoryPath(context)
2143
return storagePath?.startsWith(appTempPath) == true
2244
}
2345

24-
fun List<OCFile>.filterHiddenFiles(): List<OCFile> = filterNot { it.isHidden }.distinct()
25-
26-
fun List<OCFile>.filterByMimeType(mimeType: String): List<OCFile> =
27-
filter { it.isFolder || it.mimeType.startsWith(mimeType) }
28-
29-
fun List<OCFile>.limitToPersonalFiles(userId: String): List<OCFile> = filter { file ->
30-
file.ownerId?.let { ownerId ->
31-
ownerId == userId && !file.isSharedWithMe && !file.mounted()
32-
} == true
33-
}
34-
3546
fun OCFile.mediaSize(defaultThumbnailSize: Float): Pair<Int, Int> {
3647
val width = (imageDimension?.width?.toInt() ?: defaultThumbnailSize.toInt())
3748
val height = (imageDimension?.height?.toInt() ?: defaultThumbnailSize.toInt())

app/src/main/java/com/nextcloud/utils/extensions/OCShareExtensions.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,35 @@
77

88
package com.nextcloud.utils.extensions
99

10+
import com.nextcloud.client.database.entity.ShareEntity
1011
import com.owncloud.android.lib.resources.shares.OCShare
1112

1213
fun OCShare.hasFileRequestPermission(): Boolean = (isFolder && shareType?.isPublicOrMail() == true)
1314

1415
fun List<OCShare>.mergeDistinctByToken(other: List<OCShare>): List<OCShare> = (this + other).distinctBy { it.token }
16+
17+
fun OCShare.toEntity(accountName: String): ShareEntity = ShareEntity(
18+
id = remoteId.toInt(), // so that db is not keep updating same files
19+
idRemoteShared = remoteId.toInt(),
20+
path = path,
21+
itemSource = itemSource.toInt(),
22+
fileSource = fileSource.toInt(),
23+
shareType = shareType?.value,
24+
shareWith = shareWith,
25+
permissions = permissions,
26+
sharedDate = sharedDate.toInt(),
27+
expirationDate = expirationDate.toInt(),
28+
token = token,
29+
shareWithDisplayName = sharedWithDisplayName,
30+
isDirectory = if (isFolder) 1 else 0,
31+
userId = userId,
32+
accountOwner = accountName,
33+
isPasswordProtected = if (isPasswordProtected) 1 else 0,
34+
note = note,
35+
hideDownload = if (isHideFileDownload) 1 else 0,
36+
shareLink = shareLink,
37+
shareLabel = label,
38+
attributes = attributes,
39+
downloadLimitLimit = fileDownloadLimit?.limit,
40+
downloadLimitCount = fileDownloadLimit?.count
41+
)

0 commit comments

Comments
 (0)