Skip to content

Commit 5a22bf6

Browse files
Merge pull request #17018 from nextcloud/fix/oc-file-list-favorite-refresh
fix(oc-file-list): favorite refresh
2 parents 2b49e12 + 30e8fce commit 5a22bf6

10 files changed

Lines changed: 379 additions & 240 deletions

File tree

app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.nextcloud.appReview.AppReviewShownModel;
1414
import com.nextcloud.client.jobs.LogEntry;
1515
import com.owncloud.android.datamodel.OCFile;
16+
import com.owncloud.android.ui.fragment.FolderLayout;
1617
import com.owncloud.android.utils.FileSortOrder;
1718

1819
import java.util.List;
@@ -131,19 +132,19 @@ default void onDarkThemeModeChanged(DarkMode mode) {
131132
/**
132133
* Get preferred folder display type.
133134
*
134-
* @param folder Folder
135+
* @param layout FolderLayout
135136
* @return preference value, default is
136137
* {@link com.owncloud.android.ui.fragment.OCFileListFragment#FOLDER_LAYOUT_LIST}
137138
*/
138-
String getFolderLayout(OCFile folder);
139+
String getFolderLayout(FolderLayout layout);
139140

140141
/**
141142
* Set preferred folder display type.
142143
*
143-
* @param folder Folder which layout is being set or null for root folder
144+
* @param layout FolderLayout which layout is being set
144145
* @param layoutName preference value
145146
*/
146-
void setFolderLayout(@Nullable OCFile folder, String layoutName);
147+
void setFolderLayout(@NonNull FolderLayout layout, String layoutName);
147148

148149
/**
149150
* Saves the path where the user selected to do the last upload of a file shared from other app.

app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.owncloud.android.datamodel.OCFile;
2929
import com.owncloud.android.ui.activity.PassCodeActivity;
3030
import com.owncloud.android.ui.activity.SettingsActivity;
31+
import com.owncloud.android.ui.fragment.FolderLayout;
3132
import com.owncloud.android.utils.FileSortOrder;
3233

3334
import java.lang.reflect.Type;
@@ -82,7 +83,6 @@ public final class AppPreferencesImpl implements AppPreferences {
8283
private static final String PREF__AUTO_UPLOAD_SPLIT_OUT = "autoUploadEntriesSplitOut";
8384
private static final String PREF__AUTO_UPLOAD_INIT = "autoUploadInit";
8485
private static final String PREF__FOLDER_SORT_ORDER = "folder_sort_order";
85-
private static final String PREF__FOLDER_LAYOUT = "folder_layout";
8686

8787
private static final String PREF__LOCK_TIMESTAMP = "lock_timestamp";
8888
private static final String PREF__SHOW_MEDIA_SCAN_NOTIFICATIONS = "show_media_scan_notifications";
@@ -336,21 +336,39 @@ public String[] getPassCode() {
336336
}
337337

338338
@Override
339-
public String getFolderLayout(OCFile folder) {
340-
return getFolderPreference(context,
341-
userAccountManager.getUser(),
342-
PREF__FOLDER_LAYOUT,
343-
folder,
344-
FOLDER_LAYOUT_LIST);
339+
public String getFolderLayout(FolderLayout layout) {
340+
if (layout instanceof FolderLayout.Child child) {
341+
// keep existing logic for child directories
342+
return getFolderPreference(context,
343+
userAccountManager.getUser(),
344+
layout.getKey(),
345+
child.getFolder(),
346+
FOLDER_LAYOUT_LIST);
347+
} else {
348+
User user = userAccountManager.getUser();
349+
if (user.isAnonymous()) {
350+
return FOLDER_LAYOUT_LIST;
351+
}
352+
353+
return preferences.getString(layout.getPrefKey(user), FOLDER_LAYOUT_LIST);
354+
}
345355
}
346356

347357
@Override
348-
public void setFolderLayout(@Nullable OCFile folder, String layoutName) {
349-
setFolderPreference(context,
350-
userAccountManager.getUser(),
351-
PREF__FOLDER_LAYOUT,
352-
folder,
353-
layoutName);
358+
public void setFolderLayout(@NonNull FolderLayout layout, String layoutName) {
359+
if (layout instanceof FolderLayout.Child child) {
360+
setFolderPreference(context,
361+
userAccountManager.getUser(),
362+
child.getKey(),
363+
child.getFolder(),
364+
layoutName);
365+
return;
366+
}
367+
368+
// only use new way for root shared, favorite and all files
369+
preferences.edit()
370+
.putString(layout.getPrefKey(userAccountManager.getUser()), layoutName)
371+
.apply();
354372
}
355373

356374
@Override

app/src/main/java/com/owncloud/android/operations/RenameFileOperation.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ protected RemoteOperationResult run(OwnCloudClient client) {
9191
if (result.isSuccess()) {
9292
if (file.isFolder()) {
9393
getStorageManager().moveLocalFile(file, newRemotePath, parent);
94-
//saveLocalDirectory();
95-
94+
file.setFileName(newName);
95+
if (!file.isEncrypted()) {
96+
file.setDecryptedRemotePath(newRemotePath);
97+
}
9698
} else {
9799
saveLocalFile(newRemotePath);
98100
}

app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 85 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,6 +1692,10 @@ class FileDisplayActivity :
16921692
it.setEmptyListMessage(EmptyListState.ONLY_ON_DEVICE)
16931693
}
16941694

1695+
it.searchEvent?.searchType == SearchRemoteOperation.SearchType.FAVORITE_SEARCH -> {
1696+
it.setEmptyListMessage(SearchType.FAVORITE_SEARCH)
1697+
}
1698+
16951699
else -> it.setEmptyListMessage(SearchType.NO_SEARCH)
16961700
}
16971701
}
@@ -2175,41 +2179,39 @@ class FileDisplayActivity :
21752179
*/
21762180
private fun onRemoveFileOperationFinish(operation: RemoveFileOperation, result: RemoteOperationResult<*>) {
21772181
deleteBatchTracker.onSingleDeleteFinished()
2182+
if (!result.isSuccess && result.isSslRecoverableException) {
2183+
mLastSslUntrustedServerResult = result
2184+
showUntrustedCertDialog(mLastSslUntrustedServerResult)
2185+
return
2186+
}
21782187

2179-
if (result.isSuccess) {
2180-
val removedFile = operation.file
2181-
tryStopPlaying(removedFile)
2182-
val leftFragment = this.leftFragment
2188+
if (!result.isSuccess) {
2189+
Log_OC.e(TAG, "deletion failed")
2190+
return
2191+
}
21832192

2184-
// check if file is still available, if so do nothing
2185-
val fileAvailable = storageManager.fileExists(removedFile.fileId)
2186-
if (leftFragment is FileFragment && !fileAvailable && removedFile == leftFragment.file) {
2187-
file = storageManager.getFileById(removedFile.parentId)
2188-
resetScrollingAndUpdateActionBar()
2189-
}
2190-
val parentFile = storageManager.getFileById(removedFile.parentId)
2191-
if (parentFile != null && parentFile == getCurrentDir()) {
2192-
updateListOfFilesFragment()
2193-
} else if (leftFragment is OCFileListFragment &&
2194-
SearchRemoteOperation.SearchType.FAVORITE_SEARCH == leftFragment.searchEvent?.searchType
2195-
) {
2196-
leftFragment.adapter?.run {
2197-
val file = files.find { it.fileId == removedFile.fileId }
2198-
if (file != null) {
2199-
val pos = getItemPosition(file)
2200-
files.remove(file)
2201-
notifyItemRemoved(pos)
2202-
}
2203-
}
2204-
}
2205-
supportInvalidateOptionsMenu()
2206-
fetchRecommendedFilesIfNeeded(ignoreETag = true, currentDir)
2207-
} else {
2208-
if (result.isSslRecoverableException) {
2209-
mLastSslUntrustedServerResult = result
2210-
showUntrustedCertDialog(mLastSslUntrustedServerResult)
2193+
val removedFile = operation.file
2194+
tryStopPlaying(removedFile)
2195+
val leftFragment = this.leftFragment
2196+
2197+
// check if file is still available, if so do nothing
2198+
val fileAvailable = storageManager.fileExists(removedFile.fileId)
2199+
if (leftFragment is FileFragment && !fileAvailable && removedFile == leftFragment.file) {
2200+
file = storageManager.getFileById(removedFile.parentId)
2201+
resetScrollingAndUpdateActionBar()
2202+
}
2203+
2204+
if (leftFragment is OCFileListFragment) {
2205+
leftFragment.adapter?.removeFile(removedFile)
2206+
2207+
if (leftFragment.adapter?.isEmpty == true) {
2208+
val emptyState = leftFragment.searchEvent?.toSearchType() ?: SearchType.NO_SEARCH
2209+
leftFragment.setEmptyListMessage(emptyState)
22112210
}
22122211
}
2212+
2213+
supportInvalidateOptionsMenu()
2214+
fetchRecommendedFilesIfNeeded(ignoreETag = true, currentDir)
22132215
}
22142216

22152217
override fun onAutoUploadFolderRemoved(
@@ -2353,38 +2355,7 @@ class FileDisplayActivity :
23532355
private fun onRenameFileOperationFinish(operation: RenameFileOperation, result: RemoteOperationResult<*>) {
23542356
val optionalUser = user
23552357
val renamedFile = operation.file
2356-
if (result.isSuccess && optionalUser.isPresent) {
2357-
val currentUser = optionalUser.get()
2358-
val leftFragment = this.leftFragment
2359-
if (leftFragment is FileFragment) {
2360-
if (leftFragment is FileDetailFragment && renamedFile == leftFragment.file) {
2361-
leftFragment.updateFileDetails(renamedFile, currentUser)
2362-
showDetails(renamedFile)
2363-
} else if (leftFragment is PreviewMediaFragment && renamedFile == leftFragment.file) {
2364-
leftFragment.updateFile(renamedFile)
2365-
if (PreviewMediaFragment.canBePreviewed(renamedFile)) {
2366-
val position = leftFragment.position
2367-
startMediaPreview(renamedFile, position, true, true, true, false)
2368-
} else {
2369-
fileOperationsHelper.openFile(renamedFile)
2370-
}
2371-
} else if (leftFragment is PreviewTextFragment && renamedFile == leftFragment.file) {
2372-
(leftFragment as PreviewTextFileFragment).updateFile(renamedFile)
2373-
if (PreviewTextFileFragment.canBePreviewed(renamedFile)) {
2374-
startTextPreview(renamedFile, true)
2375-
} else {
2376-
fileOperationsHelper.openFile(renamedFile)
2377-
}
2378-
}
2379-
}
2380-
2381-
val file = storageManager.getFileById(renamedFile.parentId)
2382-
if (file != null && file == getCurrentDir()) {
2383-
updateListOfFilesFragment()
2384-
}
2385-
refreshGalleryFragmentIfNeeded()
2386-
fetchRecommendedFilesIfNeeded(ignoreETag = true, currentDir)
2387-
} else {
2358+
if (!result.isSuccess || optionalUser.isEmpty) {
23882359
DisplayUtils.showSnackMessage(
23892360
this,
23902361
ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())
@@ -2394,6 +2365,57 @@ class FileDisplayActivity :
23942365
mLastSslUntrustedServerResult = result
23952366
showUntrustedCertDialog(mLastSslUntrustedServerResult)
23962367
}
2368+
return
2369+
}
2370+
2371+
val currentUser = optionalUser.get()
2372+
val leftFragment = this.leftFragment
2373+
if (leftFragment is FileFragment) {
2374+
onRenameFileOperationFinishForFileFragment(leftFragment, renamedFile, currentUser)
2375+
}
2376+
2377+
val file = storageManager.getFileById(renamedFile.parentId)
2378+
if (file != null && file == getCurrentDir()) {
2379+
fileListFragment?.adapter?.updateFile(renamedFile)
2380+
}
2381+
2382+
refreshGalleryFragmentIfNeeded()
2383+
fetchRecommendedFilesIfNeeded(ignoreETag = true, currentDir)
2384+
}
2385+
2386+
private fun onRenameFileOperationFinishForFileFragment(fragment: FileFragment, ocFile: OCFile, user: User) {
2387+
if (fragment.file != ocFile) return
2388+
2389+
when (fragment) {
2390+
is FileDetailFragment -> {
2391+
fragment.updateFileDetails(ocFile, user)
2392+
showDetails(ocFile)
2393+
}
2394+
2395+
is PreviewMediaFragment -> {
2396+
fragment.updateFile(ocFile)
2397+
if (PreviewMediaFragment.canBePreviewed(ocFile)) {
2398+
startMediaPreview(
2399+
ocFile,
2400+
fragment.position,
2401+
true,
2402+
true,
2403+
true,
2404+
false
2405+
)
2406+
} else {
2407+
fileOperationsHelper.openFile(ocFile)
2408+
}
2409+
}
2410+
2411+
is PreviewTextFileFragment -> {
2412+
fragment.updateFile(ocFile)
2413+
if (PreviewTextFileFragment.canBePreviewed(ocFile)) {
2414+
startTextPreview(ocFile, true)
2415+
} else {
2416+
fileOperationsHelper.openFile(ocFile)
2417+
}
2418+
}
23972419
}
23982420
}
23992421

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

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import java.util.Locale;
8282
import java.util.Set;
8383
import java.util.UUID;
84+
import java.util.stream.IntStream;
8485

8586
import androidx.annotation.NonNull;
8687
import androidx.annotation.Nullable;
@@ -875,7 +876,9 @@ public void swapDirectory(
875876
public void updateAdapter(List<OCFile> newFiles, OCFile directory) {
876877
Log_OC.d(TAG, "updating the adapter");
877878

878-
mFiles = new ArrayList<>(newFiles);
879+
mFiles.clear();
880+
mFiles.addAll(newFiles);
881+
879882
mFilesAll.clear();
880883
mFilesAll.addAll(mFiles);
881884

@@ -982,12 +985,6 @@ public void insertFile(@Nullable OCFile file) {
982985
}
983986
}
984987

985-
public void addVirtualFile(@NonNull OCFile file) {
986-
if (mFiles.isEmpty() || !mFiles.contains(file)) {
987-
mFiles.add(file);
988-
}
989-
}
990-
991988
@Override
992989
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
993990
super.onViewRecycled(holder);
@@ -1112,4 +1109,67 @@ public void removeAllFiles() {
11121109
mFilesAll.clear();
11131110
notifyDataSetChanged();
11141111
}
1112+
1113+
@SuppressLint("NotifyDataSetChanged")
1114+
public void removeFile(@NonNull OCFile file) {
1115+
int position = getItemPosition(file);
1116+
1117+
mFiles.remove(file);
1118+
mFilesAll.remove(file);
1119+
1120+
if (position != -1) {
1121+
notifyItemRemoved(position);
1122+
} else {
1123+
notifyDataSetChanged();
1124+
}
1125+
}
1126+
1127+
@SuppressLint("NotifyDataSetChanged")
1128+
public void updateFile(@NonNull OCFile updatedFile) {
1129+
long fileId = updatedFile.getFileId();
1130+
1131+
IntStream.range(0, mFilesAll.size())
1132+
.filter(i -> mFilesAll.get(i).getFileId() == fileId)
1133+
.findFirst()
1134+
.ifPresent(i -> mFilesAll.set(i, updatedFile));
1135+
1136+
int oldIndex = IntStream.range(0, mFiles.size())
1137+
.filter(i -> mFiles.get(i).getFileId() == fileId)
1138+
.findFirst()
1139+
.orElse(-1);
1140+
if (oldIndex == -1) return;
1141+
1142+
mFiles.remove(oldIndex);
1143+
mFiles.add(updatedFile);
1144+
1145+
FileSortOrder currentSortOrder = preferences.getSortOrderByFolder(currentDirectory);
1146+
if (searchType == SearchType.SHARED_FILTER) {
1147+
mFiles.sort((o1, o2) -> Long.compare(o2.getFirstShareTimestamp(), o1.getFirstShareTimestamp()));
1148+
} else {
1149+
boolean foldersBeforeFiles = preferences.isSortFoldersBeforeFiles();
1150+
boolean favoritesFirst = preferences.isSortFavoritesFirst();
1151+
mFiles = currentSortOrder.sortCloudFiles(mFiles, foldersBeforeFiles, favoritesFirst);
1152+
}
1153+
1154+
int newIndex = mFiles.indexOf(updatedFile);
1155+
if (newIndex == -1) {
1156+
notifyDataSetChanged();
1157+
return;
1158+
}
1159+
1160+
int headerOffset = shouldShowHeader() ? 1 : 0;
1161+
int oldAdapterPos = oldIndex + headerOffset;
1162+
int newAdapterPos = newIndex + headerOffset;
1163+
1164+
if (oldAdapterPos != newAdapterPos) {
1165+
notifyItemMoved(oldAdapterPos, newAdapterPos);
1166+
}
1167+
notifyItemChanged(newAdapterPos);
1168+
1169+
if (shouldShowRecommendedFiles() && recommendedFilesAdapter != null && updatedFile.isRecommendedFile()) {
1170+
int pos = recommendedFilesAdapter.getItemPosition(updatedFile);
1171+
if (pos != -1) recommendedFilesAdapter.notifyItemChanged(pos);
1172+
}
1173+
}
1174+
11151175
}

0 commit comments

Comments
 (0)