How geometer/fbreaderj works
Purpose and runtime
This is a legacy Android FBReader e-book reader application. It combines Java Android UI/application code, a reusable ZLibrary reading stack, SQLite-backed local state, and JNI/C++ parsers for native book formats. The Android manifest and Ant project files are the packaging/build roots: AndroidManifest.xml, build.xml, jni/Android.mk.
Application entry and orchestration
Android launches the reader application/activity layer, centered on FBReaderApplication.java and FBReaderMainActivity.java; FBReader.java bridges Android lifecycle/UI events into the core reader. Reader commands are action objects, separating menus, gestures, selection, search, navigation, and external intents from the engine.
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/FBReaderApplication.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/FBReaderMainActivity.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/FBReader.java
Core reading model and rendering pipeline
FBReaderApp owns reading state and actions; opening a book builds a BookModel with text, metadata, and TOC. FBView drives reader-level view behavior, while ZLibrary text models, cursor/layout, and Android paint/widget implementations paginate and render content. Input maps/tap zones and styles are asset-driven.
• fbreader/app/src/main/java/org/geometerplus/fbreader/fbreader/FBReaderApp.java
• fbreader/app/src/main/java/org/geometerplus/fbreader/bookmodel/BookModel.java
• fbreader/app/src/main/java/org/geometerplus/zlibrary/text/view/ZLTextView.java
• fbreader/app/src/main/java/org/geometerplus/zlibrary/ui/android/view/MainView.java
• assets/default/tapzones/left_to_right.xml
Format ingestion and native boundary
Format selection is abstracted by PluginCollection/FormatPlugin; Java supports built-in, native, and external plugins. JNI native code implements parsing and model construction for FB2, EPUB/OEB, HTML, DOC, RTF, PDB/Mobipocket, TXT, and related archive/XML handling. This Java↔C++ boundary is architecturally critical for book loading and metadata/cover extraction.
• fbreader/app/src/main/java/org/geometerplus/fbreader/formats/PluginCollection.java
• fbreader/app/src/main/java/org/geometerplus/fbreader/formats/NativeFormatPlugin.java
• jni/NativeFormats/JavaNativeFormatPlugin.cpp
• jni/NativeFormats/fbreader/src/formats/oeb/OEBPlugin.cpp
Local library, configuration, and persistence
Core book entities and collection interfaces are platform-neutral. Android services expose library and config operations through AIDL and persist to SQLite; activities/adapters present library trees, searching, book information, covers, bookmarks, and reading positions. These service boundaries allow UI clients to access durable state without owning database implementation.
• fbreader/app/src/main/java/org/geometerplus/fbreader/book/BookCollection.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/libraryService/LibraryService.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/libraryService/SQLiteBooksDatabase.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/config/SQLiteConfig.java
Network catalogs, downloads, and synchronization
The network domain represents catalogs and books independently of Android. It supports OPDS/Atom/RSS discovery, custom catalogs, search, authenticated LitRes commerce, and downloads. Android activities/services provide authentication context, downloader execution, local network cache, and bookmark synchronization. External dependencies are remote OPDS/RSS/catalog endpoints, LitRes services, and Android browser/share integrations.
• fbreader/app/src/main/java/org/geometerplus/fbreader/network/NetworkLibrary.java
• fbreader/app/src/main/java/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/network/BookDownloaderService.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/sync/SyncService.java
Platform services, assets, and integrations
ZLibrary supplies filesystem, resources, networking, options, images, XML, encodings, and text hyphenation abstractions; Android implementations adapt these to device APIs. Bundled assets provide translations, hyphenation/language recognition, format entities, styles, dictionaries, and plugin defaults. The app also exposes AIDL APIs and an embedded HTTP data service; dictionary lookup delegates to installed external dictionary apps/APIs.
• fbreader/app/src/main/java/org/geometerplus/zlibrary/core/application/ZLApplication.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/api/ApiService.java
• fbreader/app/src/main/java/org/geometerplus/android/fbreader/httpd/DataService.java
• assets/hyphenationPatterns/en.pattern
Main entry points: FBReaderApp.java Reading state · BookCollection.java Book collection API · LibraryService.java Library service · FBReaderMainActivity.java Application & activity UI
Components 24
Android app
- Application & activity UI
fbreader/app/src/main/java/org/geometerplus/android/fbreader/FBReaderMainActivity.java - Reader application
fbreader/app/src/main/java/org/geometerplus/android/fbreader/FBReaderApplication.java - Lifecycle bridge · Bridges Android lifecycle and UI events into the reader engine.
fbreader/app/src/main/java/org/geometerplus/android/fbreader/FBReader.java - Reader actions · Menus, gestures, selection, search, navigation, and intents.
Reading engine
- Reading state · Owns active reading state and actions.
fbreader/app/src/main/java/org/geometerplus/fbreader/fbreader/FBReaderApp.java - Book model · Contains book text, metadata, and table of contents.
fbreader/app/src/main/java/org/geometerplus/fbreader/bookmodel/BookModel.java - Text layout & pagination
fbreader/app/src/main/java/org/geometerplus/zlibrary/text/view/ZLTextView.java - Android reader rendering
fbreader/app/src/main/java/org/geometerplus/zlibrary/ui/android/view/MainView.java
Format ingestion
- Format plugin selection · Selects built-in, native, and external format handlers.
fbreader/app/src/main/java/org/geometerplus/fbreader/formats/PluginCollection.java - Native format adapter
fbreader/app/src/main/java/org/geometerplus/fbreader/formats/NativeFormatPlugin.java - C++ format parsers · Parses native formats and constructs models, metadata, and covers.
jni/NativeFormats/JavaNativeFormatPlugin.cpp
Library & state
- Book collection API
fbreader/app/src/main/java/org/geometerplus/fbreader/book/BookCollection.java - Library service · Exposes durable library operations to UI clients.
fbreader/app/src/main/java/org/geometerplus/android/fbreader/libraryService/LibraryService.java - Books SQLite database
fbreader/app/src/main/java/org/geometerplus/android/fbreader/libraryService/SQLiteBooksDatabase.java - Configuration SQLite
fbreader/app/src/main/java/org/geometerplus/android/fbreader/config/SQLiteConfig.java
Network services
- Catalog domain · Represents catalogs and network books independently of Android.
fbreader/app/src/main/java/org/geometerplus/fbreader/network/NetworkLibrary.java - OPDS catalog links
fbreader/app/src/main/java/org/geometerplus/fbreader/network/opds/OPDSNetworkLink.java - Book downloader
fbreader/app/src/main/java/org/geometerplus/android/fbreader/network/BookDownloaderService.java - Bookmark synchronization
fbreader/app/src/main/java/org/geometerplus/android/fbreader/sync/SyncService.java
Platform & build
- Android packaging build · Manifest, Ant, and NDK roots package Java and native code.
build.xml - Tap zones & language assets · Controls gestures, styles, and hyphenation.
assets/default/tapzones/left_to_right.xml - External API service
fbreader/app/src/main/java/org/geometerplus/android/fbreader/api/ApiService.java - Embedded data service
fbreader/app/src/main/java/org/geometerplus/android/fbreader/httpd/DataService.java
Other components
- Remote catalog services · OPDS, RSS, custom catalogs, and LitRes services.
Connections 26
- Android packaging build → Application & activity UI: packages
- Android packaging build → C++ format parsers: builds via NDK
- Reader application → Application & activity UI: initializes
- Application & activity UI → Lifecycle bridge: lifecycle events
- Lifecycle bridge → Reading state: controls
- Reader actions → Reading state: invoke
- Reading state → Book model: opens
- Reading state → Text layout & pagination: drives
- Text layout & pagination → Android reader rendering: renders through
- Tap zones & language assets → Text layout & pagination: styles and hyphenates
- Tap zones & language assets → Reader actions: maps taps
- Reading state → Format plugin selection: loads books through
- Format plugin selection → Native format adapter: selects
- Native format adapter → C++ format parsers: JNI calls
- C++ format parsers → Book model: constructs
- Reading state → Book collection API: uses library
- Book collection API → Library service: implemented by
- Library service → Books SQLite database: persists
- Reader application → Configuration SQLite: stores options
- Catalog domain → OPDS catalog links: discovers via
- OPDS catalog links → Remote catalog services: requests
- Catalog domain → Book downloader: queues downloads
- Book downloader → Book collection API: adds local books
- Bookmark synchronization → Library service: syncs bookmarks
- External API service → Library service: exposes library
- Embedded data service → Book collection API: serves book data