add a helper function for fast getting folders with media

This commit is contained in:
tibbi 2017-02-24 22:02:09 +01:00
parent 30c7b9b055
commit 513694c117

View file

@ -49,13 +49,36 @@ fun Context.launchSettings() {
startActivity(Intent(this, SettingsActivity::class.java)) startActivity(Intent(this, SettingsActivity::class.java))
} }
fun Context.getMediaFolders(): Set<String> {
val uri = MediaStore.Files.getContentUri("external")
val where = "${MediaStore.Files.FileColumns.MEDIA_TYPE} = ? OR ${MediaStore.Files.FileColumns.MEDIA_TYPE} = ?"
val args = arrayOf(MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE.toString(), MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO.toString())
val columns = arrayOf(MediaStore.Files.FileColumns.PARENT, MediaStore.Images.Media.DATA)
val parentsSet = HashSet<String>()
var cursor: Cursor? = null
try {
cursor = contentResolver.query(uri, columns, where, args, null)
if (cursor?.moveToFirst() == true) {
do {
val curPath = cursor.getStringValue(MediaStore.Images.Media.DATA) ?: ""
parentsSet.add(File(curPath).parent)
} while (cursor.moveToNext())
}
} finally {
cursor?.close()
}
return parentsSet
}
fun Context.getParents(): ArrayList<String> { fun Context.getParents(): ArrayList<String> {
val uri = MediaStore.Files.getContentUri("external") val uri = MediaStore.Files.getContentUri("external")
val columns = arrayOf(MediaStore.Images.Media.DATA) val columns = arrayOf(MediaStore.Images.Media.DATA)
var cursor: Cursor? = null
val parents = ArrayList<String>() val parents = ArrayList<String>()
val parentsSet = HashSet<String>() val parentsSet = HashSet<String>()
var cursor: Cursor? = null
try { try {
cursor = contentResolver.query(uri, columns, null, null, null) cursor = contentResolver.query(uri, columns, null, null, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
@ -69,13 +92,15 @@ fun Context.getParents(): ArrayList<String> {
cursor?.close() cursor?.close()
} }
parentsSet.filterTo(parents, { hasImageVideoGif(File(it)) }) val mediaFolders = getMediaFolders()
parentsSet.filterTo(parents, { mediaFolders.contains(it) || hasImageVideoGif(File(it)) })
if (config.showHiddenFolders) { if (config.showHiddenFolders) {
parents.addAll(getNoMediaFolders()) parents.addAll(getNoMediaFolders())
} else { } else {
removeNoMediaFolders(parents) removeNoMediaFolders(parents)
} }
return parents return parents
} }
@ -123,7 +148,8 @@ fun Context.getNoMediaFolders(): ArrayList<String> {
fun hasImageVideoGif(dir: File): Boolean { fun hasImageVideoGif(dir: File): Boolean {
if (dir.isDirectory) { if (dir.isDirectory) {
dir.listFiles()?.filter(File::isImageVideoGif)?.any { return true } val files = dir.listFiles() ?: return false
files.filter(File::isImageVideoGif).any { return true }
} }
return false return false
} }