@@ -563,16 +563,38 @@ else if (cursor.getCount() > 0 && cursor.moveToFirst()) {
563563 }
564564
565565 private @ Nullable List <LayoutElementParcelable > listRecentFiles () {
566- final Context context = this . context .get ();
566+ final Context c = context .get ();
567567
568- if (context == null ) {
568+ if (c == null ) {
569569 cancel (true );
570570 return null ;
571571 }
572572
573- List <LayoutElementParcelable > recentFiles = new ArrayList <>(20 );
573+ final MainFragment mainFragment = mainFragmentReference .get ();
574+ MainFragmentViewModel viewModel = mainFragment .getMainFragmentViewModel ();
575+
576+ List <LayoutElementParcelable > recentFiles = new ArrayList <>(40 );
577+
578+ Cursor cursor = getRecentFilesCursor (c );
579+ if (cursor == null ) return recentFiles ;
580+ if (cursor .getCount () > 0 && cursor .moveToFirst ()) {
581+ do {
582+ String filePath = cursor .getString (cursor .getColumnIndex (MediaStore .MediaColumns .DATA ));
583+ File f = new File (filePath );
584+ if (f .isDirectory ()) {
585+ List <File > files = getFilesFromDirectory (mainFragment , filePath );
586+ for (File file : files ) compareFileAndAddToList (viewModel , recentFiles , file );
587+ } else compareFileAndAddToList (viewModel , recentFiles , f );
588+ } while (cursor .moveToNext ());
589+ }
590+ cursor .close ();
591+ return recentFiles ;
592+ }
593+
594+ @ Nullable
595+ private Cursor getRecentFilesCursor (Context c ) {
574596 final String [] projection = {
575- MediaStore .Files . FileColumns . DATA , MediaStore .Files . FileColumns .DATE_MODIFIED
597+ MediaStore .MediaColumns . DATA , MediaStore .MediaColumns .DATE_MODIFIED
576598 };
577599 final String selection = MediaStore .Files .FileColumns .DATA + " NOT LIKE ?" ;
578600 final String [] selectionArgs = new String [] {AppConfig .getTrashBinBasePath () + "%" };
@@ -583,51 +605,78 @@ else if (cursor.getCount() > 0 && cursor.moveToFirst()) {
583605 try {
584606 if (SDK_INT >= Q ) {
585607 Bundle queryArgs = new Bundle ();
586- queryArgs . putInt ( ContentResolver . QUERY_ARG_LIMIT , 20 );
608+
587609 queryArgs .putStringArray (
588610 ContentResolver .QUERY_ARG_SORT_COLUMNS ,
589- new String [] {MediaStore .Files . FileColumns .DATE_MODIFIED });
611+ new String [] {MediaStore .MediaColumns .DATE_MODIFIED });
590612 queryArgs .putInt (
591613 ContentResolver .QUERY_ARG_SORT_DIRECTION ,
592614 ContentResolver .QUERY_SORT_DIRECTION_DESCENDING );
615+ queryArgs .putInt (ContentResolver .QUERY_ARG_LIMIT , 100 );
593616 queryArgs .putString (ContentResolver .QUERY_ARG_SQL_SELECTION , selection );
594617 queryArgs .putStringArray (ContentResolver .QUERY_ARG_SQL_SELECTION_ARGS , selectionArgs );
595618 cursor =
596- context
597- .getContentResolver ()
619+ c .getContentResolver ()
598620 .query (MediaStore .Files .getContentUri ("external" ), projection , queryArgs , null );
599621 } else {
600622 cursor =
601- context
602- .getContentResolver ()
623+ c .getContentResolver ()
603624 .query (
604625 MediaStore .Files .getContentUri ("external" ),
605626 projection ,
606627 selection ,
607628 selectionArgs ,
608- MediaStore .Files . FileColumns . DATE_MODIFIED + " DESC LIMIT 20 " );
629+ MediaStore .MediaColumns . DATE_MODIFIED + " DESC LIMIT 100 " );
609630 }
610631 } catch (SecurityException e ) {
611632 // Storage permission denied; treat as no recent files instead of crashing.
612633 return recentFiles ;
613634 }
614- if (cursor == null ) return recentFiles ;
615- if (cursor .getCount () > 0 && cursor .moveToFirst ()) {
616- do {
617- String path = cursor .getString (cursor .getColumnIndex (MediaStore .Files .FileColumns .DATA ));
618- File f = new File (path );
619- if (d .compareTo (new Date (f .lastModified ())) != 1 && !f .isDirectory ()) {
620- HybridFileParcelable strings =
621- RootHelper .generateBaseFile (new File (path ), showHiddenFiles );
622- if (strings != null ) {
623- LayoutElementParcelable parcelable = createListParcelables (strings );
624- if (parcelable != null ) recentFiles .add (parcelable );
625- }
635+ return cursor ;
636+ }
637+
638+ private void compareFileAndAddToList (
639+ MainFragmentViewModel viewModel , List <LayoutElementParcelable > recentFiles , File file ) {
640+ Calendar c = Calendar .getInstance ();
641+ c .set (Calendar .DAY_OF_YEAR , c .get (Calendar .DAY_OF_YEAR ) - 2 );
642+ Date d = c .getTime ();
643+
644+ if (d .compareTo (new Date (file .lastModified ())) != 1 && !file .isDirectory ()) {
645+ HybridFileParcelable strings = RootHelper .generateBaseFile (file , showHiddenFiles );
646+ if (strings != null ) {
647+ LayoutElementParcelable parcelable = createListParcelables (strings );
648+ if (parcelable != null ) {
649+ recentFiles .add (parcelable );
650+ viewModel .incrementFileCount ();
626651 }
627- } while ( cursor . moveToNext ());
652+ }
628653 }
629- cursor .close ();
630- return recentFiles ;
654+ }
655+
656+ /**
657+ * fetches the files from directory tree and adds all the files in a list
658+ *
659+ * @param mainFragment: the main fragment reference
660+ * @param filePath: the file filePath
661+ * @return List of files in directory tree.
662+ */
663+ private List <File > getFilesFromDirectory (MainFragment mainFragment , String filePath ) {
664+
665+ List <File > files = new ArrayList <>();
666+
667+ ListFilesCommand .INSTANCE .listFiles (
668+ filePath ,
669+ mainFragment .requireMainActivity ().isRootExplorer (),
670+ showHiddenFiles ,
671+ mode -> {
672+ return null ;
673+ },
674+ hybridFileParcelable -> {
675+ files .add (hybridFileParcelable .getFile ());
676+ return null ;
677+ });
678+
679+ return files ;
631680 }
632681
633682 private @ Nullable List <LayoutElementParcelable > listTrashBinFiles () {
0 commit comments