143143import androidx .fragment .app .FragmentActivity ;
144144import androidx .fragment .app .FragmentManager ;
145145import androidx .media3 .common .util .UnstableApi ;
146- import androidx .recyclerview .widget .GridLayoutManager ;
147- import androidx .recyclerview .widget .LinearLayoutManager ;
148- import androidx .recyclerview .widget .RecyclerView ;
149146import kotlin .Unit ;
150147
151148import static com .owncloud .android .datamodel .OCFile .ROOT_PATH ;
@@ -211,7 +208,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
211208 protected FileFragment .ContainerActivity mContainerActivity ;
212209
213210 protected OCFile mFile ;
214- private OCFileListAdapter mAdapter ;
211+ protected OCFileListAdapter mAdapter ;
215212 protected boolean mOnlyFoldersClickable ;
216213 protected boolean mFileSelectable ;
217214
@@ -228,6 +225,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
228225 private FloatingActionButton mFabMain ;
229226 public static boolean isMultipleFileSelectedForCopyOrMove = false ;
230227 public final ParentFolderFinder parentFolderFinder = new ParentFolderFinder ();
228+ public FileListLayoutManager fileListLayoutManager ;
231229
232230 private static final Intent scanIntentExternalApp = new Intent ("org.fairscan.app.action.SCAN_TO_PDF" );
233231
@@ -251,6 +249,7 @@ public void onCreate(Bundle savedInstanceState) {
251249 super .onCreate (savedInstanceState );
252250 setHasOptionsMenu (true );
253251 mMultiChoiceModeListener = new MultiChoiceModeListener ();
252+ fileListLayoutManager = new FileListLayoutManager (this , preferences );
254253
255254 final Bundle state = savedInstanceState != null ? savedInstanceState : getArguments ();
256255 setSearchArgs (state );
@@ -445,10 +444,12 @@ public void prepareOCFileList(Bundle savedInstanceState) {
445444
446445 if (mSwitchGridViewButton != null ) {
447446 mSwitchGridViewButton .setOnClickListener (v -> {
448- if (isGridEnabled ()) {
449- setListAsPreferred ();
450- } else {
451- setGridAsPreferred ();
447+ if (fileListLayoutManager != null ) {
448+ if (isGridEnabled ()) {
449+ fileListLayoutManager .setListAsPreferred ();
450+ } else {
451+ fileListLayoutManager .setGridAsPreferred ();
452+ }
452453 }
453454 setLayoutSwitchButton ();
454455 });
@@ -461,6 +462,10 @@ public void prepareOCFileList(Bundle savedInstanceState) {
461462
462463 protected void setAdapter (Bundle args ) {
463464 boolean hideItemOptions = args != null && args .getBoolean (ARG_HIDE_ITEM_OPTIONS , false );
465+ boolean isGridViewPreferred = false ;
466+ if (fileListLayoutManager != null ) {
467+ isGridViewPreferred = fileListLayoutManager .isGridViewPreferred (mFile );
468+ }
464469
465470 mAdapter = new OCFileListAdapter (
466471 getActivity (),
@@ -470,7 +475,7 @@ protected void setAdapter(Bundle args) {
470475 mContainerActivity ,
471476 this ,
472477 hideItemOptions ,
473- isGridViewPreferred ( mFile ) ,
478+ isGridViewPreferred ,
474479 viewThemeUtils ,
475480 overlayManager
476481 );
@@ -1612,7 +1617,9 @@ public void updateOCFile(@NonNull OCFile file) {
16121617 }
16131618
16141619 private void updateLayout () {
1615- setLayoutViewMode ();
1620+ if (fileListLayoutManager != null ) {
1621+ fileListLayoutManager .setLayoutViewMode ();
1622+ }
16161623 updateSortButton ();
16171624 setLayoutSwitchButton ();
16181625
@@ -1642,109 +1649,6 @@ private void invalidateActionMode() {
16421649 }
16431650 }
16441651
1645- public void sortFiles (FileSortOrder sortOrder ) {
1646- if (mSortButton != null ) {
1647- mSortButton .setText (DisplayUtils .getSortOrderStringId (sortOrder ));
1648- }
1649- mAdapter .setSortOrder (mFile , sortOrder );
1650- }
1651-
1652- /**
1653- * Determines whether a folder should be displayed in grid or list view.
1654- * <p>
1655- * The preference is checked for the given folder. If the folder itself does not have a preference set,
1656- * it will fall back to its parent folder recursively until a preference is found (root folder is always set).
1657- * Additionally, if a search event is active and is of type {@code SHARED_FILTER}, grid view is disabled.
1658- *
1659- * @param folder The folder to check, or {@code null} to refer to the root folder.
1660- * @return {@code true} if the folder should be displayed in grid mode, {@code false} if list mode is preferred.
1661- */
1662- private boolean isGridViewPreferred (@ Nullable OCFile folder ) {
1663- if (searchEvent != null ) {
1664- return (searchEvent .toSearchType () != SHARED_FILTER ) &&
1665- FOLDER_LAYOUT_GRID .equals (preferences .getFolderLayout (folder ));
1666- } else {
1667- return FOLDER_LAYOUT_GRID .equals (preferences .getFolderLayout (folder ));
1668- }
1669- }
1670-
1671- private void setLayoutViewMode () {
1672- boolean isGrid = isGridViewPreferred (mFile );
1673-
1674- if (isGrid ) {
1675- switchToGridView ();
1676- } else {
1677- switchToListView ();
1678- }
1679-
1680- setLayoutSwitchButton (isGrid );
1681- }
1682-
1683- public void setListAsPreferred () {
1684- preferences .setFolderLayout (mFile , FOLDER_LAYOUT_LIST );
1685- switchToListView ();
1686- }
1687-
1688- public void switchToListView () {
1689- if (isGridEnabled ()) {
1690- switchLayoutManager (false );
1691- }
1692- }
1693-
1694- public void setGridAsPreferred () {
1695- preferences .setFolderLayout (mFile , FOLDER_LAYOUT_GRID );
1696- switchToGridView ();
1697- }
1698-
1699- public void switchToGridView () {
1700- if (!isGridEnabled ()) {
1701- switchLayoutManager (true );
1702- }
1703- }
1704-
1705- @ SuppressLint ("NotifyDataSetChanged" )
1706- public void switchLayoutManager (boolean grid ) {
1707- final var recyclerView = getRecyclerView ();
1708- final var adapter = getAdapter ();
1709- final var context = getContext ();
1710-
1711- if (context == null || adapter == null || recyclerView == null ) {
1712- Log_OC .e (TAG , "cannot switch layout, arguments are null" );
1713- return ;
1714- }
1715-
1716- int position = 0 ;
1717-
1718- if (recyclerView .getLayoutManager () instanceof LinearLayoutManager linearLayoutManager ) {
1719- position = linearLayoutManager .findFirstCompletelyVisibleItemPosition ();
1720- }
1721-
1722- RecyclerView .LayoutManager layoutManager ;
1723- if (grid ) {
1724- layoutManager = new GridLayoutManager (context , getColumnsCount ());
1725- GridLayoutManager gridLayoutManager = (GridLayoutManager ) layoutManager ;
1726- gridLayoutManager .setSpanSizeLookup (new GridLayoutManager .SpanSizeLookup () {
1727- @ Override
1728- public int getSpanSize (int position ) {
1729- if (position == getAdapter ().getItemCount () - 1 ||
1730- position == 0 && getAdapter ().shouldShowHeader ()) {
1731- return gridLayoutManager .getSpanCount ();
1732- } else {
1733- return 1 ;
1734- }
1735- }
1736- });
1737- } else {
1738- layoutManager = new LinearLayoutManager (context );
1739- }
1740-
1741- recyclerView .setLayoutManager (layoutManager );
1742- recyclerView .scrollToPosition (position );
1743- adapter .setGridView (grid );
1744- recyclerView .setAdapter (adapter );
1745- adapter .notifyDataSetChanged ();
1746- }
1747-
17481652 public CommonOCFileListAdapterInterface getCommonAdapter () {
17491653 return mAdapter ;
17501654 }
@@ -1923,7 +1827,9 @@ protected void handleSearchEvent(SearchEvent event) {
19231827
19241828 new Handler (Looper .getMainLooper ()).post (() -> {
19251829 updateSortButton ();
1926- setLayoutViewMode ();
1830+ if (fileListLayoutManager != null ) {
1831+ fileListLayoutManager .setLayoutViewMode ();
1832+ }
19271833 });
19281834
19291835 final User currentUser = accountManager .getUser ();
0 commit comments