├── .gitignore ├── Bookself.jks ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── src │ ├── debug │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ ├── number.ttf │ │ │ ├── test.js │ │ │ ├── updateLog.md │ │ │ └── web │ │ │ │ ├── bookshelf.css │ │ │ │ ├── bookshelf.html │ │ │ │ ├── bookshelf.js │ │ │ │ ├── favicon.ico │ │ │ │ ├── index.css │ │ │ │ ├── index.html │ │ │ │ └── index.js │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── monke │ │ │ │ └── monkeybook │ │ │ │ ├── MApplication.java │ │ │ │ ├── base │ │ │ │ ├── MBaseActivity.java │ │ │ │ └── observer │ │ │ │ │ ├── SimpleObserver.java │ │ │ │ │ └── SimpleSingleObserver.java │ │ │ │ ├── bean │ │ │ │ ├── AudioPlayInfo.java │ │ │ │ ├── BookContentBean.java │ │ │ │ ├── BookInfoBean.java │ │ │ │ ├── BookKindBean.java │ │ │ │ ├── BookShelfBean.java │ │ │ │ ├── BookSourceBean.java │ │ │ │ ├── BookmarkBean.java │ │ │ │ ├── ChapterBean.java │ │ │ │ ├── CookieBean.java │ │ │ │ ├── DownloadBookBean.java │ │ │ │ ├── DownloadInfo.java │ │ │ │ ├── FileSnapshot.java │ │ │ │ ├── FilterBean.java │ │ │ │ ├── FindKindBean.java │ │ │ │ ├── FindKindGroupBean.java │ │ │ │ ├── LocBookShelfBean.java │ │ │ │ ├── ReplaceRuleBean.java │ │ │ │ ├── RipeFile.java │ │ │ │ ├── SearchBookBean.java │ │ │ │ ├── SearchEngine.java │ │ │ │ ├── SearchHistoryBean.java │ │ │ │ ├── VariableStore.java │ │ │ │ ├── VariableStoreImpl.java │ │ │ │ └── WebLoadConfig.java │ │ │ │ ├── dao │ │ │ │ ├── BookInfoBeanDao.java │ │ │ │ ├── BookShelfBeanDao.java │ │ │ │ ├── BookSourceBeanDao.java │ │ │ │ ├── BookmarkBeanDao.java │ │ │ │ ├── ChapterBeanDao.java │ │ │ │ ├── CookieBeanDao.java │ │ │ │ ├── DaoMaster.java │ │ │ │ ├── DaoSession.java │ │ │ │ ├── DbHelper.java │ │ │ │ ├── ReplaceRuleBeanDao.java │ │ │ │ ├── SearchBookBeanDao.java │ │ │ │ └── SearchHistoryBeanDao.java │ │ │ │ ├── help │ │ │ │ ├── ACache.java │ │ │ │ ├── AppConfigHelper.java │ │ │ │ ├── BitIntentDataManager.java │ │ │ │ ├── BookShelfHolder.java │ │ │ │ ├── BookshelfHelp.java │ │ │ │ ├── ChapterContentHelp.java │ │ │ │ ├── Compressor.java │ │ │ │ ├── Constant.java │ │ │ │ ├── CookieHelper.java │ │ │ │ ├── CrashHandler.java │ │ │ │ ├── DataBackup.java │ │ │ │ ├── DataRestore.java │ │ │ │ ├── DocumentHelper.java │ │ │ │ ├── Donate.java │ │ │ │ ├── FileHelp.java │ │ │ │ ├── Logger.java │ │ │ │ ├── MemoryCache.java │ │ │ │ ├── MyItemTouchHelpCallback.java │ │ │ │ ├── NoDoubleClickListener.java │ │ │ │ ├── ReadBookControl.java │ │ │ │ ├── RunMediaPlayer.java │ │ │ │ ├── RxBusTag.java │ │ │ │ ├── SearchBookHelp.java │ │ │ │ ├── TextProcessor.java │ │ │ │ ├── keyboard │ │ │ │ │ └── KeyboardHeightProvider.java │ │ │ │ ├── mediacache │ │ │ │ │ ├── ByteArrayCache.java │ │ │ │ │ ├── ByteArraySource.java │ │ │ │ │ ├── Cache.java │ │ │ │ │ ├── CacheListener.java │ │ │ │ │ ├── Config.java │ │ │ │ │ ├── GetRequest.java │ │ │ │ │ ├── HttpProxyCache.java │ │ │ │ │ ├── HttpProxyCacheServer.java │ │ │ │ │ ├── HttpProxyCacheServerClients.java │ │ │ │ │ ├── HttpUrlSource.java │ │ │ │ │ ├── IgnoreHostProxySelector.java │ │ │ │ │ ├── InterruptedProxyCacheException.java │ │ │ │ │ ├── Pinger.java │ │ │ │ │ ├── Preconditions.java │ │ │ │ │ ├── ProxyCache.java │ │ │ │ │ ├── ProxyCacheException.java │ │ │ │ │ ├── ProxyCacheUtils.java │ │ │ │ │ ├── Source.java │ │ │ │ │ ├── SourceInfo.java │ │ │ │ │ ├── StorageUtils.java │ │ │ │ │ ├── file │ │ │ │ │ │ ├── DiskUsage.java │ │ │ │ │ │ ├── FileCache.java │ │ │ │ │ │ ├── FileNameGenerator.java │ │ │ │ │ │ ├── Files.java │ │ │ │ │ │ ├── LruDiskUsage.java │ │ │ │ │ │ ├── Md5FileNameGenerator.java │ │ │ │ │ │ ├── TotalCountLruDiskUsage.java │ │ │ │ │ │ ├── TotalSizeLruDiskUsage.java │ │ │ │ │ │ └── UnlimitedDiskUsage.java │ │ │ │ │ ├── headers │ │ │ │ │ │ ├── EmptyHeadersInjector.java │ │ │ │ │ │ └── HeaderInjector.java │ │ │ │ │ └── sourcestorage │ │ │ │ │ │ ├── DatabaseSourceInfoStorage.java │ │ │ │ │ │ ├── NoSourceInfoStorage.java │ │ │ │ │ │ ├── SourceInfoStorage.java │ │ │ │ │ │ └── SourceInfoStorageFactory.java │ │ │ │ └── permission │ │ │ │ │ ├── ActivitySource.java │ │ │ │ │ ├── FragmentSource.java │ │ │ │ │ ├── OnPermissionsDeniedCallback.java │ │ │ │ │ ├── OnPermissionsGrantedCallback.java │ │ │ │ │ ├── OnPermissionsResultCallback.java │ │ │ │ │ ├── OnRationaleCallback.java │ │ │ │ │ ├── OnRequestPermissionsResultCallback.java │ │ │ │ │ ├── PermissionActivity.java │ │ │ │ │ ├── Permissions.java │ │ │ │ │ ├── PermissionsCompat.java │ │ │ │ │ ├── Request.java │ │ │ │ │ ├── RequestManager.java │ │ │ │ │ ├── RequestPlugins.java │ │ │ │ │ └── RequestSource.java │ │ │ │ ├── model │ │ │ │ ├── AudioBookPlayModelImpl.java │ │ │ │ ├── BookRefreshModelImpl.java │ │ │ │ ├── BookSourceManager.java │ │ │ │ ├── ImportBookModelImpl.java │ │ │ │ ├── ReplaceRuleManager.java │ │ │ │ ├── SearchBookModel.java │ │ │ │ ├── SimpleModel.java │ │ │ │ ├── WebBookModel.java │ │ │ │ ├── analyzeRule │ │ │ │ │ ├── AnalyzeCollection.java │ │ │ │ │ ├── AnalyzeConfig.java │ │ │ │ │ ├── AnalyzeHeaders.java │ │ │ │ │ ├── AnalyzeUrl.java │ │ │ │ │ ├── AnalyzerFactory.java │ │ │ │ │ ├── BaseAnalyzerPresenter.java │ │ │ │ │ ├── CSSAnalyzer.java │ │ │ │ │ ├── CSSParser.java │ │ │ │ │ ├── ContentDelegate.java │ │ │ │ │ ├── DefaultAnalyzerPresenter.java │ │ │ │ │ ├── DefaultContentDelegate.java │ │ │ │ │ ├── HybridAnalyzer.java │ │ │ │ │ ├── HybridAnalyzerPresenter.java │ │ │ │ │ ├── HybridParser.java │ │ │ │ │ ├── IAnalyzerPresenter.java │ │ │ │ │ ├── JsonAnalyzer.java │ │ │ │ │ ├── JsonParser.java │ │ │ │ │ ├── JsoupAnalyzer.java │ │ │ │ │ ├── JsoupParser.java │ │ │ │ │ ├── OutAnalyzer.java │ │ │ │ │ ├── RootRule.java │ │ │ │ │ ├── Rule.java │ │ │ │ │ ├── RuleMode.java │ │ │ │ │ ├── RulePattern.java │ │ │ │ │ ├── RulePatterns.java │ │ │ │ │ ├── SourceParser.java │ │ │ │ │ ├── VariablesPattern.java │ │ │ │ │ ├── XPathAnalyzer.java │ │ │ │ │ ├── XPathParser.java │ │ │ │ │ └── assit │ │ │ │ │ │ ├── AnalyzeGlobal.java │ │ │ │ │ │ ├── Assistant.java │ │ │ │ │ │ ├── JavaExecutor.java │ │ │ │ │ │ ├── SimpleJavaExecutor.java │ │ │ │ │ │ └── SimpleJavaExecutorImpl.java │ │ │ │ ├── annotation │ │ │ │ │ ├── BookType.java │ │ │ │ │ └── RuleType.java │ │ │ │ ├── content │ │ │ │ │ ├── AudioBookChapter.java │ │ │ │ │ ├── BookChapters.java │ │ │ │ │ ├── BookContent.java │ │ │ │ │ ├── BookInfo.java │ │ │ │ │ ├── BookList.java │ │ │ │ │ ├── Debug.java │ │ │ │ │ ├── DefaultModel.java │ │ │ │ │ └── exception │ │ │ │ │ │ └── BookSourceException.java │ │ │ │ ├── impl │ │ │ │ │ ├── IAudioBookChapterModel.java │ │ │ │ │ ├── IAudioBookPlayModel.java │ │ │ │ │ ├── IBookRefreshModel.java │ │ │ │ │ ├── IDownloadTask.java │ │ │ │ │ ├── IHttpGetApi.java │ │ │ │ │ ├── IHttpPostApi.java │ │ │ │ │ ├── IImportBookModel.java │ │ │ │ │ ├── ISearchTask.java │ │ │ │ │ ├── IShuqiApi.java │ │ │ │ │ ├── IStationBookModel.java │ │ │ │ │ └── IWebBookModel.java │ │ │ │ └── task │ │ │ │ │ ├── DownloadTaskImpl.java │ │ │ │ │ └── SearchTaskImpl.java │ │ │ │ ├── presenter │ │ │ │ ├── AudioBookPresenterImpl.java │ │ │ │ ├── BookDetailPresenterImpl.java │ │ │ │ ├── BookListPresenterImpl.java │ │ │ │ ├── BookSourcePresenterImpl.java │ │ │ │ ├── CacheManagerPresenter.java │ │ │ │ ├── ChoiceBookPresenterImpl.java │ │ │ │ ├── FileSelectorPresenterImpl.java │ │ │ │ ├── FindBookPresenterImpl.java │ │ │ │ ├── MainPresenterImpl.java │ │ │ │ ├── ReadBookPresenterImpl.java │ │ │ │ ├── ReplaceRulePresenterImpl.java │ │ │ │ ├── SearchBookPresenterImpl.java │ │ │ │ ├── SourceEditPresenterImpl.java │ │ │ │ ├── WelcomePresenterImpl.java │ │ │ │ └── contract │ │ │ │ │ ├── AudioBookContract.java │ │ │ │ │ ├── BookDetailContract.java │ │ │ │ │ ├── BookListContract.java │ │ │ │ │ ├── BookSourceContract.java │ │ │ │ │ ├── CacheManagerContract.java │ │ │ │ │ ├── ChoiceBookContract.java │ │ │ │ │ ├── FileSelectorContract.java │ │ │ │ │ ├── FindBookContract.java │ │ │ │ │ ├── MainContract.java │ │ │ │ │ ├── ReadBookContract.java │ │ │ │ │ ├── ReplaceRuleContract.java │ │ │ │ │ ├── SearchBookContract.java │ │ │ │ │ ├── SourceEditContract.java │ │ │ │ │ └── WelcomeContract.java │ │ │ │ ├── service │ │ │ │ ├── AudioBookPlayService.java │ │ │ │ ├── AudioFocusManager.java │ │ │ │ ├── CheckSourceService.java │ │ │ │ ├── DownloadService.java │ │ │ │ ├── MediaButtonIntentReceiver.java │ │ │ │ ├── ReadAloudService.java │ │ │ │ └── WebService.java │ │ │ │ ├── test │ │ │ │ ├── Callback.java │ │ │ │ └── Test.java │ │ │ │ ├── utils │ │ │ │ ├── BatteryUtil.java │ │ │ │ ├── BitmapUtil.java │ │ │ │ ├── ColorUtil.java │ │ │ │ ├── ContextUtils.java │ │ │ │ ├── DensityUtil.java │ │ │ │ ├── DocumentUtil.java │ │ │ │ ├── FileUtil.java │ │ │ │ ├── GsonUtils.java │ │ │ │ ├── IOUtils.java │ │ │ │ ├── KeyboardUtil.java │ │ │ │ ├── ListUtils.java │ │ │ │ ├── MD5Utils.java │ │ │ │ ├── MarkdownUtils.java │ │ │ │ ├── NumberUtil.java │ │ │ │ ├── ObjectsCompat.java │ │ │ │ ├── ReadAssets.java │ │ │ │ ├── ScreenBrightnessUtil.java │ │ │ │ ├── ScreenUtils.java │ │ │ │ ├── SharedPreferencesUtil.java │ │ │ │ ├── StringJoiner.java │ │ │ │ ├── StringUtils.java │ │ │ │ ├── SystemUtil.java │ │ │ │ ├── ToastUtils.java │ │ │ │ ├── URLUtils.java │ │ │ │ └── UrlEncoderUtils.java │ │ │ │ ├── view │ │ │ │ ├── activity │ │ │ │ │ ├── AboutActivity.java │ │ │ │ │ ├── AudioBookPlayActivity.java │ │ │ │ │ ├── BigImageActivity.java │ │ │ │ │ ├── BookDetailActivity.java │ │ │ │ │ ├── BookInfoActivity.java │ │ │ │ │ ├── BookSourceActivity.java │ │ │ │ │ ├── CacheManagerActivity.java │ │ │ │ │ ├── ChoiceBookActivity.java │ │ │ │ │ ├── DonateActivity.java │ │ │ │ │ ├── DownloadActivity.java │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ ├── QRCodeScanActivity.java │ │ │ │ │ ├── ReadBookActivity.java │ │ │ │ │ ├── ReadComicBookActivity.java │ │ │ │ │ ├── ReadStyleActivity.java │ │ │ │ │ ├── ReplaceRuleActivity.java │ │ │ │ │ ├── SearchBookActivity.java │ │ │ │ │ ├── SettingActivity.java │ │ │ │ │ ├── SourceDebugActivity.java │ │ │ │ │ ├── SourceEditActivity.java │ │ │ │ │ ├── WebViewActivity.java │ │ │ │ │ └── WelcomeActivity.java │ │ │ │ ├── adapter │ │ │ │ │ ├── AudioBookAdapter.java │ │ │ │ │ ├── AudioTimerAdapter.java │ │ │ │ │ ├── BookShelfGridAdapter.java │ │ │ │ │ ├── BookShelfListAdapter.java │ │ │ │ │ ├── BookSourceAdapter.java │ │ │ │ │ ├── BookmarkListAdapter.java │ │ │ │ │ ├── CacheListAdapter.java │ │ │ │ │ ├── ChangeSourceAdapter.java │ │ │ │ │ ├── ChapterListAdapter.java │ │ │ │ │ ├── ChoiceBookAdapter.java │ │ │ │ │ ├── ChoiceBookCategoryAdapter.java │ │ │ │ │ ├── DownloadAdapter.java │ │ │ │ │ ├── FileSelectorAdapter.java │ │ │ │ │ ├── FindBookAdapter.java │ │ │ │ │ ├── RecentlyViewedAdapter.java │ │ │ │ │ ├── ReplaceRuleAdapter.java │ │ │ │ │ ├── SearchBookAdapter.java │ │ │ │ │ └── base │ │ │ │ │ │ ├── BaseBookListAdapter.java │ │ │ │ │ │ ├── BaseChapterListAdapter.java │ │ │ │ │ │ ├── BaseListAdapter.java │ │ │ │ │ │ ├── BaseViewHolder.java │ │ │ │ │ │ ├── IViewHolder.java │ │ │ │ │ │ ├── OnBookItemClickListenerTwo.java │ │ │ │ │ │ ├── OnItemClickListenerTwo.java │ │ │ │ │ │ └── ViewHolderImpl.java │ │ │ │ ├── fragment │ │ │ │ │ ├── AudioBookFragment.java │ │ │ │ │ ├── BaseChapterListFragment.java │ │ │ │ │ ├── BookListFragment.java │ │ │ │ │ ├── BookmarkListFragment.java │ │ │ │ │ ├── ChapterDrawerFragment.java │ │ │ │ │ ├── ChapterListFragment.java │ │ │ │ │ ├── ChoiceBookFragment.java │ │ │ │ │ ├── FindBookFragment.java │ │ │ │ │ ├── FragmentTrigger.java │ │ │ │ │ ├── MainBookListFragment.java │ │ │ │ │ ├── SettingsFragment.java │ │ │ │ │ └── dialog │ │ │ │ │ │ ├── AlertController.java │ │ │ │ │ │ ├── AlertDialog.java │ │ │ │ │ │ ├── AppCompatDialog.java │ │ │ │ │ │ ├── BookmarkDialog.java │ │ │ │ │ │ ├── ChangeSourceDialog.java │ │ │ │ │ │ ├── DownLoadDialog.java │ │ │ │ │ │ ├── FileSelectorDialog.java │ │ │ │ │ │ ├── InputDialog.java │ │ │ │ │ │ ├── LargeTextDialog.java │ │ │ │ │ │ ├── ProgressDialog.java │ │ │ │ │ │ └── ReplaceRuleDialog.java │ │ │ │ └── popupwindow │ │ │ │ │ ├── AudioChapterPop.java │ │ │ │ │ ├── AudioTimerPop.java │ │ │ │ │ ├── CheckAddShelfPop.java │ │ │ │ │ ├── ChoiceBookCategoryPop.java │ │ │ │ │ ├── KeyboardToolPop.java │ │ │ │ │ ├── MoreSettingPop.java │ │ │ │ │ ├── ReadAdjustPop.java │ │ │ │ │ └── ReadInterfacePop.java │ │ │ │ ├── web │ │ │ │ ├── HttpServer.java │ │ │ │ ├── RepShareServer.java │ │ │ │ ├── ShareServer.java │ │ │ │ ├── WebSocketServer.java │ │ │ │ ├── controller │ │ │ │ │ ├── BookshelfController.java │ │ │ │ │ ├── SourceController.java │ │ │ │ │ └── SourceDebugWebSocket.java │ │ │ │ └── utils │ │ │ │ │ ├── AssetsWeb.java │ │ │ │ │ └── ReturnData.java │ │ │ │ └── widget │ │ │ │ ├── AudioPlayingButton.java │ │ │ │ ├── BatteryView.java │ │ │ │ ├── BookFloatingActionMenu.java │ │ │ │ ├── BookShelfSearchView.java │ │ │ │ ├── ChapterListDrawer.java │ │ │ │ ├── CircleProgressBar.java │ │ │ │ ├── CoverCardView.java │ │ │ │ ├── LabelView.java │ │ │ │ ├── NoScrollViewPager.java │ │ │ │ ├── ReadBottomStatusBar.java │ │ │ │ ├── RecentlyViewedView.java │ │ │ │ ├── RotateLoading.java │ │ │ │ ├── ScaleDrawableTextView.java │ │ │ │ ├── ScrimInsetsRelativeLayout.java │ │ │ │ ├── SmoothDrawerLayout.java │ │ │ │ ├── SquareCircleImageView.java │ │ │ │ ├── SquareRelativeLayout.java │ │ │ │ ├── SquareTextView.java │ │ │ │ ├── StatusMaskView.java │ │ │ │ ├── TextInputSpinner.java │ │ │ │ ├── behavior │ │ │ │ └── HideTopViewOnScrollBehavior.java │ │ │ │ ├── checkbox │ │ │ │ └── SmoothCheckBox.java │ │ │ │ ├── explosion_field │ │ │ │ ├── ExplosionAnimator.java │ │ │ │ ├── ExplosionField.java │ │ │ │ ├── OnAnimatorListener.java │ │ │ │ └── Utils.java │ │ │ │ ├── font │ │ │ │ ├── FontAdapter.java │ │ │ │ └── FontSelector.java │ │ │ │ ├── number │ │ │ │ ├── NumberButton.java │ │ │ │ ├── NumberPickerDialog.java │ │ │ │ └── NumberPickerPreference.java │ │ │ │ ├── page │ │ │ │ ├── ChapterProvider.java │ │ │ │ ├── LocalPageLoader.java │ │ │ │ ├── NetPageLoader.java │ │ │ │ ├── OnPageChangeListener.java │ │ │ │ ├── PageLoader.java │ │ │ │ ├── PageMode.java │ │ │ │ ├── PageStatus.java │ │ │ │ ├── PageView.java │ │ │ │ ├── TxtChapter.java │ │ │ │ ├── TxtPage.java │ │ │ │ └── animation │ │ │ │ │ ├── CoverPageAnim.java │ │ │ │ │ ├── Direction.java │ │ │ │ │ ├── HorizonPageAnim.java │ │ │ │ │ ├── NonePageAnim.java │ │ │ │ │ ├── PageAnimation.java │ │ │ │ │ ├── SimulationPageAnim.java │ │ │ │ │ └── SlidePageAnim.java │ │ │ │ ├── refreshview │ │ │ │ ├── BakedBezierInterpolator.java │ │ │ │ ├── InfiniteScrollListener.java │ │ │ │ ├── OnLoadMoreListener.java │ │ │ │ ├── RefreshRecyclerView.java │ │ │ │ ├── RefreshRecyclerViewAdapter.java │ │ │ │ ├── SwipeProgressBar.java │ │ │ │ ├── SwipeRefreshLayout.java │ │ │ │ └── scroller │ │ │ │ │ ├── FastScrollRecyclerView.java │ │ │ │ │ ├── FastScrollView.java │ │ │ │ │ ├── FastScroller.java │ │ │ │ │ └── TopLinearSmoothScroller.java │ │ │ │ └── theme │ │ │ │ └── AppCompat.java │ │ └── res │ │ │ ├── anim │ │ │ ├── anim_alpha_in.xml │ │ │ ├── anim_alpha_out.xml │ │ │ ├── anim_bookshelf_item.xml │ │ │ ├── anim_bookshelf_layout.xml │ │ │ ├── anim_dialog_in.xml │ │ │ ├── anim_dialog_out.xml │ │ │ ├── anim_pop_checkaddshelf_in.xml │ │ │ ├── anim_pop_checkaddshelf_out.xml │ │ │ ├── anim_pop_top_in.xml │ │ │ ├── anim_pop_top_out.xml │ │ │ ├── anim_pop_windowlight_in.xml │ │ │ ├── anim_pop_windowlight_out.xml │ │ │ ├── anim_pop_windowslide_in.xml │ │ │ ├── anim_pop_windowslide_out.xml │ │ │ ├── anim_readbook_bottom_in.xml │ │ │ ├── anim_readbook_bottom_out.xml │ │ │ ├── anim_readbook_top_in.xml │ │ │ ├── anim_readbook_top_out.xml │ │ │ ├── anim_right_in.xml │ │ │ └── anim_right_out.xml │ │ │ ├── animator-v21 │ │ │ ├── design_bottombar_state_list_animator.xml │ │ │ └── design_topbar_state_list_animator.xml │ │ │ ├── color │ │ │ ├── color_change_source.xml │ │ │ ├── color_chapter_item.xml │ │ │ ├── color_radio_book_group.xml │ │ │ ├── navigation_color.xml │ │ │ ├── navigation_icon_color.xml │ │ │ ├── selector_btn_file_add.xml │ │ │ ├── selector_btn_file_delete.xml │ │ │ └── selector_btn_read_setting.xml │ │ │ ├── drawable-hdpi │ │ │ ├── bg_shadow_bottom.png │ │ │ ├── bg_shadow_top.png │ │ │ ├── ic_directory_parent.png │ │ │ └── ic_image_placeholder.png │ │ │ ├── drawable-mdpi │ │ │ └── ic_image_placeholder.png │ │ │ ├── drawable-xhdpi │ │ │ ├── b4_space1.png │ │ │ ├── b4_space2.png │ │ │ ├── b4_space3.png │ │ │ └── ic_image_placeholder.png │ │ │ ├── drawable-xxhdpi │ │ │ └── ic_image_placeholder.png │ │ │ ├── drawable-xxxhdpi │ │ │ └── ic_image_placeholder.png │ │ │ ├── drawable │ │ │ ├── bg_about_note.xml │ │ │ ├── bg_audio_chapter_pop.xml │ │ │ ├── bg_choice_book_category.xml │ │ │ ├── bg_dialog_background.xml │ │ │ ├── bg_edit.xml │ │ │ ├── bg_gradient_bottom.xml │ │ │ ├── bg_list_divider.xml │ │ │ ├── bg_popup_background.xml │ │ │ ├── bg_search_textfield_day.xml │ │ │ ├── bg_search_textfield_night.xml │ │ │ ├── bg_welcome_drawable_day.xml │ │ │ ├── bg_welcome_drawable_night.xml │ │ │ ├── fastscroll_bubble.xml │ │ │ ├── fastscroll_bubble_small.xml │ │ │ ├── fastscroll_handle.xml │ │ │ ├── fastscroll_track.xml │ │ │ ├── ic_about_black_24dp.xml │ │ │ ├── ic_add_black_24dp.xml │ │ │ ├── ic_add_circle_outline_black_24dp.xml │ │ │ ├── ic_alarm_black_24dp.xml │ │ │ ├── ic_arrow_back_white_24dp.xml │ │ │ ├── ic_arrow_drop_down_black_24dp.xml │ │ │ ├── ic_arrow_drop_up_black_24dp.xml │ │ │ ├── ic_arrow_forward_black_24dp.xml │ │ │ ├── ic_assignment_black_24dp.xml │ │ │ ├── ic_assignment_turned_in_black_24dp.xml │ │ │ ├── ic_audio_book_black_24dp.xml │ │ │ ├── ic_author_black_24dp.xml │ │ │ ├── ic_auto_page_black_24dp.xml │ │ │ ├── ic_auto_page_stop_black_24dp.xml │ │ │ ├── ic_book_added_black_24dp.xml │ │ │ ├── ic_book_black_24dp.xml │ │ │ ├── ic_book_last_black_24dp.xml │ │ │ ├── ic_bookmark_black_24dp.xml │ │ │ ├── ic_check_black_24dp.xml │ │ │ ├── ic_circle_red_24dp.xml │ │ │ ├── ic_clean_cache_black_24dp.xml │ │ │ ├── ic_clear_all_black_24dp.xml │ │ │ ├── ic_close_black_24dp.xml │ │ │ ├── ic_code_black_24dp.xml │ │ │ ├── ic_content_copy_black_24dp.xml │ │ │ ├── ic_content_paste_black_24dp.xml │ │ │ ├── ic_cursor.xml │ │ │ ├── ic_day_black_24dp.xml │ │ │ ├── ic_day_border_bleak_24dp.xml │ │ │ ├── ic_delete_forever_black_24dp.xml │ │ │ ├── ic_description_black_24dp.xml │ │ │ ├── ic_developer_board_black_24dp.xml │ │ │ ├── ic_down_manager_black_24dp.xml │ │ │ ├── ic_download_black_24dp.xml │ │ │ ├── ic_download_white_24dp.xml │ │ │ ├── ic_exchange_black_24dp.xml │ │ │ ├── ic_file_black_24dp.xml │ │ │ ├── ic_find_replace_black_24dp.xml │ │ │ ├── ic_folder_black_24dp.xml │ │ │ ├── ic_folder_open_black_24dp.xml │ │ │ ├── ic_forbid_black_24dp.xml │ │ │ ├── ic_format_line_spacing_black_24dp.xml │ │ │ ├── ic_format_list_bulleted_black_24dp.xml │ │ │ ├── ic_group_expander.xml │ │ │ ├── ic_headset_black_24dp.xml │ │ │ ├── ic_help_outline_black_24dp.xml │ │ │ ├── ic_history_black_24dp.xml │ │ │ ├── ic_image_black_24dp.xml │ │ │ ├── ic_info_outline_black_24dp.xml │ │ │ ├── ic_insert_chart_black_24dp.xml │ │ │ ├── ic_launch_black_24dp.xml │ │ │ ├── ic_library_books_black_24dp.xml │ │ │ ├── ic_link_black_24dp.xml │ │ │ ├── ic_list_black_24dp.xml │ │ │ ├── ic_local_cafe_black_24dp.xml │ │ │ ├── ic_login_black_24dp.xml │ │ │ ├── ic_menu_black_24dp.xml │ │ │ ├── ic_menu_white_24dp.xml │ │ │ ├── ic_more_horiz_black_24dp.xml │ │ │ ├── ic_network_check_black_24dp.xml │ │ │ ├── ic_network_check_white_24dp.xml │ │ │ ├── ic_night_black_24dp.xml │ │ │ ├── ic_night_border_black_24dp.xml │ │ │ ├── ic_open_in_browser_black_24dp.xml │ │ │ ├── ic_pause_circle_outline_black_24dp.xml │ │ │ ├── ic_pause_white_24dp.xml │ │ │ ├── ic_picture_black_24dp.xml │ │ │ ├── ic_play_circle_outline_black_24dp.xml │ │ │ ├── ic_play_white_24dp.xml │ │ │ ├── ic_qq_group_black_24dp.xml │ │ │ ├── ic_qr_scan_black_24dp.xml │ │ │ ├── ic_read.xml │ │ │ ├── ic_refresh_black_24dp.xml │ │ │ ├── ic_refresh_white_24dp.xml │ │ │ ├── ic_restore_black_24dp.xml │ │ │ ├── ic_save_black_24dp.xml │ │ │ ├── ic_scoring_black_24dp.xml │ │ │ ├── ic_search_black_24dp.xml │ │ │ ├── ic_search_large_black_24dp.xml │ │ │ ├── ic_select_all_black_24dp.xml │ │ │ ├── ic_settings_black_24dp.xml │ │ │ ├── ic_settings_border_black_24dp.xml │ │ │ ├── ic_share_black_24dp.xml │ │ │ ├── ic_skip_next_black_24dp.xml │ │ │ ├── ic_skip_previous_black_24dp.xml │ │ │ ├── ic_source_black_24dp.xml │ │ │ ├── ic_source_manager_black_24dp.xml │ │ │ ├── ic_stop_white_24dp.xml │ │ │ ├── ic_subdirectory_arrow_left_black_24dp.xml │ │ │ ├── ic_subject_black_24dp.xml │ │ │ ├── ic_swap_vert_black_24dp.xml │ │ │ ├── ic_text_fields_black_24dp.xml │ │ │ ├── ic_time_add_white_24dp.xml │ │ │ ├── ic_timer_black_24dp.xml │ │ │ ├── ic_timer_white_24dp.xml │ │ │ ├── ic_track_changes_black_24dp.xml │ │ │ ├── ic_translate_black_24dp.xml │ │ │ ├── ic_tune_black_24dp.xml │ │ │ ├── ic_update_black_24dp.xml │ │ │ ├── ic_view_grid_black_24dp.xml │ │ │ ├── ic_view_list_black_24dp.xml │ │ │ ├── ic_volume_up_black_24dp.xml │ │ │ ├── ic_welcome.xml │ │ │ ├── ic_wifi_tethering_black_24dp.xml │ │ │ ├── ic_wifi_tethering_white_24dp.xml │ │ │ ├── img_cover_default.jpg │ │ │ ├── img_cover_gs.jpg │ │ │ ├── radius_bg.xml │ │ │ ├── select_pop_round_button_bg.xml │ │ │ ├── selector_book_detail_read_bg.xml │ │ │ ├── selector_book_detail_shelf_bg.xml │ │ │ ├── selector_btn_accent.xml │ │ │ ├── selector_btn_delete.xml │ │ │ ├── selector_history_tag.xml │ │ │ ├── selector_radio_book_group.xml │ │ │ ├── selector_refresh_button.xml │ │ │ ├── selector_tv_first_button.xml │ │ │ ├── shape_audio_bar.xml │ │ │ ├── shape_bg_circle_accent.xml │ │ │ ├── shape_bg_circle_image.xml │ │ │ ├── shape_bg_circle_image_tp.xml │ │ │ ├── shape_bg_circle_image_tp_1.xml │ │ │ ├── shape_choice_book_category.xml │ │ │ ├── shape_corner_accent.xml │ │ │ ├── shape_corner_text_color.xml │ │ │ ├── shape_large_space_divider.xml │ │ │ ├── shape_pop_checkaddshelf_bg.xml │ │ │ ├── shape_progress_cursor.xml │ │ │ ├── shape_round_rect.xml │ │ │ ├── shape_round_rect_disable.xml │ │ │ ├── shape_round_rect_press.xml │ │ │ ├── shape_small_space_divider.xml │ │ │ ├── shape_space_divider.xml │ │ │ ├── shape_style_rect_bg.xml │ │ │ ├── shape_thumb.xml │ │ │ ├── shape_unclick.xml │ │ │ └── side_nav_bar.xml │ │ │ ├── layout │ │ │ ├── activity_about.xml │ │ │ ├── activity_audio_book_player.xml │ │ │ ├── activity_big_image.xml │ │ │ ├── activity_book_choice.xml │ │ │ ├── activity_book_detail.xml │ │ │ ├── activity_book_info.xml │ │ │ ├── activity_book_read.xml │ │ │ ├── activity_book_source.xml │ │ │ ├── activity_cache_manager.xml │ │ │ ├── activity_donate.xml │ │ │ ├── activity_expandable_list_vew.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_qrcode_scan.xml │ │ │ ├── activity_read_comic_book.xml │ │ │ ├── activity_read_style.xml │ │ │ ├── activity_recycler_vew.xml │ │ │ ├── activity_search_book.xml │ │ │ ├── activity_settings.xml │ │ │ ├── activity_source_debug.xml │ │ │ ├── activity_source_edit.xml │ │ │ ├── activity_webview.xml │ │ │ ├── content_main.xml │ │ │ ├── dialog_alert.xml │ │ │ ├── dialog_bookmark.xml │ │ │ ├── dialog_change_source.xml │ │ │ ├── dialog_clear_cache_tip.xml │ │ │ ├── dialog_design_container.xml │ │ │ ├── dialog_download_choice.xml │ │ │ ├── dialog_info.xml │ │ │ ├── dialog_input.xml │ │ │ ├── dialog_large_text.xml │ │ │ ├── dialog_loading.xml │ │ │ ├── dialog_number_picker.xml │ │ │ ├── dialog_progress.xml │ │ │ ├── dialog_recently_viewed.xml │ │ │ ├── dialog_replace_rule.xml │ │ │ ├── fast_scroller.xml │ │ │ ├── fragment_audio_book.xml │ │ │ ├── fragment_book_list.xml │ │ │ ├── fragment_bookmark_list.xml │ │ │ ├── fragment_chapter_list.xml │ │ │ ├── fragment_choice_book.xml │ │ │ ├── fragment_file_category.xml │ │ │ ├── fragment_file_selector.xml │ │ │ ├── fragment_find_book.xml │ │ │ ├── fragment_main_book_list.xml │ │ │ ├── fragment_tab_chapterlist.xml │ │ │ ├── item_audio_book.xml │ │ │ ├── item_audio_timer.xml │ │ │ ├── item_book_source.xml │ │ │ ├── item_bookshelf_grid.xml │ │ │ ├── item_bookshelf_list.xml │ │ │ ├── item_cache_extract.xml │ │ │ ├── item_change_source.xml │ │ │ ├── item_chapter_list.xml │ │ │ ├── item_choice_book_category.xml │ │ │ ├── item_download.xml │ │ │ ├── item_file_selector.xml │ │ │ ├── item_find_book.xml │ │ │ ├── item_find_book_preview.xml │ │ │ ├── item_find_book_preview_more.xml │ │ │ ├── item_font.xml │ │ │ ├── item_home_tab.xml │ │ │ ├── item_recently_viewed.xml │ │ │ ├── item_replace_rule.xml │ │ │ ├── item_search_book.xml │ │ │ ├── item_search_history.xml │ │ │ ├── layout_aloud_notification.xml │ │ │ ├── layout_audio_notification.xml │ │ │ ├── navigation_header.xml │ │ │ ├── pop_audio_chapter.xml │ │ │ ├── pop_audio_timer.xml │ │ │ ├── pop_choice_book_category.xml │ │ │ ├── pop_custom_space.xml │ │ │ ├── pop_more_setting.xml │ │ │ ├── pop_read_adjust.xml │ │ │ ├── pop_read_interface.xml │ │ │ ├── pop_soft_keyboard_top_tool.xml │ │ │ ├── switch_item_night_theme.xml │ │ │ ├── view_audio_playing.xml │ │ │ ├── view_book_content_scroll.xml │ │ │ ├── view_book_content_swipe.xml │ │ │ ├── view_floating_menu.xml │ │ │ ├── view_navigation_divider.xml │ │ │ ├── view_number_buttom.xml │ │ │ ├── view_preference.xml │ │ │ ├── view_read_bottom_statusbar.xml │ │ │ ├── view_recently_viewed.xml │ │ │ ├── view_recycler_font.xml │ │ │ ├── view_refresh_load_more.xml │ │ │ ├── view_refresh_recycler_view.xml │ │ │ ├── view_search_bookshelf.xml │ │ │ ├── view_searchbook_no_data.xml │ │ │ ├── view_searchbook_refresh_error.xml │ │ │ └── view_toast.xml │ │ │ ├── menu │ │ │ ├── menu_audio_play_activity.xml │ │ │ ├── menu_book_download.xml │ │ │ ├── menu_book_import.xml │ │ │ ├── menu_book_info.xml │ │ │ ├── menu_book_read_activity.xml │ │ │ ├── menu_book_shelf.xml │ │ │ ├── menu_book_source_activity.xml │ │ │ ├── menu_book_source_edit.xml │ │ │ ├── menu_choice_book_activity.xml │ │ │ ├── menu_debug_activity.xml │ │ │ ├── menu_drawer.xml │ │ │ ├── menu_file_selector.xml │ │ │ ├── menu_main_activity.xml │ │ │ ├── menu_read_style_activity.xml │ │ │ ├── menu_replace_rule_activity.xml │ │ │ ├── menu_search_activity.xml │ │ │ ├── menu_search_view.xml │ │ │ ├── menu_text_selection_search.xml │ │ │ └── menu_webview_activity.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── raw │ │ │ └── silent_sound.mp3 │ │ │ ├── values-night │ │ │ ├── colors.xml │ │ │ ├── drawables.xml │ │ │ └── styles.xml │ │ │ ├── values │ │ │ ├── arrays.xml │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── colors_material_design.xml │ │ │ ├── common_colors.xml │ │ │ ├── dimens.xml │ │ │ ├── drawables.xml │ │ │ ├── ids.xml │ │ │ ├── integers.xml │ │ │ ├── pref_key_value.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ ├── file_paths.xml │ │ │ ├── network_security_config.xml │ │ │ └── pref_settings.xml │ └── test │ │ └── java │ │ └── com │ │ └── monke │ │ └── monkeybook │ │ └── ExampleUnitTest.java └── version.properties ├── basemvplib ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ ├── com │ └── monke │ │ └── basemvplib │ │ ├── AjaxWebView.java │ │ ├── AppActivityManager.java │ │ ├── BaseActivity.java │ │ ├── BaseApplication.java │ │ ├── BaseFragment.java │ │ ├── BaseModelImpl.java │ │ ├── BasePresenterImpl.java │ │ ├── ContextHolder.java │ │ ├── CookieStore.java │ │ ├── DensityAdaption.java │ │ ├── EncodeConverter.java │ │ ├── EncodingDetect.java │ │ ├── HttpLoggingInterceptor.java │ │ ├── NetworkUtil.java │ │ ├── OkHttpHelper.java │ │ ├── RequestMethod.java │ │ ├── RetryInterceptor.java │ │ ├── SSLHelper.java │ │ ├── impl │ │ ├── IPresenter.java │ │ └── IView.java │ │ └── rxjava │ │ └── RxExecutors.java │ └── compat │ ├── Consumer.java │ ├── Function.java │ ├── Optional.java │ ├── Predicate.java │ └── Supplier.java ├── build.gradle ├── docs ├── bookSource.txt ├── disclaimer.html ├── disclaimer.md ├── image │ └── mybookshelf.jpg ├── index.html ├── index.md ├── qqskrwm.jpg ├── sourcerule.html ├── sourcerule.md ├── wxskrwm.jpg ├── zfbhbrwm.png └── zfbskrwm.jpg ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.jks 2 | *.keystore 3 | *.iml 4 | /.gradle 5 | /.idea 6 | .DS_Store 7 | /local.properties 8 | /build -------------------------------------------------------------------------------- /Bookself.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/Bookself.jks -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.jks 3 | /build 4 | /version.properties -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 皓阅.debug 3 | -------------------------------------------------------------------------------- /app/src/main/assets/number.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/assets/number.ttf -------------------------------------------------------------------------------- /app/src/main/assets/test.js: -------------------------------------------------------------------------------- 1 | importPackage(com.monke.monkeybook.test); 2 | var callback = { 3 | do1: function () { 4 | print("jsssssssssssss running1"); 5 | }, 6 | do2: function () { 7 | print("jsssssssssssss running2"); 8 | } 9 | } 10 | var t = new Test(callback); 11 | t.do1(); 12 | t.do2(); -------------------------------------------------------------------------------- /app/src/main/assets/web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/assets/web/favicon.ico -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/base/observer/SimpleObserver.java: -------------------------------------------------------------------------------- 1 | //Copyright (c) 2017. 章钦豪. All rights reserved. 2 | package com.monke.monkeybook.base.observer; 3 | 4 | import io.reactivex.Observer; 5 | import io.reactivex.disposables.Disposable; 6 | 7 | public abstract class SimpleObserver implements Observer { 8 | 9 | @Override 10 | public void onSubscribe(Disposable d) { 11 | 12 | } 13 | 14 | @Override 15 | public void onNext(T t) { 16 | 17 | } 18 | 19 | @Override 20 | public void onError(Throwable e) { 21 | 22 | } 23 | 24 | @Override 25 | public void onComplete() { 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/base/observer/SimpleSingleObserver.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.base.observer; 2 | 3 | import io.reactivex.SingleObserver; 4 | import io.reactivex.disposables.Disposable; 5 | 6 | public abstract class SimpleSingleObserver implements SingleObserver { 7 | @Override 8 | public void onSubscribe(Disposable d) { 9 | } 10 | 11 | @Override 12 | public void onSuccess(T t) { 13 | 14 | } 15 | 16 | @Override 17 | public void onError(Throwable e) { 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/bean/FileSnapshot.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.bean; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | public class FileSnapshot implements Serializable { 7 | private RipeFile parent; 8 | private List files; 9 | private int scrollOffset; 10 | 11 | public RipeFile getParent() { 12 | return parent; 13 | } 14 | 15 | public void setParent(RipeFile parent) { 16 | this.parent = parent; 17 | } 18 | 19 | public List getFiles() { 20 | return files; 21 | } 22 | 23 | public void setFiles(List files) { 24 | this.files = files; 25 | } 26 | 27 | public int getScrollOffset() { 28 | return scrollOffset; 29 | } 30 | 31 | public void setScrollOffset(int scrollOffset) { 32 | this.scrollOffset = scrollOffset; 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/bean/FilterBean.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.bean; 2 | 3 | public interface FilterBean { 4 | 5 | String[] getFilters(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/bean/LocBookShelfBean.java: -------------------------------------------------------------------------------- 1 | //Copyright (c) 2017. 章钦豪. All rights reserved. 2 | package com.monke.monkeybook.bean; 3 | 4 | public class LocBookShelfBean { 5 | private boolean isNew; 6 | private BookShelfBean bookShelfBean; 7 | 8 | public LocBookShelfBean(boolean isNew,BookShelfBean bookShelfBean){ 9 | this.isNew = isNew; 10 | this.bookShelfBean = bookShelfBean; 11 | } 12 | 13 | public boolean getNew() { 14 | return isNew; 15 | } 16 | 17 | public void setNew(Boolean aNew) { 18 | isNew = aNew; 19 | } 20 | 21 | public BookShelfBean getBookShelfBean() { 22 | return bookShelfBean; 23 | } 24 | 25 | public void setBookShelfBean(BookShelfBean bookShelfBean) { 26 | this.bookShelfBean = bookShelfBean; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/bean/VariableStore.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.bean; 2 | 3 | import java.util.Map; 4 | 5 | public interface VariableStore { 6 | 7 | String getVariableString(); 8 | 9 | void setVariableString(String variableString); 10 | 11 | Map putVariableMap(Map variableMap); 12 | 13 | String putVariable(String key, String value); 14 | 15 | Map getVariableMap(); 16 | 17 | String getVariable(String key); 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/Logger.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help; 2 | 3 | import android.util.Log; 4 | 5 | import com.monke.monkeybook.MApplication; 6 | 7 | /** 8 | * Created by PureDark on 2016/9/24. 9 | */ 10 | 11 | public class Logger { 12 | 13 | public static void d(String tag, String message) { 14 | if (MApplication.DEBUG) 15 | Log.d(tag, message); 16 | } 17 | 18 | public static void e(String tag, String message, Throwable e) { 19 | if (MApplication.DEBUG) 20 | Log.e(tag, message, e); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/NoDoubleClickListener.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help; 2 | 3 | import android.view.View; 4 | 5 | import java.util.Calendar; 6 | 7 | public abstract class NoDoubleClickListener implements View.OnClickListener { 8 | private static final int MIN_CLICK_DELAY_TIME = 400; 9 | private long lastClickTime = 0; 10 | 11 | @Override 12 | public void onClick(View v) { 13 | long currentTime = Calendar.getInstance().getTimeInMillis(); 14 | if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) { 15 | lastClickTime = currentTime; 16 | onNoDoubleClick(v); 17 | } 18 | } 19 | 20 | public abstract void onNoDoubleClick(View v); 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/RunMediaPlayer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help; 2 | 3 | import android.content.Context; 4 | import android.media.MediaPlayer; 5 | 6 | import com.monke.monkeybook.R; 7 | 8 | /** 9 | * Created by GKF on 2018/1/9. 10 | * 播放音频 11 | */ 12 | 13 | public class RunMediaPlayer { 14 | 15 | public static void playSilentSound(Context mContext) { 16 | // Stupid Android 8 "Oreo" hack to make media buttons work 17 | final MediaPlayer mMediaPlayer; 18 | mMediaPlayer = MediaPlayer.create(mContext, R.raw.silent_sound); 19 | mMediaPlayer.setOnCompletionListener(mediaPlayer -> mMediaPlayer.release()); 20 | mMediaPlayer.start(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/ByteArraySource.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache; 2 | 3 | import java.io.ByteArrayInputStream; 4 | 5 | /** 6 | * Simple memory based {@link Source} implementation. 7 | * 8 | * @author Alexey Danilov (danikula@gmail.com). 9 | */ 10 | public class ByteArraySource implements Source { 11 | 12 | private final byte[] data; 13 | private ByteArrayInputStream arrayInputStream; 14 | 15 | public ByteArraySource(byte[] data) { 16 | this.data = data; 17 | } 18 | 19 | @Override 20 | public int read(byte[] buffer) throws ProxyCacheException { 21 | return arrayInputStream.read(buffer, 0, buffer.length); 22 | } 23 | 24 | @Override 25 | public long length() throws ProxyCacheException { 26 | return data.length; 27 | } 28 | 29 | @Override 30 | public void open(long offset) throws ProxyCacheException { 31 | arrayInputStream = new ByteArrayInputStream(data); 32 | arrayInputStream.skip(offset); 33 | } 34 | 35 | @Override 36 | public void close() throws ProxyCacheException { 37 | } 38 | } 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/Cache.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache; 2 | 3 | /** 4 | * Cache for proxy. 5 | * 6 | * @author Alexey Danilov (danikula@gmail.com). 7 | */ 8 | public interface Cache { 9 | 10 | long available() throws ProxyCacheException; 11 | 12 | int read(byte[] buffer, long offset, int length) throws ProxyCacheException; 13 | 14 | void append(byte[] data, int length) throws ProxyCacheException; 15 | 16 | void close() throws ProxyCacheException; 17 | 18 | void complete() throws ProxyCacheException; 19 | 20 | boolean isCompleted(); 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/CacheListener.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Listener for cache availability. 7 | * 8 | * @author Egor Makovsky (yahor.makouski@gmail.com) 9 | * @author Alexey Danilov (danikula@gmail.com). 10 | */ 11 | public interface CacheListener { 12 | 13 | void onCacheAvailable(File cacheFile, String url, int percentsAvailable); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/InterruptedProxyCacheException.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache; 2 | 3 | /** 4 | * Indicates interruption error in work of {@link ProxyCache} fired by user. 5 | * 6 | * @author Alexey Danilov 7 | */ 8 | public class InterruptedProxyCacheException extends ProxyCacheException { 9 | 10 | public InterruptedProxyCacheException(String message) { 11 | super(message); 12 | } 13 | 14 | public InterruptedProxyCacheException(String message, Throwable cause) { 15 | super(message, cause); 16 | } 17 | 18 | public InterruptedProxyCacheException(Throwable cause) { 19 | super(cause); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/ProxyCacheException.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache; 2 | 3 | import com.monke.monkeybook.BuildConfig; 4 | 5 | /** 6 | * Indicates any error in work of {@link ProxyCache}. 7 | * 8 | * @author Alexey Danilov 9 | */ 10 | public class ProxyCacheException extends Exception { 11 | 12 | private static final String LIBRARY_VERSION = ". Version: " + BuildConfig.VERSION_NAME; 13 | 14 | public ProxyCacheException(String message) { 15 | super(message + LIBRARY_VERSION); 16 | } 17 | 18 | public ProxyCacheException(String message, Throwable cause) { 19 | super(message + LIBRARY_VERSION, cause); 20 | } 21 | 22 | public ProxyCacheException(Throwable cause) { 23 | super("No explanation error" + LIBRARY_VERSION, cause); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/SourceInfo.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache; 2 | 3 | /** 4 | * Stores source's info. 5 | * 6 | * @author Alexey Danilov (danikula@gmail.com). 7 | */ 8 | public class SourceInfo { 9 | 10 | public final String url; 11 | public final long length; 12 | public final String mime; 13 | 14 | public SourceInfo(String url, long length, String mime) { 15 | this.url = url; 16 | this.length = length; 17 | this.mime = mime; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return "SourceInfo{" + 23 | "url='" + url + '\'' + 24 | ", length=" + length + 25 | ", mime='" + mime + '\'' + 26 | '}'; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/file/DiskUsage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.file; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | 6 | /** 7 | * Declares how {@link FileCache} will use disc space. 8 | * 9 | * @author Alexey Danilov (danikula@gmail.com). 10 | */ 11 | public interface DiskUsage { 12 | 13 | void touch(File file) throws IOException; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/file/FileNameGenerator.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.file; 2 | 3 | /** 4 | * Generator for files to be used for caching. 5 | * 6 | * @author Alexey Danilov (danikula@gmail.com). 7 | */ 8 | public interface FileNameGenerator { 9 | 10 | String generate(String url); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/file/TotalCountLruDiskUsage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.file; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * {@link DiskUsage} that uses LRU (Least Recently Used) strategy and trims cache size to max files count if needed. 7 | * 8 | * @author Alexey Danilov (danikula@gmail.com). 9 | */ 10 | public class TotalCountLruDiskUsage extends LruDiskUsage { 11 | 12 | private final int maxCount; 13 | 14 | public TotalCountLruDiskUsage(int maxCount) { 15 | if (maxCount <= 0) { 16 | throw new IllegalArgumentException("Max count must be positive number!"); 17 | } 18 | this.maxCount = maxCount; 19 | } 20 | 21 | @Override 22 | protected boolean accept(File file, long totalSize, int totalCount) { 23 | return totalCount <= maxCount; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/file/TotalSizeLruDiskUsage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.file; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * {@link DiskUsage} that uses LRU (Least Recently Used) strategy and trims cache size to max size if needed. 7 | * 8 | * @author Alexey Danilov (danikula@gmail.com). 9 | */ 10 | public class TotalSizeLruDiskUsage extends LruDiskUsage { 11 | 12 | private final long maxSize; 13 | 14 | public TotalSizeLruDiskUsage(long maxSize) { 15 | if (maxSize <= 0) { 16 | throw new IllegalArgumentException("Max size must be positive number!"); 17 | } 18 | this.maxSize = maxSize; 19 | } 20 | 21 | @Override 22 | protected boolean accept(File file, long totalSize, int totalCount) { 23 | return totalSize <= maxSize; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/file/UnlimitedDiskUsage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.file; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | 6 | /** 7 | * Unlimited version of {@link DiskUsage}. 8 | * 9 | * @author Alexey Danilov (danikula@gmail.com). 10 | */ 11 | public class UnlimitedDiskUsage implements DiskUsage { 12 | 13 | @Override 14 | public void touch(File file) throws IOException { 15 | // do nothing 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/headers/EmptyHeadersInjector.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.headers; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * Empty {@link HeaderInjector} implementation. 8 | * 9 | * @author Lucas Nelaupe (https://github.com/lucas34). 10 | */ 11 | public class EmptyHeadersInjector implements HeaderInjector { 12 | 13 | @Override 14 | public Map addHeaders(String url) { 15 | return new HashMap<>(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/headers/HeaderInjector.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.headers; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * Allows to add custom headers to server's requests. 7 | * 8 | * @author Lucas Nelaupe (https://github.com/lucas34). 9 | */ 10 | public interface HeaderInjector { 11 | 12 | /** 13 | * Adds headers to server's requests for corresponding url. 14 | * 15 | * @param url an url headers will be added for 16 | * @return a map with headers, where keys are header's names, and values are header's values. {@code null} is not acceptable! 17 | */ 18 | Map addHeaders(String url); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/sourcestorage/NoSourceInfoStorage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.sourcestorage; 2 | 3 | import com.monke.monkeybook.help.mediacache.SourceInfo; 4 | 5 | /** 6 | * {@link SourceInfoStorage} that does nothing. 7 | * 8 | * @author Alexey Danilov (danikula@gmail.com). 9 | */ 10 | public class NoSourceInfoStorage implements SourceInfoStorage { 11 | 12 | @Override 13 | public SourceInfo get(String url) { 14 | return null; 15 | } 16 | 17 | @Override 18 | public void put(String url, SourceInfo sourceInfo) { 19 | } 20 | 21 | @Override 22 | public void release() { 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/sourcestorage/SourceInfoStorage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.sourcestorage; 2 | 3 | import com.monke.monkeybook.help.mediacache.SourceInfo; 4 | 5 | /** 6 | * Storage for {@link SourceInfo}. 7 | * 8 | * @author Alexey Danilov (danikula@gmail.com). 9 | */ 10 | public interface SourceInfoStorage { 11 | 12 | SourceInfo get(String url); 13 | 14 | void put(String url, SourceInfo sourceInfo); 15 | 16 | void release(); 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/mediacache/sourcestorage/SourceInfoStorageFactory.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.mediacache.sourcestorage; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Simple factory for {@link SourceInfoStorage}. 7 | * 8 | * @author Alexey Danilov (danikula@gmail.com). 9 | */ 10 | public class SourceInfoStorageFactory { 11 | 12 | public static SourceInfoStorage newSourceInfoStorage(Context context) { 13 | return new DatabaseSourceInfoStorage(context); 14 | } 15 | 16 | public static SourceInfoStorage newEmptySourceInfoStorage() { 17 | return new NoSourceInfoStorage(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/ActivitySource.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import androidx.fragment.app.FragmentManager; 8 | 9 | import java.lang.ref.WeakReference; 10 | 11 | final class ActivitySource implements RequestSource{ 12 | 13 | private final WeakReference mActRef; 14 | 15 | ActivitySource(AppCompatActivity activity) { 16 | mActRef = new WeakReference<>(activity); 17 | } 18 | 19 | @Override 20 | public Context getContext() { 21 | return mActRef.get(); 22 | } 23 | 24 | @Override 25 | public FragmentManager getFragmentManager() { 26 | return mActRef.get().getSupportFragmentManager(); 27 | } 28 | 29 | @Override 30 | public void startActivity(Intent intent) { 31 | mActRef.get().startActivity(intent); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/FragmentSource.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import androidx.fragment.app.Fragment; 7 | import androidx.fragment.app.FragmentManager; 8 | 9 | import java.lang.ref.WeakReference; 10 | 11 | final class FragmentSource implements RequestSource { 12 | 13 | private final WeakReference mFragRef; 14 | 15 | FragmentSource(Fragment fragment) { 16 | mFragRef = new WeakReference<>(fragment); 17 | } 18 | 19 | @Override 20 | public Context getContext() { 21 | return mFragRef.get().getContext(); 22 | } 23 | 24 | @Override 25 | public FragmentManager getFragmentManager() { 26 | return mFragRef.get().getChildFragmentManager(); 27 | } 28 | 29 | @Override 30 | public void startActivity(Intent intent) { 31 | mFragRef.get().startActivity(intent); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/OnPermissionsDeniedCallback.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | public interface OnPermissionsDeniedCallback { 4 | void onPermissionsDenied(int requestCode, String[] deniedPermissions); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/OnPermissionsGrantedCallback.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | public interface OnPermissionsGrantedCallback { 4 | 5 | void onPermissionsGranted(int requestCode); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/OnPermissionsResultCallback.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | public interface OnPermissionsResultCallback { 4 | 5 | void onPermissionsGranted(int requestCode); 6 | 7 | void onPermissionsDenied(int requestCode, String[] deniedPermissions); 8 | 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/OnRationaleCallback.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | public interface OnRationaleCallback { 4 | 5 | void onRationale(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/OnRequestPermissionsResultCallback.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | import android.content.Intent; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.annotation.Nullable; 7 | 8 | public interface OnRequestPermissionsResultCallback { 9 | 10 | void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults); 11 | 12 | 13 | void onActivityResult(int requestCode, int resultCode, @Nullable Intent data); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/RequestPlugins.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | /** 4 | * create on 2019/2/13 5 | * 6 | * by 咸鱼 7 | */ 8 | final class RequestPlugins { 9 | 10 | static volatile OnRequestPermissionsResultCallback sRequestCallback; 11 | 12 | static volatile OnPermissionsResultCallback sResultCallback; 13 | 14 | static void setOnRequestPermissionsCallback(OnRequestPermissionsResultCallback callback) { 15 | sRequestCallback = callback; 16 | } 17 | 18 | static void setOnPermissionsResultCallback(OnPermissionsResultCallback callback){ 19 | sResultCallback = callback; 20 | } 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/help/permission/RequestSource.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.help.permission; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import androidx.fragment.app.FragmentManager; 7 | 8 | public interface RequestSource { 9 | 10 | Context getContext(); 11 | 12 | FragmentManager getFragmentManager(); 13 | 14 | void startActivity(Intent intent); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/AnalyzeCollection.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import java.util.List; 4 | import java.util.ListIterator; 5 | 6 | final class AnalyzeCollection { 7 | 8 | private ListIterator mIterator; 9 | 10 | AnalyzeCollection(List rawList) { 11 | this.mIterator = rawList.listIterator(); 12 | } 13 | 14 | boolean hasNext() { 15 | return mIterator.hasNext(); 16 | } 17 | 18 | Object next() { 19 | return mIterator.next(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/CSSAnalyzer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.monke.monkeybook.model.annotation.RuleType; 4 | 5 | import org.jsoup.nodes.Element; 6 | 7 | final class CSSAnalyzer extends OutAnalyzer { 8 | CSSAnalyzer(AnalyzeConfig config) { 9 | super(config); 10 | } 11 | 12 | @Override 13 | String getRuleType() { 14 | return RuleType.CSS; 15 | } 16 | 17 | @Override 18 | SourceParser onCreateSourceParser() { 19 | return new CSSParser(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/ContentDelegate.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.monke.monkeybook.bean.BookContentBean; 4 | import com.monke.monkeybook.bean.BookShelfBean; 5 | import com.monke.monkeybook.bean.ChapterBean; 6 | import com.monke.monkeybook.bean.SearchBookBean; 7 | 8 | import java.util.List; 9 | 10 | import io.reactivex.Observable; 11 | 12 | public interface ContentDelegate { 13 | 14 | Observable> getSearchBooks(String source); 15 | 16 | Observable getBook(String source); 17 | 18 | Observable> getChapters(String source); 19 | 20 | Observable getBookContent(String source); 21 | 22 | Observable getAudioContent(String source); 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/HybridAnalyzer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.monke.monkeybook.model.annotation.RuleType; 4 | 5 | public final class HybridAnalyzer extends OutAnalyzer { 6 | 7 | public HybridAnalyzer(AnalyzeConfig config) { 8 | super(config); 9 | } 10 | 11 | @Override 12 | String getRuleType() { 13 | return RuleType.HYBRID; 14 | } 15 | 16 | 17 | @Override 18 | SourceParser onCreateSourceParser() { 19 | return new HybridParser(); 20 | } 21 | 22 | @Override 23 | IAnalyzerPresenter onCreateAnalyzerPresenter(OutAnalyzer analyzer) { 24 | return new HybridAnalyzerPresenter(analyzer); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/IAnalyzerPresenter.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface IAnalyzerPresenter { 9 | 10 | String getText(String rule); 11 | 12 | String getRawUrl(String rule); 13 | 14 | String getAbsUrl(String rule); 15 | 16 | String getTextDirectly(String rule); 17 | 18 | String getRawUrlDirectly(String rule); 19 | 20 | String getAbsUrlDirectly(String rule); 21 | 22 | List getTextList(String rule); 23 | 24 | List getRawUrlList(String rule); 25 | 26 | List getAbsUrlList(String rule); 27 | 28 | Map putVariableMap(String rule, int flag); 29 | 30 | Map putVariableMapDirectly(String rule, int flag); 31 | 32 | AnalyzeCollection getRawCollection(String rule); 33 | 34 | void processUrlList(List result); 35 | 36 | String processUrl(@NonNull String result); 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/JsonAnalyzer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.jayway.jsonpath.ReadContext; 4 | import com.monke.monkeybook.model.annotation.RuleType; 5 | 6 | final class JsonAnalyzer extends OutAnalyzer { 7 | 8 | JsonAnalyzer(AnalyzeConfig config) { 9 | super(config); 10 | } 11 | 12 | @Override 13 | String getRuleType() { 14 | return RuleType.JSON; 15 | } 16 | 17 | @Override 18 | SourceParser onCreateSourceParser() { 19 | return new JsonParser(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/JsoupAnalyzer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.monke.monkeybook.model.annotation.RuleType; 4 | 5 | import org.jsoup.nodes.Element; 6 | 7 | /** 8 | * Created by GKF on 2018/1/25. 9 | * 书源规则解析 10 | */ 11 | 12 | final class JsoupAnalyzer extends OutAnalyzer { 13 | 14 | JsoupAnalyzer(AnalyzeConfig config) { 15 | super(config); 16 | } 17 | 18 | @Override 19 | String getRuleType() { 20 | return RuleType.DEFAULT; 21 | } 22 | 23 | @Override 24 | SourceParser onCreateSourceParser() { 25 | return new JsoupParser(); 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/Rule.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | class Rule { 6 | 7 | private String rule; 8 | private RuleMode mode; 9 | 10 | Rule() { 11 | } 12 | 13 | Rule(String rule, RuleMode mode) { 14 | this.rule = rule; 15 | this.mode = mode; 16 | } 17 | 18 | String getRule() { 19 | return rule; 20 | } 21 | 22 | RuleMode getMode() { 23 | return mode; 24 | } 25 | 26 | void setRule(String rule) { 27 | this.rule = rule; 28 | } 29 | 30 | void setMode(RuleMode mode) { 31 | this.mode = mode; 32 | } 33 | 34 | @NonNull 35 | @Override 36 | public String toString() { 37 | return "Rule{" + 38 | "rule='" + rule + '\'' + 39 | ", mode=" + mode + 40 | '}'; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/RuleMode.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.monke.monkeybook.model.annotation.RuleType; 4 | 5 | enum RuleMode { 6 | XPath, JSon, CSS, Default; 7 | 8 | 9 | static RuleMode fromRuleType(@RuleType String ruleType) { 10 | switch (ruleType) { 11 | case RuleType.XPATH: 12 | return XPath; 13 | case RuleType.JSON: 14 | return JSon; 15 | case RuleType.CSS: 16 | return CSS; 17 | case RuleType.DEFAULT: 18 | return Default; 19 | case RuleType.HYBRID: 20 | default: 21 | return null; 22 | } 23 | } 24 | 25 | 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/XPathAnalyzer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule; 2 | 3 | import com.monke.monkeybook.model.annotation.RuleType; 4 | 5 | import org.seimicrawler.xpath.JXDocument; 6 | 7 | final class XPathAnalyzer extends OutAnalyzer { 8 | 9 | XPathAnalyzer(AnalyzeConfig config) { 10 | super(config); 11 | } 12 | 13 | @Override 14 | String getRuleType() { 15 | return RuleType.XPATH; 16 | } 17 | 18 | @Override 19 | SourceParser onCreateSourceParser() { 20 | return new XPathParser(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/assit/JavaExecutor.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule.assit; 2 | 3 | public interface JavaExecutor extends SimpleJavaExecutor { 4 | 5 | String putVariable(String key, String val); 6 | 7 | String getVariable(String key); 8 | 9 | String parseContent(Object source, String rule); 10 | 11 | String parseUrl(Object source, String rule); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/analyzeRule/assit/SimpleJavaExecutor.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.analyzeRule.assit; 2 | 3 | public interface SimpleJavaExecutor{ 4 | 5 | String ajax(String url); 6 | 7 | String base64Decode(String string); 8 | 9 | String base64Encode(String string); 10 | 11 | String formatHtml(String string); 12 | 13 | String unescapeHtml3(String string); 14 | 15 | String unescapeHtml4(String string); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/annotation/BookType.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.annotation; 2 | 3 | import androidx.annotation.StringDef; 4 | 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @StringDef({ 9 | BookType.TEXT, 10 | BookType.AUDIO 11 | }) 12 | @Retention(RetentionPolicy.SOURCE) 13 | public @interface BookType { 14 | String TEXT = "TEXT"; 15 | String AUDIO = "AUDIO"; 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/annotation/RuleType.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.annotation; 2 | 3 | import androidx.annotation.StringDef; 4 | 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @StringDef({ 9 | RuleType.DEFAULT, 10 | RuleType.XPATH, 11 | RuleType.JSON, 12 | RuleType.CSS, 13 | RuleType.HYBRID 14 | }) 15 | @Retention(RetentionPolicy.SOURCE) 16 | public @interface RuleType { 17 | String DEFAULT = "DEFAULT"; 18 | String XPATH = "XPATH"; 19 | String JSON = "JSON"; 20 | String CSS = "CSS"; 21 | String HYBRID = "HYBRID"; 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/content/exception/BookSourceException.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.content.exception; 2 | 3 | public class BookSourceException extends Exception{ 4 | 5 | public BookSourceException(String message) { 6 | super(message); 7 | } 8 | 9 | public BookSourceException(String message, Throwable cause) { 10 | super(message, cause); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IAudioBookChapterModel.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | import com.monke.monkeybook.bean.ChapterBean; 4 | 5 | import io.reactivex.Observable; 6 | 7 | public interface IAudioBookChapterModel { 8 | 9 | 10 | /** 11 | * 处理听书章节 12 | */ 13 | Observable getAudioBookContent(String chapterUrl, ChapterBean chapter); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IBookRefreshModel.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | public interface IBookRefreshModel { 4 | 5 | void queryBooks(int group, boolean refresh, boolean autoClean); 6 | 7 | void startRefreshBook(); 8 | 9 | void stopRefreshBook(); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IDownloadTask.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | import com.monke.monkeybook.bean.ChapterBean; 4 | import com.monke.monkeybook.bean.DownloadBookBean; 5 | 6 | import io.reactivex.Scheduler; 7 | 8 | public interface IDownloadTask { 9 | 10 | int getId(); 11 | 12 | long getWhen(); 13 | 14 | void startDownload(Scheduler scheduler); 15 | 16 | void stopDownload(boolean callEvent); 17 | 18 | boolean isDownloading(); 19 | 20 | boolean isFinishing(); 21 | 22 | DownloadBookBean getDownloadBook(); 23 | 24 | void onDownloadPrepared(DownloadBookBean downloadBook); 25 | 26 | void onDownloadProgress(String bookName, ChapterBean chapterBean); 27 | 28 | void onDownloadChange(DownloadBookBean downloadBook); 29 | 30 | void onDownloadError(DownloadBookBean downloadBook); 31 | 32 | void onDownloadComplete(DownloadBookBean downloadBook); 33 | 34 | void onDownloadCancel(DownloadBookBean downloadBook); 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IHttpGetApi.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | import java.util.Map; 4 | 5 | import io.reactivex.Observable; 6 | import retrofit2.Response; 7 | import retrofit2.http.GET; 8 | import retrofit2.http.HeaderMap; 9 | import retrofit2.http.QueryMap; 10 | import retrofit2.http.Url; 11 | 12 | /** 13 | * Created by GKF on 2018/1/21. 14 | * get web content 15 | */ 16 | 17 | public interface IHttpGetApi { 18 | @GET 19 | Observable> getWebContent(@Url String url, 20 | @HeaderMap Map headers); 21 | 22 | @GET 23 | Observable> searchBook(@Url String url, 24 | @QueryMap(encoded = true) Map queryMap, 25 | @HeaderMap Map headers); 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IHttpPostApi.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | import java.util.Map; 4 | 5 | import io.reactivex.Observable; 6 | import retrofit2.Response; 7 | import retrofit2.http.FieldMap; 8 | import retrofit2.http.FormUrlEncoded; 9 | import retrofit2.http.GET; 10 | import retrofit2.http.HeaderMap; 11 | import retrofit2.http.POST; 12 | import retrofit2.http.Path; 13 | import retrofit2.http.QueryMap; 14 | import retrofit2.http.Url; 15 | 16 | /** 17 | * Created by GKF on 2018/1/29. 18 | * post 19 | */ 20 | 21 | public interface IHttpPostApi { 22 | 23 | @FormUrlEncoded 24 | @POST 25 | Observable> searchBook(@Url String url, @FieldMap(encoded = true) Map fieldMap, @HeaderMap Map headers); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IImportBookModel.java: -------------------------------------------------------------------------------- 1 | //Copyright (c) 2017. 章钦豪. All rights reserved. 2 | package com.monke.monkeybook.model.impl; 3 | 4 | import com.monke.monkeybook.bean.LocBookShelfBean; 5 | 6 | import java.io.File; 7 | 8 | import io.reactivex.Observable; 9 | 10 | public interface IImportBookModel { 11 | 12 | Observable importBook(File book); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/ISearchTask.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | import com.monke.monkeybook.bean.SearchBookBean; 4 | import com.monke.monkeybook.bean.SearchEngine; 5 | 6 | import java.util.List; 7 | 8 | import io.reactivex.Scheduler; 9 | 10 | public interface ISearchTask { 11 | 12 | void startSearch(String query, Scheduler scheduler); 13 | 14 | void stopSearch(); 15 | 16 | interface OnSearchingListener { 17 | SearchEngine nextSearchEngine(); 18 | 19 | boolean hasNextSearchEngine(); 20 | 21 | void onSearchStart(ISearchTask searchTask); 22 | 23 | void onSearchResult(List searchBooks); 24 | 25 | void onSearchError(ISearchTask searchTask); 26 | 27 | void onSearchComplete(ISearchTask searchTask); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/model/impl/IShuqiApi.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.model.impl; 2 | 3 | import java.util.Map; 4 | 5 | import io.reactivex.Observable; 6 | import retrofit2.Response; 7 | import retrofit2.http.GET; 8 | import retrofit2.http.Headers; 9 | import retrofit2.http.Query; 10 | import retrofit2.http.QueryMap; 11 | 12 | public interface IShuqiApi { 13 | 14 | 15 | @GET("/webapi/book/info.php") 16 | @Headers("Content-Type:application/x-www-form-urlencoded") 17 | Observable> getBookDetail(@QueryMap Map fieldMap); 18 | 19 | @GET("/webapi/book/chapterlist.php") 20 | @Headers("Content-Type:application/x-www-form-urlencoded") 21 | Observable> getChapterList(@QueryMap Map fieldMap); 22 | 23 | @GET("/novel/i.php") 24 | Observable> getSearchBook(@Query("do") String doo, @Query("p") String pp, @Query("q") String content, @Query("page") int page, @Query("size") String size); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/presenter/contract/AudioBookContract.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.presenter.contract; 2 | 3 | import com.monke.basemvplib.impl.IPresenter; 4 | import com.monke.basemvplib.impl.IView; 5 | import com.monke.monkeybook.bean.AudioPlayInfo; 6 | import com.monke.monkeybook.bean.BookShelfBean; 7 | 8 | import java.util.List; 9 | 10 | public interface AudioBookContract { 11 | 12 | interface Presenter extends IPresenter { 13 | 14 | void loadAudioBooks(boolean refresh); 15 | 16 | boolean getNeedAnim(); 17 | } 18 | 19 | 20 | interface View extends IView { 21 | 22 | void showAudioBooks(List bookShelfBeans); 23 | 24 | void addBookShelf(BookShelfBean bookShelfBean); 25 | 26 | void removeBookShelf(BookShelfBean bookShelfBean); 27 | 28 | void updateBook(BookShelfBean bookShelfBean, boolean b); 29 | 30 | void sortBookShelf(); 31 | 32 | void clearBookShelf(); 33 | 34 | void toast(String msg); 35 | 36 | void onPlayEvent(AudioPlayInfo info); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/presenter/contract/CacheManagerContract.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.presenter.contract; 2 | 3 | import com.monke.basemvplib.impl.IPresenter; 4 | import com.monke.basemvplib.impl.IView; 5 | import com.monke.monkeybook.bean.BookShelfBean; 6 | 7 | import java.util.List; 8 | 9 | public interface CacheManagerContract { 10 | 11 | interface View extends IView{ 12 | void showBookList(List bookShelfBeans); 13 | 14 | void removeItem(BookShelfBean bookShelfBean); 15 | 16 | void toast(String msg); 17 | 18 | void showExtractTip(BookShelfBean bookShelfBean); 19 | 20 | void updateProgress(int max, int progress); 21 | 22 | void showProgress(); 23 | 24 | void hideProgress(); 25 | } 26 | 27 | 28 | interface Presenter extends IPresenter{ 29 | void queryBooks(); 30 | 31 | void extractBookCache(BookShelfBean bookShelfBean, boolean force); 32 | 33 | void cancel(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/presenter/contract/ChoiceBookContract.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.presenter.contract; 2 | 3 | import com.monke.basemvplib.impl.IPresenter; 4 | import com.monke.basemvplib.impl.IView; 5 | import com.monke.monkeybook.bean.SearchBookBean; 6 | import com.monke.monkeybook.view.adapter.ChoiceBookAdapter; 7 | 8 | import java.util.List; 9 | 10 | public interface ChoiceBookContract { 11 | interface Presenter extends IPresenter { 12 | 13 | int getPage(); 14 | 15 | void initPage(); 16 | 17 | void toSearchBooks(String key); 18 | } 19 | 20 | interface View extends IView { 21 | 22 | void refreshSearchBook(List books); 23 | 24 | void loadMoreSearchBook(List books); 25 | 26 | void refreshFinish(Boolean isAll); 27 | 28 | void loadMoreFinish(Boolean isAll); 29 | 30 | void searchBookError(boolean isRefresh, String errorMsg); 31 | 32 | ChoiceBookAdapter getSearchBookAdapter(); 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/presenter/contract/FindBookContract.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.presenter.contract; 2 | 3 | import com.monke.basemvplib.impl.IPresenter; 4 | import com.monke.basemvplib.impl.IView; 5 | import com.monke.monkeybook.bean.FindKindGroupBean; 6 | 7 | import java.util.List; 8 | 9 | public interface FindBookContract { 10 | interface Presenter extends IPresenter { 11 | void initData(); 12 | 13 | void updateData(String url); 14 | 15 | int getFindMode(); 16 | } 17 | 18 | interface View extends IView { 19 | 20 | /** 21 | * 更新UI 22 | */ 23 | void updateUI(List group); 24 | 25 | void updateItem(FindKindGroupBean item); 26 | 27 | void removeItem(FindKindGroupBean item); 28 | 29 | void showProgress(); 30 | 31 | void hideProgress(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/presenter/contract/SourceEditContract.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.presenter.contract; 2 | 3 | import com.monke.basemvplib.impl.IPresenter; 4 | import com.monke.basemvplib.impl.IView; 5 | import com.monke.monkeybook.bean.BookSourceBean; 6 | 7 | import java.io.File; 8 | 9 | public interface SourceEditContract { 10 | interface Presenter extends IPresenter { 11 | 12 | void saveSource(BookSourceBean bookSource, BookSourceBean bookSourceOld, boolean debug); 13 | 14 | void copySource(BookSourceBean bookSourceBean); 15 | 16 | void pasteSource(); 17 | 18 | void setText(String bookSourceStr); 19 | 20 | void handleSourceShare(); 21 | 22 | } 23 | 24 | interface View extends IView { 25 | 26 | void setText(BookSourceBean bookSourceBean); 27 | 28 | void toDebug(BookSourceBean bookSourceBean); 29 | 30 | String getBookSourceStr(); 31 | 32 | String getBookSourceName(); 33 | 34 | void saveSuccess(); 35 | 36 | void toast(String msg); 37 | 38 | void shareSource(File file, String mediaType); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/presenter/contract/WelcomeContract.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.presenter.contract; 2 | 3 | import android.app.Activity; 4 | import android.content.SharedPreferences; 5 | 6 | import com.monke.basemvplib.impl.IPresenter; 7 | import com.monke.basemvplib.impl.IView; 8 | import com.monke.monkeybook.bean.BookShelfBean; 9 | 10 | public interface WelcomeContract { 11 | 12 | interface View extends IView { 13 | void openBookFromUri(); 14 | 15 | void startReadBookAct(BookShelfBean shelfBean, boolean fromUri, long startDelay); 16 | 17 | void onStartNormal(long startDelay); 18 | 19 | void onStartFromUri(); 20 | 21 | SharedPreferences getPreferences(); 22 | 23 | void toast(String msg); 24 | 25 | void finish(); 26 | } 27 | 28 | interface Presenter extends IPresenter { 29 | 30 | void initData(Activity activity); 31 | 32 | void openBookFromRecent(); 33 | 34 | void openBookFromUri(Activity activity); 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/test/Callback.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.test; 2 | 3 | public interface Callback { 4 | 5 | void do1(); 6 | 7 | void do2(); 8 | 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/test/Test.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.test; 2 | 3 | import android.widget.ListView; 4 | 5 | public class Test { 6 | 7 | private Callback callback; 8 | 9 | public Test(Callback callback) { 10 | this.callback = callback; 11 | } 12 | 13 | public void do1(){ 14 | callback.do1(); 15 | } 16 | 17 | public void do2(){ 18 | ListView 19 | callback.do2(); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/utils/BatteryUtil.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.utils; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.content.IntentFilter; 6 | import android.os.BatteryManager; 7 | 8 | public class BatteryUtil { 9 | 10 | public static int getLevel(Context context) { 11 | IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 12 | Intent batteryStatus = context.registerReceiver(null, iFilter); 13 | 14 | return batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/utils/IOUtils.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.utils; 2 | 3 | import java.io.Closeable; 4 | import java.io.IOException; 5 | 6 | /** 7 | * Created by newbiechen on 17-5-11. 8 | */ 9 | 10 | public class IOUtils { 11 | 12 | public static void close(Closeable closeable){ 13 | if (closeable == null) return; 14 | try { 15 | closeable.close(); 16 | } catch (IOException e) { 17 | e.printStackTrace(); 18 | //close error 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/utils/ReadAssets.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.utils; 2 | 3 | import android.content.Context; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | 8 | public class ReadAssets { 9 | 10 | public static String getText(Context context, String fileName){ 11 | try { 12 | //Return an AssetManager instance for your application's package 13 | InputStream is = context.getAssets().open(fileName); 14 | int size = is.available(); 15 | // Read the entire asset into a local byte buffer. 16 | byte[] buffer = new byte[size]; 17 | is.read(buffer); 18 | is.close(); 19 | // Convert the buffer into a string. 20 | String text = new String(buffer, "utf-8"); 21 | // Finally stick the string into the text view. 22 | return text; 23 | } catch (IOException e) { 24 | // Should never happen! 25 | e.printStackTrace(); 26 | } 27 | return "读取错误,请检查文件名"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/utils/SystemUtil.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.utils; 2 | 3 | import android.content.Context; 4 | import android.provider.Settings; 5 | 6 | public class SystemUtil { 7 | 8 | public static int getScreenOffTime(Context context) { 9 | int screenOffTime = 0; 10 | try { 11 | screenOffTime = Settings.System.getInt(context.getContentResolver(), 12 | Settings.System.SCREEN_OFF_TIMEOUT); 13 | } catch (Exception e) { 14 | e.printStackTrace(); 15 | } 16 | return screenOffTime; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/activity/ReadComicBookActivity.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.activity; 2 | 3 | import com.monke.monkeybook.R; 4 | import com.monke.monkeybook.base.MBaseActivity; 5 | 6 | public class ReadComicBookActivity extends MBaseActivity { 7 | 8 | @Override 9 | protected void onCreateActivity() { 10 | setContentView(R.layout.activity_read_comic_book); 11 | } 12 | 13 | @Override 14 | protected void bindView() { 15 | 16 | } 17 | 18 | @Override 19 | protected void bindEvent() { 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/adapter/base/BaseViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.adapter.base; 2 | 3 | import androidx.recyclerview.widget.RecyclerView; 4 | import android.view.View; 5 | 6 | /** 7 | * Created by newbiechen on 17-5-17. 8 | */ 9 | 10 | public class BaseViewHolder extends RecyclerView.ViewHolder{ 11 | public IViewHolder holder; 12 | 13 | public BaseViewHolder(View itemView, IViewHolder holder) { 14 | super(itemView); 15 | this.holder = holder; 16 | holder.initView(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/adapter/base/IViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.adapter.base; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | 6 | /** 7 | * Created by newbiechen on 17-5-17. 8 | */ 9 | 10 | public interface IViewHolder { 11 | View createItemView(ViewGroup parent); 12 | void initView(); 13 | void onBind(T data, int pos); 14 | void onClick(); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/adapter/base/OnBookItemClickListenerTwo.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.adapter.base; 2 | 3 | import android.view.View; 4 | 5 | import com.monke.monkeybook.bean.BookShelfBean; 6 | 7 | public interface OnBookItemClickListenerTwo { 8 | void onClick(View view, BookShelfBean bookShelf); 9 | 10 | void onLongClick(View view, BookShelfBean bookShelf); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/adapter/base/OnItemClickListenerTwo.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.adapter.base; 2 | 3 | import android.view.View; 4 | 5 | public interface OnItemClickListenerTwo { 6 | void onClick(View view, int index); 7 | 8 | void onLongClick(View view, int index); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/fragment/FragmentTrigger.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.fragment; 2 | 3 | import android.view.MotionEvent; 4 | 5 | public interface FragmentTrigger { 6 | 7 | void onRefresh(); 8 | 9 | void onRestore(); 10 | 11 | boolean onBackPressed(); 12 | 13 | boolean dispatchTouchEvent(MotionEvent ev); 14 | 15 | void onReselected(); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/view/popupwindow/ChoiceBookCategoryPop.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.view.popupwindow; 2 | 3 | import android.widget.PopupWindow; 4 | 5 | public class ChoiceBookCategoryPop extends PopupWindow { 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/web/RepShareServer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.web; 2 | 3 | import com.monke.monkeybook.bean.ReplaceRuleBean; 4 | import com.monke.monkeybook.model.analyzeRule.assit.Assistant; 5 | 6 | import java.util.List; 7 | 8 | import fi.iki.elonen.NanoHTTPD; 9 | 10 | public class RepShareServer extends NanoHTTPD { 11 | 12 | private Callback callback; 13 | 14 | public RepShareServer(int port, Callback callback) { 15 | super(port); 16 | this.callback = callback; 17 | } 18 | 19 | @Override 20 | public Response serve(IHTTPSession session) { 21 | return newFixedLengthResponse(Assistant.toJson(callback.ReplaceRule())); 22 | } 23 | 24 | public interface Callback { 25 | List ReplaceRule(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/web/ShareServer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.web; 2 | 3 | import com.monke.monkeybook.bean.BookSourceBean; 4 | import com.monke.monkeybook.model.analyzeRule.assit.Assistant; 5 | 6 | import java.util.List; 7 | 8 | import fi.iki.elonen.NanoHTTPD; 9 | 10 | public class ShareServer extends NanoHTTPD { 11 | 12 | private Callback callback; 13 | 14 | public ShareServer(int port, Callback callback) { 15 | super(port); 16 | this.callback = callback; 17 | } 18 | 19 | @Override 20 | public Response serve(IHTTPSession session) { 21 | return newFixedLengthResponse(Assistant.toJson(callback.getSources())); 22 | } 23 | 24 | public interface Callback { 25 | List getSources(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/web/WebSocketServer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.web; 2 | 3 | import com.monke.monkeybook.web.controller.SourceDebugWebSocket; 4 | 5 | import java.io.IOException; 6 | 7 | import fi.iki.elonen.NanoWSD; 8 | import okhttp3.WebSocket; 9 | 10 | public class WebSocketServer extends NanoWSD { 11 | 12 | public WebSocketServer(int port) { 13 | super(port); 14 | } 15 | 16 | @Override 17 | protected WebSocket openWebSocket(IHTTPSession handshake) { 18 | if (handshake.getUri().equals("/sourceDebug")) { 19 | return new SourceDebugWebSocket(handshake); 20 | } 21 | return null; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/ChapterListDrawer.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.FrameLayout; 6 | 7 | import com.monke.monkeybook.utils.ScreenUtils; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.annotation.Nullable; 11 | 12 | public class ChapterListDrawer extends FrameLayout { 13 | 14 | private int mWidth; 15 | 16 | public ChapterListDrawer(@NonNull Context context, @Nullable AttributeSet attrs) { 17 | super(context, attrs); 18 | int screenWidth = getResources().getDisplayMetrics().widthPixels; 19 | if(isInEditMode()){ 20 | mWidth = screenWidth; 21 | }else { 22 | mWidth = screenWidth - ScreenUtils.dpToPx(48); 23 | } 24 | } 25 | 26 | 27 | @Override 28 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 29 | widthMeasureSpec = MeasureSpec.makeMeasureSpec(mWidth, MeasureSpec.EXACTLY); 30 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/CoverCardView.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget; 2 | 3 | import android.content.Context; 4 | import androidx.cardview.widget.CardView; 5 | import android.util.AttributeSet; 6 | 7 | public class CoverCardView extends CardView { 8 | 9 | 10 | 11 | public CoverCardView(Context context, AttributeSet attrs) { 12 | super(context, attrs); 13 | } 14 | 15 | @Override 16 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 17 | int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); 18 | int measuredHeight = measuredWidth * 7 / 5; 19 | super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY)); 20 | } 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/SquareCircleImageView.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import de.hdodenhof.circleimageview.CircleImageView; 7 | 8 | 9 | public class SquareCircleImageView extends CircleImageView { 10 | 11 | public SquareCircleImageView(Context context, AttributeSet attrs) { 12 | super(context, attrs); 13 | } 14 | 15 | @Override 16 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 17 | super.onMeasure(widthMeasureSpec, widthMeasureSpec); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/SquareRelativeLayout.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.RelativeLayout; 6 | 7 | public class SquareRelativeLayout extends RelativeLayout { 8 | 9 | public SquareRelativeLayout(Context context, AttributeSet attrs) { 10 | super(context, attrs); 11 | } 12 | 13 | @Override 14 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 15 | super.onMeasure(widthMeasureSpec, widthMeasureSpec); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/SquareTextView.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.annotation.Nullable; 8 | import androidx.appcompat.widget.AppCompatTextView; 9 | 10 | public class SquareTextView extends AppCompatTextView { 11 | public SquareTextView(@NonNull Context context) { 12 | super(context); 13 | } 14 | 15 | public SquareTextView(@NonNull Context context, @Nullable AttributeSet attrs) { 16 | super(context, attrs); 17 | } 18 | 19 | @Override 20 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 21 | super.onMeasure(widthMeasureSpec, widthMeasureSpec); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/explosion_field/OnAnimatorListener.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.explosion_field; 2 | 3 | import android.animation.Animator; 4 | import android.view.View; 5 | 6 | public interface OnAnimatorListener { 7 | void onAnimationEnd(Animator animator, View view); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/page/OnPageChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.page; 2 | 3 | import com.monke.monkeybook.bean.ChapterBean; 4 | 5 | import java.util.List; 6 | 7 | public interface OnPageChangeListener { 8 | /** 9 | * 作用:章节切换的时候进行回调 10 | * 11 | * @param chapterIndex:切换章节的序号 12 | */ 13 | void onChapterChange(int chapterIndex); 14 | 15 | /** 16 | * 作用:章节目录加载完成时候回调 17 | * 18 | * @param chapters:返回章节目录 19 | */ 20 | void onCategoryFinish(List chapters); 21 | 22 | /** 23 | * 作用:章节页码数量改变之后的回调。==> 字体大小的调整,或者是否关闭虚拟按钮功能都会改变页面的数量。 24 | */ 25 | void onPageCountChange(int count); 26 | 27 | /** 28 | * 作用:当页面改变的时候回调 29 | */ 30 | void onPageChange(int chapterIndex, int pageIndex, int pageSize); 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/page/PageMode.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.page; 2 | 3 | /** 4 | * Created by newbiechen on 2018/2/5. 5 | * 作用:翻页动画的模式 6 | */ 7 | 8 | public enum PageMode { 9 | COVER, SIMULATION, NONE, SLIDE, SCROLL 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/page/TxtPage.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.page; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by newbiechen on 17-7-1. 7 | */ 8 | 9 | class TxtPage { 10 | int position; 11 | String title; 12 | int titleLines; //当前 lines 中为 title 的行数。 13 | List lines; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/page/animation/Direction.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.page.animation; 2 | 3 | public enum Direction { 4 | NONE(true), NEXT(true), PREV(true), UP(false), DOWN(false); 5 | 6 | public final boolean isHorizontal; 7 | 8 | Direction(boolean isHorizontal) { 9 | this.isHorizontal = isHorizontal; 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/page/animation/NonePageAnim.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.page.animation; 2 | 3 | import android.graphics.Canvas; 4 | 5 | import com.monke.monkeybook.widget.page.PageMode; 6 | import com.monke.monkeybook.widget.page.PageView; 7 | 8 | /** 9 | * Created by newbiechen on 17-7-24. 10 | */ 11 | 12 | public class NonePageAnim extends HorizonPageAnim { 13 | 14 | public NonePageAnim(int w, int h, PageView view, OnPageChangeListener listener) { 15 | super(w, h, view, listener); 16 | } 17 | 18 | @Override 19 | public void drawMove(Canvas canvas) { 20 | canvas.drawBitmap(mCurBitmap, 0, 0, null); 21 | } 22 | 23 | @Override 24 | public void startAnim() { 25 | super.startAnim(); 26 | isRunning = false; 27 | } 28 | 29 | @Override 30 | public PageMode getPageMode() { 31 | return PageMode.NONE; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/refreshview/InfiniteScrollListener.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.refreshview; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | 6 | public abstract class InfiniteScrollListener extends RecyclerView.OnScrollListener { 7 | 8 | @Override 9 | public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { 10 | if (isSlideToBottom(recyclerView) && dy > dx && dy > 0) { 11 | onLoadMore(); 12 | } 13 | 14 | } 15 | 16 | public abstract void onLoadMore(); 17 | 18 | 19 | private static boolean isSlideToBottom(RecyclerView recyclerView) { 20 | return recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() 21 | >= recyclerView.computeVerticalScrollRange(); 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/refreshview/OnLoadMoreListener.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.refreshview; 2 | 3 | public interface OnLoadMoreListener { 4 | 5 | void startLoadMore(); 6 | 7 | void loadMoreErrorTryAgain(); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/monke/monkeybook/widget/refreshview/scroller/TopLinearSmoothScroller.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook.widget.refreshview.scroller; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.recyclerview.widget.LinearSmoothScroller; 6 | 7 | public class TopLinearSmoothScroller extends LinearSmoothScroller { 8 | public TopLinearSmoothScroller(Context context) { 9 | super(context); 10 | } 11 | 12 | @Override 13 | public int getVerticalSnapPreference() { 14 | return SNAP_TO_START; 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_alpha_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_alpha_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_bookshelf_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 16 | 17 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_bookshelf_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_dialog_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_dialog_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_checkaddshelf_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_checkaddshelf_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_top_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_top_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_windowlight_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_windowlight_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_windowslide_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_pop_windowslide_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_readbook_bottom_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_readbook_bottom_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_readbook_top_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_readbook_top_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_right_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/anim_right_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_change_source.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_chapter_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_radio_book_group.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/navigation_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/navigation_icon_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/selector_btn_file_add.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/selector_btn_file_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/selector_btn_read_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/bg_shadow_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-hdpi/bg_shadow_bottom.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/bg_shadow_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-hdpi/bg_shadow_top.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_directory_parent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-hdpi/ic_directory_parent.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_image_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-hdpi/ic_image_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_image_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-mdpi/ic_image_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/b4_space1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-xhdpi/b4_space1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/b4_space2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-xhdpi/b4_space2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/b4_space3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-xhdpi/b4_space3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_image_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-xhdpi/ic_image_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_image_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-xxhdpi/ic_image_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_image_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable-xxxhdpi/ic_image_placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_about_note.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_audio_chapter_pop.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_choice_book_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 11 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_gradient_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_list_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_popup_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_search_textfield_day.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_search_textfield_night.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_welcome_drawable_day.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_welcome_drawable_night.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fastscroll_track.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_about_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alarm_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_assignment_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_assignment_turned_in_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_audio_book_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_author_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_auto_page_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_auto_page_stop_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_book_added_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_book_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_book_last_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bookmark_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle_red_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clean_cache_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_all_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_code_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_copy_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_paste_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_day_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_forever_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_description_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_developer_board_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_down_manager_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_exchange_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder_open_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_forbid_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_line_spacing_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_list_bulleted_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_group_expander.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_history_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_image_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_insert_chart_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launch_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_books_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_link_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_list_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_local_cafe_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_horiz_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_network_check_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_network_check_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_night_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_night_border_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_open_in_browser_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_circle_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_picture_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_circle_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_qr_scan_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_restore_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_scoring_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_large_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_select_all_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_next_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_previous_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_source_manager_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_stop_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_subdirectory_arrow_left_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_subject_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_swap_vert_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_timer_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_timer_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_track_changes_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_translate_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_update_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_view_grid_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_view_list_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_up_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wifi_tethering_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wifi_tethering_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_cover_default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable/img_cover_default.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_cover_gs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/drawable/img_cover_gs.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/radius_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_pop_round_button_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_book_detail_read_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_book_detail_shelf_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_btn_accent.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_btn_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_history_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_radio_book_group.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_refresh_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_tv_first_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_audio_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_circle_accent.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_circle_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_circle_image_tp.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_circle_image_tp_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_choice_book_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_corner_accent.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_corner_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_large_space_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_pop_checkaddshelf_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_progress_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_round_rect.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_round_rect_disable.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_round_rect_press.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_small_space_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_space_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_style_rect_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_unclick.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_big_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_read_comic_book.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_design_container.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_large_text.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_number_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_book_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_bookmark_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_choice_book.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_file_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_main_book_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_choice_book_category.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_find_book_preview_more.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_home_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_search_history.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/pop_choice_book_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/switch_item_night_theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_book_content_scroll.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_book_content_swipe.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_navigation_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_recently_viewed.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_recycler_font.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_refresh_load_more.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_searchbook_no_data.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_toast.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_audio_play_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_book_download.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_book_import.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_book_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_book_shelf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_choice_book_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_debug_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_read_style_activity.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_search_activity.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | 10 | 14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_search_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_text_selection_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_webview_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 11 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/raw/silent_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/app/src/main/res/raw/silent_sound.mp3 -------------------------------------------------------------------------------- /app/src/main/res/values-night/drawables.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @drawable/bg_welcome_drawable_night 5 | @drawable/bg_search_textfield_night 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/drawables.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @drawable/bg_welcome_drawable_day 5 | 6 | @drawable/bg_search_textfield_day 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 400 4 | 5 | 600 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/test/java/com/monke/monkeybook/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.monke.monkeybook; 2 | 3 | import org.junit.Test; 4 | import static org.junit.Assert.*; 5 | 6 | /** 7 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 8 | */ 9 | public class ExampleUnitTest { 10 | @Test 11 | public void addition_isCorrect() throws Exception { 12 | assertEquals(4, 2 + 2); 13 | } 14 | } -------------------------------------------------------------------------------- /app/version.properties: -------------------------------------------------------------------------------- 1 | #Mon Sep 13 13:09:30 CST 2021 2 | VERSION_CODE=3475 3 | -------------------------------------------------------------------------------- /basemvplib/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /basemvplib/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\CodeTool\Android\Android_SDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} -------------------------------------------------------------------------------- /basemvplib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/BaseApplication.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib; 2 | 3 | import android.app.Application; 4 | 5 | public class BaseApplication extends Application{ 6 | @Override 7 | public void onCreate() { 8 | super.onCreate(); 9 | } 10 | } -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/BasePresenterImpl.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib; 2 | 3 | import androidx.annotation.CallSuper; 4 | import androidx.annotation.NonNull; 5 | 6 | import com.monke.basemvplib.impl.IPresenter; 7 | import com.monke.basemvplib.impl.IView; 8 | import com.monke.basemvplib.rxjava.RxExecutors; 9 | 10 | public abstract class BasePresenterImpl implements IPresenter { 11 | 12 | protected T mView; 13 | 14 | @SuppressWarnings(value = "unchecked") 15 | @Override 16 | public void attachView(@NonNull IView iView) { 17 | mView = (T) iView; 18 | } 19 | 20 | 21 | @CallSuper 22 | @Override 23 | public void detachView() { 24 | RxExecutors.setDefault(null); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/CookieStore.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib; 2 | 3 | public interface CookieStore { 4 | void setCookie(String url, String cookie); 5 | 6 | void replaceCookie(String url, String cookie); 7 | 8 | String getCookie(String url); 9 | 10 | void removeCookie(String url); 11 | 12 | void clearCookies(); 13 | } 14 | -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/RequestMethod.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib; 2 | 3 | public enum RequestMethod { 4 | GET, POST, DEFAULT 5 | } -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/RetryInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib; 2 | 3 | import java.io.IOException; 4 | 5 | import okhttp3.Interceptor; 6 | import okhttp3.Request; 7 | import okhttp3.Response; 8 | 9 | public class RetryInterceptor implements Interceptor { 10 | private int maxRetry;//最大重试次数 11 | private int retryNum = 0;//假如设置为3次重试的话,则最大可能请求4次(默认1次+3次重试) 12 | 13 | RetryInterceptor(int maxRetry) { 14 | this.maxRetry = maxRetry; 15 | } 16 | 17 | @Override 18 | public Response intercept(Chain chain) throws IOException { 19 | Request request = chain.request(); 20 | Response response = chain.proceed(request); 21 | while (!response.isSuccessful() && retryNum < maxRetry) { 22 | retryNum++; 23 | response = chain.proceed(request); 24 | } 25 | return response; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/impl/IPresenter.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib.impl; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | public interface IPresenter { 6 | /** 7 | * 注入View,使之能够与View相互响应 8 | */ 9 | void attachView(@NonNull IView iView); 10 | 11 | /** 12 | * 释放资源,如果使用了网络请求 可以在此执行IModel.cancelRequest() 13 | */ 14 | void detachView(); 15 | } 16 | -------------------------------------------------------------------------------- /basemvplib/src/main/java/com/monke/basemvplib/impl/IView.java: -------------------------------------------------------------------------------- 1 | package com.monke.basemvplib.impl; 2 | 3 | import android.content.Context; 4 | 5 | public interface IView { 6 | Context getContext(); 7 | } 8 | -------------------------------------------------------------------------------- /basemvplib/src/main/java/compat/Supplier.java: -------------------------------------------------------------------------------- 1 | package compat; 2 | 3 | public interface Supplier { 4 | 5 | /** 6 | * Gets a result. 7 | * 8 | * @return a result 9 | */ 10 | T get(); 11 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | compile_sdk_version = 28 3 | min_sdk_version = 21 4 | target_sdk_version = 27 5 | support_library_version = '28.0.0' 6 | } 7 | 8 | buildscript { 9 | repositories { 10 | jcenter() 11 | google() 12 | mavenCentral() 13 | } 14 | dependencies { 15 | classpath 'com.android.tools.build:gradle:3.6.2' 16 | classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' 17 | } 18 | } 19 | 20 | allprojects { 21 | repositories { 22 | flatDir { 23 | dirs 'libs' 24 | } 25 | 26 | jcenter() 27 | google() 28 | mavenCentral() 29 | maven { url "https://jitpack.io" } 30 | maven { url 'https://maven.google.com/' } 31 | maven { url 'https://github.com/psiegman/mvn-repo/raw/master/releases' } 32 | } 33 | } 34 | 35 | task clean(type: Delete) { 36 | delete rootProject.buildDir 37 | } 38 | -------------------------------------------------------------------------------- /docs/disclaimer.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/docs/disclaimer.html -------------------------------------------------------------------------------- /docs/disclaimer.md: -------------------------------------------------------------------------------- 1 | # 免责声明(Disclaimer) 2 | * 阅读是一款提供网络文学搜索的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。 3 | * 当您搜索一本书的时,阅读会将该书的书名以关键词的形式提交到各个第三方网络文学网站。各第三方网站返回的内容与阅读无关,阅读对其概不负责,亦不承担任何法律责任。任何通过使用阅读而链接到的第三方网页均系他人制作或提供,您可能从第三方网页上获得其他服务,阅读对其合法性概不负责,亦不承担任何法律责任。第三方搜索引擎结果根据您提交的书名自动搜索获得并提供试读,不代表阅读赞成或被搜索链接到的第三方网页上的内容或立场。您应该对使用搜索引擎的结果自行承担风险。 4 | * 阅读不做任何形式的保证:不保证第三方搜索引擎的搜索结果满足您的要求,不保证搜索服务不中断,不保证搜索结果的安全性、正确性、及时性、合法性。因网络状况、通讯线路、第三方网站等任何原因而导致您不能正常使用阅读,阅读不承担任何法律责任。阅读尊重并保护所有使用阅读用户的个人隐私权,您注册的用户名、电子邮件地址等个人资料,非经您亲自许可或根据相关法律、法规的强制性规定,阅读不会主动地泄露给第三方。 5 | * 阅读致力于最大程度地减少网络文学阅读者在自行搜寻过程中的无意义的时间浪费,通过专业搜索展示不同网站中网络文学的最新章节。阅读在为广大小说爱好者提供方便、快捷舒适的试读体验的同时,也使优秀网络文学得以迅速、更广泛的传播,从而达到了在一定程度促进网络文学充分繁荣发展之目的。阅读鼓励广大小说爱好者通过阅读发现优秀网络小说及其提供商,并建议阅读正版图书。任何单位或个人认为通过阅读搜索链接到的第三方网页内容可能涉嫌侵犯其信息网络传播权,应该及时向阅读提出书面权力通知,并提供身份证明、权属证明及详细侵权情况证明。阅读在收到上述法律文件后,将会依法尽快断开相关链接内容。 -------------------------------------------------------------------------------- /docs/image/mybookshelf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/docs/image/mybookshelf.jpg -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 阅读 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # 阅读 2 | - 阅读是一款提供网络文学搜索的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。 3 | - 自定义书源,一切尽有可能。 4 | 5 | ### Blog 6 | - http://www.hostfans.cn/ 7 | 8 | ### 书源制作说明 9 | - https://gedoor.github.io/MyBookshelf/sourcerule.html 10 | 11 | ### 下载最新版本 12 | - https://github.com/gedoor/MyBookshelf/releases/latest 13 | 14 | ### 免责声明 15 | - https://gedoor.github.io/MyBookshelf/disclaimer.html 16 | 17 | ### 软件截图 18 | ![image](https://gedoor.github.io/MyBookshelf/image/mybook1.jpg) 19 | ![image](https://gedoor.github.io/MyBookshelf/image/mybook2.jpg) 20 | ![image](https://gedoor.github.io/MyBookshelf/image/mybook3.jpg) 21 | ![image](https://gedoor.github.io/MyBookshelf/image/mybook4.jpg) 22 | -------------------------------------------------------------------------------- /docs/qqskrwm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/docs/qqskrwm.jpg -------------------------------------------------------------------------------- /docs/sourcerule.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 书源规则说明 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /docs/wxskrwm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/docs/wxskrwm.jpg -------------------------------------------------------------------------------- /docs/zfbhbrwm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/docs/zfbhbrwm.png -------------------------------------------------------------------------------- /docs/zfbskrwm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/docs/zfbskrwm.jpg -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## Project-wide Gradle settings. 2 | # 3 | # For more details on how to configure your build environment visit 4 | # http://www.gradle.org/docs/current/userguide/build_environment.html 5 | # 6 | # Specifies the JVM arguments used for the daemon checkExist. 7 | # The setting is particularly useful for tweaking memory settings. 8 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 9 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 10 | # 11 | # When configured, Gradle will run in incubating parallel mode. 12 | # This option should only be used with decoupled projects. More details, visit 13 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 14 | # org.gradle.parallel=true 15 | #Wed Dec 06 11:41:10 CST 2017 16 | #org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 17 | android.enableD8 = true 18 | android.useAndroidX=true 19 | android.enableJetifier=true 20 | android.debug.obsoleteApi = true 21 | android.injected.testOnly=false 22 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Invinciblelee/HaoReader/aa821845230d30b46bef480269fd7776d057abb8/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Apr 12 13:20:57 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip 7 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':basemvplib' 2 | --------------------------------------------------------------------------------