NeoShelf
NeoShelf is NeoQN's intelligent reading-status dashboard built directly into the Library tab. Instead of forcing you to scroll through every book you've ever added, NeoShelf automatically groups them into meaningful shelves based on your reading behaviour and activity patterns — no manual sorting required.
Accessing NeoShelf
Open the Library tab and swipe across to the NeoShelf category. This tab is a system-locked, always-present shelf that cannot be deleted or reordered.
Smart Shelves
NeoShelf computes five adaptive shelves from your library data each time the Library tab loads:
Currently Reading
Books with a Reading bookmark status that you have opened in the reader within the last 7 days, sorted with the most recently accessed first. This shelf is your daily reading queue.
Almost Done
Books where your chapter progress exceeds 80% of total downloaded chapters, but you have not yet completed or dropped the title. These are sorted by completion percentage descending so the closest-to-finished titles surface first.
Long Abandoned
Books marked Reading that haven't had any activity (no reader access, no new download, no chapter update) in over 30 days. These are sorted with the most stale titles first, nudging you to revisit or drop them.
Completed Recently
Books you've marked Completed within the last 14 days, sorted by last access timestamp. Useful for post-read reflection or finding a sequel.
Worth Revisiting
Books marked Completed with no activity in over 90 days — old favourites you might want to re-read. These are sorted with the longest-dormant titles first.
Empty shelves are automatically hidden. If you're a new user, NeoShelf will populate as you read and your library grows.
NeoShelf Engine (Backend Specifications)
NeoShelf is computed on-demand by NeoShelfEngine.compute(), called each time the Library tab refreshes or a download event fires.
Data Sources
The engine receives two inputs:
- `cards`: The full set of
DownloadDataLoadedentries from the in-memorycardsDataconcurrent map, locked using a coroutineMutexto guarantee thread-safe reads. - `lastAccessMap`: A
Map<Int, Long>correlating novel IDs to their last reader-session timestamps, kept in memory by theDownloadViewModel.
Classification Logic
Each book is evaluated sequentially against all five shelf criteria, and a book may appear in multiple shelves simultaneously. Classification uses:
| Shelf | Conditions | |---|---| | Currently Reading | ReadType.READING AND lastAccess <= 7 days | | Almost Done | progress > 80% AND not COMPLETED/DROPPED/currently reading | | Long Abandoned | ReadType.READING AND lastActive > 30 days ago | | Completed Recently | ReadType.COMPLETED AND lastAccess <= 14 days | | Worth Revisiting | ReadType.COMPLETED AND lastActive > 90 days ago |
The lastActive signal is computed as the maximum of lastAccess, lastDownloaded, and lastUpdated to produce a robust freshness signal even for books you've downloaded without opening.
Result
The engine returns a List<NeoShelf>, each with a title: String and items: List<DownloadDataLoaded>. Empty shelves are filtered out before the result is posted to _neoShelfPage via postValue(), keeping the UI clean.