├── .github ├── downloads.jpg ├── home.jpg ├── reader.jpg ├── result.jpg ├── search.jpg └── workflows │ └── build.yml ├── .gitignore ├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── gradle.xml ├── jarRepositories.xml ├── uiDesigner.xml └── vcs.xml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── quicknovel │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ │ └── com │ │ │ └── lagradost │ │ │ └── quicknovel │ │ │ ├── APIRepository.kt │ │ │ ├── BaseApplication.kt │ │ │ ├── BookDownloader2.kt │ │ │ ├── CommonActivity.kt │ │ │ ├── DataStore.kt │ │ │ ├── FontAdapter.kt │ │ │ ├── MainAPI.kt │ │ │ ├── MainActivity.kt │ │ │ ├── ReadActivity2.kt │ │ │ ├── ReadActivityViewModel.kt │ │ │ ├── TTSHelper.kt │ │ │ ├── TTSNotificationService.kt │ │ │ ├── TTSNotifications.kt │ │ │ ├── extractors │ │ │ ├── ExtractorApi.kt │ │ │ └── LibgenLi.kt │ │ │ ├── mvvm │ │ │ └── ArchComponentExt.kt │ │ │ ├── network │ │ │ ├── CloudflareKiller.kt │ │ │ └── WebViewResolver.kt │ │ │ ├── providers │ │ │ ├── AllNovelProvider.kt │ │ │ ├── AnnasArchive.kt │ │ │ ├── BestLightNovelProvider.kt │ │ │ ├── BoxNovelProvider.kt │ │ │ ├── ComrademaoProvider.kt │ │ │ ├── EfremnetProvider.kt │ │ │ ├── FreeWebNovelProvider.kt │ │ │ ├── HiraethTranslationProvider.kt │ │ │ ├── IndoWebNovelProvider.kt │ │ │ ├── KolNovelProvider.kt │ │ │ ├── LibReadProvider.kt │ │ │ ├── LightNovelPubProvider.kt │ │ │ ├── MadaraReader.kt │ │ │ ├── MeioNovelProvider.kt │ │ │ ├── MoreNovelProvider.kt │ │ │ ├── MtlNovelsProvider.kt │ │ │ ├── NovelBinProvider.kt │ │ │ ├── NovelFullProvider.kt │ │ │ ├── NovelsOnlineProvider.kt │ │ │ ├── PawReadProver.kt │ │ │ ├── RanobesProvider.kt │ │ │ ├── ReadAnyBookProvider.kt │ │ │ ├── ReadLightNovelProvider.kt │ │ │ ├── ReadNovelFullProvider.kt │ │ │ ├── ReadfromnetProvider.kt │ │ │ ├── RedditProvider.kt │ │ │ ├── RoyalRoadProvider.kt │ │ │ ├── SakuraNovelProvider.kt │ │ │ ├── ScribblehubProvider.kt │ │ │ ├── WPReader.kt │ │ │ ├── WattpadProvider.kt │ │ │ └── WtrLabProvider.kt │ │ │ ├── receivers │ │ │ └── BecomingNoisyReceiver.kt │ │ │ ├── services │ │ │ ├── DownloadService.kt │ │ │ └── TTSPauseService.kt │ │ │ ├── tools.kt │ │ │ ├── ui │ │ │ ├── BaseAdapter.kt │ │ │ ├── NonFinalAdapterListUpdateCallback.kt │ │ │ ├── OrientationType.kt │ │ │ ├── ReadType.kt │ │ │ ├── ReadingType.kt │ │ │ ├── TextAdapter.kt │ │ │ ├── TextImageView.kt │ │ │ ├── UiText.kt │ │ │ ├── download │ │ │ │ ├── AnyAdapter.kt │ │ │ │ ├── CachedAdapter2.kt │ │ │ │ ├── DownloadAdapter2.kt │ │ │ │ ├── DownloadFragment.kt │ │ │ │ ├── DownloadViewModel.kt │ │ │ │ └── ViewpagerAdapter.kt │ │ │ ├── history │ │ │ │ ├── HistoryAdapter2.kt │ │ │ │ ├── HistoryFragment.kt │ │ │ │ └── HistoryViewModel.kt │ │ │ ├── home │ │ │ │ ├── BrowseAdapter2.kt │ │ │ │ ├── HomeFragment.kt │ │ │ │ └── HomeViewModel.kt │ │ │ ├── mainpage │ │ │ │ ├── MainAdapter2.kt │ │ │ │ ├── MainPageFragment.kt │ │ │ │ ├── MainPageRepository.kt │ │ │ │ └── MainPageViewModel.kt │ │ │ ├── result │ │ │ │ ├── ChapterAdapter.kt │ │ │ │ ├── ResultFragment.kt │ │ │ │ ├── ResultViewModel.kt │ │ │ │ └── ReviewAdapter2.kt │ │ │ ├── roundedbg │ │ │ │ ├── LayoutExtensions.kt │ │ │ │ ├── RoundedBgTextView.kt │ │ │ │ ├── TextRoundedBgAttributeReader.kt │ │ │ │ ├── TextRoundedBgHelper.kt │ │ │ │ └── TextRoundedBgRenderer.kt │ │ │ ├── search │ │ │ │ ├── HomeChildItemAdapter2.kt │ │ │ │ ├── ParentItemAdapter2.kt │ │ │ │ ├── SearchAdapter2.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ └── SearchViewModel.kt │ │ │ └── settings │ │ │ │ └── SettingsFragment.kt │ │ │ ├── util │ │ │ ├── Apis.kt │ │ │ ├── AppUtils.kt │ │ │ ├── BackupUtils.kt │ │ │ ├── Coroutines.kt │ │ │ ├── Event.kt │ │ │ ├── GlideApp.kt │ │ │ ├── InAppUpdater.kt │ │ │ ├── ParCollections.kt │ │ │ ├── ResultCached.kt │ │ │ ├── SettingsHelper.kt │ │ │ ├── SingleSelectionHelper.kt │ │ │ ├── SubtitleHelper.kt │ │ │ └── UIHelper.kt │ │ │ └── widget │ │ │ ├── AutofitRecyclerView.kt │ │ │ └── FlowLayout.kt │ └── res │ │ ├── anim │ │ ├── enter_anim.xml │ │ ├── exit_anim.xml │ │ ├── nav_enter_anim.xml │ │ ├── nav_exit_anim.xml │ │ ├── nav_pop_enter.xml │ │ ├── nav_pop_exit.xml │ │ ├── pop_enter.xml │ │ └── pop_exit.xml │ │ ├── color │ │ ├── check_selection_color.xml │ │ ├── chip_color.xml │ │ ├── chip_color_text.xml │ │ ├── item_select_color.xml │ │ ├── text_selection_color.xml │ │ └── white_transparent_toggle.xml │ │ ├── drawable │ │ ├── background_shadow.xml │ │ ├── baseline_restore_page_24.xml │ │ ├── baseline_save_as_24.xml │ │ ├── big_icon_boxnovel.png │ │ ├── big_icon_novelpassion.xml │ │ ├── big_icon_readlightnovel.png │ │ ├── big_icon_royalroad.png │ │ ├── big_icon_wuxiaworldsite.png │ │ ├── bigger_font.xml │ │ ├── books_emoji.xml │ │ ├── checkmark_check.xml │ │ ├── circle.xml │ │ ├── circle_shape.xml │ │ ├── circular_progress_bar_clockwise.xml │ │ ├── color_selection.xml │ │ ├── color_selection_check.xml │ │ ├── color_selection_outline.xml │ │ ├── cs3_cloud.xml │ │ ├── dialog__window_background.xml │ │ ├── download_add_bg.xml │ │ ├── download_button_background.xml │ │ ├── fiber_new_24px.xml │ │ ├── format_padding_decrease_white_24dp.xml │ │ ├── format_padding_increase_white_24dp.xml │ │ ├── ic_baseline_add_24.xml │ │ ├── ic_baseline_arrow_back_24.xml │ │ ├── ic_baseline_arrow_downward_24.xml │ │ ├── ic_baseline_arrow_forward_24.xml │ │ ├── ic_baseline_arrow_upward_24.xml │ │ ├── ic_baseline_autorenew_24.xml │ │ ├── ic_baseline_bookmark_24.xml │ │ ├── ic_baseline_bookmark_border_24.xml │ │ ├── ic_baseline_check_24.xml │ │ ├── ic_baseline_check_24_listview.xml │ │ ├── ic_baseline_cloud_24.xml │ │ ├── ic_baseline_code_24.xml │ │ ├── ic_baseline_collections_bookmark_24.xml │ │ ├── ic_baseline_color_lens_24.xml │ │ ├── ic_baseline_create_24.xml │ │ ├── ic_baseline_delete_outline_24.xml │ │ ├── ic_baseline_discord_24.xml │ │ ├── ic_baseline_edit_24.xml │ │ ├── ic_baseline_fast_forward_24.xml │ │ ├── ic_baseline_fast_rewind_24.xml │ │ ├── ic_baseline_filter_list_24.xml │ │ ├── ic_baseline_font_download_24.xml │ │ ├── ic_baseline_grid_view_24.xml │ │ ├── ic_baseline_history_24.xml │ │ ├── ic_baseline_keyboard_arrow_down_24.xml │ │ ├── ic_baseline_language_24.xml │ │ ├── ic_baseline_list_24.xml │ │ ├── ic_baseline_menu_24.xml │ │ ├── ic_baseline_menu_book_24.xml │ │ ├── ic_baseline_more_vert_24.xml │ │ ├── ic_baseline_notifications_active_24.xml │ │ ├── ic_baseline_open_in_new_24.xml │ │ ├── ic_baseline_pause_24.xml │ │ ├── ic_baseline_play_arrow_24.xml │ │ ├── ic_baseline_public_24.xml │ │ ├── ic_baseline_screen_lock_landscape_24.xml │ │ ├── ic_baseline_screen_lock_portrait_24.xml │ │ ├── ic_baseline_screen_rotation_24.xml │ │ ├── ic_baseline_star_24.xml │ │ ├── ic_baseline_stay_current_landscape_24.xml │ │ ├── ic_baseline_stay_current_portrait_24.xml │ │ ├── ic_baseline_stop_24.xml │ │ ├── ic_baseline_system_update_24.xml │ │ ├── ic_baseline_tune_24.xml │ │ ├── ic_baseline_volume_up_24.xml │ │ ├── ic_blank_24.xml │ │ ├── ic_check_24.xml │ │ ├── ic_github_logo.xml │ │ ├── ic_icon_monochrome.xml │ │ ├── ic_indowebnovel.png │ │ ├── ic_launcher_background.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── ic_meionovel.png │ │ ├── ic_morenovel.png │ │ ├── ic_outline_explore_24.xml │ │ ├── ic_outline_settings_24.xml │ │ ├── ic_outline_share_24.xml │ │ ├── ic_quicknovel.xml │ │ ├── ic_sakuranovel.png │ │ ├── ic_sharp_clear_24.xml │ │ ├── ic_sort_24dp.xml │ │ ├── icon.xml │ │ ├── icon_allnovel.png │ │ ├── icon_azynovel.png │ │ ├── icon_boxnovel.png │ │ ├── icon_efremnet.png │ │ ├── icon_engnovel.png │ │ ├── icon_freewebnovel.png │ │ ├── icon_hiraethtranslation.png │ │ ├── icon_kolnovel.png │ │ ├── icon_libread.png │ │ ├── icon_mnovel.png │ │ ├── icon_mtlnovel.png │ │ ├── icon_novelbin.png │ │ ├── icon_novelfull.png │ │ ├── icon_novelfullvip.png │ │ ├── icon_novelpassion.png │ │ ├── icon_novelsonline.png │ │ ├── icon_ranobes.png │ │ ├── icon_readfromnet.png │ │ ├── icon_readlightnovel.png │ │ ├── icon_readlightnovel2.png │ │ ├── icon_readlightnovel3.png │ │ ├── icon_readlightnovel4.png │ │ ├── icon_rewayatar.png │ │ ├── icon_royalroad.png │ │ ├── icon_royalroad2.png │ │ ├── icon_wuxiaworldonline.png │ │ ├── icon_wuxiaworldsite.png │ │ ├── indicator_background.xml │ │ ├── monke_eating.xml │ │ ├── netflix_download.xml │ │ ├── netflix_pause.xml │ │ ├── netflix_play.xml │ │ ├── nights_stay_24px.xml │ │ ├── nothing.xml │ │ ├── nulldrawable.xml │ │ ├── outline.xml │ │ ├── outline_drawable.xml │ │ ├── outline_drawable_less.xml │ │ ├── outline_less.xml │ │ ├── pawread.png │ │ ├── rddone.xml │ │ ├── rderror.xml │ │ ├── rdload.xml │ │ ├── rdpause.xml │ │ ├── ripple_regular.xml │ │ ├── round_bg_button.xml │ │ ├── rounded_dialog.xml │ │ ├── rounded_text_bg.xml │ │ ├── rounded_text_bg_left.xml │ │ ├── rounded_text_bg_mid.xml │ │ ├── rounded_text_bg_right.xml │ │ ├── search_background.xml │ │ ├── search_icon.xml │ │ ├── search_icon_white.xml │ │ ├── shadow.xml │ │ ├── smaller_font.xml │ │ ├── splash_background.xml │ │ ├── swipe_vertical_24px.xml │ │ ├── tab_selector.xml │ │ ├── text_top_bottom_margin.xml │ │ ├── text_top_bottom_margin_expand.xml │ │ ├── title_shadow.xml │ │ ├── translate_24px.xml │ │ └── white_card.xml │ │ ├── font │ │ ├── google_sans.xml │ │ ├── productsans_black.ttf │ │ ├── productsans_blackitalic.ttf │ │ ├── productsans_bold.ttf │ │ ├── productsans_bolditalic.ttf │ │ ├── productsans_italic.ttf │ │ ├── productsans_light.ttf │ │ ├── productsans_lightitalic.ttf │ │ ├── productsans_medium.ttf │ │ ├── productsans_mediumitalic.ttf │ │ ├── productsans_regular.ttf │ │ ├── productsans_thin.ttf │ │ └── productsans_thinitalic.ttf │ │ ├── layout │ │ ├── .idea │ │ │ ├── .gitignore │ │ │ ├── misc.xml │ │ │ ├── modules.xml │ │ │ └── vcs.xml │ │ ├── activity_main.xml │ │ ├── bottom_preview.xml │ │ ├── bottom_selection_dialog.xml │ │ ├── browse_list_compact.xml │ │ ├── chapter_select_dialog.xml │ │ ├── checkmark_select_dialog.xml │ │ ├── color_round_checkmark.xml │ │ ├── custom_toolbar.xml │ │ ├── download_result_compact.xml │ │ ├── download_result_grid.xml │ │ ├── filter_bottom_sheet.xml │ │ ├── font_bottom_sheet.xml │ │ ├── fragment_downloads.xml │ │ ├── fragment_history.xml │ │ ├── fragment_home.xml │ │ ├── fragment_mainpage.xml │ │ ├── fragment_result.xml │ │ ├── fragment_search.xml │ │ ├── history_result_compact.xml │ │ ├── home_episodes_expanded.xml │ │ ├── home_result_grid.xml │ │ ├── homepage_parent.xml │ │ ├── image_layout.xml │ │ ├── loading_bottom.xml │ │ ├── loading_downloads.xml │ │ ├── loading_episode.xml │ │ ├── loading_line.xml │ │ ├── loading_line_short.xml │ │ ├── loading_line_short2.xml │ │ ├── loading_line_short_center.xml │ │ ├── loading_list.xml │ │ ├── loading_poster.xml │ │ ├── loading_poster_dynamic.xml │ │ ├── loading_review.xml │ │ ├── read_bottom_settings.xml │ │ ├── read_main.xml │ │ ├── result_review.xml │ │ ├── result_review_tag.xml │ │ ├── result_tag.xml │ │ ├── search_result_compact.xml │ │ ├── search_result_grid.xml │ │ ├── search_result_super_compact.xml │ │ ├── simple_chapter.xml │ │ ├── single_failed.xml │ │ ├── single_finished_chapter.xml │ │ ├── single_image.xml │ │ ├── single_load.xml │ │ ├── single_loading.xml │ │ ├── single_overscroll_chapter.xml │ │ ├── single_text.xml │ │ ├── sort_bottom_sheet.xml │ │ ├── sort_bottom_single_choice.xml │ │ ├── sort_bottom_single_choice_down.xml │ │ ├── sort_bottom_single_choice_up.xml │ │ ├── spinner_select_dialog.xml │ │ ├── toast.xml │ │ └── viewpager_page.xml │ │ ├── menu │ │ ├── bottom_nav_menu.xml │ │ ├── download_actionbar.xml │ │ ├── history_actionbar.xml │ │ ├── home_actionbar.xml │ │ ├── mainpage_actionbar.xml │ │ └── sleep_timer.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ └── mobile_navigation.xml │ │ ├── raw │ │ └── dummy_sound_500ms.mp3 │ │ ├── values-tr │ │ └── strings.xml │ │ ├── values │ │ ├── array.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── provider_paths.xml │ │ └── settings.xml │ └── test │ └── java │ └── com │ └── example │ └── quicknovel │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.github/downloads.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/.github/downloads.jpg -------------------------------------------------------------------------------- /.github/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/.github/home.jpg -------------------------------------------------------------------------------- /.github/reader.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/.github/reader.jpg -------------------------------------------------------------------------------- /.github/result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/.github/result.jpg -------------------------------------------------------------------------------- /.github/search.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/.github/search.jpg -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build App 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | 8 | jobs: 9 | check_wrapper: 10 | name: Validate Gradle Wrapper 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Clone repo 15 | uses: actions/checkout@v2 16 | 17 | - name: Validate Gradle Wrapper 18 | uses: gradle/wrapper-validation-action@v1 19 | 20 | build: 21 | name: Build app 22 | needs: check_wrapper 23 | runs-on: ubuntu-latest 24 | 25 | steps: 26 | - name: Cancel previous runs 27 | uses: styfle/cancel-workflow-action@0.5.0 28 | with: 29 | access_token: ${{ secrets.GITHUB_TOKEN }} 30 | 31 | - name: Clone repo 32 | uses: actions/checkout@v2 33 | 34 | - name: Set up JDK 11 35 | uses: actions/setup-java@v1 36 | with: 37 | java-version: 11 38 | 39 | - name: Build app 40 | uses: eskatos/gradle-command-action@v1 41 | with: 42 | arguments: assembleRelease 43 | wrapper-cache-enabled: true 44 | dependencies-cache-enabled: true 45 | configuration-cache-enabled: true 46 | 47 | - name: Rename app 48 | run: | 49 | cd app/build/outputs/apk/release 50 | mv app-release-unsigned.apk QuickNovel.apk 51 | - name: Upload Artifact 52 | uses: actions/upload-artifact@v2 53 | with: 54 | name: QuickNovel 55 | path: app/build/outputs/apk/release/QuickNovel.apk 56 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | /.idea/deploymentTargetSelector.xml 11 | /.idea/kotlinc.xml 12 | /.idea/misc.xml 13 | .DS_Store 14 | /build 15 | /captures 16 | .externalNativeBuild 17 | .cxx 18 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Osten 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QuickNovel 2 | Adfree FOSS Android app for downloading novels. It also functions as an Epub reader. 3 | 4 | **Discord:** https://discord.gg/5Hus6fM 5 | 6 | **Download:** https://github.com/LagradOst/QuickNovel/releases 7 | 8 | **Providers used:** 9 | 10 | - https://allnovel.org 11 | - https://annas-archive.org 12 | - https://bestlightnovel.com 13 | - https://freewebnovel.com 14 | - https://graycity.net 15 | - https://hiraethtranslation.com 16 | - https://indowebnovel.id 17 | - https://kolnovel.com 18 | - https://libread.com 19 | - https://meionovels.com 20 | - https://risenovel.com 21 | - https://www.mtlnovels.com 22 | - https://novelbin.com 23 | - https://novelfull.com 24 | - https://novelsonline.org 25 | - https://pawread.com 26 | - https://readfrom.net 27 | - https://readnovelfull.com 28 | - https://www.royalroad.com 29 | - https://sakuranovel.id 30 | - https://www.scribblehub.com 31 | - https://wtr-lab.com 32 | 33 | **Screenshoots:** 34 | 35 | 36 | 37 | **Legal notice:** 38 | 39 | Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. 40 | 41 | In case of copyright infringement, please directly contact the responsible parties or the streaming websites. 42 | 43 | The app is purely for educational and personal use. 44 | 45 | QuickNovel does not host any content on the app, and has no control over what media is put up or taken down. QuickNovel functions like any other search engine, such as Google. QuickNovel does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. 46 | 47 | It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use QuickNovel at your own risk. 48 | 49 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/quicknovel/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.lagradost.quicknovel", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/FontAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel 2 | 3 | import android.content.Context 4 | import android.graphics.Typeface 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.BaseAdapter 9 | import android.widget.TextView 10 | import com.lagradost.quicknovel.util.UIHelper.parseFontFileName 11 | import java.io.File 12 | 13 | class FontAdapter(val context: Context, private val checked: Int?, private val fonts: ArrayList) : BaseAdapter() { 14 | override fun getCount(): Int { 15 | return fonts.size 16 | } 17 | 18 | override fun getItem(position: Int): Any { 19 | return fonts[position] ?: 0 20 | } 21 | 22 | override fun getItemId(position: Int): Long { 23 | return fonts[position]?.name?.hashCode()?.toLong() ?: 0 24 | } 25 | 26 | override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { 27 | val view = 28 | (convertView ?: LayoutInflater.from(context) 29 | .inflate(R.layout.sort_bottom_single_choice, parent, false)) as TextView 30 | 31 | val font = fonts[position] 32 | view.text = parseFontFileName(font?.name) 33 | view.isSelected = position == checked 34 | if (font != null) { 35 | view.typeface = Typeface.createFromFile(font) 36 | } 37 | return view 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/extractors/LibgenLi.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.extractors 2 | 3 | import androidx.annotation.WorkerThread 4 | import com.lagradost.quicknovel.DownloadExtractLink 5 | import com.lagradost.quicknovel.DownloadLink 6 | import com.lagradost.quicknovel.DownloadLinkType 7 | import com.lagradost.quicknovel.get 8 | 9 | class LibgenLi : ExtractorApi() { 10 | override val mainUrl = "https://libgen.li" 11 | override val name = "LibgenLi" 12 | override val requiresReferer = false 13 | 14 | @WorkerThread 15 | override suspend fun getUrl(link : DownloadExtractLink): List? { 16 | val document = link.get().document 17 | val url = fixUrlNull(document.selectFirst("tbody>tr>td>a")?.attr("href")) 18 | return listOf( 19 | DownloadLink( 20 | url = url ?: return null, 21 | name = name, 22 | kbPerSec = 200 23 | ) 24 | ) 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/providers/IndoWebNovelProvider.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.providers 2 | 3 | import com.lagradost.quicknovel.R 4 | 5 | class IndoWebNovelProvider : WPReader() { 6 | override val name = "IndoWebNovel" 7 | override val mainUrl = "https://indowebnovel.id" 8 | override val iconId = R.drawable.ic_indowebnovel 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/providers/MeioNovelProvider.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.providers 2 | 3 | import com.lagradost.quicknovel.R 4 | 5 | /* 6 | // https://boxnovel.com/ 7 | // https://morenovel.net/ 8 | // https://meionovel.id/ 9 | */ 10 | class MeioNovelProvider : BoxNovelProvider() { 11 | override val name = "MeioNovel" 12 | override val mainUrl = "https://meionovels.com" 13 | override val iconId = R.drawable.ic_meionovel 14 | override val iconBackgroundId = R.color.colorPrimaryBlue 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/providers/MoreNovelProvider.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.providers 2 | 3 | import com.lagradost.quicknovel.* 4 | 5 | class MoreNovelProvider : BoxNovelProvider() { 6 | override val name = "MoreNovel" 7 | override val mainUrl = "https://risenovel.com" // domain change 8 | override val iconId = R.drawable.ic_morenovel 9 | override val mainCategories = listOf( 10 | "All" to "", 11 | "Novel Korea" to "korean", 12 | "Novel China" to "chinese", 13 | "Novel Jepang" to "japanese", 14 | "Novel Philipina" to "philippines" 15 | ) 16 | 17 | override val tags = listOf( 18 | "All" to "", 19 | "Fantasy" to "fantasy", 20 | "Martial Arts" to "martial-arts", 21 | "Xuanhuan" to "xuanhuan", 22 | "Xianxia" to "xianxia", 23 | "Wuxia" to "wuxia", 24 | "Action" to "action", 25 | "Adventure" to "adventure", 26 | "Comedy" to "comedy", 27 | "Drama" to "drama", 28 | "Ecchi" to "ecchi", 29 | "Harem" to "harem", 30 | "Gender Bender" to "gender-bender", 31 | "Historical" to "historical", 32 | "Horror" to "horror", 33 | "Josei" to "josei", 34 | "Mature" to "mature", 35 | "Mecha" to "mecha", 36 | "Mystery" to "mystery", 37 | "Psychological" to "psychological", 38 | "Romance" to "romance", 39 | "Sci-fi" to "sci-fi", 40 | "Seinen" to "seinen", 41 | "School Life" to "school-life", 42 | "Shoujo" to "shoujo", 43 | "Shoujo Ai" to "shoujo-ai", 44 | "Shounen" to "shounen", 45 | "Shounen Ai" to "shounen-ai", 46 | "Slice of Life" to "slice-of-life", 47 | "Sports" to "sports", 48 | "Supernatural" to "supernatural", 49 | "Tragedy" to "tragedy", 50 | "Yaoi" to "yaoi", 51 | "Yuri" to "yuri", 52 | ) 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/providers/SakuraNovelProvider.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.providers 2 | 3 | import com.lagradost.quicknovel.* 4 | 5 | class SakuraNovelProvider : WPReader() { 6 | override val name = "SakuraNovel" 7 | override val mainUrl = "https://sakuranovel.id" 8 | override val iconId = R.drawable.ic_sakuranovel 9 | override val tags = listOf( 10 | "All" to "", 11 | "Action" to "action", 12 | "Adult" to "adult", 13 | "Adventure" to "adventure", 14 | "Comedy" to "comedy", 15 | "Drama" to "drama", 16 | "Ecchi" to "ecchi", 17 | "Fantasy" to "fantasy", 18 | "Gender Bender" to "gender-bender", 19 | "Harem" to "harem", 20 | "Historical" to "historical", 21 | "Horror" to "horror", 22 | "Martial Arts" to "martial-arts", 23 | "Mature" to "mature", 24 | "Mecha" to "mecha", 25 | "Mystery" to "mystery", 26 | "Psychological" to "psychological", 27 | "Romance" to "romance", 28 | "School Life" to "school-life", 29 | "Sci-fi" to "sci-fi", 30 | "Seinen" to "seinen", 31 | "Shoujo" to "shoujo", 32 | "Shounen" to "shounen", 33 | "Slice of Life" to "slice-of-life", 34 | "Supernatural" to "supernatural", 35 | "Tragedy" to "tragedy", 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/receivers/BecomingNoisyReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.media.AudioManager 7 | import com.lagradost.quicknovel.ReadActivity2 8 | import com.lagradost.quicknovel.TTSHelper 9 | 10 | class BecomingNoisyReceiver : BroadcastReceiver() { 11 | override fun onReceive(context: Context, intent: Intent) { 12 | if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) { 13 | 14 | /*if (ReadActivity.readActivity.ttsStatus == ReadActivity.TTSStatus.IsRunning) { 15 | ReadActivity.readActivity.isTTSPaused = true 16 | }*/ 17 | ReadActivity2.readActivity?.parseAction(TTSHelper.TTSActionType.Pause) 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/services/DownloadService.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.services 2 | 3 | import android.app.IntentService 4 | import android.content.Intent 5 | import com.lagradost.quicknovel.BookDownloader2 6 | import com.lagradost.quicknovel.DownloadActionType 7 | 8 | class DownloadService : IntentService("DownloadService") { 9 | override fun onHandleIntent(intent: Intent?) { 10 | if (intent != null) { 11 | val id = intent.getIntExtra("id", -1) 12 | val type = intent.getStringExtra("type") 13 | if (id != -1 && type != null) { 14 | val action = when(type) { 15 | "resume" -> DownloadActionType.Resume 16 | "pause" -> DownloadActionType.Pause 17 | "stop" -> DownloadActionType.Stop 18 | else -> null 19 | } 20 | 21 | if(action != null) 22 | BookDownloader2.addPendingAction(id, action) 23 | } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/services/TTSPauseService.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.services 2 | 3 | import android.app.IntentService 4 | import android.content.Intent 5 | import com.lagradost.quicknovel.ReadActivity2 6 | import com.lagradost.quicknovel.TTSHelper 7 | 8 | class TTSPauseService : IntentService("TTSPauseService") { 9 | override fun onHandleIntent(intent: Intent?) { 10 | if (intent != null) { 11 | val id = intent.getIntExtra("id", -1) 12 | 13 | when (id) { 14 | TTSHelper.TTSActionType.Pause.ordinal -> { 15 | TTSHelper.TTSActionType.Pause 16 | } 17 | TTSHelper.TTSActionType.Resume.ordinal -> { 18 | TTSHelper.TTSActionType.Resume 19 | } 20 | TTSHelper.TTSActionType.Stop.ordinal -> { 21 | TTSHelper.TTSActionType.Stop 22 | } 23 | else -> null 24 | }?.let { action -> 25 | ReadActivity2.readActivity?.parseAction(action) 26 | } 27 | /* 28 | when (id) { 29 | TTSActionType.Pause.ordinal -> { 30 | ReadActivity.readActivity.isTTSPaused = true 31 | } 32 | TTSActionType.Resume.ordinal -> { 33 | ReadActivity.readActivity.isTTSPaused = false 34 | } 35 | TTSActionType.Stop.ordinal -> { 36 | ReadActivity.readActivity.stopTTS() 37 | } 38 | }*/ 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/NonFinalAdapterListUpdateCallback.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui 2 | 3 | import android.annotation.SuppressLint 4 | import androidx.recyclerview.widget.DiffUtil 5 | import androidx.recyclerview.widget.ListUpdateCallback 6 | import androidx.recyclerview.widget.RecyclerView 7 | 8 | 9 | /** 10 | * ListUpdateCallback that dispatches update events to the given adapter. 11 | * 12 | * @see DiffUtil.DiffResult.dispatchUpdatesTo 13 | */ 14 | open class NonFinalAdapterListUpdateCallback 15 | /** 16 | * Creates an AdapterListUpdateCallback that will dispatch update events to the given adapter. 17 | * 18 | * @param mAdapter The Adapter to send updates to. 19 | */(private var mAdapter: RecyclerView.Adapter<*>) : 20 | ListUpdateCallback { 21 | 22 | override fun onInserted(position: Int, count: Int) { 23 | mAdapter.notifyItemRangeInserted(position, count) 24 | } 25 | 26 | override fun onRemoved(position: Int, count: Int) { 27 | mAdapter.notifyItemRangeRemoved(position, count) 28 | } 29 | 30 | override fun onMoved(fromPosition: Int, toPosition: Int) { 31 | mAdapter.notifyItemMoved(fromPosition, toPosition) 32 | } 33 | 34 | @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly 35 | override fun onChanged(position: Int, count: Int, payload: Any?) { 36 | mAdapter.notifyItemRangeChanged(position, count, payload) 37 | } 38 | } 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/OrientationType.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui 2 | 3 | import android.content.pm.ActivityInfo 4 | import androidx.annotation.DrawableRes 5 | import androidx.annotation.StringRes 6 | import com.lagradost.quicknovel.R 7 | 8 | enum class OrientationType(val prefValue: Int, val flag: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) { 9 | DEFAULT(0, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.default_text, R.drawable.ic_baseline_screen_rotation_24), 10 | FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.rotation_free, R.drawable.ic_baseline_screen_rotation_24), 11 | PORTRAIT(2, ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, R.string.rotation_portrait, R.drawable.ic_baseline_stay_current_portrait_24), 12 | LANDSCAPE(3, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, R.string.rotation_landscape, R.drawable.ic_baseline_stay_current_landscape_24), 13 | LOCKED_PORTRAIT(4, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, R.string.rotation_force_portrait, R.drawable.ic_baseline_screen_lock_portrait_24), 14 | LOCKED_LANDSCAPE(5, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, R.string.rotation_force_landscape, R.drawable.ic_baseline_screen_lock_landscape_24); 15 | 16 | companion object { 17 | fun fromSpinner(position: Int?) = values().find { value -> value.prefValue == position } ?: DEFAULT 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/ReadType.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui 2 | 3 | import androidx.annotation.StringRes 4 | import com.lagradost.quicknovel.R 5 | 6 | enum class ReadType(val prefValue: Int, @StringRes val stringRes: Int) { 7 | NONE(0, R.string.type_none), 8 | PLAN_TO_READ(1, R.string.type_plan_to_read), 9 | DROPPED(2, R.string.type_dropped), 10 | COMPLETED(3, R.string.type_completed), 11 | ON_HOLD(4, R.string.type_on_hold), 12 | READING(5, R.string.type_reading); 13 | 14 | companion object { 15 | fun fromSpinner(position: Int?) = values().find { value -> value.prefValue == position } ?: NONE 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/ReadingType.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui 2 | 3 | import android.content.pm.ActivityInfo 4 | import androidx.annotation.DrawableRes 5 | import androidx.annotation.StringRes 6 | import com.lagradost.quicknovel.R 7 | 8 | enum class ReadingType(val prefValue: Int, @StringRes val stringRes: Int) { 9 | DEFAULT(0, R.string.default_text), 10 | INF_SCROLL(1, R.string.inf_scroll), 11 | BTT_SCROLL(2, R.string.button_scroll), 12 | OVERSCROLL_SCROLL(3, R.string.overscroll_scroll); 13 | 14 | companion object { 15 | fun fromSpinner(position: Int?) = values().find { value -> value.prefValue == position } ?: DEFAULT 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/TextImageView.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | 6 | class TextImageView : androidx.appcompat.widget.AppCompatImageView { 7 | constructor(context: Context) : super(context) 8 | 9 | internal constructor(c: Context, attrs: AttributeSet?) : super(c, attrs) 10 | 11 | var url : String? = null 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/home/BrowseAdapter2.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui.home 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.core.content.ContextCompat 6 | import androidx.recyclerview.widget.DiffUtil 7 | import androidx.recyclerview.widget.ListAdapter 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.lagradost.quicknovel.CommonActivity.activity 10 | import com.lagradost.quicknovel.MainAPI 11 | import com.lagradost.quicknovel.MainActivity.Companion.navigate 12 | import com.lagradost.quicknovel.R 13 | import com.lagradost.quicknovel.databinding.BrowseListCompactBinding 14 | import com.lagradost.quicknovel.ui.mainpage.MainPageFragment 15 | 16 | class BrowseAdapter2 : ListAdapter(DiffCallback()) { 17 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BrowseAdapter2Holder { 18 | val binding = BrowseListCompactBinding.inflate(LayoutInflater.from(parent.context),parent,false) 19 | return BrowseAdapter2Holder(binding) 20 | } 21 | 22 | override fun onBindViewHolder(holder: BrowseAdapter2Holder, position: Int) { 23 | val currentItem = getItem(position) 24 | holder.bind(currentItem) 25 | } 26 | 27 | class BrowseAdapter2Holder(private val binding : BrowseListCompactBinding) : RecyclerView.ViewHolder(binding.root) { 28 | fun bind(api : MainAPI) { 29 | binding.apply { 30 | browseText.text = api.name 31 | api.iconId?.let { browseIcon.setImageResource(it) } 32 | browseIconBackground.setCardBackgroundColor(ContextCompat.getColor(browseIconBackground.context, api.iconBackgroundId)) 33 | browseBackground.setOnClickListener { 34 | activity?.navigate(R.id.global_to_navigation_mainpage,MainPageFragment.newInstance(api.name)) 35 | } 36 | } 37 | } 38 | } 39 | 40 | class DiffCallback : DiffUtil.ItemCallback() { 41 | override fun areItemsTheSame(oldItem: MainAPI, newItem: MainAPI): Boolean = oldItem.name == newItem.name 42 | override fun areContentsTheSame(oldItem: MainAPI, newItem: MainAPI): Boolean = oldItem.name == newItem.name 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/home/HomeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui.home 2 | 3 | import android.content.res.Configuration 4 | import android.os.Bundle 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import androidx.fragment.app.Fragment 9 | import androidx.fragment.app.viewModels 10 | import androidx.recyclerview.widget.GridLayoutManager 11 | import com.lagradost.quicknovel.databinding.FragmentHomeBinding 12 | import com.lagradost.quicknovel.mvvm.observe 13 | import com.lagradost.quicknovel.util.UIHelper.fixPaddingStatusbar 14 | 15 | class HomeFragment : Fragment() { 16 | lateinit var binding: FragmentHomeBinding 17 | private val viewModel: HomeViewModel by viewModels() 18 | 19 | override fun onCreateView( 20 | inflater: LayoutInflater, 21 | container: ViewGroup?, 22 | savedInstanceState: Bundle?, 23 | ): View { 24 | binding = FragmentHomeBinding.inflate(inflater) 25 | return binding.root 26 | } 27 | 28 | private fun setupGridView() { 29 | val compactView = false 30 | val spanCountLandscape = if (compactView) 2 else 6 31 | val spanCountPortrait = if (compactView) 1 else 3 32 | val orientation = resources.configuration.orientation 33 | if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 34 | binding.homeBrowselist.spanCount = spanCountLandscape 35 | } else { 36 | binding.homeBrowselist.spanCount = spanCountPortrait 37 | } 38 | } 39 | 40 | override fun onConfigurationChanged(newConfig: Configuration) { 41 | super.onConfigurationChanged(newConfig) 42 | setupGridView() 43 | } 44 | 45 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 46 | setupGridView() 47 | val browseAdapter = BrowseAdapter2() 48 | binding.homeBrowselist.apply { 49 | adapter = browseAdapter 50 | // layoutManager = GridLayoutManager(context, 1) 51 | setHasFixedSize(true) 52 | } 53 | 54 | observe(viewModel.homeApis) { list -> 55 | browseAdapter.submitList(list) 56 | } 57 | 58 | activity?.fixPaddingStatusbar(binding.homeToolbar) 59 | } 60 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/home/HomeViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui.home 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.lagradost.quicknovel.MainAPI 7 | import com.lagradost.quicknovel.util.Apis 8 | import com.lagradost.quicknovel.util.Apis.Companion.getApiProviderLangSettings 9 | 10 | class HomeViewModel : ViewModel() { 11 | val homeApis: LiveData> by lazy { 12 | MutableLiveData( 13 | let { 14 | val langs = getApiProviderLangSettings() 15 | Apis.apis.filter { api -> api.hasMainPage && (langs.contains(api.lang)) } 16 | } 17 | ) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/ui/mainpage/MainPageRepository.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.ui.mainpage 2 | 3 | import com.lagradost.quicknovel.APIRepository 4 | import com.lagradost.quicknovel.HeadMainPageResponse 5 | import com.lagradost.quicknovel.MainAPI 6 | import com.lagradost.quicknovel.SearchResponse 7 | import com.lagradost.quicknovel.mvvm.Resource 8 | import com.lagradost.quicknovel.mvvm.safeApiCall 9 | 10 | class MainPageRepository(val api: APIRepository) { 11 | suspend fun loadMainPage( 12 | page: Int, 13 | mainCategory: Int?, 14 | orderBy: Int?, 15 | tag: Int?, 16 | ): Resource { 17 | return api.loadMainPage( 18 | page, 19 | if (mainCategory != null && api.mainCategories.size > mainCategory) api.mainCategories[mainCategory].second else null, 20 | if (orderBy != null && api.orderBys.size > orderBy) api.orderBys[orderBy].second else null, 21 | if (tag != null && api.tags.size > tag) api.tags[tag].second else null 22 | ) 23 | } 24 | 25 | suspend fun search(query: String): Resource> { 26 | return api.search(query) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/AppUtils.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | import com.fasterxml.jackson.databind.DeserializationFeature 4 | import com.fasterxml.jackson.databind.ObjectMapper 5 | import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper 6 | import com.fasterxml.jackson.module.kotlin.readValue 7 | import java.io.Reader 8 | 9 | object AppUtils { 10 | val mapper: ObjectMapper = jacksonObjectMapper().configure( 11 | DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 12 | false 13 | ) 14 | 15 | /** Any object as json string */ 16 | fun Any.toJson(): String { 17 | if (this is String) return this 18 | return mapper.writeValueAsString(this) 19 | } 20 | 21 | inline fun parseJson(value: String): T { 22 | return mapper.readValue(value) 23 | } 24 | 25 | inline fun parseJson(reader: Reader, valueType: Class): T { 26 | return mapper.readValue(reader, valueType) 27 | } 28 | 29 | inline fun tryParseJson(value: String?): T? { 30 | return try { 31 | parseJson(value ?: return null) 32 | } catch (_: Exception) { 33 | null 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/Coroutines.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | import com.lagradost.quicknovel.mvvm.launchSafe 6 | import com.lagradost.quicknovel.mvvm.logError 7 | import kotlinx.coroutines.* 8 | import java.util.Collections 9 | 10 | object Coroutines { 11 | fun T.main(work: suspend ((T) -> Unit)): Job { 12 | val value = this 13 | return CoroutineScope(Dispatchers.Main).launchSafe { 14 | work(value) 15 | } 16 | } 17 | 18 | fun T.ioSafe(work: suspend (CoroutineScope.(T) -> Unit)): Job { 19 | val value = this 20 | 21 | return CoroutineScope(Dispatchers.IO).launchSafe { 22 | work(value) 23 | } 24 | } 25 | 26 | suspend fun V.ioWorkSafe(work: suspend (CoroutineScope.(V) -> T)): T? { 27 | val value = this 28 | return withContext(Dispatchers.IO) { 29 | try { 30 | work(value) 31 | } catch (e: Exception) { 32 | logError(e) 33 | null 34 | } 35 | } 36 | } 37 | 38 | suspend fun V.ioWork(work: suspend (CoroutineScope.(V) -> T)): T { 39 | val value = this 40 | return withContext(Dispatchers.IO) { 41 | work(value) 42 | } 43 | } 44 | 45 | suspend fun V.mainWork(work: suspend (CoroutineScope.(V) -> T)): T { 46 | val value = this 47 | return withContext(Dispatchers.Main) { 48 | work(value) 49 | } 50 | } 51 | 52 | fun runOnMainThread(work: (() -> Unit)) { 53 | val mainHandler = Handler(Looper.getMainLooper()) 54 | mainHandler.post { 55 | work() 56 | } 57 | } 58 | 59 | /** 60 | * Safe to add and remove how you want 61 | * If you want to iterate over the list then you need to do: 62 | * synchronized(allProviders) { code here } 63 | **/ 64 | fun threadSafeListOf(vararg items: T): MutableList { 65 | return Collections.synchronizedList(items.toMutableList()) 66 | } 67 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/Event.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | class Event { 4 | private val observers = mutableSetOf<(T) -> Unit>() 5 | 6 | operator fun plusAssign(observer: (T) -> Unit) { 7 | observers.add(observer) 8 | } 9 | 10 | operator fun minusAssign(observer: (T) -> Unit) { 11 | observers.remove(observer) 12 | } 13 | 14 | operator fun invoke(value: T) { 15 | for (observer in observers) 16 | observer(value) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/GlideApp.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Context 5 | import com.bumptech.glide.GlideBuilder 6 | import com.bumptech.glide.annotation.GlideModule 7 | import com.bumptech.glide.load.engine.DiskCacheStrategy 8 | import com.bumptech.glide.module.AppGlideModule 9 | import com.bumptech.glide.request.RequestOptions 10 | import com.bumptech.glide.signature.ObjectKey 11 | 12 | @GlideModule 13 | class GlideModule : AppGlideModule() { 14 | @SuppressLint("CheckResult") 15 | override fun applyOptions(context: Context, builder: GlideBuilder) { 16 | super.applyOptions(context, builder) 17 | builder.apply { 18 | RequestOptions() 19 | .diskCacheStrategy(DiskCacheStrategy.ALL) 20 | .signature(ObjectKey(System.currentTimeMillis().toShort())) 21 | } 22 | } 23 | 24 | // Needed for DOH 25 | // https://stackoverflow.com/a/61634041 26 | /*override fun registerComponents(context: Context, glide: Glide, registry: Registry) { 27 | val client = 28 | Requests().apply { 29 | defaultHeaders = mapOf("user-agent" to USER_AGENT) 30 | }.initClient(context) 31 | .newBuilder() 32 | .addInterceptor(DdosGuardKiller(false)) 33 | .build() 34 | 35 | registry.replace( 36 | GlideUrl::class.java, 37 | InputStream::class.java, 38 | OkHttpUrlLoader.Factory(client) 39 | ) 40 | super.registerComponents(context, glide, registry) 41 | }*/ 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/ParCollections.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | import kotlinx.coroutines.CoroutineScope 4 | import kotlinx.coroutines.DelicateCoroutinesApi 5 | import kotlinx.coroutines.GlobalScope 6 | import kotlinx.coroutines.async 7 | import kotlinx.coroutines.runBlocking 8 | import java.util.* 9 | import java.util.concurrent.ExecutorService 10 | import java.util.concurrent.Executors 11 | import java.util.concurrent.TimeUnit 12 | import kotlin.collections.ArrayList 13 | 14 | //https://stackoverflow.com/questions/34697828/parallel-operations-on-kotlin-collections 15 | fun Iterable.pmap( 16 | numThreads: Int = maxOf(Runtime.getRuntime().availableProcessors() - 2, 1), 17 | exec: ExecutorService = Executors.newFixedThreadPool(numThreads), 18 | transform: (T) -> R, 19 | ): List { 20 | 21 | // default size is just an inlined version of kotlin.collections.collectionSizeOrDefault 22 | val defaultSize = if (this is Collection<*>) this.size else 10 23 | val destination = Collections.synchronizedList(ArrayList(defaultSize)) 24 | 25 | for (item in this) { 26 | exec.submit { destination.add(transform(item)) } 27 | } 28 | 29 | exec.shutdown() 30 | exec.awaitTermination(1, TimeUnit.DAYS) 31 | 32 | return ArrayList(destination) 33 | } 34 | 35 | fun List.apmap(f: suspend (A) -> B): List = runBlocking { 36 | map { async { f(it) } }.map { it.await() } 37 | } 38 | 39 | @OptIn(DelicateCoroutinesApi::class) 40 | suspend fun List.amap(f: suspend (A) -> B): List = 41 | with(CoroutineScope(GlobalScope.coroutineContext)) { 42 | map { async { f(it) } }.map { it.await() } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/ResultCached.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | import com.lagradost.quicknovel.ui.UiImage 4 | import com.lagradost.quicknovel.ui.img 5 | 6 | data class ResultCached( 7 | val source : String, 8 | val name: String, 9 | val apiName : String, 10 | val id : Int, 11 | val author : String?, 12 | val poster: String?, 13 | val tags : List?, 14 | val rating : Int?, 15 | val totalChapters : Int, 16 | val cachedTime : Long, // milliseconds 17 | val synopsis : String? = null 18 | ) { 19 | val image : UiImage? get() = img(poster) 20 | 21 | override fun hashCode(): Int { 22 | return id 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lagradost/quicknovel/util/SettingsHelper.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel.util 2 | 3 | import android.content.Context 4 | import androidx.preference.PreferenceManager 5 | import com.lagradost.quicknovel.R 6 | import com.lagradost.quicknovel.util.SettingsHelper.getDownloadFormat 7 | 8 | object SettingsHelper { 9 | fun Context.getRatingReview(score: Int): String { 10 | val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) 11 | return when (settingsManager.getString(getString(R.string.rating_format_key), "star")) { 12 | "star" -> "${score / 200}★" 13 | else -> "${(score / 100)}/10" 14 | } 15 | } 16 | 17 | fun Context.getRating(score: Int): String { 18 | val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) 19 | 20 | return when (settingsManager.getString(getString(R.string.rating_format_key), "star")) { 21 | "point10" -> "${(score / 100)}/10" 22 | "point10d" -> "${"%.1f".format(score / 100f).replace(',', '.')}/10.0" 23 | "point100" -> "${score / 10}/100" 24 | else -> "%.2f".format(score.toFloat() / 200f).replace(',', '.') + "★" // star 25 | } 26 | } 27 | 28 | fun Context.getGridIsCompact(): Boolean { 29 | return getGridFormat() != "grid" 30 | } 31 | 32 | private fun Context.getGridFormat(): String { 33 | val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) 34 | return settingsManager.getString(getString(R.string.grid_format_key), "grid")!! 35 | } 36 | 37 | private fun Context.getDownloadFormat(): String { 38 | val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) 39 | return settingsManager.getString(getString(R.string.download_format_key), "list")!! 40 | } 41 | 42 | /* 43 | fun Context.setDownloadGridIsCompact( item : Int) { 44 | val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) 45 | 46 | when(item) { 47 | 0 ->"normal" 48 | 1 -> "grid" 49 | else -> "normal" 50 | } 51 | }*/ 52 | 53 | fun Context.getDownloadIsCompact(): Boolean { 54 | return getDownloadFormat() != "grid" 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/enter_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/anim/exit_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/anim/nav_enter_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/nav_exit_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/nav_pop_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/nav_pop_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/pop_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/anim/pop_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/color/check_selection_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/chip_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/chip_color_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/item_select_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/text_selection_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/white_transparent_toggle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_restore_page_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_save_as_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/big_icon_boxnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/big_icon_boxnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/big_icon_readlightnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/big_icon_readlightnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/big_icon_royalroad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/big_icon_royalroad.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/big_icon_wuxiaworldsite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/big_icon_wuxiaworldsite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bigger_font.xml: -------------------------------------------------------------------------------- 1 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/checkmark_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circular_progress_bar_clockwise.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_selection.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_selection_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_selection_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog__window_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/download_add_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/download_button_background.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fiber_new_24px.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/format_padding_decrease_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/format_padding_increase_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_back_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_downward_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_upward_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_autorenew_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_bookmark_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_bookmark_border_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_check_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_check_24_listview.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_cloud_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_code_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_collections_bookmark_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_color_lens_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_create_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_outline_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_edit_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_fast_forward_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_fast_rewind_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_filter_list_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_font_download_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_grid_view_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_history_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_language_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_list_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_menu_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_menu_book_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_more_vert_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_notifications_active_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_open_in_new_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_pause_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_play_arrow_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_public_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_screen_lock_landscape_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_screen_lock_portrait_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_screen_rotation_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_star_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_stay_current_landscape_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_stay_current_portrait_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_stop_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_system_update_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_tune_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_volume_up_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_blank_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github_logo.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icon_monochrome.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 15 | 18 | 22 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_indowebnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/ic_indowebnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 13 | 16 | 19 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_meionovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/ic_meionovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_morenovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/ic_morenovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_outline_explore_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_outline_settings_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_outline_share_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sakuranovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/ic_sakuranovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sharp_clear_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_allnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_allnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_azynovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_azynovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_boxnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_boxnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_efremnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_efremnet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_engnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_engnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_freewebnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_freewebnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_hiraethtranslation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_hiraethtranslation.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_kolnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_kolnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_libread.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_libread.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_mnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_mnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_mtlnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_mtlnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_novelbin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_novelbin.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_novelfull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_novelfull.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_novelfullvip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_novelfullvip.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_novelpassion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_novelpassion.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_novelsonline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_novelsonline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_ranobes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_ranobes.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_readfromnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_readfromnet.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_readlightnovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_readlightnovel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_readlightnovel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_readlightnovel2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_readlightnovel3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_readlightnovel3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_readlightnovel4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_readlightnovel4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_rewayatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_rewayatar.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_royalroad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_royalroad.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_royalroad2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_royalroad2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_wuxiaworldonline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_wuxiaworldonline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_wuxiaworldsite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/icon_wuxiaworldsite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/indicator_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/netflix_download.xml: -------------------------------------------------------------------------------- 1 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/netflix_pause.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/netflix_play.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nights_stay_24px.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nothing.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nulldrawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_drawable_less.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/outline_less.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pawread.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/drawable/pawread.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/rddone.xml: -------------------------------------------------------------------------------- 1 | 9 | 14 | 19 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rderror.xml: -------------------------------------------------------------------------------- 1 | 9 | 14 | 19 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rdload.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rdpause.xml: -------------------------------------------------------------------------------- 1 | 9 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_regular.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_bg_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_text_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_text_bg_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_text_bg_mid.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_text_bg_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_icon.xml: -------------------------------------------------------------------------------- 1 | 8 | 14 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_icon_white.xml: -------------------------------------------------------------------------------- 1 | 8 | 14 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/smaller_font.xml: -------------------------------------------------------------------------------- 1 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/swipe_vertical_24px.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/text_top_bottom_margin.xml: -------------------------------------------------------------------------------- 1 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/text_top_bottom_margin_expand.xml: -------------------------------------------------------------------------------- 1 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/title_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/translate_24px.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/white_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/font/google_sans.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 13 | 17 | 18 | 22 | 23 | 27 | 28 | 32 | 33 | 37 | 41 | 42 | 46 | 50 | 51 | 55 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_black.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_blackitalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_blackitalic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_bolditalic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_italic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_light.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_lightitalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_lightitalic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_medium.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_mediumitalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_mediumitalic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_thin.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/productsans_thinitalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/font/productsans_thinitalic.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 19 | 20 | 34 | 35 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/chapter_select_dialog.xml: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/checkmark_select_dialog.xml: -------------------------------------------------------------------------------- 1 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/color_round_checkmark.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_toolbar.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | 14 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/font_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 22 | 23 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 26 | 27 | 28 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/home_episodes_expanded.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 26 | 27 | 34 | 35 | 36 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/home_result_grid.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | 16 | 24 | 25 | 33 | 34 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/homepage_parent.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 25 | 26 | 33 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/image_layout.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 25 | 26 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_downloads.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_episode.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 16 | 17 | 23 | 24 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_line.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_line_short.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_line_short2.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_line_short_center.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 30 | 33 | 34 | 35 | 36 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_poster.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_poster_dynamic.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 15 | 16 | 28 | 29 | 30 | 31 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_review.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/result_review_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/result_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/search_result_grid.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 23 | 24 | 32 | 33 | 34 | 35 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/simple_chapter.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 19 | 20 | 28 | 29 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_failed.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_finished_chapter.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_image.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_load.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 20 | 21 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_overscroll_chapter.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 25 | 26 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_text.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/sort_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 22 | 23 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/sort_bottom_single_choice.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/sort_bottom_single_choice_down.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/sort_bottom_single_choice_up.xml: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/spinner_select_dialog.xml: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toast.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/viewpager_page.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_nav_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 16 | 20 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/menu/download_actionbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/history_actionbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/home_actionbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/menu/mainpage_actionbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/menu/sleep_timer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/raw/dummy_sound_500ms.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/app/src/main/res/raw/dummy_sound_500ms.mp3 -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 2dp 19 | 0dp 20 | 7dp 21 | 0dp 22 | 24dp 23 | 24 | 4dp 25 | 16dp 26 | 16dp 27 | 28 | 15dp 29 | 3dp 30 | 15dp 31 | 2000 32 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/test/java/com/example/quicknovel/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.lagradost.quicknovel 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = "1.9.23" 4 | 5 | repositories { 6 | google() 7 | jcenter() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:8.9.0' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 12 | // NOTE: Do not place your application dependencies here; they belong 13 | // in the individual module build.gradle files 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | jcenter() 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LagradOst/QuickNovel/7461c149cb6facbe9f7c59d1f2a5d7680a8f1ce3/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "QuickNovel" --------------------------------------------------------------------------------