From b3ea28c76bdbcfd96abe760aa01d147a59984358 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 16 Sep 2020 22:20:56 +0200 Subject: [PATCH] try fetching Last Modified from Mediastore, if possible --- .../pro/fragments/ItemsFragment.kt | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt index 71c16aaf..a54d2976 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.filemanager.pro.fragments import android.os.Bundle import android.os.Parcelable +import android.provider.MediaStore import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -216,10 +217,11 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb return } + val lastModifieds = getFolderLastModifieds(path) val isSortingBySize = context!!.config.getFolderSorting(currentPath) and SORT_BY_SIZE != 0 if (files != null) { for (file in files) { - val fileDirItem = getFileDirItemFromFile(file, isSortingBySize) + val fileDirItem = getFileDirItemFromFile(file, isSortingBySize, lastModifieds) if (fileDirItem != null) { items.add(fileDirItem) } @@ -229,7 +231,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb callback(path, items) } - private fun getFileDirItemFromFile(file: File, isSortingBySize: Boolean): ListItem? { + private fun getFileDirItemFromFile(file: File, isSortingBySize: Boolean, lastModifieds: HashMap): ListItem? { val curPath = file.absolutePath val curName = file.name if (!showHidden && curName.startsWith(".")) { @@ -248,7 +250,12 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb file.length() } - return ListItem(curPath, curName, isDirectory, children, size, file.lastModified(), false) + var lastModified = lastModifieds.remove(curPath) + if (lastModified == null) { + lastModified = file.lastModified() + } + + return ListItem(curPath, curName, isDirectory, children, size, lastModified, false) } private fun getListItemsFromFileDirItems(fileDirItems: ArrayList): ArrayList { @@ -260,6 +267,36 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb return listItems } + private fun getFolderLastModifieds(folder: String): HashMap { + val lastModifieds = HashMap() + val projection = arrayOf( + MediaStore.Images.Media.DISPLAY_NAME, + MediaStore.Images.Media.DATE_MODIFIED + ) + + val uri = MediaStore.Files.getContentUri("external") + val selection = "${MediaStore.Images.Media.DATA} LIKE ? AND ${MediaStore.Images.Media.DATA} NOT LIKE ?" + val selectionArgs = arrayOf("$folder/%", "$folder/%/%") + + val cursor = context!!.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + do { + try { + val lastModified = cursor.getLongValue(MediaStore.Images.Media.DATE_MODIFIED) * 1000 + if (lastModified != 0L) { + val name = cursor.getStringValue(MediaStore.Images.Media.DISPLAY_NAME) + lastModifieds["$folder/$name"] = lastModified + } + } catch (e: Exception) { + } + } while (cursor.moveToNext()) + } + } + + return lastModifieds + } + private fun itemClicked(item: FileDirItem) { if (item.isDirectory) { (activity as? MainActivity)?.apply { @@ -354,7 +391,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb files.addAll(searchFiles(text, it.absolutePath)) } else { if (it.name.contains(text, true)) { - val fileDirItem = getFileDirItemFromFile(it, isSortingBySize) + val fileDirItem = getFileDirItemFromFile(it, isSortingBySize, HashMap()) if (fileDirItem != null) { files.add(fileDirItem) }