Pith - varnish
package com.vgmlr.varnish

import android.graphics.Bitmap

object VarnishConfig {
    const val BTN_RADIUS = 6
    const val FOOTER_MS = 2_000L
    const val MENU_IDLE_MS = 5_000L
    const val DEBOUNCE_MS = 1_200L
    const val TITLE_MS = 2_000L
    const val ARM_MS = 3_000L
    const val ZOOM_MAX = 10f
    const val ZOOM_TAP = 3f

    const val FOLDER_IMG_DEFAULT = 100
    const val FOLDER_IMG_MIN = 24
    const val FOLDER_IMG_MAX = 200
    const val GRID_DEFAULT = 3
    val GRID_OPTIONS = (2..6).toList()
    const val QUALITY_DEFAULT = 95
    val QUALITY_OPTIONS = (10..100 step 5).toList()

    const val CHOOSER = "Default"
    const val FOLDER_UNNAMED = "Unnamed"
    const val FAV_PATH = "varnish:favorites"
    const val FAV_NAME = "Favorites"

    val SYSTEM_DIRS = setOf(
        "Android", "DCIM", "Pictures", "Movies", "Download", "Documents", "Music",
        "Alarms", "Notifications", "Ringtones", "Podcasts", "Audiobooks", "Recordings"
    )
    val IMAGE_EXT = setOf("jpg", "jpeg", "png", "gif", "webp", "bmp", "heic", "heif", "avif")
    val VIDEO_EXT = setOf("mp4", "m4v", "mkv", "webm", "3gp", "mov", "avi", "ts")
}

enum class ScanMode(val label: String) { FILES("Files"), FOLDERS("Folders") }

enum class FileTypes(val label: String) { IMAGES("images"), VIDEOS("videos"), BOTH("images/videos") }

enum class OutFormat(val label: String, val ext: String, val compress: Bitmap.CompressFormat) {
    JPG("jpg", "jpg", Bitmap.CompressFormat.JPEG),
    PNG("png", "png", Bitmap.CompressFormat.PNG)
}

enum class SortMode(val label: String) {
    AZ("A to Z"),
    ZA("Z to A"),
    NEW("Date"),
    OLD("Date");

    fun byAlpha() = if (this == AZ) ZA else AZ
    fun byDate() = if (this == NEW) OLD else NEW
}

object NaturalOrder : Comparator<String> {
    override fun compare(a: String, b: String): Int {
        var i = 0
        var j = 0
        while (i < a.length && j < b.length) {
            val ca = a[i]
            val cb = b[j]
            if (ca in '0'..'9' && cb in '0'..'9') {
                val si = i
                while (i < a.length && a[i] in '0'..'9') i++
                val sj = j
                while (j < b.length && b[j] in '0'..'9') j++
                val na = a.substring(si, i).trimStart('0')
                val nb = b.substring(sj, j).trimStart('0')
                if (na.length != nb.length) return na.length - nb.length
                val c = na.compareTo(nb)
                if (c != 0) return c
            } else {
                val c = ca.lowercaseChar().compareTo(cb.lowercaseChar())
                if (c != 0) return c
                i++
                j++
            }
        }
        return (a.length - i) - (b.length - j)
    }
}