fixing some thumbnail and sorting related glitches

This commit is contained in:
tibbi 2020-02-10 21:59:35 +01:00
parent 3cd303ddde
commit 0e01026774
7 changed files with 70 additions and 27 deletions

View file

@ -472,7 +472,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
private fun showSortingDialog() { private fun showSortingDialog() {
ChangeSortingDialog(this, true, false) { ChangeSortingDialog(this, true, false) {
directories_grid.adapter = null directories_grid.adapter = null
if (config.directorySorting and SORT_BY_DATE_MODIFIED > 0 || config.directorySorting and SORT_BY_DATE_TAKEN > 0) { if (config.directorySorting and SORT_BY_DATE_MODIFIED != 0 || config.directorySorting and SORT_BY_DATE_TAKEN != 0) {
getDirectories() getDirectories()
} else { } else {
ensureBackgroundThread { ensureBackgroundThread {
@ -893,7 +893,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
val tempFolderPath = config.tempFolderPath val tempFolderPath = config.tempFolderPath
val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0 val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 var getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0 val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
val favoritePaths = getFavoritePaths() val favoritePaths = getFavoritePaths()
val dirPathsToRemove = ArrayList<String>() val dirPathsToRemove = ArrayList<String>()
@ -904,6 +904,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
return return
} }
if (!getProperLastModified) {
getProperLastModified = config.getFileSorting(directory.path) and SORT_BY_DATE_MODIFIED != 0
}
val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false) val curMedia = mLastMediaFetcher!!.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
val newDir = if (curMedia.isEmpty()) { val newDir = if (curMedia.isEmpty()) {
if (directory.path != tempFolderPath) { if (directory.path != tempFolderPath) {
@ -927,6 +931,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
taken = newDir.taken taken = newDir.taken
this@apply.size = newDir.size this@apply.size = newDir.size
types = newDir.types types = newDir.types
sortValue = getDirectorySortingValue(curMedia)
} }
setupAdapter(dirs) setupAdapter(dirs)
@ -977,6 +982,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener {
return return
} }
if (!getProperLastModified) {
getProperLastModified = config.getFileSorting(folder) and SORT_BY_DATE_MODIFIED != 0
}
val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false) val newMedia = mLastMediaFetcher!!.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, false)
if (newMedia.isEmpty()) { if (newMedia.isEmpty()) {
continue continue

View file

@ -36,7 +36,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage
val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES && !context.config.isFolderProtected(it) } val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES && !context.config.isFolderProtected(it) }
val media = ArrayList<Medium>() val media = ArrayList<Medium>()
foldersToScan.forEach { foldersToScan.forEach {
val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations, false) val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, getProperLastModified, getProperFileSize, favoritePaths, getVideoDurations)
media.addAll(newMedia) media.addAll(newMedia)
} }

View file

@ -165,25 +165,26 @@ fun Context.getSortedDirectories(source: ArrayList<Directory>): ArrayList<Direct
dirs.sortWith(Comparator { o1, o2 -> dirs.sortWith(Comparator { o1, o2 ->
o1 as Directory o1 as Directory
o2 as Directory o2 as Directory
var result = when { var result = when {
sorting and SORT_BY_NAME != 0 -> { sorting and SORT_BY_NAME != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) { if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.name.toLowerCase(), o2.name.toLowerCase()) AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase())
} else { } else {
o1.name.toLowerCase().compareTo(o2.name.toLowerCase()) o1.sortValue.toLowerCase().compareTo(o2.sortValue.toLowerCase())
} }
} }
sorting and SORT_BY_PATH != 0 -> { sorting and SORT_BY_PATH != 0 -> {
if (sorting and SORT_USE_NUMERIC_VALUE != 0) { if (sorting and SORT_USE_NUMERIC_VALUE != 0) {
AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase())
} else { } else {
o1.path.toLowerCase().compareTo(o2.path.toLowerCase()) o1.sortValue.toLowerCase().compareTo(o2.sortValue.toLowerCase())
} }
} }
sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.path.toLowerCase(), o2.path.toLowerCase()) sorting and SORT_BY_PATH != 0 -> AlphanumericComparator().compare(o1.sortValue.toLowerCase(), o2.sortValue.toLowerCase())
sorting and SORT_BY_SIZE != 0 -> o1.size.compareTo(o2.size) sorting and SORT_BY_SIZE != 0 -> (o1.sortValue.toLong()).compareTo(o2.sortValue.toLong())
sorting and SORT_BY_DATE_MODIFIED != 0 -> o1.modified.compareTo(o2.modified) sorting and SORT_BY_DATE_MODIFIED != 0 -> (o1.sortValue.toLong()).compareTo(o2.sortValue.toLong())
else -> o1.taken.compareTo(o2.taken) else -> (o1.sortValue.toLong()).compareTo(o2.sortValue.toLong())
} }
if (sorting and SORT_DESCENDING != 0) { if (sorting and SORT_DESCENDING != 0) {
@ -252,7 +253,7 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
val parent = File(path).parent val parent = File(path).parent
if (parent != null && !folders.contains(parent) && dirs.none { it.path == parent }) { if (parent != null && !folders.contains(parent) && dirs.none { it.path == parent }) {
currentPaths.add(parent) currentPaths.add(parent)
val isSortingAscending = config.sorting and SORT_DESCENDING == 0 val isSortingAscending = config.sorting.isSortingAscending()
val subDirs = dirs.filter { File(it.path).parent.equals(File(path).parent, true) } as ArrayList<Directory> val subDirs = dirs.filter { File(it.path).parent.equals(File(path).parent, true) } as ArrayList<Directory>
if (subDirs.isNotEmpty()) { if (subDirs.isNotEmpty()) {
val lastModified = if (isSortingAscending) { val lastModified = if (isSortingAscending) {
@ -281,7 +282,8 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList<Directory>, currentPathPre
dateTaken, dateTaken,
subDirs.sumByLong { it.size }, subDirs.sumByLong { it.size },
getPathLocation(parent), getPathLocation(parent),
mediaTypes) mediaTypes,
"")
directory.containsMediaFilesDirectly = false directory.containsMediaFilesDirectly = false
dirs.add(directory) dirs.add(directory)
@ -479,7 +481,7 @@ fun Context.addTempFolderIfNeeded(dirs: ArrayList<Directory>): ArrayList<Directo
val tempFolderPath = config.tempFolderPath val tempFolderPath = config.tempFolderPath
return if (tempFolderPath.isNotEmpty()) { return if (tempFolderPath.isNotEmpty()) {
val directories = ArrayList<Directory>() val directories = ArrayList<Directory>()
val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0) val newFolder = Directory(null, tempFolderPath, "", tempFolderPath.getFilenameFromPath(), 0, 0, 0, 0L, getPathLocation(tempFolderPath), 0, "")
directories.add(newFolder) directories.add(newFolder)
directories.addAll(dirs) directories.addAll(dirs)
directories directories
@ -706,7 +708,7 @@ fun Context.updateDBMediaPath(oldPath: String, newPath: String) {
fun Context.updateDBDirectory(directory: Directory) { fun Context.updateDBDirectory(directory: Directory) {
try { try {
directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types) directoryDao.updateDirectory(directory.path, directory.tmb, directory.mediaCnt, directory.modified, directory.taken, directory.size, directory.types, directory.sortValue)
} catch (ignored: Exception) { } catch (ignored: Exception) {
} }
} }
@ -858,6 +860,7 @@ fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>,
includedFolders: MutableSet<String>, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory { includedFolders: MutableSet<String>, isSortingAscending: Boolean, getProperFileSize: Boolean): Directory {
val OTGPath = config.OTGPath val OTGPath = config.OTGPath
var thumbnail = curMedia.firstOrNull { getDoesFilePathExist(it.path, OTGPath) }?.path ?: "" var thumbnail = curMedia.firstOrNull { getDoesFilePathExist(it.path, OTGPath) }?.path ?: ""
albumCovers.forEach { albumCovers.forEach {
if (it.path == path && getDoesFilePathExist(it.tmb, OTGPath)) { if (it.path == path && getDoesFilePathExist(it.tmb, OTGPath)) {
thumbnail = it.tmb thumbnail = it.tmb
@ -876,7 +879,36 @@ fun Context.createDirectoryFromMedia(path: String, curMedia: ArrayList<Medium>,
val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken) val dateTaken = if (isSortingAscending) Math.min(firstItem.taken, lastItem.taken) else Math.max(firstItem.taken, lastItem.taken)
val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L val size = if (getProperFileSize) curMedia.sumByLong { it.size } else 0L
val mediaTypes = curMedia.getDirMediaTypes() val mediaTypes = curMedia.getDirMediaTypes()
return Directory(null, path, thumbnail, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes) return Directory(null, path, thumbnail, dirName, curMedia.size, lastModified, dateTaken, size, getPathLocation(path), mediaTypes, getDirectorySortingValue(curMedia))
}
fun Context.getDirectorySortingValue(media: ArrayList<Medium>): String {
val sorting = config.directorySorting
val sorted = when {
sorting and SORT_BY_NAME != 0 -> media.sortedBy { it.name }
sorting and SORT_BY_PATH != 0 -> media.sortedBy { it.path }
sorting and SORT_BY_SIZE != 0 -> media.sortedBy { it.size }
sorting and SORT_BY_DATE_MODIFIED != 0 -> media.sortedBy { it.modified }
sorting and SORT_BY_DATE_TAKEN != 0 -> media.sortedBy { it.taken }
else -> media
}
val relevantMedium = if (sorting.isSortingAscending()) {
sorted.first()
} else {
sorted.last()
}
val result: Any = when {
sorting and SORT_BY_NAME != 0 -> relevantMedium.name
sorting and SORT_BY_PATH != 0 -> relevantMedium.path
sorting and SORT_BY_SIZE != 0 -> relevantMedium.size
sorting and SORT_BY_DATE_MODIFIED != 0 -> relevantMedium.modified
sorting and SORT_BY_DATE_TAKEN != 0 -> relevantMedium.taken
else -> 0
}
return result.toString()
} }
fun Context.updateDirectoryPath(path: String) { fun Context.updateDirectoryPath(path: String) {
@ -886,7 +918,7 @@ fun Context.updateDirectoryPath(path: String) {
val hiddenString = getString(R.string.hidden) val hiddenString = getString(R.string.hidden)
val albumCovers = config.parseAlbumCovers() val albumCovers = config.parseAlbumCovers()
val includedFolders = config.includedFolders val includedFolders = config.includedFolders
val isSortingAscending = config.directorySorting and SORT_DESCENDING == 0 val isSortingAscending = config.directorySorting.isSortingAscending()
val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0
val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0 val getProperLastModified = config.directorySorting and SORT_BY_DATE_MODIFIED != 0
val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0 val getProperFileSize = config.directorySorting and SORT_BY_SIZE != 0
@ -919,5 +951,3 @@ fun Context.getFileDateTaken(path: String): Long {
return 0L return 0L
} }
fun Context.isChromebook() = packageManager.hasSystemFeature("org.chromium.arc.device_management")

View file

@ -0,0 +1,5 @@
package com.simplemobiletools.gallery.pro.extensions
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
fun Int.isSortingAscending() = this and SORT_DESCENDING == 0

View file

@ -21,7 +21,7 @@ class MediaFetcher(val context: Context) {
var shouldStop = false var shouldStop = false
fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean, fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, getProperLastModified: Boolean,
getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean, sortMedia: Boolean = true): ArrayList<Medium> { getProperFileSize: Boolean, favoritePaths: ArrayList<String>, getVideoDurations: Boolean): ArrayList<Medium> {
val filterMedia = context.config.filterMedia val filterMedia = context.config.filterMedia
if (filterMedia == 0) { if (filterMedia == 0) {
return ArrayList() return ArrayList()
@ -38,9 +38,7 @@ class MediaFetcher(val context: Context) {
curMedia.addAll(newMedia) curMedia.addAll(newMedia)
} }
if (sortMedia) {
sortMedia(curMedia, context.config.getFileSorting(curPath)) sortMedia(curMedia, context.config.getFileSorting(curPath))
}
return curMedia return curMedia
} }

View file

@ -9,7 +9,7 @@ import com.simplemobiletools.gallery.pro.models.Directory
@Dao @Dao
interface DirectoryDao { interface DirectoryDao {
@Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types FROM directories") @Query("SELECT path, thumbnail, filename, media_count, last_modified, date_taken, size, location, media_types, sort_value FROM directories")
fun getAll(): List<Directory> fun getAll(): List<Directory>
@Insert(onConflict = REPLACE) @Insert(onConflict = REPLACE)
@ -21,8 +21,8 @@ interface DirectoryDao {
@Query("DELETE FROM directories WHERE path = :path COLLATE NOCASE") @Query("DELETE FROM directories WHERE path = :path COLLATE NOCASE")
fun deleteDirPath(path: String) fun deleteDirPath(path: String)
@Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes WHERE path = :path COLLATE NOCASE") @Query("UPDATE OR REPLACE directories SET thumbnail = :thumbnail, media_count = :mediaCnt, last_modified = :lastModified, date_taken = :dateTaken, size = :size, media_types = :mediaTypes, sort_value = :sortValue WHERE path = :path COLLATE NOCASE")
fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int) fun updateDirectory(path: String, thumbnail: String, mediaCnt: Int, lastModified: Long, dateTaken: Long, size: Long, mediaTypes: Int, sortValue: String)
@Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath COLLATE NOCASE") @Query("UPDATE directories SET thumbnail = :thumbnail, filename = :name, path = :newPath WHERE path = :oldPath COLLATE NOCASE")
fun updateDirectoryAfterRename(thumbnail: String, name: String, newPath: String, oldPath: String) fun updateDirectoryAfterRename(thumbnail: String, name: String, newPath: String, oldPath: String)

View file

@ -23,13 +23,14 @@ data class Directory(
@ColumnInfo(name = "size") var size: Long, @ColumnInfo(name = "size") var size: Long,
@ColumnInfo(name = "location") var location: Int, @ColumnInfo(name = "location") var location: Int,
@ColumnInfo(name = "media_types") var types: Int, @ColumnInfo(name = "media_types") var types: Int,
@ColumnInfo(name = "sort_value") var sortValue: String,
// used with "Group direct subfolders" enabled // used with "Group direct subfolders" enabled
@Ignore var subfoldersCount: Int = 0, @Ignore var subfoldersCount: Int = 0,
@Ignore var subfoldersMediaCount: Int = 0, @Ignore var subfoldersMediaCount: Int = 0,
@Ignore var containsMediaFilesDirectly: Boolean = true) { @Ignore var containsMediaFilesDirectly: Boolean = true) {
constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, 0, 0) constructor() : this(null, "", "", "", 0, 0L, 0L, 0L, 0, 0, "", 0, 0)
fun getBubbleText(sorting: Int, context: Context) = when { fun getBubbleText(sorting: Int, context: Context) = when {
sorting and SORT_BY_NAME != 0 -> name sorting and SORT_BY_NAME != 0 -> name