From 1b63b2b8b36fa0920d8d440a428343cbbd53dc14 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 15 Dec 2021 14:21:47 +0100 Subject: [PATCH 1/5] First approach of sort list done. --- .../adapters/filelist/FileListAdapter.kt | 26 +++++- .../ui/files/filelist/MainFileListFragment.kt | 47 +++++++++-- .../ui/activity/FileDisplayActivity.kt | 11 ++- .../res/layout/main_file_list_fragment.xml | 84 +++++++++++++------ 4 files changed, 136 insertions(+), 32 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt index 4c9b9e5e723..79c77caf2b8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt @@ -32,11 +32,13 @@ import androidx.recyclerview.widget.RecyclerView import com.owncloud.android.R import com.owncloud.android.databinding.ItemFileListBinding import com.owncloud.android.databinding.ListFooterBinding +import com.owncloud.android.db.PreferenceManager import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.domain.files.model.OCFooterFile import com.owncloud.android.extensions.setPicture import com.owncloud.android.presentation.diffutils.FileListDiffCallback import com.owncloud.android.utils.DisplayUtils +import com.owncloud.android.utils.FileStorageUtils import com.owncloud.android.utils.MimetypeIconUtil class FileListAdapter( @@ -45,23 +47,43 @@ class FileListAdapter( private val listener: FileListAdapterListener, ) : RecyclerView.Adapter() { - private val files = mutableListOf() + private var files = mutableListOf() + private var filesToSort = listOf() private lateinit var viewHolder: RecyclerView.ViewHolder private val TYPE_ITEMS = 0 private val TYPE_FOOTER = 1 - fun updateFileList(filesToAdd: List) { + fun updateFileList(filesToAdd: List, sortTypeSelected: Int? = null) { val diffUtilCallback = FileListDiffCallback(oldList = files, newList = filesToAdd) val diffResult = DiffUtil.calculateDiff(diffUtilCallback) + filesToSort = filesToAdd files.clear() files.addAll(filesToAdd) + if (filesToAdd.isNotEmpty()) { files.add(OCFooterFile(manageListOfFilesAndGenerateText(filesToAdd))) } + + diffResult.dispatchUpdatesTo(this) } + fun setSortOrder(order: Int, ascending: Boolean) { + PreferenceManager.setSortOrder(order, context, FileStorageUtils.FILE_DISPLAY_SORT) + PreferenceManager.setSortAscending(ascending, context, FileStorageUtils.FILE_DISPLAY_SORT) + + FileStorageUtils.mSortOrderFileDisp = order + FileStorageUtils.mSortAscendingFileDisp = ascending + + val sortedFiles = FileStorageUtils.sortFolder( + filesToSort, FileStorageUtils.mSortOrderFileDisp, + FileStorageUtils.mSortAscendingFileDisp + ) + + updateFileList(sortedFiles) + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { when (viewType) { TYPE_ITEMS -> { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt index 45a947db9ee..98bac434056 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt @@ -33,10 +33,18 @@ import com.owncloud.android.extensions.cancel import com.owncloud.android.presentation.adapters.filelist.FileListAdapter import com.owncloud.android.presentation.observers.EmptyDataObserver import com.owncloud.android.presentation.onSuccess +import com.owncloud.android.presentation.ui.files.SortBottomSheetFragment +import com.owncloud.android.presentation.ui.files.SortBottomSheetFragment.Companion.newInstance +import com.owncloud.android.presentation.ui.files.SortBottomSheetFragment.SortDialogListener +import com.owncloud.android.presentation.ui.files.SortOptionsView +import com.owncloud.android.presentation.ui.files.SortOrder +import com.owncloud.android.presentation.ui.files.SortType +import com.owncloud.android.presentation.ui.files.ViewType import com.owncloud.android.ui.activity.FileListOption +import com.owncloud.android.utils.FileStorageUtils import org.koin.androidx.viewmodel.ext.android.viewModel -class MainFileListFragment : Fragment() { +class MainFileListFragment : Fragment(), SortOptionsView.SortOptionsListener, SortDialogListener { private val mainFileListViewModel by viewModel() @@ -80,6 +88,9 @@ class MainFileListFragment : Fragment() { // Set Swipe to refresh and its listener binding.swipeRefreshMainFileList.setOnRefreshListener { mainFileListViewModel.refreshDirectory() } + + //Set SortOptions and its listener + binding.optionsLayout.onSortOptionsListener = this } private fun subscribeToViewModels() { @@ -119,6 +130,32 @@ class MainFileListFragment : Fragment() { fileListAdapter.registerAdapterDataObserver(emptyDataObserver) } + override fun onSortTypeListener(sortType: SortType, sortOrder: SortOrder) { + val sortBottomSheetFragment = newInstance(sortType, sortOrder) + sortBottomSheetFragment.sortDialogListener = this + sortBottomSheetFragment.show(childFragmentManager, SortBottomSheetFragment.TAG) + } + + override fun onViewTypeListener(viewType: ViewType) { + //TODO("Not yet implemented") + } + + override fun onSortSelected(sortType: SortType) { + binding.optionsLayout.sortTypeSelected = sortType + + val isAscending = binding.optionsLayout.sortOrderSelected == SortOrder.SORT_ORDER_ASCENDING + + when (sortType) { + SortType.SORT_TYPE_BY_NAME -> sortAdapterBy(FileStorageUtils.SORT_NAME, isAscending) + SortType.SORT_TYPE_BY_DATE -> sortAdapterBy(FileStorageUtils.SORT_DATE, isAscending) + SortType.SORT_TYPE_BY_SIZE -> sortAdapterBy(FileStorageUtils.SORT_SIZE, isAscending) + } + } + + private fun sortAdapterBy(sortType: Int, isDescending: Boolean) { + fileListAdapter.setSortOrder(order = sortType, ascending = isDescending) + } + override fun onDestroy() { super.onDestroy() _binding = null @@ -131,10 +168,10 @@ class MainFileListFragment : Fragment() { } fun updateFileListOption(newFileListOption: FileListOption) { - when(newFileListOption) { - FileListOption.ALL_FILES -> mainFileListViewModel.listCurrentDirectory() - FileListOption.AV_OFFLINE -> mainFileListViewModel.getAvailableOfflineFilesList() - FileListOption.SHARED_BY_LINK -> mainFileListViewModel.getSharedByLinkFilesList() + when (newFileListOption) { + FileListOption.ALL_FILES -> mainFileListViewModel.listCurrentDirectory() + FileListOption.AV_OFFLINE -> mainFileListViewModel.getAvailableOfflineFilesList() + FileListOption.SHARED_BY_LINK -> mainFileListViewModel.getSharedByLinkFilesList() } // TODO Manage FAB button diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 3329c5cdeb7..92d87be8ea6 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -155,6 +155,9 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private val secondFragment: FileFragment? get() = supportFragmentManager.findFragmentByTag(TAG_SECOND_FRAGMENT) as FileFragment? + private val testFragment: MainFileListFragment? + get() = supportFragmentManager.findFragmentByTag(TAG_TEST_FRAGMENT) as MainFileListFragment? + private val isFabOpen: Boolean get() = listOfFilesFragment?.fabMain?.isExpanded ?: false @@ -348,9 +351,12 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn val list = MainFileListFragment.newInstance(justFolders = false) - val transaction = supportFragmentManager.beginTransaction() transaction.add(R.id.left_fragment_container, list, TAG_LIST_OF_FILES_BIS) + + val listOfFiles = OCFileListFragment.newInstance(false, fileListOption, false, false, true) + listOfFiles.setSearchListener(findViewById(R.id.root_toolbar_search_view)) + transaction.commit() } @@ -477,9 +483,11 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } fun refreshListOfFilesFragment(reloadData: Boolean) { + /*val fileListFragment = listOfFilesFragment fileListFragment?.listDirectory(reloadData)*/ val fileListFragment = listMainFileFragment + fileListFragment?.listDirectory(file) } @@ -1659,6 +1667,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private const val TAG_LIST_OF_FILES_BIS = "TAG_LIST_OF_FILES_BIS" private const val TAG_LIST_OF_FILES = "LIST_OF_FILES" private const val TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT" + private const val TAG_TEST_FRAGMENT = "TAG_TEST_FRAGMENT" private const val KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW" private const val KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS" diff --git a/owncloudApp/src/main/res/layout/main_file_list_fragment.xml b/owncloudApp/src/main/res/layout/main_file_list_fragment.xml index 588c94abbf9..947570d58d2 100644 --- a/owncloudApp/src/main/res/layout/main_file_list_fragment.xml +++ b/owncloudApp/src/main/res/layout/main_file_list_fragment.xml @@ -18,39 +18,75 @@ ~ --> - + android:filterTouchesWhenObscured="true"> - - - + + + + + + + + + android:layout_marginTop="@dimen/file_list_progress_bar_height" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/options_layout"> - + - + + + - + + From 70d74c60e35f322c91f0868ac5caeaf1a5827730 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 15 Dec 2021 16:55:51 +0100 Subject: [PATCH 2/5] Added create folder listener to options layout. --- .../ui/files/filelist/MainFileListFragment.kt | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt index 98bac434056..9757bbc9e86 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt @@ -44,7 +44,7 @@ import com.owncloud.android.ui.activity.FileListOption import com.owncloud.android.utils.FileStorageUtils import org.koin.androidx.viewmodel.ext.android.viewModel -class MainFileListFragment : Fragment(), SortOptionsView.SortOptionsListener, SortDialogListener { +class MainFileListFragment : Fragment(), SortDialogListener, SortOptionsView.SortOptionsListener, SortOptionsView.CreateFolderListener { private val mainFileListViewModel by viewModel() @@ -89,8 +89,14 @@ class MainFileListFragment : Fragment(), SortOptionsView.SortOptionsListener, So // Set Swipe to refresh and its listener binding.swipeRefreshMainFileList.setOnRefreshListener { mainFileListViewModel.refreshDirectory() } - //Set SortOptions and its listener - binding.optionsLayout.onSortOptionsListener = this + //Set SortOptions and its listeners + binding.optionsLayout.let { + it.onSortOptionsListener = this + if (isPickingAFolder()) { + it.onCreateFolderListener = this + it.selectAdditionalView(SortOptionsView.AdditionalView.CREATE_FOLDER) + } + } } private fun subscribeToViewModels() { @@ -156,6 +162,11 @@ class MainFileListFragment : Fragment(), SortOptionsView.SortOptionsListener, So fileListAdapter.setSortOrder(order = sortType, ascending = isDescending) } + fun isPickingAFolder(): Boolean { + val args = arguments + return args != null && args.getBoolean(ARG_PICKING_A_FOLDER, false) + } + override fun onDestroy() { super.onDestroy() _binding = null @@ -178,15 +189,22 @@ class MainFileListFragment : Fragment(), SortOptionsView.SortOptionsListener, So } companion object { - val ARG_JUST_FOLDERS = MainFileListFragment::class.java.canonicalName + ".JUST_FOLDERS" + val ARG_JUST_FOLDERS = "${MainFileListFragment::class.java.canonicalName}.JUST_FOLDERS" + val ARG_PICKING_A_FOLDER = "${MainFileListFragment::class.java.canonicalName}.ARG_PICKING_A_FOLDER}" fun newInstance( - justFolders: Boolean + justFolders: Boolean, + pickingAFolder: Boolean = false ): MainFileListFragment { val args = Bundle() args.putBoolean(ARG_JUST_FOLDERS, justFolders) + args.putBoolean(ARG_PICKING_A_FOLDER, pickingAFolder) return MainFileListFragment().apply { arguments = args } } } + + override fun onCreateFolderListener() { + //TODO("Not yet implemented") + } } From 833f3db2f8e8848a40c9ea534d892c3c9454bf12 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Thu, 16 Dec 2021 09:02:38 +0100 Subject: [PATCH 3/5] Coded refactored. --- .../android/presentation/adapters/filelist/FileListAdapter.kt | 2 +- .../presentation/ui/files/filelist/MainFileListFragment.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt index 79c77caf2b8..991c95b07e6 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt @@ -54,7 +54,7 @@ class FileListAdapter( private val TYPE_ITEMS = 0 private val TYPE_FOOTER = 1 - fun updateFileList(filesToAdd: List, sortTypeSelected: Int? = null) { + fun updateFileList(filesToAdd: List) { val diffUtilCallback = FileListDiffCallback(oldList = files, newList = filesToAdd) val diffResult = DiffUtil.calculateDiff(diffUtilCallback) filesToSort = filesToAdd diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt index 9757bbc9e86..ef11f27b61f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt @@ -162,7 +162,7 @@ class MainFileListFragment : Fragment(), SortDialogListener, SortOptionsView.Sor fileListAdapter.setSortOrder(order = sortType, ascending = isDescending) } - fun isPickingAFolder(): Boolean { + private fun isPickingAFolder(): Boolean { val args = arguments return args != null && args.getBoolean(ARG_PICKING_A_FOLDER, false) } From aae52c86708a3f779b52bc8a50ba277accb9fd81 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Thu, 16 Dec 2021 09:20:32 +0100 Subject: [PATCH 4/5] Init added with default sort option. --- .../adapters/filelist/FileListAdapter.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt index 991c95b07e6..3ecbf8b3c3a 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt @@ -47,6 +47,18 @@ class FileListAdapter( private val listener: FileListAdapterListener, ) : RecyclerView.Adapter() { + init { + // Read sorting order, default to sort by name ascending + FileStorageUtils.mSortOrderFileDisp = PreferenceManager.getSortOrder( + context, + FileStorageUtils.FILE_DISPLAY_SORT + ) + FileStorageUtils.mSortAscendingFileDisp = PreferenceManager.getSortAscending( + context, + FileStorageUtils.FILE_DISPLAY_SORT + ) + } + private var files = mutableListOf() private var filesToSort = listOf() private lateinit var viewHolder: RecyclerView.ViewHolder From 53269aa86f76fdaf5b6d45229e8cd0605799c338 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Thu, 16 Dec 2021 12:46:32 +0100 Subject: [PATCH 5/5] Sort by when user refresh done. --- .../dependecyinjection/ViewModelModule.kt | 2 +- .../adapters/filelist/FileListAdapter.kt | 29 --------------- .../ui/files/filelist/MainFileListFragment.kt | 13 ++++++- .../files/filelist/MainFileListViewModel.kt | 19 ++++++++-- .../ui/activity/FileDisplayActivity.kt | 36 +++++-------------- 5 files changed, 37 insertions(+), 62 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt b/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt index 9d3afc7d760..21a89956871 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/ViewModelModule.kt @@ -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(), get(), get()) } + viewModel { MainFileListViewModel(get(), get(), get(), get(), get(), get()) } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt index 3ecbf8b3c3a..33e10d79812 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/adapters/filelist/FileListAdapter.kt @@ -47,20 +47,8 @@ class FileListAdapter( private val listener: FileListAdapterListener, ) : RecyclerView.Adapter() { - init { - // Read sorting order, default to sort by name ascending - FileStorageUtils.mSortOrderFileDisp = PreferenceManager.getSortOrder( - context, - FileStorageUtils.FILE_DISPLAY_SORT - ) - FileStorageUtils.mSortAscendingFileDisp = PreferenceManager.getSortAscending( - context, - FileStorageUtils.FILE_DISPLAY_SORT - ) - } private var files = mutableListOf() - private var filesToSort = listOf() private lateinit var viewHolder: RecyclerView.ViewHolder private val TYPE_ITEMS = 0 @@ -69,7 +57,6 @@ class FileListAdapter( fun updateFileList(filesToAdd: List) { val diffUtilCallback = FileListDiffCallback(oldList = files, newList = filesToAdd) val diffResult = DiffUtil.calculateDiff(diffUtilCallback) - filesToSort = filesToAdd files.clear() files.addAll(filesToAdd) @@ -77,25 +64,9 @@ class FileListAdapter( files.add(OCFooterFile(manageListOfFilesAndGenerateText(filesToAdd))) } - diffResult.dispatchUpdatesTo(this) } - fun setSortOrder(order: Int, ascending: Boolean) { - PreferenceManager.setSortOrder(order, context, FileStorageUtils.FILE_DISPLAY_SORT) - PreferenceManager.setSortAscending(ascending, context, FileStorageUtils.FILE_DISPLAY_SORT) - - FileStorageUtils.mSortOrderFileDisp = order - FileStorageUtils.mSortAscendingFileDisp = ascending - - val sortedFiles = FileStorageUtils.sortFolder( - filesToSort, FileStorageUtils.mSortOrderFileDisp, - FileStorageUtils.mSortAscendingFileDisp - ) - - updateFileList(sortedFiles) - } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { when (viewType) { TYPE_ITEMS -> { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt index ef11f27b61f..6182a6a87ed 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListFragment.kt @@ -27,6 +27,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import com.owncloud.android.databinding.MainFileListFragmentBinding +import com.owncloud.android.db.PreferenceManager import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.domain.utils.Event import com.owncloud.android.extensions.cancel @@ -52,6 +53,7 @@ class MainFileListFragment : Fragment(), SortDialogListener, SortOptionsView.Sor private val binding get() = _binding!! private lateinit var fileListAdapter: FileListAdapter + private lateinit var files: List override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -104,6 +106,11 @@ class MainFileListFragment : Fragment(), SortDialogListener, SortOptionsView.Sor mainFileListViewModel.getFilesListStatusLiveData.observe(viewLifecycleOwner, Event.EventObserver { it.onSuccess { data -> updateFileListData(files = data ?: emptyList()) + files = data ?: emptyList() + val sortedFiles = mainFileListViewModel.sortList(files) + fileListAdapter.updateFileList(filesToAdd = sortedFiles) + registerListAdapterDataObserver() + binding.swipeRefreshMainFileList.cancel() } }) @@ -159,7 +166,11 @@ class MainFileListFragment : Fragment(), SortDialogListener, SortOptionsView.Sor } private fun sortAdapterBy(sortType: Int, isDescending: Boolean) { - fileListAdapter.setSortOrder(order = sortType, ascending = isDescending) + PreferenceManager.setSortOrder(sortType, requireContext(), FileStorageUtils.FILE_DISPLAY_SORT) + PreferenceManager.setSortAscending(isDescending, requireContext(), FileStorageUtils.FILE_DISPLAY_SORT) + + val sortedFiles = mainFileListViewModel.sortList(files) + fileListAdapter.updateFileList(filesToAdd = sortedFiles) } private fun isPickingAFolder(): Boolean { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt index ccafa8a27c1..db5036f3dc2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/ui/files/filelist/MainFileListViewModel.kt @@ -24,8 +24,9 @@ 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.db.PreferenceManager +import com.owncloud.android.domain.UseCaseResult import com.owncloud.android.domain.files.model.OCFile import com.owncloud.android.domain.files.usecases.GetFilesAvailableOfflineUseCase import com.owncloud.android.domain.files.usecases.GetFilesSharedByLinkUseCase @@ -33,7 +34,9 @@ import com.owncloud.android.domain.files.usecases.GetFolderContentAsLiveDataUseC 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 com.owncloud.android.utils.FileStorageUtils import kotlinx.coroutines.launch class MainFileListViewModel( @@ -41,7 +44,8 @@ class MainFileListViewModel( private val getFilesSharedByLinkUseCase: GetFilesSharedByLinkUseCase, private val getFilesAvailableOfflineUseCase: GetFilesAvailableOfflineUseCase, private val refreshFolderFromServerAsyncUseCase: RefreshFolderFromServerAsyncUseCase, - private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider + private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider, + private val contextProvider: ContextProvider, ) : ViewModel() { private lateinit var file: OCFile @@ -58,7 +62,6 @@ class MainFileListViewModel( val getFilesAvailableOfflineData: LiveData>>> get() = _getFilesAvailableOfflineData - private fun getFilesList(folderId: Long) { val filesListLiveData: LiveData> = getFolderContentAsLiveDataUseCase.execute(GetFolderContentAsLiveDataUseCase.Params(folderId = folderId)) @@ -109,5 +112,15 @@ class MainFileListViewModel( fun refreshDirectory() { refreshFilesList(file.remotePath) } + + fun sortList(files: List): List { + val sortOrderSaved = PreferenceManager.getSortOrder(contextProvider.getContext(), FileStorageUtils.FILE_DISPLAY_SORT) + val ascendingModeSaved = PreferenceManager.getSortAscending(contextProvider.getContext(), FileStorageUtils.FILE_DISPLAY_SORT) + + return FileStorageUtils.sortFolder( + files, sortOrderSaved, + ascendingModeSaved + ) + } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 92d87be8ea6..c0c49549c6f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -56,7 +56,6 @@ import com.owncloud.android.BuildConfig import com.owncloud.android.MainApp import com.owncloud.android.R import com.owncloud.android.authentication.BiometricManager -import com.owncloud.android.presentation.ui.security.PassCodeManager import com.owncloud.android.authentication.PatternManager import com.owncloud.android.databinding.ActivityMainBinding import com.owncloud.android.datamodel.FileDataStorageManager @@ -80,9 +79,9 @@ import com.owncloud.android.operations.UploadFileOperation import com.owncloud.android.presentation.UIResult import com.owncloud.android.presentation.manager.DOWNLOAD_ADDED_MESSAGE import com.owncloud.android.presentation.manager.DOWNLOAD_FINISH_MESSAGE -import com.owncloud.android.presentation.ui.files.filelist.MainFileListFragment import com.owncloud.android.presentation.ui.files.operations.FileOperation import com.owncloud.android.presentation.ui.files.operations.FileOperationViewModel +import com.owncloud.android.presentation.ui.security.PassCodeManager import com.owncloud.android.syncadapter.FileSyncAdapter import com.owncloud.android.ui.errorhandling.ErrorMessageAdapter import com.owncloud.android.ui.fragment.FileDetailFragment @@ -149,15 +148,9 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private val listOfFilesFragment: OCFileListFragment? get() = supportFragmentManager.findFragmentByTag(TAG_LIST_OF_FILES) as OCFileListFragment? - private val listMainFileFragment: MainFileListFragment? - get() = supportFragmentManager.findFragmentByTag(TAG_LIST_OF_FILES_BIS) as MainFileListFragment? - private val secondFragment: FileFragment? get() = supportFragmentManager.findFragmentByTag(TAG_SECOND_FRAGMENT) as FileFragment? - private val testFragment: MainFileListFragment? - get() = supportFragmentManager.findFragmentByTag(TAG_TEST_FRAGMENT) as MainFileListFragment? - private val isFabOpen: Boolean get() = listOfFilesFragment?.fabMain?.isExpanded ?: false @@ -346,24 +339,17 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn // TODO Change to start using new MainListFragment private fun createMinFragments() { - /* val listOfFiles = OCFileListFragment.newInstance(false, fileListOption, false, false, true) - listOfFiles.setSearchListener(findViewById(R.id.root_toolbar_search_view))*/ - - val list = MainFileListFragment.newInstance(justFolders = false) - - val transaction = supportFragmentManager.beginTransaction() - transaction.add(R.id.left_fragment_container, list, TAG_LIST_OF_FILES_BIS) - val listOfFiles = OCFileListFragment.newInstance(false, fileListOption, false, false, true) listOfFiles.setSearchListener(findViewById(R.id.root_toolbar_search_view)) - + val transaction = supportFragmentManager.beginTransaction() + transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES) transaction.commit() } private fun initFragmentsWithFile() { if (account != null && file != null) { /// First fragment - listMainFileFragment?.listDirectory(currentDir) + listOfFilesFragment?.listDirectory(currentDir) ?: Timber.e("Still have a chance to lose the initialization of list fragment >(") /// Second fragment @@ -483,12 +469,8 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } fun refreshListOfFilesFragment(reloadData: Boolean) { - - /*val fileListFragment = listOfFilesFragment - fileListFragment?.listDirectory(reloadData)*/ - val fileListFragment = listMainFileFragment - - fileListFragment?.listDirectory(file) + val fileListFragment = listOfFilesFragment + fileListFragment?.listDirectory(reloadData) } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -1625,10 +1607,10 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun navigateTo(newFileListOption: FileListOption) { if (fileListOption != newFileListOption) { - if (listMainFileFragment != null) { + if (listOfFilesFragment != null) { fileListOption = newFileListOption file = storageManager.getFileByPath(OCFile.ROOT_PATH) - listMainFileFragment?.updateFileListOption(newFileListOption) + listOfFilesFragment?.updateFileListOption(newFileListOption) updateToolbar(null) } else { super.navigateToOption(FileListOption.ALL_FILES) @@ -1664,10 +1646,8 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } companion object { - private const val TAG_LIST_OF_FILES_BIS = "TAG_LIST_OF_FILES_BIS" private const val TAG_LIST_OF_FILES = "LIST_OF_FILES" private const val TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT" - private const val TAG_TEST_FRAGMENT = "TAG_TEST_FRAGMENT" private const val KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW" private const val KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS"