Showing preview only (3,517K chars total). Download the full file or copy to clipboard to get everything.
Repository: gedoor/MyBookshelf
Branch: master
Commit: bb5a99058f38
Files: 732
Total size: 3.2 MB
Directory structure:
gitextract_l4utlapa/
├── .gitignore
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── ReadMe.md
│ ├── build.gradle
│ ├── gradle.properties
│ ├── key.properties.jks
│ ├── proguard-rules.pro
│ └── src/
│ ├── debug/
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── assets/
│ │ │ ├── 18PlusList.txt
│ │ │ ├── data/
│ │ │ │ └── BookSourceXxl.json
│ │ │ ├── disclaimer.md
│ │ │ ├── txtChapterRule.json
│ │ │ ├── updateLog.md
│ │ │ └── web/
│ │ │ ├── bookshelf.css
│ │ │ ├── bookshelf.html
│ │ │ ├── bookshelf.js
│ │ │ ├── index.css
│ │ │ ├── index.html
│ │ │ └── index.js
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── kunfei/
│ │ │ └── bookshelf/
│ │ │ ├── DbHelper.java
│ │ │ ├── MApplication.java
│ │ │ ├── base/
│ │ │ │ ├── BaseDialogFragment.kt
│ │ │ │ ├── BaseFragment.kt
│ │ │ │ ├── BaseModelImpl.java
│ │ │ │ ├── BaseService.kt
│ │ │ │ ├── BaseTabActivity.java
│ │ │ │ ├── BaseViewModel.kt
│ │ │ │ ├── MBaseActivity.java
│ │ │ │ ├── MBaseFragment.java
│ │ │ │ ├── README.md
│ │ │ │ ├── VMBaseFragment.kt
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── DiffRecyclerAdapter.kt
│ │ │ │ │ ├── ItemAnimation.kt
│ │ │ │ │ ├── ItemViewHolder.kt
│ │ │ │ │ ├── RecyclerAdapter.kt
│ │ │ │ │ └── animations/
│ │ │ │ │ ├── AlphaInAnimation.kt
│ │ │ │ │ ├── BaseAnimation.kt
│ │ │ │ │ ├── ScaleInAnimation.kt
│ │ │ │ │ ├── SlideInBottomAnimation.kt
│ │ │ │ │ ├── SlideInLeftAnimation.kt
│ │ │ │ │ └── SlideInRightAnimation.kt
│ │ │ │ └── observer/
│ │ │ │ ├── MyObserver.java
│ │ │ │ └── MySingleObserver.java
│ │ │ ├── bean/
│ │ │ │ ├── BaseBookBean.java
│ │ │ │ ├── BaseChapterBean.java
│ │ │ │ ├── BookChapterBean.java
│ │ │ │ ├── BookContentBean.java
│ │ │ │ ├── BookInfoBean.java
│ │ │ │ ├── BookKindBean.java
│ │ │ │ ├── BookShelfBean.java
│ │ │ │ ├── BookSource3Bean.java
│ │ │ │ ├── BookSourceBean.java
│ │ │ │ ├── BookmarkBean.java
│ │ │ │ ├── CookieBean.java
│ │ │ │ ├── DownloadBookBean.java
│ │ │ │ ├── DownloadChapterBean.java
│ │ │ │ ├── FindKindBean.java
│ │ │ │ ├── FindKindGroupBean.java
│ │ │ │ ├── LocBookShelfBean.java
│ │ │ │ ├── OpenChapterBean.java
│ │ │ │ ├── ReplaceRuleBean.java
│ │ │ │ ├── SearchBookBean.java
│ │ │ │ ├── SearchHistoryBean.java
│ │ │ │ ├── TwoDataBean.java
│ │ │ │ ├── TxtChapterRuleBean.java
│ │ │ │ ├── UpdateInfoBean.java
│ │ │ │ └── WebChapterBean.java
│ │ │ ├── constant/
│ │ │ │ ├── AppConst.kt
│ │ │ │ ├── AppConstant.java
│ │ │ │ ├── BookType.java
│ │ │ │ ├── RxBusTag.java
│ │ │ │ └── TimeConstants.java
│ │ │ ├── help/
│ │ │ │ ├── AppFrontBackHelper.java
│ │ │ │ ├── BlurTransformation.java
│ │ │ │ ├── BookshelfHelp.java
│ │ │ │ ├── ChangeSourceHelp.java
│ │ │ │ ├── ChapterContentHelp.java
│ │ │ │ ├── CrashHandler.java
│ │ │ │ ├── DefaultValueHelper.kt
│ │ │ │ ├── DocumentHelper.java
│ │ │ │ ├── Donate.java
│ │ │ │ ├── EncodeConverter.java
│ │ │ │ ├── ExoPlayerHelper.kt
│ │ │ │ ├── FileHelp.java
│ │ │ │ ├── IntentData.kt
│ │ │ │ ├── ItemTouchCallback.java
│ │ │ │ ├── JsExtensions.java
│ │ │ │ ├── LauncherIcon.java
│ │ │ │ ├── MediaManager.java
│ │ │ │ ├── ProcessTextHelp.java
│ │ │ │ ├── ReadBookControl.java
│ │ │ │ ├── SSLSocketClient.java
│ │ │ │ ├── SourceHelp.kt
│ │ │ │ ├── UTF8BOMFighter.java
│ │ │ │ ├── UpdateManager.java
│ │ │ │ ├── coroutine/
│ │ │ │ │ ├── CompositeCoroutine.kt
│ │ │ │ │ ├── Coroutine.kt
│ │ │ │ │ └── CoroutineContainer.kt
│ │ │ │ ├── glide/
│ │ │ │ │ ├── ImageLoader.kt
│ │ │ │ │ ├── OkHttpGlideModule.kt
│ │ │ │ │ ├── OkHttpModeLoaderFactory.kt
│ │ │ │ │ ├── OkHttpModelLoader.kt
│ │ │ │ │ └── OkHttpStreamFetcher.kt
│ │ │ │ ├── media/
│ │ │ │ │ ├── LoaderCreator.java
│ │ │ │ │ ├── LocalFileLoader.java
│ │ │ │ │ └── MediaStoreHelper.java
│ │ │ │ ├── permission/
│ │ │ │ │ ├── ActivitySource.kt
│ │ │ │ │ ├── FragmentSource.kt
│ │ │ │ │ ├── OnPermissionsDeniedCallback.kt
│ │ │ │ │ ├── OnPermissionsGrantedCallback.kt
│ │ │ │ │ ├── OnPermissionsResultCallback.kt
│ │ │ │ │ ├── OnRequestPermissionsResultCallback.kt
│ │ │ │ │ ├── PermissionActivity.kt
│ │ │ │ │ ├── Permissions.kt
│ │ │ │ │ ├── PermissionsCompat.kt
│ │ │ │ │ ├── Request.kt
│ │ │ │ │ ├── RequestManager.kt
│ │ │ │ │ ├── RequestPlugins.kt
│ │ │ │ │ └── RequestSource.kt
│ │ │ │ └── storage/
│ │ │ │ ├── Backup.kt
│ │ │ │ ├── BackupRestoreUi.kt
│ │ │ │ ├── Preferences.kt
│ │ │ │ ├── Restore.kt
│ │ │ │ └── WebDavHelp.kt
│ │ │ ├── model/
│ │ │ │ ├── BookSourceManager.java
│ │ │ │ ├── Exceptions.kt
│ │ │ │ ├── ImportBookModel.java
│ │ │ │ ├── ReplaceRuleManager.java
│ │ │ │ ├── SavedSource.java
│ │ │ │ ├── SearchBookModel.java
│ │ │ │ ├── TxtChapterRuleManager.java
│ │ │ │ ├── UpLastChapterModel.java
│ │ │ │ ├── WebBookModel.java
│ │ │ │ ├── analyzeRule/
│ │ │ │ │ ├── AnalyzeByJSonPath.java
│ │ │ │ │ ├── AnalyzeByJSoup.java
│ │ │ │ │ ├── AnalyzeByRegex.java
│ │ │ │ │ ├── AnalyzeByXPath.java
│ │ │ │ │ ├── AnalyzeHeaders.java
│ │ │ │ │ ├── AnalyzeRule.java
│ │ │ │ │ └── AnalyzeUrl.java
│ │ │ │ ├── content/
│ │ │ │ │ ├── BookChapterList.java
│ │ │ │ │ ├── BookContent.java
│ │ │ │ │ ├── BookInfo.java
│ │ │ │ │ ├── BookList.java
│ │ │ │ │ ├── Debug.java
│ │ │ │ │ ├── VipThrowable.java
│ │ │ │ │ └── WebBook.java
│ │ │ │ ├── impl/
│ │ │ │ │ ├── IDownloadTask.java
│ │ │ │ │ ├── IHttpGetApi.java
│ │ │ │ │ └── IHttpPostApi.java
│ │ │ │ └── task/
│ │ │ │ ├── AnalyzeNextUrlTask.java
│ │ │ │ ├── CheckSourceTask.java
│ │ │ │ └── DownloadTaskImpl.java
│ │ │ ├── presenter/
│ │ │ │ ├── BookDetailPresenter.java
│ │ │ │ ├── BookListPresenter.java
│ │ │ │ ├── BookSourcePresenter.java
│ │ │ │ ├── ChoiceBookPresenter.java
│ │ │ │ ├── FindBookPresenter.java
│ │ │ │ ├── ImportBookPresenter.java
│ │ │ │ ├── MainPresenter.java
│ │ │ │ ├── ReadBookPresenter.java
│ │ │ │ ├── ReplaceRulePresenter.java
│ │ │ │ ├── SearchBookPresenter.java
│ │ │ │ ├── SourceEditPresenter.java
│ │ │ │ ├── TxtChapterRulePresenter.java
│ │ │ │ └── contract/
│ │ │ │ ├── BookDetailContract.java
│ │ │ │ ├── BookListContract.java
│ │ │ │ ├── BookSourceContract.java
│ │ │ │ ├── ChoiceBookContract.java
│ │ │ │ ├── FindBookContract.java
│ │ │ │ ├── ImportBookContract.java
│ │ │ │ ├── MainContract.java
│ │ │ │ ├── ReadBookContract.java
│ │ │ │ ├── ReplaceRuleContract.java
│ │ │ │ ├── SearchBookContract.java
│ │ │ │ ├── SourceEditContract.java
│ │ │ │ └── TxtChapterRuleContract.java
│ │ │ ├── service/
│ │ │ │ ├── CheckSourceService.java
│ │ │ │ ├── DownloadService.java
│ │ │ │ ├── MediaButtonIntentReceiver.java
│ │ │ │ ├── ReadAloudService.java
│ │ │ │ ├── ShareService.java
│ │ │ │ └── WebService.java
│ │ │ ├── utils/
│ │ │ │ ├── ACache.java
│ │ │ │ ├── ActivityExtensions.kt
│ │ │ │ ├── BatteryUtil.java
│ │ │ │ ├── BitmapUtil.java
│ │ │ │ ├── ColorUtils.kt
│ │ │ │ ├── ContextExtensions.kt
│ │ │ │ ├── ConvertUtils.kt
│ │ │ │ ├── DensityUtil.java
│ │ │ │ ├── DialogExtensions.kt
│ │ │ │ ├── DocumentExtensions.kt
│ │ │ │ ├── DocumentUtil.java
│ │ │ │ ├── DrawableUtil.kt
│ │ │ │ ├── EncoderUtils.kt
│ │ │ │ ├── EncodingDetect.java
│ │ │ │ ├── FastXmlSerializer.java
│ │ │ │ ├── FileStack.java
│ │ │ │ ├── FileUtils.kt
│ │ │ │ ├── FloatExtensions.kt
│ │ │ │ ├── GsonExtensions.kt
│ │ │ │ ├── GsonUtils.java
│ │ │ │ ├── HandlerUtils.kt
│ │ │ │ ├── IOUtils.java
│ │ │ │ ├── IntentExtensions.kt
│ │ │ │ ├── ListUtil.java
│ │ │ │ ├── MD5Utils.java
│ │ │ │ ├── MarkdownUtils.java
│ │ │ │ ├── MeUtils.java
│ │ │ │ ├── NetworkUtils.java
│ │ │ │ ├── ReadAssets.java
│ │ │ │ ├── RealPathUtil.kt
│ │ │ │ ├── RxUtils.java
│ │ │ │ ├── ScreenUtils.java
│ │ │ │ ├── Selector.java
│ │ │ │ ├── SoftInputUtil.java
│ │ │ │ ├── StringExtensions.kt
│ │ │ │ ├── StringJoiner.java
│ │ │ │ ├── StringUtils.java
│ │ │ │ ├── SystemUtil.java
│ │ │ │ ├── TimeUtils.java
│ │ │ │ ├── Toasts.kt
│ │ │ │ ├── UriExtensions.kt
│ │ │ │ ├── UrlEncoderUtils.java
│ │ │ │ ├── XmlUtils.java
│ │ │ │ ├── ZipUtils.java
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── AlertBuilder.kt
│ │ │ │ │ ├── AndroidAlertBuilder.kt
│ │ │ │ │ ├── AndroidDialogs.kt
│ │ │ │ │ ├── AndroidSelectors.kt
│ │ │ │ │ └── SelectItem.kt
│ │ │ │ ├── download/
│ │ │ │ │ ├── DownloadUtils.java
│ │ │ │ │ ├── JsDownloadInterceptor.java
│ │ │ │ │ ├── JsDownloadListener.java
│ │ │ │ │ ├── JsResponseBody.java
│ │ │ │ │ └── Service.java
│ │ │ │ ├── theme/
│ │ │ │ │ ├── ATH.java
│ │ │ │ │ ├── ATHUtil.java
│ │ │ │ │ ├── MaterialValueHelper.java
│ │ │ │ │ ├── MaterialValueHelper.kt
│ │ │ │ │ ├── NavigationViewUtil.java
│ │ │ │ │ ├── ThemeStore.java
│ │ │ │ │ ├── ThemeStoreInterface.java
│ │ │ │ │ ├── ThemeStorePrefKeys.java
│ │ │ │ │ ├── TintHelper.java
│ │ │ │ │ └── ViewUtil.java
│ │ │ │ ├── viewbindingdelegate/
│ │ │ │ │ ├── ActivityViewBindings.kt
│ │ │ │ │ ├── FragmentViewBindings.kt
│ │ │ │ │ └── ViewBindingProperty.kt
│ │ │ │ └── webdav/
│ │ │ │ ├── README.md
│ │ │ │ ├── WebDav.kt
│ │ │ │ └── http/
│ │ │ │ ├── Handler.kt
│ │ │ │ └── HttpAuth.kt
│ │ │ ├── view/
│ │ │ │ ├── activity/
│ │ │ │ │ ├── AboutActivity.java
│ │ │ │ │ ├── BookCoverEditActivity.java
│ │ │ │ │ ├── BookDetailActivity.java
│ │ │ │ │ ├── BookInfoEditActivity.java
│ │ │ │ │ ├── BookSourceActivity.java
│ │ │ │ │ ├── ChapterListActivity.java
│ │ │ │ │ ├── ChoiceBookActivity.java
│ │ │ │ │ ├── DonateActivity.java
│ │ │ │ │ ├── DownloadActivity.java
│ │ │ │ │ ├── ImportBookActivity.java
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ ├── QRCodeScanActivity.java
│ │ │ │ │ ├── ReadBookActivity.java
│ │ │ │ │ ├── ReadStyleActivity.java
│ │ │ │ │ ├── ReceivingSharedActivity.java
│ │ │ │ │ ├── ReplaceRuleActivity.java
│ │ │ │ │ ├── SearchBookActivity.java
│ │ │ │ │ ├── SettingActivity.java
│ │ │ │ │ ├── SourceDebugActivity.java
│ │ │ │ │ ├── SourceEditActivity.java
│ │ │ │ │ ├── SourceLoginActivity.java
│ │ │ │ │ ├── ThemeSettingActivity.java
│ │ │ │ │ ├── TxtChapterRuleActivity.java
│ │ │ │ │ ├── WebViewActivity.kt
│ │ │ │ │ ├── WelcomeActivity.java
│ │ │ │ │ └── WelcomeBookActivity.java
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── BookShelfAdapter.java
│ │ │ │ │ ├── BookShelfGridAdapter.java
│ │ │ │ │ ├── BookShelfListAdapter.java
│ │ │ │ │ ├── BookSourceAdapter.java
│ │ │ │ │ ├── BookmarkAdapter.java
│ │ │ │ │ ├── ChangeSourceAdapter.java
│ │ │ │ │ ├── ChapterListAdapter.java
│ │ │ │ │ ├── ChoiceBookAdapter.java
│ │ │ │ │ ├── DownloadAdapter.java
│ │ │ │ │ ├── FileSystemAdapter.java
│ │ │ │ │ ├── FindKindAdapter.java
│ │ │ │ │ ├── FindLeftAdapter.java
│ │ │ │ │ ├── FindRightAdapter.java
│ │ │ │ │ ├── ReplaceRuleAdapter.java
│ │ │ │ │ ├── SearchBookAdapter.java
│ │ │ │ │ ├── SearchBookshelfAdapter.java
│ │ │ │ │ ├── SourceDebugAdapter.java
│ │ │ │ │ ├── SourceEditAdapter.java
│ │ │ │ │ ├── TxtChapterRuleAdapter.java
│ │ │ │ │ ├── base/
│ │ │ │ │ │ ├── BaseListAdapter.java
│ │ │ │ │ │ ├── BaseViewHolder.java
│ │ │ │ │ │ ├── IViewHolder.java
│ │ │ │ │ │ ├── OnItemClickListenerTwo.java
│ │ │ │ │ │ └── ViewHolderImpl.java
│ │ │ │ │ └── view/
│ │ │ │ │ └── FileHolder.java
│ │ │ │ ├── dialog/
│ │ │ │ │ └── SourceLoginDialog.kt
│ │ │ │ ├── fragment/
│ │ │ │ │ ├── BaseFileFragment.java
│ │ │ │ │ ├── BookListFragment.java
│ │ │ │ │ ├── BookmarkFragment.java
│ │ │ │ │ ├── ChapterListFragment.java
│ │ │ │ │ ├── FileCategoryFragment.java
│ │ │ │ │ ├── FindBookFragment.java
│ │ │ │ │ ├── LocalBookFragment.java
│ │ │ │ │ ├── SettingsFragment.kt
│ │ │ │ │ ├── ThemeSettingsFragment.java
│ │ │ │ │ └── WebDavSettingsFragment.java
│ │ │ │ └── popupwindow/
│ │ │ │ ├── CheckAddShelfPop.java
│ │ │ │ ├── KeyboardToolPop.kt
│ │ │ │ ├── MediaPlayerPop.java
│ │ │ │ ├── MoreSettingPop.kt
│ │ │ │ ├── ReadAdjustMarginPop.kt
│ │ │ │ ├── ReadAdjustPop.java
│ │ │ │ ├── ReadBottomMenu.java
│ │ │ │ ├── ReadInterfacePop.kt
│ │ │ │ └── ReadLongPressPop.java
│ │ │ ├── web/
│ │ │ │ ├── HttpServer.java
│ │ │ │ ├── ShareServer.java
│ │ │ │ ├── WebSocketServer.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── BookshelfController.java
│ │ │ │ │ ├── SourceController.java
│ │ │ │ │ └── SourceDebugWebSocket.java
│ │ │ │ └── utils/
│ │ │ │ ├── AssetsWeb.java
│ │ │ │ └── ReturnData.java
│ │ │ └── widget/
│ │ │ ├── BadgeView.java
│ │ │ ├── HorizontalListView.java
│ │ │ ├── RotateLoading.java
│ │ │ ├── ScrollTextView.java
│ │ │ ├── check_box/
│ │ │ │ └── SmoothCheckBox.java
│ │ │ ├── explosion_field/
│ │ │ │ ├── ExplosionAnimator.java
│ │ │ │ ├── ExplosionField.java
│ │ │ │ ├── OnAnimatorListener.java
│ │ │ │ └── Utils.java
│ │ │ ├── filepicker/
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── FileAdapter.java
│ │ │ │ │ └── PathAdapter.java
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── StateBaseDrawable.java
│ │ │ │ │ └── StateColorDrawable.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── FileItem.java
│ │ │ │ │ └── JavaBean.java
│ │ │ │ ├── icons/
│ │ │ │ │ └── FilePickerIcon.java
│ │ │ │ ├── picker/
│ │ │ │ │ └── FilePicker.java
│ │ │ │ ├── popup/
│ │ │ │ │ ├── BasicPopup.java
│ │ │ │ │ └── ConfirmPopup.java
│ │ │ │ └── util/
│ │ │ │ ├── ConvertUtils.java
│ │ │ │ ├── DateUtils.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── ScreenUtils.java
│ │ │ │ └── StorageUtils.java
│ │ │ ├── font/
│ │ │ │ ├── FontAdapter.java
│ │ │ │ └── FontSelector.java
│ │ │ ├── image/
│ │ │ │ ├── CoverImageView.kt
│ │ │ │ └── FilletImageView.java
│ │ │ ├── itemdecoration/
│ │ │ │ ├── DividerGridItemDecoration.java
│ │ │ │ └── DividerItemDecoration.java
│ │ │ ├── modialog/
│ │ │ │ ├── BaseDialog.java
│ │ │ │ ├── BookmarkDialog.java
│ │ │ │ ├── ChangeSourceDialog.java
│ │ │ │ ├── DownLoadDialog.java
│ │ │ │ ├── InputDialog.java
│ │ │ │ ├── MoDialogHUD.java
│ │ │ │ ├── MoDialogView.java
│ │ │ │ ├── PageKeyDialog.kt
│ │ │ │ ├── ReplaceRuleDialog.java
│ │ │ │ └── TxtChapterRuleDialog.java
│ │ │ ├── number/
│ │ │ │ ├── NumberButton.java
│ │ │ │ ├── NumberPickerDialog.java
│ │ │ │ └── NumberPickerPreference.java
│ │ │ ├── page/
│ │ │ │ ├── ChapterProvider.java
│ │ │ │ ├── PageLoader.java
│ │ │ │ ├── PageLoaderEpub.java
│ │ │ │ ├── PageLoaderNet.java
│ │ │ │ ├── PageLoaderText.java
│ │ │ │ ├── PageView.java
│ │ │ │ ├── TxtChapter.kt
│ │ │ │ ├── TxtChar.kt
│ │ │ │ ├── TxtLine.kt
│ │ │ │ ├── TxtPage.kt
│ │ │ │ └── animation/
│ │ │ │ ├── CoverPageAnim.java
│ │ │ │ ├── HorizonPageAnim.java
│ │ │ │ ├── NonePageAnim.java
│ │ │ │ ├── PageAnimation.java
│ │ │ │ ├── ScrollPageAnim.java
│ │ │ │ ├── SimulationPageAnim.java
│ │ │ │ └── SlidePageAnim.java
│ │ │ ├── prefs/
│ │ │ │ ├── ATEPreferenceCategory.java
│ │ │ │ ├── ATESwitchPreference.java
│ │ │ │ └── IconListPreference.java
│ │ │ ├── recycler/
│ │ │ │ ├── expandable/
│ │ │ │ │ ├── BaseExpandAbleViewHolder.java
│ │ │ │ │ ├── BaseExpandableRecyclerAdapter.java
│ │ │ │ │ ├── OnRecyclerViewListener.java
│ │ │ │ │ └── bean/
│ │ │ │ │ ├── BaseItem.java
│ │ │ │ │ ├── GroupItem.java
│ │ │ │ │ └── RecyclerViewData.java
│ │ │ │ ├── refresh/
│ │ │ │ │ ├── BaseRefreshListener.java
│ │ │ │ │ ├── OnLoadMoreListener.java
│ │ │ │ │ ├── OnRefreshWithProgressListener.java
│ │ │ │ │ ├── RefreshLayout.java
│ │ │ │ │ ├── RefreshProgressBar.java
│ │ │ │ │ ├── RefreshRecyclerView.java
│ │ │ │ │ ├── RefreshRecyclerViewAdapter.java
│ │ │ │ │ └── RefreshScrollView.java
│ │ │ │ ├── scroller/
│ │ │ │ │ ├── FastScrollRecyclerView.java
│ │ │ │ │ ├── FastScrollStateChangeListener.java
│ │ │ │ │ └── FastScroller.java
│ │ │ │ └── sectioned/
│ │ │ │ ├── GridSpacingItemDecoration.java
│ │ │ │ ├── SectionedRecyclerViewAdapter.java
│ │ │ │ └── SectionedSpanSizeLookup.java
│ │ │ ├── seekbar/
│ │ │ │ ├── VerticalSeekBar.kt
│ │ │ │ └── VerticalSeekBarWrapper.kt
│ │ │ └── views/
│ │ │ ├── ATEAccentBgTextView.java
│ │ │ ├── ATEAccentStrokeTextView.java
│ │ │ ├── ATEAutoCompleteTextView.java
│ │ │ ├── ATECheckBox.java
│ │ │ ├── ATEEditText.java
│ │ │ ├── ATEPrimaryTextView.java
│ │ │ ├── ATEProgressBar.java
│ │ │ ├── ATERadioButton.java
│ │ │ ├── ATERadioNoButton.java
│ │ │ ├── ATESecondaryTextView.java
│ │ │ ├── ATESeekBar.java
│ │ │ ├── ATEStockSwitch.java
│ │ │ ├── ATEStrokeTextView.java
│ │ │ ├── ATESwitch.java
│ │ │ └── ATETextInputLayout.java
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── anim_none.xml
│ │ │ ├── anim_readbook_bottom_in.xml
│ │ │ ├── anim_readbook_bottom_out.xml
│ │ │ ├── anim_readbook_top_in.xml
│ │ │ ├── anim_readbook_top_out.xml
│ │ │ ├── moprogress_bottom_in.xml
│ │ │ ├── moprogress_bottom_out.xml
│ │ │ ├── moprogress_in.xml
│ │ │ ├── moprogress_in_bottom_right.xml
│ │ │ ├── moprogress_in_top_right.xml
│ │ │ ├── moprogress_out.xml
│ │ │ ├── moprogress_out_bottom_right.xml
│ │ │ └── moprogress_out_top_right.xml
│ │ ├── color/
│ │ │ └── selector_menu_text.xml
│ │ ├── drawable/
│ │ │ ├── bg_chapter_item_divider.xml
│ │ │ ├── bg_edit.xml
│ │ │ ├── bg_ib_pre.xml
│ │ │ ├── bg_ib_pre_round.xml
│ │ │ ├── bg_textfield_search.xml
│ │ │ ├── fastscroll_bubble.xml
│ │ │ ├── fastscroll_handle.xml
│ │ │ ├── fastscroll_track.xml
│ │ │ ├── ic_about.xml
│ │ │ ├── ic_add.xml
│ │ │ ├── ic_add_online.xml
│ │ │ ├── ic_arrange.xml
│ │ │ ├── ic_arrow_back.xml
│ │ │ ├── ic_arrow_drop_down.xml
│ │ │ ├── ic_arrow_drop_up.xml
│ │ │ ├── ic_author.xml
│ │ │ ├── ic_auto_page.xml
│ │ │ ├── ic_auto_page_stop.xml
│ │ │ ├── ic_back_last.xml
│ │ │ ├── ic_backup.xml
│ │ │ ├── ic_baseline_label.xml
│ │ │ ├── ic_book_has.xml
│ │ │ ├── ic_book_last.xml
│ │ │ ├── ic_book_source_manage.xml
│ │ │ ├── ic_bookmark.xml
│ │ │ ├── ic_brightness.xml
│ │ │ ├── ic_bug_report_black_24dp.xml
│ │ │ ├── ic_cancel.xml
│ │ │ ├── ic_chapter_list.xml
│ │ │ ├── ic_check.xml
│ │ │ ├── ic_check_source.xml
│ │ │ ├── ic_clear_all.xml
│ │ │ ├── ic_copy.xml
│ │ │ ├── ic_cursor_left.xml
│ │ │ ├── ic_cursor_right.xml
│ │ │ ├── ic_daytime.xml
│ │ │ ├── ic_disclaimer.xml
│ │ │ ├── ic_donate.xml
│ │ │ ├── ic_download.xml
│ │ │ ├── ic_download_line.xml
│ │ │ ├── ic_edit.xml
│ │ │ ├── ic_exchange.xml
│ │ │ ├── ic_expand_less_24dp.xml
│ │ │ ├── ic_expand_more_24dp.xml
│ │ │ ├── ic_faq.xml
│ │ │ ├── ic_find_replace.xml
│ │ │ ├── ic_folder.xml
│ │ │ ├── ic_format_line_spacing.xml
│ │ │ ├── ic_groups.xml
│ │ │ ├── ic_history.xml
│ │ │ ├── ic_import.xml
│ │ │ ├── ic_interface_setting.xml
│ │ │ ├── ic_last_read.xml
│ │ │ ├── ic_launch.xml
│ │ │ ├── ic_list.xml
│ │ │ ├── ic_mail.xml
│ │ │ ├── ic_more_vert.xml
│ │ │ ├── ic_network_check.xml
│ │ │ ├── ic_pause_24dp.xml
│ │ │ ├── ic_pause_outline_24dp.xml
│ │ │ ├── ic_play_24dp.xml
│ │ │ ├── ic_play_outline_24dp.xml
│ │ │ ├── ic_qq_group.xml
│ │ │ ├── ic_read.xml
│ │ │ ├── ic_read_aloud.xml
│ │ │ ├── ic_refresh_black_24dp.xml
│ │ │ ├── ic_refresh_white_24dp.xml
│ │ │ ├── ic_remove.xml
│ │ │ ├── ic_restore.xml
│ │ │ ├── ic_save.xml
│ │ │ ├── ic_scan.xml
│ │ │ ├── ic_scoring.xml
│ │ │ ├── ic_search.xml
│ │ │ ├── ic_select_all.xml
│ │ │ ├── ic_settings.xml
│ │ │ ├── ic_share.xml
│ │ │ ├── ic_skip_next.xml
│ │ │ ├── ic_skip_previous.xml
│ │ │ ├── ic_stop_black_24dp.xml
│ │ │ ├── ic_swap_outline_24dp.xml
│ │ │ ├── ic_theme.xml
│ │ │ ├── ic_time_add_24dp.xml
│ │ │ ├── ic_timer_black_24dp.xml
│ │ │ ├── ic_toc.xml
│ │ │ ├── ic_top_source.xml
│ │ │ ├── ic_translate.xml
│ │ │ ├── ic_tune.xml
│ │ │ ├── ic_update.xml
│ │ │ ├── ic_version.xml
│ │ │ ├── ic_view_quilt.xml
│ │ │ ├── ic_volume_up.xml
│ │ │ ├── ic_web_outline.xml
│ │ │ ├── ic_web_service_noti.xml
│ │ │ ├── ic_web_service_phone.xml
│ │ │ ├── image_welcome.xml
│ │ │ ├── searchview_line.xml
│ │ │ ├── selector_common_bg.xml
│ │ │ ├── selector_fillet_btn_bg.xml
│ │ │ ├── selector_tv_black.xml
│ │ │ ├── shape_card_view.xml
│ │ │ ├── shape_fillet_btn.xml
│ │ │ ├── shape_fillet_btn_press.xml
│ │ │ ├── shape_pop_checkaddshelf_bg.xml
│ │ │ ├── shape_radius_1dp.xml
│ │ │ ├── shape_space_divider.xml
│ │ │ └── shape_text_cursor.xml
│ │ ├── drawable-v21/
│ │ │ ├── bg_ib_pre.xml
│ │ │ └── bg_ib_pre_round.xml
│ │ ├── layout/
│ │ │ ├── activity_about.xml
│ │ │ ├── activity_book_choice.xml
│ │ │ ├── activity_book_cover_edit.xml
│ │ │ ├── activity_book_detail.xml
│ │ │ ├── activity_book_info_edit.xml
│ │ │ ├── activity_book_read.xml
│ │ │ ├── activity_book_source.xml
│ │ │ ├── activity_chapterlist.xml
│ │ │ ├── activity_donate.xml
│ │ │ ├── activity_import_book.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_qrcode_capture.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_source_login.xml
│ │ │ ├── activity_update.xml
│ │ │ ├── activity_web_view.xml
│ │ │ ├── activity_welcome.xml
│ │ │ ├── content_main.xml
│ │ │ ├── dialog_bookmark.xml
│ │ │ ├── dialog_change_source.xml
│ │ │ ├── dialog_download_choice.xml
│ │ │ ├── dialog_file_chooser.xml
│ │ │ ├── dialog_input.xml
│ │ │ ├── dialog_login.xml
│ │ │ ├── dialog_number_picker.xml
│ │ │ ├── dialog_page_key.xml
│ │ │ ├── dialog_replace_rule.xml
│ │ │ ├── dialog_txt_chpater_rule.xml
│ │ │ ├── fragment_book_find.xml
│ │ │ ├── fragment_book_list.xml
│ │ │ ├── fragment_bookmark_list.xml
│ │ │ ├── fragment_chapter_list.xml
│ │ │ ├── fragment_file_category.xml
│ │ │ ├── fragment_local_book.xml
│ │ │ ├── item_1line_text_and_del.xml
│ │ │ ├── item_book_source.xml
│ │ │ ├── item_bookshelf_grid.xml
│ │ │ ├── item_bookshelf_list.xml
│ │ │ ├── item_change_cover.xml
│ │ │ ├── item_change_source.xml
│ │ │ ├── item_chapter_list.xml
│ │ │ ├── item_download.xml
│ │ │ ├── item_file.xml
│ │ │ ├── item_file_filepicker.xml
│ │ │ ├── item_find1_group.xml
│ │ │ ├── item_find1_kind.xml
│ │ │ ├── item_find2_childer_view.xml
│ │ │ ├── item_find2_header_view.xml
│ │ │ ├── item_find_left.xml
│ │ │ ├── item_font.xml
│ │ │ ├── item_icon_preference.xml
│ │ │ ├── item_path_filepicker.xml
│ │ │ ├── item_read_bg.xml
│ │ │ ├── item_replace_rule.xml
│ │ │ ├── item_search_book.xml
│ │ │ ├── item_search_history.xml
│ │ │ ├── item_source_debug.xml
│ │ │ ├── item_source_edit.xml
│ │ │ ├── item_text.xml
│ │ │ ├── mo_dialog_image_text.xml
│ │ │ ├── mo_dialog_infor.xml
│ │ │ ├── mo_dialog_loading.xml
│ │ │ ├── mo_dialog_markdown.xml
│ │ │ ├── mo_dialog_text_large.xml
│ │ │ ├── mo_dialog_two.xml
│ │ │ ├── navigation_header.xml
│ │ │ ├── pop_media_player.xml
│ │ │ ├── pop_more_setting.xml
│ │ │ ├── pop_read_adjust.xml
│ │ │ ├── pop_read_adjust_margin.xml
│ │ │ ├── pop_read_interface.xml
│ │ │ ├── pop_read_long_press.xml
│ │ │ ├── pop_read_menu.xml
│ │ │ ├── popup_keyboard_tool.xml
│ │ │ ├── tab_view_icon_right.xml
│ │ │ ├── view_empty.xml
│ │ │ ├── view_fastscroller.xml
│ │ │ ├── view_file_picker.xml
│ │ │ ├── view_icon.xml
│ │ │ ├── view_loading.xml
│ │ │ ├── view_net_error.xml
│ │ │ ├── view_night_theme.xml
│ │ │ ├── view_number_buttom.xml
│ │ │ ├── view_recycler_font.xml
│ │ │ ├── view_refresh_error.xml
│ │ │ ├── view_refresh_load_more.xml
│ │ │ ├── view_refresh_no_data.xml
│ │ │ └── view_refresh_recycler.xml
│ │ ├── menu/
│ │ │ ├── menu_book_download.xml
│ │ │ ├── menu_book_info.xml
│ │ │ ├── menu_book_read_activity.xml
│ │ │ ├── menu_book_search_activity.xml
│ │ │ ├── menu_book_source_activity.xml
│ │ │ ├── menu_book_source_edit.xml
│ │ │ ├── menu_debug_activity.xml
│ │ │ ├── menu_main_activity.xml
│ │ │ ├── menu_main_drawer.xml
│ │ │ ├── menu_qr_code_scan.xml
│ │ │ ├── menu_read_style_activity.xml
│ │ │ ├── menu_replace_rule_activity.xml
│ │ │ ├── menu_search_view.xml
│ │ │ ├── menu_source_login.xml
│ │ │ ├── menu_txt_chapter_rule_activity.xml
│ │ │ └── menu_update_activity.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── book_launcher.xml
│ │ │ ├── book_launcher_round.xml
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── attrs.xml
│ │ │ ├── book_launcher_background.xml
│ │ │ ├── colors.xml
│ │ │ ├── colors_material_design.xml
│ │ │ ├── dimens.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ids.xml
│ │ │ ├── pref_key_value.xml
│ │ │ ├── strings.xml
│ │ │ ├── strings_me.xml
│ │ │ └── styles.xml
│ │ ├── values-en/
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ ├── values-v27/
│ │ │ └── styles.xml
│ │ ├── values-v28/
│ │ │ └── styles.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ ├── values-zh-rTW/
│ │ │ └── strings.xml
│ │ └── xml/
│ │ ├── file_paths.xml
│ │ ├── network_security_config.xml
│ │ ├── pref_settings.xml
│ │ ├── pref_settings_theme.xml
│ │ ├── pref_settings_web_dav.xml
│ │ └── shortcuts.xml
│ └── test/
│ └── java/
│ └── com/
│ └── kunfei/
│ └── bookshelf/
│ └── ExampleUnitTest.java
├── basemvplib/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── kunfei/
│ │ │ └── basemvplib/
│ │ │ ├── AppActivityManager.java
│ │ │ ├── BaseActivity.java
│ │ │ ├── BaseFragment.java
│ │ │ ├── BasePresenterImpl.java
│ │ │ ├── BitIntentDataManager.java
│ │ │ └── impl/
│ │ │ ├── IPresenter.java
│ │ │ └── IView.java
│ │ └── res/
│ │ └── values/
│ │ ├── colors.xml
│ │ └── strings.xml
│ └── test/
│ └── java/
│ └── com/
│ └── kunfei/
│ └── basemvplib/
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── mail
├── settings.gradle
└── tool/
└── 书源整理工具/
├── BookSourceMgr.dpr
├── BookSourceMgr.dproj
├── BookSourceMgr.res
├── ReadMe.txt
├── uBookSourceBean.pas
├── uFrmEditSource.dfm
├── uFrmEditSource.pas
├── uFrmMain.dfm
├── uFrmMain.pas
├── uFrmReplaceGroup.dfm
├── uFrmReplaceGroup.pas
├── uFrmWait.dfm
└── uFrmWait.pas
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
/.gradle
/.idea
.DS_Store
/local.properties
/build
/captures
/app/release/
google-services.json
src/androidTest/
/back
/tool/书源整理工具/bin/*.exe
/tool/书源整理工具/*.otares
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# 本项目已转到新地址使用kotlin重新开发,项目地址 https://github.com/gedoor/legado
# 本软件为开源软件,不要在任何地方购买!
# 关注公众号请搜索:开源阅读,有福利噢
# 开发
- 本项目Fork于 https://github.com/ZhangQinhao/MONKOVEL
**代码贡献人员**
- 大古队员 https://github.com/DaguDuiyuan
- atbest https://github.com/atbest
- Antecer https://github.com/Antecer
- mabDc https://github.com/mabDc
- 繁体-翻译者:Cello琴弦之間
**其它贡献人员**
- 图标绘制 群管理员-新奥尔良烤鲟魚堡
# 软件截图






# 免责声明(Disclaimer)
阅读是一款提供网络文学搜索的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。
当您搜索一本书的时,阅读会将该书的书名以关键词的形式提交到各个第三方网络文学网站。
各第三方网站返回的内容与阅读无关,阅读对其概不负责,亦不承担任何法律责任。
任何通过使用阅读而链接到的第三方网页均系他人制作或提供,您可能从第三方网页上获得其他服务,
阅读对其合法性概不负责,亦不承担任何法律责任。
第三方搜索引擎结果根据您提交的书名自动搜索获得并提供试读,
不代表阅读赞成或被搜索链接到的第三方网页上的内容或立场。
您应该对使用搜索引擎的结果自行承担风险。
阅读不做任何形式的保证:不保证第三方搜索引擎的搜索结果满足您的要求,
不保证搜索服务不中断,不保证搜索结果的安全性、正确性、及时性、合法性。
因网络状况、通讯线路、第三方网站等任何原因而导致您不能正常使用阅读,
阅读不承担任何法律责任。阅读尊重并保护所有使用阅读用户的个人隐私权。
阅读致力于最大程度地减少网络文学阅读者在自行搜寻过程中的无意义的时间浪费,
通过专业搜索展示不同网站中网络文学的最新章节。
阅读在为广大小说爱好者提供方便、快捷舒适的试读体验的同时,
也使优秀网络文学得以迅速、更广泛的传播,从而达到了在一定程度促进网络文学充分繁荣发展之目的。
阅读鼓励广大小说爱好者通过阅读发现优秀网络小说及其提供商,
并建议阅读正版图书。
任何单位或个人认为通过阅读搜索链接到的第三方网页内容可能涉嫌侵犯其信息网络传播权,
应该及时向阅读提出书面权力通知,并提供身份证明、权属证明及详细侵权情况证明。
阅读在收到上述法律文件后,将会依法尽快断开相关链接内容。
================================================
FILE: app/.gitignore
================================================
/build
/src/main/java/com/kunfei/bookshelf/dao/
================================================
FILE: app/ReadMe.md
================================================
# ע
MyBookshelf_Keys ѹļС
google-services.json
gradle.properties
key.properties.jks
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'org.greenrobot.greendao'
apply plugin: 'kotlin-parcelize'
apply plugin: "de.timfreiheit.resourceplaceholders"
apply plugin: 'kotlin-kapt'
static def releaseTime() {
return new Date().format("yy.MMddHH", TimeZone.getTimeZone("GMT+8"))
}
def name = "YueDu"
def version = "2." + releaseTime()
def gitCommits = Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
android {
compileSdkVersion 31
signingConfigs {
myConfig {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_KEY_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_STORE_PASSWORD
}
}
defaultConfig {
applicationId "com.gedoor.monkeybook"
minSdkVersion 21
targetSdkVersion 31
versionCode 10000 + gitCommits
versionName version
project.ext.set("archivesBaseName", name + "_" + version)
multiDexEnabled true
}
buildFeatures {
viewBinding true
}
lintOptions {
abortOnError false
}
buildTypes {
release {
signingConfig signingConfigs.myConfig
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.myConfig
applicationIdSuffix '.debug'
versionNameSuffix 'debug'
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${name}_${defaultConfig.versionName}.apk"
}
}
}
kotlinOptions {
jvmTarget = "1.8"
}
buildToolsVersion '30.0.3'
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
//options.compilerArgs << "-Xlint:deprecation"
}
}
resourcePlaceholders {
files = ['xml/shortcuts.xml']
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
testImplementation 'junit:junit:4.13.2'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':basemvplib')
implementation('androidx.multidex:multidex:2.0.1')
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version")
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
//协程
def coroutines_version = '1.6.0'
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version")
//anko
def anko_version = '0.10.8'
implementation "org.jetbrains.anko:anko-sdk27:$anko_version"
implementation "org.jetbrains.anko:anko-sdk27-listeners:$anko_version"
//lifecycle
def lifecycle_version = '2.4.1'
implementation("androidx.lifecycle:lifecycle-common-java8:$lifecycle_version")
//androidX
implementation('androidx.appcompat:appcompat:1.4.1')
implementation('androidx.core:core-ktx:1.7.0')
implementation("androidx.activity:activity-ktx:1.4.0")
implementation("androidx.fragment:fragment-ktx:1.4.1")
implementation('androidx.preference:preference-ktx:1.2.0')
implementation('androidx.constraintlayout:constraintlayout:2.1.3')
implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
implementation('androidx.viewpager2:viewpager2:1.0.0')
implementation('com.google.android.material:material:1.5.0')
implementation('com.google.android.flexbox:flexbox:3.0.0')
implementation('com.google.code.gson:gson:2.9.0')
implementation('androidx.webkit:webkit:1.4.0')
//Splitties
def splitties_version = '3.0.0'
implementation("com.louiscad.splitties:splitties-appctx:$splitties_version")
implementation("com.louiscad.splitties:splitties-systemservices:$splitties_version")
implementation("com.louiscad.splitties:splitties-views:$splitties_version")
//media
implementation("androidx.media:media:1.5.0")
def exoplayer_version = '2.17.1'
implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version"
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-hls:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-dash:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-rtsp:$exoplayer_version"
//google
implementation 'com.google.android.material:material:1.5.0'
implementation 'com.google.code.gson:gson:2.9.0'
//RxAndroid
implementation 'io.reactivex.rxjava2:rxjava:2.2.19'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//RxBus
implementation 'com.hwangjr.rxbus:rxbus:2.0.1'
//Retrofit
//noinspection GradleDependency
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
//J_SOUP
implementation 'org.jsoup:jsoup:1.14.3'
implementation 'cn.wanghaomiao:JsoupXpath:2.5.1'
implementation 'com.jayway.jsonpath:json-path:2.7.0'
//JS
//noinspection GradleDependency
implementation 'com.github.gedoor:rhino-android:1.3'
//GreenDao
implementation 'org.greenrobot:greendao:3.3.0'
implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.2.1'
//Glide
implementation 'com.github.bumptech.glide:glide:4.13.1'
kapt 'com.github.bumptech.glide:compiler:4.13.1'
//CircleImageView
implementation 'de.hdodenhof:circleimageview:3.1.0'
//webServer
implementation 'org.nanohttpd:nanohttpd:2.3.1'
implementation 'org.nanohttpd:nanohttpd-websocket:2.3.1'
//二维码
implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.7'
//颜色选择
implementation 'com.jaredrummler:colorpicker:1.1.0'
//apache
implementation('org.apache.commons:commons-text:1.9')
//简繁转换
implementation 'com.luhuiguo:chinese-utils:1.0'
//字符串比较
implementation 'net.ricecode:string-similarity:1.0.0'
//MarkDown
implementation 'ru.noties.markwon:core:3.1.0'
//epub
implementation('com.positiondev.epublib:epublib-core:3.1') {
exclude group: 'org.slf4j'
exclude group: 'xmlpull'
}
}
greendao {
schemaVersion 68
daoPackage 'com.kunfei.bookshelf.dao'
targetGenDir 'src/main/java'
}
afterEvaluate {
// for (Task task : project.tasks.matching { it.name.startsWith('crashlyticsUploadDeobs') }) {
// task.enabled = false
// }
}
================================================
FILE: app/gradle.properties
================================================
# RELEASE_STORE_FILE = "..\\key.properties.jks"
RELEASE_STORE_FILE=.\\key.properties.jks
RELEASE_KEY_PASSWORD=android
RELEASE_KEY_ALIAS=key0
RELEASE_STORE_PASSWORD=android
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\CodeTool\Android\Android_SDK/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#
# 对于一些基本指令的添加
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify
# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#############################################
#
# Android开发中一些需要保留的公共部分
#
#############################################
# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
# 保留androidx下的所有类及其内部类
-keep class androidx.** {*;}
# 保留继承的
-keep public class * extends androidx.**
# 保留R下面的资源
-keep class **.R$* {*;}
# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留在Activity中的方法参数是view的方法,
# 这样以来我们在layout中写的onClick就不会被影响
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 保留枚举类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留我们自定义控件(继承自View)不被混淆
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保留Parcelable序列化类不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable序列化的类不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
void *(**On*Event);
void *(**On*Listener);
}
# webView处理,项目中没有使用到webView忽略即可
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, jav.lang.String);
}
# 移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用
# 记得proguard-android.txt中一定不要加-dontoptimize才起作用
# 另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
# 保持js引擎调用的java类
-keep class **.analyzeRule.**{*;}
# 保持web类
-keep class **.web.**{*;}
### greenDAO 3
-keep class org.greenrobot.greendao.**{ *; }
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
-dontwarn org.greenrobot.greendao.database.**
-dontwarn rx.**
-dontwarn okio.**
-dontwarn retrofit2.**
-dontwarn javax.annotation.**
-dontwarn org.apache.log4j.lf5.viewer.**
-dontnote org.apache.log4j.lf5.viewer.**
-dontwarn freemarker.**
-dontnote org.python.core.**
-dontwarn com.hwangjr.rxbus.**
-dontwarn okhttp3.**
-keep class retrofit2.**{*;}
-keep class okhttp3.**{*;}
-keep class okio.**{*;}
-keep class com.hwangjr.rxbus.**{*;}
-keep class org.conscrypt.**{*;}
-keep class com.kunfei.bookshelf.widget.**{*;}
-keep class com.kunfei.bookshelf.bean.**{*;}
-keep class android.support.**{*;}
-keep class me.grantland.widget.**{*;}
-keep class de.hdodenhof.circleimageview.**{*;}
-keep class tyrant.explosionfield.**{*;}
-keep class tyrantgit.explosionfield.**{*;}
-keep class freemarker.**{*;}
-keep class com.gyf.barlibrary.* {*;}
##JSOUP
-keep class org.jsoup.**{*;}
-keep class com.monke.mprogressbar.**{ *;}
-keep class org.slf4j.**{*;}
-dontwarn org.slf4j.**
-keep class org.codehaus.**{*;}
-dontwarn org.codehaus.**
-keep class com.jayway.**{*;}
-dontwarn com.jayway.**
-keep class com.fasterxml.**{*;}
-keep class javax.swing..**{*;}
-dontwarn javax.swing.**
-keep class java.awt.**{*;}
-dontwarn java.awt.**
-keep class sun.misc.**{*;}
-dontwarn sun.misc.**
-keep class sun.reflect.**{*;}
-dontwarn sun.reflect.**
## Rhino
-keep class javax.script.** { *; }
-keep class com.sun.script.javascript.** { *; }
-keep class org.mozilla.javascript.** { *; }
-dontwarn org.mozilla.javascript.**
-dontwarn sun.**
###EPUB
-dontwarn nl.siegmann.epublib.**
-dontwarn org.xmlpull.**
-keep class nl.siegmann.epublib.**{*;}
-keep class javax.xml.**{*;}
-keep class org.xmlpull.**{*;}
-keep class org.simpleframework.xml.**{*;}
-dontwarn org.simpleframework.xml.**
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keep public class com.kunfei.bookshelf.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
================================================
FILE: app/src/debug/res/values/strings.xml
================================================
<resources>
<string name="app_name">阅读.debug</string>
<string name="receiving_shared_label">阅读.debug·搜索</string>
</resources>
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.kunfei.bookshelf">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<application
android:name=".MApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:persistent="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/CAppTheme"
android:requestLegacyExternalStorage="true"
tools:ignore="AllowBackup,UnusedAttribute"
tools:replace="android:theme">
<activity
android:name=".view.activity.WelcomeActivity"
android:theme="@style/CAppWelcomeTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
<activity
android:name=".view.activity.WelcomeBookActivity"
android:enabled="false"
android:icon="@mipmap/book_launcher"
android:roundIcon="@mipmap/book_launcher_round"
android:theme="@style/CAppWelcomeTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
<activity
android:name=".view.activity.ReadBookActivity"
android:configChanges="locale|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="behind"
android:exported="true">
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".view.activity.ReceivingSharedActivity"
android:enabled="true"
android:label="@string/receiving_shared_label"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".view.activity.QRCodeScanActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.MainActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true" />
<activity
android:name=".view.activity.SearchBookActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustUnspecified" />
<activity
android:name=".view.activity.ChoiceBookActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.BookDetailActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:screenOrientation="behind"
android:theme="@style/CAppTransparentTheme" />
<activity
android:name=".view.activity.ImportBookActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.BookSourceActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.ReplaceRuleActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.SettingActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.ThemeSettingActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.AboutActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.DonateActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.SourceEditActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".view.activity.ReadStyleActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.DownloadActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.BookInfoEditActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".view.activity.ChapterListActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask"
android:screenOrientation="behind" />
<activity
android:name=".view.activity.SourceLoginActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.SourceDebugActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.TxtChapterRuleActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.BookCoverEditActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="singleTask" />
<activity
android:name=".view.activity.WebViewActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:launchMode="standard" />
<activity
android:name=".help.permission.PermissionActivity"
android:theme="@style/Activity.Permission" />
<service android:name=".service.DownloadService" />
<service android:name=".service.ReadAloudService" />
<service android:name=".service.CheckSourceService" />
<service android:name=".service.WebService" />
<service android:name=".service.ShareService" />
<receiver
android:name=".service.MediaButtonIntentReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT" />
<data android:mimeType="text/plain" />
</intent>
</queries>
</manifest>
================================================
FILE: app/src/main/assets/18PlusList.txt
================================================
OGN5dS5jb20=
c2cwMC54eXo=
aXRyYWZmaWNuZXQuY29t
eGlhb3FpYW5nNTIw
MTIzeGlhb3FpYW5n
eGlhb3FpYW5neHM=
eGlhb3FpYW5nNTIw
MzM1eHM=
eGN4czk=
eGN4czUyMA==
c2h1YmFvYW4=
c2h1YmFvd2FuZzEyMw==
c2h1YmFvYW4=
aGFpdGFuZzEyMw==
eXV6aGFpd3VsYQ==
cG8xOA==
Ymwtbm92ZWw=
NXRucw==
c2hhb3NodWdl
amluamlzaHV3dQ==
NDJ3Zw==
eWlxdXNodQ==
c2h1YmFvd2FuZzEyMw==
M2hlYmFv
MzNoZWJhbw==
bHVvcWl1enc=
bXlzaHVnZQ==
c3NzeHN3
eWl0ZQ==
Y3Vpd2VpanV1
Y3Vpd2VpanV4cw==
Y3Vpd2VpanV4
eGlhb3FpYW5nd3g=
YXN6dw==
YXN6dzY=
c2FuaGFveHM=
ODdzaHV3dQ==
NDh3eA==
bG9uZ3Rlbmcy
NnF3eA==
bG9uZ3Rlbmd4cw==
aGF4ZHU=
M3R3eA==
aGF4d3g1
NjZsZXdlbg==
eGJhbnpodQ==
aGR5cA==
ZHliejk=
ZGl5aWJhbnpodTk=
ZGl5aWJhbnpodQ==
ZGl5aWJhbnpodTc=
YnoyMjI=
d29kZWFwaTAwMQ==
dGFuZ3poZWthbg==
YmF4aWFueHM=
eGlhb3NodW9zaGVuemhhbg==
ZGFtb2tl
emh3ZW5wZw==
eXV6aGFpZ2U=
d21wOA==
OXhpYW53ZW4=
bmFucmVudmlw
cmV5b28=
eWZ4aWFvc2h1b2U=
c2Fuaml1enc=
N3Fpbmc3
cWR4aWFvc2h1bw==
Y2hpbmVzZXpq
MzlzaHViYW8=
a3l4czU=
NTZtcw==
bml1c2hh
bWt4czY=
MjIyMjJ4cw==
OTVkdXNodQ==
YmFuemh1MjI=
d3JsdHh0
dHVkb3V0eHQ=
cm5neHM=
OTl3ZW5rdQ==
bGFvc2lqaXhz
ZnVzaHV6aGFpMQ==
================================================
FILE: app/src/main/assets/data/BookSourceXxl.json
================================================
{
"bookSourceUrl": "https://www.kaixin7days.com",
"bookSourceName": "消消乐听书",
"bookSourceGroup": "听书",
"bookSourceType": "AUDIO",
"loginUrl": "var loginInfo = source.getLoginInfo()\nvar json = java.getResponse(\"https://www.kaixin7days.com/login@\" + loginInfo).body()\nvar loginRes = JSON.parse(json)\nvar header = null\nif (loginRes.statusCode == 200) {\n var accessToken = {\n Authorization: \"Bearer \" + loginRes.content.accessToken\n }\n header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n}\nheader",
"loginUi": "[{\"name\": \"telephone\",\"type\": \"text\"},{\"name\": \"password\",\"type\": \"password\"},{\"type\": \"button\",\"name\": \"注册\", \"action\": \"http://www.yooike.com/xiaoshuo/#/register?title=%E6%B3%A8%E5%86%8C\"}]",
"loginCheckJs": "var strRes = result\nvar c = JSON.parse(result.body())\nif (c.statusCode == 301) {\n var loginInfo = source.getLoginInfo()\n var dl = null\n if (loginInfo) {\n dl = java.getResponse(\"https://www.kaixin7days.com/login@\" + loginInfo).body()\n } else {\n dl = java.getResponse('https://www.kaixin7days.com/visitorLogin@{\"deviceId\":\"'+java.androidId()+'\"}').body()\n }\n c = JSON.parse(dl)\n var accessToken = {\n Authorization: \"Bearer \" + c.content.accessToken\n }\n var header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n strRes = java.getResponse(\"@Header:\" + header + url)\n}\nstrRes",
"serialNumber": -100,
"enable": true,
"ruleFindUrl": "@js:var header = source.getLoginHeader()\nvar json = \"\"\nvar j = null\nif (header != null) {\n json = java.getResponse(\"@Header:\" + header + \"https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy@{}\").body()\n j = JSON.parse(json)\n}\nif (j == null || j.statusCode != 200) {\n json = java.getResponse(\"https://www.kaixin7days.com/visitorLogin@{}\").body()\n j = JSON.parse(json)\n var accessToken = {\n Authorization: \"Bearer \" + j.content.accessToken\n }\n header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n json = java.getResponse(\"@Header:\" + header + \"https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy@{}\").body()\n j = JSON.parse(json)\n}\nvar fls = j.content\nvar fx = \"\"\nfor (var i = 0; i < fls.length; i++) {\n fx = fx + fls[i].categoryName + '::/book-service/bookMgt/getAllBookByCategroyId@{\"categoryIds\": \"' + fls[i].associationCategoryIDs + '\",\"pageNum\": {{searchPage}},\"pageSize\": 100}&&'\n}\nfx",
"ruleFindList": "$.content.content",
"ruleFindName": "$.title",
"ruleFindAuthor": "$.author",
"ruleFindKind": "",
"ruleFindIntroduce": "$.desc",
"ruleFindLastChapter": "$.newestChapter",
"ruleFindCoverUrl": "$.cover@js:var cover = JSON.parse(result);'https://www.shuidi.online:9021/fileMgt/getPicture?filePath='+cover.storeFilePath",
"ruleFindNoteUrl": "$.id@js:java.put('bookId', result);'https://www.kaixin7days.com/book-service/bookMgt/getAllChapterByBookId@{\"bookId\": \"'+result+'\",\"pageNum\": 1,\"pageSize\": 100000}'",
"ruleSearchUrl": "https://www.kaixin7days.com/book-service/bookMgt/findBookName@{\"title\": \"searchKey\",\"pageNum\": {{searchPage}},\"pageSize\": 100}",
"ruleSearchList": "$.content.content",
"ruleSearchName": "$.title",
"ruleSearchAuthor": "$.author",
"ruleSearchIntroduce": "$.desc",
"ruleSearchLastChapter": "$.newestChapter",
"ruleSearchCoverUrl": "$.cover@js:var cover = JSON.parse(result);'https://www.shuidi.online:9021/fileMgt/getPicture?filePath='+cover.storeFilePath",
"ruleSearchNoteUrl": "$.id@js:java.put('bookId', result);'https://www.kaixin7days.com/book-service/bookMgt/getAllChapterByBookId@{\"bookId\": \"'+result+'\",\"pageNum\": 1,\"pageSize\": 100000}'",
"ruleChapterList": "$.content.content",
"ruleChapterName": "$.chapterTitle",
"ruleChapterVip": "$.isFree@js:var vip = false; if (result == '0') { vip = true } vip",
"ruleChapterPay": "$.isPay",
"ruleContentUrl": "$.id@js:\"https://www.shuidi.online:9021/fileMgt/getAudioByChapterId?bookId=\" + java.getString(\"$.bookId\") + \"&chapterId=\" + result + \"&pageNum=1&pageSize=50&{{var header = JSON.parse(source.getLoginHeader());var reg = /&chapterId=(.*?)&/;var chapterId = reg.exec(result)[1];var keyId = '1632746188011002';var ks = java.md5Encode(keyId + chapterId + header.Authorization);'Authorization=' + header.Authorization + '&keyId=' + keyId + '&keySecret=' + ks}\" + \"}\"",
"ruleBookContent": "",
"payAction": "var header = JSON.parse(source.getLoginHeader())\nvar chapterUrl = chapter.getDurChapterUrl(); var reg = /&chapterId=(.*?)&/; var chapterId = reg.exec(chapterUrl)[1]\n'http://www.shuidi.online/?name='+book.getName()+'&type=2&cover=' + book.getCoverPath() + '&chapterId=' + chapterId + '&chapter=203&allNumber=' + book.getChapterListSize()+'&bookId=' + book.getVariableMap().get('bookId') + '&chapterIds=' + chapterId + '&number=' + chapter.getDurChapterIndex() + '&accessToken=' + header.Authorization.substring(7) + '#/pay'"
}
================================================
FILE: app/src/main/assets/disclaimer.md
================================================
# 免责声明(Disclaimer)
* 阅读是一款提供网络文学搜索的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。
* 当您搜索一本书的时,阅读会将该书的书名以关键词的形式提交到各个第三方网络文学网站。
各第三方网站返回的内容与阅读无关,阅读对其概不负责,亦不承担任何法律责任。
任何通过使用阅读而链接到的第三方网页均系他人制作或提供,您可能从第三方网页上获得其他服务,阅读对其合法性概不负责,亦不承担任何法律责任。
第三方搜索引擎结果根据您提交的书名自动搜索获得并提供试读,不代表阅读赞成或被搜索链接到的第三方网页上的内容或立场。
您应该对使用搜索引擎的结果自行承担风险。
* 阅读不做任何形式的保证:不保证第三方搜索引擎的搜索结果满足您的要求,不保证搜索服务不中断,不保证搜索结果的安全性、正确性、及时性、合法性。
因网络状况、通讯线路、第三方网站等任何原因而导致您不能正常使用阅读,阅读不承担任何法律责任。
阅读尊重并保护所有使用阅读用户的个人隐私权,您注册的用户名、电子邮件地址等个人资料,非经您亲自许可或根据相关法律、法规的强制性规定,阅读不会主动地泄露给第三方。
* 阅读致力于最大程度地减少网络文学阅读者在自行搜寻过程中的无意义的时间浪费,通过专业搜索展示不同网站中网络文学的最新章节。
阅读在为广大小说爱好者提供方便、快捷舒适的试读体验的同时,也使优秀网络文学得以迅速、更广泛的传播,从而达到了在一定程度促进网络文学充分繁荣发展之目的。
阅读鼓励广大小说爱好者通过阅读发现优秀网络小说及其提供商,并建议阅读正版图书。
任何单位或个人认为通过阅读搜索链接到的第三方网页内容可能涉嫌侵犯其信息网络传播权,应该及时向阅读提出书面权力通知,并提供身份证明、权属证明及详细侵权情况证明。
阅读在收到上述法律文件后,将会依法尽快断开相关链接内容。
================================================
FILE: app/src/main/assets/txtChapterRule.json
================================================
[
{
"enable": true,
"name": "目录",
"rule": "^[ \\t]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?!分)|篇(?!张))).{0,30}$",
"serialNumber": 0
},
{
"enable": false,
"name": "目录(去空白)",
"rule": "(?<=[ \\s])(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?!分)|篇(?!张))).{0,30}$",
"serialNumber": 1
},
{
"enable": false,
"name": "目录(去简介)",
"rule": "(?<=[ \\s])(?:前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?!分)|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$",
"serialNumber": 2
},
{
"enable": false,
"name": "目录(古典、轻小说备用)",
"rule": "^[ \\t]{0,4}(?:前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?!分)|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$",
"serialNumber": 3
},
{
"enable": false,
"name": "数字(纯数字标题)",
"rule": "(?<=[ \\s])\\d+[ \\t]{0,4}$",
"serialNumber": 4
},
{
"enable": true,
"name": "数字 分隔符 标题名称",
"rule": "^[ \\t]{0,4}\\d{1,5}[\\,\\., 、\\-].{1,30}$",
"serialNumber": 5
},
{
"enable": true,
"name": "正文 标题/序号",
"rule": "^[ \\t]{0,4}正文[ ]{1,4}.{0,20}$",
"serialNumber": 6
},
{
"enable": true,
"name": "Chapter/Section/Part/Episode 序号 标题",
"rule": "^[ \\t]{0,4}(?:[Cc]hapter|[Ss]ection|[Pp]art|PART|[Ee]pisode|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)\\s{0,4}\\d{1,4}.{0,30}$",
"serialNumber": 7
},
{
"enable": false,
"name": "Chapter(去简介)",
"rule": "^[ \\t]{0,4}(?:[Cc]hapter|[Ss]ection|[Pp]art|PART|[Ee]pisode)\\s{0,4}\\d{1,4}.{0,30}$",
"serialNumber": 8
},
{
"enable": true,
"name": "特殊符号 序号 标题",
"rule": "(?<=[\\s ]{0,4}).{1,3}(?:第|卷|[Cc]hapter)[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,10}[章节]?[\\.:: \f\t].{0,20}$",
"serialNumber": 9
},
{
"enable": false,
"name": "特殊符号 标题(成对)",
"rule": "(?<=[\\s ]{0,4})(?:[\\[〈「『〖〔《(【\\(].{1,30}[\\)】)》〕〗』」〉\\]]?|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)[ ]{0,4}$",
"serialNumber": 10
},
{
"enable":true,
"name": "特殊符号 标题(单个)",
"rule": "(?<=[\\s ]{0,4})(?:[☆★✦✧].{1,30}|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)[ ]{0,4}$",
"serialNumber": 11
},
{
"enable": true,
"name": "章/卷 序号 标题",
"rule": "^[ \\t ]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|[卷章][\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[ ]{0,4}.{0,30}$",
"serialNumber": 12
},
{
"enable":false,
"name": "顶格标题",
"rule": "^\\S.{1,20}$",
"serialNumber": 13
},
{
"enable":false,
"name": "双标题(前向)",
"rule": "(?m)(?<=[ \\t ]{0,4})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$(?=[\\s ]{0,8}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章)",
"serialNumber": 14
},
{
"enable":false,
"name": "双标题(后向)",
"rule": "(?m)(?<=[ \\t ]{0,4}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$[\\s ]{0,8})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$",
"serialNumber": 15
}
]
================================================
FILE: app/src/main/assets/updateLog.md
================================================
# 更新日志
* 2.0版本以停止更新,请关注公众号[开源阅读]()获取3.0版本。
**2022/04/01**
* 更新到SDK31
* 更新一些库
**2021/10/24**
* 字体和备份适配android 11
**2021/10/18**
* 去除更新失败提醒
* 第二次换源先取消原先换源
**2021/10/17**
* 修复状态栏和导航栏问题
**2021/10/01**
* 使用exoPlayer支持更多音频格式
* 添加一个默认听书源
* 添加登录界面规则,登录检查规则,添加的默认书源可作为学习用
* 大量优化
**2021/07/26**
* 更新一些库文件
**2021/02/16**
* 详情页目录添加跳转功能
* 优化发现界面文字可能因为主题看不请的bug
**2021/01/04**
* 修复本地导入崩溃bug
**2020/12/26**
* 更新库,更新为viewBinding
* 书籍信息界面添加目录按钮
**2020/12/07**
* 修改风险
**2020/11/07**
* 在书架查看书籍的界面,增加复制小说网址的菜单。
* 在书源列表界面,增加检查书源是否包含发现规则,并增加/删除“发现”标签的功能。
* 在阅读界面,增加长按按钮“广告”,可以快速把正文添加到命名为“广告话术-xxx网址”的规则中去。针对此规则,使用了专门的增强算法。只需要多次标记不想看的文字,就可以获得较好的广告替换效果。用户不需要熟悉正则语法,不需要维护复杂的规则。同一个网站的广告话术自动保存在一个规则内,避免了“替换净化”列表里有太多多的规则。
* 在阅读界面,优化长按按钮“替换”,自动添加书名、网址到应用范围中。
* 进一步优化自动分段算法
* 长按选择文本的高亮色块的形状由弧边改为圆角矩形
**2020/10/28**
* 增加“分享书籍”功能。
* 优化阅读3.0书源转2.0的功能。
* by [tumuyan](https://github.com/tumuyan)
**2020/10/24**
* 增加自动重分段落的功能。部分网站错字、错误标点、错误换行极度严重。使用此功能可以一定程度上矫正引号和换行,从而改善阅读体验。
* 修复书签列表删除书签时UI不实时刷新的异常
* by [tumuyan](https://github.com/tumuyan)
**2020/10/16**
* 添加js方法实现重定向拦截,同3.0
**2020/10/02**
* 改善添加网址功能 by [tumuyan]
**2020/09/02**
* 添加正文合并后替换规则
**2020/08/28**
* 应用被杀死时停止朗读
**2020/08/07**
* 修复一些网络问题
**2020/08/04**
* 提高搜索结果的准确性,过滤掉书名+作者与搜索关键词不匹配的搜索结果。(在设置页面增加了相关选项)by [tumuyan](https://github.com/tumuyan)
**2020/07/19**
* 导入书源时系统文件选择器可以选择json文件
* 换源时保留是否更新
**2020/07/04**
* 更新一些库文件
* 优化一些代码
**2020/06/07**
* 升级到android studio 4.0
* sdk升级到29
* 升级一些库文件
**2020/05/17**
* 修复jsonpath解析的bug
**2020/05/01**
* UA用作header,支持Map
**2020/04/25**
* 修复jsonpath解析的bug
**2020/04/11**
* 修复一些bug
* 更新一些库
**2020/03/20**
* 自动备份文件和手动备份文件分开
* 更新一些库文件
**2020/03/12**
* 更新txt解析目录 by 52fisher
* web看书加翻页 by Celeter
**2020/02/26**
* 更新默认txt目录规则,由https://github.com/52fisher提供
* 新版本快上架了,基本功能以完成,上架后再慢慢优化
* 别人说加广告一天能有几千收入,我不加广告大家给点力多看看公众号广告啊
**2020/02/15**
* 修复低版本手机无法联网的问题
* 优化备份恢复
**2020/02/10**
* 优化备份恢复
* 朗读定时会记住
**2020/02/05**
* 修复bug
**2020/02/04**
* 修复bug
* 更换默认封面,默认封面绘制书名作者
**2020/01/24**
* 修复备份bug
* 修复切换图标后不在后台显示的bug
**2020/01/21**
* 将规则解析后得到的字符串反转义(unescape)
* 在正文规则使用all可查看源码,例:`tag.body@all`
* 添加备份时选择备份文件夹--适配安卓10
**2020/01/09**
* 修复按键码为0时翻页的bug
* 去除tts中文检测判断
**2019/12/30**
* 修复一些会崩溃BUG
**2019/11/29**
* 增加耳机上一首下一首控制
* 自定义按键增加上一页配置
* 关注公众号【小说拾遗】为你推荐好看的小说
**2019/11/16**
* 自动翻页由N秒/页改为字数每分钟(CPM)
* 添加自定义翻页按键
**2019/10/30**
* 修复从搜索界面打开书籍,是否在上架不对的bug
* 封面换源不显示已经删除的书源
**2019/10/23**
* 繁体-翻译者:Cello琴弦之間
* 封面换源显示封面图片
**2019/10/15**
* 添加繁体语言
* 修复换源界面编辑书源等无法保存的bug
* 其它一些优化
**2019/10/05**
* 搜索时显示书架里的书
**2019/09/25**
* 网络导入书源的记录添加了删除按钮
**2019/09/24**
* 网络导入书源可以记住多个导入网址,方便书源更新
**2019/09/14**
* 阅读界面设置添加微调
* 选择图片在有些手机上可能会崩溃的bug
**2019/09/09**
* 网格书架增加3列4列的选择
* 正文规则为空时内容为章节url
* merged commit cac2689, 更新阅读设置界面,增加一些自带背景
**2019/08/29**
* 修复导入本地不显示文件的bug
* 优化书架网格界面
**2019/08/22**
* 给扩展到刘海屏加了个开关
**2019/08/21**
* 修复一些bug
* 口袋阅书架可以显示了
* 刘海屏阅读界面隐藏状态栏不显示黑条
**2019/08/15**
* 修复拷贝书源问题
**2019/08/13**
* 在退出软件之前会记住搜索分组
**2019/08/12**
* 书源管理分组添加显示勾选
* 详情页点击书名可搜索
* 优化web写源加载速度
* 修复text没了换行的bug
* 修复阅读界面点击章节名称可编辑书源换源不变的bug
**2019/08/10**
* 修复正则写的不对会崩溃的BUG
* 修复正则书源会返回null书籍的BUG
* 阅读界面点击章节名称可编辑书源
* 添加替换净化默认启用关闭的配置
**2019/07/30**
* 修复更新详情页不保存的bug
* 高级功能改为一个月点一次
* 修复web写源会丢音频标志的bug
**2019/07/25**
* 修复一些bug
**2019/07/20**
* 阅读界面菜单添加是否启用替换净化,默认禁用
* Android O以上系统支持正则命名分组
* 其它一些优化
**2019/07/15**
* 优化搜索列表正则AllInOne效率; 增强目录列表正则AllInOne兼容性 by Antecer
* web写源添加一个web书架入口
* 调整书源管理菜单
**2019/07/13**
* 修复BUG
* 修复因加入长按复制导致有声书源崩溃的问题
**2019/07/8**
* 参考搜神添加了长按选择,需主动开启
**2019/07/5**
* 发现添加单个清除缓存
* 尝试修复换源界面禁用错位的问题
**2019/07/4**
* 换源不再会改变书名和作者,防止换到不好的源之后不能再换源
* 规则添加了 ##替换内容##替换为
* 修复了详情页init规则的报错
**2019/07/3**
* 修复一个会导致崩溃的问题
* 修复----在发现或搜索里,点击书籍进入详情页,然后点击换源,选择要换的源,第二次再点击换源,仍然选择之前的那个源,这时候加入书架会变成删除书籍,实际上并没有加入到书架中的问题
**2019/07/1**
* 修复搜索直达详情页的正则处理
**2019/06/30**
* 修复搜索直达详情页的正则处理
* 修复一个会导致崩溃的问题
**2019/06/26**
* 修复书源全选会导致排序混乱的问题
* 修复提示缓存被删除的问题
**2019/06/23**
* 书源规则id节点可以获取多个
* 修复换源后首次不能下载的BUG
* 修复章节可能空白的问题
* 修复没有加入书架不能下载的问题
**2019/06/16**
* 修复文件选择器,路径不能朗读的bug
**2019/06/14**
* 加入kotlin库,安装包又大了一些,后续一些优化会使用kotlin来写
* 重写权限获取,修复没有存储权限时不提示的问题
**2019/06/10**
* 修复书架文字显示不全的问题
* 其它一些优化
**2019/06/08**
* 修复换源界面宽度显示不对的BUG
**2019/06/06**
* 修复对话框内的一些问题
**2019/06/01**
* js库升级到Rhino 1.7.11
**2019/05/31**
* 侧边栏背景跟随主题背景
* 其它一些优化
**2019/05/22**
* 完成整理书架
* 修复一个阅读页面空白的bug
**2019/05/20**
* 修复一键缓存崩溃的问题
* 将切换图标移到主题设置里
* 将清空缓存移到设置里
* 解决校验书源和搜索卡死的问题
**2019/05/19**
* 这是一个比较稳定的版本,没什么大的BUG
* 翻页BUG据反馈已经没有了
**2019/05/18**
* 尝试修复一些翻页问题
* 搜索界面添加简介显示
**2019/05/16**
* 修复部分手机书源编辑界面无法编辑的问题
* 尝试修复可能会出现的翻不了页问题
**2019/05/15**
* 搜索页和详情页为同一网址时不再重复获取网页
* 详情页和目录页为同一网址时不再重复获取网页
* 优化翻页动画,尝试解决一些手机翻页不变的问题
* 书源规则增加一些字段,发现规则独立出来
* 重写书源编辑界面
* 其它一些优化,修复一些bug
**2019/05/13**
* 并行解析多页目录列表,提高解析速度
* 增加js方法,java.put(key, value) java.get(key)
* 搜索增加按书源分组
* 章节绝对url放到访问时再组合,提高解析速度
* 音频播放结束自动下一章
**2019/05/12**
* 修复bug
**2019/05/11**
* 添加有声阅读功能,正文内容返回mp3地址可播放
* 优化解析逻辑,大幅提高解析速度,书源有一些新规则后续会放出说明
* 感谢大佬mabDc提出的优化方案
* 修复bug
**2019/05/06**
* 电量显示放到电池图标内
* url添加()作为保留字符,不编码
* 修改目录加载失败时的报错
**2019/05/05**
* 正文规则$开头使用webView加载网页时js规则会在webView内执行,js会每秒执行一次直到返回值不为空
**2019/05/04**
* 添加txt目录正则管理
* 其它一些优化
**2019/04/30**
* 添加书架的web接口
**2019/04/29**
* 应该解决部分手机翻页时停在中间不执行动画的问题
* 更新build gradle 和一些库文件
* 解决时间可能不刷新的问题
**2019/04/26**
* 优化翻页动画
* 其它一些bug修复
**2019/04/23**
* 修复一个备份恢复bug
* 修改发现界面,解决部分机型卡顿的问题
**2019/04/22**
* web写源功能全部完成
* 修复一个搜索时可能崩溃的bug
**2019/04/20**
* web写书源功能基本完成,主界面菜单开启,感谢Antecer mabDc 的贡献
* 修复网址加书的一个bug
* js发现添加缓存
* wifi分享书源完成,接收书源使用网络导入输入分享IP
**2019/04/18**
* 领红包开启高级功能保持7天
**2019/04/17**
* Modificator commented 侧边栏-主题,添加 E-Ink 模式
* 减少调试日志打印量,目录正文下一页不打印日志
**2019/04/16**
* 重写书源调试,调试更方便直观
* 书源调试可以输入url,添加扫描二维码按钮
* 修复网格视图下拖动排序和切换发现页冲突的bug
* 效验书源改为用搜索和发现效验,搜索使用关键词"我的"
* 效验书源搜索和发现都不可用时才标识失效并禁用
**2019/04/15**
* xpath添加&&,||规则
* 修复部分手机动画问题
**2019/04/14**
* 添加{{js}}规则写法会替换为js执行结果
* 修复手动排序置顶失效的问题
**2019/04/12**
* 修复设置夜间模式会多次Recreate的问题
* WebDav恢复时添加存储权限检查
* 书源调试添加时间戳
* 增加自定义js方法
**2019/04/10**
* 发现规则支持js生成规则文本, \<js>\</js>
**2019/04/09**
* 阅读时如果原书源被删除会自动换源
* 修改JSoup解析文件,修复css规则解析 by mabDc
* 其它一些优化
**2019/04/08**
* 优化内存使用
* 优化替换净化速度
**2019/04/01**
* 修复耳机键不能唤起阅读的BUG
* 搜索和发现可以不写baseUrl
* 添加字间距调整
**2019/03/30**
* 仿真翻页背面加回
* 修复在有些手机上切换夜间模式,书架不跟着切换的bug
**2019/03/29**
* 添加Tip边距调节
* 更新fireBase版本
**2019/03/26**
* 添加RxJavaPlugins.setErrorHandler(Functions.emptyConsumer());防止rxJava内部错误导致崩溃
* 去除打开软件时的权限获取提示
* fix SourceDebug variable missing bug by mabDc was merged a day ago
**2019/03/21**
* 同时解决了背景色差和翻页问题
**2019/03/20**
* 修复了背景色差的问题
**2019/03/19**
* url编码之前判断是否已经编码
* 添加缩进设置
* 修改默认下载文件夹为Files,原cache文件夹会被清理软件清理
* 修复bug
**2019/03/16**
* 搜索URL支持JS语法
* 字符串基本上都写到values\strings,方便制作多语言文件
* 修复离线下载只能输入4位数的问题
* 修复一些可能导致崩溃的BUG
* 修复上版本判断url正则错误的bug
* 修复一些WebDav不显示文件名的bug
**2019/03/14**
* 修复bug
**2019/03/13**
* 修复@header{}写到前面会导致结果出现BaseUrl + url的bug
* webView添加25秒超时,防止一直加载
* 修复trim()去不掉全角空格引起的导入书源失败问题
**2019/03/12**
* 修复bug
* 优化动态网站的内容获取,可以更好地判断网站是否加载完成
**2019/03/10**
* 修复bug
**2019/03/08**
* 添加\<js>\</js>规则,可以写在前面或后面
**2019/03/06**
* 软件崩溃时会复制错误报告到剪贴板
**2019/03/05**
* 优化数字选择器
* 边距调整上限改为100
* 其它一些细节优化
**2019/03/02**
* 修复几个崩溃BUG
* 减小防误触区域
**2019/03/01**
* 添加一个书架ToolBar自动隐藏开关
* 目录去除倒序按钮,添加滚到底部和滚到顶部按钮
**2019/02/28**
* 合并Antecer提交的代码
* 优化Table表格结构标签元素的选择结果,补全Table结构,否则会因为html标准丢失独立于table结构以外的tr和td标签.
* 删除XPath匹配规则的 "," 逗号过滤代码,因为JsoupXpath库已经修复了这个BUG.
**2019/02/27**
* 修复一些本地txt问题
* 修复使用阅读打开本地TXT,EPUB显示空白的问题
* 更新JsoupXpath库,修复部分解析规则选择不到元素的BUG
**2019/02/26**
* 修复一个EPUB乱码的BUG
**2019/02/24**
* 合并Antecer和tumuyan提交的代码
* 改善导入功能:
1.由添加单个网址改善为批量添加网址(使用换行符分割)
2.如果从其他软件分享链接到阅读,阅读自动导入;如果不包含网址,使用原有的搜索。
* 修复Xpath规则匹配章节目录时候,匹配结果没有子元素时,获取目录列表失败的BUG。
**2019/02/20**
* 修复一些WebDav的兼容问题
**2019/02/18**
* WebDav备份与恢复
**2019/02/15**
* 更新XPath库,修复XPath排序混乱的问题
* 其它一些优化
**2019/02/12**
* 换源界面添加搜索框
**2019/02/10**
* 尝试修复上版本部分手机闪退的问题
**2019/02/09**
* 添加setCookie支持
* 合并Antecer提交的代码,解决XPath规则匹配的BUG,xpath可以不写@xpath:开头
**2019/01/29**
* 添加文字操作里搜索菜单的设置
* AJAX动态网站延时两秒获取网站代码
* 年前最后一次更新,过年休息暂停更新
**2019/01/21**
* JsonPath获取一个列表转成字符会自动添加换行符
**2019/01/20**
* 修复一个编码识别BUG
**2019/01/19**
* 隐藏侧边栏滚动条
* 继续优化本地文件编码识别
* 修复朗读时加载错误一直翻页的BUG
**2019/01/18**
* 更换了侧边栏图片,不知道哪个大神制作的
* 更换一个编码识别库,优化本地文件编码识别
**2019/01/16**
* 升级到Android Studio 3.3
* js添加两个方法,java.ajax(String) java.base64Decoder(String)
**2019/01/14**
* 修复屏幕常亮无效的BUG
**2019/01/12**
* 分类规则支持多个结果用&&连接多个规则,可添加字数的规则
**2019/01/11**
* 完善主题
* 修复@get:{key}获取不到值的BUG
* 由于2群被封,修改了入群信息
**2019/01/10**
* 完善主题,改不了颜色的暂时都变成了黑白色
* 添加了恢复默认主题
**2019/01/08**
* 支持@Header:{key:value, key:value}定义http头
* 支持@put:{key:rule, key:rule}存储变量
* 支持@get:{key}获取变量
* 所有自定义变量类型必须为String
* 修复部分书源无法使用的问题
**2019/01/07**
* 继续完善主题
* 基本上所有地址都支持搜索地址的规则了,可以写POST
**2019/01/06**
* 继续完善主题,添加自定义背景色
**2019/01/05**
* 继续完善主题,修复了阅读界面换源不显示的BUG
**2019/01/04**
* 主题功能实现切换ToolBar颜色
**2019/01/01**
* 祝大家元旦快乐
* 修复不显示再按一次退出程序的BUG
* 支持不写规则用js直接处理网页内容
**2018/12/30**
* 目录和书签可以滑动切换
* 修复亮度调节的问题
**2018/12/29**
* 更换颜色选择器,可以直接输入颜色值
* 细节优化
**2018/12/28**
* 修复菜单图标消失的bug
**2018/12/27**
* 项目迁移到androidX
* 修复一些bug
**2018/12/26**
* 发现页长按书源名称增加弹出菜单,编辑 置顶 删除
* json书源规则添加|| && %%分隔符,和原书源规则一样,如@JSon:$.minorCate||$.cat
* 其它一些优化
**2018/12/24**
* 发现页支持样式切换,新样式卡顿可切换老样式
* 修复4.4报错的问题
**2018/12/23**
* 细节优化
**2018/12/21**
* 发现页面改版
**2018/12/19**
* jsonPath获取字符支持此种写法xxx{$._id}yyy{$.chapter}zzz
**2018/12/18**
* 书源编辑界面添加常用工具条,可快速输入常用字符
**2018/12/17**
* 书源导入添加从二维码导入,可以是书源和网址,网址和从网络导入一个效果
* 阅读界面的菜单可以直接领红包,高级功能失效时显示.
* 修复删除粒子动画
* 修复一些BUG
**2018/12/15**
* 添加书源调试,检查书源更方便
**2018/12/14**
* 修复优化背景图读取引起滚动背景不对的bug
**2018/12/13**
* 优化背景图读取,防止oom
* 编辑书源界面改成中文
**2018/12/12**
* 添加登陆功能,可以阅读一些需要登陆的网站,需要配置一下书源的登陆地址,可以在书源菜单里登陆,也可以在阅读菜单里登陆
* 将当前网址传到了js里,变量名为baseUrl
**2018/12/11**
* 合并**refgd**提交的代码,优化规则解析,使用LinkedHashSet去重提升速度
* 一些BUG修复
**2018/12/10**
* 修复一些书源不对会引起崩溃的bug
* 添加一个进入书架的快捷方式,防止直接进入最后阅读反复崩溃的问题
* 减小安装包体积
* 感谢**沚水**给书源规则网站做了美化
**2018/12/09**
* 修复一些BUG
* 需要js处理时再加载js引擎,解决了刷新速度变慢的问题
* 给目录添加了去重处理,保留后面,比如有些源,最前面有最新章节会和后面重复,导致bug
**2018/12/08**
* 支持XPath语法,以@XPath:开头,语法见 http://www.w3school.com.cn/xpath/index.asp
* 支持JSonPath语法,以@JSon:开头,语法见 https://blog.csdn.net/koflance/article/details/63262484
* 支持用js处理结果,以@js:开头,结果变量为result 如 "@JSon:$.link@js:"http://chapterup.zhuishushenqi.com/chapter/" + encodeURIComponent(result)"
* **注意** #替换规则在新语法下无法使用,新的语法用js处理结果,原有的规则不变
* 去掉了隐藏书源,隐藏书源已经可以用JSonPath语法写出来
* 新增的语法作为高级功能需要领红包才能开启
**2018/12/07**
* 修复一下朗读时手动翻页可能会翻两页的情况,概率没那么大了
**2018/12/05**
* 修复简介显示不全又不能滚动的bug
* 合并M17764017422提交的代码,TTS初始化失败自动打开TTS设置
**2018/12/04**
* 为防止侵权,去掉了默认书源,需要书源请自行想办法
**2018/12/03**
* 修复本地txt文件丢失第一章节的BUG
**2018/12/02**
* 正在朗读的文字颜色变化
**2018/12/01**
* 下载通知合并为一个
* 其它一些bug修复
**2018/11/30**
* 修复书籍详情页面在横屏显示不全时简介不能滚动的问题
* 修复其它一些BUG
* 合并atbest提交的代码
* tag和class的位置可以使用负数,表示倒数
* 添加正则表达式替换:split("#") 第3项
* lastRule添加ownText:只显示Element自己的文字,不显示child的文字
* 添加Element过滤规则:用">"分隔,只选择含有特定class、id、tag或者text的Element
* 判断搜索结果是否重定向到书籍页面,如果是的话就书籍规则获取内容
**2018/11/29**
* 修复一些BUG
* 书籍详情页面在横屏显示不全时可滚动
* 修复一个length=0;index=-1的报错
**2018/11/24**
* 修复一个背景问题导致的崩溃bug
* %不再代表列表的最后一个,列表排除后面的用负值表示,-1表示倒数第一个,-2表示倒数第2个
* 用%分隔列表规则,这些列表规则将会依次取数,如三个列表,先取列表1的第一个,再取列表2的第一个,再取列表3的第一个,再取列表1的第2个
**2018/11/23**
* 修复一些BUG
* 发现页长按分组可编辑书源
* 书籍详情菜单添加编辑书源
* 搜索规则|char=escape 会模拟js escape方法进行编码
**2018/11/21**
* 按章节朗读,解决分页朗读时翻页处朗读不畅的问题
* 语音引擎如果支持朗读进度播报,则能及时翻页,如不支持会等朗读完一段再判断是否翻页
**2018/11/20**
* 修复因添加规则引起的一些问题
* 支持内容分页全是下一章的内容获取
**2018/11/19**
* 下一章节URL支持同时获取多个,如果有多个会依次获取,如果只有一个同以前
* 搜索记录最多显示50条,可滚动
* 书籍详情页面添加菜单按钮,不常用功能收集到菜单
**2018/11/18**
* 修复一个closed的bug
* 书架不再显示进度,改为显示未读章节数,红色有更新,灰色无更新
**2018/11/17**
* 优化界面
* 合并 atbest 的代码,书架界面修改
* 合并 Invinciblelee 的代码,下载
**2018/11/15**
* 书源管理界面搜索的字调小了一些,可以显示全书源数量
* 更换一些图标,感谢**爱发猫表情的新奥尔良烤鲟鱼堡**
* 修复EPUB内容与章节不对应的问题
* 修复一些BUG
**2018/11/14**
* 书架添加全部书籍分类
* 更换一些图标,由**爱发猫表情的新奥尔良烤鲟鱼堡**制作
* 添加了一个导航栏变色开关,有些手机不好适配,麻烦
* 关于里添加了一个分享软件的按钮,可以二维码分享
* 合并 atbest 代码,添加EPUB封面
**2018/11/13**
* 修复换源搜索所有源的问题
* 换源下拉刷新还是会重新搜索
* 合并 atbest 代码,修复拼音排序
* 解决一些导致崩溃的BUG
* 修复换源里搜索不到的问题
**2018/11/12**
* 合并 atbest 代码
* 全新的滚动模式
* 独立本地书架
* 优化朗读时淡入淡出
* Epub滚动模式显示封面
* 修复Epub乱码问题
* 支持使用高清背景图片
* 其他
**2018/11/11**
* 换源时刷新不会删除已经搜索到的源,只会更新并搜索没有搜索到的书源
* 换源添加长按菜单
* 修复亮度问题
**2018/11/10**
* 一些优化,和bug修复
* 书源添加排序选项,可选择手动排序,智能排序,拼音排序
* 目录拷贝 Invinciblelee 的代码,修改了界面,添加倒序
* 版本号改用日期,首段大版本号,中间年份,尾段日期,精确到小时
* 封面全采用圆角,调整颜色
**2018/11/7**
* 添加后台自动更新换源里的最新章节
**2018/11/6**
* 修复音量键翻页没有动画的bug
* 修复缓存路径自动变为默认的bug
**2018/11/5**
* 本地书籍加入编码设置,如遇乱码可自行设置编码
* 优化EPUB目录读取,可以读取多级目录了
* 解决本地TXT章节丢失的问题
* 其它一些优化
**2018/11/4**
* 修复设置有时弹不出来的bug
* 修改TXT目录正则后自动刷新目录
**2018/11/3**
* 解决一些BUG
* 加入自定义TXT目录正则
* 拷贝https://github.com/Invinciblelee的代码增加EPUB文件支持
* 优化阅读设置,解决隐藏虚拟操作栏下面显示空白的问题
**2018/11/2**
* 解决一些BUG
* 如何查看书籍详情?
* 按阅读时间或更新时间排序的,长按书籍;手动排序的,列表视图单击或长按书籍封面,网格视图单击书籍名称。
* 阅读界面菜单添加更新目录
**2018/11/1**
* 解决替换影响速度的问题
**2018/10/31**
* 解析章节放到后台,进一步提升翻页流畅度
* 合并 https://github.com/atbest 提交的代码
* 净化替换规则可选是否为正则表达式
* 书籍详情界面显示剩余章节数
* 恢复备份以后不重复显示更新日志
* 朗读时淡入淡出
* 仿真翻页背景虚化
* 其他Bug修复及优化
**2018/10/26**
* 优化翻页,更流畅
**2018/10/23**
* 合并 https://github.com/atbest 提交的代码, 修复恢复设置不能恢复阅读背景之类的
* 添加记住书架分组,重新打开时自动进入退出时的分组
* 添加显示所有发现的设置
* 优化书籍详情,采用自适应布局
* 其它一些优化
**2018/10/20**
* 修复点击返回按钮闪退的BUG
* 禁用预解析下一章内容,看还有没有翻页时窜章的,如果有请反馈,我好确认问题所在
* 修复从发现搜索时不直接显示搜索结果的问题
* 添加滚动时也可以点击翻页
* 修复目录已下载加粗关闭重开会消失的问题
* 其它一些优化
**2018/10/19**
* 升级SDK
* 修复升级SDK引起的一些问题
* 优化分区切换
* 关于里添加常见问题
* 添加自动备份
* 解决发现滚动不触发动画滚动不到底的问题
* 合并代码,其它一些优化
**2018/10/17**
* 优化书架分区切换
* 合并代码,其它一些优化
**2018/10/16**
* 合并 大古队员 的代码
* 界面改版
**2018/10/15**
* 合并 https://github.com/atbest 提交的代码
* 缓存文件添加目录,修改缓存文件名,方便需要合并文件的人
* 添加禁止更新功能
**2018/10/14**
* 合并 https://github.com/atbest 提交的代码
* 添加tip是否跟随边距调整的开关
* 快速滚动条修改
* 修复目录加粗可能在部分机型上不起作用的BUG
* 复制了一些 https://github.com/Invinciblelee 的代码
**2018/10/13**
* 合并 https://github.com/atbest 提交的代码,修复一些BUG,滚动模式背景不随内容滚动
* 稍微修改一下界面
* 领支付宝红包彩蛋修改为持续3天
**2018/10/10**
* 修复可能引起的跳章的问题
* 电量添加百分比
**2018/10/08**
* 修复音量翻页开关
* 合并 https://github.com/atbest 提交的代码
**2018/10/03**
* 添加朗读时音量翻页开关
* 关闭滚动模式的惯性滚动
* 更新前先删除原有目录,看能不能解决双目录问题
**2018/10/02**
* 添加更新检查,可直接下载最新版本
* 朗读时自动关闭音量翻页
* 修复一些BUG
**2018/10/01**
* 添加一个自动翻页倒计时条
* 本地导入书源可以选择.json文件
* 修复一些BUG
**2018/09/29**
* 修复一些BUG
**2018/09/26**
* 为当前使用的字体添加标志
* 阅读界面菜单添加禁用书源
* 添加自定义缓存路径
* 其它一些优化
**2018/09/25**
* 换源时智能选择对应的章节
* 其它一些优化和BUG修复
* 感谢 https://github.com/atbest 提交的代码
**2018/09/23**
* 修复下载时线程过多导致的崩溃
* 修复无网络一直加载的问题
**2018/09/21**
* 修复一些BUG
* 书源管理添加选择分组功能
**2018/09/20**
* 优化html取值
**2018/09/19**
* 修复一些BUG
* 取值规则添加&分隔符,合并所有取值
* 取值规则添加children,获取所有子标签
* 取值规则添加html,获取所有文本
**2018/09/17**
* 解决更换字体时文字有可能不对齐的问题
**2018/09/14**
* 添加内容分页获取规则
**2018/09/13**
* 内容可以用TalkBack朗读
* 修复一个BUG,String input must not be null
**2018/09/12**
* 替换添加作用于,可填写书名和书源url,不填应用到所有
**2018/09/10**
* 修复搜索时卡顿
* 添加直接打开最近阅读设置
**2018/09/07**
* 添加本地时点路径可以选择SD卡
**2018/09/06**
* 点击作者会搜索作者
* 修复切换手动排序长按封面可能不出书籍信息的BUG
* 其它一些优化
**2018/09/04**
* 添加自定义封面
**2018/08/31**
* 添加自动翻页功能
**2018/08/29**
* 尝试修复选择图片背景闪退问题
* 尝试修复搜索闪退问题
**2018/08/27**
* 去除了获取内容时的空格替换
* 搜索添加停止按钮
* 修复一些bug
**2018/08/23**
* 修复了本地书籍双目录的bug
* 其它一些修复
**2018/08/20**
* 添加段距调整
* 修复bug
* 无动画时手指拿起才会翻页
**2018/08/14**
* 背景图不再放到缓存,背景图经过处理减少卡顿
* 备份可以备份设置,备份文件夹改变为YueDu
**2018/08/14**
* 更改了选择字体的方式
* 修复一些BUG
**2018/08/13**
* 优化启动速度,启动时不读取详细目录
* 修复一些BUG
**2018/08/09**
* 优化修复bug
**2018/08/09**
* 修改书架界面
* 修改本地导入界面
* 修复BUG
**2018/08/08**
* 修复BUG,本地书籍乱码,点击翻页选项无效等问题
**2018/08/06**
* 重写阅读界面代码,实现多种翻页模式
================================================
FILE: app/src/main/assets/web/bookshelf.css
================================================
html, body {
height: 100%;
margin: 0;
}
.hide {
display: none;
}
.top, .showchapter, .hidebooks {
width: 60px;
height: 50px;
position: absolute;
right: 30px;
bottom: 30px;
color: black;
font-size: 28px;
background-color: #ddd;
opacity: 0.85;
}
.top {
bottom: 150px;
}
.showchapter {
bottom: 90px;
bottom: 90px;
}
.address {
width: 270px;
}
.nav {
border-bottom: solid 1px #ccc;
}
input, button {
width: 110px;
line-height: 34px;
background-color: #eee;
color: #555;
border: none;
margin: 10px 5px;
font-weight: 500;
border-radius: 2px;
outline: none;
cursor: pointer;
}
input {
padding: 0 10px;
cursor: text;
}
input:hover, button:hover {
border-color: #aaa;
background-color: #efefef;
color: #222;
outline: solid 1px #ccc;
}
.allcontent {
height: calc(100% - 60px);
}
.allscreen {
height: 100%
}
.books > div {
display: inline-block;
margin: 10px;
vertical-align: top;
border: solid 1px #ddd;
}
.read > .books {
width: 420px;
float: left;
height: 100%;
overflow: auto;
border-right: solid 1px #ccc;
}
.read > .books > div {
margin-right: 0;
border-right: none;
}
.more {
overflow-y: auto;
height: 100%;
display: none;
}
.read .more {
display: block;
}
.books > div > img {
width: 120px;
height: 180px;
float: left;
margin-right: 10px;
cursor: pointer;
}
.info {
padding: 10px 20px 0 20px;
width: 600px;
margin: 0 auto;
}
.info > img {
width: 600px;
height: 900px;
}
.info p {
line-height: 1.5;
text-align: justify;
margin: 0;
}
.books tr:nth-child(n+2) td {
border-top: solid 1px #999;
}
.books td:nth-child(1) {
vertical-align: top;
width: 50px;
}
.books td:nth-child(2) {
vertical-align: top;
width: 200px;
}
.clear {
clear: both;
}
.chapter {
margin: 10px;
max-height: 500px;
overflow-y: auto;
border-top: solid 1px #333;
border-bottom: solid 1px #333;
}
.chapter button {
width: 230px;
text-align: left;
text-indent: 14px;
margin: 10px 4px;
}
.content {
padding: 20px;
text-align: justify;
min-height: 1000px;
padding-bottom: 200px;
}
.content h2 {
font-family: "Microsoft YaHei",微软雅黑,"MicrosoftJhengHei",华文细黑,STHeiti,MingLiu;
font-weight: 500;
text-align: center;
line-height: 100px;
font-size: 40px;
margin: 0;
}
================================================
FILE: app/src/main/assets/web/bookshelf.html
================================================
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>阅读书架</title>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link href="bookshelf.css" rel="stylesheet" />
</head>
<body>
<button id="top" class="top">↑</button>
<button id="showchapter" class="showchapter">≡</button>
<button id="hidebooks" class="hidebooks">❑</button>
<div class="nav">
<button id="back">返回</button>
<button id="type">所有书籍 ▼</button>
<button id="sort">手动排序 ▼</button>
<button id="setting">阅读设置</button>
<input type="text" class="address" id="address" title="阅读APP地址或IP" value="" />
<button id="refresh">重新加载</button>
</div>
<div class="allcontent" id="allcontent">
<div id="books" class="books"></div>
<div id="more" class="more">
<div id="info" class="info"></div>
<div class="clear"></div>
<div id="chapter" class="chapter"></div>
<div id="content" class="content"></div>
<div id="page" class="button">
<center><button id='up'>上一章</button><button id='down'>下一章</button></center>
</div>
</div>
</div>
<script src="bookshelf.js"></script>
</body>
</html>
================================================
FILE: app/src/main/assets/web/bookshelf.js
================================================
var $ = document.querySelector.bind(document)
, $$ = document.querySelectorAll.bind(document)
, $c = document.createElement.bind(document)
, randomImg = "http://api.mtyqx.cn/api/random.php"
, randomImg2 = "http://img.xjh.me/random_img.php"
, books
;
var now_chapter = -1;
var sum_chapter = 0;
var formatTime = value => {
return new Date(value).toLocaleString('zh-CN', {
hour12: false, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"
}).replace(/\//g, "-");
};
var apiMap = {
"getBookshelf": "/getBookshelf",
"getChapterList": "/getChapterList",
"getBookContent": "/getBookContent",
"saveBook": "/saveBook"
};
var apiAddress = (apiName, url) => {
let address = $('#address').value || window.location.host;
if (!(/^http|^\/\//).test(address)) {
address = "//" + address;
}
if (!(/:\d{4,}/).test(address.split("//")[1].split("/")[0])) {
address += ":1122";
}
localStorage.setItem('address', address);
return address + apiMap[apiName] + (url ? "?url=" + encodeURIComponent(url) : "");
};
var init = () => {
$('#allcontent').classList.remove("read");
$('#books').innerHTML = "";
fetch(apiAddress("getBookshelf"), { mode: "cors" })
.then(res => res.json())
.then(data => {
if (!data.isSuccess) {
alert(getBookshelf.errorMsg);
return;
}
books = data.data.sort((book1, book2) => book1.serialNumber - book2.serialNumber);
books.forEach((book, i) => {
let bookDiv = $c("div");
let img = $c("img");
img.src = book.bookInfoBean.coverUrl || randomImg;
img.setAttribute("data-series-num", i);
bookDiv.appendChild(img);
bookDiv.innerHTML += `<table><tbody>
<tr><td>书名:</td><td>${book.bookInfoBean.name}</td></tr>
<tr><td>作者:</td><td>${book.bookInfoBean.author}</td></tr>
<tr><td>阅读:</td><td>${book.durChapterName}<br>${formatTime(book.finalDate)}</td></tr>
<tr><td>更新:</td><td>${book.lastChapterName}<br>${formatTime(book.finalRefreshData)}</td></tr>
<tr><td>来源:</td><td>${book.bookInfoBean.origin}</td></tr>
</tbody></table>`;
$('#books').appendChild(bookDiv);
});
$$('#books img').forEach(bookImg =>
bookImg.addEventListener("click", () => {
now_chapter = -1;
sum_chapter = 0;
$('#allcontent').classList.add("read");
var book = books[bookImg.getAttribute("data-series-num")];
$("#info").innerHTML = `<img src="${bookImg.src}">
<p> 来源:${book.bookInfoBean.origin}</p>
<p> 书名:${book.bookInfoBean.name}</p>
<p> 作者:${book.bookInfoBean.author}</p>
<p>阅读章节:${book.durChapterName}</p>
<p>阅读时间:${formatTime(book.finalDate)}</p>
<p>最新章节:${book.lastChapterName}</p>
<p>检查时间:${formatTime(book.finalRefreshData)}</p>
<p> 简介:${book.bookInfoBean.introduce.trim().replace(/\n/g, "<br>")}</p>`;
window.location.hash = "";
window.location.hash = "#info";
$("#content").innerHTML = "章节列表加载中...";
$("#chapter").innerHTML = "";
fetch(apiAddress("getChapterList", book.noteUrl), { mode: "cors" })
.then(res => res.json())
.then(data => {
if (!data.isSuccess) {
alert(data.errorMsg);
$("#content").innerHTML = "章节列表加载失败!";
return;
}
data.data.forEach(chapter => {
let ch = $c("button");
ch.setAttribute("data-url", chapter.durChapterUrl);
ch.setAttribute("data-index", chapter.durChapterIndex);
ch.setAttribute("title", chapter.durChapterName);
ch.innerHTML = chapter.durChapterName.length > 15 ? chapter.durChapterName.substring(0, 14) + "..." : chapter.durChapterName;
$("#chapter").appendChild(ch);
});
sum_chapter = data.data.length;
$('#chapter').scrollTop = 0;
$("#content").innerHTML = "章节列表加载完成!";
});
}));
});
};
$("#back").addEventListener("click", () => {
if (window.location.hash === "#content") {
window.location.hash = "#chapter";
} else if (window.location.hash === "#chapter") {
window.location.hash = "#info";
} else {
$('#allcontent').classList.remove("read");
}
});
$("#refresh").addEventListener("click", init);
$('#hidebooks').addEventListener("click", () => {
$("#books").classList.toggle("hide");
$(".nav").classList.toggle("hide");
$("#allcontent").classList.toggle("allscreen");
});
$('#top').addEventListener("click", () => {
window.location.hash = "";
window.location.hash = "#info";
});
$('#showchapter').addEventListener("click", () => {
window.location.hash = "";
window.location.hash = "#chapter";
});
$('#up').addEventListener('click', e => {
if (now_chapter > 0) {
now_chapter--;
let clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent("click", true, false);
$('[data-index="' + now_chapter + '"]').dispatchEvent(clickEvent);
} else if (now_chapter == 0) {
alert("已经是第一章了^_^!")
} else {
}
});
$('#down').addEventListener('click', e => {
if (now_chapter > -1) {
if (now_chapter < sum_chapter - 1) {
now_chapter++;
let clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent("click", true, false);
$('[data-index="' + now_chapter + '"]').dispatchEvent(clickEvent);
} else {
alert("已经是最后一章了^_^!")
}
}
});
$('#chapter').addEventListener("click", (e) => {
if (e.target.tagName === "BUTTON") {
var url = e.target.getAttribute("data-url");
var index = e.target.getAttribute("data-index");
var name = e.target.getAttribute("title");
if (!url) {
alert("未取得章节地址");
}
now_chapter = parseInt(index);
$("#content").innerHTML = "<p>" + name + " 加载中...</p>";
fetch(apiAddress("getBookContent", url), { mode: "cors" })
.then(res => res.json())
.then(data => {
if (!data.isSuccess) {
alert(data.errorMsg);
$("#content").innerHTML = "<p>" + name + " 加载失败!</p>";
return;
}
var content = data.data.trim().split("\n\n");
if (content.length === 2) {
$("#content").innerHTML = `<h2>${content[0]}</h2> (全文 ${content[1].length} 字)<br><br> ` + content[1].trim().replace(/\n/g, "<br><br>");
} else {
$("#content").innerHTML = `<h2>${name || e.target.innerHTML}</h2> (全文 ${data.data.length} 字)<br><br> ` + data.data.trim().replace(/\n/g, "<br><br>");
}
window.location.hash = "";
window.location.hash = "#content";
});
}
});
$('#address').setAttribute("placeholder", "阅读APP地址或IP:" + window.location.host);
if (!$('#address').value && typeof localStorage && localStorage.getItem('address')) {
$('#address').value = localStorage.getItem('address');
}
init();
================================================
FILE: app/src/main/assets/web/index.css
================================================
body {
margin: 0;
}
.editor {
display: flex;
align-items: stretch;
}
.setbox,
.menu,
.outbox {
flex: 1;
display: flex;
flex-flow: column;
max-height: 100vh;
overflow-y: auto;
}
.menu {
justify-content: center;
max-width: 90px;
margin: 0 5px;
}
.menu .button {
width: 90px;
height: 30px;
min-height: 30px;
margin: 5px 0px;
cursor: pointer;
}
@keyframes stroker {
0% {
stroke-dashoffset: 0
}
100% {
stroke-dashoffset: -240
}
}
.button rect {
width: 100%;
height: 100%;
fill: transparent;
stroke: #666;
stroke-width: 2px;
}
.button rect.busy {
stroke: #fD1850;
stroke-dasharray: 30 90;
animation: stroker 1s linear infinite;
}
.button text {
text-anchor: middle;
dominant-baseline: middle;
}
.setbox {
min-width: 40em;
}
.rules,
.tabbox {
flex: 1;
display: flex;
flex-flow: column;
}
.rules>* {
display: flex;
margin: 2px 0;
}
.rules textarea {
flex: 1;
margin-left: 5px;
}
.rules>*,
.rules>*>div,
.rules textarea {
min-height: 1em;
}
textarea {
word-break: break-all;
}
.tabtitle {
display: flex;
z-index: 1;
justify-content: flex-end;
}
.tabtitle>div {
cursor: pointer;
padding: 1px 10px 0 10px;
border-bottom: 3px solid transparent;
font-weight: bold;
}
.tabtitle>.this {
color: #4f9da6;
border-bottom-color: #4EBBE4;
}
.tabbody {
flex: 1;
display: flex;
margin-top: -1px;
border: 1px solid #A9A9A9;
height: 0;
}
.tabbody>* {
flex: 1;
flex-flow: column;
display: none;
}
.tabbody>.this {
display: flex;
}
.tabbody>*>.titlebar{
display: flex;
}
.tabbody>*>.titlebar>*{
flex: 1;
margin: 1px 1px 1px 1px;
}
.tabbody>*>.context {
flex: 1;
flex-flow: column;
border: 0;
padding: 5px;
overflow-y: auto;
}
.tabbody>*>.inputbox{
border: 0;
border-bottom: #A9A9A9 solid 1px;
height: 15px;
text-align:center;
}
.link>* {
display: flex;
margin: 5px;
border-bottom: 1px solid;
text-decoration: none;
}
#RuleList>label>* {
background: #eee;
padding-left: 3px;
margin: 2px 0;
cursor: pointer;
}
#RuleList input[type=radio] {
display: none;
}
#RuleList input[type="radio"]:checked+* {
background: #15cda8;
}
.isError {
color: #FF0000;
}
================================================
FILE: app/src/main/assets/web/index.html
================================================
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>书源编辑器v3.8</title>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="stylesheet" type="text/css" href="/index.css" />
<script type="text/javascript" src="/index.js" defer></script>
</head>
<body>
<div class="editor">
<div class="setbox">
<div class="rules">
<div><b>书源基础信息</b></div>
<div>
<div>书源名称:</div>
<textarea rows="1" id="bookSourceName" placeholder="书源名称(bookSourceName) | 会显示在书源列表"></textarea>
</div>
<div>
<div>书源分组:</div>
<textarea rows="1" id="bookSourceGroup" placeholder="书源分组(bookSourceGroup) | 描述书源的特征信息"></textarea>
</div>
<div>
<div>书源类型:</div>
<textarea rows="1" id="bookSourceType" placeholder="书源类型(bookSourceType) | 有声读物(填写AUDIO)或文本读物(留空)"></textarea>
</div>
<div>
<div>书源域名:</div>
<textarea rows="1" id="bookSourceUrl" placeholder="书源URL(bookSourceUrl) | 通常填写网站主页(标头不可省略),例: https://www.qidian.com"></textarea>
</div>
<div>
<div>登录网页:</div>
<textarea rows="1" id="loginUrl" placeholder="登录URL(loginUrl) | 填写网站登录网址,仅在需要登录的书源有用"></textarea>
</div>
<div><b>书籍发现规则</b></div>
<div>
<div>发现菜单:</div>
<textarea rows="5" id="ruleFindUrl" placeholder="发现分类菜单规则(ruleFindUrl),将显示在发现菜单 每行一条发现分类(网址域名可省略): 名称1::网址(Url)1 名称2::网址(Url)2 ..."></textarea>
</div>
<div>
<div>结果列表:</div>
<textarea rows="1" id="ruleFindList" placeholder="发现页列表规则(ruleFindList) | 选择书籍节点 (规则结果为List<Element>)"></textarea>
</div>
<div>
<div>书籍名称:</div>
<textarea rows="1" id="ruleFindName" placeholder="发现页书名规则(ruleFindName) | 选择节点书名 (规则结果为String)"></textarea>
</div>
<div>
<div>书籍作者:</div>
<textarea rows="1" id="ruleFindAuthor" placeholder="发现页作者规则(ruleFindAuthor) | 选择节点作者 (规则结果为String)"></textarea>
</div>
<div>
<div>书籍分类:</div>
<textarea rows="1" id="ruleFindKind" placeholder="发现页分类规则(ruleFindKind) | 选择节点分类信息 (规则结果为List<String>)"></textarea>
</div>
<div>
<div>最新章节:</div>
<textarea rows="1" id="ruleFindLastChapter" placeholder="发现页最新章节规则(ruleFindLastChapter) | 选择节点最新章节 (规则结果为String)"></textarea>
</div>
<div>
<div>简介内容:</div>
<textarea rows="1" id="ruleFindIntroduce" placeholder="发现页简介规则(ruleFindIntroduce) | 选择节点书籍简介 (规则结果为String)"></textarea>
</div>
<div>
<div>封面链接:</div>
<textarea rows="1" id="ruleFindCoverUrl" placeholder="发现页封面规则(ruleFindCoverUrl) | 选择节点书籍封面 (规则结果为Url)"></textarea>
</div>
<div>
<div>详情链接:</div>
<textarea rows="1" id="ruleFindNoteUrl" placeholder="发现页详情规则(ruleFindNoteUrl) | 选择书籍详情页网址 (规则结果为Url)"></textarea>
</div>
<div><b>书籍搜索规则</b></div>
<div>
<div>搜索网址:</div>
<textarea rows="1" id="ruleSearchUrl" placeholder="搜索网址(ruleSearchUrl) | [域名可省略]/search.php@kw=searchKey|char=utf-8"></textarea>
</div>
<div>
<div>结果验证:</div>
<textarea rows="1" id="ruleBookUrlPattern" placeholder="搜索页URL验证(ruleBookUrlPattern) | 正则验证URL是否为详情页,成功则跳过搜索页解析"></textarea>
</div>
<div>
<div>结果列表:</div>
<textarea rows="1" id="ruleSearchList" placeholder="搜索页列表规则(ruleSearchList) | 选择书籍节点 (规则结果为List<Element>)"></textarea>
</div>
<div>
<div>书籍名称:</div>
<textarea rows="1" id="ruleSearchName" placeholder="搜索页书名规则(ruleSearchName) | 选择节点书名 (规则结果为String)"></textarea>
</div>
<div>
<div>书籍作者:</div>
<textarea rows="1" id="ruleSearchAuthor" placeholder="搜索页作者规则(ruleSearchAuthor) | 选择节点作者 (规则结果为String)"></textarea>
</div>
<div>
<div>书籍分类:</div>
<textarea rows="1" id="ruleSearchKind" placeholder="搜索页分类规则(ruleSearchKind) | 选择节点分类信息 (规则结果为List<String>)"></textarea>
</div>
<div>
<div>最新章节:</div>
<textarea rows="1" id="ruleSearchLastChapter" placeholder="搜索页最新章节规则(ruleSearchLastChapter) | 选择节点最新章节 (规则结果为String)"></textarea>
</div>
<div>
<div>简介内容:</div>
<textarea rows="1" id="ruleSearchIntroduce" placeholder="搜索页简介规则(ruleSearchIntroduce) | 选择节点书籍简介 (规则结果为String)"></textarea>
</div>
<div>
<div>封面链接:</div>
<textarea rows="1" id="ruleSearchCoverUrl" placeholder="搜索页封面规则(ruleSearchCoverUrl) | 选择节点书籍封面 (规则结果为Url)"></textarea>
</div>
<div>
<div>详情链接:</div>
<textarea rows="1" id="ruleSearchNoteUrl" placeholder="搜索页详情规则(ruleSearchNoteUrl) | 选择书籍详情页网址 (规则结果为Url)"></textarea>
</div>
<div><b>书籍详情规则</b></div>
<div>
<div>页面处理:</div>
<textarea rows="1" id="ruleBookInfoInit" placeholder="详情页信息预处理(ruleBookInfoInit) | 用于加速详情信息检索"></textarea>
</div>
<div>
<div>书籍名称:</div>
<textarea rows="1" id="ruleBookName" placeholder="书名规则(ruleBookName) | 选择详情页书名 (规则结果为String)"></textarea>
</div>
<div>
<div>书籍作者:</div>
<textarea rows="1" id="ruleBookAuthor" placeholder="作者规则(ruleBookAuthor) | 选择详情页作者 (规则结果为String)"></textarea>
</div>
<div>
<div>书籍分类:</div>
<textarea rows="1" id="ruleBookKind" placeholder="分类规则(ruleBookKind) | 选择详情页分类信息 (规则结果为List<String>)"></textarea>
</div>
<div>
<div>最新章节:</div>
<textarea rows="1" id="ruleBookLastChapter" placeholder="最新章节规则(ruleBookLastChapter) | 选择详情页最新章节 (规则结果为String)"></textarea>
</div>
<div>
<div>简介内容:</div>
<textarea rows="1" id="ruleIntroduce" placeholder="简介规则(ruleIntroduce) | 选择详情页书籍简介 (规则结果为String)"></textarea>
</div>
<div>
<div>封面链接:</div>
<textarea rows="1" id="ruleCoverUrl" placeholder="封面规则(ruleCoverUrl) | 选择详情页书籍封面 (规则结果为Url)"></textarea>
</div>
<div>
<div>目录链接:</div>
<textarea rows="1" id="ruleChapterUrl" placeholder="目录URL规则(ruleChapterUrl) | 选择目录页网址 (规则结果为Url, 与详情页相同时可省略)"></textarea>
</div>
<div><b>目录列表规则</b></div>
<div>
<div>目录翻页:</div>
<textarea rows="1" id="ruleChapterUrlNext" placeholder="目录下一页规则(ruleChapterUrlNext) | 选择目录下一页链接 (规则结果为List<Url>)"></textarea>
</div>
<div>
<div>目录列表:</div>
<textarea rows="1" id="ruleChapterList" placeholder="目录列表规则(ruleChapterList) | 选择目录列表的章节节点 (规则结果为List<Element>)"></textarea>
</div>
<div>
<div>章节名称:</div>
<textarea rows="1" id="ruleChapterName" placeholder="章节名称规则(ruleChapterName) | 选择章节名称 (规则结果为String)"></textarea>
</div>
<div>
<div>章节链接:</div>
<textarea rows="1" id="ruleContentUrl" placeholder="章节URL规则(ruleContentUrl) | 选择章节链接 (规则结果为Url)"></textarea>
</div>
<div><b>正文阅读规则</b></div>
<div>
<div>章节正文:</div>
<textarea rows="1" id="ruleBookContent" placeholder="正文规则(ruleBookContent) | 选择正文内容 (规则结果为String)"></textarea>
</div>
<div>
<div>正文翻页:</div>
<textarea rows="1" id="ruleContentUrlNext" placeholder="正文翻页URL规则(ruleContentUrlNext) | 选择下一分页(不是下一章)链接 (规则结果为Url)"></textarea>
</div>
<div><b>其它规则</b></div>
<div>
<div>浏览标识:</div>
<textarea rows="1" id="httpUserAgent" placeholder="浏览器UA(HttpUserAgent) | 浏览器标识:User-Agent (可选)"></textarea>
</div>
<div>
<div>排序编号:</div>
<textarea rows="1" id="serialNumber" placeholder="整数: 0~N (可选,默认0) | 数字越小越靠前"></textarea>
</div>
<div>
<div>搜索权重:</div>
<textarea rows="1" id="weight" placeholder="整数: 0~N (可选,默认0) | 数字越大越靠前"></textarea>
</div>
<div>
<div>是否启用:</div>
<textarea rows="1" id="enable" placeholder="默认启用=true,手动启用=false (可选,默认true)"></textarea>
</div>
</div>
</div>
<div class="menu">
<svg class="button">
<text x="50%" y="55%">⇈推送书源</text>
<rect id="push"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">⇊拉取书源</text>
<rect id="pull"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">⋘编辑书源</text>
<rect id="editor"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">⋙生成书源</text>
<rect id="conver"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">✗清空表单</text>
<rect id="initial"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">↶撤销操作</text>
<rect id="undo"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">↷重做操作</text>
<rect id="redo"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">⇏调试书源</text>
<rect id="debug"></rect>
</svg>
<svg class="button">
<text x="50%" y="55%">✓保存书源</text>
<rect id="accept"></rect>
</svg>
</div>
<div class="outbox">
<div class="tabbox">
<div class="tabtitle">
<div name="编辑书源" class="tab1 this">编辑书源</div>
<div name="调试书源" class="tab2">调试书源</div>
<div name="书源列表" class="tab3">书源列表</div>
<div name="帮助信息" class="tab4">帮助信息</div>
</div>
<div class="tabbody">
<div class="tab1 this">
<textarea class="context" id="RuleJsonString" placeholder="这里输出序列化的JSON数据,可直接导入'阅读'APP"></textarea>
</div>
<div class="tab2">
<input type="text" class="inputbox" id="DebugKey" placeholder="我的">
<textarea class="context" id="DebugConsole" placeholder="这里用于输出调试信息"></textarea>
</div>
<div class="tab3">
<div class="titlebar">
<button id="Import">导入书源文件</button>
<button id="Export">导出书源文件</button>
<button id="Delete">删除选中书源</button>
<button id="ClrAll">清空当前列表</button>
</div>
<div class="context" id="RuleList"></div>
</div>
<div class="tab4">
<div class="context link">
<a target="_blank" href="https://gedoor.github.io/MyBookshelf/sourcerule.html">官方书源教程</a>
<a target="_blank" href="https://zhuanlan.zhihu.com/p/29436838">Xpath基础教程</a>
<a target="_blank" href="https://zhuanlan.zhihu.com/p/32187820">Xpath高级教程</a>
<a target="_blank" href="https://www.w3cschool.cn/regex_rmjc/?">正则表达式教程</a>
<a target="_blank" href="https://regexr.com/">正则表达式在线验证工具</a>
<div>^$()[]{}.?+*| 这些是Java正则特殊符号,匹配需转义
<br>(?s) 前缀表示跨行解析
<br>(?m) 前缀表示逐行匹配
<br>(?i) 前缀表示忽略大小写
</div>
<a target="_blank" href="https://www.beta.browxy.com/">代码在线运行工具</a>
<a target="_blank" href="http://alanskycn.gitee.io/vip/yd-demo">WEB看书(需联网)</a>
<a target="_blank" href="/bookshelf.html">WEB看书(内置版)</a>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
================================================
FILE: app/src/main/assets/web/index.js
================================================
// 简化js原生选择器
function $(selector) { return document.querySelector(selector); }
function $$(selector) { return document.querySelectorAll(selector); }
// 读写Hash值(val未赋值时为读取)
function hashParam(key, val) {
let hashstr = decodeURIComponent(window.location.hash);
let regKey = new RegExp(`${key}=([^&]*)`);
let getVal = regKey.test(hashstr) ? hashstr.match(regKey)[1] : null;
if (val == undefined) return getVal;
if (hashstr == '' || hashstr == '#') {
window.location.hash = `#${key}=${val}`;
}
else {
if (getVal) window.location.hash = hashstr.replace(getVal, val);
else {
window.location.hash = hashstr.indexOf(key) > -1 ? hashstr.replace(regKey, `${key}=${val}`) : `${hashstr}&${key}=${val}`;
}
}
}
// 创建书源规则容器对象
const RuleJSON = (() => {
let ruleJson = {};
$$('.rules textarea').forEach(item => ruleJson[item.id] = '');
// for (let item of $$('.rules textarea')) ruleJson[item.id] = '';
ruleJson.serialNumber = 0;
ruleJson.weight = 0;
ruleJson.enable = true;
return ruleJson;
})();
// 选项卡Tab切换事件处理
function showTab(tabName) {
$$('.tabtitle>*').forEach(node => { node.className = node.className.replace(' this', ''); });
$$('.tabbody>*').forEach(node => { node.className = node.className.replace(' this', ''); });
$(`.tabbody>.${$(`.tabtitle>*[name=${tabName}]`).className}`).className += ' this';
$(`.tabtitle>*[name=${tabName}]`).className += ' this';
hashParam('tab', tabName);
}
// 书源列表列表标签构造函数
function newRule(rule) {
return `<label for="${rule.bookSourceUrl}"><input type="radio" name="rule" id="${rule.bookSourceUrl}"><div>${rule.bookSourceName}<br>${rule.bookSourceUrl}</div></label>`;
}
// 缓存规则列表
var RuleSources = [];
if (localStorage.getItem('RuleSources')) {
RuleSources = JSON.parse(localStorage.getItem('RuleSources'));
let ruleListArray = [];
RuleSources.forEach(item => {
ruleListArray.push(newRule(item));
});
$('#RuleList').innerHTML += ruleListArray.join('');
}
// 页面加载完成事件
window.onload = () => {
$$('.tabtitle>*').forEach(item => {
item.addEventListener('click', () => {
showTab(item.innerHTML);
});
});
if (hashParam('tab')) showTab(hashParam('tab'));
}
// 获取数据
function HttpGet(url) {
return fetch(hashParam('domain') ? hashParam('domain') + url : url)
.then(res => res.json()).catch(err => console.error('Error:', err));
}
// 提交数据
function HttpPost(url, data) {
return fetch(hashParam('domain') ? hashParam('domain') + url : url, {
body: JSON.stringify(data),
method: 'POST',
mode: "cors",
headers: new Headers({
'Content-Type': 'application/json;charset=utf-8'
})
}).then(res => res.json()).catch(err => console.error('Error:', err));
}
// 将书源表单转化为书源对象
function rule2json() {
Object.keys(RuleJSON).forEach((key) => RuleJSON[key] = $('#' + key).value);
RuleJSON.bookSourceType = RuleJSON.bookSourceType.toUpperCase();
RuleJSON.serialNumber = RuleJSON.serialNumber == '' ? 0 : parseInt(RuleJSON.serialNumber);
RuleJSON.weight = RuleJSON.weight == '' ? 0 : parseInt(RuleJSON.weight);
RuleJSON.enable = RuleJSON.enable == '' || RuleJSON.enable.toLocaleLowerCase().replace(/^\s*|\s*$/g, '') == 'true';
let TempRules = RuleSources.filter(item => (item['bookSourceUrl'] == RuleJSON['bookSourceUrl'] ? item : null));
if (TempRules.length > 0) {
Object.keys(RuleJSON).forEach(key => TempRules[0][key] = RuleJSON[key]);
return TempRules[0];
}
return RuleJSON;
}
// 将书源对象填充到书源表单
function json2rule(RuleEditor) {
Object.keys(RuleJSON).forEach((key) => $("#" + key).value = RuleEditor[key] ? RuleEditor[key] : '');
}
// 记录操作过程
var course = { "old": [], "now": {}, "new": [] };
if (localStorage.getItem('course')) {
course = JSON.parse(localStorage.getItem('course'));
json2rule(course.now);
}
else {
course.now = rule2json();
window.localStorage.setItem('course', JSON.stringify(course));
}
function todo() {
course.old.push(Object.assign({}, course.now));
course.now = rule2json();
course.new = [];
if (course.old.length > 50) course.old.shift(); // 限制历史记录堆栈大小
localStorage.setItem('course', JSON.stringify(course));
}
function undo() {
course = JSON.parse(localStorage.getItem('course'));
if (course.old.length > 0) {
course.new.push(course.now);
course.now = course.old.pop();
localStorage.setItem('course', JSON.stringify(course));
json2rule(course.now);
}
}
function redo() {
course = JSON.parse(localStorage.getItem('course'));
if (course.new.length > 0) {
course.old.push(course.now);
course.now = course.new.pop();
localStorage.setItem('course', JSON.stringify(course));
json2rule(course.now);
}
}
function setRule(editRule) {
let checkRule = RuleSources.find(x => x.bookSourceUrl == editRule.bookSourceUrl);
if ($(`input[id="${editRule.bookSourceUrl}"]`)) {
Object.keys(checkRule).forEach(key => { checkRule[key] = editRule[key]; });
$(`input[id="${editRule.bookSourceUrl}"]+*`).innerHTML = `${editRule.bookSourceName}<br>${editRule.bookSourceUrl}`;
} else {
RuleSources.push(editRule);
$('#RuleList').innerHTML += newRule(editRule);
}
}
$$('input').forEach((item) => { item.addEventListener('change', () => { todo() }) });
$$('textarea').forEach((item) => { item.addEventListener('change', () => { todo() }) });
// 处理按钮点击事件
$('.menu').addEventListener('click', e => {
let thisNode = e.target;
thisNode = thisNode.parentNode.nodeName == 'svg' ? thisNode.parentNode.querySelector('rect') :
thisNode.nodeName == 'svg' ? thisNode.querySelector('rect') : null;
if (!thisNode) return;
if (thisNode.getAttribute('class') == 'busy') return;
thisNode.setAttribute('class', 'busy');
switch (thisNode.id) {
case 'push':
$$('#RuleList>label>div').forEach(item => { item.className = ''; });
(async () => {
await HttpPost(`/saveSources`, RuleSources).then(json => {
if (json.isSuccess) {
console.log('批量推送书源:', RuleSources);
let okData = json.data;
if (Array.isArray(okData)) {
let failMsg = ``;
if (RuleSources.length > okData.length) {
RuleSources.forEach(item => {
if (okData.find(x => x.bookSourceUrl == item.bookSourceUrl)) { }
else { $(`#RuleList #${item.bookSourceUrl}+*`).className += 'isError'; }
});
failMsg = '\n推送失败的书源将用红色字体标注!';
}
alert(`批量推送书源到「阅读APP」\n共计: ${RuleSources.length} 条\n成功: ${okData.length} 条\n失败: ${RuleSources.length - okData.length} 条${failMsg}`);
}
else {
alert(`批量推送书源到「阅读APP」成功!\n共计: ${RuleSources.length} 条`);
}
}
else {
alert(`批量推送书源失败!\nErrorMsg: ${json.errorMsg}`);
}
}).catch(err => { alert(`批量推送书源失败,无法连接到「阅读APP」!\n${err}`); });
thisNode.setAttribute('class', '');
})();
return;
case 'pull':
showTab('书源列表');
(async () => {
await HttpGet(`/getSources`).then(json => {
if (json.isSuccess) {
console.log('批量拉取书源:', RuleSources);
$('#RuleList').innerHTML = ''
localStorage.setItem('RuleSources', JSON.stringify(RuleSources = json.data));
let ruleListArray = [];
RuleSources.forEach(item => {
ruleListArray.push(newRule(item));
});
$('#RuleList').innerHTML += ruleListArray.join('');
alert(`成功拉取 ${RuleSources.length} 条书源`);
}
else {
alert(`批量拉取书源失败!\nErrorMsg: ${json.errorMsg}`);
}
}).catch(err => { alert(`批量拉取书源失败,无法连接到「阅读APP」!\n${err}`); });
thisNode.setAttribute('class', '');
})();
return;
case 'editor':
if ($('#RuleJsonString').value == '') break;
try {
json2rule(JSON.parse($('#RuleJsonString').value));
todo();
} catch (error) {
console.log(error);
alert(error);
}
break;
case 'conver':
showTab('编辑书源');
$('#RuleJsonString').value = JSON.stringify(rule2json(), null, 4);
break;
case 'initial':
$$('.rules textarea').forEach(item => { item.value = '' });
todo();
break;
case 'undo':
undo()
break;
case 'redo':
redo()
break;
case 'debug':
showTab('调试书源');
let wsOrigin = (hashParam('domain') || location.origin).replace(/^.*?:/, 'ws:').replace(/\d+$/, (port) => (parseInt(port) + 1));
let DebugInfos = $('#DebugConsole');
function DebugPrint(msg) { DebugInfos.value += `\n${msg}`; DebugInfos.scrollTop = DebugInfos.scrollHeight; }
let saveRule = [rule2json()];
HttpPost(`/saveSources`, saveRule).then(sResult => {
if (sResult.isSuccess) {
let sKey = DebugKey.value ? DebugKey.value : '我的';
$('#DebugConsole').value = `书源《${saveRule[0].bookSourceName}》保存成功!使用搜索关键字“${sKey}”开始调试...`;
let ws = new WebSocket(`${wsOrigin}/sourceDebug`);
ws.onopen = () => {
ws.send(`{"tag":"${saveRule[0].bookSourceUrl}", "key":"${sKey}"}`);
};
ws.onmessage = (msg) => {
DebugPrint(msg.data == 'finish' ? `\n[${Date().split(' ')[4]}] 调试任务已完成!` : msg.data);
if (msg.data == 'finish') setRule(saveRule[0]);
};
ws.onerror = (err) => {
throw `${err.data}`;
}
ws.onclose = () => {
thisNode.setAttribute('class', '');
DebugPrint(`[${Date().split(' ')[4]}] 调试服务已关闭!`);
}
} else throw `${sResult.errorMsg}`;
}).catch(err => {
DebugPrint(`调试过程意外中止,以下是详细错误信息:\n${err}`);
thisNode.setAttribute('class', '');
});
return;
case 'accept':
(async () => {
let saveRule = [rule2json()];
await HttpPost(`/saveSources`, saveRule).then(json => {
alert(json.isSuccess ? `书源《${saveRule[0].bookSourceName}》已成功保存到「阅读APP」` : `书源《${saveRule[0].bookSourceName}》保存失败!\nErrorMsg: ${json.errorMsg}`);
setRule(saveRule[0]);
}).catch(err => { alert(`保存书源失败,无法连接到「阅读APP」!\n${err}`); });
thisNode.setAttribute('class', '');
})();
return;
default:
}
setTimeout(() => { thisNode.setAttribute('class', ''); }, 500);
});
$('#DebugKey').addEventListener('keydown', e => {
if (e.keyCode == 13) {
let clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent("click", true, false);
$('#debug').dispatchEvent(clickEvent);
}
});
// 列表规则更改事件
$('#RuleList').addEventListener('click', e => {
let editRule = null;
if (e.target && e.target.getAttribute('name') == 'rule') {
editRule = rule2json();
json2rule(RuleSources.find(x => x.bookSourceUrl == e.target.id));
} else return;
if (editRule.bookSourceUrl == '') return;
if (editRule.bookSourceName == '') editRule.bookSourceName = editRule.bookSourceUrl.replace(/.*?\/\/|\/.*/g, '');
setRule(editRule);
localStorage.setItem('RuleSources', JSON.stringify(RuleSources));
});
// 处理列表按钮事件
$('.tab3>.titlebar').addEventListener('click', e => {
let thisNode = e.target;
if (thisNode.nodeName != 'BUTTON') return;
switch (thisNode.id) {
case 'Import':
let fileImport = document.createElement('input');
fileImport.type = 'file';
fileImport.accept = '.json';
fileImport.addEventListener('change', () => {
let file = fileImport.files[0];
let reader = new FileReader();
reader.onloadend = function (evt) {
if (evt.target.readyState == FileReader.DONE) {
let fileText = evt.target.result;
try {
let fileJson = JSON.parse(fileText);
let newSources = [];
newSources.push(...fileJson);
if (window.confirm(`如何处理导入的书源?\n"确定": 覆盖当前列表(不会删除APP源)\n"取消": 插入列表尾部(自动忽略重复源)`)) {
localStorage.setItem('RuleSources', JSON.stringify(RuleSources = newSources));
$('#RuleList').innerHTML = '';
}
else {
newSources = newSources.filter(item => !JSON.stringify(RuleSources).includes(item.bookSourceUrl));
RuleSources.push(...newSources);
localStorage.setItem('RuleSources', JSON.stringify(RuleSources));
}
let ruleListArray = [];
RuleSources.forEach(item => {
ruleListArray.push(newRule(item));
});
$('#RuleList').innerHTML += ruleListArray.join('');
alert(`成功导入 ${newSources.length} 条书源`);
}
catch (err) {
alert(`导入书源文件失败!\n${err}`);
}
}
};
reader.readAsText(file);
}, false);
fileImport.click();
break;
case 'Export':
let fileExport = document.createElement('a');
fileExport.download = `Rules${Date().replace(/.*?\s(\d+)\s(\d+)\s(\d+:\d+:\d+).*/, '$2$1$3').replace(/:/g, '')}.json`;
let myBlob = new Blob([JSON.stringify(RuleSources, null, 4)], { type: "application/json" });
fileExport.href = window.URL.createObjectURL(myBlob);
fileExport.click();
break;
case 'Delete':
let selectRule = $('#RuleList input:checked');
if (!selectRule) {
alert(`没有书源被选中!`);
return;
}
if (confirm(`确定要删除选定书源吗?\n(同时删除APP内书源)`)) {
let selectRuleUrl = selectRule.id;
let deleteSources = RuleSources.filter(item => item.bookSourceUrl == selectRuleUrl); // 提取待删除的书源
let laveSources = RuleSources.filter(item => !(item.bookSourceUrl == selectRuleUrl)); // 提取待留下的书源
HttpPost(`/deleteSources`, deleteSources).then(json => {
if (json.isSuccess) {
let selectNode = document.getElementById(selectRuleUrl).parentNode;
selectNode.parentNode.removeChild(selectNode);
localStorage.setItem('RuleSources', JSON.stringify(RuleSources = laveSources));
if ($('#bookSourceUrl').value == selectRuleUrl) {
$$('.rules textarea').forEach(item => { item.value = '' });
todo();
}
console.log(deleteSources);
console.log(`以上书源已删除!`)
}
}).catch(err => { alert(`删除书源失败,无法连接到「阅读APP」!\n${err}`); });
}
break;
case 'ClrAll':
if (confirm(`确定要清空当前书源列表吗?\n(不会删除APP内书源)`)) {
localStorage.setItem('RuleSources', JSON.stringify(RuleSources = []));
$('#RuleList').innerHTML = ''
}
break;
default:
}
});
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/DbHelper.java
================================================
//Copyright (c) 2017. 章钦豪. All rights reserved.
package com.kunfei.bookshelf;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.github.yuweiguocn.library.greendao.MigrationHelper;
import com.kunfei.bookshelf.dao.BookChapterBeanDao;
import com.kunfei.bookshelf.dao.BookInfoBeanDao;
import com.kunfei.bookshelf.dao.BookShelfBeanDao;
import com.kunfei.bookshelf.dao.BookSourceBeanDao;
import com.kunfei.bookshelf.dao.BookmarkBeanDao;
import com.kunfei.bookshelf.dao.CookieBeanDao;
import com.kunfei.bookshelf.dao.DaoMaster;
import com.kunfei.bookshelf.dao.DaoSession;
import com.kunfei.bookshelf.dao.ReplaceRuleBeanDao;
import com.kunfei.bookshelf.dao.SearchHistoryBeanDao;
import com.kunfei.bookshelf.dao.TxtChapterRuleBeanDao;
import org.greenrobot.greendao.database.Database;
import java.util.Locale;
public class DbHelper {
private static DbHelper instance;
private final SQLiteDatabase db;
private final DaoSession mDaoSession;
private DbHelper() {
DaoOpenHelper mHelper = new DaoOpenHelper(MApplication.getInstance(), "monkebook_db", null);
db = mHelper.getWritableDatabase();
db.setLocale(Locale.CHINESE);
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
DaoMaster mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public static DbHelper getInstance() {
if (null == instance) {
synchronized (DbHelper.class) {
if (null == instance) {
instance = new DbHelper();
}
}
}
return instance;
}
public static DaoSession getDaoSession() {
return getInstance().mDaoSession;
}
public static SQLiteDatabase getDb() {
return getInstance().db;
}
public static class DaoOpenHelper extends DaoMaster.OpenHelper {
DaoOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
@SuppressWarnings("unchecked")
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
MigrationHelper.migrate(db,
new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
},
BookShelfBeanDao.class, BookInfoBeanDao.class, BookChapterBeanDao.class,
SearchHistoryBeanDao.class, BookSourceBeanDao.class,
ReplaceRuleBeanDao.class, BookmarkBeanDao.class, CookieBeanDao.class,
TxtChapterRuleBeanDao.class
);
}
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/MApplication.java
================================================
//Copyright (c) 2017. 章钦豪. All rights reserved.
package com.kunfei.bookshelf;
import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Build;
import android.text.TextUtils;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.multidex.MultiDex;
import com.kunfei.bookshelf.constant.AppConstant;
import com.kunfei.bookshelf.help.AppFrontBackHelper;
import com.kunfei.bookshelf.help.CrashHandler;
import com.kunfei.bookshelf.help.FileHelp;
import com.kunfei.bookshelf.model.UpLastChapterModel;
import com.kunfei.bookshelf.utils.theme.ThemeStore;
import java.io.File;
import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.internal.functions.Functions;
import io.reactivex.plugins.RxJavaPlugins;
import timber.log.Timber;
public class MApplication extends Application {
public final static String channelIdDownload = "channel_download";
public final static String channelIdReadAloud = "channel_read_aloud";
public final static String channelIdWeb = "channel_web";
public static String downloadPath;
public static boolean isEInkMode;
public static String SEARCH_GROUP = null;
private static MApplication instance;
private static String versionName;
private static int versionCode;
private SharedPreferences configPreferences;
private boolean donateHb;
public static MApplication getInstance() {
return instance;
}
public static int getVersionCode() {
return versionCode;
}
public static String getVersionName() {
return versionName;
}
public static Resources getAppResources() {
return getInstance().getResources();
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
CrashHandler.getInstance().init(this);
Timber.plant(new Timber.DebugTree());
RxJavaPlugins.setErrorHandler(Functions.emptyConsumer());
try {
versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
versionCode = 0;
versionName = "0.0.0";
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannelId();
}
configPreferences = getSharedPreferences("CONFIG", 0);
downloadPath = configPreferences.getString(getString(R.string.pk_download_path), "");
if (TextUtils.isEmpty(downloadPath) | Objects.equals(downloadPath, FileHelp.getCachePath())) {
setDownloadPath(null);
}
initNightTheme();
if (!ThemeStore.isConfigured(this, versionCode)) {
upThemeStore();
}
AppFrontBackHelper.getInstance().register(this, new AppFrontBackHelper.OnAppStatusListener() {
@Override
public void onFront() {
donateHb = System.currentTimeMillis() - configPreferences.getLong("DonateHb", 0) <= TimeUnit.DAYS.toMillis(30);
}
@Override
public void onBack() {
UpLastChapterModel.destroy();
}
});
upEInkMode();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
public void initNightTheme() {
if (isNightTheme()) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
/**
* 初始化主题
*/
public void upThemeStore() {
if (isNightTheme()) {
ThemeStore.editTheme(this)
.primaryColor(configPreferences.getInt("colorPrimaryNight", getResources().getColor(R.color.md_grey_800)))
.accentColor(configPreferences.getInt("colorAccentNight", getResources().getColor(R.color.md_pink_800)))
.backgroundColor(configPreferences.getInt("colorBackgroundNight", getResources().getColor(R.color.md_grey_800)))
.apply();
} else {
ThemeStore.editTheme(this)
.primaryColor(configPreferences.getInt("colorPrimary", getResources().getColor(R.color.md_grey_100)))
.accentColor(configPreferences.getInt("colorAccent", getResources().getColor(R.color.md_pink_600)))
.backgroundColor(configPreferences.getInt("colorBackground", getResources().getColor(R.color.md_grey_100)))
.apply();
}
}
public boolean isNightTheme() {
return configPreferences.getBoolean("nightTheme", false);
}
/**
* 设置下载地址
*/
public void setDownloadPath(String path) {
if (TextUtils.isEmpty(path)) {
downloadPath = FileHelp.getFilesPath();
} else {
downloadPath = path;
}
AppConstant.BOOK_CACHE_PATH = downloadPath + File.separator + "book_cache" + File.separator;
configPreferences.edit()
.putString(getString(R.string.pk_download_path), path)
.apply();
}
public static SharedPreferences getConfigPreferences() {
return getInstance().configPreferences;
}
public boolean getDonateHb() {
return donateHb || BuildConfig.DEBUG;
}
public void upDonateHb() {
configPreferences.edit()
.putLong("DonateHb", System.currentTimeMillis())
.apply();
donateHb = true;
}
public void upEInkMode() {
MApplication.isEInkMode = configPreferences.getBoolean("E-InkMode", false);
}
/**
* 创建通知ID
*/
@RequiresApi(Build.VERSION_CODES.O)
private void createChannelId() {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//用唯一的ID创建渠道对象
NotificationChannel downloadChannel = new NotificationChannel(channelIdDownload,
getString(R.string.download_offline),
NotificationManager.IMPORTANCE_LOW);
//初始化channel
downloadChannel.enableLights(false);
downloadChannel.enableVibration(false);
downloadChannel.setSound(null, null);
//用唯一的ID创建渠道对象
NotificationChannel readAloudChannel = new NotificationChannel(channelIdReadAloud,
getString(R.string.read_aloud),
NotificationManager.IMPORTANCE_LOW);
//初始化channel
readAloudChannel.enableLights(false);
readAloudChannel.enableVibration(false);
readAloudChannel.setSound(null, null);
//用唯一的ID创建渠道对象
NotificationChannel webChannel = new NotificationChannel(channelIdWeb,
getString(R.string.web_service),
NotificationManager.IMPORTANCE_LOW);
//初始化channel
webChannel.enableLights(false);
webChannel.enableVibration(false);
webChannel.setSound(null, null);
//向notification manager 提交channel
if (notificationManager != null) {
notificationManager.createNotificationChannels(Arrays.asList(downloadChannel, readAloudChannel, webChannel));
}
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseDialogFragment.kt
================================================
package com.kunfei.bookshelf.base
import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import com.kunfei.bookshelf.utils.theme.ThemeStore
import io.legado.app.help.coroutine.Coroutine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlin.coroutines.CoroutineContext
abstract class BaseDialogFragment(@LayoutRes layoutID: Int) : DialogFragment(layoutID),
CoroutineScope by MainScope() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.setBackgroundColor(ThemeStore.backgroundColor(requireContext()))
onFragmentCreated(view, savedInstanceState)
observeLiveBus()
}
abstract fun onFragmentCreated(view: View, savedInstanceState: Bundle?)
override fun show(manager: FragmentManager, tag: String?) {
kotlin.runCatching {
//在每个add事务前增加一个remove事务,防止连续的add
manager.beginTransaction().remove(this).commit()
super.show(manager, tag)
}
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
fun <T> execute(
scope: CoroutineScope = this,
context: CoroutineContext = Dispatchers.IO,
block: suspend CoroutineScope.() -> T
) = Coroutine.async(scope, context) { block() }
open fun observeLiveBus() {
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseFragment.kt
================================================
package com.kunfei.bookshelf.base
import android.annotation.SuppressLint
import android.content.res.Configuration
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import androidx.annotation.LayoutRes
import androidx.appcompat.view.SupportMenuInflater
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
@Suppress("MemberVisibilityCanBePrivate")
abstract class BaseFragment(@LayoutRes layoutID: Int) : Fragment(layoutID),
CoroutineScope by MainScope() {
var supportToolbar: Toolbar? = null
private set
val menuInflater: MenuInflater
@SuppressLint("RestrictedApi")
get() = SupportMenuInflater(requireContext())
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
onMultiWindowModeChanged()
onFragmentCreated(view, savedInstanceState)
observeLiveBus()
}
abstract fun onFragmentCreated(view: View, savedInstanceState: Bundle?)
override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) {
super.onMultiWindowModeChanged(isInMultiWindowMode)
onMultiWindowModeChanged()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
onMultiWindowModeChanged()
}
private fun onMultiWindowModeChanged() {
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
open fun observeLiveBus() {
}
open fun onCompatCreateOptionsMenu(menu: Menu) {
}
open fun onCompatOptionsItemSelected(item: MenuItem) {
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseModelImpl.java
================================================
package com.kunfei.bookshelf.base;
import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.webkit.CookieManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.kunfei.bookshelf.DbHelper;
import com.kunfei.bookshelf.MApplication;
import com.kunfei.bookshelf.bean.CookieBean;
import com.kunfei.bookshelf.help.EncodeConverter;
import com.kunfei.bookshelf.help.SSLSocketClient;
import com.kunfei.bookshelf.model.analyzeRule.AnalyzeUrl;
import com.kunfei.bookshelf.model.impl.IHttpGetApi;
import com.kunfei.bookshelf.model.impl.IHttpPostApi;
import org.apache.commons.lang3.StringEscapeUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import okhttp3.ConnectionSpec;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Protocol;
import okhttp3.Request;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
public class BaseModelImpl {
private static OkHttpClient httpClient;
public static BaseModelImpl getInstance() {
return new BaseModelImpl();
}
public Observable<Response<String>> getResponseO(AnalyzeUrl analyzeUrl) {
switch (analyzeUrl.getUrlMode()) {
case POST:
if (analyzeUrl.getJsonBody() != null) {
return getRetrofitString(analyzeUrl.getHost(), analyzeUrl.getCharCode())
.create(IHttpPostApi.class)
.postJson(analyzeUrl.getPath(),
analyzeUrl.getPostBody(),
analyzeUrl.getHeaderMap());
} else {
return getRetrofitString(analyzeUrl.getHost(), analyzeUrl.getCharCode())
.create(IHttpPostApi.class)
.postMap(analyzeUrl.getPath(),
analyzeUrl.getQueryMap(),
analyzeUrl.getHeaderMap());
}
case GET:
return getRetrofitString(analyzeUrl.getHost(), analyzeUrl.getCharCode())
.create(IHttpGetApi.class)
.getMap(analyzeUrl.getPath(),
analyzeUrl.getQueryMap(),
analyzeUrl.getHeaderMap());
default:
return getRetrofitString(analyzeUrl.getHost(), analyzeUrl.getCharCode())
.create(IHttpGetApi.class)
.get(analyzeUrl.getPath(),
analyzeUrl.getHeaderMap());
}
}
public Retrofit getRetrofitString(String url) {
return new Retrofit.Builder().baseUrl(url)
//增加返回值为字符串的支持(以实体类返回)
.addConverterFactory(EncodeConverter.create())
//增加返回值为Observable<T>的支持
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getClient())
.build();
}
public Retrofit getRetrofitString(String url, String encode) {
return new Retrofit.Builder().baseUrl(url)
//增加返回值为字符串的支持(以实体类返回)
.addConverterFactory(EncodeConverter.create(encode))
//增加返回值为Observable<T>的支持
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getClient())
.build();
}
synchronized public static OkHttpClient getClient() {
if (httpClient == null) {
ArrayList<ConnectionSpec> specs = new ArrayList<>();
specs.add(ConnectionSpec.MODERN_TLS);
specs.add(ConnectionSpec.COMPATIBLE_TLS);
specs.add(ConnectionSpec.CLEARTEXT);
httpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.createTrustAllManager())
.hostnameVerifier(SSLSocketClient.getHostnameVerifier())
.followRedirects(true)
.followSslRedirects(true)
.connectionSpecs(specs)
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
.addInterceptor(getHeaderInterceptor())
.build();
}
return httpClient;
}
private static Interceptor getHeaderInterceptor() {
return chain -> {
Request request = chain.request()
.newBuilder()
.addHeader("Keep-Alive", "300")
.addHeader("Connection", "Keep-Alive")
.addHeader("Cache-Control", "no-cache")
.build();
return chain.proceed(request);
};
}
protected Observable<Response<String>> setCookie(Response<String> response, String tag) {
return Observable.create(e -> {
if (!response.raw().headers("Set-Cookie").isEmpty()) {
StringBuilder cookieBuilder = new StringBuilder();
for (String s : response.raw().headers("Set-Cookie")) {
String[] x = s.split(";");
for (String y : x) {
if (!TextUtils.isEmpty(y)) {
cookieBuilder.append(y).append(";");
}
}
}
String cookie = cookieBuilder.toString();
if (!TextUtils.isEmpty(cookie)) {
DbHelper.getDaoSession().getCookieBeanDao().insertOrReplace(new CookieBean(tag, cookie));
}
}
e.onNext(response);
e.onComplete();
});
}
@SuppressLint({"AddJavascriptInterface", "SetJavaScriptEnabled"})
protected Observable<String> getAjaxString(AnalyzeUrl analyzeUrl, String tag, String js) {
final Web web = new Web("加载超时");
if (!TextUtils.isEmpty(js)) {
web.js = js;
}
return Observable.create(e -> {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(() -> {
Runnable timeoutRunnable;
WebView webView = new WebView(MApplication.getInstance());
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUserAgentString(analyzeUrl.getHeaderMap().get("User-Agent"));
CookieManager cookieManager = CookieManager.getInstance();
Runnable retryRunnable = new Runnable() {
@Override
public void run() {
webView.evaluateJavascript(web.js, value -> {
if (!TextUtils.isEmpty(value)) {
web.content = StringEscapeUtils.unescapeJson(value);
e.onNext(web.content);
e.onComplete();
webView.destroy();
handler.removeCallbacks(this);
} else {
handler.postDelayed(this, 1000);
}
});
}
};
timeoutRunnable = () -> {
if (!e.isDisposed()) {
handler.removeCallbacks(retryRunnable);
e.onNext(web.content);
e.onComplete();
webView.destroy();
}
};
handler.postDelayed(timeoutRunnable, 30000);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
DbHelper.getDaoSession().getCookieBeanDao()
.insertOrReplace(new CookieBean(tag, cookieManager.getCookie(webView.getUrl())));
handler.postDelayed(retryRunnable, 1000);
}
});
switch (analyzeUrl.getUrlMode()) {
case POST:
webView.postUrl(analyzeUrl.getUrl(), analyzeUrl.getPostData());
break;
case GET:
webView.loadUrl(String.format("%s?%s", analyzeUrl.getUrl(), analyzeUrl.getQueryStr()), analyzeUrl.getHeaderMap());
break;
default:
webView.loadUrl(analyzeUrl.getUrl(), analyzeUrl.getHeaderMap());
}
});
});
}
private static class Web {
private String content;
private String js = "document.documentElement.outerHTML";
Web(String content) {
this.content = content;
}
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseService.kt
================================================
package com.kunfei.bookshelf.base
import android.app.Service
import android.content.Intent
import android.os.IBinder
import androidx.annotation.CallSuper
import io.legado.app.help.coroutine.Coroutine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlin.coroutines.CoroutineContext
abstract class BaseService : Service(), CoroutineScope by MainScope() {
fun <T> execute(
scope: CoroutineScope = this,
context: CoroutineContext = Dispatchers.IO,
block: suspend CoroutineScope.() -> T
) = Coroutine.async(scope, context) { block() }
@CallSuper
override fun onCreate() {
super.onCreate()
}
@CallSuper
override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
stopSelf()
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
@CallSuper
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseTabActivity.java
================================================
package com.kunfei.bookshelf.base;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import com.kunfei.basemvplib.impl.IPresenter;
import com.kunfei.bookshelf.R;
import java.util.List;
/**
* Created by newbiechen on 17-4-24.
*/
public abstract class BaseTabActivity<T extends IPresenter> extends MBaseActivity<T> {
/**************View***************/
protected TabLayout mTlIndicator;
protected ViewPager mVp;
/**************Adapter***************/
protected TabFragmentPageAdapter tabFragmentPageAdapter;
/************Params*******************/
protected List<Fragment> mFragmentList;
private List<String> mTitleList;
/**************abstract***********/
protected abstract List<Fragment> createTabFragments();
protected abstract List<String> createTabTitles();
@Override
protected void bindView() {
super.bindView();
mTlIndicator = findViewById(R.id.tab_tl_indicator);
mVp = findViewById(R.id.tab_vp);
setUpTabLayout();
}
/*****************rewrite method***************************/
private void setUpTabLayout() {
mFragmentList = createTabFragments();
mTitleList = createTabTitles();
checkParamsIsRight();
tabFragmentPageAdapter = new TabFragmentPageAdapter(getSupportFragmentManager());
mVp.setAdapter(tabFragmentPageAdapter);
mVp.setOffscreenPageLimit(3);
mTlIndicator.setupWithViewPager(mVp);
}
/**
* 检查输入的参数是否正确。即Fragment和title是成对的。
*/
private void checkParamsIsRight() {
if (mFragmentList == null || mTitleList == null) {
throw new IllegalArgumentException("fragmentList or titleList doesn't have null");
}
if (mFragmentList.size() != mTitleList.size())
throw new IllegalArgumentException("fragment and title size must equal");
}
/******************inner class*****************/
public class TabFragmentPageAdapter extends FragmentPagerAdapter {
TabFragmentPageAdapter(FragmentManager fm) {
super(fm);
}
@NonNull
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitleList.get(position);
}
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseViewModel.kt
================================================
package com.kunfei.bookshelf.base
import android.app.Application
import android.content.Context
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.kunfei.bookshelf.MApplication
import io.legado.app.help.coroutine.Coroutine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlin.coroutines.CoroutineContext
@Suppress("unused")
open class BaseViewModel(application: Application) : AndroidViewModel(application) {
val context: Context by lazy { this.getApplication<MApplication>() }
fun <T> execute(
scope: CoroutineScope = viewModelScope,
context: CoroutineContext = Dispatchers.IO,
block: suspend CoroutineScope.() -> T
): Coroutine<T> {
return Coroutine.async(scope, context) { block() }
}
fun <R> submit(
scope: CoroutineScope = viewModelScope,
context: CoroutineContext = Dispatchers.IO,
block: suspend CoroutineScope.() -> Deferred<R>
): Coroutine<R> {
return Coroutine.async(scope, context) { block().await() }
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/MBaseActivity.java
================================================
//Copyright (c) 2017. 章钦豪. All rights reserved.
package com.kunfei.bookshelf.base;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.Nullable;
import com.google.android.material.snackbar.Snackbar;
import com.hwangjr.rxbus.RxBus;
import com.kunfei.basemvplib.BaseActivity;
import com.kunfei.basemvplib.impl.IPresenter;
import com.kunfei.bookshelf.MApplication;
import com.kunfei.bookshelf.R;
import com.kunfei.bookshelf.constant.RxBusTag;
import com.kunfei.bookshelf.utils.ActivityExtensionsKt;
import com.kunfei.bookshelf.utils.ColorUtils;
import com.kunfei.bookshelf.utils.SoftInputUtil;
import com.kunfei.bookshelf.utils.theme.MaterialValueHelper;
import com.kunfei.bookshelf.utils.theme.ThemeStore;
import java.lang.reflect.Method;
import java.util.ArrayList;
public abstract class MBaseActivity<T extends IPresenter> extends BaseActivity<T> {
private static final String TAG = MBaseActivity.class.getSimpleName();
public final SharedPreferences preferences = MApplication.getConfigPreferences();
private Snackbar snackbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
initTheme();
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getWindow().getDecorView().setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
}
initImmersionBar();
}
@SuppressWarnings("NullableProblems")
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
public void setSupportActionBar(@Nullable androidx.appcompat.widget.Toolbar toolbar) {
if (toolbar != null) {
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
}
super.setSupportActionBar(toolbar);
}
/**
* 设置MENU图标颜色
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
int primaryTextColor = MaterialValueHelper.getPrimaryTextColor(this, ColorUtils.isColorLight(ThemeStore.primaryColor(this)));
for (int i = 0; i < menu.size(); i++) {
Drawable drawable = menu.getItem(i).getIcon();
if (drawable != null) {
drawable.mutate();
drawable.setColorFilter(primaryTextColor, PorterDuff.Mode.SRC_ATOP);
}
}
return super.onCreateOptionsMenu(menu);
}
@SuppressLint("PrivateApi")
@SuppressWarnings("unchecked")
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
//展开菜单显示图标
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
method = menu.getClass().getDeclaredMethod("getNonActionItems");
ArrayList<MenuItem> menuItems = (ArrayList<MenuItem>) method.invoke(menu);
if (!menuItems.isEmpty()) {
for (MenuItem menuItem : menuItems) {
Drawable drawable = menuItem.getIcon();
if (drawable != null) {
drawable.mutate();
drawable.setColorFilter(getResources().getColor(R.color.tv_text_default), PorterDuff.Mode.SRC_ATOP);
}
}
}
} catch (Exception ignored) {
}
}
}
return super.onMenuOpened(featureId, menu);
}
/**
* 沉浸状态栏
*/
protected void initImmersionBar() {
try {
View actionBar = findViewById(R.id.action_bar);
ActivityExtensionsKt.fullScreen(this);
if (isImmersionBarEnabled()) {
boolean isTransparent = getSupportActionBar() != null && actionBar != null && actionBar.getVisibility() == View.VISIBLE;
ActivityExtensionsKt.setStatusBarColorAuto(this, ThemeStore.primaryColor(this), isTransparent, isTransparent);
} else {
if (getSupportActionBar() != null && actionBar != null && actionBar.getVisibility() == View.VISIBLE) {
ActivityExtensionsKt.setStatusBarColorAuto(this, ThemeStore.statusBarColor(this), false, false);
} else {
ActivityExtensionsKt.setStatusBarColorAuto(this, getResources().getColor(R.color.status_bar_bag), false, false);
}
}
} catch (Exception ignored) {
}
try {
if (!preferences.getBoolean("navigationBarColorChange", false)) {
ActivityExtensionsKt.setNavigationBarColorAuto(this, getResources().getColor(R.color.black));
} else {
ActivityExtensionsKt.setNavigationBarColorAuto(this, ThemeStore.primaryColorDark(this));
}
} catch (Exception ignored) {
}
}
/**
* @return 是否沉浸
*/
protected boolean isImmersionBarEnabled() {
return preferences.getBoolean("immersionStatusBar", false);
}
/**
* 设置屏幕方向
*/
@SuppressLint("SourceLockedOrientationActivity")
public void setOrientation(int screenDirection) {
switch (screenDirection) {
case 0:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
break;
case 1:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case 2:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case 3:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
break;
}
}
/**
* @return 是否夜间模式
*/
public boolean isNightTheme() {
return MApplication.getInstance().isNightTheme();
}
protected void setNightTheme(boolean isNightTheme) {
preferences.edit()
.putBoolean("nightTheme", isNightTheme)
.apply();
MApplication.getInstance().initNightTheme();
MApplication.getInstance().upThemeStore();
RxBus.get().post(RxBusTag.RECREATE, true);
}
protected void initTheme() {
if (ColorUtils.isColorLight(ThemeStore.primaryColor(this))) {
setTheme(R.style.CAppTheme);
} else {
setTheme(R.style.CAppThemeBarDark);
}
}
public void showSnackBar(View view, String msg) {
showSnackBar(view, msg, Snackbar.LENGTH_SHORT);
}
public void showSnackBar(View view, String msg, int length) {
if (snackbar == null) {
snackbar = Snackbar.make(view, msg, length);
} else {
snackbar.setText(msg);
snackbar.setDuration(length);
}
snackbar.show();
}
public void hideSnackBar() {
if (snackbar != null) {
snackbar.dismiss();
}
}
@Override
public void startActivity(Intent intent) {
super.startActivity(intent);
if (MApplication.isEInkMode) {
overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
}
}
@SuppressWarnings("deprecation")
@Override
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
super.startActivityForResult(intent, requestCode, options);
if (MApplication.isEInkMode) {
overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
}
}
@Override
public void finish() {
SoftInputUtil.hideIMM(getCurrentFocus());
super.finish();
if (MApplication.isEInkMode) {
overridePendingTransition(R.anim.anim_none, R.anim.anim_none);
}
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/MBaseFragment.java
================================================
package com.kunfei.bookshelf.base;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.kunfei.basemvplib.BaseFragment;
import com.kunfei.basemvplib.impl.IPresenter;
import com.kunfei.basemvplib.impl.IView;
import com.kunfei.bookshelf.MApplication;
public abstract class MBaseFragment<T extends IPresenter> extends BaseFragment<T> implements IView {
public final SharedPreferences preferences = MApplication.getConfigPreferences();
protected T mPresenter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
mPresenter = initInjector();
attachView();
super.onCreate(savedInstanceState);
}
@Override
public void onDestroy() {
super.onDestroy();
detachView();
}
/**
* P层绑定 若无则返回null;
*/
protected abstract T initInjector();
/**
* P层绑定V层
*/
private void attachView() {
if (null != mPresenter) {
mPresenter.attachView(this);
}
}
/**
* P层解绑V层
*/
private void detachView() {
if (null != mPresenter) {
mPresenter.detachView();
}
}
public void toast(String msg) {
Toast.makeText(this.getActivity(), msg, Toast.LENGTH_SHORT).show();
}
public void toast(int id) {
Toast.makeText(this.getActivity(), getString(id), Toast.LENGTH_SHORT).show();
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/README.md
================================================
# 基类
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/VMBaseFragment.kt
================================================
package com.kunfei.bookshelf.base
import androidx.lifecycle.ViewModel
abstract class VMBaseFragment<VM : ViewModel>(layoutID: Int) : BaseFragment(layoutID) {
protected abstract val viewModel: VM
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/DiffRecyclerAdapter.kt
================================================
package com.kunfei.bookshelf.base.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
/**
* Created by Invincible on 2017/12/15.
*/
@Suppress("unused", "MemberVisibilityCanBePrivate")
abstract class DiffRecyclerAdapter<ITEM, VB : ViewBinding>(protected val context: Context) :
RecyclerView.Adapter<ItemViewHolder>() {
val inflater: LayoutInflater = LayoutInflater.from(context)
private val asyncListDiffer: AsyncListDiffer<ITEM> by lazy {
AsyncListDiffer(this, diffItemCallback).apply {
addListListener { _, _ ->
onCurrentListChanged()
}
}
}
private val lock = Object()
private var itemClickListener: ((holder: ItemViewHolder, item: ITEM) -> Unit)? = null
private var itemLongClickListener: ((holder: ItemViewHolder, item: ITEM) -> Boolean)? = null
var itemAnimation: ItemAnimation? = null
abstract val diffItemCallback: DiffUtil.ItemCallback<ITEM>
fun setOnItemClickListener(listener: (holder: ItemViewHolder, item: ITEM) -> Unit) {
itemClickListener = listener
}
fun setOnItemLongClickListener(listener: (holder: ItemViewHolder, item: ITEM) -> Boolean) {
itemLongClickListener = listener
}
fun bindToRecyclerView(recyclerView: RecyclerView) {
recyclerView.adapter = this
}
fun setItems(items: List<ITEM>?) {
synchronized(lock) {
asyncListDiffer.submitList(items)
}
}
fun setItem(position: Int, item: ITEM) {
synchronized(lock) {
val list = ArrayList(asyncListDiffer.currentList)
list[position] = item
asyncListDiffer.submitList(list)
}
}
fun updateItem(item: ITEM) =
synchronized(lock) {
val index = asyncListDiffer.currentList.indexOf(item)
if (index >= 0) {
asyncListDiffer.currentList[index] = item
notifyItemChanged(index)
}
}
fun updateItem(position: Int, payload: Any) =
synchronized(lock) {
val size = itemCount
if (position in 0 until size) {
notifyItemChanged(position, payload)
}
}
fun updateItems(fromPosition: Int, toPosition: Int, payloads: Any) =
synchronized(lock) {
val size = itemCount
if (fromPosition in 0 until size && toPosition in 0 until size) {
notifyItemRangeChanged(
fromPosition,
toPosition - fromPosition + 1,
payloads
)
}
}
fun isEmpty() = asyncListDiffer.currentList.isEmpty()
fun isNotEmpty() = asyncListDiffer.currentList.isNotEmpty()
fun getItem(position: Int): ITEM? = asyncListDiffer.currentList.getOrNull(position)
fun getItems(): List<ITEM> = asyncListDiffer.currentList
/**
* grid 模式下使用
*/
protected open fun getSpanSize(viewType: Int, position: Int) = 1
final override fun getItemCount() = getItems().size
final override fun getItemViewType(position: Int): Int {
return 0
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val holder = ItemViewHolder(getViewBinding(parent))
@Suppress("UNCHECKED_CAST")
registerListener(holder, (holder.binding as VB))
if (itemClickListener != null) {
holder.itemView.setOnClickListener {
getItem(holder.layoutPosition)?.let {
itemClickListener?.invoke(holder, it)
}
}
}
if (itemLongClickListener != null) {
holder.itemView.setOnLongClickListener {
getItem(holder.layoutPosition)?.let {
itemLongClickListener?.invoke(holder, it) ?: true
} ?: true
}
}
return holder
}
protected abstract fun getViewBinding(parent: ViewGroup): VB
final override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {}
open fun onCurrentListChanged() {
}
@Suppress("UNCHECKED_CAST")
final override fun onBindViewHolder(
holder: ItemViewHolder,
position: Int,
payloads: MutableList<Any>
) {
getItem(holder.layoutPosition)?.let {
convert(holder, (holder.binding as VB), it, payloads)
}
}
override fun onViewAttachedToWindow(holder: ItemViewHolder) {
super.onViewAttachedToWindow(holder)
addAnimation(holder)
}
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
val manager = recyclerView.layoutManager
if (manager is GridLayoutManager) {
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return getSpanSize(getItemViewType(position), position)
}
}
}
}
private fun addAnimation(holder: ItemViewHolder) {
itemAnimation?.let {
if (it.itemAnimEnabled) {
if (!it.itemAnimFirstOnly || holder.layoutPosition > it.itemAnimStartPosition) {
startAnimation(holder, it)
it.itemAnimStartPosition = holder.layoutPosition
}
}
}
}
protected open fun startAnimation(holder: ItemViewHolder, item: ItemAnimation) {
item.itemAnimation?.let {
for (anim in it.getAnimators(holder.itemView)) {
anim.setDuration(item.itemAnimDuration).start()
anim.interpolator = item.itemAnimInterpolator
}
}
}
/**
* 如果使用了事件回调,回调里不要直接使用item,会出现不更新的问题,
* 使用getItem(holder.layoutPosition)来获取item
*/
abstract fun convert(
holder: ItemViewHolder,
binding: VB,
item: ITEM,
payloads: MutableList<Any>
)
/**
* 注册事件
*/
abstract fun registerListener(holder: ItemViewHolder, binding: VB)
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/ItemAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter
import android.view.animation.Interpolator
import android.view.animation.LinearInterpolator
import com.kunfei.bookshelf.base.adapter.animations.*
/**
* Created by Invincible on 2017/12/15.
*/
@Suppress("unused")
class ItemAnimation private constructor() {
var itemAnimEnabled = false
var itemAnimFirstOnly = true
var itemAnimation: BaseAnimation? = null
var itemAnimInterpolator: Interpolator = LinearInterpolator()
var itemAnimDuration: Long = 300L
var itemAnimStartPosition: Int = -1
fun interpolator(interpolator: Interpolator) = apply {
itemAnimInterpolator = interpolator
}
fun duration(duration: Long) = apply {
itemAnimDuration = duration
}
fun startPosition(startPos: Int) = apply {
itemAnimStartPosition = startPos
}
fun animation(animationType: Int = NONE, animation: BaseAnimation? = null) = apply {
if (animation != null) {
itemAnimation = animation
} else {
when (animationType) {
FADE_IN -> itemAnimation = AlphaInAnimation()
SCALE_IN -> itemAnimation = ScaleInAnimation()
BOTTOM_SLIDE_IN -> itemAnimation = SlideInBottomAnimation()
LEFT_SLIDE_IN -> itemAnimation = SlideInLeftAnimation()
RIGHT_SLIDE_IN -> itemAnimation = SlideInRightAnimation()
}
}
}
fun enabled(enabled: Boolean) = apply {
itemAnimEnabled = enabled
}
fun firstOnly(firstOnly: Boolean) = apply {
itemAnimFirstOnly = firstOnly
}
companion object {
const val NONE: Int = 0x00000000
/**
* Use with [.openLoadAnimation]
*/
const val FADE_IN: Int = 0x00000001
/**
* Use with [.openLoadAnimation]
*/
const val SCALE_IN: Int = 0x00000002
/**
* Use with [.openLoadAnimation]
*/
const val BOTTOM_SLIDE_IN: Int = 0x00000003
/**
* Use with [.openLoadAnimation]
*/
const val LEFT_SLIDE_IN: Int = 0x00000004
/**
* Use with [.openLoadAnimation]
*/
const val RIGHT_SLIDE_IN: Int = 0x00000005
fun create() = ItemAnimation()
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/ItemViewHolder.kt
================================================
package com.kunfei.bookshelf.base.adapter
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
/**
* Created by Invincible on 2017/11/28.
*/
@Suppress("MemberVisibilityCanBePrivate")
class ItemViewHolder(val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root)
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/RecyclerAdapter.kt
================================================
package com.kunfei.bookshelf.base.adapter
import android.content.Context
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import java.util.*
/**
* Created by Invincible on 2017/11/24.
*
* 通用的adapter 可添加header,footer,以及不同类型item
*/
@Suppress("unused", "MemberVisibilityCanBePrivate")
abstract class RecyclerAdapter<ITEM, VB : ViewBinding>(protected val context: Context) :
RecyclerView.Adapter<ItemViewHolder>() {
val inflater: LayoutInflater = LayoutInflater.from(context)
private val headerItems: SparseArray<(parent: ViewGroup) -> ViewBinding> by lazy { SparseArray() }
private val footerItems: SparseArray<(parent: ViewGroup) -> ViewBinding> by lazy { SparseArray() }
private val items: MutableList<ITEM> = mutableListOf()
private val lock = Object()
private var itemClickListener: ((holder: ItemViewHolder, item: ITEM) -> Unit)? = null
private var itemLongClickListener: ((holder: ItemViewHolder, item: ITEM) -> Boolean)? = null
var itemAnimation: ItemAnimation? = null
fun setOnItemClickListener(listener: (holder: ItemViewHolder, item: ITEM) -> Unit) {
itemClickListener = listener
}
fun setOnItemLongClickListener(listener: (holder: ItemViewHolder, item: ITEM) -> Boolean) {
itemLongClickListener = listener
}
fun bindToRecyclerView(recyclerView: RecyclerView) {
recyclerView.adapter = this
}
fun addHeaderView(header: ((parent: ViewGroup) -> ViewBinding)) {
synchronized(lock) {
val index = headerItems.size()
headerItems.put(TYPE_HEADER_VIEW + headerItems.size(), header)
notifyItemInserted(index)
}
}
fun addFooterView(footer: ((parent: ViewGroup) -> ViewBinding)) =
synchronized(lock) {
val index = getActualItemCount() + footerItems.size()
footerItems.put(TYPE_FOOTER_VIEW + footerItems.size(), footer)
notifyItemInserted(index)
}
fun removeHeaderView(header: ((parent: ViewGroup) -> ViewBinding)) =
synchronized(lock) {
val index = headerItems.indexOfValue(header)
if (index >= 0) {
headerItems.remove(index)
notifyItemRemoved(index)
}
}
fun removeFooterView(footer: ((parent: ViewGroup) -> ViewBinding)) =
synchronized(lock) {
val index = footerItems.indexOfValue(footer)
if (index >= 0) {
footerItems.remove(index)
notifyItemRemoved(getActualItemCount() + index - 2)
}
}
fun setItems(items: List<ITEM>?) {
synchronized(lock) {
if (this.items.isNotEmpty()) {
this.items.clear()
}
if (items != null) {
this.items.addAll(items)
}
notifyDataSetChanged()
onCurrentListChanged()
}
}
fun setItems(items: List<ITEM>?, diffResult: DiffUtil.DiffResult) {
synchronized(lock) {
if (this.items.isNotEmpty()) {
this.items.clear()
}
if (items != null) {
this.items.addAll(items)
}
diffResult.dispatchUpdatesTo(this)
onCurrentListChanged()
}
}
fun setItem(position: Int, item: ITEM) {
synchronized(lock) {
val oldSize = getActualItemCount()
if (position in 0 until oldSize) {
this.items[position] = item
notifyItemChanged(position + getHeaderCount())
}
onCurrentListChanged()
}
}
fun addItem(item: ITEM) {
synchronized(lock) {
val oldSize = getActualItemCount()
if (this.items.add(item)) {
notifyItemInserted(oldSize + getHeaderCount())
}
onCurrentListChanged()
}
}
fun addItems(position: Int, newItems: List<ITEM>) {
synchronized(lock) {
if (this.items.addAll(position, newItems)) {
notifyItemRangeInserted(position + getHeaderCount(), newItems.size)
}
onCurrentListChanged()
}
}
fun addItems(newItems: List<ITEM>) {
synchronized(lock) {
val oldSize = getActualItemCount()
if (this.items.addAll(newItems)) {
if (oldSize == 0 && getHeaderCount() == 0) {
notifyDataSetChanged()
} else {
notifyItemRangeInserted(oldSize + getHeaderCount(), newItems.size)
}
}
onCurrentListChanged()
}
}
fun removeItem(position: Int) {
synchronized(lock) {
if (this.items.removeAt(position) != null) {
notifyItemRemoved(position + getHeaderCount())
}
onCurrentListChanged()
}
}
fun removeItem(item: ITEM) {
synchronized(lock) {
if (this.items.remove(item)) {
notifyItemRemoved(this.items.indexOf(item) + getHeaderCount())
}
onCurrentListChanged()
}
}
fun removeItems(items: List<ITEM>) {
synchronized(lock) {
if (this.items.removeAll(items)) {
notifyDataSetChanged()
}
onCurrentListChanged()
}
}
fun swapItem(oldPosition: Int, newPosition: Int) {
synchronized(lock) {
val size = getActualItemCount()
if (oldPosition in 0 until size && newPosition in 0 until size) {
val srcPosition = oldPosition + getHeaderCount()
val targetPosition = newPosition + getHeaderCount()
Collections.swap(this.items, srcPosition, targetPosition)
notifyItemMoved(srcPosition, targetPosition)
}
onCurrentListChanged()
}
}
fun updateItem(item: ITEM) =
synchronized(lock) {
val index = this.items.indexOf(item)
if (index >= 0) {
this.items[index] = item
notifyItemChanged(index)
}
onCurrentListChanged()
}
fun updateItem(position: Int, payload: Any) =
synchronized(lock) {
val size = getActualItemCount()
if (position in 0 until size) {
notifyItemChanged(position + getHeaderCount(), payload)
}
}
fun updateItems(fromPosition: Int, toPosition: Int, payloads: Any) =
synchronized(lock) {
val size = getActualItemCount()
if (fromPosition in 0 until size && toPosition in 0 until size) {
notifyItemRangeChanged(
fromPosition + getHeaderCount(),
toPosition - fromPosition + 1,
payloads
)
}
}
fun clearItems() = synchronized(lock) {
this.items.clear()
notifyDataSetChanged()
onCurrentListChanged()
}
fun isEmpty() = items.isEmpty()
fun isNotEmpty() = items.isNotEmpty()
/**
* 除去header和footer
*/
fun getActualItemCount() = items.size
fun getHeaderCount() = headerItems.size()
fun getFooterCount() = footerItems.size()
fun getItem(position: Int): ITEM? = items.getOrNull(position)
fun getItemByLayoutPosition(position: Int) = items.getOrNull(position - getHeaderCount())
fun getItems(): List<ITEM> = items
protected open fun getItemViewType(item: ITEM, position: Int) = 0
/**
* grid 模式下使用
*/
protected open fun getSpanSize(viewType: Int, position: Int) = 1
final override fun getItemCount() = getActualItemCount() + getHeaderCount() + getFooterCount()
final override fun getItemViewType(position: Int) = when {
isHeader(position) -> TYPE_HEADER_VIEW + position
isFooter(position) -> TYPE_FOOTER_VIEW + position - getActualItemCount() - getHeaderCount()
else -> getItem(getActualPosition(position))?.let {
getItemViewType(it, getActualPosition(position))
} ?: 0
}
open fun onCurrentListChanged() {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when {
viewType < TYPE_HEADER_VIEW + getHeaderCount() -> {
ItemViewHolder(headerItems.get(viewType).invoke(parent))
}
viewType >= TYPE_FOOTER_VIEW -> {
ItemViewHolder(footerItems.get(viewType).invoke(parent))
}
else -> {
val holder = ItemViewHolder(getViewBinding(parent))
@Suppress("UNCHECKED_CAST")
registerListener(holder, (holder.binding as VB))
if (itemClickListener != null) {
holder.itemView.setOnClickListener {
getItem(holder.layoutPosition)?.let {
itemClickListener?.invoke(holder, it)
}
}
}
if (itemLongClickListener != null) {
holder.itemView.setOnLongClickListener {
getItem(holder.layoutPosition)?.let {
itemLongClickListener?.invoke(holder, it) ?: true
} ?: true
}
}
holder
}
}
protected abstract fun getViewBinding(parent: ViewGroup): VB
final override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {}
@Suppress("UNCHECKED_CAST")
final override fun onBindViewHolder(
holder: ItemViewHolder,
position: Int,
payloads: MutableList<Any>
) {
if (!isHeader(holder.layoutPosition) && !isFooter(holder.layoutPosition)) {
getItem(holder.layoutPosition - getHeaderCount())?.let {
convert(holder, (holder.binding as VB), it, payloads)
}
}
}
override fun onViewAttachedToWindow(holder: ItemViewHolder) {
super.onViewAttachedToWindow(holder)
if (!isHeader(holder.layoutPosition) && !isFooter(holder.layoutPosition)) {
addAnimation(holder)
}
}
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
val manager = recyclerView.layoutManager
if (manager is GridLayoutManager) {
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return getSpanSize(getItemViewType(position), position)
}
}
}
}
private fun isHeader(position: Int) = position < getHeaderCount()
private fun isFooter(position: Int) = position >= getActualItemCount() + getHeaderCount()
private fun getActualPosition(position: Int) = position - getHeaderCount()
private fun addAnimation(holder: ItemViewHolder) {
itemAnimation?.let {
if (it.itemAnimEnabled) {
if (!it.itemAnimFirstOnly || holder.layoutPosition > it.itemAnimStartPosition) {
startAnimation(holder, it)
it.itemAnimStartPosition = holder.layoutPosition
}
}
}
}
protected open fun startAnimation(holder: ItemViewHolder, item: ItemAnimation) {
item.itemAnimation?.let {
for (anim in it.getAnimators(holder.itemView)) {
anim.setDuration(item.itemAnimDuration).start()
anim.interpolator = item.itemAnimInterpolator
}
}
}
/**
* 如果使用了事件回调,回调里不要直接使用item,会出现不更新的问题,
* 使用getItem(holder.layoutPosition)来获取item
*/
abstract fun convert(
holder: ItemViewHolder,
binding: VB,
item: ITEM,
payloads: MutableList<Any>
)
/**
* 注册事件
*/
abstract fun registerListener(holder: ItemViewHolder, binding: VB)
companion object {
private const val TYPE_HEADER_VIEW = Int.MIN_VALUE
private const val TYPE_FOOTER_VIEW = Int.MAX_VALUE - 999
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/AlphaInAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter.animations
import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
class AlphaInAnimation @JvmOverloads constructor(private val mFrom: Float = DEFAULT_ALPHA_FROM) : BaseAnimation {
override fun getAnimators(view: View): Array<Animator> =
arrayOf(ObjectAnimator.ofFloat(view, "alpha", mFrom, 1f))
companion object {
private const val DEFAULT_ALPHA_FROM = 0f
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/BaseAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter.animations
import android.animation.Animator
import android.view.View
/**
* adapter item 动画
*/
interface BaseAnimation {
fun getAnimators(view: View): Array<Animator>
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/ScaleInAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter.animations
import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
class ScaleInAnimation @JvmOverloads constructor(private val mFrom: Float = DEFAULT_SCALE_FROM) : BaseAnimation {
override fun getAnimators(view: View): Array<Animator> {
val scaleX = ObjectAnimator.ofFloat(view, "scaleX", mFrom, 1f)
val scaleY = ObjectAnimator.ofFloat(view, "scaleY", mFrom, 1f)
return arrayOf(scaleX, scaleY)
}
companion object {
private const val DEFAULT_SCALE_FROM = .5f
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/SlideInBottomAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter.animations
import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
class SlideInBottomAnimation : BaseAnimation {
override fun getAnimators(view: View): Array<Animator> =
arrayOf(ObjectAnimator.ofFloat(view, "translationY", view.measuredHeight.toFloat(), 0f))
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/SlideInLeftAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter.animations
import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
class SlideInLeftAnimation : BaseAnimation {
override fun getAnimators(view: View): Array<Animator> =
arrayOf(ObjectAnimator.ofFloat(view, "translationX", -view.rootView.width.toFloat(), 0f))
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/SlideInRightAnimation.kt
================================================
package com.kunfei.bookshelf.base.adapter.animations
import android.animation.Animator
import android.animation.ObjectAnimator
import android.view.View
class SlideInRightAnimation : BaseAnimation {
override fun getAnimators(view: View): Array<Animator> =
arrayOf(ObjectAnimator.ofFloat(view, "translationX", view.rootView.width.toFloat(), 0f))
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/observer/MyObserver.java
================================================
//Copyright (c) 2017. 章钦豪. All rights reserved.
package com.kunfei.bookshelf.base.observer;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public abstract class MyObserver<T> implements Observer<T> {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/base/observer/MySingleObserver.java
================================================
package com.kunfei.bookshelf.base.observer;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
public abstract class MySingleObserver<T> implements SingleObserver<T> {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onError(Throwable e) {
}
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BaseBookBean.java
================================================
package com.kunfei.bookshelf.bean;
import java.util.Map;
public interface BaseBookBean {
String getTag();
String getNoteUrl();
void setNoteUrl(String noteUrl);
String getVariable();
void setVariable(String variable);
void putVariable(String key, String value);
Map<String, String> getVariableMap();
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BaseChapterBean.java
================================================
package com.kunfei.bookshelf.bean;
public interface BaseChapterBean {
String getTag();
String getDurChapterUrl();
int getDurChapterIndex();
String getNoteUrl();
String getDurChapterName();
}
================================================
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookChapterBean.java
================================================
//Copyright (c) 2017. 章钦豪. All rights reserved.
package com.kunfei.bookshelf.bean;
import android.content.Context;
import com.google.gson.Gson;
import com.kunfei.bookshelf.R;
import com.kunfei.bookshelf.help.BookshelfHelp;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Generated;
import org.greenrobot.greendao.annotation.Id;
import java.util.Objects;
/**
* 章节列表
*/
@Entity
public class BookChapterBean implements Cloneable, BaseChapterBean {
private String tag;
private String noteUrl; //对应BookInfoBean noteUrl;
private int durChapterIndex; //当前章节数
@Id
private String durChapterUrl; //当前章节对应的文章地址
private String durChapterName; //当前章节名称
private boolean isVip;
private boolean isPay;
//章节内容在文章中的起始位置(本地)
private Long start;
//章节内容在文章中的终止位置(本地)
private Long end;
public BookChapterBean() {
}
@Generated(hash = 922679906)
public BookChapterBean(String tag, String noteUrl, int durChapterIndex, String durChapterUrl, String durChapterName,
boolean isVip, boolean isPay, Long start, Long end) {
this.tag = tag;
this.noteUrl = noteUrl;
this.durChapterIndex = durChapterIndex;
this.durChapterUrl = durChapterUrl;
this.durChapterName = durChapterName;
this.isVip = isVip;
this.isPay = isPay;
this.start = start;
this.end = end;
}
public BookChapterBean(String tag, String durChapterName, String durChapterUrl) {
this.tag = tag;
this.durChapterName = durChapterName;
this.durChapterUrl = durChapterUrl;
}
public BookChapterBean(String tag, String durChapterName, String durChapterUrl, boolean isVip, boolean isPay) {
this.tag = tag;
this.durChapterName = durChapterName;
this.durChapterUrl = durChapterUrl;
this.isVip = isVip;
this.isPay = isPay;
}
@Override
protected Object clone() {
try {
Gson gson = new Gson();
String json = gson.toJson(this);
return gson.fromJson(json, BookChapterBean.class);
} catch (Exception ignored) {
}
return this;
}
@Overri
gitextract_l4utlapa/
├── .gitignore
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── ReadMe.md
│ ├── build.gradle
│ ├── gradle.properties
│ ├── key.properties.jks
│ ├── proguard-rules.pro
│ └── src/
│ ├── debug/
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── assets/
│ │ │ ├── 18PlusList.txt
│ │ │ ├── data/
│ │ │ │ └── BookSourceXxl.json
│ │ │ ├── disclaimer.md
│ │ │ ├── txtChapterRule.json
│ │ │ ├── updateLog.md
│ │ │ └── web/
│ │ │ ├── bookshelf.css
│ │ │ ├── bookshelf.html
│ │ │ ├── bookshelf.js
│ │ │ ├── index.css
│ │ │ ├── index.html
│ │ │ └── index.js
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── kunfei/
│ │ │ └── bookshelf/
│ │ │ ├── DbHelper.java
│ │ │ ├── MApplication.java
│ │ │ ├── base/
│ │ │ │ ├── BaseDialogFragment.kt
│ │ │ │ ├── BaseFragment.kt
│ │ │ │ ├── BaseModelImpl.java
│ │ │ │ ├── BaseService.kt
│ │ │ │ ├── BaseTabActivity.java
│ │ │ │ ├── BaseViewModel.kt
│ │ │ │ ├── MBaseActivity.java
│ │ │ │ ├── MBaseFragment.java
│ │ │ │ ├── README.md
│ │ │ │ ├── VMBaseFragment.kt
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── DiffRecyclerAdapter.kt
│ │ │ │ │ ├── ItemAnimation.kt
│ │ │ │ │ ├── ItemViewHolder.kt
│ │ │ │ │ ├── RecyclerAdapter.kt
│ │ │ │ │ └── animations/
│ │ │ │ │ ├── AlphaInAnimation.kt
│ │ │ │ │ ├── BaseAnimation.kt
│ │ │ │ │ ├── ScaleInAnimation.kt
│ │ │ │ │ ├── SlideInBottomAnimation.kt
│ │ │ │ │ ├── SlideInLeftAnimation.kt
│ │ │ │ │ └── SlideInRightAnimation.kt
│ │ │ │ └── observer/
│ │ │ │ ├── MyObserver.java
│ │ │ │ └── MySingleObserver.java
│ │ │ ├── bean/
│ │ │ │ ├── BaseBookBean.java
│ │ │ │ ├── BaseChapterBean.java
│ │ │ │ ├── BookChapterBean.java
│ │ │ │ ├── BookContentBean.java
│ │ │ │ ├── BookInfoBean.java
│ │ │ │ ├── BookKindBean.java
│ │ │ │ ├── BookShelfBean.java
│ │ │ │ ├── BookSource3Bean.java
│ │ │ │ ├── BookSourceBean.java
│ │ │ │ ├── BookmarkBean.java
│ │ │ │ ├── CookieBean.java
│ │ │ │ ├── DownloadBookBean.java
│ │ │ │ ├── DownloadChapterBean.java
│ │ │ │ ├── FindKindBean.java
│ │ │ │ ├── FindKindGroupBean.java
│ │ │ │ ├── LocBookShelfBean.java
│ │ │ │ ├── OpenChapterBean.java
│ │ │ │ ├── ReplaceRuleBean.java
│ │ │ │ ├── SearchBookBean.java
│ │ │ │ ├── SearchHistoryBean.java
│ │ │ │ ├── TwoDataBean.java
│ │ │ │ ├── TxtChapterRuleBean.java
│ │ │ │ ├── UpdateInfoBean.java
│ │ │ │ └── WebChapterBean.java
│ │ │ ├── constant/
│ │ │ │ ├── AppConst.kt
│ │ │ │ ├── AppConstant.java
│ │ │ │ ├── BookType.java
│ │ │ │ ├── RxBusTag.java
│ │ │ │ └── TimeConstants.java
│ │ │ ├── help/
│ │ │ │ ├── AppFrontBackHelper.java
│ │ │ │ ├── BlurTransformation.java
│ │ │ │ ├── BookshelfHelp.java
│ │ │ │ ├── ChangeSourceHelp.java
│ │ │ │ ├── ChapterContentHelp.java
│ │ │ │ ├── CrashHandler.java
│ │ │ │ ├── DefaultValueHelper.kt
│ │ │ │ ├── DocumentHelper.java
│ │ │ │ ├── Donate.java
│ │ │ │ ├── EncodeConverter.java
│ │ │ │ ├── ExoPlayerHelper.kt
│ │ │ │ ├── FileHelp.java
│ │ │ │ ├── IntentData.kt
│ │ │ │ ├── ItemTouchCallback.java
│ │ │ │ ├── JsExtensions.java
│ │ │ │ ├── LauncherIcon.java
│ │ │ │ ├── MediaManager.java
│ │ │ │ ├── ProcessTextHelp.java
│ │ │ │ ├── ReadBookControl.java
│ │ │ │ ├── SSLSocketClient.java
│ │ │ │ ├── SourceHelp.kt
│ │ │ │ ├── UTF8BOMFighter.java
│ │ │ │ ├── UpdateManager.java
│ │ │ │ ├── coroutine/
│ │ │ │ │ ├── CompositeCoroutine.kt
│ │ │ │ │ ├── Coroutine.kt
│ │ │ │ │ └── CoroutineContainer.kt
│ │ │ │ ├── glide/
│ │ │ │ │ ├── ImageLoader.kt
│ │ │ │ │ ├── OkHttpGlideModule.kt
│ │ │ │ │ ├── OkHttpModeLoaderFactory.kt
│ │ │ │ │ ├── OkHttpModelLoader.kt
│ │ │ │ │ └── OkHttpStreamFetcher.kt
│ │ │ │ ├── media/
│ │ │ │ │ ├── LoaderCreator.java
│ │ │ │ │ ├── LocalFileLoader.java
│ │ │ │ │ └── MediaStoreHelper.java
│ │ │ │ ├── permission/
│ │ │ │ │ ├── ActivitySource.kt
│ │ │ │ │ ├── FragmentSource.kt
│ │ │ │ │ ├── OnPermissionsDeniedCallback.kt
│ │ │ │ │ ├── OnPermissionsGrantedCallback.kt
│ │ │ │ │ ├── OnPermissionsResultCallback.kt
│ │ │ │ │ ├── OnRequestPermissionsResultCallback.kt
│ │ │ │ │ ├── PermissionActivity.kt
│ │ │ │ │ ├── Permissions.kt
│ │ │ │ │ ├── PermissionsCompat.kt
│ │ │ │ │ ├── Request.kt
│ │ │ │ │ ├── RequestManager.kt
│ │ │ │ │ ├── RequestPlugins.kt
│ │ │ │ │ └── RequestSource.kt
│ │ │ │ └── storage/
│ │ │ │ ├── Backup.kt
│ │ │ │ ├── BackupRestoreUi.kt
│ │ │ │ ├── Preferences.kt
│ │ │ │ ├── Restore.kt
│ │ │ │ └── WebDavHelp.kt
│ │ │ ├── model/
│ │ │ │ ├── BookSourceManager.java
│ │ │ │ ├── Exceptions.kt
│ │ │ │ ├── ImportBookModel.java
│ │ │ │ ├── ReplaceRuleManager.java
│ │ │ │ ├── SavedSource.java
│ │ │ │ ├── SearchBookModel.java
│ │ │ │ ├── TxtChapterRuleManager.java
│ │ │ │ ├── UpLastChapterModel.java
│ │ │ │ ├── WebBookModel.java
│ │ │ │ ├── analyzeRule/
│ │ │ │ │ ├── AnalyzeByJSonPath.java
│ │ │ │ │ ├── AnalyzeByJSoup.java
│ │ │ │ │ ├── AnalyzeByRegex.java
│ │ │ │ │ ├── AnalyzeByXPath.java
│ │ │ │ │ ├── AnalyzeHeaders.java
│ │ │ │ │ ├── AnalyzeRule.java
│ │ │ │ │ └── AnalyzeUrl.java
│ │ │ │ ├── content/
│ │ │ │ │ ├── BookChapterList.java
│ │ │ │ │ ├── BookContent.java
│ │ │ │ │ ├── BookInfo.java
│ │ │ │ │ ├── BookList.java
│ │ │ │ │ ├── Debug.java
│ │ │ │ │ ├── VipThrowable.java
│ │ │ │ │ └── WebBook.java
│ │ │ │ ├── impl/
│ │ │ │ │ ├── IDownloadTask.java
│ │ │ │ │ ├── IHttpGetApi.java
│ │ │ │ │ └── IHttpPostApi.java
│ │ │ │ └── task/
│ │ │ │ ├── AnalyzeNextUrlTask.java
│ │ │ │ ├── CheckSourceTask.java
│ │ │ │ └── DownloadTaskImpl.java
│ │ │ ├── presenter/
│ │ │ │ ├── BookDetailPresenter.java
│ │ │ │ ├── BookListPresenter.java
│ │ │ │ ├── BookSourcePresenter.java
│ │ │ │ ├── ChoiceBookPresenter.java
│ │ │ │ ├── FindBookPresenter.java
│ │ │ │ ├── ImportBookPresenter.java
│ │ │ │ ├── MainPresenter.java
│ │ │ │ ├── ReadBookPresenter.java
│ │ │ │ ├── ReplaceRulePresenter.java
│ │ │ │ ├── SearchBookPresenter.java
│ │ │ │ ├── SourceEditPresenter.java
│ │ │ │ ├── TxtChapterRulePresenter.java
│ │ │ │ └── contract/
│ │ │ │ ├── BookDetailContract.java
│ │ │ │ ├── BookListContract.java
│ │ │ │ ├── BookSourceContract.java
│ │ │ │ ├── ChoiceBookContract.java
│ │ │ │ ├── FindBookContract.java
│ │ │ │ ├── ImportBookContract.java
│ │ │ │ ├── MainContract.java
│ │ │ │ ├── ReadBookContract.java
│ │ │ │ ├── ReplaceRuleContract.java
│ │ │ │ ├── SearchBookContract.java
│ │ │ │ ├── SourceEditContract.java
│ │ │ │ └── TxtChapterRuleContract.java
│ │ │ ├── service/
│ │ │ │ ├── CheckSourceService.java
│ │ │ │ ├── DownloadService.java
│ │ │ │ ├── MediaButtonIntentReceiver.java
│ │ │ │ ├── ReadAloudService.java
│ │ │ │ ├── ShareService.java
│ │ │ │ └── WebService.java
│ │ │ ├── utils/
│ │ │ │ ├── ACache.java
│ │ │ │ ├── ActivityExtensions.kt
│ │ │ │ ├── BatteryUtil.java
│ │ │ │ ├── BitmapUtil.java
│ │ │ │ ├── ColorUtils.kt
│ │ │ │ ├── ContextExtensions.kt
│ │ │ │ ├── ConvertUtils.kt
│ │ │ │ ├── DensityUtil.java
│ │ │ │ ├── DialogExtensions.kt
│ │ │ │ ├── DocumentExtensions.kt
│ │ │ │ ├── DocumentUtil.java
│ │ │ │ ├── DrawableUtil.kt
│ │ │ │ ├── EncoderUtils.kt
│ │ │ │ ├── EncodingDetect.java
│ │ │ │ ├── FastXmlSerializer.java
│ │ │ │ ├── FileStack.java
│ │ │ │ ├── FileUtils.kt
│ │ │ │ ├── FloatExtensions.kt
│ │ │ │ ├── GsonExtensions.kt
│ │ │ │ ├── GsonUtils.java
│ │ │ │ ├── HandlerUtils.kt
│ │ │ │ ├── IOUtils.java
│ │ │ │ ├── IntentExtensions.kt
│ │ │ │ ├── ListUtil.java
│ │ │ │ ├── MD5Utils.java
│ │ │ │ ├── MarkdownUtils.java
│ │ │ │ ├── MeUtils.java
│ │ │ │ ├── NetworkUtils.java
│ │ │ │ ├── ReadAssets.java
│ │ │ │ ├── RealPathUtil.kt
│ │ │ │ ├── RxUtils.java
│ │ │ │ ├── ScreenUtils.java
│ │ │ │ ├── Selector.java
│ │ │ │ ├── SoftInputUtil.java
│ │ │ │ ├── StringExtensions.kt
│ │ │ │ ├── StringJoiner.java
│ │ │ │ ├── StringUtils.java
│ │ │ │ ├── SystemUtil.java
│ │ │ │ ├── TimeUtils.java
│ │ │ │ ├── Toasts.kt
│ │ │ │ ├── UriExtensions.kt
│ │ │ │ ├── UrlEncoderUtils.java
│ │ │ │ ├── XmlUtils.java
│ │ │ │ ├── ZipUtils.java
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── AlertBuilder.kt
│ │ │ │ │ ├── AndroidAlertBuilder.kt
│ │ │ │ │ ├── AndroidDialogs.kt
│ │ │ │ │ ├── AndroidSelectors.kt
│ │ │ │ │ └── SelectItem.kt
│ │ │ │ ├── download/
│ │ │ │ │ ├── DownloadUtils.java
│ │ │ │ │ ├── JsDownloadInterceptor.java
│ │ │ │ │ ├── JsDownloadListener.java
│ │ │ │ │ ├── JsResponseBody.java
│ │ │ │ │ └── Service.java
│ │ │ │ ├── theme/
│ │ │ │ │ ├── ATH.java
│ │ │ │ │ ├── ATHUtil.java
│ │ │ │ │ ├── MaterialValueHelper.java
│ │ │ │ │ ├── MaterialValueHelper.kt
│ │ │ │ │ ├── NavigationViewUtil.java
│ │ │ │ │ ├── ThemeStore.java
│ │ │ │ │ ├── ThemeStoreInterface.java
│ │ │ │ │ ├── ThemeStorePrefKeys.java
│ │ │ │ │ ├── TintHelper.java
│ │ │ │ │ └── ViewUtil.java
│ │ │ │ ├── viewbindingdelegate/
│ │ │ │ │ ├── ActivityViewBindings.kt
│ │ │ │ │ ├── FragmentViewBindings.kt
│ │ │ │ │ └── ViewBindingProperty.kt
│ │ │ │ └── webdav/
│ │ │ │ ├── README.md
│ │ │ │ ├── WebDav.kt
│ │ │ │ └── http/
│ │ │ │ ├── Handler.kt
│ │ │ │ └── HttpAuth.kt
│ │ │ ├── view/
│ │ │ │ ├── activity/
│ │ │ │ │ ├── AboutActivity.java
│ │ │ │ │ ├── BookCoverEditActivity.java
│ │ │ │ │ ├── BookDetailActivity.java
│ │ │ │ │ ├── BookInfoEditActivity.java
│ │ │ │ │ ├── BookSourceActivity.java
│ │ │ │ │ ├── ChapterListActivity.java
│ │ │ │ │ ├── ChoiceBookActivity.java
│ │ │ │ │ ├── DonateActivity.java
│ │ │ │ │ ├── DownloadActivity.java
│ │ │ │ │ ├── ImportBookActivity.java
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ ├── QRCodeScanActivity.java
│ │ │ │ │ ├── ReadBookActivity.java
│ │ │ │ │ ├── ReadStyleActivity.java
│ │ │ │ │ ├── ReceivingSharedActivity.java
│ │ │ │ │ ├── ReplaceRuleActivity.java
│ │ │ │ │ ├── SearchBookActivity.java
│ │ │ │ │ ├── SettingActivity.java
│ │ │ │ │ ├── SourceDebugActivity.java
│ │ │ │ │ ├── SourceEditActivity.java
│ │ │ │ │ ├── SourceLoginActivity.java
│ │ │ │ │ ├── ThemeSettingActivity.java
│ │ │ │ │ ├── TxtChapterRuleActivity.java
│ │ │ │ │ ├── WebViewActivity.kt
│ │ │ │ │ ├── WelcomeActivity.java
│ │ │ │ │ └── WelcomeBookActivity.java
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── BookShelfAdapter.java
│ │ │ │ │ ├── BookShelfGridAdapter.java
│ │ │ │ │ ├── BookShelfListAdapter.java
│ │ │ │ │ ├── BookSourceAdapter.java
│ │ │ │ │ ├── BookmarkAdapter.java
│ │ │ │ │ ├── ChangeSourceAdapter.java
│ │ │ │ │ ├── ChapterListAdapter.java
│ │ │ │ │ ├── ChoiceBookAdapter.java
│ │ │ │ │ ├── DownloadAdapter.java
│ │ │ │ │ ├── FileSystemAdapter.java
│ │ │ │ │ ├── FindKindAdapter.java
│ │ │ │ │ ├── FindLeftAdapter.java
│ │ │ │ │ ├── FindRightAdapter.java
│ │ │ │ │ ├── ReplaceRuleAdapter.java
│ │ │ │ │ ├── SearchBookAdapter.java
│ │ │ │ │ ├── SearchBookshelfAdapter.java
│ │ │ │ │ ├── SourceDebugAdapter.java
│ │ │ │ │ ├── SourceEditAdapter.java
│ │ │ │ │ ├── TxtChapterRuleAdapter.java
│ │ │ │ │ ├── base/
│ │ │ │ │ │ ├── BaseListAdapter.java
│ │ │ │ │ │ ├── BaseViewHolder.java
│ │ │ │ │ │ ├── IViewHolder.java
│ │ │ │ │ │ ├── OnItemClickListenerTwo.java
│ │ │ │ │ │ └── ViewHolderImpl.java
│ │ │ │ │ └── view/
│ │ │ │ │ └── FileHolder.java
│ │ │ │ ├── dialog/
│ │ │ │ │ └── SourceLoginDialog.kt
│ │ │ │ ├── fragment/
│ │ │ │ │ ├── BaseFileFragment.java
│ │ │ │ │ ├── BookListFragment.java
│ │ │ │ │ ├── BookmarkFragment.java
│ │ │ │ │ ├── ChapterListFragment.java
│ │ │ │ │ ├── FileCategoryFragment.java
│ │ │ │ │ ├── FindBookFragment.java
│ │ │ │ │ ├── LocalBookFragment.java
│ │ │ │ │ ├── SettingsFragment.kt
│ │ │ │ │ ├── ThemeSettingsFragment.java
│ │ │ │ │ └── WebDavSettingsFragment.java
│ │ │ │ └── popupwindow/
│ │ │ │ ├── CheckAddShelfPop.java
│ │ │ │ ├── KeyboardToolPop.kt
│ │ │ │ ├── MediaPlayerPop.java
│ │ │ │ ├── MoreSettingPop.kt
│ │ │ │ ├── ReadAdjustMarginPop.kt
│ │ │ │ ├── ReadAdjustPop.java
│ │ │ │ ├── ReadBottomMenu.java
│ │ │ │ ├── ReadInterfacePop.kt
│ │ │ │ └── ReadLongPressPop.java
│ │ │ ├── web/
│ │ │ │ ├── HttpServer.java
│ │ │ │ ├── ShareServer.java
│ │ │ │ ├── WebSocketServer.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── BookshelfController.java
│ │ │ │ │ ├── SourceController.java
│ │ │ │ │ └── SourceDebugWebSocket.java
│ │ │ │ └── utils/
│ │ │ │ ├── AssetsWeb.java
│ │ │ │ └── ReturnData.java
│ │ │ └── widget/
│ │ │ ├── BadgeView.java
│ │ │ ├── HorizontalListView.java
│ │ │ ├── RotateLoading.java
│ │ │ ├── ScrollTextView.java
│ │ │ ├── check_box/
│ │ │ │ └── SmoothCheckBox.java
│ │ │ ├── explosion_field/
│ │ │ │ ├── ExplosionAnimator.java
│ │ │ │ ├── ExplosionField.java
│ │ │ │ ├── OnAnimatorListener.java
│ │ │ │ └── Utils.java
│ │ │ ├── filepicker/
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── FileAdapter.java
│ │ │ │ │ └── PathAdapter.java
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── StateBaseDrawable.java
│ │ │ │ │ └── StateColorDrawable.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── FileItem.java
│ │ │ │ │ └── JavaBean.java
│ │ │ │ ├── icons/
│ │ │ │ │ └── FilePickerIcon.java
│ │ │ │ ├── picker/
│ │ │ │ │ └── FilePicker.java
│ │ │ │ ├── popup/
│ │ │ │ │ ├── BasicPopup.java
│ │ │ │ │ └── ConfirmPopup.java
│ │ │ │ └── util/
│ │ │ │ ├── ConvertUtils.java
│ │ │ │ ├── DateUtils.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── ScreenUtils.java
│ │ │ │ └── StorageUtils.java
│ │ │ ├── font/
│ │ │ │ ├── FontAdapter.java
│ │ │ │ └── FontSelector.java
│ │ │ ├── image/
│ │ │ │ ├── CoverImageView.kt
│ │ │ │ └── FilletImageView.java
│ │ │ ├── itemdecoration/
│ │ │ │ ├── DividerGridItemDecoration.java
│ │ │ │ └── DividerItemDecoration.java
│ │ │ ├── modialog/
│ │ │ │ ├── BaseDialog.java
│ │ │ │ ├── BookmarkDialog.java
│ │ │ │ ├── ChangeSourceDialog.java
│ │ │ │ ├── DownLoadDialog.java
│ │ │ │ ├── InputDialog.java
│ │ │ │ ├── MoDialogHUD.java
│ │ │ │ ├── MoDialogView.java
│ │ │ │ ├── PageKeyDialog.kt
│ │ │ │ ├── ReplaceRuleDialog.java
│ │ │ │ └── TxtChapterRuleDialog.java
│ │ │ ├── number/
│ │ │ │ ├── NumberButton.java
│ │ │ │ ├── NumberPickerDialog.java
│ │ │ │ └── NumberPickerPreference.java
│ │ │ ├── page/
│ │ │ │ ├── ChapterProvider.java
│ │ │ │ ├── PageLoader.java
│ │ │ │ ├── PageLoaderEpub.java
│ │ │ │ ├── PageLoaderNet.java
│ │ │ │ ├── PageLoaderText.java
│ │ │ │ ├── PageView.java
│ │ │ │ ├── TxtChapter.kt
│ │ │ │ ├── TxtChar.kt
│ │ │ │ ├── TxtLine.kt
│ │ │ │ ├── TxtPage.kt
│ │ │ │ └── animation/
│ │ │ │ ├── CoverPageAnim.java
│ │ │ │ ├── HorizonPageAnim.java
│ │ │ │ ├── NonePageAnim.java
│ │ │ │ ├── PageAnimation.java
│ │ │ │ ├── ScrollPageAnim.java
│ │ │ │ ├── SimulationPageAnim.java
│ │ │ │ └── SlidePageAnim.java
│ │ │ ├── prefs/
│ │ │ │ ├── ATEPreferenceCategory.java
│ │ │ │ ├── ATESwitchPreference.java
│ │ │ │ └── IconListPreference.java
│ │ │ ├── recycler/
│ │ │ │ ├── expandable/
│ │ │ │ │ ├── BaseExpandAbleViewHolder.java
│ │ │ │ │ ├── BaseExpandableRecyclerAdapter.java
│ │ │ │ │ ├── OnRecyclerViewListener.java
│ │ │ │ │ └── bean/
│ │ │ │ │ ├── BaseItem.java
│ │ │ │ │ ├── GroupItem.java
│ │ │ │ │ └── RecyclerViewData.java
│ │ │ │ ├── refresh/
│ │ │ │ │ ├── BaseRefreshListener.java
│ │ │ │ │ ├── OnLoadMoreListener.java
│ │ │ │ │ ├── OnRefreshWithProgressListener.java
│ │ │ │ │ ├── RefreshLayout.java
│ │ │ │ │ ├── RefreshProgressBar.java
│ │ │ │ │ ├── RefreshRecyclerView.java
│ │ │ │ │ ├── RefreshRecyclerViewAdapter.java
│ │ │ │ │ └── RefreshScrollView.java
│ │ │ │ ├── scroller/
│ │ │ │ │ ├── FastScrollRecyclerView.java
│ │ │ │ │ ├── FastScrollStateChangeListener.java
│ │ │ │ │ └── FastScroller.java
│ │ │ │ └── sectioned/
│ │ │ │ ├── GridSpacingItemDecoration.java
│ │ │ │ ├── SectionedRecyclerViewAdapter.java
│ │ │ │ └── SectionedSpanSizeLookup.java
│ │ │ ├── seekbar/
│ │ │ │ ├── VerticalSeekBar.kt
│ │ │ │ └── VerticalSeekBarWrapper.kt
│ │ │ └── views/
│ │ │ ├── ATEAccentBgTextView.java
│ │ │ ├── ATEAccentStrokeTextView.java
│ │ │ ├── ATEAutoCompleteTextView.java
│ │ │ ├── ATECheckBox.java
│ │ │ ├── ATEEditText.java
│ │ │ ├── ATEPrimaryTextView.java
│ │ │ ├── ATEProgressBar.java
│ │ │ ├── ATERadioButton.java
│ │ │ ├── ATERadioNoButton.java
│ │ │ ├── ATESecondaryTextView.java
│ │ │ ├── ATESeekBar.java
│ │ │ ├── ATEStockSwitch.java
│ │ │ ├── ATEStrokeTextView.java
│ │ │ ├── ATESwitch.java
│ │ │ └── ATETextInputLayout.java
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── anim_none.xml
│ │ │ ├── anim_readbook_bottom_in.xml
│ │ │ ├── anim_readbook_bottom_out.xml
│ │ │ ├── anim_readbook_top_in.xml
│ │ │ ├── anim_readbook_top_out.xml
│ │ │ ├── moprogress_bottom_in.xml
│ │ │ ├── moprogress_bottom_out.xml
│ │ │ ├── moprogress_in.xml
│ │ │ ├── moprogress_in_bottom_right.xml
│ │ │ ├── moprogress_in_top_right.xml
│ │ │ ├── moprogress_out.xml
│ │ │ ├── moprogress_out_bottom_right.xml
│ │ │ └── moprogress_out_top_right.xml
│ │ ├── color/
│ │ │ └── selector_menu_text.xml
│ │ ├── drawable/
│ │ │ ├── bg_chapter_item_divider.xml
│ │ │ ├── bg_edit.xml
│ │ │ ├── bg_ib_pre.xml
│ │ │ ├── bg_ib_pre_round.xml
│ │ │ ├── bg_textfield_search.xml
│ │ │ ├── fastscroll_bubble.xml
│ │ │ ├── fastscroll_handle.xml
│ │ │ ├── fastscroll_track.xml
│ │ │ ├── ic_about.xml
│ │ │ ├── ic_add.xml
│ │ │ ├── ic_add_online.xml
│ │ │ ├── ic_arrange.xml
│ │ │ ├── ic_arrow_back.xml
│ │ │ ├── ic_arrow_drop_down.xml
│ │ │ ├── ic_arrow_drop_up.xml
│ │ │ ├── ic_author.xml
│ │ │ ├── ic_auto_page.xml
│ │ │ ├── ic_auto_page_stop.xml
│ │ │ ├── ic_back_last.xml
│ │ │ ├── ic_backup.xml
│ │ │ ├── ic_baseline_label.xml
│ │ │ ├── ic_book_has.xml
│ │ │ ├── ic_book_last.xml
│ │ │ ├── ic_book_source_manage.xml
│ │ │ ├── ic_bookmark.xml
│ │ │ ├── ic_brightness.xml
│ │ │ ├── ic_bug_report_black_24dp.xml
│ │ │ ├── ic_cancel.xml
│ │ │ ├── ic_chapter_list.xml
│ │ │ ├── ic_check.xml
│ │ │ ├── ic_check_source.xml
│ │ │ ├── ic_clear_all.xml
│ │ │ ├── ic_copy.xml
│ │ │ ├── ic_cursor_left.xml
│ │ │ ├── ic_cursor_right.xml
│ │ │ ├── ic_daytime.xml
│ │ │ ├── ic_disclaimer.xml
│ │ │ ├── ic_donate.xml
│ │ │ ├── ic_download.xml
│ │ │ ├── ic_download_line.xml
│ │ │ ├── ic_edit.xml
│ │ │ ├── ic_exchange.xml
│ │ │ ├── ic_expand_less_24dp.xml
│ │ │ ├── ic_expand_more_24dp.xml
│ │ │ ├── ic_faq.xml
│ │ │ ├── ic_find_replace.xml
│ │ │ ├── ic_folder.xml
│ │ │ ├── ic_format_line_spacing.xml
│ │ │ ├── ic_groups.xml
│ │ │ ├── ic_history.xml
│ │ │ ├── ic_import.xml
│ │ │ ├── ic_interface_setting.xml
│ │ │ ├── ic_last_read.xml
│ │ │ ├── ic_launch.xml
│ │ │ ├── ic_list.xml
│ │ │ ├── ic_mail.xml
│ │ │ ├── ic_more_vert.xml
│ │ │ ├── ic_network_check.xml
│ │ │ ├── ic_pause_24dp.xml
│ │ │ ├── ic_pause_outline_24dp.xml
│ │ │ ├── ic_play_24dp.xml
│ │ │ ├── ic_play_outline_24dp.xml
│ │ │ ├── ic_qq_group.xml
│ │ │ ├── ic_read.xml
│ │ │ ├── ic_read_aloud.xml
│ │ │ ├── ic_refresh_black_24dp.xml
│ │ │ ├── ic_refresh_white_24dp.xml
│ │ │ ├── ic_remove.xml
│ │ │ ├── ic_restore.xml
│ │ │ ├── ic_save.xml
│ │ │ ├── ic_scan.xml
│ │ │ ├── ic_scoring.xml
│ │ │ ├── ic_search.xml
│ │ │ ├── ic_select_all.xml
│ │ │ ├── ic_settings.xml
│ │ │ ├── ic_share.xml
│ │ │ ├── ic_skip_next.xml
│ │ │ ├── ic_skip_previous.xml
│ │ │ ├── ic_stop_black_24dp.xml
│ │ │ ├── ic_swap_outline_24dp.xml
│ │ │ ├── ic_theme.xml
│ │ │ ├── ic_time_add_24dp.xml
│ │ │ ├── ic_timer_black_24dp.xml
│ │ │ ├── ic_toc.xml
│ │ │ ├── ic_top_source.xml
│ │ │ ├── ic_translate.xml
│ │ │ ├── ic_tune.xml
│ │ │ ├── ic_update.xml
│ │ │ ├── ic_version.xml
│ │ │ ├── ic_view_quilt.xml
│ │ │ ├── ic_volume_up.xml
│ │ │ ├── ic_web_outline.xml
│ │ │ ├── ic_web_service_noti.xml
│ │ │ ├── ic_web_service_phone.xml
│ │ │ ├── image_welcome.xml
│ │ │ ├── searchview_line.xml
│ │ │ ├── selector_common_bg.xml
│ │ │ ├── selector_fillet_btn_bg.xml
│ │ │ ├── selector_tv_black.xml
│ │ │ ├── shape_card_view.xml
│ │ │ ├── shape_fillet_btn.xml
│ │ │ ├── shape_fillet_btn_press.xml
│ │ │ ├── shape_pop_checkaddshelf_bg.xml
│ │ │ ├── shape_radius_1dp.xml
│ │ │ ├── shape_space_divider.xml
│ │ │ └── shape_text_cursor.xml
│ │ ├── drawable-v21/
│ │ │ ├── bg_ib_pre.xml
│ │ │ └── bg_ib_pre_round.xml
│ │ ├── layout/
│ │ │ ├── activity_about.xml
│ │ │ ├── activity_book_choice.xml
│ │ │ ├── activity_book_cover_edit.xml
│ │ │ ├── activity_book_detail.xml
│ │ │ ├── activity_book_info_edit.xml
│ │ │ ├── activity_book_read.xml
│ │ │ ├── activity_book_source.xml
│ │ │ ├── activity_chapterlist.xml
│ │ │ ├── activity_donate.xml
│ │ │ ├── activity_import_book.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_qrcode_capture.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_source_login.xml
│ │ │ ├── activity_update.xml
│ │ │ ├── activity_web_view.xml
│ │ │ ├── activity_welcome.xml
│ │ │ ├── content_main.xml
│ │ │ ├── dialog_bookmark.xml
│ │ │ ├── dialog_change_source.xml
│ │ │ ├── dialog_download_choice.xml
│ │ │ ├── dialog_file_chooser.xml
│ │ │ ├── dialog_input.xml
│ │ │ ├── dialog_login.xml
│ │ │ ├── dialog_number_picker.xml
│ │ │ ├── dialog_page_key.xml
│ │ │ ├── dialog_replace_rule.xml
│ │ │ ├── dialog_txt_chpater_rule.xml
│ │ │ ├── fragment_book_find.xml
│ │ │ ├── fragment_book_list.xml
│ │ │ ├── fragment_bookmark_list.xml
│ │ │ ├── fragment_chapter_list.xml
│ │ │ ├── fragment_file_category.xml
│ │ │ ├── fragment_local_book.xml
│ │ │ ├── item_1line_text_and_del.xml
│ │ │ ├── item_book_source.xml
│ │ │ ├── item_bookshelf_grid.xml
│ │ │ ├── item_bookshelf_list.xml
│ │ │ ├── item_change_cover.xml
│ │ │ ├── item_change_source.xml
│ │ │ ├── item_chapter_list.xml
│ │ │ ├── item_download.xml
│ │ │ ├── item_file.xml
│ │ │ ├── item_file_filepicker.xml
│ │ │ ├── item_find1_group.xml
│ │ │ ├── item_find1_kind.xml
│ │ │ ├── item_find2_childer_view.xml
│ │ │ ├── item_find2_header_view.xml
│ │ │ ├── item_find_left.xml
│ │ │ ├── item_font.xml
│ │ │ ├── item_icon_preference.xml
│ │ │ ├── item_path_filepicker.xml
│ │ │ ├── item_read_bg.xml
│ │ │ ├── item_replace_rule.xml
│ │ │ ├── item_search_book.xml
│ │ │ ├── item_search_history.xml
│ │ │ ├── item_source_debug.xml
│ │ │ ├── item_source_edit.xml
│ │ │ ├── item_text.xml
│ │ │ ├── mo_dialog_image_text.xml
│ │ │ ├── mo_dialog_infor.xml
│ │ │ ├── mo_dialog_loading.xml
│ │ │ ├── mo_dialog_markdown.xml
│ │ │ ├── mo_dialog_text_large.xml
│ │ │ ├── mo_dialog_two.xml
│ │ │ ├── navigation_header.xml
│ │ │ ├── pop_media_player.xml
│ │ │ ├── pop_more_setting.xml
│ │ │ ├── pop_read_adjust.xml
│ │ │ ├── pop_read_adjust_margin.xml
│ │ │ ├── pop_read_interface.xml
│ │ │ ├── pop_read_long_press.xml
│ │ │ ├── pop_read_menu.xml
│ │ │ ├── popup_keyboard_tool.xml
│ │ │ ├── tab_view_icon_right.xml
│ │ │ ├── view_empty.xml
│ │ │ ├── view_fastscroller.xml
│ │ │ ├── view_file_picker.xml
│ │ │ ├── view_icon.xml
│ │ │ ├── view_loading.xml
│ │ │ ├── view_net_error.xml
│ │ │ ├── view_night_theme.xml
│ │ │ ├── view_number_buttom.xml
│ │ │ ├── view_recycler_font.xml
│ │ │ ├── view_refresh_error.xml
│ │ │ ├── view_refresh_load_more.xml
│ │ │ ├── view_refresh_no_data.xml
│ │ │ └── view_refresh_recycler.xml
│ │ ├── menu/
│ │ │ ├── menu_book_download.xml
│ │ │ ├── menu_book_info.xml
│ │ │ ├── menu_book_read_activity.xml
│ │ │ ├── menu_book_search_activity.xml
│ │ │ ├── menu_book_source_activity.xml
│ │ │ ├── menu_book_source_edit.xml
│ │ │ ├── menu_debug_activity.xml
│ │ │ ├── menu_main_activity.xml
│ │ │ ├── menu_main_drawer.xml
│ │ │ ├── menu_qr_code_scan.xml
│ │ │ ├── menu_read_style_activity.xml
│ │ │ ├── menu_replace_rule_activity.xml
│ │ │ ├── menu_search_view.xml
│ │ │ ├── menu_source_login.xml
│ │ │ ├── menu_txt_chapter_rule_activity.xml
│ │ │ └── menu_update_activity.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── book_launcher.xml
│ │ │ ├── book_launcher_round.xml
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── attrs.xml
│ │ │ ├── book_launcher_background.xml
│ │ │ ├── colors.xml
│ │ │ ├── colors_material_design.xml
│ │ │ ├── dimens.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ids.xml
│ │ │ ├── pref_key_value.xml
│ │ │ ├── strings.xml
│ │ │ ├── strings_me.xml
│ │ │ └── styles.xml
│ │ ├── values-en/
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ ├── values-v27/
│ │ │ └── styles.xml
│ │ ├── values-v28/
│ │ │ └── styles.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ ├── values-zh-rTW/
│ │ │ └── strings.xml
│ │ └── xml/
│ │ ├── file_paths.xml
│ │ ├── network_security_config.xml
│ │ ├── pref_settings.xml
│ │ ├── pref_settings_theme.xml
│ │ ├── pref_settings_web_dav.xml
│ │ └── shortcuts.xml
│ └── test/
│ └── java/
│ └── com/
│ └── kunfei/
│ └── bookshelf/
│ └── ExampleUnitTest.java
├── basemvplib/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── kunfei/
│ │ │ └── basemvplib/
│ │ │ ├── AppActivityManager.java
│ │ │ ├── BaseActivity.java
│ │ │ ├── BaseFragment.java
│ │ │ ├── BasePresenterImpl.java
│ │ │ ├── BitIntentDataManager.java
│ │ │ └── impl/
│ │ │ ├── IPresenter.java
│ │ │ └── IView.java
│ │ └── res/
│ │ └── values/
│ │ ├── colors.xml
│ │ └── strings.xml
│ └── test/
│ └── java/
│ └── com/
│ └── kunfei/
│ └── basemvplib/
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── mail
├── settings.gradle
└── tool/
└── 书源整理工具/
├── BookSourceMgr.dpr
├── BookSourceMgr.dproj
├── BookSourceMgr.res
├── ReadMe.txt
├── uBookSourceBean.pas
├── uFrmEditSource.dfm
├── uFrmEditSource.pas
├── uFrmMain.dfm
├── uFrmMain.pas
├── uFrmReplaceGroup.dfm
├── uFrmReplaceGroup.pas
├── uFrmWait.dfm
└── uFrmWait.pas
Showing preview only (397K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4757 symbols across 331 files)
FILE: app/src/main/assets/web/index.js
function $ (line 2) | function $(selector) { return document.querySelector(selector); }
function $$ (line 3) | function $$(selector) { return document.querySelectorAll(selector); }
function hashParam (line 5) | function hashParam(key, val) {
function showTab (line 31) | function showTab(tabName) {
function newRule (line 39) | function newRule(rule) {
function HttpGet (line 62) | function HttpGet(url) {
function HttpPost (line 67) | function HttpPost(url, data) {
function rule2json (line 78) | function rule2json() {
function json2rule (line 92) | function json2rule(RuleEditor) {
function todo (line 105) | function todo() {
function undo (line 112) | function undo() {
function redo (line 121) | function redo() {
function setRule (line 130) | function setRule(editRule) {
function DebugPrint (line 230) | function DebugPrint(msg) { DebugInfos.value += `\n${msg}`; DebugInfos.sc...
FILE: app/src/main/java/com/kunfei/bookshelf/DbHelper.java
class DbHelper (line 24) | public class DbHelper {
method DbHelper (line 29) | private DbHelper() {
method getInstance (line 38) | public static DbHelper getInstance() {
method getDaoSession (line 49) | public static DaoSession getDaoSession() {
method getDb (line 53) | public static SQLiteDatabase getDb() {
class DaoOpenHelper (line 57) | public static class DaoOpenHelper extends DaoMaster.OpenHelper {
method DaoOpenHelper (line 58) | DaoOpenHelper(Context context, String name, SQLiteDatabase.CursorFac...
method onUpgrade (line 62) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/MApplication.java
class MApplication (line 34) | public class MApplication extends Application {
method getInstance (line 47) | public static MApplication getInstance() {
method getVersionCode (line 51) | public static int getVersionCode() {
method getVersionName (line 55) | public static String getVersionName() {
method getAppResources (line 59) | public static Resources getAppResources() {
method onCreate (line 63) | @Override
method attachBaseContext (line 103) | @Override
method initNightTheme (line 109) | public void initNightTheme() {
method upThemeStore (line 120) | public void upThemeStore() {
method isNightTheme (line 136) | public boolean isNightTheme() {
method setDownloadPath (line 143) | public void setDownloadPath(String path) {
method getConfigPreferences (line 155) | public static SharedPreferences getConfigPreferences() {
method getDonateHb (line 159) | public boolean getDonateHb() {
method upDonateHb (line 163) | public void upDonateHb() {
method upEInkMode (line 170) | public void upEInkMode() {
method createChannelId (line 177) | @RequiresApi(Build.VERSION_CODES.O)
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseModelImpl.java
class BaseModelImpl (line 36) | public class BaseModelImpl {
method getInstance (line 39) | public static BaseModelImpl getInstance() {
method getResponseO (line 43) | public Observable<Response<String>> getResponseO(AnalyzeUrl analyzeUrl) {
method getRetrofitString (line 73) | public Retrofit getRetrofitString(String url) {
method getRetrofitString (line 83) | public Retrofit getRetrofitString(String url, String encode) {
method getClient (line 93) | synchronized public static OkHttpClient getClient() {
method getHeaderInterceptor (line 116) | private static Interceptor getHeaderInterceptor() {
method setCookie (line 128) | protected Observable<Response<String>> setCookie(Response<String> resp...
method getAjaxString (line 150) | @SuppressLint({"AddJavascriptInterface", "SetJavaScriptEnabled"})
class Web (line 211) | private static class Web {
method Web (line 215) | Web(String content) {
FILE: app/src/main/java/com/kunfei/bookshelf/base/BaseTabActivity.java
class BaseTabActivity (line 20) | public abstract class BaseTabActivity<T extends IPresenter> extends MBas...
method createTabFragments (line 31) | protected abstract List<Fragment> createTabFragments();
method createTabTitles (line 33) | protected abstract List<String> createTabTitles();
method bindView (line 35) | @Override
method setUpTabLayout (line 46) | private void setUpTabLayout() {
method checkParamsIsRight (line 61) | private void checkParamsIsRight() {
class TabFragmentPageAdapter (line 71) | public class TabFragmentPageAdapter extends FragmentPagerAdapter {
method TabFragmentPageAdapter (line 73) | TabFragmentPageAdapter(FragmentManager fm) {
method getItem (line 77) | @NonNull
method getCount (line 83) | @Override
method getPageTitle (line 88) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/base/MBaseActivity.java
class MBaseActivity (line 35) | public abstract class MBaseActivity<T extends IPresenter> extends BaseAc...
method onCreate (line 40) | @Override
method onConfigurationChanged (line 50) | @SuppressWarnings("NullableProblems")
method onDestroy (line 57) | @Override
method onResume (line 62) | @Override
method onPause (line 67) | @Override
method setSupportActionBar (line 72) | @Override
method onCreateOptionsMenu (line 83) | @Override
method onMenuOpened (line 96) | @SuppressLint("PrivateApi")
method initImmersionBar (line 129) | protected void initImmersionBar() {
method isImmersionBarEnabled (line 158) | protected boolean isImmersionBarEnabled() {
method setOrientation (line 165) | @SuppressLint("SourceLockedOrientationActivity")
method isNightTheme (line 186) | public boolean isNightTheme() {
method setNightTheme (line 190) | protected void setNightTheme(boolean isNightTheme) {
method initTheme (line 199) | protected void initTheme() {
method showSnackBar (line 207) | public void showSnackBar(View view, String msg) {
method showSnackBar (line 211) | public void showSnackBar(View view, String msg, int length) {
method hideSnackBar (line 221) | public void hideSnackBar() {
method startActivity (line 227) | @Override
method startActivityForResult (line 235) | @SuppressWarnings("deprecation")
method finish (line 244) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/base/MBaseFragment.java
class MBaseFragment (line 14) | public abstract class MBaseFragment<T extends IPresenter> extends BaseFr...
method onCreate (line 18) | @Override
method onDestroy (line 25) | @Override
method initInjector (line 34) | protected abstract T initInjector();
method attachView (line 39) | private void attachView() {
method detachView (line 48) | private void detachView() {
method toast (line 54) | public void toast(String msg) {
method toast (line 58) | public void toast(int id) {
FILE: app/src/main/java/com/kunfei/bookshelf/base/observer/MyObserver.java
class MyObserver (line 7) | public abstract class MyObserver<T> implements Observer<T> {
method onSubscribe (line 9) | @Override
method onError (line 14) | @Override
method onComplete (line 19) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/base/observer/MySingleObserver.java
class MySingleObserver (line 6) | public abstract class MySingleObserver<T> implements SingleObserver<T> {
method onSubscribe (line 8) | @Override
method onError (line 13) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BaseBookBean.java
type BaseBookBean (line 5) | public interface BaseBookBean {
method getTag (line 7) | String getTag();
method getNoteUrl (line 9) | String getNoteUrl();
method setNoteUrl (line 11) | void setNoteUrl(String noteUrl);
method getVariable (line 13) | String getVariable();
method setVariable (line 15) | void setVariable(String variable);
method putVariable (line 17) | void putVariable(String key, String value);
method getVariableMap (line 19) | Map<String, String> getVariableMap();
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BaseChapterBean.java
type BaseChapterBean (line 3) | public interface BaseChapterBean {
method getTag (line 5) | String getTag();
method getDurChapterUrl (line 7) | String getDurChapterUrl();
method getDurChapterIndex (line 9) | int getDurChapterIndex();
method getNoteUrl (line 11) | String getNoteUrl();
method getDurChapterName (line 13) | String getDurChapterName();
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookChapterBean.java
class BookChapterBean (line 19) | @Entity
method BookChapterBean (line 35) | public BookChapterBean() {
method BookChapterBean (line 38) | @Generated(hash = 922679906)
method BookChapterBean (line 52) | public BookChapterBean(String tag, String durChapterName, String durCh...
method BookChapterBean (line 58) | public BookChapterBean(String tag, String durChapterName, String durCh...
method clone (line 66) | @Override
method equals (line 77) | @Override
method hashCode (line 87) | @Override
method getTag (line 95) | @Override
method setTag (line 100) | public void setTag(String tag) {
method getDurChapterName (line 104) | @Override
method setDurChapterName (line 109) | public void setDurChapterName(String durChapterName) {
method getDurChapterUrl (line 113) | @Override
method setDurChapterUrl (line 118) | public void setDurChapterUrl(String durChapterUrl) {
method getDurChapterIndex (line 122) | @Override
method setDurChapterIndex (line 127) | public void setDurChapterIndex(int durChapterIndex) {
method getNoteUrl (line 131) | @Override
method setNoteUrl (line 136) | public void setNoteUrl(String noteUrl) {
method getStart (line 140) | public Long getStart() {
method setStart (line 144) | public void setStart(Long start) {
method getEnd (line 148) | public Long getEnd() {
method setEnd (line 152) | public void setEnd(Long end) {
method getHasCache (line 156) | public Boolean getHasCache(BookInfoBean bookInfoBean) {
method getIsVip (line 160) | public boolean getIsVip() {
method setIsVip (line 164) | public void setIsVip(boolean isVip) {
method getIsPay (line 168) | public boolean getIsPay() {
method setIsPay (line 172) | public void setIsPay(boolean isPay) {
method getDisplayTitle (line 176) | public String getDisplayTitle(Context context) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookContentBean.java
class BookContentBean (line 11) | @Entity
method BookContentBean (line 25) | public BookContentBean() {
method BookContentBean (line 29) | @Generated(hash = 695554675)
method getDurChapterUrl (line 41) | public String getDurChapterUrl() {
method setDurChapterUrl (line 45) | public void setDurChapterUrl(String durChapterUrl) {
method getDurChapterIndex (line 49) | public int getDurChapterIndex() {
method setDurChapterIndex (line 53) | public void setDurChapterIndex(int durChapterIndex) {
method getDurChapterContent (line 57) | public String getDurChapterContent() {
method setDurChapterContent (line 61) | public void setDurChapterContent(String durChapterContent) {
method getTag (line 65) | public String getTag() {
method setTag (line 69) | public void setTag(String tag) {
method getNoteUrl (line 73) | public String getNoteUrl() {
method setNoteUrl (line 77) | public void setNoteUrl(String noteUrl) {
method setDurChapterIndex (line 81) | public void setDurChapterIndex(Integer durChapterIndex) {
method getTimeMillis (line 85) | public Long getTimeMillis() {
method setTimeMillis (line 89) | public void setTimeMillis(Long timeMillis) {
method outTime (line 93) | public boolean outTime() {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookInfoBean.java
class BookInfoBean (line 31) | @Entity
method BookInfoBean (line 51) | public BookInfoBean() {
method BookInfoBean (line 54) | @Generated(hash = 906814482)
method clone (line 70) | @Override
method getName (line 81) | public String getName() {
method setName (line 85) | public void setName(String name) {
method getTag (line 89) | public String getTag() {
method setTag (line 93) | public void setTag(String tag) {
method getNoteUrl (line 97) | public String getNoteUrl() {
method setNoteUrl (line 101) | public void setNoteUrl(String noteUrl) {
method getChapterUrl (line 105) | public String getChapterUrl() {
method setChapterUrl (line 109) | public void setChapterUrl(String chapterUrl) {
method getFinalRefreshData (line 113) | public long getFinalRefreshData() {
method setFinalRefreshData (line 117) | public void setFinalRefreshData(long finalRefreshData) {
method getCoverUrl (line 121) | public String getCoverUrl() {
method setCoverUrl (line 129) | public void setCoverUrl(String coverUrl) {
method getAuthor (line 133) | public String getAuthor() {
method setAuthor (line 137) | public void setAuthor(String author) {
method getIntroduce (line 141) | public String getIntroduce() {
method setIntroduce (line 145) | public void setIntroduce(String introduce) {
method getOrigin (line 149) | public String getOrigin() {
method setOrigin (line 153) | public void setOrigin(String origin) {
method getCharset (line 157) | public String getCharset() {
method setCharset (line 161) | public void setCharset(String charset) {
method extractEpubCoverImage (line 165) | private void extractEpubCoverImage() {
method isEpub (line 185) | private boolean isEpub() {
method getBookSourceType (line 189) | public String getBookSourceType() {
method setBookSourceType (line 193) | public void setBookSourceType(String bookSourceType) {
method isAudio (line 197) | public boolean isAudio() {
method getBookInfoHtml (line 201) | public String getBookInfoHtml() {
method setBookInfoHtml (line 205) | public void setBookInfoHtml(String bookInfoHtml) {
method getChapterListHtml (line 209) | public String getChapterListHtml() {
method setChapterListHtml (line 213) | public void setChapterListHtml(String chapterListHtml) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookKindBean.java
class BookKindBean (line 9) | public class BookKindBean {
method BookKindBean (line 14) | public BookKindBean(String kindS) {
method getWordsS (line 42) | public String getWordsS() {
method getState (line 46) | public String getState() {
method getKind (line 50) | public String getKind() {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookShelfBean.java
class BookShelfBean (line 25) | @Entity
method BookShelfBean (line 60) | public BookShelfBean() {
method BookShelfBean (line 64) | @Generated(hash = 451550884)
method clone (line 89) | @Override
method getVariable (line 100) | @Override
method setVariable (line 105) | @Override
method putVariable (line 110) | @Override
method getVariableMap (line 119) | @Override
method getNoteUrl (line 127) | @Override
method setNoteUrl (line 132) | @Override
method getDurChapter (line 137) | public int getDurChapter() {
method getDurChapter (line 141) | public int getDurChapter(int chapterListSize) {
method getDurChapterPage (line 150) | public int getDurChapterPage() {
method getFinalDate (line 154) | public long getFinalDate() {
method getTag (line 158) | @Override
method setTag (line 163) | public void setTag(String tag) {
method getBookInfoBean (line 167) | public BookInfoBean getBookInfoBean() {
method setBookInfoBean (line 176) | public void setBookInfoBean(BookInfoBean bookInfoBean) {
method getHasUpdate (line 180) | public boolean getHasUpdate() {
method getNewChapters (line 184) | public int getNewChapters() {
method getErrorMsg (line 188) | public String getErrorMsg() {
method setErrorMsg (line 192) | public void setErrorMsg(String errorMsg) {
method getSerialNumber (line 196) | public int getSerialNumber() {
method getFinalRefreshData (line 200) | public long getFinalRefreshData() {
method isLoading (line 204) | public boolean isLoading() {
method setLoading (line 208) | public void setLoading(boolean loading) {
method getGroup (line 212) | public int getGroup() {
method setDurChapter (line 216) | public void setDurChapter(Integer durChapter) {
method setDurChapterPage (line 220) | public void setDurChapterPage(Integer durChapterPage) {
method setFinalDate (line 224) | public void setFinalDate(Long finalDate) {
method setHasUpdate (line 228) | public void setHasUpdate(Boolean hasUpdate) {
method setNewChapters (line 232) | public void setNewChapters(Integer newChapters) {
method setSerialNumber (line 236) | public void setSerialNumber(Integer serialNumber) {
method setFinalRefreshData (line 240) | public void setFinalRefreshData(Long finalRefreshData) {
method setGroup (line 244) | public void setGroup(Integer group) {
method getDurChapterName (line 248) | public String getDurChapterName() {
method setDurChapterName (line 252) | public void setDurChapterName(String durChapterName) {
method getLastChapterName (line 256) | public String getLastChapterName() {
method setLastChapterName (line 260) | public void setLastChapterName(String lastChapterName) {
method getUnreadChapterNum (line 264) | public int getUnreadChapterNum() {
method getChapterListSize (line 269) | public int getChapterListSize() {
method setChapterListSize (line 273) | public void setChapterListSize(Integer chapterListSize) {
method getCustomCoverPath (line 277) | public String getCustomCoverPath() {
method getCoverPath (line 281) | public String getCoverPath() {
method setCustomCoverPath (line 289) | public void setCustomCoverPath(String customCoverPath) {
method getAllowUpdate (line 293) | public Boolean getAllowUpdate() {
method setAllowUpdate (line 297) | public void setAllowUpdate(Boolean allowUpdate) {
method getUseReplaceRule (line 301) | public Boolean getUseReplaceRule() {
method setUseReplaceRule (line 305) | public void setUseReplaceRule(Boolean useReplaceRule) {
method isAudio (line 309) | public boolean isAudio() {
method getReplaceEnable (line 313) | public Boolean getReplaceEnable() {
method getName (line 317) | public String getName() {
method getAuthor (line 321) | public String getAuthor() {
method setReplaceEnable (line 325) | public void setReplaceEnable(Boolean replaceEnable) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookSource3Bean.java
class BookSource3Bean (line 12) | public class BookSource3Bean {
class ContentRule (line 41) | class ContentRule {
class TocRule (line 51) | class TocRule {
class BookInfoRule (line 61) | class BookInfoRule {
class SearchRule (line 74) | class SearchRule {
class ExploreRule (line 87) | class ExploreRule {
method addGroupTag (line 112) | public BookSource3Bean addGroupTag(String tag) {
class httpRequest (line 132) | class httpRequest {
method searchUrl2RuleSearchUrl (line 139) | private String searchUrl2RuleSearchUrl(String searchUrl) {
method toBookSourceBean (line 197) | public BookSourceBean toBookSourceBean() {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookSourceBean.java
class BookSourceBean (line 38) | @SuppressWarnings("unused")
method BookSourceBean (line 103) | @Generated(hash = 1152082575)
method BookSourceBean (line 164) | public BookSourceBean(BookSourceBean sourceBean) {
method BookSourceBean (line 211) | public BookSourceBean() {
method equals (line 214) | @Override
method stringEquals (line 251) | private Boolean stringEquals(String str1, String str2) {
method clone (line 255) | @Override
method getBookSourceName (line 266) | public String getBookSourceName() {
method setBookSourceName (line 270) | public void setBookSourceName(String bookSourceName) {
method getBookSourceUrl (line 274) | public String getBookSourceUrl() {
method setBookSourceUrl (line 278) | public void setBookSourceUrl(String bookSourceUrl) {
method getSerialNumber (line 282) | public int getSerialNumber() {
method setSerialNumber (line 286) | public void setSerialNumber(int serialNumber) {
method getWeight (line 290) | public int getWeight() {
method setWeight (line 294) | public void setWeight(int weight) {
method increaseWeightBySelection (line 299) | public void increaseWeightBySelection() {
method increaseWeight (line 303) | public void increaseWeight(int increase) {
method getEnable (line 307) | public boolean getEnable() {
method setEnable (line 311) | public void setEnable(boolean enable) {
method getRuleBookName (line 315) | public String getRuleBookName() {
method setRuleBookName (line 319) | public void setRuleBookName(String ruleBookName) {
method getRuleBookAuthor (line 323) | public String getRuleBookAuthor() {
method setRuleBookAuthor (line 327) | public void setRuleBookAuthor(String ruleBookAuthor) {
method getRuleChapterUrl (line 331) | public String getRuleChapterUrl() {
method setRuleChapterUrl (line 335) | public void setRuleChapterUrl(String ruleChapterUrl) {
method getRuleCoverUrl (line 339) | public String getRuleCoverUrl() {
method setRuleCoverUrl (line 343) | public void setRuleCoverUrl(String ruleCoverUrl) {
method getRuleIntroduce (line 347) | public String getRuleIntroduce() {
method setRuleIntroduce (line 351) | public void setRuleIntroduce(String ruleIntroduce) {
method getRuleBookContent (line 355) | public String getRuleBookContent() {
method setRuleBookContent (line 359) | public void setRuleBookContent(String ruleBookContent) {
method getRuleSearchUrl (line 363) | public String getRuleSearchUrl() {
method setRuleSearchUrl (line 367) | public void setRuleSearchUrl(String ruleSearchUrl) {
method getRuleContentUrl (line 371) | public String getRuleContentUrl() {
method setRuleContentUrl (line 375) | public void setRuleContentUrl(String ruleContentUrl) {
method getRuleSearchName (line 379) | public String getRuleSearchName() {
method setRuleSearchName (line 383) | public void setRuleSearchName(String ruleSearchName) {
method getRuleSearchAuthor (line 387) | public String getRuleSearchAuthor() {
method setRuleSearchAuthor (line 391) | public void setRuleSearchAuthor(String ruleSearchAuthor) {
method getRuleSearchKind (line 395) | public String getRuleSearchKind() {
method setRuleSearchKind (line 399) | public void setRuleSearchKind(String ruleSearchKind) {
method getRuleSearchLastChapter (line 403) | public String getRuleSearchLastChapter() {
method setRuleSearchLastChapter (line 407) | public void setRuleSearchLastChapter(String ruleSearchLastChapter) {
method getRuleSearchCoverUrl (line 411) | public String getRuleSearchCoverUrl() {
method setRuleSearchCoverUrl (line 415) | public void setRuleSearchCoverUrl(String ruleSearchCoverUrl) {
method getRuleSearchNoteUrl (line 419) | public String getRuleSearchNoteUrl() {
method setRuleSearchNoteUrl (line 423) | public void setRuleSearchNoteUrl(String ruleSearchNoteUrl) {
method getRuleSearchList (line 427) | public String getRuleSearchList() {
method setRuleSearchList (line 431) | public void setRuleSearchList(String ruleSearchList) {
method getRuleChapterList (line 435) | public String getRuleChapterList() {
method setRuleChapterList (line 439) | public void setRuleChapterList(String ruleChapterList) {
method getRuleChapterName (line 443) | public String getRuleChapterName() {
method setRuleChapterName (line 447) | public void setRuleChapterName(String ruleChapterName) {
method getHttpUserAgent (line 451) | public String getHttpUserAgent() {
method setHttpUserAgent (line 455) | public void setHttpUserAgent(String httpHeaders) {
method getRuleFindUrl (line 459) | public String getRuleFindUrl() {
method setRuleFindUrl (line 463) | public void setRuleFindUrl(String ruleFindUrl) {
method getBookSourceGroup (line 467) | public String getBookSourceGroup() {
method setBookSourceGroup (line 471) | public void setBookSourceGroup(String bookSourceGroup) {
method getRuleChapterUrlNext (line 477) | public String getRuleChapterUrlNext() {
method setRuleChapterUrlNext (line 481) | public void setRuleChapterUrlNext(String ruleChapterUrlNext) {
method getRuleContentUrlNext (line 485) | public String getRuleContentUrlNext() {
method setRuleContentUrlNext (line 489) | public void setRuleContentUrlNext(String ruleContentUrlNext) {
method getRuleBookUrlPattern (line 493) | public String getRuleBookUrlPattern() {
method setRuleBookUrlPattern (line 497) | public void setRuleBookUrlPattern(String ruleBookUrlPattern) {
method getRuleBookKind (line 501) | public String getRuleBookKind() {
method setRuleBookKind (line 505) | public void setRuleBookKind(String ruleBookKind) {
method getRuleBookLastChapter (line 509) | public String getRuleBookLastChapter() {
method setRuleBookLastChapter (line 513) | public void setRuleBookLastChapter(String ruleBookLastChapter) {
method upGroupList (line 517) | private void upGroupList() {
method addGroup (line 531) | public void addGroup(String group) {
method removeGroup (line 541) | public void removeGroup(String group) {
method containsGroup (line 551) | public boolean containsGroup(String group) {
method getLastUpdateTime (line 558) | public Long getLastUpdateTime() {
method setLastUpdateTime (line 562) | public void setLastUpdateTime(Long lastUpdateTime) {
method updateModTime (line 566) | public void updateModTime() {
method getLoginUrl (line 570) | public String getLoginUrl() {
method setLoginUrl (line 574) | public void setLoginUrl(String loginUrl) {
method getBookSourceType (line 578) | public String getBookSourceType() {
method setBookSourceType (line 582) | public void setBookSourceType(String bookSourceType) {
method getRuleSearchIntroduce (line 586) | public String getRuleSearchIntroduce() {
method setRuleSearchIntroduce (line 590) | public void setRuleSearchIntroduce(String ruleSearchIntroduce) {
method getRuleFindList (line 594) | public String getRuleFindList() {
method setRuleFindList (line 598) | public void setRuleFindList(String ruleFindList) {
method getRuleFindName (line 602) | public String getRuleFindName() {
method setRuleFindName (line 606) | public void setRuleFindName(String ruleFindName) {
method getRuleFindAuthor (line 610) | public String getRuleFindAuthor() {
method setRuleFindAuthor (line 614) | public void setRuleFindAuthor(String ruleFindAuthor) {
method getRuleFindKind (line 618) | public String getRuleFindKind() {
method setRuleFindKind (line 622) | public void setRuleFindKind(String ruleFindKind) {
method getRuleFindIntroduce (line 626) | public String getRuleFindIntroduce() {
method setRuleFindIntroduce (line 630) | public void setRuleFindIntroduce(String ruleFindIntroduce) {
method getRuleFindLastChapter (line 634) | public String getRuleFindLastChapter() {
method setRuleFindLastChapter (line 638) | public void setRuleFindLastChapter(String ruleFindLastChapter) {
method getRuleFindCoverUrl (line 642) | public String getRuleFindCoverUrl() {
method setRuleFindCoverUrl (line 646) | public void setRuleFindCoverUrl(String ruleFindCoverUrl) {
method getRuleFindNoteUrl (line 650) | public String getRuleFindNoteUrl() {
method setRuleFindNoteUrl (line 654) | public void setRuleFindNoteUrl(String ruleFindNoteUrl) {
method getRuleBookInfoInit (line 658) | public String getRuleBookInfoInit() {
method setRuleBookInfoInit (line 662) | public void setRuleBookInfoInit(String ruleBookInfoInit) {
method getRuleBookContentReplace (line 666) | public String getRuleBookContentReplace() {
method setRuleBookContentReplace (line 670) | public void setRuleBookContentReplace(String ruleBookContentReplace) {
method getJson (line 674) | public String getJson(int maxLength) {
method getMinJson (line 707) | public String getMinJson(Boolean removeFind) {
method getLoginUi (line 738) | public String getLoginUi() {
method setLoginUi (line 742) | public void setLoginUi(String loginUi) {
method getLoginCheckJs (line 746) | public String getLoginCheckJs() {
method setLoginCheckJs (line 750) | public void setLoginCheckJs(String loginCheckJs) {
method evalJS (line 758) | public Object evalJS(String jsStr) throws Exception {
method getHeaderMap (line 771) | public Map<String, String> getHeaderMap(Boolean hasLoginHeader) {
method getLoginHeaderMap (line 797) | public Map<String, String> getLoginHeaderMap() {
method getLoginHeader (line 809) | public String getLoginHeader() {
method putLoginHeader (line 817) | public void putLoginHeader(String value) {
method getLoginInfo (line 822) | public String getLoginInfo() {
method getLoginInfoMap (line 833) | public Map<String, String> getLoginInfoMap() {
method putLoginInfo (line 841) | public void putLoginInfo(Map<String, String> info) {
method getFindList (line 847) | public Pair<FindKindGroupBean, List<FindKindBean>> getFindList() {
method getPayAction (line 899) | public String getPayAction() {
method setPayAction (line 903) | public void setPayAction(String payAction) {
method getRuleChapterVip (line 907) | public String getRuleChapterVip() {
method setRuleChapterVip (line 911) | public void setRuleChapterVip(String ruleChapterVip) {
method getRuleChapterPay (line 915) | public String getRuleChapterPay() {
method setRuleChapterPay (line 919) | public void setRuleChapterPay(String ruleChapterPay) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/BookmarkBean.java
class BookmarkBean (line 7) | @Entity
method BookmarkBean (line 20) | @Generated(hash = 1176037419)
method BookmarkBean (line 32) | @Generated(hash = 1612540172)
method clone (line 36) | @Override
method getNoteUrl (line 50) | public String getNoteUrl() {
method setNoteUrl (line 54) | public void setNoteUrl(String noteUrl) {
method getChapterName (line 58) | public String getChapterName() {
method setChapterName (line 62) | public void setChapterName(String chapterName) {
method getChapterIndex (line 66) | public Integer getChapterIndex() {
method setChapterIndex (line 70) | public void setChapterIndex(Integer chapterIndex) {
method getContent (line 74) | public String getContent() {
method setContent (line 78) | public void setContent(String content) {
method getBookName (line 82) | public String getBookName() {
method setBookName (line 86) | public void setBookName(String bookName) {
method getId (line 90) | public Long getId() {
method setId (line 94) | public void setId(Long id) {
method getPageIndex (line 98) | public Integer getPageIndex() {
method setPageIndex (line 102) | public void setPageIndex(Integer pageIndex) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/CookieBean.java
class CookieBean (line 10) | @Entity
method CookieBean (line 17) | private CookieBean(Parcel in) {
method CookieBean (line 22) | @Generated(hash = 517179762)
method CookieBean (line 28) | @Generated(hash = 769081142)
method writeToParcel (line 32) | @Override
method describeContents (line 38) | @Override
method getUrl (line 43) | public String getUrl() {
method setUrl (line 47) | public void setUrl(String url) {
method getCookie (line 51) | public String getCookie() {
method setCookie (line 55) | public void setCookie(String cookie) {
method createFromParcel (line 60) | @Override
method newArray (line 65) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/bean/DownloadBookBean.java
class DownloadBookBean (line 9) | public class DownloadBookBean implements Parcelable, Comparable<Download...
method DownloadBookBean (line 20) | public DownloadBookBean() {
method DownloadBookBean (line 23) | protected DownloadBookBean(Parcel in) {
method writeToParcel (line 35) | @Override
method describeContents (line 48) | @Override
method createFromParcel (line 54) | @Override
method newArray (line 59) | @Override
method getName (line 65) | public String getName() {
method setName (line 69) | public void setName(String name) {
method getNoteUrl (line 73) | public String getNoteUrl() {
method setNoteUrl (line 77) | public void setNoteUrl(String noteUrl) {
method getCoverUrl (line 81) | public String getCoverUrl() {
method setCoverUrl (line 85) | public void setCoverUrl(String coverUrl) {
method getDownloadCount (line 89) | public int getDownloadCount() {
method setDownloadCount (line 93) | public void setDownloadCount(int downloadCount) {
method getStart (line 98) | public int getStart() {
method setStart (line 102) | public void setStart(int start) {
method getEnd (line 106) | public int getEnd() {
method setEnd (line 110) | public void setEnd(int end) {
method getSuccessCount (line 114) | public int getSuccessCount() {
method getWaitingCount (line 118) | public int getWaitingCount() {
method successCountAdd (line 122) | public synchronized void successCountAdd() {
method isValid (line 128) | public boolean isValid() {
method setValid (line 132) | public void setValid(boolean valid) {
method getFinalDate (line 136) | public long getFinalDate() {
method setFinalDate (line 140) | public void setFinalDate(long finalDate) {
method equals (line 144) | @Override
method compareTo (line 152) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/bean/DownloadChapterBean.java
class DownloadChapterBean (line 4) | public class DownloadChapterBean implements BaseChapterBean {
method DownloadChapterBean (line 17) | public DownloadChapterBean() {
method getNoteUrl (line 20) | @Override
method setNoteUrl (line 25) | public void setNoteUrl(String noteUrl) {
method getDurChapterIndex (line 29) | @Override
method setDurChapterIndex (line 34) | public void setDurChapterIndex(int durChapterIndex) {
method getDurChapterUrl (line 38) | @Override
method setDurChapterUrl (line 43) | public void setDurChapterUrl(String durChapterUrl) {
method getDurChapterName (line 47) | @Override
method setDurChapterName (line 52) | public void setDurChapterName(String durChapterName) {
method getTag (line 56) | @Override
method setTag (line 61) | public void setTag(String tag) {
method getBookName (line 65) | public String getBookName() {
method setBookName (line 69) | public void setBookName(String bookName) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/FindKindBean.java
class FindKindBean (line 3) | public class FindKindBean {
method FindKindBean (line 9) | public FindKindBean() {
method getKindName (line 13) | public String getKindName() {
method setKindName (line 17) | public void setKindName(String kindName) {
method getKindUrl (line 21) | public String getKindUrl() {
method setKindUrl (line 25) | public void setKindUrl(String kindUrl) {
method getTag (line 29) | public String getTag() {
method setTag (line 33) | public void setTag(String tag) {
method getGroup (line 37) | public String getGroup() {
method setGroup (line 41) | public void setGroup(String group) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/FindKindGroupBean.java
class FindKindGroupBean (line 3) | public class FindKindGroupBean {
method getGroupName (line 7) | public String getGroupName() {
method setGroupName (line 11) | public void setGroupName(String groupName) {
method getGroupTag (line 15) | public String getGroupTag() {
method setGroupTag (line 19) | public void setGroupTag(String groupTag) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/LocBookShelfBean.java
class LocBookShelfBean (line 4) | public class LocBookShelfBean {
method LocBookShelfBean (line 8) | public LocBookShelfBean(Boolean isNew, BookShelfBean bookShelfBean) {
method getNew (line 13) | public Boolean getNew() {
method setNew (line 17) | public void setNew(Boolean aNew) {
method getBookShelfBean (line 21) | public BookShelfBean getBookShelfBean() {
method setBookShelfBean (line 25) | public void setBookShelfBean(BookShelfBean bookShelfBean) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/OpenChapterBean.java
class OpenChapterBean (line 3) | public class OpenChapterBean {
method OpenChapterBean (line 7) | public OpenChapterBean(int chapterIndex, int pageIndex) {
method getChapterIndex (line 12) | public int getChapterIndex() {
method getPageIndex (line 16) | public int getPageIndex() {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/ReplaceRuleBean.java
class ReplaceRuleBean (line 18) | @Entity
method ReplaceRuleBean (line 38) | private ReplaceRuleBean(Parcel in) {
method ReplaceRuleBean (line 49) | @Generated(hash = 1896663649)
method ReplaceRuleBean (line 62) | @Generated(hash = 582692869)
method writeToParcel (line 66) | @Override
method createFromParcel (line 80) | @Override
method newArray (line 85) | @Override
method describeContents (line 91) | @Override
method getReplaceSummary (line 96) | public String getReplaceSummary() {
method setReplaceSummary (line 100) | public void setReplaceSummary(String replaceSummary) {
method getRegex (line 104) | public String getRegex() {
method getFixedRegex (line 108) | public String getFixedRegex() {
method setRegex (line 115) | public void setRegex(String regex) {
method getReplacement (line 119) | public String getReplacement() {
method setReplacement (line 123) | public void setReplacement(String replacement) {
method getEnable (line 127) | public Boolean getEnable() {
method setEnable (line 134) | public void setEnable(Boolean enable) {
method getSerialNumber (line 138) | public int getSerialNumber() {
method setSerialNumber (line 142) | public void setSerialNumber(int serialNumber) {
method getId (line 146) | public Long getId() {
method setId (line 150) | public void setId(Long id) {
method getUseTo (line 154) | public String getUseTo() {
method setUseTo (line 158) | public void setUseTo(String useTo) {
method getIsRegex (line 162) | public Boolean getIsRegex() {
method setIsRegex (line 166) | public void setIsRegex(Boolean isRegex) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/SearchBookBean.java
class SearchBookBean (line 19) | @Entity
method SearchBookBean (line 51) | public SearchBookBean() {
method SearchBookBean (line 55) | public SearchBookBean(String tag, String origin) {
method SearchBookBean (line 60) | @Generated(hash = 337890066)
method getVariable (line 79) | @Override
method setVariable (line 84) | @Override
method putVariable (line 89) | @Override
method getVariableMap (line 98) | @Override
method getNoteUrl (line 106) | @Override
method setNoteUrl (line 111) | @Override
method getCoverUrl (line 116) | public String getCoverUrl() {
method setCoverUrl (line 120) | public void setCoverUrl(String coverUrl) {
method getName (line 124) | public String getName() {
method setName (line 128) | public void setName(String name) {
method getAuthor (line 132) | public String getAuthor() {
method setAuthor (line 136) | public void setAuthor(String author) {
method getLastChapter (line 140) | public String getLastChapter() {
method setLastChapter (line 144) | public void setLastChapter(String lastChapter) {
method getLastChapterNum (line 149) | public int getLastChapterNum() {
method getKind (line 155) | public String getKind() {
method setKind (line 159) | public void setKind(String kind) {
method getTag (line 163) | @Override
method setTag (line 168) | public void setTag(String tag) {
method getOrigin (line 172) | public String getOrigin() {
method setOrigin (line 176) | public void setOrigin(String origin) {
method getIsCurrentSource (line 180) | public Boolean getIsCurrentSource() {
method setIsCurrentSource (line 184) | public void setIsCurrentSource(Boolean isCurrentSource) {
method getOriginNum (line 190) | public int getOriginNum() {
method addOriginUrl (line 194) | public void addOriginUrl(String origin) {
method getIntroduce (line 202) | public String getIntroduce() {
method setIntroduce (line 206) | public void setIntroduce(String introduce) {
method getChapterUrl (line 210) | public String getChapterUrl() {
method setChapterUrl (line 214) | public void setChapterUrl(String chapterUrl) {
method getAddTime (line 218) | public long getAddTime() {
method setAddTime (line 222) | public void setAddTime(Long addTime) {
method getWeight (line 226) | public int getWeight() {
method getSearchTime (line 234) | public int getSearchTime() {
method setSearchTime (line 238) | public void setSearchTime(int searchTime) {
method getUpTime (line 242) | public Long getUpTime() {
method setUpTime (line 246) | public void setUpTime(Long upTime) {
method getBookInfoHtml (line 250) | public String getBookInfoHtml() {
method setBookInfoHtml (line 254) | public void setBookInfoHtml(String bookInfoHtml) {
method setSearchInfo (line 259) | public void setSearchInfo(String name, String author, String kind, Str...
FILE: app/src/main/java/com/kunfei/bookshelf/bean/SearchHistoryBean.java
class SearchHistoryBean (line 8) | @Entity
method getDate (line 16) | public long getDate() {
method setDate (line 20) | public void setDate(long date) {
method getContent (line 24) | public String getContent() {
method setContent (line 28) | public void setContent(String content) {
method getType (line 32) | public int getType() {
method setType (line 36) | public void setType(int type) {
method getId (line 40) | public Long getId() {
method setId (line 44) | public void setId(Long id) {
method SearchHistoryBean (line 48) | public SearchHistoryBean(int type, String content, long date) {
method SearchHistoryBean (line 54) | @Generated(hash = 488115752)
method SearchHistoryBean (line 62) | @Generated(hash = 1570282321)
FILE: app/src/main/java/com/kunfei/bookshelf/bean/TwoDataBean.java
class TwoDataBean (line 3) | public class TwoDataBean<T, S> {
method TwoDataBean (line 7) | public TwoDataBean(T data1, S data2) {
method getData1 (line 12) | public T getData1() {
method getData2 (line 16) | public S getData2() {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/TxtChapterRuleBean.java
class TxtChapterRuleBean (line 12) | @Entity
method TxtChapterRuleBean (line 22) | @Generated(hash = 2018686288)
method TxtChapterRuleBean (line 31) | @Generated(hash = 382733400)
method equals (line 35) | @Override
method copy (line 43) | public TxtChapterRuleBean copy() {
method getName (line 52) | public String getName() {
method setName (line 56) | public void setName(String name) {
method getRule (line 60) | public String getRule() {
method setRule (line 64) | public void setRule(String rule) {
method getSerialNumber (line 68) | public Integer getSerialNumber() {
method setSerialNumber (line 72) | public void setSerialNumber(Integer serialNumber) {
method getEnable (line 76) | public Boolean getEnable() {
method setEnable (line 80) | public void setEnable(Boolean enable) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/UpdateInfoBean.java
class UpdateInfoBean (line 6) | public class UpdateInfoBean implements Parcelable {
method UpdateInfoBean (line 12) | public UpdateInfoBean() {
method UpdateInfoBean (line 16) | protected UpdateInfoBean(Parcel in) {
method createFromParcel (line 24) | @Override
method newArray (line 29) | @Override
method describeContents (line 35) | @Override
method writeToParcel (line 40) | @Override
method getLastVersion (line 48) | public String getLastVersion() {
method setLastVersion (line 52) | public void setLastVersion(String lastVersion) {
method getUrl (line 56) | public String getUrl() {
method setUrl (line 60) | public void setUrl(String url) {
method getDetail (line 64) | public String getDetail() {
method setDetail (line 68) | public void setDetail(String detail) {
method getUpDate (line 72) | public Boolean getUpDate() {
method setUpDate (line 76) | public void setUpDate(Boolean upDate) {
FILE: app/src/main/java/com/kunfei/bookshelf/bean/WebChapterBean.java
class WebChapterBean (line 6) | public class WebChapterBean {
method WebChapterBean (line 13) | public WebChapterBean(String url) {
method WebChapterBean (line 17) | public WebChapterBean(List<BookChapterBean> data, LinkedHashSet<String...
method getData (line 22) | public List<BookChapterBean> getData() {
method setData (line 26) | public void setData(List<BookChapterBean> data) {
method getNextUrlList (line 30) | public LinkedHashSet<String> getNextUrlList() {
method getUrl (line 34) | public String getUrl() {
method noData (line 38) | public boolean noData() {
FILE: app/src/main/java/com/kunfei/bookshelf/constant/AppConstant.java
class AppConstant (line 20) | public class AppConstant {
method androidId (line 47) | static public String androidId(Context context) {
FILE: app/src/main/java/com/kunfei/bookshelf/constant/BookType.java
class BookType (line 3) | public class BookType {
FILE: app/src/main/java/com/kunfei/bookshelf/constant/RxBusTag.java
class RxBusTag (line 3) | public class RxBusTag {
FILE: app/src/main/java/com/kunfei/bookshelf/constant/TimeConstants.java
class TimeConstants (line 8) | public class TimeConstants {
FILE: app/src/main/java/com/kunfei/bookshelf/help/AppFrontBackHelper.java
class AppFrontBackHelper (line 11) | public class AppFrontBackHelper {
method getInstance (line 14) | public static AppFrontBackHelper getInstance() {
method register (line 21) | public void register(Application application, OnAppStatusListener list...
method onActivityCreated (line 30) | @Override
method onActivityStarted (line 35) | @Override
method onActivityResumed (line 47) | @Override
method onActivityPaused (line 52) | @Override
method onActivityStopped (line 57) | @Override
method onActivitySaveInstanceState (line 69) | @Override
method onActivityDestroyed (line 74) | @Override
type OnAppStatusListener (line 80) | public interface OnAppStatusListener {
method onFront (line 81) | void onFront();
method onBack (line 83) | void onBack();
FILE: app/src/main/java/com/kunfei/bookshelf/help/BlurTransformation.java
class BlurTransformation (line 19) | public class BlurTransformation extends BitmapTransformation {
method BlurTransformation (line 23) | public BlurTransformation(Context context, int radius) {
method transform (line 29) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method updateDiskCacheKey (line 59) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/help/BookshelfHelp.java
class BookshelfHelp (line 41) | public class BookshelfHelp {
method getCachePathName (line 45) | public static String getCachePathName(String bookName, String tag) {
method getCacheFileName (line 49) | @SuppressLint("DefaultLocale")
method isChapterCached (line 54) | public static boolean isChapterCached(String bookName, String tag, Bas...
method getChapterCache (line 69) | public static String getChapterCache(BookShelfBean bookShelfBean, Book...
method clearCaches (line 88) | public static void clearCaches(boolean clearChapterList) {
method delChapter (line 98) | public static void delChapter(String folderName, int index, String fil...
method saveChapterInfo (line 106) | public static synchronized boolean saveChapterInfo(String folderName, ...
method getBookFile (line 127) | public static File getBookFile(String folderName, int index, String fi...
method formatFolderName (line 132) | private static String formatFolderName(String folderName) {
method getDurChapter (line 139) | public static int getDurChapter(int oldDurChapterIndex, int oldChapter...
method getChapterNum (line 181) | private static int getChapterNum(String chapterName) {
method getPureChapterName (line 191) | private static String getPureChapterName(String chapterName) {
method getAllBook (line 202) | public static List<BookShelfBean> getAllBook() {
method getBooksByGroup (line 221) | public static List<BookShelfBean> getBooksByGroup(int group) {
method getBook (line 242) | public static BookShelfBean getBook(String bookUrl) {
method searchBookInfo (line 254) | public static List<BookInfoBean> searchBookInfo(String key) {
method removeFromBookShelf (line 264) | public static void removeFromBookShelf(BookShelfBean bookShelfBean, bo...
method isInBookShelf (line 292) | public static boolean isInBookShelf(String bookUrl) {
method removeFromBookShelf (line 306) | public static void removeFromBookShelf(BookShelfBean bookShelfBean) {
method saveBookToShelf (line 313) | public static void saveBookToShelf(BookShelfBean bookShelfBean) {
method getBookFromSearchBook (line 323) | public static BookShelfBean getBookFromSearchBook(SearchBookBean searc...
method getChapterList (line 345) | public static List<BookChapterBean> getChapterList(String noteUrl) {
method delChapterList (line 353) | public static void delChapterList(String noteUrl) {
method saveBookmark (line 359) | public static void saveBookmark(BookmarkBean bookmarkBean) {
method delBookmark (line 363) | public static void delBookmark(BookmarkBean bookmarkBean) {
method getBookmarkList (line 367) | public static List<BookmarkBean> getBookmarkList(String bookName) {
method getReadProgress (line 375) | public static String getReadProgress(BookShelfBean bookShelfBean) {
method getReadProgress (line 379) | public static String getReadProgress(int durChapterIndex, int chapterA...
method formatAuthor (line 393) | public static String formatAuthor(String author) {
method guessChapterNum (line 400) | public static int guessChapterNum(String name) {
method order (line 413) | public static void order(List<BookShelfBean> books, String bookshelfOr...
method clearBookshelf (line 433) | public static void clearBookshelf() {
FILE: app/src/main/java/com/kunfei/bookshelf/help/ChangeSourceHelp.java
class ChangeSourceHelp (line 19) | public class ChangeSourceHelp {
method ChangeSourceHelp (line 25) | public ChangeSourceHelp() {
method autoChange (line 63) | public void autoChange(BookShelfBean bookShelfBean, ChangeSourceListen...
method selectBook (line 72) | private synchronized void selectBook(List<SearchBookBean> value) {
method stopSearch (line 101) | public void stopSearch() {
method changeBookSource (line 107) | public static Observable<TwoDataBean<BookShelfBean, List<BookChapterBe...
method saveChangedBook (line 122) | private static Observable<TwoDataBean<BookShelfBean, List<BookChapterB...
type ChangeSourceListener (line 141) | public interface ChangeSourceListener {
method finish (line 142) | void finish(BookShelfBean bookShelfBean, List<BookChapterBean> chapt...
method error (line 144) | void error(Throwable throwable);
FILE: app/src/main/java/com/kunfei/bookshelf/help/ChapterContentHelp.java
class ChapterContentHelp (line 19) | public class ChapterContentHelp {
method getInstance (line 22) | public static synchronized ChapterContentHelp getInstance() {
method toTraditional (line 31) | private String toTraditional(String content) {
method replaceContent (line 49) | public String replaceContent(String bookName, String bookTag, String c...
method replaceAd (line 80) | private String replaceAd(String content, String replaceRule) {
method replaceAd2 (line 160) | private String replaceAd2(String content, String replaceRule) {
class StringBlock (line 246) | class StringBlock {
method StringBlock (line 254) | public StringBlock(String string) {
method verify (line 263) | public int verify() {
method increase (line 307) | public void increase(int size) {
method remove (line 327) | public void remove(int wallThick) {
method remove (line 342) | public void remove(String wall) {
method removeDict (line 356) | public void removeDict(String dict) {
method remove (line 400) | public boolean remove(int start, int end) {
method getResult (line 466) | public String getResult() {
method getSubString (line 477) | public String getSubString(int start) {
method LightNovelParagraph2 (line 491) | public static String LightNovelParagraph2(String content, String chapt...
method makeDict (line 585) | private static List<String> makeDict(String str) {
method reduceLength (line 635) | private static StringBuffer reduceLength(StringBuffer str) {
method splitQuote (line 677) | private static String splitQuote(String str) {
method forceSplit (line 705) | private static ArrayList<Integer> forceSplit(String str, int offset, i...
method FindNewLines (line 727) | private static String FindNewLines(String str, List<String> dict) {
method seekIndexs (line 1123) | private static ArrayList<Integer> seekIndexs(String str, String key, i...
method seekLast (line 1157) | private static int seekLast(String str, String key, int from, int to) {
method seekIndex (line 1186) | private static int seekIndex(String str, String key, int from, int to,...
method seekWordsIndex (line 1218) | private static int seekWordsIndex(String str, int form, int to, boolea...
method isFullSentences (line 1275) | private static boolean isFullSentences(String s) {
method match (line 1282) | private static boolean match(String rule, char chr) {
method isUseTo (line 1287) | private boolean isUseTo(String useTo, String bookTag, String bookName) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/CrashHandler.java
class CrashHandler (line 27) | public class CrashHandler implements Thread.UncaughtExceptionHandler {
method CrashHandler (line 55) | private CrashHandler() {
method getInstance (line 62) | public static synchronized CrashHandler getInstance() {
method init (line 69) | public void init(Context context) {
method uncaughtException (line 79) | @Override
method handleException (line 100) | private boolean handleException(Throwable ex) {
method collectDeviceInfo (line 122) | private void collectDeviceInfo(Context ctx) {
method addCustomInfo (line 151) | private void addCustomInfo() {
method saveCrashInfo2File (line 158) | private void saveCrashInfo2File(Throwable ex) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/DocumentHelper.java
class DocumentHelper (line 24) | public class DocumentHelper {
method isFileExist (line 26) | public static boolean isFileExist(String fileName, String rootPath, St...
method getDirDocument (line 30) | public static DocumentFile getDirDocument(String rootPath, String... s...
method createFileIfNotExist (line 34) | public static DocumentFile createFileIfNotExist(String fileName, Strin...
method createDirIfNotExist (line 40) | public static DocumentFile createDirIfNotExist(String path, String... ...
method deleteFile (line 46) | public static boolean deleteFile(String fileName, String rootPath, Str...
method writeString (line 52) | public static boolean writeString(String string, DocumentFile file) {
method writeString (line 56) | public static boolean writeString(String string, String fileName, Stri...
method readString (line 62) | public static String readString(String fileName, String rootPath, Stri...
method readString (line 73) | public static String readString(Uri uri) {
method readString (line 84) | public static String readString(DocumentFile file) {
method writeBytes (line 95) | public static boolean writeBytes(byte[] data, String fileName, String ...
method writeBytes (line 101) | public static boolean writeBytes(byte[] data, DocumentFile file) {
method writeFromFile (line 107) | public static boolean writeFromFile(File fromFile, DocumentFile file) {
method writeFromInputStream (line 118) | public static boolean writeFromInputStream(InputStream inStream, Docum...
method saveBitmapToFile (line 124) | public static void saveBitmapToFile(Bitmap bitmap, DocumentFile file) ...
method saveBitmapToFile (line 128) | public static void saveBitmapToFile(Bitmap bitmap, Uri fileUri) throws...
method getFileOutputSteam (line 136) | public static OutputStream getFileOutputSteam(String fileName, String ...
method getFileInputSteam (line 142) | public static InputStream getFileInputSteam(String fileName, String ro...
method filenameFilter (line 148) | public static String filenameFilter(String str) {
method getBytes (line 152) | public static byte[] getBytes(File file) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/Donate.java
class Donate (line 14) | public class Donate {
method aliDonate (line 16) | public static void aliDonate(Context context) {
method openUri (line 29) | private static void openUri(Context context, String s) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/EncodeConverter.java
class EncodeConverter (line 16) | public class EncodeConverter extends Converter.Factory {
method EncodeConverter (line 19) | private EncodeConverter() {
method EncodeConverter (line 23) | private EncodeConverter(String encode) {
method create (line 27) | public static EncodeConverter create() {
method create (line 31) | public static EncodeConverter create(String en) {
method responseBodyConverter (line 35) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/help/FileHelp.java
class FileHelp (line 24) | @SuppressWarnings("ALL")
method getFolder (line 34) | public static File getFolder(String filePath) {
method createFileIfNotExist (line 44) | public static synchronized File createFileIfNotExist(String filePath) {
method getFilesPath (line 59) | public static String getFilesPath() {
method getCachePath (line 74) | public static String getCachePath() {
method getDirSize (line 88) | public static long getDirSize(File file) {
method getFileSize (line 106) | public static String getFileSize(long size) {
method getFileContent (line 124) | public static String getFileContent(File file) {
method isSdCardExist (line 147) | public static boolean isSdCardExist() {
method deleteFile (line 155) | public static synchronized void deleteFile(String filePath) {
method getTxtFiles (line 173) | public static List<File> getTxtFiles(String filePath, int layer) {
method getSDTxtFile (line 206) | public static Single<List<File>> getSDTxtFile() {
method getFileSuffix (line 216) | public static String getFileSuffix(String filePath) {
method getFileSuffix (line 221) | public static String getFileSuffix(File file) {
method createFolderIfNotExists (line 230) | public static void createFolderIfNotExists(String path) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/ItemTouchCallback.java
class ItemTouchCallback (line 17) | public class ItemTouchCallback extends ItemTouchHelper.Callback {
method setSwipeRefreshLayout (line 22) | public void setSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayou...
method setViewPager (line 26) | public void setViewPager(ViewPager viewPager) {
method setOnItemTouchCallbackListener (line 47) | public void setOnItemTouchCallbackListener(OnItemTouchCallbackListener...
method setDragEnable (line 56) | public void setDragEnable(boolean canDrag) {
method setSwipeEnable (line 65) | public void setSwipeEnable(boolean canSwipe) {
method isLongPressDragEnabled (line 72) | @Override
method isItemViewSwipeEnabled (line 80) | @Override
method getMovementFlags (line 88) | @Override
method onMove (line 124) | @Override
method onSwiped (line 132) | @Override
method onSelectedChanged (line 139) | @Override
type OnItemTouchCallbackListener (line 151) | public interface OnItemTouchCallbackListener {
method onSwiped (line 157) | void onSwiped(int adapterPosition);
method onMove (line 166) | boolean onMove(int srcPosition, int targetPosition);
FILE: app/src/main/java/com/kunfei/bookshelf/help/JsExtensions.java
type JsExtensions (line 22) | @SuppressWarnings({"unused", "WeakerAccess"})
method ajax (line 28) | default String ajax(String urlStr) {
method getResponse (line 42) | default Response<String> getResponse(String urlStr) {
method base64Decoder (line 55) | default String base64Decoder(String base64) {
method toNumChapter (line 62) | default String toNumChapter(String s) {
method get (line 77) | default Connection.Response get(String urlStr, Map<String, String> hea...
method post (line 90) | default Connection.Response post(String urlStr, String body, Map<Strin...
method putCache (line 101) | default void putCache(String key, String value) {
method getCache (line 106) | default String getCache(String key) {
method md5Encode (line 114) | default String md5Encode(String text) {
method androidId (line 118) | default String androidId() {
FILE: app/src/main/java/com/kunfei/bookshelf/help/LauncherIcon.java
class LauncherIcon (line 14) | public class LauncherIcon {
method ChangeIcon (line 19) | public static void ChangeIcon(String icon) {
method getInUseIcon (line 42) | public static String getInUseIcon() {
FILE: app/src/main/java/com/kunfei/bookshelf/help/MediaManager.java
class MediaManager (line 15) | public class MediaManager {
method MediaManager (line 26) | private MediaManager() {
method setStream (line 30) | public void setStream(int stream) {
method getInstance (line 35) | public static synchronized MediaManager getInstance() {
method fadeInVolume (line 41) | public void fadeInVolume() {
method fadeOutVolume (line 56) | public void fadeOutVolume() {
method getSysVolume (line 71) | private void getSysVolume() {
method setSysVolume (line 75) | private void setSysVolume(float vol) {
method startAudioFade (line 79) | private void startAudioFade(float from, float to) {
method playSilentSound (line 95) | public static void playSilentSound(Context mContext) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/ProcessTextHelp.java
class ProcessTextHelp (line 8) | public class ProcessTextHelp {
method isProcessTextEnabled (line 13) | public static boolean isProcessTextEnabled() {
method setProcessTextEnable (line 17) | public static void setProcessTextEnable(boolean enable) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/ReadBookControl.java
class ReadBookControl (line 27) | public class ReadBookControl {
method getInstance (line 78) | public static ReadBookControl getInstance() {
method ReadBookControl (line 89) | private ReadBookControl() {
method updateReaderSettings (line 95) | public void updateReaderSettings() {
method initTextDrawable (line 135) | private void initTextDrawable() {
method initTextDrawableIndex (line 175) | public void initTextDrawableIndex() {
method initPageStyle (line 188) | @SuppressWarnings("ConstantConditions")
method setTextDrawable (line 215) | private void setTextDrawable() {
method getTextColor (line 220) | public int getTextColor(int textDrawableIndex) {
method setTextColor (line 228) | public void setTextColor(int textDrawableIndex, int textColor) {
method getBgDrawable (line 234) | @SuppressWarnings("ConstantConditions")
method getDefaultBgDrawable (line 271) | @SuppressWarnings("ConstantConditions")
method getBgCustom (line 280) | public int getBgCustom(int textDrawableIndex) {
method setBgCustom (line 284) | public void setBgCustom(int textDrawableIndex, int bgCustom) {
method getBgPath (line 290) | public String getBgPath(int textDrawableIndex) {
method setBgPath (line 294) | public void setBgPath(int textDrawableIndex, String bgUri) {
method getDefaultTextColor (line 300) | @SuppressWarnings("ConstantConditions")
method getDefaultBg (line 305) | @SuppressWarnings("ConstantConditions")
method getBgColor (line 310) | public int getBgColor(int index) {
method setBgColor (line 314) | public void setBgColor(int index, int bgColor) {
method getIsNightTheme (line 320) | private boolean getIsNightTheme() {
method getImmersionStatusBar (line 324) | public boolean getImmersionStatusBar() {
method setImmersionStatusBar (line 328) | public void setImmersionStatusBar(boolean immersionStatusBar) {
method getTextSize (line 334) | public int getTextSize() {
method setTextSize (line 338) | public void setTextSize(int textSize) {
method getTextColor (line 345) | public int getTextColor() {
method bgIsColor (line 349) | public boolean bgIsColor() {
method getTextBackground (line 353) | public Drawable getTextBackground(Context context) {
method getBgColor (line 360) | public int getBgColor() {
method bgBitmapIsNull (line 364) | public boolean bgBitmapIsNull() {
method getBgBitmap (line 368) | public Bitmap getBgBitmap() {
method getTextDrawableIndex (line 372) | public int getTextDrawableIndex() {
method setTextDrawableIndex (line 376) | public void setTextDrawableIndex(int textDrawableIndex) {
method setTextConvert (line 390) | public void setTextConvert(int textConvert) {
method setNavBarColor (line 397) | public void setNavBarColor(int navBarColor) {
method getNavBarColor (line 404) | public int getNavBarColor() {
method setTextBold (line 409) | public void setTextBold(boolean textBold) {
method setReadBookFont (line 416) | public void setReadBookFont(String fontPath) {
method getFontPath (line 423) | public String getFontPath() {
method getTextConvert (line 427) | public int getTextConvert() {
method getTextBold (line 431) | public Boolean getTextBold() {
method getCanKeyTurn (line 435) | public Boolean getCanKeyTurn(Boolean isPlay) {
method getCanKeyTurn (line 445) | public Boolean getCanKeyTurn() {
method setCanKeyTurn (line 449) | public void setCanKeyTurn(Boolean canKeyTurn) {
method getAloudCanKeyTurn (line 456) | public Boolean getAloudCanKeyTurn() {
method setAloudCanKeyTurn (line 460) | public void setAloudCanKeyTurn(Boolean canAloudKeyTurn) {
method getCanClickTurn (line 467) | public Boolean getCanClickTurn() {
method setCanClickTurn (line 471) | public void setCanClickTurn(Boolean canClickTurn) {
method getTextLetterSpacing (line 478) | public float getTextLetterSpacing() {
method setTextLetterSpacing (line 482) | public void setTextLetterSpacing(float textLetterSpacing) {
method getLineMultiplier (line 489) | public float getLineMultiplier() {
method setLineMultiplier (line 493) | public void setLineMultiplier(float lineMultiplier) {
method getParagraphSize (line 500) | public float getParagraphSize() {
method setParagraphSize (line 504) | public void setParagraphSize(float paragraphSize) {
method getCPM (line 511) | public int getCPM() {
method setCPM (line 515) | public void setCPM(int cpm) {
method getClickAllNext (line 523) | public Boolean getClickAllNext() {
method setClickAllNext (line 527) | public void setClickAllNext(Boolean clickAllNext) {
method getSpeechRate (line 534) | public int getSpeechRate() {
method setSpeechRate (line 538) | public void setSpeechRate(int speechRate) {
method isSpeechRateFollowSys (line 545) | public boolean isSpeechRateFollowSys() {
method setSpeechRateFollowSys (line 549) | public void setSpeechRateFollowSys(boolean speechRateFollowSys) {
method getShowTitle (line 556) | public Boolean getShowTitle() {
method setShowTitle (line 560) | public void setShowTitle(Boolean showTitle) {
method getShowTimeBattery (line 567) | public Boolean getShowTimeBattery() {
method setShowTimeBattery (line 571) | public void setShowTimeBattery(Boolean showTimeBattery) {
method getLightNovelParagraph (line 578) | public Boolean getLightNovelParagraph(){return lightNovelParagraph;}
method setLightNovelParagraph (line 580) | public void setLightNovelParagraph(Boolean lightNovelParagraph) {
method getHideStatusBar (line 587) | public Boolean getHideStatusBar() {
method setHideStatusBar (line 591) | public void setHideStatusBar(Boolean hideStatusBar) {
method getToLh (line 598) | public Boolean getToLh() {
method setToLh (line 602) | public void setToLh(Boolean toLh) {
method getHideNavigationBar (line 608) | public Boolean getHideNavigationBar() {
method setHideNavigationBar (line 612) | public void setHideNavigationBar(Boolean hideNavigationBar) {
method getShowLine (line 619) | public Boolean getShowLine() {
method setShowLine (line 623) | public void setShowLine(Boolean showLine) {
method getDarkStatusIcon (line 630) | public boolean getDarkStatusIcon() {
method getDarkStatusIcon (line 634) | @SuppressWarnings("ConstantConditions")
method setDarkStatusIcon (line 639) | public void setDarkStatusIcon(int textDrawableIndex, Boolean darkStatu...
method getScreenTimeOut (line 645) | public int getScreenTimeOut() {
method setScreenTimeOut (line 649) | public void setScreenTimeOut(int screenTimeOut) {
method getPaddingLeft (line 656) | public int getPaddingLeft() {
method setPaddingLeft (line 660) | public void setPaddingLeft(int paddingLeft) {
method getPaddingTop (line 667) | public int getPaddingTop() {
method setPaddingTop (line 671) | public void setPaddingTop(int paddingTop) {
method getPaddingRight (line 678) | public int getPaddingRight() {
method setPaddingRight (line 682) | public void setPaddingRight(int paddingRight) {
method getPaddingBottom (line 689) | public int getPaddingBottom() {
method setPaddingBottom (line 693) | public void setPaddingBottom(int paddingBottom) {
method getTipPaddingLeft (line 700) | public int getTipPaddingLeft() {
method setTipPaddingLeft (line 704) | public void setTipPaddingLeft(int tipPaddingLeft) {
method isCanSelectText (line 711) | public boolean isCanSelectText() {
method setCanSelectText (line 715) | public void setCanSelectText(boolean canSelectText) {
method getTipPaddingTop (line 722) | public int getTipPaddingTop() {
method setTipPaddingTop (line 726) | public void setTipPaddingTop(int tipPaddingTop) {
method getTipPaddingRight (line 733) | public int getTipPaddingRight() {
method setTipPaddingRight (line 737) | public void setTipPaddingRight(int tipPaddingRight) {
method getTipPaddingBottom (line 744) | public int getTipPaddingBottom() {
method setTipPaddingBottom (line 748) | public void setTipPaddingBottom(int tipPaddingBottom) {
method getPageMode (line 755) | public int getPageMode() {
method setPageMode (line 759) | public void setPageMode(int pageMode) {
method getScreenDirection (line 766) | public int getScreenDirection() {
method setScreenDirection (line 770) | public void setScreenDirection(int screenDirection) {
method setIndent (line 777) | public void setIndent(int indent) {
method getIndent (line 784) | public int getIndent() {
method getLight (line 788) | public int getLight() {
method setLight (line 792) | public void setLight(int light) {
method getLightFollowSys (line 798) | public Boolean getLightFollowSys() {
method setLightFollowSys (line 802) | public void setLightFollowSys(boolean isFollowSys) {
method getScreenBrightness (line 808) | private int getScreenBrightness() {
method disableScrollClickTurn (line 818) | public boolean disableScrollClickTurn() {
FILE: app/src/main/java/com/kunfei/bookshelf/help/SSLSocketClient.java
class SSLSocketClient (line 19) | public class SSLSocketClient {
method getSSLSocketFactory (line 21) | public static SSLSocketFactory getSSLSocketFactory() {
method createTrustAllManager (line 31) | public static X509TrustManager createTrustAllManager() {
method getHostnameVerifier (line 55) | public static HostnameVerifier getHostnameVerifier() {
FILE: app/src/main/java/com/kunfei/bookshelf/help/UTF8BOMFighter.java
class UTF8BOMFighter (line 3) | public class UTF8BOMFighter {
method UTF8BOMFighter (line 6) | private UTF8BOMFighter() {
method removeUTF8BOM (line 9) | static public String removeUTF8BOM(String xmlText) {
method removeUTF8BOM (line 21) | static public byte[] removeUTF8BOM(byte[] bytes) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/UpdateManager.java
class UpdateManager (line 33) | public class UpdateManager {
method getInstance (line 36) | public static UpdateManager getInstance(Activity activity) {
method UpdateManager (line 40) | private UpdateManager(Activity activity) {
method checkUpdate (line 44) | public void checkUpdate(boolean showMsg) {
method analyzeLastReleaseApi (line 71) | private Observable<UpdateInfoBean> analyzeLastReleaseApi(String jsonSt...
method installApk (line 105) | public void installApk(File apkFile) {
method getSavePath (line 128) | public static String getSavePath(String fileName) {
FILE: app/src/main/java/com/kunfei/bookshelf/help/media/LoaderCreator.java
class LoaderCreator (line 12) | public class LoaderCreator {
method create (line 15) | public static CursorLoader create(Context context, int id, Bundle bund...
FILE: app/src/main/java/com/kunfei/bookshelf/help/media/LocalFileLoader.java
class LocalFileLoader (line 21) | public class LocalFileLoader extends CursorLoader {
method LocalFileLoader (line 33) | public LocalFileLoader(Context context) {
method initLoader (line 41) | private void initLoader() {
method parseData (line 49) | public void parseData(Cursor cursor, final MediaStoreHelper.MediaResul...
method getValueFromCursor (line 84) | protected Object getValueFromCursor(@NonNull Cursor cursor, String col...
FILE: app/src/main/java/com/kunfei/bookshelf/help/media/MediaStoreHelper.java
class MediaStoreHelper (line 21) | public class MediaStoreHelper {
method getAllBookFile (line 31) | public static void getAllBookFile(FragmentActivity activity, MediaResu...
type MediaResultCallback (line 37) | public interface MediaResultCallback {
method onResultCallback (line 38) | void onResultCallback(List<File> files);
class MediaLoaderCallbacks (line 44) | static class MediaLoaderCallbacks implements LoaderManager.LoaderCallb...
method MediaLoaderCallbacks (line 48) | public MediaLoaderCallbacks(Context context, MediaResultCallback res...
method onCreateLoader (line 53) | @NonNull
method onLoadFinished (line 59) | @Override
method onLoaderReset (line 65) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/model/BookSourceManager.java
class BookSourceManager (line 35) | public class BookSourceManager {
method getSelectedBookSource (line 37) | public static List<BookSourceBean> getSelectedBookSource() {
method getAllBookSource (line 45) | public static List<BookSourceBean> getAllBookSource() {
method getSelectedBookSourceBySerialNumber (line 52) | public static List<BookSourceBean> getSelectedBookSourceBySerialNumber...
method getAllBookSourceBySerialNumber (line 59) | public static List<BookSourceBean> getAllBookSourceBySerialNumber() {
method getEnableSourceByGroup (line 65) | public static List<BookSourceBean> getEnableSourceByGroup(String group) {
method getBookSourceByUrl (line 73) | @Nullable
method removeBookSource (line 79) | public static void removeBookSource(BookSourceBean sourceBean) {
method getBookSourceSort (line 84) | public static String getBookSourceSort() {
method addBookSource (line 95) | public static void addBookSource(List<BookSourceBean> bookSourceBeans) {
method addBookSource (line 101) | public static void addBookSource(BookSourceBean bookSourceBean) {
method saveBookSource (line 118) | public static void saveBookSource(BookSourceBean bookSourceBean) {
method toTop (line 124) | public static Single<Boolean> toTop(BookSourceBean sourceBean) {
method getEnableGroupList (line 137) | public static List<String> getEnableGroupList() {
method getGroupList (line 157) | public static List<String> getGroupList() {
method importSource (line 174) | public static Observable<List<BookSourceBean>> importSource(String str...
method importBookSourceFromJson (line 197) | private static Observable<List<BookSourceBean>> importBookSourceFromJs...
FILE: app/src/main/java/com/kunfei/bookshelf/model/ImportBookModel.java
class ImportBookModel (line 18) | public class ImportBookModel extends BaseModelImpl {
method getInstance (line 20) | public static ImportBookModel getInstance() {
method importBook (line 24) | public Observable<LocBookShelfBean> importBook(final File file) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/ReplaceRuleManager.java
class ReplaceRuleManager (line 29) | public class ReplaceRuleManager {
method getEnabled (line 32) | public static List<ReplaceRuleBean> getEnabled() {
method mergeAdRules (line 44) | public static Single<Boolean> mergeAdRules(ReplaceRuleBean replaceRule...
method formateAdRule (line 93) | public static String formateAdRule(String rule) {
method getAll (line 132) | public static Single<List<ReplaceRuleBean>> getAll() {
method saveData (line 139) | public static Single<Boolean> saveData(ReplaceRuleBean replaceRuleBean) {
method delData (line 150) | public static void delData(ReplaceRuleBean replaceRuleBean) {
method addDataS (line 155) | public static void addDataS(List<ReplaceRuleBean> replaceRuleBeans) {
method delDataS (line 162) | public static void delDataS(List<ReplaceRuleBean> replaceRuleBeans) {
method refreshDataS (line 169) | private static void refreshDataS() {
method importReplaceRule (line 177) | public static Observable<Boolean> importReplaceRule(String text) {
method importReplaceRuleO (line 195) | private static Observable<Boolean> importReplaceRuleO(String json) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/SavedSource.java
class SavedSource (line 5) | public class SavedSource {
method SavedSource (line 12) | private SavedSource() {
method getBookName (line 17) | public String getBookName() {
method setBookName (line 21) | public void setBookName(String bookName) {
method getSaveTime (line 25) | public long getSaveTime() {
method setSaveTime (line 29) | public void setSaveTime(long saveTime) {
method getBookSource (line 33) | public BookSourceBean getBookSource() {
method setBookSource (line 40) | public void setBookSource(BookSourceBean bookSource) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/SearchBookModel.java
class SearchBookModel (line 32) | public class SearchBookModel {
method SearchBookModel (line 46) | public SearchBookModel(OnSearchListener searchListener) {
method SearchBookModel (line 50) | public SearchBookModel(OnSearchListener searchListener, List<BookSourc...
method initSearchEngineS (line 67) | public void initSearchEngineS(@NonNull List<BookSourceBean> sourceBean...
method searchReNew (line 79) | public void searchReNew() {
method stopSearch (line 88) | public void stopSearch() {
method searchBookError (line 97) | private void searchBookError(Throwable throwable) {
method onDestroy (line 107) | public void onDestroy() {
method setSearchTime (line 112) | public void setSearchTime(long searchTime) {
method search (line 116) | public void search(final String content, final long searchTime, List<B...
method searchOnEngine (line 140) | private synchronized void searchOnEngine(final String content, List<Bo...
method getPage (line 246) | public int getPage() {
method setPage (line 250) | public void setPage(int page) {
type OnSearchListener (line 254) | public interface OnSearchListener {
method refreshSearchBook (line 255) | void refreshSearchBook();
method refreshFinish (line 257) | void refreshFinish(Boolean isAll);
method loadMoreFinish (line 259) | void loadMoreFinish(Boolean isAll);
method loadMoreSearchBook (line 261) | void loadMoreSearchBook(List<SearchBookBean> searchBookBeanList);
method searchBookError (line 263) | void searchBookError(Throwable throwable);
method getItemCount (line 265) | int getItemCount();
class SearchEngine (line 268) | private static class SearchEngine {
method getTag (line 272) | public String getTag() {
method setTag (line 276) | public void setTag(String tag) {
method getHasMore (line 280) | Boolean getHasMore() {
method setHasMore (line 284) | void setHasMore(Boolean hasMore) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/TxtChapterRuleManager.java
class TxtChapterRuleManager (line 15) | public class TxtChapterRuleManager {
method getAll (line 17) | public static List<TxtChapterRuleBean> getAll() {
method getEnabled (line 25) | public static List<TxtChapterRuleBean> getEnabled() {
method enabledRuleList (line 35) | public static List<String> enabledRuleList() {
method getDefault (line 44) | public static List<TxtChapterRuleBean> getDefault() {
method del (line 61) | public static void del(TxtChapterRuleBean txtChapterRuleBean) {
method del (line 65) | public static void del(List<TxtChapterRuleBean> ruleBeanList) {
method save (line 71) | public static void save(TxtChapterRuleBean txtChapterRuleBean) {
method save (line 78) | public static void save(List<TxtChapterRuleBean> txtChapterRuleBeans) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/UpLastChapterModel.java
class UpLastChapterModel (line 37) | public class UpLastChapterModel {
method getInstance (line 46) | public static UpLastChapterModel getInstance() {
method UpLastChapterModel (line 53) | private UpLastChapterModel() {
method startUpdate (line 60) | public void startUpdate() {
method startUpdate (line 98) | public synchronized void startUpdate(List<SearchBookBean> beanList) {
method doUpdate (line 111) | private synchronized void doUpdate() {
method stopUp (line 150) | private void stopUp() {
method destroy (line 157) | public static void destroy() {
method findSearchBookBean (line 165) | private Observable<SearchBookBean> findSearchBookBean(BookShelfBean bo...
method toBookshelf (line 182) | private Observable<BookShelfBean> toBookshelf(SearchBookBean searchBoo...
method getChapterList (line 190) | private Observable<List<BookChapterBean>> getChapterList(BookShelfBean...
method saveSearchBookBean (line 199) | private Observable<SearchBookBean> saveSearchBookBean(List<BookChapter...
FILE: app/src/main/java/com/kunfei/bookshelf/model/WebBookModel.java
class WebBookModel (line 26) | public class WebBookModel {
method getInstance (line 28) | public static WebBookModel getInstance() {
method getBookInfo (line 36) | public Observable<BookShelfBean> getBookInfo(BookShelfBean bookShelfBe...
method getChapterList (line 46) | public Observable<List<BookChapterBean>> getChapterList(final BookShel...
method getBookContent (line 56) | public Observable<BookContentBean> getBookContent(BookShelfBean bookSh...
method searchBook (line 66) | public Observable<List<SearchBookBean>> searchBook(String content, int...
method findBook (line 75) | public Observable<List<SearchBookBean>> findBook(String url, int page,...
method upChapterList (line 84) | private Observable<List<BookChapterBean>> upChapterList(BookShelfBean ...
method saveContent (line 111) | @SuppressLint("DefaultLocale")
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByJSonPath.java
class AnalyzeByJSonPath (line 13) | public class AnalyzeByJSonPath {
method parse (line 17) | public AnalyzeByJSonPath parse(Object json) {
method getString (line 26) | public String getString(String rule) {
method getStringList (line 83) | List<String> getStringList(String rule) {
method getObject (line 151) | Object getObject(String rule) {
method getList (line 155) | List<Object> getList(String rule) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByJSoup.java
class AnalyzeByJSoup (line 26) | public class AnalyzeByJSoup {
method parse (line 29) | public AnalyzeByJSoup parse(Object doc) {
method getElements (line 48) | Elements getElements(String rule) {
method getString (line 55) | String getString(String ruleStr) {
method getString0 (line 69) | String getString0(String ruleStr) {
method getStringList (line 80) | List<String> getStringList(String ruleStr) {
method getElements (line 154) | private Elements getElements(Element temp, String rule) {
method filterElements (line 212) | private Elements filterElements(Elements elements, String[] rules) {
method getElementsSingle (line 241) | private Elements getElementsSingle(Element temp, String rule) {
method getResultList (line 354) | private List<String> getResultList(String ruleStr) {
method getResultLast (line 378) | private List<String> getResultLast(Elements elements, String lastRule) {
class SourceRule (line 429) | class SourceRule {
method SourceRule (line 435) | SourceRule(String ruleStr) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByRegex.java
class AnalyzeByRegex (line 22) | public class AnalyzeByRegex {
method getInfoOfRegex (line 25) | public static void getInfoOfRegex(String res, String[] regs, int index,
method getInfoByRegex (line 123) | public static void getInfoByRegex(String res, String[] regList, int re...
method splitRegexRule (line 191) | public static void splitRegexRule(String str, final List<String> ruleP...
method checkKeys (line 245) | public static String checkKeys(String str, AnalyzeRule analyzer) throw...
method string2Int (line 263) | public static int string2Int(String s) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByXPath.java
class AnalyzeByXPath (line 14) | public class AnalyzeByXPath {
method parse (line 18) | public AnalyzeByXPath parse(Object doc) {
method strToJXDocument (line 41) | private JXDocument strToJXDocument(String html) {
method getElements (line 51) | List<JXNode> getElements(String xPath) {
method getStringList (line 103) | List<String> getStringList(String xPath) {
method getString (line 161) | public String getString(String rule) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeHeaders.java
class AnalyzeHeaders (line 18) | public class AnalyzeHeaders {
method getDefaultHeader (line 21) | public static Map<String, String> getDefaultHeader() {
method getDefaultUserAgent (line 27) | public static String getDefaultUserAgent() {
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeRule.java
class AnalyzeRule (line 37) | @Keep
method AnalyzeRule (line 57) | public AnalyzeRule(BaseBookBean bookBean, BookSourceBean bookSourceBea...
method setBook (line 62) | public void setBook(BaseBookBean book) {
method setContent (line 66) | public AnalyzeRule setContent(Object body) {
method getContent (line 70) | public Object getContent() {
method setContent (line 74) | public AnalyzeRule setContent(Object body, String baseUrl) {
method getBaseUrl (line 87) | public String getBaseUrl() {
method getAnalyzeByXPath (line 94) | private AnalyzeByXPath getAnalyzeByXPath(Object o) {
method getAnalyzeByXPath (line 101) | private AnalyzeByXPath getAnalyzeByXPath() {
method getAnalyzeByJSoup (line 113) | private AnalyzeByJSoup getAnalyzeByJSoup(Object o) {
method getAnalyzeByJSoup (line 120) | private AnalyzeByJSoup getAnalyzeByJSoup() {
method getAnalyzeByJSonPath (line 132) | private AnalyzeByJSonPath getAnalyzeByJSonPath(Object o) {
method getAnalyzeByJSonPath (line 139) | private AnalyzeByJSonPath getAnalyzeByJSonPath() {
method getStringList (line 151) | public List<String> getStringList(String rule) throws Exception {
method getStringList (line 155) | public List<String> getStringList(String rule, boolean isUrl) throws E...
method getStringList (line 161) | @SuppressWarnings({"unchecked"})
method getString (line 213) | public String getString(String rule) throws Exception {
method getString (line 217) | public String getString(String ruleStr, boolean isUrl) throws Exception {
method getString (line 223) | public String getString(List<SourceRule> ruleList) throws Exception {
method getString (line 227) | public String getString(List<SourceRule> ruleList, boolean isUrl) thro...
method getElement (line 268) | public Object getElement(String ruleStr) throws Exception {
method getElements (line 295) | @SuppressWarnings("unchecked")
method putRule (line 327) | private void putRule(Map<String, String> map) throws Exception {
method splitPutRule (line 338) | private String splitPutRule(String ruleStr) throws Exception {
method replaceGet (line 351) | public String replaceGet(String ruleStr) {
method replaceRegex (line 367) | private String replaceRegex(String result, SourceRule rule) {
method replaceJs (line 387) | @SuppressLint("DefaultLocale")
method splitSourceRule (line 412) | public List<SourceRule> splitSourceRule(String ruleStr) throws Excepti...
class SourceRule (line 462) | public static class SourceRule {
method SourceRule (line 469) | SourceRule(String ruleStr, Mode mainMode) {
type Mode (line 510) | private enum Mode {
method put (line 514) | public String put(String key, String value) {
method get (line 521) | public String get(String key) {
method evalJS (line 534) | public Object evalJS(String jsStr, Object result) throws Exception {
FILE: app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeUrl.java
class AnalyzeUrl (line 40) | @Keep
method AnalyzeUrl (line 58) | public AnalyzeUrl(String urlRule, Map<String, String> headerMap) throw...
method AnalyzeUrl (line 62) | public AnalyzeUrl(String urlRule, String baseUrl, Map<String, String> ...
method AnalyzeUrl (line 66) | public AnalyzeUrl(String urlRule, String baseUrl, BookSourceBean bookS...
method AnalyzeUrl (line 70) | @SuppressLint("DefaultLocale")
method analyzeHeader (line 137) | private String analyzeHeader(String ruleUrl, Map<String, String> heade...
method splitCharCode (line 158) | private String splitCharCode(String rule) {
method analyzePage (line 177) | private String analyzePage(String ruleUrl, final Integer searchPage) {
method replaceJs (line 196) | @SuppressLint("DefaultLocale")
method analyzeQuery (line 221) | private void analyzeQuery(String allQuery) throws Exception {
method splitRule (line 244) | private List<String> splitRule(String ruleStr) {
method generateUrlPath (line 271) | private void generateUrlPath(String ruleUrl) {
method evalJS (line 280) | private Object evalJS(String jsStr, Object result) throws Exception {
method getCharCode (line 291) | public String getCharCode() {
method getHost (line 295) | public String getHost() {
method getPath (line 299) | public String getPath() {
method getRuleUrl (line 303) | public String getRuleUrl() {
method getUrl (line 307) | public String getUrl() {
method getQueryMap (line 311) | public Map<String, String> getQueryMap() {
method getHeaderMap (line 315) | public Map<String, String> getHeaderMap() {
method getQueryStr (line 319) | public String getQueryStr() {
method getJsonBody (line 323) | public String getJsonBody() {
method getPostData (line 327) | public byte[] getPostData() {
method getPostBody (line 337) | public RequestBody getPostBody() {
method getUrlMode (line 342) | public UrlMode getUrlMode() {
type UrlMode (line 346) | public enum UrlMode {
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/BookChapterList.java
class BookChapterList (line 35) | public class BookChapterList {
method BookChapterList (line 44) | BookChapterList(String tag, BookSourceBean bookSourceBean, boolean ana...
method analyzeChapterList (line 50) | public Observable<List<BookChapterBean>> analyzeChapterList(final Stri...
method nextUrlFinish (line 151) | private synchronized boolean nextUrlFinish(WebChapterBean webChapterBe...
method finish (line 159) | private void finish(List<BookChapterBean> chapterList, Emitter<List<Bo...
method analyzeChapterList (line 172) | private WebChapterBean analyzeChapterList(String s, String chapterUrl,...
method addChapter (line 277) | private void addChapter(final List<BookChapterBean> chapterBeans,
method regexChapter (line 286) | private void regexChapter(String str, String[] regex, int index, Analy...
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/BookContent.java
class BookContent (line 29) | class BookContent {
method BookContent (line 35) | BookContent(String tag, BookSourceBean bookSourceBean) {
method analyzeBookContent (line 48) | Observable<BookContentBean> analyzeBookContent(final Response<String> ...
method analyzeBookContent (line 53) | Observable<BookContentBean> analyzeBookContent(final String s, final B...
method analyzeBookContent (line 131) | private WebContentBean analyzeBookContent(AnalyzeRule analyzer, final ...
class WebContentBean (line 153) | private static class WebContentBean {
method WebContentBean (line 157) | private WebContentBean() {
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/BookInfo.java
class BookInfo (line 18) | class BookInfo {
method BookInfo (line 23) | BookInfo(String tag, String sourceName, BookSourceBean bookSourceBean) {
method analyzeBookInfo (line 29) | Observable<BookShelfBean> analyzeBookInfo(String s, final BookShelfBea...
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/BookList.java
class BookList (line 30) | class BookList {
method BookList (line 45) | BookList(String tag, String sourceName, BookSourceBean bookSourceBean,...
method analyzeSearchBook (line 52) | Observable<List<SearchBookBean>> analyzeSearchBook(final Response<Stri...
method initRule (line 149) | private void initRule() {
method getItem (line 174) | private SearchBookBean getItem(AnalyzeRule analyzer, String baseUrl) t...
method getItemAllInOne (line 231) | private SearchBookBean getItemAllInOne(AnalyzeRule analyzer, Object ob...
method getItemInList (line 268) | private SearchBookBean getItemInList(AnalyzeRule analyzer, String base...
method getBooksOfRegex (line 305) | private void getBooksOfRegex(String res, String[] regs,
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/Debug.java
class Debug (line 32) | public class Debug {
method getDoTime (line 38) | private static String getDoTime() {
method printLog (line 42) | public static void printLog(String tag, String msg) {
method printLog (line 46) | static void printLog(String tag, int state, String msg) {
method printLog (line 50) | static void printLog(String tag, int state, String msg, boolean print) {
method printLog (line 54) | public static void printLog(String tag, int state, String msg, boolean...
method newDebug (line 67) | public static void newDebug(String tag, String key, @NonNull Composite...
method Debug (line 73) | private Debug(String tag, String key, CompositeDisposable compositeDis...
method findDebug (line 98) | private void findDebug(String url) {
method searchDebug (line 129) | private void searchDebug(String key) {
method bookInfoDebug (line 160) | private void bookInfoDebug(BookShelfBean bookShelfBean) {
method bookChapterListDebug (line 187) | private void bookChapterListDebug(BookShelfBean bookShelfBean) {
method bookContentDebug (line 220) | private void bookContentDebug(BookShelfBean bookShelfBean, BookChapter...
method printLog (line 247) | private void printLog(String log) {
method printError (line 251) | private void printError(String msg) {
method finish (line 256) | private void finish() {
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/VipThrowable.java
class VipThrowable (line 6) | public class VipThrowable extends Throwable {
method VipThrowable (line 10) | VipThrowable() {
FILE: app/src/main/java/com/kunfei/bookshelf/model/content/WebBook.java
class WebBook (line 36) | public class WebBook extends BaseModelImpl implements JsExtensions {
method getInstance (line 42) | public static WebBook getInstance(String tag) {
method WebBook (line 46) | private WebBook(String tag) {
method findBook (line 64) | public Observable<List<SearchBookBean>> findBook(String url, int page) {
method searchBook (line 85) | public Observable<List<SearchBookBean>> searchBook(String content, int...
method getBookInfo (line 110) | public Observable<BookShelfBean> getBookInfo(final BookShelfBean bookS...
method getChapterList (line 135) | public Observable<List<BookChapterBean>> getChapterList(final BookShel...
method getBookContent (line 161) | public Observable<BookContentBean> getBookContent(final BaseChapterBea...
method checkLogin (line 214) | Observable<Response<String>> checkLogin(final Response<String> stringR...
class NoSourceThrowable (line 233) | public class NoSourceThrowable extends Throwable {
method NoSourceThrowable (line 234) | NoSourceThrowable(String tag) {
FILE: app/src/main/java/com/kunfei/bookshelf/model/impl/IDownloadTask.java
type IDownloadTask (line 8) | public interface IDownloadTask {
method getId (line 10) | int getId();
method startDownload (line 12) | void startDownload(Scheduler scheduler);
method stopDownload (line 14) | void stopDownload();
method isDownloading (line 16) | boolean isDownloading();
method isFinishing (line 18) | boolean isFinishing();
method getDownloadBook (line 20) | DownloadBookBean getDownloadBook();
method onDownloadPrepared (line 22) | void onDownloadPrepared(DownloadBookBean downloadBook);
method onDownloadProgress (line 24) | void onDownloadProgress(DownloadChapterBean chapterBean);
method onDownloadChange (line 26) | void onDownloadChange(DownloadBookBean downloadBook);
method onDownloadError (line 28) | void onDownloadError(DownloadBookBean downloadBook);
method onDownloadComplete (line 30) | void onDownloadComplete(DownloadBookBean downloadBook);
FILE: app/src/main/java/com/kunfei/bookshelf/model/impl/IHttpGetApi.java
type IHttpGetApi (line 17) | public interface IHttpGetApi {
method get (line 18) | @GET
method getMap (line 22) | @GET
FILE: app/src/main/java/com/kunfei/bookshelf/model/impl/IHttpPostApi.java
type IHttpPostApi (line 20) | public interface IHttpPostApi {
method postMap (line 22) | @FormUrlEncoded
method postJson (line 28) | @POST
FILE: app/src/main/java/com/kunfei/bookshelf/model/task/AnalyzeNextUrlTask.java
class AnalyzeNextUrlTask (line 17) | public class AnalyzeNextUrlTask {
method AnalyzeNextUrlTask (line 24) | public AnalyzeNextUrlTask(BookChapterList bookChapterList, WebChapterB...
method setCallback (line 31) | public AnalyzeNextUrlTask setCallback(Callback callback) {
method analyzeUrl (line 36) | public void analyzeUrl(AnalyzeUrl analyzeUrl) {
type Callback (line 60) | public interface Callback {
method addDisposable (line 61) | void addDisposable(Disposable disposable);
method analyzeFinish (line 63) | void analyzeFinish(WebChapterBean bean, List<BookChapterBean> bookCh...
method onError (line 65) | void onError(Throwable throwable);
FILE: app/src/main/java/com/kunfei/bookshelf/model/task/CheckSourceTask.java
class CheckSourceTask (line 26) | public class CheckSourceTask {
method CheckSourceTask (line 32) | public CheckSourceTask(BookSourceBean sourceBean, Scheduler scheduler,...
method startCheck (line 38) | public void startCheck() {
method checkFind (line 74) | private void checkFind() {
method sourceInvalid (line 123) | private void sourceInvalid() {
method sourceUnInvalid (line 131) | private void sourceUnInvalid() {
method evalJS (line 142) | private Object evalJS(String jsStr, String baseUrl, BookSourceBean boo...
FILE: app/src/main/java/com/kunfei/bookshelf/model/task/DownloadTaskImpl.java
class DownloadTaskImpl (line 28) | public abstract class DownloadTaskImpl implements IDownloadTask {
method DownloadTaskImpl (line 41) | protected DownloadTaskImpl(int id, DownloadBookBean downloadBook) {
method getId (line 91) | @Override
method startDownload (line 96) | @Override
method stopDownload (line 109) | @Override
method isDownloading (line 126) | @Override
method isFinishing (line 131) | @Override
method getDownloadBook (line 136) | @Override
method toDownload (line 141) | private synchronized void toDownload(Scheduler scheduler) {
method getDownloadingChapter (line 169) | private Observable<DownloadChapterBean> getDownloadingChapter() {
method downloading (line 189) | private synchronized void downloading(DownloadChapterBean chapter, Sch...
method removeFromDownloadList (line 234) | private synchronized void removeFromDownloadList(DownloadChapterBean c...
method whenNext (line 238) | private void whenNext(Scheduler scheduler, boolean success) {
method whenError (line 255) | private void whenError(Scheduler scheduler) {
method whenProgress (line 272) | private void whenProgress(DownloadChapterBean chapterBean) {
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/BookDetailPresenter.java
class BookDetailPresenter (line 39) | public class BookDetailPresenter extends BasePresenterImpl<BookDetailCon...
method initData (line 51) | @Override
method initBookFormSearch (line 77) | @Override
method getInBookShelf (line 88) | @Override
method getOpenFrom (line 93) | @Override
method getSearchBook (line 98) | @Override
method getBookShelf (line 103) | @Override
method getChapterList (line 108) | @Override
method getBookShelfInfo (line 113) | @Override
method saveBookToShelfO (line 145) | private Observable<List<BookChapterBean>> saveBookToShelfO(BookShelfBe...
method addToBookShelf (line 160) | @Override
method removeFromBookShelf (line 195) | @Override
method changeBookSource (line 233) | @Override
method attachView (line 284) | @Override
method detachView (line 290) | @Override
method hadAddOrRemoveBook (line 296) | @Subscribe(thread = EventThread.MAIN_THREAD,
method skipToChapter (line 303) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.SKI...
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/BookListPresenter.java
class BookListPresenter (line 41) | public class BookListPresenter extends BasePresenterImpl<BookListContrac...
method queryBookShelf (line 49) | @Override
method downloadAll (line 84) | private void downloadAll(int downloadNum, boolean onlyNew) {
method startRefreshBook (line 112) | private void startRefreshBook() {
method refreshBookshelf (line 124) | private synchronized void refreshBookshelf() {
method saveBookToShelfO (line 183) | private Observable<BookShelfBean> saveBookToShelfO(BookShelfBean bookS...
method attachView (line 197) | @Override
method detachView (line 203) | @Override
method hadAddOrRemoveBook (line 209) | @Subscribe(thread = EventThread.MAIN_THREAD,
method updateGroup (line 215) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.UPD...
method reFlashBookList (line 221) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.REF...
method downloadAll (line 226) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.DOW...
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/BookSourcePresenter.java
class BookSourcePresenter (line 44) | public class BookSourcePresenter extends BasePresenterImpl<BookSourceCon...
method saveData (line 48) | @Override
method saveData (line 53) | @Override
method delData (line 65) | @Override
method delData (line 90) | @Override
method restoreBookSource (line 114) | private void restoreBookSource(BookSourceBean bookSourceBean) {
method importBookSource (line 134) | @Override
method importBookSourceLocal (line 145) | @Override
method getImportObserver (line 168) | private MyObserver<List<BookSourceBean>> getImportObserver() {
method checkBookSource (line 189) | @Override
method checkFindSource (line 194) | @Override
method attachView (line 231) | @Override
method detachView (line 237) | @Override
method upCheckSourceState (line 244) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.CHE...
method checkSourceFinish (line 259) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.CHE...
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/ChoiceBookPresenter.java
class ChoiceBookPresenter (line 28) | public class ChoiceBookPresenter extends BasePresenterImpl<ChoiceBookCon...
method ChoiceBookPresenter (line 37) | public ChoiceBookPresenter(final Intent intent) {
method getPage (line 73) | @Override
method initPage (line 78) | @Override
method toSearchBooks (line 84) | @Override
method searchBook (line 90) | private void searchBook(final long searchTime) {
method getTitle (line 126) | @Override
method attachView (line 133) | @Override
method detachView (line 139) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/FindBookPresenter.java
class FindBookPresenter (line 34) | public class FindBookPresenter extends BasePresenterImpl<FindBookContrac...
method initData (line 39) | @SuppressWarnings("unchecked")
method evalJS (line 83) | private Object evalJS(String jsStr, String baseUrl, BookSourceBean boo...
method attachView (line 90) | @Override
method detachView (line 95) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/ImportBookPresenter.java
class ImportBookPresenter (line 20) | public class ImportBookPresenter extends BasePresenterImpl<ImportBookCon...
method importBooks (line 24) | @Override
method detachView (line 56) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/MainPresenter.java
class MainPresenter (line 36) | public class MainPresenter extends BasePresenterImpl<MainContract.View> ...
method addBookUrl (line 41) | @Override
method addBookUrlO (line 69) | private Observable<BookShelfBean> addBookUrlO(String bookUrl) {
method getBook (line 180) | private void getBook(BookShelfBean bookShelfBean) {
method saveBookToShelfO (line 209) | private Observable<BookShelfBean> saveBookToShelfO(BookShelfBean bookS...
method attachView (line 220) | @Override
method detachView (line 226) | @Override
method initImmersionBar (line 231) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.IMM...
method recreate (line 236) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.REC...
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/ReadBookPresenter.java
class ReadBookPresenter (line 55) | public class ReadBookPresenter extends BasePresenterImpl<ReadBookContrac...
method initData (line 64) | @Override
method loadBook (line 78) | @Override
method disableDurBookSource (line 128) | public void disableDurBookSource() {
method getDurChapter (line 140) | @Override
method saveBook (line 151) | @Override
method saveProgress (line 158) | @Override
method openBookFromOther (line 173) | @Override
method addDownload (line 214) | @Override
method changeBookSource (line 231) | @Override
method autoChangeSource (line 282) | @Override
method saveBookmark (line 310) | @Override
method delBookmark (line 322) | @Override
method getBookShelf (line 334) | @Override
method getChapterList (line 339) | @Override
method setChapterList (line 344) | @Override
method addToShelf (line 350) | @Override
method removeFromShelf (line 364) | @Override
method getRealFilePath (line 389) | private Observable<String> getRealFilePath(final Context context, fina...
method getBookSource (line 420) | @Override
method attachView (line 428) | @Override
method detachView (line 436) | @Override
method onMediaButton (line 446) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.MED...
method updateRead (line 453) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.UPD...
method upAloudState (line 458) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.ALO...
method upAloudTimer (line 463) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.ALO...
method skipToChapter (line 468) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.SKI...
method openBookmark (line 473) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.OPE...
method readAloudStart (line 478) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.REA...
method readAloudLength (line 483) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.REA...
method recreate (line 488) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.REC...
method upAudioSize (line 493) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.AUD...
method upAudioDur (line 501) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.AUD...
type OnAddListener (line 506) | public interface OnAddListener {
method addSuccess (line 507) | void addSuccess();
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/ReplaceRulePresenter.java
class ReplaceRulePresenter (line 32) | public class ReplaceRulePresenter extends BasePresenterImpl<ReplaceRuleC...
method detachView (line 34) | @Override
method saveData (line 39) | @Override
method delData (line 55) | @Override
method delData (line 80) | @Override
method restoreData (line 101) | private void restoreData(ReplaceRuleBean replaceRuleBean) {
method importDataSLocal (line 111) | @Override
method importDataS (line 123) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/SearchBookPresenter.java
class SearchBookPresenter (line 35) | public class SearchBookPresenter extends BasePresenterImpl<SearchBookCon...
method SearchBookPresenter (line 43) | public SearchBookPresenter() {
method insertSearchHistory (line 110) | public void insertSearchHistory() {
method cleanSearchHistory (line 144) | @Override
method cleanSearchHistory (line 169) | @Override
method querySearchHistory (line 192) | @Override
method getPage (line 218) | @Override
method initPage (line 223) | @Override
method toSearchBooks (line 231) | @Override
method initSearchEngineS (line 242) | @Override
method stopSearch (line 254) | @Override
method attachView (line 259) | @Override
method detachView (line 265) | @Override
method searchBook (line 271) | @Subscribe(thread = EventThread.MAIN_THREAD, tags = {@Tag(RxBusTag.SEA...
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/SourceEditPresenter.java
class SourceEditPresenter (line 31) | public class SourceEditPresenter extends BasePresenterImpl<SourceEditCon...
method saveSource (line 33) | @Override
method copySource (line 44) | @Override
method pasteSource (line 53) | @Override
method setText (line 62) | @Override
method mathcSourceBean (line 80) | private BookSourceBean mathcSourceBean(String str) {
method attachView (line 121) | @Override
method detachView (line 126) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/TxtChapterRulePresenter.java
class TxtChapterRulePresenter (line 28) | public class TxtChapterRulePresenter extends BasePresenterImpl<TxtChapte...
method detachView (line 30) | @Override
method saveData (line 35) | @Override
method delData (line 51) | @Override
method delData (line 76) | @Override
method restoreData (line 97) | private void restoreData(TxtChapterRuleBean txtChapterRuleBean) {
method importDataSLocal (line 102) | @Override
method importDataS (line 114) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/BookDetailContract.java
type BookDetailContract (line 13) | public interface BookDetailContract {
type Presenter (line 14) | interface Presenter extends IPresenter {
method initData (line 15) | void initData(Intent intent);
method getOpenFrom (line 17) | int getOpenFrom();
method getSearchBook (line 19) | SearchBookBean getSearchBook();
method getBookShelf (line 21) | BookShelfBean getBookShelf();
method getChapterList (line 23) | List<BookChapterBean> getChapterList();
method getInBookShelf (line 25) | Boolean getInBookShelf();
method initBookFormSearch (line 27) | void initBookFormSearch(SearchBookBean searchBookBean);
method getBookShelfInfo (line 29) | void getBookShelfInfo();
method addToBookShelf (line 31) | void addToBookShelf();
method removeFromBookShelf (line 33) | void removeFromBookShelf();
method changeBookSource (line 35) | void changeBookSource(SearchBookBean searchBookBean);
type View (line 38) | interface View extends IView {
method updateView (line 42) | void updateView();
method getBookShelfError (line 47) | void getBookShelfError();
method readBook (line 49) | void readBook();
method finish (line 51) | void finish();
method toast (line 53) | void toast(String msg);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/BookListContract.java
type BookListContract (line 11) | public interface BookListContract {
type View (line 13) | interface View extends IView {
method refreshBookShelf (line 20) | void refreshBookShelf(List<BookShelfBean> bookShelfBeanList);
method refreshBook (line 22) | void refreshBook(String noteUrl);
method getPreferences (line 24) | SharedPreferences getPreferences();
method updateGroup (line 29) | void updateGroup(Integer group);
type Presenter (line 33) | interface Presenter extends IPresenter {
method queryBookShelf (line 34) | void queryBookShelf(Boolean needRefresh, int group);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/BookSourceContract.java
type BookSourceContract (line 10) | public interface BookSourceContract {
type Presenter (line 12) | interface Presenter extends IPresenter {
method saveData (line 14) | void saveData(BookSourceBean bookSourceBean);
method saveData (line 16) | void saveData(List<BookSourceBean> bookSourceBeans);
method delData (line 18) | void delData(BookSourceBean bookSourceBean);
method delData (line 20) | void delData(List<BookSourceBean> bookSourceBeans);
method importBookSource (line 22) | void importBookSource(String url);
method importBookSourceLocal (line 24) | void importBookSourceLocal(String path);
method checkBookSource (line 26) | void checkBookSource(List<BookSourceBean> sourceBeans);
method checkFindSource (line 28) | void checkFindSource(List<BookSourceBean> sourceBeans);
type View (line 31) | interface View extends IView {
method refreshBookSource (line 33) | void refreshBookSource();
method getSnackBar (line 35) | Snackbar getSnackBar(String msg, int length);
method showSnackBar (line 37) | void showSnackBar(String msg, int length);
method setResult (line 39) | void setResult(int resultCode);
method getSort (line 41) | int getSort();
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/ChoiceBookContract.java
type ChoiceBookContract (line 9) | public interface ChoiceBookContract {
type Presenter (line 10) | interface Presenter extends IPresenter {
method getPage (line 12) | int getPage();
method initPage (line 14) | void initPage();
method toSearchBooks (line 16) | void toSearchBooks(String key);
method getTitle (line 18) | String getTitle();
type View (line 21) | interface View extends IView {
method refreshSearchBook (line 23) | void refreshSearchBook(List<SearchBookBean> books);
method loadMoreSearchBook (line 25) | void loadMoreSearchBook(List<SearchBookBean> books);
method refreshFinish (line 27) | void refreshFinish(Boolean isAll);
method loadMoreFinish (line 29) | void loadMoreFinish(Boolean isAll);
method searchBookError (line 31) | void searchBookError(String msg);
method addBookShelfFailed (line 33) | void addBookShelfFailed(String massage);
method startRefreshAnim (line 35) | void startRefreshAnim();
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/FindBookContract.java
type FindBookContract (line 9) | public interface FindBookContract {
type Presenter (line 10) | interface Presenter extends IPresenter {
method initData (line 12) | void initData();
type View (line 16) | interface View extends IView {
method upData (line 18) | void upData(List<RecyclerViewData> group);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/ImportBookContract.java
type ImportBookContract (line 9) | public interface ImportBookContract {
type Presenter (line 11) | interface Presenter extends IPresenter {
method importBooks (line 13) | void importBooks(List<File> books);
type View (line 17) | interface View extends IView {
method addSuccess (line 22) | void addSuccess();
method addError (line 27) | void addError(String msg);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/MainContract.java
type MainContract (line 6) | public interface MainContract {
type View (line 8) | interface View extends IView {
method initImmersionBar (line 10) | void initImmersionBar();
method dismissHUD (line 15) | void dismissHUD();
method onRestore (line 20) | void onRestore(String msg);
method recreate (line 22) | void recreate();
method toast (line 24) | void toast(String msg);
method toast (line 26) | void toast(int strId);
method getGroup (line 28) | int getGroup();
type Presenter (line 31) | interface Presenter extends IPresenter {
method addBookUrl (line 33) | void addBookUrl(String bookUrl);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/ReadBookContract.java
type ReadBookContract (line 18) | public interface ReadBookContract {
type View (line 19) | interface View extends IView {
method getNoteUrl (line 21) | String getNoteUrl();
method getAdd (line 23) | Boolean getAdd();
method setAdd (line 25) | void setAdd(Boolean isAdd);
method changeSourceFinish (line 27) | void changeSourceFinish(BookShelfBean book);
method startLoadingBook (line 29) | void startLoadingBook();
method upMenu (line 31) | void upMenu();
method openBookFromOther (line 33) | void openBookFromOther();
method showBookmark (line 35) | void showBookmark(BookmarkBean bookmarkBean);
method skipToChapter (line 37) | void skipToChapter(int chapterIndex, int pageIndex);
method onMediaButton (line 39) | void onMediaButton(String cmd);
method upAloudState (line 41) | void upAloudState(ReadAloudService.Status state);
method upAloudTimer (line 43) | void upAloudTimer(String timer);
method readAloudStart (line 45) | void readAloudStart(int start);
method readAloudLength (line 47) | void readAloudLength(int readAloudLength);
method refresh (line 49) | void refresh(boolean recreate);
method finish (line 51) | void finish();
method recreate (line 53) | void recreate();
method upAudioSize (line 55) | void upAudioSize(int audioSize);
method upAudioDur (line 57) | void upAudioDur(int audioDur);
type Presenter (line 60) | interface Presenter extends IPresenter {
method loadBook (line 62) | void loadBook(Intent intent);
method getBookShelf (line 64) | BookShelfBean getBookShelf();
method getChapterList (line 66) | List<BookChapterBean> getChapterList();
method getDurChapter (line 68) | BookChapterBean getDurChapter();
method setChapterList (line 70) | void setChapterList(List<BookChapterBean> chapterList);
method saveBook (line 72) | void saveBook();
method saveProgress (line 74) | void saveProgress();
method addToShelf (line 76) | void addToShelf(final ReadBookPresenter.OnAddListener Listener);
method removeFromShelf (line 78) | void removeFromShelf();
method initData (line 80) | void initData(Activity activity);
method openBookFromOther (line 82) | void openBookFromOther(Activity activity);
method addDownload (line 84) | void addDownload(int start, int end);
method changeBookSource (line 86) | void changeBookSource(SearchBookBean searchBookBean);
method autoChangeSource (line 88) | void autoChangeSource();
method saveBookmark (line 90) | void saveBookmark(BookmarkBean bookmarkBean);
method delBookmark (line 92) | void delBookmark(BookmarkBean bookmarkBean);
method disableDurBookSource (line 94) | void disableDurBookSource();
method getBookSource (line 96) | BookSourceBean getBookSource();
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/ReplaceRuleContract.java
type ReplaceRuleContract (line 11) | public interface ReplaceRuleContract {
type Presenter (line 12) | interface Presenter extends IPresenter {
method saveData (line 14) | void saveData(List<ReplaceRuleBean> replaceRuleBeans);
method delData (line 16) | void delData(ReplaceRuleBean replaceRuleBean);
method delData (line 18) | void delData(List<ReplaceRuleBean> replaceRuleBeans);
method importDataSLocal (line 20) | void importDataSLocal(String uri);
method importDataS (line 22) | void importDataS(String text);
type View (line 25) | interface View extends IView {
method refresh (line 27) | void refresh();
method getSnackBar (line 29) | Snackbar getSnackBar(String msg, int length);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/SearchBookContract.java
type SearchBookContract (line 13) | public interface SearchBookContract {
type Presenter (line 14) | interface Presenter extends IPresenter {
method insertSearchHistory (line 16) | void insertSearchHistory();
method querySearchHistory (line 18) | void querySearchHistory(String content);
method cleanSearchHistory (line 20) | void cleanSearchHistory();
method cleanSearchHistory (line 22) | void cleanSearchHistory(SearchHistoryBean searchHistoryBean);
method getPage (line 24) | int getPage();
method initPage (line 26) | void initPage();
method toSearchBooks (line 28) | void toSearchBooks(String key, Boolean fromError);
method stopSearch (line 30) | void stopSearch();
method initSearchEngineS (line 32) | void initSearchEngineS(String group);
type View (line 35) | interface View extends IView {
method searchBook (line 37) | void searchBook(String searchKey);
method insertSearchHistorySuccess (line 42) | void insertSearchHistorySuccess(SearchHistoryBean searchHistoryBean);
method querySearchHistorySuccess (line 47) | void querySearchHistorySuccess(List<SearchHistoryBean> datas);
method refreshSearchBook (line 52) | void refreshSearchBook();
method loadMoreSearchBook (line 57) | void loadMoreSearchBook(List<SearchBookBean> books);
method refreshFinish (line 62) | void refreshFinish(Boolean isAll);
method loadMoreFinish (line 67) | void loadMoreFinish(Boolean isAll);
method searchBookError (line 72) | void searchBookError(Throwable throwable);
method getEdtContent (line 77) | EditText getEdtContent();
method getSearchBookAdapter (line 82) | SearchBookAdapter getSearchBookAdapter();
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/SourceEditContract.java
type SourceEditContract (line 9) | public interface SourceEditContract {
type Presenter (line 10) | interface Presenter extends IPresenter {
method saveSource (line 12) | Observable<Boolean> saveSource(BookSourceBean bookSource, BookSource...
method copySource (line 14) | void copySource(String bookSource);
method pasteSource (line 16) | void pasteSource();
method setText (line 18) | void setText(String bookSourceStr);
type View (line 21) | interface View extends IView {
method setText (line 23) | void setText(BookSourceBean bookSourceBean);
method getBookSourceStr (line 25) | String getBookSourceStr(boolean hasFind);
FILE: app/src/main/java/com/kunfei/bookshelf/presenter/contract/TxtChapterRuleContract.java
type TxtChapterRuleContract (line 10) | public interface TxtChapterRuleContract {
type Presenter (line 11) | interface Presenter extends IPresenter {
method saveData (line 13) | void saveData(List<TxtChapterRuleBean> txtChapterRuleBeans);
method delData (line 15) | void delData(TxtChapterRuleBean txtChapterRuleBean);
method delData (line 17) | void delData(List<TxtChapterRuleBean> txtChapterRuleBeans);
method importDataSLocal (line 19) | void importDataSLocal(String uri);
method importDataS (line 21) | void importDataS(String text);
type View (line 24) | interface View extends IView {
method refresh (line 26) | void refresh();
method getSnackBar (line 28) | Snackbar getSnackBar(String msg, int length);
FILE: app/src/main/java/com/kunfei/bookshelf/service/CheckSourceService.java
class CheckSourceService (line 35) | public class CheckSourceService extends Service {
method start (line 50) | public static void start(Context context, List<BookSourceBean> sourceB...
method stop (line 63) | public static void stop(Context context) {
method onCreate (line 69) | @Override
method onStartCommand (line 96) | @SuppressWarnings("unchecked")
method onDestroy (line 116) | @Override
method onBind (line 122) | @Nullable
method doneService (line 128) | private void doneService() {
method updateNotification (line 137) | private void updateNotification(int state, String msg) {
method getActivityPendingIntent (line 153) | private PendingIntent getActivityPendingIntent() {
method getThisServicePendingIntent (line 159) | private PendingIntent getThisServicePendingIntent() {
method startCheck (line 165) | public void startCheck() {
method nextCheck (line 175) | private synchronized void nextCheck() {
type CheckSourceListener (line 193) | public interface CheckSourceListener {
method nextCheck (line 194) | void nextCheck();
method compositeDisposableAdd (line 196) | void compositeDisposableAdd(Disposable disposable);
method getCheckIndex (line 198) | int getCheckIndex();
FILE: app/src/main/java/com/kunfei/bookshelf/service/DownloadService.java
class DownloadService (line 38) | public class DownloadService extends Service {
method onCreate (line 58) | @Override
method onDestroy (line 79) | @Override
method onStartCommand (line 88) | @Override
method onBind (line 119) | @Nullable
method addDownload (line 125) | private synchronized void addDownload(DownloadBookBean downloadBook) {
method cancelDownload (line 171) | private void cancelDownload() {
method removeDownload (line 178) | private void removeDownload(String noteUrl) {
method refreshDownloadList (line 193) | private void refreshDownloadList() {
method startNextTaskAfterRemove (line 207) | private void startNextTaskAfterRemove(DownloadBookBean downloadBook) {
method startNextTask (line 218) | private void startNextTask() {
method canStartNextTask (line 232) | private boolean canStartNextTask() {
method checkDownloadTaskExist (line 244) | private synchronized boolean checkDownloadTaskExist(DownloadBookBean d...
method sendUpDownloadBook (line 255) | private void sendUpDownloadBook(String action, DownloadBookBean downlo...
method sendUpDownloadBooks (line 261) | private void sendUpDownloadBooks(ArrayList<DownloadBookBean> downloadB...
method toast (line 267) | private void toast(String msg) {
method getChancelPendingIntent (line 271) | private PendingIntent getChancelPendingIntent() {
method isProgress (line 277) | private synchronized void isProgress(DownloadChapterBean downloadChapt...
method finishSelf (line 305) | private void finishSelf() {
method addDownload (line 310) | public static void addDownload(Context context, DownloadBookBean downl...
method removeDownload (line 320) | public static void removeDownload(Context context, String noteUrl) {
method cancelDownload (line 330) | public static void cancelDownload(Context context) {
method obtainDownloadList (line 339) | public static void obtainDownloadList(Context context) {
FILE: app/src/main/java/com/kunfei/bookshelf/service/MediaButtonIntentReceiver.java
class MediaButtonIntentReceiver (line 19) | public class MediaButtonIntentReceiver extends BroadcastReceiver {
method handleIntent (line 22) | public static boolean handleIntent(final Context context, final Intent...
method readAloud (line 61) | private static void readAloud(final Context context, String command) {
method onReceive (line 77) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/service/ReadAloudService.java
class ReadAloudService (line 58) | public class ReadAloudService extends Service implements Player.Listener {
method play (line 115) | public static void play(Context context, Boolean aloudButton, String c...
method stop (line 130) | public static void stop(Context context) {
method pause (line 141) | public static void pause(Context context) {
method resume (line 152) | public static void resume(Context context) {
method setTimer (line 160) | public static void setTimer(Context context, int minute) {
method setProgress (line 169) | public static void setProgress(Context context, long progress) {
method tts_ui_timer_stop (line 178) | public static void tts_ui_timer_stop(Context context) {
method tts_ui_timer_remaining (line 186) | public static void tts_ui_timer_remaining(Context context) {
method onCreate (line 194) | @Override
method onTaskRemoved (line 225) | @Override
method onStartCommand (line 232) | @Override
method onBind (line 291) | @Nullable
method initTTS (line 297) | private void initTTS() {
method initMediaPlayer (line 308) | private void initMediaPlayer() {
method onPlaybackStateChanged (line 314) | @Override
method onPlayerError (line 347) | @Override
method newReadAloud (line 356) | private void newReadAloud(String content, Boolean aloudButton, String ...
method playTTS (line 387) | public void playTTS() {
method playTTSN (line 409) | public void playTTSN() {
method toTTSSetting (line 439) | public void toTTSSetting() {
method initSpeechRate (line 450) | private void initSpeechRate() {
method pauseReadAloud (line 462) | private void pauseReadAloud(Boolean pause) {
method resumeReadAloud (line 484) | private void resumeReadAloud() {
method updateTimer (line 497) | private void updateTimer(int minute) {
method doDs (line 529) | private void doDs() {
method getReadBookActivityPendingIntent (line 535) | private PendingIntent getReadBookActivityPendingIntent() {
method getThisServicePendingIntent (line 541) | private PendingIntent getThisServicePendingIntent(String actionStr) {
method updateNotification (line 550) | private void updateNotification() {
method onDestroy (line 591) | @Override
method clearTTS (line 603) | private void clearTTS() {
method unRegisterMediaButton (line 623) | private void unRegisterMediaButton() {
method requestFocus (line 635) | private boolean requestFocus() {
method initFocusRequest (line 648) | @RequiresApi(api = Build.VERSION_CODES.O)
method initMediaSession (line 664) | private void initMediaSession() {
method initBroadcastReceiver (line 681) | private void initBroadcastReceiver() {
method updateMediaSessionPlaybackState (line 695) | private void updateMediaSessionPlaybackState() {
class TTSListener (line 704) | private final class TTSListener implements TextToSpeech.OnInitListener {
method onInit (line 705) | @Override
class TTSUIListener (line 719) | private final class TTSUIListener implements TextToSpeech.OnInitListen...
method onInit (line 720) | @Override
class ttsUtteranceListener (line 731) | private class ttsUtteranceListener extends UtteranceProgressListener {
method onStart (line 733) | @Override
method onDone (line 740) | @Override
method onError (line 749) | @Override
method onRangeStart (line 755) | @Override
class AudioFocusChangeListener (line 762) | class AudioFocusChangeListener implements AudioManager.OnAudioFocusCha...
method onAudioFocusChange (line 763) | @Override
type Status (line 788) | public enum Status {
FILE: app/src/main/java/com/kunfei/bookshelf/service/ShareService.java
class ShareService (line 32) | public class ShareService extends Service {
method startThis (line 38) | public static void startThis(Activity activity, List<BookSourceBean> b...
method upServer (line 47) | public static void upServer(Activity activity) {
method stopThis (line 55) | public static void stopThis(Context context) {
method onCreate (line 63) | @Override
method onStartCommand (line 71) | @Override
method upServer (line 89) | @SuppressWarnings("unchecked")
method onDestroy (line 113) | @Override
method getThisServicePendingIntent (line 122) | private PendingIntent getThisServicePendingIntent() {
method updateNotification (line 131) | private void updateNotification(String content) {
method onBind (line 144) | @Nullable
FILE: app/src/main/java/com/kunfei/bookshelf/service/WebService.java
class WebService (line 29) | public class WebService extends Service {
method startThis (line 40) | public static boolean startThis(Context context) {
method upHttpServer (line 51) | public static void upHttpServer(Activity activity) {
method onCreate (line 59) | @Override
method onStartCommand (line 67) | @Override
method upServer (line 85) | private void upServer() {
method onDestroy (line 110) | @Override
method getThisServicePendingIntent (line 122) | private PendingIntent getThisServicePendingIntent() {
method getPort (line 128) | private int getPort() {
method updateNotification (line 139) | private void updateNotification(String content) {
method onBind (line 152) | @Nullable
FILE: app/src/main/java/com/kunfei/bookshelf/utils/ACache.java
class ACache (line 41) | @SuppressWarnings({"unused", "ResultOfMethodCallIgnored", "WeakerAccess"})
method ACache (line 50) | private ACache(File cacheDir, long max_size, int max_count) {
method get (line 60) | public static ACache get(Context ctx) {
method get (line 64) | public static ACache get(Context ctx, String cacheName) {
method get (line 69) | public static ACache get(File cacheDir) {
method get (line 73) | public static ACache get(Context ctx, long max_zise, int max_count) {
method get (line 83) | public static ACache get(File cacheDir, long max_zise, int max_count) {
method myPid (line 97) | private static String myPid() {
method put (line 111) | public void put(String key, String value) {
method put (line 141) | public void put(String key, String value, int saveTime) {
method getAsString (line 150) | public String getAsString(String key) {
method put (line 185) | public void put(String key, JSONObject value) {
method put (line 196) | public void put(String key, JSONObject value, int saveTime) {
method getAsJSONObject (line 205) | public JSONObject getAsJSONObject(String key) {
method put (line 224) | public void put(String key, JSONArray value) {
method put (line 235) | public void put(String key, JSONArray value, int saveTime) {
method getAsJSONArray (line 244) | public JSONArray getAsJSONArray(String key) {
method put (line 263) | public void put(String key, byte[] value) {
method put (line 289) | public void put(String key, byte[] value, int saveTime) {
method getAsBinary (line 298) | public byte[] getAsBinary(String key) {
method put (line 340) | public void put(String key, Serializable value) {
method put (line 351) | public void put(String key, Serializable value, int saveTime) {
method getAsObject (line 372) | public Object getAsObject(String key) {
method put (line 413) | public void put(String key, Bitmap value) {
method put (line 424) | public void put(String key, Bitmap value, int saveTime) {
method getAsBitmap (line 433) | public Bitmap getAsBitmap(String key) {
method put (line 450) | public void put(String key, Drawable value) {
method put (line 461) | public void put(String key, Drawable value, int saveTime) {
method getAsDrawable (line 470) | public Drawable getAsDrawable(String key) {
method file (line 482) | public File file(String key) {
method remove (line 500) | public boolean remove(String key) {
method clear (line 507) | public void clear() {
class Utils (line 516) | private static class Utils {
method isDue (line 525) | private static boolean isDue(String str) {
method isDue (line 534) | private static boolean isDue(byte[] data) {
method newStringWithDateInfo (line 556) | private static String newStringWithDateInfo(int second, String strIn...
method newByteArrayWithDateInfo (line 560) | private static byte[] newByteArrayWithDateInfo(int second, byte[] da...
method clearDateInfo (line 568) | private static String clearDateInfo(String strInfo) {
method clearDateInfo (line 575) | private static byte[] clearDateInfo(byte[] data) {
method hasDateInfo (line 583) | private static boolean hasDateInfo(byte[] data) {
method getDateInfoFromDate (line 588) | private static String[] getDateInfoFromDate(byte[] data) {
method indexOf (line 598) | private static int indexOf(byte[] data, char c) {
method copyOfRange (line 607) | private static byte[] copyOfRange(byte[] original, int from, int to) {
method createDateInfo (line 617) | private static String createDateInfo(int second) {
method Bitmap2Bytes (line 628) | private static byte[] Bitmap2Bytes(Bitmap bm) {
method Bytes2Bimap (line 640) | private static Bitmap Bytes2Bimap(byte[] b) {
method drawable2Bitmap (line 650) | private static Bitmap drawable2Bitmap(Drawable drawable) {
method bitmap2Drawable (line 673) | @SuppressWarnings("deprecation")
class ACacheManager (line 687) | public class ACacheManager {
method ACacheManager (line 696) | private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {
method calculateCacheSizeAndCacheCount (line 708) | private void calculateCacheSizeAndCacheCount() {
method put (line 732) | private void put(File file) {
method get (line 761) | private File get(String key) {
method newFile (line 770) | private File newFile(String key) {
method remove (line 774) | private boolean remove(String key) {
method clear (line 779) | private void clear() {
method removeNext (line 798) | private long removeNext() {
method calculateSize (line 838) | private long calculateSize(File file) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/BatteryUtil.java
class BatteryUtil (line 8) | public class BatteryUtil {
method getLevel (line 10) | public static int getLevel(Context context) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/BitmapUtil.java
class BitmapUtil (line 25) | @SuppressWarnings({"unused", "WeakerAccess"})
method getFitSampleBitmap (line 29) | public static Bitmap getFitSampleBitmap(String file_path, int width, i...
method getFitInSampleSize (line 38) | public static int getFitInSampleSize(int reqWidth, int reqHeight, Bitm...
method ReadBitmapById (line 51) | public static Bitmap ReadBitmapById(Context context, int resId) {
method getBitmap (line 63) | public static Bitmap getBitmap(Bitmap bitmap, int screenWidth,
method scaleImage (line 83) | public static Bitmap scaleImage(byte[] buffer, float size) {
method convertToThumb (line 128) | public static Bitmap convertToThumb(byte[] buffer, float size) {
method readBitmap (line 164) | private static byte[] readBitmap(Bitmap bmp) {
method readBitmapFromBuffer (line 179) | public static byte[] readBitmapFromBuffer(byte[] buffer, float size) {
method decodeStream (line 186) | public static Bitmap decodeStream(Context context, Intent data, float ...
method scaleImage (line 218) | public static Bitmap scaleImage(Bitmap bm, int newWidth, int newHeight) {
method fitBitmap (line 239) | public static Bitmap fitBitmap(Bitmap target, int newWidth) {
method createRepeater (line 260) | public static Bitmap createRepeater(int width, int heigth, Bitmap src) {
method compressImage (line 278) | public static Bitmap compressImage(Bitmap image) {
method getImage (line 308) | public static Bitmap getImage(Bitmap image) {
method ReadBitmapById (line 354) | public static Bitmap ReadBitmapById(Context context, int drawableId,
method stackBlur (line 369) | public static Bitmap stackBlur(Bitmap srcBitmap) {
method addBitmap (line 395) | public static Bitmap addBitmap(Bitmap first, Bitmap second,int spacer_...
FILE: app/src/main/java/com/kunfei/bookshelf/utils/DensityUtil.java
class DensityUtil (line 14) | @SuppressWarnings({"unused", "WeakerAccess"})
method dp2px (line 19) | public static int dp2px(Context context, float dpVal) {
method sp2px (line 27) | public static int sp2px(Context context, float spVal) {
method px2dp (line 35) | public static float px2dp(Context context, float pxVal) {
method px2sp (line 43) | public static float px2sp(Context context, float pxVal) {
method getDisplayPoint (line 47) | public static Point getDisplayPoint(Context context) {
method getWindowWidth (line 67) | public static int getWindowWidth(Context context) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/DocumentUtil.java
class DocumentUtil (line 18) | @SuppressWarnings({"unused", "WeakerAccess"})
method isFileExist (line 23) | public static boolean isFileExist(Context context, String fileName, St...
method isFileExist (line 32) | public static boolean isFileExist(Context context, String fileName, Ur...
method isFileExist (line 41) | public static boolean isFileExist(String fileName, DocumentFile root, ...
method createDirIfNotExist (line 52) | public static DocumentFile createDirIfNotExist(Context context, String...
method createDirIfNotExist (line 61) | public static DocumentFile createDirIfNotExist(Context context, Uri ro...
method createDirIfNotExist (line 70) | public static DocumentFile createDirIfNotExist(@NonNull DocumentFile r...
method createFileIfNotExist (line 88) | public static DocumentFile createFileIfNotExist(Context context, Strin...
method createFileIfNotExist (line 97) | public static DocumentFile createFileIfNotExist(Context context, Strin...
method createFileIfNotExist (line 101) | public static DocumentFile createFileIfNotExist(Context context, Strin...
method createFileIfNotExist (line 110) | public static DocumentFile createFileIfNotExist(Context context, Strin...
method deleteFile (line 122) | public static boolean deleteFile(Context context, String fileName, Str...
method deleteFile (line 131) | public static boolean deleteFile(Context context, String fileName, Uri...
method deleteFile (line 140) | public static boolean deleteFile(String fileName, DocumentFile root, S...
method writeBytes (line 149) | public static boolean writeBytes(Context context, byte[] data, String ...
method writeBytes (line 157) | public static boolean writeBytes(Context context, byte[] data, String ...
method writeBytes (line 166) | public static boolean writeBytes(Context context, byte[] data, String ...
method writeBytes (line 175) | public static boolean writeBytes(Context context, byte[] data, Documen...
method writeBytes (line 179) | public static boolean writeBytes(Context context, byte[] data, Uri fil...
method writeFromInputStream (line 191) | public static boolean writeFromInputStream(Context context, InputStrea...
method writeFromInputStream (line 195) | public static boolean writeFromInputStream(Context context, InputStrea...
method readBytes (line 212) | public static byte[] readBytes(Context context, String fileName, Strin...
method readBytes (line 222) | public static byte[] readBytes(Context context, String fileName, Uri r...
method readBytes (line 233) | public static byte[] readBytes(Context context, String fileName, Docum...
method readBytes (line 244) | public static byte[] readBytes(Context context, DocumentFile file) {
method readBytes (line 250) | public static byte[] readBytes(Context context, Uri fileUri) {
method getDirDocument (line 264) | public static DocumentFile getDirDocument(Context context, String root...
method getDirDocument (line 273) | public static DocumentFile getDirDocument(Context context, Uri rootUri...
method getDirDocument (line 282) | public static DocumentFile getDirDocument(DocumentFile root, String......
method getFileOutputSteam (line 295) | public static OutputStream getFileOutputSteam(Context context, String ...
method getFileOutputSteam (line 305) | public static OutputStream getFileOutputSteam(Context context, String ...
method getFileOutputSteam (line 315) | public static OutputStream getFileOutputSteam(Context context, String ...
method getFileOutputSteam (line 325) | public static OutputStream getFileOutputSteam(Context context, Documen...
method getFileOutputSteam (line 329) | public static OutputStream getFileOutputSteam(Context context, Uri fil...
method getFileInputSteam (line 339) | public static InputStream getFileInputSteam(Context context, String fi...
method getFileInputSteam (line 349) | public static InputStream getFileInputSteam(Context context, String fi...
method getFileInputSteam (line 360) | public static InputStream getFileInputSteam(Context context, String fi...
method getFileInputSteam (line 370) | public static InputStream getFileInputSteam(Context context, DocumentF...
method getFileInputSteam (line 374) | public static InputStream getFileInputSteam(Context context, Uri fileU...
method filenameFilter (line 384) | public static String filenameFilter(String str) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/EncodingDetect.java
class EncodingDetect (line 37) | public class EncodingDetect {
method getEncodeInHtml (line 39) | public static String getEncodeInHtml(@NonNull byte[] bytes) {
method getJavaEncode (line 76) | public static String getJavaEncode(@NonNull byte[] bytes) {
method getJavaEncode (line 94) | public static String getJavaEncode(@NonNull String filePath) {
method getJavaEncode (line 113) | public static String getJavaEncode(@NonNull File file) {
class BytesEncodingDetect (line 128) | class BytesEncodingDetect extends Encoding {
method BytesEncodingDetect (line 150) | public BytesEncodingDetect() {
method detectEncoding (line 171) | public int detectEncoding(URL testurl) {
method detectEncoding (line 199) | public int detectEncoding(File testfile) {
method getFileBytes (line 204) | public static byte[] getFileBytes(File testfile) {
method detectEncoding (line 226) | public int detectEncoding(byte[] rawtext) {
method gb2312_probability (line 276) | private int gb2312_probability(byte[] rawtext) {
method gbk_probability (line 317) | private int gbk_probability(byte[] rawText) {
method gb18030_probability (line 376) | private int gb18030_probability(byte[] rawtext) {
method hz_probability (line 455) | private int hz_probability(byte[] rawtext) {
method big5_probability (line 516) | private int big5_probability(byte[] rawtext) {
method euc_tw_probability (line 557) | private int euc_tw_probability(byte[] rawtext) {
method iso_2022_cn_probability (line 608) | int iso_2022_cn_probability(byte[] rawtext) {
method utf8_probability (line 688) | int utf8_probability(byte[] rawtext) {
method utf16_probability (line 738) | int utf16_probability(byte[] rawtext) {
method ascii_probability (line 774) | int ascii_probability(byte[] rawtext) {
method euc_kr_probability (line 796) | int euc_kr_probability(byte[] rawtext) {
method cp949_probability (line 836) | int cp949_probability(byte[] rawtext) {
method iso_2022_kr_probability (line 877) | private int iso_2022_kr_probability(byte[] rawtext) {
method euc_jp_probability (line 895) | private int euc_jp_probability(byte[] rawtext) {
method iso_2022_jp_probability (line 930) | int iso_2022_jp_probability(byte[] rawtext) {
method sjis_probability (line 947) | int sjis_probability(byte[] rawtext) {
method initialize_frequencies (line 1006) | void initialize_frequencies() {
class Encoding (line 4691) | class Encoding {
method Encoding (line 4757) | public Encoding() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/FastXmlSerializer.java
class FastXmlSerializer (line 39) | public class FastXmlSerializer implements XmlSerializer {
method append (line 70) | private void append(char c) throws IOException {
method append (line 80) | private void append(String str, int i, final int length) throws IOExce...
method append (line 99) | private void append(char[] buf, int i, final int length) throws IOExce...
method append (line 118) | private void append(String str) throws IOException {
method appendIndent (line 122) | private void appendIndent(int indent) throws IOException {
method escapeAndAppendString (line 130) | private void escapeAndAppendString(final String string) throws IOExcep...
method escapeAndAppendString (line 148) | private void escapeAndAppendString(char[] buf, int start, int len) thr...
method attribute (line 166) | public XmlSerializer attribute(String namespace, String name, String v...
method cdsect (line 182) | public void cdsect(String text) throws IOException, IllegalArgumentExc...
method comment (line 187) | public void comment(String text) throws IOException, IllegalArgumentEx...
method docdecl (line 192) | public void docdecl(String text) throws IOException, IllegalArgumentEx...
method endDocument (line 197) | public void endDocument() throws IOException, IllegalArgumentException...
method endTag (line 201) | public XmlSerializer endTag(String namespace, String name) throws IOEx...
method entityRef (line 223) | public void entityRef(String text) throws IOException, IllegalArgument...
method flushBytes (line 228) | private void flushBytes() throws IOException {
method flush (line 237) | public void flush() throws IOException {
method getDepth (line 263) | public int getDepth() {
method getFeature (line 267) | public boolean getFeature(String name) {
method getName (line 271) | public String getName() {
method getNamespace (line 275) | public String getNamespace() {
method getPrefix (line 279) | public String getPrefix(String namespace, boolean generatePrefix)
method getProperty (line 284) | public Object getProperty(String name) {
method ignorableWhitespace (line 288) | public void ignorableWhitespace(String text) throws IOException, Illeg...
method processingInstruction (line 293) | public void processingInstruction(String text) throws IOException, Ill...
method setFeature (line 298) | public void setFeature(String name, boolean state) throws IllegalArgum...
method setOutput (line 307) | public void setOutput(OutputStream os, String encoding) throws IOExcep...
method setOutput (line 330) | public void setOutput(Writer writer) throws IOException, IllegalArgume...
method setPrefix (line 335) | public void setPrefix(String prefix, String namespace) throws IOExcept...
method setProperty (line 340) | public void setProperty(String name, Object value) throws IllegalArgum...
method startDocument (line 345) | public void startDocument(String encoding, Boolean standalone) throws ...
method startTag (line 352) | public XmlSerializer startTag(String namespace, String name) throws IO...
method text (line 372) | public XmlSerializer text(char[] buf, int start, int len) throws IOExc...
method text (line 385) | public XmlSerializer text(String text) throws IOException, IllegalArgu...
FILE: app/src/main/java/com/kunfei/bookshelf/utils/FileStack.java
class FileStack (line 10) | public class FileStack {
method push (line 15) | public void push(FileSnapshot fileSnapshot) {
method pop (line 24) | public FileSnapshot pop() {
method getSize (line 33) | public int getSize() {
class FileSnapshot (line 38) | public static class FileSnapshot {
class Node (line 45) | public class Node {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/GsonUtils.java
class GsonUtils (line 14) | @SuppressWarnings({"unused"})
method parseJObject (line 19) | public static <T> T parseJObject(String jsonData, Class<T> type) {
method parseJArray (line 35) | public static <T> List<T> parseJArray(String jsonData, Class<T> type) {
method toJsonWithSerializeNulls (line 63) | public static <T> String toJsonWithSerializeNulls(T entity) {
method toJsonArrayWithSerializeNulls (line 78) | public static <T> String toJsonArrayWithSerializeNulls(List<T> list) {
method toJsonArrayWithExpose (line 92) | public static <T> String toJsonArrayWithExpose(List<T> list) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/IOUtils.java
class IOUtils (line 12) | public class IOUtils {
method close (line 14) | public static void close(Closeable closeable) {
method toString (line 23) | public static String toString(InputStream inputStream) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/ListUtil.java
class ListUtil (line 6) | public class ListUtil {
method filter (line 8) | public static <T> List<T> filter(List<T> list, ListLook<T> hook) {
type ListLook (line 19) | public interface ListLook<T> {
method test (line 20) | boolean test(T t);
FILE: app/src/main/java/com/kunfei/bookshelf/utils/MD5Utils.java
class MD5Utils (line 14) | public class MD5Utils {
method strToMd5By32 (line 16) | public static String strToMd5By32(String str) {
method strToMd5By16 (line 36) | public static String strToMd5By16(String str) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/MarkdownUtils.java
class MarkdownUtils (line 10) | public class MarkdownUtils {
method simpleMarkdownConverter (line 12) | @SuppressWarnings("deprecation")
method setText (line 52) | public static void setText(TextView view, String text) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/MeUtils.java
class MeUtils (line 15) | public class MeUtils {
method getAssetsFileList (line 18) | public static CharSequence[] getAssetsFileList(AssetManager am, String...
method getFileName (line 29) | public static String getFileName(String pathandname){
method getOriginalFundData (line 36) | public static String getOriginalFundData(AssetManager am, String filen...
method convertStreamToString (line 48) | public static String convertStreamToString(InputStream is) {
method getFitAssetsSampleBitmap (line 61) | public static Bitmap getFitAssetsSampleBitmap(AssetManager am, String ...
method getFitInSampleSize (line 84) | public static int getFitInSampleSize(int reqWidth, int reqHeight, Bitm...
FILE: app/src/main/java/com/kunfei/bookshelf/utils/NetworkUtils.java
class NetworkUtils (line 27) | public class NetworkUtils {
method getErrorTip (line 42) | public static String getErrorTip(int code) {
method isNetWorkAvailable (line 46) | public static boolean isNetWorkAvailable() {
method getUrl (line 71) | public static String getUrl(Response response) {
method getAbsoluteURL (line 83) | public static String getAbsoluteURL(String baseURL, String relativePat...
method getAbsoluteURL (line 105) | public static String getAbsoluteURL(URL baseURL, String relativePath) {
method isUrl (line 125) | public static boolean isUrl(String urlStr) {
method isIPv4Address (line 143) | public static boolean isIPv4Address(String input) {
method getLocalIPAddress (line 150) | public static InetAddress getLocalIPAddress() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/ReadAssets.java
class ReadAssets (line 9) | public class ReadAssets {
method getText (line 11) | @SuppressWarnings("ResultOfMethodCallIgnored")
FILE: app/src/main/java/com/kunfei/bookshelf/utils/RxUtils.java
class RxUtils (line 17) | public class RxUtils {
method toSimpleSingle (line 19) | public static <T> SingleSource<T> toSimpleSingle(Single<T> upstream) {
method toSimpleSingle (line 24) | @NonNull
method twoTuple (line 30) | public static <T, R> TwoTuple<T, R> twoTuple(T first, R second) {
class TwoTuple (line 34) | public static class TwoTuple<A, B> {
method TwoTuple (line 38) | public TwoTuple(A a, B b) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/ScreenUtils.java
class ScreenUtils (line 17) | @SuppressWarnings({"unused", "WeakerAccess"})
method dpToPx (line 20) | public static int dpToPx(int dp) {
method pxToDp (line 25) | public static int pxToDp(int px) {
method spToPx (line 30) | public static int spToPx(int sp) {
method pxToSp (line 35) | public static int pxToSp(int px) {
method getAppSize (line 45) | public static int[] getAppSize() {
method getScreenSize (line 60) | public static int[] getScreenSize(AppCompatActivity activity) {
method getStatusBarHeight (line 71) | public static int getStatusBarHeight() {
method getNavigationBarHeight (line 80) | public static int getNavigationBarHeight() {
method hasNavigationBar (line 95) | @SuppressWarnings("unchecked")
method getDisplayMetrics (line 117) | public static DisplayMetrics getDisplayMetrics() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/Selector.java
class Selector (line 17) | public class Selector {
method shapeBuild (line 18) | public static ShapeSelector shapeBuild() {
method colorBuild (line 22) | public static ColorSelector colorBuild() {
method drawableBuild (line 26) | public static DrawableSelector drawableBuild() {
class ShapeSelector (line 36) | public static final class ShapeSelector {
method ShapeSelector (line 70) | public ShapeSelector() {
method setShape (line 87) | public ShapeSelector setShape(@Shape int shape) {
method setDefaultBgColor (line 92) | public ShapeSelector setDefaultBgColor(@ColorInt int color) {
method setDisabledBgColor (line 105) | public ShapeSelector setDisabledBgColor(@ColorInt int color) {
method setPressedBgColor (line 111) | public ShapeSelector setPressedBgColor(@ColorInt int color) {
method setSelectedBgColor (line 117) | public ShapeSelector setSelectedBgColor(@ColorInt int color) {
method setFocusedBgColor (line 123) | public ShapeSelector setFocusedBgColor(@ColorInt int color) {
method setCheckedBgColor (line 129) | public ShapeSelector setCheckedBgColor(@ColorInt int color) {
method setStrokeWidth (line 135) | public ShapeSelector setStrokeWidth(@Dimension int width) {
method setDefaultStrokeColor (line 140) | public ShapeSelector setDefaultStrokeColor(@ColorInt int color) {
method setDisabledStrokeColor (line 153) | public ShapeSelector setDisabledStrokeColor(@ColorInt int color) {
method setPressedStrokeColor (line 159) | public ShapeSelector setPressedStrokeColor(@ColorInt int color) {
method setSelectedStrokeColor (line 165) | public ShapeSelector setSelectedStrokeColor(@ColorInt int color) {
method setCheckedStrokeColor (line 171) | public ShapeSelector setCheckedStrokeColor(@ColorInt int color) {
method setFocusedStrokeColor (line 177) | public ShapeSelector setFocusedStrokeColor(@ColorInt int color) {
method setCornerRadius (line 183) | public ShapeSelector setCornerRadius(@Dimension int radius) {
method create (line 188) | public StateListDrawable create() {
method getItemShape (line 234) | private GradientDrawable getItemShape(int shape, int cornerRadius,
class DrawableSelector (line 251) | public static final class DrawableSelector {
method DrawableSelector (line 264) | private DrawableSelector() {
method setDefaultDrawable (line 268) | public DrawableSelector setDefaultDrawable(Drawable drawable) {
method setDisabledDrawable (line 281) | public DrawableSelector setDisabledDrawable(Drawable drawable) {
method setPressedDrawable (line 287) | public DrawableSelector setPressedDrawable(Drawable drawable) {
method setSelectedDrawable (line 293) | public DrawableSelector setSelectedDrawable(Drawable drawable) {
method setFocusedDrawable (line 299) | public DrawableSelector setFocusedDrawable(Drawable drawable) {
method create (line 305) | public StateListDrawable create() {
method setDefaultDrawable (line 319) | public DrawableSelector setDefaultDrawable(Context context, @Drawabl...
method setDisabledDrawable (line 323) | public DrawableSelector setDisabledDrawable(Context context, @Drawab...
method setPressedDrawable (line 327) | public DrawableSelector setPressedDrawable(Context context, @Drawabl...
method setSelectedDrawable (line 331) | public DrawableSelector setSelectedDrawable(Context context, @Drawab...
method setFocusedDrawable (line 335) | public DrawableSelector setFocusedDrawable(Context context, @Drawabl...
class ColorSelector (line 346) | public static final class ColorSelector {
method ColorSelector (line 361) | private ColorSelector() {
method setDefaultColor (line 369) | public ColorSelector setDefaultColor(@ColorInt int color) {
method setDisabledColor (line 382) | public ColorSelector setDisabledColor(@ColorInt int color) {
method setPressedColor (line 388) | public ColorSelector setPressedColor(@ColorInt int color) {
method setSelectedColor (line 394) | public ColorSelector setSelectedColor(@ColorInt int color) {
method setFocusedColor (line 400) | public ColorSelector setFocusedColor(@ColorInt int color) {
method setCheckedColor (line 406) | public ColorSelector setCheckedColor(@ColorInt int color) {
method create (line 412) | public ColorStateList create() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/SoftInputUtil.java
class SoftInputUtil (line 14) | public class SoftInputUtil {
method hideIMM (line 17) | public static void hideIMM(View view) {
method resetBoxPosition (line 24) | public static void resetBoxPosition(Activity activity, View prentView,...
method getScreenHeight (line 44) | public static int getScreenHeight(Activity activity) {
method getScreenWidth (line 51) | public static int getScreenWidth(Activity activity) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/StringJoiner.java
class StringJoiner (line 7) | public class StringJoiner {
method StringJoiner (line 21) | public StringJoiner(CharSequence delimiter) {
method StringJoiner (line 25) | public StringJoiner(CharSequence delimiter,
method add (line 39) | public StringJoiner add(CharSequence newElement) {
method prepareBuilder (line 45) | private StringBuilder prepareBuilder() {
method toString (line 58) | @NonNull
FILE: app/src/main/java/com/kunfei/bookshelf/utils/StringUtils.java
class StringUtils (line 30) | @SuppressWarnings({"unused", "WeakerAccess"})
method dateConvert (line 39) | public static String dateConvert(long time, String pattern) {
method dateConvert (line 46) | public static String dateConvert(String source, String pattern) {
method toFirstCapital (line 90) | public static String toFirstCapital(String str) {
method getString (line 94) | public static String getString(@StringRes int id) {
method getString (line 98) | public static String getString(@StringRes int id, Object... formatArgs) {
method halfToFull (line 105) | public static String halfToFull(String input) {
method fullToHalf (line 124) | public static String fullToHalf(String input) {
method getChnMap (line 139) | private static HashMap<Character, Integer> getChnMap() {
method chineseNumToInt (line 161) | @SuppressWarnings("ConstantConditions")
method stringToInt (line 209) | public static int stringToInt(String str) {
method base64Decode (line 221) | public static String base64Decode(String str) {
method escape (line 230) | public static String escape(String src) {
method isJsonType (line 253) | public static boolean isJsonType(String str) {
method isCompressJsonType (line 266) | public static boolean isCompressJsonType(String str) {
method unCompressJson (line 275) | public static String unCompressJson(String str) {
method isJsonObject (line 297) | public static boolean isJsonObject(String text) {
method isJsonArray (line 308) | public static boolean isJsonArray(String text) {
method isTrimEmpty (line 319) | public static boolean isTrimEmpty(String text) {
method startWithIgnoreCase (line 325) | public static boolean startWithIgnoreCase(String src, String obj) {
method endWithIgnoreCase (line 331) | public static boolean endWithIgnoreCase(String src, String obj) {
method isContainNumber (line 337) | public static boolean isContainNumber(String company) {
method isNumeric (line 343) | public static boolean isNumeric(String str) {
method getBaseUrl (line 349) | public static String getBaseUrl(String url) {
method trim (line 359) | public static String trim(String s) {
method repeat (line 373) | public static String repeat(String str, int n) {
method removeUTFCharacters (line 381) | public static String removeUTFCharacters(String data) {
method formatHtml (line 394) | public static String formatHtml(String html) {
method formatHtml2Intor (line 404) | public static String formatHtml2Intor(String html) {
method zipString (line 416) | public static String zipString(String unzipString) {
method unzipString (line 469) | public static String unzipString(String zipString) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/SystemUtil.java
class SystemUtil (line 13) | public class SystemUtil {
method getScreenOffTime (line 15) | public static int getScreenOffTime(Context context) {
method ignoreBatteryOptimization (line 26) | public static void ignoreBatteryOptimization(Activity activity) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/TimeUtils.java
class TimeUtils (line 14) | @SuppressWarnings({"unused", "WeakerAccess"})
method getDefaultFormat (line 19) | private static SimpleDateFormat getDefaultFormat() {
method TimeUtils (line 28) | private TimeUtils() {
method millis2String (line 39) | public static String millis2String(final long millis) {
method millis2String (line 50) | public static String millis2String(final long millis, @NonNull final D...
method string2Millis (line 61) | public static long string2Millis(final String time) {
method string2Millis (line 72) | public static long string2Millis(final String time, @NonNull final Dat...
method string2Date (line 88) | public static Date string2Date(final String time) {
method string2Date (line 99) | public static Date string2Date(final String time, @NonNull final DateF...
method date2String (line 115) | public static String date2String(final Date date) {
method date2String (line 126) | public static String date2String(final Date date, @NonNull final DateF...
method date2Millis (line 136) | public static long date2Millis(final Date date) {
method millis2Date (line 146) | public static Date millis2Date(final long millis) {
method getTimeSpan (line 166) | public static long getTimeSpan(final String time1,
method getTimeSpan (line 188) | public static long getTimeSpan(final String time1,
method getTimeSpan (line 210) | public static long getTimeSpan(final Date date1,
method getTimeSpan (line 231) | public static long getTimeSpan(final long millis1,
method getFitTimeSpan (line 254) | public static String getFitTimeSpan(final String time1,
method getFitTimeSpan (line 278) | public static String getFitTimeSpan(final String time1,
method getFitTimeSpan (line 302) | public static String getFitTimeSpan(final Date date1, final Date date2...
method getFitTimeSpan (line 322) | public static String getFitTimeSpan(final long millis1,
method getNowMills (line 333) | public static long getNowMills() {
method getNowString (line 343) | public static String getNowString() {
method getNowString (line 353) | public static String getNowString(@NonNull final DateFormat format) {
method getNowDate (line 362) | public static Date getNowDate() {
method getTimeSpanByNow (line 381) | public static long getTimeSpanByNow(final String time, @TimeConstants....
method getTimeSpanByNow (line 400) | public static long getTimeSpanByNow(final String time,
method getTimeSpanByNow (line 420) | public static long getTimeSpanByNow(final Date date, @TimeConstants.Un...
method getTimeSpanByNow (line 438) | public static long getTimeSpanByNow(final long millis, @TimeConstants....
method getFitTimeSpanByNow (line 458) | public static String getFitTimeSpanByNow(final String time, final int ...
method getFitTimeSpanByNow (line 478) | public static String getFitTimeSpanByNow(final String time,
method getFitTimeSpanByNow (line 499) | public static String getFitTimeSpanByNow(final Date date, final int pr...
method getFitTimeSpanByNow (line 518) | public static String getFitTimeSpanByNow(final long millis, final int ...
method getFriendlyTimeSpanByNow (line 538) | public static String getFriendlyTimeSpanByNow(final String time) {
method getFriendlyTimeSpanByNow (line 558) | public static String getFriendlyTimeSpanByNow(final String time,
method getFriendlyTimeSpanByNow (line 578) | public static String getFriendlyTimeSpanByNow(final Date date) {
method getFriendlyTimeSpanByNow (line 597) | public static String getFriendlyTimeSpanByNow(final long millis) {
method getWeeOfToday (line 621) | private static long getWeeOfToday() {
method getMillis (line 645) | public static long getMillis(final long millis,
method getMillis (line 667) | public static long getMillis(final String time,
method getMillis (line 689) | public static long getMillis(final String time,
method getMillis (line 711) | public static long getMillis(final Date date,
method getString (line 733) | public static String getString(final long millis,
method getString (line 755) | public static String getString(final long millis,
method getString (line 778) | public static String getString(final String time,
method getString (line 800) | public static String getString(final String time,
method getString (line 823) | public static String getString(final Date date,
method getString (line 845) | public static String getString(final Date date,
method getDate (line 867) | public static Date getDate(final long millis,
method getDate (line 889) | public static Date getDate(final String time,
method getDate (line 911) | public static Date getDate(final String time,
method getDate (line 933) | public static Date getDate(final Date date,
method getMillisByNow (line 953) | public static long getMillisByNow(final long timeSpan, @TimeConstants....
method getStringByNow (line 972) | public static String getStringByNow(final long timeSpan, @TimeConstant...
method getStringByNow (line 991) | public static String getStringByNow(final long timeSpan,
method getDateByNow (line 1011) | public static Date getDateByNow(final long timeSpan, @TimeConstants.Un...
method isToday (line 1022) | public static boolean isToday(final String time) {
method isToday (line 1033) | public static boolean isToday(final String time, @NonNull final DateFo...
method isToday (line 1043) | public static boolean isToday(final Date date) {
method isToday (line 1053) | public static boolean isToday(final long millis) {
method isLeapYear (line 1065) | public static boolean isLeapYear(final String time) {
method isLeapYear (line 1076) | public static boolean isLeapYear(final String time, @NonNull final Dat...
method isLeapYear (line 1086) | public static boolean isLeapYear(final Date date) {
method isLeapYear (line 1099) | public static boolean isLeapYear(final long millis) {
method isLeapYear (line 1109) | public static boolean isLeapYear(final int year) {
method getChineseWeek (line 1120) | public static String getChineseWeek(final String time) {
method getChineseWeek (line 1131) | public static String getChineseWeek(final String time, @NonNull final ...
method getChineseWeek (line 1141) | public static String getChineseWeek(final Date date) {
method getChineseWeek (line 1151) | public static String getChineseWeek(final long millis) {
method getUSWeek (line 1162) | public static String getUSWeek(final String time) {
method getUSWeek (line 1173) | public static String getUSWeek(final String time, @NonNull final DateF...
method getUSWeek (line 1183) | public static String getUSWeek(final Date date) {
method getUSWeek (line 1193) | public static String getUSWeek(final long millis) {
method getValueByCalendarField (line 1212) | public static int getValueByCalendarField(final String time, final int...
method getValueByCalendarField (line 1231) | public static int getValueByCalendarField(final String time,
method getValueByCalendarField (line 1251) | public static int getValueByCalendarField(final Date date, final int f...
method getValueByCalendarField (line 1271) | public static int getValueByCalendarField(final long millis, final int...
method getChineseZodiac (line 1287) | public static String getChineseZodiac(final String time) {
method getChineseZodiac (line 1298) | public static String getChineseZodiac(final String time, @NonNull fina...
method getChineseZodiac (line 1308) | public static String getChineseZodiac(final Date date) {
method getChineseZodiac (line 1320) | public static String getChineseZodiac(final long millis) {
method getChineseZodiac (line 1330) | public static String getChineseZodiac(final int year) {
method getZodiac (line 1347) | public static String getZodiac(final String time) {
method getZodiac (line 1358) | public static String getZodiac(final String time, @NonNull final DateF...
method getZodiac (line 1368) | public static String getZodiac(final Date date) {
method getZodiac (line 1382) | public static String getZodiac(final long millis) {
method getZodiac (line 1393) | public static String getZodiac(final int month, final int day) {
method timeSpan2Millis (line 1399) | private static long timeSpan2Millis(final long timeSpan, @TimeConstant...
method millis2TimeSpan (line 1403) | private static long millis2TimeSpan(final long millis, @TimeConstants....
method millis2FitTimeSpan (line 1407) | private static String millis2FitTimeSpan(long millis, int precision) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/UrlEncoderUtils.java
class UrlEncoderUtils (line 11) | public class UrlEncoderUtils {
method hasUrlEncoded (line 50) | public static boolean hasUrlEncoded(String str) {
method isDigit16Char (line 76) | private static boolean isDigit16Char(char c) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/XmlUtils.java
class XmlUtils (line 41) | @SuppressWarnings({"unused", "WeakerAccess"})
method skipCurrentTag (line 44) | public static void skipCurrentTag(XmlPullParser parser)
method convertValueToList (line 54) | public static int convertValueToList(CharSequence value, String[] opti...
method convertValueToBoolean (line 65) | public static boolean convertValueToBoolean(CharSequence value, boolea...
method convertValueToInt (line 79) | public static int convertValueToInt(CharSequence charSeq, int defaultV...
method convertValueToUnsignedInt (line 121) | public static int convertValueToUnsignedInt(String value, int defaultV...
method parseUnsignedIntAttribute (line 129) | public static int parseUnsignedIntAttribute(CharSequence charSeq) {
method writeMapXml (line 170) | public static void writeMapXml(Map val, OutputStream out)
method writeListXml (line 191) | public static void writeListXml(List val, OutputStream out)
method writeMapXml (line 214) | public static void writeMapXml(Map val, String name, XmlSerializer out)
method writeMapXml (line 234) | public static void writeMapXml(Map val, String name, XmlSerializer out,
method writeMapXml (line 266) | public static void writeMapXml(Map val, XmlSerializer out,
method writeListXml (line 293) | public static void writeListXml(List val, String name, XmlSerializer out)
method writeSetXml (line 316) | public static void writeSetXml(Set val, String name, XmlSerializer out)
method writeByteArrayXml (line 347) | public static void writeByteArrayXml(byte[] val, String name,
method writeIntArrayXml (line 390) | public static void writeIntArrayXml(int[] val, String name,
method writeLongArrayXml (line 429) | public static void writeLongArrayXml(long[] val, String name, XmlSeria...
method writeDoubleArrayXml (line 467) | public static void writeDoubleArrayXml(double[] val, String name, XmlS...
method writeStringArrayXml (line 505) | public static void writeStringArrayXml(String[] val, String name, XmlS...
method writeValueXml (line 546) | public static void writeValueXml(Object v, String name, XmlSerializer ...
method writeValueXml (line 567) | private static void writeValueXml(Object v, String name, XmlSerializer...
method readMapXml (line 656) | @SuppressWarnings("unchecked")
method readListXml (line 675) | public static ArrayList readListXml(InputStream in)
method readSetXml (line 695) | public static HashSet readSetXml(InputStream in)
method readThisMapXml (line 714) | public static HashMap<String, ?> readThisMapXml(XmlPullParser parser, ...
method readThisMapXml (line 732) | public static HashMap<String, ?> readThisMapXml(XmlPullParser parser, ...
method readThisListXml (line 768) | public static ArrayList readThisListXml(XmlPullParser parser, String e...
method readThisListXml (line 785) | private static ArrayList<Object> readThisListXml(XmlPullParser parser,...
method readThisSetXml (line 824) | public static HashSet readThisSetXml(XmlPullParser parser, String endT...
method readThisSetXml (line 844) | private static HashSet<Object> readThisSetXml(XmlPullParser parser, St...
method readThisIntArrayXml (line 880) | public static int[] readThisIntArrayXml(XmlPullParser parser,
method readThisLongArrayXml (line 947) | public static long[] readThisLongArrayXml(XmlPullParser parser,
method readThisDoubleArrayXml (line 1006) | public static double[] readThisDoubleArrayXml(XmlPullParser parser, St...
method readThisStringArrayXml (line 1064) | public static String[] readThisStringArrayXml(XmlPullParser parser, St...
method readValueXml (line 1124) | public static Object readValueXml(XmlPullParser parser, String[] name)
method readThisValueXml (line 1144) | private static Object readThisValueXml(XmlPullParser parser, String[] ...
method readThisPrimitiveValueXml (line 1247) | private static Object readThisPrimitiveValueXml(XmlPullParser parser, ...
method beginDocument (line 1272) | public static void beginDocument(XmlPullParser parser, String firstEle...
method nextElement (line 1288) | public static void nextElement(XmlPullParser parser) throws XmlPullPar...
method nextElementWithin (line 1295) | public static boolean nextElementWithin(XmlPullParser parser, int oute...
method readIntAttribute (line 1310) | public static int readIntAttribute(XmlPullParser in, String name, int ...
method readIntAttribute (line 1319) | public static int readIntAttribute(XmlPullParser in, String name) thro...
method writeIntAttribute (line 1328) | public static void writeIntAttribute(XmlSerializer out, String name, i...
method readLongAttribute (line 1333) | public static long readLongAttribute(XmlPullParser in, String name, lo...
method readLongAttribute (line 1342) | public static long readLongAttribute(XmlPullParser in, String name) th...
method writeLongAttribute (line 1351) | public static void writeLongAttribute(XmlSerializer out, String name, ...
method readFloatAttribute (line 1356) | public static float readFloatAttribute(XmlPullParser in, String name) ...
method writeFloatAttribute (line 1365) | public static void writeFloatAttribute(XmlSerializer out, String name,...
method readBooleanAttribute (line 1370) | public static boolean readBooleanAttribute(XmlPullParser in, String na...
method readBooleanAttribute (line 1375) | public static boolean readBooleanAttribute(XmlPullParser in, String name,
method writeBooleanAttribute (line 1385) | public static void writeBooleanAttribute(XmlSerializer out, String nam...
method readUriAttribute (line 1390) | public static Uri readUriAttribute(XmlPullParser in, String name) {
method writeUriAttribute (line 1395) | public static void writeUriAttribute(XmlSerializer out, String name, U...
method readStringAttribute (line 1402) | public static String readStringAttribute(XmlPullParser in, String name) {
method writeStringAttribute (line 1406) | public static void writeStringAttribute(XmlSerializer out, String name...
method readByteArrayAttribute (line 1413) | public static byte[] readByteArrayAttribute(XmlPullParser in, String n...
method writeByteArrayAttribute (line 1422) | public static void writeByteArrayAttribute(XmlSerializer out, String n...
method readBitmapAttribute (line 1429) | public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
method writeBitmapAttribute (line 1438) | @Deprecated
type WriteMapCallback (line 1451) | public interface WriteMapCallback {
method writeUnknownObject (line 1464) | void writeUnknownObject(Object v, String name, XmlSerializer out)
type ReadMapCallback (line 1471) | public interface ReadMapCallback {
method readThisUnknownObjectXml (line 1483) | Object readThisUnknownObjectXml(XmlPullParser in, String tag)
FILE: app/src/main/java/com/kunfei/bookshelf/utils/ZipUtils.java
class ZipUtils (line 29) | @SuppressWarnings({"unused", "WeakerAccess"})
method ZipUtils (line 34) | private ZipUtils() {
method zipFiles (line 46) | public static boolean zipFiles(final Collection<String> srcFiles,
method zipFiles (line 61) | public static boolean zipFiles(final Collection<String> srcFilePaths,
method zipFiles (line 89) | public static boolean zipFiles(final Collection<File> srcFiles, final ...
method zipFiles (line 103) | public static boolean zipFiles(final Collection<File> srcFiles,
method zipFile (line 131) | public static boolean zipFile(final String srcFilePath,
method zipFile (line 146) | public static boolean zipFile(final String srcFilePath,
method zipFile (line 161) | public static boolean zipFile(final File srcFile,
method zipFile (line 176) | public static boolean zipFile(final File srcFile,
method zipFile (line 186) | private static boolean zipFile(final File srcFile,
method unzipFile (line 228) | public static List<File> unzipFile(final String zipFilePath, final Str...
method unzipFile (line 240) | public static List<File> unzipFile(final File zipFile,
method unzipFileByKeyword (line 255) | public static List<File> unzipFileByKeyword(final String zipFilePath,
method unzipFileByKeyword (line 270) | public static List<File> unzipFileByKeyword(final File zipFile,
method unzipChildFile (line 307) | private static boolean unzipChildFile(final File destDir,
method getFilesPath (line 336) | public static List<String> getFilesPath(final String zipFilePath)
method getFilesPath (line 348) | public static List<String> getFilesPath(final File zipFile)
method getComments (line 374) | public static List<String> getComments(final String zipFilePath)
method getComments (line 386) | public static List<String> getComments(final File zipFile)
method createOrExistsDir (line 400) | private static boolean createOrExistsDir(final File file) {
method createOrExistsFile (line 404) | private static boolean createOrExistsFile(final File file) {
method getFileByPath (line 416) | private static File getFileByPath(final String filePath) {
method isSpace (line 420) | private static boolean isSpace(final String s) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/download/DownloadUtils.java
class DownloadUtils (line 20) | public class DownloadUtils {
method DownloadUtils (line 26) | public DownloadUtils(String baseUrl, JsDownloadListener listener) {
method download (line 45) | public void download(@NonNull String url, final File file, Observer<In...
method writeFile (line 60) | private void writeFile(InputStream inputString, File file) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/download/JsDownloadInterceptor.java
class JsDownloadInterceptor (line 8) | public class JsDownloadInterceptor implements Interceptor {
method JsDownloadInterceptor (line 11) | public JsDownloadInterceptor(JsDownloadListener downloadListener) {
method intercept (line 15) | @Override
FILE: app/src/main/java/com/kunfei/bookshelf/utils/download/JsDownloadListener.java
type JsDownloadListener (line 3) | public interface JsDownloadListener {
method onStartDownload (line 4) | void onStartDownload(long length);
method onProgress (line 6) | void onProgress(int progress);
method onFail (line 8) | void onFail(String errorInfo);
FILE: app/src/main/java/com/kunfei/bookshelf/utils/download/JsResponseBody.java
class JsResponseBody (line 13) | public class JsResponseBody extends ResponseBody {
method JsResponseBody (line 19) | public JsResponseBody(ResponseBody responseBody, JsDownloadListener do...
method contentType (line 25) | @Override
method contentLength (line 30) | @Override
method source (line 35) | @Override
method source (line 43) | private Source source(Source source) {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/download/Service.java
type Service (line 9) | public interface Service {
method download (line 10) | @Streaming
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/ATH.java
class ATH (line 23) | public final class ATH {
method didThemeValuesChange (line 25) | @SuppressLint("CommitPrefEdits")
method setStatusbarColorAuto (line 30) | public static void setStatusbarColorAuto(Activity activity) {
method setStatusbarColor (line 34) | public static void setStatusbarColor(Activity activity, int color) {
method setLightStatusbarAuto (line 41) | public static void setLightStatusbarAuto(Activity activity, int bgColo...
method setLightStatusbar (line 45) | public static void setLightStatusbar(Activity activity, boolean enable...
method setLightNavigationbar (line 57) | public static void setLightNavigationbar(Activity activity, boolean en...
method setLightNavigationbarAuto (line 70) | public static void setLightNavigationbarAuto(Activity activity, int bg...
method setNavigationbarColorAuto (line 74) | public static void setNavigationbarColorAuto(Activity activity) {
method setNavigationbarColor (line 78) | public static void setNavigationbarColor(Activity activity, int color) {
method setTaskDescriptionColorAuto (line 85) | public static void setTaskDescriptionColorAuto(@NonNull Activity activ...
method setTaskDescriptionColor (line 89) | public static void setTaskDescriptionColor(@NonNull Activity activity,...
method setTint (line 98) | public static void setTint(@NonNull View view, @ColorInt int color) {
method setBackgroundTint (line 102) | public static void setBackgroundTint(@NonNull View view, @ColorInt int...
method setAlertDialogTint (line 106) | public static AlertDialog setAlertDialogTint(@NonNull AlertDialog dial...
method ATH (line 120) | private ATH() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/ATHUtil.java
class ATHUtil (line 13) | public final class ATHUtil {
method isWindowBackgroundDark (line 15) | public static boolean isWindowBackgroundDark(Context context) {
method resolveColor (line 19) | public static int resolveColor(Context context, @AttrRes int attr) {
method resolveColor (line 23) | public static int resolveColor(Context context, @AttrRes int attr, int...
method ATHUtil (line 32) | private ATHUtil() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/MaterialValueHelper.java
class MaterialValueHelper (line 14) | public final class MaterialValueHelper {
method getPrimaryTextColor (line 16) | @SuppressLint("PrivateResource")
method getSecondaryTextColor (line 25) | @SuppressLint("PrivateResource")
method getPrimaryDisabledTextColor (line 34) | @SuppressLint("PrivateResource")
method getSecondaryDisabledTextColor (line 43) | @SuppressLint("PrivateResource")
method MaterialValueHelper (line 52) | private MaterialValueHelper() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/NavigationViewUtil.java
class NavigationViewUtil (line 14) | public final class NavigationViewUtil {
method setItemIconColors (line 16) | public static void setItemIconColors(@NonNull NavigationView navigatio...
method setItemTextColors (line 29) | public static void setItemTextColors(@NonNull NavigationView navigatio...
method disableScrollbar (line 47) | public static void disableScrollbar(NavigationView navigationView) {
method NavigationViewUtil (line 56) | private NavigationViewUtil() {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/ThemeStore.java
class ThemeStore (line 22) | public final class ThemeStore implements ThemeStorePrefKeys, ThemeStoreI...
method editTheme (line 27) | public static ThemeStore editTheme(@NonNull Context context) {
method ThemeStore (line 31) | @SuppressLint("CommitPrefEdits")
method primaryColor (line 38) | @Override
method primaryColorRes (line 46) | @Override
method primaryColorAttr (line 51) | @Override
method primaryColorDark (line 56) | @Override
method primaryColorDarkRes (line 62) | @Override
method primaryColorDarkAttr (line 67) | @Override
method accentColor (line 72) | @Override
method accentColorRes (line 78) | @Override
method accentColorAttr (line 83) | @Override
method statusBarColor (line 88) | @Override
method statusBarColorRes (line 94) | @Override
method statusBarColorAttr (line 99) | @Override
method navigationBarColor (line 104) | @Override
method navigationBarColorRes (line 110) | @Override
method navigationBarColorAttr (line 115) | @Override
method textColorPrimary (line 120) | @Override
method textColorPrimaryRes (line 126) | @Override
method textColorPrimaryAttr (line 131) | @Override
method textColorPrimaryInverse (line 136) | @Override
method textColorPrimaryInverseRes (line 142) | @Override
method textColorPrimaryInverseAttr (line 147) | @Override
method textColorSecondary (line 152) | @Override
method textColorSecondaryRes (line 158) | @Override
method textColorSecondaryAttr (line 163) | @Override
method textColorSecondaryInverse (line 168) | @Override
method textColorSecondaryInverseRes (line 174) | @Override
method textColorSecondaryInverseAttr (line 179) | @Override
method backgroundColor (line 184) | @Override
method coloredStatusBar (line 190) | @Override
method coloredNavigationBar (line 196) | @Override
method autoGeneratePrimaryDark (line 202) | @Override
method apply (line 210) | @SuppressWarnings("unchecked")
method prefs (line 220) | @CheckResult
method markChanged (line 226) | public static void markChanged(@NonNull Context context) {
method primaryColor (line 230) | @CheckResult
method primaryColorDark (line 236) | @CheckResult
method accentColor (line 242) | @CheckResult
method statusBarColor (line 248) | @CheckResult
method navigationBarColor (line 257) | @CheckResult
method textColorPrimary (line 266) | @CheckResult
method textColorPrimaryInverse (line 272) | @CheckResult
method textColorSecondary (line 278) | @CheckResult
method textColorSecondaryInverse (line 284) | @CheckResult
method backgroundColor (line 290) | @CheckResult
method coloredStatusBar (line 296) | @CheckResult
method coloredNavigationBar (line 301) | @CheckResult
method autoGeneratePrimaryDark (line 306) | @CheckResult
method isConfigured (line 311) | @CheckResult
method isConfigured (line 316) | @SuppressLint("CommitPrefEdits")
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/ThemeStoreInterface.java
type ThemeStoreInterface (line 11) | interface ThemeStoreInterface {
method primaryColor (line 15) | ThemeStore primaryColor(@ColorInt int color);
method primaryColorRes (line 17) | ThemeStore primaryColorRes(@ColorRes int colorRes);
method primaryColorAttr (line 19) | ThemeStore primaryColorAttr(@AttrRes int colorAttr);
method autoGeneratePrimaryDark (line 21) | ThemeStore autoGeneratePrimaryDark(boolean autoGenerate);
method primaryColorDark (line 23) | ThemeStore primaryColorDark(@ColorInt int color);
method primaryColorDarkRes (line 25) | ThemeStore primaryColorDarkRes(@ColorRes int colorRes);
method primaryColorDarkAttr (line 27) | ThemeStore primaryColorDarkAttr(@AttrRes int colorAttr);
method accentColor (line 31) | ThemeStore accentColor(@ColorInt int color);
method accentColorRes (line 33) | ThemeStore accentColorRes(@ColorRes int colorRes);
method accentColorAttr (line 35) | ThemeStore accentColorAttr(@AttrRes int colorAttr);
method statusBarColor (line 39) | ThemeStore statusBarColor(@ColorInt int color);
method statusBarColorRes (line 41) | ThemeStore statusBarColorRes(@ColorRes int colorRes);
method statusBarColorAttr (line 43) | ThemeStore statusBarColorAttr(@AttrRes int colorAttr);
method navigationBarColor (line 47) | ThemeStore navigationBarColor(@ColorInt int color);
method navigationBarColorRes (line 49) | ThemeStore navigationBarColorRes(@ColorRes int colorRes);
method navigationBarColorAttr (line 51) | ThemeStore navigationBarColorAttr(@AttrRes int colorAttr);
method textColorPrimary (line 55) | ThemeStore textColorPrimary(@ColorInt int color);
method textColorPrimaryRes (line 57) | ThemeStore textColorPrimaryRes(@ColorRes int colorRes);
method textColorPrimaryAttr (line 59) | ThemeStore textColorPrimaryAttr(@AttrRes int colorAttr);
method textColorPrimaryInverse (line 61) | ThemeStore textColorPrimaryInverse(@ColorInt int color);
method textColorPrimaryInverseRes (line 63) | ThemeStore textColorPrimaryInverseRes(@ColorRes int colorRes);
method textColorPrimaryInverseAttr (line 65) | ThemeStore textColorPrimaryInverseAttr(@AttrRes int colorAttr);
method textColorSecondary (line 69) | ThemeStore textColorSecondary(@ColorInt int color);
method textColorSecondaryRes (line 71) | ThemeStore textColorSecondaryRes(@ColorRes int colorRes);
method textColorSecondaryAttr (line 73) | ThemeStore textColorSecondaryAttr(@AttrRes int colorAttr);
method textColorSecondaryInverse (line 75) | ThemeStore textColorSecondaryInverse(@ColorInt int color);
method textColorSecondaryInverseRes (line 77) | ThemeStore textColorSecondaryInverseRes(@ColorRes int colorRes);
method textColorSecondaryInverseAttr (line 79) | ThemeStore textColorSecondaryInverseAttr(@AttrRes int colorAttr);
method backgroundColor (line 81) | ThemeStore backgroundColor(@ColorInt int color);
method coloredStatusBar (line 85) | ThemeStore coloredStatusBar(boolean colored);
method coloredNavigationBar (line 87) | ThemeStore coloredNavigationBar(boolean applyToNavBar);
method apply (line 91) | void apply();
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/ThemeStorePrefKeys.java
type ThemeStorePrefKeys (line 6) | interface ThemeStorePrefKeys {
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/TintHelper.java
class TintHelper (line 40) | public final class TintHelper {
method getDefaultRippleColor (line 42) | @SuppressLint("PrivateResource")
method getDisabledColorStateList (line 50) | @NonNull
method setTintSelector (line 61) | @SuppressWarnings("deprecation")
method setTintAuto (line 129) | public static void setTintAuto(final @NonNull View view, final @ColorI...
method setTintAuto (line 134) | @SuppressWarnings("deprecation")
method setTint (line 203) | public static void setTint(@NonNull RadioButton radioButton, @ColorInt...
method setTint (line 222) | public static void setTint(@NonNull SeekBar seekBar, @ColorInt int col...
method setTint (line 236) | public static void setTint(@NonNull ProgressBar progressBar, @ColorInt...
method setTint (line 240) | public static void setTint(@NonNull ProgressBar progressBar, @ColorInt...
method setTint (line 257) | @SuppressLint("RestrictedApi")
method setTint (line 272) | public static void setTint(@NonNull CheckBox box, @ColorInt int color,...
method setTint (line 290) | public static void setTint(@NonNull ImageView image, @ColorInt int col...
method modifySwitchDrawable (line 294) | private static Drawable modifySwitchDrawable(@NonNull Context context,...
method setTint (line 331) | public static void setTint(@NonNull Switch switchView, @ColorInt int c...
method setTint (line 343) | public static void setTint(@NonNull SwitchCompat switchView, @ColorInt...
method createTintedDrawable (line 355) | @CheckResult
method createTintedDrawable (line 366) | @CheckResult
method setCursorTint (line 375) | public static void setCursorTint(@NonNull EditText editText, @ColorInt...
FILE: app/src/main/java/com/kunfei/bookshelf/utils/theme/ViewUtil.java
class ViewUtil (line 18) | public final class ViewUtil {
method removeOnGlobalLayoutListener (line 20) | @SuppressWarnings("deprecation")
method setBackgroundCompat (line 25) | @SuppressWarnings("deprecation")
method setBackgroundTransition (line 30) | public static TransitionDrawable setBackgroundTran
Condensed preview — 732 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,546K chars).
[
{
"path": ".gitignore",
"chars": 171,
"preview": "*.iml\n/.gradle\n/.idea\n.DS_Store\n/local.properties\n/build\n/captures\n/app/release/\ngoogle-services.json\n\nsrc/androidTest/\n"
},
{
"path": "LICENSE",
"chars": 35147,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 1676,
"preview": "# 本项目已转到新地址使用kotlin重新开发,项目地址 https://github.com/gedoor/legado\n# 本软件为开源软件,不要在任何地方购买!\n# 关注公众号请搜索:开源阅读,有福利噢\n# 开发\n- 本项目Fork于"
},
{
"path": "app/.gitignore",
"chars": 48,
"preview": "/build\n/src/main/java/com/kunfei/bookshelf/dao/\n"
},
{
"path": "app/ReadMe.md",
"chars": 92,
"preview": "# ע\r\n MyBookshelf_Keys ѹļС\r\n\r\n google-services.json\r\n gradle.properties\r\n key.properties.jks"
},
{
"path": "app/build.gradle",
"chars": 7208,
"preview": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'org.greenrobot.greendao'\napply plu"
},
{
"path": "app/gradle.properties",
"chars": 171,
"preview": "# RELEASE_STORE_FILE = \"..\\\\key.properties.jks\"\nRELEASE_STORE_FILE=.\\\\key.properties.jks\nRELEASE_KEY_PASSWORD=android\nRE"
},
{
"path": "app/proguard-rules.pro",
"chars": 6696,
"preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in D:"
},
{
"path": "app/src/debug/res/values/strings.xml",
"chars": 133,
"preview": "<resources>\n <string name=\"app_name\">阅读.debug</string>\n <string name=\"receiving_shared_label\">阅读.debug·搜索</string>"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 11320,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "app/src/main/assets/18PlusList.txt",
"chars": 1062,
"preview": "OGN5dS5jb20=\nc2cwMC54eXo=\naXRyYWZmaWNuZXQuY29t\neGlhb3FpYW5nNTIw\nMTIzeGlhb3FpYW5n\neGlhb3FpYW5neHM=\neGlhb3FpYW5nNTIw\nMzM1e"
},
{
"path": "app/src/main/assets/data/BookSourceXxl.json",
"chars": 5060,
"preview": "{\n \"bookSourceUrl\": \"https://www.kaixin7days.com\",\n \"bookSourceName\": \"消消乐听书\",\n \"bookSourceGroup\": \"听书\",\n \"bookSourc"
},
{
"path": "app/src/main/assets/disclaimer.md",
"chars": 784,
"preview": "# 免责声明(Disclaimer)\n\n* 阅读是一款提供网络文学搜索的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。\n* 当您搜索一本书的时,阅读会将该书的书名以关键词的形式提交到各个第三方网络文学网站。\n各第三方网站返回的"
},
{
"path": "app/src/main/assets/txtChapterRule.json",
"chars": 3499,
"preview": "[\n {\n \"enable\": true,\n \"name\": \"目录\",\n \"rule\": \"^[ \\\\t]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结"
},
{
"path": "app/src/main/assets/updateLog.md",
"chars": 15153,
"preview": "# 更新日志\n\n* 2.0版本以停止更新,请关注公众号[开源阅读]()获取3.0版本。\n\n**2022/04/01**\n\n* 更新到SDK31\n* 更新一些库\n\n**2021/10/24**\n\n* 字体和备份适配android 11\n\n**"
},
{
"path": "app/src/main/assets/web/bookshelf.css",
"chars": 2635,
"preview": "html, body {\n height: 100%;\n margin: 0;\n}\n\n.hide {\n display: none;\n}\n\n.top, .showchapter, .hidebooks {\n wid"
},
{
"path": "app/src/main/assets/web/bookshelf.html",
"chars": 1182,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>阅读书架</title>\n\t<link rel=\"shortcut icon\" type=\"image/x-"
},
{
"path": "app/src/main/assets/web/bookshelf.js",
"chars": 8264,
"preview": "var $ = document.querySelector.bind(document)\n , $$ = document.querySelectorAll.bind(document)\n , $c = document.c"
},
{
"path": "app/src/main/assets/web/index.css",
"chars": 2106,
"preview": "body {\n\tmargin: 0;\n}\n.editor {\n\tdisplay: flex;\n\talign-items: stretch;\n}\n.setbox,\n.menu,\n.outbox {\n\tflex: 1;\n\tdisplay: fl"
},
{
"path": "app/src/main/assets/web/index.html",
"chars": 10265,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t<title>书源编辑器v3.8</title>\n\t<link rel=\"shortcut icon\" type=\"image/"
},
{
"path": "app/src/main/assets/web/index.js",
"chars": 13511,
"preview": "// 简化js原生选择器\nfunction $(selector) { return document.querySelector(selector); }\nfunction $$(selector) { return document.q"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/DbHelper.java",
"chars": 3079,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf;\n\nimport android.content.Context;\nimport an"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/MApplication.java",
"chars": 7631,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf;\n\nimport android.app.Application;\nimport an"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/BaseDialogFragment.kt",
"chars": 1575,
"preview": "package com.kunfei.bookshelf.base\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.annotation.LayoutRe"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/BaseFragment.kt",
"chars": 1834,
"preview": "package com.kunfei.bookshelf.base\n\nimport android.annotation.SuppressLint\nimport android.content.res.Configuration\nimpor"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/BaseModelImpl.java",
"chars": 9245,
"preview": "package com.kunfei.bookshelf.base;\n\nimport android.annotation.SuppressLint;\nimport android.os.Handler;\nimport android.os"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/BaseService.kt",
"chars": 1063,
"preview": "package com.kunfei.bookshelf.base\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.IBinder\nim"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/BaseTabActivity.java",
"chars": 2694,
"preview": "package com.kunfei.bookshelf.base;\n\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport a"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/BaseViewModel.kt",
"chars": 1133,
"preview": "package com.kunfei.bookshelf.base\n\nimport android.app.Application\nimport android.content.Context\nimport androidx.lifecyc"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/MBaseActivity.java",
"chars": 8659,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.base;\n\nimport android.annotation.SuppressLi"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/MBaseFragment.java",
"chars": 1481,
"preview": "package com.kunfei.bookshelf.base;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.w"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/README.md",
"chars": 4,
"preview": "# 基类"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/VMBaseFragment.kt",
"chars": 205,
"preview": "package com.kunfei.bookshelf.base\n\nimport androidx.lifecycle.ViewModel\n\nabstract class VMBaseFragment<VM : ViewModel>(la"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/DiffRecyclerAdapter.kt",
"chars": 6556,
"preview": "package com.kunfei.bookshelf.base.adapter\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport andr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/ItemAnimation.kt",
"chars": 2299,
"preview": "package com.kunfei.bookshelf.base.adapter\n\nimport android.view.animation.Interpolator\nimport android.view.animation.Line"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/ItemViewHolder.kt",
"chars": 309,
"preview": "package com.kunfei.bookshelf.base.adapter\n\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.viewbinding."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/RecyclerAdapter.kt",
"chars": 12573,
"preview": "package com.kunfei.bookshelf.base.adapter\n\nimport android.content.Context\nimport android.util.SparseArray\nimport android"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/AlphaInAnimation.kt",
"chars": 484,
"preview": "package com.kunfei.bookshelf.base.adapter.animations\n\nimport android.animation.Animator\nimport android.animation.ObjectA"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/BaseAnimation.kt",
"chars": 221,
"preview": "package com.kunfei.bookshelf.base.adapter.animations\n\nimport android.animation.Animator\nimport android.view.View\n\n/**\n *"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/ScaleInAnimation.kt",
"chars": 602,
"preview": "package com.kunfei.bookshelf.base.adapter.animations\n\nimport android.animation.Animator\nimport android.animation.ObjectA"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/SlideInBottomAnimation.kt",
"chars": 367,
"preview": "package com.kunfei.bookshelf.base.adapter.animations\n\nimport android.animation.Animator\nimport android.animation.ObjectA"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/SlideInLeftAnimation.kt",
"chars": 367,
"preview": "package com.kunfei.bookshelf.base.adapter.animations\n\nimport android.animation.Animator\nimport android.animation.ObjectA"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/adapter/animations/SlideInRightAnimation.kt",
"chars": 367,
"preview": "package com.kunfei.bookshelf.base.adapter.animations\n\nimport android.animation.Animator\nimport android.animation.ObjectA"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/observer/MyObserver.java",
"chars": 411,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.base.observer;\n\nimport io.reactivex.Observe"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/base/observer/MySingleObserver.java",
"chars": 328,
"preview": "package com.kunfei.bookshelf.base.observer;\n\nimport io.reactivex.SingleObserver;\nimport io.reactivex.disposables.Disposa"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BaseBookBean.java",
"chars": 338,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport java.util.Map;\n\npublic interface BaseBookBean {\n\n String getTag();\n\n St"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BaseChapterBean.java",
"chars": 217,
"preview": "package com.kunfei.bookshelf.bean;\n\npublic interface BaseChapterBean {\n\n String getTag();\n\n String getDurChapterUr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookChapterBean.java",
"chars": 4655,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\nimport android.content.Context;\n\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookContentBean.java",
"chars": 2388,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\nimport org.greenrobot.greendao.annot"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookInfoBean.java",
"chars": 6119,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\nimport android.graphics.Bitmap;\nimpo"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookKindBean.java",
"chars": 1612,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport android.text.TextUtils;\n\nimport com.kunfei.bookshelf.utils.StringUtils;\n\nimpo"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookShelfBean.java",
"chars": 8908,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\nimport android.text.TextUtils;\n\nimpo"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookSource3Bean.java",
"chars": 9866,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport com.google.gson.Gson;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nim"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookSourceBean.java",
"chars": 30978,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport static android.text.TextUtils.isEmpty;\nimport static com.kunfei.bookshelf.con"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/BookmarkBean.java",
"chars": 2593,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport org.greenrobot.greendao.annotation.Entity;\nimport org.greenrobot.greendao.ann"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/CookieBean.java",
"chars": 1522,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport org.greenrobot.green"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/DownloadBookBean.java",
"chars": 3649,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.text.TextUtil"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/DownloadChapterBean.java",
"chars": 1473,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\npublic class DownloadChapterBean imp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/FindKindBean.java",
"chars": 772,
"preview": "package com.kunfei.bookshelf.bean;\n\npublic class FindKindBean {\n private String group;\n private String tag;\n pr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/FindKindGroupBean.java",
"chars": 445,
"preview": "package com.kunfei.bookshelf.bean;\n\npublic class FindKindGroupBean {\n private String groupName;\n private String gr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/LocBookShelfBean.java",
"chars": 664,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\npublic class LocBookShelfBean {\n "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/OpenChapterBean.java",
"chars": 409,
"preview": "package com.kunfei.bookshelf.bean;\n\npublic class OpenChapterBean {\n private int chapterIndex;\n private int pageInd"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/ReplaceRuleBean.java",
"chars": 4057,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport org.greenrobot.green"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/SearchBookBean.java",
"chars": 6629,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\nimport com.google.gson.Gson;\nimport "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/SearchHistoryBean.java",
"chars": 1398,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.bean;\n\nimport org.greenrobot.greendao.annot"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/TwoDataBean.java",
"chars": 329,
"preview": "package com.kunfei.bookshelf.bean;\n\npublic class TwoDataBean<T, S> {\n private T data1;\n private S data2;\n\n publ"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/TxtChapterRuleBean.java",
"chars": 1967,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport androidx.annotation.Nullable;\n\nimport org.greenrobot.greendao.annotation.Enti"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/UpdateInfoBean.java",
"chars": 1735,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\npublic class UpdateInfoBean"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/bean/WebChapterBean.java",
"chars": 841,
"preview": "package com.kunfei.bookshelf.bean;\n\nimport java.util.LinkedHashSet;\nimport java.util.List;\n\npublic class WebChapterBean "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/constant/AppConst.kt",
"chars": 2571,
"preview": "package com.kunfei.bookshelf.constant\n\nimport android.annotation.SuppressLint\nimport android.provider.Settings\nimport sp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/constant/AppConstant.java",
"chars": 1957,
"preview": "package com.kunfei.bookshelf.constant;\n\nimport android.content.Context;\nimport android.provider.Settings;\n\nimport com.go"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/constant/BookType.java",
"chars": 114,
"preview": "package com.kunfei.bookshelf.constant;\n\npublic class BookType {\n public final static String AUDIO = \"AUDIO\";\n}\n"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/constant/RxBusTag.java",
"chars": 1731,
"preview": "package com.kunfei.bookshelf.constant;\n\npublic class RxBusTag {\n public final static String HAD_ADD_BOOK = \"add_book\""
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/constant/TimeConstants.java",
"chars": 515,
"preview": "package com.kunfei.bookshelf.constant;\n\nimport androidx.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimpor"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/AppFrontBackHelper.java",
"chars": 2138,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.os.Bundl"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/BlurTransformation.java",
"chars": 2091,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/BookshelfHelp.java",
"chars": 17928,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.annotation.SuppressLint;\nimport android.text.TextUtils;\n\nimport com.k"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/ChangeSourceHelp.java",
"chars": 6235,
"preview": "package com.kunfei.bookshelf.help;\n\nimport com.kunfei.bookshelf.DbHelper;\nimport com.kunfei.bookshelf.base.observer.MyOb"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/ChapterContentHelp.java",
"chars": 44865,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.kunfei.bookshelf"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/CrashHandler.java",
"chars": 5626,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport andro"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/DefaultValueHelper.kt",
"chars": 510,
"preview": "package com.kunfei.bookshelf.help\n\nimport com.kunfei.bookshelf.MApplication\nimport com.kunfei.bookshelf.bean.BookSourceB"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/DocumentHelper.java",
"chars": 6394,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.graphics.Bitmap;\nimport android.net.Uri;\n\nimport androidx.documentfil"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/Donate.java",
"chars": 876,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Ur"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/EncodeConverter.java",
"chars": 1729,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.text.TextUtils;\n\nimport com.kunfei.bookshelf.utils.EncodingDetect;\n\ni"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/ExoPlayerHelper.kt",
"chars": 1322,
"preview": "package com.kunfei.bookshelf.help\n\nimport android.net.Uri\nimport com.google.android.exoplayer2.C\nimport com.google.andro"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/FileHelp.java",
"chars": 6732,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.os.Environment;\n\nimport com.kunfei.bookshelf.MApplication;\nimport com"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/IntentData.kt",
"chars": 661,
"preview": "package com.kunfei.bookshelf.help\n\nobject IntentData {\n\n private val bigData: MutableMap<String, Any> = mutableMapOf("
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/ItemTouchCallback.java",
"chars": 5279,
"preview": "package com.kunfei.bookshelf.help;\n\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport and"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/JsExtensions.java",
"chars": 3667,
"preview": "package com.kunfei.bookshelf.help;\n\nimport com.kunfei.bookshelf.DbHelper;\nimport com.kunfei.bookshelf.base.BaseModelImpl"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/LauncherIcon.java",
"chars": 2299,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.content.ComponentName;\nimport android.content.pm.PackageManager;\n\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/MediaManager.java",
"chars": 2920,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.content.Context;\nimport android.media.AudioManager;\nimport android.me"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/ProcessTextHelp.java",
"chars": 1089,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.content.ComponentName;\nimport android.content.pm.PackageManager;\n\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/ReadBookControl.java",
"chars": 26331,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.help;\n\nimport android.content.ContentResolv"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/SSLSocketClient.java",
"chars": 1759,
"preview": "package com.kunfei.bookshelf.help;\n\nimport android.annotation.SuppressLint;\n\nimport java.security.SecureRandom;\nimport j"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/SourceHelp.kt",
"chars": 1900,
"preview": "package com.kunfei.bookshelf.help\n\nimport android.os.Handler\nimport android.os.Looper\nimport com.kunfei.bookshelf.MAppli"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/UTF8BOMFighter.java",
"chars": 1093,
"preview": "package com.kunfei.bookshelf.help;\n\npublic class UTF8BOMFighter {\n private static final byte[] UTF8_BOM_BYTES = new b"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/UpdateManager.java",
"chars": 5074,
"preview": "package com.kunfei.bookshelf.help;\n\nimport static android.content.Context.DOWNLOAD_SERVICE;\n\nimport android.app.Activity"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/coroutine/CompositeCoroutine.kt",
"chars": 2082,
"preview": "package io.legado.app.help.coroutine\n\n@Suppress(\"unused\")\nclass CompositeCoroutine : CoroutineContainer {\n\n private v"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/coroutine/Coroutine.kt",
"chars": 6074,
"preview": "package io.legado.app.help.coroutine\n\nimport kotlinx.coroutines.*\nimport timber.log.Timber\nimport kotlin.coroutines.Coro"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/coroutine/CoroutineContainer.kt",
"chars": 303,
"preview": "package io.legado.app.help.coroutine\n\ninternal interface CoroutineContainer {\n\n fun add(coroutine: Coroutine<*>): Boo"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/glide/ImageLoader.kt",
"chars": 1547,
"preview": "package com.kunfei.bookshelf.help.glide\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.gr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/glide/OkHttpGlideModule.kt",
"chars": 608,
"preview": "package com.kunfei.bookshelf.help.glide\n\nimport android.content.Context\nimport com.bumptech.glide.Glide\nimport com.bumpt"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/glide/OkHttpModeLoaderFactory.kt",
"chars": 603,
"preview": "package com.kunfei.bookshelf.help.glide\n\nimport com.bumptech.glide.load.model.GlideUrl\nimport com.bumptech.glide.load.mo"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/glide/OkHttpModelLoader.kt",
"chars": 596,
"preview": "package com.kunfei.bookshelf.help.glide\n\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.model.Gli"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/glide/OkHttpStreamFetcher.kt",
"chars": 2376,
"preview": "package com.kunfei.bookshelf.help.glide\n\nimport com.bumptech.glide.Priority\nimport com.bumptech.glide.load.DataSource\nim"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/media/LoaderCreator.java",
"chars": 683,
"preview": "package com.kunfei.bookshelf.help.media;\n\nimport android.content.Context;\nimport android.os.Bundle;\n\nimport androidx.loa"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/media/LocalFileLoader.java",
"chars": 4749,
"preview": "package com.kunfei.bookshelf.help.media;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/media/MediaStoreHelper.java",
"chars": 1964,
"preview": "package com.kunfei.bookshelf.help.media;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/ActivitySource.kt",
"chars": 482,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.app.Activity\nimport android.content.Context\nimport android."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/FragmentSource.kt",
"chars": 513,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.content.Context\nimport android.content.Intent\nimport androi"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/OnPermissionsDeniedCallback.kt",
"chars": 168,
"preview": "package com.kunfei.bookshelf.help.permission\n\ninterface OnPermissionsDeniedCallback {\n fun onPermissionsDenied(reques"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/OnPermissionsGrantedCallback.kt",
"chars": 138,
"preview": "package com.kunfei.bookshelf.help.permission\n\ninterface OnPermissionsGrantedCallback {\n\n fun onPermissionsGranted(req"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/OnPermissionsResultCallback.kt",
"chars": 217,
"preview": "package com.kunfei.bookshelf.help.permission\n\ninterface OnPermissionsResultCallback {\n\n fun onPermissionsGranted(requ"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/OnRequestPermissionsResultCallback.kt",
"chars": 308,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.content.Intent\n\ninterface OnRequestPermissionsResultCallbac"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/PermissionActivity.kt",
"chars": 2780,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.n"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/Permissions.kt",
"chars": 2594,
"preview": "package com.kunfei.bookshelf.help.permission\n\nobject Permissions {\n\n const val READ_CALENDAR = \"android.permission.RE"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/PermissionsCompat.kt",
"chars": 2204,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.app.Activity\nimport androidx.annotation.StringRes\nimport an"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/Request.kt",
"chars": 6842,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.c"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/RequestManager.kt",
"chars": 1737,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.os.Handler\nimport android.os.Looper\nimport java.util.*\n\nint"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/RequestPlugins.kt",
"chars": 496,
"preview": "package com.kunfei.bookshelf.help.permission\n\ninternal object RequestPlugins {\n\n @Volatile\n var sRequestCallback: "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/permission/RequestSource.kt",
"chars": 203,
"preview": "package com.kunfei.bookshelf.help.permission\n\nimport android.content.Context\nimport android.content.Intent\n\ninterface Re"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/storage/Backup.kt",
"chars": 7348,
"preview": "package com.kunfei.bookshelf.help.storage\n\nimport android.content.Context\nimport android.net.Uri\nimport androidx.documen"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/storage/BackupRestoreUi.kt",
"chars": 10740,
"preview": "package com.kunfei.bookshelf.help.storage\n\nimport android.app.Activity\nimport android.app.Activity.RESULT_OK\nimport andr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/storage/Preferences.kt",
"chars": 1677,
"preview": "package com.kunfei.bookshelf.help.storage\n\nimport android.app.Activity\nimport android.content.Context\nimport android.con"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/storage/Restore.kt",
"chars": 6531,
"preview": "package com.kunfei.bookshelf.help.storage\n\nimport android.content.Context\nimport android.net.Uri\nimport androidx.documen"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/help/storage/WebDavHelp.kt",
"chars": 4473,
"preview": "package com.kunfei.bookshelf.help.storage\n\nimport android.content.Context\nimport android.os.Handler\nimport android.os.Lo"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/BookSourceManager.java",
"chars": 10821,
"preview": "package com.kunfei.bookshelf.model;\n\nimport android.database.Cursor;\nimport android.text.TextUtils;\n\nimport androidx.ann"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/Exceptions.kt",
"chars": 743,
"preview": "@file:Suppress(\"unused\")\n\npackage com.kunfei.bookshelf.model\n\nclass AppException(msg: String) : Exception(msg)\n\n/**\n *\n "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/ImportBookModel.java",
"chars": 3107,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.model;\n\nimport com.kunfei.bookshelf.DbHelpe"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/ReplaceRuleManager.java",
"chars": 7974,
"preview": "package com.kunfei.bookshelf.model;\n\nimport android.text.TextUtils;\n\nimport com.kunfei.bookshelf.DbHelper;\nimport com.ku"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/SavedSource.java",
"chars": 1010,
"preview": "package com.kunfei.bookshelf.model;\n\nimport com.kunfei.bookshelf.bean.BookSourceBean;\n\npublic class SavedSource {\n pu"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/SearchBookModel.java",
"chars": 11172,
"preview": "package com.kunfei.bookshelf.model;\n\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport androidx.annotation.No"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/TxtChapterRuleManager.java",
"chars": 2976,
"preview": "package com.kunfei.bookshelf.model;\n\nimport com.kunfei.bookshelf.DbHelper;\nimport com.kunfei.bookshelf.MApplication;\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/UpLastChapterModel.java",
"chars": 8328,
"preview": "package com.kunfei.bookshelf.model;\n\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.text.TextUtils;"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/WebBookModel.java",
"chars": 5263,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.model;\n\nimport android.annotation.SuppressL"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByJSonPath.java",
"chars": 6899,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport android.text.TextUtils;\n\nimport com.jayway.jsonpath.JsonPath;\nim"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByJSoup.java",
"chars": 16626,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport android.text.TextUtils;\n\nimport com.kunfei.bookshelf.utils.Strin"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByRegex.java",
"chars": 12947,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport android.os.Build;\nimport android.text.TextUtils;\n\nimport com.kun"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeByXPath.java",
"chars": 6395,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport android.text.TextUtils;\n\nimport org.jsoup.nodes.Document;\nimport"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeHeaders.java",
"chars": 850,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport static com.kunfei.bookshelf.constant.AppConstant.DEFAULT_USER_AG"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeRule.java",
"chars": 18173,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport static android.text.TextUtils.isEmpty;\nimport static com.kunfei."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/analyzeRule/AnalyzeUrl.java",
"chars": 11389,
"preview": "package com.kunfei.bookshelf.model.analyzeRule;\n\nimport static com.kunfei.bookshelf.constant.AppConstant.EXP_PATTERN;\nim"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/BookChapterList.java",
"chars": 18856,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport android.os.Build;\nimport android.text.TextUtils;\n\nimport com.kunfei."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/BookContent.java",
"chars": 7505,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport static com.kunfei.bookshelf.constant.AppConstant.JS_PATTERN;\n\nimport"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/BookInfo.java",
"chars": 5250,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport static android.text.TextUtils.isEmpty;\n\nimport android.text.TextUtil"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/BookList.java",
"chars": 19559,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport static android.text.TextUtils.isEmpty;\n\nimport android.os.Build;\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/Debug.java",
"chars": 9659,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport android.annotation.SuppressLint;\nimport android.text.TextUtils;\n\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/VipThrowable.java",
"chars": 323,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport com.kunfei.bookshelf.MApplication;\nimport com.kunfei.bookshelf.R;\n\np"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/content/WebBook.java",
"chars": 10399,
"preview": "package com.kunfei.bookshelf.model.content;\n\nimport static android.text.TextUtils.isEmpty;\nimport static com.kunfei.book"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/impl/IDownloadTask.java",
"chars": 706,
"preview": "package com.kunfei.bookshelf.model.impl;\n\nimport com.kunfei.bookshelf.bean.DownloadBookBean;\nimport com.kunfei.bookshelf"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/impl/IHttpGetApi.java",
"chars": 723,
"preview": "package com.kunfei.bookshelf.model.impl;\n\nimport java.util.Map;\n\nimport io.reactivex.Observable;\nimport retrofit2.Respon"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/impl/IHttpPostApi.java",
"chars": 909,
"preview": "package com.kunfei.bookshelf.model.impl;\n\nimport java.util.Map;\n\nimport io.reactivex.Observable;\nimport okhttp3.RequestB"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/task/AnalyzeNextUrlTask.java",
"chars": 2467,
"preview": "package com.kunfei.bookshelf.model.task;\n\nimport com.kunfei.bookshelf.base.BaseModelImpl;\nimport com.kunfei.bookshelf.ba"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/task/CheckSourceTask.java",
"chars": 5689,
"preview": "package com.kunfei.bookshelf.model.task;\n\nimport static com.kunfei.bookshelf.constant.AppConstant.SCRIPT_ENGINE;\n\nimport"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/model/task/DownloadTaskImpl.java",
"chars": 9210,
"preview": "package com.kunfei.bookshelf.model.task;\n\nimport android.text.TextUtils;\n\nimport com.hwangjr.rxbus.RxBus;\nimport com.kun"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/BookDetailPresenter.java",
"chars": 12327,
"preview": "package com.kunfei.bookshelf.presenter;\n\nimport android.content.Intent;\nimport android.text.TextUtils;\n\nimport androidx."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/BookListPresenter.java",
"chars": 10054,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.presenter;\n\nimport android.os.AsyncTask;\n\ni"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/BookSourcePresenter.java",
"chars": 9699,
"preview": "package com.kunfei.bookshelf.presenter;\n\nimport android.annotation.SuppressLint;\nimport android.graphics.Color;\nimport a"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/ChoiceBookPresenter.java",
"chars": 4819,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.presenter;\n\nimport android.content.Intent;\n"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/FindBookPresenter.java",
"chars": 3759,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.presenter;\n\nimport static com.kunfei.booksh"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/ImportBookPresenter.java",
"chars": 2059,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.presenter;\n\nimport com.hwangjr.rxbus.RxBus;"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/MainPresenter.java",
"chars": 10670,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.presenter;\n\nimport android.annotation.Suppr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/ReadBookPresenter.java",
"chars": 19889,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.presenter;\n\nimport static android.text.Text"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/ReplaceRulePresenter.java",
"chars": 4809,
"preview": "package com.kunfei.bookshelf.presenter;\n\nimport android.graphics.Color;\n\nimport androidx.documentfile.provider.DocumentF"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/SearchBookPresenter.java",
"chars": 10337,
"preview": "package com.kunfei.bookshelf.presenter;\n\nimport android.text.TextUtils;\n\nimport androidx.annotation.NonNull;\n\nimport com"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/SourceEditPresenter.java",
"chars": 4699,
"preview": "package com.kunfei.bookshelf.presenter;\n\nimport android.content.ClipData;\nimport android.content.ClipboardManager;\nimpor"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/TxtChapterRulePresenter.java",
"chars": 4663,
"preview": "package com.kunfei.bookshelf.presenter;\n\nimport android.graphics.Color;\n\nimport androidx.documentfile.provider.DocumentF"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/BookDetailContract.java",
"chars": 1166,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport android.content.Intent;\n\nimport com.kunfei.basemvplib.impl.IPre"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/BookListContract.java",
"chars": 793,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport android.content.SharedPreferences;\n\nimport com.kunfei.basemvpli"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/BookSourceContract.java",
"chars": 1063,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.google.android.material.snackbar.Snackbar;\nimport com.kunfe"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/ChoiceBookContract.java",
"chars": 804,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.kunfei.basemvplib.impl.IPresenter;\nimport com.kunfei.basemv"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/FindBookContract.java",
"chars": 451,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.kunfei.basemvplib.impl.IPresenter;\nimport com.kunfei.basemv"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/ImportBookContract.java",
"chars": 507,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.kunfei.basemvplib.impl.IPresenter;\nimport com.kunfei.basemv"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/MainContract.java",
"chars": 605,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.kunfei.basemvplib.impl.IPresenter;\nimport com.kunfei.basemv"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/ReadBookContract.java",
"chars": 2298,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport co"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/ReplaceRuleContract.java",
"chars": 750,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\n\nimport com.google.android.material.snackbar.Snackbar;\nimport com.kunf"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/SearchBookContract.java",
"chars": 1806,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport android.widget.EditText;\n\nimport com.kunfei.basemvplib.impl.IPr"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/SourceEditContract.java",
"chars": 675,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.kunfei.basemvplib.impl.IPresenter;\nimport com.kunfei.basemv"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/presenter/contract/TxtChapterRuleContract.java",
"chars": 772,
"preview": "package com.kunfei.bookshelf.presenter.contract;\n\nimport com.google.android.material.snackbar.Snackbar;\nimport com.kunfe"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/service/CheckSourceService.java",
"chars": 7087,
"preview": "package com.kunfei.bookshelf.service;\n\nimport android.app.Notification;\nimport android.app.PendingIntent;\nimport android"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/service/DownloadService.java",
"chars": 12473,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.service;\n\nimport android.app.Notification;\n"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/service/MediaButtonIntentReceiver.java",
"chars": 2966,
"preview": "package com.kunfei.bookshelf.service;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/service/ReadAloudService.java",
"chars": 29821,
"preview": "package com.kunfei.bookshelf.service;\n\nimport static android.text.TextUtils.isEmpty;\nimport static com.kunfei.bookshelf."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/service/ShareService.java",
"chars": 5064,
"preview": "package com.kunfei.bookshelf.service;\n\nimport android.app.Activity;\nimport android.app.Notification;\nimport android.app."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/service/WebService.java",
"chars": 5238,
"preview": "package com.kunfei.bookshelf.service;\n\nimport android.app.Activity;\nimport android.app.Notification;\nimport android.app."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/ACache.java",
"chars": 24497,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.utils;\n\nimport android.content.Context;\nimp"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/ActivityExtensions.kt",
"chars": 6212,
"preview": "@file:Suppress(\"unused\")\n\npackage com.kunfei.bookshelf.utils\n\nimport android.app.Activity\nimport android.graphics.Color\n"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/BatteryUtil.java",
"chars": 514,
"preview": "package com.kunfei.bookshelf.utils;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.conte"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/BitmapUtil.java",
"chars": 14715,
"preview": "package com.kunfei.bookshelf.utils;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graph"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/ColorUtils.kt",
"chars": 7891,
"preview": "package com.kunfei.bookshelf.utils\n\nimport android.graphics.Color\nimport androidx.annotation.ColorInt\nimport androidx.an"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/ContextExtensions.kt",
"chars": 7784,
"preview": "@file:Suppress(\"unused\")\n\npackage com.kunfei.bookshelf.utils\n\nimport android.annotation.SuppressLint\nimport android.app."
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/ConvertUtils.kt",
"chars": 3321,
"preview": "package com.kunfei.bookshelf.utils\n\nimport android.content.res.Resources\nimport android.graphics.Bitmap\nimport android.g"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/DensityUtil.java",
"chars": 2459,
"preview": "//Copyright (c) 2017. 章钦豪. All rights reserved.\npackage com.kunfei.bookshelf.utils;\n\nimport android.app.Activity;\nimport"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/DialogExtensions.kt",
"chars": 1889,
"preview": "package com.kunfei.bookshelf.utils\n\nimport android.view.WindowManager\nimport androidx.appcompat.app.AlertDialog\nimport a"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/DocumentExtensions.kt",
"chars": 7426,
"preview": "package com.kunfei.bookshelf.utils\n\nimport android.content.Context\nimport android.database.Cursor\nimport android.net.Uri"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/DocumentUtil.java",
"chars": 14922,
"preview": "package com.kunfei.bookshelf.utils;\n\nimport android.content.Context;\nimport android.net.Uri;\n\nimport androidx.annotation"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/DrawableUtil.kt",
"chars": 1513,
"preview": "package com.kunfei.bookshelf.utils\n\nimport android.content.res.ColorStateList\nimport android.graphics.PorterDuff\nimport "
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/EncoderUtils.kt",
"chars": 5529,
"preview": "package com.kunfei.bookshelf.utils\n\nimport android.util.Base64\nimport java.nio.charset.StandardCharsets\nimport java.secu"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/EncodingDetect.java",
"chars": 174568,
"preview": "package com.kunfei.bookshelf.utils;\n\nimport androidx.annotation.NonNull;\n\nimport org.jsoup.Jsoup;\nimport org.jsoup.nodes"
},
{
"path": "app/src/main/java/com/kunfei/bookshelf/utils/FastXmlSerializer.java",
"chars": 13194,
"preview": "package com.kunfei.bookshelf.utils;\n/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Ap"
}
]
// ... and 532 more files (download for full content)
About this extraction
This page contains the full source code of the gedoor/MyBookshelf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 732 files (3.2 MB), approximately 881.0k tokens, and a symbol index with 4757 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.