Home and Library screen update (#101)

* Added support for filtering file types in synced folders

* Added support for custom file names and enhanced file information dialog

* added feedback option in the homescreen drawer

* Implemented a limit for number of recent files displayed on the home screen
This commit is contained in:
Aryan 2026-03-20 21:51:03 +05:30 committed by GitHub
parent 9842aea9b1
commit ddcd253c7b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 637 additions and 734 deletions

View file

@ -58,18 +58,29 @@ class FolderSyncWorker(
val prefs = appContext.getSharedPreferences("reader_user_prefs", Context.MODE_PRIVATE)
val jsonString = prefs.getString("synced_folders_list_json", null)
val folders = mutableListOf<String>()
val folders = mutableListOf<Pair<String, Set<FileType>>>()
if (jsonString != null) {
try {
val array = org.json.JSONArray(jsonString)
for (i in 0 until array.length()) {
folders.add(array.getJSONObject(i).getString("uri"))
val obj = array.getJSONObject(i)
val uri = obj.getString("uri")
val allowedFileTypes = mutableSetOf<FileType>()
if (obj.has("allowedFileTypes")) {
val typesArray = obj.getJSONArray("allowedFileTypes")
for (j in 0 until typesArray.length()) {
try { allowedFileTypes.add(FileType.valueOf(typesArray.getString(j))) } catch (_: Exception) {}
}
} else {
allowedFileTypes.addAll(FileType.entries)
}
folders.add(Pair(uri, allowedFileTypes))
}
} catch (e: Exception) { Timber.e(e) }
} else {
val single = prefs.getString("synced_folder_uri", null)
if (single != null) folders.add(single)
if (single != null) folders.add(Pair(single, FileType.entries.toSet()))
}
if (folders.isEmpty()) {
@ -83,8 +94,8 @@ class FolderSyncWorker(
syncMutex.withLock {
var allSuccess = true
for (uriString in folders) {
val success = performSyncForFolder(uriString, isMetadataOnly)
for ((uriString, allowedTypes) in folders) {
val success = performSyncForFolder(uriString, allowedTypes, isMetadataOnly)
if (!success) allSuccess = false
}
@ -104,7 +115,7 @@ class FolderSyncWorker(
}
}
private suspend fun performSyncForFolder(folderUriString: String, metadataOnly: Boolean): Boolean {
private suspend fun performSyncForFolder(folderUriString: String, allowedFileTypes: Set<FileType>, metadataOnly: Boolean): Boolean {
if (folderUriString.isBlank()) return true
val folderUri = folderUriString.toUri()
@ -195,7 +206,8 @@ class FolderSyncWorker(
file.listFiles().let { fileQueue.addAll(it) }
} else if (file.isFile) {
val name = file.name ?: ""
if (isValidExtension(name) && !name.endsWith(".json") && !name.startsWith(".")) {
val type = getFileType(name, file.type)
if (type != null && type in allowedFileTypes && !name.endsWith(".json") && !name.startsWith(".")) {
currentDiskFiles.add(file)
}
}
@ -298,14 +310,6 @@ class FolderSyncWorker(
}
}
private fun isValidExtension(name: String): Boolean {
return name.endsWith(".pdf", true) ||
name.endsWith(".epub", true) ||
name.endsWith(".mobi", true) ||
name.endsWith(".azw3", true) ||
name.endsWith(".md", true)
}
private fun getFileType(name: String, mimeType: String?): FileType? {
return when {
mimeType == "application/pdf" || name.endsWith(".pdf", true) -> FileType.PDF
@ -313,6 +317,7 @@ class FolderSyncWorker(
name.endsWith(".mobi", true) || name.endsWith(".azw3", true) -> FileType.MOBI
name.endsWith(".md", true) -> FileType.MD
name.endsWith(".txt", true) -> FileType.TXT
name.endsWith(".html", true) || name.endsWith(".xhtml", true) || name.endsWith(".htm", true) -> FileType.HTML
else -> null
}
}