├── .github └── FUNDING.yml ├── .gitignore ├── .metadata ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── kotlin │ │ │ └── dev │ │ │ │ └── jideguru │ │ │ │ └── flutter_ebook_app │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── settings.gradle └── settings_aar.gradle ├── assets └── images │ ├── app-icon.png │ ├── empty.png │ └── place.png ├── ios ├── .gitignore ├── Flutter │ ├── .last_build_id │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── book-icon-1024.png │ │ ├── book-icon-20.png │ │ ├── book-icon-20@2x.png │ │ ├── book-icon-20@3x.png │ │ ├── book-icon-29.png │ │ ├── book-icon-29@2x.png │ │ ├── book-icon-29@3x.png │ │ ├── book-icon-40.png │ │ ├── book-icon-40@2x.png │ │ ├── book-icon-40@3x.png │ │ ├── book-icon-60@2x.png │ │ ├── book-icon-60@3x.png │ │ ├── book-icon-76.png │ │ ├── book-icon-76@2x.png │ │ └── book-icon-83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── main.dart └── src │ ├── app.dart │ ├── common │ ├── application │ │ ├── application.dart │ │ └── services │ │ │ ├── current_app_theme_service.dart │ │ │ └── services.dart │ ├── common.dart │ ├── constants │ │ ├── api.dart │ │ ├── constants.dart │ │ ├── shared_preferences_key.dart │ │ ├── strings.dart │ │ └── utils.dart │ ├── data │ │ ├── data.dart │ │ ├── data_sources │ │ │ ├── data_sources.dart │ │ │ ├── downloads │ │ │ │ ├── downloads_local_data_source.dart │ │ │ │ └── downloads_local_data_source_impl.dart │ │ │ └── favorites │ │ │ │ ├── favorites_local_data_source.dart │ │ │ │ └── favorites_local_data_source_impl.dart │ │ ├── database │ │ │ ├── database.dart │ │ │ └── database_config.dart │ │ ├── failures │ │ │ └── http_failure.dart │ │ ├── local │ │ │ └── local_storage.dart │ │ ├── remote │ │ │ ├── adapter │ │ │ │ ├── adapter.dart │ │ │ │ ├── mobile_adapter.dart │ │ │ │ ├── unsupported.dart │ │ │ │ └── web_adapter.dart │ │ │ └── app_dio.dart │ │ └── repositories │ │ │ ├── book │ │ │ └── book_repository.dart │ │ │ ├── downloads │ │ │ └── downloads_repository.dart │ │ │ ├── favorites │ │ │ └── favorites_repository.dart │ │ │ └── repositories.dart │ ├── domain │ │ ├── domain.dart │ │ └── models │ │ │ ├── category_feed.dart │ │ │ └── models.dart │ ├── extensions │ │ ├── context_extensions.dart │ │ ├── extensions.dart │ │ └── theme_extensions.dart │ ├── presentation │ │ ├── notifiers │ │ │ ├── current_app_theme │ │ │ │ ├── current_app_theme_notifier.dart │ │ │ │ └── current_app_theme_notifier.g.dart │ │ │ ├── downloads │ │ │ │ ├── downloads_notifier.dart │ │ │ │ └── downloads_notifier.g.dart │ │ │ ├── favorites │ │ │ │ ├── favorites_notifier.dart │ │ │ │ └── favorites_notifier.g.dart │ │ │ └── notifiers.dart │ │ ├── presentation.dart │ │ ├── providers │ │ │ ├── database_provider.dart │ │ │ ├── dio_provider.dart │ │ │ ├── providers.dart │ │ │ └── shared_preferences_provider.dart │ │ ├── theme │ │ │ └── theme_config.dart │ │ └── ui │ │ │ ├── ui.dart │ │ │ └── widgets │ │ │ ├── animated_page_splitter.dart │ │ │ ├── book_card.dart │ │ │ ├── book_item.dart │ │ │ ├── book_list_item.dart │ │ │ ├── description_text.dart │ │ │ ├── empty_view.dart │ │ │ ├── error_widget.dart │ │ │ ├── loading_widget.dart │ │ │ ├── modal_dialogs │ │ │ ├── custom_alert.dart │ │ │ ├── download_alert.dart │ │ │ ├── exit_modal_dialog.dart │ │ │ └── modal_dialogs.dart │ │ │ ├── responsive_widget.dart │ │ │ └── widgets.dart │ ├── router │ │ ├── app_router.dart │ │ └── app_router.gr.dart │ └── utils │ │ ├── riverpod_observer.dart │ │ └── utils.dart │ ├── debug_page.dart │ └── features │ ├── book_details │ ├── book_details.dart │ ├── data │ │ ├── data.dart │ │ └── repositories │ │ │ ├── book_details_repository.dart │ │ │ └── repositories.dart │ └── presentation │ │ ├── notifier │ │ ├── book_details_notifier.dart │ │ ├── book_details_notifier.g.dart │ │ └── notifiers.dart │ │ ├── presentation.dart │ │ └── ui │ │ ├── screens │ │ ├── book_details_screen.dart │ │ └── screens.dart │ │ └── ui.dart │ ├── downloads │ ├── downloads.dart │ └── presentation │ │ ├── presentation.dart │ │ └── ui │ │ ├── screens │ │ ├── download_screen.dart │ │ └── screens.dart │ │ └── ui.dart │ ├── explore │ ├── data │ │ ├── data.dart │ │ └── repositories │ │ │ ├── explore_repository.dart │ │ │ └── repositories.dart │ ├── explore.dart │ └── presentation │ │ ├── notifiers │ │ ├── genre_feed │ │ │ ├── genre_feed_notifier.dart │ │ │ └── genre_feed_notifier.g.dart │ │ └── notifiers.dart │ │ ├── presentation.dart │ │ └── ui │ │ ├── screens │ │ ├── explore_screen.dart │ │ ├── explore_screen_large.dart │ │ ├── explore_screen_small.dart │ │ ├── genre_screen.dart │ │ └── screens.dart │ │ └── ui.dart │ ├── favorites │ ├── favourites.dart │ └── presentation │ │ ├── presentation.dart │ │ └── ui │ │ ├── screens │ │ ├── favorites_screen.dart │ │ └── screens.dart │ │ └── ui.dart │ ├── features.dart │ ├── home │ ├── data │ │ ├── data.dart │ │ └── repositories │ │ │ ├── home_repository.dart │ │ │ └── repositories.dart │ ├── home.dart │ └── presentation │ │ ├── notifiers │ │ ├── home_feed_notifier.dart │ │ ├── home_feed_notifier.g.dart │ │ └── notifiers.dart │ │ ├── presentation.dart │ │ └── ui │ │ ├── screens │ │ ├── home_screen.dart │ │ ├── home_screen_large.dart │ │ ├── home_screen_small.dart │ │ └── screens.dart │ │ └── ui.dart │ ├── settings │ ├── presentation │ │ ├── presentation.dart │ │ └── ui │ │ │ ├── screens │ │ │ ├── licenses_screen.dart │ │ │ ├── screens.dart │ │ │ ├── settings_screen.dart │ │ │ ├── settings_screen_large.dart │ │ │ └── settings_screen_small.dart │ │ │ └── ui.dart │ └── settings.dart │ ├── splash │ ├── presentation │ │ ├── presentation.dart │ │ └── ui │ │ │ ├── screens │ │ │ ├── screens.dart │ │ │ └── splash_screen.dart │ │ │ └── ui.dart │ └── splash.dart │ └── tabs │ ├── presentation │ ├── notifiers │ │ ├── current_tab_notifier.dart │ │ └── notifiers.dart │ ├── presentation.dart │ └── ui │ │ ├── screens │ │ ├── screens.dart │ │ ├── tabs_screen.dart │ │ ├── tabs_screen_large.dart │ │ └── tabs_screen_small.dart │ │ └── ui.dart │ └── tabs.dart ├── linux ├── .gitignore ├── CMakeLists.txt ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake ├── main.cc ├── my_application.cc └── my_application.h ├── macos ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── app_icon_1024.png │ │ ├── app_icon_128.png │ │ ├── app_icon_16.png │ │ ├── app_icon_256.png │ │ ├── app_icon_32.png │ │ ├── app_icon_512.png │ │ └── app_icon_64.png │ ├── Base.lproj │ └── MainMenu.xib │ ├── Configs │ ├── AppInfo.xcconfig │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── Warnings.xcconfig │ ├── DebugProfile.entitlements │ ├── Info.plist │ ├── MainFlutterWindow.swift │ └── Release.entitlements ├── packages └── iridium │ ├── components │ ├── commons │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── example │ │ │ ├── lib │ │ │ │ └── main.dart │ │ │ └── pubspec.yaml │ │ ├── lib │ │ │ ├── extensions │ │ │ │ ├── data.dart │ │ │ │ ├── files.dart │ │ │ │ ├── strings.dart │ │ │ │ └── uri.dart │ │ │ ├── io.dart │ │ │ ├── io │ │ │ │ └── file_not_found_exception.dart │ │ │ └── utils │ │ │ │ ├── condition_predicate.dart │ │ │ │ ├── condition_type.dart │ │ │ │ ├── exceptions.dart │ │ │ │ ├── file_utils.dart │ │ │ │ ├── functions.dart │ │ │ │ ├── href.dart │ │ │ │ ├── injectable.dart │ │ │ │ ├── jsonable.dart │ │ │ │ ├── predicate.dart │ │ │ │ ├── ref.dart │ │ │ │ ├── take.dart │ │ │ │ ├── try.dart │ │ │ │ └── uri_template.dart │ │ ├── pubspec.yaml │ │ └── test │ │ │ ├── extensions │ │ │ ├── file_test.dart │ │ │ ├── json_test.dart │ │ │ └── url_test.dart │ │ │ └── util │ │ │ ├── href_test.dart │ │ │ └── uri_template_test.dart │ ├── lcp │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── assets │ │ │ └── prod-license.lcpl │ │ ├── example │ │ │ ├── lib │ │ │ │ └── main.dart │ │ │ └── pubspec.yaml │ │ ├── lib │ │ │ ├── auth │ │ │ │ └── lcp_passphrase_authentication.dart │ │ │ ├── drm │ │ │ │ ├── drm_context.dart │ │ │ │ ├── drm_error.dart │ │ │ │ ├── drm_exception.dart │ │ │ │ └── lcp_result.dart │ │ │ ├── i18n │ │ │ │ ├── lcp_localizations.dart │ │ │ │ └── localizations │ │ │ │ │ ├── messages_all.dart │ │ │ │ │ ├── messages_de.dart │ │ │ │ │ ├── messages_en.dart │ │ │ │ │ ├── messages_es.dart │ │ │ │ │ └── messages_fr.dart │ │ │ ├── io │ │ │ │ ├── file_util.dart │ │ │ │ └── uint8list_converter.dart │ │ │ ├── lcp.dart │ │ │ ├── lcp_authenticating.dart │ │ │ ├── lcp_client.dart │ │ │ ├── lcp_content_protection.dart │ │ │ ├── lcp_content_protection_service.dart │ │ │ ├── lcp_decryptor.dart │ │ │ ├── lcp_error.dart │ │ │ ├── lcp_exception.dart │ │ │ ├── lcp_license.dart │ │ │ ├── lcp_native.dart │ │ │ ├── lcp_parsing_error.dart │ │ │ ├── lcp_service.dart │ │ │ ├── license │ │ │ │ ├── container │ │ │ │ │ ├── bytes_license_container.dart │ │ │ │ │ ├── epub_license_container.dart │ │ │ │ │ ├── lcpl_license_container.dart │ │ │ │ │ ├── license_container.dart │ │ │ │ │ ├── web_pub_license_container.dart │ │ │ │ │ └── zip_license_container.dart │ │ │ │ ├── license.dart │ │ │ │ ├── license_validation.dart │ │ │ │ ├── license_validation_events.dart │ │ │ │ ├── license_validation_state_machine.dart │ │ │ │ ├── license_validation_states.dart │ │ │ │ └── model │ │ │ │ │ ├── components │ │ │ │ │ ├── lcp │ │ │ │ │ │ ├── content_key.dart │ │ │ │ │ │ ├── encryption.dart │ │ │ │ │ │ ├── rights.dart │ │ │ │ │ │ ├── signature.dart │ │ │ │ │ │ ├── user.dart │ │ │ │ │ │ └── user_key.dart │ │ │ │ │ ├── link.dart │ │ │ │ │ ├── links.dart │ │ │ │ │ └── lsd │ │ │ │ │ │ ├── event.dart │ │ │ │ │ │ └── potential_rights.dart │ │ │ │ │ ├── license_document.dart │ │ │ │ │ └── status_document.dart │ │ │ ├── material_renew_listener.dart │ │ │ ├── native │ │ │ │ ├── lcp_client_native.dart │ │ │ │ └── lcp_native.dart │ │ │ ├── persistence │ │ │ │ ├── lcp_database.dart │ │ │ │ ├── licenses.dart │ │ │ │ └── transactions.dart │ │ │ ├── service │ │ │ │ ├── crl_service.dart │ │ │ │ ├── device_repository.dart │ │ │ │ ├── device_service.dart │ │ │ │ ├── licenses_repository.dart │ │ │ │ ├── licenses_service.dart │ │ │ │ ├── network_service.dart │ │ │ │ ├── passphrases_repository.dart │ │ │ │ └── passphrases_service.dart │ │ │ └── utils │ │ │ │ └── zip_utils.dart │ │ └── pubspec.yaml │ ├── navigator │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── assets │ │ │ ├── _scripts │ │ │ │ ├── .eslintrc.json │ │ │ │ ├── .gitignore │ │ │ │ ├── .prettierignore │ │ │ │ ├── .prettierrc.json │ │ │ │ ├── README.md │ │ │ │ ├── babel.config.json │ │ │ │ ├── package.json │ │ │ │ ├── src │ │ │ │ │ ├── decorator.js │ │ │ │ │ ├── flutter.js │ │ │ │ │ ├── gestures.js │ │ │ │ │ ├── highlight.js │ │ │ │ │ ├── index-fixed.js │ │ │ │ │ ├── index-reflowable.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── rect.js │ │ │ │ │ ├── selection.js │ │ │ │ │ ├── utils.js │ │ │ │ │ └── vendor │ │ │ │ │ │ └── hypothesis │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── anchoring │ │ │ │ │ │ ├── html.js │ │ │ │ │ │ ├── match-quote.js │ │ │ │ │ │ ├── pdf.js │ │ │ │ │ │ ├── placeholder.js │ │ │ │ │ │ ├── test │ │ │ │ │ │ ├── fake-pdf-viewer-application.js │ │ │ │ │ │ ├── html-anchoring-fixture.html │ │ │ │ │ │ ├── html-baselines │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── minimal.html │ │ │ │ │ │ │ ├── minimal.json │ │ │ │ │ │ │ ├── wikipedia-regression-testing.html │ │ │ │ │ │ │ └── wikipedia-regression-testing.json │ │ │ │ │ │ ├── html-test.js │ │ │ │ │ │ ├── match-quote-test.js │ │ │ │ │ │ ├── pdf-test.js │ │ │ │ │ │ ├── placeholder-test.js │ │ │ │ │ │ ├── text-range-test.js │ │ │ │ │ │ ├── types-test.js │ │ │ │ │ │ └── xpath-test.js │ │ │ │ │ │ ├── text-range.js │ │ │ │ │ │ ├── types.js │ │ │ │ │ │ └── xpath.js │ │ │ │ ├── webpack.config.js │ │ │ │ └── yarn.lock │ │ │ ├── readium │ │ │ │ ├── assets │ │ │ │ │ ├── bookmark.svg │ │ │ │ │ └── edit.svg │ │ │ │ ├── divina │ │ │ │ │ ├── divinaPlayer.html │ │ │ │ │ ├── divinaPlayer.js │ │ │ │ │ └── divinaTouchHandling.js │ │ │ │ ├── fonts │ │ │ │ │ └── OpenDyslexic-Regular.otf │ │ │ │ ├── readium-css │ │ │ │ │ ├── ReadMe.md │ │ │ │ │ ├── ReadiumCSS-after.css │ │ │ │ │ ├── ReadiumCSS-before.css │ │ │ │ │ ├── ReadiumCSS-default.css │ │ │ │ │ ├── ReadiumCSS-ebpaj_fonts_patch.css │ │ │ │ │ ├── ReadiumCSS-pagination.css │ │ │ │ │ ├── cjk-horizontal │ │ │ │ │ │ ├── ReadiumCSS-after.css │ │ │ │ │ │ ├── ReadiumCSS-before.css │ │ │ │ │ │ └── ReadiumCSS-default.css │ │ │ │ │ ├── cjk-vertical │ │ │ │ │ │ ├── ReadiumCSS-after.css │ │ │ │ │ │ ├── ReadiumCSS-before.css │ │ │ │ │ │ └── ReadiumCSS-default.css │ │ │ │ │ ├── fonts │ │ │ │ │ │ ├── AccessibleDfA.otf │ │ │ │ │ │ ├── LICENSE-AccessibleDfa │ │ │ │ │ │ ├── LICENSE-IaWriterDuospace.md │ │ │ │ │ │ └── iAWriterDuospace-Regular.ttf │ │ │ │ │ └── rtl │ │ │ │ │ │ ├── ReadiumCSS-after.css │ │ │ │ │ │ ├── ReadiumCSS-before.css │ │ │ │ │ │ └── ReadiumCSS-default.css │ │ │ │ └── scripts │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── readium-fixed.js │ │ │ │ │ └── readium-reflowable.js │ │ │ ├── xpub-assets │ │ │ │ └── bookmark.svg │ │ │ ├── xpub-js │ │ │ │ ├── Gestures.js │ │ │ │ ├── Main.js │ │ │ │ ├── ReadiumCSS-after.css │ │ │ │ ├── ReadiumCSS-before.css │ │ │ │ ├── ReadiumCSS-default.css │ │ │ │ ├── Recordings.js │ │ │ │ ├── Reflowable_Viewport.js │ │ │ │ ├── Storage.js │ │ │ │ ├── Theme.js │ │ │ │ ├── controllers │ │ │ │ │ ├── bookmarks.js │ │ │ │ │ ├── highlight.js │ │ │ │ │ └── tts.js │ │ │ │ ├── fonts.css │ │ │ │ ├── model │ │ │ │ │ ├── bookmark_data.js │ │ │ │ │ ├── current_pages_info.js │ │ │ │ │ ├── location.js │ │ │ │ │ ├── package.js │ │ │ │ │ ├── package_data.js │ │ │ │ │ ├── page_open_request.js │ │ │ │ │ └── spine_item.js │ │ │ │ ├── pagination.css │ │ │ │ ├── utils │ │ │ │ │ ├── cfi.js │ │ │ │ │ ├── cfi_navigation_logic.js │ │ │ │ │ ├── rangefix.js │ │ │ │ │ └── tools.js │ │ │ │ ├── xpub.css │ │ │ │ ├── xpub_location.js │ │ │ │ ├── xpub_navigation.js │ │ │ │ ├── xpub_navigation_fixed_layout.js │ │ │ │ └── xpub_navigation_reflow_layout.js │ │ │ └── xpub-shared-js │ │ │ │ ├── globals.js │ │ │ │ ├── helpers.js │ │ │ │ ├── jquery-2.1.0.min.js │ │ │ │ ├── jquery-3.6.0.min.js │ │ │ │ ├── jquery.mobile-1.4.5.min.js │ │ │ │ ├── jquerymobile-swipeupdown.js │ │ │ │ ├── polyfill.js │ │ │ │ ├── readium-cfi-js.js │ │ │ │ └── underscore-min.js │ │ ├── lib │ │ │ ├── cbz.dart │ │ │ ├── epub.dart │ │ │ ├── publication.dart │ │ │ └── src │ │ │ │ ├── cbz │ │ │ │ ├── cbz_controller.dart │ │ │ │ └── widget │ │ │ │ │ └── cbz_navigator.dart │ │ │ │ ├── epub │ │ │ │ ├── bloc │ │ │ │ │ ├── current_spine_item_bloc.dart │ │ │ │ │ ├── reader_theme_bloc.dart │ │ │ │ │ └── viewer_settings_bloc.dart │ │ │ │ ├── callbacks │ │ │ │ │ ├── epub_callbacks.dart │ │ │ │ │ ├── epub_webview_listener.dart │ │ │ │ │ ├── javascript_channels.dart │ │ │ │ │ ├── launcher_ui_channels.dart │ │ │ │ │ ├── model │ │ │ │ │ │ ├── pagination_info.dart │ │ │ │ │ │ └── tap_event.dart │ │ │ │ │ ├── navigation_controller.dart │ │ │ │ │ ├── readium_channels.dart │ │ │ │ │ └── webview_listener.dart │ │ │ │ ├── decoration.dart │ │ │ │ ├── decoration_change.dart │ │ │ │ ├── epub_controller.dart │ │ │ │ ├── extensions │ │ │ │ │ └── decoration_change.dart │ │ │ │ ├── html │ │ │ │ │ └── html_decoration_template.dart │ │ │ │ ├── js │ │ │ │ │ └── js_api.dart │ │ │ │ ├── model │ │ │ │ │ ├── annotation_mark_template.dart │ │ │ │ │ ├── decoration_style_annotation_mark.dart │ │ │ │ │ ├── epub_reader_state.dart │ │ │ │ │ ├── open_page_request.dart │ │ │ │ │ └── selection.dart │ │ │ │ ├── selection │ │ │ │ │ ├── annotation_popup.dart │ │ │ │ │ ├── highlight_popup.dart │ │ │ │ │ ├── new_selection_popup.dart │ │ │ │ │ ├── selection_listener.dart │ │ │ │ │ ├── selection_listener_factory.dart │ │ │ │ │ ├── selection_popup.dart │ │ │ │ │ └── simple_selection_listener.dart │ │ │ │ ├── settings │ │ │ │ │ ├── letter_spacing.dart │ │ │ │ │ ├── line_height.dart │ │ │ │ │ ├── reader_theme_config.dart │ │ │ │ │ ├── readium_theme_values.dart │ │ │ │ │ ├── screenshot_config.dart │ │ │ │ │ ├── text_align.dart │ │ │ │ │ ├── text_margin.dart │ │ │ │ │ ├── value_settings.dart │ │ │ │ │ ├── viewer_settings.dart │ │ │ │ │ └── word_spacing.dart │ │ │ │ ├── utils │ │ │ │ │ └── toc_utils.dart │ │ │ │ └── widget │ │ │ │ │ ├── epub_navigator.dart │ │ │ │ │ ├── listeners │ │ │ │ │ └── web_view_horizontal_gesture_recognizer.dart │ │ │ │ │ ├── webview_screen.dart │ │ │ │ │ ├── webview_screen_state.dart │ │ │ │ │ └── webview_screen_state_stub.dart │ │ │ │ └── publication │ │ │ │ ├── model │ │ │ │ ├── annotation_type.dart │ │ │ │ ├── annotation_type_and_idref_predicate.dart │ │ │ │ ├── annotation_type_predicate.dart │ │ │ │ ├── highlight_style.dart │ │ │ │ ├── in_memory_reader_annotation_repository.dart │ │ │ │ ├── reader_annotation.dart │ │ │ │ └── reader_annotation_repository.dart │ │ │ │ ├── publication_controller.dart │ │ │ │ ├── reader_command_processor.dart │ │ │ │ ├── reader_commands.dart │ │ │ │ ├── reader_context.dart │ │ │ │ └── widget │ │ │ │ ├── publication_navigator.dart │ │ │ │ ├── spine_item_context.dart │ │ │ │ └── tap_gesture.dart │ │ └── pubspec.yaml │ ├── opds │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── example │ │ │ ├── lib │ │ │ │ ├── acquisition-feed.atom │ │ │ │ └── main.dart │ │ │ └── pubspec.yaml │ │ ├── lib │ │ │ ├── mno_opds.dart │ │ │ └── src │ │ │ │ └── opds │ │ │ │ ├── opds1parser.dart │ │ │ │ └── opds2parser.dart │ │ ├── pubspec.yaml │ │ └── test │ │ │ └── opds │ │ │ ├── acquisition-feed.atom │ │ │ ├── entry.atom │ │ │ ├── nav-feed.atom │ │ │ └── opds1parser_test.dart │ ├── rec_pub_get.sh │ ├── server │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── example │ │ │ ├── lib │ │ │ │ └── main.dart │ │ │ └── pubspec.yaml │ │ ├── lib │ │ │ ├── mno_server.dart │ │ │ └── src │ │ │ │ └── blocs │ │ │ │ └── server │ │ │ │ ├── asset_provider.dart │ │ │ │ ├── handlers │ │ │ │ ├── android │ │ │ │ │ ├── android_request.dart │ │ │ │ │ └── android_response.dart │ │ │ │ ├── assets_request_handler.dart │ │ │ │ ├── fetcher_request_handler.dart │ │ │ │ ├── http │ │ │ │ │ ├── http_request.dart │ │ │ │ │ └── http_response.dart │ │ │ │ ├── request.dart │ │ │ │ ├── request_handler.dart │ │ │ │ └── response.dart │ │ │ │ ├── html_injector.dart │ │ │ │ ├── request_controller.dart │ │ │ │ ├── resources.dart │ │ │ │ ├── server_bloc.dart │ │ │ │ ├── server_event.dart │ │ │ │ └── server_state.dart │ │ └── pubspec.yaml │ ├── shared │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── example │ │ │ ├── lib │ │ │ │ └── main.dart │ │ │ └── pubspec.yaml │ │ ├── lib │ │ │ ├── archive.dart │ │ │ ├── container.dart │ │ │ ├── epub.dart │ │ │ ├── fetcher.dart │ │ │ ├── i18n │ │ │ │ ├── locale_utils.dart │ │ │ │ ├── localizations │ │ │ │ │ ├── messages_all.dart │ │ │ │ │ ├── messages_de.dart │ │ │ │ │ ├── messages_en.dart │ │ │ │ │ ├── messages_es.dart │ │ │ │ │ └── messages_fr.dart │ │ │ │ ├── localizations_repository.dart │ │ │ │ └── reader_shared_localizations.dart │ │ │ ├── mediatype.dart │ │ │ ├── opds.dart │ │ │ ├── publication.dart │ │ │ ├── src │ │ │ │ ├── container │ │ │ │ │ ├── container.dart │ │ │ │ │ ├── file_container.dart │ │ │ │ │ └── zip_container.dart │ │ │ │ ├── fetcher │ │ │ │ │ ├── archive_fetcher.dart │ │ │ │ │ ├── bytes_resource.dart │ │ │ │ │ ├── fetcher.dart │ │ │ │ │ ├── file_fetcher.dart │ │ │ │ │ ├── filter.dart │ │ │ │ │ ├── http_fetcher.dart │ │ │ │ │ ├── resource.dart │ │ │ │ │ ├── resource_exception.dart │ │ │ │ │ ├── routing_fetcher.dart │ │ │ │ │ └── transforming_fetcher.dart │ │ │ │ ├── mediatype │ │ │ │ │ ├── charset.dart │ │ │ │ │ ├── charsets.dart │ │ │ │ │ ├── mediatype.dart │ │ │ │ │ ├── sniffer.dart │ │ │ │ │ ├── sniffer_content.dart │ │ │ │ │ └── sniffer_context.dart │ │ │ │ ├── opds │ │ │ │ │ ├── acquisition.dart │ │ │ │ │ ├── availability.dart │ │ │ │ │ ├── copies.dart │ │ │ │ │ ├── facet.dart │ │ │ │ │ ├── feed.dart │ │ │ │ │ ├── group.dart │ │ │ │ │ ├── holds.dart │ │ │ │ │ ├── opds_metadata.dart │ │ │ │ │ └── price.dart │ │ │ │ ├── publication │ │ │ │ │ ├── asset │ │ │ │ │ │ ├── file_asset.dart │ │ │ │ │ │ ├── http_asset.dart │ │ │ │ │ │ └── publication_asset.dart │ │ │ │ │ ├── collection.dart │ │ │ │ │ ├── content_protection.dart │ │ │ │ │ ├── contributor.dart │ │ │ │ │ ├── drm.dart │ │ │ │ │ ├── encryption.dart │ │ │ │ │ ├── epub │ │ │ │ │ │ └── publication.dart │ │ │ │ │ ├── format.dart │ │ │ │ │ ├── html │ │ │ │ │ │ ├── dom_range.dart │ │ │ │ │ │ └── locator.dart │ │ │ │ │ ├── link.dart │ │ │ │ │ ├── link_list_extension.dart │ │ │ │ │ ├── link_pagination.dart │ │ │ │ │ ├── localized_string.dart │ │ │ │ │ ├── locator.dart │ │ │ │ │ ├── manifest.dart │ │ │ │ │ ├── metadata.dart │ │ │ │ │ ├── opds │ │ │ │ │ │ ├── properties.dart │ │ │ │ │ │ └── publication.dart │ │ │ │ │ ├── opening_exception.dart │ │ │ │ │ ├── pagination_info_service.dart │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── metadata.dart │ │ │ │ │ │ ├── presentation.dart │ │ │ │ │ │ └── properties.dart │ │ │ │ │ ├── properties.dart │ │ │ │ │ ├── publication.dart │ │ │ │ │ ├── publication_collection.dart │ │ │ │ │ ├── reading_progression.dart │ │ │ │ │ ├── root_file.dart │ │ │ │ │ ├── services │ │ │ │ │ │ ├── content_protection_service.dart │ │ │ │ │ │ ├── cover_service.dart │ │ │ │ │ │ ├── locator_service.dart │ │ │ │ │ │ ├── positions_service.dart │ │ │ │ │ │ └── route_handler.dart │ │ │ │ │ ├── subcollection_map.dart │ │ │ │ │ ├── subject.dart │ │ │ │ │ └── user_exception.dart │ │ │ │ ├── readium_css.dart │ │ │ │ ├── streams │ │ │ │ │ ├── file_stream.dart │ │ │ │ │ ├── raw_stream.dart │ │ │ │ │ ├── stream.dart │ │ │ │ │ └── zip_stream.dart │ │ │ │ ├── util │ │ │ │ │ ├── archive │ │ │ │ │ │ ├── archive.dart │ │ │ │ │ │ ├── exploded_archive.dart │ │ │ │ │ │ └── zip_archive.dart │ │ │ │ │ └── image_size.dart │ │ │ │ └── zip │ │ │ │ │ ├── file_buffer.dart │ │ │ │ │ ├── lazy_archive.dart │ │ │ │ │ ├── lazy_archive_file.dart │ │ │ │ │ ├── lazy_zip_decoder.dart │ │ │ │ │ ├── lazy_zip_directory.dart │ │ │ │ │ ├── lazy_zip_file.dart │ │ │ │ │ ├── lazy_zip_file_header.dart │ │ │ │ │ ├── zip_header.dart │ │ │ │ │ └── zip_package.dart │ │ │ ├── streams.dart │ │ │ ├── xml.dart │ │ │ └── zip.dart │ │ ├── pubspec.yaml │ │ ├── test │ │ │ ├── extensions │ │ │ │ └── link_test.dart │ │ │ ├── fetcher │ │ │ │ ├── archive_fetcher_test.dart │ │ │ │ └── file_fetcher_test.dart │ │ │ ├── fixtures.dart │ │ │ ├── opds │ │ │ │ ├── acquisition_test.dart │ │ │ │ ├── availability_test.dart │ │ │ │ ├── copies_test.dart │ │ │ │ ├── holds_test.dart │ │ │ │ └── price_test.dart │ │ │ ├── publication │ │ │ │ ├── contributor_test.dart │ │ │ │ ├── encryption │ │ │ │ │ ├── encryption_test.dart │ │ │ │ │ └── properties_test.dart │ │ │ │ ├── epub │ │ │ │ │ ├── epub_layout_test.dart │ │ │ │ │ ├── presentation_test.dart │ │ │ │ │ ├── properties_test.dart │ │ │ │ │ └── publication_test.dart │ │ │ │ ├── html │ │ │ │ │ ├── dom_range_test.dart │ │ │ │ │ └── locator_test.dart │ │ │ │ ├── link_test.dart │ │ │ │ ├── localized_string_test.dart │ │ │ │ ├── locator_test.dart │ │ │ │ ├── manifest_test.dart │ │ │ │ ├── metadata_test.dart │ │ │ │ ├── opds │ │ │ │ │ ├── properties_test.dart │ │ │ │ │ └── publication_test.dart │ │ │ │ ├── presentation │ │ │ │ │ ├── metadata_test.dart │ │ │ │ │ ├── presentation_test.dart │ │ │ │ │ └── properties_test.dart │ │ │ │ ├── properties_test.dart │ │ │ │ ├── publication_collection_test.dart │ │ │ │ ├── publication_test.dart │ │ │ │ ├── reading_progression_test.dart │ │ │ │ ├── services │ │ │ │ │ ├── cover_service_test.dart │ │ │ │ │ ├── locator_service_test.dart │ │ │ │ │ └── positions_service_test.dart │ │ │ │ ├── services_builder_test.dart │ │ │ │ └── subject_test.dart │ │ │ └── util │ │ │ │ ├── archive │ │ │ │ └── archive_test.dart │ │ │ │ └── mediatype │ │ │ │ ├── media_type_test.dart │ │ │ │ └── sniffer_test.dart │ │ └── test_resources │ │ │ ├── fetcher │ │ │ ├── directory │ │ │ │ ├── subdirectory │ │ │ │ │ ├── hello.mp3 │ │ │ │ │ └── text2.txt │ │ │ │ └── text1.txt │ │ │ ├── epub.epub │ │ │ └── text.txt │ │ │ ├── format │ │ │ ├── audiobook-lcp.unknown │ │ │ ├── audiobook-package.unknown │ │ │ ├── audiobook-wrongtype.json │ │ │ ├── audiobook.json │ │ │ ├── cbz.unknown │ │ │ ├── divina-package.unknown │ │ │ ├── divina.json │ │ │ ├── epub.unknown │ │ │ ├── html.unknown │ │ │ ├── lcpl.unknown │ │ │ ├── lpf-index-html.unknown │ │ │ ├── lpf.unknown │ │ │ ├── opds-authentication.json │ │ │ ├── opds1-entry.unknown │ │ │ ├── opds1-feed.unknown │ │ │ ├── opds2-feed.json │ │ │ ├── opds2-publication.json │ │ │ ├── pdf-lcp.unknown │ │ │ ├── pdf.unknown │ │ │ ├── png.unknown │ │ │ ├── unknown │ │ │ ├── unknown.zip │ │ │ ├── w3c-wpub.json │ │ │ ├── webpub-package.unknown │ │ │ ├── webpub.json │ │ │ ├── xhtml.unknown │ │ │ └── zab.unknown │ │ │ ├── publication │ │ │ └── services │ │ │ │ └── cover.jpg │ │ │ └── util │ │ │ └── archive │ │ │ ├── epub.epub │ │ │ └── epub │ │ │ ├── EPUB │ │ │ ├── cover.xhtml │ │ │ ├── css │ │ │ │ ├── epub.css │ │ │ │ └── nav.css │ │ │ ├── images │ │ │ │ └── cover.png │ │ │ ├── nav.xhtml │ │ │ ├── package.opf │ │ │ ├── s04.xhtml │ │ │ └── toc.ncx │ │ │ ├── META-INF │ │ │ └── container.xml │ │ │ └── mimetype │ ├── streamer │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── example │ │ │ ├── lib │ │ │ │ ├── links.opf │ │ │ │ └── main.dart │ │ │ └── pubspec.yaml │ │ ├── lib │ │ │ ├── parser.dart │ │ │ ├── pdf.dart │ │ │ ├── publication_parser.dart │ │ │ └── src │ │ │ │ ├── cbz │ │ │ │ └── cbz_parser.dart │ │ │ │ ├── container │ │ │ │ ├── container.dart │ │ │ │ └── publication_container.dart │ │ │ │ ├── epub │ │ │ │ ├── clock_value_parser.dart │ │ │ │ ├── constants.dart │ │ │ │ ├── encryption_parser.dart │ │ │ │ ├── epub_deobfuscator.dart │ │ │ │ ├── epub_parser.dart │ │ │ │ ├── epub_positions_service.dart │ │ │ │ ├── extensions │ │ │ │ │ └── xml_node.dart │ │ │ │ ├── metadata_parser.dart │ │ │ │ ├── navigation_document_parser.dart │ │ │ │ ├── ncx_parser.dart │ │ │ │ ├── package_document.dart │ │ │ │ ├── property_data_type.dart │ │ │ │ ├── publication_factory.dart │ │ │ │ └── readium_css_layout.dart │ │ │ │ ├── image │ │ │ │ └── image_parser.dart │ │ │ │ ├── pdf │ │ │ │ ├── pdf_bookmark.dart │ │ │ │ ├── pdf_document.dart │ │ │ │ ├── pdf_document_factory.dart │ │ │ │ ├── pdf_page.dart │ │ │ │ ├── pdf_parser.dart │ │ │ │ └── pdf_positions_service.dart │ │ │ │ ├── readium │ │ │ │ ├── lcpdf_positions_service.dart │ │ │ │ └── readium_web_pub_parser.dart │ │ │ │ └── streamer.dart │ │ ├── pubspec.yaml │ │ ├── test │ │ │ └── parser │ │ │ │ ├── epub │ │ │ │ ├── clock_value_parser_test.dart │ │ │ │ ├── encryption_parser_test.dart │ │ │ │ ├── epub_deobfuscator_test.dart │ │ │ │ ├── epub_positions_service_test.dart │ │ │ │ ├── metadata_test.dart │ │ │ │ ├── navigation_document_parser_test.dart │ │ │ │ ├── package_document_test.dart │ │ │ │ └── property_data_type_test.dart │ │ │ │ ├── image │ │ │ │ └── image_parser_test.dart │ │ │ │ └── pdf │ │ │ │ └── pdf_positions_service_test.dart │ │ └── test_resources │ │ │ ├── epub │ │ │ ├── deobfuscation │ │ │ │ ├── cut-cut.adb.woff │ │ │ │ ├── cut-cut.obf.woff │ │ │ │ └── cut-cut.woff │ │ │ ├── encryption │ │ │ │ ├── encryption-lcp-prefixes.xml │ │ │ │ ├── encryption-lcp-xmlns.xml │ │ │ │ └── encryption-unknown-method.xml │ │ │ ├── navigation │ │ │ │ ├── nav-children.xhtml │ │ │ │ ├── nav-complex.xhtml │ │ │ │ ├── nav-empty.xhtml │ │ │ │ ├── nav-section.xhtml │ │ │ │ └── nav-titles.xhtml │ │ │ ├── ncx │ │ │ │ ├── ncx-children.ncx │ │ │ │ ├── ncx-complex.ncx │ │ │ │ ├── ncx-empty.ncx │ │ │ │ └── ncx-titles.ncx │ │ │ └── package │ │ │ │ ├── collections-epub2.opf │ │ │ │ ├── collections-epub3.opf │ │ │ │ ├── contributors-epub2.opf │ │ │ │ ├── contributors-epub3.opf │ │ │ │ ├── cover-epub2.opf │ │ │ │ ├── cover-epub3.opf │ │ │ │ ├── cover-mix.opf │ │ │ │ ├── dates-epub2.opf │ │ │ │ ├── dates-epub3.opf │ │ │ │ ├── fallbacks-termination.opf │ │ │ │ ├── fallbacks.opf │ │ │ │ ├── identifier-unique.opf │ │ │ │ ├── links-properties.opf │ │ │ │ ├── links.opf │ │ │ │ ├── meta-others.opf │ │ │ │ ├── meta-termination.opf │ │ │ │ ├── presentation-metadata.opf │ │ │ │ ├── progression-default.opf │ │ │ │ ├── progression-ltr.opf │ │ │ │ ├── progression-none.opf │ │ │ │ ├── progression-rtl.opf │ │ │ │ ├── subjects-complex.opf │ │ │ │ ├── subjects-multiple.opf │ │ │ │ ├── subjects-single.opf │ │ │ │ ├── title-localized.opf │ │ │ │ ├── title-main-precedence.opf │ │ │ │ ├── title-multiple-subtitles.opf │ │ │ │ ├── titles-epub2.opf │ │ │ │ ├── titles-epub3.opf │ │ │ │ ├── version-default.opf │ │ │ │ ├── version-epub2.opf │ │ │ │ └── version-epub3.opf │ │ │ └── image │ │ │ ├── futuristic_tales.cbz │ │ │ └── futuristic_tales.jpg │ └── webview │ │ ├── .gitignore │ │ ├── .metadata │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── lib │ │ ├── src │ │ │ ├── flutter_inappwebview_stub.dart │ │ │ ├── headless_in_app_web_view_stub.dart │ │ │ └── main.dart │ │ └── webview.dart │ │ └── pubspec.yaml │ └── reader_widget │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── assets │ ├── appainter_dark_theme.json │ ├── appainter_light_theme.json │ ├── fonts │ │ ├── times-new-roman bold-italic.ttf │ │ ├── times-new-roman-bold.ttf │ │ ├── times-new-roman-italic.ttf │ │ └── times-new-roman.ttf │ └── images │ │ ├── app-icon.ai │ │ ├── app-icon.png │ │ ├── app-play-feature-image.ai │ │ ├── app-play-feature-image.png │ │ ├── baseline_fast_forward_white_24.png │ │ ├── baseline_fast_rewind_white_24.png │ │ ├── baseline_forward_10_white_24.png │ │ ├── baseline_replay_10_white_24.png │ │ ├── baseline_search_white_24.png │ │ ├── cnl.png │ │ ├── cover.png │ │ ├── empty.png │ │ ├── home_web.png │ │ ├── ic_forward_5_white_24dp.png │ │ ├── ic_pause_white_24dp.png │ │ ├── ic_play_arrow_white_24dp.png │ │ ├── ic_replay_5_white_24dp.png │ │ ├── ic_skip_left_white_24dp.png │ │ ├── ic_skip_right_white_24dp.png │ │ ├── icon_audio.png │ │ ├── icon_bookmark.png │ │ ├── icon_decrease.png │ │ ├── icon_drm.png │ │ ├── icon_font_decrease.png │ │ ├── icon_font_increase.png │ │ ├── icon_increse.png │ │ ├── icon_justify.png │ │ ├── icon_justify_white.png │ │ ├── icon_left.png │ │ ├── icon_left_white.png │ │ ├── icon_menu.png │ │ ├── icon_minus.png │ │ ├── icon_overflow.png │ │ ├── icon_plus.png │ │ ├── icon_plus_white.png │ │ ├── icon_settings.png │ │ └── place.png │ ├── example │ ├── .gitignore │ ├── .metadata │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ │ ├── .gitignore │ │ ├── app │ │ │ ├── build.gradle │ │ │ └── src │ │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin │ │ │ │ │ └── com │ │ │ │ │ │ └── mantano │ │ │ │ │ │ └── example │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── res │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── values-night │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values │ │ │ │ │ └── styles.xml │ │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ └── settings.gradle │ ├── assets │ │ ├── appainter_dark_theme.json │ │ ├── appainter_light_theme.json │ │ ├── books │ │ │ ├── 39419251_rtl.epub │ │ │ ├── 9089_rtl.epub │ │ │ ├── 9782067179578_GM_PARIS_2012_ANDROID.epub │ │ │ ├── Code du travail.epub │ │ │ └── accessible_epub_3.epub │ │ └── images │ │ │ ├── ic_skip_left_white_24dp.png │ │ │ └── ic_skip_right_white_24dp.png │ ├── ios │ │ ├── .gitignore │ │ ├── Flutter │ │ │ ├── AppFrameworkInfo.plist │ │ │ ├── Debug.xcconfig │ │ │ └── Release.xcconfig │ │ ├── Podfile │ │ ├── Runner.xcodeproj │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── xcshareddata │ │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── Runner │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ │ └── LaunchImage.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── LaunchImage.png │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ └── README.md │ │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ └── Runner-Bridging-Header.h │ ├── lib │ │ ├── main.dart │ │ └── utils │ │ │ └── utils.dart │ ├── macos │ │ ├── .gitignore │ │ ├── Flutter │ │ │ ├── Flutter-Debug.xcconfig │ │ │ └── Flutter-Release.xcconfig │ │ ├── Podfile │ │ ├── Runner.xcodeproj │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace │ │ │ │ └── xcshareddata │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcshareddata │ │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── Runner │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── app_icon_1024.png │ │ │ │ ├── app_icon_128.png │ │ │ │ ├── app_icon_16.png │ │ │ │ ├── app_icon_256.png │ │ │ │ ├── app_icon_32.png │ │ │ │ ├── app_icon_512.png │ │ │ │ └── app_icon_64.png │ │ │ ├── Base.lproj │ │ │ └── MainMenu.xib │ │ │ ├── Configs │ │ │ ├── AppInfo.xcconfig │ │ │ ├── Debug.xcconfig │ │ │ ├── Release.xcconfig │ │ │ └── Warnings.xcconfig │ │ │ ├── DebugProfile.entitlements │ │ │ ├── Info.plist │ │ │ ├── MainFlutterWindow.swift │ │ │ └── Release.entitlements │ ├── pubspec.yaml │ ├── web │ │ ├── favicon.png │ │ ├── icons │ │ │ ├── Icon-192.png │ │ │ ├── Icon-512.png │ │ │ ├── Icon-maskable-192.png │ │ │ └── Icon-maskable-512.png │ │ ├── index.html │ │ └── manifest.json │ └── windows │ │ ├── .gitignore │ │ ├── CMakeLists.txt │ │ ├── flutter │ │ └── CMakeLists.txt │ │ └── runner │ │ ├── CMakeLists.txt │ │ ├── Runner.rc │ │ ├── flutter_window.cpp │ │ ├── flutter_window.h │ │ ├── main.cpp │ │ ├── resource.h │ │ ├── resources │ │ └── app_icon.ico │ │ ├── runner.exe.manifest │ │ ├── utils.cpp │ │ ├── utils.h │ │ ├── win32_window.cpp │ │ └── win32_window.h │ ├── lib │ ├── iridium_reader_widget.dart │ ├── util │ │ └── router.dart │ └── views │ │ └── viewers │ │ ├── book_screen.dart │ │ ├── book_toolbar.dart │ │ ├── epub_screen.dart │ │ ├── model │ │ └── fonts.dart │ │ └── ui │ │ ├── annotations_panel.dart │ │ ├── content_panel.dart │ │ ├── reader_app_bar.dart │ │ ├── reader_navigation_screen.dart │ │ ├── reader_toolbar.dart │ │ ├── settings │ │ ├── advanced_settings_panel.dart │ │ ├── alignment_button.dart │ │ ├── color_theme.dart │ │ ├── font_size_button.dart │ │ ├── general_settings_panel.dart │ │ ├── settings_panel.dart │ │ └── settings_row.dart │ │ ├── toolbar_button.dart │ │ └── toolbar_page_number.dart │ └── pubspec.yaml ├── pubspec.lock ├── pubspec.yaml ├── ss ├── 1.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png ├── 9.png ├── desktop_1.png └── logo_feedbooks.png ├── test └── widget_test.dart ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ ├── Icon-512.png │ ├── Icon-maskable-192.png │ └── Icon-maskable-512.png ├── index.html └── manifest.json └── windows ├── .gitignore ├── CMakeLists.txt ├── flutter ├── CMakeLists.txt ├── generated_plugin_registrant.cc ├── generated_plugin_registrant.h └── generated_plugins.cmake └── runner ├── CMakeLists.txt ├── Runner.rc ├── flutter_window.cpp ├── flutter_window.h ├── main.cpp ├── resource.h ├── resources └── app_icon.ico ├── runner.exe.manifest ├── utils.cpp ├── utils.h ├── win32_window.cpp └── win32_window.h /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: jideguru 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:lint/strict.yaml 2 | 3 | analyzer: 4 | exclude: 5 | - build/** 6 | - "**/*.g.dart" 7 | - "**/*.freezed.dart" 8 | - "**/*.gr.dart" 9 | - packages/** 10 | - "**/category_feed.dart" 11 | 12 | linter: 13 | rules: 14 | avoid_print: true 15 | prefer_single_quotes: true 16 | always_use_package_imports: true 17 | empty_statements: true 18 | always_declare_return_types: true 19 | camel_case_extensions: true 20 | require_trailing_commas: true 21 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/android/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/dev/jideguru/flutter_ebook_app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package dev.jideguru.flutter_ebook_app 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | feedbooks.com 5 | feedbooks.net 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /android/settings_aar.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /assets/images/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/assets/images/app-icon.png -------------------------------------------------------------------------------- /assets/images/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/assets/images/empty.png -------------------------------------------------------------------------------- /assets/images/place.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/assets/images/place.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/.last_build_id: -------------------------------------------------------------------------------- 1 | 11c8c6490f0058a1aeea4510aaba39be -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-1024.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-20.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-29.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-40.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-76.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/AppIcon.appiconset/book-icon-83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_ebook_app/src/app.dart'; 4 | import 'package:flutter_ebook_app/src/common/common.dart'; 5 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 6 | import 'package:flutter_web_plugins/url_strategy.dart'; 7 | import 'package:sembast/sembast.dart'; 8 | 9 | void main() async { 10 | WidgetsFlutterBinding.ensureInitialized(); 11 | LocalStorage(); 12 | await DatabaseConfig.init(StoreRef.main()); 13 | if (kIsWeb) usePathUrlStrategy(); 14 | runApp( 15 | ProviderScope( 16 | observers: [RiverpodObserver()], 17 | child: MyApp(), 18 | ), 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /lib/src/common/application/application.dart: -------------------------------------------------------------------------------- 1 | export 'services/services.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/common/application/services/services.dart: -------------------------------------------------------------------------------- 1 | export 'current_app_theme_service.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/common/common.dart: -------------------------------------------------------------------------------- 1 | export 'application/application.dart'; 2 | export 'constants/constants.dart'; 3 | export 'data/data.dart'; 4 | export 'domain/domain.dart'; 5 | export 'extensions/extensions.dart'; 6 | export 'presentation/presentation.dart'; 7 | export 'router/app_router.dart'; 8 | export 'utils/utils.dart'; 9 | -------------------------------------------------------------------------------- /lib/src/common/constants/constants.dart: -------------------------------------------------------------------------------- 1 | export 'api.dart'; 2 | export 'shared_preferences_key.dart'; 3 | export 'strings.dart'; 4 | export 'utils.dart'; 5 | -------------------------------------------------------------------------------- /lib/src/common/constants/shared_preferences_key.dart: -------------------------------------------------------------------------------- 1 | String get isDarkModeKey => 'isDarkMode'; 2 | -------------------------------------------------------------------------------- /lib/src/common/constants/strings.dart: -------------------------------------------------------------------------------- 1 | const String appName = 'OpenLeaf'; 2 | -------------------------------------------------------------------------------- /lib/src/common/constants/utils.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | String formatBytes(int bytes, int decimals) { 4 | if (bytes == 0) return '0.0'; 5 | const k = 1024; 6 | final dm = decimals <= 0 ? 0 : decimals; 7 | final sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 8 | final i = (log(bytes) / log(k)).floor(); 9 | return '${(bytes / pow(k, i)).toStringAsFixed(dm)} ${sizes[i]}'; 10 | } 11 | -------------------------------------------------------------------------------- /lib/src/common/data/data.dart: -------------------------------------------------------------------------------- 1 | export 'data_sources/data_sources.dart'; 2 | export 'database/database.dart'; 3 | export 'failures/http_failure.dart'; 4 | export 'local/local_storage.dart'; 5 | export 'remote/adapter/adapter.dart'; 6 | export 'remote/app_dio.dart'; 7 | export 'repositories/repositories.dart'; 8 | -------------------------------------------------------------------------------- /lib/src/common/data/data_sources/data_sources.dart: -------------------------------------------------------------------------------- 1 | export 'downloads/downloads_local_data_source.dart'; 2 | export 'downloads/downloads_local_data_source_impl.dart'; 3 | export 'favorites/favorites_local_data_source.dart'; 4 | export 'favorites/favorites_local_data_source_impl.dart'; 5 | -------------------------------------------------------------------------------- /lib/src/common/data/data_sources/downloads/downloads_local_data_source.dart: -------------------------------------------------------------------------------- 1 | abstract class DownloadsLocalDataSource { 2 | const DownloadsLocalDataSource(); 3 | 4 | Future addBook(Map book, String id); 5 | 6 | Future deleteBook(String id); 7 | 8 | Future deleteAllBooksWithId(String id); 9 | 10 | Future>> downloadList(); 11 | 12 | Stream>> downloadListStream(); 13 | 14 | Future?> fetchBook(String id); 15 | 16 | Future clearBooks(); 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/common/data/data_sources/favorites/favorites_local_data_source.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_ebook_app/src/common/common.dart'; 2 | 3 | abstract class FavoritesLocalDataSource { 4 | const FavoritesLocalDataSource(); 5 | 6 | Future addBook(Entry book, String id); 7 | 8 | Future deleteBook(String id); 9 | 10 | Stream> favoritesListStream(); 11 | 12 | Future clearBooks(); 13 | } 14 | -------------------------------------------------------------------------------- /lib/src/common/data/database/database.dart: -------------------------------------------------------------------------------- 1 | export 'database_config.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/common/data/failures/http_failure.dart: -------------------------------------------------------------------------------- 1 | enum HttpFailure { 2 | notFound('404 not found'), 3 | unknown('Unknown error'); 4 | 5 | final String description; 6 | const HttpFailure(this.description); 7 | } 8 | -------------------------------------------------------------------------------- /lib/src/common/data/local/local_storage.dart: -------------------------------------------------------------------------------- 1 | import 'package:shared_preferences/shared_preferences.dart'; 2 | 3 | class LocalStorage { 4 | static final LocalStorage _instance = LocalStorage._privateConstructor(); 5 | 6 | factory LocalStorage() { 7 | return _instance; 8 | } 9 | 10 | SharedPreferences? _prefs; 11 | 12 | LocalStorage._privateConstructor() { 13 | SharedPreferences.getInstance().then((prefs) { 14 | _prefs = prefs; 15 | }); 16 | } 17 | 18 | SharedPreferences? getSharedPreferences() { 19 | return _prefs; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/src/common/data/remote/adapter/adapter.dart: -------------------------------------------------------------------------------- 1 | export 'unsupported.dart' 2 | if (dart.library.html) 'web_adapter.dart' 3 | if (dart.library.io) 'mobile_adapter.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/common/data/remote/adapter/mobile_adapter.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | import 'package:dio/io.dart'; 3 | 4 | HttpClientAdapter getAdapter() { 5 | return IOHttpClientAdapter(); 6 | } 7 | -------------------------------------------------------------------------------- /lib/src/common/data/remote/adapter/unsupported.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | HttpClientAdapter getAdapter() { 4 | throw 'unsupported platform'; 5 | } 6 | -------------------------------------------------------------------------------- /lib/src/common/data/remote/adapter/web_adapter.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/browser.dart'; 2 | import 'package:dio/dio.dart'; 3 | 4 | HttpClientAdapter getAdapter() { 5 | return BrowserHttpClientAdapter(); 6 | } 7 | -------------------------------------------------------------------------------- /lib/src/common/data/repositories/repositories.dart: -------------------------------------------------------------------------------- 1 | export 'book/book_repository.dart'; 2 | export 'downloads/downloads_repository.dart'; 3 | export 'favorites/favorites_repository.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/common/domain/domain.dart: -------------------------------------------------------------------------------- 1 | export 'models/models.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/common/domain/models/models.dart: -------------------------------------------------------------------------------- 1 | export 'category_feed.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/common/extensions/extensions.dart: -------------------------------------------------------------------------------- 1 | export 'context_extensions.dart'; 2 | export 'theme_extensions.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/common/extensions/theme_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension ThemeExtensions on ThemeData { 4 | Color get accentColor => colorScheme.secondary; 5 | bool get isDark => brightness == Brightness.dark; 6 | } 7 | -------------------------------------------------------------------------------- /lib/src/common/presentation/notifiers/notifiers.dart: -------------------------------------------------------------------------------- 1 | export 'current_app_theme/current_app_theme_notifier.dart'; 2 | export 'downloads/downloads_notifier.dart'; 3 | export 'favorites/favorites_notifier.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/common/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'notifiers/notifiers.dart'; 2 | export 'providers/providers.dart'; 3 | export 'theme/theme_config.dart'; 4 | export 'ui/ui.dart'; 5 | -------------------------------------------------------------------------------- /lib/src/common/presentation/providers/database_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_ebook_app/src/common/common.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | import 'package:sembast/sembast.dart'; 4 | 5 | final storeRefProvider = Provider>>( 6 | (ref) => StoreRef>.main(), 7 | ); 8 | 9 | final downloadsDatabaseProvider = Provider( 10 | (ref) => DatabaseConfig.getDatabaseInstance( 11 | DatabaseConfig.downloadsDatabaseName, 12 | ), 13 | ); 14 | 15 | final favoritesDatabaseProvider = Provider( 16 | (ref) => DatabaseConfig.getDatabaseInstance( 17 | DatabaseConfig.favoritesDatabaseName, 18 | ), 19 | ); 20 | -------------------------------------------------------------------------------- /lib/src/common/presentation/providers/dio_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | import 'package:flutter_ebook_app/src/common/common.dart'; 3 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 4 | 5 | final dioProvider = Provider((ref) => AppDio.getInstance()); 6 | -------------------------------------------------------------------------------- /lib/src/common/presentation/providers/providers.dart: -------------------------------------------------------------------------------- 1 | export 'database_provider.dart'; 2 | export 'dio_provider.dart'; 3 | export 'shared_preferences_provider.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/common/presentation/providers/shared_preferences_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_ebook_app/src/common/common.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | import 'package:shared_preferences/shared_preferences.dart'; 4 | 5 | final sharedPreferencesProvider = Provider( 6 | (_) => LocalStorage().getSharedPreferences()!, 7 | ); 8 | -------------------------------------------------------------------------------- /lib/src/common/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'widgets/widgets.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/common/presentation/ui/widgets/loading_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_ebook_app/src/common/common.dart'; 3 | import 'package:flutter_spinkit/flutter_spinkit.dart'; 4 | 5 | class LoadingWidget extends StatelessWidget { 6 | final bool isImage; 7 | 8 | const LoadingWidget({super.key, this.isImage = false}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | final Color color = context.theme.colorScheme.secondary; 13 | return Center( 14 | child: isImage ? SpinKitRipple(color: color) : SpinKitWave(color: color), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/common/presentation/ui/widgets/modal_dialogs/modal_dialogs.dart: -------------------------------------------------------------------------------- 1 | export 'custom_alert.dart'; 2 | export 'download_alert.dart'; 3 | export 'exit_modal_dialog.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/common/presentation/ui/widgets/widgets.dart: -------------------------------------------------------------------------------- 1 | export 'animated_page_splitter.dart'; 2 | export 'book_card.dart'; 3 | export 'book_item.dart'; 4 | export 'book_list_item.dart'; 5 | export 'description_text.dart'; 6 | export 'empty_view.dart'; 7 | export 'error_widget.dart'; 8 | export 'loading_widget.dart'; 9 | export 'modal_dialogs/modal_dialogs.dart'; 10 | export 'responsive_widget.dart'; 11 | -------------------------------------------------------------------------------- /lib/src/common/utils/utils.dart: -------------------------------------------------------------------------------- 1 | export 'riverpod_observer.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/book_details/book_details.dart: -------------------------------------------------------------------------------- 1 | export 'data/data.dart'; 2 | export 'presentation/presentation.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/book_details/data/data.dart: -------------------------------------------------------------------------------- 1 | export 'repositories/repositories.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/book_details/data/repositories/book_details_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_ebook_app/src/common/common.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | 4 | class BookDetailsRepository extends BookRepository { 5 | BookDetailsRepository(super.httpClient); 6 | 7 | Future getRelatedFeed(String url) { 8 | final String stripedUrl = url.replaceAll(baseURL, ''); 9 | final successOrFailure = getCategory(stripedUrl); 10 | return successOrFailure; 11 | } 12 | } 13 | 14 | final bookDetailsRepositoryProvider = 15 | Provider.autoDispose((ref) { 16 | final dio = ref.watch(dioProvider); 17 | return BookDetailsRepository(dio); 18 | }); 19 | -------------------------------------------------------------------------------- /lib/src/features/book_details/data/repositories/repositories.dart: -------------------------------------------------------------------------------- 1 | export 'book_details_repository.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/book_details/presentation/notifier/notifiers.dart: -------------------------------------------------------------------------------- 1 | export 'book_details_notifier.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/book_details/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'notifier/notifiers.dart'; 2 | export 'ui/ui.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/book_details/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'book_details_screen.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/book_details/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/downloads/downloads.dart: -------------------------------------------------------------------------------- 1 | export 'presentation/presentation.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/downloads/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'ui/ui.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/downloads/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'download_screen.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/downloads/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/explore/data/data.dart: -------------------------------------------------------------------------------- 1 | export 'repositories/repositories.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/explore/data/repositories/explore_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_ebook_app/src/common/common.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | 4 | class ExploreRepository extends BookRepository { 5 | ExploreRepository(super.httpClient); 6 | 7 | Future getGenreFeed( 8 | String url, 9 | ) { 10 | final String stripedUrl = url.replaceAll(baseURL, ''); 11 | final successOrFailure = getCategory(stripedUrl); 12 | return successOrFailure; 13 | } 14 | } 15 | 16 | final exploreRepositoryProvider = 17 | Provider.autoDispose((ref) { 18 | final dio = ref.watch(dioProvider); 19 | return ExploreRepository(dio); 20 | }); 21 | -------------------------------------------------------------------------------- /lib/src/features/explore/data/repositories/repositories.dart: -------------------------------------------------------------------------------- 1 | export 'explore_repository.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/explore/explore.dart: -------------------------------------------------------------------------------- 1 | export 'data/data.dart'; 2 | export 'presentation/presentation.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/explore/presentation/notifiers/notifiers.dart: -------------------------------------------------------------------------------- 1 | export 'genre_feed/genre_feed_notifier.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/explore/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'notifiers/notifiers.dart'; 2 | export 'ui/ui.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/explore/presentation/ui/screens/explore_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_route/auto_route.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_ebook_app/src/common/common.dart'; 4 | import 'package:flutter_ebook_app/src/features/features.dart'; 5 | 6 | @RoutePage() 7 | class ExploreScreen extends StatelessWidget { 8 | const ExploreScreen({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return const ResponsiveWidget( 13 | smallScreen: ExploreScreenSmall(), 14 | largeScreen: ExploreScreenLarge(), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/features/explore/presentation/ui/screens/explore_screen_large.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_route/auto_route.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_ebook_app/src/common/common.dart'; 4 | import 'package:flutter_ebook_app/src/features/features.dart'; 5 | 6 | class ExploreScreenLarge extends StatelessWidget { 7 | const ExploreScreenLarge({super.key}); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | final isNestedEmpty = context.watchRouter.topRoute.name == 'ExploreRoute'; 12 | 13 | return AnimatedPageSplitter( 14 | isExpanded: !isNestedEmpty, 15 | leftChild: const ExploreScreenSmall(), 16 | rightChild: const AutoRouter(), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/src/features/explore/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'explore_screen.dart'; 2 | export 'explore_screen_large.dart'; 3 | export 'explore_screen_small.dart'; 4 | export 'genre_screen.dart'; 5 | -------------------------------------------------------------------------------- /lib/src/features/explore/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/favorites/favourites.dart: -------------------------------------------------------------------------------- 1 | export 'presentation/presentation.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/favorites/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'ui/ui.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/favorites/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'favorites_screen.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/favorites/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/features.dart: -------------------------------------------------------------------------------- 1 | export 'book_details/book_details.dart'; 2 | export 'downloads/downloads.dart'; 3 | export 'explore/explore.dart'; 4 | export 'favorites/favourites.dart'; 5 | export 'home/home.dart'; 6 | export 'settings/settings.dart'; 7 | export 'splash/splash.dart'; 8 | export 'tabs/tabs.dart'; 9 | -------------------------------------------------------------------------------- /lib/src/features/home/data/data.dart: -------------------------------------------------------------------------------- 1 | export 'repositories/repositories.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/home/data/repositories/repositories.dart: -------------------------------------------------------------------------------- 1 | export 'home_repository.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/home/home.dart: -------------------------------------------------------------------------------- 1 | export 'data/data.dart'; 2 | export 'presentation/presentation.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/home/presentation/notifiers/notifiers.dart: -------------------------------------------------------------------------------- 1 | export 'home_feed_notifier.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/home/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'notifiers/notifiers.dart'; 2 | export 'ui/ui.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/home/presentation/ui/screens/home_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_route/auto_route.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_ebook_app/src/common/common.dart'; 4 | import 'package:flutter_ebook_app/src/features/features.dart'; 5 | 6 | @RoutePage() 7 | class HomeScreen extends StatelessWidget { 8 | const HomeScreen({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return const ResponsiveWidget( 13 | smallScreen: HomeScreenSmall(), 14 | largeScreen: HomeScreenLarge(), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/features/home/presentation/ui/screens/home_screen_large.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_route/auto_route.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_ebook_app/src/common/common.dart'; 4 | import 'package:flutter_ebook_app/src/features/features.dart'; 5 | 6 | class HomeScreenLarge extends StatelessWidget { 7 | const HomeScreenLarge({super.key}); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | final isNestedEmpty = context.watchRouter.topRoute.name == 'HomeRoute'; 12 | 13 | return AnimatedPageSplitter( 14 | isExpanded: !isNestedEmpty, 15 | leftChild: const HomeScreenSmall(), 16 | rightChild: const AutoRouter(), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/src/features/home/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'home_screen.dart'; 2 | export 'home_screen_large.dart'; 3 | export 'home_screen_small.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/features/home/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/settings/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'ui/ui.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/settings/presentation/ui/screens/licenses_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_route/auto_route.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | @RoutePage() 5 | class LicensesScreen extends StatelessWidget { 6 | const LicensesScreen({super.key}); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return LicensePage( 11 | applicationIcon: Image.asset( 12 | 'assets/images/app-icon.png', 13 | height: 150, 14 | fit: BoxFit.cover, 15 | ), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/src/features/settings/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'licenses_screen.dart'; 2 | export 'settings_screen.dart'; 3 | export 'settings_screen_large.dart'; 4 | export 'settings_screen_small.dart'; 5 | -------------------------------------------------------------------------------- /lib/src/features/settings/presentation/ui/screens/settings_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_route/auto_route.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_ebook_app/src/common/common.dart'; 4 | import 'package:flutter_ebook_app/src/features/features.dart'; 5 | 6 | @RoutePage() 7 | class SettingsScreen extends StatelessWidget { 8 | const SettingsScreen({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return const ResponsiveWidget( 13 | smallScreen: SettingsScreenSmall(), 14 | largeScreen: SettingsScreenLarge(), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/features/settings/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/settings/settings.dart: -------------------------------------------------------------------------------- 1 | export 'presentation/presentation.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/splash/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'ui/ui.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/splash/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'splash_screen.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/splash/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/splash/splash.dart: -------------------------------------------------------------------------------- 1 | export 'presentation/presentation.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/tabs/presentation/notifiers/current_tab_notifier.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | 4 | class CurrentTabNotifier extends ValueNotifier { 5 | CurrentTabNotifier() : super(0); 6 | 7 | bool get isHomeTab => value == 0; 8 | void changePage(int page) { 9 | value = page; 10 | notifyListeners(); 11 | } 12 | } 13 | 14 | final currentTabNotifierProvider = Provider( 15 | (ref) => CurrentTabNotifier(), 16 | ); 17 | -------------------------------------------------------------------------------- /lib/src/features/tabs/presentation/notifiers/notifiers.dart: -------------------------------------------------------------------------------- 1 | export 'current_tab_notifier.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/tabs/presentation/presentation.dart: -------------------------------------------------------------------------------- 1 | export 'notifiers/notifiers.dart'; 2 | export 'ui/ui.dart'; 3 | -------------------------------------------------------------------------------- /lib/src/features/tabs/presentation/ui/screens/screens.dart: -------------------------------------------------------------------------------- 1 | export 'tabs_screen.dart'; 2 | export 'tabs_screen_large.dart'; 3 | export 'tabs_screen_small.dart'; 4 | -------------------------------------------------------------------------------- /lib/src/features/tabs/presentation/ui/ui.dart: -------------------------------------------------------------------------------- 1 | export 'screens/screens.dart'; 2 | -------------------------------------------------------------------------------- /lib/src/features/tabs/tabs.dart: -------------------------------------------------------------------------------- 1 | export 'presentation/presentation.dart'; 2 | -------------------------------------------------------------------------------- /linux/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral 2 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | #include 10 | 11 | void fl_register_plugins(FlPluginRegistry* registry) { 12 | g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = 13 | fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); 14 | url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); 15 | } 16 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | g_autoptr(MyApplication) app = my_application_new(); 5 | return g_application_run(G_APPLICATION(app), argc, argv); 6 | } 7 | -------------------------------------------------------------------------------- /linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/dgph 7 | **/xcuserdata/ 8 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = flutter_ebook_app 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = dev.jideguru.flutterEbookApp 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2022 dev.jideguru. All rights reserved. 15 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | let size = NSSize(width: 400, height: 400); 11 | self.minSize = size 12 | self.setContentSize(size) 13 | 14 | RegisterGeneratedPlugins(registry: flutterViewController) 15 | 16 | super.awakeFromNib() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.files.user-selected.read-write 10 | 11 | com.apple.security.assets.downloads.read-write 12 | 13 | com.apple.security.assets.pictures.read-write 14 | 15 | com.apple.security.assets.downloads.read-write 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.1.2 2 | 3 | * Migration to null-safety 4 | 5 | ## 0.1.1 6 | 7 | * Fix naming errors 8 | 9 | ## 0.1.0 10 | 11 | * Contains common utilities: 12 | * Href: Uri generation 13 | * Try: contains either a success or a failure 14 | * JSONable: extensions to manipulate JSON structure 15 | * Extensions for String, ByteData, FileSystemEntity and Uri 16 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/README.md: -------------------------------------------------------------------------------- 1 | # mno_commons 2 | 3 | This package provides utilities for other mno_xxx packages. 4 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:lints/recommended.yaml 2 | linter: 3 | rules: 4 | omit_local_variable_types: false 5 | public_member_api_docs: false 6 | unnecessary_this: false 7 | prefer_single_quotes: false 8 | prefer_double_quotes: false 9 | annotate_overrides: true 10 | prefer_expression_function_bodies: true 11 | always_declare_return_types: true 12 | avoid_returning_null_for_future: true 13 | always_use_package_imports: true 14 | use_super_parameters: true 15 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: example 2 | description: Example. 3 | version: 1.0.0 4 | publish_to: none 5 | 6 | environment: 7 | sdk: '>=2.18.0 <3.0.0' 8 | 9 | dependencies: 10 | mno_commons: 11 | path: ../ 12 | 13 | dev_dependencies: 14 | lints: ^2.1.0 15 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/extensions/uri.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:dartx/dartx.dart'; 6 | import 'package:path/path.dart' as p; 7 | 8 | extension UriExtension on Uri { 9 | Uri removeLastComponent() { 10 | String? lastPathComponent = 11 | path.split("/").lastOrNullWhere((it) => it.isNotEmpty); 12 | if (lastPathComponent == null) { 13 | return this; 14 | } 15 | return Uri.parse( 16 | toString().removeSuffix("/").removeSuffix(lastPathComponent)); 17 | } 18 | 19 | String get extension => p.extension(path); 20 | } 21 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/io.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | export 'io/file_not_found_exception.dart'; 6 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/io/file_not_found_exception.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | class FileNotFoundException implements Exception { 6 | final String path; 7 | 8 | FileNotFoundException(this.path); 9 | 10 | @override 11 | String toString() => 'FileNotFoundException{$path}'; 12 | } 13 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/utils/functions.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | typedef Consumer = void Function(T); 6 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/utils/injectable.dart: -------------------------------------------------------------------------------- 1 | class Injectable { 2 | static const Injectable script = Injectable("scripts"); 3 | static const Injectable font = Injectable("fonts"); 4 | static const Injectable style = Injectable("styles"); 5 | static const List values = [script, font, style]; 6 | final String rawValue; 7 | 8 | const Injectable(this.rawValue); 9 | 10 | @override 11 | String toString() => rawValue; 12 | } 13 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/utils/ref.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | /// Smart pointer holding a mutable reference to an object. 6 | /// 7 | /// Get the reference by calling `ref()` 8 | /// Conveniently, the reference can be reset by setting the `ref` property. 9 | class Ref { 10 | T? ref; 11 | T? call() => ref; 12 | } 13 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/lib/utils/take.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | extension Take on T { 6 | T? takeIf(bool Function(T) predicate) => (predicate(this)) ? this : null; 7 | 8 | T? takeUnless(bool Function(T) predicate) => (!predicate(this)) ? this : null; 9 | } 10 | -------------------------------------------------------------------------------- /packages/iridium/components/commons/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: mno_commons 2 | description: This package provide utilities (JSON, io, Href, UriTemplate, etc...) for other mno_xxx packages. 3 | version: 0.1.2 4 | homepage: https://github.com/Mantano/mno_commons_dart 5 | publish_to: none 6 | 7 | environment: 8 | sdk: '>=3.0.0 <4.0.0' 9 | 10 | dependencies: 11 | archive: ^3.3.7 12 | crypto: ^3.0.3 13 | dartx: ^1.1.0 14 | dfunc: ^0.9.0 15 | fimber: ^0.6.6 16 | path: ^1.8.3 17 | universal_io: ^2.2.1 18 | 19 | dev_dependencies: 20 | lints: ^2.1.0 21 | test: ^1.24.3 22 | # For information on the generic Dart part of this file, see the 23 | # following page: https://www.dartlang.org/tools/pub/pubspec 24 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.1.0 2 | 3 | * Contains API to implement LCP DRM 4 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/README.md: -------------------------------------------------------------------------------- 1 | # mno_lcp_dart 2 | 3 | ## Flutter LCP implementation 4 | 5 | This package provides a DART LCP layer. 6 | 7 | Important: The implementer must ask [Edrlab](https://edrlab.org) how to get `liblcp` native libs. 8 | 9 | For Android, it should look like in build.gradle: 10 | ``` 11 | compile files('../lcp-aar/liblcp.aar') 12 | compile files('../lcp-aar/liblcp-flutter.aar') 13 | ``` 14 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:lints/recommended.yaml 2 | linter: 3 | rules: 4 | omit_local_variable_types: false 5 | public_member_api_docs: false 6 | unnecessary_this: false 7 | prefer_single_quotes: false 8 | prefer_double_quotes: false 9 | annotate_overrides: true 10 | prefer_expression_function_bodies: true 11 | always_declare_return_types: true 12 | avoid_returning_null_for_future: true 13 | always_use_package_imports: true 14 | use_super_parameters: true 15 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: example 2 | description: Example. 3 | version: 1.0.0 4 | publish_to: none 5 | 6 | environment: 7 | sdk: '>=2.18.0 <3.0.0' 8 | 9 | dependencies: 10 | mno_lcp: 11 | path: ../ 12 | mno_shared: 13 | path: ../../shared 14 | 15 | dev_dependencies: 16 | lints: ^2.0.1 17 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/drm/drm_exception.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/lcp.dart'; 6 | 7 | class DRMException implements Exception { 8 | final DRMError drmError; 9 | 10 | DRMException(this.drmError); 11 | 12 | @override 13 | String toString() => 'DRMException{drmError: $drmError}'; 14 | } 15 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/drm/lcp_result.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/lcp.dart'; 6 | 7 | class LcpResult { 8 | final int drmErrorCode; 9 | final T result; 10 | 11 | LcpResult(this.drmErrorCode, this.result); 12 | 13 | DRMError get drmError => fromCode(drmErrorCode); 14 | 15 | @override 16 | String toString() => 17 | 'LcpResult{drmErrorCode: $drmErrorCode, result: $result}'; 18 | } 19 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/io/file_util.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:path_provider/path_provider.dart'; 6 | import 'package:universal_io/io.dart' hide Link; 7 | 8 | class FileUtil { 9 | static Future getTempFile(String filename) => _cachePath.then( 10 | (cachePath) => File("$cachePath${Platform.pathSeparator}$filename")); 11 | 12 | /// Path to the app cache. 13 | static Future get _cachePath async { 14 | Future directory = getTemporaryDirectory(); 15 | return directory.then((dir) => dir.path); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/lcp_client.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'dart:typed_data'; 6 | 7 | import 'package:flutter/services.dart'; 8 | import 'package:mno_lcp/lcp.dart'; 9 | 10 | abstract class LcpClient { 11 | bool get isAvailable; 12 | 13 | String findOneValidPassphrase( 14 | String jsonLicense, List hashedPassphrases); 15 | 16 | DrmContext createContext( 17 | String jsonLicense, String hashedPassphrases, String pemCrl); 18 | 19 | ByteData decrypt(DrmContext drmContext, ByteData encryptedData); 20 | } 21 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/lcp_native.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | export 'native/lcp_client_native.dart'; 6 | export 'native/lcp_native.dart'; 7 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/container/bytes_license_container.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'dart:typed_data'; 6 | 7 | import 'package:mno_lcp/license/container/license_container.dart'; 8 | import 'package:mno_lcp/license/model/license_document.dart'; 9 | 10 | class BytesLicenseContainer implements LicenseContainer { 11 | ByteData _bytes; 12 | 13 | BytesLicenseContainer(this._bytes); 14 | 15 | @override 16 | Future read() async => _bytes; 17 | 18 | @override 19 | Future write(LicenseDocument license) async => _bytes = license.data; 20 | } 21 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/container/epub_license_container.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/license/container/zip_license_container.dart'; 6 | 7 | class EpubLicenseContainer extends ZipLicenseContainer { 8 | EpubLicenseContainer(String epub) 9 | : super(zip: epub, pathInZIP: "META-INF/license.lcpl"); 10 | } 11 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/container/web_pub_license_container.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/license/container/zip_license_container.dart'; 6 | 7 | class WebPubLicenseContainer extends ZipLicenseContainer { 8 | WebPubLicenseContainer(String path) 9 | : super(zip: path, pathInZIP: "license.lcpl"); 10 | } 11 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/model/components/lcp/content_key.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | class ContentKey { 6 | final String encryptedValue; 7 | final Uri algorithm; 8 | 9 | ContentKey._(this.encryptedValue, this.algorithm); 10 | 11 | factory ContentKey.parse(Map json) => 12 | ContentKey._(json["encrypted_value"], Uri.parse(json["algorithm"])); 13 | 14 | @override 15 | String toString() => 16 | 'ContentKey{encryptedValue: $encryptedValue, algorithm: $algorithm}'; 17 | } 18 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/model/components/lcp/signature.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | class Signature { 6 | final Uri algorithm; 7 | final String certificate; 8 | final String value; 9 | 10 | Signature._(this.algorithm, this.certificate, this.value); 11 | 12 | factory Signature.parse(Map json) => Signature._( 13 | Uri.parse(json["algorithm"]), json["certificate"], json["value"]); 14 | 15 | @override 16 | String toString() => 17 | 'Signature{algorithm: $algorithm, certificate: $certificate, value: $value}'; 18 | } 19 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/model/components/lcp/user_key.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | class UserKey { 6 | final String textHint; 7 | final Uri algorithm; 8 | final String keyCheck; 9 | 10 | UserKey._(this.textHint, this.algorithm, this.keyCheck); 11 | 12 | factory UserKey.parse(Map json) => UserKey._( 13 | json["text_hint"], Uri.parse(json["algorithm"]), json["key_check"]); 14 | 15 | @override 16 | String toString() => 17 | 'UserKey{textHint: $textHint, algorithm: $algorithm, keyCheck: $keyCheck}'; 18 | } 19 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/license/model/components/lsd/potential_rights.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | class PotentialRights { 6 | DateTime? end; 7 | 8 | PotentialRights._(this.end); 9 | 10 | factory PotentialRights.parse(Map json) => 11 | PotentialRights._(DateTime.tryParse(json["end"])); 12 | 13 | @override 14 | String toString() => 'PotentialRights{end: $end}'; 15 | } 16 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/native/lcp_native.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/native/lcp_client_native.dart'; 6 | 7 | mixin LcpNative { 8 | static Future initLcpNative() async { 9 | LcpClientNative.loadDynamicLib(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/service/device_repository.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/lcp.dart'; 6 | 7 | abstract class DeviceRepository { 8 | Future isDeviceRegistered(LicenseDocument license); 9 | 10 | void registerDevice(LicenseDocument license); 11 | } 12 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/service/licenses_repository.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | import 'package:mno_lcp/lcp.dart'; 6 | 7 | abstract class LicensesRepository { 8 | void addLicense(LicenseDocument license); 9 | 10 | int? copiesLeft(String licenseId); 11 | 12 | void setCopiesLeft(int quantity, String licenseId); 13 | 14 | int? printsLeft(String licenseId); 15 | 16 | void setPrintsLeft(int quantity, String licenseId); 17 | } 18 | -------------------------------------------------------------------------------- /packages/iridium/components/lcp/lib/service/passphrases_repository.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021 Mantano. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | abstract class PassphrasesRepository { 6 | Future passphrase(String licenseId); 7 | 8 | Future> passphrases(String userId); 9 | 10 | Future> allPassphrases(); 11 | 12 | void addPassphrase(String passphraseHash, String? licenseId, String? provider, 13 | String? userId); 14 | } 15 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.1.0 2 | 3 | * Provide navigator support for epub and cbz files 4 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:lints/recommended.yaml 2 | linter: 3 | rules: 4 | omit_local_variable_types: false 5 | public_member_api_docs: false 6 | unnecessary_this: false 7 | prefer_single_quotes: false 8 | prefer_double_quotes: false 9 | annotate_overrides: true 10 | prefer_expression_function_bodies: true 11 | always_declare_return_types: true 12 | avoid_returning_null_for_future: true 13 | always_use_package_imports: true 14 | use_super_parameters: true 15 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "globals": { 7 | "Android": "readonly", 8 | "global": "writable", 9 | "readium": "writable" 10 | }, 11 | "extends": "eslint:recommended", 12 | "parserOptions": { 13 | "ecmaVersion": 12, 14 | "sourceType": "module" 15 | }, 16 | "ignorePatterns": ["src/vendor"], 17 | "rules": { 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/.prettierignore: -------------------------------------------------------------------------------- 1 | src/vendor 2 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/.prettierrc.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/packages/iridium/components/navigator/assets/_scripts/.prettierrc.json -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/README.md: -------------------------------------------------------------------------------- 1 | # Readium JS (Kotlin) 2 | 3 | A set of JavaScript files used by the Kotlin EPUB navigator. 4 | 5 | This folder starts with an underscore to prevent Gradle from embedding it as an asset. 6 | 7 | ## Scripts 8 | 9 | Run `npm install`, then use one of the following: 10 | 11 | * `yarn run bundle` Rebuild the assets after any changes in the `src/` folder. 12 | * `yarn run lint` Check code quality. 13 | * `yarn run checkformat` Check if there's any formatting issues. 14 | * `yarn run format` Automatically format JavaScript sources. 15 | 16 | In case `bundle` does not work with recent NodeJS versions (17+), a workaround is: 17 | `export NODE_OPTIONS=--openssl-legacy-provider` 18 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"] 3 | } 4 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/src/index-fixed.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2021 Readium Foundation. All rights reserved. 3 | // Use of this source code is governed by the BSD-style license 4 | // available in the top-level LICENSE file of the project. 5 | // 6 | 7 | // Script used for fixed layouts resources. 8 | 9 | import "./index"; 10 | 11 | /*eslint no-unused-vars: ["error", { "args": "none" }]*/ 12 | readium.setBookmarkIndexes = function (bookmarkIndexes) {}; 13 | readium.initPagination = function () {}; 14 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/src/vendor/hypothesis/README.md: -------------------------------------------------------------------------------- 1 | The code in this module has been directly copied from https://github.com/hypothesis/client, released under the 2-Clause BSD license. 2 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/src/vendor/hypothesis/anchoring/test/html-baselines/minimal.html: -------------------------------------------------------------------------------- 1 |
One Two Three
2 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/_scripts/src/vendor/hypothesis/anchoring/test/html-baselines/minimal.json: -------------------------------------------------------------------------------- 1 | { 2 | "total": 1, 3 | "rows": [{ 4 | "id": "test", 5 | "target": [{ 6 | "selector": [{ 7 | "type": "RangeSelector", 8 | "startContainer": "/div[1]", 9 | "endContainer": "/div[1]", 10 | "startOffset": 4, 11 | "endOffset": 7 12 | },{ 13 | "type": "TextPositionSelector", 14 | "start": 4, 15 | "end": 7 16 | },{ 17 | "type": "TextQuoteSelector", 18 | "prefix": "One ", 19 | "suffix": " Three\n", 20 | "exact": "Two" 21 | }] 22 | }] 23 | }] 24 | } 25 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/readium/assets/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/readium/assets/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/readium/fonts/OpenDyslexic-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/packages/iridium/components/navigator/assets/readium/fonts/OpenDyslexic-Regular.otf -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/readium/readium-css/fonts/AccessibleDfA.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/packages/iridium/components/navigator/assets/readium/readium-css/fonts/AccessibleDfA.otf -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/readium/readium-css/fonts/iAWriterDuospace-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JideGuru/FlutterEbookApp/b09736833197a9cfb3de39ffe8db2f7c1508056a/packages/iridium/components/navigator/assets/readium/readium-css/fonts/iAWriterDuospace-Regular.ttf -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/readium/scripts/.gitignore: -------------------------------------------------------------------------------- 1 | *.map 2 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/xpub-assets/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/xpub-js/Reflowable_Viewport.js: -------------------------------------------------------------------------------- 1 | 2 | (function() { 3 | var meta = document.createElement("meta"); 4 | meta.setAttribute("name", "viewport"); 5 | meta.setAttribute("content", "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"); 6 | document.head.appendChild(meta); 7 | })(); 8 | -------------------------------------------------------------------------------- /packages/iridium/components/navigator/assets/xpub-js/Theme.js: -------------------------------------------------------------------------------- 1 | // 2 | // Controller to override the book's style with our own theme. 3 | // 4 | // When a spine item is loaded, a