Update v1.0.49 (#330)
* Added PDF top tab strip visibility toggle and fixed WebView hit test NPE * Refactored desktop reader screens and state management into specialized components * Added image gallery to reader sidebar and refactored desktop PDF UI components * Implemented EPUB image gallery * Refactored reader and library models to use shared common types, centralizing file type resolution and texture management while removing redundant mapping logic * Standardized UI styling and refactored app navigation layout * Implemented auto-hiding reader chrome and activity tracking in desktop * Refactored reader panels into distinct left and right modal layers with platform-specific sizing and keyboard navigation support. * Added PPTX support for desktop and refactored parsing into a shared module * Implement paid AI features and account management for the desktop application. * Implement AI Hub and enhanced Cloud TTS integration for Desktop * Implement streaming support for AI definition and summarization features * Implement support for password-protected PDFs and file actions in the desktop reader. * Implement cloud synchronization for desktop using Firestore and Google Drive * Implement PDF reflow and "Text View" for the desktop reader * Refactor OPDS logic to use SharedOpdsController * Optimize PDF tile rendering performance * Implement two-page spread support for PDF pagination * Implement two-page spread support for the PDF viewer * Improved shared spread zoom in PDF viewer * Improve PDF spread navigation with fling support and configurable page gaps * Add brightness control to PDF and EPUB readers * Refactor folder synchronization to use shared logic engine * Implement safe string formatting and validation for localized resources * Implement TTS chunk skip navigation * Implement deep-linking and playback controls for TTS media sessions * Implement start index for TTS playback * Improve TTS navigation, prefetching, and notification duration reporting * Implement TTS mini playback bar for background reading * Implement multi-window reader support for the desktop application * Improve desktop modal window management and visibility syncing * Implement localized string support for Desktop and shared UI * Implement language selection and persistence for Desktop * Implement plural string support for Desktop and migrate hardcoded counts to plurals.xml * Implement localized banner messages and UI strings using resource-backed SharedText * Implement compact badge styling for small book covers * Refactor PDF native interaction and improve HTML import memory safety * fix language persistence * Refactor reader overflow menus to use section-based logic * Refactor PDF layout remapping and improve text box interaction * Improve CFI resolution and TTS resume accuracy using dynamic chunk offsets * Centralize PDF annotation export mapping and improve metadata handling * Add support for threaded comments in PDF highlight annotations * Flatten highlight comments into a single thread for PDF export and allow author editing * Integrate page slider into reader chrome and persist toggle state * Handle fragments and queries in EPUB chapter paths * Implement dynamic, theme-aware coloring for the reader slider * Implement customizable app-wide font preference * Implement one-hand zoom gestures in the PDF viewer * Implement File Information dialog for PDF and EPUB readers * Bump version to 1.0.49 (53) * Refactor PDF reader logic into modular components * Add ProGuard rules to prevent R8 optimization issues in EPUB reader screens * Add option to use PDF filenames as display names * Fix preservation of PDF filename display preference in library projection
This commit is contained in:
parent
dc5196526f
commit
9510293ac3
245 changed files with 37538 additions and 12460 deletions
|
|
@ -141,6 +141,7 @@ import com.aryan.reader.data.RecentFileItem
|
|||
import com.aryan.reader.data.TagEntity
|
||||
import com.aryan.reader.opds.OpdsAcquisition
|
||||
import com.aryan.reader.opds.OpdsCatalog
|
||||
import com.aryan.reader.opds.OpdsDownloadState
|
||||
import com.aryan.reader.opds.OpdsEntry
|
||||
import com.aryan.reader.opds.OpdsViewModel
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
|
|
@ -343,7 +344,8 @@ fun LibraryScreen(
|
|||
)
|
||||
},
|
||||
onDeleteCatalogStreams = viewModel::deleteStreamedBooksForCatalog,
|
||||
onSettingsClick = { navController.navigate(AppDestinations.SETTINGS_SCREEN_ROUTE) }
|
||||
onSettingsClick = { navController.navigate(AppDestinations.SETTINGS_SCREEN_ROUTE) },
|
||||
usePdfFileNameAsDisplayName = uiState.usePdfFileNameAsDisplayName
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -392,6 +394,7 @@ fun LibraryScreen(
|
|||
if (showInfoDialog) {
|
||||
FileInfoDialog(
|
||||
item = item,
|
||||
usePdfFileNameAsDisplayName = uiState.usePdfFileNameAsDisplayName,
|
||||
onDismiss = {
|
||||
showInfoDialog = false
|
||||
itemForInfoDialog = null
|
||||
|
|
@ -458,7 +461,8 @@ fun ShelfScreen(
|
|||
onBookClick = { item -> viewModel.toggleBookSelectionForAdding(item.bookId) },
|
||||
onBack = viewModel::dismissAddBooksToShelf,
|
||||
onAddSelectedBooks = { viewModel.addBooksToShelf(viewingShelfId) },
|
||||
downloadingBookIds = uiState.downloadingBookIds
|
||||
downloadingBookIds = uiState.downloadingBookIds,
|
||||
usePdfFileNameAsDisplayName = uiState.usePdfFileNameAsDisplayName
|
||||
)
|
||||
} else {
|
||||
ShelfDetailScreen(
|
||||
|
|
@ -483,7 +487,8 @@ fun ShelfScreen(
|
|||
onDeleteClick = { showRemoveFromShelfDialog = true },
|
||||
onRenameShelf = { viewModel.showRenameShelfDialog(currentShelf.id) },
|
||||
onDeleteShelf = { viewModel.showDeleteShelfDialog(currentShelf.id) },
|
||||
downloadingBookIds = uiState.downloadingBookIds
|
||||
downloadingBookIds = uiState.downloadingBookIds,
|
||||
usePdfFileNameAsDisplayName = uiState.usePdfFileNameAsDisplayName
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -523,6 +528,7 @@ fun ShelfScreen(
|
|||
if (showInfoDialog) {
|
||||
FileInfoDialog(
|
||||
item = item,
|
||||
usePdfFileNameAsDisplayName = uiState.usePdfFileNameAsDisplayName,
|
||||
onDismiss = { showInfoDialog = false; itemForInfoDialog = null },
|
||||
onSaveMetadata = { metadata -> viewModel.updateBookMetadata(item.bookId, metadata) },
|
||||
onSaveDisplayName = { name -> viewModel.updateCustomName(item.bookId, name) },
|
||||
|
|
@ -588,6 +594,7 @@ fun LibraryScreenContent(
|
|||
onStreamOpdsBook: (OpdsEntry, OpdsCatalog?) -> Unit,
|
||||
onDeleteCatalogStreams: (String) -> Unit,
|
||||
onSettingsClick: () -> Unit,
|
||||
usePdfFileNameAsDisplayName: Boolean,
|
||||
) {
|
||||
val isBookContextualModeActive = selectedItems.isNotEmpty()
|
||||
val isShelfContextualModeActive = selectedShelves.isNotEmpty()
|
||||
|
|
@ -860,7 +867,8 @@ fun LibraryScreenContent(
|
|||
isPinned = item.bookId in pinnedLibraryBookIds,
|
||||
onItemClick = { onItemClick(item) },
|
||||
onItemLongClick = { onItemLongClick(item) },
|
||||
isDownloading = item.bookId in downloadingBookIds
|
||||
isDownloading = item.bookId in downloadingBookIds,
|
||||
usePdfFileNameAsDisplayName = usePdfFileNameAsDisplayName
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1027,6 +1035,7 @@ private fun ShelfDetailScreen(
|
|||
onRenameShelf: () -> Unit,
|
||||
onDeleteShelf: () -> Unit,
|
||||
downloadingBookIds: Set<String>,
|
||||
usePdfFileNameAsDisplayName: Boolean,
|
||||
) {
|
||||
val isContextualModeActive = selectedItems.isNotEmpty()
|
||||
val isFolderShelf = shelf.type == ShelfType.FOLDER
|
||||
|
|
@ -1162,7 +1171,11 @@ private fun ShelfDetailScreen(
|
|||
Text(
|
||||
text = when {
|
||||
isFolderShelf && shelf.childShelfCount > 0 && shelf.directBookCount > 0 ->
|
||||
"${pluralStringResource(R.plurals.folder_count, shelf.childShelfCount, shelf.childShelfCount)} • ${getBookCountString(shelf.directBookCount)}"
|
||||
stringResource(
|
||||
R.string.folder_subtitle_folder_book_counts,
|
||||
pluralStringResource(R.plurals.folder_count, shelf.childShelfCount, shelf.childShelfCount),
|
||||
getBookCountString(shelf.directBookCount)
|
||||
)
|
||||
isFolderShelf && shelf.childShelfCount > 0 ->
|
||||
pluralStringResource(R.plurals.folder_count, shelf.childShelfCount, shelf.childShelfCount)
|
||||
isFolderShelf -> getBookCountString(shelf.directBookCount)
|
||||
|
|
@ -1322,7 +1335,8 @@ private fun ShelfDetailScreen(
|
|||
isSelected = selectedItems.any { it.bookId == item.bookId },
|
||||
onItemClick = { onBookClick(item) },
|
||||
onItemLongClick = { onBookLongClick(item) },
|
||||
isDownloading = item.bookId in downloadingBookIds
|
||||
isDownloading = item.bookId in downloadingBookIds,
|
||||
usePdfFileNameAsDisplayName = usePdfFileNameAsDisplayName
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1344,6 +1358,7 @@ private fun AddBooksModeScreen(
|
|||
onBack: () -> Unit,
|
||||
onAddSelectedBooks: () -> Unit,
|
||||
downloadingBookIds: Set<String>,
|
||||
usePdfFileNameAsDisplayName: Boolean,
|
||||
) {
|
||||
var showSortMenu by remember { mutableStateOf(false) }
|
||||
|
||||
|
|
@ -1445,7 +1460,8 @@ private fun AddBooksModeScreen(
|
|||
isSelected = isSelected,
|
||||
onItemClick = { onBookClick(item) },
|
||||
onItemLongClick = { onBookClick(item) },
|
||||
isDownloading = item.bookId in downloadingBookIds
|
||||
isDownloading = item.bookId in downloadingBookIds,
|
||||
usePdfFileNameAsDisplayName = usePdfFileNameAsDisplayName
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1631,6 +1647,7 @@ private fun LibraryListItem(
|
|||
onItemClick: () -> Unit,
|
||||
onItemLongClick: () -> Unit,
|
||||
isDownloading: Boolean,
|
||||
usePdfFileNameAsDisplayName: Boolean = false,
|
||||
) {
|
||||
androidx.compose.material3.ElevatedCard(
|
||||
shape = MaterialTheme.shapes.large,
|
||||
|
|
@ -1695,7 +1712,7 @@ private fun LibraryListItem(
|
|||
) {
|
||||
Column(modifier = Modifier.weight(1f)) {
|
||||
Text(
|
||||
text = item.cardTitle(),
|
||||
text = item.cardTitle(usePdfFileNameAsDisplayName),
|
||||
style = MaterialTheme.typography.titleSmall,
|
||||
fontWeight = FontWeight.SemiBold,
|
||||
maxLines = 2,
|
||||
|
|
@ -2358,8 +2375,7 @@ fun OpdsTab(
|
|||
opdsViewModel: OpdsViewModel = viewModel()
|
||||
) {
|
||||
val uiState by opdsViewModel.uiState.collectAsStateWithLifecycle()
|
||||
val downloadingState by opdsViewModel.downloadingState.collectAsStateWithLifecycle()
|
||||
val downloadingEntries by opdsViewModel.downloadingEntries.collectAsStateWithLifecycle()
|
||||
val downloadingState = uiState.downloadingState
|
||||
val context = LocalContext.current
|
||||
var selectedEntry by remember { mutableStateOf<OpdsEntry?>(null) }
|
||||
var showCatalogDialog by remember { mutableStateOf(false) }
|
||||
|
|
@ -2836,7 +2852,7 @@ fun OpdsNavigationCard(entry: OpdsEntry, onClick: (String) -> Unit) {
|
|||
fun OpdsBookCard(
|
||||
entry: OpdsEntry,
|
||||
localLibraryFiles: List<RecentFileItem>,
|
||||
downloadState: OpdsViewModel.DownloadState?,
|
||||
downloadState: OpdsDownloadState?,
|
||||
onDownloadClick: (OpdsAcquisition) -> Unit,
|
||||
onReadClick: (RecentFileItem) -> Unit,
|
||||
onStreamClick: () -> Unit,
|
||||
|
|
@ -2967,7 +2983,7 @@ fun OpdsBookCard(
|
|||
fun OpdsBookDetailsSheet(
|
||||
entry: OpdsEntry,
|
||||
localLibraryFiles: List<RecentFileItem>,
|
||||
downloadState: OpdsViewModel.DownloadState?,
|
||||
downloadState: OpdsDownloadState?,
|
||||
onDownloadFormat: (OpdsAcquisition) -> Unit,
|
||||
onReadClick: (RecentFileItem) -> Unit,
|
||||
onStreamClick: () -> Unit,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue