cache which folder has nomedia file, avoid checking it over and over
This commit is contained in:
parent
7c31fcb818
commit
8f58de5126
3 changed files with 38 additions and 6 deletions
|
@ -36,6 +36,8 @@ import java.util.HashSet
|
|||
import java.util.LinkedHashSet
|
||||
import kotlin.Comparator
|
||||
import kotlin.collections.ArrayList
|
||||
import kotlin.collections.HashMap
|
||||
import kotlin.collections.set
|
||||
|
||||
val Context.audioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||
|
||||
|
@ -516,7 +518,13 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly:
|
|||
val shouldShowHidden = config.shouldShowHidden || forceShowHidden
|
||||
val excludedPaths = config.excludedFolders
|
||||
val includedPaths = config.includedFolders
|
||||
var filteredDirectories = directories.filter { it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden) } as ArrayList<Directory>
|
||||
|
||||
val folderNomediaStatuses = HashMap<String, Boolean>()
|
||||
var filteredDirectories = directories.filter {
|
||||
it.path.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNomediaStatuses) { path, hasNoMedia ->
|
||||
folderNomediaStatuses[path] = hasNoMedia
|
||||
}
|
||||
} as ArrayList<Directory>
|
||||
val filterMedia = config.filterMedia
|
||||
|
||||
filteredDirectories = (when {
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.simplemobiletools.gallery.pro.extensions
|
|||
|
||||
import android.os.Environment
|
||||
import com.simplemobiletools.commons.extensions.containsNoMedia
|
||||
import com.simplemobiletools.commons.extensions.doesParentHaveNoMedia
|
||||
import com.simplemobiletools.commons.helpers.NOMEDIA
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
|
||||
|
@ -10,7 +10,9 @@ fun String.isThisOrParentIncluded(includedPaths: MutableSet<String>) = includedP
|
|||
|
||||
fun String.isThisOrParentExcluded(excludedPaths: MutableSet<String>) = excludedPaths.any { equals(it, true) } || excludedPaths.any { "$this/".startsWith("$it/", true) }
|
||||
|
||||
fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean): Boolean {
|
||||
// cache which folders contain .nomedia files to avoid checking them over and over again
|
||||
fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPaths: MutableSet<String>, showHidden: Boolean,
|
||||
folderNomediaStatuses: HashMap<String, Boolean>, callback: (path: String, hasNoMedia: Boolean) -> Unit): Boolean {
|
||||
if (isEmpty()) {
|
||||
return false
|
||||
}
|
||||
|
@ -48,7 +50,24 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet<String>, includedPath
|
|||
} else if (!showHidden && file.isDirectory && file.canonicalFile == file.absoluteFile) {
|
||||
var containsNoMediaOrDot = containsNoMedia || contains("/.")
|
||||
if (!containsNoMediaOrDot) {
|
||||
containsNoMediaOrDot = file.doesParentHaveNoMedia()
|
||||
var curPath = this
|
||||
for (i in 0 until count { it == '/' } - 1) {
|
||||
curPath = curPath.substringBeforeLast('/')
|
||||
val pathToCheck = "$curPath/${NOMEDIA}"
|
||||
if (folderNomediaStatuses.contains(pathToCheck)) {
|
||||
if (folderNomediaStatuses[pathToCheck] == true) {
|
||||
containsNoMediaOrDot = true
|
||||
break
|
||||
}
|
||||
} else {
|
||||
val noMediaExists = File(pathToCheck).exists()
|
||||
callback(pathToCheck, noMediaExists)
|
||||
if (noMediaExists) {
|
||||
containsNoMediaOrDot = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
!containsNoMediaOrDot
|
||||
} else {
|
||||
|
|
|
@ -66,8 +66,13 @@ class MediaFetcher(val context: Context) {
|
|||
val shouldShowHidden = config.shouldShowHidden
|
||||
val excludedPaths = config.excludedFolders
|
||||
val includedPaths = config.includedFolders
|
||||
folders.distinctBy { it.getDistinctPath() }
|
||||
.filter { it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden) }.toMutableList() as ArrayList<String>
|
||||
|
||||
val folderNomediaStatuses = HashMap<String, Boolean>()
|
||||
folders.distinctBy { it.getDistinctPath() }.filter {
|
||||
it.shouldFolderBeVisible(excludedPaths, includedPaths, shouldShowHidden, folderNomediaStatuses) { path, hasNoMedia ->
|
||||
folderNomediaStatuses[path] = hasNoMedia
|
||||
}
|
||||
}.toMutableList() as ArrayList<String>
|
||||
} catch (e: Exception) {
|
||||
ArrayList()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue