Skip to content

Commit 0be74af

Browse files
committed
faster filtering
Signed-off-by: alperozturk <[email protected]>
1 parent 28e79b7 commit 0be74af

File tree

6 files changed

+56
-43
lines changed

6 files changed

+56
-43
lines changed

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,8 @@ fun List<OCFile>.hasSameContentAs(other: List<OCFile>): Boolean {
3737

3838
fun List<OCFile>.filterFilenames(): List<OCFile> = distinctBy { it.fileName }
3939

40-
fun List<OCFile>.filterTempFilter(): List<OCFile> = filterNot { it.isTempFile() }
41-
4240
fun OCFile.isTempFile(): Boolean {
4341
val context = MainApp.getAppContext()
4442
val appTempPath = FileStorageUtils.getAppTempDirectoryPath(context)
4543
return storagePath?.startsWith(appTempPath) == true
4644
}
47-
48-
fun List<OCFile>.filterHiddenFiles(): List<OCFile> = filterNot { it.isHidden }.distinct()
49-
50-
fun List<OCFile>.filterByMimeType(mimeType: String): List<OCFile> =
51-
filter { it.isFolder || it.mimeType.startsWith(mimeType) }
52-
53-
fun List<OCFile>.limitToPersonalFiles(userId: String): List<OCFile> = filter { file ->
54-
file.ownerId?.let { ownerId ->
55-
ownerId == userId && !file.isSharedWithMe && !file.mounted()
56-
} == true
57-
}

app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.owncloud.android.ui.activity.ComponentsGetter;
6060
import com.owncloud.android.ui.activity.FileDisplayActivity;
6161
import com.owncloud.android.ui.adapter.helper.OCFileListAdapterHelper;
62+
import com.owncloud.android.ui.fragment.EmptyListState;
6263
import com.owncloud.android.ui.fragment.OCFileListFragment;
6364
import com.owncloud.android.ui.fragment.SearchType;
6465
import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
@@ -859,7 +860,7 @@ public void swapDirectory(
859860
return;
860861
}
861862

862-
ocFileListFragmentInterface.setLoadingEmptyListState();
863+
ocFileListFragmentInterface.setNewEmptyListState(EmptyListState.LOADING);
863864

864865
helper.prepareFileList(directory,
865866
updatedStorageManager,
@@ -895,6 +896,10 @@ public void updateAdapter(List<OCFile> newFiles, OCFile directory) {
895896
searchType = null;
896897

897898
activity.runOnUiThread(this::notifyDataSetChanged);
899+
900+
if (mFiles.isEmpty()) {
901+
ocFileListFragmentInterface.setNewEmptyListState(SearchType.NO_SEARCH);
902+
}
898903
}
899904

900905
public void prepareForSearchData(FileDataStorageManager storageManager, SearchType searchType) {

app/src/main/java/com/owncloud/android/ui/adapter/helper/OCFileListAdapterHelper.kt

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@ package com.owncloud.android.ui.adapter.helper
99

1010
import com.nextcloud.client.database.entity.FileEntity
1111
import com.nextcloud.client.preferences.AppPreferences
12-
import com.nextcloud.utils.extensions.filterByMimeType
1312
import com.nextcloud.utils.extensions.filterFilenames
14-
import com.nextcloud.utils.extensions.filterHiddenFiles
15-
import com.nextcloud.utils.extensions.filterTempFilter
16-
import com.nextcloud.utils.extensions.limitToPersonalFiles
13+
import com.nextcloud.utils.extensions.isTempFile
1714
import com.owncloud.android.MainApp
1815
import com.owncloud.android.R
1916
import com.owncloud.android.datamodel.FileDataStorageManager
@@ -27,6 +24,7 @@ import kotlinx.coroutines.Job
2724
import kotlinx.coroutines.SupervisorJob
2825
import kotlinx.coroutines.launch
2926
import kotlinx.coroutines.withContext
27+
import java.util.ArrayList
3028

3129
class OCFileListAdapterHelper {
3230
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
@@ -43,36 +41,56 @@ class OCFileListAdapterHelper {
4341
onComplete: (List<OCFile>, FileSortOrder) -> Unit
4442
) {
4543
job = scope.launch {
46-
var result = getFolderContent(directory, storageManager, onlyOnDevice)
44+
val showHiddenFiles = preferences.isShowHiddenFilesEnabled()
45+
val hasMimeTypeFilter = limitToMimeType.isNotEmpty()
46+
val isRootAndPersonalOnly = (OCFile.ROOT_PATH == directory.remotePath && MainApp.isOnlyPersonFiles())
47+
val isSharedView = (DrawerActivity.menuItemId == R.id.nav_shared)
48+
val isFavoritesView = (DrawerActivity.menuItemId == R.id.nav_favorites)
49+
50+
val rawResult = getFolderContent(directory, storageManager, onlyOnDevice)
51+
val filtered = ArrayList<OCFile>(rawResult.size)
52+
53+
for (file in rawResult) {
54+
if (!showHiddenFiles && file.isHidden) {
55+
continue
56+
}
4757

48-
if (!preferences.isShowHiddenFilesEnabled()) {
49-
result = result.filterHiddenFiles()
50-
}
58+
if (hasMimeTypeFilter && !(file.isFolder || file.mimeType.startsWith(limitToMimeType))) {
59+
continue
60+
}
5161

52-
if (!limitToMimeType.isEmpty()) {
53-
result = result.filterByMimeType(limitToMimeType)
54-
}
62+
if (isRootAndPersonalOnly) {
63+
val isPersonal = file.ownerId?.let { ownerId ->
64+
ownerId == userId && !file.isSharedWithMe && !file.mounted()
65+
} == true
5566

56-
if (OCFile.ROOT_PATH == directory.remotePath && MainApp.isOnlyPersonFiles()) {
57-
result = result.limitToPersonalFiles(userId)
58-
}
67+
if (!isPersonal) {
68+
continue
69+
}
70+
}
5971

60-
if (DrawerActivity.menuItemId == R.id.nav_shared) {
61-
result = result.filter { it.isShared }
62-
}
72+
if (isSharedView && !file.isShared) {
73+
continue
74+
}
75+
76+
if (isFavoritesView && !file.isFavorite) {
77+
continue
78+
}
79+
80+
if (file.isTempFile()) {
81+
continue
82+
}
6383

64-
if (DrawerActivity.menuItemId == R.id.nav_favorites) {
65-
result = result.filter { it.isFavorite }
84+
filtered.add(file)
6685
}
6786

68-
result = result.filterTempFilter()
69-
result = result.filterFilenames()
70-
result = mergeOCFilesForLivePhoto(result)
71-
result = addOfflineOperations(result, directory.fileId, storageManager)
72-
val (newList, newSortOrder) = sortData(directory, result, preferences)
87+
val afterFilenameFilter = filtered.filterFilenames()
88+
val merged = mergeOCFilesForLivePhoto(afterFilenameFilter)
89+
val finalList = addOfflineOperations(merged, directory.fileId, storageManager)
90+
val (sortedList, sortOrder) = sortData(directory, finalList, preferences)
7391

7492
withContext(Dispatchers.Main) {
75-
onComplete(newList, newSortOrder)
93+
onComplete(sortedList, sortOrder)
7694
}
7795
}
7896
}

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import android.os.Bundle;
2323
import android.os.Handler;
2424
import android.os.Looper;
25+
import android.os.Parcelable;
2526
import android.text.TextUtils;
2627
import android.util.Log;
2728
import android.util.Pair;
@@ -718,8 +719,8 @@ public void onHeaderClicked() {
718719
}
719720

720721
@Override
721-
public void setLoadingEmptyListState() {
722-
setEmptyListMessage(EmptyListState.LOADING);
722+
public void setNewEmptyListState(Parcelable emptyListState) {
723+
setEmptyListMessage(emptyListState);
723724
}
724725

725726
@Override

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ class OCFileListSearchTask(
199199
}
200200

201201
@Suppress("DEPRECATION")
202-
private suspend fun parseAndSaveVirtuals(data: List<Any>, fragment: OCFileListFragment) = withContext(Dispatchers.IO) {
202+
private suspend fun parseAndSaveVirtuals(data: List<Any>, fragment: OCFileListFragment) =
203+
withContext(Dispatchers.IO) {
203204
val fileDataStorageManager = fileDataStorageManager ?: return@withContext
204205
val activity = fragment.activity ?: return@withContext
205206
val now = System.currentTimeMillis()

app/src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package com.owncloud.android.ui.interfaces;
99

10+
import android.os.Parcelable;
1011
import android.view.View;
1112

1213
import com.owncloud.android.datamodel.OCFile;
@@ -36,5 +37,5 @@ public interface OCFileListFragmentInterface {
3637

3738
void onHeaderClicked();
3839

39-
void setLoadingEmptyListState();
40+
void setNewEmptyListState(Parcelable state);
4041
}

0 commit comments

Comments
 (0)