diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index b8c8423226b4..91bff4ac8bee 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import androidx.annotation.NonNull; @@ -67,6 +68,7 @@ public class LocalFileListAdapter extends RecyclerView.Adapter checkedFiles; private ViewThemeUtils viewThemeUtils; private boolean isWithinEncryptedFolder; + private final ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); private static final int VIEWTYPE_ITEM = 0; private static final int VIEWTYPE_FOOTER = 1; @@ -372,7 +374,7 @@ public void swapDirectory(final File directory) { mFiles.clear(); mFilesAll.clear(); - Executors.newSingleThreadExecutor().execute(() -> { + singleThreadExecutor.execute(() -> { // Load first page of folders List firstPage = FileHelper.INSTANCE.listDirectoryEntries(directory, currentOffset, PAGE_SIZE, true); @@ -442,15 +444,25 @@ private void notifyItemRange(List updatedList) { }); } + private final Object filesLock = new Object(); + @SuppressLint("NotifyDataSetChanged") public void setSortOrder(FileSortOrder sortOrder) { localFileListFragmentInterface.setLoading(true); - final Handler uiHandler = new Handler(Looper.getMainLooper()); - Executors.newSingleThreadExecutor().execute(() -> { - preferences.setSortOrder(FileSortOrder.Type.localFileListView, sortOrder); - mFiles = sortOrder.sortLocalFiles(mFiles); + singleThreadExecutor.execute(() -> { + List sortedCopy; + synchronized (filesLock) { + sortedCopy = new ArrayList<>(mFiles); + } + + sortedCopy = sortOrder.sortLocalFiles(sortedCopy); - uiHandler.post(() -> { + List finalSortedCopy = sortedCopy; + new Handler(Looper.getMainLooper()).post(() -> { + synchronized (filesLock) { + mFiles = finalSortedCopy; + mFilesAll = new ArrayList<>(finalSortedCopy); + } notifyDataSetChanged(); localFileListFragmentInterface.setLoading(false); }); @@ -591,4 +603,8 @@ public void setFiles(List newFiles) { notifyDataSetChanged(); localFileListFragmentInterface.setLoading(false); } + + public void cleanup() { + singleThreadExecutor.shutdown(); + } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java index ba732d1b788a..26b3f8de3d6a 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -425,4 +425,10 @@ public interface ContainerActivity { public void setupStoragePermissionWarningBanner() { mAdapter.notifyDataSetChanged(); } + + @Override + public void onDestroyView() { + mAdapter.cleanup(); + super.onDestroyView(); + } }